@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":"UEsDBAoAAAAAAAAAAACRZBsYskIBALJCAQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICJtb2R1bGUiOiAiLi9zcmMvdmF1bHRGYWN0b3J5L3ZhdWx0RmFjdG9yeS5qcyIKICB9LAogICJjb21wYXJ0bWVudHMiOiB7CiAgICAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2Jhc2Utem9uZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4byI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjEuNS4xMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2hlYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaGVhcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMyZmM5NmFlMmZlMDg2NmU2N2Q3YTI4NmI1MjM0MzE5NThlZGRhNjZlNjAwYjJiYzRjNDVjZmMxZDJjNjIxZjY0NDAzZmEwMmFiNTVhZjY3NzA4N2YyMjYwZDJiNGU2ZDY1ZDM2NmY5ODc4YWRlNTk2N2U5ZTA5YTVmNjYyOGRhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTJmNmE4Njg2NGNiNTE3ZjllZTVlMGU5NzM1ZTNkYjE4YzcyYWI1MTI1ODQ4ZmI4ZmI1ZmJiMjc0NmQyYWEyNDUyM2FkZGEyOTI0Y2FjZTE1ZTc2ZWIzMTI5ZjIwNzU2MWVhYTRiOGY4MWIwOGE4Mjk5MWY1YzkzMWMwOTQyOTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDViYTc5MTUzZGI4ODNkZWEwODA4YTkwNjM2ZDcxNmRmMDM0YTcwNmI3Zjg1ZGFkMzc3NzMyODUwOWFjNmZkZjllOTU0YWNmOTk5OTkzMDk1NzRmMTNjM2Y3YWNjOTYxMDM5Yjk0NDliODM1ODQzZGQ5ZDk5NDU1M2FkNzcwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODc4MTgzN2U0YWE1ZTEyZjJiZmU5MmFjMjJmY2Q3ZmNiY2JjYmE0OTRjMmMzMGM1MjU1NjI5Yzc4MzYwNDMwMWZkY2Y3YWFhN2UyYWU5YTY1YWE5ODEyZjljYzRlZGQyNDQ5NGIzYmY0MmYwNTU2N2JjZmM3MzljYmUxZTZhMzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0MWNkNjFlNDM5YTRhNzM3MWRlM2UzZTFmYzNmMWEyYmY0MzhhZDkwMWFjMmNiZDRjMWNlMGJiZTJmMWI0MmUyZWQ0N2ViMGYxYjU4ZDI1ZTMyNjFmZTVkYTY5YTY2MjY2MDkwYzA5MThmN2M0MTljMGYwNDY4ZjI1ZGQwNGMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2Utb25jZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1vbmNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2ZlMjE0MzJiYWJmOWEzODUyM2JmY2MyNzNkOWE0YWE3NTM1MjQzMmQ5MGYzN2U4YjJhNjRhYmUzZTBiZjA4YmI4M2RkYzI5NGQ2Yzk1NjcwMzE4ZDU1NDA1M2VhNDhlNjQ3ZTk2OWVhOGMzMDFlNjQyNDM3N2RkMjM0OTM1N2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJlcGFyZS1hdHRlbnVhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcmVwYXJlLWF0dGVudWF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNmI0YWIzMWViMjkzMjJhN2E3MjIzOTViYmI2YmQ5NGE0MDEwNWQyMmU4NTI4YTA2NDQwOTBhNDllZWIzYmU2ODgzODBiNjZjZmEyYWU1MWIwNTZiOGQxMjJhMzI1ZGY1NjE5YzYwZjJmZWFhODUwOGE1YjJiZjNkZmUyM2YzNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcmVwYXJlLXJldm9jYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJlcGFyZS1yZXZvY2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZWZmZDFjYTczNWY1ZDgxNDE3NGEzMDdlMzdhYWFjZjU0NTc2NjQyNTRhY2Y4NGUxZTNhNmQxMzBmZjhlNDhmNjA2YmZlOTgwMzE4OWM0ZDg4YmRmZDkzYzJjMWFhYWM3NThlMjJjMWU4NGJiYjc5ZmI5OWZjNjE4NjM1MjMyNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93YXRjaC1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy93YXRjaC1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTRkODk4ZTg1N2VlOWQ4ZjY3MGU3MmRjOTBjODZkYWE2YTRkOTViMDAxYzIxMDc5ZjdlMDQ2OTA2MDRjYjliZjY5ZTZiMjdjMTRkZjdjNmQ0ODI4ZTdhMTg0OGJkOTNjMjA1YzYyNjhiYzVkN2QzYjcyNmNkOGYyZDgzODA2ZDgiCiAgICAgICAgfSwKICAgICAgICAiLi96b25lLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiem9uZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTFmYjk1N2FiMjM2ZjdjOTNjMzk5ZDZiODk4MzY5ZmYxMjMwYWEwN2EwOWZlZmVhYTQ1NDk3ZjRjNjc3Yjk3YmJlZjQxMGRjODg5NWEwM2ZjYmE2NWI0YmM1MTYzZWY0MmEzMjc4Zjc3MGYyNjcwYTU2ZTg5M2Y0ZWZiZTM5ZWQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZXJ0cC12MC4xNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2VydHAiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZHVyYWJsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hbW91bnRNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hbW91bnRNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTIxZjhjYTVhMmRiZDRhZTU2ZWEwOTcxM2IzN2Q5YTUxNTM2NzJmODhkMWIxYWI5OTE0Y2EyYjk5MjhhNDQ3Y2FkNmEyY2RlNDkyNTEyYWI1ZThiMDFjZjg0YTkwOTdmNzU3YTZmNWZiY2I1NWI1MzY4MGQ1OTVmYTBmYzk2ZTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWY1OTk1MTkzM2M1NjJkZWRkYjM5NTQ4OWU1Nzk5MjYzZTYwMDU0YjRhNzZhNWI4NjljNjQ1MjE4OGEwNDlmYTEzODg3YmZhODM2ODI2NjljMzQyYzRhYmY3MjFiNmM4ZDRmN2ZjMGZmMTVjZjcxODc4YTk2Y2QyZDk3NDRlOGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGlzcGxheUluZm8uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Rpc3BsYXlJbmZvLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMThjNTYxZTI5NDZhMjcyYTY5YTNhZjA2M2YyNTk1MzI4MDgwMmM3YjQxNDBkYjZjM2YxOWY4ZjJlZTMzYTljMjVkYzA4MWJhMDNlOTIwM2ExODA5ZDc2YWViNzM2MzEzZDdjM2ZhMThiZGM4MWQwYTJlZTBkNWNmZGRiMjk0Y2UiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmFlNDYxZTA2YWE3OTQxMGVhYTcwZTE2NWMzNTQxNjdlZGFlNzUzNGJlOTI3MGFjNDU2ZmQ3OTI3MGJmN2Q4Y2IyMDYxNDAxMmM1MjgzMzUyYzgyNDJkYTE3ZWM1YWE3N2ZlMDJlZGQ3N2Y5ZjliMTU5MTk1MTlkYWNmZDQ5YTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXNzdWVyS2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pc3N1ZXJLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZDY4OWUxZmVmNGI5NTMwZjMyYjliOTExYzE1ZWZjMTY1NmY0NGFhMGQ0NWIxMmExZDI0ZDgwOWU3MDNhM2NlNDFhMDI1YjYzYjg5ZjNiN2Y0ZTljYWY3NWQzOGE3ZWM2M2ZkNTk4NTMwYmRlNTFjNmY2NGM1NmM1YmM1NzEwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRiNWRkNTY1MWY5NDJlZmZhMGE2ZmM5NmI0ZDc0MzczODU4YzAwYzMzZGMxNmNlNTMzMzRkMzIwNmQzZTk5MTVlMzUyYzBmNmQ3YTQ4ZTlhNzY0N2NhOGUwNzgwNzNhNWQ3ZGZjNWYzNjU5ODI4YjFiNDAxNWMyZWUzODZiNWJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2RlZWY5YjAwNTc5ZjFhYTZiYzZiYjkwYTZhM2U2MjllZjc5YTdkYjgwNWNjNTEyYWQ5ZDVhZWIwNTYwNzhiY2UwZTQ1Y2VkZWEyMWFiMGJlNzhiMGU2MGMwMWJmNTEwM2Q0ZjliMTExMDZiNzVlZGZkMTgxZTMyMjhlYWMxNzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTYyNDc2NDMzYTU0N2I3ZDY5YzE5YWIwZDAxMjA4NTgxZDg4ZmRiNWRhMjYxOTkwMWU2MTNiMTU3YmIyNDA1ZjlmZWU5ZGVhZjkxYjdhY2RiMTg2ZDQyNjgxNzQzNTczNDYwZTBlYzY0YmMxNDlmNzI0Y2Q3M2U0NmU4ZTBjYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjY4N2ZkMzkxZjM1Nzg1MTdhOGFhYTMyMmJjNTg0NGI2MGU1YWQ5Y2UxMzExMWJmMDY5YmFlYTE2MDFmODg4NjljZjc5MmQ4YjcwZTNmZTE2NWVkZTExYTc5ZWU1ZTQ0NmRhNmI5ZGMxYjFjNGEyMDU1OGM0ZTdlYTU0ZTU0MzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2MzEyMDlkZTM4NmViZTMzZjRlMDZhOGM4YjFiOWYyM2YwZTRlZjg1MDhmNGRhZTI0ZjA5ZmIxOTExNjA2Mzg0NTZjODViNGE1OWVlNzIzYWY4NzIyYzc5ZWY5ZGM2MmY5NThkN2U4NTNiMDU4YzZiNjQ0NDFjYmZmYWYyNjQ5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnRMZWRnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnRMZWRnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYTViMTI0MWNhMDU0NTYwMGJlNzRhMDIwMWY5ODczMjI2NjVmMzVlMDZmN2JhZGRjMjIwY2RjYTQ3OTQzYzZjMGZjZWMxYTYyOWFkMTY5YzYyNTRhMTgxY2E3MjZjMzAwYTg5YTA1ZTRjODYwNzBmZmYwZWRlN2Q3NjNiYTY3MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wdXJzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHVyc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZWY1Nzg3OTQxNWQ3OGI4ODMzNjBmZTkxYmRiNzQ1MTFhMjczNDFiNDhjMzlmZmJmOTYxYjFlNzg2Nzk0MmU0NWNhNTg5MTk0NDViNThiMDcwY2Y0ZWE3ZWMzM2VhMDM0NWNhMGVlOTE1MTQyYzI4OGM5MDYxYzQzZjQyMTU2MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYXRpby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmF0aW8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ODQzMjk0NTllY2I2NTk2ZmRiOTVlMzM0YzMxYjY4M2ZmNDU1YjNlODhmOWZkY2E0NzM1NmU0OGRkNjY5NmU5MWY0MzdkZWVkMWEyNmEwNmUwN2ZkODg1ZDk0Mjc5NGE5NDczZTlmYTc1ODdiZmJjMzgyNmU1MTJkMDYxN2YxOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MTk2NjIxMTgxN2MwMzNhZDY1NjNmNDRhMTFmYWEzM2E1YTgxN2QwZDM0MWM1NWI1ZTA2ZWJiNTk1ZWI4MmIxOWFlOGVmYmYxYjBjYTlkYzgyZDE5NGFjMTMwYjk1YjMyYzhmYmU3MzYwMjYzZmYzZTRjYTk2OTYwMzJjMmM2NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFuc2llbnROb3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MGY2NGFkM2RkNjhiM2FkNGFhZjcxYmViOTA1YWE3MTk2MzYwYzc0NTk1YjZkZjRiNjRlOTdmMWE4OTE4NzkzYmRiNjI4ZWYzNzZhZWVkYTI5MWViMTI4MDg4OGI4Mjc4YjQwMWM2YWUxODZiYzBlZDY1NzkyZjI2Y2I0MzY1NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQwNDdmNTgzMjQ3MDFhOWIyMjJjNzk4OGI4NzQ3MDA0YjE3ZThjMjY1YTY3ZmVjNTQwYWFmNTU4ZjEwNTMxNDQ5MWEzMzMzNDM5ODdmNTk0NjAzMzU4MGI1MjAxZTJkY2EwNjc1YmY1NzliMDcwMzhiZmZmYjcyYWZmNjcwMmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2dvdmVybmFuY2UiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3JhdGlvLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NsZWFuUHJvcG9zYWwuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NsZWFuUHJvcG9zYWwuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFrZUhhbmRsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uc3RhbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25zdGFudHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZTA4YzM0NTU1NTI1OTU2NDcxY2E5ZTRmYmYxMjAxZDA2ZmE5ZGI5YmU5ZTExYjg0M2VlNmMwZGQ5ZjI2M2U0NDc3NWFiZjg5ODhkZGQ1MTRlMTM1ZjVhYTI2NzdlZjA0ODMwZDU2YTAzZTI1NmU3NjgxOTI1YWJmZmFhNjYyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvYXNzZXJ0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2Fzc2VydGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMzhhYjA1NTI2MTg3N2QwNmEyZWU0NzA2MjhiNmRmMWFhOTlmMmU5Mzc5ZTVmMDc0NDU1YWFmNTNhM2ZiZThjZWVmZmYwOThiYzhhNGNjZTY1MmMzN2Y4ODIxZDg0MTc1YzdmYTcwYzkzOTFiNDc3OTJiZDI2NmVmYjVmNjY1YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTllZTBiMGUzNDRmYjU0NDQ3MWNiMDE4NjMyNTczMzkxOTk3ZmNiZjZlODM3ZjcyNDU1ZmM0N2YxNzg2MDZjZjM0ZDMxYjUwODg2M2NjZDY3ZDY4YWIxODIyNTc5MWRiNGFkM2M3YTYzOTkxYWE3MWFhNGQ5NGRmN2VjZTY4ZTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUyNzRmZWYxNDc5NDUxNzhlYzg1NzBkNzM2NjAxYWRiYTNkNzg3MzhlNTNkMmEyY2QwOTU3ODcyMTNlYWU2ZmYzYmMwMWFjMjgwNmMzN2VhNGE1ZjAwNWNhZmUyZjE5ZWQ5ODI1NzgxNTM2YmQzMzc3NTAyYjRkZjY1NjI1MTVlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmI1MzhkYWYzNjc4ZDVjYmExNzRkZmEyMzliNmMyMzJlOTEwNjE1ZWNkYWMwNzE1NjU0MzliMjIzZmM4ZTYxNzAwZTNlNmUyODhmM2VjMjJjOWM0YzAzZGU5ODY4ZDNmZmYwMGZmZDUzZmQ4YjYzZGQ2ZmFhYjlmMDczOTQ3MWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4MjE5ZWY0YjM4MmRhMjQ0MzQ5MmNjYzE4N2Y2ZjAwNGQzOWY3YWEwMDUxYzRkMmQyZGU2ZjkxNjVkMjFkNjNmODU2YTg2OTFjYTUxNTkwNzcwZjU5MTdmMDFmZTRhOTA5MjI3ZWVkMjMwYzg3OTE1Y2M4ZGJhN2ExZmJkYTYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjUxYmI5NmNmMWZiNzZiYTg5NjRkNzRhOWE3MDVhNzI1MjVlMzk3ZTZiY2ZhOWViMDhhNzFmN2QwYzgyYmRlZDhiZDQwYjk3OWI0ZTI0M2RkMzZhYTcyMzYzMDViMWE4NGY5ZDkwNjlhOGRjODM4NTVlZjM5YzVmNTdjNDhmNGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5vci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5vci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU0OTk0MTk5MDY3MDEyYTdlNGUxZjFhYzUwNGQyNjBiNTRiYjFmYWJhNjlhYzFiNTQwNGJiMTIxM2FkYTEzMWZlMDEyOGFlMDdkNzI2ZGQyOGY3NTg1NWUyMDFmMzc2NzcxNmIyMjc0ZDI2NjFlYTg4NmJlNmVkNzg3NTVhODZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MGRjMzIzOGFiMTQyMjZhZWYxMWVkMDU5OWI1NjRkYWRhODZkM2EwODNmY2VhYjdhZDM0NjY0ZmQwMzg0NzNiODZkN2UwNTI5YmMyYmU0ZDdhN2ZiZDUzYTU3YmJmZDBhNTAyMjMxNWE5NTAzNWM5NTcwYmZmYmVlMTAxNjZlZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEhlbHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RIZWxwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZGU2MTYxMmE5ZGM2ZGNjOTc0NDQzY2UzZjgzNWZiMWQ5NWE4YmM3Y2FlNGM0M2ZlNGY5ZGNkYWJhYTE4YWMzMjBiZDY2YTJmMWIxNDVlMGM5NzE0MWU5YzBhYWQ3MWMxOTQ5MDE2YzBkMjM3MzRmY2E2NjM1MTdlMzVkODY1YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5M2I1NDFkYzU2MDZmMWEwNzQxZWRhY2IzYmU5MGM1ZGMzOWY5MmMxN2JkNTg3NTk3M2IzZDJkMWE5MWQ2ZDI4OTQzNTkzNjU4NTA2NTkwYzMwYmEwYzAzZjk2MTkxNmY4YzYzNjNhMDc5N2E4MmE2ZmUwM2Q5YmNjNDQxN2Q4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9xdWVzdGlvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcXVlc3Rpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZGQwYTE4YzgwY2Y2NTE2NzY4N2E5ZDNmNTVkNThhOWZkZTYwM2VkMjIwMjMxNjUwMzNhOTEzNjc2YzExMmEwYTI3Yzk3NTg4MTJjZjRmYjAxY2QzM2QzM2NjNzkyZmI1MDYyNzhiZDA1Zjc1ODAwOGZhNmNjOGNiZGQyZTViNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWEzYzg4YjY1MTcxNTdhMTRhN2E0N2MyZmFmMDNlN2JlMWUyZWRhODNhMGVjZjIyNDkzNWViMzYxZjQ3NjVlNDE1ZGJkODY4NTU4NjZjZWRjZDM2ZmEwNDYyOTMwOTJjNjEwY2Q4NGQ4MzA3NTk5ODQ2MzljOGUyNmU3N2U4Y2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmFsaWRhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmFsaWRhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU5N2VhNjYwZjQ4ZGVlOTBjYWRkYTI1YjIwNWU5ZDg5YTkzNGYwZTQxOGVhMWFlODkzNTNiNTc5OGYyMzUyYzBmMDIwNDgwY2ZkZmNkYzFmYjQwYWIwMTJiZmQ3MTNlYjM3NzE3ZDFkYzU1NTkyOTY4N2Y4MjAxODA5NDEyMzAzIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvcmF0aW8uanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9nb3Zlcm5hbmNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy9jb250cmFjdEhlbHBlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0SGVscGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZ292ZXJuYW5jZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3R5cGVHdWFyZHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jbGVhblByb3Bvc2FsLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jbGVhblByb3Bvc2FsLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2F1Y3Rpb24vdXRpbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXVjdGlvbi91dGlsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmQ2NzA1NjJjYzhiNGVlYmVkMDAxNDY5MDkwZTI2YjlkYzc3M2NhMjcwYTFlOTM0NTFjNTMyNzFjNDc4NDNlYzE1NDI4NGRlYTcwYmIyNDM4ODk1YTAwYTliZTA0Njg3NGU1MzgwZDNjYTNhM2FkN2U0Y2I0NzdjNGNlZTEwOTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29sbGVjdEZlZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbGxlY3RGZWVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDZkZGVkNWYyZDc2MzRhNTA2YTI4MDRhNmU2MTRlMzk1ZWE5M2VlZDQ5ZWQ4MmQxZDcyNmFlMGYzODM5NmMxYjZmMDg2NTY5ZDZlYmJkYjllNjU3YjRmNDlhZDlhZGJjMWIzZTEzYThhMzA3YWIzM2IzZjRhZGM2Nzc3MTFmMWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYTNkYzliZWE1MjUwY2RmOThjNWJhZmU0OTkwZjMyMjE2MTU0M2E1OGNhOTkyNzU3NDA0M2Q0NTJkZDRmZDg0MmU1NDg5OTUzNGVlNmI3NjZmZmQyMGJkNjI4MmI1Y2UwY2Q3MjI1YTQ4MjFhNThmMTc0NTdiZTMxYzhkZWVkMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbnRlcmVzdC1tYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbnRlcmVzdC1tYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTg5MWUzMjcyYTAxZmNjNmNmZjliN2YxODEyNDgwNzBmNzc4Yzk4MzQ0ZTI3MGQxNTMzYjg3NDIzYWQ1ZmJjZWM3ZWU5ZmNhMDhiM2U0OGU3OGE0NTgzODY1MmNjNTE0YzNmZWQxZDg1ZjZjZjgzNzhjMmI4ZjlkMDc3MDM3NmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW50ZXJlc3QuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ludGVyZXN0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDYxYWM2NmJlMGI1MzY4NjNlZDU0OGRmYjczMjI0NDY5NDE1MjU0MTZiMjQyMjMxZjYyNzI3YjAzMjRmYjllOGEwM2ZkNGJjMzRlNTY1ZmQ3ZWZiNGI5Y2Y4ZWUwZTYxZmQxMWRkMjNjNzU0OGI2Mjk4OTM1MGM4YWIyMzkwMTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF1bHRGYWN0b3J5L21hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdWx0RmFjdG9yeS9tYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2RkM2JlNmMyNmI5MTg1Y2Q3YmQ1ZDU2ZTJhNDNkMGY3Y2IxODk0NWQzMzAzOTRmOWNjYzFlNDc1MTVkNjFkN2YyMTcyNzRkOTI4ZGJlMDcwMTEzMDdlODY0Y2Q5ZWM0YmQ4YjAxM2FkNWNkMTgyZTc0ZDJhYTNiNWRkOTYxZDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF1bHRGYWN0b3J5L29yZGVyZWRWYXVsdFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXVsdEZhY3Rvcnkvb3JkZXJlZFZhdWx0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZTc0MDBjYzM2ZGU1M2YxMmJjOTJmNDE5ZmYzZWEzNWQ2YzQ3ZDkyYTgyNzgyYzFjMmU5ZTU5NzYyYzU4MWQ1YWM0NDZjOTBkYTZlODUyNDkyNTlhYmJkYjI3YjlmNDM3NDQ3ZmQ3YjAxOGE2MDJkMTRmOTM2OGE3ODliZjY1MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXVsdEZhY3RvcnkvcGFyYW1zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXVsdEZhY3RvcnkvcGFyYW1zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGE5ZmVkYzZhYWM1M2ZmNzY3Y2I1NmZmMDgxMWQ1YmYwOGUxMWNlYjI0NzQxNzY1ZWQ1ZDEzYWY2MDlhMzNkMGZmMzNiZjIwNDQ4YTIxM2RiOTU2NjgzZWY4NDcxZmNhODA2ZjI1Mzc0ZGYyMDc3MjgyZjJjODEyOWE5MTU5OTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF1bHRGYWN0b3J5L3ByaW9yaXRpemVkVmF1bHRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXVsdEZhY3RvcnkvcHJpb3JpdGl6ZWRWYXVsdHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YjU5M2I2Mjk4MzY2MDJlM2FlZTkyMjExY2JlNTc4NjRhODZkYTUzYjQxOGNiYmEyZDQyNGFjNzhhOGIyMzY4YmU0OWEwNzY2NTNjMzI0NDNiMTJmMTNjMzcyNTM4ZWE2YTRkNzNhNjE0YjIxOWE1Y2M2NmU4YzRkNWNmY2NkMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXVsdEZhY3Rvcnkvc3RvcmVVdGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF1bHRGYWN0b3J5L3N0b3JlVXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTFlZmJjMzlkNThmODAwYjA1OTdiZmU5N2ZhYWFkYWY5MTQ2MTQwOTMyYzY0ODg5YzFiNGY4YTNlZTNjMGQxNTc0Zjk4MGI0YTlkNjEwNGI3NzliZGQ2NTFkODRlOGRhNGYwNzYzNGFlNzBkZTQyODhmMzg1Zjc3MzEzZjAzMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXVsdEZhY3RvcnkvdmF1bHQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdWx0RmFjdG9yeS92YXVsdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI2NTU2MjQwMzNiNzRlZWZmNmNkY2M2MWJkODVkOTAzNGE4ZWM0MzQwZGQyNTI2ODljMTJiNTI4NmY1ZDRlM2MwYzRhNmVkMDJmOTMzMTlhMDdlNzZhNWUwODY5NDE2NGYwMjJjYmRmYmU3ZWJiOTAyNGM5ODk2NzAxNjk5YmYxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdWx0RmFjdG9yeS92YXVsdERpcmVjdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXVsdEZhY3RvcnkvdmF1bHREaXJlY3Rvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImViOTc3ODQ0NzhkNzVmYTBkMDY1YWRiYTM0M2E2ZWRhMWIxZjk3YTcyNzNjZGY4MTNhYWE5YTJkNmNkMjhiYTYxZTdhN2YyNDM3YzkwYjY5MDUwZjBjYmRhNGE2ZGQ2ZDNjMGZiN2QzZTMxNDdlMTNlMzM3ZWJkMTkwMmYwMWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdWx0RmFjdG9yeS92YXVsdEZhY3RvcnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdWx0RmFjdG9yeS92YXVsdEZhY3RvcnkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YTY0YmYxMTU1NjJlNGJlNjBkN2VlOTM4Mjg4OGMzZDhmNWUxMGEzOTk4Nzk2YmQxYjk0ZDE4ODQ1Y2M0N2I0YWJkZWI3MTEwZmUxNjhhM2QzODExYzYwYTIwMTM2YTgwODgyYTcyMzZhYzg3YzI5Mzk4MzJjOGEyYzU1ZDg3MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXVsdEZhY3RvcnkvdmF1bHRIb2xkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdWx0RmFjdG9yeS92YXVsdEhvbGRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjExMTQzNWY5YWZhNDk0MzdhNjRhZTQ1NzFmNDM2ZDIzOThhNTgxZWIxNzJlNWQzZmZhMWU2NWQ0YjIxODRiNjFjZWMyNTY5NGVjNDBjYTMxYjZlNDZlYmFkYjViOTQ2MTk0NGYzN2M0ZmNmM2Q3Y2QzMjAwYTg1YjEzYmE3ZDU0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdWx0RmFjdG9yeS92YXVsdEtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF1bHRGYWN0b3J5L3ZhdWx0S2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWRhODY3OTNjYmFiMTRhYzQzYmYzMzVkN2EzNWRlNDY2NDM4ZGQyNjgzNzQwMjA2ZjQyZTFkNTdiY2QxOTc0Y2Q4N2EyMmM2NzQ4NmQ2ZDM0OGZkMGU3ODI1MDAyZDM3YjgzMTE3NDFkODA1ODRjMjAyMmEzOTNkMzcxYjVlMzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF1bHRGYWN0b3J5L3ZhdWx0TWFuYWdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF1bHRGYWN0b3J5L3ZhdWx0TWFuYWdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0Yzk0NDk3MjAyODU5YzhhMjhhNjBkMzJjZDY3NjMyMTgzZTcwMjVmODQ0ZWE0ZGQ4OTczMTZiMjYzNDRlYWQ0MTY5YWNiMDVjOWU1NmEzZjAwZTRiZDZjZDA5YzQzM2U5MDEwODI2YjA0NjZjMzlmNWZkN2NjMmRjNDQ3ZTM4IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlcm5hbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYWNoZS1tYXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2FjaGUtbWFwLXYxLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1ldGEtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0cmVhbSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdHJlYW0tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NhbGxiYWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jYWxsYmFjay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIwZWQyNmQzODZjNGU2NmNiNmUzYjkwNzE1Yzk3YWU2ZDBkYTZlYzMzMmYzNjg0ODllNjM1MGI2OTM3N2MwYmRhNjBlMDEwYzY0MWMxZGY3OGJiZjFmYWU4ZGJjMWUzOTJkYTczMmZiYTNjM2E3YjM2ZjhiNWQ2MTI2M2NlNzEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NsaS11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2xpLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjMyMjgxZGZiMmM4NDE0ZjUxNjg4YTNkZmQ5NjFjNjI3ZTg5N2M5ZDdlZjA0NWNjNmQzY2U0NTcxMGJkMDcxY2I4ZTU2ZWQ1Y2Q5YzAzY2I4MDc3NjQ5ZTk1Mzc0OTllYmM4OWRkZjU2N2YxNjQ0NTRlYzZlZjRlMWZmMDMwNWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uZmlnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25maWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMGIxMGI3YTVhZjI0MWFhMGFlMmQ2Y2M5MWIwY2EwZmQxZDJiZTVmM2ViNmY0YmNjYTQ2OTZmYjk0OWVhMDBlMDM5Y2MzMDAwMTNhNjQ1NWRjZDU4NTJhMTE3MGY1MmYzODIwNzYxN2RiYjEzMmY3NDM4ODQwZjk3ZjhmNWUxZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVidWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MmRmMzQ4MTliZWI4ZmY3MjJjNzhhZjFiNzkxZWY4MDkxZTU4MzA4OWFhYjc0NmFmNDlmZWRhODA0ZDhkYzZlMmVlMjBkNThjMjZhZjI2MjY3MTRjZGMyZWM1MzEwYTY0MTA4N2M2Mjg1MjkwOWI1M2FlNDliMTBjZDE0ZjU1OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0MjI0YjU5ZjhkNjVlN2FkMjMzNTMwMzY4NGIxYTgxZjUzMGFkNzUzOGI1MTNkM2IwNGExNWY4ZGRmZGQzNjFhOTc3YTU3ZGU4YjI3MTY5ZTJlNzI0OTk1Nzk2ODdjMjgyZDUzYTMxZTdhM2U4NTUzYTM2ZDFkZDUwZDJhNGM0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQyYWQ0N2M2NjMyNWE2YzUwMDI5ODAxMTI4OWYyMzIxNzI1YzZmNjZjNGZlZmU3OWM2ODZmODVmN2NiNjU2MzJjMjUyNDQ1YTQyMWRjNTljYWY1MjcyNGFkMmIxNzQ5NTFjY2QxZWVjYzc3MGUzZTZiYWM2OWZmMTlmNDJlMTUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2pzLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qcy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVjYTI1NDAwY2U3MmNhODEwOTA0OWMzOGNkOTc0YTgyODI0MDAxODc5MDc3ODI2ZGFkZDJkZGM2ZWEzNGU2YTA1ZDY3ODc4ZWZlYWI0ZmRjYjQ3NjYyODc1NmY0YjI5OGRlZDgwYjhhNDk4M2Q1NjUyMDhhYzg0MDU2NTVmNDkyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleU1pcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5TWlycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzcyY2RlZjgyMzA0Y2E0ZWE2NDA2ZmYzNGJhMWU3M2ZhNzQ3MjcwMDlmYmIwZDA3ZjAzMGQxZDZlYzdkYzM3MjY4NTcwYjE1NzdiYmU1Y2NkYjhiOGQ3ODBjNzY2YzJhNWIwZWJkNjc4OTM4ZjA1MmYzMzU2ZDZhMTdkMTdlYTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFmMjIwYTFjOWQ4YmI5MDI5NDZkMjk0ZDNiYzc4ZjFjYWZlYTZlNzdmNzljYzA2NzAzNzkzODFlMTg5NmI0ZDE2MDcwOWM1ZGMwZTI4YzY5ZWI3ZmJkY2NlODZkMjBkODdmNDIzYTc0Mjc4OGM3ZjRhNWIxMDI3NzRjMzAzNTc2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwvaW5hY2Nlc3NpYmxlLXZhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC9pbmFjY2Vzc2libGUtdmFsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjcwZDY4ZGE2YmY3NjliZjkwYTg0MjRiODI0Y2E4ZjFjMWFhMWY0NjA0MGY2NDU2YmQ0NzU4MTY4MjczNmI0NTk2YjE1YmY4NjMxMjBiZjgyOGFjOTdhZjlhMWEzZmY1NzliNzFmMGVhOWQ0MWFmYzcxMTZlMWMyZWNiOWE0ODIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC9wdXJlLWRhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwvcHVyZS1kYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTQwYTM5ZmVlMmZkZmQ2YmUyNTk3MzM5OWFiYzY2OWY2YzE5MGU3NjdkYjE3YjY0MzFmYmNjZDczN2NkYWM5MmVmYWY5YmUwNDY0NjM3NjYzNDEzZTE2MzNhYmFiNGEyNTNlOTZjZmE1ODgyMGJjYTdlODVkNTFjZGVmZWM4ZWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWU1ZjAzZjM1ZjI5ZGU4YWUyM2Y5Y2FlMzMyYWYyODllNjc4NDNkNGNjOWMzMzE2M2MzODMzYWYxM2MxYjc3ZjU0Y2JlNWY0ZjZhMGYzMzI4NzdiMjBjNzEzMGY4M2Q0YWVmYjZmMWYwYTBjNDk1NDBkMmI5MzlhZjU0MGMwMGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWV0aG9kLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXRob2QtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNDJmYzYyNGQ4OTgwNTZmZDZhNDU2ZmJhNjBmMDQzYWFkZGU5NGEwZmM5MzZlZDdmYWM3NmNhN2FhYmUwNmM2NjgwZDk4MGM3NTQxNmViOWQ3NDA4ZDNhMjBhYTRjNzNkMTdmNDAyNmI4YTZjMjdhZDk5ZDQ3NTk0YjU3MjJmOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXRyaWNzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXRyaWNzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTY3ZWYzYWFhZWE3MzUyZjRiMjNlMjZkMTIwOThjZjUzZjdiZTA1ZTk3MzFhOTM5NjQzODZjNTk2ZTIyYzAyYWJjNTk4ZWQxZDQyZTQ0MWM2NGJiMWQxMDdmOWQ0MDU5NjlhYjVhNWJiNmM4ZGYwNTQ4MjA2YjE0NGQ1MjIyNWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbmF0dXJhbC1zb3J0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uYXR1cmFsLXNvcnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YjE0ZTEzMGI3YTQ3MTViODE5Mjc2YmJkNWUzODY5M2JhMzA3NjA4NThlNjhjMGYzNThmY2U5MDI1OWNmNjYxM2VlZjlhODc4ODI0NzhhYzRhNDJhODNhZDc2NjQ3NWQxZjU3NjAyNDgwZmM4ZWFjZWQyNTNkZTViMzA0YmIwYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zZXMtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Nlcy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcwYzc5ZWRiMmRkMTg3YTM1MWEyOTkzZWY4YTlhNTlmZmQ1MzVhMmQzNmI5NjNlN2YzZmVkZGJkMGZiYzA4Zjk5ZGU3OTIxMmExN2NiNWRhZmExYjM2ZTZjMjJkMGYyZTY0OTA0MmMxNGI3MmFlNzkwZjZmYTQ1ZjBmMmRiY2IwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Rlc3RpbmctdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Rlc3RpbmctdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZjQ1YWY3ZDQ3ZTdiZTU5NGZiMjQwZWM5YmFkOWUxYzg5NTEwM2E3OWM0ZjYxNTZmNTYzYjk0NjcyNjNkZmU3ZDcwYTY3M2IxYzIxZDc4MjExMzMwNDU5NDQ5ZWExMjJkNTdhNTAyYjlmM2Q3MzJjNmRkNmZmNDkyOTViZTEzOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90bXBEaXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RtcERpci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmNTVjMTVmN2ZhZmQ2ZmFlYzkyZDAzZjM3Y2YyNDYzNzM3Y2U0MWRjOWEwNzNlNjRhODVjMGU5OTk1ZTZmMGIwNGYwZDJkYjIyNzY1NDRkYTE0MGNjM2M2MzU5ODA5OTY0NDdmODgyNDUzNzUzZTFkODBhNmExNjBmYWFmYzhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVDaGVjay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUNoZWNrLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWYzYmM3ZDI0MDgwMjMzYzUxNzk2YzVkMDk0NzZjMjljZTcyMWM3ZmIyMTYxNWViZTkzMjNiN2JhZDk1YzEwOTMyNDRkYWMyNjA1YjhmMWJkOGJlN2ZlMTAyNTdlZjRiYmZjNzI3ZDM0NDAwYjYyNjVjN2IyNDNkMGJkMDYyMmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFiYjRmMjZkNjQzNTFiYTY2YWEzMjc4ZDUwNjA5MDFhYzliYzA2YWJkOWI1MDJhNTZjMmJjZTgzMTU4N2FhYWY5ODlhYmM5MDdkYWMwMzk2ZjU1MDA1Njg1MGI1ZDUwMTMzMjEwNDRjM2U5MTMyMmFhYzRkZTBmYTRkNTNhYzBlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91cGdyYWRlLWFwaS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE1MjhlZjA0NTVjZTM3NzNiNjUwNzk3NGQ2NGU0MzM0Zjk2MTQ4YzlmMTEzNzQ5M2FjMjk0ZTFmMGM4NGM0OTk0ODYyM2ZhMDczZjY3Y2QyOTI4Njk4YjU3MmM4MzQ1YmQwNDgxZTQzYjZmYTJkZmMwYjRiYzhlMDFhNWE5MmI2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9ub3RpZmllciIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3Rlc3RpbmctdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy91cGdyYWRlLWFwaS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxMWMwZWRhMGU2YmM0MzIxMDllZTY1MDEyYTY1OGVmOWYxMzU4MmY5MTZmODliM2ZjZWEzNzM2MzMyMGJiNWU5NmFkNDI0ZjgxMmZlNjYwZDQwNWZhYmYwN2EzN2IxM2I2NDEwODBhOWZmMzM0NjliZjA5MDJjNTc4ZDY0MDAxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyN2RlZGE0MWY0ZWZmZDQxZDJjOWNlYmI3ZWY5MTQ3MTZlODAzOTI1MGEzZmM2NGUzMmFmZGE2NWZjZDJlYjE1M2JjMmVmODc0NjVmODkwZDMxYTlmOTQwYzBkNDAwN2RkODg1Njg2ZDVmYzI1YmMwY2NlNzFkMWUyZjcwZWQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhYWNlYjE3YzdiNGJmMDAxMzAyODJlOWFjNDc5NGFiYjVkNTE5NTIyNjczM2I3ODZiNmZkZjYwNTA1NTBkZGExYWVkMjNkNmUxNjMwZTMwMGYzZDg1NzhhYWQ5M2ZhM2Q4NjdmNDkwMDgwYTdlZmViMjQ3ZjI2YThjMzMzMDU2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkzMDE4MDRkZmM0YzM1MDY4NjZmODA5MzNmZjNmZmE2ZDc0M2UzY2UwNTJkYmNjMzc5NDdmNjRkYzY3OTRlYzdmNTgzNzJhYTc5NzliNjA5ZDc2NjFiY2FmMjljZDk5YzE2M2NkOWQ1ODNiNDA0ZTI0N2Y1NjViMGUxOGRiMTQ0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC1ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLW5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzVkYjBkMTU5MzcwNDE4OGJjNjc5ZWQ0ZDUyMTZlZmEyMzg4Yjg3M2FkYWFiZTNlNjM1NGFiMzU1Y2M4NDdmNjQ0NWQ5OGE1ZTA4YTc1NmYzZTk4YzJkMjE0NzM4OTY4M2VkNTExMjQzYmMwMWY4OWE1NWJmNGMwNWJhMWNkZTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGIyNzhlNDUxNjkxNDU1Y2NhMWJiYzlhODNiM2QzNzg1YTg0MmJmY2FjYzA1MDM5NzlhMDQ0ZTNkNWM2MWM2ZGMwOWQzYTAxODdmZjk1MTkyYjQwYTQ4NzJmOThjMWE4MWM3NzQ5MzVhZDEyZDM3NGVhZDJmYzk4YWQ5MGFmMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTRhZjE3ZGUwYzAxYmNkZjEzNmFlYjYwNjEyMmY1OGM5ZDYzNGZlZjEzNTdkNmRmOGNkZGNkMDUyN2Y3N2U5NTEwZTdkYjJlN2IxNDhjMjcyYTlhMjE5NmRhZDYwZmJmYjEzOWMzMmUxYmM5MDdkYmJiMjdhN2QzODEzYTA5ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjI3OTI2MmI0Yzc5YzcwYzQ4MjhmMTliMDlmNDVmY2FhZGFjNTgxZDZhMWQ1NDA1MGRlZTExMjYyNGI2MDViOTRhNzJmZTY1YjhkMTQ2MWZiMGE1YjdkNzQ1MjhhNTQ5ZjAwN2Q4NDI2YmYzNTkzNzU4ZWMzZjJkYmE0YzE5MmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdG9waWMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RvcGljLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU4N2QyZTEyNDY5NTRlNWM0MTQ0ZTU4ZGM3NjZlNTYwMDE5YjdjNzEwNGFhMzcyMTQ4MjRhMmQ4Y2FmMDgwN2IwYmVhNDc1OGQ1OGFlYjU3NWZjN2ZmY2FhYjYxODIxYzhlZTYwNTgxMGY2NGU2ZTliYTM2MTExOGE2MjVlZGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidG9vbHMvdGVzdFN1cHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmVkODQxMmM5MmViYTgwNGQ2OTcxNGJiMjVkNDkxNjFiNjFkMzI5N2FmYjI4NTBhOTBlYjc0NTU4NzczNjE0OGRhZTQwNmQyNjZmYWY1NjU2MjU0ZWNjYTc2ZjU0MTE0YWU5OGE5Y2VhODc4YzIzZTYwMmVjNmFkYzk3ZDRjODEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3RvcmUtdjAuOS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N0b3JlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MS41LjEyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1OGM3OTZhNjdkNzk0Mjg3OWZkNzJjYmZkODA5YjhlNjAxMjYxZjVlODQyNmQwZDAzMzNjYmQwMzQ5NWFjZmQyZDgxZjk0NmMwOWNkMjcwYjZjNmFhZjlkZWRmOTc5YzRlYjhmMmNiNTQzZDcyNDdkYjliZGIyM2I0MTEyNmIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYzAzZDVhODBmNzM5ZDRlYWY2ZjI2ODQ1MDE2YTI0MjBkNjJkMjRkYTc3MjliODA5ZDcwMjRmYjY4ZDE0ODQ0OWU1YjE1ZTc4MDJlODQ2YmU1OTVlNjBjZDk1MTQ3ODMzNjg2NGRhYzZkYjNkMjIyZDcxMzI3MGNiYWE3MGVjMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYzdlM2IyOTcxOTRhMDA1MTEzYTFhNjNmNTg2YzYzMTdhZTI0NGIwNmQ0OTliNzVkYmYxMzkxYmE4NTYxN2NkZTIyM2U4NzVhYTQ1MTJkZmE0YzJjNGRjNDQxM2UyNWE5Njg3YzBkZDU1MTcxNjdkYTM4NDg0M2ZlMjE0YTU3OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEzMTRjNGVhNDI0ODBiNTBhNDk4MWRjOGM2YjQ4OTIzZDA4OTk1NDg1NWM3M2Y2YTM4YzhhNGQ2M2I1ZGQ1MjlhMjY4ZGQ4MzdkZDBhZTE3NTk5Y2NlYzEwODNmMjAyOWUwODcyMzJiZDMyZDc2ZjcyNzIyOWMyMmI4MTM4M2U0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2VlOTlmZGFkMTVkYWE5NGJkMzE4NTEzMjY5Yjc5MmVhZmFlY2E3MGU2NDQ4NTc5YTI0NmYzYzM1NWQwYmUwMDI1ZmYyOTBkNzZjZDhkZGZkM2MzMWEyNGJmYzM3ZjdlZTVhM2M4OGQ1N2RiYWE1MmYxZjY3NTYwYTMzNDMxMDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcyNGY0OWYyZjQwNDM0MzRiODM3OTk2ZDQ1NjhhMmE2MDY1M2U2ZTNiMTUxNTVjMGFmODJiMTNkNDIwYjIwNTc5ZTkxY2UwMmUyMmYxNDBhNGQ1MjU5ODQ3YzE5ZTcyOGIzZmYyNGU4YTBkYmQ3N2FjN2M3YmQ0NDE3NjNlYmE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMzBkZThjZTkzOWNlMjAwZDBjMTA2MTQ2ZGJmMTllM2ZjZDhhZWFhMWFlZGQzYjEzZWQwMzk3ODJlOTlmNjdmZTBhYmQyNmZjNDFhYzIzODExMjkxNzI2MzRkOTBhNGY2NTRmZDE4MDU4ZTMzYTdiMjA1N2VkMjAzZTY1YzNkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI3Y2ZlZGMyMmNlOTQ4MjhjNGU4ZDkwN2FiN2Q0MGUxODIyYmVlZjg1NTllMzE2YmMwODgzZTA2YmQ4M2FiZTBlMWUyY2Q3NWEyN2EyODA1ODdhMTIxMGUxZDFiMjZiZWQ3NTQ5YTVkMmY1N2QwYTZjYWQ1ZWU5YWQwZDViNmRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3RpbWUtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3RpbWUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDBiYzRiMjFhMjhjM2E1Yjc2ZjQ3ZmFkYTRlYzE3NjFlMTE1OWM0MWUxZmViYmYwOTVlYWVkNjExOGUxNzM2ZTU5NDYwM2MxOGVmMDI0YWM1NmY2YTVhYjNmM2NmMDg2YzVmNWI1NDRlZGUxMDAzMDFmYjM1ODI5YzUxYWIyN2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGltZU1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RpbWVNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDcwNWE0OGE5MzI3NmNiMjMxNmUzYzZiODBmYzFiZDQzOWY2ZmVjNTc2YjUyYTg0NWRjOTg4YjZlMmJlOTRhMWVkZTkyMjZjNmEyMmM2ZmI4ODA4N2FmZDFhMjM1YWM4MGFjYmMyYTE5ZDI5YWU5OTE4MmZkMWQ4Y2ViMDY4Y2UiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM2MWIwNjAyNGMyZGQzMmY3Y2UxYzg0YzNmZWMzY2ZiNTdhZjhkMjkyZjIxZTdiOGYyNDAxNTM3MWMxN2YyMzFjMWFlMmQ0ZDE3YTBkMzQ4NjZhMWM2ZjgwNzMyOGNlZmFmMjg5YWFlOWNhYjViYjFhYzBiZTYyNDJiOTNiOTE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy92YXQtZGF0YSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2OWJiMTU3MjgyNDk5NmU4Y2M2OTdjZWJhYjU0YTIwYWNjMTljYmVhZDBmYmVhMDUzOGU2NDYxNjMyYmYyOTE3ZGNhNGU3NDM5YWRhNGMyZDhiNjNmMDFlNzkyYmE3NDA1OTc1OTdkYzM3ZTdjMzZhNDJiYTdlNzY0ZTk1NWM2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3MmZlM2E2ODM4ODNlODVjYzRkZDNiODZhOGI1ZmMxZjJiYTFmNjc3ZWI4MDMzMTk5MGZkNTQ1MDU2ZjhmMWEzMWJkNGU2OTM1OGViYTEzY2U5MGQxYTJjNWNjMWMzMmZmOTU5MGQyOTBmNGNkODc0NTk4ZTg3ZDAyNzk3MzkyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgzNDRmMWRhZDhmMmE2NTA1M2Q3YWVlYTBiOTZjZWMwZmZkMDJiOTlhNjFhYzcyMTc1MGJmYmNmY2FjYzRjYmNjZDBjY2RhZWNkODM0ODQzNWMzYWY3MWNlMzg2YzY4MGEzMGMzNDI4Zjc0YmExNWYzMTA5Nzc3NjI2NjQ4YzUzIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9iYXNlLXpvbmUvem9uZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vem9uZS1oZWxwZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9yYXRpby5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAvc3JjL3NhZmVNYXRoLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvc2FmZU1hdGguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NsZWFuUHJvcG9zYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NsZWFuUHJvcG9zYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMDkzMzI5NmE3YjQxM2Y2MDkzNThmZDE5MDdmYWI0ZDJlNDEwMTRkZjU5ZjVjY2RlZGJiYTRlZDQ5YTcxZDQ5MWU4ZDIwNzcyYmZkZTg3ODBkMTdhMGRmZGU1YzcwMGExZDgyYjVhNmJkODQ1Mjc5NTQ4NjE4NTBhY2FjMzZlNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDU3YzU2NjM2ZWIxZTc1MTMwYTgxYmQwM2UxYzdlYjFhZWU3MDJmYTEzMmRlYWYxMzM5YWZkNTRkMmM0MDUwYmI0MjJjYzQzMTdjN2Y0NmQ1NmUwYTc3YTE0ZjYxODE0MTJkMWM2ZjJmNzJlYWRlYTE1YjFjNDhhYWMyYzE0NmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NTRjOTUxYWZkYTc2OWZmZjBjZGMyNTMyOGU4ZDM3NTNhM2JmMzY0ZTk4ZTY0YTAwMDBhMmI4ZTFlZTlkMDk0OTMzNWQ1ZDRjNDc0MDJlODNiNmY0NWZjZWZiYjlhMGU2OGI3ZDM2Nzc2YjU3Mjc5ZjIyMTAzZmNlNjk5ZWYwNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NzIzZDVjNjg2NzU4MjgyOTM5MzE0YzgxOWRjNThjYWU0NTBjNjFjNDg5YzU4ZDEzZjRhODZhNzMwNGIxOTVkNWRlMjAxNGI3NmU0ZjdhZTllYjJiZTM2MTkyYmZlNTlmYmQ4OTI2MmY5OTViZTYwNTRjMWRmNGU3M2ZmZTViMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NWY5MjAwZjcxMGY3OTcyMTI5ZTc3NzM0YzU1ZmY5ODMyOWFmNWRmZTcxMzA0Mjg5ODcyYjhlZWJlOTQ0OTc3NDgxOWQ3ZDcyMTA1NmUwODdlNTE5MzBjYzI2MTkzMGNkZGVlM2Q1ZmE0ZTNlYzIwMWVjYzIwZmU4YTM2YTNhZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM4YThiNGI2ZTVhZjY4MmE1MmRhODVjNTkxYjNjMmM1ZjIyOWE5YzQ0ZjRhYTRiNDk1Y2U4ZjI2YjM3ZWUyMjJmN2FmNGQ4ZWNkZjdkY2ExZWMzMzA2MDkxZDY1ODAxMWU5ZmRhMmQ1MmU0MmE5ZTJmYmVjMzkxOTIzMzE4ZWVlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmVwYXJlLW93bmFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9wcmVwYXJlLW93bmFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhYWI0NGM3MGM5ZDM3MTdkMmViMDczNDE0ZDE4YWRlYjQ4ZWI5MzcwMTQ5ZmNlYjJiYjcyZjg2NDM3NjA2NDgxMTc2NWJjYWFiNGU3MDg5MWVmNjhjMmQyNDUwYzEwMGY2MmYyZGM3NmEwMjFkNDE1OTliZDE1MzkwMjJiZTNmZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU2ODU2YWI3YTJlMjA3YmI3MThjOTM3NmQ3YmQyMzA4OTdlYTU0MjljNTQwZTM2MDFjNGU2OWNhZmJjNzdiOTk4ZTExNDA4ZTViNzZmMjUxMzIyMWExOWFlMjM3ZmZkZWY5YjAyYTJmYmMwZDM1MTg2ZjQwYzNjYjUxZWY3ZTA1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFkMjMwZDAxYmYxNGE4Y2ZhMzU2MDk3ZWY1OTM2NjkzM2Y3ZmIwZjEyZjEzMDRjMjdmYzJlNzA4ODgwNGU3YWEyNmViYzRkMGNjZWMzMDYwZmQzMzI4MTk5YjU4MDcyMWRmNzc1OGUyOTlkYjJlMWQ3YTRjNzdlZmFiNTgzMzM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2NkYzU5OGIzMDc1MTZmYTAzODJiNTUxYjYyODczN2M1ZGU3MWFhYzRlMzIzMWU3OGNhYWZiNDQ4Y2IzN2RlZDc0OWU5YTA1MzFiODU4Y2U0M2MwMDlmZTQxNzI4OWI1NzBkYjQzNWJmMTc5NDcxYTMwMmZlNDUwN2QzOWI2NGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRlTWFjaGluZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3N0YXRlTWFjaGluZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg0YmFmZTBlYzdmMmVkNDJhM2E3ZTg5OTA1MDI0ODMwMWFhNGFkMTdjZTA1NGQ3ZGY0NmViYWVjNDMzMTM4NmRmNzVhNzBiN2M1ZjE3OTVmZDA4ZDg0OTE2ZDBlNTYwOTc3OTdlODIzNjJkOWJlNDY2OTNiYmQ1NzYwZjZhMGU2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0aXN0aWNzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZmMjk2NTMzNzMxNjQ3Y2IzOTMzYWJhOTNkMjFmNjA0MGUzNTBmNTU2MjkwMDRlNzNjZmFmNmM0NmU5YWU3MmNhMzQxYTAzZWM2ZWFmNmVhODA2ZTYxODhlNTAwZTc0MjA5Mzc2NmYzMTliZmI2NTQ3Nzc0Y2YyYmM4YmYxZGMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC90b3BpY3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC90b3BpY3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZDFjZTQ5ODMzOTFhODliZjE5ODNlODVjZDk3NWUyYzI4NWNmYTBlYjRmZWUyZDYzMDM0Y2VmOTlhYTM5ZmFmNzllNWM5ZGUzYTliOTEwNmQ0ODVmNWUzZWQxN2FjYTJiNmQ4ZDZlYmI3ZWJhZTNiYmJlZmQwY2Q4NTkyOWFhMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NzliODUwYWY4YWJmMjZmNWY4OTAwOGUwNWZmZDQwZGY3MTJiMGRlMjUzZTBhMzg0NzFiMDdiNjU0NDlmMzFmZGY3NzMyNjBjMjMxZmI2N2RhYzBiZWE0ZTBjZDZhM2U2MjhhMWNhNmQyYzY2NTEwNmMxYzZmMWUzYmMwNDk2ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlSGFuZGxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlSGFuZGxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDdjNWQ1ZmZkNjQ2YjAwMTBkYjgzOTVhMDFkOWEzZGEyODkzZmYwNjdlYWJhYWRlYjQzNmE5ZGRmNzU2YTQ4N2MzZTdiMWEwNjM4OWQ5NTcxZDZkYjI1YjBmZDBkZjIzNWJhYTQyZTE5ZmZlYjJkYTBkOGFjNjdiMjhjM2NmMWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1MDYwOWM3ZjhjNTc4NjY4MzhhZTBjNDIwNWUzNzdlNzM2MTI3OTNjMTU4MmYyZjg3MDQyMWJjZjczYTBlYWQxOTcwNjY0YzNlMzQ4MWQ2YjQwNDQ2MTVkNzYwMTM4OWViNWIzNmU3MTkxNjJjODYyNjEyMDg2MzcwY2U2MmY1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvbmUtdjAuMi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvbmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYmFzZS16b25lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJkdXJhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjIwOGRlZjhkZjFjYmUxNDE4NjY5ZGVkZjgwYmRmNTk1MzU4ZjUzNjZkMTE4OGFjMDRmZTRhMmNiOWM1M2NhODg0ZDg1MjE1YzkwZjFiODdmOTQ5YmIwNDhhNzk2ZWU1YjZmZGExM2Q1MWEyNTllMjU3NDQ2NDgxOWQ2MjJjZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZHVyYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxMzAxNTJlZjQxZTAzNTAwNTRkNTA2OWE1ZjQzN2UxZjJhMTQzZmI2ZjhkZTZhY2I0N2YwOTRkMTc5M2IxZDNjM2RiMDcxMDA4ODhkZjc1NTliNGRiN2MzN2U3NjNmYjk4OGI5MzRlZTE4YmYwNDJiNmNjYTAyOTNkMjk3ZDM3IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jYWNoZS1tYXAtdjEuMS4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9jYWNoZS1tYXAiLAogICAgICAibGFiZWwiOiAiQGVuZG8vY2FjaGUtbWFwLXYxLjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jYWNoZS1tYXAtdjEuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNDlhZWY0ZjU4MWU4MTAyZjk4Y2E0OWFlNDJlZTNiMWI1YWM3YjIxMDU3ZDNiMTdmMDliZjA4ODNkMGMxNWJhMTM1ZDQzY2MzMDMzNTM3ZDYyNzc1NGFiZmVkMTNlNWU5NTY1NjAxNTJjMzhiNTk1ODU1ZDg3MWU3NzRhMTEyNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jYWNoZW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2FjaGVtYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNDIyM2U3YjNhMzZkZjM5YzVjZWM3MjBjOTRjMzc0YmVkNzViNDE1MmExNDAyNmE2OTVjZWY2YmRhZjM4ZGQyNjYyMTUzN2U4MDQzZjgzNGZmOTA3MjE2ODA1ZjQ4NWNiZWFiYjQyYTg4ZTM5NDQxZGQxNGZmZmZmMGQzOTcyMCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY29tbW9uLXYxLjIuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2NvbW1vbiIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXBwbHktbGFiZWxpbmctZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OTc0OWNkMzc4NTg4N2NkZWU2ZmM2ZGI4MGZlYjlmY2VmNzFmNTJkZjM1YjMyNzRhOWM3NGJiMjhlZTM2YzgzMGU1ZTc5MjRhMTJlOTczZjNmYTRiNmIyNjBiNWFkOWQ1MTQzZGU4ZjgzZWVmYjE5YTBhMjhlMzEzYjdkNDBiNyIKICAgICAgICB9LAogICAgICAgICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZnJvbS11bmlxdWUtZW50cmllcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1ZjJlNTU2NWNhNDFjOGIyZjFhMGIyMWY3MzM1NzJiYjBlNmY5NzU1MDNmN2MyNmQ3YzE4MTc1Y2E1OTZiMTliYmJlMjgxMzM0MDdiYjc2M2Y4MGY0NDg1YzA2M2EwMjRlZTVjZmQ5ZTA4MTY5ZDc1NjBkYzQ4OTljNjdhYjVlIgogICAgICAgIH0sCiAgICAgICAgIi4vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpZGVudC1jaGVja2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzk5MDQwMjhmMWM1NjExNmE0NjczNWM3NTRlNTZiZjM5MWY1OGEyZmEyZDMwYjUxNTdhOGQ5YzlkNTg1MTcyM2Q2NzFmYmY1MjI3ZGMyY2JmM2MxYmI1NzY0NDdhY2YwZDRkOTA5YWVlYjFmODFhYzI0OTI3OGE1NjYwZmJmMmIiCiAgICAgICAgfSwKICAgICAgICAiLi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibGlzdC1kaWZmZXJlbmNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzc3YzBlZmE5OWYyOGFjNzdmNGMwOTQ5Yzg0NDgzOWIxNmVhYjIzNmNiOTE5ZThlYTQ4YjY0OWM0OGQ3OTE4YmVkZGNkMGMyY2Q4YWE0MDE3ODI1NGM0YzYwMWRiZmVhMTY3OWFmODFlMjY2MmE3OWI2YzEzMDk4NDY5NjQyYmIiCiAgICAgICAgfSwKICAgICAgICAiLi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm1ha2UtYXJyYXktaXRlcmF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTllZTNhZTk5MmFhYTg4OGJiZTQxYjMzMDJiMjA0ZDFmZGYzNjAwZmNkZTdkODZlNDRmOTRiZmE1MzQxNDIzNDk4OGIyOTI0OWYyN2E2NDY4OTliM2VmYTljMWFiYTFjYWI5NDAzMzg5YTZiOWY0NTg5ODk0YWYyODA0OWU5OCIKICAgICAgICB9LAogICAgICAgICIuL21ha2UtaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibWFrZS1pdGVyYXRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUwOTJkZDgxOGU4ZTBjYmM2ZWExYjZhZjBjMjFkZjVhMmU4NmVkMTg5NmUxZTdiNzEyYTc5YmRiMTA4NGJlMDY5ODlkYjFiYmI5ODRlYTk0NDM1NWI5MWZiNjY0ZTQxYTE2N2QzM2FiNTBjYTFlYTAyODE4ZmQ5MjRmNzE1ZTMzIgogICAgICAgIH0sCiAgICAgICAgIi4vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2RmNTkyY2FjNzFjODVjMzFlYjk3NWM5MjE3NjZmMGZjMWFjMDI1MTExMjhjOWFmMzVmMjE1NTgzZjY5NDhhODU4Yjc5YjhmZmVjMzFkNGU5ODgwYTM1ZWY5YmFiN2IyYzJlMDZiMTM4YTA2MzJiMTE4ZjU4OGYxMTg3MjNjM2MiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWV0YS1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAib2JqZWN0LW1ldGEtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTc4MDNlOTA4NWYxNmNhMDFiY2FmNTUwNmI0ZTU1YjllYjE0Zjc3ZmQ5YTMwNzU5YTI5ODgyMmNiYzQ4ZjEyNTU5OTNiYTYxZmRmMjExM2JhMTk5YzEwYzBmNTM0ODMxODFjN2I3YWEzZWNmOGUxN2IxZjNmODBhYTUzMDdkNWUiCiAgICAgICAgfSwKICAgICAgICAiLi90aHJvdy1sYWJlbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInRocm93LWxhYmVsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkN2ExMDU1OGM2NTZhOThiNWY5ZDAzODRjNzlmOTRkZjk4MjExODBkMDBlOWMyNjk3N2IwMWY5YWJiNjhjNTE5NmJkZTUxYzMwZjEyNjE1ZmRjOTU3YTUwODA1NzU5MzNkMDkzYjI3ZmUzOTVkMjAwMTIwZTM0YWIzZDg5YmQwMiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZW52LW9wdGlvbnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjYTc2ZWQ3YzZiNjU2NzFmNzBiMjY0NmY2ODk0MzU3MjRkOGI5OTMwYTVmZjI5ZDFmYjMyN2VkOTZmZDQxNDQ2OTUyNTg5NjJkYWZiOTgyODYyYTJlZmMxYjAzZDBhZDk2YjMzYzJjYWU1YmViZmEzNzI2ODg2YTA2ZjY2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwYzgzMTM5MTY3ZmI1MjQ2NjgwY2YzYjYwODlhZTZmZTIyY2UyYWQ4MTY4NWM2M2ZkYzYzZWI2OWM2NTIyOTgxNGE3ZjhiZDViYWJhMTYwYzI2NWJkYjQ1OTUyYTMxNTM5MWRjNTM3YmUzMDM5NTY1ZWE3ZjAxYzg4OTZkZGJjZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vycm9ycyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzBkN2ZmMTdiM2QyMmI1ZTNjZDkyOWNhYjJiZmExYTUxYzc3MTIzNzAyMDU2ZmRjNjY0ZTc3ZmQ2MDgxNTMzMzYzMDYwNzA5ODA3ZDk5MTRhYTBlZDhjYThlYTgyNDlmMDFjNTgxNDVhNDJkMjdiZGFmN2MzZDcxMWQ4ZDMxODIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OTI0OWFhNzJhYmUwNWExMjAxMmQ5M2ZlNTI1ZTBkZmZlNDM5ZTc3NmViY2ZlYjE5YzIyMWFkZDY3OWJhMmQ4Y2ZlMGMxNTE3ZmUyN2Y4MzBlMWFkYTk2OTA1YWE2YmE4NjE0MGM1ZDkwYjI5YzllNTZiNGEzNGQ2MmQ0ODlmYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbG9jYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xvY2FsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjhmODMyNzVmYzc1ZjE4MTA4ZmFlNDg2MDdkYTBiZDM5ZjI1YTgwZDFjMjU5MjNkMzY2MmU2MmRiNGZmZWEyMDBlOGI1YWQ4NTk3MzZhYTFmNGExYmZjZjEwZjU2MTY3NTgzMjUxZjlmMThmMGQ5YmVkMTlkMjc1MmUwMzZiZTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEwMmVjM2RjZGM2MTczNDlhZjlmMmUyNWNhZGUwOWM4ZGUyOGEyYTEwYmIzNmE5ZjMzZTFhNzg0ZThkMWJkNzRhZGU4YTAyMjhjNzJiMGU1NTEwZWJkZThhYWZmZTg3NjZmN2RlMjk3MThkMWQ3NThlNTNlZTE2MDFlZTZkZjIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1OGIzMTU5MDU5NGQ5ZTc1NjRjOWQ2MTU1NGU1NjcwZTM1MDA1ZTJhZGYyMGMxNDA1MzUzNDI0ZTAwOWRlMTc0NjIyN2UxMmNmZWIwNzU5YzgxODM5MTBjZDJhYzEwZjgyMDFhZTBiYjdlMGIzODQ4ZmU2NzI3NjBiNjNhZGE0ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZDgyMzEwOTlkYzM1NTMwMTg1YjNlNjM2Mjk2M2NjOWUyMjg1YzQ0NDg3NWM5OTdkNTA3YWExMzEzYTg2OWY3ZTU1Yzk2Y2U3ZDYxZjE4MTg2MWIxNjhiMjY3MTVkY2FkODcwODYxMTcxZTI2M2I5OGQzZmU1MzY3NzM4NTQxMSIKICAgICAgICB9LAogICAgICAgICIuL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDYwNzEyMzhiMjVkMzA3NjZmNDQ3M2IzNjA3NWRiMDUwMDRhMzA5NWI3YmE2YWRkMDQ0ZDk4NjY1YzdlMGMzYzMwOWQwNGQ0MzU4YWFkOGIwNWRkOGZjZjAwZjdkZjI5NjE1NWM1ZjgyOWIyZjhiZjM4ZGRiZWZiMTBkNTgzNDkiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V4by12MS41LjEyIjogewogICAgICAibmFtZSI6ICJAZW5kby9leG8iLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzk0MTQ3M2MzMDViZTU3ZTc3ODMxYjg0NmI1ZGQ3MmYwNWIwM2U5NzcwNjk4NDE3NGFjZDFmM2ExM2ZmOGNjYTQ2YzJkNTEwMGYzNWZjYTdkOGYwNzE0YTVkYmQ5M2RkMDliN2U2ZGI2ZGI0YzYwODkzOTljMjQ0ZWM0NmNjYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLW1ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLW1ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ0NDc0ZjcxZjY3Yzc3ODNjNzdiYWUyNjM5ZGE5NjQwMWNhYjdmYmRmNmU1MDYwNzI2MTI1OTA2NzE2NjA5ZTdmODcwZjkyMWMyMmZhOGMzNDliZGJkYjRiODQzM2QxODhlMmVhZjk3ZjllZjIwNDI5MDU0MjJiNTA3YWFkN2RmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjllZTliYWMyZmE2M2U4M2Q1ZWU3Yjk2ZDFjZjkwNmQ5Y2EyZjJmNWE4MmJjYTg0ZmZjNjM2Y2JjMDk4NTJmMDJiMmJiOWU4YzVkOTJlNTg1MjI3MjEzNTZhN2ZkY2VkNWRjZGUwNDgxNWQ0ZjM4MjVmMmFjM2NiNTgzMjQ4OTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZ2V0LWludGVyZmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM2YmFjY2ViYjNiNmNmNGU1NjRjMjA2YTI1ZDlmMzg3MWM2NWRlNmY3Mjc0NjhmNGU3ZDBiNGUxMDEyZGFhMzc2Y2E4ZTkzNjA1MGM1YTJiYjlkNDhhYTI4YWMxMWFmMWMyMGY3NmZjZWFiNDAxNWUwZWZlZjI4MjgxNzUzNmUxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9mYXItdjEuMS4xNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZmFyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YWJjZTViMDU4NDYwMWFiNTUwNjk5MDQyZDE2ZTY2ZDA3NGMyNTViMDQxOTM2ZDJiMDc4NzMyYTY0OTI3YzM1MTVhM2Q0Zjk1MGVlOTYwOTllYTA0ZWQxZGMxNmU0ZjRhODhhZWIwZDgxMWI0ZWViNGQ5N2E0OTJkZjUwNGQzYiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MS44LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ODg0MzBmY2I3ODZiNTYxY2YwM2VjZjY1OWRhODgwZmM4YzRhNmJlMjFlYzZhMjU2ZmQ4ODQzYzkyYmM2NmMxZjEwZjk4MzcxY2M4NWMzNjcwZWE3Y2NmNzQ0MDBhYjExMmU0ZDEwYmNjMzliNjVjZTA1YjQ4NzUyYTI4ZDJjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OGQ0MDAxMzJlMWUzNWMxYTlmMjYzMDFkMDg4MThiMmRkMjBiZTZhODllODc0OTM3YjNiYzkxZDc2YjkwODZhMTAzYzNiN2JiYWIyYjUzMjU3NjVhMDEyODViYWQyY2Q2MjM5Y2IzMDk5ZDM5ODM3ZjM3NDZjZmI3YTU0OTJhMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZjOGI0MjY5N2RiZWUwMjMyOTk0MjQ5ZWJiMDlkMmE3ZDI5ZDNjODc5YTFhMzljMDYyOGMwNzIwZGQyYWU1YjU4YTE1N2Y0NjIxMWY5NTM5ZjE2ZGMyYzYxMjU5YmJiYWM1ZjMwNDIwMjYyMmQ3ZmFkNzU3MDhkYjAwNDlhZjc3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0NGEyOTY1M2RkMTI1MjRiYjc4MWVjNmU3OTRlZDBmNTU0ZTIxYjgxYzNlOTdiMzliNmVjNWIzOTk3ZGRhYWMwNWFlNWM3Njc3Y2IzYmYzMDM0Yzg3NmU5MWIwOGVmMjE2MTlkNTU1YmUxZWJkZWUwMzA2Y2FkNzRkYTU3NGQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ4NmFlOWYzZmZmOWVjMDhlMDRjMTMyNjBiOGE3MzY3MGQ4ZmNmNTdlNmJlZTk3NDRjNjI3MmQxYTA2MDcwN2NlMzRmZTRkNWQ0OTkwNzY0ZWY0ZmYxNGM5OTIzMzc2NWI1Nzc1NjQ0MTM4YmNlMTMyNTYwNzhlY2ZhZmMxNzMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUyMjg5MWU0YzA2NDMxYjU3ODQxMGQzNzZjMjllZTE3NTYzODlkOWU2NzI1MTU5MDJjZmFhMDdmY2FlOGRiMjQ2ZjRmNDQwZGRmMDU5Yjc5ZjRlYjYyZjFjNzU3NzdmZGQ1YmZhOGZjY2Q1YWFmNDE4MTY3NDJlZGE3NjNjYjcwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ODBjYjVmMDY3Y2UyMmE3MTMzNDAyZDI3MjBiNzNmNDE4M2E1NzgxZjIyOGRhYzIwYTZhNDM1NDg4NzJlZWQ1YjNjMjRlMGZiNTM4ZTNhYTJkMzgzOTFmZWI4Y2VkODQ2MDQwYzg3NmE4MmZjYzY4YTc0ZDNhNzQ1OTZiNTc1ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI3MDUyOWViNDFlZTQ4ODQwMTI3YmMyZGQ3YWI3ZjhhMjI0NGRlM2YxZmEzMzRlNGY1OGVlYTQyMWNjMzA1ZjU0MmYyZTdhM2ExNzc4NmM4N2ZjOTA0MzAxN2U3ZDdjNjM3NWRhNGU1MTRjMTY2MGJiODMwMzAwZWU2ZDM4YTFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjUuMS4zIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ4NzBiMTFlMGQ5NTg0NjkxNTZlYjA3MTFjZjFhMGE4YThkZjQwNzk3YjIyMjVmMTRiNmI0YWU3NmM5OTg1YzI3NDIyNDA2YjA3OTYxMDk0MjM0NjAzMzk2YjBiNWNhYThhYmE3NmE5MmNkZTZiZTQyZDg1YjE4NmY4NDdjMDBmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaWRlbnQtY2hlY2tlci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ZTI0NGQ5NDA4Y2VkYjVmMDhkMDJiMTFlYmMzZDkyMDUzNDUyMDZkYThhMmUwOGQ2ZTFiNmFmNTBlYzk4ZmEwNGQwMmE3YzA4NTFjOWVlMDUyYzFlN2YyZGMwODZmNDlkNThmODBjZmNjNGJkOTZhMjkzOGQ4MWQ0ZDkyYWMyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ieXRlQXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J5dGVBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVmN2FkZjk0ZGQxYjE2OWIwMzcwYjk0YWFjNGNiOWM4NmE0MDhhY2ZhMjA0YTY5ZWY2NGYxNGM0NmVkMDQyZjg0ODAzYzM5YjRkODE1NTc5MTBjMWQ2ZTkzZDMwNGEyMjE0OTZiZDcwZWY4YWI4OGIzZTdiZDFjOWU5NGE0YmU1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmM0ZjFjNjZjY2RjZjEwMjVkNTVlMjQxZDU1OTlkM2E4YTk4YjAwMjZhYjEyZmFjYTU0YTAxNWM0MTgxZmQzNmUxZjJkZWE2NDg4OWJiNmQ5NzFiZmZiMmM1MDZiNzkwMjgyZjViNzRkZWU2ZjZjNDI1MDc2Y2RhYTUzZmVjMmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE2YjQ2MDEyY2I4MGY1MWRmNmQ2ZDYyMDAzMmUzNTk3MWJkYTNiOTUxMDUyYjgwMmQ3YTU1MzczYmMwYTY1ZWRmODFjN2IyZGRjMzc5OTI3ZjEyZWViYWYxZGM0YzkwYmQ3NGU0MTQ5NmM0OWZiZTNlMzhmNDQ5YjMwMTMwZTIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDcyOTcyNGUxMDNkMzE3YTE2NmI2Mzg0ZWFiZmUwYTQxZGY3MjJlZTg4ZTA4ZmNiMDJlYTE3M2ZkMTY3NmNjN2VjNDU3NzM1ZTdiZjAyYzk1MjQwYTY1ZGM5NWI5MTIxZDU0YTIwNzFkNDhhYWVhYmJmNGQ0NDNhZWE1MWY1OGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGQyMmNiZGY5OWQ0NTIxZDJlMTdiYjlkNWMxY2ZlMGQ1OWU3NTRiMTVkMWE4NTlhOGFiOWJlMTJlMWNmYzIzMzAwNDgzOGNkMzY5OWVhNDA3NmY3MmU5ZjI4NGNkOWFiY2Q5NjZiN2FkODJmMDg3ZDNjYWMyOGQ2YjEzMmZhMWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YTVkZjA2NmQ4MDI2NjVjYmNmYzgxMDcwZmNkYWJmZDEzYzczMDlhYTU0OTRlNThlNWFjOWQyMDNjNjAxYzdkZTVmMTAyYTRjYzY3YTJjMzQwZjcwMGI2ZDRjY2RhZjAxOWE0YTJjY2M5Y2ZhMWZkODc0ZDI1MmM4YjQ3YTFlOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMjIwMGFjNTkwYzZkZmIxYzEzMmFiODQ1Y2RkNDNhMzYwMjBmMDgyZDdiMWM5Yjc0YzFjYjNmNWFiNDVhYzVhMTQ1NWMwNmU5ODQ5YTNmZDRlNjIyMDE0YTI5OTQxM2M1NzU3YWMwNjIwYTdiYjM4ZDM3OWFjNzg3MjIxZDMxOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2NkNTJiMDg0YzIyYWExOTcxZWUwNGZiZWFkMjg1ZDdhYjQzYzgwNmZhNTNkZTliMmJkYzg4OGU3NTc2ODg1NDc0NWU1YTcwMTdkYzQ0NDNmM2FhMzg0NzhjZDNmYjNjMWFkYjMxOWRkMzgxN2YyMTNiOWJlNzI3MmNhMDI3N2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2U1ZWUyMmY5NTE3MDk1Yzk4NmI0NGRlOTdlMzc3YWVkZTUxZjZiNjI1ZDk5MGNjODQxZjEyOTBlNTc5MTJmOGMxYTE0YmU0YzBjNmFkYmIzZDk2NjIwZmZmZmUxYTJhODc3MjhhZjZkZDgwNzhlNGIzOTg5ODAyZTg1OTg0YjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWE4MjQzZGFkNzU5NGYzMzEzYWNkMzI4MzQwZjY3NmMzY2JiODU4ZmZiNWI2ZmQ0OTQ0ZWI3YzQ2MjkyZmY2MjU0NjY5ZmJlNTc3NTEzNjEzMjc3MzYxYmY1Njg4OWYwMTQ1MGQ1OGFlMjUyMDdkMzc2M2E5ODhhODZjYTBlMmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOThhODIwMmY5MWM0N2ZmYThhZmE4MzAxMTZiODAxYTRjMGIzMmFiYzk4NjE0MjZmNDNiOWQyYWY5ODM0MjAzODAyODFmN2ZhYWE0ZGZmM2RjMTcwYjljZjA0OTkxMTUzODE4YjRhZDhhYjBjZDkwZDdmYTRmMjNlOGNiOGE1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhNzBmMjEzZGMyMjUxMWZmMzVlYTQ0OGU0MGQyYTFmMjgxMzE4NjgwNTBjMzFlZDM0MmY3NjUyYzE5MjE0YWI3Njg0YWZkYWI3YTAwZGFmNDcxMDk4ZTEyOTNkNjY1MWJlODg1NjJhMGQxYjk0MWU3ODk4ZDk1Mzc1OGY3MmZmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0cmluZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RyaW5nLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2FiOTI2MDhlNTE0YWUwNzI0N2I0NTdhMjg2YjU1OTFjYmFiNDJhYTdiNGEzMDk2NmJjYjU4Nzc4Mjk2MGU3MzU4MTg0NWY0Njk4NDRkZWU0NmRjNzFiZTk5MzFhZDliZjU3Mzk3MTcwNjVhYzMyNjdiOTViZjdkMzJiYWI2ZWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZDJmMWY4YzQ4NjcxZDY5NGEzOTM3Y2I3MDU4NzA2ZmM5M2JkNjYxNmZhOTY2Y2NjYzQ1MmFhYzM5NGU5Y2UwMjJmY2M0ODAzNGIzNzQ2NTk5NzQyNDI5MTk3MDIxZjVmYThhYmI1M2U5YzBmOTdkYWYyNmY4Zjg5MGM3ZDhhZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE1ODNkZWQxODA4MTUzOWY0MWE4MTE5NzE1N2NjMDVhZThkYzFiYWU5NWMyYTY3ODc2OGE4MmFjZTExODk1NDI3MjMxYTM2ZTliMmFhYTc5YWRiZTVlZDU4YzNlYzU4MDI2YjJlN2ZmNTg1NjY2MDYxNzhmYjg5MWJlYjU3NWE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjE4ZTNiYmQxZjZhMGQyMzBiMDQyMGVlMTI2NmY2N2YxY2I1M2ExYTI2YmMxZjE0OTY0ZDZhZWQ0MTk5OTZhMmFjYmU0NDVlMDgyZmFhNzM0YWZkODc2MjE5MWU5MjVlMmQxZDU4MTUyNDFjODI5MGU1YmQxOWI3YzllN2MyOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9wYXR0ZXJucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2lkZW50LWNoZWNrZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjOWI3YWJhMzI1YjNhOTQwOGJiOTc3M2QyYjgyMzQ4ZTBlYzVjOGE4ZWZkZDQ3ZmNjY2U1MWQ0YzUyYWJmMmZkNTAyMGZkYWI5ZWFmMGQwZDA1MjhiNzkxNzBiZjAzZmMyOTA2YzMyNjJjY2QwMmIxMWVmYTMyZWUyMjM3YzczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YmJhM2FkMzUyYmM1ZDQzOWYwN2YyOThhNGI5YTkyNmYxZDBiYzUzMzdhYWI4OGU4NjA5ZDVjNDY1MTYyNTE2NWUxNDdiNDc5N2IxMTc1NGI5YWUxMDQyYjZiZTA4OTdjMTc4YTlkNmZiM2RmYTEzN2E4OTZiOWIzYjgyMzVjMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDc5OGEwNzA0OWRlOWU4NzE2MmJhNTMyYjIzMDA3YWFhMTc4MmNlMjlhODc5NzQ5MmE0MzgwMzg0MjQ3YjhhYzQ5Y2YxZGVhMmFkMzA1NDY1NDIwNjk3ZjIzZWVhNDVmNjQ3YTlkMjJlZDQyYTJmYTAwOTkwODI4NWM1NjkyMmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYmM0Y2Y4YzQxMzVlMWQyZTE4NzYyZGU4YjY3YWFjMzFjOTZlM2FhMzFjYzRhYjRkNjExOTg3ZTM3ZGY4NjhjMmJkOTJkMGNjNzNiYjQ3NzRiZGIzMWNiNmJhYjExYmFhYTg4MjZjYzIxZThjYTcxY2ZjN2Y5NDU3NjExMDI1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMxN2Y4M2Y1M2Y5MTJhYTkzZThkZWQ4ZTk3NjZjZGMzYTI2NzE3M2VlZDM1ZDUxZjA1NDgyYWM1ZDc2MTAyYzZjZDQwMzVmZTk5OWNiOGY1MDNiY2FkMjg4NTJiYzdiNDA4MTQ4YTM5N2ZmNzRmOTI1YjI5YzM4NTk1Y2E4MGQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZDFjZWQ1ZjEzNzU0Y2NmZjQ5ZGMwZjgxMGM4ZTZkNTI3MjdiZjJjNGVjNzdhOGRkOWE1ZmY1Nzc0OTVjNGFmY2Y0ZGEyYjhhZjQzNmM4NDMzNmFmOTlhNzFjMWNjYjc0OTBmNmJhMjk3ZWMxOTVmM2YzN2NjNzgwMWVhZGY2YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRlMDk1ZjdjNDU4NTcyYjUxMGZhMzM2MDNjMjA3M2QzMTI5MTUyZGYzZjc0ZDNlNjI3YjM5MzE5MTlmNjY5NGE1NmZlYjg0OTc5ZjhhZTk1NDBkZDQ2MmMwNjg0YjZlNWJiODliYmQwYTg3ZGVmMjJlYTkzNzUzZGVmNzkzNGEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjM0MWQ4ZjU2NWRkNmFhMDMwODJhMzZlMTI1YWM5OGM1MGNkZWE5YzMyM2E2MzNkYThjYzQyZTZiY2U5MGY0ZDAwNjA3ZDQ1MTY0OTQxMTBlMWJmZWRhNGNmM2IyMjFlMDNiM2VlY2Y0Njk2ZWNhOWRiYTZkNmU5OGEyMjRkOGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUzNWE2ZDBiMzBhYzc4ZWVjMzgyN2FhMGY5MTllOTZlOTJmNTNkMTZhNzUzOWZiYTY4MmY3MzllMTZkZjFjZjNiNzIwODZmZDY3NTQyZjc5MDAyYmI3NzZiNmEwZjQ4OTg3ZjRjMDk0NWU1YzZkMzllYzA5Y2E2MTk3ODMzZWU1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTgzOWY5MzM2NmY2OGYwOGQzZTU5NjFiOTQ1MTg1YzA5NDEwMWI3YjczMDdiNWRmZjdmMzQ1ODg4ODY5NDQ4ZDE3MjA2ZDYxODg5NzQ1ODBhMTc4OWQ3NGE3Yzg0OWRmZTc2NWU0M2U0NDU1MzM2YWVkMTM3YjhiMGNmOWQ0NGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmRiMzI0MDAzNGM5MWFmMWMwYjRkNTljZTVjMDljZDhmYjIyM2ZjNTFiMTU3MDEyZWVmZTJkMzMyYmRmN2E0MzkyMDU0NmZlNTcxMzJmMGM1MTM2MzJhOTA5NTNmZjM3MTAwNDI5NDk2YjdiMWMwYzA5YzU3NzQ1ZTMzZjdhZmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc3ZTM1MmZkYzVmY2EzNzdiNDAxYWMxNGEwMzQ2OGUxNDZlMzU3MmEwMDkxNGFmMjAyOTMxZTU4ZmZiOWUxYTQzMjQ2MDZmYmJkMWYyMTRkM2Y1NzY4MTk1ZGNkY2M5NGI3MjFlMTBmZWFmZGEzMGEzNzg1OGUyZjM0MTQ3N2MxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmJhYzQ3NjAxNTY5MzIxOTNiMTBlMWU1MWJkNWE4MTVhM2E3MTEwODEwN2I1ZWNlMzJkNThkZjJkMTQ4MjZmMGJmODVhZTc4ODE5YzYzNzQ3OTc2NzQwNDg4YmZhYzg0ODVjYjBmMmE0ZDk3NzVlNmEyNWJmM2ZlYjMxYzQxNjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzExNzg2YTBhNWNhODA5Y2NhYzFmMTk4MDdhM2I2MTBjNDExMzAxODE3OTZhZWQyZTM3ZGNiZTFjZDhlNDU3OGJkMjA1NTEyYTVmYzlmYjMxMGY0ZmNkNTk0NWQ5NjJlZjI0OTNjMzEyMzQxNTdhOTM0YzVkNWFjMzQ1YmU3YTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3N0cmVhbS12MS4yLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9zdHJlYW0iLAogICAgICAibGFiZWwiOiAiQGVuZG8vc3RyZWFtLXYxLjIuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vc3RyZWFtLXYxLjIuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxMDFkZjE2MDk4Yjc4YTZhMzFjYzM2YWQwNzZmOTNmZTI1ZDk0NjE2MWQ3NjM1Yjg5ODU0NmU2YzBmZjlkOTg4ZmM5NzE4ZTlkNDhlYmY3YjNlZGQ4OWU0ZjI3MzRiODhjMDk0ZDgxNzg4ZjA1NDdjOTNmYThhYTM3Yzk3MWI0IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJqZXNzaWUuanMtdjAuMy40IjogewogICAgICAibmFtZSI6ICJqZXNzaWUuanMiLAogICAgICAibGFiZWwiOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJqZXNzaWUuanMtdjAuMy40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwYWYxMDk5NzI5MDFlZWMzZTdkOWMwMWRhZTI2YWVkNjc5ZmYxMGM2YjhjMmVhYjlmN2I4NTAyYTI3ZDkxNWY0ZmMwZDg4Y2ZmMjVmMTViNjk4NWY0ZTFjZTJiZDQ1M2I3ODMxMGJmNmMzYzZhMjU4MzNjNTFiMDcwNjViMDMyOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDdkZTZjYmI1MWUxNmEyZGQ1MjBmN2U1NjYwYWRmYTNkMzZiOWQyMGVlYmE3Y2QzZDAzNmEwZDViZmQ2ZDE0YWQ4NWY1NjM5MDBmMTZjNmEwN2JjNTcyZmY4NDM2YzNmZDFhZmRjNzU2NzcyMzcwOTgzNzQzZTZkMjRkNzQ3YzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjU3ZThjYTlmNTA0MDNlMGQ0Njk2MmZjODQ1Mzk1OGVmZGM1MzAzNWFkODliYjBmNDZjZjEyNjM2N2Q3NjkyOWU5YjNiZTEzZWY5NWM0NTI3NmZjYjg0NjA3OWE2NDE1ZDczYmQzNTM5MWZhNjYwZGYxNjIwNzliYTcxOWIyZGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhmZDUyZWYzMDJjMWYxNGM2MjBmZGRkNDM3MjdkODIzMjQwM2I5YmQzNTYxZTFmMTIzZGNlOWQ0ZTlhMTNiNTVhMmQxZWU0YWQ4MDcwMmYyNTExMTllOWQ0OTJhOGM3YTM0NWZlNTcxYTQ3OWQzOTFlMmI3ODFmZmIxMzhjMDA2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL21ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFrZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYThkM2M1ZGM3ZDQyYmE3MmZmYzZmZWIyZDk5MTMxYTc5M2MzNDE5MmM1OTE3ODMzMDllMGRhOTFkMTAyOTIxZDhlZDUwNmQ5Nzk1Y2YzYmVmYzZhNzkzZmM2YWIxODAzMWZmMmJiYWRkYmRiNDc2NGM2ZjQ5ZmY4ZTkwM2JiZTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjIyY2QyMzBkYzIxZjZhOTE3NDI3NDVjNThkZjU5MjgwNmFkZThmMTNiODdmMjkwZjA4Njg5YmNjY2M0ZTYxNDc0NGNkZjQzZjhkOWYzZWU2YTFjNTZkOTEwODMxZTM5N2I2NjZiY2I4MDk4YTExMjYyMDAyNTM4NDBmZTY1MDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc0NmI2YWJiY2VhNzBiNTEyMGEwNTQyNjM5YTk4NWQ4OThhMjVmMjVhMjM5NDBlY2MwZmEyNmU2ZWZjOGQ2NTJhNWRiOWFlNWE3NWVjMjc4Zjc5YzQ0ZDg4MDBkOTdhN2JkZWViZmU2NTczM2IzYWI2NjRiYjIzNTNjNDY1NWVlIgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAMYBI+I0BAACNAQAAIAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9oZWFwLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2hlYXAuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9oZWFwLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2hlYXAuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAATMwWR8wsAAPMLAAAkAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9oZWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9leG8iLCJAYWdvcmljL3N0b3JlIiwiLi9tYWtlLW9uY2UuanMiLCIuL2tleXMuanMiLCIuL3dhdGNoLXByb21pc2UuanMiXSwiZXhwb3J0cyI6WyJtYWtlSGVhcFpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXIsaXNQYXNzYWJsZSxtYWtlRXhvLGRlZmluZUV4b0NsYXNzLGRlZmluZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJNYXBTdG9yZSxtYWtlU2NhbGFyU2V0U3RvcmUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxtYWtlU2NhbGFyV2Vha1NldFN0b3JlLG1ha2VPbmNlS2l0LGtleXMsd2F0Y2hQcm9taXNlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVcIixbJGjNj19hID0+IChpc1Bhc3NhYmxlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXhvXCIsIFtbXCJtYWtlRXhvXCIsWyRozY9fYSA9PiAobWFrZUV4byA9ICRozY9fYSldXSxbXCJkZWZpbmVFeG9DbGFzc1wiLFskaM2PX2EgPT4gKGRlZmluZUV4b0NsYXNzID0gJGjNj19hKV1dLFtcImRlZmluZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAoZGVmaW5lRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhclNldFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyV2Vha1NldFN0b3JlID0gJGjNj19hKV1dXV0sW1wiLi9tYWtlLW9uY2UuanNcIiwgW1tcIm1ha2VPbmNlS2l0XCIsWyRozY9fYSA9PiAobWFrZU9uY2VLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL2tleXMuanNcIiwgW1tcImFnb3JpY1ZhdERhdGFLZXlzXCIsWyRozY9fYSA9PiAoa2V5cyA9ICRozY9fYSldXV1dLFtcIi4vd2F0Y2gtcHJvbWlzZS5qc1wiLCBbW1wid2F0Y2hQcm9taXNlXCIsWyRozY9fYSA9PiAod2F0Y2hQcm9taXNlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7U3RvcmVzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQHR5cGUge1N0b3Jlc31cbiAqL1xuY29uc3QgZGV0YWNoZWRIZWFwU3RvcmVzID0gRmFyKCdoZWFwU3RvcmVzJywge1xuICBkZXRhY2hlZDogKCkgPT4gZGV0YWNoZWRIZWFwU3RvcmVzLFxuICBpc1N0b3JhYmxlOiBpc1Bhc3NhYmxlLFxuXG4gIHNldFN0b3JlOiBtYWtlU2NhbGFyU2V0U3RvcmUsXG4gIG1hcFN0b3JlOiBtYWtlU2NhbGFyTWFwU3RvcmUsXG4gIHdlYWtNYXBTdG9yZTogbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxcbiAgd2Vha1NldFN0b3JlOiBtYWtlU2NhbGFyV2Vha1NldFN0b3JlLFxufSk7XG5cbi8qKlxuICogQ3JlYXRlIGEgaGVhcCAoaW4tbWVtb3J5KSB6b25lIHRoYXQgdXNlcyB0aGUgZGVmYXVsdCBleG8gYW5kIHN0b3JlIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Jhc2VMYWJlbF1cbiAqIEByZXR1cm5zIHtab25lfVxuICovXG4gICAgICAgY29uc3QgbWFrZUhlYXBab25lID0gKGJhc2VMYWJlbCA9ICdoZWFwWm9uZScpID0+IHtcbiAgY29uc3QgeyBtYWtlT25jZSwgd3JhcFByb3ZpZGVyIH0gPSBtYWtlT25jZUtpdChiYXNlTGFiZWwsIGRldGFjaGVkSGVhcFN0b3Jlcyk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEBwYXJhbSB7YW55fSBfb3B0aW9uc1xuICovXG4gIGNvbnN0IG1ha2VTdWJab25lID0gKGxhYmVsLCBfb3B0aW9ucykgPT5cbiAgICBtYWtlSGVhcFpvbmUoYCR7YmFzZUxhYmVsfS4ke2xhYmVsfWApO1xuXG4gIHJldHVybiBGYXIoJ2hlYXBab25lJywge1xuICAgIGV4bzogd3JhcFByb3ZpZGVyKG1ha2VFeG8sIGtleXMuZXhvKSxcbiAgICBleG9DbGFzczogd3JhcFByb3ZpZGVyKGRlZmluZUV4b0NsYXNzLCBrZXlzLmV4b0NsYXNzKSxcbiAgICBleG9DbGFzc0tpdDogd3JhcFByb3ZpZGVyKGRlZmluZUV4b0NsYXNzS2l0LCBrZXlzLmV4b0NsYXNzS2l0KSxcbiAgICBzdWJab25lOiB3cmFwUHJvdmlkZXIobWFrZVN1YlpvbmUpLFxuXG4gICAgbWFrZU9uY2UsXG4gICAgd2F0Y2hQcm9taXNlLFxuICAgIGRldGFjaGVkOiBkZXRhY2hlZEhlYXBTdG9yZXMuZGV0YWNoZWQsXG4gICAgaXNTdG9yYWJsZTogZGV0YWNoZWRIZWFwU3RvcmVzLmlzU3RvcmFibGUsXG5cbiAgICBtYXBTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy5tYXBTdG9yZSksXG4gICAgc2V0U3RvcmU6IHdyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMuc2V0U3RvcmUpLFxuICAgIHdlYWtNYXBTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy53ZWFrTWFwU3RvcmUpLFxuICAgIHdlYWtTZXRTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy53ZWFrU2V0U3RvcmUpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VIZWFwWm9uZShtYWtlSGVhcFpvbmUpO1xuaGFyZGVuKG1ha2VIZWFwWm9uZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSGVhcFpvbmUiOlsibWFrZUhlYXBab25lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABVusfp5AgAAeQIAACUAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vZXhwb3J0cy5qcyIsIi4vbWFrZS1vbmNlLmpzIiwiLi9rZXlzLmpzIiwiLi9pcy1wYXNzYWJsZS5qcyIsIi4vd2F0Y2gtcHJvbWlzZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyIsIi4vaXMtcGFzc2FibGUuanMiLCIuL2tleXMuanMiLCIuL21ha2Utb25jZS5qcyIsIi4vd2F0Y2gtcHJvbWlzZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2V4cG9ydHMuanNcIiwgW11dLFtcIi4vbWFrZS1vbmNlLmpzXCIsIFtdXSxbXCIuL2tleXMuanNcIiwgW11dLFtcIi4vaXMtcGFzc2FibGUuanNcIiwgW11dLFtcIi4vd2F0Y2gtcHJvbWlzZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAtTNWRIQMAACEDAAArAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pcy1wYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiaXNQYXNzYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHJlYWxJc1Bhc3NhYmxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiaXNQYXNzYWJsZVwiLFskaM2PX2EgPT4gKHJlYWxJc1Bhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBJbXBvcnQgYGlzUGFzc2FibGVgIGRpcmVjdGx5IGZyb20gYEBlbmRvL3Bhc3Mtc3R5bGVgXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtzcGVjaW1lbiBpcyBQYXNzYWJsZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGUgPSBzcGVjaW1lbiA9PiByZWFsSXNQYXNzYWJsZShzcGVjaW1lbik7JGjNj19vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlIjpbImlzUGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbBWnPyIEAAAiBAAAJAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMva2V5cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYWdvcmljVmF0RGF0YUtleXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXlNYWtlcnN9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgKi9cbmNvbnN0IGtpbmQgPSBsYWJlbCA9PiBgJHtsYWJlbH1fa2luZEhhbmRsZWA7XG5cbi8qKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgKi9cbmNvbnN0IHNpbmdsZXRvbiA9IGxhYmVsID0+IGAke2xhYmVsfV9zaW5nbGV0b25gO1xuXG4vKipcbiAqIEtleU1ha2VycyBjb21wYXRpYmxlIHdpdGggYEBhZ29yaWMvdmF0LWRhdGFgLlxuICpcbiAqIEB0eXBlIHtLZXlNYWtlcnN9XG4gKi9cbiAgICAgICBjb25zdCBhZ29yaWNWYXREYXRhS2V5cyA9IHtcbiAgZXhvQ2xhc3M6IGxhYmVsID0+IGhhcmRlbihba2luZChsYWJlbCldKSxcbiAgZXhvQ2xhc3NLaXQ6IGxhYmVsID0+IGhhcmRlbihba2luZChsYWJlbCldKSxcbiAgZXhvOiBsYWJlbCA9PiBoYXJkZW4oW2tpbmQobGFiZWwpLCBzaW5nbGV0b24obGFiZWwpXSksXG4gIHN0b3JlOiBsYWJlbCA9PiBoYXJkZW4oW2xhYmVsXSksXG4gIHpvbmU6IGxhYmVsID0+IGhhcmRlbihbbGFiZWxdKSxcbn07JGjNj19vbmNlLmFnb3JpY1ZhdERhdGFLZXlzKGFnb3JpY1ZhdERhdGFLZXlzKTtcbmhhcmRlbihhZ29yaWNWYXREYXRhS2V5cyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhZ29yaWNWYXREYXRhS2V5cyI6WyJhZ29yaWNWYXREYXRhS2V5cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpG42q+g4AAPoOAAApAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9tYWtlLW9uY2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZU9uY2VLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAaW1wb3J0IHtTdG9yZXN9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7TWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqL1xuXG4vKiogQHBhcmFtIHtzdHJpbmd9IGxhYmVsICovXG5jb25zdCBkZWZhdWx0TGFiZWxUb0tleXMgPSBsYWJlbCA9PiBoYXJkZW4oW2xhYmVsXSk7XG5oYXJkZW4oZGVmYXVsdExhYmVsVG9LZXlzKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVidWdOYW1lIE9ubHkgdXNlZCBpbnRlcm5hbGx5IGZvciBkaWFnbm9zdGljcywgbm90IGF2YWlsYWJsZSB0byB1c2VyIGNvZGVcbiAqIEBwYXJhbSB7U3RvcmVzfSBzdG9yZXNcbiAqIEBwYXJhbSB7TWFwU3RvcmU8c3RyaW5nLCBhbnk+fSBbYmFja2luZ1N0b3JlXVxuICovXG4gICAgICAgY29uc3QgbWFrZU9uY2VLaXQgPSAoZGVidWdOYW1lLCBzdG9yZXMsIGJhY2tpbmdTdG9yZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAvKiBXZSBuZWVkIGEgZGV0YWNoZWQgc2V0U3RvcmUgc28gdGhhdCBpdCBpc24ndCBwZXJzaXN0ZWQgYXMgcGFydCBvZiB0aGUgem9uZS4qL1xuICAvKiBUaGF0IHdheSwgb3VyIHVzZWRLZXlzIGFyZSBvbmx5IHRyYWNrZWQgZm9yIHRoZSBjdXJyZW50IGluY2FybmF0aW9uLCB3aGljaCovXG4gIC8qIGlzIHdoYXQgd2Ugd2FudC4gIFVzaW5nIGBkZWJ1Z05hbWVgIGluIHRoZSBsYWJlbCBpcyBnb29kIGZvciBkaWFnbm9zdGljcywqL1xuICAvKiBhbmQgc2luY2UgaXQgaXMgb25seSBmb3IgYSBkZXRhY2hlZCBzdG9yZSwgaXQgc2hvdWxkIG5vdCBiZSB2aXNpYmxlIHRvIHRoZSovXG4gIC8qIGJhY2tpbmcgc3RvcmUuKi9cbiAgY29uc3QgdXNlZEtleXMgPSBzdG9yZXMuZGV0YWNoZWQoKS5zZXRTdG9yZShgJHtkZWJ1Z05hbWV9IHVzZWQga2V5c2ApO1xuXG4gIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICovXG4gIGNvbnN0IGFzc2VydE9ubHlPbmNlID0ga2V5ID0+IHtcbiAgICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCBGYWlsYGtleSAke2tleX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgIXVzZWRLZXlzLmhhcyhrZXkpIHx8XG4gICAgICBGYWlsYGtleSAke2tleX0gaGFzIGFscmVhZHkgYmVlbiB1c2VkIGluIHRoaXMgem9uZSBhbmQgaW5jYXJuYXRpb25gO1xuXG4gICAgLyogTWFyayB0aGlzIGtleSBhcyB1c2VkLiAgV2UgbWFrZSBubyBhdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBpbnZhbGlkIG1ha2VycyovXG4gICAgLyogb3IgYmFja2luZ1N0b3Jlcy4qL1xuICAgIHVzZWRLZXlzLmFkZChrZXkpO1xuICB9O1xuXG4gIC8qKlxuICogRW5zdXJlIHRoZSB3cmFwcGVkIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIG9uY2UgcGVyIGluY2FybmF0aW9uLiAgSXQgaXNcbiAqIGV4cGVjdGVkIHRvIHVwZGF0ZSB0aGUgYmFja2luZyBzdG9yZSBkaXJlY3RseS5cbiAqXG4gKiBAdGVtcGxhdGUgeyhrZXk6IHN0cmluZywgLi4ucmVzdDogYW55W10pID0+IGFueX0gVFxuICogQHBhcmFtIHtUfSBwcm92aWRlclxuICogQHBhcmFtIHsobGFiZWw6IHN0cmluZykgPT4gc3RyaW5nW119IFtsYWJlbFRvS2V5c11cbiAqIEByZXR1cm5zIHtUfVxuICovXG4gIGNvbnN0IHdyYXBQcm92aWRlciA9IChwcm92aWRlciwgbGFiZWxUb0tleXMgPSBkZWZhdWx0TGFiZWxUb0tleXMpID0+IHtcbiAgICAvKiogQHR5cGUgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBSZXR1cm5UeXBlPFQ+fSAqL1xuICAgIGNvbnN0IHdyYXBwZXIgPSAobGFiZWwsIC4uLnJlc3QpID0+IHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGxhYmVsVG9LZXlzKGxhYmVsKSkge1xuICAgICAgICBhc3NlcnRPbmx5T25jZShrZXkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3ZpZGVyKGxhYmVsLCAuLi5yZXN0KTtcbiAgICB9O1xuICAgIHJldHVybiAvKiogQHR5cGUge1R9ICovICh3cmFwcGVyKTtcbiAgfTtcblxuICAvKipcbiAqIFRoZSBiZXN0IHdheSB0byB1bmRlcnN0YW5kIHRoZSBwdXJwb3NlIG9mIGBtYWtlT25jZWAgaXMgdG8gZmlyc3QgdW5kZXJzdGFuZFxuICogd2hhdCBgbWFrZU9uY2VgIGRvZXMgb24gYSBkdXJhYmxlIHpvbmUuIFVzZWQgY29ycmVjdGx5LCBgbWFrZU9uY2VgIHNob3VsZCBvbmx5XG4gKiBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlIG9uIGFueSB6b25lLGtleSBwYWlyIGR1cmluZyBhbnkgdmF0IGluY2FybmF0aW9uLlxuICogR2l2ZW4gdGhhdCBjb25zdHJhaW50LCBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgdmFsdWUgYm91bmQgdG8gdGhhdFxuICogem9uZSxrZXkgcGFpciwgaXQgbXVzdCBoYXZlIGJlZW4gbGVmdCB0aGVyZSBieSBhIHByZXZpb3VzIGluY2FybmF0aW9uIGFuZFxuICogYG1ha2VPbmNlYCB3aWxsIHNpbXBseSByZXR1cm4gaXQuIElmIG5vdCwgdGhlbiBgbWFrZXIoa2V5KWAgaXMgY2FsbGVkIHRvXG4gKiBkZXRlcm1pbmUgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhhdCBzbG90LCB3aGljaCB3aWxsIG5vcm1hbGx5IGJlIHByZXNlcnZlZFxuICogYnkgc2ltaWxhciBjYWxscyB0byBgbWFrZU9uY2VgIGluIGZ1dHVyZSBpbmNhcm5hdGlvbnMgLS0tIHRob3VnaCB0aGF0IHdpbGwgYmVcbiAqIHVwIHRvIHRoZW0uXG4gKlxuICogQWxzbyBlbnN1cmVzIHRoZSBtYWtlciByZXR1cm5zIGEgc3RvcmFibGUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHN0cmluZyBuYW1lIG9mIHRoZSBab25lIHNsb3QgdG8gcHJvdmlkZS5cbiAqIEBwYXJhbSB7KGtleTogc3RyaW5nKSA9PiBWfSBtYWtlciBDYWxsZWQgdG8gY3JlYXRlIGEgZnJlc2ggdmFsdWUgdG8gZmlsbCBhbiBlbXB0eSBzbG90LlxuICogQHJldHVybnMge1Z9IFRoZSB2YWx1ZSBvZiB0aGUga2V5J3Mgc2xvdC5cbiAqL1xuICBjb25zdCBtYWtlT25jZSA9IChrZXksIG1ha2VyKSA9PiB7XG4gICAgYXNzZXJ0T25seU9uY2Uoa2V5KTtcbiAgICBpZiAoYmFja2luZ1N0b3JlICYmIGJhY2tpbmdTdG9yZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIGJhY2tpbmdTdG9yZS5nZXQoa2V5KTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWUgPSBtYWtlcihrZXkpO1xuICAgIHN0b3Jlcy5pc1N0b3JhYmxlKHZhbHVlKSB8fFxuICAgICAgRmFpbGBtYWtlciByZXR1cm4gdmFsdWUgJHt2YWx1ZX0gaXMgbm90IHN0b3JhYmxlYDtcbiAgICBiYWNraW5nU3RvcmUgJiYgYmFja2luZ1N0b3JlLmluaXQoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyBtYWtlT25jZSwgd3JhcFByb3ZpZGVyIH0pO1xufTskaM2PX29uY2UubWFrZU9uY2VLaXQobWFrZU9uY2VLaXQpO1xuaGFyZGVuKG1ha2VPbmNlS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VPbmNlS2l0IjpbIm1ha2VPbmNlS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAIBO5SAGgAAgBoAADIAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3ByZXBhcmUtYXR0ZW51YXRvci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyIsIkBlbmRvL3BhdHRlcm5zIiwiLi9oZWFwLmpzIl0sImV4cG9ydHMiOlsiYXR0ZW51YXRlT25lIiwicHJlcGFyZUF0dGVudWF0b3JNYWtlciIsIndyYXBwZXJNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLGZyb21VbmlxdWVFbnRyaWVzLE0sbWFrZUhlYXBab25lOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzXCIsIFtbXCJmcm9tVW5pcXVlRW50cmllc1wiLFskaM2PX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiLi9oZWFwLmpzXCIsIFtbXCJtYWtlSGVhcFpvbmVcIixbJGjNj19hID0+IChtYWtlSGVhcFpvbmUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01ldGhvZEd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKi9cblxuLyogVGhpcyBhdHRlbnVhdG9yIGltcGxlbWVudGF0aW9uIGlzIGp1c3QgYSBzaW1wbGlmaWNhdGlvbiBvZiB0aGUqL1xuLyogcmV2b2NhYmxlIGtpdCBpbXBsZW1lbnRhdGlvbiBpbiBwcmVwYXJlLXJldm9jYWJsZS5qcy4gVGhlIHJldm9jYWJsZSBraXQqL1xuLyogcHJvdmlkZXMgYm90aCBhdHRlbnVhdGlvbiBhbmQgcmV2b2NhdGlvbiwgc2luY2Ugd2UgY2FuIGhhdmUgYm90aCBmb3IgdGhlKi9cbi8qIHByaWNlIG9mIGp1c3Qgb25lIGxldmVsIG9mIGluZGlyZWN0aW9uLiBCdXQgaWYgeW91IGRvbid0IG5lZWQgcmV2b2NhdGlvbiwqL1xuLyogdGhlIHJldm9jYWJsZSBraXQgaGFzIG1vcmUgQVBJIGNvbXBsZXhpdHkgdGhhbiB5b3UgbmVlZC4qL1xuLyoqL1xuLyogV2UgY291bGQgaGF2ZSBidWlsdCBgcHJlcGFyZUF0dGVudWF0b3JNYWtlcmAgYXMgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kKi9cbi8qIGBwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXRgLiBCdXQgdGhlbiB3ZSdkIGhhdmUgdGhlIHdlaXJkIGFydGlmYWN0IHRoYXQgdGhlKi9cbi8qIGBleHRyYU1ldGhvZHNgIHdvdWxkIHNlZSBhIGB7IHN0YXRlLCBmYWNldHM6IHsgcmV2b2NhYmxlLCByZXZva2VyIH19YCBjb250ZXh0Ki9cbi8qIHJhdGhlciB0aGFuIGEgYHsgc3RhdGUsIHNlbGYgfWAgY29udGV4dC4gU28gaW5zdGVhZCwgd2UgY29waWVkIGFuZCBlZGl0ZWQgaXQqL1xuLyogZG93bi4gUGxlYXNlIGNvLW1haW50YWluIHRoZXNlIHR3byBtb2R1bGVzLiovXG5cbi8qIEJlY2F1c2UgdGhlIGF0dGVudWF0b3IganVzdCB1c2VzIGFuIGV4byBjbGFzcyByYXRoZXIgdGhhbiBhIGNsYXNzIGtpdCwqL1xuLyogaXQgY2Fubm90IHN1cHBvcnQgdGhlIHByaXZpbGVnZSBzZXBhcmF0aW9uIG9mIGEgZGlzdGluY3QgcmV2b2tlciBmYWNldC4qL1xuLyogQnV0IGl0IGNhbiBzdGlsbCBzdXBwb3J0IGBzZWxmUmV2b2tlYCBhcyBhIHNlcGFyYXRlIGBleHRyYU1ldGhvZGAsIGFzIHNob3duKi9cbi8qIGluIGEgdGVzdGNhc2UgYXQgYHByZXBhcmUtYXR0ZW51YXRvci50ZXN0LmpzYCovXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHdyYXBwZXJLaW5kTmFtZVxuICogQHBhcmFtIHtQcm9wZXJ0eUtleVtdfSB1TWV0aG9kTmFtZXNcbiAqIEBwYXJhbSB7UmVjb3JkPFByb3BlcnR5S2V5LCAoLi4uYXJnczogYW55W10pID0+IGFueT59IFtleHRyYU1ldGhvZHNdXG4gKi9cbiAgICAgICBjb25zdCB3cmFwcGVyTWV0aG9kcyA9IChcbiAgd3JhcHBlcktpbmROYW1lLFxuICB1TWV0aG9kTmFtZXMsXG4gIGV4dHJhTWV0aG9kcyA9IHt9LFxuKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmZyb21VbmlxdWVFbnRyaWVzKFxuICAgICAgdU1ldGhvZE5hbWVzLm1hcChuYW1lID0+IFtcbiAgICAgICAgbmFtZSxcbiAgICAgICAge1xuICAgICAgICAgIC8qIFVzZSBjb25jaXNlIG1ldGhvZCBzeW50YXggZm9yIGV4byBtZXRob2RzKi9cbiAgICAgICAgICBbbmFtZV0oLi4uYXJncykge1xuICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3JtYWwgZXhvLXRoaXMgdHlwaW5nIGNvbmZ1c2lvbiovXG4gICAgICAgICAgICBjb25zdCB7IHVuZGVybHlpbmcgfSA9IHRoaXMuc3RhdGU7XG5cbiAgICAgICAgICAgIC8qIEJlY2F1c2UgYXR0ZW51YXRvcnMgc3RpbGwgc3VwcG9ydCBzb21lb25lIGFkZGluZyBgc2VsZlJldm9rZWAqL1xuICAgICAgICAgICAgLyogYXMgYW4gYGV4dHJhTWV0aG9kYCwgdGhpcyB0ZXN0IGlzIHN0aWxsIHVzZWZ1bC4gU2VlIHRoZSovXG4gICAgICAgICAgICAvKiB0ZXN0Y2FzZSBpbiBgcHJlcGFyZS1hdHRlbnVhdG9yLnRlc3QuanNgLiovXG4gICAgICAgICAgICB1bmRlcmx5aW5nICE9PSB1bmRlZmluZWQgfHwgRmFpbGAke3Eod3JhcHBlcktpbmROYW1lKX0gcmV2b2tlZGA7XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlcmx5aW5nW25hbWVdKC4uLmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIHVzaW5nIHBvc3NpYmxlIHN5bWJvbCBhcyBpbmRleCB0eXBlKi9cbiAgICAgICAgfVtuYW1lXSxcbiAgICAgIF0pLFxuICAgICksXG4gICAgLi4uZXh0cmFNZXRob2RzLFxuICB9KTskaM2PX29uY2Uud3JhcHBlck1ldGhvZHMod3JhcHBlck1ldGhvZHMpO1xuaGFyZGVuKHdyYXBwZXJNZXRob2RzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQGNhbGxiYWNrIE1ha2VBdHRlbnVhdG9yXG4gKiBAcGFyYW0ge1V9IHVuZGVybHlpbmdcbiAqIEByZXR1cm5zIHtQYXJ0aWFsPFU+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEF0dGVudWF0b3JUaGlzXG4gKiBAcHJvcGVydHkge1BhcnRpYWw8VT59IHNlbGZcbiAqIEBwcm9wZXJ0eSB7eyB1bmRlcmx5aW5nOiBVIH19IHN0YXRlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gQXR0ZW51YXRvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdUludGVyZmFjZU5hbWVdXG4gKiAgIFRoZSBgaW50ZXJmYWNlTmFtZWAgb2YgdGhlIHVuZGVybHlpbmcgaW50ZXJmYWNlIGd1YXJkLlxuICogICBEZWZhdWx0cyB0byB0aGUgYHVLaW5kTmFtZWAuXG4gKiBAcHJvcGVydHkge1JlY29yZDxcbiAqICAgUHJvcGVydHlLZXksXG4gKiAgIE1ldGhvZEd1YXJkXG4gKiA+fSBbZXh0cmFNZXRob2RHdWFyZHNdXG4gKiBGb3IgZ3VhcmRpbmcgdGhlIGBleHRyYU1ldGhvZHNgLCBpZiB5b3UgaW5jbHVkZSB0aGVtIGJlbG93LiBUaGVzZSBhcHBlYXJcbiAqIG9ubHkgb24gdGhlIHN5bnRoZXNpemVkIGludGVyZmFjZSBndWFyZCBmb3IgdGhlIGF0dGVudWF0b3IsIGFuZFxuICogZG8gbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gYW55IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPFxuICogICBQcm9wZXJ0eUtleSxcbiAqICAgKHRoaXM6IEF0dGVudWF0b3JUaGlzPFU+LCAuLi5hcmdzOiBhbnlbXSkgPT4gYW55XG4gKiA+fSBbZXh0cmFNZXRob2RzXVxuICogRXh0cmEgbWV0aG9kcyBhZGRpbmcgYmVoYXZpb3Igb25seSB0byB0aGUgYXR0ZW51YXRvciwgYW5kXG4gKiBkbyBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBhbnkgbWV0aG9kcyBvZiB0aGUgdW5kZXJseWluZy5cbiAqL1xuXG4vKipcbiAqIE1ha2UgYW4gZXhvIGNsYXNzIGZvciB3cmFwcGluZyBhbiB1bmRlcmx5aW5nIGV4byBjbGFzcyxcbiAqIHdoZXJlIHRoZSB3cmFwcGVyIGlzIGFuIGF0dGVudWF0b3Igb2YgdGhlIHVuZGVybHlpbmcuXG4gKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEBwYXJhbSB7Wm9uZX0gem9uZVxuICogQHBhcmFtIHtzdHJpbmd9IHVLaW5kTmFtZVxuICogICBUaGUgYGtpbmROYW1lYCBvZiB0aGUgdW5kZXJseWluZyBleG8gY2xhc3NcbiAqIEBwYXJhbSB7KGtleW9mIFUpW119IHVNZXRob2ROYW1lc1xuICogICBUaGUgbWV0aG9kIG5hbWVzIG9mIHRoZSB1bmRlcmx5aW5nIGV4byBjbGFzcyB0aGF0IHNob3VsZCBiZSByZXByZXNlbnRlZFxuICogICBieSB0cmFuc3BhcmVudGx5LWZvcndhcmRpbmcgbWV0aG9kcyBvZiB0aGUgYXR0ZW51YXRvci5cbiAqIEBwYXJhbSB7QXR0ZW51YXRvck9wdGlvbnM8VT59IFtvcHRpb25zXVxuICogQHJldHVybnMge01ha2VBdHRlbnVhdG9yfVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUF0dGVudWF0b3JNYWtlciA9IChcbiAgem9uZSxcbiAgdUtpbmROYW1lLFxuICB1TWV0aG9kTmFtZXMsXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBjb25zdCB7XG4gICAgdUludGVyZmFjZU5hbWUgPSB1S2luZE5hbWUsXG4gICAgZXh0cmFNZXRob2RHdWFyZHMgPSB7fSxcbiAgICBleHRyYU1ldGhvZHMgPSB7fSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IEF0dGVudWF0b3JJID0gTS5pbnRlcmZhY2UoXG4gICAgYCR7dUludGVyZmFjZU5hbWV9X2F0dGVudWF0b3JgLFxuICAgIGV4dHJhTWV0aG9kR3VhcmRzLFxuICAgIHsgZGVmYXVsdEd1YXJkczogJ3JhdycgfSxcbiAgKTtcblxuICBjb25zdCBhdHRlbnVhdG9yS2luZE5hbWUgPSBgJHt1S2luZE5hbWV9X2F0dGVudWF0b3JgO1xuXG4gIHJldHVybiB6b25lLmV4b0NsYXNzKFxuICAgIGF0dGVudWF0b3JLaW5kTmFtZSxcbiAgICBBdHRlbnVhdG9ySSxcbiAgICB1bmRlcmx5aW5nID0+ICh7IHVuZGVybHlpbmcgfSksXG4gICAgd3JhcHBlck1ldGhvZHMoYXR0ZW51YXRvcktpbmROYW1lLCB1TWV0aG9kTmFtZXMsIGV4dHJhTWV0aG9kcyksXG4gICAge1xuICAgICAgc3RhdGVTaGFwZTogeyB1bmRlcmx5aW5nOiBNLm9wdChNLnJlbW90YWJsZSgndW5kZXJseWluZycpKSB9LFxuICAgIH0sXG4gICk7XG59OyRozY9fb25jZS5wcmVwYXJlQXR0ZW51YXRvck1ha2VyKHByZXBhcmVBdHRlbnVhdG9yTWFrZXIpO1xuaGFyZGVuKHByZXBhcmVBdHRlbnVhdG9yTWFrZXIpO1xuXG4vKiBjZi4gaHR0cHM6Ly9lbmRvanMuZ2l0aHViLmlvL2VuZG8vZnVuY3Rpb25zL19lbmRvX3Bhc3Nfc3R5bGUuUmVtb3RhYmxlLmh0bWwqL1xuY29uc3QgUmVtb3RhYmxlUHJlZml4UkUgPSAvXihBbGxlZ2VkOiB8RGVidWdOYW1lOiApLztcblxuLyoqXG4gKiBBIGNvbnZlbmllbmNlIGFib3ZlIGBwcmVwYXJlQXR0ZW51YXRvck1ha2VyYCBmb3IgZG9pbmcgYSBzaW5nbGV0b25cbiAqIGVwaGVtZXJhbCBhdHRlbnVhdG9yLCBpLmUuLCBhIG5ldyBhdHRlbnVhdG9yIGluc3RhbmNlIChhbmQgaGlkZGVuIGNsYXNzKVxuICogdGhhdCBpcyBhbGxvY2F0ZWQgaW4gdGhlIGhlYXAgem9uZSwgYW5kIHRoZXJlZm9yZSBlcGhlbWVyYWwuIFRoZSB1bmRlcmx5aW5nXG4gKiBjYW4gYmUgZHVyYWJsZSBvciBub3QsIHdpdGggbm8gY29uZmxpY3Qgd2l0aCB0aGUgYXR0ZW51YXRvciBiZWluZ1xuICogZXBoZW1lcmFsLiBUaGUgcHJpY2Ugb2YgdGhpcyBjb252ZW5pZW5jZSBpcyB0aGUgYWxsb2NhdGlvbiBvZiB0aGUgaGlkZGVuXG4gKiBjbGFzcyBhbmQgd3JhcHBlciBtZXRob2RzIHBlciBgYXR0ZW51YXRlT25lYCBjYWxsLCBpLmUuLCBwZXIgYXR0ZW51YXRvclxuICogaW5zdGFuY2UuXG4gKlxuICogQHRlbXBsYXRlIHthbnl9IFVcbiAqIEBwYXJhbSB7VX0gdW5kZXJseWluZ1xuICogQHBhcmFtIHsoa2V5b2YgVSlbXX0gdU1ldGhvZE5hbWVzXG4gKiBAcGFyYW0ge0F0dGVudWF0b3JPcHRpb25zPFU+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtQYXJ0aWFsPFU+fVxuICovXG4gICAgICAgY29uc3QgYXR0ZW51YXRlT25lID0gKHVuZGVybHlpbmcsIHVNZXRob2ROYW1lcywgb3B0aW9ucyA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBoZWFwWm9uZSA9IG1ha2VIZWFwWm9uZSgpO1xuICBjb25zdCB1S2luZE5hbWUgPSAodW5kZXJseWluZ1tTeW1ib2wudG9TdHJpbmdUYWddIHx8ICdVbmRlcmx5aW5nJykucmVwbGFjZShcbiAgICBSZW1vdGFibGVQcmVmaXhSRSxcbiAgICAnJyxcbiAgKTtcbiAgY29uc3QgbWFrZUF0dGVudWF0b3IgPSBwcmVwYXJlQXR0ZW51YXRvck1ha2VyKFxuICAgIGhlYXBab25lLFxuICAgIHVLaW5kTmFtZSxcbiAgICB1TWV0aG9kTmFtZXMsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgcmV0dXJuIG1ha2VBdHRlbnVhdG9yKHVuZGVybHlpbmcpO1xufTskaM2PX29uY2UuYXR0ZW51YXRlT25lKGF0dGVudWF0ZU9uZSk7XG5oYXJkZW4oYXR0ZW51YXRlT25lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndyYXBwZXJNZXRob2RzIjpbIndyYXBwZXJNZXRob2RzIl0sInByZXBhcmVBdHRlbnVhdG9yTWFrZXIiOlsicHJlcGFyZUF0dGVudWF0b3JNYWtlciJdLCJhdHRlbnVhdGVPbmUiOlsiYXR0ZW51YXRlT25lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB3bPYhyFAAAchQAADEAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIiwiLi9wcmVwYXJlLWF0dGVudWF0b3IuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNLHdyYXBwZXJNZXRob2RzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiLi9wcmVwYXJlLWF0dGVudWF0b3IuanNcIiwgW1tcIndyYXBwZXJNZXRob2RzXCIsWyRozY9fYSA9PiAod3JhcHBlck1ldGhvZHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qKlxuICogQGltcG9ydCB7QW1wbGlmeX0gZnJvbSAnQGVuZG8vZXhvJztcbiAqIEBpbXBvcnQge01ldGhvZEd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL2Jhc2Utem9uZSc7XG4gKi9cblxuLyogVGhpcyByZXZvY2FibGUga2l0IGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGZvciBib3RoIGF0dGVudWF0aW9uIGFuZCovXG4vKiByZXZvY2F0aW9uLCBzaW5jZSBib3RoIGNhbiBiZSBwcm92aWRlZCBhdCB0aGUgY29zdCBvZiBvbmUgbGV2ZWwgb2YqL1xuLyogaW5kaXJlY3Rpb24uIEJ1dCBpZiB5b3UganVzdCBuZWVkIGF0dGVudWF0aW9uIHdpdGhvdXQgcmV2b2NhdGlvbiwgYmV0dGVyIHRvKi9cbi8qIHVzZSB0aGUgYXR0ZW51YXRvciBpbXBsZW1lbnRhdGlvbiBpbiBwcmVwYXJlLWF0dGVudWF0b3IuanMuKi9cbi8qIFBsZWFzZSBjby1tYWludGFpbiB0aGVzZSB0d28gbW9kdWxlcy4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAY2FsbGJhY2sgTWFrZVJldm9jYWJsZVxuICogQHBhcmFtIHtVfSB1bmRlcmx5aW5nXG4gKiBAcmV0dXJucyB7UGFydGlhbDxVPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAY2FsbGJhY2sgTWFrZVJldm9jYWJsZUtpdFxuICogQHBhcmFtIHtVfSB1bmRlcmx5aW5nXG4gKiBAcmV0dXJucyB7UmV2b2NhYmxlS2l0PFU+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJldm9jYWJsZU1ha2VyS2l0XG4gKiBAcHJvcGVydHkgeyhyZXZvY2FibGU6IFUpID0+IGJvb2xlYW59IHJldm9rZVxuICogQHByb3BlcnR5IHtNYWtlUmV2b2NhYmxlPFU+fSBtYWtlUmV2b2NhYmxlXG4gKiAgIEZvcndhcmRzIHRvIHRoZSB1bmRlcmx5aW5nIGV4byBvYmplY3QsIHVudGlsIHJldm9rZWRcbiAqIEBwcm9wZXJ0eSB7TWFrZVJldm9jYWJsZUtpdDxVPn0gbWFrZVJldm9jYWJsZUtpdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmV2b2tlckZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IHJldm9rZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJldm9jYWJsZUtpdFxuICogQHByb3BlcnR5IHtSZXZva2VyRmFjZXR9IHJldm9rZXJcbiAqIEBwcm9wZXJ0eSB7UGFydGlhbDxVPn0gcmV2b2NhYmxlXG4gKiAgIEZvcndhcmRzIHRvIHRoZSB1bmRlcmx5aW5nIGV4byBvYmplY3QsIHVudGlsIHJldm9rZWRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZXZvY2FibGVLaXRUaGlzXG4gKiBAcHJvcGVydHkge1Jldm9jYWJsZUtpdDxVPn0gZmFjZXRzXG4gKiBAcHJvcGVydHkge3sgdW5kZXJseWluZzogVSB9fSBzdGF0ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJldm9jYWJsZUtpdE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdUludGVyZmFjZU5hbWVdXG4gKiAgIFRoZSBgaW50ZXJmYWNlTmFtZWAgb2YgdGhlIHVuZGVybHlpbmcgaW50ZXJmYWNlIGd1YXJkLlxuICogICBEZWZhdWx0cyB0byB0aGUgYHVLaW5kTmFtZWAuXG4gKiBAcHJvcGVydHkge1JlY29yZDxcbiAqICAgUHJvcGVydHlLZXksXG4gKiAgIE1ldGhvZEd1YXJkXG4gKiA+fSBbZXh0cmFNZXRob2RHdWFyZHNdXG4gKiBGb3IgZ3VhcmRpbmcgdGhlIGBleHRyYU1ldGhvZHNgLCBpZiB5b3UgaW5jbHVkZSB0aGVtIGJlbG93LiBUaGVzZSBhcHBlYXJcbiAqIG9ubHkgb24gdGhlIHN5bnRoZXNpemVkIGludGVyZmFjZSBndWFyZCBmb3IgdGhlIHJldm9jYWJsZSBjYXJldGFrZXIsIGFuZFxuICogZG8gbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gYW55IG1ldGhvZCBvZiB0aGUgdW5kZXJseWluZy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPFxuICogICBQcm9wZXJ0eUtleSxcbiAqICAgKHRoaXM6IFJldm9jYWJsZUtpdFRoaXM8VT4sIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAqID59IFtleHRyYU1ldGhvZHNdXG4gKiBFeHRyYSBtZXRob2RzIGFkZGluZyBiZWhhdmlvciBvbmx5IHRvIHRoZSByZXZvY2FibGUgY2FyZXRha2VyLCBhbmRcbiAqIGRvIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGFueSBtZXRob2RzIG9mIHRoZSB1bmRlcmx5aW5nLlxuICovXG5cbi8qKlxuICogTWFrZSBhbiBleG8gY2xhc3Mga2l0IGZvciB3cmFwcGluZyBhbiB1bmRlcmx5aW5nIGV4byBjbGFzcyxcbiAqIHdoZXJlIHRoZSB3cmFwcGVyIGlzIGEgcmV2b2NhYmxlIGZvcndhcmRlci5cbiAqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQHBhcmFtIHtab25lfSB6b25lXG4gKiBAcGFyYW0ge3N0cmluZ30gdUtpbmROYW1lXG4gKiAgIFRoZSBga2luZE5hbWVgIG9mIHRoZSB1bmRlcmx5aW5nIGV4byBjbGFzc1xuICogQHBhcmFtIHtQcm9wZXJ0eUtleVtdfSB1TWV0aG9kTmFtZXNcbiAqICAgVGhlIG1ldGhvZCBuYW1lcyBvZiB0aGUgdW5kZXJseWluZyBleG8gY2xhc3MgdGhhdCBzaG91bGQgYmUgcmVwcmVzZW50ZWRcbiAqICAgYnkgdHJhbnNwYXJlbnRseS1mb3J3YXJkaW5nIG1ldGhvZHMgb2YgdGhlIHJldm9jYWJsZSBjYXJldGFrZXIuXG4gKiBAcGFyYW0ge1Jldm9jYWJsZUtpdE9wdGlvbnM8VT59IFtvcHRpb25zXVxuICogQHJldHVybnMge1Jldm9jYWJsZU1ha2VyS2l0PFU+fVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0ID0gKFxuICB6b25lLFxuICB1S2luZE5hbWUsXG4gIHVNZXRob2ROYW1lcyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICB1SW50ZXJmYWNlTmFtZSA9IHVLaW5kTmFtZSxcbiAgICBleHRyYU1ldGhvZEd1YXJkcyA9IHt9LFxuICAgIGV4dHJhTWV0aG9kcyA9IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgUmV2b2NhYmxlSUtpdCA9IGhhcmRlbih7XG4gICAgcmV2b2tlcjogTS5pbnRlcmZhY2UoYCR7dUludGVyZmFjZU5hbWV9X3Jldm9rZXJgLCB7XG4gICAgICByZXZva2U6IE0uY2FsbCgpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICAgIH0pLFxuICAgIHJldm9jYWJsZTogTS5pbnRlcmZhY2UoYCR7dUludGVyZmFjZU5hbWV9X3Jldm9jYWJsZWAsIGV4dHJhTWV0aG9kR3VhcmRzLCB7XG4gICAgICBkZWZhdWx0R3VhcmRzOiAncmF3JyxcbiAgICB9KSxcbiAgfSk7XG5cbiAgY29uc3QgcmV2b2NhYmxlS2luZE5hbWUgPSBgJHt1S2luZE5hbWV9X2NhcmV0YWtlcmA7XG5cbiAgLyoqIEB0eXBlIHtBbXBsaWZ5PGFueT59ICovXG4gIGxldCBhbXBsaWZpZXI7XG5cbiAgY29uc3QgbWFrZVJldm9jYWJsZUtpdCA9IHpvbmUuZXhvQ2xhc3NLaXQoXG4gICAgcmV2b2NhYmxlS2luZE5hbWUsXG4gICAgUmV2b2NhYmxlSUtpdCxcbiAgICB1bmRlcmx5aW5nID0+ICh7IHVuZGVybHlpbmcgfSksXG4gICAge1xuICAgICAgcmV2b2tlcjoge1xuICAgICAgICByZXZva2UoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBpZiAoc3RhdGUudW5kZXJseWluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLnVuZGVybHlpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmV2b2NhYmxlOiB3cmFwcGVyTWV0aG9kcyhyZXZvY2FibGVLaW5kTmFtZSwgdU1ldGhvZE5hbWVzLCBleHRyYU1ldGhvZHMpLFxuICAgIH0sXG4gICAge1xuICAgICAgc3RhdGVTaGFwZTogeyB1bmRlcmx5aW5nOiBNLm9wdChNLnJlbW90YWJsZSgndW5kZXJseWluZycpKSB9LFxuICAgICAgcmVjZWl2ZUFtcGxpZmllcjogYW1wID0+IHtcbiAgICAgICAgYW1wbGlmaWVyID0gYW1wO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIC8qKlxuICogQHR5cGUge01ha2VSZXZvY2FibGV9XG4gKi9cbiAgY29uc3QgbWFrZVJldm9jYWJsZSA9IHVuZGVybHlpbmcgPT4gbWFrZVJldm9jYWJsZUtpdCh1bmRlcmx5aW5nKS5yZXZvY2FibGU7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1V9IHJldm9jYWJsZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgcmV2b2tlID0gcmV2b2NhYmxlID0+IHtcbiAgICAvKiogQHR5cGUge1Jldm9jYWJsZUtpdDxVPn0gKi9cbiAgICBjb25zdCBmYWNldHMgPSBhbXBsaWZpZXIocmV2b2NhYmxlKTtcbiAgICBpZiAoZmFjZXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhY2V0cy5yZXZva2VyLnJldm9rZSgpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHJldm9rZSxcbiAgICBtYWtlUmV2b2NhYmxlLFxuICAgIC8qKiBAdHlwZSB7TWFrZVJldm9jYWJsZUtpdH0gKi9cbiAgICBtYWtlUmV2b2NhYmxlS2l0LFxuICB9KTtcbn07JGjNj19vbmNlLnByZXBhcmVSZXZvY2FibGVNYWtlcktpdChwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQpO1xuaGFyZGVuKHByZXBhcmVSZXZvY2FibGVNYWtlcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQiOlsicHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGC/2hirDQAAqw0AAC0AAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3dhdGNoLXByb21pc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGF0dGVybnMiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiLCJQcm9taXNlV2F0Y2hlckhhbmRsZXIiLCJQcm9taXNlV2F0Y2hlckkiLCJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTSxFOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vKipcbiAqIEEgUHJvbWlzZVdhdGNoZXIgbWV0aG9kIGd1YXJkIGNhbGxhYmxlIHdpdGggb3IgbW9yZSBhcmd1bWVudHMsIHJldHVybmluZyB2b2lkLlxuICovXG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJIYW5kbGVyID0gTS5jYWxsKE0ucmF3KCkpLnJlc3QoTS5yYXcoKSkucmV0dXJucygpO1xuXG4vKipcbiAqIEEgUHJvbWlzZVdhdGNoZXIgaW50ZXJmYWNlIHRoYXQgaGFzIGJvdGggb25GdWxmaWxsZWQgYW5kIG9uUmVqZWN0ZWQgaGFuZGxlcnMuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJIYW5kbGVyKFByb21pc2VXYXRjaGVySGFuZGxlcik7XG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJJID0gTS5pbnRlcmZhY2UoJ1Byb21pc2VXYXRjaGVyJywge1xuICBvbkZ1bGZpbGxlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxuICBvblJlamVjdGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXIsXG59KTtcblxuLyoqXG4gKiBBIFByb21pc2VXYXRjaGVyIGludGVyZmFjZSB0aGF0IGhhcyBvbmx5IGFuIG9uRnVsZmlsbGVkIGhhbmRsZXIuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJJKFByb21pc2VXYXRjaGVySSk7XG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJID0gTS5pbnRlcmZhY2UoJ1Byb21pc2VXYXRjaGVyRnVsZmlsbGVkJywge1xuICBvbkZ1bGZpbGxlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxufSk7XG5cbi8qKlxuICogQSBQcm9taXNlV2F0Y2hlciBpbnRlcmZhY2UgdGhhdCBoYXMgb25seSBhbiBvblJlamVjdGVkIGhhbmRsZXIuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJKFByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSk7XG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkgPSBNLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXJSZWplY3RlZCcsIHtcbiAgb25SZWplY3RlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxufSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJvbWlzZVdhdGNoZXJcbiAqIEBwcm9wZXJ0eSB7KGZ1bGZpbG1lbnQ6IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZH0gW29uRnVsZmlsbGVkXVxuICogQHByb3BlcnR5IHsocmVhc29uOiB1bmtub3duLCAuLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWR9IFtvblJlamVjdGVkXVxuICovXG5cbi8qKlxuICogQWRhcHQgYSBwcm9taXNlIHdhdGNoZXIgbWV0aG9kIHRvIEUud2hlbi5cbiAqIEBwYXJhbSB7UmVjb3JkPFByb3BlcnR5S2V5LCAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duPn0gdGhhdFxuICogQHBhcmFtIHtQcm9wZXJ0eUtleX0gcHJvcFxuICogQHBhcmFtIHt1bmtub3duW119IHBvc3RBcmdzXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkoUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkpO1xuY29uc3QgY2FsbE1lTWF5YmUgPSAodGhhdCwgcHJvcCwgcG9zdEFyZ3MpID0+IHtcbiAgY29uc3QgZm4gPSB0aGF0W3Byb3BdO1xuICBpZiAoIWZuKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBhc3NlcnQudHlwZW9mKGZuLCAnZnVuY3Rpb24nKTtcbiAgLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFyZyB2YWx1ZSBvciByZWFzb25cbiAqL1xuICBjb25zdCB3cmFwcGVkID0gYXJnID0+IHtcbiAgICAvKiBEb24ndCByZXR1cm4gYSB2YWx1ZSwgdG8gcHJldmVudCBFLndoZW4gZnJvbSBzdWJzY3JpYmluZyB0byBhIHJlc3VsdGluZyovXG4gICAgLyogcHJvbWlzZS4qL1xuICAgIGFwcGx5KGZuLCB0aGF0LCBbYXJnLCAuLi5wb3N0QXJnc10pO1xuICB9O1xuICByZXR1cm4gd3JhcHBlZDtcbn07XG5cbi8qKlxuICogU2hpbSB0aGUgcHJvbWlzZSB3YXRjaGVyIGJlaGF2aW91ciB3aGVuIFZhdERhdGEud2F0Y2hQcm9taXNlIGlzIG5vdCBhdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtQcm9taXNlPGFueT59IHBcbiAqIEBwYXJhbSB7UHJvbWlzZVdhdGNoZXJ9IHdhdGNoZXJcbiAqIEBwYXJhbSB7Li4udW5rbm93bn0gd2F0Y2hlckFyZ3NcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gICAgICAgY29uc3Qgd2F0Y2hQcm9taXNlID0gKHAsIHdhdGNoZXIsIC4uLndhdGNoZXJBcmdzKSA9PiB7XG4gIFByb21pc2UucmVzb2x2ZShwKSA9PT0gcCB8fCBGYWlsYHdhdGNoUHJvbWlzZSBvbmx5IHdhdGNoZXMgcHJvbWlzZXNgO1xuICBjb25zdCBvbkZ1bGZpbGxlZCA9IGNhbGxNZU1heWJlKHdhdGNoZXIsICdvbkZ1bGZpbGxlZCcsIHdhdGNoZXJBcmdzKTtcbiAgY29uc3Qgb25SZWplY3RlZCA9IGNhbGxNZU1heWJlKHdhdGNoZXIsICdvblJlamVjdGVkJywgd2F0Y2hlckFyZ3MpO1xuICBvbkZ1bGZpbGxlZCB8fFxuICAgIG9uUmVqZWN0ZWQgfHxcbiAgICBGYWlsYHByb21pc2Ugd2F0Y2hlciBtdXN0IGltcGxlbWVudCBhdCBsZWFzdCBvbmUgaGFuZGxlciBtZXRob2RgO1xuICB2b2lkIEUud2hlbihwLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG59OyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTtcbmhhcmRlbih3YXRjaFByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHJvbWlzZVdhdGNoZXJIYW5kbGVyIjpbIlByb21pc2VXYXRjaGVySGFuZGxlciJdLCJQcm9taXNlV2F0Y2hlckkiOlsiUHJvbWlzZVdhdGNoZXJJIl0sIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSI6WyJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiXSwiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiOlsiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABsJLBqFgIAABYCAAAoAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3pvbmUtaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcmVwYXJlLXJldm9jYWJsZS5qcyIsIi4vc3JjL3ByZXBhcmUtYXR0ZW51YXRvci5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL3ByZXBhcmUtYXR0ZW51YXRvci5qcyIsIi4vc3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9wcmVwYXJlLWF0dGVudWF0b3IuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4YOdgOc8AADnPAAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbCxwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVtb3RhYmxlID0gJGjNj19hKV1dLFtcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1wiLCBbW1wibmF0TWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChuYXRNYXRoSGVscGVycyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcInNldE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoc2V0TWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoY29weVNldE1hdGhIZWxwZXJzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlCYWdNYXRoSGVscGVyc1wiLFskaM2PX2EgPT4gKGNvcHlCYWdNYXRoSGVscGVycyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDb3B5QmFnLCBDb3B5U2V0fSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtBbW91bnQsIEFtb3VudFZhbHVlLCBBc3NldFZhbHVlRm9yS2luZCwgQnJhbmQsIENvcHlCYWdBbW91bnQsIENvcHlTZXRBbW91bnQsIE1hdGhIZWxwZXJzLCBOYXRBbW91bnQsIE5hdFZhbHVlLCBTZXRBbW91bnQsIFNldFZhbHVlfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKiBOQjogQXNzZXRLaW5kIGlzIGJvdGggYSBjb25zdGFudCBmb3IgZW51bWVyYXRlZCB2YWx1ZXMgYW5kIGEgdHlwZSBmb3IgdGhvc2UgdmFsdWVzLiovXG4vKipcbiAqIENvbnN0YW50cyBmb3IgdGhlIGtpbmRzIG9mIGFzc2V0cyB3ZSBzdXBwb3J0LlxuICpcbiAqIEBlbnVtIHsodHlwZW9mIEFzc2V0S2luZClba2V5b2YgdHlwZW9mIEFzc2V0S2luZF19XG4gKi9cbiAgICAgICBjb25zdCBBc3NldEtpbmQgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBOQVQ6ICduYXQnLFxuICBTRVQ6ICdzZXQnLFxuICBDT1BZX1NFVDogJ2NvcHlTZXQnLFxuICBDT1BZX0JBRzogJ2NvcHlCYWcnLFxufSk7JGjNj19vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuaGFyZGVuKEFzc2V0S2luZCk7XG5jb25zdCBhc3NldEtpbmROYW1lcyA9IGhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyoqIEBwYXJhbSB7QXNzZXRLaW5kfSBhbGxlZ2VkQUsgKi9cbiAgICAgICBjb25zdCBhc3NlcnRBc3NldEtpbmQgPSBhbGxlZ2VkQUsgPT4ge1xuICBhc3NldEtpbmROYW1lcy5pbmNsdWRlcyhhbGxlZ2VkQUspIHx8XG4gICAgRmFpbGBUaGUgYXNzZXRLaW5kICR7YWxsZWdlZEFLfSBtdXN0IGJlIG9uZSBvZiAke3EoYXNzZXRLaW5kTmFtZXMpfWA7XG59OyRozY9fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKipcbiAqIEFtb3VudHMgZGVzY3JpYmUgZGlnaXRhbCBhc3NldHMuIEZyb20gYW4gYW1vdW50LCB5b3UgY2FuIGxlYXJuIHRoZSBicmFuZCBvZlxuICogZGlnaXRhbCBhc3NldCBhcyB3ZWxsIGFzIFwiaG93IG11Y2hcIiBvciBcImhvdyBtYW55XCIuIEFtb3VudHMgaGF2ZSB0d28gcGFydHM6IGFcbiAqIGJyYW5kIChsb29zZWx5IHNwZWFraW5nLCB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0KSBhbmQgdGhlIHZhbHVlICh0aGUgYW5zd2VyXG4gKiB0byBcImhvdyBtdWNoXCIpLiBGb3IgZXhhbXBsZSwgaW4gdGhlIHBocmFzZSBcIjUgYnVja3NcIiwgXCJidWNrc1wiIHRha2VzIHRoZSByb2xlXG4gKiBvZiB0aGUgYnJhbmQgYW5kIHRoZSB2YWx1ZSBpcyA1LiBBbW91bnRzIGNhbiBkZXNjcmliZSBmdW5naWJsZSBhbmRcbiAqIG5vbi1mdW5naWJsZSBkaWdpdGFsIGFzc2V0cy4gQW1vdW50cyBhcmUgcGFzcy1ieS1jb3B5IGFuZCBjYW4gYmUgbWFkZSBieSBhbmRcbiAqIHNlbnQgdG8gYW55b25lLlxuICpcbiAqIFRoZSBpc3N1ZXIgaXMgdGhlIGF1dGhvcml0YXRpdmUgc291cmNlIG9mIHRoZSBhbW91bnQgaW4gcGF5bWVudHMgYW5kIHB1cnNlcy5cbiAqIFRoZSBpc3N1ZXIgbXVzdCBiZSBhYmxlIHRvIGRvIHRoaW5ncyBzdWNoIGFzIGFkZCBkaWdpdGFsIGFzc2V0cyB0byBhIHB1cnNlXG4gKiBhbmQgd2l0aGRyYXcgZGlnaXRhbCBhc3NldHMgZnJvbSBhIHB1cnNlLiBUbyBkbyBzbywgaXQgbXVzdCBrbm93IGhvdyB0byBhZGRcbiAqIGFuZCBzdWJ0cmFjdCBkaWdpdGFsIGFzc2V0cy4gUmF0aGVyIHRoYW4gaGFyZC1jb2RpbmcgYSBwYXJ0aWN1bGFyIHNvbHV0aW9uLFxuICogd2UgY2hvc2UgdG8gcGFyYW1ldGVyaXplIHRoZSBpc3N1ZXIgd2l0aCBhIGNvbGxlY3Rpb24gb2YgcG9seW1vcnBoaWNcbiAqIGZ1bmN0aW9ucywgd2hpY2ggd2UgY2FsbCBgQW1vdW50TWF0aGAuIFRoZXNlIG1hdGggZnVuY3Rpb25zIGluY2x1ZGUgY29uY2VwdHNcbiAqIGxpa2UgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBhbmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvLlxuICpcbiAqIFdlIGFsc28gd2FudCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gY29uZnVzaW9uIGFzIHRvIHdoYXQga2luZCBvZiBhc3NldCB3ZVxuICogYXJlIHVzaW5nLiBUaHVzLCBBbW91bnRNYXRoIGluY2x1ZGVzIGNoZWNrcyBvZiB0aGUgYGJyYW5kYCwgdGhlIHVuaXF1ZVxuICogaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldC4gSWYgdGhlIHdyb25nIGJyYW5kIGlzIHVzZWQgaW5cbiAqIEFtb3VudE1hdGgsIGFuIGVycm9yIGlzIHRocm93biBhbmQgdGhlIG9wZXJhdGlvbiBkb2VzIG5vdCBzdWNjZWVkLlxuICpcbiAqIEFtb3VudE1hdGggdXNlcyBtYXRoSGVscGVycyB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLCBidXQgdGhlbiBhZGRzIHRoZSBicmFuZFxuICogdG8gdGhlIHJlc3VsdC4gVGhlIGZ1bmN0aW9uIGB2YWx1ZWAgZ2V0cyB0aGUgdmFsdWUgZnJvbSB0aGUgYW1vdW50IGJ5XG4gKiByZW1vdmluZyB0aGUgYnJhbmQgKGFtb3VudCAtPiB2YWx1ZSksIGFuZCB0aGUgZnVuY3Rpb24gYG1ha2VgIGFkZHMgdGhlIGJyYW5kXG4gKiB0byBwcm9kdWNlIGFuIGFtb3VudCAodmFsdWUgLT4gYW1vdW50KS4gVGhlIGZ1bmN0aW9uIGBjb2VyY2VgIHRha2VzIGFuIGFtb3VudFxuICogYW5kIGNoZWNrcyBpdCwgcmV0dXJuaW5nIGFuIGFtb3VudCAoYW1vdW50IC0+IGFtb3VudCkuXG4gKlxuICogRWFjaCBpc3N1ZXIgb2YgZGlnaXRhbCBhc3NldHMgaGFzIGFuIGFzc29jaWF0ZWQgYnJhbmQgaW4gYSBvbmUtdG8tb25lXG4gKiBtYXBwaW5nLiBJbiB1bnRydXN0ZWQgY29udGV4dHMsIHN1Y2ggYXMgaW4gYW5hbHl6aW5nIHBheW1lbnRzIGFuZCBhbW91bnRzLCB3ZVxuICogY2FuIGdldCB0aGUgYnJhbmQgYW5kIGZpbmQgdGhlIGlzc3VlciB3aGljaCBtYXRjaGVzIHRoZSBicmFuZC4gVGhlIGlzc3VlciBhbmRcbiAqIHRoZSBicmFuZCBtdXR1YWxseSB2YWxpZGF0ZSBlYWNoIG90aGVyLlxuICovXG5cbmNvbnN0IGhlbHBlcnMgPSB7XG4gIG5hdDogbmF0TWF0aEhlbHBlcnMsXG4gIHNldDogc2V0TWF0aEhlbHBlcnMsXG4gIGNvcHlTZXQ6IGNvcHlTZXRNYXRoSGVscGVycyxcbiAgY29weUJhZzogY29weUJhZ01hdGhIZWxwZXJzLFxufTtcblxuLyoqIEB0eXBlIHsodmFsdWU6IHVua25vd24pID0+ICduYXQnIHwgJ3NldCcgfCAnY29weVNldCcgfCAnY29weUJhZyd9IH0gKi9cbmNvbnN0IGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kID0gdmFsdWUgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWx1ZSk7XG4gIGlmIChwYXNzU3R5bGUgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuICduYXQnO1xuICB9XG4gIGlmIChwYXNzU3R5bGUgPT09ICdjb3B5QXJyYXknKSB7XG4gICAgcmV0dXJuICdzZXQnO1xuICB9XG4gIGlmIChtYXRjaGVzKHZhbHVlLCBNLnNldCgpKSkge1xuICAgIHJldHVybiAnY29weVNldCc7XG4gIH1cbiAgaWYgKG1hdGNoZXModmFsdWUsIE0uYmFnKCkpKSB7XG4gICAgcmV0dXJuICdjb3B5QmFnJztcbiAgfVxuICAvKiBUT0RPIFRoaXMgaXNuJ3QgcXVpdGUgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UsIGluIGNhc2UgdmFsdWVQYXNzU3R5bGUqL1xuICAvKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbiAgLyogb2JqZWN0IGl0IGlzLiovXG4gIC8qIEFsc28sIHRoaXMga2luZCBvZiBtYW51YWwgbGlzdGluZyBpcyBhIG1haW50ZW5hbmNlIGhhemFyZCB3ZSovXG4gIC8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cbiAgdGhyb3cgRmFpbGB2YWx1ZSAke3ZhbHVlfSBtdXN0IGJlIGEgYmlnaW50LCBjb3B5U2V0LCBjb3B5QmFnLCBvciBhbiBhcnJheSwgbm90ICR7cShcbiAgICBwYXNzU3R5bGUsXG4gICl9YDtcbn07XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHZhbHVlIGlzIGEgdmFsaWQgQW1vdW50TWF0aCBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaGVscGVycy5cbiAqXG4gKiBNYWRlIGF2YWlsYWJsZSBvbmx5IGZvciB0ZXN0aW5nLCBidXQgaXQgaXMgaGFybWxlc3MgZm9yIG90aGVyIHVzZXMuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHBhcmFtIHtWfSB2YWx1ZVxuICogQHJldHVybnMge01hdGhIZWxwZXJzPFY+fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0VmFsdWVHZXRIZWxwZXJzID0gdmFsdWUgPT5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgaGVscGVyc1thc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSldO1xuXG4vKipcbiAqIEB0eXBlIHsoYWxsZWdlZEJyYW5kOiBCcmFuZDxhbnk+LCBicmFuZD86IEJyYW5kPGFueT4pID0+IHZvaWR9XG4gKi8kaM2PX29uY2UuYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFzc2VydFZhbHVlR2V0SGVscGVycyk7XG5jb25zdCBvcHRpb25hbEJyYW5kQ2hlY2sgPSAoYWxsZWdlZEJyYW5kLCBicmFuZCkgPT4ge1xuICBpZiAoYnJhbmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgYWxsZWdlZEJyYW5kID09PSBicmFuZCB8fFxuICAgICAgRmFpbGBhbW91bnQncyBicmFuZCAke3EoYWxsZWdlZEJyYW5kKX0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBicmFuZCAke3EoXG4gICAgICAgIGJyYW5kLFxuICAgICAgKX1gO1xuICB9XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+IHwgdW5kZWZpbmVkfSBicmFuZFxuICogQHJldHVybnMge01hdGhIZWxwZXJzPGFueT59XG4gKi9cbmNvbnN0IGNoZWNrTFJBbmRHZXRIZWxwZXJzID0gKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICBhc3NlcnRSZWNvcmQobGVmdEFtb3VudCwgJ2xlZnRBbW91bnQnKTtcbiAgYXNzZXJ0UmVjb3JkKHJpZ2h0QW1vdW50LCAncmlnaHRBbW91bnQnKTtcbiAgY29uc3QgeyB2YWx1ZTogbGVmdFZhbHVlLCBicmFuZDogbGVmdEJyYW5kIH0gPSBsZWZ0QW1vdW50O1xuICBjb25zdCB7IHZhbHVlOiByaWdodFZhbHVlLCBicmFuZDogcmlnaHRCcmFuZCB9ID0gcmlnaHRBbW91bnQ7XG4gIGFzc2VydFJlbW90YWJsZShsZWZ0QnJhbmQsICdsZWZ0QnJhbmQnKTtcbiAgYXNzZXJ0UmVtb3RhYmxlKHJpZ2h0QnJhbmQsICdyaWdodEJyYW5kJyk7XG4gIG9wdGlvbmFsQnJhbmRDaGVjayhsZWZ0QnJhbmQsIGJyYW5kKTtcbiAgb3B0aW9uYWxCcmFuZENoZWNrKHJpZ2h0QnJhbmQsIGJyYW5kKTtcbiAgbGVmdEJyYW5kID09PSByaWdodEJyYW5kIHx8XG4gICAgRmFpbGBCcmFuZHMgaW4gbGVmdCAke3EobGVmdEJyYW5kKX0gYW5kIHJpZ2h0ICR7cShcbiAgICAgIHJpZ2h0QnJhbmQsXG4gICAgKX0gc2hvdWxkIG1hdGNoIGJ1dCBkbyBub3RgO1xuICBjb25zdCBsZWZ0SGVscGVycyA9IGFzc2VydFZhbHVlR2V0SGVscGVycyhsZWZ0VmFsdWUpO1xuICBjb25zdCByaWdodEhlbHBlcnMgPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnMocmlnaHRWYWx1ZSk7XG4gIGxlZnRIZWxwZXJzID09PSByaWdodEhlbHBlcnMgfHxcbiAgICBGYWlsYFRoZSBsZWZ0ICR7bGVmdEFtb3VudH0gYW5kIHJpZ2h0IGFtb3VudCAke3JpZ2h0QW1vdW50fSBoYWQgZGlmZmVyZW50IGFzc2V0S2luZHNgO1xuICByZXR1cm4gbGVmdEhlbHBlcnM7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge01hdGhIZWxwZXJzPEFzc2V0VmFsdWVGb3JLaW5kPEs+Pn0gaFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHJldHVybnMge1tBc3NldFZhbHVlRm9yS2luZDxLPiwgQXNzZXRWYWx1ZUZvcktpbmQ8Sz5dfVxuICovXG5jb25zdCBjb2VyY2VMUiA9IChoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkgPT4ge1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGJlIGFyYml0cmFyeSBzdWJ0eXBlKi9cbiAgcmV0dXJuIFtoLmRvQ29lcmNlKGxlZnRBbW91bnQudmFsdWUpLCBoLmRvQ29lcmNlKHJpZ2h0QW1vdW50LnZhbHVlKV07XG59O1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJpZ2h0QW1vdW50LlxuICogVGhlIG5vdGlvbiBvZiBcImdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0b1wiIGRlcGVuZHMgb24gdGhlIGtpbmQgb2YgYW1vdW50LCBhc1xuICogZGVmaW5lZCBieSB0aGUgTWF0aEhlbHBlcnMuIEZvciBleGFtcGxlLCB3aGV0aGVyIHJlY3RhbmdsZSBBIGlzIGdyZWF0ZXIgdGhhblxuICogcmVjdGFuZ2xlIEIgZGVwZW5kcyBvbiB3aGV0aGVyIHJlY3RhbmdsZSBBIGluY2x1ZGVzIHJlY3RhbmdsZSBCIGFzIGRlZmluZWQgYnlcbiAqIHRoZSBsb2dpYyBpbiBNYXRoSGVscGVycy5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzR1RFID0gKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgcmV0dXJuIGguZG9Jc0dURSguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xufTtcblxuLyoqXG4gKiBMb2dpYyBmb3IgbWFuaXB1bGF0aW5nIGFtb3VudHMuXG4gKlxuICogQW1vdW50cyBhcmUgdGhlIGNhbm9uaWNhbCBkZXNjcmlwdGlvbiBvZiB0cmFkYWJsZSBnb29kcy4gVGhleSBhcmUgbWFuaXB1bGF0ZWRcbiAqIGJ5IGlzc3VlcnMgYW5kIG1pbnRzLCBhbmQgcmVwcmVzZW50IHRoZSBnb29kcyBhbmQgY3VycmVuY3kgY2FycmllZCBieSBwdXJzZXNcbiAqIGFuZCBwYXltZW50cy4gVGhleSBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgdGhpbmdzIGxpa2UgY3VycmVuY3ksIHN0b2NrLCBhbmRcbiAqIHRoZSBhYnN0cmFjdCByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgZXhjaGFuZ2UuXG4gKi9cbiAgICAgICBjb25zdCBBbW91bnRNYXRoID0ge1xuICAvKiBUT0RPIHVzZSBvdmVybG9hZGluZyB0byBoYW5kbGUgd2hlbiBCcmFuZCBoYXMgYW4gQXNzZXRLaW5kIGFuZCB3aGVuIGl0IGRvZXNuJ3QuKi9cbiAgLyogYSBBbW91bnRGb3JWYWx1ZSB1dGlsaXR5IGNvdWxkIGhlbHAgRFJZIHRob3NlIGNhc2VzLiovXG4gIC8qKlxuICogTWFrZSBhbiBhbW91bnQgZnJvbSBhIHZhbHVlIGJ5IGFkZGluZyB0aGUgYnJhbmQuXG4gKlxuICogRG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlIEJyYW5kJ3MgQXNzZXRLaW5kIG1hdGNoZXMgdGhlIHZhbHVlJ3MuXG4gKlxuICogQHRlbXBsYXRlIHtCcmFuZDxhbnk+fSBCXG4gKiBAdGVtcGxhdGUge05hdFZhbHVlIHwgQ29weVNldCB8IENvcHlCYWcgfCBTZXRWYWx1ZX0gVlxuICogQHBhcmFtIHtCfSBicmFuZFxuICogQHBhcmFtIHtWfSBhbGxlZ2VkVmFsdWVcbiAqIEByZXR1cm5zIHtCIGV4dGVuZHMgQnJhbmQ8J25hdCc+XG4gKiAgICAgPyBOYXRBbW91bnRcbiAqICAgICA6IFYgZXh0ZW5kcyBOYXRWYWx1ZVxuICogICAgICAgPyBOYXRBbW91bnRcbiAqICAgICAgIDogViBleHRlbmRzIENvcHlTZXRcbiAqICAgICAgICAgPyBDb3B5U2V0QW1vdW50PFZbJ3BheWxvYWQnXVswXT5cbiAqICAgICAgICAgOiBWIGV4dGVuZHMgQ29weUJhZ1xuICogICAgICAgICAgID8gQ29weUJhZ0Ftb3VudDxWWydwYXlsb2FkJ11bMF1bMF0+XG4gKiAgICAgICAgICAgOiBWIGV4dGVuZHMgU2V0VmFsdWVcbiAqICAgICAgICAgICAgID8gU2V0QW1vdW50PFZbMF0+XG4gKiAgICAgICAgICAgICA6IG5ldmVyfVxuICovXG4gIG1ha2U6IChicmFuZCwgYWxsZWdlZFZhbHVlKSA9PiB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBjb25zdCBoID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFsbGVnZWRWYWx1ZSk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvQ29lcmNlKGFsbGVnZWRWYWx1ZSk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKipcbiAqIE1ha2Ugc3VyZSB0aGlzIGFtb3VudCBpcyB2YWxpZCBlbm91Z2gsIGFuZCByZXR1cm4gYSBjb3JyZXNwb25kaW5nIHZhbGlkXG4gKiBhbW91bnQgaWYgc28uXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge0F9IGFsbGVnZWRBbW91bnRcbiAqIEByZXR1cm5zIHtBfVxuICovXG4gIGNvZXJjZTogKGJyYW5kLCBhbGxlZ2VkQW1vdW50KSA9PiB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBhc3NlcnRSZWNvcmQoYWxsZWdlZEFtb3VudCwgJ2Ftb3VudCcpO1xuICAgIGNvbnN0IHsgYnJhbmQ6IGFsbGVnZWRCcmFuZCwgdmFsdWU6IGFsbGVnZWRWYWx1ZSB9ID0gYWxsZWdlZEFtb3VudDtcbiAgICBicmFuZCA9PT0gYWxsZWdlZEJyYW5kIHx8XG4gICAgICBGYWlsYFRoZSBicmFuZCBpbiB0aGUgYWxsZWdlZEFtb3VudCAke2FsbGVnZWRBbW91bnR9IGluICdjb2VyY2UnIGRpZG4ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIGJyYW5kICR7YnJhbmR9LmA7XG4gICAgLyogV2lsbCB0aHJvdyBvbiBpbmFwcHJvcHJpYXRlIHZhbHVlKi9cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIHJldHVybiBBbW91bnRNYXRoLm1ha2UoYnJhbmQsIGFsbGVnZWRWYWx1ZSk7XG4gIH0sXG4gIC8qKlxuICogRXh0cmFjdCBhbmQgcmV0dXJuIHRoZSB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7QX0gYW1vdW50XG4gKiBAcmV0dXJucyB7QVsndmFsdWUnXX1cbiAqL1xuICBnZXRWYWx1ZTogKGJyYW5kLCBhbW91bnQpID0+IEFtb3VudE1hdGguY29lcmNlKGJyYW5kLCBhbW91bnQpLnZhbHVlLFxuICAvKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQuIFRoaXMgaXMgdGhlIGlkZW50aXR5XG4gKiBlbGVtZW50IGZvciBNYXRoSGVscGVycy5hZGQgYW5kIE1hdEhlbHBlcnMuc3VidHJhY3QuXG4gKlxuICogQHR5cGUge3tcbiAqICAgKGJyYW5kOiBCcmFuZCk6IEFtb3VudDwnbmF0Jz47XG4gKiAgIDxLIGV4dGVuZHMgQXNzZXRLaW5kPihicmFuZDogQnJhbmQ8Sz4sIGFzc2V0S2luZDogSyk6IEFtb3VudDxLPjtcbiAqIH19XG4gKi9cbiAgbWFrZUVtcHR5OiAoYnJhbmQsIGFzc2V0S2luZCA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICgnbmF0JykpID0+IHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuICAgIGNvbnN0IHZhbHVlID0gaGVscGVyc1thc3NldEtpbmRdLmRvTWFrZUVtcHR5KCk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggbmFycm93aW5nIGZyb20gZnVuY3Rpb24gb3ZlcmxvYWQqL1xuICAgIHJldHVybiBoYXJkZW4oeyBicmFuZCwgdmFsdWUgfSk7XG4gIH0sXG4gIC8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudCwgdXNpbmcgYW5vdGhlciBhbW91bnQgYXMgdGhlXG4gKiB0ZW1wbGF0ZSBmb3IgdGhlIGJyYW5kIGFuZCBhc3NldEtpbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QX0gYW1vdW50XG4gKiBAcmV0dXJucyB7QX1cbiAqL1xuICBtYWtlRW1wdHlGcm9tQW1vdW50OiBhbW91bnQgPT4ge1xuICAgIGFzc2VydFJlY29yZChhbW91bnQsICdhbW91bnQnKTtcbiAgICBjb25zdCB7IGJyYW5kLCB2YWx1ZSB9ID0gYW1vdW50O1xuICAgIGNvbnN0IGFzc2V0S2luZCA9IGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGRpZmZlcmVudCBzdWJ0eXBlKi9cbiAgICByZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG4gIH0sXG4gIC8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIEFtb3VudCBpcyBlbXB0eS4gT3RoZXJ3aXNlIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGlzRW1wdHk6IChhbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgYXNzZXJ0UmVjb3JkKGFtb3VudCwgJ2Ftb3VudCcpO1xuICAgIGNvbnN0IHsgYnJhbmQ6IGFsbGVnZWRCcmFuZCwgdmFsdWUgfSA9IGFtb3VudDtcbiAgICBhc3NlcnRSZW1vdGFibGUoYWxsZWdlZEJyYW5kLCAnYnJhbmQnKTtcbiAgICBvcHRpb25hbEJyYW5kQ2hlY2soYWxsZWdlZEJyYW5kLCBicmFuZCk7XG4gICAgY29uc3QgaCA9IGFzc2VydFZhbHVlR2V0SGVscGVycyh2YWx1ZSk7XG4gICAgcmV0dXJuIGguZG9Jc0VtcHR5KGguZG9Db2VyY2UodmFsdWUpKTtcbiAgfSxcbiAgaXNHVEUsXG4gIC8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGVxdWFscyB0aGUgcmlnaHRBbW91bnQuIFdlIGFzc3VtZSB0aGF0IGlmXG4gKiBpc0dURSBpcyB0cnVlIGluIGJvdGggZGlyZWN0aW9ucywgaXNFcXVhbCBpcyBhbHNvIHRydWVcbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtBfSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0F9IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kfSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBpc0VxdWFsOiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgcmV0dXJuIGguZG9Jc0VxdWFsKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gIH0sXG4gIC8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgdW5pb24gb2YgYm90aCBsZWZ0QW1vdW50IGFuZCByaWdodEFtb3VudC5cbiAqXG4gKiBGb3IgZnVuZ2libGUgYW1vdW50IHRoaXMgbWVhbnMgYWRkaW5nIHRoZSB2YWx1ZXMuIEZvciBvdGhlciBraW5kcyBvZlxuICogYW1vdW50LCBpdCB1c3VhbGx5IG1lYW5zIGluY2x1ZGluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gYm90aCBsZWZ0IGFuZFxuICogcmlnaHQuXG4gKlxuICogQHR5cGUge3tcbiAqICAgPEEgZXh0ZW5kcyBDb3B5QmFnLCBCIGV4dGVuZHMgQ29weUJhZz4oXG4gKiAgICAgbGVmdEFtb3VudDogQ29weUJhZ0Ftb3VudDxBPixcbiAqICAgICByaWdodEFtb3VudDogQ29weUJhZ0Ftb3VudDxCPixcbiAqICAgICBicmFuZD86IEJyYW5kLFxuICogICApOiBDb3B5QmFnQW1vdW50PEEgfCBCPjtcbiAqICAgPEEgZXh0ZW5kcyBBbW91bnQ+KGxlZnRBbW91bnQ6IEEsIHJpZ2h0QW1vdW50OiBBLCBicmFuZD86IEJyYW5kKTogQTtcbiAqIH19XG4gKi9cbiAgYWRkOiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvQWRkKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gICAgcmV0dXJuIGhhcmRlbih7IGJyYW5kOiBsZWZ0QW1vdW50LmJyYW5kLCB2YWx1ZSB9KTtcbiAgfSxcbiAgLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSBsZWZ0QW1vdW50IG1pbnVzIHRoZSByaWdodEFtb3VudCAoaS5lLlxuICogZXZlcnl0aGluZyBpbiB0aGUgbGVmdEFtb3VudCB0aGF0IGlzIG5vdCBpbiB0aGUgcmlnaHRBbW91bnQpLiBJZiBsZWZ0QW1vdW50XG4gKiBkb2Vzbid0IGluY2x1ZGUgcmlnaHRBbW91bnQgKHN1YnRyYWN0aW9uIHJlc3VsdHMgaW4gYSBuZWdhdGl2ZSksIHRocm93IGFuXG4gKiBlcnJvci4gQmVjYXVzZSB0aGUgbGVmdCBhbW91bnQgbXVzdCBpbmNsdWRlIHRoZSByaWdodCBhbW91bnQsIHRoaXMgaXMgTk9UXG4gKiBlcXVpdmFsZW50IHRvIHNldCBzdWJ0cmFjdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gTFxuICogQHRlbXBsYXRlIHtBbW91bnR9IFJcbiAqIEBwYXJhbSB7TH0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtSfSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge0wgZXh0ZW5kcyBSID8gTCA6IG5ldmVyfVxuICovXG4gIHN1YnRyYWN0OiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvU3VidHJhY3QoLi4uY29lcmNlTFIoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpKTtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGRpZmZlcmVudCBzdWJ0eXBlKi9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQ6IGxlZnRBbW91bnQuYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKipcbiAqIFJldHVybnMgdGhlIG1pbiB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtBfSB4XG4gKiBAcGFyYW0ge0F9IHlcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtBfVxuICovXG4gIG1pbjogKHgsIHksIGJyYW5kID0gdW5kZWZpbmVkKSA9PlxuICAgIGlzR1RFKHgsIHksIGJyYW5kKVxuICAgICAgPyB5XG4gICAgICA6IGlzR1RFKHksIHgsIGJyYW5kKVxuICAgICAgICA/IHhcbiAgICAgICAgOiBGYWlsYCR7eH0gYW5kICR7eX0gYXJlIGluY29tcGFyYWJsZWAsXG4gIC8qKlxuICogUmV0dXJucyB0aGUgbWF4IHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBBXG4gKiBAcGFyYW0ge0F9IHhcbiAqIEBwYXJhbSB7QX0geVxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge0F9XG4gKi9cbiAgbWF4OiAoeCwgeSwgYnJhbmQgPSB1bmRlZmluZWQpID0+XG4gICAgaXNHVEUoeCwgeSwgYnJhbmQpXG4gICAgICA/IHhcbiAgICAgIDogaXNHVEUoeSwgeClcbiAgICAgICAgPyB5XG4gICAgICAgIDogRmFpbGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgLFxufTskaM2PX29uY2UuQW1vdW50TWF0aChBbW91bnRNYXRoKTtcbmhhcmRlbihBbW91bnRNYXRoKTtcblxuLyoqIEBwYXJhbSB7QW1vdW50fSBhbW91bnQgKi9cbiAgICAgICBjb25zdCBnZXRBc3NldEtpbmQgPSBhbW91bnQgPT4ge1xuICBhc3NlcnRSZWNvcmQoYW1vdW50LCAnYW1vdW50Jyk7XG4gIGNvbnN0IHsgdmFsdWUgfSA9IGFtb3VudDtcbiAgcmV0dXJuIGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbn07JGjNj19vbmNlLmdldEFzc2V0S2luZChnZXRBc3NldEtpbmQpO1xuaGFyZGVuKGdldEFzc2V0S2luZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJBc3NldEtpbmQiOlsiQXNzZXRLaW5kIl0sImFzc2VydEFzc2V0S2luZCI6WyJhc3NlcnRBc3NldEtpbmQiXSwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIjpbImFzc2VydFZhbHVlR2V0SGVscGVycyJdLCJBbW91bnRNYXRoIjpbIkFtb3VudE1hdGgiXSwiZ2V0QXNzZXRLaW5kIjpbImdldEFzc2V0S2luZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABf6b1eegUAAHoFAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyJdLCJleHBvcnRzIjpbIm1ha2VBbW91bnRTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEFtb3VudE1hdGg7JGjNj19pbXBvcnRzKFtbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV1dKTtcblxuLyoqIEBpbXBvcnQge0Ftb3VudCwgQXNzZXRLaW5kfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbW91bnRTdG9yZVxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IGdldEFtb3VudFxuICogQHByb3BlcnR5IHsoZGVsdGE6IEFtb3VudDxLPikgPT4gdm9pZH0gaW5jcmVtZW50XG4gKiBAcHJvcGVydHkgeyhkZWx0YTogQW1vdW50PEs+KSA9PiBib29sZWFufSBkZWNyZW1lbnRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge29iamVjdH0gc3RhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtBbW91bnRTdG9yZTxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VBbW91bnRTdG9yZSA9IChzdGF0ZSwga2V5KSA9PiB7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGdldEFtb3VudDogKCkgPT4gc3RhdGVba2V5XSxcbiAgICBpbmNyZW1lbnQ6IGRlbHRhID0+IHtcbiAgICAgIHN0YXRlW2tleV0gPSBBbW91bnRNYXRoLmFkZChzdGF0ZVtrZXldLCBkZWx0YSk7XG4gICAgfSxcbiAgICBkZWNyZW1lbnQ6IGRlbHRhID0+IHtcbiAgICAgIGlmIChBbW91bnRNYXRoLmlzR1RFKHN0YXRlW2tleV0sIGRlbHRhKSkge1xuICAgICAgICBzdGF0ZVtrZXldID0gQW1vdW50TWF0aC5zdWJ0cmFjdChzdGF0ZVtrZXldLCBkZWx0YSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUFtb3VudFN0b3JlKG1ha2VBbW91bnRTdG9yZSk7XG5oYXJkZW4obWFrZUFtb3VudFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBbW91bnRTdG9yZSI6WyJtYWtlQW1vdW50U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQ7172XQGAAB0BgAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9kaXNwbGF5SW5mby5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiY29lcmNlRGlzcGxheUluZm8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG11c3RNYXRjaCxEaXNwbGF5SW5mb1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRGlzcGxheUluZm9TaGFwZVwiLFskaM2PX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge0FkZGl0aW9uYWxEaXNwbGF5SW5mbywgQXNzZXRLaW5kLCBEaXNwbGF5SW5mb30gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuLyoqXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gYWxsZWdlZERpc3BsYXlJbmZvXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcmV0dXJucyB7RGlzcGxheUluZm99XG4gKi9cbiAgICAgICBjb25zdCBjb2VyY2VEaXNwbGF5SW5mbyA9IChhbGxlZ2VkRGlzcGxheUluZm8sIGFzc2V0S2luZCkgPT4ge1xuICBtdXN0TWF0Y2goYWxsZWdlZERpc3BsYXlJbmZvLCBEaXNwbGF5SW5mb1NoYXBlLCAnZGlzcGxheUluZm8nKTtcblxuICBpZiAoYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZCA9PT0gYXNzZXRLaW5kIHx8XG4gICAgICBGYWlsYGRpc3BsYXlJbmZvLmFzc2V0S2luZCB3YXMgcHJlc2VudCAoJHthbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kfSkgYW5kIGRpZCBub3QgbWF0Y2ggdGhlIGFzc2V0S2luZCBhcmd1bWVudCAoJHthc3NldEtpbmR9KWA7XG4gIH1cbiAgY29uc3QgZGlzcGxheUluZm8gPSBoYXJkZW4oeyAuLi5hbGxlZ2VkRGlzcGxheUluZm8sIGFzc2V0S2luZCB9KTtcblxuICBpZiAoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTnVtYmVyLmlzU2FmZUludGVnZXIoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcykgfHxcbiAgICAgIEZhaWxgZGVjaW1hbFBsYWNlcyAke2Rpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXN9IGlzIG5vdCBhIHNhZmUgaW50ZWdlcmA7XG4gIH1cblxuICByZXR1cm4gZGlzcGxheUluZm87XG59OyRozY9fb25jZS5jb2VyY2VEaXNwbGF5SW5mbyhjb2VyY2VEaXNwbGF5SW5mbyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb2VyY2VEaXNwbGF5SW5mbyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADzX00DTQIAAE0CAAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2Ftb3VudE1hdGguanNcIiwgW11dLFtcIi4vaXNzdWVyS2l0LmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vdHlwZXMtaW5kZXguanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAaD6Qc8c8AADHPAAAJQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pc3N1ZXJLaXQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3pvbmUvZHVyYWJsZS5qcyIsIi4vYW1vdW50TWF0aC5qcyIsIi4vZGlzcGxheUluZm8uanMiLCIuL3BheW1lbnRMZWRnZXIuanMiXSwiZXhwb3J0cyI6WyJoYXNJc3N1ZXIiLCJtYWtlRHVyYWJsZUlzc3VlcktpdCIsIm1ha2VJc3N1ZXJLaXQiLCJwcmVwYXJlSXNzdWVyS2l0IiwidXBncmFkZUlzc3VlcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydCxGYWlsLGFzc2VydFBhdHRlcm4sbWFrZVNjYWxhckJpZ01hcFN0b3JlLG1ha2VEdXJhYmxlWm9uZSxBc3NldEtpbmQsYXNzZXJ0QXNzZXRLaW5kLGNvZXJjZURpc3BsYXlJbmZvLHByZXBhcmVQYXltZW50TGVkZ2VyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIixbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzXCIsIFtbXCJtYWtlRHVyYWJsZVpvbmVcIixbJGjNj19hID0+IChtYWtlRHVyYWJsZVpvbmUgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFzc2V0S2luZFwiLFskaM2PX2EgPT4gKEFzc2V0S2luZCA9ICRozY9fYSldXSxbXCJhc3NlcnRBc3NldEtpbmRcIixbJGjNj19hID0+IChhc3NlcnRBc3NldEtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL2Rpc3BsYXlJbmZvLmpzXCIsIFtbXCJjb2VyY2VEaXNwbGF5SW5mb1wiLFskaM2PX2EgPT4gKGNvZXJjZURpc3BsYXlJbmZvID0gJGjNj19hKV1dXV0sW1wiLi9wYXltZW50TGVkZ2VyLmpzXCIsIFtbXCJwcmVwYXJlUGF5bWVudExlZGdlclwiLFskaM2PX2EgPT4gKHByZXBhcmVQYXltZW50TGVkZ2VyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXksIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge1NodXRkb3duV2l0aEZhaWx1cmV9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JztcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJztcbiAqIEBpbXBvcnQge0FkZGl0aW9uYWxEaXNwbGF5SW5mbywgUmVjb3ZlcnlTZXRzT3B0aW9uLCBJc3N1ZXJLaXQsIFBheW1lbnRMZWRnZXJ9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kXG4gKiBAcHJvcGVydHkge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKi9cblxuLyoqXG4gKiBVc2VkIF9vbmx5XyBpbnRlcm5hbGx5LCB0byBtYWtlIGEgbmV3IGlzc3VlcktpdCBvciB0byByZXZpdmUgYW4gb2xkIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmQ8Sz59IGlzc3VlclJlY29yZFxuICogQHBhcmFtIHtab25lfSBpc3N1ZXJab25lXG4gKiBAcGFyYW0ge1JlY292ZXJ5U2V0c09wdGlvbn0gcmVjb3ZlcnlTZXRzU3RhdGUgT21pdHRlZCBmcm9tIGlzc3VlclJlY29yZFxuICogICBiZWNhdXNlIGl0IHdhcyBhZGRlZCBpbiBhbiB1cGdyYWRlLlxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0IHNldHVwSXNzdWVyS2l0ID0gKFxuICB7IG5hbWUsIGFzc2V0S2luZCwgZGlzcGxheUluZm8sIGVsZW1lbnRTaGFwZSB9LFxuICBpc3N1ZXJab25lLFxuICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5cbiAgLyogQWRkIGFzc2V0S2luZCB0byBkaXNwbGF5SW5mbywgb3Igb3ZlcnJpZGUgaWYgcHJlc2VudCovXG4gIGNvbnN0IGNsZWFuRGlzcGxheUluZm8gPSBjb2VyY2VEaXNwbGF5SW5mbyhkaXNwbGF5SW5mbywgYXNzZXRLaW5kKTtcbiAgaWYgKG9wdFNodXRkb3duV2l0aEZhaWx1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwgJ2Z1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAoZWxlbWVudFNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gIH1cblxuICAvKiBBdHRlbnVhdGUgdGhlIHBvd2VyZnVsIGF1dGhvcml0eSB0byBtaW50IGFuZCBjaGFuZ2UgYmFsYW5jZXMqL1xuICAvKiogQHR5cGUge1BheW1lbnRMZWRnZXI8Sz59ICovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSovXG4gIGNvbnN0IHsgaXNzdWVyLCBtaW50LCBicmFuZCwgbWludFJlY292ZXJ5UHVyc2UgfSA9IHByZXBhcmVQYXltZW50TGVkZ2VyKFxuICAgIGlzc3VlclpvbmUsXG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgY2xlYW5EaXNwbGF5SW5mbyxcbiAgICBlbGVtZW50U2hhcGUsXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBicmFuZCxcbiAgICBpc3N1ZXIsXG4gICAgbWludCxcbiAgICBtaW50UmVjb3ZlcnlQdXJzZSxcbiAgICBkaXNwbGF5SW5mbzogY2xlYW5EaXNwbGF5SW5mbyxcbiAgfSk7XG59O1xuaGFyZGVuKHNldHVwSXNzdWVyS2l0KTtcblxuLyoqIFRoZSBrZXkgYXQgd2hpY2ggdGhlIGlzc3VlciByZWNvcmQgaXMgc3RvcmVkLiAqL1xuY29uc3QgSU5TVEFOQ0VfS0VZID0gJ2lzc3Vlcic7XG4vKipcbiAqIFRoZSBrZXkgYXQgd2hpY2ggdGhlIGlzc3VlcktpdCdzIGBSZWNvdmVyeVNldHNPcHRpb25gIHN0YXRlIGlzIHN0b3JlZC5cbiAqIEludHJvZHVjZWQgYnkgYW4gdXBncmFkZSwgc28gbWF5IGJlIGFic2VudCBvbiBhIHByZWRlY2Vzc29yIGluY2FybmF0aW9uLiBTZWVcbiAqIGBSZWNvdmVyeVNldHNPcHRpb25gIGZvciBkZWZhdWx0aW5nIGJlaGF2aW9yLlxuICovXG5jb25zdCBSRUNPVkVSWV9TRVRTX1NUQVRFID0gJ3JlY292ZXJ5U2V0c1N0YXRlJztcblxuLyoqXG4gKiBVc2VkIF9vbmx5XyB0byB1cGdyYWRlIGEgcHJlZGVjZXNzb3IgaXNzdWVyS2l0LiBVc2UgYG1ha2VEdXJhYmxlSXNzdWVyS2l0YCB0b1xuICogbWFrZSBhIG5ldyBvbmUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7UmVjb3ZlcnlTZXRzT3B0aW9ufSBbcmVjb3ZlcnlTZXRzT3B0aW9uXSBBZGRlZCBpbiB1cGdyYWRlLCBzbyBsYXN0XG4gKiAgIGFuZCBvcHRpb25hbC4gU2VlIGBSZWNvdmVyeVNldHNPcHRpb25gIGZvciBkZWZhdWx0aW5nIGJlaGF2aW9yLlxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IHVwZ3JhZGVJc3N1ZXJLaXQgPSAoXG4gIGlzc3VlckJhZ2dhZ2UsXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBpc3N1ZXJSZWNvcmQgPSBpc3N1ZXJCYWdnYWdlLmdldChJTlNUQU5DRV9LRVkpO1xuICBjb25zdCBpc3N1ZXJab25lID0gbWFrZUR1cmFibGVab25lKGlzc3VlckJhZ2dhZ2UpO1xuICBjb25zdCBvbGRSZWNvdmVyeVNldHNTdGF0ZSA9IGlzc3VlckJhZ2dhZ2UuaGFzKFJFQ09WRVJZX1NFVFNfU1RBVEUpXG4gICAgPyBpc3N1ZXJCYWdnYWdlLmdldChSRUNPVkVSWV9TRVRTX1NUQVRFKVxuICAgIDogJ2hhc1JlY292ZXJ5U2V0cyc7XG4gIGlmIChcbiAgICBvbGRSZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJyAmJlxuICAgIHJlY292ZXJ5U2V0c09wdGlvbiA9PT0gJ2hhc1JlY292ZXJ5U2V0cydcbiAgKSB7XG4gICAgRmFpbGBDYW5ub3QgKHlldD8pIHVwZ3JhZGUgZnJvbSAnbm9SZWNvdmVyeVNldHMnIHRvICdoYXNSZWNvdmVyeVNldHMnYDtcbiAgfVxuICAvKiBFeHRhbnQgc2V0cyBhcmUgbm90IGN1cnJlbnRseSBkZWxldGVkLiBJZiB0aGUgbmV3IG9wdGlvbiBpcyovXG4gIC8qICdub1JlY292ZXJ5U2V0cycsIHRoZXkgd29uJ3QgYmUgdXNlZCBidXQgZXh0YW50IG9uZXMgd2lsbCByZW1haW4uIEZ1dHVyZSovXG4gIC8qIHVwZ3JhZGVzIG1heSBtYWtlIGl0IHBvc3NpYmxlIHRvIGRlbGV0ZSBlbGVtZW50cyBmcm9tIHRoZW0uKi9cbiAgY29uc3QgcmVjb3ZlcnlTZXRzU3RhdGUgPSByZWNvdmVyeVNldHNPcHRpb24gfHwgb2xkUmVjb3ZlcnlTZXRzU3RhdGU7XG4gIHJldHVybiBzZXR1cElzc3VlcktpdChcbiAgICBpc3N1ZXJSZWNvcmQsXG4gICAgaXNzdWVyWm9uZSxcbiAgICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICApO1xufTskaM2PX29uY2UudXBncmFkZUlzc3VlcktpdCh1cGdyYWRlSXNzdWVyS2l0KTtcbmhhcmRlbih1cGdyYWRlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBEb2VzIGJhZ2dhZ2UgYWxyZWFkeSBoYXZlIGFuIGlzc3VlcktpdD9cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuICAgICAgIGNvbnN0IGhhc0lzc3VlciA9IGJhZ2dhZ2UgPT4gYmFnZ2FnZS5oYXMoSU5TVEFOQ0VfS0VZKTtcblxuLyoqXG4gKiBgZWxlbWVudFNoYXBlYCwgbWF5IG9ubHkgYmUgcHJlc2VudCBmb3IgY29sbGVjdGlvbi1zdHlsZSBhbW91bnRzLiBJZiBwcmVzZW50LFxuICogaXQgaXMgYSBgUGF0dGVybmAgdGhhdCBldmVyeSBlbGVtZW50IG9mIHRoaXMgaXNzdWVyS2l0cydzIGFtb3VudHMgbXVzdFxuICogc2F0aXNmeS4gRm9yIGV4YW1wbGUsIHRoZSBab2UgSW52aXRhdGlvbiBpc3N1ZXJLaXQgdXNlcyBhbiBlbGVtZW50U2hhcGVcbiAqIGRlc2NyaWJpbmcgdGhlIGludml0YXRpb24gZGV0YWlscyBmb3IgYW4gaW5kaXZpZHVhbCBpbnZpdGF0aW9uLiBBbiBpbnZpdGF0aW9uXG4gKiBwdXJzZSBvciBwYXltZW50IGhhcyBhbiBhbW91bnQgdGhhdCBjYW4gb25seSBiZSBhIHNldCBvZiB0aGVzZS4gKFRob3VnaFxuICogdHlwaWNhbGx5LCB0aGUgYW1vdW50IG9mIGFuIGludml0YXRpb24gcGF5bWVudCBpcyBhIHNpbmdsZXRvbiBzZXQuIFN1Y2ggYVxuICogcGF5bWVudCBpcyBvZnRlbiByZWZlcnJlZCB0byBpbiB0aGUgc2luZ3VsYXIgYXMgXCJhbiBpbnZpdGF0aW9uXCIuKVxuICpcbiAqIGByZWNvdmVyeVNldHNPcHRpb25gIGFkZGVkIGluIHVwZ3JhZGUuIE5vdGUgdGhhdCBgSXNzdWVyT3B0aW9uc1JlY29yZGAgaXNcbiAqIG5ldmVyIHN0b3JlZCwgc28gd2UgbmV2ZXIgbmVlZCB0byB3b3JyeSBhYm91dCBpbmhlcml0aW5nIG9uZSBmcm9tIGFcbiAqIHByZWRlY2Vzc29yIHByZWRhdGluZyB0aGUgaW50cm9kdWN0aW9uIG9mIHJlY292ZXJ5IHNldHMuIFNlZVxuICogYFJlY292ZXJ5U2V0c09wdGlvbmAgZm9yIGRlZmF1bHRpbmcgYmVoYXZpb3IuXG4gKlxuICogQHR5cGVkZWYge1BhcnRpYWw8e1xuICogICBlbGVtZW50U2hhcGU6IFBhdHRlcm47XG4gKiAgIHJlY292ZXJ5U2V0c09wdGlvbjogUmVjb3ZlcnlTZXRzT3B0aW9uO1xuICogfT59IElzc3Vlck9wdGlvbnNSZWNvcmRcbiAqL1xuXG4vKipcbiAqIFVzZWQgX29ubHlfIHRvIG1ha2UgYSBfbmV3XyBkdXJhYmxlIGlzc3VlciwgaS5lLiwgdGhlIGluaXRpYWwgaW5jYXJuYXRpb24gb2ZcbiAqIHRoYXQgaXNzdWVyLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXRcbiAqICAgZGVzY3JpcHRpb25zLiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiAgIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLiBGb3JcbiAqICAgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0IGl0IGlzXG4gKiAgIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmcgdG8gdGhhdCBpc3N1ZXJcbiAqICAgYW5kIGJyYW5kLlxuICpcbiAqICAgVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnMgZnJvbSB0aGVcbiAqICAgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGUgZGVmYXVsdCwgaXMgdXNlZCBmb3JcbiAqICAgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm9dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi8kaM2PX29uY2UuaGFzSXNzdWVyKGhhc0lzc3Vlcik7XG4gICAgICAgY29uc3QgbWFrZUR1cmFibGVJc3N1ZXJLaXQgPSAoXG4gIGlzc3VlckJhZ2dhZ2UsXG4gIG5hbWUsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG4gIGFzc2V0S2luZCA9IEFzc2V0S2luZC5OQVQsXG4gIGRpc3BsYXlJbmZvID0gaGFyZGVuKHt9KSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbiAgeyBlbGVtZW50U2hhcGUgPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgaXNzdWVyRGF0YSA9IGhhcmRlbih7XG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgZGlzcGxheUluZm8sXG4gICAgZWxlbWVudFNoYXBlLFxuICB9KTtcbiAgaXNzdWVyQmFnZ2FnZS5pbml0KElOU1RBTkNFX0tFWSwgaXNzdWVyRGF0YSk7XG4gIGNvbnN0IGlzc3VlclpvbmUgPSBtYWtlRHVyYWJsZVpvbmUoaXNzdWVyQmFnZ2FnZSk7XG4gIGNvbnN0IHJlY292ZXJ5U2V0c1N0YXRlID0gcmVjb3ZlcnlTZXRzT3B0aW9uIHx8ICdoYXNSZWNvdmVyeVNldHMnO1xuICBpc3N1ZXJCYWdnYWdlLmluaXQoUkVDT1ZFUllfU0VUU19TVEFURSwgcmVjb3ZlcnlTZXRzU3RhdGUpO1xuICByZXR1cm4gc2V0dXBJc3N1ZXJLaXQoXG4gICAgaXNzdWVyRGF0YSxcbiAgICBpc3N1ZXJab25lLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICk7XG59OyRozY9fb25jZS5tYWtlRHVyYWJsZUlzc3VlcktpdChtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIFVzZWQgdG8gZWl0aGVyIHJldml2ZSBhIHByZWRlY2Vzc29yIGlzc3VlcktpdCwgb3IgdG8gbWFrZSBhIG5ldyBkdXJhYmxlIG9uZVxuICogaWYgaXQgaXMgYWJzZW50LCBhbmQgdG8gcGxhY2UgaXQgaW4gYmFnZ2FnZSBmb3IgdGhlIG5leHQgc3VjY2Vzc29yLlxuICpcbiAqIEB0ZW1wbGF0ZSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gT1xuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEsgVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldFxuICogICBkZXNjcmlwdGlvbnMuIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqICAgYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuIEZvclxuICogICBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXQgaXQgaXNcbiAqICAgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZyB0byB0aGF0IGlzc3VlclxuICogICBhbmQgYnJhbmQuXG4gKlxuICogICBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVycyBmcm9tIHRoZVxuICogICBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZSBkZWZhdWx0LCBpcyB1c2VkIGZvclxuICogICBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mb11cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge099IFtvcHRpb25zXVxuICogQHJldHVybnMge09bJ2VsZW1lbnRTaGFwZSddIGV4dGVuZHMgVHlwZWRQYXR0ZXJuPGluZmVyIFQgZXh0ZW5kcyBLZXk+XG4gKiAgICAgPyBJc3N1ZXJLaXQ8SywgVD5cbiAqICAgICA6IElzc3VlcktpdDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVJc3N1ZXJLaXQgPSAoXG4gIGlzc3VlckJhZ2dhZ2UsXG4gIG5hbWUsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG4gIGFzc2V0S2luZCA9IEFzc2V0S2luZC5OQVQsXG4gIGRpc3BsYXlJbmZvID0gaGFyZGVuKHt9KSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBoYXZlIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgSXNzdWVyT3B0aW9uc1JlY29yZCovXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBpZiAoaGFzSXNzdWVyKGlzc3VlckJhZ2dhZ2UpKSB7XG4gICAgY29uc3QgeyBlbGVtZW50U2hhcGU6IF8gPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID1cbiAgICAgIG9wdGlvbnM7XG4gICAgY29uc3QgaXNzdWVyS2l0ID0gdXBncmFkZUlzc3VlcktpdChcbiAgICAgIGlzc3VlckJhZ2dhZ2UsXG4gICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICAgICAgcmVjb3ZlcnlTZXRzT3B0aW9uLFxuICAgICk7XG5cbiAgICAvKiBUT0RPIGNoZWNrIGNvbnNpc3RlbmN5IHdpdGggbmFtZSwgYXNzZXRLaW5kLCBkaXNwbGF5SW5mbywgZWxlbWVudFNoYXBlLiovXG4gICAgLyogQ29uc2lzdGVuY3kgZWl0aGVyIG1lYW5zIHRoYXQgdGhlc2UgYXJlIHRoZSBzYW1lLCBvciB0aGF0IHRoZXkgZGlmZmVyKi9cbiAgICAvKiBpbiBhIGRpcmVjdGlvbiB3ZSBhcmUgcHJlcGFyZWQgdG8gdXBncmFkZS4gTm90ZSB0aGF0IGl0IGlzIHRoZSovXG4gICAgLyogcmVzcG9uc2liaWxpdHkgb2YgYHVwZ3JhZGVJc3N1ZXJLaXRgIHRvIGNoZWNrIGNvbnNpc3RlbmN5IG9mKi9cbiAgICAvKiBgcmVjb3ZlcnlTZXRzT3B0aW9uYCwgc28gY29udGludWUgdG8gbm90IGRvIHRoYXQgaGVyZS4qL1xuXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBUeXBlIHBhcmFtZXRlciBjb25mdXNpb24uKi9cbiAgICByZXR1cm4gaXNzdWVyS2l0O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGlzc3VlcktpdCA9IG1ha2VEdXJhYmxlSXNzdWVyS2l0KFxuICAgICAgaXNzdWVyQmFnZ2FnZSxcbiAgICAgIG5hbWUsXG4gICAgICBhc3NldEtpbmQsXG4gICAgICBkaXNwbGF5SW5mbyxcbiAgICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IHRvIHRoZSB0eXBlIHBhcmFtZXRlciovXG4gICAgcmV0dXJuIGlzc3VlcktpdDtcbiAgfVxufTskaM2PX29uY2UucHJlcGFyZUlzc3VlcktpdChwcmVwYXJlSXNzdWVyS2l0KTtcbmhhcmRlbihwcmVwYXJlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBVc2VkIF9vbmx5XyB0byBtYWtlIGEgbmV3IGlzc3VlcktpdCB0aGF0IGlzIGVmZmVjdGl2ZWx5IG5vbi1kdXJhYmxlLiBUaGlzIGlzXG4gKiBjdXJyZW50bHkgZG9uZSBieSBtYWtpbmcgYSBkdXJhYmxlIG9uZSBpbiBhIGJhZ2dhZ2Ugbm90IHJlYWNoYWJsZSBmcm9tXG4gKiBhbnl3aGVyZS4gVE9ETyBPbmNlIHJlYnVpbHQgb24gem9uZXMsIHRoaXMgc2hvdWxkIGluc3RlYWQganVzdCBidWlsZCBvbiB0aGVcbiAqIHZpcnR1YWwgem9uZS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzcxMTZcbiAqXG4gKiBDdXJyZW50bHkgdXNlZCBmb3IgdGVzdGluZyBvbmx5LiBTaG91bGQgcHJvYmFibHkgY29udGludWUgdG8gYmUgdXNlZCBmb3JcbiAqIHRlc3Rpbmcgb25seS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9J25hdCddXG4gKiBAdGVtcGxhdGUge0lzc3Vlck9wdGlvbnNSZWNvcmR9IFtPPXt9XVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldFxuICogICBkZXNjcmlwdGlvbnMuIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqICAgYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuIEZvclxuICogICBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXQgaXQgaXNcbiAqICAgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZyB0byB0aGF0IGlzc3VlclxuICogICBhbmQgYnJhbmQuXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmRdIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljXG4gKiAgIG1hdGhIZWxwZXJzIGZyb20gdGhlIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlXG4gKiAgIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm9dIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb25cbiAqICAgdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtPfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtPWydlbGVtZW50U2hhcGUnXSBleHRlbmRzIFR5cGVkUGF0dGVybjxpbmZlciBUIGV4dGVuZHMgS2V5PlxuICogICAgID8gSXNzdWVyS2l0PEssIFQ+XG4gKiAgICAgOiBJc3N1ZXJLaXQ8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlSXNzdWVyS2l0ID0gKFxuICBuYW1lLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIEsgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuICBhc3NldEtpbmQgPSBBc3NldEtpbmQuTkFULFxuICBkaXNwbGF5SW5mbyA9IGhhcmRlbih7fSksXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgTyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlKi9cbiAgeyBlbGVtZW50U2hhcGUgPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIG1ha2VEdXJhYmxlSXNzdWVyS2l0KFxuICAgIG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZHJvcHBlZCBpc3N1ZXIga2l0JywgeyBkdXJhYmxlOiB0cnVlIH0pLFxuICAgIG5hbWUsXG4gICAgYXNzZXRLaW5kLFxuICAgIGRpc3BsYXlJbmZvLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICAgeyBlbGVtZW50U2hhcGUsIHJlY292ZXJ5U2V0c09wdGlvbiB9LFxuICApOyRozY9fb25jZS5tYWtlSXNzdWVyS2l0KG1ha2VJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VJc3N1ZXJLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidXBncmFkZUlzc3VlcktpdCI6WyJ1cGdyYWRlSXNzdWVyS2l0Il0sImhhc0lzc3VlciI6WyJoYXNJc3N1ZXIiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwicHJlcGFyZUlzc3VlcktpdCI6WyJwcmVwYXJlSXNzdWVyS2l0Il0sIm1ha2VJc3N1ZXJLaXQiOlsibWFrZUlzc3VlcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABU59wlEwYAABMGAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQga2V5RVEsbWFrZUNvcHlCYWcsbXVzdE1hdGNoLE0sZ2V0Q29weUJhZ0VudHJpZXMsYmFnSXNTdXBlcmJhZyxiYWdVbmlvbixiYWdEaXNqb2ludFN1YnRyYWN0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJtYWtlQ29weUJhZ1wiLFskaM2PX2EgPT4gKG1ha2VDb3B5QmFnID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlCYWdFbnRyaWVzID0gJGjNj19hKV1dLFtcImJhZ0lzU3VwZXJiYWdcIixbJGjNj19hID0+IChiYWdJc1N1cGVyYmFnID0gJGjNj19hKV1dLFtcImJhZ1VuaW9uXCIsWyRozY9fYSA9PiAoYmFnVW5pb24gPSAkaM2PX2EpXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLFskaM2PX2EgPT4gKGJhZ0Rpc2pvaW50U3VidHJhY3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtNYXRoSGVscGVyc30gZnJvbSAnLi4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtDb3B5QmFnfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKi9cblxuLyoqIEB0eXBlIHtDb3B5QmFnfSAqL1xuY29uc3QgZW1wdHkgPSBtYWtlQ29weUJhZyhbXSk7XG5cbi8qKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weUJhZz59ICovXG4gICAgICAgY29uc3QgY29weUJhZ01hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IGJhZyA9PiB7XG4gICAgbXVzdE1hdGNoKGJhZywgTS5iYWcoKSwgJ2JhZyBvZiBhbW91bnQnKTtcbiAgICByZXR1cm4gYmFnO1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogYmFnID0+IGdldENvcHlCYWdFbnRyaWVzKGJhZykubGVuZ3RoID09PSAwLFxuICBkb0lzR1RFOiBiYWdJc1N1cGVyYmFnLFxuICBkb0lzRXF1YWw6IGtleUVRLFxuICBkb0FkZDogYmFnVW5pb24sXG4gIGRvU3VidHJhY3Q6IGJhZ0Rpc2pvaW50U3VidHJhY3QsXG59KTskaM2PX29uY2UuY29weUJhZ01hdGhIZWxwZXJzKGNvcHlCYWdNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5QmFnTWF0aEhlbHBlcnMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFod70kmBgAAJgYAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBrZXlFUSxtYWtlQ29weVNldCxtdXN0TWF0Y2gsTSxnZXRDb3B5U2V0S2V5cyxzZXRJc1N1cGVyc2V0LHNldERpc2pvaW50VW5pb24sc2V0RGlzam9pbnRTdWJ0cmFjdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlTZXRcIixbJGjNj19hID0+IChtYWtlQ29weVNldCA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIixbJGjNj19hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRozY9fYSldXSxbXCJzZXRJc1N1cGVyc2V0XCIsWyRozY9fYSA9PiAoc2V0SXNTdXBlcnNldCA9ICRozY9fYSldXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsWyRozY9fYSA9PiAoc2V0RGlzam9pbnRVbmlvbiA9ICRozY9fYSldXSxbXCJzZXREaXNqb2ludFN1YnRyYWN0XCIsWyRozY9fYSA9PiAoc2V0RGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01hdGhIZWxwZXJzfSBmcm9tICcuLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge0NvcHlTZXR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJ1xuICovXG5cbi8qKiBAdHlwZSB7Q29weVNldH0gKi9cbmNvbnN0IGVtcHR5ID0gbWFrZUNvcHlTZXQoW10pO1xuXG4vKiogQHR5cGUge01hdGhIZWxwZXJzPENvcHlTZXQ+fSAqL1xuICAgICAgIGNvbnN0IGNvcHlTZXRNYXRoSGVscGVycyA9IGhhcmRlbih7XG4gIGRvQ29lcmNlOiBzZXQgPT4ge1xuICAgIG11c3RNYXRjaChzZXQsIE0uc2V0KCksICdzZXQgb2YgYW1vdW50Jyk7XG4gICAgcmV0dXJuIHNldDtcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IHNldCA9PiBnZXRDb3B5U2V0S2V5cyhzZXQpLmxlbmd0aCA9PT0gMCxcbiAgZG9Jc0dURTogc2V0SXNTdXBlcnNldCxcbiAgZG9Jc0VxdWFsOiBrZXlFUSxcbiAgZG9BZGQ6IHNldERpc2pvaW50VW5pb24sXG4gIGRvU3VidHJhY3Q6IHNldERpc2pvaW50U3VidHJhY3QsXG59KTskaM2PX29uY2UuY29weVNldE1hdGhIZWxwZXJzKGNvcHlTZXRNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5U2V0TWF0aEhlbHBlcnMiOlsiY29weVNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABnzLX7PBgAAzwYAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsibmF0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLE5hdCxpc05hdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXSxbXCJpc05hdFwiLFskaM2PX2EgPT4gKGlzTmF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqIEBpbXBvcnQge01hdGhIZWxwZXJzLCBOYXRWYWx1ZX0gZnJvbSAnLi4vdHlwZXMuanMnICovXG5cbmNvbnN0IGVtcHR5ID0gMG47XG5cbi8qKlxuICogRnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdXNlIHRoZSBuYXRNYXRoSGVscGVycyB0byBtYW5hZ2UgYmFsYW5jZXMgLSB0aGVcbiAqIG9wZXJhdGlvbnMgYXJlIG1lcmVseSBhcml0aG1ldGljIG9uIG5hdHVyYWwsIG5vbi1uZWdhdGl2ZSBudW1iZXJzLlxuICpcbiAqIE5hdHVyYWwgbnVtYmVycyBhcmUgdXNlZCBmb3IgZnVuZ2libGUgZXJpZ2h0cyBzdWNoIGFzIG1vbmV5IGJlY2F1c2Ugcm91bmRpbmdcbiAqIGlzc3VlcyBtYWtlIGZsb2F0cyBwcm9ibGVtYXRpYy4gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGJlIGRvbmUgd2l0aCB0aGVcbiAqIHNtYWxsZXN0IHdob2xlIHVuaXQgc3VjaCB0aGF0IHRoZSBgbmF0TWF0aEhlbHBlcnNgIG5ldmVyIGRlYWxzIHdpdGhcbiAqIGZyYWN0aW9uYWwgcGFydHMuXG4gKlxuICogQHR5cGUge01hdGhIZWxwZXJzPE5hdFZhbHVlPn1cbiAqL1xuICAgICAgIGNvbnN0IG5hdE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IG5hdCA9PiB7XG4gICAgLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuICAgIGFzc2VydC50eXBlb2YobmF0LCAnYmlnaW50Jyk7XG4gICAgaXNOYXQobmF0KSB8fCBGYWlsYHZhbHVlICR7bmF0fSBtdXN0IGJlIGEgbmF0dXJhbCBudW1iZXJgO1xuICAgIHJldHVybiBOYXQobmF0KTtcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IG5hdCA9PiBuYXQgPT09IGVtcHR5LFxuICBkb0lzR1RFOiAobGVmdCwgcmlnaHQpID0+IGxlZnQgPj0gcmlnaHQsXG4gIGRvSXNFcXVhbDogKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ID09PSByaWdodCxcbiAgLyogQmlnSW50cyBkb24ndCBvYnNlcnZhYmx5IG92ZXJmbG93Ki9cbiAgZG9BZGQ6IChsZWZ0LCByaWdodCkgPT4gbGVmdCArIHJpZ2h0LFxuICBkb1N1YnRyYWN0OiAobGVmdCwgcmlnaHQpID0+IE5hdChsZWZ0IC0gcmlnaHQpLFxufSk7JGjNj19vbmNlLm5hdE1hdGhIZWxwZXJzKG5hdE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD3cNf/9BwAA/QcAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJzZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGFzc2VydEtleSxlbGVtZW50c0lzU3VwZXJzZXQsZWxlbWVudHNEaXNqb2ludFVuaW9uLGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCxjb2VyY2VUb0VsZW1lbnRzLGVsZW1lbnRzQ29tcGFyZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsWyRozY9fYSA9PiAoZWxlbWVudHNJc1N1cGVyc2V0ID0gJGjNj19hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLFskaM2PX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRVbmlvbiA9ICRozY9fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIixbJGjNj19hID0+IChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QgPSAkaM2PX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLFskaM2PX2EgPT4gKGNvZXJjZVRvRWxlbWVudHMgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsWyRozY9fYSA9PiAoZWxlbWVudHNDb21wYXJlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7TWF0aEhlbHBlcnMsIFNldFZhbHVlfSBmcm9tICcuLi90eXBlcy5qcycgKi9cblxuLyogT3BlcmF0aW9ucyBmb3IgYXJyYXlzIHdpdGggdW5pcXVlIG9iamVjdHMgaWRlbnRpZnlpbmcgYW5kIHByb3ZpZGluZyovXG4vKiBpbmZvcm1hdGlvbiBhYm91dCBkaWdpdGFsIGFzc2V0cy4gVXNlZCBmb3IgWm9lIGludml0ZXMuKi9cbi8qKiBAdHlwZSB7U2V0VmFsdWV9ICovXG5jb25zdCBlbXB0eSA9IGhhcmRlbihbXSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZSBhcnJheS1iYXNlZCBTZXRNYXRoIHdpdGggQ29weVNldC1iYXNlZCBDb3B5U2V0TWF0aFxuICogQHR5cGUge01hdGhIZWxwZXJzPFNldFZhbHVlPn1cbiAqL1xuICAgICAgIGNvbnN0IHNldE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IGxpc3QgPT4ge1xuICAgIGxpc3QgPSBjb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuICAgIC8qIEFzc2VydCB0aGF0IGxpc3QgY29udGFpbnMgb25seSovXG4gICAgLyogKiBwYXNzLWJ5LWNvcHkgcHJpbWl0aXZlcywqL1xuICAgIC8qICogcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnMgY29udGFpbmluZyBrZXlzLCovXG4gICAgLyogKiByZW1vdGFibGVzLiovXG4gICAgYXNzZXJ0S2V5KGxpc3QpO1xuICAgIHJldHVybiBsaXN0O1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogbGlzdCA9PiBwYXNzU3R5bGVPZihsaXN0KSA9PT0gJ2NvcHlBcnJheScgJiYgbGlzdC5sZW5ndGggPT09IDAsXG4gIGRvSXNHVEU6IGVsZW1lbnRzSXNTdXBlcnNldCxcbiAgZG9Jc0VxdWFsOiAoeCwgeSkgPT4gZWxlbWVudHNDb21wYXJlKHgsIHkpID09PSAwLFxuICBkb0FkZDogZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuICBkb1N1YnRyYWN0OiBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QsXG59KTskaM2PX29uY2Uuc2V0TWF0aEhlbHBlcnMoc2V0TWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0TWF0aEhlbHBlcnMiOlsic2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMnLESlgFAABYBQAAIwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpbml0RW1wdHk7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIixbJGjNj19hID0+IChpbml0RW1wdHkgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtBc3NldEtpbmQsIEJyYW5kLCBQYXltZW50fSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy96b25lJztcbiAqIEBpbXBvcnQge0ludGVyZmFjZUd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKi9cblxuLyogVE9ETyBUeXBlIEludGVyZmFjZUd1YXJkIGJldHRlciB0aGFuIEludGVyZmFjZUd1YXJkPGFueT4qL1xuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtab25lfSBpc3N1ZXJab25lXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQ8YW55Pn0gUGF5bWVudElcbiAqIEByZXR1cm5zIHsoKSA9PiBQYXltZW50PEssIGFueT59XG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUGF5bWVudEtpbmQgPSAoaXNzdWVyWm9uZSwgbmFtZSwgYnJhbmQsIFBheW1lbnRJKSA9PiB7XG4gIGNvbnN0IG1ha2VQYXltZW50ID0gaXNzdWVyWm9uZS5leG9DbGFzcyhcbiAgICBgJHtuYW1lfSBwYXltZW50YCxcbiAgICBQYXltZW50SSxcbiAgICBpbml0RW1wdHksXG4gICAge1xuICAgICAgZ2V0QWxsZWdlZEJyYW5kKCkge1xuICAgICAgICByZXR1cm4gYnJhbmQ7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgW3RhZ10gZm9yIHRhZ2dlZCB0eXBlIG5vdCBkZWZpbmVkIGluIHJ1bnRpbWUqL1xuICByZXR1cm4gbWFrZVBheW1lbnQ7XG59OyRozY9fb25jZS5wcmVwYXJlUGF5bWVudEtpbmQocHJlcGFyZVBheW1lbnRLaW5kKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudEtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRLaW5kIjpbInByZXBhcmVQYXltZW50S2luZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADYJ0h2vjYAAL42AAApAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9wYXR0ZXJucyIsIi4vYW1vdW50TWF0aC5qcyIsIi4vcGF5bWVudC5qcyIsIi4vcHVyc2UuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudExlZGdlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbCxhbm5vdGF0ZUVycm9yLFgsaXNQcm9taXNlLG11c3RNYXRjaCxNLGtleUVRLEFtb3VudE1hdGgscHJlcGFyZVBheW1lbnRLaW5kLHByZXBhcmVQdXJzZUtpbmQsQnJhbmRJLG1ha2VJc3N1ZXJJbnRlcmZhY2VzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiLi9wYXltZW50LmpzXCIsIFtbXCJwcmVwYXJlUGF5bWVudEtpbmRcIixbJGjNj19hID0+IChwcmVwYXJlUGF5bWVudEtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL3B1cnNlLmpzXCIsIFtbXCJwcmVwYXJlUHVyc2VLaW5kXCIsWyRozY9fYSA9PiAocHJlcGFyZVB1cnNlS2luZCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQnJhbmRJXCIsWyRozY9fYSA9PiAoQnJhbmRJID0gJGjNj19hKV1dLFtcIm1ha2VJc3N1ZXJJbnRlcmZhY2VzXCIsWyRozY9fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXksIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtTaHV0ZG93bldpdGhGYWlsdXJlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LXZhdCc7XG4gKiBAaW1wb3J0IHtBbW91bnRTdG9yZX0gZnJvbSAnLi9hbW91bnRTdG9yZS5qcyc7XG4gKiBAaW1wb3J0IHtBbW91bnQsIEFzc2V0S2luZCwgRGlzcGxheUluZm8sIFBheW1lbnRMZWRnZXIsIFBheW1lbnQsIEJyYW5kLCBSZWNvdmVyeVNldHNPcHRpb24sIFB1cnNlLCBJc3N1ZXIsIE1pbnR9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7V2Vha01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqIEBpbXBvcnQge1NldFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHBhcmFtIHtLfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKiBAcmV0dXJucyB7VHlwZWRQYXR0ZXJuPEFtb3VudDxLPj59XG4gKi9cbmNvbnN0IGFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZSA9IChicmFuZCwgYXNzZXRLaW5kLCBlbGVtZW50U2hhcGUpID0+IHtcbiAgbGV0IHZhbHVlU2hhcGU7XG4gIHN3aXRjaCAoYXNzZXRLaW5kKSB7XG4gICAgY2FzZSAnbmF0Jzoge1xuICAgICAgdmFsdWVTaGFwZSA9IE0ubmF0KCk7XG4gICAgICBlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYEZ1bmdpYmxlIGFzc2V0cyBjYW5ub3QgaGF2ZSBhbiBlbGVtZW50U2hhcGU6ICR7cShlbGVtZW50U2hhcGUpfWA7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnc2V0Jzoge1xuICAgICAgaWYgKGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLmFycmF5T2YoTS5rZXkoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5hcnJheU9mKE0uYW5kKE0ua2V5KCksIGVsZW1lbnRTaGFwZSkpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICBpZiAoZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uc2V0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5zZXRPZihlbGVtZW50U2hhcGUpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICBpZiAoZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYmFnKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5iYWdPZihlbGVtZW50U2hhcGUpO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIEZhaWxgdW5leHBlY3RlZCBhc3NldCBraW5kICR7cShhc3NldEtpbmQpfWA7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYW1vdW50U2hhcGUgPSBoYXJkZW4oe1xuICAgIGJyYW5kLCAvKiBtYXRjaGVzIG9ubHkgdGhpcyBleGFjdCBicmFuZCovXG4gICAgdmFsdWU6IHZhbHVlU2hhcGUsXG4gIH0pO1xuICByZXR1cm4gYW1vdW50U2hhcGU7XG59O1xuXG4vKipcbiAqIE1ha2UgdGhlIHBheW1lbnRMZWRnZXIsIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBiYWxhbmNlcyBvZiBwYXltZW50cy4gQWxsXG4gKiBtaW50aW5nIGFuZCB0cmFuc2ZlciBhdXRob3JpdHkgb3JpZ2luYXRlcyBoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge1pvbmV9IGlzc3VlclpvbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IGFzc2V0S2luZFxuICogQHBhcmFtIHtEaXNwbGF5SW5mbzxLPn0gZGlzcGxheUluZm9cbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKiBAcGFyYW0ge1JlY292ZXJ5U2V0c09wdGlvbn0gcmVjb3ZlcnlTZXRzU3RhdGVcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdXG4gKiBAcmV0dXJucyB7UGF5bWVudExlZGdlcjxLPn1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVQYXltZW50TGVkZ2VyID0gKFxuICBpc3N1ZXJab25lLFxuICBuYW1lLFxuICBhc3NldEtpbmQsXG4gIGRpc3BsYXlJbmZvLFxuICBlbGVtZW50U2hhcGUsXG4gIHJlY292ZXJ5U2V0c1N0YXRlLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIC8qKiBAdHlwZSB7QnJhbmQ8Sz59ICovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIGNhbGxXaGVuKi9cbiAgY29uc3QgYnJhbmQgPSBpc3N1ZXJab25lLmV4byhgJHtuYW1lfSBicmFuZGAsIEJyYW5kSSwge1xuICAgIGlzTXlJc3N1ZXIoYWxsZWdlZElzc3Vlcikge1xuICAgICAgLyogQnJhbmRJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBhbGxlZ2VkSXNzdWVyYCBpcyBhIFJlbW90YWJsZSovXG4gICAgICByZXR1cm4gYWxsZWdlZElzc3VlciA9PT0gaXNzdWVyO1xuICAgIH0sXG4gICAgZ2V0QWxsZWdlZE5hbWUoKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIC8qIEdpdmUgaW5mb3JtYXRpb24gdG8gVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC4qL1xuICAgIGdldERpc3BsYXlJbmZvKCkge1xuICAgICAgcmV0dXJuIGRpc3BsYXlJbmZvO1xuICAgIH0sXG4gICAgZ2V0QW1vdW50U2hhcGUoKSB7XG4gICAgICByZXR1cm4gYW1vdW50U2hhcGU7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgYW1vdW50U2hhcGUgPSBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG4gICAgYnJhbmQsXG4gICAgYXNzZXRLaW5kLFxuICAgIGVsZW1lbnRTaGFwZSxcbiAgKTtcblxuICBjb25zdCB7IElzc3VlckksIE1pbnRJLCBQYXltZW50SSwgUHVyc2VJS2l0IH0gPSBtYWtlSXNzdWVySW50ZXJmYWNlcyhcbiAgICBicmFuZCxcbiAgICBhc3NldEtpbmQsXG4gICAgYW1vdW50U2hhcGUsXG4gICk7XG5cbiAgY29uc3QgbWFrZVBheW1lbnQgPSBwcmVwYXJlUGF5bWVudEtpbmQoaXNzdWVyWm9uZSwgbmFtZSwgYnJhbmQsIFBheW1lbnRJKTtcblxuICAvKiogQHR5cGUge1NodXRkb3duV2l0aEZhaWx1cmV9ICovXG4gIGNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUgPSByZWFzb24gPT4ge1xuICAgIC8qIFRPRE8gVGhpcyBzaG91bGQgYWxzbyBkZXN0cm95IGxlZGdlciBzdGF0ZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzQqL1xuICAgIGlmIChvcHRTaHV0ZG93bldpdGhGYWlsdXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUocmVhc29uKTtcbiAgICAgIH0gY2F0Y2ggKGVyckluU2h1dGRvd24pIHtcbiAgICAgICAgYW5ub3RhdGVFcnJvcihlcnJJblNodXRkb3duLCBYYENhdXNlZCBieTogJHtyZWFzb259YCk7XG4gICAgICAgIHRocm93IGVyckluU2h1dGRvd247XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IHJlYXNvbjtcbiAgfTtcblxuICAvKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBBbW91bnQ+fSAqL1xuICBjb25zdCBwYXltZW50TGVkZ2VyID0gaXNzdWVyWm9uZS53ZWFrTWFwU3RvcmUoJ3BheW1lbnRMZWRnZXInLCB7XG4gICAgdmFsdWVTaGFwZTogYW1vdW50U2hhcGUsXG4gIH0pO1xuXG4gIC8qKlxuICogQSAobm9uLWVtcHR5KSB3aXRoZHJhd24gbGl2ZSBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjb3Zlcnkgc2V0IG9mXG4gKiB0aGUgcHVyc2UgaXQgd2FzIHdpdGhkcmF3biBmcm9tLiBMZXQncyBjYWxsIHRoZXNlIFwicmVjb3ZlcmFibGVcIiBwYXltZW50cy5cbiAqIEFsbCByZWNvdmVyYWJsZSBwYXltZW50cyBhcmUgbGl2ZSwgYnV0IG5vdCBhbGwgbGl2ZSBwYXltZW50cyBhcmVcbiAqIHJlY292ZXJhYmxlLiBXZSBkbyB0aGUgYm9va2tlZXBpbmcgZm9yIHBheW1lbnQgcmVjb3Zlcnkgd2l0aCB0aGlzIHdlYWttYXBcbiAqIGZyb20gcmVjb3ZlcmFibGUgcGF5bWVudHMgdG8gdGhlIHJlY292ZXJ5IHNldCB0aGV5IGFyZSBpbi4gQSBidW5jaCBvZlxuICogaW50ZXJlc3RpbmcgaW52YXJpYW50cyBoZXJlOlxuICpcbiAqIC0gRXZlcnkgcGF5bWVudCB0aGF0IGlzIGEga2V5IGluIHRoZSBvdXRlciBgcGF5bWVudFJlY292ZXJ5U2V0c2Agd2Vha01hcCBpc1xuICogICBhbHNvIGluIHRoZSByZWNvdmVyeSBzZXQgaW5kZXhlZCBieSB0aGF0IHBheW1lbnQuXG4gKiAtIEltcGxpZWQgYnkgdGhlIGFib3ZlIGJ1dCB3b3J0aCBzdGF0aW5nOiB0aGUgcGF5bWVudCBpcyBvbmx5IGluIGF0IG1vc3Qgb25lXG4gKiAgIHJlY292ZXJ5IHNldC5cbiAqIC0gQSByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBzdWNoIHBheW1lbnRzLlxuICogLSBFdmVyeSBwdXJzZSBpcyBhc3NvY2lhdGVkIHdpdGggZXhhY3RseSBvbmUgcmVjb3Zlcnkgc2V0IHVuaXF1ZSB0byBpdC5cbiAqIC0gQSBwdXJzZSdzIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tIHRoYXQgcHVyc2UgYW5kXG4gKiAgIG5vdCB5ZXQgY29uc3VtZWQuXG4gKlxuICogSWYgYHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnYCwgdGhlbiBub3RoaW5nIHNob3VsZCBldmVyIGJlXG4gKiBhZGRlZCB0byB0aGlzIFdlYWtTdG9yZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcFN0b3JlPFBheW1lbnQsIFNldFN0b3JlPFBheW1lbnQ+Pn1cbiAqL1xuICBjb25zdCBwYXltZW50UmVjb3ZlcnlTZXRzID0gaXNzdWVyWm9uZS53ZWFrTWFwU3RvcmUoJ3BheW1lbnRSZWNvdmVyeVNldHMnKTtcblxuICAvKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgaW5pdFBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5IGNhbGwgdG8gYHBheW1lbnRMZWRnZXIuaW5pdGAuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSBbb3B0UmVjb3ZlcnlTZXRdXG4gKi9cbiAgY29uc3QgaW5pdFBheW1lbnQgPSAocGF5bWVudCwgYW1vdW50LCBvcHRSZWNvdmVyeVNldCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGlmIChyZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJykge1xuICAgICAgb3B0UmVjb3ZlcnlTZXQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYHdoZW4gcmVjb3ZlclNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJywgb3B0UmVjb3ZlcnlTZXQgbXVzdCBiZSBlbXB0eWA7XG4gICAgfVxuICAgIGlmIChvcHRSZWNvdmVyeVNldCAhPT0gdW5kZWZpbmVkICYmICFBbW91bnRNYXRoLmlzRW1wdHkoYW1vdW50KSkge1xuICAgICAgb3B0UmVjb3ZlcnlTZXQuYWRkKHBheW1lbnQpO1xuICAgICAgcGF5bWVudFJlY292ZXJ5U2V0cy5pbml0KHBheW1lbnQsIG9wdFJlY292ZXJ5U2V0KTtcbiAgICB9XG4gICAgcGF5bWVudExlZGdlci5pbml0KHBheW1lbnQsIGFtb3VudCk7XG4gIH07XG5cbiAgLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGRlbGV0ZVBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5IGNhbGwgdG8gYHBheW1lbnRMZWRnZXIuZGVsZXRlYC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqL1xuICBjb25zdCBkZWxldGVQYXltZW50ID0gcGF5bWVudCA9PiB7XG4gICAgcGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG4gICAgaWYgKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKSB7XG4gICAgICBjb25zdCByZWNvdmVyeVNldCA9IHBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xuICAgICAgcGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG4gICAgICByZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qKiBAdHlwZSB7KGFsbGVnZWRBbW91bnQ6IEFtb3VudCkgPT4gQW1vdW50fSAqL1xuICBjb25zdCBjb2VyY2UgPSBhbGxlZ2VkQW1vdW50ID0+IEFtb3VudE1hdGguY29lcmNlKGJyYW5kLCBhbGxlZ2VkQW1vdW50KTtcbiAgLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBib29sZWFufSAqL1xuXG4gIC8qKlxuICogTWV0aG9kcyBsaWtlIGRlcG9zaXQoKSBoYXZlIGFuIG9wdGlvbmFsIHNlY29uZCBwYXJhbWV0ZXIgYG9wdEFtb3VudFNoYXBlYFxuICogd2hpY2gsIGlmIHByZXNlbnQsIGlzIHN1cHBvc2VkIHRvIG1hdGNoIHRoZSBiYWxhbmNlIG9mIHRoZSBwYXltZW50LiBUaGlzXG4gKiBoZWxwZXIgZnVuY3Rpb24gZG9lcyB0aGF0IGNoZWNrLlxuICpcbiAqIE5vdGU6IGBvcHRBbW91bnRTaGFwZWAgaXMgdXNlci1zdXBwbGllZCB3aXRoIG5vIHByZXZpb3VzIHZhbGlkYXRpb24uXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IHBheW1lbnRCYWxhbmNlXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gIGNvbnN0IGFzc2VydEFtb3VudENvbnNpc3RlbnQgPSAocGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlKSA9PiB7XG4gICAgaWYgKG9wdEFtb3VudFNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChwYXltZW50QmFsYW5jZSwgb3B0QW1vdW50U2hhcGUsICdhbW91bnQnKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gIGNvbnN0IGFzc2VydExpdmVQYXltZW50ID0gcGF5bWVudCA9PiB7XG4gICAgcGF5bWVudExlZGdlci5oYXMocGF5bWVudCkgfHxcbiAgICAgIEZhaWxgJHtwYXltZW50fSB3YXMgbm90IGEgbGl2ZSBwYXltZW50IGZvciBicmFuZCAke3EoXG4gICAgICAgIGJyYW5kLFxuICAgICAgKX0uIEl0IGNvdWxkIGJlIGEgdXNlZC11cCBwYXltZW50LCBhIHBheW1lbnQgZm9yIGFub3RoZXIgYnJhbmQsIG9yIGl0IG1pZ2h0IG5vdCBiZSBhIHBheW1lbnQgYXQgYWxsLmA7XG4gIH07XG5cbiAgLyoqXG4gKiBVc2VkIGJ5IHRoZSBwdXJzZSBjb2RlIHRvIGltcGxlbWVudCBwdXJzZS5kZXBvc2l0XG4gKlxuICogQHBhcmFtIHtBbW91bnRTdG9yZX0gYmFsYW5jZVN0b3JlXG4gKiBAcGFyYW0ge1BheW1lbnR9IHNyY1BheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuICBjb25zdCBkZXBvc2l0SW50ZXJuYWwgPSAoXG4gICAgYmFsYW5jZVN0b3JlLFxuICAgIHNyY1BheW1lbnQsXG4gICAgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgICFpc1Byb21pc2Uoc3JjUGF5bWVudCkgfHxcbiAgICAgIGFzc2VydC5mYWlsKFxuICAgICAgICBgZGVwb3NpdCBkb2VzIG5vdCBhY2NlcHQgcHJvbWlzZXMgYXMgZmlyc3QgYXJndW1lbnQuIEluc3RlYWQgb2YgcGFzc2luZyB0aGUgcHJvbWlzZSAoZGVwb3NpdChwYXltZW50UHJvbWlzZSkpLCBjb25zaWRlciB1bndyYXBwaW5nIHRoZSBwcm9taXNlIGZpcnN0OiBFLndoZW4ocGF5bWVudFByb21pc2UsIChhY3R1YWxQYXltZW50ID0+IGRlcG9zaXQoYWN0dWFsUGF5bWVudCkpYCxcbiAgICAgICAgVHlwZUVycm9yLFxuICAgICAgKTtcbiAgICBhc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbiAgICBjb25zdCBzcmNQYXltZW50QmFsYW5jZSA9IHBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuICAgIGFzc2VydEFtb3VudENvbnNpc3RlbnQoc3JjUGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlKTtcbiAgICB0cnkge1xuICAgICAgLyogQ09NTUlUIFBPSU5UKi9cbiAgICAgIC8qIE1vdmUgdGhlIGFzc2V0cyBpbiBgc3JjUGF5bWVudGAgaW50byB0aGlzIHB1cnNlLCB1c2luZyB1cCB0aGUqL1xuICAgICAgLyogc291cmNlIHBheW1lbnQsIHN1Y2ggdGhhdCB0b3RhbCBhc3NldHMgYXJlIGNvbnNlcnZlZC4qL1xuICAgICAgZGVsZXRlUGF5bWVudChzcmNQYXltZW50KTtcbiAgICAgIGJhbGFuY2VTdG9yZS5pbmNyZW1lbnQoc3JjUGF5bWVudEJhbGFuY2UpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gIH07XG5cbiAgLyoqXG4gKiBVc2VkIGJ5IHRoZSBwdXJzZSBjb2RlIHRvIGltcGxlbWVudCBwdXJzZS53aXRoZHJhd1xuICpcbiAqIEBwYXJhbSB7QW1vdW50U3RvcmV9IGJhbGFuY2VTdG9yZVxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAtIHRoZSBhbW91bnQgdG8gYmUgd2l0aGRyYXduXG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSBbcmVjb3ZlcnlTZXRdXG4gKiBAcmV0dXJucyB7UGF5bWVudH1cbiAqL1xuICBjb25zdCB3aXRoZHJhd0ludGVybmFsID0gKGJhbGFuY2VTdG9yZSwgYW1vdW50LCByZWNvdmVyeVNldCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFtb3VudCA9IGNvZXJjZShhbW91bnQpO1xuICAgIGNvbnN0IHBheW1lbnQgPSBtYWtlUGF5bWVudCgpO1xuICAgIC8qIENPTU1JVCBQT0lOVCBNb3ZlIHRoZSB3aXRoZHJhd24gYXNzZXRzIGZyb20gdGhpcyBwdXJzZSBpbnRvKi9cbiAgICAvKiBwYXltZW50LiBUb3RhbCBhc3NldHMgbXVzdCByZW1haW4gY29uc2VydmVkLiovXG4gICAgYmFsYW5jZVN0b3JlLmRlY3JlbWVudChhbW91bnQpIHx8XG4gICAgICBGYWlsYFdpdGhkcmF3YWwgb2YgJHthbW91bnR9IGZhaWxlZCBiZWNhdXNlIHRoZSBwdXJzZSBvbmx5IGNvbnRhaW5lZCAke2JhbGFuY2VTdG9yZS5nZXRBbW91bnQoKX1gO1xuICAgIHRyeSB7XG4gICAgICBpbml0UGF5bWVudChwYXltZW50LCBhbW91bnQsIHJlY292ZXJ5U2V0KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIHBheW1lbnQ7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsoKSA9PiBQdXJzZTxLPn0gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggYW1vdW50IGtpbmRzKi9cbiAgY29uc3QgbWFrZUVtcHR5UHVyc2UgPSBwcmVwYXJlUHVyc2VLaW5kKFxuICAgIGlzc3VlclpvbmUsXG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgYnJhbmQsXG4gICAgUHVyc2VJS2l0LFxuICAgIGhhcmRlbih7XG4gICAgICBkZXBvc2l0SW50ZXJuYWwsXG4gICAgICB3aXRoZHJhd0ludGVybmFsLFxuICAgIH0pLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIHBheW1lbnRSZWNvdmVyeVNldHMsXG4gICk7XG5cbiAgLyoqIEB0eXBlIHtJc3N1ZXI8Sz59ICovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIGNhbGxXaGVuKi9cbiAgY29uc3QgaXNzdWVyID0gaXNzdWVyWm9uZS5leG8oYCR7bmFtZX0gaXNzdWVyYCwgSXNzdWVySSwge1xuICAgIGdldEJyYW5kKCkge1xuICAgICAgcmV0dXJuIGJyYW5kO1xuICAgIH0sXG4gICAgZ2V0QWxsZWdlZE5hbWUoKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIGdldEFzc2V0S2luZCgpIHtcbiAgICAgIHJldHVybiBhc3NldEtpbmQ7XG4gICAgfSxcbiAgICBnZXREaXNwbGF5SW5mbygpIHtcbiAgICAgIHJldHVybiBkaXNwbGF5SW5mbztcbiAgICB9LFxuICAgIG1ha2VFbXB0eVB1cnNlKCkge1xuICAgICAgcmV0dXJuIG1ha2VFbXB0eVB1cnNlKCk7XG4gICAgfSxcbiAgICAvKiogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW4gKi9cbiAgICBpc0xpdmUocGF5bWVudCkge1xuICAgICAgLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuICAgICAgcmV0dXJuIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpO1xuICAgIH0sXG4gICAgLyoqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudCBhd2FpdGVkIGJ5IGNhbGxXaGVuICovXG4gICAgZ2V0QW1vdW50T2YocGF5bWVudCkge1xuICAgICAgLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuICAgICAgYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG4gICAgICByZXR1cm4gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudCBhd2FpdGVkIGJ5IGNhbGxXaGVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IG9wdEFtb3VudFNoYXBlXG4gKi9cbiAgICBidXJuKHBheW1lbnQsIG9wdEFtb3VudFNoYXBlID0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG4gICAgICBhc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbiAgICAgIGNvbnN0IHBheW1lbnRCYWxhbmNlID0gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gICAgICBhc3NlcnRBbW91bnRDb25zaXN0ZW50KHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSk7XG4gICAgICB0cnkge1xuICAgICAgICAvKiBDT01NSVQgUE9JTlQuKi9cbiAgICAgICAgZGVsZXRlUGF5bWVudChwYXltZW50KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXltZW50QmFsYW5jZTtcbiAgICB9LFxuICB9KTtcblxuICAvKipcbiAqIFByb3ZpZGVzIGZvciB0aGUgcmVjb3Zlcnkgb2YgbmV3bHkgbWludGVkIGJ1dCBub3QteWV0LWRlcG9zaXRlZCBwYXltZW50cy5cbiAqXG4gKiBCZWNhdXNlIHRoZSBgbWludFJlY292ZXJ5UHVyc2VgIGlzIHBsYWNlZCBpbiBiYWdnYWdlLCBldmVuIGlmIHRoZSBjYWxsZXIgb2ZcbiAqIGBtYWtlSXNzdWVyS2l0YCBkcm9wcyBpdCBvbiB0aGUgZmxvb3IsIGl0IGNhbiBzdGlsbCBiZSByZWNvdmVyZWQgaW4gYW5cbiAqIGVtZXJnZW5jeSB1cGdyYWRlLlxuICovXG4gIGNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlID0gLyoqIEB0eXBlIHtQdXJzZTxLPn0gKi8gKFxuICAgIGlzc3VlclpvbmUubWFrZU9uY2UoJ21pbnRSZWNvdmVyeVB1cnNlJywgKCkgPT4gbWFrZUVtcHR5UHVyc2UoKSlcbiAgKTtcblxuICAvKiogQHR5cGUge01pbnQ8Sz59ICovXG4gIGNvbnN0IG1pbnQgPSBpc3N1ZXJab25lLmV4byhgJHtuYW1lfSBtaW50YCwgTWludEksIHtcbiAgICBnZXRJc3N1ZXIoKSB7XG4gICAgICByZXR1cm4gaXNzdWVyO1xuICAgIH0sXG4gICAgbWludFBheW1lbnQobmV3QW1vdW50KSB7XG4gICAgICBuZXdBbW91bnQgPSBjb2VyY2UobmV3QW1vdW50KTtcbiAgICAgIG11c3RNYXRjaChuZXdBbW91bnQsIGFtb3VudFNoYXBlLCAnbWludGVkIGFtb3VudCcpO1xuICAgICAgLyogYHJhd1BheW1lbnRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHJlY292ZXJ5IHNldCwgYW5kKi9cbiAgICAgIC8qIHNvIG11c3Qgbm90IGVzY2FwZS4qL1xuICAgICAgY29uc3QgcmF3UGF5bWVudCA9IG1ha2VQYXltZW50KCk7XG4gICAgICBpbml0UGF5bWVudChyYXdQYXltZW50LCBuZXdBbW91bnQsIHVuZGVmaW5lZCk7XG5cbiAgICAgIGNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlQmVmb3JlID0gbWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xuICAgICAgbWludFJlY292ZXJ5UHVyc2UuZGVwb3NpdChyYXdQYXltZW50LCBuZXdBbW91bnQpO1xuICAgICAgY29uc3QgcGF5bWVudCA9IG1pbnRSZWNvdmVyeVB1cnNlLndpdGhkcmF3KG5ld0Ftb3VudCk7XG4gICAgICBjb25zdCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyID0gbWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xuICAgICAgYXNzZXJ0KGtleUVRKG1pbnRSZWNvdmVyeVB1cnNlQmVmb3JlLCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyKSk7XG4gICAgICByZXR1cm4gcGF5bWVudDtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBpc3N1ZXJLaXQgPSBoYXJkZW4oeyBpc3N1ZXIsIG1pbnQsIGJyYW5kLCBtaW50UmVjb3ZlcnlQdXJzZSB9KTtcbiAgcmV0dXJuIGlzc3VlcktpdDtcbn07JGjNj19vbmNlLnByZXBhcmVQYXltZW50TGVkZ2VyKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudExlZGdlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUGF5bWVudExlZGdlciI6WyJwcmVwYXJlUGF5bWVudExlZGdlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+IJ6JlxwAAJccAAAhAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3B1cnNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwiLi9hbW91bnRTdG9yZS5qcyJdLCJleHBvcnRzIjpbInByZXBhcmVQdXJzZUtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLE0sbWFrZUNvcHlTZXQsQW1vdW50TWF0aCxtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQsbWFrZUFtb3VudFN0b3JlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiLi90cmFuc2llbnROb3RpZmllci5qc1wiLCBbW1wibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0XCIsWyRozY9fYSA9PiAobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRTdG9yZS5qc1wiLCBbW1wibWFrZUFtb3VudFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZUFtb3VudFN0b3JlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0Fzc2V0S2luZCwgUmVjb3ZlcnlTZXRzT3B0aW9uLCBCcmFuZCwgUGF5bWVudH0gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvem9uZSc7XG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VHdWFyZH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7V2Vha01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqIEBpbXBvcnQge1NldFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqL1xuXG5jb25zdCBFTVBUWV9DT1BZX1NFVCA9IG1ha2VDb3B5U2V0KFtdKTtcblxuLyogVE9ETyBUeXBlIEludGVyZmFjZUd1YXJkIGJldHRlciB0aGFuIEludGVyZmFjZUd1YXJkPGFueT4qL1xuLyoqXG4gKiBAcGFyYW0ge1pvbmV9IGlzc3VlclpvbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHBhcmFtIHt7XG4gKiAgIHB1cnNlOiBJbnRlcmZhY2VHdWFyZDxhbnk+O1xuICogICBkZXBvc2l0RmFjZXQ6IEludGVyZmFjZUd1YXJkPGFueT47XG4gKiB9fSBQdXJzZUlLaXRcbiAqIEBwYXJhbSB7e1xuICogICBkZXBvc2l0SW50ZXJuYWw6IGFueTtcbiAqICAgd2l0aGRyYXdJbnRlcm5hbDogYW55O1xuICogfX0gcHVyc2VNZXRob2RzXG4gKiBAcGFyYW0ge1JlY292ZXJ5U2V0c09wdGlvbn0gcmVjb3ZlcnlTZXRzU3RhdGVcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPFBheW1lbnQsIFNldFN0b3JlPFBheW1lbnQ+Pn0gcGF5bWVudFJlY292ZXJ5U2V0c1xuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVB1cnNlS2luZCA9IChcbiAgaXNzdWVyWm9uZSxcbiAgbmFtZSxcbiAgYXNzZXRLaW5kLFxuICBicmFuZCxcbiAgUHVyc2VJS2l0LFxuICBwdXJzZU1ldGhvZHMsXG4gIHJlY292ZXJ5U2V0c1N0YXRlLFxuICBwYXltZW50UmVjb3ZlcnlTZXRzLFxuKSA9PiB7XG4gIGNvbnN0IGFtb3VudFNoYXBlID0gYnJhbmQuZ2V0QW1vdW50U2hhcGUoKTtcblxuICAvKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbiAgLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG4gIC8qIFRPRE8gcHJvcGFnYXRlIHpvbmlmeWluZyB0byBub3RpZmllcnMsIG1heWJlPyovXG4gIGNvbnN0IHsgcHJvdmlkZU5vdGlmaWVyLCB1cGRhdGU6IHVwZGF0ZUJhbGFuY2UgfSA9IG1ha2VUcmFuc2llbnROb3RpZmllcktpdCgpO1xuXG4gIC8qKlxuICogSWYgYHJlY292ZXJ5U2V0c1N0YXRlID09PSAnaGFzUmVjb3ZlcnlTZXRzJ2AgKHRoZSBub3JtYWwgc3RhdGUpLCB0aGVuIGp1c3RcbiAqIHJldHVybiBgc3RhdGUucmVjb3ZlcnlTZXRgLlxuICpcbiAqIElmIGByZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJ2AsIHJldHVybiBgdW5kZWZpbmVkYC4gQ2FsbGVyc1xuICogbXVzdCBiZSBhd2FyZSB0aGF0IHRoZSBgdW5kZWZpbmVkYCByZXR1cm4gaGFwcGVucyBpZmYgYHJlY292ZXJ5U2V0c1N0YXRlXG4gKiA9PT0gJ25vUmVjb3ZlcnlTZXRzJ2AsIGFuZCB0byBhdm9pZCBzdG9yaW5nIG9yIHJldHJpZXZpbmcgYW55dGhpbmcgZnJvbSB0aGVcbiAqIGFjdHVhbCByZWNvdmVyeSBzZXQuXG4gKlxuICogQHBhcmFtIHt7IHJlY292ZXJ5U2V0OiBTZXRTdG9yZTxQYXltZW50PiB9fSBzdGF0ZVxuICogQHJldHVybnMge1NldFN0b3JlPFBheW1lbnQ+IHwgdW5kZWZpbmVkfVxuICovXG4gIGNvbnN0IG1heWJlUmVjb3ZlcnlTZXQgPSBzdGF0ZSA9PiB7XG4gICAgY29uc3QgeyByZWNvdmVyeVNldCB9ID0gc3RhdGU7XG4gICAgaWYgKHJlY292ZXJ5U2V0c1N0YXRlID09PSAnaGFzUmVjb3ZlcnlTZXRzJykge1xuICAgICAgcmV0dXJuIHJlY292ZXJ5U2V0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJyB8fFxuICAgICAgICBGYWlsYHJlY292ZXJTZXRzU3RhdGUgbXVzdCBiZSBub1JlY292ZXJ5U2V0cyBpZiBpdCBpc24ndCBoYXNSZWNvdmVyU2V0c2A7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBwYXltZW50UmVjb3ZlcnlTZXRzIG11c3QgYWx3YXlzIGJlIGRlZmluZWRgO1xuICAgICAgcmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpID09PSAwIHx8XG4gICAgICAgIEZhaWxgV2l0aCBub1JlY292ZXJ5U2V0cywgcmVjb3ZlcnlTZXQgbXVzdCBiZSBlbXB0eWA7XG5cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qIC0gVGhpcyBraW5kIGlzIGEgcGFpciBvZiBwdXJzZSBhbmQgZGVwb3NpdEZhY2V0IHRoYXQgaGF2ZSBhIDE6MSovXG4gIC8qIGNvcnJlc3BvbmRlbmNlLiovXG4gIC8qIC0gVGhleSBhcmUgdmlydHVhbGl6ZWQgdG9nZXRoZXIgdG8gc2hhcmUgYSBzaW5nbGUgc3RhdGUgcmVjb3JkLiovXG4gIC8qIC0gQW4gYWx0ZXJuYXRpdmUgZGVzaWduIGNvbnNpZGVyZWQgd2FzIHRvIGhhdmUgdGhpcyByZXR1cm4gYSBQdXJzZSBhbG9uZSovXG4gIC8qIHRoYXQgY3JlYXRlZCBkZXBvc2l0RmFjZXQgYXMgbmVlZGVkLiBCdXQgdGhpcyBhcHByb2FjaCBlbnN1cmVzIGEgY29uc3RhbnQqL1xuICAvKiBpZGVudGl0eSBmb3IgdGhlIGZhY2V0IGFuZCBleGVyY2lzZXMgdGhlIG11bHRpLWZhY2V0ZWQgb2JqZWN0IHN0eWxlLiovXG4gIGNvbnN0IHsgZGVwb3NpdEludGVybmFsLCB3aXRoZHJhd0ludGVybmFsIH0gPSBwdXJzZU1ldGhvZHM7XG4gIGNvbnN0IG1ha2VQdXJzZUtpdCA9IGlzc3VlclpvbmUuZXhvQ2xhc3NLaXQoXG4gICAgYCR7bmFtZX0gUHVyc2VgLFxuICAgIFB1cnNlSUtpdCxcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50QmFsYW5jZSA9IEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLCBhc3NldEtpbmQpO1xuXG4gICAgICAvKiogQHR5cGUge1NldFN0b3JlPFBheW1lbnQ+fSAqL1xuICAgICAgY29uc3QgcmVjb3ZlcnlTZXQgPSBpc3N1ZXJab25lLmRldGFjaGVkKCkuc2V0U3RvcmUoJ3JlY292ZXJ5IHNldCcpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjdXJyZW50QmFsYW5jZSxcbiAgICAgICAgcmVjb3ZlcnlTZXQsXG4gICAgICB9O1xuICAgIH0sXG4gICAge1xuICAgICAgcHVyc2U6IHtcbiAgICAgICAgZGVwb3NpdChzcmNQYXltZW50LCBvcHRBbW91bnRTaGFwZSA9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4gICAgICAgICAgLyogU2VlIHRoZSBjb21tZW50cyBvbiBQdXJzZUkuZGVwb3NpdCBpbiB0eXBlR3VhcmRzLmpzKi9cbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgcHVyc2UgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2VTdG9yZSA9IG1ha2VBbW91bnRTdG9yZShzdGF0ZSwgJ2N1cnJlbnRCYWxhbmNlJyk7XG4gICAgICAgICAgLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIGRlcG9zaXQuKi9cbiAgICAgICAgICBjb25zdCBzcmNQYXltZW50QmFsYW5jZSA9IGRlcG9zaXRJbnRlcm5hbChcbiAgICAgICAgICAgIGJhbGFuY2VTdG9yZSxcbiAgICAgICAgICAgIHNyY1BheW1lbnQsXG4gICAgICAgICAgICBvcHRBbW91bnRTaGFwZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZUJhbGFuY2UocHVyc2UsIGJhbGFuY2VTdG9yZS5nZXRBbW91bnQoKSk7XG4gICAgICAgICAgcmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuICAgICAgICB9LFxuICAgICAgICB3aXRoZHJhdyhhbW91bnQpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgcHVyc2UgfSA9IHRoaXMuZmFjZXRzO1xuXG4gICAgICAgICAgY29uc3Qgb3B0UmVjb3ZlcnlTZXQgPSBtYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbiAgICAgICAgICBjb25zdCBiYWxhbmNlU3RvcmUgPSBtYWtlQW1vdW50U3RvcmUoc3RhdGUsICdjdXJyZW50QmFsYW5jZScpO1xuICAgICAgICAgIC8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiB3aXRoZHJhdy4qL1xuICAgICAgICAgIGNvbnN0IHBheW1lbnQgPSB3aXRoZHJhd0ludGVybmFsKFxuICAgICAgICAgICAgYmFsYW5jZVN0b3JlLFxuICAgICAgICAgICAgYW1vdW50LFxuICAgICAgICAgICAgb3B0UmVjb3ZlcnlTZXQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB1cGRhdGVCYWxhbmNlKHB1cnNlLCBiYWxhbmNlU3RvcmUuZ2V0QW1vdW50KCkpO1xuICAgICAgICAgIHJldHVybiBwYXltZW50O1xuICAgICAgICB9LFxuICAgICAgICBnZXRDdXJyZW50QW1vdW50KCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgYmFsYW5jZVN0b3JlID0gbWFrZUFtb3VudFN0b3JlKHN0YXRlLCAnY3VycmVudEJhbGFuY2UnKTtcbiAgICAgICAgICByZXR1cm4gYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRDdXJyZW50QW1vdW50Tm90aWZpZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIHByb3ZpZGVOb3RpZmllcih0aGlzLmZhY2V0cy5wdXJzZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEFsbGVnZWRCcmFuZCgpIHtcbiAgICAgICAgICByZXR1cm4gYnJhbmQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0RGVwb3NpdEZhY2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5kZXBvc2l0RmFjZXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0UmVjb3ZlcnlTZXQoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBvcHRSZWNvdmVyeVNldCA9IG1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuICAgICAgICAgIGlmIChvcHRSZWNvdmVyeVNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gRU1QVFlfQ09QWV9TRVQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvcHRSZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuICAgICAgICB9LFxuICAgICAgICByZWNvdmVyQWxsKCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBsZXQgYW1vdW50ID0gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG4gICAgICAgICAgY29uc3Qgb3B0UmVjb3ZlcnlTZXQgPSBtYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbiAgICAgICAgICBpZiAob3B0UmVjb3ZlcnlTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGFtb3VudDsgLyogZW1wdHkgYXQgdGhpcyB0aW1lKi9cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBwYXltZW50IG9mIG9wdFJlY292ZXJ5U2V0LmtleXMoKSkge1xuICAgICAgICAgICAgLyogVGhpcyBkb2VzIGNhdXNlIGRlbGV0aW9ucyBmcm9tIHRoZSBzZXQgd2hpbGUgaXRlcmF0aW5nLCovXG4gICAgICAgICAgICAvKiBidXQgdGhpcyBzcGVjaWFsIGNhc2UgaXMgYWxsb3dlZC4qL1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBmYWNldHMucHVyc2UuZGVwb3NpdChwYXltZW50KTtcbiAgICAgICAgICAgIGFtb3VudCA9IEFtb3VudE1hdGguYWRkKGFtb3VudCwgZGVsdGEsIGJyYW5kKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3B0UmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpID09PSAwIHx8XG4gICAgICAgICAgICBGYWlsYGludGVybmFsOiBSZW1haW5pbmcgdW5yZWNvdmVyZWQgcGF5bWVudHM6ICR7ZmFjZXRzLnB1cnNlLmdldFJlY292ZXJ5U2V0KCl9YDtcbiAgICAgICAgICByZXR1cm4gYW1vdW50O1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRlcG9zaXRGYWNldDoge1xuICAgICAgICByZWNlaXZlKC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzdGF0ZVNoYXBlOiB7XG4gICAgICAgIGN1cnJlbnRCYWxhbmNlOiBhbW91bnRTaGFwZSxcbiAgICAgICAgcmVjb3ZlcnlTZXQ6IE0ucmVtb3RhYmxlKCdyZWNvdmVyeVNldCcpLFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuICByZXR1cm4gKCkgPT4gbWFrZVB1cnNlS2l0KCkucHVyc2U7XG59OyRozY9fb25jZS5wcmVwYXJlUHVyc2VLaW5kKHByZXBhcmVQdXJzZUtpbmQpO1xuaGFyZGVuKHByZXBhcmVQdXJzZUtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVB1cnNlS2luZCI6WyJwcmVwYXJlUHVyc2VLaW5kIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAL6roXInPQAAJz0AACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcmF0aW8uanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL25hdCIsIi4vYW1vdW50TWF0aC5qcyIsIi4vc2FmZU1hdGguanMiXSwiZXhwb3J0cyI6WyJhZGRSYXRpb3MiLCJhc3NlcnRJc1JhdGlvIiwiYXNzZXJ0UGFyc2FibGVOdW1iZXIiLCJjZWlsRGl2aWRlQnkiLCJjZWlsTXVsdGlwbHlCeSIsImRpdmlkZUJ5IiwiZmxvb3JEaXZpZGVCeSIsImZsb29yTXVsdGlwbHlCeSIsImludmVydFJhdGlvIiwibWFrZVJhdGlvIiwibWFrZVJhdGlvRnJvbUFtb3VudHMiLCJtdWx0aXBseUJ5IiwibXVsdGlwbHlSYXRpb3MiLCJvbmVNaW51cyIsInBhcnNlUmF0aW8iLCJxdWFudGl6ZSIsInJhdGlvR1RFIiwicmF0aW9Ub051bWJlciIsInJhdGlvc1NhbWUiLCJzdWJ0cmFjdFJhdGlvcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbCxhc3NlcnRSZWNvcmQsaXNOYXQsQW1vdW50TWF0aCxuYXRTYWZlTWF0aDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcImlzTmF0XCIsWyRozY9fYSA9PiAoaXNOYXQgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiLi9zYWZlTWF0aC5qc1wiLCBbW1wibmF0U2FmZU1hdGhcIixbJGjNj19hID0+IChuYXRTYWZlTWF0aCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0Ftb3VudCwgQnJhbmQsIElzc3VlciwgUGF5bWVudCwgUHVyc2V9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKi9cblxuY29uc3QgeyBtdWx0aXBseSwgZmxvb3JEaXZpZGUsIGNlaWxEaXZpZGUsIGJhbmtlcnNEaXZpZGUsIGFkZCwgc3VidHJhY3QgfSA9XG4gIG5hdFNhZmVNYXRoO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhdGlvXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IG51bWVyYXRvclxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBkZW5vbWluYXRvclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNjYWxlQW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fVxuICovXG5cbi8qIG1ha2UgYSBSYXRpbywgd2hpY2ggcmVwcmVzZW50cyBhIGZyYWN0aW9uLiBJdCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQuKi9cbi8qKi9cbi8qIFRoZSBuYXR1cmFsIHN5bnRheCBmb3IgdGhlIG1vc3QgY29tbW9uIG9wZXJhdGlvbnMgd2Ugd2FudCB0byBzdXBwb3J0Ki9cbi8qIGFyZSBBbW91bnQgKiBSYXRpbyBhbmQgQW1vdW50IC8gUmF0aW8uIFNpbmNlIHRoZSBvcGVyYXRpb25zIHdhbnQgdG8gYWRoZXJlIHRvKi9cbi8qIHRoZSByYXRpbyByYXRoZXIgdGhhbiB0aGUgYW1vdW50LCB3ZSBzZXR0bGVkIG9uIGEgY2FsbGluZyBjb252ZW50aW9uIG9mKi9cbi8qIFtjZWlsfGZsb29yXU11bHRpcGx5QnkoQW1vdW50LCBSYXRpbykgYW5kIFtjZWlsfGZsb29yXURpdmlkZUJ5KEFtb3VudCwgUmF0aW8pKi9cbi8qKi9cbi8qIFRoZSBtb3N0IGNvbW1vbiBraW5kIG9mIFJhdGlvIGNhbiBiZSBhcHBsaWVkIHRvIEFtb3VudHMgb2YgYSBwYXJ0aWN1bGFyKi9cbi8qIGJyYW5kLCBhbmQgcHJvZHVjZXMgcmVzdWx0cyBvZiB0aGUgc2FtZSBicmFuZC4gVGhpcyByZXByZXNlbnRzIGEgbXVsdGlwbGllciovXG4vKiB0aGF0IGlzIG9ubHkgYXBwbGljYWJsZSB0byB0aGF0IGJyYW5kLiBUaGUgbGVzcyBjb21tb24ga2luZCBvZiBSYXRpbyBjYW4gYmUqL1xuLyogYXBwbGllZCB0byBvbmUgcGFydGljdWxhciBicmFuZCBvZiBhbW91bnRzLCBhbmQgcHJvZHVjZXMgcmVzdWx0cyBvZiBhbm90aGVyKi9cbi8qIHBhcnRpY3VsYXIgYnJhbmQuIFRoaXMgcmVwcmVzZW50cyBzb21lIGtpbmQgb2YgZXhjaGFuZ2UgcmF0ZS4gVGhlKi9cbi8qIGJyYW5kLWNoZWNraW5nIGhlbHBzIHVzIGVuc3VyZSB0aGF0IG5vcm1hbCBSYXRpb3MgYXJlbid0IGFwcGxpZWQgdG8gYW1vdW50cyovXG4vKiBvZiB0aGUgd3JvbmcgYnJhbmQsIGFuZCB0aGF0IGV4Y2hhbmdlIHJhdGVzIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGFwcHJvcHJpYXRlKi9cbi8qIGRpcmVjdGlvbi4qL1xuLyoqL1xuLyogU2luY2UgdGhlIHJhdGlvcyBhcmUgcmVwcmVzZW50ZWQgYnkgYSBudW1lcmF0b3IgYW5kIGEgZGVub21pbmF0b3IsIGV2ZXJ5Ki9cbi8qIG11bHRpcGxpY2F0aW9uIG9yIGRpdmlzaW9uIG9wZXJhdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGFtb3VudCBlbmRzIHdpdGggYSovXG4vKiBkaXZpc2lvbiBvZiB0aGUgdW5kZXJseWluZyBiaWdpbnRzLCBhbmQgaW50ZWdlciBkaXZpc2lvbiByZXF1aXJlcyBhIG1vZGUqL1xuLyogb2YgW3JvdW5kaW5nIHRvIGludGVnZXJdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JvdW5kaW5nI1JvdW5kaW5nX3RvX2ludGVnZXIpLiovXG4vKiBCZWNhdXNlIGBSYXRpb2Agb25seSB3b3JrIHdpdGggTmF0dXJhbCBudW1iZXJzLCBqdXN0IHRocmVlIG1vZGVzIHN1ZmZpY2U6Ki9cbi8qIC0gZmxvb3Igcm91bmRzIGRvd24qL1xuLyogLSBjZWlsIHJvdW5kcyB1cCovXG4vKiAtIGRlZmF1bHQgKHdpdGhvdXQgcHJlZml4KSBtaW5pbWl6ZXMgYmlhcyBieSByb3VuZGluZyBoYWxmIHRvIGV2ZW4qL1xuXG5jb25zdCBQRVJDRU5UID0gMTAwbjtcblxuY29uc3QgcmF0aW9Qcm9wZXJ0eU5hbWVzID0gWydudW1lcmF0b3InLCAnZGVub21pbmF0b3InXTtcblxuICAgICAgIGNvbnN0IGFzc2VydElzUmF0aW8gPSByYXRpbyA9PiB7XG4gIGFzc2VydFJlY29yZChyYXRpbywgJ3JhdGlvJyk7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyYXRpbyk7XG4gIGtleXMubGVuZ3RoID09PSAyIHx8IEZhaWxgUmF0aW8gJHtyYXRpb30gbXVzdCBiZSBhIHJlY29yZCB3aXRoIDIgZmllbGRzLmA7XG4gIGZvciAoY29uc3QgbmFtZSBvZiBrZXlzKSB7XG4gICAgcmF0aW9Qcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKG5hbWUpIHx8XG4gICAgICBGYWlsYFBhcmFtZXRlciBtdXN0IGJlIGEgUmF0aW8gcmVjb3JkLCBidXQgJHtyYXRpb30gaGFzICR7cShuYW1lKX1gO1xuICB9XG4gIGNvbnN0IG51bWVyYXRvclZhbHVlID0gcmF0aW8ubnVtZXJhdG9yLnZhbHVlO1xuICBjb25zdCBkZW5vbWluYXRvclZhbHVlID0gcmF0aW8uZGVub21pbmF0b3IudmFsdWU7XG4gIGlzTmF0KG51bWVyYXRvclZhbHVlKSB8fFxuICAgIEZhaWxgVGhlIG51bWVyYXRvciB2YWx1ZSBtdXN0IGJlIGEgTmF0VmFsdWUsIG5vdCAke251bWVyYXRvclZhbHVlfWA7XG4gIGlzTmF0KGRlbm9taW5hdG9yVmFsdWUpIHx8XG4gICAgRmFpbGBUaGUgZGVub21pbmF0b3IgdmFsdWUgbXVzdCBiZSBhIE5hdFZhbHVlLCBub3QgJHtkZW5vbWluYXRvclZhbHVlfWA7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7YmlnaW50fSBudW1lcmF0b3JcbiAqIEBwYXJhbSB7QnJhbmR9IG51bWVyYXRvckJyYW5kXG4gKiBAcGFyYW0ge2JpZ2ludH0gW2Rlbm9taW5hdG9yXSBUaGUgZGVmYXVsdCBkZW5vbWluYXRvciBpcyAxMDBcbiAqIEBwYXJhbSB7QnJhbmR9IFtkZW5vbWluYXRvckJyYW5kXSBUaGUgZGVmYXVsdCBpcyB0byByZXVzZSB0aGUgbnVtZXJhdG9yQnJhbmRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRozY9fb25jZS5hc3NlcnRJc1JhdGlvKGFzc2VydElzUmF0aW8pO1xuICAgICAgIGNvbnN0IG1ha2VSYXRpbyA9IChcbiAgbnVtZXJhdG9yLFxuICBudW1lcmF0b3JCcmFuZCxcbiAgZGVub21pbmF0b3IgPSBQRVJDRU5ULFxuICBkZW5vbWluYXRvckJyYW5kID0gbnVtZXJhdG9yQnJhbmQsXG4pID0+IHtcbiAgZGVub21pbmF0b3IgPiAwbiB8fFxuICAgIEZhaWxgTm8gaW5maW5pdGUgcmF0aW9zISBEZW5vbWluYXRvciB3YXMgMCAke3EoZGVub21pbmF0b3JCcmFuZCl9YDtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBudW1lcmF0b3I6IEFtb3VudE1hdGgubWFrZShudW1lcmF0b3JCcmFuZCwgbnVtZXJhdG9yKSxcbiAgICBkZW5vbWluYXRvcjogQW1vdW50TWF0aC5tYWtlKGRlbm9taW5hdG9yQnJhbmQsIGRlbm9taW5hdG9yKSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50fSBudW1lcmF0b3JBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBkZW5vbWluYXRvckFtb3VudFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjNj19vbmNlLm1ha2VSYXRpbyhtYWtlUmF0aW8pO1xuICAgICAgIGNvbnN0IG1ha2VSYXRpb0Zyb21BbW91bnRzID0gKG51bWVyYXRvckFtb3VudCwgZGVub21pbmF0b3JBbW91bnQpID0+IHtcbiAgQW1vdW50TWF0aC5jb2VyY2UobnVtZXJhdG9yQW1vdW50LmJyYW5kLCBudW1lcmF0b3JBbW91bnQpO1xuICBBbW91bnRNYXRoLmNvZXJjZShkZW5vbWluYXRvckFtb3VudC5icmFuZCwgZGVub21pbmF0b3JBbW91bnQpO1xuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgdmFsdWUgY2FuIGJlIGFueSBBbW91bnRWYWx1ZSBidXQgbWFrZVJhdGlvKCkgc3VwcG9ydHMgb25seSBiaWdpbnQqL1xuICAgIG51bWVyYXRvckFtb3VudC52YWx1ZSxcbiAgICBudW1lcmF0b3JBbW91bnQuYnJhbmQsXG4gICAgZGVub21pbmF0b3JBbW91bnQudmFsdWUsXG4gICAgZGVub21pbmF0b3JBbW91bnQuYnJhbmQsXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50XG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHBhcmFtIHthbnl9IGRpdmlkZU9wXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqLyRozY9fb25jZS5tYWtlUmF0aW9Gcm9tQW1vdW50cyhtYWtlUmF0aW9Gcm9tQW1vdW50cyk7XG5jb25zdCBtdWx0aXBseUhlbHBlciA9IChhbW91bnQsIHJhdGlvLCBkaXZpZGVPcCkgPT4ge1xuICBBbW91bnRNYXRoLmNvZXJjZShhbW91bnQuYnJhbmQsIGFtb3VudCk7XG4gIGFzc2VydElzUmF0aW8ocmF0aW8pO1xuICBhbW91bnQuYnJhbmQgPT09IHJhdGlvLmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBhbW91bnQncyBicmFuZCAke3EoYW1vdW50LmJyYW5kKX0gbXVzdCBtYXRjaCByYXRpbydzIGRlbm9taW5hdG9yICR7cShcbiAgICAgIHJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuICAgICl9YDtcblxuICByZXR1cm4gLyoqIEB0eXBlIHtBbW91bnQ8J25hdCc+fSAqLyAoXG4gICAgQW1vdW50TWF0aC5tYWtlKFxuICAgICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuICAgICAgZGl2aWRlT3AoXG4gICAgICAgIG11bHRpcGx5KGFtb3VudC52YWx1ZSwgcmF0aW8ubnVtZXJhdG9yLnZhbHVlKSxcbiAgICAgICAgcmF0aW8uZGVub21pbmF0b3IudmFsdWUsXG4gICAgICApLFxuICAgIClcbiAgKTtcbn07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovXG4gICAgICAgY29uc3QgZmxvb3JNdWx0aXBseUJ5ID0gKGFtb3VudCwgcmF0aW8pID0+IHtcbiAgcmV0dXJuIG11bHRpcGx5SGVscGVyKGFtb3VudCwgcmF0aW8sIGZsb29yRGl2aWRlKTtcbn07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovJGjNj19vbmNlLmZsb29yTXVsdGlwbHlCeShmbG9vck11bHRpcGx5QnkpO1xuICAgICAgIGNvbnN0IGNlaWxNdWx0aXBseUJ5ID0gKGFtb3VudCwgcmF0aW8pID0+IHtcbiAgcmV0dXJuIG11bHRpcGx5SGVscGVyKGFtb3VudCwgcmF0aW8sIGNlaWxEaXZpZGUpO1xufTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi8kaM2PX29uY2UuY2VpbE11bHRpcGx5QnkoY2VpbE11bHRpcGx5QnkpO1xuICAgICAgIGNvbnN0IG11bHRpcGx5QnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LCByYXRpbywgYmFua2Vyc0RpdmlkZSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50XG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHBhcmFtIHthbnl9IGRpdmlkZU9wXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqLyRozY9fb25jZS5tdWx0aXBseUJ5KG11bHRpcGx5QnkpO1xuY29uc3QgZGl2aWRlSGVscGVyID0gKGFtb3VudCwgcmF0aW8sIGRpdmlkZU9wKSA9PiB7XG4gIEFtb3VudE1hdGguY29lcmNlKGFtb3VudC5icmFuZCwgYW1vdW50KTtcbiAgYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG4gIGFtb3VudC5icmFuZCA9PT0gcmF0aW8ubnVtZXJhdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBhbW91bnQncyBicmFuZCAke3EoYW1vdW50LmJyYW5kKX0gbXVzdCBtYXRjaCByYXRpbydzIG51bWVyYXRvciAke3EoXG4gICAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICAgKX1gO1xuXG4gIHJldHVybiAvKiogQHR5cGUge0Ftb3VudDwnbmF0Jz59ICovIChcbiAgICBBbW91bnRNYXRoLm1ha2UoXG4gICAgICByYXRpby5kZW5vbWluYXRvci5icmFuZCxcbiAgICAgIGRpdmlkZU9wKFxuICAgICAgICBtdWx0aXBseShhbW91bnQudmFsdWUsIHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlKSxcbiAgICAgICAgcmF0aW8ubnVtZXJhdG9yLnZhbHVlLFxuICAgICAgKSxcbiAgICApXG4gICk7XG59O1xuXG4vKipcbiAqIERpdmlkZSB0aGUgYW1vdW50IGJ5IHRoZSByYXRpbywgdHJ1bmNhdGluZyB0aGUgcmVtYWluZGVyLlxuICpcbiAqIEB0eXBlIHtTY2FsZUFtb3VudH1cbiAqL1xuICAgICAgIGNvbnN0IGZsb29yRGl2aWRlQnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCwgcmF0aW8sIGZsb29yRGl2aWRlKTtcbn07XG5cbi8qKlxuICogRGl2aWRlIHRoZSBhbW91bnQgYnkgdGhlIHJhdGlvLCByb3VuZGluZyB1cCB0aGUgcmVtYWluZGVyLlxuICpcbiAqIEB0eXBlIHtTY2FsZUFtb3VudH1cbiAqLyRozY9fb25jZS5mbG9vckRpdmlkZUJ5KGZsb29yRGl2aWRlQnkpO1xuICAgICAgIGNvbnN0IGNlaWxEaXZpZGVCeSA9IChhbW91bnQsIHJhdGlvKSA9PiB7XG4gIHJldHVybiBkaXZpZGVIZWxwZXIoYW1vdW50LCByYXRpbywgY2VpbERpdmlkZSk7XG59O1xuXG4vKipcbiAqIERpdmlkZSB0aGUgYW1vdW50IGJ5IHRoZSByYXRpbywgcm91bmRpbmcgdG8gbmVhcmVzdCB3aXRoIHRpZXMgdG8gZXZlbiAoYWthXG4gKiBCYW5rZXIncyBSb3VuZGluZykgYXMgaW4gSUVFRSA3NTQgZGVmYXVsdCByb3VuZGluZy5cbiAqXG4gKiBAdHlwZSB7U2NhbGVBbW91bnR9XG4gKi8kaM2PX29uY2UuY2VpbERpdmlkZUJ5KGNlaWxEaXZpZGVCeSk7XG4gICAgICAgY29uc3QgZGl2aWRlQnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCwgcmF0aW8sIGJhbmtlcnNEaXZpZGUpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHJldHVybnMge1JhdGlvfVxuICovJGjNj19vbmNlLmRpdmlkZUJ5KGRpdmlkZUJ5KTtcbiAgICAgICBjb25zdCBpbnZlcnRSYXRpbyA9IHJhdGlvID0+IHtcbiAgYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG5cbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICByYXRpby5kZW5vbWluYXRvci52YWx1ZSxcbiAgICByYXRpby5kZW5vbWluYXRvci5icmFuZCxcbiAgICByYXRpby5udW1lcmF0b3IudmFsdWUsXG4gICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjNj19vbmNlLmludmVydFJhdGlvKGludmVydFJhdGlvKTtcbiAgICAgICBjb25zdCBhZGRSYXRpb3MgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG4gIGFzc2VydElzUmF0aW8obGVmdCk7XG4gIGxlZnQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5udW1lcmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYG51bWVyYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG4gIGxlZnQuZGVub21pbmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBkZW5vbWluYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG5cbiAgLyogU2ltcGxpZnlpbmcgdGhlIGV4cHJlc3Npb246Ki9cbiAgLyogKGFuZCArIGJuZCkgLyB5IGQqKjIqL1xuICAvKiAoYSArIGIpIG5kIC8geSBkKioyKi9cbiAgLyogKChhICsgYikgbiAvIHkgZCkgKiAoZCAvIGQpKi9cbiAgLyogKGEgKyBiKSBuIC8geWQqL1xuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIGFkZChcbiAgICAgIG11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksIC8qIGEgbmQqL1xuICAgICAgbXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSwgcmlnaHQubnVtZXJhdG9yLnZhbHVlKSAgLyogYiBuZCovXG4gICAgKSwgLyogKGEgKyBiKSBuZCovXG4gICAgbGVmdC5udW1lcmF0b3IuYnJhbmQsXG4gICAgbXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSwgcmlnaHQuZGVub21pbmF0b3IudmFsdWUpLCAvKiB5IGQqKjIqL1xuICAgIGxlZnQuZGVub21pbmF0b3IuYnJhbmQsXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaM2PX29uY2UuYWRkUmF0aW9zKGFkZFJhdGlvcyk7XG4gICAgICAgY29uc3Qgc3VidHJhY3RSYXRpb3MgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG4gIGFzc2VydElzUmF0aW8obGVmdCk7XG4gIGxlZnQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5udW1lcmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYG51bWVyYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG4gIGxlZnQuZGVub21pbmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBkZW5vbWluYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG5cbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBzdWJ0cmFjdChcbiAgICAgIG11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksIC8qIGEgbmQqL1xuICAgICAgbXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSwgcmlnaHQubnVtZXJhdG9yLnZhbHVlKSAgLyogYiBuZCovXG4gICAgKSwgLyogKGEgLSBiKSBuZCovXG4gICAgbGVmdC5udW1lcmF0b3IuYnJhbmQsXG4gICAgbXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSwgcmlnaHQuZGVub21pbmF0b3IudmFsdWUpLCAvKiB5IGQqKjIqL1xuICAgIGxlZnQuZGVub21pbmF0b3IuYnJhbmQsXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaM2PX29uY2Uuc3VidHJhY3RSYXRpb3Moc3VidHJhY3RSYXRpb3MpO1xuICAgICAgIGNvbnN0IG11bHRpcGx5UmF0aW9zID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGFzc2VydElzUmF0aW8ocmlnaHQpO1xuICBhc3NlcnRJc1JhdGlvKGxlZnQpO1xuXG4gIGNvbnN0IGdldFJlbWFpbmluZ0JyYW5kcyA9ICgpID0+IHtcbiAgICAvKiBQcmVmZXIgcmVzdWx0cyB0aGF0IGhhdmUgdGhlIHNhbWUgYnJhbmQgYXMgdGhlIGxlZnQgb3BlcmFuZC4qL1xuICAgIGlmIChyaWdodC5udW1lcmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kKSB7XG4gICAgICByZXR1cm4gW2xlZnQubnVtZXJhdG9yLmJyYW5kLCBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiAgICB9XG4gICAgaWYgKHJpZ2h0Lm51bWVyYXRvci5icmFuZCA9PT0gbGVmdC5kZW5vbWluYXRvci5icmFuZCkge1xuICAgICAgcmV0dXJuIFtsZWZ0Lm51bWVyYXRvci5icmFuZCwgcmlnaHQuZGVub21pbmF0b3IuYnJhbmRdO1xuICAgIH1cbiAgICBpZiAobGVmdC5udW1lcmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kKSB7XG4gICAgICByZXR1cm4gW3JpZ2h0Lm51bWVyYXRvci5icmFuZCwgbGVmdC5kZW5vbWluYXRvci5icmFuZF07XG4gICAgfVxuICAgIGlmIChsZWZ0Lm51bWVyYXRvci5icmFuZCA9PT0gbGVmdC5kZW5vbWluYXRvci5icmFuZCkge1xuICAgICAgcmV0dXJuIFtyaWdodC5udW1lcmF0b3IuYnJhbmQsIHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiAgICB9XG4gICAgdGhyb3cgRmFpbGBhdCBsZWFzdCBvbmUgYnJhbmQgbXVzdCBjYW5jZWwgb3V0OiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcbiAgfTtcblxuICBjb25zdCBbbnVtZXJhdG9yQnJhbmQsIGRlbm9taW5hdG9yQnJhbmRdID0gZ2V0UmVtYWluaW5nQnJhbmRzKCk7XG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgbXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUsIHJpZ2h0Lm51bWVyYXRvci52YWx1ZSksXG4gICAgbnVtZXJhdG9yQnJhbmQsXG4gICAgbXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSwgcmlnaHQuZGVub21pbmF0b3IudmFsdWUpLFxuICAgIGRlbm9taW5hdG9yQnJhbmQsXG4gICk7XG59O1xuXG4vKipcbiAqIElmIHJhdGlvIGlzIGJldHdlZW4gMCBhbmQgMSwgc3VidHJhY3QgZnJvbSAxLlxuICpcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaM2PX29uY2UubXVsdGlwbHlSYXRpb3MobXVsdGlwbHlSYXRpb3MpO1xuICAgICAgIGNvbnN0IG9uZU1pbnVzID0gcmF0aW8gPT4ge1xuICBhc3NlcnRJc1JhdGlvKHJhdGlvKTtcbiAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kID09PSByYXRpby5kZW5vbWluYXRvci5icmFuZCB8fFxuICAgIEZhaWxgb25lTWludXMgb25seSBzdXBwb3J0cyByYXRpb3Mgd2l0aCBhIHNpbmdsZSBicmFuZCwgYnV0ICR7cmF0aW8ubnVtZXJhdG9yLmJyYW5kfSBkb2Vzbid0IG1hdGNoICR7cmF0aW8uZGVub21pbmF0b3IuYnJhbmR9YDtcbiAgcmF0aW8ubnVtZXJhdG9yLnZhbHVlIDw9IHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlIHx8XG4gICAgRmFpbGBQYXJhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTogJHtyYXRpby5udW1lcmF0b3IudmFsdWV9LyR7cmF0aW8uZGVub21pbmF0b3IudmFsdWV9YDtcbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBzdWJ0cmFjdChyYXRpby5kZW5vbWluYXRvci52YWx1ZSwgcmF0aW8ubnVtZXJhdG9yLnZhbHVlKSxcbiAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICAgcmF0aW8uZGVub21pbmF0b3IudmFsdWUsXG4gICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaM2PX29uY2Uub25lTWludXMob25lTWludXMpO1xuICAgICAgIGNvbnN0IHJhdGlvR1RFID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGlmIChsZWZ0Lm51bWVyYXRvci5icmFuZCA9PT0gcmlnaHQubnVtZXJhdG9yLmJyYW5kKSB7XG4gICAgbGVmdC5kZW5vbWluYXRvci5icmFuZCA9PT0gcmlnaHQuZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgICAgIEZhaWxgbnVtZXJhdG9yIGJyYW5kcyBtYXRjaCwgYnV0IGRlbm9taW5hdG9yIGJyYW5kcyBkb24ndDogJHtxKGxlZnQpfSAke3EoXG4gICAgICAgIHJpZ2h0LFxuICAgICAgKX1gO1xuICB9IGVsc2UgaWYgKGxlZnQubnVtZXJhdG9yLmJyYW5kID09PSBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kKSB7XG4gICAgcmlnaHQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5kZW5vbWluYXRvci5icmFuZCB8fFxuICAgICAgRmFpbGBsZWZ0aGFuZCBicmFuZHMgbWF0Y2gsIGJ1dCByaWdodGhhbmQgYnJhbmRzIGRvbid0OiAke3EobGVmdCl9ICR7cShcbiAgICAgICAgcmlnaHQsXG4gICAgICApfWA7XG4gIH1cbiAgcmV0dXJuIG5hdFNhZmVNYXRoLmlzR1RFKFxuICAgIG11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksXG4gICAgbXVsdGlwbHkocmlnaHQubnVtZXJhdG9yLnZhbHVlLCBsZWZ0LmRlbm9taW5hdG9yLnZhbHVlKSxcbiAgKTtcbn07XG5cbi8qKlxuICogVHJ1ZSBpZmYgdGhlIHJhdGlvcyBhcmUgdGhlIHNhbWUgdmFsdWVzIChlcXVhbCBvciBlcXVpdmFsYW50IG1heSByZXR1cm5cbiAqIGZhbHNlKVxuICpcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRozY9fb25jZS5yYXRpb0dURShyYXRpb0dURSk7XG4gICAgICAgY29uc3QgcmF0aW9zU2FtZSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gKFxuICAgIEFtb3VudE1hdGguaXNFcXVhbChsZWZ0Lm51bWVyYXRvciwgcmlnaHQubnVtZXJhdG9yKSAmJlxuICAgIEFtb3VudE1hdGguaXNFcXVhbChsZWZ0LmRlbm9taW5hdG9yLCByaWdodC5kZW5vbWluYXRvcilcbiAgKTtcbn07XG5cbi8qKlxuICogTWFrZSBhIG5ldyByYXRpbyB3aXRoIGEgc21hbGxlciBkZW5vbWluYXRvciB0aGF0IGFwcHJveGltYXRlcyB0aGUgcmF0aW8uIElmXG4gKiB0aGUgcHJvcG9zZWQgZGVub21pbmF0b3IgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb25lLCByZXR1cm4gdGhlXG4gKiBvcmlnaW5hbC5cbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHBhcmFtIHtiaWdpbnR9IG5ld0RlblxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjNj19vbmNlLnJhdGlvc1NhbWUocmF0aW9zU2FtZSk7XG4gICAgICAgY29uc3QgcXVhbnRpemUgPSAocmF0aW8sIG5ld0RlbikgPT4ge1xuICBjb25zdCBvbGREZW4gPSByYXRpby5kZW5vbWluYXRvci52YWx1ZTtcbiAgY29uc3Qgb2xkTnVtID0gcmF0aW8ubnVtZXJhdG9yLnZhbHVlO1xuICBpZiAobmV3RGVuID4gb2xkRGVuKSB7XG4gICAgcmV0dXJuIHJhdGlvO1xuICB9XG5cbiAgY29uc3QgbmV3TnVtID1cbiAgICBuZXdEZW4gPT09IG9sZERlbiA/IG9sZE51bSA6IGJhbmtlcnNEaXZpZGUob2xkTnVtICogbmV3RGVuLCBvbGREZW4pO1xuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIG5ld051bSxcbiAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICAgbmV3RGVuLFxuICAgIHJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuICApO1xufTskaM2PX29uY2UucXVhbnRpemUocXVhbnRpemUpO1xuXG5jb25zdCBOVU1FUklDX1JFID0gL14oXFxkXFxkKikoPzpcXC4oXFxkKikpPyQvO1xuLyoqIEB0eXBlZGVmIHtiaWdpbnQgfCBudW1iZXIgfCBzdHJpbmd9IFBhcnNhYmxlTnVtYmVyICovXG5cbi8qKlxuICogQ3JlYXRlIGEgcmF0aW8gZnJvbSBhIGdpdmVuIG51bWVyaWMgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtQYXJzYWJsZU51bWJlcn0gbnVtZXJpY1xuICogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IG51bWVyYXRvckJyYW5kXG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gW2Rlbm9taW5hdG9yQnJhbmRdXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi9cbiAgICAgICBjb25zdCBwYXJzZVJhdGlvID0gKFxuICBudW1lcmljLFxuICBudW1lcmF0b3JCcmFuZCxcbiAgZGVub21pbmF0b3JCcmFuZCA9IG51bWVyYXRvckJyYW5kLFxuKSA9PiB7XG4gIGNvbnN0IG1hdGNoID0gYCR7bnVtZXJpY31gLm1hdGNoKE5VTUVSSUNfUkUpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgRmFpbGBJbnZhbGlkIG51bWVyaWMgZGF0YTogJHtudW1lcmljfWA7XG4gIH1cblxuICBjb25zdCBbXywgd2hvbGUsIHBhcnQgPSAnJ10gPSBtYXRjaDtcbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBCaWdJbnQoYCR7d2hvbGV9JHtwYXJ0fWApLFxuICAgIG51bWVyYXRvckJyYW5kLFxuICAgIDEwbiAqKiBCaWdJbnQocGFydC5sZW5ndGgpLFxuICAgIGRlbm9taW5hdG9yQnJhbmQsXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIFBhcnNhYmxlTnVtYmVyfVxuICovJGjNj19vbmNlLnBhcnNlUmF0aW8ocGFyc2VSYXRpbyk7XG4gICAgICAgY29uc3QgYXNzZXJ0UGFyc2FibGVOdW1iZXIgPSBzcGVjaW1lbiA9PiB7XG4gIGNvbnN0IG1hdGNoID0gYCR7c3BlY2ltZW59YC5tYXRjaChOVU1FUklDX1JFKTtcbiAgbWF0Y2ggfHwgRmFpbGBJbnZhbGlkIG51bWVyaWMgZGF0YTogJHtzcGVjaW1lbn1gO1xufTtcblxuLyoqXG4gKiBSYXRpb3MgbWlnaHQgYmUgZ3JlYXRlciBvciBsZXNzIHRoYW4gb25lLlxuICpcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovJGjNj19vbmNlLmFzc2VydFBhcnNhYmxlTnVtYmVyKGFzc2VydFBhcnNhYmxlTnVtYmVyKTtcbiAgICAgICBjb25zdCByYXRpb1RvTnVtYmVyID0gcmF0aW8gPT4ge1xuICBjb25zdCBuID0gTnVtYmVyKHJhdGlvLm51bWVyYXRvci52YWx1ZSk7XG4gIGNvbnN0IGQgPSBOdW1iZXIocmF0aW8uZGVub21pbmF0b3IudmFsdWUpO1xuICByZXR1cm4gbiAvIGQ7XG59OyRozY9fb25jZS5yYXRpb1RvTnVtYmVyKHJhdGlvVG9OdW1iZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SXNSYXRpbyI6WyJhc3NlcnRJc1JhdGlvIl0sIm1ha2VSYXRpbyI6WyJtYWtlUmF0aW8iXSwibWFrZVJhdGlvRnJvbUFtb3VudHMiOlsibWFrZVJhdGlvRnJvbUFtb3VudHMiXSwiZmxvb3JNdWx0aXBseUJ5IjpbImZsb29yTXVsdGlwbHlCeSJdLCJjZWlsTXVsdGlwbHlCeSI6WyJjZWlsTXVsdGlwbHlCeSJdLCJtdWx0aXBseUJ5IjpbIm11bHRpcGx5QnkiXSwiZmxvb3JEaXZpZGVCeSI6WyJmbG9vckRpdmlkZUJ5Il0sImNlaWxEaXZpZGVCeSI6WyJjZWlsRGl2aWRlQnkiXSwiZGl2aWRlQnkiOlsiZGl2aWRlQnkiXSwiaW52ZXJ0UmF0aW8iOlsiaW52ZXJ0UmF0aW8iXSwiYWRkUmF0aW9zIjpbImFkZFJhdGlvcyJdLCJzdWJ0cmFjdFJhdGlvcyI6WyJzdWJ0cmFjdFJhdGlvcyJdLCJtdWx0aXBseVJhdGlvcyI6WyJtdWx0aXBseVJhdGlvcyJdLCJvbmVNaW51cyI6WyJvbmVNaW51cyJdLCJyYXRpb0dURSI6WyJyYXRpb0dURSJdLCJyYXRpb3NTYW1lIjpbInJhdGlvc1NhbWUiXSwicXVhbnRpemUiOlsicXVhbnRpemUiXSwicGFyc2VSYXRpbyI6WyJwYXJzZVJhdGlvIl0sImFzc2VydFBhcnNhYmxlTnVtYmVyIjpbImFzc2VydFBhcnNhYmxlTnVtYmVyIl0sInJhdGlvVG9OdW1iZXIiOlsicmF0aW9Ub051bWJlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABwLxbligcAAIoHAAAkAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3NhZmVNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm5hdFNhZmVNYXRoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTmF0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKiogQHR5cGVkZWYgeyh4OiBudW1iZXIgfCBiaWdpbnQsIHk6IG51bWJlciB8IGJpZ2ludCkgPT4gYmlnaW50fSBOYXRPcCAqL1xuXG4vKipcbiAqIFRoZXNlIG9wZXJhdGlvbnMgc2hvdWxkIGJlIHVzZWQgZm9yIGNhbGN1bGF0aW9ucyB3aXRoIHRoZSB2YWx1ZXMgb2YgYmFzaWNcbiAqIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiBuYXRTYWZlTWF0aCBpcyBkZXNpZ25lZCB0byBiZSB1c2VkIGRpcmVjdGx5LCBhbmQgc28gaXQgbmVlZHMgdG8gdmFsaWRhdGUgdGhlXG4gKiBpbnB1dHMsIGFzIHdlbGwgYXMgdGhlIG91dHB1dHMgd2hlbiBuZWNlc3NhcnkuXG4gKi9cbiAgICAgICBjb25zdCBuYXRTYWZlTWF0aCA9IGhhcmRlbih7XG4gIC8qKiBAdHlwZSB7TmF0T3B9ICovXG4gIC8qIEJpZ0ludHMgZG9uJ3Qgb2JzZXJ2YWJseSBvdmVyZmxvdyovXG4gIGFkZDogKHgsIHkpID0+IE5hdCh4KSArIE5hdCh5KSxcbiAgLyoqIEB0eXBlIHtOYXRPcH0gKi9cbiAgc3VidHJhY3Q6ICh4LCB5KSA9PiBOYXQoTmF0KHgpIC0gTmF0KHkpKSxcbiAgLyoqIEB0eXBlIHtOYXRPcH0gKi9cbiAgbXVsdGlwbHk6ICh4LCB5KSA9PiBOYXQoeCkgKiBOYXQoeSksXG4gIC8qKiBAdHlwZSB7TmF0T3B9ICovXG4gIGZsb29yRGl2aWRlOiAoeCwgeSkgPT4gTmF0KHgpIC8gTmF0KHkpLFxuICAvKiogQHR5cGUge05hdE9wfSAqL1xuICBjZWlsRGl2aWRlOiAoeCwgeSkgPT4ge1xuICAgIHkgPSBOYXQoeSk7XG4gICAgcmV0dXJuIE5hdChOYXQoeCkgKyB5IC0gMW4pIC8geTtcbiAgfSxcbiAgLyoqXG4gKiBEaXZpZGUgdXNpbmcgaGFsZi10by1ldmVuIChha2EgQmFua2VyJ3MgUm91bmRpbmcpIGFzIGluIElFRUUgNzc0IGRlZmF1bHRcbiAqIHJvdW5kaW5nXG4gKlxuICogQHR5cGUge05hdE9wfVxuICovXG4gIGJhbmtlcnNEaXZpZGU6IChhLCBiKSA9PiB7XG4gICAgYSA9IE5hdChhKTtcbiAgICBiID0gTmF0KGIpO1xuXG4gICAgY29uc3QgZGl2ID0gYSAvIGI7XG4gICAgY29uc3QgcmVtID0gYSAlIGI7XG4gICAgLyogaWYgcmVtYWluZGVyID4gaGFsZiBkaXZpc29yLCBzaG91bGQgaGF2ZSByb3VuZGVkIHVwIGluc3RlYWQgb2YgZG93biwgc28gYWRkIDEqL1xuICAgIGlmIChyZW0gKiAybiA+IGIpIHtcbiAgICAgIHJldHVybiBkaXYgKyAxbjtcbiAgICB9IGVsc2UgaWYgKHJlbSAqIDJuID09PSBiKSB7XG4gICAgICAvKiBBZGQgMSBpZiByZXN1bHQgaXMgb2RkIHRvIGdldCBhbiBldmVuIHJldHVybiB2YWx1ZSovXG4gICAgICBpZiAoZGl2ICUgMm4gPT09IDFuKSByZXR1cm4gZGl2ICsgMW47XG4gICAgfVxuICAgIHJldHVybiBkaXY7XG4gIH0sXG4gIC8qKiBAdHlwZSB7KHg6IG51bWJlciB8IGJpZ2ludCwgeTogbnVtYmVyIHwgYmlnaW50KSA9PiBib29sZWFufSAqL1xuICBpc0dURTogKHgsIHkpID0+IE5hdCh4KSA+PSBOYXQoeSksXG59KTskaM2PX29uY2UubmF0U2FmZU1hdGgobmF0U2FmZU1hdGgpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0U2FmZU1hdGgiOlsibmF0U2FmZU1hdGgiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYOSsWxkHAAAZBwAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvbm90aWZpZXIiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLHByb3ZpZGVMYXp5LG1ha2VOb3RpZmllcktpdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIixbJGjNj19hID0+IChwcm92aWRlTGF6eSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllcktpdFwiLFskaM2PX2EgPT4gKG1ha2VOb3RpZmllcktpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQdXJzZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtOb3RpZmllclJlY29yZH0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtXZWFrTWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICovXG5cbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG4gICAgICAgY29uc3QgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gKCkgPT4ge1xuICAvKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQdXJzZSwgTm90aWZpZXJSZWNvcmQ8YW55Pj59ICovXG4gIGNvbnN0IHRyYW5zaWVudE5vdGlmZXJLaXRzID0gbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShcbiAgICAndHJhbnNpZW50Tm90aWZlcktpdHMnLFxuICApO1xuXG4gIGNvbnN0IHByb3ZpZGVOb3RpZmllcktpdCA9IGtleSA9PlxuICAgIHByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLCBrZXksICgpID0+XG4gICAgICBtYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSksXG4gICAgKTtcblxuICBjb25zdCBwcm92aWRlTm90aWZpZXIgPSBrZXkgPT4gcHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG4gIGNvbnN0IHVwZGF0ZSA9IChrZXksIG5ld1ZhbHVlKSA9PiB7XG4gICAgaWYgKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKSB7XG4gICAgICBjb25zdCB7IHVwZGF0ZXIgfSA9IHRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xuICAgICAgdXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7IHByb3ZpZGVOb3RpZmllciwgdXBkYXRlIH07XG59OyRozY9fb25jZS5tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbmhhcmRlbihtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADl+t+rQC0AAEAtAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJBbW91bnRQYXR0ZXJuU2hhcGUiLCJBbW91bnRTaGFwZSIsIkFzc2V0S2luZFNoYXBlIiwiQnJhbmRJIiwiQnJhbmRTaGFwZSIsIkRlcG9zaXRGYWNldFNoYXBlIiwiRGlzcGxheUluZm9TaGFwZSIsIklzc3VlcktpdFNoYXBlIiwiSXNzdWVyU2hhcGUiLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiLCJNaW50U2hhcGUiLCJOb3RpZmllclNoYXBlIiwiUGF5bWVudFNoYXBlIiwiUHVyc2VTaGFwZSIsIlJhdGlvU2hhcGUiLCJpc0NvcHlCYWdWYWx1ZSIsImlzQ29weVNldFZhbHVlIiwiaXNOYXRWYWx1ZSIsImlzU2V0VmFsdWUiLCJtYWtlSXNzdWVySW50ZXJmYWNlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sbWF0Y2hlcyxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBpbXBvcnQge0Ftb3VudFZhbHVlLCBSYXRpb30gZnJvbSAnLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCdcbiAqIEBpbXBvcnQge0NvcHlCYWcsIENvcHlTZXQsIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge05hdFZhbHVlLCBTZXRWYWx1ZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuICAgICAgIGNvbnN0IEJyYW5kU2hhcGUgPSBNLnJlbW90YWJsZSgnQnJhbmQnKTskaM2PX29uY2UuQnJhbmRTaGFwZShCcmFuZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdJc3N1ZXInKTskaM2PX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuICAgICAgIGNvbnN0IFBheW1lbnRTaGFwZSA9IE0ucmVtb3RhYmxlKCdQYXltZW50Jyk7JGjNj19vbmNlLlBheW1lbnRTaGFwZShQYXltZW50U2hhcGUpO1xuICAgICAgIGNvbnN0IFB1cnNlU2hhcGUgPSBNLnJlbW90YWJsZSgnUHVyc2UnKTskaM2PX29uY2UuUHVyc2VTaGFwZShQdXJzZVNoYXBlKTtcbiAgICAgICBjb25zdCBEZXBvc2l0RmFjZXRTaGFwZSA9IE0ucmVtb3RhYmxlKCdEZXBvc2l0RmFjZXQnKTskaM2PX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuICAgICAgIGNvbnN0IE5vdGlmaWVyU2hhcGUgPSBNLnJlbW90YWJsZSgnTm90aWZpZXInKTskaM2PX29uY2UuTm90aWZpZXJTaGFwZShOb3RpZmllclNoYXBlKTtcbiAgICAgICBjb25zdCBNaW50U2hhcGUgPSBNLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBOYXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzIGFcbiAqIG5vbi1uZWdhdGl2ZSBiaWdpbnQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGF0IG1hbnkgdW5pdHMgb2YgdGhlIGZ1bmdpYmxlIGFzc2V0XG4gKiByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudC4gVGhlIGJyYW5kIG9mIHRoYXQgYW1vdW50IHNob3VsZCBpbmRlZWQgcmVwcmVzZW50XG4gKiBhIGtpbmQgb2YgYXNzZXQgY29uc2lzdGluZyBvZiBhIGNvdW50YWJsZSBzZXQgb2YgZnVuZ2libGUgdW5pdHMuXG4gKi8kaM2PX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlID0gTS5uYXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weVNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weVNldCwgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhvc2Uga2V5cywgd2hlcmUgZWFjaCBrZXlcbiAqIHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIG5vbi1mdW5naWJsZSBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsIGZyb20gdGhlXG4gKiBub24tZnVuZ2libGUgYXNzZXQgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIGFtb3VudFxuICogaXRzZWxmIHJlcHJlc2VudHMgdGhlIHNldCBvZiB0aGVzZSBpdGVtcywgYXMgb3Bwb3NlZCB0byBhbnkgb2YgdGhlIG90aGVyXG4gKiBpdGVtcyBmcm9tIHRoZSBzYW1lIGFzc2V0IGNsYXNzLlxuICpcbiAqIElmIGEgZ2l2ZW4gdmFsdWUgY2xhc3MgcmVwcmVzZW50cyBjb25jZXJ0IHRpY2tldHMsIGl0IHNlZW1zIGJpemFycmUgdGhhdCB3ZVxuICogY2FuIGZvcm0gYW1vdW50cyBvZiBhbnkga2V5LiBUaGUgaGFyZCBjb25zdHJhaW50IGlzIHRoYXQgdGhlIGNvZGUgdGhhdCBob2xkc1xuICogdGhlIG1pbnQgZm9yIHRoYXQgYXNzZXQgY2xhc3MtLS10aGUgb25lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGJyYW5kLCBvbmx5XG4gKiBtaW50cyB0aGUgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSByZWFsIHVuaXRzIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieVxuICogaXQuIEFueW9uZSBlbHNlIGNhbiBwdXQgdG9nZXRoZXIgYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXlcbiAqIFwid2FudFwiIHNvbWUgaXRlbXMgdGhhdCB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmVcbiAqIHNhdGlzZmllZC4gXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlTZXRWYWx1ZVNoYXBlID0gTS5zZXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgU2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdCBpcyBhXG4gKiBDb3B5QXJyYXkgb2YgcGFzc2FibGUgS2V5cy4gVGhpcyByZXByZXNlbnRhdGlvbiBpcyBkZXByZWNhdGVkLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogICBDb3B5U2V0VmFsdWVzLlxuICovXG5jb25zdCBTZXRWYWx1ZVNoYXBlID0gTS5hcnJheU9mKE0ua2V5KCkpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5QmFnVmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QmFnLCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIGJhZyAobXVsdGlzZXQpIG9mIHRob3NlIGtleXMsIHdoZXJlIGVhY2hcbiAqIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBzZW1pLWZ1bmdpYmxlIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCxcbiAqIGZyb20gdGhlIHNlbWktZnVuZ2libGUgYXNzZXQgY2xhc3MgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlXG4gKiBudW1iZXIgb2YgdGltZXMgdGhhdCBrZXkgYXBwZWFycyBpbiB0aGUgYmFnIGlzIHRoZSBudW1iZXIgb2YgZnVuZ2libGUgdW5pdHNcbiAqIG9mIHRoYXQga2V5LiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzIHRoZSBiYWcgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWRcbiAqIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXMgZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlIHRoYXQgd2VcbiAqIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0IHRoZSBjb2RlIHRoYXQgaG9sZHNcbiAqIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBicmFuZCwgb25seVxuICogbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0cyBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnlcbiAqIGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5XG4gKiBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXQgd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlXG4gKiBzYXRpc2ZpZWQuIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5QmFnVmFsdWVTaGFwZSA9IE0uYmFnKCk7XG5cbmNvbnN0IEFtb3VudFZhbHVlU2hhcGUgPSBNLm9yKFxuICBOYXRWYWx1ZVNoYXBlLFxuICBDb3B5U2V0VmFsdWVTaGFwZSxcbiAgU2V0VmFsdWVTaGFwZSxcbiAgQ29weUJhZ1ZhbHVlU2hhcGUsXG4pO1xuXG4gICAgICAgY29uc3QgQW1vdW50U2hhcGUgPSB7IGJyYW5kOiBCcmFuZFNoYXBlLCB2YWx1ZTogQW1vdW50VmFsdWVTaGFwZSB9OyRozY9fb25jZS5BbW91bnRTaGFwZShBbW91bnRTaGFwZSk7XG5oYXJkZW4oQW1vdW50U2hhcGUpO1xuXG4vKipcbiAqIFRvIGJlIHVzZWQgdG8gZ3VhcmQgYW4gYW1vdW50IHBhdHRlcm4gYXJndW1lbnQsIGkuZS4sIGFuIGFyZ3VtZW50IHdoaWNoIGlzIGFcbiAqIHBhdHRlcm4gdGhhdCBjYW4gYmUgdXNlZCB0byB0ZXN0IGFtb3VudHMuIFNpbmNlIGFtb3VudHMgYXJlIGtleXMsIGFueXdoZXJlIGFuXG4gKiBhbW91bnQgcGF0dGVybiBpcyBleHBlY3RlZCwgYW4gYW1vdW50IGNhbiBiZSBwcm92aWRlZCBhbmQgd2lsbCBtYXRjaCBvbmx5XG4gKiB0aGF0IGNvbmNyZXRlIGFtb3VudCwgaS5lLiwgYW1vdW50cyB0aGF0IGFyZSBga2V5RVFgIHRvIHRoYXQgYW1vdW50LlxuICpcbiAqIFRoZSBgQW1vdW50U2hhcGVgIGd1YXJkIGFib3ZlIGlzIGFuIGFtb3VudCBwYXR0ZXJuLiBCdXQgbm90IGFsbCBhbW91bnRcbiAqIHBhdHRlcm5zIGFyZSBsaWtlIGBBbW91bnRTaGFwZWAuIEZvciBleGFtcGxlLCBgTS5hbnkoKWAgaXMgYSB2YWxpZCBhbW91bnRcbiAqIHBhdHRlcm4gdGhhdCB3aWxsIGFkbWl0IGFueSBhbW91bnQsIGJ1dCBpcyBkb2VzIG5vdCByZXNlbWJsZSB0aGVcbiAqIGBBbW91bnRTaGFwZWAgcGF0dGVybiBhYm92ZS5cbiAqL1xuICAgICAgIGNvbnN0IEFtb3VudFBhdHRlcm5TaGFwZSA9IE0ucGF0dGVybigpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxSYXRpbz59ICovJGjNj19vbmNlLkFtb3VudFBhdHRlcm5TaGFwZShBbW91bnRQYXR0ZXJuU2hhcGUpO1xuICAgICAgIGNvbnN0IFJhdGlvU2hhcGUgPSB7IG51bWVyYXRvcjogQW1vdW50U2hhcGUsIGRlbm9taW5hdG9yOiBBbW91bnRTaGFwZSB9OyRozY9fb25jZS5SYXRpb1NoYXBlKFJhdGlvU2hhcGUpO1xuaGFyZGVuKFJhdGlvU2hhcGUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIE5hdCBiaWdpbnQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBOYXRWYWx1ZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzTmF0VmFsdWUgPSB2YWx1ZSA9PiBtYXRjaGVzKHZhbHVlLCBOYXRWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNOYXRWYWx1ZShpc05hdFZhbHVlKTtcbmhhcmRlbihpc05hdFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5U2V0XG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5U2V0fVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5U2V0VmFsdWUgPSB2YWx1ZSA9PiBtYXRjaGVzKHZhbHVlLCBDb3B5U2V0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzQ29weVNldFZhbHVlKGlzQ29weVNldFZhbHVlKTtcbmhhcmRlbihpc0NvcHlTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgcGFzcyBieSBjb3B5IGFycmF5IHN0cnVjdHVyZS4gRG9lcyBub3QgY2hlY2sgZm9yXG4gKiBkdXBsaWNhdGVzLiBUbyBjaGVjayBmb3IgZHVwbGljYXRlcywgdXNlIHNldE1hdGhIZWxwZXJzLmNvZXJjZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqICAgQ29weVNldFZhbHVlcy5cbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgU2V0VmFsdWV9XG4gKi9cbiAgICAgICBjb25zdCBpc1NldFZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgU2V0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzU2V0VmFsdWUoaXNTZXRWYWx1ZSk7XG5oYXJkZW4oaXNTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgQ29weUJhZ1xuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgQ29weUJhZ31cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weUJhZ1ZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgQ29weUJhZ1ZhbHVlU2hhcGUpOyRozY9fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vKiBPbmUgR09PR09MdGggc2hvdWxkIGJlIGVub3VnaCBkZWNpbWFsIHBsYWNlcyBmb3IgYW55Ym9keS4qL1xuICAgICAgIGNvbnN0IE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyA9IDEwMDskaM2PX29uY2UuTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyk7XG5cbiAgICAgICBjb25zdCBBc3NldEtpbmRTaGFwZSA9IE0ub3IoJ25hdCcsICdzZXQnLCAnY29weVNldCcsICdjb3B5QmFnJyk7JGjNj19vbmNlLkFzc2V0S2luZFNoYXBlKEFzc2V0S2luZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IERpc3BsYXlJbmZvU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7fSxcbiAge1xuICAgIGRlY2ltYWxQbGFjZXM6IE0uYW5kKFxuICAgICAgTS5ndGUoLU1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyksXG4gICAgICBNLmx0ZShNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuICAgICksXG4gICAgYXNzZXRLaW5kOiBBc3NldEtpbmRTaGFwZSxcbiAgfSxcbiAge1xuICAgIC8qIEluY2x1ZGluZyB0aGlzIGVtcHR5IGByZXN0YCBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyKi9cbiAgICAvKiBwcm9wZXJ0aWVzIGJleW9uZCB0aG9zZSBpbiB0aGUgYGJhc2VgIHJlY29yZC4qL1xuICB9LFxuKTskaM2PX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtcblxuICAgICAgIGNvbnN0IElzc3VlcktpdFNoYXBlID0ge1xuICBicmFuZDogQnJhbmRTaGFwZSxcbiAgbWludDogTWludFNoYXBlLFxuICBtaW50UmVjb3ZlcnlQdXJzZTogUHVyc2VTaGFwZSxcbiAgaXNzdWVyOiBJc3N1ZXJTaGFwZSxcbiAgZGlzcGxheUluZm86IERpc3BsYXlJbmZvU2hhcGUsXG59OyRozY9fb25jZS5Jc3N1ZXJLaXRTaGFwZShJc3N1ZXJLaXRTaGFwZSk7XG5oYXJkZW4oSXNzdWVyS2l0U2hhcGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgICAgICBjb25zdCBCcmFuZEkgPSBNLmludGVyZmFjZSgnQnJhbmQnLCB7XG4gIGlzTXlJc3N1ZXI6IE0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICBnZXRBbGxlZ2VkTmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0RGlzcGxheUluZm86IE0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG4gIGdldEFtb3VudFNoYXBlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKSxcbn0pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2JyYW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthc3NldEtpbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Ftb3VudFNoYXBlXVxuICovJGjNj19vbmNlLkJyYW5kSShCcmFuZEkpO1xuICAgICAgIGNvbnN0IG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gKFxuICBicmFuZFNoYXBlID0gQnJhbmRTaGFwZSxcbiAgYXNzZXRLaW5kU2hhcGUgPSBBc3NldEtpbmRTaGFwZSxcbiAgYW1vdW50U2hhcGUgPSBBbW91bnRTaGFwZSxcbikgPT4ge1xuICBjb25zdCBJc3N1ZXJJID0gTS5pbnRlcmZhY2UoJ0lzc3VlcicsIHtcbiAgICBnZXRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbiAgICBnZXRBbGxlZ2VkTmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgICBnZXRBc3NldEtpbmQ6IE0uY2FsbCgpLnJldHVybnMoYXNzZXRLaW5kU2hhcGUpLFxuICAgIGdldERpc3BsYXlJbmZvOiBNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxuICAgIG1ha2VFbXB0eVB1cnNlOiBNLmNhbGwoKS5yZXR1cm5zKFB1cnNlU2hhcGUpLFxuXG4gICAgaXNMaXZlOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gICAgZ2V0QW1vdW50T2Y6IE0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgICBidXJuOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSlcbiAgICAgIC5vcHRpb25hbChBbW91bnRQYXR0ZXJuU2hhcGUpXG4gICAgICAucmV0dXJucyhhbW91bnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IE1pbnRJID0gTS5pbnRlcmZhY2UoJ01pbnQnLCB7XG4gICAgZ2V0SXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgICBtaW50UGF5bWVudDogTS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IFBheW1lbnRJID0gTS5pbnRlcmZhY2UoJ1BheW1lbnQnLCB7XG4gICAgZ2V0QWxsZWdlZEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBQdXJzZUkgPSBNLmludGVyZmFjZSgnUHVyc2UnLCB7XG4gICAgZ2V0QWxsZWdlZEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICAgIGdldEN1cnJlbnRBbW91bnQ6IE0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICAgIGdldEN1cnJlbnRBbW91bnROb3RpZmllcjogTS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbiAgICAvKiBQdXJzZUkgZG9lcyAqbm90KiBkZWxheSBgZGVwb3NpdGAgdW50aWwgYHNyY1BheW1lbnRgIGlzIGZ1bGZ1bGxlZC4qL1xuICAgIC8qIFJhdGhlciwgdGhlIHNlbWFudGljcyBvZiBgZGVwb3NpdGAgcmVxdWlyZSBpdCB0byBwcm92aWRlIGl0cyovXG4gICAgLyogY2FsbGVycyB3aXRoIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGBkZXBvc2l0YCBtZXNzYWdlcyBhcmUqL1xuICAgIC8qIHByb2Nlc3NlZCB3aXRob3V0IGZ1cnRoZXIgZGVsYXkgaW4gdGhlIG9yZGVyIHRoZXkgYXJyaXZlLiovXG4gICAgLyogUHVyc2VJIHRoZXJlZm9yZSByZXF1aXJlcyB0aGF0IHRoZSBgc3JjUGF5bWVudGAgYXJndW1lbnQgYWxyZWFkeSovXG4gICAgLyogYmUgYSByZW1vdGFibGUsIG5vdCBhIHByb21pc2UuKi9cbiAgICAvKiBQdXJzZUkgb25seSBjYWxscyB0aGlzIHJhdyBtZXRob2QgYWZ0ZXIgdmFsaWRhdGluZyB0aGF0Ki9cbiAgICAvKiBgc3JjUGF5bWVudGAgaXMgYSByZW1vdGFibGUsIGxlYXZpbmcgaXQqL1xuICAgIC8qIHRvIHRoaXMgcmF3IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgcmVtb3RhYmxlIGlzIGFjdHVhbGx5Ki9cbiAgICAvKiBhIGxpdmUgcGF5bWVudCBvZiB0aGUgY29ycmVjdCBicmFuZCB3aXRoIHN1ZmZpY2llbnQgZnVuZHMuKi9cbiAgICBkZXBvc2l0OiBNLmNhbGwoUGF5bWVudFNoYXBlKVxuICAgICAgLm9wdGlvbmFsKEFtb3VudFBhdHRlcm5TaGFwZSlcbiAgICAgIC5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgICBnZXREZXBvc2l0RmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoRGVwb3NpdEZhY2V0U2hhcGUpLFxuICAgIHdpdGhkcmF3OiBNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbiAgICBnZXRSZWNvdmVyeVNldDogTS5jYWxsKCkucmV0dXJucyhNLnNldE9mKFBheW1lbnRTaGFwZSkpLFxuICAgIHJlY292ZXJBbGw6IE0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBEZXBvc2l0RmFjZXRJID0gTS5pbnRlcmZhY2UoJ0RlcG9zaXRGYWNldCcsIHtcbiAgICByZWNlaXZlOiBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoUHVyc2VJKS5tZXRob2RHdWFyZHMuZGVwb3NpdCxcbiAgfSk7XG5cbiAgY29uc3QgUHVyc2VJS2l0ID0ge1xuICAgIHB1cnNlOiBQdXJzZUksXG4gICAgZGVwb3NpdEZhY2V0OiBEZXBvc2l0RmFjZXRJLFxuICB9O1xuICBoYXJkZW4oUHVyc2VJS2l0KTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBJc3N1ZXJJLFxuICAgIE1pbnRJLFxuICAgIFBheW1lbnRJLFxuICAgIFB1cnNlSUtpdCxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlSXNzdWVySW50ZXJmYWNlcyhtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG5oYXJkZW4obWFrZUlzc3VlckludGVyZmFjZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJhbmRTaGFwZSI6WyJCcmFuZFNoYXBlIl0sIklzc3VlclNoYXBlIjpbIklzc3VlclNoYXBlIl0sIlBheW1lbnRTaGFwZSI6WyJQYXltZW50U2hhcGUiXSwiUHVyc2VTaGFwZSI6WyJQdXJzZVNoYXBlIl0sIkRlcG9zaXRGYWNldFNoYXBlIjpbIkRlcG9zaXRGYWNldFNoYXBlIl0sIk5vdGlmaWVyU2hhcGUiOlsiTm90aWZpZXJTaGFwZSJdLCJNaW50U2hhcGUiOlsiTWludFNoYXBlIl0sIkFtb3VudFNoYXBlIjpbIkFtb3VudFNoYXBlIl0sIkFtb3VudFBhdHRlcm5TaGFwZSI6WyJBbW91bnRQYXR0ZXJuU2hhcGUiXSwiUmF0aW9TaGFwZSI6WyJSYXRpb1NoYXBlIl0sImlzTmF0VmFsdWUiOlsiaXNOYXRWYWx1ZSJdLCJpc0NvcHlTZXRWYWx1ZSI6WyJpc0NvcHlTZXRWYWx1ZSJdLCJpc1NldFZhbHVlIjpbImlzU2V0VmFsdWUiXSwiaXNDb3B5QmFnVmFsdWUiOlsiaXNDb3B5QmFnVmFsdWUiXSwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIjpbIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyJdLCJBc3NldEtpbmRTaGFwZSI6WyJBc3NldEtpbmRTaGFwZSJdLCJEaXNwbGF5SW5mb1NoYXBlIjpbIkRpc3BsYXlJbmZvU2hhcGUiXSwiSXNzdWVyS2l0U2hhcGUiOlsiSXNzdWVyS2l0U2hhcGUiXSwiQnJhbmRJIjpbIkJyYW5kSSJdLCJtYWtlSXNzdWVySW50ZXJmYWNlcyI6WyJtYWtlSXNzdWVySW50ZXJmYWNlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKXsSa8bBQAAGwUAACsAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29uc3RhbnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJQYXJhbVR5cGUiLCJQYXJhbVR5cGVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qKlxuICogRW51bSBvZiBwYXJhbWV0ZXIgdHlwZXNcbiAqXG4gKiBVTktOT1dOIGlzIGFuIGVzY2FwZSBoYXRjaCBmb3IgdHlwZXMgd2UgaGF2ZW4ndCBhZGRlZCB5ZXQuIElmIHlvdSBhcmVcbiAqIGRldmVsb3BpbmcgYSBuZXcgY29udHJhY3QgYW5kIHVzZSBVTktOT1dOLCBwbGVhc2UgYWxzbyBmaWxlIGFuIGlzc3VlIHRvIGFza1xuICogdXMgdG8gc3VwcG9ydCB0aGUgbmV3IHR5cGUuXG4gKiBAZW51bSB7dHlwZW9mIFBhcmFtVHlwZVtrZXlvZiB0eXBlb2YgUGFyYW1UeXBlXX1cbiAqL1xuICAgICAgIGNvbnN0IFBhcmFtVHlwZSA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIEFNT1VOVDogJ2Ftb3VudCcsXG4gIEJSQU5EOiAnYnJhbmQnLFxuICBJTlNUQUxMQVRJT046ICdpbnN0YWxsYXRpb24nLFxuICBJTlNUQU5DRTogJ2luc3RhbmNlJyxcbiAgSU5WSVRBVElPTjogJ2ludml0YXRpb24nLFxuICBOQVQ6ICduYXQnLFxuICBSQVRJTzogJ3JhdGlvJyxcbiAgU1RSSU5HOiAnc3RyaW5nJyxcbiAgUEFTU0FCTEVfUkVDT1JEOiAncmVjb3JkJyxcbiAgVElNRVNUQU1QOiAndGltZXN0YW1wJyxcbiAgUkVMQVRJVkVfVElNRTogJ3JlbGF0aXZlVGltZScsXG4gIFVOS05PV046ICd1bmtub3duJyxcbn0pOyRozY9fb25jZS5QYXJhbVR5cGUoUGFyYW1UeXBlKTtcbmhhcmRlbihQYXJhbVR5cGUpO1xuXG4vKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqL1xuLyogU2hhbGxvdyBjb3B5IHRvIHdvcmsgYXJvdW5kIFRTIGQudHMgZGVmaW5pbmcgYW4gZW1wdHkgbmFtZXNwYWNlIGluc3RlYWQgb2YgYW4gb2JqZWN0Ki9cbiAgICAgICBjb25zdCBQYXJhbVR5cGVzID0geyAuLi5QYXJhbVR5cGUgfTskaM2PX29uY2UuUGFyYW1UeXBlcyhQYXJhbVR5cGVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlBhcmFtVHlwZSI6WyJQYXJhbVR5cGUiXSwiUGFyYW1UeXBlcyI6WyJQYXJhbVR5cGVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACLoBfPFDAAAxQwAAD8AAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2Fzc2VydGlvbnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIl0sImV4cG9ydHMiOlsiYXNzZXJ0UmVsYXRpdmVUaW1lIiwiYXNzZXJ0VGltZXN0YW1wIiwibWFrZUFzc2VydEJyYW5kZWRSYXRpbyIsIm1ha2VBc3NlcnRJbnN0YWxsYXRpb24iLCJtYWtlQXNzZXJ0SW5zdGFuY2UiLCJtYWtlTG9va3NMaWtlQnJhbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLGlzUmVtb3RhYmxlLGFzc2VydElzUmF0aW8sbXVzdE1hdGNoLFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLFRpbWVzdGFtcFJlY29yZFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzUmVtb3RhYmxlXCIsWyRozY9fYSA9PiAoaXNSZW1vdGFibGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzXCIsIFtbXCJhc3NlcnRJc1JhdGlvXCIsWyRozY9fYSA9PiAoYXNzZXJ0SXNSYXRpbyA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSA9ICRozY9fYSldXSxbXCJUaW1lc3RhbXBSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFJlY29yZFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0JyYW5kfSBmcm9tICdAYWdvcmljL2VydHAnO1xuICovXG5cbmNvbnN0IG1ha2VMb29rc0xpa2VCcmFuZCA9IG5hbWUgPT4ge1xuICAvKiogQHBhcmFtIHtCcmFuZH0gYnJhbmQgKi9cbiAgcmV0dXJuIGJyYW5kID0+IHtcbiAgICBpc1JlbW90YWJsZShicmFuZCkgfHwgRmFpbGB2YWx1ZSBmb3IgJHtuYW1lfSBtdXN0IGJlIGEgYnJhbmQsIHdhcyAke2JyYW5kfWA7XG4gIH07XG59OyRozY9fb25jZS5tYWtlTG9va3NMaWtlQnJhbmQobWFrZUxvb2tzTGlrZUJyYW5kKTtcbmhhcmRlbihtYWtlTG9va3NMaWtlQnJhbmQpO1xuXG5jb25zdCBtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uID0gbmFtZSA9PiB7XG4gIHJldHVybiBpbnN0YWxsYXRpb24gPT4ge1xuICAgIC8qIFRPRE8oMzM0NCk6IGFkZCBhIGJldHRlciBhc3NlcnRpb24gb25jZSBab2UgdmFsaWRhdGVzIGluc3RhbGxhdGlvbnMqL1xuICAgIHR5cGVvZiBpbnN0YWxsYXRpb24gPT09ICdvYmplY3QnIHx8XG4gICAgICBGYWlsYHZhbHVlIGZvciAke25hbWV9IG11c3QgYmUgYW4gSW5zdGFsbGF0aW9uLCB3YXMgJHtpbnN0YWxsYXRpb259YDtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VBc3NlcnRJbnN0YWxsYXRpb24obWFrZUFzc2VydEluc3RhbGxhdGlvbik7XG5oYXJkZW4obWFrZUFzc2VydEluc3RhbGxhdGlvbik7XG5cbmNvbnN0IG1ha2VBc3NlcnRJbnN0YW5jZSA9IG5hbWUgPT4ge1xuICByZXR1cm4gaW5zdGFuY2UgPT4ge1xuICAgIC8qIFRPRE8oMzM0NCk6IGFkZCBhIGJldHRlciBhc3NlcnRpb24gb25jZSBab2UgdmFsaWRhdGVzIGluc3RhbmNlcyovXG4gICAgdHlwZW9mIGluc3RhbmNlID09PSAnb2JqZWN0JyB8fFxuICAgICAgRmFpbGB2YWx1ZSBmb3IgJHtuYW1lfSBtdXN0IGJlIGFuIEluc3RhbmNlLCB3YXMgJHtpbnN0YW5jZX1gO1xuICB9O1xufTskaM2PX29uY2UubWFrZUFzc2VydEluc3RhbmNlKG1ha2VBc3NlcnRJbnN0YW5jZSk7XG5oYXJkZW4obWFrZUFzc2VydEluc3RhbmNlKTtcblxuY29uc3QgbWFrZUFzc2VydEJyYW5kZWRSYXRpbyA9IChuYW1lLCBtb2RlbFJhdGlvKSA9PiB7XG4gIHJldHVybiByYXRpbyA9PiB7XG4gICAgYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG4gICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kID09PSBtb2RlbFJhdGlvLm51bWVyYXRvci5icmFuZCB8fFxuICAgICAgRmFpbGBOdW1lcmF0b3IgYnJhbmQgZm9yICR7bmFtZX0gbXVzdCBiZSAke21vZGVsUmF0aW8ubnVtZXJhdG9yLmJyYW5kfWA7XG4gICAgcmF0aW8uZGVub21pbmF0b3IuYnJhbmQgPT09IG1vZGVsUmF0aW8uZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgICAgIEZhaWxgRGVub21pbmF0b3IgYnJhbmQgZm9yICR7bmFtZX0gbXVzdCBiZSAke21vZGVsUmF0aW8uZGVub21pbmF0b3IuYnJhbmR9YDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VBc3NlcnRCcmFuZGVkUmF0aW8obWFrZUFzc2VydEJyYW5kZWRSYXRpbyk7XG5oYXJkZW4obWFrZUFzc2VydEJyYW5kZWRSYXRpbyk7XG5cbmNvbnN0IGFzc2VydFJlbGF0aXZlVGltZSA9IHZhbHVlID0+IHtcbiAgbXVzdE1hdGNoKHZhbHVlLCBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSk7XG59OyRozY9fb25jZS5hc3NlcnRSZWxhdGl2ZVRpbWUoYXNzZXJ0UmVsYXRpdmVUaW1lKTtcbmhhcmRlbihhc3NlcnRSZWxhdGl2ZVRpbWUpO1xuXG5jb25zdCBhc3NlcnRUaW1lc3RhbXAgPSB2YWx1ZSA9PiB7XG4gIG11c3RNYXRjaCh2YWx1ZSwgVGltZXN0YW1wUmVjb3JkU2hhcGUsICd0aW1lc3RhbXAnKTtcbn07JGjNj19vbmNlLmFzc2VydFRpbWVzdGFtcChhc3NlcnRUaW1lc3RhbXApO1xuaGFyZGVuKGFzc2VydFRpbWVzdGFtcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTG9va3NMaWtlQnJhbmQiOlsibWFrZUxvb2tzTGlrZUJyYW5kIl0sIm1ha2VBc3NlcnRJbnN0YWxsYXRpb24iOlsibWFrZUFzc2VydEluc3RhbGxhdGlvbiJdLCJtYWtlQXNzZXJ0SW5zdGFuY2UiOlsibWFrZUFzc2VydEluc3RhbmNlIl0sIm1ha2VBc3NlcnRCcmFuZGVkUmF0aW8iOlsibWFrZUFzc2VydEJyYW5kZWRSYXRpbyJdLCJhc3NlcnRSZWxhdGl2ZVRpbWUiOlsiYXNzZXJ0UmVsYXRpdmVUaW1lIl0sImFzc2VydFRpbWVzdGFtcCI6WyJhc3NlcnRUaW1lc3RhbXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYtE9ftQVAADUFQAAPgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSIsIi4uL3F1ZXN0aW9uLmpzIl0sImV4cG9ydHMiOlsibWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMiLCJzZXR1cEFwaUdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRSxGYXIsa2V5RVEsQ2hvaWNlTWV0aG9kLFF1b3J1bVJ1bGUsRWxlY3Rpb25UeXBlLGNvZXJjZVF1ZXN0aW9uU3BlYzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV1dXSxbXCIuLi9xdWVzdGlvbi5qc1wiLCBbW1wiQ2hvaWNlTWV0aG9kXCIsWyRozY9fYSA9PiAoQ2hvaWNlTWV0aG9kID0gJGjNj19hKV1dLFtcIlF1b3J1bVJ1bGVcIixbJGjNj19hID0+IChRdW9ydW1SdWxlID0gJGjNj19hKV1dLFtcIkVsZWN0aW9uVHlwZVwiLFskaM2PX2EgPT4gKEVsZWN0aW9uVHlwZSA9ICRozY9fYSldXSxbXCJjb2VyY2VRdWVzdGlvblNwZWNcIixbJGjNj19hID0+IChjb2VyY2VRdWVzdGlvblNwZWMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q29udHJhY3RNZXRhLCBJbnN0YWxsYXRpb24sIEluc3RhbmNlLCBJbnZpdGF0aW9uLCBaQ0Z9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7UG9zaXRpb24sIEFwaUdvdmVybm9yLCBBcGlJbnZvY2F0aW9uSXNzdWUsIFBvc2VyRmFjZXQsIFZvdGVPbkFwaUludm9jYXRpb24sIEdvdmVybmVkQXBpc30gZnJvbSAnLi4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tICdAYWdvcmljL3RpbWUnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbi8qKlxuICogTWFrZSBhIHBhaXIgb2YgcG9zaXRpb25zIGZvciBhIHF1ZXN0aW9uIGFib3V0IHdoZXRoZXIgdG8gaW52b2tlIGFuIEFQSS4gSWZcbiAqIHRoZSB2b3RlIHBhc3NlcywgdGhlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbiB0aGUgZ292ZXJuZWRBcGlzIGZhY2V0IHdpdGggdGhlXG4gKiBhcmd1bWVudHMgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGlNZXRob2ROYW1lXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IG1ldGhvZEFyZ3NcbiAqL1xuY29uc3QgbWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMgPSAoYXBpTWV0aG9kTmFtZSwgbWV0aG9kQXJncykgPT4ge1xuICBjb25zdCBwb3NpdGl2ZSA9IGhhcmRlbih7IGFwaU1ldGhvZE5hbWUsIG1ldGhvZEFyZ3MgfSk7XG4gIGNvbnN0IG5lZ2F0aXZlID0gaGFyZGVuKHsgZG9udEludm9rZTogYXBpTWV0aG9kTmFtZSB9KTtcbiAgcmV0dXJuIGhhcmRlbih7IHBvc2l0aXZlLCBuZWdhdGl2ZSB9KTtcbn07XG5cbi8qKlxuICogbWFuYWdlIGNvbnRyYWN0cyB0aGF0IGFsbG93IGdvdmVybmFuY2UgdG8gaW52b2tlIGZ1bmN0aW9ucy5cbiAqXG4gKiBAcGFyYW0geygpID0+IEVSZWY8R292ZXJuZWRBcGlzPn0gZ2V0R292ZXJuZWRBcGlzXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8QXJyYXk8c3RyaW5nIHwgc3ltYm9sPj59IGdldEdvdmVybmVkTmFtZXMgbmFtZXMgb2YgdGhlIGdvdmVybmVkIEFQSSBtZXRob2RzXG4gKiBAcGFyYW0ge0VSZWY8VGltZXJTZXJ2aWNlPn0gdGltZXJcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxQb3NlckZhY2V0Pn0gZ2V0VXBkYXRlZFBvc2VyRmFjZXRcbiAqIEByZXR1cm5zIHtBcGlHb3Zlcm5vcn1cbiAqLyRozY9fb25jZS5tYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyhtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyk7XG5jb25zdCBzZXR1cEFwaUdvdmVybmFuY2UgPSAoXG4gIGdldEdvdmVybmVkQXBpcyxcbiAgZ2V0R292ZXJuZWROYW1lcyxcbiAgdGltZXIsXG4gIGdldFVwZGF0ZWRQb3NlckZhY2V0LFxuKSA9PiB7XG4gIC8qKiBAdHlwZSB7V2Vha1NldDxJbnN0YW5jZT59ICovXG4gIGNvbnN0IHZvdGVDb3VudGVycyA9IG5ldyBXZWFrU2V0KCk7XG5cbiAgLyoqIEB0eXBlIHtWb3RlT25BcGlJbnZvY2F0aW9ufSAqL1xuICBjb25zdCB2b3RlT25BcGlJbnZvY2F0aW9uID0gYXN5bmMgKFxuICAgIGFwaU1ldGhvZE5hbWUsXG4gICAgbWV0aG9kQXJncyxcbiAgICB2b3RlQ291bnRlckluc3RhbGxhdGlvbixcbiAgICBkZWFkbGluZSxcbiAgKSA9PiB7XG4gICAgY29uc3QgZ292ZXJuZWROYW1lcyA9IGF3YWl0IGdldEdvdmVybmVkTmFtZXMoKTtcbiAgICBnb3Zlcm5lZE5hbWVzLmluY2x1ZGVzKGFwaU1ldGhvZE5hbWUpIHx8XG4gICAgICBGYWlsYCR7YXBpTWV0aG9kTmFtZX0gaXMgbm90IGEgZ292ZXJuZWQgQVBJLmA7XG5cbiAgICBjb25zdCB7IHBvc2l0aXZlLCBuZWdhdGl2ZSB9ID0gbWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMoXG4gICAgICBhcGlNZXRob2ROYW1lLFxuICAgICAgbWV0aG9kQXJncyxcbiAgICApO1xuXG4gICAgLyoqIEB0eXBlIHtBcGlJbnZvY2F0aW9uSXNzdWV9ICovXG4gICAgY29uc3QgaXNzdWUgPSBoYXJkZW4oeyBhcGlNZXRob2ROYW1lLCBtZXRob2RBcmdzIH0pO1xuICAgIGNvbnN0IHF1ZXN0aW9uU3BlYyA9IGNvZXJjZVF1ZXN0aW9uU3BlYyh7XG4gICAgICBtZXRob2Q6IENob2ljZU1ldGhvZC5VTlJBTktFRCxcbiAgICAgIGlzc3VlLFxuICAgICAgcG9zaXRpb25zOiBbcG9zaXRpdmUsIG5lZ2F0aXZlXSxcbiAgICAgIGVsZWN0aW9uVHlwZTogRWxlY3Rpb25UeXBlLkFQSV9JTlZPQ0FUSU9OLFxuICAgICAgbWF4Q2hvaWNlczogMSxcbiAgICAgIG1heFdpbm5lcnM6IDEsXG4gICAgICBjbG9zaW5nUnVsZTogeyB0aW1lciwgZGVhZGxpbmUgfSxcbiAgICAgIHF1b3J1bVJ1bGU6IFF1b3J1bVJ1bGUuTUFKT1JJVFksXG4gICAgICB0aWVPdXRjb21lOiBuZWdhdGl2ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcHVibGljRmFjZXQ6IGNvdW50ZXJQdWJsaWNGYWNldCwgaW5zdGFuY2U6IHZvdGVDb3VudGVyIH0gPSBhd2FpdCBFKFxuICAgICAgZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSxcbiAgICApLmFkZFF1ZXN0aW9uKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLCBxdWVzdGlvblNwZWMpO1xuXG4gICAgdm90ZUNvdW50ZXJzLmFkZCh2b3RlQ291bnRlcik7XG5cbiAgICAvKiBDUlVDSUFMOiBIZXJlIHdlIHdhaXQgZm9yIHRoZSB2b3RlQ291bnRlciB0byBkZWNsYXJlIGFuIG91dGNvbWUsIGFuZCB0aGVuKi9cbiAgICAvKiBhdHRlbXB0IHRvIGludm9rZSB0aGUgQVBJIGlmIHRoYXQncyB3aGF0IHRoZSB2b3RlIGNhbGxlZCBmb3IuIFdlIG5lZWQgdG8qL1xuICAgIC8qIG1ha2Ugc3VyZSB0aGF0IG91dGNvbWVPZlVwZGF0ZVAgaXMgdXBkYXRlZCB3aGF0ZXZlciBoYXBwZW5zLiovXG4gICAgLyoqL1xuICAgIC8qICogSWYgdGhlIHZvdGUgcGFzc2VkLCBpbnZva2UgdGhlIEFQSSwgYW5kIHJldHVybiB0aGUgcG9zaXRpdmUgcG9zaXRpb24qL1xuICAgIC8qICogSWYgdGhlIHZvdGUgd2FzIG5lZ2F0aXZlLCByZXR1cm4gdGhlIG5lZ2F0aXZlIHBvc2l0aW9uKi9cbiAgICAvKiAqIElmIHdlIGNhbid0IGRvIGVpdGhlciwgKHRoZSB2b3RlIGZhaWxlZCBvciB0aGUgQVBJIGludm9jYXRpb24gZmFpbGVkKSovXG4gICAgLyogcmV0dXJuIGEgYnJva2VuIHByb21pc2UuKi9cbiAgICBjb25zdCBvdXRjb21lT2ZVcGRhdGUgPSBFKGNvdW50ZXJQdWJsaWNGYWNldClcbiAgICAgIC5nZXRPdXRjb21lKClcbiAgICAgIC50aGVuKFxuICAgICAgICAvKiogQHR5cGUgeyhvdXRjb21lOiBQb3NpdGlvbikgPT4gUHJvbWlzZTxQb3NpdGlvbj59ICovXG4gICAgICAgIGFzeW5jIG91dGNvbWUgPT4ge1xuICAgICAgICAgIGF3YWl0IG51bGw7XG5cbiAgICAgICAgICBpZiAoa2V5RVEocG9zaXRpdmUsIG91dGNvbWUpKSB7XG4gICAgICAgICAgICBrZXlFUShvdXRjb21lLCBoYXJkZW4oeyBhcGlNZXRob2ROYW1lLCBtZXRob2RBcmdzIH0pKSB8fFxuICAgICAgICAgICAgICBGYWlsYFRoZSBxdWVzdGlvbidzIG1ldGhvZCBuYW1lICgke3EoXG4gICAgICAgICAgICAgICAgYXBpTWV0aG9kTmFtZSxcbiAgICAgICAgICAgICAgKX0pIGFuZCBhcmdzICgke21ldGhvZEFyZ3N9KSBkaWRuJ3QgbWF0Y2ggdGhlIG91dGNvbWUgJHtvdXRjb21lfWA7XG5cbiAgICAgICAgICAgIC8qIEUocmVtb3RlKVtuYW1lXShhcmdzKSBpbnZva2VzIHRoZSBtZXRob2QgbmFtZWQgJ25hbWUnIG9uIHJlbW90ZS4qL1xuICAgICAgICAgICAgY29uc3QgZ292ZXJuZWRBcGlzID0gYXdhaXQgZ2V0R292ZXJuZWRBcGlzKCk7XG4gICAgICAgICAgICByZXR1cm4gRShnb3Zlcm5lZEFwaXMpXG4gICAgICAgICAgICAgIFthcGlNZXRob2ROYW1lXSguLi5tZXRob2RBcmdzKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aXZlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5lZ2F0aXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIG91dGNvbWVPZlVwZGF0ZSxcbiAgICAgIGluc3RhbmNlOiB2b3RlQ291bnRlcixcbiAgICAgIGRldGFpbHM6IEUoY291bnRlclB1YmxpY0ZhY2V0KS5nZXREZXRhaWxzKCksXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIEZhcigncGFyYW1Hb3Zlcm5vcicsIHtcbiAgICB2b3RlT25BcGlJbnZvY2F0aW9uLFxuICAgIGNyZWF0ZWRRdWVzdGlvbjogYiA9PiB2b3RlQ291bnRlcnMuaGFzKGIpLFxuICB9KTtcbn07JGjNj19vbmNlLnNldHVwQXBpR292ZXJuYW5jZShzZXR1cEFwaUdvdmVybmFuY2UpO1xuXG5oYXJkZW4oc2V0dXBBcGlHb3Zlcm5hbmNlKTtcbmhhcmRlbihtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyI6WyJtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyJdLCJzZXR1cEFwaUdvdmVybmFuY2UiOlsic2V0dXBBcGlHb3Zlcm5hbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG1F5rO7EgAAuxIAAEEAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiLi4vcXVlc3Rpb24uanMiXSwiZXhwb3J0cyI6WyJtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMiLCJzZXR1cEZpbHRlckdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixtdXN0TWF0Y2gsa2V5RVEsTSxDaG9pY2VNZXRob2QsUXVvcnVtUnVsZSxFbGVjdGlvblR5cGUsY29lcmNlUXVlc3Rpb25TcGVjOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiLi4vcXVlc3Rpb24uanNcIiwgW1tcIkNob2ljZU1ldGhvZFwiLFskaM2PX2EgPT4gKENob2ljZU1ldGhvZCA9ICRozY9fYSldXSxbXCJRdW9ydW1SdWxlXCIsWyRozY9fYSA9PiAoUXVvcnVtUnVsZSA9ICRozY9fYSldXSxbXCJFbGVjdGlvblR5cGVcIixbJGjNj19hID0+IChFbGVjdGlvblR5cGUgPSAkaM2PX2EpXV0sW1wiY29lcmNlUXVlc3Rpb25TcGVjXCIsWyRozY9fYSA9PiAoY29lcmNlUXVlc3Rpb25TcGVjID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvbnRyYWN0TWV0YSwgSW5zdGFsbGF0aW9uLCBJbnN0YW5jZSwgSW52aXRhdGlvbiwgWkNGfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtQb3NpdGlvbiwgQXBpR292ZXJub3IsIEFwaUludm9jYXRpb25Jc3N1ZSwgUG9zZXJGYWNldCwgVm90ZU9uQXBpSW52b2NhdGlvbiwgRmlsdGVyR292ZXJub3IsIEdvdmVybmVkQ3JlYXRvckZhY2V0LCBPZmZlckZpbHRlcklzc3VlLCBWb3RlT25PZmZlckZpbHRlcn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tICdAYWdvcmljL3RpbWUnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbi8qKlxuICogTWFrZSBhIHBhaXIgb2YgcG9zaXRpb25zIGZvciBhIHF1ZXN0aW9uIGFib3V0IHdoZXRoZXIgdG8gdXBkYXRlIHRoZSBvZmZlclxuICogZmlsdGVyLiBJZiB0aGUgdm90ZSBwYXNzZXMsIHRoZSBsaXN0IG9mIGJsb2NrZWQgaW52aXRhdGlvbiBzdHJpbmdzIHdpbGwgYmVcbiAqIHVwZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gc3RyaW5nc1xuICovXG5jb25zdCBtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMgPSBzdHJpbmdzID0+IHtcbiAgY29uc3QgcG9zaXRpdmUgPSBoYXJkZW4oeyBzdHJpbmdzIH0pO1xuICBjb25zdCBuZWdhdGl2ZSA9IGhhcmRlbih7IGRvbnRVcGRhdGU6IHN0cmluZ3MgfSk7XG4gIHJldHVybiB7IHBvc2l0aXZlLCBuZWdhdGl2ZSB9O1xufTtcblxuLyoqXG4gKiBTZXR1cCB0byBhbGxvdyBnb3Zlcm5hbmNlIHRvIGJsb2NrIHNvbWUgaW52aXRhdGlvbnMuXG4gKlxuICogQHBhcmFtIHtFUmVmPFRpbWVyU2VydmljZT59IHRpbWVyXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8UG9zZXJGYWNldD59IGdldFVwZGF0ZWRQb3NlckZhY2V0XG4gKiBAcGFyYW0ge0dvdmVybmVkQ3JlYXRvckZhY2V0PHt9Pn0gZ292ZXJuZWRDRlxuICogQHJldHVybnMge0ZpbHRlckdvdmVybm9yfVxuICovJGjNj19vbmNlLm1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyhtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMpO1xuY29uc3Qgc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlID0gKHRpbWVyLCBnZXRVcGRhdGVkUG9zZXJGYWNldCwgZ292ZXJuZWRDRikgPT4ge1xuICAvKiogQHR5cGUge1dlYWtTZXQ8SW5zdGFuY2U+fSAqL1xuICBjb25zdCB2b3RlQ291bnRlcnMgPSBuZXcgV2Vha1NldCgpO1xuXG4gIC8qKiBAdHlwZSB7Vm90ZU9uT2ZmZXJGaWx0ZXJ9ICovXG4gIGNvbnN0IHZvdGVPbkZpbHRlciA9IGFzeW5jICh2b3RlQ291bnRlckluc3RhbGxhdGlvbiwgZGVhZGxpbmUsIHN0cmluZ3MpID0+IHtcbiAgICBtdXN0TWF0Y2goc3RyaW5ncywgTS5hcnJheU9mKE0uc3RyaW5nKCkpKTtcbiAgICBjb25zdCB7IHBvc2l0aXZlLCBuZWdhdGl2ZSB9ID0gbWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zKHN0cmluZ3MpO1xuXG4gICAgLyoqIEB0eXBlIHtPZmZlckZpbHRlcklzc3VlfSAqL1xuICAgIGNvbnN0IGlzc3VlID0gaGFyZGVuKHsgc3RyaW5ncyB9KTtcbiAgICBjb25zdCBxdWVzdGlvblNwZWMgPSBjb2VyY2VRdWVzdGlvblNwZWMoe1xuICAgICAgbWV0aG9kOiBDaG9pY2VNZXRob2QuVU5SQU5LRUQsXG4gICAgICBpc3N1ZSxcbiAgICAgIHBvc2l0aW9uczogW3Bvc2l0aXZlLCBuZWdhdGl2ZV0sXG4gICAgICBlbGVjdGlvblR5cGU6IEVsZWN0aW9uVHlwZS5PRkZFUl9GSUxURVIsXG4gICAgICBtYXhDaG9pY2VzOiAxLFxuICAgICAgbWF4V2lubmVyczogMSxcbiAgICAgIGNsb3NpbmdSdWxlOiB7IHRpbWVyLCBkZWFkbGluZSB9LFxuICAgICAgcXVvcnVtUnVsZTogUXVvcnVtUnVsZS5NQUpPUklUWSxcbiAgICAgIHRpZU91dGNvbWU6IG5lZ2F0aXZlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBwdWJsaWNGYWNldDogY291bnRlclB1YmxpY0ZhY2V0LCBpbnN0YW5jZTogdm90ZUNvdW50ZXIgfSA9IGF3YWl0IEUoXG4gICAgICBnZXRVcGRhdGVkUG9zZXJGYWNldCgpLFxuICAgICkuYWRkUXVlc3Rpb24odm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIHF1ZXN0aW9uU3BlYyk7XG5cbiAgICB2b3RlQ291bnRlcnMuYWRkKHZvdGVDb3VudGVyKTtcblxuICAgIC8qIENSVUNJQUw6IEhlcmUgd2Ugd2FpdCBmb3IgdGhlIHZvdGVDb3VudGVyIHRvIGRlY2xhcmUgYW4gb3V0Y29tZSwgYW5kIHRoZW4qL1xuICAgIC8qIGF0dGVtcHQgdG8gaW52b2tlIHRoZSBBUEkgaWYgdGhhdCdzIHdoYXQgdGhlIHZvdGUgY2FsbGVkIGZvci4gV2UgbmVlZCB0byovXG4gICAgLyogbWFrZSBzdXJlIHRoYXQgb3V0Y29tZU9mVXBkYXRlUCBpcyB1cGRhdGVkIHdoYXRldmVyIGhhcHBlbnMuKi9cbiAgICAvKiovXG4gICAgLyogKiBJZiB0aGUgdm90ZSBwYXNzZWQsIGludm9rZSB0aGUgQVBJLCBhbmQgcmV0dXJuIHRoZSBwb3NpdGl2ZSBwb3NpdGlvbiovXG4gICAgLyogKiBJZiB0aGUgdm90ZSB3YXMgbmVnYXRpdmUsIHJldHVybiB0aGUgbmVnYXRpdmUgcG9zaXRpb24qL1xuICAgIC8qICogSWYgd2UgY2FuJ3QgZG8gZWl0aGVyLCAodGhlIHZvdGUgZmFpbGVkIG9yIHRoZSBBUEkgaW52b2NhdGlvbiBmYWlsZWQpKi9cbiAgICAvKiByZXR1cm4gYSBicm9rZW4gcHJvbWlzZS4qL1xuICAgIGNvbnN0IG91dGNvbWVPZlVwZGF0ZSA9IEUoY291bnRlclB1YmxpY0ZhY2V0KVxuICAgICAgLmdldE91dGNvbWUoKVxuICAgICAgLnRoZW4oXG4gICAgICAgIC8qKiBAdHlwZSB7KG91dGNvbWU6IFBvc2l0aW9uKSA9PiBFUmVmPFBvc2l0aW9uPn0gKi9cbiAgICAgICAgb3V0Y29tZSA9PiB7XG4gICAgICAgICAgaWYgKGtleUVRKG91dGNvbWUsIHBvc2l0aXZlKSkge1xuICAgICAgICAgICAgcmV0dXJuIEUoZ292ZXJuZWRDRilcbiAgICAgICAgICAgICAgLnNldE9mZmVyRmlsdGVyKHN0cmluZ3MpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXRpdmU7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5RVEob3V0Y29tZSwgbmVnYXRpdmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmVnYXRpdmU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKCd1bnJlY29nbml6ZWQgb3V0Y29tZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIG91dGNvbWVPZlVwZGF0ZSxcbiAgICAgIGluc3RhbmNlOiB2b3RlQ291bnRlcixcbiAgICAgIGRldGFpbHM6IEUoY291bnRlclB1YmxpY0ZhY2V0KS5nZXREZXRhaWxzKCksXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIEZhcignZmlsdGVyR292ZXJub3InLCB7XG4gICAgdm90ZU9uRmlsdGVyLFxuICAgIGNyZWF0ZWRRdWVzdGlvbjogYiA9PiB2b3RlQ291bnRlcnMuaGFzKGIpLFxuICB9KTtcbn07JGjNj19vbmNlLnNldHVwRmlsdGVyR292ZXJuYW5jZShzZXR1cEZpbHRlckdvdmVybmFuY2UpO1xuXG5oYXJkZW4oc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlKTtcbmhhcmRlbihtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zIjpbIm1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyJdLCJzZXR1cEZpbHRlckdvdmVybmFuY2UiOlsic2V0dXBGaWx0ZXJHb3Zlcm5hbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMk1SCBxGgAAcRoAAEAAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSIsIi4uL3F1ZXN0aW9uLmpzIiwiLi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIkNPTlRSQUNUX0VMRUNUT1JBVEUiLCJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwic2V0dXBQYXJhbUdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEUsZGVlcGx5RnVsZmlsbGVkLEZhcixtdXN0TWF0Y2gsa2V5RVEsQ2hvaWNlTWV0aG9kLGNvZXJjZVF1ZXN0aW9uU3BlYyxFbGVjdGlvblR5cGUsUXVvcnVtUnVsZSxQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLFskaM2PX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXV1dLFtcIi4uL3F1ZXN0aW9uLmpzXCIsIFtbXCJDaG9pY2VNZXRob2RcIixbJGjNj19hID0+IChDaG9pY2VNZXRob2QgPSAkaM2PX2EpXV0sW1wiY29lcmNlUXVlc3Rpb25TcGVjXCIsWyRozY9fYSA9PiAoY29lcmNlUXVlc3Rpb25TcGVjID0gJGjNj19hKV1dLFtcIkVsZWN0aW9uVHlwZVwiLFskaM2PX2EgPT4gKEVsZWN0aW9uVHlwZSA9ICRozY9fYSldXSxbXCJRdW9ydW1SdWxlXCIsWyRozY9fYSA9PiAoUXVvcnVtUnVsZSA9ICRozY9fYSldXV1dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlXCIsWyRozY9fYSA9PiAoUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDb250cmFjdE1ldGEsIEluc3RhbGxhdGlvbiwgSW5zdGFuY2UsIEludml0YXRpb24sIFpDRn0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7UGFyYW1WYWx1ZSwgUGFyYW1DaGFuZ2VQb3NpdGlvbnMsIFF1ZXN0aW9uU3BlYywgQ2hhbmdlUGFyYW1zUG9zaXRpb24sIFBhcmFtQ2hhbmdlSXNzdWUsIFBhcmFtR292ZXJub3IsIFBhcmFtTWFuYWdlclJldHJpZXZlciwgUG9zZXJGYWNldCwgVm90ZU9uUGFyYW1DaGFuZ2VzfSBmcm9tICcuLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gJ0BhZ29yaWMvdGltZSc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuLyoqXG4gKiBUaGUgZWxlY3RvcmF0ZSB0aGF0IGdvdmVybnMgY2hhbmdlcyB0byB0aGUgY29udHJhY3QncyBwYXJhbWV0ZXJzLiBJdCBtdXN0IGJlXG4gKiBkZWNsYXJlZCBpbiB0aGUgZ292ZXJuZWQgY29udHJhY3QuXG4gKi9cbmNvbnN0IENPTlRSQUNUX0VMRUNUT1JBVEUgPSAnRWxlY3RvcmF0ZSc7XG5cbi8qKlxuICogUmV0dXJuIGEgcmVjb3JkIGNvbnRhaW5pbmcgdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBwb3NpdGlvbnMgZm9yIGFcbiAqIHF1ZXN0aW9uIG9uIGNoYW5naW5nIHRoZSBwYXJhbSB0byB0aGUgcHJvcG9zZWRWYWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFBhcmFtVmFsdWU+fSBjaGFuZ2VzXG4gKiBAcmV0dXJucyB7UGFyYW1DaGFuZ2VQb3NpdGlvbnN9XG4gKi8kaM2PX29uY2UuQ09OVFJBQ1RfRUxFQ1RPUkFURShDT05UUkFDVF9FTEVDVE9SQVRFKTtcbmNvbnN0IG1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyA9IGNoYW5nZXMgPT4ge1xuICAvKiogQHR5cGUge0NoYW5nZVBhcmFtc1Bvc2l0aW9ufSAqL1xuICBjb25zdCBwb3NpdGl2ZSA9IHsgY2hhbmdlcyB9O1xuICBjb25zdCBuYW1lc09ubHkgPSBPYmplY3Qua2V5cyhjaGFuZ2VzKTtcbiAgY29uc3QgbmVnYXRpdmUgPSB7IG5vQ2hhbmdlOiBuYW1lc09ubHkgfTtcbiAgcmV0dXJuIGhhcmRlbih7IHBvc2l0aXZlLCBuZWdhdGl2ZSB9KTtcbn07XG5cbi8qKlxuICogYXNzZXJ0IHRoYXQgdGhlIHBhcmFtZXRlciBkZXNjcmliZWQgYnkgcGFyYW1TcGVjIGlzIHByb3Bvc2VkIHRvIGJlIGNoYW5nZWQgaW5cbiAqIHRoZSBxdWVzdGlvbiBkZXNjcmliZWQgYnkgcXVlc3Rpb25TcGVjLlxuICpcbiAqIEBwYXJhbSB7eyBwYXJhbWV0ZXJOYW1lOiBzdHJpbmcsIHBhcmFtUGF0aDogdW5rbm93bn19IHBhcmFtU3BlY1xuICogQHBhcmFtIHtRdWVzdGlvblNwZWM8UGFyYW1DaGFuZ2VJc3N1ZT59IHF1ZXN0aW9uU3BlY1xuICovJGjNj19vbmNlLm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyhtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMpO1xuY29uc3QgYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSA9IChwYXJhbVNwZWMsIHF1ZXN0aW9uU3BlYykgPT4ge1xuICBtdXN0TWF0Y2gocXVlc3Rpb25TcGVjLCBQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cbiAgY29uc3QgeyBwYXJhbWV0ZXJOYW1lLCBwYXJhbVBhdGggfSA9IHBhcmFtU3BlYztcbiAgY29uc3QgeyBpc3N1ZSB9ID0gcXVlc3Rpb25TcGVjO1xuICBpc3N1ZS5zcGVjLmNoYW5nZXNbcGFyYW1ldGVyTmFtZV0gfHxcbiAgICBGYWlsYFF1ZXN0aW9uICgke2lzc3VlLnNwZWMuY2hhbmdlc30pIGRvZXMgbm90IGNvbmNlcm4gJHtwYXJhbWV0ZXJOYW1lfWA7XG4gIGtleUVRKGlzc3VlLnNwZWMucGFyYW1QYXRoLCBwYXJhbVBhdGgpIHx8XG4gICAgRmFpbGBRdWVzdGlvbiBwYXRoICgke2lzc3VlLnNwZWMucGFyYW1QYXRofSkgZG9lc24ndCBtYXRjaCByZXF1ZXN0ICgke3BhcmFtUGF0aH0pYDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHsoKSA9PiBFUmVmPFBhcmFtTWFuYWdlclJldHJpZXZlcj59IHBhcmFtTWFuYWdlclJldHJpZXZlckFjY2Vzc29yXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBjb250cmFjdEluc3RhbmNlXG4gKiBAcGFyYW0ge1RpbWVyU2VydmljZX0gdGltZXJcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxQb3NlckZhY2V0Pn0gZ2V0VXBkYXRlZFBvc2VyRmFjZXRcbiAqIEByZXR1cm5zIHtQYXJhbUdvdmVybm9yfVxuICovJGjNj19vbmNlLmFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0oYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSk7XG5jb25zdCBzZXR1cFBhcmFtR292ZXJuYW5jZSA9IChcbiAgcGFyYW1NYW5hZ2VyUmV0cmlldmVyQWNjZXNzb3IsXG4gIGNvbnRyYWN0SW5zdGFuY2UsXG4gIHRpbWVyLFxuICBnZXRVcGRhdGVkUG9zZXJGYWNldCxcbikgPT4ge1xuICAvKiogQHR5cGUge1dlYWtTZXQ8SW5zdGFuY2U+fSAqL1xuICBjb25zdCB2b3RlQ291bnRlcnMgPSBuZXcgV2Vha1NldCgpO1xuXG4gIC8qKiBAdHlwZSB7Vm90ZU9uUGFyYW1DaGFuZ2VzfSAqL1xuICBjb25zdCB2b3RlT25QYXJhbUNoYW5nZXMgPSBhc3luYyAoXG4gICAgdm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sXG4gICAgZGVhZGxpbmUsXG4gICAgcGFyYW1TcGVjLFxuICApID0+IHtcbiAgICBjb25zdCBwYXJhbU1hbmFnZXJSZXRyaWV2ZXIgPSBwYXJhbU1hbmFnZXJSZXRyaWV2ZXJBY2Nlc3NvcigpO1xuICAgIGNvbnN0IHBhcmFtTWdyID0gYXdhaXQgRShwYXJhbU1hbmFnZXJSZXRyaWV2ZXIpLmdldChwYXJhbVNwZWMucGFyYW1QYXRoKTtcbiAgICAvKiogQHR5cGUge1Bhc3NhYmxlfSAqL1xuICAgIGNvbnN0IGNoYW5nZVBzID0ge307XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKHBhcmFtU3BlYy5jaGFuZ2VzKSkge1xuICAgICAgY29uc3QgcHJvcG9zZWRWYWx1ZSA9IEUocGFyYW1NZ3IpLmdldFZpc2libGVWYWx1ZShcbiAgICAgICAgbmFtZSxcbiAgICAgICAgcGFyYW1TcGVjLmNoYW5nZXNbbmFtZV0sXG4gICAgICApO1xuICAgICAgY2hhbmdlUHNbbmFtZV0gPSBwcm9wb3NlZFZhbHVlO1xuICAgIH1cbiAgICBjb25zdCBjaGFuZ2VzID0gYXdhaXQgZGVlcGx5RnVsZmlsbGVkKGhhcmRlbihjaGFuZ2VQcykpO1xuXG4gICAgY29uc3QgeyBwb3NpdGl2ZSwgbmVnYXRpdmUgfSA9IG1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyhjaGFuZ2VzKTtcblxuICAgIC8qKiBAdHlwZSB7UGFyYW1DaGFuZ2VJc3N1ZX0gKi9cbiAgICBjb25zdCBpc3N1ZSA9IGhhcmRlbih7XG4gICAgICBzcGVjOiB7XG4gICAgICAgIHBhcmFtUGF0aDogcGFyYW1TcGVjLnBhcmFtUGF0aCxcbiAgICAgICAgY2hhbmdlcyxcbiAgICAgIH0sXG4gICAgICBjb250cmFjdDogY29udHJhY3RJbnN0YW5jZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHF1ZXN0aW9uU3BlYyA9IGNvZXJjZVF1ZXN0aW9uU3BlYyh7XG4gICAgICBtZXRob2Q6IENob2ljZU1ldGhvZC5VTlJBTktFRCxcbiAgICAgIGlzc3VlLFxuICAgICAgcG9zaXRpb25zOiBbcG9zaXRpdmUsIG5lZ2F0aXZlXSxcbiAgICAgIGVsZWN0aW9uVHlwZTogRWxlY3Rpb25UeXBlLlBBUkFNX0NIQU5HRSxcbiAgICAgIG1heENob2ljZXM6IDEsXG4gICAgICBtYXhXaW5uZXJzOiAxLFxuICAgICAgY2xvc2luZ1J1bGU6IHsgdGltZXIsIGRlYWRsaW5lIH0sXG4gICAgICBxdW9ydW1SdWxlOiBRdW9ydW1SdWxlLk1BSk9SSVRZLFxuICAgICAgdGllT3V0Y29tZTogbmVnYXRpdmUsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHB1YmxpY0ZhY2V0OiBjb3VudGVyUHVibGljRmFjZXQsIGluc3RhbmNlOiB2b3RlQ291bnRlciB9ID0gYXdhaXQgRShcbiAgICAgIGdldFVwZGF0ZWRQb3NlckZhY2V0KCksXG4gICAgKS5hZGRRdWVzdGlvbih2b3RlQ291bnRlckluc3RhbGxhdGlvbiwgcXVlc3Rpb25TcGVjKTtcblxuICAgIHZvdGVDb3VudGVycy5hZGQodm90ZUNvdW50ZXIpO1xuXG4gICAgLyogQ1JVQ0lBTDogSGVyZSB3ZSB3YWl0IGZvciB0aGUgdm90ZUNvdW50ZXIgdG8gZGVjbGFyZSBhbiBvdXRjb21lLCBhbmQgdGhlbiovXG4gICAgLyogYXR0ZW1wdCB0byB1cGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgaWYgdGhhdCdzIHdoYXQgdGhlIHZvdGUqL1xuICAgIC8qIGRlY2lkZWQuIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgb3V0Y29tZU9mVXBkYXRlUCBpcyB1cGRhdGVkIHdoYXRldmVyKi9cbiAgICAvKiBoYXBwZW5zLiovXG4gICAgLyogKiBJZiB0aGUgdm90ZSB3YXMgbmVnYXRpdmUsIHJlc29sdmUgdG8gdGhlIG91dGNvbWUqL1xuICAgIC8qICogSWYgd2UgdXBkYXRlIHRoZSB2YWx1ZSwgc2F5IHNvKi9cbiAgICAvKiAqIElmIHRoZSB1cGRhdGUgZmFpbHMsIHJlamVjdCB0aGUgcHJvbWlzZSovXG4gICAgLyogKiBpZiB0aGUgdm90ZSBvdXRjb21lIGZhaWxlZCwgcmVqZWN0IHRoZSBwcm9taXNlLiovXG4gICAgY29uc3Qgb3V0Y29tZU9mVXBkYXRlID0gRShjb3VudGVyUHVibGljRmFjZXQpXG4gICAgICAuZ2V0T3V0Y29tZSgpXG4gICAgICAudGhlbihhc3luYyBvdXRjb21lID0+IHtcbiAgICAgICAgaWYgKGtleUVRKHBvc2l0aXZlLCBvdXRjb21lKSkge1xuICAgICAgICAgIHJldHVybiBFLndoZW4oXG4gICAgICAgICAgICBFKHBhcmFtTWdyKS51cGRhdGVQYXJhbXMocGFyYW1TcGVjLmNoYW5nZXMpLFxuICAgICAgICAgICAgKCkgPT4gcG9zaXRpdmUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmVnYXRpdmU7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBvdXRjb21lT2ZVcGRhdGUsXG4gICAgICBpbnN0YW5jZTogdm90ZUNvdW50ZXIsXG4gICAgICBkZXRhaWxzOiBFKGNvdW50ZXJQdWJsaWNGYWNldCkuZ2V0RGV0YWlscygpLFxuICAgIH07XG4gIH07XG5cbiAgcmV0dXJuIEZhcigncGFyYW1Hb3Zlcm5vcicsIHtcbiAgICB2b3RlT25QYXJhbUNoYW5nZXMsXG4gICAgY3JlYXRlZFF1ZXN0aW9uOiBiID0+IHZvdGVDb3VudGVycy5oYXMoYiksXG4gIH0pO1xufTskaM2PX29uY2Uuc2V0dXBQYXJhbUdvdmVybmFuY2Uoc2V0dXBQYXJhbUdvdmVybmFuY2UpO1xuXG5oYXJkZW4oc2V0dXBQYXJhbUdvdmVybmFuY2UpO1xuaGFyZGVuKG1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyk7XG5oYXJkZW4oYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDT05UUkFDVF9FTEVDVE9SQVRFIjpbIkNPTlRSQUNUX0VMRUNUT1JBVEUiXSwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIjpbIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyJdLCJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIjpbImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0iXSwic2V0dXBQYXJhbUdvdmVybmFuY2UiOlsic2V0dXBQYXJhbUdvdmVybmFuY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAS9Z2GrZJAAC2SQAAQQAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL3pvZS9zcmMvY2xlYW5Qcm9wb3NhbC5qcyIsIkBlbmRvL25hdCIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGFnb3JpYy9pbnRlcm5hbCIsIi4uL2NvbnN0YW50cy5qcyIsIi4vYXNzZXJ0aW9ucy5qcyIsIi4vZ292ZXJuUGFyYW0uanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyIsIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEZhcixwYXNzU3R5bGVPZixBbW91bnRNYXRoLGFzc2VydEtleXdvcmROYW1lLE5hdCxrZXlFUSxtYWtlU2NhbGFyTWFwU3RvcmUsRSxhc3NlcnRBbGxEZWZpbmVkLFBhcmFtVHlwZXMsYXNzZXJ0VGltZXN0YW1wLGFzc2VydFJlbGF0aXZlVGltZSxtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvLG1ha2VBc3NlcnRJbnN0YWxsYXRpb24sbWFrZUFzc2VydEluc3RhbmNlLG1ha2VMb29rc0xpa2VCcmFuZCxDT05UUkFDVF9FTEVDVE9SQVRFOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jbGVhblByb3Bvc2FsLmpzXCIsIFtbXCJhc3NlcnRLZXl3b3JkTmFtZVwiLFskaM2PX2EgPT4gKGFzc2VydEtleXdvcmROYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLFskaM2PX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaM2PX2EpXV1dXSxbXCIuLi9jb25zdGFudHMuanNcIiwgW1tcIlBhcmFtVHlwZXNcIixbJGjNj19hID0+IChQYXJhbVR5cGVzID0gJGjNj19hKV1dXV0sW1wiLi9hc3NlcnRpb25zLmpzXCIsIFtbXCJhc3NlcnRUaW1lc3RhbXBcIixbJGjNj19hID0+IChhc3NlcnRUaW1lc3RhbXAgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVsYXRpdmVUaW1lXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVsYXRpdmVUaW1lID0gJGjNj19hKV1dLFtcIm1ha2VBc3NlcnRCcmFuZGVkUmF0aW9cIixbJGjNj19hID0+IChtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvID0gJGjNj19hKV1dLFtcIm1ha2VBc3NlcnRJbnN0YWxsYXRpb25cIixbJGjNj19hID0+IChtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uID0gJGjNj19hKV1dLFtcIm1ha2VBc3NlcnRJbnN0YW5jZVwiLFskaM2PX2EgPT4gKG1ha2VBc3NlcnRJbnN0YW5jZSA9ICRozY9fYSldXSxbXCJtYWtlTG9va3NMaWtlQnJhbmRcIixbJGjNj19hID0+IChtYWtlTG9va3NMaWtlQnJhbmQgPSAkaM2PX2EpXV1dXSxbXCIuL2dvdmVyblBhcmFtLmpzXCIsIFtbXCJDT05UUkFDVF9FTEVDVE9SQVRFXCIsWyRozY9fYSA9PiAoQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7TWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge0NvbnRyYWN0TWV0YSwgSW5zdGFsbGF0aW9uLCBJbnN0YW5jZSwgSW52aXRhdGlvbiwgS2V5d29yZCwgWkNGLCBab2VTZXJ2aWNlfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtBbnlQYXJhbU1hbmFnZXIsIEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZSwgUGFyYW1NYW5hZ2VyQmFzZSwgUGFyYW1TdGF0ZVJlY29yZCwgUGFyYW1WYWx1ZVR5cGVkLCBVcGRhdGVQYXJhbXN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0NvcHlSZWNvcmR9IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICogQGltcG9ydCB7VGltZXN0YW1wfSBmcm9tICdAYWdvcmljL3RpbWUnO1xuICogQGltcG9ydCB7UmVsYXRpdmVUaW1lfSBmcm9tICdAYWdvcmljL3RpbWUnO1xuICogQGltcG9ydCB7U3RvcmVkUHVibGlzaGVyS2l0fSBmcm9tICdAYWdvcmljL25vdGlmaWVyJztcbiAqIEBpbXBvcnQge1BhcmFtVHlwZX0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcbiAqIEBpbXBvcnQge1JhdGlvfSBmcm9tICdAYWdvcmljL2VydHAnO1xuICogQGltcG9ydCB7QW1vdW50fSBmcm9tICdAYWdvcmljL2VydHAnO1xuICogQGltcG9ydCB7QnJhbmR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1BhcmFtTWFuYWdlckJhc2V9IHBhcmFtTWFuYWdlclxuICogQHBhcmFtIHt7W0NPTlRSQUNUX0VMRUNUT1JBVEVdOiBQYXJhbVZhbHVlVHlwZWQ8J2ludml0YXRpb24nPn19IGdvdmVybmVkUGFyYW1zXG4gKi9cbmNvbnN0IGFzc2VydEVsZWN0b3JhdGVNYXRjaGVzID0gKHBhcmFtTWFuYWdlciwgZ292ZXJuZWRQYXJhbXMpID0+IHtcbiAgY29uc3QgbWFuYWdlckVsZWN0b3JhdGUgPVxuICAgIHBhcmFtTWFuYWdlci5nZXRJbnZpdGF0aW9uQW1vdW50KENPTlRSQUNUX0VMRUNUT1JBVEUpO1xuICBjb25zdCB7XG4gICAgW0NPTlRSQUNUX0VMRUNUT1JBVEVdOiB7IHZhbHVlOiBwYXJhbUVsZWN0b3JhdGUgfSxcbiAgfSA9IGdvdmVybmVkUGFyYW1zO1xuICBwYXJhbUVsZWN0b3JhdGUgfHxcbiAgICBGYWlsYE1pc3NpbmcgJHtxKENPTlRSQUNUX0VMRUNUT1JBVEUpfSB0ZXJtIGluICR7cShnb3Zlcm5lZFBhcmFtcyl9YDtcbiAga2V5RVEobWFuYWdlckVsZWN0b3JhdGUsIHBhcmFtRWxlY3RvcmF0ZSkgfHxcbiAgICBGYWlsYEVsZWN0b3JhdGUgaW4gbWFuYWdlciAoJHttYW5hZ2VyRWxlY3RvcmF0ZX0pfSBpbmNvbXBhdGlibGUgd2l0aCB0ZXJtcyAoJHtwYXJhbUVsZWN0b3JhdGV9YDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1NYW5hZ2VyQnVpbGRlclxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogQW1vdW50KSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRBbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEJyYW5kKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRCcmFuZFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogSW5zdGFsbGF0aW9uKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEluc3RhbmNlKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRJbnN0YW5jZVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogSW52aXRhdGlvbikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkSW52aXRhdGlvblxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogYmlnaW50KSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGROYXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IFJhdGlvKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRSYXRpb1xuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogQ29weVJlY29yZDxhbnk+KSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkU3RyaW5nXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBUaW1lc3RhbXApID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZFRpbWVzdGFtcFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogUmVsYXRpdmVUaW1lKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRSZWxhdGl2ZVRpbWVcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkVW5rbm93blxuICogQHByb3BlcnR5IHsoKSA9PiBBbnlQYXJhbU1hbmFnZXJ9IGJ1aWxkXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge1N0b3JlZFB1Ymxpc2hlcktpdDxHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGU+fSBwdWJsaXNoZXJLaXRcbiAqIEBwYXJhbSB7RVJlZjxab2VTZXJ2aWNlPn0gW3pvZV1cbiAqLyRozY9fb25jZS5hc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyhhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyk7XG5jb25zdCBtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciA9IChwdWJsaXNoZXJLaXQsIHpvZSkgPT4ge1xuICAvKiogQHR5cGUge01hcFN0b3JlPEtleXdvcmQsIGFueT59ICovXG4gIGNvbnN0IG5hbWVzVG9QYXJhbXMgPSBtYWtlU2NhbGFyTWFwU3RvcmUoJ1BhcmFtZXRlciBOYW1lJyk7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBwdWJsaXNoZXJLaXQ7XG4gIGFzc2VydEFsbERlZmluZWQoeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSk7XG5cbiAgY29uc3QgZ2V0dGVycyA9IHt9O1xuICBjb25zdCBzZXR0ZXJzID0ge307XG4gIGNvbnN0IHVuZmluaXNoZWRQYXJhbXMgPSBbXTtcblxuICAvKiBYWFggbGV0IHBhcmFtcyBiZSBmaW5pc2hlZCBhc3luYy4gQSBjb25jZXNzaW9uIHRvIHVwZ3JhZGFiaWxpdHkqL1xuICAvKiBVTlRJTCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzNDMqL1xuICBjb25zdCBmaW5pc2hCdWlsZGluZyA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbCh1bmZpbmlzaGVkUGFyYW1zKTtcbiAgICB1bmZpbmlzaGVkUGFyYW1zLmxlbmd0aCA9IDA7XG4gIH07XG5cbiAgY29uc3QgcHVibGlzaCA9ICgpID0+IHtcbiAgICAvKiogQHR5cGUge1BhcmFtU3RhdGVSZWNvcmR9ICovXG4gICAgY29uc3QgY3VycmVudCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIFsuLi5uYW1lc1RvUGFyYW1zLmVudHJpZXMoKV0ubWFwKChbaywgdl0pID0+IFtrLCB2Lm1ha2VEZXNjcmlwdGlvbigpXSksXG4gICAgKTtcbiAgICBwdWJsaXNoZXIudXBkYXRlU3RhdGUoeyBjdXJyZW50IH0pO1xuICB9O1xuXG4gIC8qKlxuICogU3VwcG9ydCBmb3IgcGFyYW1ldGVycyB0aGF0IGFyZSBjb3B5IG9iamVjdHNcbiAqXG4gKiBAc2VlIGJ1aWxkSW52aXRhdGlvblBhcmFtXG4gKlxuICogQHBhcmFtIHtLZXl3b3JkfSBuYW1lXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlXG4gKiBAcGFyYW0geyh2YWwpID0+IHZvaWR9IGFzc2VydGlvblxuICogQHBhcmFtIHtQYXJhbVR5cGV9IHR5cGVcbiAqL1xuICBjb25zdCBidWlsZENvcHlQYXJhbSA9IChuYW1lLCB2YWx1ZSwgYXNzZXJ0aW9uLCB0eXBlKSA9PiB7XG4gICAgbGV0IGN1cnJlbnQ7XG4gICAgYXNzZXJ0S2V5d29yZE5hbWUobmFtZSk7XG4gICAgdmFsdWUgIT09IHVuZGVmaW5lZCB8fCBGYWlsYHBhcmFtICR7cShuYW1lKX0gbXVzdCBiZSBkZWZpbmVkYDtcblxuICAgIGNvbnN0IHNldFBhcmFtVmFsdWUgPSBuZXdWYWx1ZSA9PiB7XG4gICAgICBhc3NlcnRpb24obmV3VmFsdWUpO1xuICAgICAgY3VycmVudCA9IG5ld1ZhbHVlO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IFtuYW1lXTogbmV3VmFsdWUgfSk7XG4gICAgfTtcbiAgICBzZXRQYXJhbVZhbHVlKHZhbHVlKTtcblxuICAgIGNvbnN0IGdldFZpc2libGVWYWx1ZSA9IHByb3Bvc2VkID0+IHtcbiAgICAgIGFzc2VydGlvbihwcm9wb3NlZCk7XG4gICAgICByZXR1cm4gcHJvcG9zZWQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHB1YmxpY01ldGhvZHMgPSBGYXIoYFBhcmFtZXRlciAke25hbWV9YCwge1xuICAgICAgZ2V0VmFsdWU6ICgpID0+IGN1cnJlbnQsXG4gICAgICBhc3NlcnRUeXBlOiBhc3NlcnRpb24sXG4gICAgICBtYWtlRGVzY3JpcHRpb246ICgpID0+ICh7IHR5cGUsIHZhbHVlOiBjdXJyZW50IH0pLFxuICAgICAgZ2V0VmlzaWJsZVZhbHVlLFxuICAgICAgZ2V0VHlwZTogKCkgPT4gdHlwZSxcbiAgICB9KTtcblxuICAgIC8qIG5hbWVzIGFyZSBrZXl3b3JkcyBzbyB0aGV5IHdpbGwgbmVjZXNzYXJpbHkgYmUgVGl0bGVDYXNlKi9cbiAgICBnZXR0ZXJzW2BnZXQke25hbWV9YF0gPSAoKSA9PiBnZXRUeXBlZFBhcmFtKHR5cGUsIG5hbWUpO1xuICAgIC8qIENSVUNJQUw6IGhlcmUgd2UncmUgY3JlYXRpbmcgdGhlIHVwZGF0ZSBmdW5jdGlvbnMgdGhhdCBjYW4gY2hhbmdlIHRoZSovXG4gICAgLyogdmFsdWVzIG9mIHRoZSBnb3Zlcm5lZCBjb250cmFjdCdzIHBhcmFtZXRlcnMuIFdlJ2xsIHJldHVybiB0aGUgdXBkYXRlRm5zKi9cbiAgICAvKiB0byBvdXIgY2FsbGVyLiBUaGV5IG11c3QgaGFuZGxlIHRoZW0gY2FyZWZ1bGx5IHRvIGVuc3VyZSB0aGF0IHRoZXkgZW5kIHVwKi9cbiAgICAvKiBpbiBhcHByb3ByaWF0ZSBoYW5kcy4qL1xuICAgIHNldHRlcnNbYHVwZGF0ZSR7bmFtZX1gXSA9IHNldFBhcmFtVmFsdWU7XG4gICAgc2V0dGVyc1tgcHJlcGFyZVRvVXBkYXRlJHtuYW1lfWBdID0gcHJvcG9zZWRWYWx1ZSA9PiBwcm9wb3NlZFZhbHVlO1xuICAgIG5hbWVzVG9QYXJhbXMuaW5pdChuYW1lLCBwdWJsaWNNZXRob2RzKTtcbiAgfTtcblxuICAvKiBIQU5ETEVSUyBGT1IgRUFDSCBQQVJBTUVURVIgVFlQRSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogQW1vdW50LCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuICBjb25zdCBhZGRBbW91bnQgPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBjb25zdCBhc3NlcnRBbW91bnQgPSBhID0+IHtcbiAgICAgIGEuYnJhbmQgfHwgRmFpbGBFeHBlY3RlZCBhbiBBbW91bnQgZm9yICR7cShuYW1lKX0sIGdvdDogJHthfWA7XG4gICAgICByZXR1cm4gQW1vdW50TWF0aC5jb2VyY2UodmFsdWUuYnJhbmQsIGEpO1xuICAgIH07XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydEFtb3VudCwgUGFyYW1UeXBlcy5BTU9VTlQpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEJyYW5kLCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuICBjb25zdCBhZGRCcmFuZCA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydEJyYW5kID0gbWFrZUxvb2tzTGlrZUJyYW5kKG5hbWUpO1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRCcmFuZCwgUGFyYW1UeXBlcy5CUkFORCk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogSW5zdGFsbGF0aW9uPHVua25vd24+LCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuICBjb25zdCBhZGRJbnN0YWxsYXRpb24gPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBjb25zdCBhc3NlcnRJbnN0YWxsYXRpb24gPSBtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uKG5hbWUpO1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRJbnN0YWxsYXRpb24sIFBhcmFtVHlwZXMuSU5TVEFMTEFUSU9OKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBJbnN0YW5jZSwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbiAgY29uc3QgYWRkSW5zdGFuY2UgPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBjb25zdCBhc3NlcnRJbnN0YW5jZSA9IG1ha2VBc3NlcnRJbnN0YW5jZShuYW1lKTtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0SW5zdGFuY2UsIFBhcmFtVHlwZXMuSU5TVEFOQ0UpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IGJpZ2ludCwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbiAgY29uc3QgYWRkTmF0ID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0TmF0ID0gdiA9PiB7XG4gICAgICBhc3NlcnQudHlwZW9mKHYsICdiaWdpbnQnKTtcbiAgICAgIE5hdCh2KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydE5hdCwgUGFyYW1UeXBlcy5OQVQpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IFJhdGlvLCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuICBjb25zdCBhZGRSYXRpbyA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydEJyYW5kZWRSYXRpbyA9IG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8obmFtZSwgdmFsdWUpO1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRCcmFuZGVkUmF0aW8sIFBhcmFtVHlwZXMuUkFUSU8pO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IENvcHlSZWNvcmQsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG4gIGNvbnN0IGFkZFJlY29yZCA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydFJlY29yZCA9IHYgPT4ge1xuICAgICAgcGFzc1N0eWxlT2Yodik7XG4gICAgICBhc3NlcnQudHlwZW9mKHYsICdvYmplY3QnKTtcbiAgICB9O1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRSZWNvcmQsIFBhcmFtVHlwZXMuUEFTU0FCTEVfUkVDT1JEKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG4gIGNvbnN0IGFkZFN0cmluZyA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydFN0cmluZyA9IHYgPT4gYXNzZXJ0LnR5cGVvZih2LCAnc3RyaW5nJyk7XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydFN0cmluZywgUGFyYW1UeXBlcy5TVFJJTkcpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IFRpbWVzdGFtcCwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbiAgY29uc3QgYWRkVGltZXN0YW1wID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydFRpbWVzdGFtcCwgUGFyYW1UeXBlcy5USU1FU1RBTVApO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IFJlbGF0aXZlVGltZSwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbiAgY29uc3QgYWRkUmVsYXRpdmVUaW1lID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydFJlbGF0aXZlVGltZSwgUGFyYW1UeXBlcy5SRUxBVElWRV9USU1FKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnksIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG4gIGNvbnN0IGFkZFVua25vd24gPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBjb25zdCBhc3NlcnRVbmtub3duID0gX3YgPT4gdHJ1ZTtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0VW5rbm93biwgUGFyYW1UeXBlcy5VTktOT1dOKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICBjb25zdCBhc3NlcnRJbnZpdGF0aW9uID0gYXN5bmMgaSA9PiB7XG4gICAgaWYgKCF6b2UpIHtcbiAgICAgIHRocm93IEZhaWxgem9lIG11c3QgYmUgcHJvdmlkZWQgZm9yIGdvdmVybmVkIEludml0YXRpb25zICR7em9lfWA7XG4gICAgfVxuXG4gICAgLyogbG9jYWwgY2hlY2sgb24gaXNMaXZlKCkgZ2l2ZXMgYmV0dGVyIHJlcG9ydCB0aGFuIC5nZXRJbnZpdGF0aW9uRGV0YWlscygpKi9cbiAgICBjb25zdCBpc0xpdmUgPSBhd2FpdCBFKEUoem9lKS5nZXRJbnZpdGF0aW9uSXNzdWVyKCkpLmlzTGl2ZShpKTtcbiAgICBpc0xpdmUgfHwgRmFpbGBJbnZpdGF0aW9uIHBhc3NlZCB0byBwYXJhbU1hbmFnZXIgaXMgbm90IGxpdmUgJHtpfWA7XG4gIH07XG5cbiAgLyoqXG4gKiBJbnZpdGF0aW9ucyBhcmUgY2xvc2VseSBoZWxkLCBzbyB3ZSBzaG91bGQgcHVibGljbHkgcmV2ZWFsIG9ubHkgdGhlIGFtb3VudC5cbiAqIFRoZSBhcHByb2FjaCBoZXJlIG1ha2VzIGl0IHBvc3NpYmxlIGZvciBjb250cmFjdHMgdG8gZ2V0IHRoZSBhY3R1YWxcbiAqIGludml0YXRpb24gcHJpdmF0ZWx5LCBhbmQgbGVnaWJseSBhc3N1cmUgY2xpZW50cyB0aGF0IGl0IG1hdGNoZXMgdGhlXG4gKiBwdWJsaWNseSB2aXNpYmxlIGludml0YXRpb24gYW1vdW50LiBDb250cmFjdCByZXZpZXdlcnMgc3RpbGwgaGF2ZSB0b1xuICogbWFudWFsbHkgdmVyaWZ5IHRoYXQgdGhlIGFjdHVhbCBpbnZpdGF0aW9uIGlzIGhhbmRsZWQgY2FyZWZ1bGx5LlxuICogYGdldEludGVybmFsVmFsdWUoKWAgd2lsbCBvbmx5IGJlIGFjY2Vzc2libGUgd2l0aGluIHRoZSBjb250cmFjdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtJbnZpdGF0aW9ufSBpbnZpdGF0aW9uXG4gKi9cbiAgY29uc3QgYnVpbGRJbnZpdGF0aW9uUGFyYW0gPSAobmFtZSwgaW52aXRhdGlvbikgPT4ge1xuICAgIGlmICghem9lKSB7XG4gICAgICB0aHJvdyBGYWlsYHpvZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBnb3Zlcm5lZCBJbnZpdGF0aW9ucyAke3pvZX1gO1xuICAgIH1cbiAgICBsZXQgY3VycmVudEludml0YXRpb247XG4gICAgbGV0IGN1cnJlbnRBbW91bnQ7XG5cbiAgICAvKipcbiAqIEB0eXBlZGVmIHtbSW52aXRhdGlvbiwgQW1vdW50XX0gU2V0SW52aXRhdGlvblBhcmFtXG4gKi9cblxuICAgIC8qKlxuICogQXN5bmMgcGhhc2UgdG8gcHJlcGFyZSBmb3Igc3luY2hyb25vdXMgc2V0dGluZ1xuICpcbiAqIEBwYXJhbSB7SW52aXRhdGlvbn0gaW52aXRlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTZXRJbnZpdGF0aW9uUGFyYW0+fVxuICovXG4gICAgY29uc3QgcHJlcGFyZVRvU2V0SW52aXRhdGlvbiA9IGFzeW5jIGludml0ZSA9PiB7XG4gICAgICBjb25zdCBbcHJlcGFyZWRBbW91bnRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBFKEUoem9lKS5nZXRJbnZpdGF0aW9uSXNzdWVyKCkpLmdldEFtb3VudE9mKGludml0ZSksXG4gICAgICAgIGFzc2VydEludml0YXRpb24oaW52aXRlKSxcbiAgICAgIF0pO1xuXG4gICAgICByZXR1cm4gW2ludml0ZSwgcHJlcGFyZWRBbW91bnRdO1xuICAgIH07XG5cbiAgICAvKipcbiAqIFN5bmNocm9ub3VzIHBoYXNlIG9mIHZhbHVlIHNldHRpbmdcbiAqXG4gKiBAcGFyYW0ge1NldEludml0YXRpb25QYXJhbX0gcGFyYW0wXG4gKi9cbiAgICBjb25zdCBzZXRJbnZpdGF0aW9uID0gKFtuZXdJbnZpdGF0aW9uLCBhbW91bnRdKSA9PiB7XG4gICAgICBjdXJyZW50QW1vdW50ID0gYW1vdW50O1xuICAgICAgY3VycmVudEludml0YXRpb24gPSBuZXdJbnZpdGF0aW9uO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IFtuYW1lXTogY3VycmVudEFtb3VudCB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgbWFrZURlc2NyaXB0aW9uID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHsgdHlwZTogUGFyYW1UeXBlcy5JTlZJVEFUSU9OLCB2YWx1ZTogY3VycmVudEFtb3VudCB9O1xuICAgIH07XG5cbiAgICBjb25zdCBnZXRWaXNpYmxlVmFsdWUgPSBhc3luYyBhbGxlZ2VkSW52aXRhdGlvbiA9PlxuICAgICAgRShFKHpvZSkuZ2V0SW52aXRhdGlvbklzc3VlcigpKS5nZXRBbW91bnRPZihhbGxlZ2VkSW52aXRhdGlvbik7XG5cbiAgICBjb25zdCBwdWJsaWNNZXRob2RzID0gRmFyKGBQYXJhbWV0ZXIgJHtuYW1lfWAsIHtcbiAgICAgIGdldFZhbHVlOiAoKSA9PiBjdXJyZW50QW1vdW50LFxuICAgICAgZ2V0SW50ZXJuYWxWYWx1ZTogKCkgPT4gY3VycmVudEludml0YXRpb24sXG4gICAgICBhc3NlcnRUeXBlOiBhc3NlcnRJbnZpdGF0aW9uLFxuICAgICAgbWFrZURlc2NyaXB0aW9uLFxuICAgICAgZ2V0VHlwZTogKCkgPT4gUGFyYW1UeXBlcy5JTlZJVEFUSU9OLFxuICAgICAgZ2V0VmlzaWJsZVZhbHVlLFxuICAgIH0pO1xuXG4gICAgZ2V0dGVyc1tgZ2V0JHtuYW1lfWBdID0gKCkgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOVklUQVRJT04sIG5hbWUpO1xuICAgIC8qIENSVUNJQUw6IGhlcmUgd2UncmUgY3JlYXRpbmcgdGhlIHVwZGF0ZSBmdW5jdGlvbnMgdGhhdCBjYW4gY2hhbmdlIHRoZSovXG4gICAgLyogdmFsdWVzIG9mIHRoZSBnb3Zlcm5lZCBjb250cmFjdCdzIHBhcmFtZXRlcnMuIFdlJ2xsIHJldHVybiB1cGRhdGVQYXJhbXMqL1xuICAgIC8qICh3aGljaCBjYW4gaW52b2tlIGFsbCBvZiB0aGVtKSB0byBvdXIgY2FsbGVyLiBUaGV5IG11c3QgaGFuZGxlIGl0Ki9cbiAgICAvKiBjYXJlZnVsbHkgdG8gZW5zdXJlIHRoYXQgdGhleSBlbmQgdXAgaW4gYXBwcm9wcmlhdGUgaGFuZHMuKi9cbiAgICBzZXR0ZXJzW2BwcmVwYXJlVG9VcGRhdGUke25hbWV9YF0gPSBwcmVwYXJlVG9TZXRJbnZpdGF0aW9uO1xuICAgIHNldHRlcnNbYHVwZGF0ZSR7bmFtZX1gXSA9IHNldEludml0YXRpb247XG5cbiAgICAvKiBYWFggbGV0IHRoZSB2YWx1ZSBiZSBzZXQgYXN5bmMuIEEgY29uY2Vzc2lvbiB0byB1cGdyYWRhYmlsaXR5Ki9cbiAgICAvKiBVTlRJTCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzNDMqL1xuICAgIGNvbnN0IGZpbmlzaEludml0YXRpb25QYXJhbSA9IEUud2hlbihcbiAgICAgIHByZXBhcmVUb1NldEludml0YXRpb24oaW52aXRhdGlvbiksXG4gICAgICBpbnZpdGF0aW9uQW5kQW1vdW50ID0+IHtcbiAgICAgICAgc2V0SW52aXRhdGlvbihpbnZpdGF0aW9uQW5kQW1vdW50KTtcbiAgICAgICAgLyogZGVsYXkgdW50aWwgY3VycmVudEFtb3VudCBpcyBkZWZpbmVkIGJlY2F1c2UgcmVhZGVycyBleHBlY3QgYSB2YWxpZCB2YWx1ZSovXG4gICAgICAgIG5hbWVzVG9QYXJhbXMuaW5pdChuYW1lLCBwdWJsaWNNZXRob2RzKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICB1bmZpbmlzaGVkUGFyYW1zLnB1c2goZmluaXNoSW52aXRhdGlvblBhcmFtKTtcblxuICAgIHJldHVybiBuYW1lO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEludml0YXRpb24sIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG4gIGNvbnN0IGFkZEludml0YXRpb24gPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBhc3NlcnRLZXl3b3JkTmFtZShuYW1lKTtcbiAgICB2YWx1ZSAhPT0gbnVsbCB8fCBGYWlsYHBhcmFtICR7cShuYW1lKX0gbXVzdCBiZSBkZWZpbmVkYDtcblxuICAgIGJ1aWxkSW52aXRhdGlvblBhcmFtKG5hbWUsIHZhbHVlKTtcblxuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qIFBBUkFNIE1BTkFHRVIgTUVUSE9EUyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuICBjb25zdCBnZXRUeXBlZFBhcmFtID0gKHR5cGUsIG5hbWUpID0+IHtcbiAgICBjb25zdCBwYXJhbSA9IG5hbWVzVG9QYXJhbXMuZ2V0KG5hbWUpO1xuICAgIHR5cGUgPT09IHBhcmFtLmdldFR5cGUoKSB8fCBGYWlsYCR7bmFtZX0gaXMgbm90ICR7dHlwZX1gO1xuICAgIHJldHVybiBwYXJhbS5nZXRWYWx1ZSgpO1xuICB9O1xuXG4gIGNvbnN0IGdldFZpc2libGVWYWx1ZSA9IChuYW1lLCBwcm9wb3NlZCkgPT4ge1xuICAgIGNvbnN0IHBhcmFtID0gbmFtZXNUb1BhcmFtcy5nZXQobmFtZSk7XG4gICAgcmV0dXJuIHBhcmFtLmdldFZpc2libGVWYWx1ZShwcm9wb3NlZCk7XG4gIH07XG5cbiAgLyogc2hvdWxkIGJlIGV4cG9zZWQgd2l0aGluIGNvbnRyYWN0cywgYW5kIG5vdCBleHRlcm5hbGx5LCBmb3IgaW52aXRhdGlvbnMqL1xuICAvKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8SW52aXRhdGlvbj59ICovXG4gIGNvbnN0IGdldEludGVybmFsUGFyYW1WYWx1ZSA9IGFzeW5jIG5hbWUgPT4ge1xuICAgIGF3YWl0IGZpbmlzaEJ1aWxkaW5nKCk7XG4gICAgcmV0dXJuIG5hbWVzVG9QYXJhbXMuZ2V0KG5hbWUpLmdldEludGVybmFsVmFsdWUoKTtcbiAgfTtcblxuICBjb25zdCBnZXRQYXJhbXMgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgZmluaXNoQnVpbGRpbmcoKTtcbiAgICAvKiogQHR5cGUge1BhcmFtU3RhdGVSZWNvcmR9ICovXG4gICAgY29uc3QgZGVzY3JpcHRpb25zID0ge307XG4gICAgZm9yIChjb25zdCBbbmFtZSwgcGFyYW1dIG9mIG5hbWVzVG9QYXJhbXMuZW50cmllcygpKSB7XG4gICAgICBkZXNjcmlwdGlvbnNbbmFtZV0gPSBwYXJhbS5tYWtlRGVzY3JpcHRpb24oKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbihkZXNjcmlwdGlvbnMpO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7VXBkYXRlUGFyYW1zfSAqL1xuICBjb25zdCB1cGRhdGVQYXJhbXMgPSBhc3luYyBwYXJhbUNoYW5nZXMgPT4ge1xuICAgIGF3YWl0IGZpbmlzaEJ1aWxkaW5nKCk7XG4gICAgY29uc3QgcGFyYW1OYW1lcyA9IE9iamVjdC5rZXlzKHBhcmFtQ2hhbmdlcyk7XG5cbiAgICAvKiBwcm9taXNlcyB0byBwcmVwYXJlIGV2ZXJ5IHVwZGF0ZSovXG4gICAgY29uc3QgYXN5bmNSZXN1bHRzID0gcGFyYW1OYW1lcy5tYXAobmFtZSA9PlxuICAgICAgc2V0dGVyc1tgcHJlcGFyZVRvVXBkYXRlJHtuYW1lfWBdKHBhcmFtQ2hhbmdlc1tuYW1lXSksXG4gICAgKTtcbiAgICAvKiBpZiBhbnkgdXBkYXRlIGRvZXNuJ3Qgc3VjY2VlZCwgZmFpbCB0aGUgcmVxdWVzdCovXG4gICAgY29uc3QgcHJlcGFyZWQgPSBhd2FpdCBQcm9taXNlLmFsbChhc3luY1Jlc3VsdHMpO1xuXG4gICAgLyogYWN0dWFsbHkgdXBkYXRlKi9cbiAgICBmb3IgKGNvbnN0IFtpLCBuYW1lXSBvZiBwYXJhbU5hbWVzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgc2V0Rm4gPSBzZXR0ZXJzW2B1cGRhdGUke25hbWV9YF07XG4gICAgICBzZXRGbihwcmVwYXJlZFtpXSk7XG4gICAgfVxuICAgIHB1Ymxpc2goKTtcbiAgfTtcblxuICAvKiBDYWxsZWQgYWZ0ZXIgYWxsIHBhcmFtcyBoYXZlIGJlZW4gYWRkZWQgd2l0aCB0aGVpciBpbml0aWFsIHZhbHVlcyovXG4gIGNvbnN0IGJ1aWxkID0gKCkgPT4ge1xuICAgIC8qIFhYWCBsZXQgcGFyYW1zIGJlIGZpbmlzaGVkIGFzeW5jLiBBIGNvbmNlc3Npb24gdG8gdXBncmFkYWJpbGl0eSovXG4gICAgLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzQzKi9cbiAgICB2b2lkIEUud2hlbihmaW5pc2hCdWlsZGluZygpLCAoKSA9PiBwdWJsaXNoKCkpO1xuXG4gICAgLyogQ1JVQ0lBTDogQ29udHJhY3RzIHRoYXQgY2FsbCBidWlsZFBhcmFtTWFuYWdlciBzaG91bGQgb25seSBleHBvcnQgdGhlKi9cbiAgICAvKiByZXN1bHRpbmcgcGFyYW1NYW5hZ2VyIHRvIHRoZWlyIGNyZWF0b3JGYWNldCwgd2hlcmUgaXQgd2lsbCBiZSBwaWNrZWQgdXAgYnkqL1xuICAgIC8qIGNvbnRyYWN0R292ZXJub3IuIFRoZSBnZXRQYXJhbXMgbWV0aG9kIGNhbiBiZSBzaGFyZWQgd2lkZWx5LiovXG4gICAgcmV0dXJuIEZhcigncGFyYW0gbWFuYWdlcicsIHtcbiAgICAgIGdldFBhcmFtcyxcbiAgICAgIGdldFN1YnNjcmlwdGlvbjogKCkgPT4gc3Vic2NyaWJlcixcbiAgICAgIGdldEFtb3VudDogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuQU1PVU5ULCBuYW1lKSxcbiAgICAgIGdldEJyYW5kOiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5CUkFORCwgbmFtZSksXG4gICAgICBnZXRJbnN0YW5jZTogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuSU5TVEFOQ0UsIG5hbWUpLFxuICAgICAgZ2V0SW5zdGFsbGF0aW9uOiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5JTlNUQUxMQVRJT04sIG5hbWUpLFxuICAgICAgZ2V0SW52aXRhdGlvbkFtb3VudDogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuSU5WSVRBVElPTiwgbmFtZSksXG4gICAgICBnZXROYXQ6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLk5BVCwgbmFtZSksXG4gICAgICBnZXRSYXRpbzogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuUkFUSU8sIG5hbWUpLFxuICAgICAgZ2V0UmVjb3JkOiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5QQVNTQUJMRV9SRUNPUkQsIG5hbWUpLFxuICAgICAgZ2V0U3RyaW5nOiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5TVFJJTkcsIG5hbWUpLFxuICAgICAgZ2V0VGltZXN0YW1wOiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5USU1FU1RBTVAsIG5hbWUpLFxuICAgICAgZ2V0UmVsYXRpdmVUaW1lOiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5SRUxBVElWRV9USU1FLCBuYW1lKSxcbiAgICAgIGdldFVua25vd246IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlVOS05PV04sIG5hbWUpLFxuICAgICAgZ2V0VmlzaWJsZVZhbHVlLFxuICAgICAgZ2V0SW50ZXJuYWxQYXJhbVZhbHVlLFxuICAgICAgLyogR2V0dGVycyBhbmQgc2V0dGVycyBmb3IgZWFjaCBwYXJhbSB2YWx1ZSovXG4gICAgICAuLi5nZXR0ZXJzLFxuICAgICAgdXBkYXRlUGFyYW1zLFxuICAgICAgLyogQ29sbGVjdGlvbiBvZiBhbGwgZ2V0dGVycyBmb3IgcGFzc2luZyB0byByZWFkLW9ubHkgY29udGV4dHMqL1xuICAgICAgcmVhZG9ubHk6ICgpID0+IGhhcmRlbihnZXR0ZXJzKSxcbiAgICB9KTtcbiAgfTtcblxuICAvKiogQHR5cGUge1BhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG4gIGNvbnN0IGJ1aWxkZXIgPSB7XG4gICAgYWRkQW1vdW50OiAobiwgdikgPT4gYWRkQW1vdW50KG4sIHYsIGJ1aWxkZXIpLFxuICAgIGFkZEJyYW5kOiAobiwgdikgPT4gYWRkQnJhbmQobiwgdiwgYnVpbGRlciksXG4gICAgYWRkSW5zdGFsbGF0aW9uOiAobiwgdikgPT4gYWRkSW5zdGFsbGF0aW9uKG4sIHYsIGJ1aWxkZXIpLFxuICAgIGFkZEluc3RhbmNlOiAobiwgdikgPT4gYWRkSW5zdGFuY2UobiwgdiwgYnVpbGRlciksXG4gICAgYWRkVW5rbm93bjogKG4sIHYpID0+IGFkZFVua25vd24obiwgdiwgYnVpbGRlciksXG4gICAgYWRkSW52aXRhdGlvbjogKG4sIHYpID0+IGFkZEludml0YXRpb24obiwgdiwgYnVpbGRlciksXG4gICAgYWRkTmF0OiAobiwgdikgPT4gYWRkTmF0KG4sIHYsIGJ1aWxkZXIpLFxuICAgIGFkZFJhdGlvOiAobiwgdikgPT4gYWRkUmF0aW8obiwgdiwgYnVpbGRlciksXG4gICAgYWRkUmVjb3JkOiAobiwgdikgPT4gYWRkUmVjb3JkKG4sIHYsIGJ1aWxkZXIpLFxuICAgIGFkZFN0cmluZzogKG4sIHYpID0+IGFkZFN0cmluZyhuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRSZWxhdGl2ZVRpbWU6IChuLCB2KSA9PiBhZGRSZWxhdGl2ZVRpbWUobiwgdiwgYnVpbGRlciksXG4gICAgYWRkVGltZXN0YW1wOiAobiwgdikgPT4gYWRkVGltZXN0YW1wKG4sIHYsIGJ1aWxkZXIpLFxuICAgIGJ1aWxkLFxuICB9O1xuICByZXR1cm4gYnVpbGRlcjtcbn07JGjNj19vbmNlLm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKTtcblxuaGFyZGVuKGFzc2VydEVsZWN0b3JhdGVNYXRjaGVzKTtcbmhhcmRlbihtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyI6WyJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyJdLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciI6WyJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACml+1OvBsAALwbAABGAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vZXJyb3JzIiwiLi4vY29uc3RhbnRzLmpzIiwiLi9nb3Zlcm5QYXJhbS5qcyIsIi4vcGFyYW1NYW5hZ2VyLmpzIl0sImV4cG9ydHMiOlsibWFrZVBhcmFtTWFuYWdlciIsIm1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMiLCJtYWtlUGFyYW1NYW5hZ2VyU3luYyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsRmFpbCxxLFBhcmFtVHlwZXMsQ09OVFJBQ1RfRUxFQ1RPUkFURSxtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4uL2NvbnN0YW50cy5qc1wiLCBbW1wiUGFyYW1UeXBlc1wiLFskaM2PX2EgPT4gKFBhcmFtVHlwZXMgPSAkaM2PX2EpXV1dXSxbXCIuL2dvdmVyblBhcmFtLmpzXCIsIFtbXCJDT05UUkFDVF9FTEVDVE9SQVRFXCIsWyRozY9fYSA9PiAoQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICRozY9fYSldXV1dLFtcIi4vcGFyYW1NYW5hZ2VyLmpzXCIsIFtbXCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlclwiLFskaM2PX2EgPT4gKG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvbnRyYWN0TWV0YSwgSW5zdGFsbGF0aW9uLCBJbnN0YW5jZSwgSW52aXRhdGlvbiwgS2V5d29yZCwgWkNGfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtWb3RlQ291bnRlckNyZWF0b3JGYWNldCwgVm90ZUNvdW50ZXJQdWJsaWNGYWNldCwgUXVlc3Rpb25TcGVjLCBPdXRjb21lUmVjb3JkLCBBZGRRdWVzdGlvbiwgQWRkUXVlc3Rpb25SZXR1cm4sIEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZSwgR292ZXJuYW5jZVRlcm1zLCBQYXJhbU1hbmFnZXJCYXNlLCBQYXJhbVN0YXRlUmVjb3JkLCBQYXJhbVZhbHVlRm9yVHlwZSwgVXBkYXRlUGFyYW1zfSBmcm9tICcuLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtQYXJhbVR5cGV9IGZyb20gJy4uL2NvbnN0YW50cy5qcyc7XG4gKiBAaW1wb3J0IHtTdG9yZWRQdWJsaXNoZXJLaXR9IGZyb20gJ0BhZ29yaWMvbm90aWZpZXInO1xuICogQGltcG9ydCB7QW1vdW50fSBmcm9tICdAYWdvcmljL2VydHAnO1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBQYXJhbVR5cGU+fSBQYXJhbVR5cGVzTWFwXG4gKi9cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVN0YXRlUmVjb3JkfSBNXG4gKiBAdHlwZWRlZiB7eyBbUiBpbiBrZXlvZiBNXTogTVtSXVsndHlwZSddfX0gUGFyYW1UeXBlc01hcEZyb21SZWNvcmRcbiAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZXNNYXB9IE1cbiAqIEB0eXBlZGVmIHt7IFtUIGluIGtleW9mIE1dOiB7IHR5cGU6IE1bVF0sIHZhbHVlOiBQYXJhbVZhbHVlRm9yVHlwZTxNW1RdPiB9IH19IFBhcmFtUmVjb3Jkc0Zyb21UeXBlc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGVzTWFwfSBNXG4gKiBAdHlwZWRlZiB7e1xuICogICBbSyBpbiBrZXlvZiBNIGFzIGBnZXQke3N0cmluZyAmIEt9YF06ICgpID0+IFBhcmFtVmFsdWVGb3JUeXBlPE1bS10+XG4gKiB9fSBHZXR0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZXNNYXB9IFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtLIGluIGtleW9mIFQgYXMgYHVwZGF0ZSR7c3RyaW5nICYgS31gXTogKHZhbHVlOiBQYXJhbVZhbHVlRm9yVHlwZTxUW0tdPikgPT4gdm9pZFxuICogfX0gVXBkYXRlcnNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlc01hcH0gTVxuICogQHR5cGVkZWYge1BhcmFtTWFuYWdlckJhc2UgJiBHZXR0ZXJzPE0+ICYgVXBkYXRlcnM8TT4gJiB7cmVhZG9ubHk6ICgpID0+IEdldHRlcnM8TT59ICYge3VwZGF0ZVBhcmFtczogVXBkYXRlUGFyYW1zfX0gVHlwZWRQYXJhbU1hbmFnZXJcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFyYW1UeXBlfSB0eXBlXG4gKi9cbmNvbnN0IGJ1aWxkZXJNZXRob2ROYW1lID0gdHlwZSA9PlxuICBgYWRkJHt0eXBlWzBdLnRvVXBwZXJDYXNlKCkgKyB0eXBlLnN1YnN0cmluZygxKX1gO1xuXG4vKiogQHR5cGUge1BhcnRpYWw8UmVjb3JkPFBhcmFtVHlwZSwgYm9vbGVhbj4+fSAqL1xuY29uc3QgaXNBc3luYyA9IHtcbiAgaW52aXRhdGlvbjogdHJ1ZSxcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGV9IFRcbiAqIEB0eXBlZGVmIHtbdHlwZTogVCwgdmFsdWU6IFBhcmFtVmFsdWVGb3JUeXBlPFQ+XX0gU1QgcGFyYW0gc3BlYyB0dXBsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgdHlwZTogJ2ludml0YXRpb24nLCB2YWx1ZTogQW1vdW50PCdzZXQnPiB9fSBJbnZpdGF0aW9uUGFyYW1cbiAqL1xuXG4vKiBYWFggYmV0dGVyIHRvIHVzZSB0aGUgbWFuaWZlc3QgY29uc3RhbnQgUGFyYW1UeXBlcyovXG4vKiBidXQgaW1wb3J0aW5nIHRoYXQgaGVyZSB0dXJucyB0aGlzIGZpbGUgaW50byBhIG1vZHVsZSwqL1xuLyogYnJlYWtpbmcgdGhlIGFtYmllbnQgdHlwaW5nKi9cbi8qKlxuICogQHR5cGVkZWYge1NUPCdhbW91bnQnPlxuICogfCBTVDwnYnJhbmQnPlxuICogfCBTVDwnaW5zdGFsbGF0aW9uJz5cbiAqIHwgU1Q8J2luc3RhbmNlJz5cbiAqIHwgU1Q8J25hdCc+XG4gKiB8IFNUPCdyYXRpbyc+XG4gKiB8IFNUPCdzdHJpbmcnPlxuICogfCBTVDwndGltZXN0YW1wJz5cbiAqIHwgU1Q8J3JlbGF0aXZlVGltZSc+XG4gKiB8IFNUPCd1bmtub3duJz59IFN5bmNTcGVjVHVwbGVcbiAqXG4gKiBAdHlwZWRlZiB7WydpbnZpdGF0aW9uJywgSW52aXRhdGlvbl19IEFzeW5jU3BlY1R1cGxlXG4gKi9cblxuLyoqXG4gKiBAc2VlIG1ha2VQYXJhbU1hbmFnZXJTeW5jXG4gKiBAdGVtcGxhdGUge1JlY29yZDxLZXl3b3JkLCBBc3luY1NwZWNUdXBsZSB8IFN5bmNTcGVjVHVwbGU+fSBUXG4gKiBAcGFyYW0ge1N0b3JlZFB1Ymxpc2hlcktpdDxHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGU+fSBwdWJsaXNoZXJLaXRcbiAqIEBwYXJhbSB7VH0gc3BlY1xuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHJldHVybnMge1R5cGVkUGFyYW1NYW5hZ2VyPHtbSyBpbiBrZXlvZiBUXTogVFtLXVswXX0+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVBhcmFtTWFuYWdlciA9IChwdWJsaXNoZXJLaXQsIHNwZWMsIHpjZikgPT4ge1xuICBjb25zdCBidWlsZGVyID0gbWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIocHVibGlzaGVyS2l0LCB6Y2YuZ2V0Wm9lU2VydmljZSgpKTtcblxuICBjb25zdCBwcm9taXNlcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBbdHlwZSwgdmFsdWVdXSBvZiBPYmplY3QuZW50cmllcyhzcGVjKSkge1xuICAgIGNvbnN0IGFkZCA9IGJ1aWxkZXJbYnVpbGRlck1ldGhvZE5hbWUodHlwZSldO1xuICAgIGlmIChpc0FzeW5jW3R5cGVdKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKGFkZChuYW1lLCB2YWx1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGQobmFtZSwgdmFsdWUpO1xuICAgIH1cbiAgfVxuICAvKiBYWFgga2ljayBvZmYgcHJvbWlzZXMgYnV0IGRvbid0IGJsb2NrLiBUaGlzIGlzIGEgY29uY2Vzc2lvbiB0byBjb250cmFjdCByZWluY2FybmF0aW9uKi9cbiAgLyogd2hpY2ggY2Fubm90IGJsb2NrIG9uIGEgcmVtb3RlIGNhbGwuKi9cbiAgLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzQzKi9cbiAgdm9pZCBFLndoZW4oUHJvbWlzZS5hbGwocHJvbWlzZXMpLCB1bmRlZmluZWQsIHJlYXNvbiA9PlxuICAgIHpjZi5zaHV0ZG93bldpdGhGYWlsdXJlKHJlYXNvbiksXG4gICk7XG5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTtcbn07JGjNj19vbmNlLm1ha2VQYXJhbU1hbmFnZXIobWFrZVBhcmFtTWFuYWdlcik7XG5oYXJkZW4obWFrZVBhcmFtTWFuYWdlcik7XG5cbi8qKlxuICogVXNlZCBvbmx5IHdoZW4gdGhlIGNvbnRyYWN0IGhhcyBtdWx0aXBsZSBwYXJhbSBtYW5hZ2Vycy5cbiAqIEV4YWN0bHkgb25lIG11c3QgbWFuYWdlIHRoZSBlbGVjdG9yYXRlLCB3aGljaCByZXF1aXJlcyB0aGUgYXN5bmMgdmVyc2lvbi5cbiAqXG4gKiBAc2VlIG1ha2VQYXJhbU1hbmFnZXJcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPEtleXdvcmQsIFN5bmNTcGVjVHVwbGU+fSBUXG4gKiBAcGFyYW0ge1N0b3JlZFB1Ymxpc2hlcktpdDxHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGU+fSBwdWJsaXNoZXJLaXRcbiAqIEBwYXJhbSB7VH0gc3BlY1xuICogQHJldHVybnMge1R5cGVkUGFyYW1NYW5hZ2VyPHtbSyBpbiBrZXlvZiBUXTogVFtLXVswXX0+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVBhcmFtTWFuYWdlclN5bmMgPSAocHVibGlzaGVyS2l0LCBzcGVjKSA9PiB7XG4gIGNvbnN0IGJ1aWxkZXIgPSBtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcihwdWJsaXNoZXJLaXQpO1xuXG4gIGZvciAoY29uc3QgW25hbWUsIFt0eXBlLCB2YWx1ZV1dIG9mIE9iamVjdC5lbnRyaWVzKHNwZWMpKSB7XG4gICAgY29uc3QgYWRkID0gYnVpbGRlcltidWlsZGVyTWV0aG9kTmFtZSh0eXBlKV07XG4gICAgYWRkIHx8IEZhaWxgTm8gYnVpbGRlciBtZXRob2QgZm9yIHBhcmFtIHR5cGUgJHtxKHR5cGUpfWA7XG4gICAgYWRkKG5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7XG59OyRozY9fb25jZS5tYWtlUGFyYW1NYW5hZ2VyU3luYyhtYWtlUGFyYW1NYW5hZ2VyU3luYyk7XG5oYXJkZW4obWFrZVBhcmFtTWFuYWdlclN5bmMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgSW52aXRhdGlvbj4gJiB7RWxlY3RvcmF0ZTogSW52aXRhdGlvbn19IEkgUHJpdmF0ZSBpbnZpdGF0aW9uIHZhbHVlc1xuICogQHRlbXBsYXRlIHtQYXJhbVR5cGVzTWFwfSBNIE1hcCBvZiB0eXBlcyBvZiBjdXN0b20gZ292ZXJuZWQgdGVybXNcbiAqIEBwYXJhbSB7U3RvcmVkUHVibGlzaGVyS2l0PEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZT59IHB1Ymxpc2hlcktpdFxuICogQHBhcmFtIHtaQ0Y8R292ZXJuYW5jZVRlcm1zPE0+Pn0gemNmXG4gKiBAcGFyYW0ge0l9IGludml0YXRpb25zIGludml0YXRpb24gb2JqZWN0cywgd2hpY2ggbXVzdCBjb21lIGZyb20gcHJpdmF0ZUFyZ3NcbiAqIEBwYXJhbSB7TX0gcGFyYW1UeXBlc01hcFxuICogQHBhcmFtIHtvYmplY3R9IFtvdmVycmlkZXNdXG4gKiBAcmV0dXJucyB7VHlwZWRQYXJhbU1hbmFnZXI8TSAmIHtbSyBpbiBrZXlvZiBJXTogJ2ludml0YXRpb24nfT59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zID0gKFxuICBwdWJsaXNoZXJLaXQsXG4gIHpjZixcbiAgaW52aXRhdGlvbnMsXG4gIHBhcmFtVHlwZXNNYXAsXG4gIG92ZXJyaWRlcyxcbikgPT4ge1xuICBpZiAob3ZlcnJpZGVzKSB7XG4gICAgY29uc29sZS5sb2coJ1RQTSAnLCB7IG92ZXJyaWRlcyB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgZ292ZXJuZWRQYXJhbXMgfSA9IHpjZi5nZXRUZXJtcygpO1xuICAvKiogQHR5cGUge0FycmF5PFtLZXl3b3JkLCAoU3luY1NwZWNUdXBsZSB8IEFzeW5jU3BlY1R1cGxlKV0+fSAqL1xuICBjb25zdCBtYWtlclNwZWNFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMocGFyYW1UeXBlc01hcCkubWFwKFxuICAgIChbcGFyYW1LZXksIHBhcmFtVHlwZV0pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgb3ZlcnJpZGVzICYmIG92ZXJyaWRlc1twYXJhbUtleV1cbiAgICAgICAgICA/IG92ZXJyaWRlc1twYXJhbUtleV1cbiAgICAgICAgICA6IGdvdmVybmVkUGFyYW1zW3BhcmFtS2V5XS52YWx1ZTtcblxuICAgICAgcmV0dXJuIFtwYXJhbUtleSwgLyoqIEB0eXBlIHtTeW5jU3BlY1R1cGxlfSAqLyAoW3BhcmFtVHlwZSwgdmFsdWVdKV07XG4gICAgfSxcbiAgKTtcbiAgLyogRXZlcnkgZ292ZXJuZWQgY29udHJhY3QgaGFzIGFuIEVsZWN0b3JhdGUgcGFyYW0gdGhhdCBzdGFydHMgYXMgYGluaXRpYWxQb3Nlckludml0YXRpb25gIHByaXZhdGUgYXJnKi9cbiAgZm9yIChjb25zdCBbbmFtZSwgaW52aXRhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoaW52aXRhdGlvbnMpKSB7XG4gICAgbWFrZXJTcGVjRW50cmllcy5wdXNoKFtuYW1lLCBbUGFyYW1UeXBlcy5JTlZJVEFUSU9OLCBpbnZpdGF0aW9uXV0pO1xuICB9XG4gIGNvbnN0IG1ha2VyU3BlYyA9IE9iamVjdC5mcm9tRW50cmllcyhtYWtlclNwZWNFbnRyaWVzKTtcbiAgbWFrZXJTcGVjW0NPTlRSQUNUX0VMRUNUT1JBVEVdIHx8XG4gICAgRmFpbGBtaXNzaW5nIEVsZWN0b3JhdGUgaW52aXRhdGlvbiBwYXJhbSB2YWx1ZWA7XG5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgcmV0dXJuIG1ha2VQYXJhbU1hbmFnZXIocHVibGlzaGVyS2l0LCBtYWtlclNwZWMsIHpjZik7XG59OyRozY9fb25jZS5tYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMpO1xuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBhcmFtTWFuYWdlciI6WyJtYWtlUGFyYW1NYW5hZ2VyIl0sIm1ha2VQYXJhbU1hbmFnZXJTeW5jIjpbIm1ha2VQYXJhbU1hbmFnZXJTeW5jIl0sIm1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMiOlsibWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADBFcR/HCYAABwmAAAyAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJub3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiLCIuL2NvbnRyYWN0R292ZXJub3JLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJtZXRhIiwic3RhcnQiLCJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyIsInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRSxtdXN0TWF0Y2gsbWFrZVRyYWNlcixwcm92aWRlU2luZ2xldG9uLENPTlRSQUNUX0VMRUNUT1JBVEUscHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQsUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJtYWtlVHJhY2VyXCIsWyRozY9fYSA9PiAobWFrZVRyYWNlciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qc1wiLCBbW1wicHJvdmlkZVNpbmdsZXRvblwiLFskaM2PX2EgPT4gKHByb3ZpZGVTaW5nbGV0b24gPSAkaM2PX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLFskaM2PX2EgPT4gKENPTlRSQUNUX0VMRUNUT1JBVEUgPSAkaM2PX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJub3JLaXQuanNcIiwgW1tcInByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlXCIsWyRozY9fYSA9PiAoUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDb250cmFjdE1ldGEsIEluc3RhbGxhdGlvbiwgSW5zdGFuY2UsIEludml0YXRpb24sIElzc3VlcktleXdvcmRSZWNvcmQsIFN0YW5kYXJkVGVybXMsIFpDRiwgWm9lU2VydmljZX0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7R292ZXJuYWJsZVN0YXJ0Rm4sIEdvdmVybm9yQ3JlYXRvckZhY2V0LCBHb3Zlcm5vclB1YmxpYywgUGFyYW1DaGFuZ2VJc3N1ZURldGFpbHN9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tICdAYWdvcmljL3RpbWUnO1xuICogQGltcG9ydCB7SW52aXRhdGlvblBhcmFtfSBmcm9tICcuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG5jb25zdCB0cmFjZSA9IG1ha2VUcmFjZXIoJ0NHb3YnLCBmYWxzZSk7XG5cbi8qKiBAdHlwZSB7Q29udHJhY3RNZXRhPHR5cGVvZiBzdGFydD59ICovXG4gICAgICAgY29uc3QgbWV0YSA9IHtcbiAgdXBncmFkYWJpbGl0eTogJ2NhblVwZ3JhZGUnLFxufTskaM2PX29uY2UubWV0YShtZXRhKTtcbmhhcmRlbihtZXRhKTtcblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IHRoZSBxdWVzdGlvbiBkZXRhaWxzIGNvcnJlc3BvbmQgdG8gYSBwYXJhbWV0ZXIgY2hhbmdlIHF1ZXN0aW9uXG4gKiB0aGF0IHRoZSBlbGVjdG9yYXRlIGhvc3RzLCBhbmQgdGhhdCB0aGUgdm90ZUNvdW50ZXIgYW5kIG90aGVyIGRldGFpbHMgYXJlXG4gKiBjb25zaXN0ZW50IHdpdGggaXQuXG4gKlxuICogQHBhcmFtIHtFUmVmPFpvZVNlcnZpY2U+fSB6b2VcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGVsZWN0b3JhdGVcbiAqIEBwYXJhbSB7UGFyYW1DaGFuZ2VJc3N1ZURldGFpbHN9IGRldGFpbHNcbiAqL1xuICAgICAgIGNvbnN0IHZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzID0gYXN5bmMgKHpvZSwgZWxlY3RvcmF0ZSwgZGV0YWlscykgPT4ge1xuICBjb25zdCB7XG4gICAgY291bnRlckluc3RhbmNlLFxuICAgIGlzc3VlOiB7IGNvbnRyYWN0OiBnb3Zlcm5lZEluc3RhbmNlIH0sXG4gIH0gPSBkZXRhaWxzO1xuICBtdXN0TWF0Y2goZGV0YWlscywgUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG4gIGNvbnN0IGdvdmVybm9ySW5zdGFuY2UgPSBhd2FpdCBFLmdldChFKHpvZSkuZ2V0VGVybXMoZ292ZXJuZWRJbnN0YW5jZSkpXG4gICAgLmVsZWN0aW9uTWFuYWdlcjtcbiAgY29uc3QgZ292ZXJub3JQdWJsaWMgPSBFKHpvZSkuZ2V0UHVibGljRmFjZXQoZ292ZXJub3JJbnN0YW5jZSk7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICBFKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZVZvdGVDb3VudGVyKGNvdW50ZXJJbnN0YW5jZSksXG4gICAgRShnb3Zlcm5vclB1YmxpYykudmFsaWRhdGVFbGVjdG9yYXRlKGVsZWN0b3JhdGUpLFxuICAgIEUoZ292ZXJub3JQdWJsaWMpLnZhbGlkYXRlVGltZXIoZGV0YWlscy5jbG9zaW5nUnVsZSksXG4gIF0pO1xufTskaM2PX29uY2UudmFsaWRhdGVRdWVzdGlvbkRldGFpbHModmFsaWRhdGVRdWVzdGlvbkRldGFpbHMpO1xuaGFyZGVuKHZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzKTtcblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IHRoZSBxdWVzdGlvbnMgY291bnRlZCBieSB0aGUgdm90ZUNvdW50ZXIgY29ycmVzcG9uZCB0byBhXG4gKiBwYXJhbWV0ZXIgY2hhbmdlIHF1ZXN0aW9uIHRoYXQgdGhlIGVsZWN0b3JhdGUgaG9zdHMsIGFuZCB0aGF0IHRoZVxuICogdm90ZUNvdW50ZXIgYW5kIG90aGVyIGRldGFpbHMgYXJlIGNvbnNpc3RlbnQuXG4gKlxuICogQHBhcmFtIHtFUmVmPFpvZVNlcnZpY2U+fSB6b2VcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGVsZWN0b3JhdGVcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IHZvdGVDb3VudGVyXG4gKi9cbiAgICAgICBjb25zdCB2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIgPSBhc3luYyAoXG4gIHpvZSxcbiAgZWxlY3RvcmF0ZSxcbiAgdm90ZUNvdW50ZXIsXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtQcm9taXNlPGFueT59ICovXG4gIGNvbnN0IGNvdW50ZXJQdWJsaWNQID0gRSh6b2UpLmdldFB1YmxpY0ZhY2V0KHZvdGVDb3VudGVyKTtcbiAgY29uc3QgcXVlc3Rpb25EZXRhaWxzID0gYXdhaXQgRShjb3VudGVyUHVibGljUCkuZ2V0RGV0YWlscygpO1xuXG4gIHJldHVybiB2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyh6b2UsIGVsZWN0b3JhdGUsIHF1ZXN0aW9uRGV0YWlscyk7XG59OyRozY9fb25jZS52YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIodmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyKTtcbmhhcmRlbih2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtTdGFuZGFyZFRlcm1zfSBDb250cmFjdEdvdmVybm9yVGVybXNcbiAqIEBwcm9wZXJ0eSB7VGltZXJTZXJ2aWNlfSB0aW1lclxuICogQHByb3BlcnR5IHtJbnN0YWxsYXRpb259IGdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb25cbiAqL1xuXG4vKipcbiAqIENvbnRyYWN0R292ZXJub3IgaXMgYW4gRWxlY3Rpb25NYW5hZ2VyIHRoYXQgc3RhcnRzIHVwIGEgY29udHJhY3QgYW5kIGhhbmRzXG4gKiBpdHMgb3duIGNyZWF0b3IgYSBmYWNldCB0aGF0IGFsbG93cyB0aGVtIHRvIG1hbmFnZSB0aGF0IGNvbnRyYWN0J3MgQVBJcyxcbiAqIG9mZmVyIGZpbHRlcnMsIGFuZCBwYXJhbWV0ZXJzLlxuICpcbiAqIFRoZSB0ZXJtcyBmb3IgdGhpcyBjb250cmFjdCBpbmNsdWRlIHRoZSBUaW1lciwgYW5kIHRoZSBJbnN0YWxsYXRpb24gdG8gYmVcbiAqIHN0YXJ0ZWQsIGFzIHdlbGwgYXMgYW4gaXNzdWVyS2V5d29yZFJlY29yZCBvciB0ZXJtcyBuZWVkZWQgYnkgdGhlIGdvdmVybmVkXG4gKiBjb250cmFjdC4gVGhvc2UgZGV0YWlscyBmb3IgdGhlIGdvdmVybmVkIGNvbnRyYWN0IGFyZSBpbmNsdWRlZCBpbiB0aGlzXG4gKiBjb250cmFjdCdzIHRlcm1zIGFzIGEgXCJnb3Zlcm5lZFwiIHJlY29yZC4gSWYgdGhlIGNvbnRyYWN0IGV4cGVjdHMgcHJpdmF0ZUFyZ3MsXG4gKiB0aG9zZSB3aWxsIGJlIHByb3ZpZGVkIGluIHRoaXMgY29udHJhY3QncyBgcHJpdmF0ZUFyZ3NgIHVuZGVyICdnb3Zlcm5lZDonLlxuICpcbiAqIHRlcm1zID0ge1xuICogICAgdGltZXIsXG4gKiAgICBnb3Zlcm5lZENvbnRyYWN0SW5zdGFsbGF0aW9uLFxuICogICAgZ292ZXJuZWQ6IHsgaXNzdWVyS2V5d29yZFJlY29yZCwgdGVybXMgfSxcbiAqIH07XG4gKlxuICogVGhlIGVsZWN0b3JhdGUgdGhhdCB3aWxsIHZvdGUgb24gZ292ZXJuYW5jZSBxdWVzdGlvbnMgaXMgaXRzZWxmIGEgZ292ZXJuZWRcbiAqIHBhcmFtZXRlci4gSXRzIHZhbHVlIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBwdWJsaWNGYWNldCB1c2luZ1xuICogZ2V0RWxlY3RvcmF0ZUluc3RhbmNlKCkuIFdoZW4gY3JlYXRpbmcgbmV3IHF1ZXN0aW9ucywgd2UgdXNlXG4gKiBnZXRVcGRhdGVkUG9zZXJGYWNldCgpIHRvIGluZm9ybSB0aGUgZWxlY3RvcmF0ZSBhYm91dCB0aGUgbmV3IHF1ZXN0aW9uLlxuICpcbiAqIFRoZSBnb3Zlcm5lZENvbnRyYWN0IGlzIHJlc3BvbnNpYmxlIGZvciBzdXBwbHlpbmcgZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSBpblxuICogaXRzIGNyZWF0b3JGYWNldC4gZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSB0YWtlcyBhIFBhcmFtU3BlY2lmaWNhdGlvbiwgd2hpY2hcbiAqIGlkZW50aWZpZXMgdGhlIHBhcmFtZXRlciB0byBiZSB2b3RlZCBvbi4gQSBtaW5pbWFsIFBhcmFtU3BlY2lmaWNhdGlvblxuICogc3BlY2lmaWVzIHRoZSBrZXkgd2hpY2ggaWRlbnRpZmllcyBhIHBhcnRpY3VsYXIgcGFyYW1NYW5hZ2VyIChldmVuIGlmIHRoZXJlJ3NcbiAqIG9ubHkgb25lKSBhbmQgdGhlIHBhcmFtZXRlck5hbWUuIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBQYXJhbVNwZWNpZmljYXRpb24gaXNcbiAqIHVwIHRvIHRoZSBjb250cmFjdC5cbiAqXG4gKiBUaGUgY29udHJhY3RHb3Zlcm5vciBjcmVhdG9yRmFjZXQgaW5jbHVkZXMgYHZvdGVPblBhcmFtQ2hhbmdlc2AsXG4gKiBgdm90ZU9uRmlsdGVyYCwgYW5kIGB2b3RlT25BcGlJbnZvY2F0aW9uYC4gYHZvdGVPblBhcmFtQ2hhbmdlc2AgaXMgdXNlZCB0b1xuICogY3JlYXRlIHF1ZXN0aW9ucyB0aGF0IHdpbGwgYXV0b21hdGljYWxseSB1cGRhdGUgY29udHJhY3QgcGFyYW1ldGVycyBpZlxuICogcGFzc2VkLiBgdm90ZU9uRmlsdGVyYCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgcXVlc3Rpb25zIHRoYXQgd2lsbCBwcmV2ZW50IHRoZVxuICogZXhlcmNpc2Ugb2YgY2VydGFpbiBpbnZpdGF0aW9ucyBpZiBwYXNzZWQuIGB2b3RlT25BcGlJbnZvY2F0aW9uYCBjcmVhdGVzXG4gKiBxdWVzdGlvbnMgdGhhdCB3aWxsIGludm9rZSBwcmUtZGVmaW5lZCBBUElzIGluIHRoZSBjb250cmFjdC5cbiAqXG4gKiBUaGlzIGZhY2V0IHdpbGwgdXN1YWxseSBiZSBjbG9zZWx5IGhlbGQuIFRoZSBjcmVhdG9yRmFjZXQgY2FuIGFsc28gYmUgdXNlZCB0b1xuICogcmV0cmlldmUgdGhlIGdvdmVybmVkIGluc3RhbmNlLCBwdWJsaWNGYWNldCwgYW5kIGl0cyBjcmVhdG9yRmFjZXQgd2l0aFxuICogdGhlIHZvdGVPbiooKSBtZXRob2RzIG9taXR0ZWQuXG4gKlxuICogVGhlIGdvdmVybmVkIGNvbnRyYWN0J3MgdGVybXMgaW5jbHVkZSB0aGUgaW5zdGFuY2Ugb2YgdGhpcyAoZ292ZXJuaW5nKVxuICogY29udHJhY3QgKGFzIGVsZWN0aW9uTWFuYWdlcikgc28gY2xpZW50cyB3aWxsIGJlIGFibGUgdG8gbG9vayB1cCB0aGUgc3RhdGVcbiAqIG9mIHRoZSBnb3Zlcm5lZCBwYXJhbWV0ZXJzLlxuICpcbiAqIHRlbXBsYXRlIHt7fX0gUEYgUHVibGljIGZhY2V0IG9mIGdvdmVybmVkXG4gKiB0ZW1wbGF0ZSB7Q29udHJhY3RQb3dlcmZ1bENyZWF0b3JGYWNldH0gQ0YgQ3JlYXRvciBmYWNldCBvZiBnb3Zlcm5lZFxuICogdHlwZSB7Q29udHJhY3RTdGFydEZuPFxuICogR292ZXJub3JQdWJsaWMsXG4gKiBHb3Zlcm5vckNyZWF0b3JGYWNldDxQRixDRj4sXG4gKiB7XG4gKiAgIHRpbWVyOiBUaW1lclNlcnZpY2UsXG4gKiAgIGdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb246IEluc3RhbGxhdGlvbjxDRj4sXG4gKiAgIGdvdmVybmVkOiB7XG4gKiAgICAgaXNzdWVyS2V5d29yZFJlY29yZDogSXNzdWVyS2V5d29yZFJlY29yZCxcbiAqICAgICB0ZXJtczoge2dvdmVybmVkUGFyYW1zOiB7W0NPTlRSQUNUX0VMRUNUT1JBVEVdOiBJbnZpdGF0aW9uUGFyYW19fSxcbiAqICAgfVxuICogfT59XG4gKi9cblxuLyoqXG4gKiBTdGFydCBhbiBpbnN0YW5jZSBvZiBhIGdvdmVybm9yLCBnb3Zlcm5pbmcgYSBcImdvdmVybmVkXCIgY29udHJhY3Qgc3BlY2lmaWVkIGluIHRlcm1zLlxuICpcbiAqIEB0ZW1wbGF0ZSB7R292ZXJuYWJsZVN0YXJ0Rm59IFNGIFN0YXJ0IGZ1bmN0aW9uIG9mIGdvdmVybmVkIGNvbnRyYWN0XG4gKiBAcGFyYW0ge1pDRjx7XG4gKiAgIHRpbWVyOiBUaW1lclNlcnZpY2UsXG4gKiAgIGdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb246IEluc3RhbGxhdGlvbjxTRj4sXG4gKiAgIGdvdmVybmVkOiB7XG4gKiAgICAgaXNzdWVyS2V5d29yZFJlY29yZDogSXNzdWVyS2V5d29yZFJlY29yZCxcbiAqICAgICB0ZXJtczoge2dvdmVybmVkUGFyYW1zOiB7W0NPTlRSQUNUX0VMRUNUT1JBVEVdOiBJbnZpdGF0aW9uUGFyYW19fSxcbiAqICAgICBsYWJlbD86IHN0cmluZyxcbiAqICAgfVxuICogfT59IHpjZlxuICogQHBhcmFtIHt7XG4gKiAgIGdvdmVybmVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICogfX0gcHJpdmF0ZUFyZ3NcbiAqIEByZXR1cm5zIHtQcm9taXNlPHtcbiAqICAgY3JlYXRvckZhY2V0OiBHb3Zlcm5vckNyZWF0b3JGYWNldDxTRj4sXG4gKiAgIHB1YmxpY0ZhY2V0OiBHb3Zlcm5vclB1YmxpYyxcbiAqIH0+fVxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKi9cbiAgICAgICBjb25zdCBzdGFydCA9IGFzeW5jICh6Y2YsIHByaXZhdGVBcmdzLCBiYWdnYWdlKSA9PiB7XG4gIHRyYWNlKCdzdGFydCcpO1xuICBjb25zdCB6b2UgPSB6Y2YuZ2V0Wm9lU2VydmljZSgpO1xuICB0cmFjZSgnZ2V0VGVybXMnLCB6Y2YuZ2V0VGVybXMoKSk7XG4gIGNvbnN0IHtcbiAgICB0aW1lcixcbiAgICBnb3Zlcm5lZENvbnRyYWN0SW5zdGFsbGF0aW9uLFxuICAgIGdvdmVybmVkOiB7XG4gICAgICBpc3N1ZXJLZXl3b3JkUmVjb3JkOiBnb3Zlcm5lZElzc3VlcktleXdvcmRSZWNvcmQsXG4gICAgICB0ZXJtczogY29udHJhY3RUZXJtcyxcbiAgICAgIGxhYmVsOiBnb3Zlcm5lZENvbnRyYWN0TGFiZWwsXG4gICAgfSxcbiAgfSA9IHpjZi5nZXRUZXJtcygpO1xuICB0cmFjZSgnY29udHJhY3RUZXJtcycsIGNvbnRyYWN0VGVybXMpO1xuICBjb250cmFjdFRlcm1zLmdvdmVybmVkUGFyYW1zW0NPTlRSQUNUX0VMRUNUT1JBVEVdIHx8XG4gICAgRmFpbGBDb250cmFjdCBtdXN0IGRlY2xhcmUgJHtDT05UUkFDVF9FTEVDVE9SQVRFfSBhcyBhIGdvdmVybmVkIHBhcmFtZXRlcmA7XG5cbiAgY29uc3QgbWFrZUNvbnRyYWN0R292ZXJub3JLaXQgPSBwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdChiYWdnYWdlLCB7XG4gICAgdGltZXIsXG4gICAgem9lLFxuICB9KTtcblxuICB0cmFjZSgnYXdhaXRpbmcgcHJvdmlkZVNpbmdsZXRvbigpJyk7XG4gIGNvbnN0IGdvdmVybm9yS2l0ID0gYXdhaXQgcHJvdmlkZVNpbmdsZXRvbihcbiAgICBiYWdnYWdlLFxuICAgICdjb250cmFjdEdvdmVybm9yS2l0JyxcbiAgICBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBhdWdtZW50ZWRUZXJtcyA9IGhhcmRlbih7XG4gICAgICAgIC4uLmNvbnRyYWN0VGVybXMsXG4gICAgICAgIGVsZWN0aW9uTWFuYWdlcjogemNmLmdldEluc3RhbmNlKCksXG4gICAgICB9KTtcblxuICAgICAgdHJhY2UoJ3N0YXJ0aW5nIGdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb24gb2YnLCBnb3Zlcm5lZENvbnRyYWN0TGFiZWwpO1xuICAgICAgY29uc3Qgc3RhcnRlZEluc3RhbmNlS2l0ID0gYXdhaXQgRSh6b2UpLnN0YXJ0SW5zdGFuY2UoXG4gICAgICAgIGdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb24sXG4gICAgICAgIGdvdmVybmVkSXNzdWVyS2V5d29yZFJlY29yZCxcblxuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBnb3Zlcm5hbmNlIHR5cGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNzE3OCovXG4gICAgICAgIGF1Z21lbnRlZFRlcm1zLFxuICAgICAgICBwcml2YXRlQXJncy5nb3Zlcm5lZCxcbiAgICAgICAgZ292ZXJuZWRDb250cmFjdExhYmVsLFxuICAgICAgKTtcbiAgICAgIHRyYWNlKCdhd2FpdGluZyByZW1vdGUgbGltaXRlZENyZWF0b3JGYWNldCcpO1xuICAgICAgY29uc3QgbGltaXRlZENyZWF0b3JGYWNldCA9IGF3YWl0IEUoXG4gICAgICAgIHN0YXJ0ZWRJbnN0YW5jZUtpdC5jcmVhdG9yRmFjZXQsXG4gICAgICApLmdldExpbWl0ZWRDcmVhdG9yRmFjZXQoKTtcblxuICAgICAgcmV0dXJuIG1ha2VDb250cmFjdEdvdmVybm9yS2l0KHN0YXJ0ZWRJbnN0YW5jZUtpdCwgbGltaXRlZENyZWF0b3JGYWNldCk7XG4gICAgfSxcbiAgKTtcblxuICAvKiBBdCB0aGlzIHBvaW50LCBzb21lIHJlbW90ZSBjYWxscyBzdGlsbCBuZWVkIHRvIGJlIG1hZGUgd2l0aGluIHRoZSBnb3Zlcm5vcktpdC4qL1xuICAvKiBTcGVjaWZpY2FsbHksIHRvIHRoZSB2YXQgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0IGZvciBpdHMgQVBJIG5hbWVzLiBUaGUgZXhvKi9cbiAgLyogZGVmZXJzIHRoYXQgdW50aWwgQVBJIGdvdmVybmFuY2UgaXMgcmVxdWVzdGVkIHRvIGJlIGludm9rZWQgb3IgdmFsaWRhdGVkLiovXG5cbiAgdHJhY2UoJ3N0YXJ0IGNvbXBsZXRlJyk7XG5cbiAgLyogQ1JVQ0lBTDogb25seSBjb250cmFjdEdvdmVybm9yIHNob3VsZCBnZXQgdGhlIGFiaWxpdHkgdG8gdXBkYXRlIHBhcmFtcyovXG4gIHJldHVybiB7IGNyZWF0b3JGYWNldDogZ292ZXJub3JLaXQuY3JlYXRvciwgcHVibGljRmFjZXQ6IGdvdmVybm9yS2l0LnB1YmxpYyB9O1xufTskaM2PX29uY2Uuc3RhcnQoc3RhcnQpO1xuaGFyZGVuKHN0YXJ0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ldGEiOlsibWV0YSJdLCJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyI6WyJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyJdLCJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiOlsidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIl0sInN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ1twx3lLgAA5S4AADUAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5vcktpdC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvdGltZSIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLFVuZ3VhcmRlZEhlbHBlckksbWFrZVRyYWNlcixNLHByZXBhcmVFeG9DbGFzc0tpdCxFLEludml0YXRpb25TaGFwZSxJbnN0YW5jZUhhbmRsZVNoYXBlLEluc3RhbGxhdGlvblNoYXBlLFRpbWVzdGFtcFNoYXBlLHNldHVwQXBpR292ZXJuYW5jZSxzZXR1cEZpbHRlckdvdmVybmFuY2UsQ09OVFJBQ1RfRUxFQ1RPUkFURSxzZXR1cFBhcmFtR292ZXJuYW5jZSxDbG9zaW5nUnVsZVNoYXBlLFBhcmFtQ2hhbmdlc1NwZWNTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJVbmd1YXJkZWRIZWxwZXJJXCIsWyRozY9fYSA9PiAoVW5ndWFyZGVkSGVscGVySSA9ICRozY9fYSldXSxbXCJtYWtlVHJhY2VyXCIsWyRozY9fYSA9PiAobWFrZVRyYWNlciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanNcIiwgW1tcIkludml0YXRpb25TaGFwZVwiLFskaM2PX2EgPT4gKEludml0YXRpb25TaGFwZSA9ICRozY9fYSldXSxbXCJJbnN0YW5jZUhhbmRsZVNoYXBlXCIsWyRozY9fYSA9PiAoSW5zdGFuY2VIYW5kbGVTaGFwZSA9ICRozY9fYSldXSxbXCJJbnN0YWxsYXRpb25TaGFwZVwiLFskaM2PX2EgPT4gKEluc3RhbGxhdGlvblNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjNj19hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzXCIsIFtbXCJzZXR1cEFwaUdvdmVybmFuY2VcIixbJGjNj19hID0+IChzZXR1cEFwaUdvdmVybmFuY2UgPSAkaM2PX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5GaWx0ZXIuanNcIiwgW1tcInNldHVwRmlsdGVyR292ZXJuYW5jZVwiLFskaM2PX2EgPT4gKHNldHVwRmlsdGVyR292ZXJuYW5jZSA9ICRozY9fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzXCIsIFtbXCJDT05UUkFDVF9FTEVDVE9SQVRFXCIsWyRozY9fYSA9PiAoQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICRozY9fYSldXSxbXCJzZXR1cFBhcmFtR292ZXJuYW5jZVwiLFskaM2PX2EgPT4gKHNldHVwUGFyYW1Hb3Zlcm5hbmNlID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJDbG9zaW5nUnVsZVNoYXBlXCIsWyRozY9fYSA9PiAoQ2xvc2luZ1J1bGVTaGFwZSA9ICRozY9fYSldXSxbXCJQYXJhbUNoYW5nZXNTcGVjU2hhcGVcIixbJGjNj19hID0+IChQYXJhbUNoYW5nZXNTcGVjU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJldHVybn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0NvbnRyYWN0TWV0YSwgSW5zdGFsbGF0aW9uLCBJbnN0YW5jZSwgSW52aXRhdGlvbiwgWkNGLCBab2VTZXJ2aWNlfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtDbG9zaW5nUnVsZSwgR292ZXJuYWJsZVN0YXJ0Rm4sIExpbWl0ZWRDRiwgUG9zZXJGYWNldCwgVm90ZU9uQXBpSW52b2NhdGlvbiwgVm90ZU9uT2ZmZXJGaWx0ZXIsIFZvdGVPblBhcmFtQ2hhbmdlc30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJztcbiAqIEBpbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSAnQGFnb3JpYy90aW1lJztcbiAqIEBpbXBvcnQge1N0YXJ0ZWRJbnN0YW5jZUtpdH0gZnJvbSAnQGFnb3JpYy96b2Uvc3JjL3pvZVNlcnZpY2UvdXRpbHMuanMnO1xuICogQGltcG9ydCB7VHlwZWRQYXJhbU1hbmFnZXJ9IGZyb20gJy4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG5jb25zdCB0cmFjZSA9IG1ha2VUcmFjZXIoJ0NHSycsIGZhbHNlKTtcblxuY29uc3QgQ29udHJhY3RHb3Zlcm5vcktpdEkgPSB7XG4gIGhlbHBlcjogVW5ndWFyZGVkSGVscGVySSxcbiAgY3JlYXRvcjogTS5pbnRlcmZhY2UoJ0NvbnRyYWN0IEdvdmVybm9yIEtpdCBjcmVhdG9yJywge1xuICAgIHJlcGxhY2VFbGVjdG9yYXRlOiBNLmNhbGwoSW52aXRhdGlvblNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICB2b3RlT25QYXJhbUNoYW5nZXM6IE0uY2FsbChcbiAgICAgIEluc3RhbGxhdGlvblNoYXBlLFxuICAgICAgVGltZXN0YW1wU2hhcGUsXG4gICAgICBQYXJhbUNoYW5nZXNTcGVjU2hhcGUsXG4gICAgKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICB2b3RlT25BcGlJbnZvY2F0aW9uOiBNLmNhbGwoXG4gICAgICBNLnN0cmluZygpLFxuICAgICAgTS5hcnJheU9mKE0uYW55KCkpLFxuICAgICAgSW5zdGFsbGF0aW9uU2hhcGUsXG4gICAgICBUaW1lc3RhbXBTaGFwZSxcbiAgICApLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIHZvdGVPbk9mZmVyRmlsdGVyOiBNLmNhbGwoXG4gICAgICBJbnN0YWxsYXRpb25TaGFwZSxcbiAgICAgIFRpbWVzdGFtcFNoYXBlLFxuICAgICAgTS5hcnJheU9mKE0uc3RyaW5nKCkpLFxuICAgICkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgZ2V0Q3JlYXRvckZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdFbGVjdG9yYXRlQ3JlYXRvcicpKSxcbiAgICBnZXRBZG1pbkZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdFbGVjdG9yYXRlQWRtaW4nKSksXG4gICAgZ2V0SW5zdGFuY2U6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG4gICAgZ2V0UHVibGljRmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ0VsZWN0b3JhdGVQdWJsaWMnKSksXG4gIH0pLFxuICBwdWJsaWM6IE0uaW50ZXJmYWNlKCdDb250cmFjdCBHb3Zlcm5vciBLaXQgcHVibGljJywge1xuICAgIGdldEVsZWN0b3JhdGU6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKC8qIEluc3RhbmNlICovKSksXG4gICAgZ2V0R292ZXJuZWRDb250cmFjdDogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbiAgICB2YWxpZGF0ZVZvdGVDb3VudGVyOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgdmFsaWRhdGVFbGVjdG9yYXRlOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgdmFsaWRhdGVUaW1lcjogTS5jYWxsKENsb3NpbmdSdWxlU2hhcGUpLnJldHVybnMoKSxcbiAgfSksXG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7e1xuICogICB0aW1lcjogVGltZXJTZXJ2aWNlLFxuICogICB6b2U6IEVSZWY8Wm9lU2VydmljZT4sXG4gKiB9fSBwb3dlcnNcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0ID0gKGJhZ2dhZ2UsIHBvd2VycykgPT4ge1xuICAvKiBUaGVzZSBhcmUgcHJvZHVjZWQganVzdC1pbi10aW1lIGJlY2F1c2UgQVBJIGdvdmVybmFuY2UgbWFrZXMgcmVtb3RlIGNhbGxzLCB3aGljaCBwcmV2ZW50IHZhdCByZXN0YXJ0LiovXG4gIC8qIFRoZSBvdGhlciB0d28gY291bGQgaGFwcGVuIGR1cmluZyByZXN0YXJ0IGJ1dCB0aGV5J2QgbmVlZCB0byBoYXZlIGEgc2VwYXJhdGUgaG9vaywgc28gZm9yIGNvbnNpc3RlbmN5Ki9cbiAgLyogdGhleSdyZSBhbGwgbGF6eS4qL1xuICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldHVwRmlsdGVyR292ZXJuYW5jZT59ICovXG4gIGxldCBmaWx0ZXJHb3Zlcm5hbmNlO1xuICAvKiogQHR5cGUge1JldHVyblR5cGU8dHlwZW9mIHNldHVwUGFyYW1Hb3Zlcm5hbmNlPn0gKi9cbiAgbGV0IHBhcmFtR292ZXJuYW5jZTtcbiAgLyoqIEB0eXBlIHtFUmV0dXJuPHR5cGVvZiBzZXR1cEFwaUdvdmVybmFuY2U+fSAqL1xuICBsZXQgYXBpR292ZXJuYW5jZTtcblxuICAvKiogQHR5cGUge2FueX0gKi9cbiAgbGV0IHBvc2VyRmFjZXQ7XG5cbiAgY29uc3QgbWFrZUNvbnRyYWN0R292ZXJub3JLaXQgPSBwcmVwYXJlRXhvQ2xhc3NLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICAnQ29udHJhY3RHb3Zlcm5vcktpdCcsXG4gICAgQ29udHJhY3RHb3Zlcm5vcktpdEksXG4gICAgLyoqXG4gKiBAcGFyYW0ge1N0YXJ0ZWRJbnN0YW5jZUtpdDxHb3Zlcm5hYmxlU3RhcnRGbj59IHN0YXJ0ZWRJbnN0YW5jZUtpdFxuICogQHBhcmFtIHtMaW1pdGVkQ0Y8dW5rbm93bj59IGxpbWl0ZWRDcmVhdG9yRmFjZXRcbiAqL1xuICAgIChzdGFydGVkSW5zdGFuY2VLaXQsIGxpbWl0ZWRDcmVhdG9yRmFjZXQpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLnN0YXJ0ZWRJbnN0YW5jZUtpdCxcbiAgICAgICAgbGltaXRlZENyZWF0b3JGYWNldCxcbiAgICAgICAgY3VycmVudEludml0YXRpb246IC8qKiBAdHlwZSB7SW52aXRhdGlvbjx1bmtub3duLCBuZXZlcj4/fSAqLyAobnVsbCksXG4gICAgICB9O1xuICAgIH0sXG4gICAge1xuICAgICAgaGVscGVyOiB7XG4gICAgICAgIC8qKiBAdHlwZSB7KCkgPT4gUHJvbWlzZTxJbnN0YW5jZT59ICovXG4gICAgICAgIGFzeW5jIGdldEVsZWN0b3JhdGVJbnN0YW5jZSgpIHtcbiAgICAgICAgICBjb25zdCB7IHB1YmxpY0ZhY2V0IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IGludml0YXRpb25BbW91bnQgPVxuICAgICAgICAgICAgYXdhaXQgRShwdWJsaWNGYWNldCkuZ2V0SW52aXRhdGlvbkFtb3VudChDT05UUkFDVF9FTEVDVE9SQVRFKTtcbiAgICAgICAgICByZXR1cm4gaW52aXRhdGlvbkFtb3VudC52YWx1ZVswXS5pbnN0YW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIEB0eXBlIHsoKSA9PiBQcm9taXNlPFBvc2VyRmFjZXQ+fSAqL1xuICAgICAgICBhc3luYyBnZXRVcGRhdGVkUG9zZXJGYWNldCgpIHtcbiAgICAgICAgICBjb25zdCB7IGNyZWF0b3JGYWNldCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBjb25zdCBuZXdJbnZpdGF0aW9uID0gYXdhaXQgRShcbiAgICAgICAgICAgIEUoRShjcmVhdG9yRmFjZXQpLmdldFBhcmFtTWdyUmV0cmlldmVyKCkpLmdldCh7XG4gICAgICAgICAgICAgIGtleTogJ2dvdmVybmVkUGFyYW1zJyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICkuZ2V0SW50ZXJuYWxQYXJhbVZhbHVlKENPTlRSQUNUX0VMRUNUT1JBVEUpO1xuXG4gICAgICAgICAgaWYgKG5ld0ludml0YXRpb24gIT09IHRoaXMuc3RhdGUuY3VycmVudEludml0YXRpb24pIHtcbiAgICAgICAgICAgIHBvc2VyRmFjZXQgPSBFKEUocG93ZXJzLnpvZSkub2ZmZXIobmV3SW52aXRhdGlvbikpLmdldE9mZmVyUmVzdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnN0YXRlLmN1cnJlbnRJbnZpdGF0aW9uID0gbmV3SW52aXRhdGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHBvc2VyRmFjZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIGFzeW5jIHByb3ZpZGVBcGlHb3Zlcm5hbmNlKCkge1xuICAgICAgICAgIGNvbnN0IHsgdGltZXIgfSA9IHBvd2VycztcbiAgICAgICAgICBjb25zdCB7IGNyZWF0b3JGYWNldCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBhd2FpdCBudWxsO1xuICAgICAgICAgIGlmICghYXBpR292ZXJuYW5jZSkge1xuICAgICAgICAgICAgdHJhY2UoJ2F3YWl0aW5nIGdvdmVybmVkIEFQSSBkZXBlbmRlbmNpZXMnKTtcbiAgICAgICAgICAgIGNvbnN0IGdvdmVybmVkTmFtZXMgPSBhd2FpdCBFKGNyZWF0b3JGYWNldCkuZ2V0R292ZXJuZWRBcGlOYW1lcygpO1xuICAgICAgICAgICAgdHJhY2UoJ3NldHVwQXBpR292ZXJuYW5jZScpO1xuICAgICAgICAgICAgYXBpR292ZXJuYW5jZSA9IGdvdmVybmVkTmFtZXMubGVuZ3RoXG4gICAgICAgICAgICAgID8gc2V0dXBBcGlHb3Zlcm5hbmNlKFxuICAgICAgICAgICAgICAgICAgKCkgPT4gRShjcmVhdG9yRmFjZXQpLmdldEdvdmVybmVkQXBpcygpLFxuICAgICAgICAgICAgICAgICAgKCkgPT4gRShjcmVhdG9yRmFjZXQpLmdldEdvdmVybmVkQXBpTmFtZXMoKSxcbiAgICAgICAgICAgICAgICAgIHRpbWVyLFxuICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5mYWNldHMuaGVscGVyLmdldFVwZGF0ZWRQb3NlckZhY2V0KCksXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIC8qIGlmIHdlIGFyZW4ndCBnb3Zlcm5pbmcgQVBJcywgdm90ZU9uQXBpSW52b2NhdGlvbiBzaG91bGRuJ3QgYmUgY2FsbGVkKi9cbiAgICAgICAgICAgICAgICAgIHZvdGVPbkFwaUludm9jYXRpb246ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2FwaSBnb3Zlcm5hbmNlIG5vdCBjb25maWd1cmVkJyk7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY3JlYXRlZFF1ZXN0aW9uOiAoKSA9PiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYXBpR292ZXJuYW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJvdmlkZUZpbHRlckdvdmVybmFuY2UoKSB7XG4gICAgICAgICAgaWYgKCFmaWx0ZXJHb3Zlcm5hbmNlKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVyIH0gPSBwb3dlcnM7XG4gICAgICAgICAgICBjb25zdCB7IGNyZWF0b3JGYWNldCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICAgIGZpbHRlckdvdmVybmFuY2UgPSBzZXR1cEZpbHRlckdvdmVybmFuY2UoXG4gICAgICAgICAgICAgIHRpbWVyLFxuICAgICAgICAgICAgICAoKSA9PiB0aGlzLmZhY2V0cy5oZWxwZXIuZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSxcbiAgICAgICAgICAgICAgY3JlYXRvckZhY2V0LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpbHRlckdvdmVybmFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIHByb3ZpZGVQYXJhbUdvdmVybmFuY2UoKSB7XG4gICAgICAgICAgaWYgKCFwYXJhbUdvdmVybmFuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGltZXIgfSA9IHBvd2VycztcbiAgICAgICAgICAgIGNvbnN0IHsgY3JlYXRvckZhY2V0LCBpbnN0YW5jZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICAgIHBhcmFtR292ZXJuYW5jZSA9IHNldHVwUGFyYW1Hb3Zlcm5hbmNlKFxuICAgICAgICAgICAgICAoKSA9PiBFKGNyZWF0b3JGYWNldCkuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHRpbWVyLFxuICAgICAgICAgICAgICAoKSA9PiB0aGlzLmZhY2V0cy5oZWxwZXIuZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYXJhbUdvdmVybmFuY2U7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY3JlYXRvcjoge1xuICAgICAgICAvKipcbiAqIEBwYXJhbSB7SW52aXRhdGlvbn0gcG9zZXJJbnZpdGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuICAgICAgICByZXBsYWNlRWxlY3RvcmF0ZShwb3Nlckludml0YXRpb24pIHtcbiAgICAgICAgICBjb25zdCB7IGNyZWF0b3JGYWNldCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICAvKiogQHR5cGUge1Byb21pc2U8VHlwZWRQYXJhbU1hbmFnZXI8eydFbGVjdG9yYXRlJzogJ2ludml0YXRpb24nfT4+fSAqL1xuXG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICAgICAgICBjb25zdCBwYXJhbU1nciA9IEUoRShjcmVhdG9yRmFjZXQpLmdldFBhcmFtTWdyUmV0cmlldmVyKCkpLmdldCh7XG4gICAgICAgICAgICBrZXk6ICdnb3Zlcm5lZFBhcmFtcycsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvKiBUT0RPIHVzZSB1cGRhdGVFbGVjdG9yYXRlKi9cbiAgICAgICAgICByZXR1cm4gRShwYXJhbU1ncikudXBkYXRlUGFyYW1zKHtcbiAgICAgICAgICAgIEVsZWN0b3JhdGU6IHBvc2VySW52aXRhdGlvbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIEB0eXBlIHtWb3RlT25QYXJhbUNoYW5nZXN9ICovXG4gICAgICAgIHZvdGVPblBhcmFtQ2hhbmdlcyh2b3RlQ291bnRlckluc3RhbGxhdGlvbiwgZGVhZGxpbmUsIHBhcmFtU3BlYykge1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICByZXR1cm4gaGVscGVyXG4gICAgICAgICAgICAucHJvdmlkZVBhcmFtR292ZXJuYW5jZSgpXG4gICAgICAgICAgICAudm90ZU9uUGFyYW1DaGFuZ2VzKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLCBkZWFkbGluZSwgcGFyYW1TcGVjKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIEB0eXBlIHtWb3RlT25BcGlJbnZvY2F0aW9ufSAqL1xuICAgICAgICB2b3RlT25BcGlJbnZvY2F0aW9uKFxuICAgICAgICAgIGFwaU1ldGhvZE5hbWUsXG4gICAgICAgICAgbWV0aG9kQXJncyxcbiAgICAgICAgICB2b3RlQ291bnRlckluc3RhbGxhdGlvbixcbiAgICAgICAgICBkZWFkbGluZSxcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIHJldHVybiBFKGhlbHBlci5wcm92aWRlQXBpR292ZXJuYW5jZSgpKS52b3RlT25BcGlJbnZvY2F0aW9uKFxuICAgICAgICAgICAgYXBpTWV0aG9kTmFtZSxcbiAgICAgICAgICAgIG1ldGhvZEFyZ3MsXG4gICAgICAgICAgICB2b3RlQ291bnRlckluc3RhbGxhdGlvbixcbiAgICAgICAgICAgIGRlYWRsaW5lLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKiBAdHlwZSB7Vm90ZU9uT2ZmZXJGaWx0ZXJ9ICovXG4gICAgICAgIHZvdGVPbk9mZmVyRmlsdGVyKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLCBkZWFkbGluZSwgc3RyaW5ncykge1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICByZXR1cm4gaGVscGVyXG4gICAgICAgICAgICAucHJvdmlkZUZpbHRlckdvdmVybmFuY2UoKVxuICAgICAgICAgICAgLnZvdGVPbkZpbHRlcih2b3RlQ291bnRlckluc3RhbGxhdGlvbiwgZGVhZGxpbmUsIHN0cmluZ3MpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRDcmVhdG9yRmFjZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUubGltaXRlZENyZWF0b3JGYWNldDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0QWRtaW5GYWNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5hZG1pbkZhY2V0O1xuICAgICAgICB9LFxuICAgICAgICBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pbnN0YW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0UHVibGljRmFjZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucHVibGljRmFjZXQ7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcHVibGljOiB7XG4gICAgICAgIGdldEVsZWN0b3JhdGUoKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIHJldHVybiBoZWxwZXIuZ2V0RWxlY3RvcmF0ZUluc3RhbmNlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEdvdmVybmVkQ29udHJhY3QoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuaW5zdGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKiBAcGFyYW0ge0luc3RhbmNlfSBjb3VudGVyICovXG4gICAgICAgIGFzeW5jIHZhbGlkYXRlVm90ZUNvdW50ZXIoY291bnRlcikge1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICBjb25zdCB2YWxpZGF0b3JzID0gW1xuICAgICAgICAgICAgRS5nZXQoaGVscGVyLnByb3ZpZGVBcGlHb3Zlcm5hbmNlKCkpLFxuICAgICAgICAgICAgaGVscGVyLnByb3ZpZGVGaWx0ZXJHb3Zlcm5hbmNlKCksXG4gICAgICAgICAgICBoZWxwZXIucHJvdmlkZVBhcmFtR292ZXJuYW5jZSgpLFxuICAgICAgICAgIF07XG4gICAgICAgICAgY29uc3QgY2hlY2tzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB2YWxpZGF0b3JzLm1hcCh2YWxpZGF0ZSA9PiBFKHZhbGlkYXRlLmNyZWF0ZWRRdWVzdGlvbikoY291bnRlcikpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjaGVja3Muc29tZShCb29sZWFuKSB8fFxuICAgICAgICAgICAgRmFpbGBWb3RlQ291bnRlciB3YXMgbm90IGNyZWF0ZWQgYnkgdGhpcyBjb250cmFjdEdvdmVybm9yYDtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIEBwYXJhbSB7SW5zdGFuY2V9IHJlZ1AgKi9cbiAgICAgICAgdmFsaWRhdGVFbGVjdG9yYXRlKHJlZ1ApIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgcmV0dXJuIEUud2hlbihyZWdQLCBhc3luYyByZWcgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlY3RvcmF0ZUluc3RhbmNlID0gYXdhaXQgaGVscGVyLmdldEVsZWN0b3JhdGVJbnN0YW5jZSgpO1xuICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICByZWcgPT09IGVsZWN0b3JhdGVJbnN0YW5jZSxcbiAgICAgICAgICAgICAgXCJFbGVjdG9yYXRlIGRvZXNuJ3QgbWF0Y2ggbXkgRWxlY3RvcmF0ZVwiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIEBwYXJhbSB7Q2xvc2luZ1J1bGV9IGNsb3NpbmdSdWxlICovXG4gICAgICAgIHZhbGlkYXRlVGltZXIoY2xvc2luZ1J1bGUpIHtcbiAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICBjbG9zaW5nUnVsZS50aW1lciA9PT0gcG93ZXJzLnRpbWVyLFxuICAgICAgICAgICAgJ2Nsb3NpbmcgcnVsZSBtdXN0IHVzZSBteSB0aW1lcicsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICByZXR1cm4gbWFrZUNvbnRyYWN0R292ZXJub3JLaXQ7XG59O1xuXG4vKiogQHR5cGVkZWYge0VSZXR1cm48RVJldHVybjx0eXBlb2YgcHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQ+Pn0gQ29udHJhY3RHb3Zlcm5vcktpdCAqLyRozY9fb25jZS5wcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdChwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdCI6WyJwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADjsdMp4TEAAOExAAAwAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0SGVscGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvdGltZSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIl0sImV4cG9ydHMiOlsiR09WRVJOQU5DRV9TVE9SQUdFX0tFWSIsImhhbmRsZVBhcmFtR292ZXJuYW5jZSIsInB1YmxpY01peGluQVBJIiwidmFsaWRhdGVFbGVjdG9yYXRlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxGYXIsZ2V0TWV0aG9kTmFtZXMsbWFrZVN0b3JlZFB1Ymxpc2hlcktpdCxvYmplY3RNYXAsaWdub3JlQ29udGV4dCxwcmVwYXJlRXhvLE0sQW1vdW50U2hhcGUsQnJhbmRTaGFwZSxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxUaW1lc3RhbXBSZWNvcmRTaGFwZSxFLG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMsR292ZXJub3JGYWNldFNoYXBlLENPTlRSQUNUX0VMRUNUT1JBVEU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChnZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXRcIixbJGjNj19hID0+IChtYWtlU3RvcmVkUHVibGlzaGVyS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiaWdub3JlQ29udGV4dFwiLFskaM2PX2EgPT4gKGlnbm9yZUNvbnRleHQgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG8gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50U2hhcGVcIixbJGjNj19hID0+IChBbW91bnRTaGFwZSA9ICRozY9fYSldXSxbXCJCcmFuZFNoYXBlXCIsWyRozY9fYSA9PiAoQnJhbmRTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSA9ICRozY9fYSldXSxbXCJUaW1lc3RhbXBSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFJlY29yZFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qc1wiLCBbW1wibWFrZVBhcmFtTWFuYWdlckZyb21UZXJtc1wiLFskaM2PX2EgPT4gKG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkdvdmVybm9yRmFjZXRTaGFwZVwiLFskaM2PX2EgPT4gKEdvdmVybm9yRmFjZXRTaGFwZSA9ICRozY9fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzXCIsIFtbXCJDT05UUkFDVF9FTEVDVE9SQVRFXCIsWyRozY9fYSA9PiAoQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtFTWFyc2hhbGxlcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMnO1xuICogQGltcG9ydCB7Q29udHJhY3RNZXRhLCBJbnN0YWxsYXRpb24sIEluc3RhbmNlLCBJbnZpdGF0aW9uLCBaQ0Z9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge1ZvdGVDb3VudGVyQ3JlYXRvckZhY2V0LCBWb3RlQ291bnRlclB1YmxpY0ZhY2V0LCBRdWVzdGlvblNwZWMsIE91dGNvbWVSZWNvcmQsIEFkZFF1ZXN0aW9uLCBBZGRRdWVzdGlvblJldHVybiwgR292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlLCBHb3Zlcm5hbmNlVGVybXMsIEdvdmVybmVkQXBpcywgR292ZXJuZWRDcmVhdG9yRmFjZXQsIEdvdmVybmVkUHVibGljRmFjZXR9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy92YXQtZGF0YSc7XG4gKiBAaW1wb3J0IHtUeXBlZFBhcmFtTWFuYWdlcn0gZnJvbSAnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnO1xuICogQGltcG9ydCB7UGFyYW1UeXBlc01hcH0gZnJvbSAnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnO1xuICogQGltcG9ydCB7RnVuY3Rpb25zUGx1c0NvbnRleHR9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge1N0b3JlZFB1Ymxpc2hlcktpdH0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtTdG9yYWdlTm9kZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyc7XG4gKi9cblxuICAgICAgIGNvbnN0IEdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkgPSAnZ292ZXJuYW5jZSc7JGjNj19vbmNlLkdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkoR09WRVJOQU5DRV9TVE9SQUdFX0tFWSk7XG5cbmNvbnN0IHB1YmxpY01peGluQVBJID0gaGFyZGVuKHtcbiAgZ2V0U3Vic2NyaXB0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdTdG9yZWRTdWJzY3JpcHRpb24nKSksXG4gIGdldEdvdmVybmVkUGFyYW1zOiBNLmNhbGwoKS5yZXR1cm5zKE0ub3IoTS5yZWNvcmQoKSwgTS5wcm9taXNlKCkpKSxcbiAgZ2V0QW1vdW50OiBNLmNhbGwoKS5yZXR1cm5zKEFtb3VudFNoYXBlKSxcbiAgZ2V0QnJhbmQ6IE0uY2FsbCgpLnJldHVybnMoQnJhbmRTaGFwZSksXG4gIGdldEluc3RhbmNlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdJbnN0YW5jZScpKSxcbiAgZ2V0SW5zdGFsbGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSksXG4gIGdldEludml0YXRpb25BbW91bnQ6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXROYXQ6IE0uY2FsbCgpLnJldHVybnMoTS5iaWdpbnQoKSksXG4gIGdldFJhdGlvOiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVjb3JkKCkpLFxuICBnZXRTdHJpbmc6IE0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG4gIGdldFRpbWVzdGFtcDogTS5jYWxsKCkucmV0dXJucyhUaW1lc3RhbXBSZWNvcmRTaGFwZSksXG4gIGdldFJlbGF0aXZlVGltZTogTS5jYWxsKCkucmV0dXJucyhSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSksXG4gIGdldFVua25vd246IE0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG59KTtcblxuLyoqXG4gKiBWZXJpZnkgdGhhdCB0aGUgZWxlY3RvcmF0ZSBpcyByZXByZXNlbnRlZCBieSBhIGxpdmUgaW52aXRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1pDRjxHb3Zlcm5hbmNlVGVybXM8e30+ICYge30+fSB6Y2ZcbiAqIEBwYXJhbSB7VHlwZWRQYXJhbU1hbmFnZXI8YW55Pn0gcGFyYW1NYW5hZ2VyXG4gKi8kaM2PX29uY2UucHVibGljTWl4aW5BUEkocHVibGljTWl4aW5BUEkpO1xuICAgICAgIGNvbnN0IHZhbGlkYXRlRWxlY3RvcmF0ZSA9ICh6Y2YsIHBhcmFtTWFuYWdlcikgPT4ge1xuICBjb25zdCBpbnZpdGF0aW9uID0gcGFyYW1NYW5hZ2VyLmdldEludGVybmFsUGFyYW1WYWx1ZShDT05UUkFDVF9FTEVDVE9SQVRFKTtcbiAgcmV0dXJuIEUud2hlbihcbiAgICBFKHpjZi5nZXRJbnZpdGF0aW9uSXNzdWVyKCkpLmlzTGl2ZShpbnZpdGF0aW9uKSxcbiAgICBpc0xpdmUgPT4gaXNMaXZlIHx8IEZhaWxgRWxlY3RvcmF0ZSBpbnZpdGF0aW9uIGlzIG5vdCBsaXZlLmAsXG4gICk7XG59OyRozY9fb25jZS52YWxpZGF0ZUVsZWN0b3JhdGUodmFsaWRhdGVFbGVjdG9yYXRlKTtcbmhhcmRlbih2YWxpZGF0ZUVsZWN0b3JhdGUpO1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGBtYWtlUGFyYW1Hb3Zlcm5hbmNlYC5cbiAqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZXNNYXB9IFRcbiAqIEBwYXJhbSB7WkNGPEdvdmVybmFuY2VUZXJtczx7fT4gJiB7fT59IHpjZlxuICogQHBhcmFtIHtUeXBlZFBhcmFtTWFuYWdlcjxUPn0gcGFyYW1NYW5hZ2VyXG4gKi9cbmNvbnN0IGZhY2V0SGVscGVycyA9ICh6Y2YsIHBhcmFtTWFuYWdlcikgPT4ge1xuICAvKiB2YWxpZGF0ZSBhc3luYyB0byB3YWl0IGZvciBwYXJhbXMgdG8gYmUgZmluaXNoZWQqL1xuICAvKiBVTlRJTCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzNDMqL1xuICB2b2lkIHZhbGlkYXRlRWxlY3RvcmF0ZSh6Y2YsIHBhcmFtTWFuYWdlcik7XG5cbiAgY29uc3QgdHlwZWRBY2Nlc3NvcnMgPSB7XG4gICAgZ2V0QW1vdW50OiBwYXJhbU1hbmFnZXIuZ2V0QW1vdW50LFxuICAgIGdldEJyYW5kOiBwYXJhbU1hbmFnZXIuZ2V0QnJhbmQsXG4gICAgZ2V0SW5zdGFuY2U6IHBhcmFtTWFuYWdlci5nZXRJbnN0YW5jZSxcbiAgICBnZXRJbnN0YWxsYXRpb246IHBhcmFtTWFuYWdlci5nZXRJbnN0YWxsYXRpb24sXG4gICAgZ2V0SW52aXRhdGlvbkFtb3VudDogcGFyYW1NYW5hZ2VyLmdldEludml0YXRpb25BbW91bnQsXG4gICAgZ2V0TmF0OiBwYXJhbU1hbmFnZXIuZ2V0TmF0LFxuICAgIGdldFJhdGlvOiBwYXJhbU1hbmFnZXIuZ2V0UmF0aW8sXG4gICAgZ2V0U3RyaW5nOiBwYXJhbU1hbmFnZXIuZ2V0U3RyaW5nLFxuICAgIGdldFRpbWVzdGFtcDogcGFyYW1NYW5hZ2VyLmdldFRpbWVzdGFtcCxcbiAgICBnZXRSZWxhdGl2ZVRpbWU6IHBhcmFtTWFuYWdlci5nZXRSZWxhdGl2ZVRpbWUsXG4gICAgZ2V0VW5rbm93bjogcGFyYW1NYW5hZ2VyLmdldFVua25vd24sXG4gIH07XG5cbiAgY29uc3QgY29tbW9uUHVibGljTWV0aG9kcyA9IHtcbiAgICBnZXRTdWJzY3JpcHRpb246ICgpID0+IHBhcmFtTWFuYWdlci5nZXRTdWJzY3JpcHRpb24oKSxcbiAgICBnZXRHb3Zlcm5lZFBhcmFtczogKCkgPT4gcGFyYW1NYW5hZ2VyLmdldFBhcmFtcygpLFxuICB9O1xuXG4gIC8qKlxuICogQWRkIHJlcXVpcmVkIG1ldGhvZHMgdG8gcHVibGljRmFjZXRcbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBQRiBwdWJsaWMgZmFjZXRcbiAqIEBwYXJhbSB7UEZ9IG9yaWdpbmFsUHVibGljRmFjZXRcbiAqIEByZXR1cm5zIHtHb3Zlcm5lZFB1YmxpY0ZhY2V0PFBGPn1cbiAqL1xuICBjb25zdCBhdWdtZW50UHVibGljRmFjZXQgPSBvcmlnaW5hbFB1YmxpY0ZhY2V0ID0+IHtcbiAgICByZXR1cm4gRmFyKCdwdWJsaWNGYWNldCcsIHtcbiAgICAgIC4uLm9yaWdpbmFsUHVibGljRmFjZXQsXG4gICAgICAuLi5jb21tb25QdWJsaWNNZXRob2RzLFxuICAgICAgLi4udHlwZWRBY2Nlc3NvcnMsXG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBBZGQgcmVxdWlyZWQgbWV0aG9kcyB0byBwdWJsaWNGYWNldCwgZm9yIGEgdmlydHVhbC9kdXJhYmxlIGNvbnRyYWN0XG4gKlxuICogQHBhcmFtIHtPUEZ9IG9yaWdpbmFsUHVibGljRmFjZXRcbiAqIEB0ZW1wbGF0ZSB7e319IE9QRlxuICovXG4gIGNvbnN0IGF1Z21lbnRWaXJ0dWFsUHVibGljRmFjZXQgPSBvcmlnaW5hbFB1YmxpY0ZhY2V0ID0+IHtcbiAgICByZXR1cm4gRmFyKCdwdWJsaWNGYWNldCcsIHtcbiAgICAgIC4uLm9yaWdpbmFsUHVibGljRmFjZXQsXG4gICAgICAuLi5jb21tb25QdWJsaWNNZXRob2RzLFxuICAgICAgLi4ub2JqZWN0TWFwKHR5cGVkQWNjZXNzb3JzLCBpZ25vcmVDb250ZXh0KSxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGXG4gKiBAcGFyYW0ge0NGfSBsaW1pdGVkQ3JlYXRvckZhY2V0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsICguLi5hbnkpID0+IHVua25vd24+fSBbZ292ZXJuZWRBcGlzXVxuICogQHJldHVybnMge0dvdmVybmVkQ3JlYXRvckZhY2V0PENGPn1cbiAqL1xuICBjb25zdCBtYWtlRmFyR292ZXJub3JGYWNldCA9IChsaW1pdGVkQ3JlYXRvckZhY2V0LCBnb3Zlcm5lZEFwaXMgPSB7fSkgPT4ge1xuICAgIGNvbnN0IGdvdmVybm9yRmFjZXQgPSBGYXIoJ2dvdmVybm9yRmFjZXQnLCB7XG4gICAgICBnZXRQYXJhbU1nclJldHJpZXZlcjogKCkgPT5cbiAgICAgICAgRmFyKCdwYXJhbVJldHJpZXZlcicsIHsgZ2V0OiAoKSA9PiBwYXJhbU1hbmFnZXIgfSksXG4gICAgICBnZXRJbnZpdGF0aW9uOiBuYW1lID0+IHBhcmFtTWFuYWdlci5nZXRJbnRlcm5hbFBhcmFtVmFsdWUobmFtZSksXG4gICAgICBnZXRMaW1pdGVkQ3JlYXRvckZhY2V0OiAoKSA9PiBsaW1pdGVkQ3JlYXRvckZhY2V0LFxuICAgICAgLyogVGhlIGNvbnRyYWN0IHByb3ZpZGVzIGEgZmFjZXQgd2l0aCB0aGUgQVBJcyB0aGF0IGNhbiBiZSBpbnZva2VkIGJ5Ki9cbiAgICAgIC8qIGdvdmVybmFuY2UqL1xuICAgICAgLyoqIEB0eXBlIHsoKSA9PiBHb3Zlcm5lZEFwaXN9ICovXG4gICAgICBnZXRHb3Zlcm5lZEFwaXM6ICgpID0+IEZhcignZ292ZXJuZWRBUElzJywgZ292ZXJuZWRBcGlzKSxcbiAgICAgIC8qIFRoZSBmYWNldCByZXR1cm5lZCBieSBnZXRHb3Zlcm5lZEFwaXMgaXMgRmFyLCBzbyB3ZSBjYW4ndCBzZWUgd2hhdCovXG4gICAgICAvKiBtZXRob2RzIGl0IGhhcy4gVGhlcmUncyBubyBjbGVhbiB3YXkgdG8gaGF2ZSBjb250cmFjdHMgc3BlY2lmeSB0aGUgQVBJcyovXG4gICAgICAvKiB3aXRob3V0IGFsc28gc2VwYXJhdGVseSBwcm92aWRpbmcgdGhlaXIgbmFtZXMuKi9cbiAgICAgIGdldEdvdmVybmVkQXBpTmFtZXM6ICgpID0+IE9iamVjdC5rZXlzKGdvdmVybmVkQXBpcyksXG4gICAgICBzZXRPZmZlckZpbHRlcjogc3RyaW5ncyA9PiB6Y2Yuc2V0T2ZmZXJGaWx0ZXIoc3RyaW5ncyksXG4gICAgfSk7XG5cbiAgICAvKiBleGNsdXNpdmVseSBmb3IgY29udHJhY3RHb3Zlcm5vciwgd2hpY2ggb25seSByZXZlYWxzIGxpbWl0ZWRDcmVhdG9yRmFjZXQqL1xuICAgIHJldHVybiBnb3Zlcm5vckZhY2V0O1xuICB9O1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0ZcbiAqIEBwYXJhbSB7Q0Z9IG9yaWdpbmFsQ3JlYXRvckZhY2V0XG4gKiBAcGFyYW0ge3t9fSBbZ292ZXJuZWRBcGlzXVxuICogQHJldHVybnMge0dvdmVybmVkQ3JlYXRvckZhY2V0PENGPn1cbiAqL1xuICBjb25zdCBtYWtlR292ZXJub3JGYWNldCA9IChvcmlnaW5hbENyZWF0b3JGYWNldCwgZ292ZXJuZWRBcGlzID0ge30pID0+IHtcbiAgICByZXR1cm4gbWFrZUZhckdvdmVybm9yRmFjZXQob3JpZ2luYWxDcmVhdG9yRmFjZXQsIGdvdmVybmVkQXBpcyk7XG4gIH07XG5cbiAgLyoqXG4gKiBBZGQgcmVxdWlyZWQgbWV0aG9kcyB0byBhIGNyZWF0b3JGYWNldCBmb3IgYSBkdXJhYmxlIGNvbnRyYWN0LlxuICpcbiAqIEBzZWUge21ha2VEdXJhYmxlR292ZXJub3JGYWNldH1cbiAqXG4gKiBAdGVtcGxhdGUge3sgW21ldGhvZE5hbWU6IHN0cmluZ106IChjb250ZXh0PzogdW5rbm93biwgLi4ucmVzdDogdW5rbm93bltdKSA9PiB1bmtub3dufX0gTENGXG4gKiBAcGFyYW0ge0xDRn0gbGltaXRlZENyZWF0b3JGYWNldFxuICovXG4gIGNvbnN0IG1ha2VWaXJ0dWFsR292ZXJub3JGYWNldCA9IGxpbWl0ZWRDcmVhdG9yRmFjZXQgPT4ge1xuICAgIC8qKiBAdHlwZSB7RnVuY3Rpb25zUGx1c0NvbnRleHQ8dW5rbm93biwgR292ZXJuZWRDcmVhdG9yRmFjZXQ8dHlwZW9mIGxpbWl0ZWRDcmVhdG9yRmFjZXQ+Pn0gKi9cbiAgICBjb25zdCBnb3Zlcm5vckZhY2V0ID0gaGFyZGVuKHtcbiAgICAgIGdldFBhcmFtTWdyUmV0cmlldmVyOiAoKSA9PlxuICAgICAgICBGYXIoJ3BhcmFtUmV0cmlldmVyJywgeyBnZXQ6ICgpID0+IHBhcmFtTWFuYWdlciB9KSxcbiAgICAgIGdldEludml0YXRpb246IChfY29udGV4dCwgLyoqIEB0eXBlIHtzdHJpbmd9ICovIG5hbWUpID0+XG4gICAgICAgIHBhcmFtTWFuYWdlci5nZXRJbnRlcm5hbFBhcmFtVmFsdWUobmFtZSksXG4gICAgICBnZXRMaW1pdGVkQ3JlYXRvckZhY2V0OiAoeyBmYWNldHMgfSkgPT4gZmFjZXRzLmxpbWl0ZWRDcmVhdG9yRmFjZXQsXG4gICAgICAvKiBUaGUgY29udHJhY3QgcHJvdmlkZXMgYSBmYWNldCB3aXRoIHRoZSBBUElzIHRoYXQgY2FuIGJlIGludm9rZWQgYnkqL1xuICAgICAgLyogZ292ZXJuYW5jZSovXG4gICAgICBnZXRHb3Zlcm5lZEFwaXM6ICh7IGZhY2V0cyB9KSA9PiBmYWNldHMuZ292ZXJuZWRBcGlzLFxuICAgICAgLyogVGhlIGZhY2V0IHJldHVybmVkIGJ5IGdldEdvdmVybmVkQXBpcyBpcyBGYXIsIHNvIHdlIGNhbid0IHNlZSB3aGF0Ki9cbiAgICAgIC8qIG1ldGhvZHMgaXQgaGFzLiBUaGVyZSdzIG5vIGNsZWFuIHdheSB0byBoYXZlIGNvbnRyYWN0cyBzcGVjaWZ5IHRoZSBBUElzKi9cbiAgICAgIC8qIHdpdGhvdXQgYWxzbyBzZXBhcmF0ZWx5IHByb3ZpZGluZyB0aGVpciBuYW1lcy4qL1xuICAgICAgZ2V0R292ZXJuZWRBcGlOYW1lczogKHsgZmFjZXRzIH0pID0+XG4gICAgICAgIGdldE1ldGhvZE5hbWVzKGZhY2V0cy5nb3Zlcm5lZEFwaXMgfHwge30pLFxuICAgICAgc2V0T2ZmZXJGaWx0ZXI6IChfY29udGV4dCwgc3RyaW5ncykgPT4gemNmLnNldE9mZmVyRmlsdGVyKHN0cmluZ3MpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgZ292ZXJub3JGYWNldCwgbGltaXRlZENyZWF0b3JGYWNldCB9O1xuICB9O1xuXG4gIC8qKlxuICogQWRkIHJlcXVpcmVkIG1ldGhvZHMgdG8gYSBjcmVhdG9yRmFjZXQgZm9yIGEgZHVyYWJsZSBjb250cmFjdC5cbiAqXG4gKiBAc2VlIHttYWtlVmlydHVhbEdvdmVybm9yRmFjZXR9XG4gKlxuICogQHRlbXBsYXRlIENGXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7Q0Z9IGxpbWl0ZWRDcmVhdG9yRmFjZXRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgKC4uLmFueSkgPT4gdW5rbm93bj59IFtnb3Zlcm5lZEFwaXNdXG4gKi9cbiAgY29uc3QgbWFrZUR1cmFibGVHb3Zlcm5vckZhY2V0ID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAgbGltaXRlZENyZWF0b3JGYWNldCxcbiAgICBnb3Zlcm5lZEFwaXMgPSB7fSxcbiAgKSA9PiB7XG4gICAgY29uc3QgZmFyR292ZXJuZWRBcGlzID0gRmFyKCdnb3Zlcm5lZEFQSXMnLCB7IC4uLmdvdmVybmVkQXBpcyB9KTtcbiAgICBjb25zdCBnb3Zlcm5vckZhY2V0ID0gcHJlcGFyZUV4byhcbiAgICAgIGJhZ2dhZ2UsXG4gICAgICAnZ292ZXJub3JGYWNldCcsXG4gICAgICBNLmludGVyZmFjZSgnZ292ZXJub3JGYWNldCcsIEdvdmVybm9yRmFjZXRTaGFwZSksXG4gICAgICB7XG4gICAgICAgIGdldFBhcmFtTWdyUmV0cmlldmVyOiAoKSA9PlxuICAgICAgICAgIEZhcigncGFyYW1SZXRyaWV2ZXInLCB7IGdldDogKCkgPT4gcGFyYW1NYW5hZ2VyIH0pLFxuICAgICAgICBnZXRJbnZpdGF0aW9uOiBuYW1lID0+IHBhcmFtTWFuYWdlci5nZXRJbnRlcm5hbFBhcmFtVmFsdWUobmFtZSksXG4gICAgICAgIGdldExpbWl0ZWRDcmVhdG9yRmFjZXQ6ICgpID0+IGxpbWl0ZWRDcmVhdG9yRmFjZXQsXG4gICAgICAgIC8qIFRoZSBjb250cmFjdCBwcm92aWRlcyBhIGZhY2V0IHdpdGggdGhlIEFQSXMgdGhhdCBjYW4gYmUgaW52b2tlZCBieSovXG4gICAgICAgIC8qIGdvdmVybmFuY2UqL1xuICAgICAgICAvKiogQHR5cGUgeygpID0+IEdvdmVybmVkQXBpc30gKi9cbiAgICAgICAgZ2V0R292ZXJuZWRBcGlzOiAoKSA9PiBmYXJHb3Zlcm5lZEFwaXMsXG4gICAgICAgIC8qIFRoZSBmYWNldCByZXR1cm5lZCBieSBnZXRHb3Zlcm5lZEFwaXMgaXMgRmFyLCBzbyB3ZSBjYW4ndCBzZWUgd2hhdCovXG4gICAgICAgIC8qIG1ldGhvZHMgaXQgaGFzLiBUaGVyZSdzIG5vIGNsZWFuIHdheSB0byBoYXZlIGNvbnRyYWN0cyBzcGVjaWZ5IHRoZSBBUElzKi9cbiAgICAgICAgLyogd2l0aG91dCBhbHNvIHNlcGFyYXRlbHkgcHJvdmlkaW5nIHRoZWlyIG5hbWVzLiovXG4gICAgICAgIGdldEdvdmVybmVkQXBpTmFtZXM6ICgpID0+IE9iamVjdC5rZXlzKGdvdmVybmVkQXBpcyB8fCB7fSksXG4gICAgICAgIHNldE9mZmVyRmlsdGVyOiBzdHJpbmdzID0+IHpjZi5zZXRPZmZlckZpbHRlcihzdHJpbmdzKSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiB7IGdvdmVybm9yRmFjZXQsIGxpbWl0ZWRDcmVhdG9yRmFjZXQgfTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBwdWJsaWNNaXhpbjoge1xuICAgICAgLi4uY29tbW9uUHVibGljTWV0aG9kcyxcbiAgICAgIC4uLnR5cGVkQWNjZXNzb3JzLFxuICAgIH0sXG4gICAgYXVnbWVudFB1YmxpY0ZhY2V0LFxuICAgIGF1Z21lbnRWaXJ0dWFsUHVibGljRmFjZXQsXG4gICAgbWFrZUdvdmVybm9yRmFjZXQsXG5cbiAgICBtYWtlRmFyR292ZXJub3JGYWNldCxcbiAgICBtYWtlVmlydHVhbEdvdmVybm9yRmFjZXQsXG4gICAgbWFrZUR1cmFibGVHb3Zlcm5vckZhY2V0LFxuXG4gICAgcGFyYW1zOiBwYXJhbU1hbmFnZXIucmVhZG9ubHkoKSxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEhlbHBlciBmb3IgdGhlIDkwJSBvZiBjb250cmFjdHMgdGhhdCB3aWxsIGhhdmUgb25seSBhIHNpbmdsZSBzZXQgb2ZcbiAqIHBhcmFtZXRlcnMuIFVzaW5nIHRoaXMgZm9yIG1hbmFnZWQgcGFyYW1ldGVycywgYSBjb250cmFjdCBvbmx5IGhhcyB0b1xuICpcbiAqIC0gRGVmaW5lIHRoZSBwYXJhbWV0ZXIgdGVtcGxhdGUsIHdoaWNoIGluY2x1ZGVzIG5hbWUsIHR5cGUgYW5kIHZhbHVlXG4gKiAtIEFkZCBhbnkgbWV0aG9kcyBuZWVkZWQgaW4gdGhlIHB1YmxpYyBhbmQgY3JlYXRvciBmYWNldHMuXG4gKlxuICogSXQncyBhbHNvIGNydWNpYWwgdGhhdCB0aGUgZ292ZXJuZWQgY29udHJhY3Qgbm90IGludGVyYWN0IHdpdGggdGhlIHByb2R1Y3Qgb2ZcbiAqIG1ha2VHb3Zlcm5vckZhY2V0KCkuIFRoZSB3cmFwcGVkIGNyZWF0b3JGYWNldCBoYXMgdGhlIHBvd2VyIHRvIGNoYW5nZVxuICogcGFyYW1ldGVyIHZhbHVlcywgYW5kIHRoZSBnb3Zlcm5hbmNlIGd1YXJhbnRlZXMgb25seSBob2xkIGlmIHRoZXkncmUgbm90IHVzZWRcbiAqIGRpcmVjdGx5IGJ5IHRoZSBnb3Zlcm5lZCBjb250cmFjdC5cbiAqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZXNNYXB9IE1cbiAqICAgTWFwIG9mIHR5cGVzIG9mIGN1c3RvbSBnb3Zlcm5lZCB0ZXJtc1xuICogQHBhcmFtIHtaQ0Y8R292ZXJuYW5jZVRlcm1zPE0+Pn0gemNmXG4gKiBAcGFyYW0ge0ludml0YXRpb259IGluaXRpYWxQb3Nlckludml0YXRpb25cbiAqIEBwYXJhbSB7TX0gcGFyYW1UeXBlc01hcFxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gW21hcnNoYWxsZXJdXG4gKiBAcGFyYW0ge29iamVjdH0gW292ZXJyaWRlc11cbiAqL1xuY29uc3QgaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlID0gKFxuICB6Y2YsXG4gIGluaXRpYWxQb3Nlckludml0YXRpb24sXG4gIHBhcmFtVHlwZXNNYXAsXG4gIHN0b3JhZ2VOb2RlLFxuICBtYXJzaGFsbGVyLFxuICBvdmVycmlkZXMsXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtTdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gKi9cbiAgY29uc3QgcHVibGlzaGVyS2l0ID0gbWFrZVN0b3JlZFB1Ymxpc2hlcktpdChcbiAgICBzdG9yYWdlTm9kZSxcbiAgICBtYXJzaGFsbGVyLFxuICAgIEdPVkVSTkFOQ0VfU1RPUkFHRV9LRVksXG4gICk7XG4gIGNvbnN0IHBhcmFtTWFuYWdlciA9IG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMoXG4gICAgcHVibGlzaGVyS2l0LFxuICAgIHpjZixcbiAgICB7IEVsZWN0b3JhdGU6IGluaXRpYWxQb3Nlckludml0YXRpb24gfSxcbiAgICBwYXJhbVR5cGVzTWFwLFxuICAgIG92ZXJyaWRlcyxcbiAgKTtcblxuICByZXR1cm4gZmFjZXRIZWxwZXJzKHpjZiwgcGFyYW1NYW5hZ2VyKTtcbn07JGjNj19vbmNlLmhhbmRsZVBhcmFtR292ZXJuYW5jZShoYW5kbGVQYXJhbUdvdmVybmFuY2UpO1xuXG5oYXJkZW4oaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InB1YmxpY01peGluQVBJIjpbInB1YmxpY01peGluQVBJIl0sImhhbmRsZVBhcmFtR292ZXJuYW5jZSI6WyJoYW5kbGVQYXJhbUdvdmVybmFuY2UiXSwiR09WRVJOQU5DRV9TVE9SQUdFX0tFWSI6WyJHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZIl0sInZhbGlkYXRlRWxlY3RvcmF0ZSI6WyJ2YWxpZGF0ZUVsZWN0b3JhdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuWR9amsJAABrCQAAJwAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3F1ZXN0aW9uLmpzIiwiLi9jb250cmFjdEdvdmVybm9yLmpzIiwiLi9jb250cmFjdEhlbHBlci5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMiLCIuL3ZhbGlkYXRvcnMuanMiLCIuL2NvbnN0YW50cy5qcyIsIi4vdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJFbGVjdGlvblR5cGUiLCJFbGVjdGlvblR5cGUiLCJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiLCJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiLCJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiLCJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciIsIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyIiwibWFrZVBhcmFtTWFuYWdlclN5bmMiLCJtYWtlUGFyYW1NYW5hZ2VyU3luYyIsInB1YmxpY01peGluQVBJIiwicHVibGljTWl4aW5BUEkiLCJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiLCJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3F1ZXN0aW9uLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0R292ZXJub3IuanNcIiwgW11dLFtcIi4vY29udHJhY3RIZWxwZXIuanNcIiwgW11dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanNcIiwgW11dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzXCIsIFtdXSxbXCIuL3ZhbGlkYXRvcnMuanNcIiwgW11dLFtcIi4vY29uc3RhbnRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9xdWVzdGlvbi5qcyI6W1siQ2hvaWNlTWV0aG9kIiwiQ2hvaWNlTWV0aG9kIl0sWyJFbGVjdGlvblR5cGUiLCJFbGVjdGlvblR5cGUiXSxbIlF1b3J1bVJ1bGUiLCJRdW9ydW1SdWxlIl0sWyJjb2VyY2VRdWVzdGlvblNwZWMiLCJjb2VyY2VRdWVzdGlvblNwZWMiXSxbInBvc2l0aW9uSW5jbHVkZWQiLCJwb3NpdGlvbkluY2x1ZGVkIl0sWyJidWlsZFF1ZXN0aW9uIiwiYnVpbGRRdWVzdGlvbiJdXSwiLi9jb250cmFjdEdvdmVybm9yLmpzIjpbWyJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyIsInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIl0sWyJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiLCJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiXV0sIi4vY29udHJhY3RIZWxwZXIuanMiOltbImhhbmRsZVBhcmFtR292ZXJuYW5jZSIsImhhbmRsZVBhcmFtR292ZXJuYW5jZSJdLFsicHVibGljTWl4aW5BUEkiLCJwdWJsaWNNaXhpbkFQSSJdXSwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiOltbImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0iLCJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIl0sWyJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiLCJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiXSxbInNldHVwUGFyYW1Hb3Zlcm5hbmNlIiwic2V0dXBQYXJhbUdvdmVybmFuY2UiXSxbIkNPTlRSQUNUX0VMRUNUT1JBVEUiLCJDT05UUkFDVF9FTEVDVE9SQVRFIl1dLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanMiOltbImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzIiwiYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiXSxbIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyIiwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiXV0sIi4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzIjpbWyJtYWtlUGFyYW1NYW5hZ2VyIiwibWFrZVBhcmFtTWFuYWdlciJdLFsibWFrZVBhcmFtTWFuYWdlclN5bmMiLCJtYWtlUGFyYW1NYW5hZ2VyU3luYyJdXSwiLi92YWxpZGF0b3JzLmpzIjpbWyJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiLCJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiXSxbImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSIsImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSJdXSwiLi9jb25zdGFudHMuanMiOltbIlBhcmFtVHlwZXMiLCJQYXJhbVR5cGVzIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC3mGJdAxEAAAMRAAAqAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3F1ZXN0aW9uLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIkNob2ljZU1ldGhvZCIsIkVsZWN0aW9uVHlwZSIsIlF1b3J1bVJ1bGUiLCJidWlsZFF1ZXN0aW9uIiwiY29lcmNlUXVlc3Rpb25TcGVjIiwicG9zaXRpb25JbmNsdWRlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VFeG8sbXVzdE1hdGNoLGtleUVRLE0sbWFrZUhhbmRsZSxRdWVzdGlvbkksUXVlc3Rpb25TcGVjU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlRXhvXCIsWyRozY9fYSA9PiAobWFrZUV4byA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9tYWtlSGFuZGxlLmpzXCIsIFtbXCJtYWtlSGFuZGxlXCIsWyRozY9fYSA9PiAobWFrZUhhbmRsZSA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiUXVlc3Rpb25JXCIsWyRozY9fYSA9PiAoUXVlc3Rpb25JID0gJGjNj19hKV1dLFtcIlF1ZXN0aW9uU3BlY1NoYXBlXCIsWyRozY9fYSA9PiAoUXVlc3Rpb25TcGVjU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0J1aWxkUXVlc3Rpb24sIFBvc2l0aW9uSW5jbHVkZWQsIFF1ZXN0aW9uLCBRdWVzdGlvblNwZWN9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qIFRvcGljcyBiZWluZyB2b3RlZCBvbiBhcmUgJ1F1ZXN0aW9ucycuIEJlZm9yZSBhIFF1ZXN0aW9uIGlzIGtub3duIHRvIGEqL1xuLyogZWxlY3RvcmF0ZSwgdGhlIHBhcmFtZXRlcnMgY2FuIGJlIGRlc2NyaWJlZCB3aXRoIGEgUXVlc3Rpb25TcGVjLiBPbmNlIHRoZSovXG4vKiBxdWVzdGlvbiBoYXMgYmVlbiBwcmVzZW50ZWQgdG8gYW4gRWxlY3RvcmF0ZSwgdGhlcmUgaXMgYSBRdWVzdGlvbkRldGFpbHMqL1xuLyogcmVjb3JkIHRoYXQgYWxzbyBpbmNsdWRlcyB0aGUgVm90ZUNvdW50ZXIgd2hpY2ggd2lsbCBkZXRlcm1pbmUgdGhlIG91dGNvbWUqL1xuLyogYW5kIHRoZSBxdWVzdGlvbkhhbmRsZSB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgaXQuKi9cblxuLyoqXG4gKiBcInVucmFua2VkXCIgaXMgbW9yZSBmb3JtYWxseSBrbm93biBhcyBcImFwcHJvdmFsXCIgdm90aW5nLCBidXQgdGhpcyBpcyBoYXJkIGZvclxuICogcGVvcGxlIHRvIGludHVpdCB3aGVuIHRoZXJlIGFyZSBvbmx5IHR3byBhbHRlcm5hdGl2ZXMuXG4gKi9cbmNvbnN0IENob2ljZU1ldGhvZCA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIFVOUkFOS0VEOiAndW5yYW5rZWQnLFxuICBPUkRFUjogJ29yZGVyJyxcbiAgUExVUkFMSVRZOiAncGx1cmFsaXR5Jyxcbn0pOyRozY9fb25jZS5DaG9pY2VNZXRob2QoQ2hvaWNlTWV0aG9kKTtcblxuY29uc3QgRWxlY3Rpb25UeXBlID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgLyogQSBwYXJhbWV0ZXIgaXMgbmFtZWQsIGFuZCBhIG5ldyB2YWx1ZSBwcm9wb3NlZCovXG4gIFBBUkFNX0NIQU5HRTogJ3BhcmFtX2NoYW5nZScsXG4gIC8qIGNob29zZSBvbmUgb3IgbXVsdGlwbGUgd2lubmVycywgZGVwZW5kaW5nIG9uIENob2ljZU1ldGhvZCovXG4gIEVMRUNUSU9OOiAnZWxlY3Rpb24nLFxuICBTVVJWRVk6ICdzdXJ2ZXknLFxuICAvKiB3aGV0aGVyIG9yIG5vdCB0byBpbnZva2UgYW4gQVBJIG1ldGhvZCovXG4gIEFQSV9JTlZPQ0FUSU9OOiAnYXBpX2ludm9jYXRpb24nLFxuICBPRkZFUl9GSUxURVI6ICdvZmZlcl9maWx0ZXInLFxufSk7JGjNj19vbmNlLkVsZWN0aW9uVHlwZShFbGVjdGlvblR5cGUpO1xuXG5jb25zdCBRdW9ydW1SdWxlID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgTUFKT1JJVFk6ICdtYWpvcml0eScsXG4gIE5PX1FVT1JVTTogJ25vX3F1b3J1bScsXG4gIC8qIFRoZSBlbGVjdGlvbiBpc24ndCB2YWxpZCB1bmxlc3MgYWxsIHZvdGVycyB2b3RlKi9cbiAgQUxMOiAnYWxsJyxcbn0pO1xuXG4vKiogQHR5cGUge1Bvc2l0aW9uSW5jbHVkZWR9ICovJGjNj19vbmNlLlF1b3J1bVJ1bGUoUXVvcnVtUnVsZSk7XG5jb25zdCBwb3NpdGlvbkluY2x1ZGVkID0gKHBvc2l0aW9ucywgcCkgPT4gcG9zaXRpb25zLnNvbWUoZSA9PiBrZXlFUShlLCBwKSk7XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlY30gYWxsZWdlZFF1ZXN0aW9uU3BlY1xuICogQHJldHVybnMge1F1ZXN0aW9uU3BlY31cbiAqLyRozY9fb25jZS5wb3NpdGlvbkluY2x1ZGVkKHBvc2l0aW9uSW5jbHVkZWQpO1xuY29uc3QgY29lcmNlUXVlc3Rpb25TcGVjID0gKHtcbiAgbWV0aG9kLFxuICBpc3N1ZSxcbiAgcG9zaXRpb25zLFxuICBlbGVjdGlvblR5cGUsXG4gIG1heENob2ljZXMsXG4gIG1heFdpbm5lcnMsXG4gIGNsb3NpbmdSdWxlLFxuICBxdW9ydW1SdWxlLFxuICB0aWVPdXRjb21lLFxufSkgPT4ge1xuICBjb25zdCBxdWVzdGlvbiA9IGhhcmRlbih7XG4gICAgbWV0aG9kLFxuICAgIGlzc3VlLFxuICAgIHBvc2l0aW9ucyxcbiAgICBtYXhDaG9pY2VzOiBOdW1iZXIobWF4Q2hvaWNlcyksXG4gICAgbWF4V2lubmVyczogTnVtYmVyKG1heFdpbm5lcnMpLFxuICAgIGVsZWN0aW9uVHlwZSxcbiAgICBjbG9zaW5nUnVsZSxcbiAgICBxdW9ydW1SdWxlLFxuICAgIHRpZU91dGNvbWUsXG4gIH0pO1xuXG4gIG11c3RNYXRjaChxdWVzdGlvbiwgUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4gIC8qIFhYWCBJdCB3b3VsZCBiZSBuaWNlIHRvIGVuZm9yY2UgdGhpcyB1c2luZyBwYXJhbWV0ZXJpemVkIHR5cGVzLCBidXQgdGhhdCovXG4gIC8qIHNlZW1zIHRvIG9ubHkgZW5mb3JjZSB0eXBlIGNvbnN0cmFpbnRzLCAoaS5lLiB0aGUgdGllT3V0Y29tZSB3aWxsIGJlIHRoZSovXG4gIC8qIHNhbWUgdHlwZSBhcyBhbnkgb2YgdGhlIHBvc2l0aW9ucykgdW5sZXNzIHlvdSBjYW4gcHJvdmlkZSB0aGUgY29uY3JldGUqL1xuICAvKiB2YWx1ZSBhdCBwYXR0ZXJuIGNyZWF0aW9uIHRpbWUuKi9cbiAgbXVzdE1hdGNoKHF1ZXN0aW9uLnRpZU91dGNvbWUsIE0ub3IoLi4ucXVlc3Rpb24ucG9zaXRpb25zKSk7XG5cbiAgcmV0dXJuIHF1ZXN0aW9uO1xufTtcblxuLyoqIEB0eXBlIHtCdWlsZFF1ZXN0aW9ufSAqLyRozY9fb25jZS5jb2VyY2VRdWVzdGlvblNwZWMoY29lcmNlUXVlc3Rpb25TcGVjKTtcbmNvbnN0IGJ1aWxkUXVlc3Rpb24gPSAocXVlc3Rpb25TcGVjLCBjb3VudGVySW5zdGFuY2UpID0+IHtcbiAgY29uc3QgcXVlc3Rpb25IYW5kbGUgPSBtYWtlSGFuZGxlKCdRdWVzdGlvbicpO1xuXG4gIC8qKiBAdHlwZSB7UXVlc3Rpb259ICovXG4gIHJldHVybiBtYWtlRXhvKCdxdWVzdGlvbiBkZXRhaWxzJywgUXVlc3Rpb25JLCB7XG4gICAgZ2V0Vm90ZUNvdW50ZXIoKSB7XG4gICAgICByZXR1cm4gY291bnRlckluc3RhbmNlO1xuICAgIH0sXG4gICAgZ2V0RGV0YWlscygpIHtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICAuLi5xdWVzdGlvblNwZWMsXG4gICAgICAgIHF1ZXN0aW9uSGFuZGxlLFxuICAgICAgICBjb3VudGVySW5zdGFuY2UsXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLmJ1aWxkUXVlc3Rpb24oYnVpbGRRdWVzdGlvbik7XG5cbmhhcmRlbihidWlsZFF1ZXN0aW9uKTtcbmhhcmRlbihDaG9pY2VNZXRob2QpO1xuaGFyZGVuKEVsZWN0aW9uVHlwZSk7XG5oYXJkZW4oY29lcmNlUXVlc3Rpb25TcGVjKTtcbmhhcmRlbihwb3NpdGlvbkluY2x1ZGVkKTtcbmhhcmRlbihRdW9ydW1SdWxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNob2ljZU1ldGhvZCI6WyJDaG9pY2VNZXRob2QiXSwiRWxlY3Rpb25UeXBlIjpbIkVsZWN0aW9uVHlwZSJdLCJRdW9ydW1SdWxlIjpbIlF1b3J1bVJ1bGUiXSwicG9zaXRpb25JbmNsdWRlZCI6WyJwb3NpdGlvbkluY2x1ZGVkIl0sImNvZXJjZVF1ZXN0aW9uU3BlYyI6WyJjb2VyY2VRdWVzdGlvblNwZWMiXSwiYnVpbGRRdWVzdGlvbiI6WyJidWlsZFF1ZXN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJtAyG0sQAAALEAAACwAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIiwiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL25vdGlmaWVyIl0sImV4cG9ydHMiOlsiQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlIiwiQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlIiwiQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkiLCJCaW5hcnlWb3RlQ291bnRlckNsb3NlSSIsIkJpbmFyeVZvdGVDb3VudGVyUHVibGljSSIsIkNob2ljZU1ldGhvZFNoYXBlIiwiQ2xvc2luZ1J1bGVTaGFwZSIsIkVsZWN0aW9uVHlwZVNoYXBlIiwiRWxlY3RvcmF0ZUNyZWF0b3JJIiwiRWxlY3RvcmF0ZVB1YmxpY0kiLCJHb3Zlcm5vckZhY2V0U2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIiwiTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiLCJOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiLCJOb1NpbXBsZVBvc2l0aW9uU2hhcGUiLCJPZmZlckZpbHRlcklzc3VlU2hhcGUiLCJPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlIiwiT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSIsIk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUiLCJQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlIiwiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiLCJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSIsIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIiwiUGFyYW1DaGFuZ2VzU3BlY1NoYXBlIiwiUGFyYW1QYXRoU2hhcGUiLCJQb3NpdGlvblNoYXBlIiwiUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJRdWVzdGlvbkhhbmRsZVNoYXBlIiwiUXVlc3Rpb25JIiwiUXVlc3Rpb25TcGVjU2hhcGUiLCJRdWVzdGlvblN0YXRzU2hhcGUiLCJRdW9ydW1SdWxlU2hhcGUiLCJTaW1wbGVJc3N1ZVNoYXBlIiwiU2ltcGxlUG9zaXRpb25zU2hhcGUiLCJTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSIsIlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlIiwiVm90ZUNvdW50ZXJBZG1pbkkiLCJWb3RlQ291bnRlckNsb3NlSSIsIlZvdGVDb3VudGVyUHVibGljSSIsIlZvdGVySGFuZGxlIiwiWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiLCJZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiLCJZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIiwiWWVzU2ltcGxlUG9zaXRpb25TaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sVGltZXN0YW1wU2hhcGUsSW5zdGFuY2VIYW5kbGVTaGFwZSxUaW1lclNoYXBlLG1ha2VIYW5kbGVTaGFwZSxTdWJzY3JpYmVyU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIixbJGjNj19hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJJbnN0YW5jZUhhbmRsZVNoYXBlXCIsWyRozY9fYSA9PiAoSW5zdGFuY2VIYW5kbGVTaGFwZSA9ICRozY9fYSldXSxbXCJUaW1lclNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXJTaGFwZSA9ICRozY9fYSldXSxbXCJtYWtlSGFuZGxlU2hhcGVcIixbJGjNj19hID0+IChtYWtlSGFuZGxlU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIixbJGjNj19hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbiAgICAgICBjb25zdCBDaG9pY2VNZXRob2RTaGFwZSA9IE0ub3IoJ3VucmFua2VkJywgJ29yZGVyJywgJ3BsdXJhbGl0eScpOyRozY9fb25jZS5DaG9pY2VNZXRob2RTaGFwZShDaG9pY2VNZXRob2RTaGFwZSk7XG4gICAgICAgY29uc3QgUXVvcnVtUnVsZVNoYXBlID0gTS5vcignbWFqb3JpdHknLCAnbm9fcXVvcnVtJywgJ2FsbCcpOyRozY9fb25jZS5RdW9ydW1SdWxlU2hhcGUoUXVvcnVtUnVsZVNoYXBlKTtcbiAgICAgICBjb25zdCBFbGVjdGlvblR5cGVTaGFwZSA9IE0ub3IoXG4gICdwYXJhbV9jaGFuZ2UnLFxuICAnZWxlY3Rpb24nLFxuICAnc3VydmV5JyxcbiAgJ2FwaV9pbnZvY2F0aW9uJyxcbiAgJ29mZmVyX2ZpbHRlcicsXG4pOyRozY9fb25jZS5FbGVjdGlvblR5cGVTaGFwZShFbGVjdGlvblR5cGVTaGFwZSk7XG5cbiAgICAgICBjb25zdCBDbG9zaW5nUnVsZVNoYXBlID0ge1xuICB0aW1lcjogTS5lcmVmKFRpbWVyU2hhcGUpLFxuICBkZWFkbGluZTogVGltZXN0YW1wU2hhcGUsXG59OyRozY9fb25jZS5DbG9zaW5nUnVsZVNoYXBlKENsb3NpbmdSdWxlU2hhcGUpO1xuaGFyZGVuKENsb3NpbmdSdWxlU2hhcGUpO1xuXG4vKiBhbGwgdGhlIHN0cmluZ3MgdGhhdCB3aWxsIGJlIGluIHRoZSBmaWx0ZXIgYWZ0ZXIgcGFzc2luZyovXG4gICAgICAgY29uc3QgWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlID0ge1xuICBzdHJpbmdzOiBNLmFycmF5T2YoTS5zdHJpbmcoKSksXG59OyRozY9fb25jZS5ZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUoWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKTtcbmhhcmRlbihZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUgPSB7IGRvbnRVcGRhdGU6IE0uYXJyYXlPZihNLnN0cmluZygpKSB9OyRozY9fb25jZS5Ob09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZShOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSA9IFtcbiAgWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlLFxuICBOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbl07JGjNj19vbmNlLk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUoT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSk7XG5oYXJkZW4oT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBPZmZlckZpbHRlcklzc3VlU2hhcGUgPSB7IHN0cmluZ3M6IE0uYXJyYXlPZihNLnN0cmluZygpKSB9OyRozY9fb25jZS5PZmZlckZpbHRlcklzc3VlU2hhcGUoT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlKTtcbmhhcmRlbihPZmZlckZpbHRlcklzc3VlU2hhcGUpO1xuXG4gICAgICAgY29uc3QgT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSA9IHtcbiAgbWV0aG9kOiBDaG9pY2VNZXRob2RTaGFwZSxcbiAgaXNzdWU6IE9mZmVyRmlsdGVySXNzdWVTaGFwZSxcbiAgcG9zaXRpb25zOiBPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlLFxuICBlbGVjdGlvblR5cGU6ICdvZmZlcl9maWx0ZXInLFxuICBtYXhDaG9pY2VzOiAxLFxuICBtYXhXaW5uZXJzOiAxLFxuICBjbG9zaW5nUnVsZTogQ2xvc2luZ1J1bGVTaGFwZSxcbiAgcXVvcnVtUnVsZTogUXVvcnVtUnVsZVNoYXBlLFxuICB0aWVPdXRjb21lOiBOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbn07JGjNj19vbmNlLk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUoT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSk7XG5oYXJkZW4oT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlID0ge1xuICAuLi5PZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlLFxuICBxdWVzdGlvbkhhbmRsZTogbWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuICBjb3VudGVySW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG59OyRozY9fb25jZS5PZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlKE9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuaGFyZGVuKE9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG4vKiBrZXlzIGFyZSBwYXJhbWV0ZXIgbmFtZXMsIHZhbHVlcyBhcmUgcHJvcG9zZWQgdmFsdWVzKi9cbiAgICAgICBjb25zdCBQYXJhbUNoYW5nZXNTcGVjU2hhcGUgPSBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0uYW55KCkpOyRozY9fb25jZS5QYXJhbUNoYW5nZXNTcGVjU2hhcGUoUGFyYW1DaGFuZ2VzU3BlY1NoYXBlKTtcbiAgICAgICBjb25zdCBZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlID0gUGFyYW1DaGFuZ2VzU3BlY1NoYXBlOyRozY9fb25jZS5ZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKFllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSA9IHsgbm9DaGFuZ2U6IE0uYXJyYXlPZihNLnN0cmluZygpKSB9OyRozY9fb25jZS5Ob1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUoTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlKTtcbmhhcmRlbihOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUgPSBbXG4gIFllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUsXG4gIE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbl07JGjNj19vbmNlLlBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlKFBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlKTtcbmhhcmRlbihQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBQYXJhbVBhdGhTaGFwZSA9IHsga2V5OiBNLmFueSgpIH07JGjNj19vbmNlLlBhcmFtUGF0aFNoYXBlKFBhcmFtUGF0aFNoYXBlKTtcbmhhcmRlbihQYXJhbVBhdGhTaGFwZSk7XG5cbiAgICAgICBjb25zdCBQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlID0ge1xuICBzcGVjOiB7XG4gICAgcGFyYW1QYXRoOiBQYXJhbVBhdGhTaGFwZSxcbiAgICBjaGFuZ2VzOiBQYXJhbUNoYW5nZXNTcGVjU2hhcGUsXG4gIH0sXG4gIGNvbnRyYWN0OiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxufTskaM2PX29uY2UuUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZShQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlKTtcbmhhcmRlbihQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlID0ge1xuICBtZXRob2Q6ICd1bnJhbmtlZCcsXG4gIGlzc3VlOiBQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlLFxuICBwb3NpdGlvbnM6IFBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlLFxuICBlbGVjdGlvblR5cGU6ICdwYXJhbV9jaGFuZ2UnLFxuICBtYXhDaG9pY2VzOiAxLFxuICBtYXhXaW5uZXJzOiAxLFxuICBjbG9zaW5nUnVsZTogQ2xvc2luZ1J1bGVTaGFwZSxcbiAgcXVvcnVtUnVsZTogJ21ham9yaXR5JyxcbiAgdGllT3V0Y29tZTogTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlLFxufTskaM2PX29uY2UuUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUoUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUpO1xuaGFyZGVuKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlID0ge1xuICAuLi5QYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSxcbiAgcXVlc3Rpb25IYW5kbGU6IG1ha2VIYW5kbGVTaGFwZSgnUXVlc3Rpb24nKSxcbiAgY291bnRlckluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxufTskaM2PX29uY2UuUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUoUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuaGFyZGVuKFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuY29uc3QgQXBpSW52b2NhdGlvblNwZWNTaGFwZSA9IHtcbiAgYXBpTWV0aG9kTmFtZTogTS5zdHJpbmcoKSxcbiAgbWV0aG9kQXJnczogTS5hcnJheU9mKE0uYW55KCkpLFxufTtcbmhhcmRlbihBcGlJbnZvY2F0aW9uU3BlY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlID0gQXBpSW52b2NhdGlvblNwZWNTaGFwZTskaM2PX29uY2UuWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUoWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUgPSB7IGRvbnRJbnZva2U6IE0uc3RyaW5nKCkgfTskaM2PX29uY2UuTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZShOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKTtcbmhhcmRlbihOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IEFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSA9IFtcbiAgWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUsXG4gIE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUsXG5dOyRozY9fb25jZS5BcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUoQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlKTtcbmhhcmRlbihBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUpO1xuXG4gICAgICAgY29uc3QgQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlID0ge1xuICBtZXRob2Q6ICd1bnJhbmtlZCcsXG4gIGlzc3VlOiBBcGlJbnZvY2F0aW9uU3BlY1NoYXBlLFxuICBwb3NpdGlvbnM6IEFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSxcbiAgZWxlY3Rpb25UeXBlOiAnYXBpX2ludm9jYXRpb24nLFxuICBtYXhDaG9pY2VzOiAxLFxuICBtYXhXaW5uZXJzOiAxLFxuICBjbG9zaW5nUnVsZTogQ2xvc2luZ1J1bGVTaGFwZSxcbiAgcXVvcnVtUnVsZTogUXVvcnVtUnVsZVNoYXBlLFxuICB0aWVPdXRjb21lOiBOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxufTskaM2PX29uY2UuQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlKEFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSk7XG5oYXJkZW4oQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IEFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSA9IHtcbiAgLi4uQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlLFxuICBxdWVzdGlvbkhhbmRsZTogbWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuICBjb3VudGVySW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG59OyRozY9fb25jZS5BcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUoQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcbmhhcmRlbihBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG5jb25zdCBTaW1wbGVTcGVjU2hhcGUgPSB7IHRleHQ6IE0uc3RyaW5nKCkgfTtcbmhhcmRlbihTaW1wbGVTcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgWWVzU2ltcGxlUG9zaXRpb25TaGFwZSA9IHsgdGV4dDogTS5zdHJpbmcoKSB9OyRozY9fb25jZS5ZZXNTaW1wbGVQb3NpdGlvblNoYXBlKFllc1NpbXBsZVBvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKFllc1NpbXBsZVBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgTm9TaW1wbGVQb3NpdGlvblNoYXBlID0geyB0ZXh0OiBNLnN0cmluZygpIH07JGjNj19vbmNlLk5vU2ltcGxlUG9zaXRpb25TaGFwZShOb1NpbXBsZVBvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKE5vU2ltcGxlUG9zaXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBTaW1wbGVQb3NpdGlvbnNTaGFwZSA9IFtcbiAgWWVzU2ltcGxlUG9zaXRpb25TaGFwZSxcbiAgTm9TaW1wbGVQb3NpdGlvblNoYXBlLFxuXTskaM2PX29uY2UuU2ltcGxlUG9zaXRpb25zU2hhcGUoU2ltcGxlUG9zaXRpb25zU2hhcGUpO1xuaGFyZGVuKFNpbXBsZVBvc2l0aW9uc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFNpbXBsZUlzc3VlU2hhcGUgPSBTaW1wbGVTcGVjU2hhcGU7JGjNj19vbmNlLlNpbXBsZUlzc3VlU2hhcGUoU2ltcGxlSXNzdWVTaGFwZSk7XG5oYXJkZW4oU2ltcGxlSXNzdWVTaGFwZSk7XG5cbiAgICAgICBjb25zdCBTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSA9IHtcbiAgbWV0aG9kOiBDaG9pY2VNZXRob2RTaGFwZSxcbiAgaXNzdWU6IFNpbXBsZUlzc3VlU2hhcGUsXG4gIHBvc2l0aW9uczogTS5hcnJheU9mKHsgdGV4dDogTS5zdHJpbmcoKSB9KSxcbiAgZWxlY3Rpb25UeXBlOiBNLm9yKCdlbGVjdGlvbicsICdzdXJ2ZXknKSxcbiAgbWF4Q2hvaWNlczogTS5ndGUoMSksXG4gIG1heFdpbm5lcnM6IE0uZ3RlKDEpLFxuICBjbG9zaW5nUnVsZTogQ2xvc2luZ1J1bGVTaGFwZSxcbiAgcXVvcnVtUnVsZTogUXVvcnVtUnVsZVNoYXBlLFxuICB0aWVPdXRjb21lOiBOb1NpbXBsZVBvc2l0aW9uU2hhcGUsXG59OyRozY9fb25jZS5TaW1wbGVRdWVzdGlvblNwZWNTaGFwZShTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSk7XG5oYXJkZW4oU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSB7XG4gIC4uLlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlLFxuICBxdWVzdGlvbkhhbmRsZTogbWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuICBjb3VudGVySW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG59OyRozY9fb25jZS5TaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZShTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5oYXJkZW4oU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUXVlc3Rpb25TcGVjU2hhcGUgPSBNLm9yKFxuICBBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUsXG4gIE9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUsXG4gIFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlLFxuICBTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSxcbik7JGjNj19vbmNlLlF1ZXN0aW9uU3BlY1NoYXBlKFF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFBvc2l0aW9uU2hhcGUgPSBNLm9yKFxuICBZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbiAgTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbiAgWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlLFxuICBOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbiAgWWVzU2ltcGxlUG9zaXRpb25TaGFwZSxcbiAgTm9TaW1wbGVQb3NpdGlvblNoYXBlLFxuICBZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlLFxuICBOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUsXG4pOyRozY9fb25jZS5Qb3NpdGlvblNoYXBlKFBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUXVlc3Rpb25IYW5kbGVTaGFwZSA9IG1ha2VIYW5kbGVTaGFwZSgncXVlc3Rpb24nKTtcblxuLyogVE9ETyhoaWJiZXJ0KTogYWRkIGRldGFpbHM7IG1vdmUgdG8gYSBtb3JlIGFwcHJvcHJpYXRlIGxvY2F0aW9uKi8kaM2PX29uY2UuUXVlc3Rpb25IYW5kbGVTaGFwZShRdWVzdGlvbkhhbmRsZVNoYXBlKTtcbiAgICAgICBjb25zdCBJbnZpdGF0aW9uU2hhcGUgPSBNLnJlbW90YWJsZSgnSW52aXRhdGlvbicpO1xuXG4vKiBYWFggSSB3YW50IHRvIGFkZCBxdWVzdGlvbkhhbmRsZSBhbmQgY291bnRlckluc3RhbmNlIHRvKi9cbi8qIFBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlLiBJIGRvbid0IHNlZSBhbnkgYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIHRoZSovXG4vKiBtZXRob2RzIHRvIGVhY2ggbWVtYmVyIHNlcGFyYXRlbHkqLyRozY9fb25jZS5JbnZpdGF0aW9uU2hhcGUoSW52aXRhdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBRdWVzdGlvbkRldGFpbHNTaGFwZSA9IE0ub3IoXG4gIFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlLFxuICBBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUsXG4gIE9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUsXG4gIFNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlLFxuKTskaM2PX29uY2UuUXVlc3Rpb25EZXRhaWxzU2hhcGUoUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG4gICAgICAgY29uc3QgRWxlY3RvcmF0ZVB1YmxpY0kgPSBNLmludGVyZmFjZSgnQ29tbWl0dGVlIFB1YmxpY0ZhY2V0Jywge1xuICBnZXRRdWVzdGlvblN1YnNjcmliZXI6IE0uY2FsbCgpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbiAgZ2V0T3BlblF1ZXN0aW9uczogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldE5hbWU6IE0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG4gIGdldEluc3RhbmNlOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpLFxuICBnZXRRdWVzdGlvbjogTS5jYWxsKFF1ZXN0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxufSk7JGjNj19vbmNlLkVsZWN0b3JhdGVQdWJsaWNJKEVsZWN0b3JhdGVQdWJsaWNJKTtcbmNvbnN0IEVsZWN0b3JhdGVQdWJsaWNTaGFwZSA9IE0ucmVtb3RhYmxlKCdFbGVjdG9yYXRlUHVibGljJyk7XG5cbiAgICAgICBjb25zdCBFbGVjdG9yYXRlQ3JlYXRvckkgPSBNLmludGVyZmFjZSgnQ29tbWl0dGVlIEFkbWluRmFjZXQnLCB7XG4gIGdldFBvc2VySW52aXRhdGlvbjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGFkZFF1ZXN0aW9uOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSwgUXVlc3Rpb25TcGVjU2hhcGUpLnJldHVybnMoXG4gICAgTS5wcm9taXNlKCksXG4gICksXG4gIGdldFZvdGVySW52aXRhdGlvbnM6IE0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0ucHJvbWlzZSgpKSksXG4gIGdldFF1ZXN0aW9uU3Vic2NyaWJlcjogTS5jYWxsKCkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuICBnZXRQdWJsaWNGYWNldDogTS5jYWxsKCkucmV0dXJucyhFbGVjdG9yYXRlUHVibGljU2hhcGUpLFxufSk7JGjNj19vbmNlLkVsZWN0b3JhdGVDcmVhdG9ySShFbGVjdG9yYXRlQ3JlYXRvckkpO1xuXG4gICAgICAgY29uc3QgUXVlc3Rpb25TdGF0c1NoYXBlID0ge1xuICBzcG9pbGVkOiBNLm5hdCgpLFxuICB2b3RlczogTS5uYXQoKSxcbiAgcmVzdWx0czogTS5hcnJheU9mKHsgcG9zaXRpb246IFBvc2l0aW9uU2hhcGUsIHRvdGFsOiBNLm5hdCgpIH0pLFxufTskaM2PX29uY2UuUXVlc3Rpb25TdGF0c1NoYXBlKFF1ZXN0aW9uU3RhdHNTaGFwZSk7XG5oYXJkZW4oUXVlc3Rpb25TdGF0c1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFF1ZXN0aW9uSSA9IE0uaW50ZXJmYWNlKCdRdWVzdGlvbicsIHtcbiAgZ2V0Vm90ZUNvdW50ZXI6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG4gIGdldERldGFpbHM6IE0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25EZXRhaWxzU2hhcGUpLFxufSk7JGjNj19vbmNlLlF1ZXN0aW9uSShRdWVzdGlvbkkpO1xuY29uc3QgUXVlc3Rpb25TaGFwZSA9IE0ucmVtb3RhYmxlKCdRdWVzdGlvbicpO1xuXG4gICAgICAgY29uc3QgQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJID0gTS5pbnRlcmZhY2UoXG4gICdCaW5hcnlWb3RlQ291bnRlciBQdWJsaWNGYWNldCcsXG4gIHtcbiAgICBnZXRRdWVzdGlvbjogTS5jYWxsKCkucmV0dXJucyhRdWVzdGlvblNoYXBlKSxcbiAgICBpc09wZW46IE0uY2FsbCgpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICAgIGdldE91dGNvbWU6IE0uY2FsbCgpLnJldHVybnMoTS5lcmVmKE0ucHJvbWlzZSgpKSksXG4gICAgZ2V0U3RhdHM6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIGdldERldGFpbHM6IE0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25EZXRhaWxzU2hhcGUpLFxuICAgIGdldEluc3RhbmNlOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpLFxuICB9LFxuKTskaM2PX29uY2UuQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJKEJpbmFyeVZvdGVDb3VudGVyUHVibGljSSk7XG5cbiAgICAgICBjb25zdCBWb3RlckhhbmRsZSA9IE0ucmVtb3RhYmxlKCk7JGjNj19vbmNlLlZvdGVySGFuZGxlKFZvdGVySGFuZGxlKTtcbiAgICAgICBjb25zdCBCaW5hcnlWb3RlQ291bnRlckFkbWluSSA9IE0uaW50ZXJmYWNlKFxuICAnQmluYXJ5Vm90ZUNvdW50ZXIgQWRtaW5GYWNldCcsXG4gIHtcbiAgICBzdWJtaXRWb3RlOiBNLmNhbGwoVm90ZXJIYW5kbGUsIE0uYXJyYXlPZihQb3NpdGlvblNoYXBlKSlcbiAgICAgIC5vcHRpb25hbChNLm5hdCgpKVxuICAgICAgLnJldHVybnMoeyBjaG9zZW46IFBvc2l0aW9uU2hhcGUsIHNoYXJlczogTS5uYXQoKSB9KSxcbiAgfSxcbik7JGjNj19vbmNlLkJpbmFyeVZvdGVDb3VudGVyQWRtaW5JKEJpbmFyeVZvdGVDb3VudGVyQWRtaW5JKTtcblxuICAgICAgIGNvbnN0IEJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJID0gTS5pbnRlcmZhY2UoXG4gICdCaW5hcnlWb3RlQ291bnRlciBDbG9zZUZhY2V0JyxcbiAge1xuICAgIGNsb3NlVm90aW5nOiBNLmNhbGwoKS5yZXR1cm5zKCksXG4gIH0sXG4pOyRozY9fb25jZS5CaW5hcnlWb3RlQ291bnRlckNsb3NlSShCaW5hcnlWb3RlQ291bnRlckNsb3NlSSk7XG5cbiAgICAgICBjb25zdCBWb3RlQ291bnRlclB1YmxpY0kgPSBNLmludGVyZmFjZSgnVm90ZUNvdW50ZXIgUHVibGljRmFjZXQnLCB7XG4gIGdldFF1ZXN0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uU2hhcGUpLFxuICBpc09wZW46IE0uY2FsbCgpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICBnZXRPdXRjb21lOiBNLmNhbGwoKS5yZXR1cm5zKE0uZXJlZihNLnByb21pc2UoKSkpLFxuICBnZXRTdGF0czogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldERldGFpbHM6IE0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25EZXRhaWxzU2hhcGUpLFxuICBnZXRJbnN0YW5jZTogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbn0pOyRozY9fb25jZS5Wb3RlQ291bnRlclB1YmxpY0koVm90ZUNvdW50ZXJQdWJsaWNJKTtcblxuICAgICAgIGNvbnN0IFZvdGVDb3VudGVyQWRtaW5JID0gTS5pbnRlcmZhY2UoJ1ZvdGVDb3VudGVyIEFkbWluRmFjZXQnLCB7XG4gIHN1Ym1pdFZvdGU6IE0uY2FsbChWb3RlckhhbmRsZSwgTS5hcnJheU9mKFBvc2l0aW9uU2hhcGUpKVxuICAgIC5vcHRpb25hbChNLm5hdCgpKVxuICAgIC5yZXR1cm5zKHsgY2hvc2VuOiBNLmFycmF5T2YoUG9zaXRpb25TaGFwZSksIHNoYXJlczogTS5uYXQoKSB9KSxcbn0pOyRozY9fb25jZS5Wb3RlQ291bnRlckFkbWluSShWb3RlQ291bnRlckFkbWluSSk7XG5cbiAgICAgICBjb25zdCBWb3RlQ291bnRlckNsb3NlSSA9IE0uaW50ZXJmYWNlKCdWb3RlQ291bnRlciBDbG9zZUZhY2V0Jywge1xuICBjbG9zZVZvdGluZzogTS5jYWxsKCkucmV0dXJucygpLFxufSk7JGjNj19vbmNlLlZvdGVDb3VudGVyQ2xvc2VJKFZvdGVDb3VudGVyQ2xvc2VJKTtcblxuICAgICAgIGNvbnN0IEdvdmVybm9yRmFjZXRTaGFwZSA9IHtcbiAgZ2V0UGFyYW1NZ3JSZXRyaWV2ZXI6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ3BhcmFtUmV0cmlldmVyJykpLFxuICBnZXRJbnZpdGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKEludml0YXRpb25TaGFwZSksXG4gIGdldExpbWl0ZWRDcmVhdG9yRmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoKSksXG4gIGdldEdvdmVybmVkQXBpczogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnZ292ZXJuZWRBUElzJykpLFxuICBnZXRHb3Zlcm5lZEFwaU5hbWVzOiBNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG4gIHNldE9mZmVyRmlsdGVyOiBNLmNhbGwoTS5hcnJheU9mKE0uc3RyaW5nKCkpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn07JGjNj19vbmNlLkdvdmVybm9yRmFjZXRTaGFwZShHb3Zlcm5vckZhY2V0U2hhcGUpO1xuaGFyZGVuKEdvdmVybm9yRmFjZXRTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDaG9pY2VNZXRob2RTaGFwZSI6WyJDaG9pY2VNZXRob2RTaGFwZSJdLCJRdW9ydW1SdWxlU2hhcGUiOlsiUXVvcnVtUnVsZVNoYXBlIl0sIkVsZWN0aW9uVHlwZVNoYXBlIjpbIkVsZWN0aW9uVHlwZVNoYXBlIl0sIkNsb3NpbmdSdWxlU2hhcGUiOlsiQ2xvc2luZ1J1bGVTaGFwZSJdLCJZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiOlsiWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIl0sIk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIjpbIk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIl0sIk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUiOlsiT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSJdLCJPZmZlckZpbHRlcklzc3VlU2hhcGUiOlsiT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlIl0sIk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUiOlsiT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSJdLCJPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiUGFyYW1DaGFuZ2VzU3BlY1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1NwZWNTaGFwZSJdLCJZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIjpbIlllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiXSwiTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIjpbIk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSJdLCJQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSI6WyJQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSJdLCJQYXJhbVBhdGhTaGFwZSI6WyJQYXJhbVBhdGhTaGFwZSJdLCJQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlIjpbIlBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUiXSwiUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUiOlsiUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUiXSwiUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiOlsiWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiXSwiTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSI6WyJOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIl0sIkFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSI6WyJBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUiXSwiQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlIjpbIkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSJdLCJBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlllc1NpbXBsZVBvc2l0aW9uU2hhcGUiOlsiWWVzU2ltcGxlUG9zaXRpb25TaGFwZSJdLCJOb1NpbXBsZVBvc2l0aW9uU2hhcGUiOlsiTm9TaW1wbGVQb3NpdGlvblNoYXBlIl0sIlNpbXBsZVBvc2l0aW9uc1NoYXBlIjpbIlNpbXBsZVBvc2l0aW9uc1NoYXBlIl0sIlNpbXBsZUlzc3VlU2hhcGUiOlsiU2ltcGxlSXNzdWVTaGFwZSJdLCJTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSI6WyJTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSJdLCJTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJRdWVzdGlvblNwZWNTaGFwZSI6WyJRdWVzdGlvblNwZWNTaGFwZSJdLCJQb3NpdGlvblNoYXBlIjpbIlBvc2l0aW9uU2hhcGUiXSwiUXVlc3Rpb25IYW5kbGVTaGFwZSI6WyJRdWVzdGlvbkhhbmRsZVNoYXBlIl0sIkludml0YXRpb25TaGFwZSI6WyJJbnZpdGF0aW9uU2hhcGUiXSwiUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiRWxlY3RvcmF0ZVB1YmxpY0kiOlsiRWxlY3RvcmF0ZVB1YmxpY0kiXSwiRWxlY3RvcmF0ZUNyZWF0b3JJIjpbIkVsZWN0b3JhdGVDcmVhdG9ySSJdLCJRdWVzdGlvblN0YXRzU2hhcGUiOlsiUXVlc3Rpb25TdGF0c1NoYXBlIl0sIlF1ZXN0aW9uSSI6WyJRdWVzdGlvbkkiXSwiQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJIjpbIkJpbmFyeVZvdGVDb3VudGVyUHVibGljSSJdLCJWb3RlckhhbmRsZSI6WyJWb3RlckhhbmRsZSJdLCJCaW5hcnlWb3RlQ291bnRlckFkbWluSSI6WyJCaW5hcnlWb3RlQ291bnRlckFkbWluSSJdLCJCaW5hcnlWb3RlQ291bnRlckNsb3NlSSI6WyJCaW5hcnlWb3RlQ291bnRlckNsb3NlSSJdLCJWb3RlQ291bnRlclB1YmxpY0kiOlsiVm90ZUNvdW50ZXJQdWJsaWNJIl0sIlZvdGVDb3VudGVyQWRtaW5JIjpbIlZvdGVDb3VudGVyQWRtaW5JIl0sIlZvdGVDb3VudGVyQ2xvc2VJIjpbIlZvdGVDb3VudGVyQ2xvc2VJIl0sIkdvdmVybm9yRmFjZXRTaGFwZSI6WyJHb3Zlcm5vckZhY2V0U2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAaTEYnSQwAAEkMAAAsAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3ZhbGlkYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSIsImFzc2VydENvbnRyYWN0R292ZXJuYW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxFOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBpbXBvcnQge1ZvdGVDb3VudGVyQ3JlYXRvckZhY2V0LCBWb3RlQ291bnRlclB1YmxpY0ZhY2V0LCBRdWVzdGlvblNwZWMsIE91dGNvbWVSZWNvcmQsIEFkZFF1ZXN0aW9uLCBBZGRRdWVzdGlvblJldHVybiwgQXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlLCBBc3NlcnRDb250cmFjdEVsZWN0b3JhdGV9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIGdvdmVybmVkIGNvbnRyYWN0IHdhcyBzdGFydGVkIGJ5IHRoZSBnb3Zlcm5vci4gVGhyb3dzIGlmXG4gKiBlaXRoZXIgZGlyZWN0aW9uIGNhbid0IGJlIGVzdGFibGlzaGVkLiBJZiB0aGUgY2FsbCBzdWNjZWVkcywgdGhlbiB0aGVcbiAqIGdvdmVybm9yIGdvdCBleGNsdXNpdmUgYWNjZXNzIHRvIHRoZSBnb3Zlcm5lZCBjb250cmFjdCdzIGNyZWF0b3JGYWNldCwgYW5kXG4gKiBjYW4gYmUgdHJ1c3RlZCB0byBtYW5hZ2UgaXRzIHBhcmFtZXRlcnMuXG4gKlxuICogQHR5cGUge0Fzc2VydENvbnRyYWN0R292ZXJuYW5jZX1cbiAqL1xuY29uc3QgYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlID0gYXN5bmMgKFxuICB6b2UsXG4gIGFsbGVnZWRHb3Zlcm5lZCxcbiAgYWxsZWdlZEdvdmVybm9yLFxuICBjb250cmFjdEdvdmVybm9ySW5zdGFsbGF0aW9uLFxuKSA9PiB7XG4gIGNvbnN0IGFsbGVnZWRHb3Zlcm5vclBGID0gRSh6b2UpLmdldFB1YmxpY0ZhY2V0KGFsbGVnZWRHb3Zlcm5vcik7XG4gIGNvbnN0IHJlYWxHb3Zlcm5lZFAgPSBFKGFsbGVnZWRHb3Zlcm5vclBGKS5nZXRHb3Zlcm5lZENvbnRyYWN0KCk7XG4gIGNvbnN0IGFsbGVnZWRHb3Zlcm5lZFRlcm1zUCA9IEUoem9lKS5nZXRUZXJtcyhhbGxlZ2VkR292ZXJuZWQpO1xuXG4gIGNvbnN0IFt7IGVsZWN0aW9uTWFuYWdlcjogcmVhbEdvdmVybm9ySW5zdGFuY2UgfSwgcmVhbEdvdmVybmVkSW5zdGFuY2VdID1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChbYWxsZWdlZEdvdmVybmVkVGVybXNQLCByZWFsR292ZXJuZWRQXSk7XG5cbiAgYXNzZXJ0KFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIHR5cGVzKi9cbiAgICBhbGxlZ2VkR292ZXJub3IgPT09IHJlYWxHb3Zlcm5vckluc3RhbmNlLFxuICAgICdUaGUgYWxsZWdlZCBnb3Zlcm5vciBkaWQgbm90IG1hdGNoIHRoZSBnb3Zlcm5vciByZXRyaWV2ZWQgZnJvbSB0aGUgZ292ZXJuZWQgY29udHJhY3QnLFxuICApO1xuXG4gIGFzc2VydChcbiAgICBhbGxlZ2VkR292ZXJuZWQgPT09IHJlYWxHb3Zlcm5lZEluc3RhbmNlLFxuICAgICdUaGUgYWxsZWdlZCBnb3Zlcm5lZCBkaWQgbm90IG1hdGNoIHRoZSBnb3Zlcm5lZCBjb250cmFjdCByZXRyaWV2ZWQgZnJvbSB0aGUgZ292ZXJub3InLFxuICApO1xuXG4gIGNvbnN0IGdvdmVybm9ySW5zdGFsbGF0aW9uRnJvbUdvdmVybmVkID1cbiAgICBhd2FpdCBFKHpvZSkuZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2UocmVhbEdvdmVybm9ySW5zdGFuY2UpO1xuXG4gIGFzc2VydChcbiAgICBnb3Zlcm5vckluc3RhbGxhdGlvbkZyb21Hb3Zlcm5lZCA9PT0gY29udHJhY3RHb3Zlcm5vckluc3RhbGxhdGlvbixcbiAgICAnVGhlIGdvdmVybmVkIGNvbnRyYWN0IGlzIG5vdCBnb3Zlcm5lZCBieSBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZWQgaW5zdGFsbGF0aW9uLicsXG4gICk7XG5cbiAgcmV0dXJuIHsgZ292ZXJub3I6IHJlYWxHb3Zlcm5vckluc3RhbmNlLCBnb3Zlcm5lZDogcmVhbEdvdmVybmVkSW5zdGFuY2UgfTtcbn07XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIGdvdmVybm9yIHJlZmVycyB0byB0aGUgaW5kaWNhdGVkIGVsZWN0b3JhdGUuXG4gKlxuICogQHR5cGUge0Fzc2VydENvbnRyYWN0RWxlY3RvcmF0ZX1cbiAqLyRozY9fb25jZS5hc3NlcnRDb250cmFjdEdvdmVybmFuY2UoYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlKTtcbmNvbnN0IGFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSA9IGFzeW5jIChcbiAgem9lLFxuICBhbGxlZ2VkR292ZXJub3IsXG4gIGFsbGVnZWRFbGVjdG9yYXRlLFxuKSA9PiB7XG4gIGNvbnN0IGFsbGVnZWRHb3Zlcm5vclBGID0gRSh6b2UpLmdldFB1YmxpY0ZhY2V0KGFsbGVnZWRHb3Zlcm5vcik7XG4gIGNvbnN0IGVsZWN0b3JhdGUgPSBhd2FpdCBFKGFsbGVnZWRHb3Zlcm5vclBGKS5nZXRFbGVjdG9yYXRlKCk7XG4gIGVsZWN0b3JhdGUgPT09IGFsbGVnZWRFbGVjdG9yYXRlIHx8XG4gICAgRmFpbGBUaGUgYWxsZWdlZEVsZWN0b3JhdGUgZGlkbid0IG1hdGNoIHRoZSBhY3R1YWwgJHtxKGVsZWN0b3JhdGUpfWA7XG5cbiAgcmV0dXJuIHRydWU7XG59OyRozY9fb25jZS5hc3NlcnRDb250cmFjdEVsZWN0b3JhdGUoYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlKTtcblxuaGFyZGVuKGFzc2VydENvbnRyYWN0R292ZXJuYW5jZSk7XG5oYXJkZW4oYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydENvbnRyYWN0R292ZXJuYW5jZSI6WyJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiXSwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIjpbImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAATyh9wFwsAABcLAAAyAAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9hdWN0aW9uL3V0aWwuanN7ImltcG9ydHMiOlsiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJBdWN0aW9uU3RhdGUiLCJpc1NjYWxlZEJpZFByaWNlSGlnaGVyIiwibWFrZUJyYW5kZWRSYXRpb1BhdHRlcm4iLCJtYWtlQ2FuY2VsVG9rZW5NYWtlciIsInByaWNlRnJvbSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VSYXRpb0Zyb21BbW91bnRzLG11bHRpcGx5UmF0aW9zLHJhdGlvR1RFLEZhcjskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcIm1ha2VSYXRpb0Zyb21BbW91bnRzXCIsWyRozY9fYSA9PiAobWFrZVJhdGlvRnJvbUFtb3VudHMgPSAkaM2PX2EpXV0sW1wibXVsdGlwbHlSYXRpb3NcIixbJGjNj19hID0+IChtdWx0aXBseVJhdGlvcyA9ICRozY9fYSldXSxbXCJyYXRpb0dURVwiLFskaM2PX2EgPT4gKHJhdGlvR1RFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0tleSwgUGF0dGVybn0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7UHJpY2VBdXRob3JpdHksIFByaWNlRGVzY3JpcHRpb24sIFByaWNlUXVvdGUsIFByaWNlUXVvdGVWYWx1ZSwgUHJpY2VRdWVyeSx9IGZyb20gJ0BhZ29yaWMvem9lL3Rvb2xzL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0JyYW5kLCBSYXRpb30gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqL1xuXG4vKipcbiAqIENvbnN0YW50cyBmb3IgQXVjdGlvbiBTdGF0ZS5cbiAqXG4gKiBAZW51bSB7KHR5cGVvZiBBdWN0aW9uU3RhdGUpW2tleW9mIHR5cGVvZiBBdWN0aW9uU3RhdGVdfVxuICovXG4gICAgICAgY29uc3QgQXVjdGlvblN0YXRlID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgQUNUSVZFOiAnYWN0aXZlJyxcbiAgV0FJVElORzogJ3dhaXRpbmcnLFxufSk7JGjNj19vbmNlLkF1Y3Rpb25TdGF0ZShBdWN0aW9uU3RhdGUpO1xuaGFyZGVuKEF1Y3Rpb25TdGF0ZSk7XG5cbi8qKlxuICogQHBhcmFtIHt7IGJyYW5kOiBCcmFuZDsgdmFsdWU6IFBhdHRlcm4gfX0gbnVtZXJhdG9yQW1vdW50U2hhcGVcbiAqIEBwYXJhbSB7eyBicmFuZDogQnJhbmQ7IHZhbHVlOiBQYXR0ZXJuIH19IGRlbm9taW5hdG9yQW1vdW50U2hhcGVcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VCcmFuZGVkUmF0aW9QYXR0ZXJuID0gKFxuICBudW1lcmF0b3JBbW91bnRTaGFwZSxcbiAgZGVub21pbmF0b3JBbW91bnRTaGFwZSxcbikgPT4ge1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBudW1lcmF0b3I6IG51bWVyYXRvckFtb3VudFNoYXBlLFxuICAgIGRlbm9taW5hdG9yOiBkZW5vbWluYXRvckFtb3VudFNoYXBlLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gYmlkU2NhbGluZ1xuICogQHBhcmFtIHtSYXRpb30gY3VycmVudFByaWNlXG4gKiBAcGFyYW0ge1JhdGlvfSBvcmFjbGVQcmljZVxuICogQHJldHVybnMge2Jvb2xlYW59IFRSVUUgaWZmIHRoZSBkaXNjb3VudCgvbWFya3VwKSBhcHBsaWVkIHRvIHRoZSBwcmljZSBpc1xuICogICBoaWdoZXIgdGhhbiB0aGUgcXVvdGUuXG4gKi8kaM2PX29uY2UubWFrZUJyYW5kZWRSYXRpb1BhdHRlcm4obWFrZUJyYW5kZWRSYXRpb1BhdHRlcm4pO1xuICAgICAgIGNvbnN0IGlzU2NhbGVkQmlkUHJpY2VIaWdoZXIgPSAoYmlkU2NhbGluZywgY3VycmVudFByaWNlLCBvcmFjbGVQcmljZSkgPT5cbiAgcmF0aW9HVEUobXVsdGlwbHlSYXRpb3Mob3JhY2xlUHJpY2UsIGJpZFNjYWxpbmcpLCBjdXJyZW50UHJpY2UpO1xuXG4vKiogQHR5cGUgeyhxdW90ZTogUHJpY2VRdW90ZSkgPT4gUmF0aW99ICovJGjNj19vbmNlLmlzU2NhbGVkQmlkUHJpY2VIaWdoZXIoaXNTY2FsZWRCaWRQcmljZUhpZ2hlcik7XG4gICAgICAgY29uc3QgcHJpY2VGcm9tID0gcXVvdGUgPT5cbiAgbWFrZVJhdGlvRnJvbUFtb3VudHMoXG4gICAgcXVvdGUucXVvdGVBbW91bnQudmFsdWVbMF0uYW1vdW50T3V0LFxuICAgIHF1b3RlLnF1b3RlQW1vdW50LnZhbHVlWzBdLmFtb3VudEluLFxuICApOyRozY9fb25jZS5wcmljZUZyb20ocHJpY2VGcm9tKTtcblxuICAgICAgIGNvbnN0IG1ha2VDYW5jZWxUb2tlbk1ha2VyID0gbmFtZSA9PiB7XG4gIGxldCB0b2tlbkNvdW50ID0gMTtcblxuICByZXR1cm4gKCkgPT4gRmFyKGBjYW5jZWxUb2tlbi0ke25hbWV9LSR7KHRva2VuQ291bnQgKz0gMSl9YCwge30pO1xufTskaM2PX29uY2UubWFrZUNhbmNlbFRva2VuTWFrZXIobWFrZUNhbmNlbFRva2VuTWFrZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQXVjdGlvblN0YXRlIjpbIkF1Y3Rpb25TdGF0ZSJdLCJtYWtlQnJhbmRlZFJhdGlvUGF0dGVybiI6WyJtYWtlQnJhbmRlZFJhdGlvUGF0dGVybiJdLCJpc1NjYWxlZEJpZFByaWNlSGlnaGVyIjpbImlzU2NhbGVkQmlkUHJpY2VIaWdoZXIiXSwicHJpY2VGcm9tIjpbInByaWNlRnJvbSJdLCJtYWtlQ2FuY2VsVG9rZW5NYWtlciI6WyJtYWtlQ2FuY2VsVG9rZW5NYWtlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADB1S4IhwUAAIcFAAAxAAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9jb2xsZWN0RmVlcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIl0sImV4cG9ydHMiOlsibWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGF0b21pY1RyYW5zZmVyOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wiYXRvbWljVHJhbnNmZXJcIixbJGjNj19hID0+IChhdG9taWNUcmFuc2ZlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0ludml0YXRpb24sIFpDRiwgWkNGU2VhdH0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7QnJhbmR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKi9cblxuLyoqXG4gKiBQcm92aWRlIHNoYXJlZCBzdXBwb3J0IGZvciBwcm92aWRpbmcgYWNjZXNzIHRvIGZlZXMgZnJvbSBhIHNlcnZpY2UgY29udHJhY3QuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBmZWVTZWF0XG4gKiBAcGFyYW0ge0JyYW5kfSBmZWVCcmFuZFxuICogQHBhcmFtIHtzdHJpbmd9IGtleXdvcmRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb248c3RyaW5nPj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uID0gKHpjZiwgZmVlU2VhdCwgZmVlQnJhbmQsIGtleXdvcmQpID0+IHtcbiAgY29uc3QgY29sbGVjdEZlZXMgPSBzZWF0ID0+IHtcbiAgICBjb25zdCBhbW91bnQgPSBmZWVTZWF0LmdldEFtb3VudEFsbG9jYXRlZChrZXl3b3JkLCBmZWVCcmFuZCk7XG4gICAgYXRvbWljVHJhbnNmZXIoemNmLCBmZWVTZWF0LCBzZWF0LCB7IFtrZXl3b3JkXTogYW1vdW50IH0sIHsgRmVlOiBhbW91bnQgfSk7XG5cbiAgICBzZWF0LmV4aXQoKTtcbiAgICByZXR1cm4gYHBhaWQgb3V0ICR7YW1vdW50LnZhbHVlfWA7XG4gIH07XG5cbiAgcmV0dXJuIHpjZi5tYWtlSW52aXRhdGlvbihjb2xsZWN0RmVlcywgJ2NvbGxlY3QgZmVlcycpO1xufTskaM2PX29uY2UubWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvbihtYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VDb2xsZWN0RmVlc0ludml0YXRpb24iOlsibWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADyHDf4IBQAACAUAAA1AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9jb250cmFjdFN1cHBvcnQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiXSwiZXhwb3J0cyI6WyJhZGRTdWJ0cmFjdCIsImFsbEVtcHR5IiwiYW1vdW50UGF0dGVybiIsImFzc2VydE9ubHlLZXlzIiwiY2hlY2tEZWJ0TGltaXQiLCJtYWtlTmF0QW1vdW50U2hhcGUiLCJxdW90ZUFzUmF0aW8iLCJyYXRpb1BhdHRlcm4iLCJzdWJ0cmFjdFRvRW1wdHkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsQW1vdW50TWF0aCxNLG1ha2VSYXRpb0Zyb21BbW91bnRzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcIm1ha2VSYXRpb0Zyb21BbW91bnRzXCIsWyRozY9fYSA9PiAobWFrZVJhdGlvRnJvbUFtb3VudHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQcmljZUF1dGhvcml0eSwgUHJpY2VEZXNjcmlwdGlvbiwgUHJpY2VRdW90ZSwgUHJpY2VRdW90ZVZhbHVlLCBQcmljZVF1ZXJ5LH0gZnJvbSAnQGFnb3JpYy96b2UvdG9vbHMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7QW1vdW50fSBmcm9tICdAYWdvcmljL2VydHAnO1xuICogQGltcG9ydCB7QnJhbmR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtOYXRWYWx1ZX0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqL1xuLyoqIEBpbXBvcnQge0l0ZXJhdGlvbk9ic2VydmVyLCBQdWJsaXNoZXIsIFN0b3JlZFN1YnNjcmliZXIsIFN0b3JlZFN1YnNjcmlwdGlvbn0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7ICovXG4vKiogQGltcG9ydCB7QW1vdW50S2V5d29yZFJlY29yZCwgUHJvcG9zYWxSZWNvcmR9IGZyb20gJ0BhZ29yaWMvem9lJzsgKi9cblxuICAgICAgIGNvbnN0IGFtb3VudFBhdHRlcm4gPSBoYXJkZW4oeyBicmFuZDogTS5yZW1vdGFibGUoKSwgdmFsdWU6IE0uYW55KCkgfSk7JGjNj19vbmNlLmFtb3VudFBhdHRlcm4oYW1vdW50UGF0dGVybik7XG4gICAgICAgY29uc3QgcmF0aW9QYXR0ZXJuID0gaGFyZGVuKHtcbiAgbnVtZXJhdG9yOiBhbW91bnRQYXR0ZXJuLFxuICBkZW5vbWluYXRvcjogYW1vdW50UGF0dGVybixcbn0pO1xuXG4vKipcbiAqIEFwcGx5IGEgZGVsdGEgdG8gdGhlIGBiYXNlYCBBbW91bnQsIHdoZXJlIHRoZSBkZWx0YSBpcyByZXByZXNlbnRlZCBhcyBhblxuICogYW1vdW50IHRvIGdhaW4gYW5kIGFuIGFtb3VudCB0byBsb3NlLiBUeXBpY2FsbHkgb25lIG9mIHRob3NlIHdpbGwgYmUgZW1wdHlcbiAqIGJlY2F1c2UgZ2Fpbi9sb3NzIGNvbWVzIGZyb20gdGhlIGdpdmUvd2FudCBmb3IgYSBzcGVjaWZpYyBhc3NldCBvbiBhXG4gKiBwcm9wb3NhbC4gV2UgdXNlIHR3byBBbW91bnRzIGJlY2F1c2UgYW4gQW1vdW50IGNhbm5vdCByZXByZXNlbnQgYSBuZWdhdGl2ZVxuICogbnVtYmVyIChzbyB3ZSB1c2UgYSBcImxvc3NcIiB0aGF0IHdpbGwgYmUgc3VidHJhY3RlZCkuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QX0gYmFzZVxuICogQHBhcmFtIHtBfSBnYWluXG4gKiBAcGFyYW0ge0F9IGxvc3NcbiAqIEByZXR1cm5zIHtBfVxuICovJGjNj19vbmNlLnJhdGlvUGF0dGVybihyYXRpb1BhdHRlcm4pO1xuICAgICAgIGNvbnN0IGFkZFN1YnRyYWN0ID0gKGJhc2UsIGdhaW4sIGxvc3MpID0+XG4gIEFtb3VudE1hdGguc3VidHJhY3QoQW1vdW50TWF0aC5hZGQoYmFzZSwgZ2FpbiksIGxvc3MpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBUXG4gKiBAcGFyYW0ge1R9IGxlZnRcbiAqIEBwYXJhbSB7VH0gcmlnaHRcbiAqIEByZXR1cm5zIHtUfVxuICovJGjNj19vbmNlLmFkZFN1YnRyYWN0KGFkZFN1YnRyYWN0KTtcbiAgICAgICBjb25zdCBzdWJ0cmFjdFRvRW1wdHkgPSAobGVmdCwgcmlnaHQpID0+XG4gIEFtb3VudE1hdGguaXNHVEUocmlnaHQsIGxlZnQpXG4gICAgPyAvKiogQHR5cGUge1R9ICovIChBbW91bnRNYXRoLm1ha2VFbXB0eUZyb21BbW91bnQobGVmdCkpXG4gICAgOiAvKiogQHR5cGUge1R9ICovIChBbW91bnRNYXRoLnN1YnRyYWN0KGxlZnQsIHJpZ2h0KSk7XG5cbi8qKlxuICogVmVyaWZpZXMgdGhhdCBldmVyeSBrZXkgaW4gdGhlIHByb3Bvc2FsIGlzIGluIHRoZSBwcm92aWRlZCBsaXN0XG4gKlxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWxcbiAqIEBwYXJhbSB7c3RyaW5nW119IGtleXNcbiAqLyRozY9fb25jZS5zdWJ0cmFjdFRvRW1wdHkoc3VidHJhY3RUb0VtcHR5KTtcbiAgICAgICBjb25zdCBhc3NlcnRPbmx5S2V5cyA9IChwcm9wb3NhbCwga2V5cykgPT4ge1xuICAvKiogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBjbGF1c2UgKi9cbiAgY29uc3Qgb25seUtleXMgPSBjbGF1c2UgPT5cbiAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjbGF1c2UpLmV2ZXJ5KGMgPT4ga2V5cy5pbmNsdWRlcyhjKSk7XG4gIG9ubHlLZXlzKHByb3Bvc2FsLmdpdmUpIHx8IEZhaWxgZXh0cmFuZW91cyB0ZXJtcyBpbiBnaXZlOiAke3Byb3Bvc2FsLmdpdmV9YDtcbiAgb25seUtleXMocHJvcG9zYWwud2FudCkgfHwgRmFpbGBleHRyYW5lb3VzIHRlcm1zIGluIHdhbnQ6ICR7cHJvcG9zYWwud2FudH1gO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudFtdfSBhbW91bnRzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRozY9fb25jZS5hc3NlcnRPbmx5S2V5cyhhc3NlcnRPbmx5S2V5cyk7XG4gICAgICAgY29uc3QgYWxsRW1wdHkgPSBhbW91bnRzID0+IHtcbiAgcmV0dXJuIGFtb3VudHMuZXZlcnkoYSA9PiBBbW91bnRNYXRoLmlzRW1wdHkoYSkpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGRlYnRMaW1pdFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSB0b3RhbERlYnRcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gdG9NaW50XG4gKiBAdGhyb3dzIGlmIG1pbnRpbmcgd291bGQgZXhjZWVkIHRvdGFsIGRlYnRcbiAqXG4gKiAgIE5vdGU6IFN1Y2NlZWRzIHJlZ2FyZGxlc3Mgb2YgZGVidExpbWl0IGlmIHRvTWludCBpcyBlbXB0eS5cbiAqLyRozY9fb25jZS5hbGxFbXB0eShhbGxFbXB0eSk7XG4gICAgICAgY29uc3QgY2hlY2tEZWJ0TGltaXQgPSAoZGVidExpbWl0LCB0b3RhbERlYnQsIHRvTWludCkgPT4ge1xuICBpZiAoQW1vdW50TWF0aC5pc0VtcHR5KHRvTWludCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZGVidFBvc3QgPSBBbW91bnRNYXRoLmFkZCh0b3RhbERlYnQsIHRvTWludCk7XG4gIEFtb3VudE1hdGguaXNHVEUoZGVidExpbWl0LCBkZWJ0UG9zdCkgfHxcbiAgICBGYWlsYE1pbnRpbmcgJHtxKHRvTWludCl9IHBhc3QgJHtxKFxuICAgICAgdG90YWxEZWJ0LFxuICAgICl9IHdvdWxkIGhpdCB0b3RhbCBkZWJ0IGxpbWl0ICR7cShkZWJ0TGltaXQpfWA7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNZXRyaWNzUHVibGlzaGVyS2l0XG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBtZXRyaWNzUHVibGljYXRpb25cbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSBtZXRyaWNzU3Vic2NyaXB0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTWV0cmljc1B1Ymxpc2hLaXRcbiAqIEBwcm9wZXJ0eSB7UHVibGlzaGVyPFQ+fSBtZXRyaWNzUHVibGlzaGVyXG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmliZXI8VD59IG1ldHJpY3NTdWJzY3JpYmVyXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZCBtdXN0IGJlIGEgJ25hdCcgYnJhbmQsIG5vdCBjaGVja2VkXG4gKiBAcGFyYW0ge05hdFZhbHVlfSBbbWluXVxuICovJGjNj19vbmNlLmNoZWNrRGVidExpbWl0KGNoZWNrRGVidExpbWl0KTtcbiAgICAgICBjb25zdCBtYWtlTmF0QW1vdW50U2hhcGUgPSAoYnJhbmQsIG1pbikgPT5cbiAgaGFyZGVuKHsgYnJhbmQsIHZhbHVlOiBtaW4gPyBNLmd0ZShtaW4pIDogTS5uYXQoKSB9KTtcblxuLyoqIEBwYXJhbSB7UGljazxQcmljZURlc2NyaXB0aW9uLCAnYW1vdW50SW4nIHwgJ2Ftb3VudE91dCc+fSBxdW90ZUFtb3VudCAqLyRozY9fb25jZS5tYWtlTmF0QW1vdW50U2hhcGUobWFrZU5hdEFtb3VudFNoYXBlKTtcbiAgICAgICBjb25zdCBxdW90ZUFzUmF0aW8gPSBxdW90ZUFtb3VudCA9PlxuICBtYWtlUmF0aW9Gcm9tQW1vdW50cyhxdW90ZUFtb3VudC5hbW91bnRJbiwgcXVvdGVBbW91bnQuYW1vdW50T3V0KTskaM2PX29uY2UucXVvdGVBc1JhdGlvKHF1b3RlQXNSYXRpbyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhbW91bnRQYXR0ZXJuIjpbImFtb3VudFBhdHRlcm4iXSwicmF0aW9QYXR0ZXJuIjpbInJhdGlvUGF0dGVybiJdLCJhZGRTdWJ0cmFjdCI6WyJhZGRTdWJ0cmFjdCJdLCJzdWJ0cmFjdFRvRW1wdHkiOlsic3VidHJhY3RUb0VtcHR5Il0sImFzc2VydE9ubHlLZXlzIjpbImFzc2VydE9ubHlLZXlzIl0sImFsbEVtcHR5IjpbImFsbEVtcHR5Il0sImNoZWNrRGVidExpbWl0IjpbImNoZWNrRGVidExpbWl0Il0sIm1ha2VOYXRBbW91bnRTaGFwZSI6WyJtYWtlTmF0QW1vdW50U2hhcGUiXSwicXVvdGVBc1JhdGlvIjpbInF1b3RlQXNSYXRpbyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD6yQiTQgkAAEIJAAAzAAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9pbnRlcmVzdC1tYXRoLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanMiXSwiZXhwb3J0cyI6WyJjYWxjdWxhdGVDdXJyZW50RGVidCIsInJldmVyc2VJbnRlcmVzdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGRpdmlkZUJ5LG11bHRpcGx5QnksaW52ZXJ0UmF0aW8sbXVsdGlwbHlSYXRpb3MscmF0aW9zU2FtZTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanNcIiwgW1tcImRpdmlkZUJ5XCIsWyRozY9fYSA9PiAoZGl2aWRlQnkgPSAkaM2PX2EpXV0sW1wibXVsdGlwbHlCeVwiLFskaM2PX2EgPT4gKG11bHRpcGx5QnkgPSAkaM2PX2EpXV0sW1wiaW52ZXJ0UmF0aW9cIixbJGjNj19hID0+IChpbnZlcnRSYXRpbyA9ICRozY9fYSldXSxbXCJtdWx0aXBseVJhdGlvc1wiLFskaM2PX2EgPT4gKG11bHRpcGx5UmF0aW9zID0gJGjNj19hKV1dLFtcInJhdGlvc1NhbWVcIixbJGjNj19hID0+IChyYXRpb3NTYW1lID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7QW1vdW50LCBCcmFuZCwgUGF5bWVudH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge1JhdGlvfSBmcm9tICdAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzJztcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGN1cnJlbnRDb21wb3VuZGVkSW50ZXJlc3QgYXMgY29lZmZpY2llbnRcbiAqIEBwYXJhbSB7UmF0aW99IHByZXZpb3VzQ29tcG91bmRlZEludGVyZXN0IGFzIGNvZWZmaWNpZW50XG4gKiBAcmV0dXJucyB7UmF0aW99IGFkZGl0aW9uYWwgY29tcG91bmRpbmcgc2luY2UgdGhlIHByZXZpb3VzXG4gKi9cbmNvbnN0IGNhbGN1bGF0ZVJlbGF0aXZlQ29tcG91bmRpbmcgPSAoXG4gIGN1cnJlbnRDb21wb3VuZGVkSW50ZXJlc3QsXG4gIHByZXZpb3VzQ29tcG91bmRlZEludGVyZXN0LFxuKSA9PiB7XG4gIC8qIGRpdmlkZSBjb21wb3VuZGVkIGludGVyZXN0IGJ5IHRoZSBzbmFwc2hvdCovXG4gIHJldHVybiBtdWx0aXBseVJhdGlvcyhcbiAgICBjdXJyZW50Q29tcG91bmRlZEludGVyZXN0LFxuICAgIGludmVydFJhdGlvKHByZXZpb3VzQ29tcG91bmRlZEludGVyZXN0KSxcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBkZWJ0U25hcHNob3RcbiAqIEBwYXJhbSB7UmF0aW99IGludGVyZXN0U25hcHNob3QgYXMgY29lZmZpY2llbnRcbiAqIEBwYXJhbSB7UmF0aW99IGN1cnJlbnRDb21wb3VuZGVkSW50ZXJlc3QgYXMgY29lZmZpY2llbnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fVxuICovXG4gICAgICAgY29uc3QgY2FsY3VsYXRlQ3VycmVudERlYnQgPSAoXG4gIGRlYnRTbmFwc2hvdCxcbiAgaW50ZXJlc3RTbmFwc2hvdCxcbiAgY3VycmVudENvbXBvdW5kZWRJbnRlcmVzdCxcbikgPT4ge1xuICBpZiAocmF0aW9zU2FtZShpbnRlcmVzdFNuYXBzaG90LCBjdXJyZW50Q29tcG91bmRlZEludGVyZXN0KSkge1xuICAgIHJldHVybiBkZWJ0U25hcHNob3Q7XG4gIH1cblxuICBjb25zdCBpbnRlcmVzdFNpbmNlU25hcHNob3QgPSBjYWxjdWxhdGVSZWxhdGl2ZUNvbXBvdW5kaW5nKFxuICAgIGN1cnJlbnRDb21wb3VuZGVkSW50ZXJlc3QsXG4gICAgaW50ZXJlc3RTbmFwc2hvdCxcbiAgKTtcblxuICByZXR1cm4gbXVsdGlwbHlCeShkZWJ0U25hcHNob3QsIGludGVyZXN0U2luY2VTbmFwc2hvdCk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gZGVidFxuICogQHBhcmFtIHtSYXRpb30gaW50ZXJlc3RBcHBsaWVkXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqLyRozY9fb25jZS5jYWxjdWxhdGVDdXJyZW50RGVidChjYWxjdWxhdGVDdXJyZW50RGVidCk7XG4gICAgICAgY29uc3QgcmV2ZXJzZUludGVyZXN0ID0gKGRlYnQsIGludGVyZXN0QXBwbGllZCkgPT4ge1xuICByZXR1cm4gZGl2aWRlQnkoZGVidCwgaW50ZXJlc3RBcHBsaWVkKTtcbn07JGjNj19vbmNlLnJldmVyc2VJbnRlcmVzdChyZXZlcnNlSW50ZXJlc3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FsY3VsYXRlQ3VycmVudERlYnQiOlsiY2FsY3VsYXRlQ3VycmVudERlYnQiXSwicmV2ZXJzZUludGVyZXN0IjpbInJldmVyc2VJbnRlcmVzdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADBnnejKCEAACghAAAuAAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9pbnRlcmVzdC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qcyIsIkBhZ29yaWMvdGltZSJdLCJleHBvcnRzIjpbIlNFQ09ORFNfUEVSX1lFQVIiLCJjYWxjdWxhdGVDb21wb3VuZGVkSW50ZXJlc3QiLCJjaGFyZ2VJbnRlcmVzdCIsIm1ha2VJbnRlcmVzdENhbGN1bGF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEFtb3VudE1hdGgsbmF0U2FmZU1hdGgsbWFrZVJhdGlvLG11bHRpcGx5UmF0aW9zLHF1YW50aXplLFRpbWVNYXRoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzXCIsIFtbXCJuYXRTYWZlTWF0aFwiLFskaM2PX2EgPT4gKG5hdFNhZmVNYXRoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qc1wiLCBbW1wibWFrZVJhdGlvXCIsWyRozY9fYSA9PiAobWFrZVJhdGlvID0gJGjNj19hKV1dLFtcIm11bHRpcGx5UmF0aW9zXCIsWyRozY9fYSA9PiAobXVsdGlwbHlSYXRpb3MgPSAkaM2PX2EpXV0sW1wicXVhbnRpemVcIixbJGjNj19hID0+IChxdWFudGl6ZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZU1hdGhcIixbJGjNj19hID0+IChUaW1lTWF0aCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7VGltZXN0YW1wfSBmcm9tICdAYWdvcmljL3RpbWUnXG4gKiBAaW1wb3J0IHtSZWxhdGl2ZVRpbWV9IGZyb20gJ0BhZ29yaWMvdGltZSdcbiAqIEBpbXBvcnQge0FkbWluRmFjZXQsIEludml0YXRpb25BbW91bnQsIEtleXdvcmQsIFpDRk1pbnQsIFpDRlNlYXR9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0Fzc2V0S2luZCwgUmF0aW99IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtDYWxjdWxhdGUsIENhbGN1bGF0b3JLaXR9IGZyb20gJy4vdmF1bHRGYWN0b3J5L3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge01pbnRBbmRUcmFuc2Zlcn0gZnJvbSAnLi92YXVsdEZhY3RvcnkvdHlwZXMuanMnO1xuICogQGltcG9ydCB7TmF0VmFsdWV9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtBbW91bnR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKi9cblxuICAgICAgIGNvbnN0IFNFQ09ORFNfUEVSX1lFQVIgPSA2MG4gKiA2MG4gKiAyNG4gKiAzNjVuOyRozY9fb25jZS5TRUNPTkRTX1BFUl9ZRUFSKFNFQ09ORFNfUEVSX1lFQVIpO1xuY29uc3QgQkFTSVNfUE9JTlRTID0gMTAwMDA7XG4vKiBzaW5nbGUgZGlnaXQgQVBSIGlzIGxlc3MgdGhhbiBhIGJhc2lzIHBvaW50IHBlciBkYXkuKi9cbmNvbnN0IExBUkdFX0RFTk9NSU5BVE9SID0gQkFTSVNfUE9JTlRTICogQkFTSVNfUE9JTlRTO1xuXG4vKiogTnVtYmVyIGNob3NlbiBmcm9tIDYgZGlnaXRzIGZvciBhIGJhc2lzIHBvaW50LCBkb3VibGVkIGZvciBtdWx0aXBsaWNhdGlvbi4gKi9cbmNvbnN0IENPTVBPVU5ERURfSU5URVJFU1RfREVOT01JTkFUT1IgPSAxMG4gKiogMjBuO1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGFubnVhbFJhdGVcbiAqIEBwYXJhbSB7UmVsYXRpdmVUaW1lfSBjaGFyZ2luZ1BlcmlvZFxuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWV9IHJlY29yZGluZ1BlcmlvZFxuICogQHJldHVybnMge0NhbGN1bGF0b3JLaXR9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlSW50ZXJlc3RDYWxjdWxhdG9yID0gKFxuICBhbm51YWxSYXRlLFxuICBjaGFyZ2luZ1BlcmlvZCxcbiAgcmVjb3JkaW5nUGVyaW9kLFxuKSA9PiB7XG4gIC8qIHNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db21wb3VuZF9pbnRlcmVzdCNDb21wb3VuZGluZ19iYXNpcyovXG4gIGNvbnN0IG51bWVyYXRvclZhbHVlID0gTnVtYmVyKGFubnVhbFJhdGUubnVtZXJhdG9yLnZhbHVlKTtcbiAgY29uc3QgZGVub21pbmF0b3JWYWx1ZSA9IE51bWJlcihhbm51YWxSYXRlLmRlbm9taW5hdG9yLnZhbHVlKTtcblxuICBjb25zdCByYXdBbm51YWxSYXRlID0gbnVtZXJhdG9yVmFsdWUgLyBkZW5vbWluYXRvclZhbHVlO1xuICBjb25zdCBjaGFyZ2luZ0ZyZXF1ZW5jeSA9XG4gICAgTnVtYmVyKFRpbWVNYXRoLnJlbFZhbHVlKGNoYXJnaW5nUGVyaW9kKSkgLyBOdW1iZXIoU0VDT05EU19QRVJfWUVBUik7XG4gIGNvbnN0IHBlcmlvZGljUmF0ZSA9ICgxICsgcmF3QW5udWFsUmF0ZSkgKiogY2hhcmdpbmdGcmVxdWVuY3kgLSAxO1xuXG4gIGNvbnN0IHJhdGVQZXJDaGFyZ2luZ1BlcmlvZCA9IG1ha2VSYXRpbyhcbiAgICBCaWdJbnQoTWF0aC5mbG9vcihwZXJpb2RpY1JhdGUgKiBMQVJHRV9ERU5PTUlOQVRPUikpLFxuICAgIGFubnVhbFJhdGUubnVtZXJhdG9yLmJyYW5kLFxuICAgIEJpZ0ludChMQVJHRV9ERU5PTUlOQVRPUiksXG4gICk7XG5cbiAgLyoqXG4gKiBDYWxjdWxhdGUgbmV3IGRlYnQgZm9yIGNoYXJnaW5nIHBlcmlvZHMgdXAgdG8gdGhlIHByZXNlbnQuXG4gKlxuICogQHR5cGUge0NhbGN1bGF0ZX1cbiAqL1xuICBjb25zdCBjYWxjdWxhdGUgPSAoZGVidFN0YXR1cywgY3VycmVudFRpbWUpID0+IHtcbiAgICBjb25zdCB7IG5ld0RlYnQsIGxhdGVzdEludGVyZXN0VXBkYXRlIH0gPSBkZWJ0U3RhdHVzO1xuICAgIGxldCBuZXdSZWNlbnQgPSBsYXRlc3RJbnRlcmVzdFVwZGF0ZTtcbiAgICBsZXQgZ3Jvd2luZ0ludGVyZXN0ID0gZGVidFN0YXR1cy5pbnRlcmVzdDtcbiAgICBsZXQgZ3Jvd2luZ0RlYnQgPSBuZXdEZWJ0O1xuICAgIHdoaWxlIChcbiAgICAgIFRpbWVNYXRoLmNvbXBhcmVBYnMoXG4gICAgICAgIFRpbWVNYXRoLmFkZEFic1JlbChuZXdSZWNlbnQsIGNoYXJnaW5nUGVyaW9kKSxcbiAgICAgICAgY3VycmVudFRpbWUsXG4gICAgICApIDw9IDBcbiAgICApIHtcbiAgICAgIG5ld1JlY2VudCA9IFRpbWVNYXRoLmFkZEFic1JlbChuZXdSZWNlbnQsIGNoYXJnaW5nUGVyaW9kKTtcbiAgICAgIC8qIFRoZSBgY2VpbGAgaW1wbGllcyB0aGF0IGEgdmF1bHQgd2l0aCBhbnkgZGVidCB3aWxsIGFjY3J1ZSBhdCBsZWFzdCBvbmUqL1xuICAgICAgLyogdW5pdC4qL1xuICAgICAgY29uc3QgbmV3SW50ZXJlc3QgPSBuYXRTYWZlTWF0aC5jZWlsRGl2aWRlKFxuICAgICAgICBncm93aW5nRGVidCAqIHJhdGVQZXJDaGFyZ2luZ1BlcmlvZC5udW1lcmF0b3IudmFsdWUsXG4gICAgICAgIHJhdGVQZXJDaGFyZ2luZ1BlcmlvZC5kZW5vbWluYXRvci52YWx1ZSxcbiAgICAgICk7XG4gICAgICBncm93aW5nSW50ZXJlc3QgKz0gbmV3SW50ZXJlc3Q7XG4gICAgICBncm93aW5nRGVidCArPSBuZXdJbnRlcmVzdDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGxhdGVzdEludGVyZXN0VXBkYXRlOiBuZXdSZWNlbnQsXG4gICAgICBpbnRlcmVzdDogZ3Jvd2luZ0ludGVyZXN0LFxuICAgICAgbmV3RGVidDogZ3Jvd2luZ0RlYnQsXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAqIENhbGN1bGF0ZSBuZXcgZGVidCBmb3IgcmVwb3J0aW5nIHBlcmlvZHMgdXAgdG8gdGhlIHByZXNlbnQuIElmIHNvbWVcbiAqIGNoYXJnaW5nIHBlcmlvZHMgaGF2ZSBlbGFwc2VkIHRoYXQgZG9uJ3QgY29uc3RpdHV0ZSB3aG9sZSByZXBvcnRpbmdcbiAqIHBlcmlvZHMsIHRoZSB0aW1lIGlzIG5vdCB1cGRhdGVkIHBhc3QgdGhlbSBhbmQgaW50ZXJlc3QgaXMgbm90IGFjY3VtdWxhdGVkXG4gKiBmb3IgdGhlbS5cbiAqXG4gKiBAdHlwZSB7Q2FsY3VsYXRlfVxuICovXG4gIGNvbnN0IGNhbGN1bGF0ZVJlcG9ydGluZ1BlcmlvZCA9IChkZWJ0U3RhdHVzLCBjdXJyZW50VGltZSkgPT4ge1xuICAgIGNvbnN0IHsgbGF0ZXN0SW50ZXJlc3RVcGRhdGUgfSA9IGRlYnRTdGF0dXM7XG4gICAgY29uc3Qgb3ZlcnNob290ID0gVGltZU1hdGgubW9kUmVsUmVsKFxuICAgICAgVGltZU1hdGguc3VidHJhY3RBYnNBYnMoY3VycmVudFRpbWUsIGxhdGVzdEludGVyZXN0VXBkYXRlKSxcbiAgICAgIHJlY29yZGluZ1BlcmlvZCxcbiAgICApO1xuICAgIHJldHVybiBjYWxjdWxhdGUoXG4gICAgICBkZWJ0U3RhdHVzLFxuICAgICAgVGltZU1hdGguc3VidHJhY3RBYnNSZWwoY3VycmVudFRpbWUsIG92ZXJzaG9vdCksXG4gICAgKTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBjYWxjdWxhdGUsXG4gICAgY2FsY3VsYXRlUmVwb3J0aW5nUGVyaW9kLFxuICB9KTtcbn07XG5cbi8qKlxuICogY29tcG91bmRlZEludGVyZXN0ICo9IChuZXcgZGVidCkgLyAocHJpb3IgdG90YWwgZGVidClcbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSBwcmlvckNvbXBvdW5kZWRJbnRlcmVzdFxuICogQHBhcmFtIHtOYXRWYWx1ZX0gcHJpb3JEZWJ0XG4gKiBAcGFyYW0ge05hdFZhbHVlfSBuZXdEZWJ0XG4gKi8kaM2PX29uY2UubWFrZUludGVyZXN0Q2FsY3VsYXRvcihtYWtlSW50ZXJlc3RDYWxjdWxhdG9yKTtcbiAgICAgICBjb25zdCBjYWxjdWxhdGVDb21wb3VuZGVkSW50ZXJlc3QgPSAoXG4gIHByaW9yQ29tcG91bmRlZEludGVyZXN0LFxuICBwcmlvckRlYnQsXG4gIG5ld0RlYnQsXG4pID0+IHtcbiAgY29uc3QgYnJhbmQgPSBwcmlvckNvbXBvdW5kZWRJbnRlcmVzdC5udW1lcmF0b3IuYnJhbmQ7XG4gIGNvbnN0IGNvbXBvdW5kZWQgPSBtdWx0aXBseVJhdGlvcyhcbiAgICBwcmlvckNvbXBvdW5kZWRJbnRlcmVzdCxcbiAgICBtYWtlUmF0aW8obmV3RGVidCwgYnJhbmQsIHByaW9yRGVidCwgYnJhbmQpLFxuICApO1xuICByZXR1cm4gcXVhbnRpemUoY29tcG91bmRlZCwgQ09NUE9VTkRFRF9JTlRFUkVTVF9ERU5PTUlOQVRPUik7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge1pDRk1pbnQ8Sz59IG1pbnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBkZWJ0XG4gKi8kaM2PX29uY2UuY2FsY3VsYXRlQ29tcG91bmRlZEludGVyZXN0KGNhbGN1bGF0ZUNvbXBvdW5kZWRJbnRlcmVzdCk7XG5jb25zdCB2YWxpZGF0ZWRCcmFuZCA9IChtaW50LCBkZWJ0KSA9PiB7XG4gIGNvbnN0IHsgYnJhbmQ6IGRlYnRCcmFuZCB9ID0gZGVidDtcbiAgY29uc3QgeyBicmFuZDogaXNzdWVyQnJhbmQgfSA9IG1pbnQuZ2V0SXNzdWVyUmVjb3JkKCk7XG4gIGRlYnRCcmFuZCA9PT0gaXNzdWVyQnJhbmQgfHxcbiAgICBGYWlsYERlYnQgYW5kIGlzc3VlciBicmFuZHMgZGlmZmVyOiAke2RlYnRCcmFuZH0gIT0gJHtpc3N1ZXJCcmFuZH1gO1xuICByZXR1cm4gaXNzdWVyQnJhbmQ7XG59O1xuXG4vKipcbiAqIENoYXJnZSBpbnRlcmVzdCBhY2NydWVkIGJldHdlZW4gYGxhdGVzdEludGVyZXN0VXBkYXRlYCBhbmQgYGFjY3J1ZWRVbnRpbGAuXG4gKlxuICogQHBhcmFtIHt7XG4gKiAgIG1pbnQ6IFpDRk1pbnQ8J25hdCc+O1xuICogICBtaW50QW5kVHJhbnNmZXJXaXRoRmVlOiBNaW50QW5kVHJhbnNmZXI7XG4gKiAgIHBvb2xJbmNyZW1lbnRTZWF0OiBaQ0ZTZWF0O1xuICogICBzZWF0QWxsb2NhdGlvbktleXdvcmQ6IEtleXdvcmQ7XG4gKiB9fSBwb3dlcnNcbiAqIEBwYXJhbSB7e1xuICogICBpbnRlcmVzdFJhdGU6IFJhdGlvO1xuICogICBjaGFyZ2luZ1BlcmlvZDogUmVsYXRpdmVUaW1lO1xuICogICByZWNvcmRpbmdQZXJpb2Q6IFJlbGF0aXZlVGltZTtcbiAqIH19IHBhcmFtc1xuICogQHBhcmFtIHt7XG4gKiAgIGxhdGVzdEludGVyZXN0VXBkYXRlOiBUaW1lc3RhbXA7XG4gKiAgIGNvbXBvdW5kZWRJbnRlcmVzdDogUmF0aW87XG4gKiAgIHRvdGFsRGVidDogQW1vdW50PCduYXQnPjtcbiAqIH19IHByaW9yXG4gKiBAcGFyYW0ge1RpbWVzdGFtcH0gYWNjcnVlZFVudGlsXG4gKiBAcmV0dXJucyB7e1xuICogICBjb21wb3VuZGVkSW50ZXJlc3Q6IFJhdGlvO1xuICogICBsYXRlc3RJbnRlcmVzdFVwZGF0ZTogVGltZXN0YW1wO1xuICogICB0b3RhbERlYnQ6IEFtb3VudDwnbmF0Jz47XG4gKiB9fVxuICovXG4gICAgICAgY29uc3QgY2hhcmdlSW50ZXJlc3QgPSAocG93ZXJzLCBwYXJhbXMsIHByaW9yLCBhY2NydWVkVW50aWwpID0+IHtcbiAgY29uc3QgYnJhbmQgPSB2YWxpZGF0ZWRCcmFuZChwb3dlcnMubWludCwgcHJpb3IudG90YWxEZWJ0KTtcblxuICBjb25zdCBpbnRlcmVzdENhbGN1bGF0b3IgPSBtYWtlSW50ZXJlc3RDYWxjdWxhdG9yKFxuICAgIHBhcmFtcy5pbnRlcmVzdFJhdGUsXG4gICAgcGFyYW1zLmNoYXJnaW5nUGVyaW9kLFxuICAgIHBhcmFtcy5yZWNvcmRpbmdQZXJpb2QsXG4gICk7XG5cbiAgLyogY2FsY3VsYXRlIGRlbHRhIG9mIGFjY3J1ZWQgZGVidCovXG4gIGNvbnN0IGRlYnRTdGF0dXMgPSBpbnRlcmVzdENhbGN1bGF0b3IuY2FsY3VsYXRlUmVwb3J0aW5nUGVyaW9kKFxuICAgIHtcbiAgICAgIGxhdGVzdEludGVyZXN0VXBkYXRlOiBwcmlvci5sYXRlc3RJbnRlcmVzdFVwZGF0ZSxcbiAgICAgIG5ld0RlYnQ6IHByaW9yLnRvdGFsRGVidC52YWx1ZSxcbiAgICAgIGludGVyZXN0OiAwbiAgLyogWFhYIHRoaXMgaXMgYWx3YXlzIHplcm8sIGRvZXNuJ3QgbmVlZCB0byBiZSBhbiBvcHRpb24qL1xuICAgIH0sXG4gICAgYWNjcnVlZFVudGlsLFxuICApO1xuICBjb25zdCBpbnRlcmVzdEFjY3J1ZWQgPSBkZWJ0U3RhdHVzLmludGVyZXN0O1xuXG4gIC8qIGRvbmUgaWYgbm9uZSovXG4gIGlmIChpbnRlcmVzdEFjY3J1ZWQgPT09IDBuKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbXBvdW5kZWRJbnRlcmVzdDogcHJpb3IuY29tcG91bmRlZEludGVyZXN0LFxuICAgICAgbGF0ZXN0SW50ZXJlc3RVcGRhdGU6IGRlYnRTdGF0dXMubGF0ZXN0SW50ZXJlc3RVcGRhdGUsXG4gICAgICB0b3RhbERlYnQ6IHByaW9yLnRvdGFsRGVidCxcbiAgICB9O1xuICB9XG5cbiAgLyogTkI6IFRoaXMgbWV0aG9kIG9mIGluZmVycmluZyB0aGUgY29tcG91bmRlZCByYXRlIGZyb20gdGhlIHJhdGlvIG9mIGRlYnRzKi9cbiAgLyogYWNjcnVlZCBzdWZmZXJzIHNsaWdodGx5IGZyb20gdGhlIGludGVnZXIgbmF0dXJlIG9mIGRlYnRzLiBIb3dldmVyIGluKi9cbiAgLyogdGVzdGluZyB3aXRoIHNtYWxsIG51bWJlcnMgdGhlcmUncyA1IGRpZ2l0cyBvZiBwcmVjaXNpb24sIGFuZCB3aXRoIGxhcmdlKi9cbiAgLyogbnVtYmVycyB0aGUgcmF0aW9zIHRlbmQgdG93YXJkcyBhbXBsZSBwcmVjaXNpb24uKi9cbiAgLyogVE9ETyBhZG9wdCBiYW5rZXIncyByb3VuZGluZyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ1NzMqL1xuICBjb25zdCBjb21wb3VuZGVkSW50ZXJlc3QgPSBjYWxjdWxhdGVDb21wb3VuZGVkSW50ZXJlc3QoXG4gICAgcHJpb3IuY29tcG91bmRlZEludGVyZXN0LFxuICAgIHByaW9yLnRvdGFsRGVidC52YWx1ZSxcbiAgICBkZWJ0U3RhdHVzLm5ld0RlYnQsXG4gICk7XG5cbiAgLyogdG90YWxEZWJ0ICs9IGludGVyZXN0QWNjcnVlZCovXG4gIGNvbnN0IHRvdGFsRGVidCA9IEFtb3VudE1hdGguYWRkKFxuICAgIHByaW9yLnRvdGFsRGVidCxcbiAgICBBbW91bnRNYXRoLm1ha2UoYnJhbmQsIGludGVyZXN0QWNjcnVlZCksXG4gICk7XG5cbiAgLyogbWludCB0aGF0IG11Y2ggb2YgYnJhbmQgZm9yIHRoZSByZXdhcmQgcG9vbCovXG4gIGNvbnN0IHJld2FyZGVkID0gQW1vdW50TWF0aC5tYWtlKGJyYW5kLCBpbnRlcmVzdEFjY3J1ZWQpO1xuICBwb3dlcnMubWludEFuZFRyYW5zZmVyV2l0aEZlZShcbiAgICBwb3dlcnMucG9vbEluY3JlbWVudFNlYXQsXG4gICAgcmV3YXJkZWQsXG4gICAgcmV3YXJkZWQsXG4gICAgW10sXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wb3VuZGVkSW50ZXJlc3QsXG4gICAgbGF0ZXN0SW50ZXJlc3RVcGRhdGU6IGRlYnRTdGF0dXMubGF0ZXN0SW50ZXJlc3RVcGRhdGUsXG4gICAgdG90YWxEZWJ0LFxuICB9O1xufTskaM2PX29uY2UuY2hhcmdlSW50ZXJlc3QoY2hhcmdlSW50ZXJlc3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiU0VDT05EU19QRVJfWUVBUiI6WyJTRUNPTkRTX1BFUl9ZRUFSIl0sIm1ha2VJbnRlcmVzdENhbGN1bGF0b3IiOlsibWFrZUludGVyZXN0Q2FsY3VsYXRvciJdLCJjYWxjdWxhdGVDb21wb3VuZGVkSW50ZXJlc3QiOlsiY2FsY3VsYXRlQ29tcG91bmRlZEludGVyZXN0Il0sImNoYXJnZUludGVyZXN0IjpbImNoYXJnZUludGVyZXN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJpZlyLhEAAA4RAAADcAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ZhdWx0RmFjdG9yeS9tYXRoLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qcyIsIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanMiLCIuLi9hdWN0aW9uL3V0aWwuanMiLCIuLi9jb250cmFjdFN1cHBvcnQuanMiXSwiZXhwb3J0cyI6WyJjYWxjdWxhdGVEZWJ0Q29zdHMiLCJjYWxjdWxhdGVNaW5pbXVtQ29sbGF0ZXJhbGl6YXRpb24iLCJtYXhEZWJ0Rm9yVmF1bHQiLCJtaW5pbXVtUHJpY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRNYXRoLGdldEFtb3VudE91dCxhZGRSYXRpb3MsY2VpbE11bHRpcGx5QnksZmxvb3JEaXZpZGVCeSxyYXRpb0dURSxwcmljZUZyb20sYWRkU3VidHJhY3Q7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzXCIsIFtbXCJnZXRBbW91bnRPdXRcIixbJGjNj19hID0+IChnZXRBbW91bnRPdXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzXCIsIFtbXCJhZGRSYXRpb3NcIixbJGjNj19hID0+IChhZGRSYXRpb3MgPSAkaM2PX2EpXV0sW1wiY2VpbE11bHRpcGx5QnlcIixbJGjNj19hID0+IChjZWlsTXVsdGlwbHlCeSA9ICRozY9fYSldXSxbXCJmbG9vckRpdmlkZUJ5XCIsWyRozY9fYSA9PiAoZmxvb3JEaXZpZGVCeSA9ICRozY9fYSldXSxbXCJyYXRpb0dURVwiLFskaM2PX2EgPT4gKHJhdGlvR1RFID0gJGjNj19hKV1dXV0sW1wiLi4vYXVjdGlvbi91dGlsLmpzXCIsIFtbXCJwcmljZUZyb21cIixbJGjNj19hID0+IChwcmljZUZyb20gPSAkaM2PX2EpXV1dXSxbXCIuLi9jb250cmFjdFN1cHBvcnQuanNcIiwgW1tcImFkZFN1YnRyYWN0XCIsWyRozY9fYSA9PiAoYWRkU3VidHJhY3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UHJpY2VBdXRob3JpdHksIFByaWNlRGVzY3JpcHRpb24sIFByaWNlUXVvdGUsIFByaWNlUXVvdGVWYWx1ZSwgUHJpY2VRdWVyeSx9IGZyb20gJ0BhZ29yaWMvem9lL3Rvb2xzL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1JhdGlvfSBmcm9tICdAYWdvcmljL2VydHAnO1xuICogQGltcG9ydCB7QW1vdW50fSBmcm9tICdAYWdvcmljL2VydHAnO1xuICovXG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBtaW5pbXVtIGNvbGxhdGVyYWxpemF0aW9uIGdpdmVuIHRoZSBsaXF1aWRhdGlvbiBtYXJnaW4gYW5kIHRoZVxuICogXCJwYWRkaW5nXCIgZnJvbSB0aGF0IGxpcXVpZGF0aW9uIHRocmVzaG9sZC5cbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSBsaXF1aWRhdGlvbk1hcmdpblxuICogQHBhcmFtIHtSYXRpb30gbGlxdWlkYXRpb25QYWRkaW5nXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi9cbiAgICAgICBjb25zdCBjYWxjdWxhdGVNaW5pbXVtQ29sbGF0ZXJhbGl6YXRpb24gPSAoXG4gIGxpcXVpZGF0aW9uTWFyZ2luLFxuICBsaXF1aWRhdGlvblBhZGRpbmcsXG4pID0+IGFkZFJhdGlvcyhsaXF1aWRhdGlvbk1hcmdpbiwgbGlxdWlkYXRpb25QYWRkaW5nKTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGxlc3NlciBwcmljZSBvZiB0aGUgZ2l2ZW4gcXVvdGVzLlxuICpcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGVBXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGV9IFtxdW90ZUJdXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaM2PX29uY2UuY2FsY3VsYXRlTWluaW11bUNvbGxhdGVyYWxpemF0aW9uKGNhbGN1bGF0ZU1pbmltdW1Db2xsYXRlcmFsaXphdGlvbik7XG4gICAgICAgY29uc3QgbWluaW11bVByaWNlID0gKHF1b3RlQSwgcXVvdGVCKSA9PiB7XG4gIGNvbnN0IHByaWNlQSA9IHByaWNlRnJvbShxdW90ZUEpO1xuICBpZiAocXVvdGVCID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcHJpY2VBO1xuICB9XG4gIGNvbnN0IHByaWNlQiA9IHByaWNlRnJvbShxdW90ZUIpO1xuICBpZiAocmF0aW9HVEUocHJpY2VBLCBwcmljZUIpKSB7XG4gICAgcmV0dXJuIHByaWNlQjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcHJpY2VBO1xuICB9XG59OyRozY9fb25jZS5taW5pbXVtUHJpY2UobWluaW11bVByaWNlKTtcbmhhcmRlbihtaW5pbXVtUHJpY2UpO1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgbWF4aW11bSBkZWJ0IGFsbG93ZWQgYmFzZWQgb24gdGhlIHByaWNlIHF1b3RlIGFuZCB0aGUgbGVzc2VyIG9mXG4gKiB0aGUgYGxpcXVpZGF0aW9uTWFyZ2luYCBvciB0aGUgYGxpcXVpZGF0aW9uUGFkZGluZ2AuXG4gKlxuICogQHBhcmFtIHtQcmljZVF1b3RlfSBxdW90ZUFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gbGlxdWlkYXRpb25NYXJnaW5cbiAqIEBwYXJhbSB7UmF0aW99IGxpcXVpZGF0aW9uUGFkZGluZ1xuICogQHJldHVybnMge0Ftb3VudDwnbmF0Jz59XG4gKi9cbiAgICAgICBjb25zdCBtYXhEZWJ0Rm9yVmF1bHQgPSAoXG4gIHF1b3RlQW1vdW50LFxuICBsaXF1aWRhdGlvbk1hcmdpbixcbiAgbGlxdWlkYXRpb25QYWRkaW5nLFxuKSA9PiB7XG4gIGNvbnN0IGRlYnRCeVF1b3RlID0gZ2V0QW1vdW50T3V0KHF1b3RlQW1vdW50KTtcbiAgY29uc3QgbWluaW11bUNvbGxhdGVyYWxpemF0aW9uID0gY2FsY3VsYXRlTWluaW11bUNvbGxhdGVyYWxpemF0aW9uKFxuICAgIGxpcXVpZGF0aW9uTWFyZ2luLFxuICAgIGxpcXVpZGF0aW9uUGFkZGluZyxcbiAgKTtcbiAgLyogZmxvb3JEaXZpZGUgYmVjYXVzZSB3ZSB3YW50IHRoZSBkZWJ0IGNlaWxpbmcgbG93ZXIqL1xuICByZXR1cm4gZmxvb3JEaXZpZGVCeShkZWJ0QnlRdW90ZSwgbWluaW11bUNvbGxhdGVyYWxpemF0aW9uKTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBmZWUsIHRoZSBhbW91bnQgdG8gbWludCBhbmQgdGhlIHJlc3VsdGluZyBkZWJ0LiBUaGUgZ2l2ZSBhbmRcbiAqIHRoZSB3YW50IHRvZ2V0aGVyIHJlZmxlY3QgYSBkZWx0YSwgd2hlcmUgdHlwaWNhbGx5IG9uZSBpcyB6ZXJvIGJlY2F1c2UgdGhleVxuICogY29tZSBmcm9tIHRoZSBnYXZlL3dhbnQgb2YgYW4gb2ZmZXIgcHJvcG9zYWwuIElmIHRoZSBgd2FudGAgaXMgemVybywgdGhlXG4gKiBgZmVlYCB3aWxsIGFsc28gYmUgemVybywgc28gdGhlIHNpbXBsZSBtYXRoIHdvcmtzLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gY3VycmVudERlYnRcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gZ2l2ZSBleGNlc3Mgb2YgY3VycmVudERlYnQgaXMgcmV0dXJuZWQgaW4gJ3N1cnBsdXMnXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHdhbnRcbiAqIEBwYXJhbSB7UmF0aW99IGRlYnRGZWVcbiAqLyRozY9fb25jZS5tYXhEZWJ0Rm9yVmF1bHQobWF4RGVidEZvclZhdWx0KTtcbiAgICAgICBjb25zdCBjYWxjdWxhdGVEZWJ0Q29zdHMgPSAoY3VycmVudERlYnQsIGdpdmUsIHdhbnQsIGRlYnRGZWUpID0+IHtcbiAgY29uc3QgbWF4R2l2ZSA9IEFtb3VudE1hdGgubWluKGN1cnJlbnREZWJ0LCBnaXZlKTtcbiAgY29uc3Qgc3VycGx1cyA9IEFtb3VudE1hdGguc3VidHJhY3QoZ2l2ZSwgbWF4R2l2ZSk7XG4gIGNvbnN0IGZlZSA9IGNlaWxNdWx0aXBseUJ5KHdhbnQsIGRlYnRGZWUpO1xuICBjb25zdCB0b01pbnQgPSBBbW91bnRNYXRoLmFkZCh3YW50LCBmZWUpO1xuICBjb25zdCBuZXdEZWJ0ID0gYWRkU3VidHJhY3QoY3VycmVudERlYnQsIHRvTWludCwgbWF4R2l2ZSk7XG4gIHJldHVybiB7IG5ld0RlYnQsIHRvTWludCwgZmVlLCBzdXJwbHVzIH07XG59OyRozY9fb25jZS5jYWxjdWxhdGVEZWJ0Q29zdHMoY2FsY3VsYXRlRGVidENvc3RzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGN1bGF0ZU1pbmltdW1Db2xsYXRlcmFsaXphdGlvbiI6WyJjYWxjdWxhdGVNaW5pbXVtQ29sbGF0ZXJhbGl6YXRpb24iXSwibWluaW11bVByaWNlIjpbIm1pbmltdW1QcmljZSJdLCJtYXhEZWJ0Rm9yVmF1bHQiOlsibWF4RGVidEZvclZhdWx0Il0sImNhbGN1bGF0ZURlYnRDb3N0cyI6WyJjYWxjdWxhdGVEZWJ0Q29zdHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5449wuEIAADhCAAARAAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvdmF1bHRGYWN0b3J5L29yZGVyZWRWYXVsdFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4vc3RvcmVVdGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VPcmRlcmVkVmF1bHRTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGZyb21WYXVsdEtleSx0b1ZhdWx0S2V5OyRozY9faW1wb3J0cyhbW1wiLi9zdG9yZVV0aWxzLmpzXCIsIFtbXCJmcm9tVmF1bHRLZXlcIixbJGjNj19hID0+IChmcm9tVmF1bHRLZXkgPSAkaM2PX2EpXV0sW1widG9WYXVsdEtleVwiLFskaM2PX2EgPT4gKHRvVmF1bHRLZXkgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIFVzZWQgYnkgcHJpb3JpdGl6ZWRWYXVsdHMgdG8gd3JhcCB0aGUgQ29sbGVjdGlvbnMgQVBJIGZvciB0aGlzIHVzZSBjYXNlLlxuICpcbiAqIERlc2lnbmVkIHRvIGJlIHJlcGxhY2VhYmxlIGJ5IG5ha2VkIENvbGxlY3Rpb25zIEFQSSB3aGVuIGNvbXBvc2l0ZSBrZXlzIGFyZVxuICogYXZhaWxhYmxlLlxuICpcbiAqIEluIHRoaXMgbW9kdWxlIGRlYnRzIGFyZSBlbmNvZGVkIGFzIHRoZSBpbnZlcnNlIHF1b3RpZW50IChjb2xsYXRlcmFsIG92ZXJcbiAqIGRlYnQpIHNvIHRoYXQgZ3JlYXRlciBjb2xsYXRlcmFsaXphdGlvbiBzb3J0cyBhZnRlciBsb3dlci4gKEhpZ2hlclxuICogZGVidC10by1jb2xsYXRlcmFsIGNvbWUgZmlyc3QuKVxuICovXG5cbi8qKlxuICogQGltcG9ydCB7TWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICogQGltcG9ydCB7VmF1bHR9IGZyb20gJy4vdmF1bHQuanMnO1xuICovXG5cbi8qKiBAcGFyYW0ge01hcFN0b3JlPHN0cmluZywgVmF1bHQ+fSBzdG9yZSAqL1xuICAgICAgIGNvbnN0IG1ha2VPcmRlcmVkVmF1bHRTdG9yZSA9IHN0b3JlID0+IHtcbiAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdmF1bHRJZFxuICogQHBhcmFtIHtWYXVsdH0gdmF1bHRcbiAqL1xuICBjb25zdCBhZGRWYXVsdCA9ICh2YXVsdElkLCB2YXVsdCkgPT4ge1xuICAgIGNvbnN0IGRlYnQgPSB2YXVsdC5nZXROb3JtYWxpemVkRGVidCgpO1xuICAgIGNvbnN0IGNvbGxhdGVyYWwgPSB2YXVsdC5nZXRDb2xsYXRlcmFsQW1vdW50KCk7XG4gICAgY29uc3Qga2V5ID0gdG9WYXVsdEtleShkZWJ0LCBjb2xsYXRlcmFsLCB2YXVsdElkKTtcbiAgICBzdG9yZS5pbml0KGtleSwgdmF1bHQpO1xuICAgIHJldHVybiBrZXk7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJucyB7VmF1bHR9XG4gKi9cbiAgY29uc3QgcmVtb3ZlQnlLZXkgPSBrZXkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB2YXVsdCA9IHN0b3JlLmdldChrZXkpO1xuICAgICAgYXNzZXJ0KHZhdWx0KTtcbiAgICAgIHN0b3JlLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIHZhdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdyZW1vdmVCeUtleSBmYWlsZWQgdG8gcmVtb3ZlJyxcbiAgICAgICAga2V5LFxuICAgICAgICAnW3JhdGlvLCB2YXVsdElkXTonLFxuICAgICAgICBmcm9tVmF1bHRLZXkoa2V5KSxcbiAgICAgICk7XG4gICAgICBjb25zdCBrZXlzID0gQXJyYXkuZnJvbShzdG9yZS5rZXlzKCkpO1xuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgJyAgY29udGVudHM6JyxcbiAgICAgICAga2V5cy5tYXAoayA9PiBbaywgZnJvbVZhdWx0S2V5W2tdXSksXG4gICAgICApO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgYWRkVmF1bHQsXG4gICAgcmVtb3ZlQnlLZXksXG4gICAgaGFzOiBzdG9yZS5oYXMsXG4gICAga2V5czogc3RvcmUua2V5cyxcbiAgICBlbnRyaWVzOiBzdG9yZS5lbnRyaWVzLFxuICAgIGdldFNpemU6IHN0b3JlLmdldFNpemUsXG4gICAgdmFsdWVzOiBzdG9yZS52YWx1ZXMsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZU9yZGVyZWRWYXVsdFN0b3JlKG1ha2VPcmRlcmVkVmF1bHRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlT3JkZXJlZFZhdWx0U3RvcmUiOlsibWFrZU9yZGVyZWRWYXVsdFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACjEjL06LQAAOi0AADkAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ZhdWx0RmFjdG9yeS9wYXJhbXMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9nb3Zlcm5hbmNlIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3RpbWUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qcyIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2luZGV4LmpzIiwiLi4vY29udHJhY3RTdXBwb3J0LmpzIl0sImV4cG9ydHMiOlsiQ0hBUkdJTkdfUEVSSU9EX0tFWSIsIkRFQlRfTElNSVRfS0VZIiwiSU5URVJFU1RfUkFURV9LRVkiLCJMSVFVSURBVElPTl9NQVJHSU5fS0VZIiwiTElRVUlEQVRJT05fUEFERElOR19LRVkiLCJMSVFVSURBVElPTl9QRU5BTFRZX0tFWSIsIk1JTlRfRkVFX0tFWSIsIk1JTl9JTklUSUFMX0RFQlRfS0VZIiwiUkVDT1JESU5HX1BFUklPRF9LRVkiLCJSRUZFUkVOQ0VEX1VJX0tFWSIsIlNIT1JURkFMTF9JTlZJVEFUSU9OX0tFWSIsIm1ha2VHb3Zlcm5lZFRlcm1zIiwibWFrZVZhdWx0UGFyYW1NYW5hZ2VyIiwicHJvdmlkZVZhdWx0UGFyYW1NYW5hZ2VycyIsInZhdWx0RGlyZWN0b3JQYXJhbVR5cGVzIiwidmF1bHRQYXJhbVBhdHRlcm4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBDT05UUkFDVF9FTEVDVE9SQVRFLG1ha2VQYXJhbU1hbmFnZXJTeW5jLFBhcmFtVHlwZXMsbWFrZVN0b3JlZFB1Ymxpc2hlcktpdCxNLG1ha2VTY2FsYXJNYXBTdG9yZSxUaW1lTWF0aCxwcm92aWRlRHVyYWJsZU1hcFN0b3JlLHN1YnRyYWN0UmF0aW9zLG1ha2VUcmFjZXIsYW1vdW50UGF0dGVybixyYXRpb1BhdHRlcm47JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2dvdmVybmFuY2VcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIixbJGjNj19hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjNj19hKV1dLFtcIm1ha2VQYXJhbU1hbmFnZXJTeW5jXCIsWyRozY9fYSA9PiAobWFrZVBhcmFtTWFuYWdlclN5bmMgPSAkaM2PX2EpXV0sW1wiUGFyYW1UeXBlc1wiLFskaM2PX2EgPT4gKFBhcmFtVHlwZXMgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0XCIsWyRozY9fYSA9PiAobWFrZVN0b3JlZFB1Ymxpc2hlcktpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZU1hdGhcIixbJGjNj19hID0+IChUaW1lTWF0aCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByb3ZpZGVEdXJhYmxlTWFwU3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qc1wiLCBbW1wic3VidHJhY3RSYXRpb3NcIixbJGjNj19hID0+IChzdWJ0cmFjdFJhdGlvcyA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2luZGV4LmpzXCIsIFtbXCJtYWtlVHJhY2VyXCIsWyRozY9fYSA9PiAobWFrZVRyYWNlciA9ICRozY9fYSldXV1dLFtcIi4uL2NvbnRyYWN0U3VwcG9ydC5qc1wiLCBbW1wiYW1vdW50UGF0dGVyblwiLFskaM2PX2EgPT4gKGFtb3VudFBhdHRlcm4gPSAkaM2PX2EpXV0sW1wicmF0aW9QYXR0ZXJuXCIsWyRozY9fYSA9PiAocmF0aW9QYXR0ZXJuID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVtb3RlLCBSZW1vdGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7RU1hcnNoYWxsZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzJztcbiAqIEBpbXBvcnQge01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqIEBpbXBvcnQge1ByaWNlQXV0aG9yaXR5fSBmcm9tICdAYWdvcmljL3pvZS90b29scy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtQYXJhbVR5cGVzTWFwRnJvbVJlY29yZH0gZnJvbSAnQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnO1xuICogQGltcG9ydCB7U3RvcmVkUHVibGlzaGVyS2l0fSBmcm9tICdAYWdvcmljL25vdGlmaWVyJztcbiAqIEBpbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSAnQGFnb3JpYy90aW1lJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnO1xuICogQGltcG9ydCB7QW1vdW50LCBCcmFuZCwgUmF0aW99IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtBc3NldFJlc2VydmVQdWJsaWNGYWNldH0gZnJvbSAnLi4vcmVzZXJ2ZS9hc3NldFJlc2VydmUuanMnO1xuICogQGltcG9ydCB7SW50ZXJlc3RUaW1pbmcsIFZhdWx0TWFuYWdlclBhcmFtVmFsdWVzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0dvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZX0gZnJvbSAnQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtTdG9yYWdlTm9kZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuICAgICAgIGNvbnN0IENIQVJHSU5HX1BFUklPRF9LRVkgPSAnQ2hhcmdpbmdQZXJpb2QnOyRozY9fb25jZS5DSEFSR0lOR19QRVJJT0RfS0VZKENIQVJHSU5HX1BFUklPRF9LRVkpO1xuICAgICAgIGNvbnN0IFJFQ09SRElOR19QRVJJT0RfS0VZID0gJ1JlY29yZGluZ1BlcmlvZCc7JGjNj19vbmNlLlJFQ09SRElOR19QRVJJT0RfS0VZKFJFQ09SRElOR19QRVJJT0RfS0VZKTtcblxuICAgICAgIGNvbnN0IERFQlRfTElNSVRfS0VZID0gJ0RlYnRMaW1pdCc7JGjNj19vbmNlLkRFQlRfTElNSVRfS0VZKERFQlRfTElNSVRfS0VZKTtcbiAgICAgICBjb25zdCBMSVFVSURBVElPTl9NQVJHSU5fS0VZID0gJ0xpcXVpZGF0aW9uTWFyZ2luJzskaM2PX29uY2UuTElRVUlEQVRJT05fTUFSR0lOX0tFWShMSVFVSURBVElPTl9NQVJHSU5fS0VZKTtcbiAgICAgICBjb25zdCBMSVFVSURBVElPTl9QQURESU5HX0tFWSA9ICdMaXF1aWRhdGlvblBhZGRpbmcnOyRozY9fb25jZS5MSVFVSURBVElPTl9QQURESU5HX0tFWShMSVFVSURBVElPTl9QQURESU5HX0tFWSk7XG4gICAgICAgY29uc3QgTElRVUlEQVRJT05fUEVOQUxUWV9LRVkgPSAnTGlxdWlkYXRpb25QZW5hbHR5JzskaM2PX29uY2UuTElRVUlEQVRJT05fUEVOQUxUWV9LRVkoTElRVUlEQVRJT05fUEVOQUxUWV9LRVkpO1xuICAgICAgIGNvbnN0IElOVEVSRVNUX1JBVEVfS0VZID0gJ0ludGVyZXN0UmF0ZSc7JGjNj19vbmNlLklOVEVSRVNUX1JBVEVfS0VZKElOVEVSRVNUX1JBVEVfS0VZKTtcbiAgICAgICBjb25zdCBNSU5UX0ZFRV9LRVkgPSAnTWludEZlZSc7JGjNj19vbmNlLk1JTlRfRkVFX0tFWShNSU5UX0ZFRV9LRVkpO1xuICAgICAgIGNvbnN0IE1JTl9JTklUSUFMX0RFQlRfS0VZID0gJ01pbkluaXRpYWxEZWJ0JzskaM2PX29uY2UuTUlOX0lOSVRJQUxfREVCVF9LRVkoTUlOX0lOSVRJQUxfREVCVF9LRVkpO1xuICAgICAgIGNvbnN0IFNIT1JURkFMTF9JTlZJVEFUSU9OX0tFWSA9ICdTaG9ydGZhbGxJbnZpdGF0aW9uJzskaM2PX29uY2UuU0hPUlRGQUxMX0lOVklUQVRJT05fS0VZKFNIT1JURkFMTF9JTlZJVEFUSU9OX0tFWSk7XG4gICAgICAgY29uc3QgUkVGRVJFTkNFRF9VSV9LRVkgPSAnUmVmZXJlbmNlZFVJJzskaM2PX29uY2UuUkVGRVJFTkNFRF9VSV9LRVkoUkVGRVJFTkNFRF9VSV9LRVkpO1xuXG4gICAgICAgY29uc3QgdmF1bHREaXJlY3RvclBhcmFtVHlwZXMgPSB7XG4gIFtNSU5fSU5JVElBTF9ERUJUX0tFWV06IFBhcmFtVHlwZXMuQU1PVU5ULFxuICBbQ0hBUkdJTkdfUEVSSU9EX0tFWV06IFBhcmFtVHlwZXMuTkFULFxuICBbUkVDT1JESU5HX1BFUklPRF9LRVldOiBQYXJhbVR5cGVzLk5BVCxcbiAgW1JFRkVSRU5DRURfVUlfS0VZXTogUGFyYW1UeXBlcy5TVFJJTkcsXG59OyRozY9fb25jZS52YXVsdERpcmVjdG9yUGFyYW1UeXBlcyh2YXVsdERpcmVjdG9yUGFyYW1UeXBlcyk7XG5oYXJkZW4odmF1bHREaXJlY3RvclBhcmFtVHlwZXMpO1xuXG5jb25zdCB0cmFjZSA9IG1ha2VUcmFjZXIoJ1ZhdWx0IFBhcmFtcycpO1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50PCdzZXQnPn0gZWxlY3RvcmF0ZUludml0YXRpb25BbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gbWluSW5pdGlhbERlYnRcbiAqIEBwYXJhbSB7QW1vdW50PCdzZXQnPn0gc2hvcnRmYWxsSW52aXRhdGlvbkFtb3VudFxuICogQHBhcmFtIHtzdHJpbmd9IHJlZmVyZW5jZWRVaVxuICogQHBhcmFtIHtJbnRlcmVzdFRpbWluZ30gaW50ZXJlc3RUaW1pbmdcbiAqL1xuY29uc3QgbWFrZVZhdWx0RGlyZWN0b3JQYXJhbXMgPSAoXG4gIGVsZWN0b3JhdGVJbnZpdGF0aW9uQW1vdW50LFxuICBtaW5Jbml0aWFsRGVidCxcbiAgc2hvcnRmYWxsSW52aXRhdGlvbkFtb3VudCxcbiAgcmVmZXJlbmNlZFVpLFxuICBpbnRlcmVzdFRpbWluZyxcbikgPT4ge1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbQ09OVFJBQ1RfRUxFQ1RPUkFURV06IHtcbiAgICAgIHR5cGU6IFBhcmFtVHlwZXMuSU5WSVRBVElPTixcbiAgICAgIHZhbHVlOiBlbGVjdG9yYXRlSW52aXRhdGlvbkFtb3VudCxcbiAgICB9LFxuICAgIFtNSU5fSU5JVElBTF9ERUJUX0tFWV06IHtcbiAgICAgIHR5cGU6IFBhcmFtVHlwZXMuQU1PVU5ULFxuICAgICAgdmFsdWU6IG1pbkluaXRpYWxEZWJ0LFxuICAgIH0sXG4gICAgW1NIT1JURkFMTF9JTlZJVEFUSU9OX0tFWV06IHtcbiAgICAgIHR5cGU6IFBhcmFtVHlwZXMuSU5WSVRBVElPTixcbiAgICAgIHZhbHVlOiBzaG9ydGZhbGxJbnZpdGF0aW9uQW1vdW50LFxuICAgIH0sXG4gICAgW1JFRkVSRU5DRURfVUlfS0VZXTogeyB0eXBlOiBQYXJhbVR5cGVzLlNUUklORywgdmFsdWU6IHJlZmVyZW5jZWRVaSB9LFxuICAgIFtDSEFSR0lOR19QRVJJT0RfS0VZXToge1xuICAgICAgdHlwZTogUGFyYW1UeXBlcy5OQVQsXG4gICAgICB2YWx1ZTogVGltZU1hdGgucmVsVmFsdWUoaW50ZXJlc3RUaW1pbmcuY2hhcmdpbmdQZXJpb2QpLFxuICAgIH0sXG4gICAgW1JFQ09SRElOR19QRVJJT0RfS0VZXToge1xuICAgICAgdHlwZTogUGFyYW1UeXBlcy5OQVQsXG4gICAgICB2YWx1ZTogVGltZU1hdGgucmVsVmFsdWUoaW50ZXJlc3RUaW1pbmcucmVjb3JkaW5nUGVyaW9kKSxcbiAgICB9LFxuICB9KTtcbn07XG5oYXJkZW4obWFrZVZhdWx0RGlyZWN0b3JQYXJhbXMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXJhbVR5cGVzTWFwRnJvbVJlY29yZDxcbiAqICAgUmV0dXJuVHlwZTx0eXBlb2YgbWFrZVZhdWx0RGlyZWN0b3JQYXJhbXM+XG4gKiA+fSBWYXVsdERpcmVjdG9yUGFyYW1zXG4gKi9cblxuLyoqXG4gKiBAdHlwZSB7KGxpcXVpZGF0aW9uTWFyZ2luOiBSYXRpbykgPT4gUmF0aW99XG4gKi9cbmNvbnN0IHplcm9SYXRpbyA9IGxpcXVpZGF0aW9uTWFyZ2luID0+XG4gIHN1YnRyYWN0UmF0aW9zKGxpcXVpZGF0aW9uTWFyZ2luLCBsaXF1aWRhdGlvbk1hcmdpbik7XG5cbi8qKlxuICogQHBhcmFtIHtTdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gcHVibGlzaGVyS2l0XG4gKiBAcGFyYW0ge1ZhdWx0TWFuYWdlclBhcmFtVmFsdWVzfSBpbml0aWFsXG4gKi9cbiAgICAgICBjb25zdCBtYWtlVmF1bHRQYXJhbU1hbmFnZXIgPSAoXG4gIHB1Ymxpc2hlcktpdCxcbiAge1xuICAgIGRlYnRMaW1pdCxcbiAgICBpbnRlcmVzdFJhdGUsXG4gICAgbGlxdWlkYXRpb25NYXJnaW4sXG4gICAgbGlxdWlkYXRpb25QYWRkaW5nID0gemVyb1JhdGlvKGxpcXVpZGF0aW9uTWFyZ2luKSxcbiAgICBsaXF1aWRhdGlvblBlbmFsdHksXG4gICAgbWludEZlZSxcbiAgfSxcbikgPT5cbiAgbWFrZVBhcmFtTWFuYWdlclN5bmMocHVibGlzaGVyS2l0LCB7XG4gICAgW0RFQlRfTElNSVRfS0VZXTogW1BhcmFtVHlwZXMuQU1PVU5ULCBkZWJ0TGltaXRdLFxuICAgIFtJTlRFUkVTVF9SQVRFX0tFWV06IFtQYXJhbVR5cGVzLlJBVElPLCBpbnRlcmVzdFJhdGVdLFxuICAgIFtMSVFVSURBVElPTl9QQURESU5HX0tFWV06IFtQYXJhbVR5cGVzLlJBVElPLCBsaXF1aWRhdGlvblBhZGRpbmddLFxuICAgIFtMSVFVSURBVElPTl9NQVJHSU5fS0VZXTogW1BhcmFtVHlwZXMuUkFUSU8sIGxpcXVpZGF0aW9uTWFyZ2luXSxcbiAgICBbTElRVUlEQVRJT05fUEVOQUxUWV9LRVldOiBbUGFyYW1UeXBlcy5SQVRJTywgbGlxdWlkYXRpb25QZW5hbHR5XSxcbiAgICBbTUlOVF9GRUVfS0VZXTogW1BhcmFtVHlwZXMuUkFUSU8sIG1pbnRGZWVdLFxuICB9KTtcbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgbWFrZVZhdWx0UGFyYW1NYW5hZ2VyPn0gVmF1bHRQYXJhbU1hbmFnZXIgKi8kaM2PX29uY2UubWFrZVZhdWx0UGFyYW1NYW5hZ2VyKG1ha2VWYXVsdFBhcmFtTWFuYWdlcik7XG5cbiAgICAgICBjb25zdCB2YXVsdFBhcmFtUGF0dGVybiA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBsaXF1aWRhdGlvbk1hcmdpbjogcmF0aW9QYXR0ZXJuLFxuICAgIGxpcXVpZGF0aW9uUGVuYWx0eTogcmF0aW9QYXR0ZXJuLFxuICAgIGludGVyZXN0UmF0ZTogcmF0aW9QYXR0ZXJuLFxuICAgIG1pbnRGZWU6IHJhdGlvUGF0dGVybixcbiAgICBkZWJ0TGltaXQ6IGFtb3VudFBhdHRlcm4sXG4gIH0sXG4gIHtcbiAgICAvKiBvcHRpb25hbCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGUuZy4gd2l0aCBsb2FkZ2VuKi9cbiAgICBsaXF1aWRhdGlvblBhZGRpbmc6IHJhdGlvUGF0dGVybixcbiAgfSxcbik7XG5cbi8qKlxuICogQHBhcmFtIHt7XG4gKiAgIGVsZWN0b3JhdGVJbnZpdGF0aW9uQW1vdW50OiBBbW91bnQ8J3NldCc+O1xuICogICBtaW5Jbml0aWFsRGVidDogQW1vdW50PCduYXQnPjtcbiAqICAgYm9vdHN0cmFwUGF5bWVudFZhbHVlOiBiaWdpbnQ7XG4gKiAgIHByaWNlQXV0aG9yaXR5OiBFUmVmPFByaWNlQXV0aG9yaXR5PjtcbiAqICAgdGltZXI6IEVSZWY8VGltZXJTZXJ2aWNlPjtcbiAqICAgcmVzZXJ2ZVB1YmxpY0ZhY2V0OiBBc3NldFJlc2VydmVQdWJsaWNGYWNldDtcbiAqICAgaW50ZXJlc3RUaW1pbmc6IEludGVyZXN0VGltaW5nO1xuICogICBzaG9ydGZhbGxJbnZpdGF0aW9uQW1vdW50OiBBbW91bnQ8J3NldCc+O1xuICogICByZWZlcmVuY2VkVWk/OiBzdHJpbmc7XG4gKiB9fSBvcHRzXG4gKi8kaM2PX29uY2UudmF1bHRQYXJhbVBhdHRlcm4odmF1bHRQYXJhbVBhdHRlcm4pO1xuICAgICAgIGNvbnN0IG1ha2VHb3Zlcm5lZFRlcm1zID0gKHtcbiAgYm9vdHN0cmFwUGF5bWVudFZhbHVlLFxuICBlbGVjdG9yYXRlSW52aXRhdGlvbkFtb3VudCxcbiAgaW50ZXJlc3RUaW1pbmcsXG4gIG1pbkluaXRpYWxEZWJ0LFxuICBwcmljZUF1dGhvcml0eSxcbiAgcmVzZXJ2ZVB1YmxpY0ZhY2V0LFxuICB0aW1lcixcbiAgc2hvcnRmYWxsSW52aXRhdGlvbkFtb3VudCxcbiAgcmVmZXJlbmNlZFVpID0gJ05PIFJFRkVSRU5DRScsXG59KSA9PiB7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHByaWNlQXV0aG9yaXR5LFxuICAgIHJlc2VydmVQdWJsaWNGYWNldCxcbiAgICB0aW1lclNlcnZpY2U6IHRpbWVyLFxuICAgIGdvdmVybmVkUGFyYW1zOiBtYWtlVmF1bHREaXJlY3RvclBhcmFtcyhcbiAgICAgIGVsZWN0b3JhdGVJbnZpdGF0aW9uQW1vdW50LFxuICAgICAgbWluSW5pdGlhbERlYnQsXG4gICAgICBzaG9ydGZhbGxJbnZpdGF0aW9uQW1vdW50LFxuICAgICAgcmVmZXJlbmNlZFVpLFxuICAgICAgaW50ZXJlc3RUaW1pbmcsXG4gICAgKSxcbiAgICBib290c3RyYXBQYXltZW50VmFsdWUsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUdvdmVybmVkVGVybXMobWFrZUdvdmVybmVkVGVybXMpO1xuaGFyZGVuKG1ha2VHb3Zlcm5lZFRlcm1zKTtcblxuLyoqIEB0eXBlZGVmIHtWYXVsdE1hbmFnZXJQYXJhbVZhbHVlcyAmIHsgYnJhbmQ6IEJyYW5kIH19IFZhdWx0TWFuYWdlclBhcmFtT3ZlcnJpZGVzICovXG5cbi8qKlxuICogU3RvcC1nYXAgd2hpY2ggcmVzdG9yZXMgaW5pdGlhbCBwYXJhbSB2YWx1ZXMgVU5USUxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNTIwMFxuICpcbiAqIE5COiBjaGFuZ2VzIGZyb20gaW5pdGlhbCB2YWx1ZXMgd2lsbCBiZSBsb3N0IHVwb24gcmVzdGFydFxuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBWYXVsdE1hbmFnZXJQYXJhbU92ZXJyaWRlcz59IG1hbmFnZXJQYXJhbU92ZXJyaWRlc1xuICovXG4gICAgICAgY29uc3QgcHJvdmlkZVZhdWx0UGFyYW1NYW5hZ2VycyA9IChcbiAgYmFnZ2FnZSxcbiAgbWFyc2hhbGxlcixcbiAgbWFuYWdlclBhcmFtT3ZlcnJpZGVzLFxuKSA9PiB7XG4gIC8qKiBAdHlwZSB7TWFwU3RvcmU8QnJhbmQsIFZhdWx0UGFyYW1NYW5hZ2VyPn0gKi9cbiAgY29uc3QgbWFuYWdlcnMgPSBtYWtlU2NhbGFyTWFwU3RvcmUoKTtcblxuICAvKiB0aGUgbWFuYWdlcnMgYXJlbid0IGR1cmFibGUgYnV0IHRoZWlyIGFyZ3VtZW50cyBhcmUqL1xuICAvKipcbiAqIEB0eXBlIHtNYXBTdG9yZTxcbiAqICAgQnJhbmQsXG4gKiAgIHtcbiAqICAgICBzdG9yYWdlTm9kZTogUmVtb3RlPFN0b3JhZ2VOb2RlPjtcbiAqICAgICBpbml0aWFsUGFyYW1WYWx1ZXM6IFZhdWx0TWFuYWdlclBhcmFtVmFsdWVzO1xuICogICB9XG4gKiA+fVxuICovXG4gIGNvbnN0IG1hbmFnZXJBcmdzID0gcHJvdmlkZUR1cmFibGVNYXBTdG9yZShcbiAgICBiYWdnYWdlLFxuICAgICd2YXVsdCBwYXJhbSBtYW5hZ2VyIHBhcnRzJyxcbiAgKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICogQHBhcmFtIHtSZW1vdGU8U3RvcmFnZU5vZGU+fSBhcmdzLnN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge1ZhdWx0TWFuYWdlclBhcmFtVmFsdWVzfSBhcmdzLmluaXRpYWxQYXJhbVZhbHVlc1xuICovXG4gIGNvbnN0IG1ha2VNYW5hZ2VyID0gKGJyYW5kLCB7IHN0b3JhZ2VOb2RlLCBpbml0aWFsUGFyYW1WYWx1ZXMgfSkgPT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBtYWtlVmF1bHRQYXJhbU1hbmFnZXIoXG4gICAgICBtYWtlU3RvcmVkUHVibGlzaGVyS2l0KHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyLCAnZ292ZXJuYW5jZScpLFxuICAgICAgaW5pdGlhbFBhcmFtVmFsdWVzLFxuICAgICk7XG4gICAgbWFuYWdlcnMuaW5pdChicmFuZCwgbWFuYWdlcik7XG4gICAgcmV0dXJuIG1hbmFnZXI7XG4gIH07XG5cbiAgLyogcmVzdG9yZSBmcm9tIGJhZ2dhZ2UsIHVubGVzcyBgbWFuYWdlclBhcmFtT3ZlcnJpZGVzYCBvdmVycmlkZXMuKi9cbiAgZm9yIChjb25zdCBbYnJhbmQsIGFyZ3NdIG9mIG1hbmFnZXJBcmdzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IG5ld0luaXRpYWwgPSBtYW5hZ2VyUGFyYW1PdmVycmlkZXNcbiAgICAgID8gT2JqZWN0LnZhbHVlcyhtYW5hZ2VyUGFyYW1PdmVycmlkZXMpLmZpbmQoZSA9PiBlLmJyYW5kID09PSBicmFuZClcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKG5ld0luaXRpYWwpIHtcbiAgICAgIHRyYWNlKGByZXZpdmluZyBwYXJhbXMsIG92ZXJyaWRlYCwgYnJhbmQsIG5ld0luaXRpYWwpO1xuICAgICAgbWFrZU1hbmFnZXIoYnJhbmQsIHsgLi4uYXJncywgaW5pdGlhbFBhcmFtVmFsdWVzOiBuZXdJbml0aWFsIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cmFjZShgcmV2aXZpbmcgcGFyYW1zLCBrZWVwaW5nYCwgYnJhbmQsIGFyZ3MuaW5pdGlhbFBhcmFtVmFsdWVzKTtcbiAgICAgIG1ha2VNYW5hZ2VyKGJyYW5kLCBhcmdzKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC8qKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7UmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7VmF1bHRNYW5hZ2VyUGFyYW1WYWx1ZXN9IGluaXRpYWxQYXJhbVZhbHVlc1xuICovXG4gICAgYWRkUGFyYW1NYW5hZ2VyKGJyYW5kLCBzdG9yYWdlTm9kZSwgaW5pdGlhbFBhcmFtVmFsdWVzKSB7XG4gICAgICBjb25zdCBhcmdzID0gaGFyZGVuKHsgc3RvcmFnZU5vZGUsIGluaXRpYWxQYXJhbVZhbHVlcyB9KTtcbiAgICAgIG1hbmFnZXJBcmdzLmluaXQoYnJhbmQsIGFyZ3MpO1xuICAgICAgcmV0dXJuIG1ha2VNYW5hZ2VyKGJyYW5kLCBhcmdzKTtcbiAgICB9LFxuICAgIC8qKiBAcGFyYW0ge0JyYW5kfSBicmFuZCAqL1xuICAgIGdldChicmFuZCkge1xuICAgICAgcmV0dXJuIG1hbmFnZXJzLmdldChicmFuZCk7XG4gICAgfSxcbiAgfTtcbn07JGjNj19vbmNlLnByb3ZpZGVWYXVsdFBhcmFtTWFuYWdlcnMocHJvdmlkZVZhdWx0UGFyYW1NYW5hZ2Vycyk7XG5oYXJkZW4ocHJvdmlkZVZhdWx0UGFyYW1NYW5hZ2Vycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDSEFSR0lOR19QRVJJT0RfS0VZIjpbIkNIQVJHSU5HX1BFUklPRF9LRVkiXSwiUkVDT1JESU5HX1BFUklPRF9LRVkiOlsiUkVDT1JESU5HX1BFUklPRF9LRVkiXSwiREVCVF9MSU1JVF9LRVkiOlsiREVCVF9MSU1JVF9LRVkiXSwiTElRVUlEQVRJT05fTUFSR0lOX0tFWSI6WyJMSVFVSURBVElPTl9NQVJHSU5fS0VZIl0sIkxJUVVJREFUSU9OX1BBRERJTkdfS0VZIjpbIkxJUVVJREFUSU9OX1BBRERJTkdfS0VZIl0sIkxJUVVJREFUSU9OX1BFTkFMVFlfS0VZIjpbIkxJUVVJREFUSU9OX1BFTkFMVFlfS0VZIl0sIklOVEVSRVNUX1JBVEVfS0VZIjpbIklOVEVSRVNUX1JBVEVfS0VZIl0sIk1JTlRfRkVFX0tFWSI6WyJNSU5UX0ZFRV9LRVkiXSwiTUlOX0lOSVRJQUxfREVCVF9LRVkiOlsiTUlOX0lOSVRJQUxfREVCVF9LRVkiXSwiU0hPUlRGQUxMX0lOVklUQVRJT05fS0VZIjpbIlNIT1JURkFMTF9JTlZJVEFUSU9OX0tFWSJdLCJSRUZFUkVOQ0VEX1VJX0tFWSI6WyJSRUZFUkVOQ0VEX1VJX0tFWSJdLCJ2YXVsdERpcmVjdG9yUGFyYW1UeXBlcyI6WyJ2YXVsdERpcmVjdG9yUGFyYW1UeXBlcyJdLCJtYWtlVmF1bHRQYXJhbU1hbmFnZXIiOlsibWFrZVZhdWx0UGFyYW1NYW5hZ2VyIl0sInZhdWx0UGFyYW1QYXR0ZXJuIjpbInZhdWx0UGFyYW1QYXR0ZXJuIl0sIm1ha2VHb3Zlcm5lZFRlcm1zIjpbIm1ha2VHb3Zlcm5lZFRlcm1zIl0sInByb3ZpZGVWYXVsdFBhcmFtTWFuYWdlcnMiOlsicHJvdmlkZVZhdWx0UGFyYW1NYW5hZ2VycyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAnA0SaGBYAABgWAABEAAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy92YXVsdEZhY3RvcnkvcHJpb3JpdGl6ZWRWYXVsdHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiLCJAYWdvcmljL2VydHAiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvc3RvcmUiLCIuL29yZGVyZWRWYXVsdFN0b3JlLmpzIiwiLi9zdG9yZVV0aWxzLmpzIl0sImV4cG9ydHMiOlsiY3VycmVudERlYnRUb0NvbGxhdGVyYWwiLCJtYWtlUHJpb3JpdGl6ZWRWYXVsdHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlVHJhY2VyLG1ha2VSYXRpb0Zyb21BbW91bnRzLEFtb3VudE1hdGgsRmFyLE0sbWFrZVNjYWxhck1hcFN0b3JlLG1ha2VPcmRlcmVkVmF1bHRTdG9yZSx0b1ZhdWx0S2V5LG5vcm1hbGl6ZWRDb2xsUmF0aW9LZXksbm9ybWFsaXplZENvbGxSYXRpbzskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wibWFrZVJhdGlvRnJvbUFtb3VudHNcIixbJGjNj19hID0+IChtYWtlUmF0aW9Gcm9tQW1vdW50cyA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIi4vb3JkZXJlZFZhdWx0U3RvcmUuanNcIiwgW1tcIm1ha2VPcmRlcmVkVmF1bHRTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VPcmRlcmVkVmF1bHRTdG9yZSA9ICRozY9fYSldXV1dLFtcIi4vc3RvcmVVdGlscy5qc1wiLCBbW1widG9WYXVsdEtleVwiLFskaM2PX2EgPT4gKHRvVmF1bHRLZXkgPSAkaM2PX2EpXV0sW1wibm9ybWFsaXplZENvbGxSYXRpb0tleVwiLFskaM2PX2EgPT4gKG5vcm1hbGl6ZWRDb2xsUmF0aW9LZXkgPSAkaM2PX2EpXV0sW1wibm9ybWFsaXplZENvbGxSYXRpb1wiLFskaM2PX2EgPT4gKG5vcm1hbGl6ZWRDb2xsUmF0aW8gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7TWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICogQGltcG9ydCB7VmF1bHR9IGZyb20gJy4vdmF1bHQuanMnO1xuICogQGltcG9ydCB7Tm9ybWFsaXplZERlYnR9IGZyb20gJy4vc3RvcmVVdGlscy5qcyc7XG4gKiBAaW1wb3J0IHtSYXRpb30gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge1ZhdWx0SWR9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7QW1vdW50fSBmcm9tICdAYWdvcmljL2VydHAnO1xuICovXG5cbmNvbnN0IHRyYWNlID0gbWFrZVRyYWNlcignUFZhdWx0cycsIHRydWUpO1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gZGVidEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBjb2xsYXRlcmFsQW1vdW50XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi9cbmNvbnN0IGNhbGN1bGF0ZURlYnRUb0NvbGxhdGVyYWwgPSAoZGVidEFtb3VudCwgY29sbGF0ZXJhbEFtb3VudCkgPT4ge1xuICBpZiAoQW1vdW50TWF0aC5pc0VtcHR5KGNvbGxhdGVyYWxBbW91bnQpKSB7XG4gICAgcmV0dXJuIG1ha2VSYXRpb0Zyb21BbW91bnRzKFxuICAgICAgZGVidEFtb3VudCxcbiAgICAgIEFtb3VudE1hdGgubWFrZShjb2xsYXRlcmFsQW1vdW50LmJyYW5kLCAxbiksXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbWFrZVJhdGlvRnJvbUFtb3VudHMoZGVidEFtb3VudCwgY29sbGF0ZXJhbEFtb3VudCk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7VmF1bHR9IHZhdWx0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi9cbiAgICAgICBjb25zdCBjdXJyZW50RGVidFRvQ29sbGF0ZXJhbCA9IHZhdWx0ID0+XG4gIGNhbGN1bGF0ZURlYnRUb0NvbGxhdGVyYWwoXG4gICAgdmF1bHQuZ2V0Q3VycmVudERlYnQoKSxcbiAgICB2YXVsdC5nZXRDb2xsYXRlcmFsQW1vdW50KCksXG4gICk7XG5cbi8qKlxuICogVmF1bHRzLCBvcmRlcmVkIGJ5IHRoZWlyIGRlYnQgcmF0aW8gc28gdGhhdCBhbGwgdGhlIHZhdWx0cyBiZWxvdyBhIHRocmVzaG9sZFxuICogY2FuIGJlIHF1aWNrbHkgZm91bmQgYW5kIGxpcXVpZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtNYXBTdG9yZTxzdHJpbmcsIFZhdWx0Pn0gc3RvcmUgdmF1bHQgaGFzIGEgaGlnaGVyIGRlYnQgcmF0aW8gdGhhbiB0aGVcbiAqICAgcHJldmlvdXMgaGlnaGVzdFxuICovJGjNj19vbmNlLmN1cnJlbnREZWJ0VG9Db2xsYXRlcmFsKGN1cnJlbnREZWJ0VG9Db2xsYXRlcmFsKTtcbiAgICAgICBjb25zdCBtYWtlUHJpb3JpdGl6ZWRWYXVsdHMgPSBzdG9yZSA9PiB7XG4gIGNvbnN0IHZhdWx0cyA9IG1ha2VPcmRlcmVkVmF1bHRTdG9yZShzdG9yZSk7XG5cbiAgLyoqXG4gKiBSYXRpbyBvZiB0aGUgbGVhc3QtY29sbGF0ZXJhbGl6ZWQgdmF1bHQsIGlmIHRoZXJlIGlzIG9uZS5cbiAqXG4gKiBAcmV0dXJucyB7UmF0aW8gfCB1bmRlZmluZWR9IGFjdHVhbCBkZWJ0IG92ZXIgY29sbGF0ZXJhbFxuICovXG4gIGNvbnN0IGhpZ2hlc3RSYXRpbyA9ICgpID0+IHtcbiAgICBpZiAodmF1bHRzLmdldFNpemUoKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgLyogR2V0IHRoZSBmaXJzdCB2YXVsdC4qL1xuICAgIGNvbnN0IFt2YXVsdF0gPSB2YXVsdHMudmFsdWVzKCk7XG4gICAgYXNzZXJ0KFxuICAgICAgIUFtb3VudE1hdGguaXNFbXB0eSh2YXVsdC5nZXRDb2xsYXRlcmFsQW1vdW50KCkpLFxuICAgICAgJ0ZpcnN0IHZhdWx0IGhhZCBubyBjb2xsYXRlcmFsJyxcbiAgICApO1xuICAgIHJldHVybiBjdXJyZW50RGVidFRvQ29sbGF0ZXJhbCh2YXVsdCk7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge05vcm1hbGl6ZWREZWJ0fSBvbGREZWJ0XG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IG9sZENvbGxhdGVyYWxcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YXVsdElkXG4gKi9cbiAgY29uc3QgaGFzVmF1bHRCeUF0dHJpYnV0ZXMgPSAob2xkRGVidCwgb2xkQ29sbGF0ZXJhbCwgdmF1bHRJZCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IHRvVmF1bHRLZXkob2xkRGVidCwgb2xkQ29sbGF0ZXJhbCwgdmF1bHRJZCk7XG4gICAgcmV0dXJuIHZhdWx0cy5oYXMoa2V5KTtcbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtWYXVsdH1cbiAqL1xuICBjb25zdCByZW1vdmVWYXVsdCA9IGtleSA9PiB7XG4gICAgY29uc3QgdmF1bHQgPSB2YXVsdHMucmVtb3ZlQnlLZXkoa2V5KTtcbiAgICByZXR1cm4gdmF1bHQ7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge05vcm1hbGl6ZWREZWJ0fSBvbGREZWJ0XG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IG9sZENvbGxhdGVyYWxcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YXVsdElkXG4gKi9cbiAgY29uc3QgcmVtb3ZlVmF1bHRCeUF0dHJpYnV0ZXMgPSAob2xkRGVidCwgb2xkQ29sbGF0ZXJhbCwgdmF1bHRJZCkgPT4ge1xuICAgIGNvbnN0IGtleSA9IHRvVmF1bHRLZXkob2xkRGVidCwgb2xkQ29sbGF0ZXJhbCwgdmF1bHRJZCk7XG4gICAgcmV0dXJuIHJlbW92ZVZhdWx0KGtleSk7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1ZhdWx0SWR9IHZhdWx0SWRcbiAqIEBwYXJhbSB7VmF1bHR9IHZhdWx0XG4gKi9cbiAgY29uc3QgYWRkVmF1bHQgPSAodmF1bHRJZCwgdmF1bHQpID0+IHtcbiAgICBjb25zdCBrZXkgPSB2YXVsdHMuYWRkVmF1bHQodmF1bHRJZCwgdmF1bHQpO1xuICAgIGFzc2VydChcbiAgICAgICFBbW91bnRNYXRoLmlzRW1wdHkodmF1bHQuZ2V0Q29sbGF0ZXJhbEFtb3VudCgpKSxcbiAgICAgICdUcmFja2VkIHZhdWx0cyBtdXN0IGhhdmUgY29sbGF0ZXJhbCAoYmUgbGlxdWlkYXRhYmxlKScsXG4gICAgKTtcbiAgICByZXR1cm4ga2V5O1xuICB9O1xuXG4gIGNvbnN0IHJlbW92ZVZhdWx0c0JlbG93ID0gKHsgbWFyZ2luLCBxdW90ZSwgaW50ZXJlc3QgfSkgPT4ge1xuICAgIC8qIGNyS2V5IHJlcHJlc2VudHMgYSBjb2xsYXRlcmFsaXphdGlvblJhdGlvIGJhc2VkIG9uIHRoZSBsb2NrZWQgcHJpY2UsIHRoZSovXG4gICAgLyogaW50ZXJlc3QgY2hhcmdlZCBzbyBmYXIsIGFuZCB0aGUgbGlxdWlkYXRpb24gbWFyZ2luLiovXG4gICAgLyogV2UnbGwgcmVtb3ZlIGFsbCB2YXVsdHMgYmVsb3cgdGhhdCByYXRpbywgYW5kIHJldHVybiB0aGVtLiovXG4gICAgY29uc3QgY3JLZXkgPSBub3JtYWxpemVkQ29sbFJhdGlvS2V5KHF1b3RlLCBpbnRlcmVzdCwgbWFyZ2luKTtcblxuICAgIHRyYWNlKFxuICAgICAgYExpcXVpZGF0aW5nIHZhdWx0cyB3b3JzZSB0aGFuYCxcbiAgICAgIG5vcm1hbGl6ZWRDb2xsUmF0aW8ocXVvdGUsIGludGVyZXN0LCBtYXJnaW4pLFxuICAgICk7XG5cbiAgICAvKiogQHR5cGUge01hcFN0b3JlPHN0cmluZywgVmF1bHQ+fSAqL1xuICAgIGNvbnN0IHZhdWx0c1JlbW92ZWQgPSBtYWtlU2NhbGFyTWFwU3RvcmUoKTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmF1bHRdIG9mIHZhdWx0cy5lbnRyaWVzKE0ubHRlKGNyS2V5KSkpIHtcbiAgICAgIHZhdWx0c1JlbW92ZWQuaW5pdChrZXksIHZhdWx0KTtcbiAgICAgIHZhdWx0cy5yZW1vdmVCeUtleShrZXkpO1xuICAgIH1cblxuICAgIHJldHVybiB2YXVsdHNSZW1vdmVkO1xuICB9O1xuXG4gIHJldHVybiBGYXIoJ1ByaW9yaXRpemVkVmF1bHRzJywge1xuICAgIGFkZFZhdWx0LFxuICAgIGVudHJpZXM6IHZhdWx0cy5lbnRyaWVzLFxuICAgIGdldENvdW50OiB2YXVsdHMuZ2V0U2l6ZSxcbiAgICBoYXNWYXVsdEJ5QXR0cmlidXRlcyxcbiAgICBoaWdoZXN0UmF0aW8sXG4gICAgcmVtb3ZlVmF1bHQsXG4gICAgcmVtb3ZlVmF1bHRCeUF0dHJpYnV0ZXMsXG4gICAgcmVtb3ZlVmF1bHRzQmVsb3csXG5cbiAgICAvKiB2aXNpYmxlIGZvciB0ZXN0aW5nKi9cbiAgICBjb3VudFZhdWx0c0JlbG93OiBjcktleSA9PiB2YXVsdHMuZ2V0U2l6ZShNLmx0ZShjcktleSkpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VQcmlvcml0aXplZFZhdWx0cyhtYWtlUHJpb3JpdGl6ZWRWYXVsdHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY3VycmVudERlYnRUb0NvbGxhdGVyYWwiOlsiY3VycmVudERlYnRUb0NvbGxhdGVyYWwiXSwibWFrZVByaW9yaXRpemVkVmF1bHRzIjpbIm1ha2VQcmlvcml0aXplZFZhdWx0cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABuUYAQMRkAADEZAAA9AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy92YXVsdEZhY3Rvcnkvc3RvcmVVdGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiXSwiZXhwb3J0cyI6WyJkZWNvZGVEYXRhIiwiZW5jb2RlRGF0YSIsImZyb21WYXVsdEtleSIsIm5vcm1hbGl6ZWRDb2xsUmF0aW8iLCJub3JtYWxpemVkQ29sbFJhdGlvS2V5IiwidG9WYXVsdEtleSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VEZWNvZGVQYXNzYWJsZSxtYWtlRW5jb2RlUGFzc2FibGUsZ2V0QW1vdW50SW4sZ2V0QW1vdW50T3V0LG5hdFNhZmVNYXRoLG1ha2VUcmFjZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlRGVjb2RlUGFzc2FibGVcIixbJGjNj19hID0+IChtYWtlRGVjb2RlUGFzc2FibGUgPSAkaM2PX2EpXV0sW1wibWFrZUVuY29kZVBhc3NhYmxlXCIsWyRozY9fYSA9PiAobWFrZUVuY29kZVBhc3NhYmxlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wiZ2V0QW1vdW50SW5cIixbJGjNj19hID0+IChnZXRBbW91bnRJbiA9ICRozY9fYSldXSxbXCJnZXRBbW91bnRPdXRcIixbJGjNj19hID0+IChnZXRBbW91bnRPdXQgPSAkaM2PX2EpXV0sW1wibmF0U2FmZU1hdGhcIixbJGjNj19hID0+IChuYXRTYWZlTWF0aCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBtdWx0aXBseSB9ID0gbmF0U2FmZU1hdGg7XG5cbmNvbnN0IHRyYWNlID0gbWFrZVRyYWNlcignU3RvcmUnLCB0cnVlKTtcblxuLyoqIEBpbXBvcnQge1B1cmVEYXRhfSBmcm9tICdAZW5kby9tYXJzaGFsJyAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbbm9ybWFsaXplZENvbGxhdGVyYWxpemF0aW9uOiBudW1iZXIsIHZhdWx0SWQ6IFZhdWx0SWRdfSBDb21wb3NpdGVLZXlcbiAqL1xuXG4vKiBgbWFrZUVuY29kZVBhc3NhYmxlYCBoYXMgdGhyZWUgbmFtZWQgb3B0aW9uczoqL1xuLyogYGVuY29kZVJlbW90YWJsZWAsIGBlbmNvZGVFcnJvcmAsIGFuZCBgZW5jb2RlUHJvbWlzZWAuKi9cbi8qIFRob3NlIHdoaWNoIGFyZSBvbWl0dGVkIGRlZmF1bHQgdG8gYSBmdW5jdGlvbiB0aGF0IGFsd2F5cyB0aHJvd3MuKi9cbi8qIFNvIGJ5IG9taXR0aW5nIGFsbCB0aHJlZSwgd2Uga25vdyB0aGF0Ki9cbi8qIHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gd2lsbCBlbmNvZGUgb25seSBgUHVyZURhdGFgIGFyZ3VtZW50cy4qL1xuLyoqXG4gKiBAcGFyYW0ge1B1cmVEYXRhfSBrZXlcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbiAgICAgICBjb25zdCBlbmNvZGVEYXRhID0gbWFrZUVuY29kZVBhc3NhYmxlKCk7XG5cbi8qIGBtYWtlRGVjb2RlUGFzc2FibGVgIGhhcyB0aHJlZSBuYW1lZCBvcHRpb25zOiovXG4vKiBgZGVjb2RlUmVtb3RhYmxlYCwgYGRlY29kZUVycm9yYCwgYW5kIGBkZWNvZGVQcm9taXNlYC4qL1xuLyogVGhvc2Ugd2hpY2ggYXJlIG9taXR0ZWQgZGVmYXVsdCB0byBhIGZ1bmN0aW9uIHRoYXQgYWx3YXlzIHRocm93cy4qL1xuLyogU28gYnkgb21pdHRpbmcgYWxsIHRocmVlLCB3ZSBrbm93IHRoYXQqL1xuLyogdGhlIHJlc3VsdGluZyBmdW5jdGlvbiB3aWxsIGRlY29kZSBvbmx5IHRvIGBQdXJlRGF0YWAgcmVzdWx0cy4qL1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge1B1cmVEYXRhfVxuICovJGjNj19vbmNlLmVuY29kZURhdGEoZW5jb2RlRGF0YSk7XG4gICAgICAgY29uc3QgZGVjb2RlRGF0YSA9IG1ha2VEZWNvZGVQYXNzYWJsZSgpO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovJGjNj19vbmNlLmRlY29kZURhdGEoZGVjb2RlRGF0YSk7XG5jb25zdCBlbmNvZGVOdW1iZXIgPSBuID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihuLCAnbnVtYmVyJyk7XG4gIHJldHVybiBlbmNvZGVEYXRhKG4pO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlTnVtYmVyID0gZW5jb2RlZCA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGRlY29kZURhdGEoZW5jb2RlZCk7XG4gIGFzc2VydC50eXBlb2YocmVzdWx0LCAnbnVtYmVyJyk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKiBUeXBlIGFubm90YXRpb25zIHRvIHN1cHBvcnQgc3RhdGljIHRlc3Rpbmcgb2YgYW1vdW50IHZhbHVlcyovXG4vKiogQHR5cGVkZWYge0Ftb3VudDwnbmF0Jz4gJiB7IG5vcm1hbGl6ZWQ6IHRydWUgfX0gTm9ybWFsaXplZERlYnQgKi9cbi8qKiBAdHlwZWRlZiB7QW1vdW50PCduYXQnPiAmIHsgbm9ybWFsaXplZDogZmFsc2UgfX0gQWN0dWFsRGVidCAqL1xuXG4vKipcbiAqIE92ZXJjb2xsYXRlcmFsaXplZCBhcmUgZ3JlYXRlciB0aGFuIG9uZS4gVGhlIG1vcmUgdW5kZXJjb2xsYXRlcml6ZWQgdGhlXG4gKiBzbWFsbGVyIGluIFswLTFdLlxuICpcbiAqIEBwYXJhbSB7Tm9ybWFsaXplZERlYnR9IG5vcm1hbGl6ZWREZWJ0IG5vcm1hbGl6ZWQgKG5vdCBhY3R1YWwpIHRvdGFsIGRlYnRcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gY29sbGF0ZXJhbFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgY29sbGF0ZXJhbGl6YXRpb25SYXRpbyA9IChub3JtYWxpemVkRGVidCwgY29sbGF0ZXJhbCkgPT4ge1xuICBjb25zdCBjID0gTnVtYmVyKGNvbGxhdGVyYWwudmFsdWUpO1xuICBjb25zdCBkID0gbm9ybWFsaXplZERlYnQudmFsdWVcbiAgICA/IE51bWJlcihub3JtYWxpemVkRGVidC52YWx1ZSlcbiAgICA6IE51bWJlci5FUFNJTE9OO1xuICByZXR1cm4gYyAvIGQ7XG59O1xuXG4vKipcbiAqIFNvcnRzIGJ5IHJhdGlvIGluIGRlc2NlbmRpbmcgZGVidC4gT3JkZXJpbmcgb2YgdmF1bHQgaWQgaXMgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7Tm9ybWFsaXplZERlYnR9IG5vcm1hbGl6ZWREZWJ0IG5vcm1hbGl6ZWQgKG5vdCBhY3R1YWwpIHRvdGFsIGRlYnRcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gY29sbGF0ZXJhbFxuICogQHBhcmFtIHtWYXVsdElkfSB2YXVsdElkXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBsZXhpY2FsbHkgc29ydGFibGUgc3RyaW5nIGluIHdoaWNoIGhpZ2hlc3RcbiAqICAgZGVidC10by1jb2xsYXRlcmFsIGlzIGVhcmxpZXN0XG4gKi9cbiAgICAgICBjb25zdCB0b1ZhdWx0S2V5ID0gKG5vcm1hbGl6ZWREZWJ0LCBjb2xsYXRlcmFsLCB2YXVsdElkKSA9PiB7XG4gIGFzc2VydChub3JtYWxpemVkRGVidCk7XG4gIGFzc2VydChjb2xsYXRlcmFsKTtcbiAgYXNzZXJ0KHZhdWx0SWQpO1xuICAvKiB1bnRpbCBEQiBzdXBwb3J0cyBjb21wb3NpdGUga2V5cywgY29weSBpdHMgbWV0aG9kIGZvciB0dXJuaW5nIG51bWJlcnMgdG8gREIqL1xuICAvKiBlbnRyeSBrZXlzKi9cbiAgY29uc3QgbnVtYmVyUGFydCA9IGVuY29kZU51bWJlcihcbiAgICBjb2xsYXRlcmFsaXphdGlvblJhdGlvKG5vcm1hbGl6ZWREZWJ0LCBjb2xsYXRlcmFsKSxcbiAgKTtcblxuICB0cmFjZShgVG8gVmF1bHQgS2V5IGAsIGNvbGxhdGVyYWxpemF0aW9uUmF0aW8obm9ybWFsaXplZERlYnQsIGNvbGxhdGVyYWwpKTtcbiAgcmV0dXJuIGAke251bWJlclBhcnR9OiR7dmF1bHRJZH1gO1xufTskaM2PX29uY2UudG9WYXVsdEtleSh0b1ZhdWx0S2V5KTtcbmhhcmRlbih0b1ZhdWx0S2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJucyB7W25vcm1hbGl6ZWRDb2xsYXRlcmFsaXphdGlvbjogbnVtYmVyLCB2YXVsdElkOiBWYXVsdElkXX1cbiAqL1xuICAgICAgIGNvbnN0IGZyb21WYXVsdEtleSA9IGtleSA9PiB7XG4gIGNvbnN0IFtudW1iZXJQYXJ0LCB2YXVsdElkUGFydF0gPSBrZXkuc3BsaXQoJzonKTtcbiAgcmV0dXJuIFtkZWNvZGVOdW1iZXIobnVtYmVyUGFydCksIHZhdWx0SWRQYXJ0XTtcbn07JGjNj19vbmNlLmZyb21WYXVsdEtleShmcm9tVmF1bHRLZXkpO1xuaGFyZGVuKGZyb21WYXVsdEtleSk7XG5cbi8qKlxuICogQ3JlYXRlIGEgZmxvYXQgcmVwcmVzZW50aW5nIGEgTm9ybWFsaXplZCBDb2xsYXRlcmFsaXphdGlvbiBSYXRpbyB0aGF0IGNhbiBiZVxuICogY29tcGFyZWQgdG8gdGhlIE5DUnMgb2YgdmF1bHRzLiBXZSB3YW50IGEgZmxvYXQgd2l0aCBhcyBtdWNoIHJlc29sdXRpb24gYXMgd2VcbiAqIGNhbiBnZXQsIHNvIHdlIG11bHRpcGx5IG91dCB0aGUgbnVtZXJhdG9yIGFuZCB0aGUgZGVub21pbmF0b3IsIGFuZCBvbmx5XG4gKiBkaXZpZGUgdGhlIHJlc3VsdHMgb25jZS5cbiAqXG4gKiBGb3IgdXNlIGJ5IGBub3JtYWxpemVkQ29sbFJhdGlvS2V5YCBhbmQgdGVzdHMuXG4gKlxuICogQHBhcmFtIHtQcmljZVF1b3RlfSBxdW90ZVxuICogQHBhcmFtIHtSYXRpb30gY29tcG91bmRlZEludGVyZXN0XG4gKiBAcGFyYW0ge1JhdGlvfSBtYXJnaW5cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICBjb25zdCBub3JtYWxpemVkQ29sbFJhdGlvID0gKHF1b3RlLCBjb21wb3VuZGVkSW50ZXJlc3QsIG1hcmdpbikgPT4ge1xuICBjb25zdCBhbW91bnRJbiA9IGdldEFtb3VudEluKHF1b3RlKS52YWx1ZTtcbiAgY29uc3QgYW1vdW50T3V0ID0gZ2V0QW1vdW50T3V0KHF1b3RlKS52YWx1ZTtcbiAgY29uc3QgaW50ZXJlc3ROdW1lcmF0b3IgPSBjb21wb3VuZGVkSW50ZXJlc3QubnVtZXJhdG9yLnZhbHVlO1xuICBjb25zdCBpbnRlcmVzdEJhc2UgPSBjb21wb3VuZGVkSW50ZXJlc3QuZGVub21pbmF0b3IudmFsdWU7XG4gIGNvbnN0IG51bWVyYXRvciA9IG11bHRpcGx5KFxuICAgIG1hcmdpbi5udW1lcmF0b3IudmFsdWUsXG4gICAgbXVsdGlwbHkoYW1vdW50SW4sIGludGVyZXN0TnVtZXJhdG9yKSxcbiAgKTtcbiAgY29uc3QgZGVub21pbmF0b3IgPSBtdWx0aXBseShcbiAgICBhbW91bnRPdXQsXG4gICAgbXVsdGlwbHkoaW50ZXJlc3RCYXNlLCBtYXJnaW4uZGVub21pbmF0b3IudmFsdWUpLFxuICApO1xuXG4gIHJldHVybiBOdW1iZXIobnVtZXJhdG9yKSAvIE51bWJlcihkZW5vbWluYXRvcik7XG59OyRozY9fb25jZS5ub3JtYWxpemVkQ29sbFJhdGlvKG5vcm1hbGl6ZWRDb2xsUmF0aW8pO1xuaGFyZGVuKG5vcm1hbGl6ZWRDb2xsUmF0aW8pO1xuXG4vKipcbiAqIENyZWF0ZSBhIHNvcnQga2V5IGZvciBhIG5vcm1hbGl6ZWQgY29sbGF0ZXJhbGl6YXRpb24gcmF0aW8uIFdlIHdhbnQgdGhlIGtleVxuICogdG8gYmUgYmFzZWQgb24gYSBmbG9hdCB3aXRoIGFzIG11Y2ggcmVzb2x1dGlvbiBhcyB3ZSBjYW4gZ2V0LCBzbyB3ZSBtdWx0aXBseVxuICogb3V0IHRoZSBudW1lcmF0b3IgYW5kIHRoZSBkZW5vbWluYXRvciwgYW5kIGRpdmlkZSBvbmx5IG9uY2UuXG4gKlxuICogQHBhcmFtIHtQcmljZVF1b3RlfSBxdW90ZVxuICogQHBhcmFtIHtSYXRpb30gY29tcG91bmRlZEludGVyZXN0XG4gKiBAcGFyYW0ge1JhdGlvfSBtYXJnaW5cbiAqIEByZXR1cm5zIHtzdHJpbmd9IGxleGljYWxseSBzb3J0YWJsZSBzdHJpbmcgaW4gd2hpY2ggaGlnaGVzdFxuICogICBkZWJ0LXRvLWNvbGxhdGVyYWwgaXMgZWFybGllc3RcbiAqL1xuICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDb2xsUmF0aW9LZXkgPSAocXVvdGUsIGNvbXBvdW5kZWRJbnRlcmVzdCwgbWFyZ2luKSA9PiB7XG4gIGNvbnN0IGNvbGxSYXRpbyA9IG5vcm1hbGl6ZWRDb2xsUmF0aW8ocXVvdGUsIGNvbXBvdW5kZWRJbnRlcmVzdCwgbWFyZ2luKTtcbiAgcmV0dXJuIGAke2VuY29kZU51bWJlcihjb2xsUmF0aW8pfTpgO1xufTskaM2PX29uY2Uubm9ybWFsaXplZENvbGxSYXRpb0tleShub3JtYWxpemVkQ29sbFJhdGlvS2V5KTtcbmhhcmRlbihub3JtYWxpemVkQ29sbFJhdGlvS2V5KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVuY29kZURhdGEiOlsiZW5jb2RlRGF0YSJdLCJkZWNvZGVEYXRhIjpbImRlY29kZURhdGEiXSwidG9WYXVsdEtleSI6WyJ0b1ZhdWx0S2V5Il0sImZyb21WYXVsdEtleSI6WyJmcm9tVmF1bHRLZXkiXSwibm9ybWFsaXplZENvbGxSYXRpbyI6WyJub3JtYWxpemVkQ29sbFJhdGlvIl0sIm5vcm1hbGl6ZWRDb2xsUmF0aW9LZXkiOlsibm9ybWFsaXplZENvbGxSYXRpb0tleSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC1iHSn5nwAAOZ8AAA4AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy92YXVsdEZhY3RvcnkvdmF1bHQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIiwiLi4vY29udHJhY3RTdXBwb3J0LmpzIiwiLi4vaW50ZXJlc3QtbWF0aC5qcyIsIi4vbWF0aC5qcyIsIi4vdmF1bHRLaXQuanMiXSwiZXhwb3J0cyI6WyJQaGFzZSIsIlZhdWx0SSIsInByZXBhcmVWYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbCxBbW91bnRNYXRoLEFtb3VudFNoYXBlLFN0b3JhZ2VOb2RlU2hhcGUsbWFrZVRyYWNlcixVbmd1YXJkZWRIZWxwZXJJLE0scHJlcGFyZUV4b0NsYXNzS2l0LGF0b21pY1RyYW5zZmVyLFNlYXRTaGFwZSxhZGRTdWJ0cmFjdCxhbGxFbXB0eSxtYWtlTmF0QW1vdW50U2hhcGUsY2FsY3VsYXRlQ3VycmVudERlYnQscmV2ZXJzZUludGVyZXN0LGNhbGN1bGF0ZURlYnRDb3N0cyxwcmVwYXJlVmF1bHRLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXSxbXCJBbW91bnRTaGFwZVwiLFskaM2PX2EgPT4gKEFtb3VudFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiU3RvcmFnZU5vZGVTaGFwZVwiLFskaM2PX2EgPT4gKFN0b3JhZ2VOb2RlU2hhcGUgPSAkaM2PX2EpXV0sW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJVbmd1YXJkZWRIZWxwZXJJXCIsWyRozY9fYSA9PiAoVW5ndWFyZGVkSGVscGVySSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcImF0b21pY1RyYW5zZmVyXCIsWyRozY9fYSA9PiAoYXRvbWljVHJhbnNmZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiU2VhdFNoYXBlXCIsWyRozY9fYSA9PiAoU2VhdFNoYXBlID0gJGjNj19hKV1dXV0sW1wiLi4vY29udHJhY3RTdXBwb3J0LmpzXCIsIFtbXCJhZGRTdWJ0cmFjdFwiLFskaM2PX2EgPT4gKGFkZFN1YnRyYWN0ID0gJGjNj19hKV1dLFtcImFsbEVtcHR5XCIsWyRozY9fYSA9PiAoYWxsRW1wdHkgPSAkaM2PX2EpXV0sW1wibWFrZU5hdEFtb3VudFNoYXBlXCIsWyRozY9fYSA9PiAobWFrZU5hdEFtb3VudFNoYXBlID0gJGjNj19hKV1dXV0sW1wiLi4vaW50ZXJlc3QtbWF0aC5qc1wiLCBbW1wiY2FsY3VsYXRlQ3VycmVudERlYnRcIixbJGjNj19hID0+IChjYWxjdWxhdGVDdXJyZW50RGVidCA9ICRozY9fYSldXSxbXCJyZXZlcnNlSW50ZXJlc3RcIixbJGjNj19hID0+IChyZXZlcnNlSW50ZXJlc3QgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGguanNcIiwgW1tcImNhbGN1bGF0ZURlYnRDb3N0c1wiLFskaM2PX2EgPT4gKGNhbGN1bGF0ZURlYnRDb3N0cyA9ICRozY9fYSldXV1dLFtcIi4vdmF1bHRLaXQuanNcIiwgW1tcInByZXBhcmVWYXVsdEtpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVWYXVsdEtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0cmFjZSA9IG1ha2VUcmFjZXIoJ1ZhdWx0JywgdHJ1ZSk7XG5cbi8qKlxuICogQGltcG9ydCB7UmVtb3RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0VSZXR1cm59IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtBbW91bnQsIEJyYW5kfSBmcm9tICdAYWdvcmljL2VydHAvc3JjL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1N1YnNjcmliZXJ9IGZyb20gJ0BhZ29yaWMvbm90aWZpZXInO1xuICogQGltcG9ydCB7Tm9ybWFsaXplZERlYnR9IGZyb20gJy4vc3RvcmVVdGlscy5qcyc7XG4gKiBAaW1wb3J0IHtBc3NldFN0YXRlfSBmcm9tICcuL3ZhdWx0TWFuYWdlci5qcyc7XG4gKiBAaW1wb3J0IHtHb3Zlcm5lZFBhcmFtR2V0dGVyc30gZnJvbSAnLi92YXVsdE1hbmFnZXIuanMnO1xuICogQGltcG9ydCB7UmVjb3JkZXJ9IGZyb20gJ0BhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7TWFrZVJlY29yZGVyS2l0fSBmcm9tICdAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzJztcbiAqIEBpbXBvcnQge1JhdGlvfSBmcm9tICdAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzJztcbiAqIEBpbXBvcnQge1ZhdWx0S2l0fSBmcm9tICcuL3ZhdWx0S2l0LmpzJztcbiAqIEBpbXBvcnQge01pbnRBbmRUcmFuc2ZlciwgVmF1bHRJZH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtJbnZpdGF0aW9uLCBQcm9wb3NhbFJlY29yZCwgVHJhbnNmZXJQYXJ0LCBaQ0YsIFpDRlNlYXR9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge1N0b3JhZ2VOb2RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzJztcbiAqL1xuXG4vKipcbiAqIEBmaWxlIFRoaXMgaGFzIG1vc3Qgb2YgdGhlIGxvZ2ljIGZvciBhIFZhdWx0LCB0byBib3Jyb3cgTWludGVkIGFnYWluc3RcbiAqICAgY29sbGF0ZXJhbC5cbiAqXG4gKiAgIFRoZSBsb2dpYyBoZXJlIGlzIGZvciBWYXVsdCB3aGljaCBpcyB0aGUgbWFqb3JpdHkgb2YgbG9naWMgb2YgdmF1bHRzIGJ1dCB0aGVcbiAqICAgdXNlciB2aWV3IGlzIHRoZSBgdmF1bHRgIHZhbHVlIGNvbnRhaW5lZCBpbiBWYXVsdEtpdC5cbiAqXG4gKiAgIEEgbm90ZSBvbiBuYW1pbmcgY29udmVudGlvbjpcbiAqXG4gKiAgIC0gYFByZWAgaXMgdXNlZCBhcyBhIHBvc3RmaXggZm9yIGFueSBtdXRhYmxlIHZhbHVlIHJldHJpZXZlZCBfYmVmb3JlXyBhblxuICogICAgICAgYGF3YWl0YCwgdG8gZmxhZyB2YWx1ZXMgdGhhdCBtdXN0IHVzZWQgdmVyeSBjYXJlZnVsbHkgYWZ0ZXIgdGhlXG4gKiAgICAgICBgYXdhaXRgXG4gKiAgIC0gYG5ld2AgaXMgYSBwcmVmaXggZm9yIHZhbHVlcyB0aGF0IGRlc2NyaWJlIHRoZSByZXN1bHQgb2YgZXhlY3V0aW5nIGFcbiAqICAgICAgIHRyYW5zYWN0aW9uOyBlLmcuLCBgZGVidGAgaXMgdGhlIHZhbHVlIGJlZm9yZSB0aGUgdHhuLCBhbmQgYG5ld0RlYnRgXG4gKiAgICAgICB3aWxsIGJlIHZhbHVlIGlmIHRoZSB0eG4gY29tcGxldGVzLlxuICogICAtIHRoZSBhYnNlbmNlIG9mIG9uZSBvZiB0aGVzZSBpbXBsaWVzIHRoZSBvcHBvc2l0ZSwgc28gYG5ld0RlYnRgIGlzIHRoZSBmdXR1cmVcbiAqICAgICAgIHZhbHVlIGZvIGBkZWJ0YCwgYXMgY29tcHV0ZWQgYmFzZWQgb24gdmFsdWVzIGFmdGVyIGFueSBgYXdhaXRgXG4gKi9cblxuLyoqXG4gKiBDb25zdGFudHMgZm9yIHZhdWx0IHBoYXNlLlxuICpcbiAqIC0gQUNUSVZFIC0gdmF1bHQgaXMgaW4gdXNlIGFuZCBjYW4gYmUgY2hhbmdlZFxuICogLSBMSVFVSURBVElORyAtIHZhdWx0IGlzIGJlaW5nIGxpcXVpZGF0ZWQgYnkgdGhlIHZhdWx0IG1hbmFnZXIsIGFuZCBjYW5ub3QgYmVcbiAqICAgY2hhbmdlZCBieSB0aGUgdXNlci4gSWYgbGlxdWlkYXRpb24gZmFpbHMsIHZhdWx0cyBtYXkgcmVtYWluIGluIHRoaXMgc3RhdGUuXG4gKiAgIEFuIHVwZ3JhZGUgdG8gdGhlIGNvbnRyYWN0IG1pZ2h0IGJlIGFibGUgdG8gcmVjb3ZlciB0aGVtLlxuICogLSBUUkFOU0ZFUiAtIHZhdWx0IGlzIGFibGUgdG8gYmUgdHJhbnNmZXJyZWQgKHBheW1lbnRzIGFuZCBkZWJpdHMgZnJvemVuIHVudGlsXG4gKiAgIGl0IGhhcyBhIG5ldyBvd25lcilcbiAqIC0gQ0xPU0VEIC0gdmF1bHQgd2FzIGNsb3NlZCBieSB0aGUgdXNlciBhbmQgYWxsIGFzc2V0cyBoYXZlIGJlZW4gcGFpZCBvdXRcbiAqIC0gTElRVUlEQVRFRCAtIHZhdWx0IHdhcyBjbG9zZWQgYnkgdGhlIG1hbmFnZXIsIHdpdGggcmVtYWluaW5nIGFzc2V0cyBwYWlkIHRvXG4gKiAgIG93bmVyXG4gKlxuICogQGVudW0geyh0eXBlb2YgUGhhc2UpW2tleW9mIHR5cGVvZiBQaGFzZV19XG4gKi9cbiAgICAgICBjb25zdCBQaGFzZSA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIEFDVElWRTogJ2FjdGl2ZScsXG4gIExJUVVJREFUSU5HOiAnbGlxdWlkYXRpbmcnLFxuICBDTE9TRUQ6ICdjbG9zZWQnLFxuICBMSVFVSURBVEVEOiAnbGlxdWlkYXRlZCcsXG4gIFRSQU5TRkVSOiAndHJhbnNmZXInLFxufSk7JGjNj19vbmNlLlBoYXNlKFBoYXNlKTtcbmhhcmRlbihQaGFzZSk7XG5cbi8qKlxuICogQHR5cGVkZWYge0V4Y2x1ZGU8UGhhc2UsICd0cmFuc2Zlcic+fSBWYXVsdFBoYXNlXG4gKiBAdHlwZSB7eyBbSyBpbiBWYXVsdFBoYXNlXTogVmF1bHRQaGFzZVtdIH19XG4gKi9cbmNvbnN0IHZhbGlkVHJhbnNpdGlvbnMgPSB7XG4gIFtQaGFzZS5BQ1RJVkVdOiBbUGhhc2UuTElRVUlEQVRJTkcsIFBoYXNlLkNMT1NFRF0sXG4gIFtQaGFzZS5MSVFVSURBVElOR106IFtQaGFzZS5MSVFVSURBVEVELCBQaGFzZS5BQ1RJVkVdLFxuICBbUGhhc2UuTElRVUlEQVRFRF06IFtQaGFzZS5DTE9TRURdLFxuICBbUGhhc2UuQ0xPU0VEXTogW10sXG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZhdWx0Tm90aWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IGxvY2tlZCBBbW91bnQgb2YgQ29sbGF0ZXJhbCBsb2NrZWRcbiAqIEBwcm9wZXJ0eSB7e1xuICogICBkZWJ0OiBBbW91bnQ8J25hdCc+O1xuICogICBpbnRlcmVzdDogUmF0aW87XG4gKiB9fSBkZWJ0U25hcHNob3RcbiAqICAgJ2RlYnQnIGF0IHRoZSBwb2ludCB0aGUgY29tcG91bmRlZCBpbnRlcmVzdCB3YXMgJ2ludGVyZXN0J1xuICogQHByb3BlcnR5IHtQaGFzZX0gdmF1bHRTdGF0ZVxuICovXG5cbi8qIFhYWCBtYXNrcyB0eXBlZGVmIGZyb20gdHlwZXMuanMsIGJ1dCB1c2luZyB0aGF0IGNhdXNlcyBjaXJjdWxhciBkZWYgcHJvYmxlbXMqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWYXVsdE1hbmFnZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3Vic2NyaWJlcjxBc3NldFN0YXRlPn0gZ2V0QXNzZXRTdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkgeyhjb2xsYXRlcmFsQW1vdW50OiBBbW91bnQpID0+IEFtb3VudDwnbmF0Jz59IG1heERlYnRGb3JcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8J25hdCc+fSBnZXRDb2xsYXRlcmFsQnJhbmRcbiAqIEBwcm9wZXJ0eSB7KGJhc2U6IHN0cmluZykgPT4gc3RyaW5nfSBzY29wZURlc2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPCduYXQnPn0gZ2V0RGVidEJyYW5kXG4gKiBAcHJvcGVydHkge01pbnRBbmRUcmFuc2Zlcn0gbWludEFuZFRyYW5zZmVyXG4gKiBAcHJvcGVydHkgeyhhbW91bnQ6IEFtb3VudCwgc2VhdDogWkNGU2VhdCkgPT4gdm9pZH0gYnVyblxuICogQHByb3BlcnR5IHsoKSA9PiBSYXRpb30gZ2V0Q29tcG91bmRlZEludGVyZXN0XG4gKiBAcHJvcGVydHkgeyhcbiAqICAgb2xkRGVidDogTm9ybWFsaXplZERlYnQsXG4gKiAgIG9sZENvbGxhdGVyYWw6IEFtb3VudDwnbmF0Jz4sXG4gKiAgIHZhdWx0SWQ6IFZhdWx0SWQsXG4gKiAgIHZhdWx0UGhhc2U6IFZhdWx0UGhhc2UsXG4gKiAgIHZhdWx0OiBWYXVsdCxcbiAqICkgPT4gdm9pZH0gaGFuZGxlQmFsYW5jZUNoYW5nZVxuICogQHByb3BlcnR5IHsoKSA9PiBHb3Zlcm5lZFBhcmFtR2V0dGVyc30gZ2V0R292ZXJuZWRQYXJhbXNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWFkb25seTx7XG4gKiAgIGlkSW5NYW5hZ2VyOiBWYXVsdElkO1xuICogICBtYW5hZ2VyOiBWYXVsdE1hbmFnZXI7XG4gKiAgIHN0b3JhZ2VOb2RlOiBSZW1vdGU8U3RvcmFnZU5vZGU+O1xuICogICB2YXVsdFNlYXQ6IFpDRlNlYXQ7XG4gKiB9Pn0gSW1tdXRhYmxlU3RhdGVcbiAqL1xuXG4vKipcbiAqIFNuYXBzaG90IGlzIG9mIHRoZSBkZWJ0IGFuZCBjb21wb3VuZGVkIGludGVyZXN0IHdoZW4gdGhlIHByaW5jaXBhbCB3YXMgbGFzdFxuICogY2hhbmdlZC5cbiAqXG4gKiBAdHlwZWRlZiB7e1xuICogICBpbnRlcmVzdFNuYXBzaG90OiBSYXRpbztcbiAqICAgcGhhc2U6IFZhdWx0UGhhc2U7XG4gKiAgIGRlYnRTbmFwc2hvdDogQW1vdW50PCduYXQnPjtcbiAqICAgb3V0ZXJVcGRhdGVyOiBSZWNvcmRlcjxWYXVsdE5vdGlmaWNhdGlvbj4gfCBudWxsO1xuICogfX0gTXV0YWJsZVN0YXRlXG4gKi9cblxuICAgICAgIGNvbnN0IFZhdWx0SSA9IE0uaW50ZXJmYWNlKCdWYXVsdCcsIHtcbiAgZ2V0Q29sbGF0ZXJhbEFtb3VudDogTS5jYWxsKCkucmV0dXJucyhBbW91bnRTaGFwZSksXG4gIGdldEN1cnJlbnREZWJ0OiBNLmNhbGwoKS5yZXR1cm5zKEFtb3VudFNoYXBlKSxcbiAgZ2V0Tm9ybWFsaXplZERlYnQ6IE0uY2FsbCgpLnJldHVybnMoQW1vdW50U2hhcGUpLFxuICBnZXRWYXVsdFNlYXQ6IE0uY2FsbCgpLnJldHVybnMoU2VhdFNoYXBlKSxcbiAgaW5pdFZhdWx0S2l0OiBNLmNhbGwoU2VhdFNoYXBlLCBTdG9yYWdlTm9kZVNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgbGlxdWlkYXRlZDogTS5jYWxsKCkucmV0dXJucyh1bmRlZmluZWQpLFxuICBsaXF1aWRhdGluZzogTS5jYWxsKCkucmV0dXJucyh1bmRlZmluZWQpLFxuICBtYWtlQWRqdXN0QmFsYW5jZXNJbnZpdGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgbWFrZUNsb3NlSW52aXRhdGlvbjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIG1ha2VUcmFuc2Zlckludml0YXRpb246IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBhYm9ydExpcXVpZGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxufSk7JGjNj19vbmNlLlZhdWx0SShWYXVsdEkpO1xuXG5jb25zdCBWYXVsdFN0YXRlU2hhcGUgPSBoYXJkZW4oe1xuICBpZEluTWFuYWdlcjogTS5hbnkoKSxcbiAgbWFuYWdlcjogTS5hbnkoKSxcbiAgb3V0ZXJVcGRhdGVyOiBNLmFueSgpLFxuICBwaGFzZTogTS5hbnkoKSxcbiAgc3RvcmFnZU5vZGU6IE0uYW55KCksXG4gIHZhdWx0U2VhdDogTS5hbnkoKSxcbiAgaW50ZXJlc3RTbmFwc2hvdDogTS5hbnkoKSxcbiAgZGVidFNuYXBzaG90OiBNLmFueSgpLFxufSk7XG5cbi8qKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge01ha2VSZWNvcmRlcktpdH0gbWFrZVJlY29yZGVyS2l0XG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlVmF1bHQgPSAoYmFnZ2FnZSwgbWFrZVJlY29yZGVyS2l0LCB6Y2YpID0+IHtcbiAgY29uc3QgbWFrZVZhdWx0S2l0ID0gcHJlcGFyZVZhdWx0S2l0KGJhZ2dhZ2UsIG1ha2VSZWNvcmRlcktpdCk7XG5cbiAgY29uc3QgbWFrZXIgPSBwcmVwYXJlRXhvQ2xhc3NLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICAnVmF1bHQnLFxuICAgIHtcbiAgICAgIGhlbHBlcjogVW5ndWFyZGVkSGVscGVySSxcbiAgICAgIHNlbGY6IFZhdWx0SSxcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHtWYXVsdE1hbmFnZXJ9IG1hbmFnZXJcbiAqIEBwYXJhbSB7VmF1bHRJZH0gaWRJbk1hbmFnZXJcbiAqIEBwYXJhbSB7UmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEByZXR1cm5zIHtJbW11dGFibGVTdGF0ZSAmIE11dGFibGVTdGF0ZX1cbiAqL1xuICAgIChtYW5hZ2VyLCBpZEluTWFuYWdlciwgc3RvcmFnZU5vZGUpID0+IHtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBpZEluTWFuYWdlcixcbiAgICAgICAgbWFuYWdlcixcbiAgICAgICAgb3V0ZXJVcGRhdGVyOiBudWxsLFxuICAgICAgICBwaGFzZTogUGhhc2UuQUNUSVZFLFxuXG4gICAgICAgIHN0b3JhZ2VOb2RlLFxuXG4gICAgICAgIC8qIHZhdWx0U2VhdCB3aWxsIGhvbGQgdGhlIGNvbGxhdGVyYWwgdW50aWwgdGhlIHBvc2l0aW9uIGlzIHJldGlyZWQuIFRoZSovXG4gICAgICAgIC8qIHBheW91dCBmcm9tIGl0IHdpbGwgYmUgaGFuZGVkIHRvIHRoZSB1c2VyOiBpZiB0aGUgdmF1bHQgZGllcyBlYXJseSovXG4gICAgICAgIC8qIChiZWNhdXNlIHRoZSB2YXVsdEZhY3RvcnkgdmF0IGRpZWQpLCB0aGV5J2xsIGdldCBhbGwgdGhlaXIqL1xuICAgICAgICAvKiBjb2xsYXRlcmFsIGJhY2suIElmIHRoYXQgaGFwcGVucywgdGhlIGlzc3VlciBmb3IgdGhlIE1pbnRlZCB3aWxsIGJlIGRlYWQsKi9cbiAgICAgICAgLyogc28gdGhlaXIgcG9zaXRpb24gd2lsbCBiZSB3b3J0aGxlc3MuKi9cbiAgICAgICAgdmF1bHRTZWF0OiB6Y2YubWFrZUVtcHR5U2VhdEtpdCgpLnpjZlNlYXQsXG5cbiAgICAgICAgLyogVHdvIHZhbHVlcyBmcm9tIHRoZSBzYW1lIG1vbWVudCovXG4gICAgICAgIGludGVyZXN0U25hcHNob3Q6IG1hbmFnZXIuZ2V0Q29tcG91bmRlZEludGVyZXN0KCksXG4gICAgICAgIGRlYnRTbmFwc2hvdDogQW1vdW50TWF0aC5tYWtlRW1wdHkobWFuYWdlci5nZXREZWJ0QnJhbmQoKSksXG4gICAgICB9KTtcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlbHBlcjoge1xuICAgICAgICAvKiNyZWdpb24gQ29tcHV0ZWQgY29uc3RhbnRzKi9cbiAgICAgICAgY29sbGF0ZXJhbEJyYW5kKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLm1hbmFnZXIuZ2V0Q29sbGF0ZXJhbEJyYW5kKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlYnRCcmFuZCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5tYW5hZ2VyLmdldERlYnRCcmFuZCgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGVtcHR5Q29sbGF0ZXJhbCgpIHtcbiAgICAgICAgICByZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkodGhpcy5mYWNldHMuaGVscGVyLmNvbGxhdGVyYWxCcmFuZCgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW1wdHlEZWJ0KCkge1xuICAgICAgICAgIHJldHVybiBBbW91bnRNYXRoLm1ha2VFbXB0eSh0aGlzLmZhY2V0cy5oZWxwZXIuZGVidEJyYW5kKCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGdpdmU6IHsgQ29sbGF0ZXJhbDogQW1vdW50PCduYXQnPjsgTWludGVkOiBBbW91bnQ8J25hdCc+IH07XG4gKiAgIHdhbnQ6IHsgQ29sbGF0ZXJhbDogQW1vdW50PCduYXQnPjsgTWludGVkOiBBbW91bnQ8J25hdCc+IH07XG4gKiB9fSBGdWxsUHJvcG9zYWxcbiAqL1xuICAgICAgICAvKipcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHBhcnRpYWxcbiAqIEByZXR1cm5zIHtGdWxsUHJvcG9zYWx9XG4gKi9cbiAgICAgICAgZnVsbFByb3Bvc2FsKHBhcnRpYWwpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZ2l2ZToge1xuICAgICAgICAgICAgICBDb2xsYXRlcmFsOlxuICAgICAgICAgICAgICAgIHBhcnRpYWwuZ2l2ZT8uQ29sbGF0ZXJhbCB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZmFjZXRzLmhlbHBlci5lbXB0eUNvbGxhdGVyYWwoKSxcbiAgICAgICAgICAgICAgTWludGVkOiBwYXJ0aWFsLmdpdmU/Lk1pbnRlZCB8fCB0aGlzLmZhY2V0cy5oZWxwZXIuZW1wdHlEZWJ0KCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2FudDoge1xuICAgICAgICAgICAgICBDb2xsYXRlcmFsOlxuICAgICAgICAgICAgICAgIHBhcnRpYWwud2FudD8uQ29sbGF0ZXJhbCB8fFxuICAgICAgICAgICAgICAgIHRoaXMuZmFjZXRzLmhlbHBlci5lbXB0eUNvbGxhdGVyYWwoKSxcbiAgICAgICAgICAgICAgTWludGVkOiBwYXJ0aWFsLndhbnQ/Lk1pbnRlZCB8fCB0aGlzLmZhY2V0cy5oZWxwZXIuZW1wdHlEZWJ0KCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qI2VuZHJlZ2lvbiovXG5cbiAgICAgICAgLyojcmVnaW9uIFBoYXNlIGxvZ2ljKi9cbiAgICAgICAgLyoqIEBwYXJhbSB7VmF1bHRQaGFzZX0gbmV3UGhhc2UgKi9cbiAgICAgICAgYXNzaWduUGhhc2UobmV3UGhhc2UpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuXG4gICAgICAgICAgY29uc3QgeyBwaGFzZSB9ID0gc3RhdGU7XG4gICAgICAgICAgY29uc3QgdmFsaWROZXdQaGFzZXMgPSB2YWxpZFRyYW5zaXRpb25zW3BoYXNlXTtcbiAgICAgICAgICB2YWxpZE5ld1BoYXNlcy5pbmNsdWRlcyhuZXdQaGFzZSkgfHxcbiAgICAgICAgICAgIEZhaWxgVmF1bHQgY2Fubm90IHRyYW5zaXRpb24gZnJvbSAke3EocGhhc2UpfSB0byAke3EobmV3UGhhc2UpfWA7XG4gICAgICAgICAgc3RhdGUucGhhc2UgPSBuZXdQaGFzZTtcbiAgICAgICAgfSxcblxuICAgICAgICBhc3NlcnRBY3RpdmUoKSB7XG4gICAgICAgICAgY29uc3QgeyBwaGFzZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBwaGFzZSA9PT0gUGhhc2UuQUNUSVZFIHx8IEZhaWxgdmF1bHQgbm90IGFjdGl2ZWA7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXNzZXJ0Q2xvc2VhYmxlKCkge1xuICAgICAgICAgIGNvbnN0IHsgcGhhc2UgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgcGhhc2UgPT09IFBoYXNlLkFDVElWRSB8fFxuICAgICAgICAgICAgcGhhc2UgPT09IFBoYXNlLkxJUVVJREFURUQgfHxcbiAgICAgICAgICAgIEZhaWxgdG8gYmUgY2xvc2VkIGEgdmF1bHQgbXVzdCBiZSBhY3RpdmUgb3IgbGlxdWlkYXRlZCwgbm90ICR7cGhhc2V9YDtcbiAgICAgICAgfSxcbiAgICAgICAgLyojZW5kcmVnaW9uKi9cblxuICAgICAgICAvKipcbiAqIENhbGxlZCB3aGVuZXZlciB0aGUgZGVidCBpcyBwYWlkIG9yIGNyZWF0ZWQgdGhyb3VnaCBhIHRyYW5zYWN0aW9uLFxuICogYnV0IG5vdCBmb3IgaW50ZXJlc3QgYWNjcnVhbC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IG5ld0RlYnQgLSBwcmluY2lwYWwgYW5kIGFsbCBhY2NydWVkIGludGVyZXN0XG4gKi9cbiAgICAgICAgdXBkYXRlRGVidFNuYXBzaG90KG5ld0RlYnQpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuXG4gICAgICAgICAgLyogdXBkYXRlIGxvY2FsIHN0YXRlKi9cbiAgICAgICAgICBzdGF0ZS5kZWJ0U25hcHNob3QgPSBuZXdEZWJ0O1xuICAgICAgICAgIHN0YXRlLmludGVyZXN0U25hcHNob3QgPSBzdGF0ZS5tYW5hZ2VyLmdldENvbXBvdW5kZWRJbnRlcmVzdCgpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICogVXBkYXRlIHRoZSBkZWJ0IGJhbGFuY2UgYW5kIHByb3BhZ2F0ZSB1cHdhcmRzIHRvIG1haW50YWluIGFnZ3JlZ2F0ZVxuICogZGVidCBhbmQgbGlxdWlkYXRpb24gb3JkZXIuXG4gKlxuICogQHBhcmFtIHtOb3JtYWxpemVkRGVidH0gb2xkRGVidE5vcm1hbGl6ZWQgLSBwcmlvciBwcmluY2lwYWwgYW5kIGFsbFxuICogICBhY2NydWVkIGludGVyZXN0LCBub3JtYWxpemVkIHRvIHRoZSBsYXVuY2ggb2YgdGhlIHZhdWx0TWFuYWdlclxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBvbGRDb2xsYXRlcmFsIC0gYWN0dWFsIGNvbGxhdGVyYWxcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gbmV3RGVidEFjdHVhbCAtIGFjdHVhbCBwcmluY2lwYWwgYW5kIGFsbFxuICogICBhY2NydWVkIGludGVyZXN0XG4gKi9cbiAgICAgICAgdXBkYXRlRGVidEFjY291bnRpbmcob2xkRGVidE5vcm1hbGl6ZWQsIG9sZENvbGxhdGVyYWwsIG5ld0RlYnRBY3R1YWwpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IGZhY2V0cztcbiAgICAgICAgICBoZWxwZXIudXBkYXRlRGVidFNuYXBzaG90KG5ld0RlYnRBY3R1YWwpO1xuICAgICAgICAgIC8qIG5vdGlmeSBtYW5hZ2VyIHNvIGl0IGNhbiBub3RpZnkgYW5kIGNsZWFuIHVwIGFzIGFwcHJvcHJpYXRlKi9cbiAgICAgICAgICBzdGF0ZS5tYW5hZ2VyLmhhbmRsZUJhbGFuY2VDaGFuZ2UoXG4gICAgICAgICAgICBvbGREZWJ0Tm9ybWFsaXplZCxcbiAgICAgICAgICAgIG9sZENvbGxhdGVyYWwsXG4gICAgICAgICAgICBzdGF0ZS5pZEluTWFuYWdlcixcbiAgICAgICAgICAgIHN0YXRlLnBoYXNlLFxuICAgICAgICAgICAgZmFjZXRzLnNlbGYsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHJldHVybnMge0Ftb3VudDwnbmF0Jz59XG4gKi9cbiAgICAgICAgZ2V0Q29sbGF0ZXJhbEFsbG9jYXRlZChzZWF0KSB7XG4gICAgICAgICAgcmV0dXJuIHNlYXQuZ2V0QW1vdW50QWxsb2NhdGVkKFxuICAgICAgICAgICAgJ0NvbGxhdGVyYWwnLFxuICAgICAgICAgICAgdGhpcy5mYWNldHMuaGVscGVyLmNvbGxhdGVyYWxCcmFuZCgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqL1xuICAgICAgICBnZXRNaW50ZWRBbGxvY2F0ZWQoc2VhdCkge1xuICAgICAgICAgIHJldHVybiBzZWF0LmdldEFtb3VudEFsbG9jYXRlZChcbiAgICAgICAgICAgICdNaW50ZWQnLFxuICAgICAgICAgICAgdGhpcy5mYWNldHMuaGVscGVyLmRlYnRCcmFuZCgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXNzZXJ0VmF1bHRIb2xkc05vTWludGVkKCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IHZhdWx0U2VhdCB9ID0gc3RhdGU7XG4gICAgICAgICAgQW1vdW50TWF0aC5pc0VtcHR5KGZhY2V0cy5oZWxwZXIuZ2V0TWludGVkQWxsb2NhdGVkKHZhdWx0U2VhdCkpIHx8XG4gICAgICAgICAgICBGYWlsYFZhdWx0IHNob3VsZCBiZSBlbXB0eSBvZiBNaW50ZWRgO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBjb2xsYXRlcmFsQW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHByb3Bvc2VkRGVidFxuICovXG4gICAgICAgIGFzc2VydFN1ZmZpY2llbnRDb2xsYXRlcmFsKGNvbGxhdGVyYWxBbW91bnQsIHByb3Bvc2VkRGVidCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBtYXhEZWJ0ID0gc3RhdGUubWFuYWdlci5tYXhEZWJ0Rm9yKGNvbGxhdGVyYWxBbW91bnQpO1xuICAgICAgICAgIEFtb3VudE1hdGguaXNHVEUobWF4RGVidCwgcHJvcG9zZWREZWJ0LCBmYWNldHMuaGVscGVyLmRlYnRCcmFuZCgpKSB8fFxuICAgICAgICAgICAgRmFpbGBQcm9wb3NlZCBkZWJ0ICR7cShwcm9wb3NlZERlYnQpfSBleGNlZWRzIG1heCAke3EoXG4gICAgICAgICAgICAgIG1heERlYnQsXG4gICAgICAgICAgICApfSBmb3IgJHtxKGNvbGxhdGVyYWxBbW91bnQpfSBjb2xsYXRlcmFsYDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiogQHBhcmFtIHtQaGFzZX0gbmV3UGhhc2UgKi9cbiAgICAgICAgZ2V0U3RhdGVTbmFwc2hvdChuZXdQaGFzZSkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcblxuICAgICAgICAgIGNvbnN0IHsgZGVidFNuYXBzaG90OiBkZWJ0LCBpbnRlcmVzdFNuYXBzaG90OiBpbnRlcmVzdCB9ID0gc3RhdGU7XG4gICAgICAgICAgLyoqIEB0eXBlIHtWYXVsdE5vdGlmaWNhdGlvbn0gKi9cbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgICAgIGRlYnRTbmFwc2hvdDogeyBkZWJ0LCBpbnRlcmVzdCB9LFxuICAgICAgICAgICAgbG9ja2VkOiBmYWNldHMuc2VsZi5nZXRDb2xsYXRlcmFsQW1vdW50KCksXG4gICAgICAgICAgICAvKiBuZXdQaGFzZSBwYXJhbSBpcyBzbyB0aGF0IG1ha2VUcmFuc2Zlckludml0YXRpb24gY2FuIGZpbmlzaCB3aXRob3V0IHNldHRpbmcgdGhlIHZhdWx0J3MgcGhhc2UqL1xuICAgICAgICAgICAgLyogVE9ETyByZWZhY3RvciBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ0MTUqL1xuICAgICAgICAgICAgdmF1bHRTdGF0ZTogbmV3UGhhc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqIGNhbGwgdGhpcyB3aGVuZXZlciBhbnl0aGluZyBjaGFuZ2VzISAqL1xuICAgICAgICB1cGRhdGVVaVN0YXRlKCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IG91dGVyVXBkYXRlciB9ID0gc3RhdGU7XG4gICAgICAgICAgaWYgKCFvdXRlclVwZGF0ZXIpIHtcbiAgICAgICAgICAgIC8qIEl0J3Mgbm90IGFuIGVycm9yIHRvIGNoYW5nZSB0byBsaXF1aWRhdGluZyBkdXJpbmcgdHJhbnNmZXIqL1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB7IHBoYXNlIH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCB1aVN0YXRlID0gZmFjZXRzLmhlbHBlci5nZXRTdGF0ZVNuYXBzaG90KHBoYXNlKTtcbiAgICAgICAgICBjb25zdCBicmFuZCA9IGZhY2V0cy5oZWxwZXIuY29sbGF0ZXJhbEJyYW5kKCk7XG4gICAgICAgICAgdHJhY2UoYnJhbmQsICd1cGRhdGVVaVN0YXRlJywgc3RhdGUuaWRJbk1hbmFnZXIsIHVpU3RhdGUpO1xuXG4gICAgICAgICAgc3dpdGNoIChwaGFzZSkge1xuICAgICAgICAgICAgY2FzZSBQaGFzZS5BQ1RJVkU6XG4gICAgICAgICAgICBjYXNlIFBoYXNlLkxJUVVJREFUSU5HOlxuICAgICAgICAgICAgY2FzZSBQaGFzZS5MSVFVSURBVEVEOlxuICAgICAgICAgICAgICB2b2lkIG91dGVyVXBkYXRlci53cml0ZSh1aVN0YXRlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBoYXNlLkNMT1NFRDpcbiAgICAgICAgICAgICAgdm9pZCBvdXRlclVwZGF0ZXIud3JpdGVGaW5hbCh1aVN0YXRlKTtcbiAgICAgICAgICAgICAgc3RhdGUub3V0ZXJVcGRhdGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgdW5yZWFjaGFibGUgdmF1bHQgcGhhc2U6ICR7cGhhc2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIC8qKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXQgKi9cbiAgICAgICAgYXN5bmMgY2xvc2VIb29rKHNlYXQpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG5cbiAgICAgICAgICBjb25zdCB7IHNlbGYsIGhlbHBlciB9ID0gZmFjZXRzO1xuICAgICAgICAgIGhlbHBlci5hc3NlcnRDbG9zZWFibGUoKTtcbiAgICAgICAgICBjb25zdCB7IHBoYXNlLCB2YXVsdFNlYXQgfSA9IHN0YXRlO1xuXG4gICAgICAgICAgLyogSGVsZCBhcyBrZXlzIGZvciBjbGVhbnVwIGluIHRoZSBtYW5hZ2VyKi9cbiAgICAgICAgICBjb25zdCBvbGREZWJ0Tm9ybWFsaXplZCA9IHNlbGYuZ2V0Tm9ybWFsaXplZERlYnQoKTtcbiAgICAgICAgICBjb25zdCBvbGRDb2xsYXRlcmFsID0gc2VsZi5nZXRDb2xsYXRlcmFsQW1vdW50KCk7XG5cbiAgICAgICAgICBpZiAocGhhc2UgPT09IFBoYXNlLkFDVElWRSkge1xuICAgICAgICAgICAgLyogeW91J3JlIHBheWluZyBvZmYgdGhlIGRlYnQsIHlvdSBnZXQgZXZlcnl0aGluZyBiYWNrLiovXG4gICAgICAgICAgICBjb25zdCBkZWJ0ID0gc2VsZi5nZXRDdXJyZW50RGVidCgpO1xuICAgICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgICBnaXZlOiB7IE1pbnRlZDogZ2l2ZW4gfSxcbiAgICAgICAgICAgIH0gPSBzZWF0LmdldFByb3Bvc2FsKCk7XG4gICAgICAgICAgICBnaXZlbiB8fCBGYWlsYGNsb3NpbmcgYW4gYWN0aXZlIHZhdWx0IHJlcXVpcmVzIGEgZ2l2ZWA7XG5cbiAgICAgICAgICAgIC8qIHlvdSBtdXN0IHBheSBvZmYgdGhlIGVudGlyZSByZW1haW5kZXIgYnV0IGlmIHlvdSBvZmZlciB0b28gbXVjaCwgd2Ugd29uJ3QqL1xuICAgICAgICAgICAgLyogdGFrZSBtb3JlIHRoYW4geW91IG93ZSovXG4gICAgICAgICAgICBBbW91bnRNYXRoLmlzR1RFKGdpdmVuLCBkZWJ0KSB8fFxuICAgICAgICAgICAgICBGYWlsYE9mZmVyICR7cShnaXZlbil9IGlzIG5vdCBzdWZmaWNpZW50IHRvIHBheSBvZmYgZGVidCAke3EoXG4gICAgICAgICAgICAgICAgZGVidCxcbiAgICAgICAgICAgICAgKX1gO1xuXG4gICAgICAgICAgICAvKiBSZXR1cm4gYW55IG92ZXJwYXltZW50Ki9cbiAgICAgICAgICAgIGF0b21pY1RyYW5zZmVyKFxuICAgICAgICAgICAgICB6Y2YsXG4gICAgICAgICAgICAgIHZhdWx0U2VhdCxcbiAgICAgICAgICAgICAgc2VhdCxcbiAgICAgICAgICAgICAgdmF1bHRTZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBzdGF0ZS5tYW5hZ2VyLmJ1cm4oZGVidCwgc2VhdCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChwaGFzZSA9PT0gUGhhc2UuTElRVUlEQVRFRCkge1xuICAgICAgICAgICAgLyogU2ltcGx5IHJlYWxsb2NhdGUgdmF1bHQgYXNzZXRzIHRvIHRoZSBvZmZlciBzZWF0LiovXG4gICAgICAgICAgICAvKiBEb24ndCB0YWtlIGFueXRoaW5nIGZyb20gdGhlIG9mZmVyLCBldmVuIGlmIHZhdWx0IGlzIHVuZGVyd2F0ZXIuKi9cbiAgICAgICAgICAgIC8qIFRPRE8gdmVyaWZ5IHRoYXQgcmV0dXJuaW5nIE1pbnRlZCBoZXJlIGRvZXNuJ3QgbWVzcyB1cCBkZWJ0IGxpbWl0cyovXG5cbiAgICAgICAgICAgIGF0b21pY1RyYW5zZmVyKFxuICAgICAgICAgICAgICB6Y2YsXG4gICAgICAgICAgICAgIHZhdWx0U2VhdCxcbiAgICAgICAgICAgICAgc2VhdCxcbiAgICAgICAgICAgICAgdmF1bHRTZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignb25seSBhY3RpdmUgYW5kIGxpcXVpZGF0ZWQgdmF1bHRzIGNhbiBiZSBjbG9zZWQnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzZWF0LmV4aXQoKTtcbiAgICAgICAgICBoZWxwZXIuYXNzaWduUGhhc2UoUGhhc2UuQ0xPU0VEKTtcbiAgICAgICAgICBoZWxwZXIudXBkYXRlRGVidFNuYXBzaG90KGhlbHBlci5lbXB0eURlYnQoKSk7XG4gICAgICAgICAgaGVscGVyLnVwZGF0ZVVpU3RhdGUoKTtcbiAgICAgICAgICBoZWxwZXIuYXNzZXJ0VmF1bHRIb2xkc05vTWludGVkKCk7XG4gICAgICAgICAgdmF1bHRTZWF0LmV4aXQoKTtcblxuICAgICAgICAgIHN0YXRlLm1hbmFnZXIuaGFuZGxlQmFsYW5jZUNoYW5nZShcbiAgICAgICAgICAgIG9sZERlYnROb3JtYWxpemVkLFxuICAgICAgICAgICAgb2xkQ29sbGF0ZXJhbCxcbiAgICAgICAgICAgIHN0YXRlLmlkSW5NYW5hZ2VyLFxuICAgICAgICAgICAgc3RhdGUucGhhc2UsXG4gICAgICAgICAgICBmYWNldHMuc2VsZixcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuICd5b3VyIHZhdWx0IGlzIGNsb3NlZCwgdGhhbmsgeW91IGZvciB5b3VyIGJ1c2luZXNzJztcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAqIENhbGN1bGF0ZSB0aGUgZmVlLCB0aGUgYW1vdW50IHRvIG1pbnQgYW5kIHRoZSByZXN1bHRpbmcgZGVidC4gVGhlXG4gKiBnaXZlIGFuZCB0aGUgd2FudCB0b2dldGhlciByZWZsZWN0IGEgZGVsdGEsIHdoZXJlIHR5cGljYWxseSBvbmUgaXNcbiAqIHplcm8gYmVjYXVzZSB0aGV5IGNvbWUgZnJvbSB0aGUgZ2F2ZS93YW50IG9mIGFuIG9mZmVyIHByb3Bvc2FsLiBJZlxuICogdGhlIGB3YW50YCBpcyB6ZXJvLCB0aGUgYGZlZWAgd2lsbCBhbHNvIGJlIHplcm8sIHNvIHRoZSBzaW1wbGUgbWF0aFxuICogd29ya3MuXG4gKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBjdXJyZW50RGVidFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBnaXZlQW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHdhbnRBbW91bnRcbiAqL1xuICAgICAgICBkZWJ0RmVlKGN1cnJlbnREZWJ0LCBnaXZlQW1vdW50LCB3YW50QW1vdW50KSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcblxuICAgICAgICAgIHJldHVybiBjYWxjdWxhdGVEZWJ0Q29zdHMoXG4gICAgICAgICAgICBjdXJyZW50RGVidCxcbiAgICAgICAgICAgIGdpdmVBbW91bnQsXG4gICAgICAgICAgICB3YW50QW1vdW50LFxuICAgICAgICAgICAgc3RhdGUubWFuYWdlci5nZXRHb3Zlcm5lZFBhcmFtcygpLmdldE1pbnRGZWUoKSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICogQWRqdXN0IHByaW5jaXBhbCBhbmQgY29sbGF0ZXJhbCAoYXRvbWljYWxseSBmb3Igb2ZmZXIgc2FmZXR5KVxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gY2xpZW50U2VhdFxuICogQHJldHVybnMge3N0cmluZ30gc3VjY2VzcyBtZXNzYWdlXG4gKi9cbiAgICAgICAgYWRqdXN0QmFsYW5jZXNIb29rKGNsaWVudFNlYXQpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG5cbiAgICAgICAgICBjb25zdCB7IHNlbGYsIGhlbHBlciB9ID0gZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IHsgdmF1bHRTZWF0IH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCBmcCA9IGhlbHBlci5mdWxsUHJvcG9zYWwoY2xpZW50U2VhdC5nZXRQcm9wb3NhbCgpKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGFsbEVtcHR5KFtcbiAgICAgICAgICAgICAgZnAuZ2l2ZS5Db2xsYXRlcmFsLFxuICAgICAgICAgICAgICBmcC5naXZlLk1pbnRlZCxcbiAgICAgICAgICAgICAgZnAud2FudC5Db2xsYXRlcmFsLFxuICAgICAgICAgICAgICBmcC53YW50Lk1pbnRlZCxcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjbGllbnRTZWF0LmV4aXQoKTtcbiAgICAgICAgICAgIHJldHVybiAnbm8gdHJhbnNhY3Rpb24sIGFzIHJlcXVlc3RlZCc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLyogQ2FsY3VsYXRlIHRoZSBmZWUsIHRoZSBhbW91bnQgdG8gbWludCBhbmQgdGhlIHJlc3VsdGluZyBkZWJ0LiBXZSdsbCovXG4gICAgICAgICAgLyogdmVyaWZ5IHRoYXQgdGhlIHRhcmdldCBkZWJ0IGRvZXNuJ3QgdmlvbGF0ZSB0aGUgY29sbGF0ZXJhbGl6YXRpb24gcmF0aW8sKi9cbiAgICAgICAgICAvKiB0aGVuIG1pbnQsIHJlYWxsb2NhdGUsIGFuZCBidXJuLiovXG4gICAgICAgICAgY29uc3QgeyBuZXdEZWJ0LCBmZWUsIHN1cnBsdXMsIHRvTWludCB9ID0gaGVscGVyLmRlYnRGZWUoXG4gICAgICAgICAgICBzZWxmLmdldEN1cnJlbnREZWJ0KCksXG4gICAgICAgICAgICBmcC5naXZlLk1pbnRlZCxcbiAgICAgICAgICAgIGZwLndhbnQuTWludGVkLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkRGVidFByZSA9IHNlbGYuZ2V0Tm9ybWFsaXplZERlYnQoKTtcbiAgICAgICAgICBjb25zdCBjb2xsYXRlcmFsUHJlID0gaGVscGVyLmdldENvbGxhdGVyYWxBbGxvY2F0ZWQodmF1bHRTZWF0KTtcblxuICAgICAgICAgIGNvbnN0IGhhc1dhbnRzID0gIWFsbEVtcHR5KFtmcC53YW50LkNvbGxhdGVyYWwsIGZwLndhbnQuTWludGVkXSk7XG4gICAgICAgICAgaWYgKGhhc1dhbnRzKSB7XG4gICAgICAgICAgICBjb25zdCBuZXdDb2xsYXRlcmFsID0gYWRkU3VidHJhY3QoXG4gICAgICAgICAgICAgIGNvbGxhdGVyYWxQcmUsXG4gICAgICAgICAgICAgIGZwLmdpdmUuQ29sbGF0ZXJhbCxcbiAgICAgICAgICAgICAgZnAud2FudC5Db2xsYXRlcmFsLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGhlbHBlci5hc3NlcnRTdWZmaWNpZW50Q29sbGF0ZXJhbChuZXdDb2xsYXRlcmFsLCBuZXdEZWJ0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gaGVscGVyLmNvbW1pdEJhbGFuY2VBZGp1c3RtZW50KFxuICAgICAgICAgICAgY2xpZW50U2VhdCxcbiAgICAgICAgICAgIGZwLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBuZXdEZWJ0LFxuICAgICAgICAgICAgICBmZWUsXG4gICAgICAgICAgICAgIHN1cnBsdXMsXG4gICAgICAgICAgICAgIHRvTWludCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IG5vcm1hbGl6ZWREZWJ0UHJlLCBjb2xsYXRlcmFsUHJlIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAqIEBwYXJhbSB7WkNGU2VhdH0gY2xpZW50U2VhdFxuICogQHBhcmFtIHtGdWxsUHJvcG9zYWx9IGZwXG4gKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIGNhbGN1bGF0ZURlYnRDb3N0cz59IGNvc3RzXG4gKiBAcGFyYW0ge29iamVjdH0gYWNjb3VudGluZ1xuICogQHBhcmFtIHtOb3JtYWxpemVkRGVidH0gYWNjb3VudGluZy5ub3JtYWxpemVkRGVidFByZVxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhY2NvdW50aW5nLmNvbGxhdGVyYWxQcmVcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHN1Y2Nlc3MgbWVzc2FnZVxuICovXG4gICAgICAgIGNvbW1pdEJhbGFuY2VBZGp1c3RtZW50KFxuICAgICAgICAgIGNsaWVudFNlYXQsXG4gICAgICAgICAgZnAsXG4gICAgICAgICAgeyBuZXdEZWJ0LCBmZWUsIHN1cnBsdXMsIHRvTWludCB9LFxuICAgICAgICAgIHsgbm9ybWFsaXplZERlYnRQcmUsIGNvbGxhdGVyYWxQcmUgfSxcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSBmYWNldHM7XG4gICAgICAgICAgY29uc3QgeyB2YXVsdFNlYXQgfSA9IHN0YXRlO1xuXG4gICAgICAgICAgY29uc3QgZ2l2ZU1pbnRlZFRha2VuID0gQW1vdW50TWF0aC5zdWJ0cmFjdChmcC5naXZlLk1pbnRlZCwgc3VycGx1cyk7XG5cbiAgICAgICAgICAvKiogQHR5cGUge1RyYW5zZmVyUGFydFtdfSAqL1xuICAgICAgICAgIGNvbnN0IHRyYW5zZmVycyA9IGhhcmRlbihbXG4gICAgICAgICAgICBbY2xpZW50U2VhdCwgdmF1bHRTZWF0LCB7IENvbGxhdGVyYWw6IGZwLmdpdmUuQ29sbGF0ZXJhbCB9XSxcbiAgICAgICAgICAgIFt2YXVsdFNlYXQsIGNsaWVudFNlYXQsIHsgQ29sbGF0ZXJhbDogZnAud2FudC5Db2xsYXRlcmFsIH1dLFxuICAgICAgICAgICAgW2NsaWVudFNlYXQsIHZhdWx0U2VhdCwgeyBNaW50ZWQ6IGdpdmVNaW50ZWRUYWtlbiB9XVxuICAgICAgICAgICAgLyogTWludGVkIGludG8gdmF1bHRTZWF0IHJlcXVpcmVzIG1pbnRpbmcgYW5kIHNvIGlzIGRvbmUgYnkgbWludEFuZFRyYW5zZmVyKi9cbiAgICAgICAgICBdKTtcblxuICAgICAgICAgIHN0YXRlLm1hbmFnZXIubWludEFuZFRyYW5zZmVyKGNsaWVudFNlYXQsIHRvTWludCwgZmVlLCB0cmFuc2ZlcnMpO1xuXG4gICAgICAgICAgLyogcGFyZW50IG5lZWRzIHRvIGtub3cgYWJvdXQgdGhlIGNoYW5nZSBpbiBkZWJ0Ki9cbiAgICAgICAgICBoZWxwZXIudXBkYXRlRGVidEFjY291bnRpbmcoXG4gICAgICAgICAgICBub3JtYWxpemVkRGVidFByZSxcbiAgICAgICAgICAgIGNvbGxhdGVyYWxQcmUsXG4gICAgICAgICAgICBuZXdEZWJ0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgc3RhdGUubWFuYWdlci5idXJuKGdpdmVNaW50ZWRUYWtlbiwgdmF1bHRTZWF0KTtcbiAgICAgICAgICBoZWxwZXIuYXNzZXJ0VmF1bHRIb2xkc05vTWludGVkKCk7XG5cbiAgICAgICAgICBoZWxwZXIudXBkYXRlVWlTdGF0ZSgpO1xuICAgICAgICAgIGNsaWVudFNlYXQuZXhpdCgpO1xuICAgICAgICAgIHJldHVybiAnV2UgaGF2ZSBhZGp1c3RlZCB5b3VyIGJhbGFuY2VzLCB0aGFuayB5b3UgZm9yIHlvdXIgYnVzaW5lc3MnO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcmV0dXJucyB7VmF1bHRLaXR9XG4gKi9cbiAgICAgICAgbWFrZVRyYW5zZmVySW52aXRhdGlvbkhvb2soc2VhdCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcblxuICAgICAgICAgIGNvbnN0IHsgc2VsZiwgaGVscGVyIH0gPSBmYWNldHM7XG4gICAgICAgICAgaGVscGVyLmFzc2VydENsb3NlYWJsZSgpO1xuICAgICAgICAgIHNlYXQuZXhpdCgpO1xuXG4gICAgICAgICAgY29uc3QgdmF1bHRLaXQgPSBtYWtlVmF1bHRLaXQoc2VsZiwgc3RhdGUuc3RvcmFnZU5vZGUpO1xuICAgICAgICAgIHN0YXRlLm91dGVyVXBkYXRlciA9IHZhdWx0S2l0LnZhdWx0VXBkYXRlcjtcbiAgICAgICAgICBoZWxwZXIudXBkYXRlVWlTdGF0ZSgpO1xuXG4gICAgICAgICAgcmV0dXJuIHZhdWx0S2l0O1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNlbGY6IHtcbiAgICAgICAgZ2V0VmF1bHRTZWF0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnZhdWx0U2VhdDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICovXG4gICAgICAgIGFzeW5jIGluaXRWYXVsdEtpdChzZWF0LCBzdG9yYWdlTm9kZSkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcblxuICAgICAgICAgIGNvbnN0IHsgc2VsZiwgaGVscGVyIH0gPSBmYWNldHM7XG5cbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkRGVidFByZSA9IHNlbGYuZ2V0Tm9ybWFsaXplZERlYnQoKTtcbiAgICAgICAgICBjb25zdCBhY3R1YWxEZWJ0UHJlID0gc2VsZi5nZXRDdXJyZW50RGVidCgpO1xuICAgICAgICAgIChBbW91bnRNYXRoLmlzRW1wdHkobm9ybWFsaXplZERlYnRQcmUpICYmXG4gICAgICAgICAgICBBbW91bnRNYXRoLmlzRW1wdHkoYWN0dWFsRGVidFByZSkpIHx8XG4gICAgICAgICAgICBGYWlsYHZhdWx0IG11c3QgYmUgZW1wdHkgaW5pdGlhbGx5YDtcblxuICAgICAgICAgIGNvbnN0IGNvbGxhdGVyYWxQcmUgPSBzZWxmLmdldENvbGxhdGVyYWxBbW91bnQoKTtcbiAgICAgICAgICB0cmFjZSgnaW5pdFZhdWx0S2l0IHN0YXJ0OiBjb2xsYXRlcmFsJywgc3RhdGUuaWRJbk1hbmFnZXIsIHtcbiAgICAgICAgICAgIGFjdHVhbERlYnRQcmUsXG4gICAgICAgICAgICBjb2xsYXRlcmFsUHJlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLyogZ2V0IHRoZSBwYXlvdXQgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGNvbGxhdGVyYWwgaWYgdGhlKi9cbiAgICAgICAgICAvKiBjb250cmFjdCBhYmFuZG9ucyovXG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZ2l2ZTogeyBDb2xsYXRlcmFsOiBnaXZlQ29sbGF0ZXJhbCB9LFxuICAgICAgICAgICAgd2FudDogeyBNaW50ZWQ6IHdhbnRNaW50ZWQgfSxcbiAgICAgICAgICB9ID0gc2VhdC5nZXRQcm9wb3NhbCgpO1xuXG4gICAgICAgICAgY29uc3QgbWluSW5pdGlhbERlYnQgPSBzdGF0ZS5tYW5hZ2VyXG4gICAgICAgICAgICAuZ2V0R292ZXJuZWRQYXJhbXMoKVxuICAgICAgICAgICAgLmdldE1pbkluaXRpYWxEZWJ0KCk7XG4gICAgICAgICAgQW1vdW50TWF0aC5pc0dURSh3YW50TWludGVkLCBtaW5Jbml0aWFsRGVidCkgfHxcbiAgICAgICAgICAgIEZhaWxgVmF1bHQgY3JlYXRpb24gcmVxdWlyZXMgYSBtaW5Jbml0aWFsRGVidCBvZiAke3EoXG4gICAgICAgICAgICAgIG1pbkluaXRpYWxEZWJ0LFxuICAgICAgICAgICAgKX1gO1xuXG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgbmV3RGVidDogbmV3RGVidFByZSxcbiAgICAgICAgICAgIGZlZSxcbiAgICAgICAgICAgIHRvTWludCxcbiAgICAgICAgICB9ID0gaGVscGVyLmRlYnRGZWUoYWN0dWFsRGVidFByZSwgaGVscGVyLmVtcHR5RGVidCgpLCB3YW50TWludGVkKTtcbiAgICAgICAgICAhQW1vdW50TWF0aC5pc0VtcHR5KGZlZSkgfHxcbiAgICAgICAgICAgIEZhaWxgZGVidCByZXF1ZXN0ZWQgKCR7d2FudE1pbnRlZH0pIHRvbyBzbWFsbCB0byBhY2NydWUgaW50ZXJlc3RgO1xuICAgICAgICAgIEFtb3VudE1hdGguaXNFcXVhbChuZXdEZWJ0UHJlLCB0b01pbnQpIHx8XG4gICAgICAgICAgICBGYWlsYGZlZSBtaXNtYXRjaCBmb3IgdmF1bHRgO1xuICAgICAgICAgIHRyYWNlKFxuICAgICAgICAgICAgJ2luaXRWYXVsdCcsXG4gICAgICAgICAgICBzdGF0ZS5pZEluTWFuYWdlcixcbiAgICAgICAgICAgIHsgd2FudGVkUnVuOiB3YW50TWludGVkLCBmZWUgfSxcbiAgICAgICAgICAgIHNlbGYuZ2V0Q29sbGF0ZXJhbEFtb3VudCgpLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBoZWxwZXIuYXNzZXJ0U3VmZmljaWVudENvbGxhdGVyYWwoZ2l2ZUNvbGxhdGVyYWwsIG5ld0RlYnRQcmUpO1xuXG4gICAgICAgICAgY29uc3QgeyB2YXVsdFNlYXQgfSA9IHN0YXRlO1xuICAgICAgICAgIHN0YXRlLm1hbmFnZXIubWludEFuZFRyYW5zZmVyKFxuICAgICAgICAgICAgc2VhdCxcbiAgICAgICAgICAgIHRvTWludCxcbiAgICAgICAgICAgIGZlZSxcbiAgICAgICAgICAgIGhhcmRlbihbW3NlYXQsIHZhdWx0U2VhdCwgeyBDb2xsYXRlcmFsOiBnaXZlQ29sbGF0ZXJhbCB9XV0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgc2VhdC5leGl0KCk7XG5cbiAgICAgICAgICBoZWxwZXIudXBkYXRlRGVidEFjY291bnRpbmcoXG4gICAgICAgICAgICBub3JtYWxpemVkRGVidFByZSxcbiAgICAgICAgICAgIGNvbGxhdGVyYWxQcmUsXG4gICAgICAgICAgICBuZXdEZWJ0UHJlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHJhY2UoJ2luaXRWYXVsdCB1cGRhdGVEZWJ0QWNjb3VudGluZyBmaXJlZCcpO1xuXG4gICAgICAgICAgLyogU28gdGhhdCBtYWtlVmF1bHRLaXQgY2FuIGJlIHN5bmNocm9ub3VzKi9cbiAgICAgICAgICBjb25zdCB2YXVsdEtpdCA9IG1ha2VWYXVsdEtpdChzZWxmLCBzdG9yYWdlTm9kZSk7XG4gICAgICAgICAgc3RhdGUub3V0ZXJVcGRhdGVyID0gdmF1bHRLaXQudmF1bHRVcGRhdGVyO1xuICAgICAgICAgIGhlbHBlci51cGRhdGVVaVN0YXRlKCk7XG4gICAgICAgICAgcmV0dXJuIHZhdWx0S2l0O1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKiBDYWxsZWQgYnkgbWFuYWdlciBhdCBzdGFydCBvZiBsaXF1aWRhdGlvbi4gKi9cbiAgICAgICAgbGlxdWlkYXRpbmcoKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWNldHMgfSA9IHRoaXM7XG5cbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gZmFjZXRzO1xuICAgICAgICAgIGhlbHBlci5hc3NpZ25QaGFzZShQaGFzZS5MSVFVSURBVElORyk7XG4gICAgICAgICAgaGVscGVyLnVwZGF0ZVVpU3RhdGUoKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAqIENhbGxlZCBieSBtYW5hZ2VyIGF0IGVuZCBvZiBsaXF1aWRhdGlvbiwgYXQgd2hpY2ggcG9pbnQgYWxsIGRlYnRzXG4gKiBoYXZlIGJlZW4gY292ZXJlZC5cbiAqL1xuICAgICAgICBsaXF1aWRhdGVkKCkge1xuICAgICAgICAgIGNvbnN0IHsgZmFjZXRzIH0gPSB0aGlzO1xuXG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IGZhY2V0cztcbiAgICAgICAgICBoZWxwZXIudXBkYXRlRGVidFNuYXBzaG90KFxuICAgICAgICAgICAgLyogbGlxdWlkYXRlZCB2YXVsdHMgcmV0YWluIG5vIGRlYnQqL1xuICAgICAgICAgICAgQW1vdW50TWF0aC5tYWtlRW1wdHkoaGVscGVyLmRlYnRCcmFuZCgpKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaGVscGVyLmFzc2lnblBoYXNlKFBoYXNlLkxJUVVJREFURUQpO1xuICAgICAgICAgIGhlbHBlci51cGRhdGVVaVN0YXRlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gKiBDYWxsZWQgYnkgdmF1bHRNYW5hZ2VyIHdoZW4gdGhlIGF1Y3Rpb24gd2Fzbid0IGFibGUgdG8gc2VsbCB0aGVcbiAqIGNvbGxhdGVyYWwuIFRoZSBsaXF1aWRhdGlvbiBmZWUgd2FzIGNoYXJnZWQgYWdhaW5zdCB0aGUgY29sbGF0ZXJhbCxcbiAqIGJ1dCB0aGUgZGVidCB3aWxsIGJlIHJlc3RvcmVkIGFuZCB0aGUgdmF1bHQgd2lsbCBiZSBhY3RpdmUgYWdhaW4uXG4gKiBMaXF1aWRhdGlvbi5tZCBoYXMgZGV0YWlscyBvbiB0aGUgbGlxdWlkYXRpb24gYXBwcm9hY2guXG4gKi9cbiAgICAgICAgYWJvcnRMaXF1aWRhdGlvbigpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG5cbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gZmFjZXRzO1xuXG4gICAgICAgICAgaGVscGVyLmFzc2lnblBoYXNlKFBoYXNlLkFDVElWRSk7XG4gICAgICAgICAgaGVscGVyLnVwZGF0ZVVpU3RhdGUoKTtcbiAgICAgICAgICByZXR1cm4gc3RhdGUuaWRJbk1hbmFnZXI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbWFrZUFkanVzdEJhbGFuY2VzSW52aXRhdGlvbigpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IGZhY2V0cztcbiAgICAgICAgICBoZWxwZXIuYXNzZXJ0QWN0aXZlKCk7XG5cbiAgICAgICAgICByZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKFxuICAgICAgICAgICAgc2VhdCA9PiBoZWxwZXIuYWRqdXN0QmFsYW5jZXNIb29rKHNlYXQpLFxuICAgICAgICAgICAgc3RhdGUubWFuYWdlci5zY29wZURlc2NyaXB0aW9uKCdBZGp1c3RCYWxhbmNlcycpLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgTS5zcGxpdFJlY29yZCh7XG4gICAgICAgICAgICAgIGdpdmU6IE0uc3BsaXRSZWNvcmQoXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgLyogSXQgbWF5IHNlZW0gb2RkIHRvIGdpdmUgYm90aCBhdCBvbmNlIGJ1dCB0aGVyZSBpcyB1c2UgY2FzZToqL1xuICAgICAgICAgICAgICAgICAgLyogVG8gcmVzY3VlIGEgdmF1bHQgdGhhdCdzIG9uIHRoZSB2ZXJnZSBvZiBiZWluZyBsaXF1aWRhdGVkKi9cbiAgICAgICAgICAgICAgICAgIC8qIHdoZW4geW91IGhhdmUgbGltaXRlZCByZXNvdXJjZXMsIHlvdSBtaWdodCBhZGQgY29sbGF0ZXJhbCovXG4gICAgICAgICAgICAgICAgICAvKiBhdCB0aGUgc2FtZSB0aW1lIHRoYXQgeW91J3JlIHJlcGF5aW5nIElTVC4qL1xuICAgICAgICAgICAgICAgICAgQ29sbGF0ZXJhbDogbWFrZU5hdEFtb3VudFNoYXBlKGhlbHBlci5jb2xsYXRlcmFsQnJhbmQoKSksXG4gICAgICAgICAgICAgICAgICBNaW50ZWQ6IG1ha2VOYXRBbW91bnRTaGFwZShoZWxwZXIuZGVidEJyYW5kKCkpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHdhbnQ6IE0uc3BsaXRSZWNvcmQoXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgQ29sbGF0ZXJhbDogbWFrZU5hdEFtb3VudFNoYXBlKGhlbHBlci5jb2xsYXRlcmFsQnJhbmQoKSksXG4gICAgICAgICAgICAgICAgICBNaW50ZWQ6IG1ha2VOYXRBbW91bnRTaGFwZShoZWxwZXIuZGVidEJyYW5kKCkpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIG1ha2VDbG9zZUludml0YXRpb24oKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSBmYWNldHM7XG4gICAgICAgICAgaGVscGVyLmFzc2VydENsb3NlYWJsZSgpO1xuICAgICAgICAgIHJldHVybiB6Y2YubWFrZUludml0YXRpb24oXG4gICAgICAgICAgICBzZWF0ID0+IGhlbHBlci5jbG9zZUhvb2soc2VhdCksXG4gICAgICAgICAgICBzdGF0ZS5tYW5hZ2VyLnNjb3BlRGVzY3JpcHRpb24oJ0Nsb3NlVmF1bHQnKSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIE0uc3BsaXRSZWNvcmQoe1xuICAgICAgICAgICAgICBnaXZlOiBNLnNwbGl0UmVjb3JkKFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIE1pbnRlZDogbWFrZU5hdEFtb3VudFNoYXBlKGhlbHBlci5kZWJ0QnJhbmQoKSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgd2FudDogTS5zcGxpdFJlY29yZChcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBDb2xsYXRlcmFsOiBtYWtlTmF0QW1vdW50U2hhcGUoaGVscGVyLmNvbGxhdGVyYWxCcmFuZCgpKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiogQHJldHVybnMge1Byb21pc2U8SW52aXRhdGlvbjxWYXVsdEtpdD4+fSAqL1xuICAgICAgICBtYWtlVHJhbnNmZXJJbnZpdGF0aW9uKCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IG91dGVyVXBkYXRlciB9ID0gc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyBzZWxmLCBoZWxwZXIgfSA9IGZhY2V0cztcbiAgICAgICAgICAvKiBCcmluZyB0aGUgZGVidCBzbmFwc2hvdCBjdXJyZW50IGZvciB0aGUgZmluYWwgcmVwb3J0IGJlZm9yZSB0cmFuc2ZlciovXG4gICAgICAgICAgaGVscGVyLnVwZGF0ZURlYnRTbmFwc2hvdChzZWxmLmdldEN1cnJlbnREZWJ0KCkpO1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGRlYnRTbmFwc2hvdDogZGVidCxcbiAgICAgICAgICAgIGludGVyZXN0U25hcHNob3Q6IGludGVyZXN0LFxuICAgICAgICAgICAgcGhhc2UsXG4gICAgICAgICAgfSA9IHN0YXRlO1xuICAgICAgICAgIGlmIChvdXRlclVwZGF0ZXIpIHtcbiAgICAgICAgICAgIHZvaWQgb3V0ZXJVcGRhdGVyLndyaXRlRmluYWwoXG4gICAgICAgICAgICAgIGhlbHBlci5nZXRTdGF0ZVNuYXBzaG90KFBoYXNlLlRSQU5TRkVSKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBzdGF0ZS5vdXRlclVwZGF0ZXIgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB0cmFuc2ZlclN0YXRlID0ge1xuICAgICAgICAgICAgZGVidFNuYXBzaG90OiB7IGRlYnQsIGludGVyZXN0IH0sXG4gICAgICAgICAgICBsb2NrZWQ6IHNlbGYuZ2V0Q29sbGF0ZXJhbEFtb3VudCgpLFxuICAgICAgICAgICAgdmF1bHRTdGF0ZTogcGhhc2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKFxuICAgICAgICAgICAgc2VhdCA9PiBoZWxwZXIubWFrZVRyYW5zZmVySW52aXRhdGlvbkhvb2soc2VhdCksXG4gICAgICAgICAgICBzdGF0ZS5tYW5hZ2VyLnNjb3BlRGVzY3JpcHRpb24oJ1RyYW5zZmVyVmF1bHQnKSxcbiAgICAgICAgICAgIHRyYW5zZmVyU3RhdGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiBmb3Igc3RhdHVzL2RlYnVnZ2luZyovXG5cbiAgICAgICAgLyoqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fSAqL1xuICAgICAgICBnZXRDb2xsYXRlcmFsQW1vdW50KCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IHZhdWx0U2VhdCB9ID0gc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IGZhY2V0cztcbiAgICAgICAgICAvKiBnZXRDb2xsYXRlcmFsQWxsb2NhdGVkIHdvdWxkIHJldHVybiBmaW5hbCBhbGxvY2F0aW9ucyovXG4gICAgICAgICAgcmV0dXJuIHZhdWx0U2VhdC5oYXNFeGl0ZWQoKVxuICAgICAgICAgICAgPyBoZWxwZXIuZW1wdHlDb2xsYXRlcmFsKClcbiAgICAgICAgICAgIDogaGVscGVyLmdldENvbGxhdGVyYWxBbGxvY2F0ZWQodmF1bHRTZWF0KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAqIFRoZSBhY3R1YWwgY3VycmVudCBkZWJ0LCBpbmNsdWRpbmcgYWNjcnVlZCBpbnRlcmVzdC5cbiAqXG4gKiBUaGlzIGxvb2tzIGxpa2UgYSBzaW1wbGUgZ2V0dGVyIGJ1dCBpdCBkb2VzIGEgbG90IG9mIHRoZSBoZWF2eVxuICogbGlmdGluZyBmb3IgaW50ZXJlc3QgYWNjcnVhbC4gUmF0aGVyIHRoYW4gdXBkYXRpbmcgYWxsIHJlY29yZHMgd2hlblxuICogaW50ZXJlc3QgYWNjcnVlcywgdGhlIHZhdWx0IG1hbmFnZXIgdXBkYXRlcyBqdXN0IGl0cyByb2xsaW5nXG4gKiBjb21wb3VuZGVkIGludGVyZXN0LiBIZXJlIHdlIGNhbGN1bGF0ZSB3aGF0IHRoZSBjdXJyZW50IGRlYnQgaXMgZ2l2ZW5cbiAqIHdoYXQncyByZWNvcmRlZCBpbiB0aGlzIHZhdWx0IGFuZCB3aGF0IGludGVyZXN0IGhhcyBjb21wb3VuZGVkIHNpbmNlXG4gKiB0aGlzIHZhdWx0IHJlY29yZCB3YXMgd3JpdHRlbi5cbiAqXG4gKiBAcmV0dXJucyB7QW1vdW50PCduYXQnPn1cbiAqIEBzZWUgZ2V0Tm9ybWFsaXplZERlYnRcbiAqL1xuICAgICAgICBnZXRDdXJyZW50RGVidCgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIHJldHVybiBjYWxjdWxhdGVDdXJyZW50RGVidChcbiAgICAgICAgICAgIHN0YXRlLmRlYnRTbmFwc2hvdCxcbiAgICAgICAgICAgIHN0YXRlLmludGVyZXN0U25hcHNob3QsXG4gICAgICAgICAgICBzdGF0ZS5tYW5hZ2VyLmdldENvbXBvdW5kZWRJbnRlcmVzdCgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gKiBUaGUgbm9ybWFsaXphdGlvbiBwdXRzIGFsbCBkZWJ0cyBvbiBhIGNvbW1vbiB0aW1lLWluZGVwZW5kZW50IHNjYWxlXG4gKiBzaW5jZSB0aGUgbGF1bmNoIG9mIHRoaXMgdmF1bHQgbWFuYWdlci4gVGhpcyBhbGxvd3MgdGhlIG1hbmFnZXIgdG9cbiAqIG9yZGVyIHZhdWx0cyBieSB0aGVpciBkZWJ0LXRvLWNvbGxhdGVyYWwgcmF0aW9zIHdpdGhvdXQgaGF2aW5nIHRvXG4gKiBtdXRhdGUgdGhlIGRlYnRzIGFzIHRoZSBpbnRlcmVzdCBhY2NydWVzLlxuICpcbiAqIEByZXR1cm5zIHtOb3JtYWxpemVkRGVidH0gYXMgaWYgdGhlIHZhdWx0IHdhcyBvcGVuIGF0IHRoZSBsYXVuY2ggb2ZcbiAqICAgdGhpcyBtYW5hZ2VyLCBiZWZvcmUgYW55IGludGVyZXN0IGFjY3J1ZWRcbiAqIEBzZWUgZ2V0QWN0dWFsRGViQW1vdW50XG4gKi9cbiAgICAgICAgZ2V0Tm9ybWFsaXplZERlYnQoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgICAgICAgIHJldHVybiByZXZlcnNlSW50ZXJlc3Qoc3RhdGUuZGVidFNuYXBzaG90LCBzdGF0ZS5pbnRlcmVzdFNuYXBzaG90KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzdGF0ZVNoYXBlOiBWYXVsdFN0YXRlU2hhcGUsXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIG1ha2VyO1xufTtcblxuLyoqIEB0eXBlZGVmIHtFUmV0dXJuPEVSZXR1cm48dHlwZW9mIHByZXBhcmVWYXVsdD4+WydzZWxmJ119IFZhdWx0ICovJGjNj19vbmNlLnByZXBhcmVWYXVsdChwcmVwYXJlVmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUGhhc2UiOlsiUGhhc2UiXSwiVmF1bHRJIjpbIlZhdWx0SSJdLCJwcmVwYXJlVmF1bHQiOlsicHJlcGFyZVZhdWx0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM3iRaeXTwAAl08AAEAAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ZhdWx0RmFjdG9yeS92YXVsdERpcmVjdG9yLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvZ292ZXJuYW5jZS9zcmMvdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvem9lL3NyYy9jbGVhblByb3Bvc2FsLmpzIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiLi4vY29sbGVjdEZlZXMuanMiLCIuL3BhcmFtcy5qcyIsIi4vdmF1bHRNYW5hZ2VyLmpzIl0sImV4cG9ydHMiOlsibWFrZUFsbE1hbmFnZXJzRG8iLCJwcm92aWRlRGlyZWN0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRNYXRoLEFtb3VudFNoYXBlLEJyYW5kU2hhcGUsSXNzdWVyU2hhcGUsR292ZXJub3JGYWNldFNoYXBlLEludml0YXRpb25TaGFwZSxtYWtlVHJhY2VyLE0sbXVzdE1hdGNoLHByZXBhcmVFeG9DbGFzc0tpdCxwcm92aWRlLHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsYXNzZXJ0S2V5d29yZE5hbWUsbWFrZVJlY29yZGVyVG9waWMscHJvdmlkZUVtcHR5U2VhdCxTdWJzY3JpYmVyU2hhcGUsVG9waWNzUmVjb3JkU2hhcGUsdW5pdEFtb3VudCxGYWlsLHEsRSxGYXIsbWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvbixwcm92aWRlVmF1bHRQYXJhbU1hbmFnZXJzLFNIT1JURkFMTF9JTlZJVEFUSU9OX0tFWSx2YXVsdFBhcmFtUGF0dGVybixwcmVwYXJlVmF1bHRNYW5hZ2VyS2l0LHByb3ZpZGVBbmRTdGFydFZhdWx0TWFuYWdlcktpdHM7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dLFtcIkFtb3VudFNoYXBlXCIsWyRozY9fYSA9PiAoQW1vdW50U2hhcGUgPSAkaM2PX2EpXV0sW1wiQnJhbmRTaGFwZVwiLFskaM2PX2EgPT4gKEJyYW5kU2hhcGUgPSAkaM2PX2EpXV0sW1wiSXNzdWVyU2hhcGVcIixbJGjNj19hID0+IChJc3N1ZXJTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZ292ZXJuYW5jZS9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiR292ZXJub3JGYWNldFNoYXBlXCIsWyRozY9fYSA9PiAoR292ZXJub3JGYWNldFNoYXBlID0gJGjNj19hKV1dLFtcIkludml0YXRpb25TaGFwZVwiLFskaM2PX2EgPT4gKEludml0YXRpb25TaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dLFtcInByb3ZpZGVcIixbJGjNj19hID0+IChwcm92aWRlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlTWFwU3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NsZWFuUHJvcG9zYWwuanNcIiwgW1tcImFzc2VydEtleXdvcmROYW1lXCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5d29yZE5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzXCIsIFtbXCJtYWtlUmVjb3JkZXJUb3BpY1wiLFskaM2PX2EgPT4gKG1ha2VSZWNvcmRlclRvcGljID0gJGjNj19hKV1dLFtcInByb3ZpZGVFbXB0eVNlYXRcIixbJGjNj19hID0+IChwcm92aWRlRW1wdHlTZWF0ID0gJGjNj19hKV1dLFtcIlN1YnNjcmliZXJTaGFwZVwiLFskaM2PX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRozY9fYSldXSxbXCJUb3BpY3NSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFRvcGljc1JlY29yZFNoYXBlID0gJGjNj19hKV1dLFtcInVuaXRBbW91bnRcIixbJGjNj19hID0+ICh1bml0QW1vdW50ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi4vY29sbGVjdEZlZXMuanNcIiwgW1tcIm1ha2VDb2xsZWN0RmVlc0ludml0YXRpb25cIixbJGjNj19hID0+IChtYWtlQ29sbGVjdEZlZXNJbnZpdGF0aW9uID0gJGjNj19hKV1dXV0sW1wiLi9wYXJhbXMuanNcIiwgW1tcInByb3ZpZGVWYXVsdFBhcmFtTWFuYWdlcnNcIixbJGjNj19hID0+IChwcm92aWRlVmF1bHRQYXJhbU1hbmFnZXJzID0gJGjNj19hKV1dLFtcIlNIT1JURkFMTF9JTlZJVEFUSU9OX0tFWVwiLFskaM2PX2EgPT4gKFNIT1JURkFMTF9JTlZJVEFUSU9OX0tFWSA9ICRozY9fYSldXSxbXCJ2YXVsdFBhcmFtUGF0dGVyblwiLFskaM2PX2EgPT4gKHZhdWx0UGFyYW1QYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi92YXVsdE1hbmFnZXIuanNcIiwgW1tcInByZXBhcmVWYXVsdE1hbmFnZXJLaXRcIixbJGjNj19hID0+IChwcmVwYXJlVmF1bHRNYW5hZ2VyS2l0ID0gJGjNj19hKV1dLFtcInByb3ZpZGVBbmRTdGFydFZhdWx0TWFuYWdlcktpdHNcIixbJGjNj19hID0+IChwcm92aWRlQW5kU3RhcnRWYXVsdE1hbmFnZXJLaXRzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7TWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICogQGltcG9ydCB7QW1vdW50S2V5d29yZFJlY29yZCwgS2V5d29yZCwgVHJhbnNmZXJQYXJ0LCBaQ0YsIFpDRk1pbnQsIFpDRlNlYXR9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0VSZXR1cm59IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm4sIEVSZW1vdGUsIFJlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtFTWFyc2hhbGxlcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMnO1xuICogQGltcG9ydCB7R292ZXJuZWRQYXJhbUdldHRlcnN9IGZyb20gJy4vdmF1bHRNYW5hZ2VyLmpzJztcbiAqIEBpbXBvcnQge1Nob3J0ZmFsbFJlcG9ydGVyfSBmcm9tICcuLi9yZXNlcnZlL2Fzc2V0UmVzZXJ2ZS5qcyc7XG4gKiBAaW1wb3J0IHtUeXBlZFBhcmFtTWFuYWdlcn0gZnJvbSAnQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnO1xuICogQGltcG9ydCB7VmF1bHREaXJlY3RvclBhcmFtc30gZnJvbSAnLi9wYXJhbXMuanMnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7VmF1bHRGYWN0b3J5WkNGfSBmcm9tICcuL3ZhdWx0RmFjdG9yeS5qcyc7XG4gKiBAaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gJ0BhZ29yaWMvdGltZSc7XG4gKiBAaW1wb3J0IHtNYWtlUmVjb3JkZXJLaXR9IGZyb20gJ0BhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMnO1xuICogQGltcG9ydCB7TWFrZUVSZWNvcmRlcktpdH0gZnJvbSAnQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyc7XG4gKiBAaW1wb3J0IHtWYXVsdE1hbmFnZXJ9IGZyb20gJy4vdmF1bHRNYW5hZ2VyLmpzJztcbiAqIEBpbXBvcnQge1ZhdWx0TWFuYWdlclBhcmFtT3ZlcnJpZGVzfSBmcm9tICcuL3BhcmFtcy5qcyc7XG4gKiBAaW1wb3J0IHtCdXJuRGVidCwgVmF1bHRNYW5hZ2VyUGFyYW1WYWx1ZXN9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7TWludEFuZFRyYW5zZmVyfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1ZhdWx0RmFjdG9yeVBhcmFtUGF0aH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtHb3Zlcm5lZEFwaXN9IGZyb20gJ0BhZ29yaWMvZ292ZXJuYW5jZS9zcmMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7QnJhbmR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtBbW91bnR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtJc3N1ZXJ9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtTdG9yYWdlTm9kZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdWRCcsIHRydWUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIGNvbGxhdGVyYWxzOiBCcmFuZFtdO1xuICogICByZXdhcmRQb29sQWxsb2NhdGlvbjogQW1vdW50S2V5d29yZFJlY29yZDtcbiAqIH19IE1ldHJpY3NOb3RpZmljYXRpb25cbiAqXG4gKlxuICogQHR5cGVkZWYge1JlYWRvbmx5PHt9Pn0gSW1tdXRhYmxlU3RhdGVcbiAqXG4gKiBAdHlwZWRlZiB7e319IE11dGFibGVTdGF0ZVxuICpcbiAqIEB0eXBlZGVmIHtJbW11dGFibGVTdGF0ZSAmIE11dGFibGVTdGF0ZX0gU3RhdGVcbiAqXG4gKiBAdHlwZWRlZiB7e1xuICogICBidXJuRGVidDogQnVybkRlYnQ7XG4gKiAgIGdldEdvdmVybmVkUGFyYW1zOiAoY29sbGF0ZXJhbEJyYW5kOiBCcmFuZCkgPT4gR292ZXJuZWRQYXJhbUdldHRlcnM7XG4gKiAgIG1pbnRBbmRUcmFuc2ZlcjogTWludEFuZFRyYW5zZmVyO1xuICogICBnZXRTaG9ydGZhbGxSZXBvcnRlcjogKCkgPT4gUHJvbWlzZTxTaG9ydGZhbGxSZXBvcnRlcj47XG4gKiB9fSBGYWN0b3J5UG93ZXJzRmFjZXRcbiAqXG4gKlxuICogQHR5cGVkZWYge1JlYWRvbmx5PHtcbiAqICAgc3RhdGU6IFN0YXRlO1xuICogfT59IE1ldGhvZENvbnRleHRcbiAqXG4gKiBAdHlwZWRlZiB7VHlwZWRQYXJhbU1hbmFnZXI8VmF1bHREaXJlY3RvclBhcmFtcz59IFZhdWx0RGlyZWN0b3JQYXJhbU1hbmFnZXJcbiAqL1xuXG5jb25zdCBzaG9ydGZhbGxJbnZpdGF0aW9uS2V5ID0gJ3Nob3J0ZmFsbEludml0YXRpb24nO1xuXG4vKiBJZiBvbmUgbWFuYWdlci90b2tlbiBmYWlscywgd2UgZG9uJ3Qgd2FudCB0aGF0IHRvIGJsb2NrIHBvc3NpYmxlIHN1Y2Nlc3MgZm9yKi9cbi8qIG90aGVycywgc28gd2UgLmNhdGNoKCkgYW5kIGxvZyBzZXBhcmF0ZWx5LiovXG4vKiovXG4vKiBleHBvcnRlZCBmb3IgdGVzdGluZyovXG4gICAgICAgY29uc3QgbWFrZUFsbE1hbmFnZXJzRG8gPSAoY29sbGF0ZXJhbE1hbmFnZXJzLCB2YXVsdE1hbmFnZXJzKSA9PiB7XG4gIC8qKiBAcGFyYW0geyh2bTogVmF1bHRNYW5hZ2VyKSA9PiB2b2lkfSBmbiAqL1xuICByZXR1cm4gZm4gPT4ge1xuICAgIGZvciAoY29uc3QgbWFuYWdlckluZGV4IG9mIGNvbGxhdGVyYWxNYW5hZ2Vycy52YWx1ZXMoKSkge1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhdWx0TWFuYWdlcnMuZ2V0KG1hbmFnZXJJbmRleCkuc2VsZilcbiAgICAgICAgLnRoZW4odm0gPT4gZm4odm0pKVxuICAgICAgICAuY2F0Y2goZSA9PiB0cmFjZSgn8J+aqEVSUk9SOiBhbGxNYW5hZ2Vyc0RvJywgZSkpO1xuICAgIH1cbiAgfTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge1ZhdWx0RmFjdG9yeVpDRn0gemNmXG4gKiBAcGFyYW0ge1ZhdWx0RGlyZWN0b3JQYXJhbU1hbmFnZXJ9IGRpcmVjdG9yUGFyYW1NYW5hZ2VyXG4gKiBAcGFyYW0ge1pDRk1pbnQ8J25hdCc+fSBkZWJ0TWludFxuICogQHBhcmFtIHtFUmVmPFRpbWVyU2VydmljZT59IHRpbWVyXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHBhcmFtIHtNYWtlUmVjb3JkZXJLaXR9IG1ha2VSZWNvcmRlcktpdFxuICogQHBhcmFtIHtNYWtlRVJlY29yZGVyS2l0fSBtYWtlRVJlY29yZGVyS2l0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFZhdWx0TWFuYWdlclBhcmFtT3ZlcnJpZGVzPn0gbWFuYWdlclBhcmFtc1xuICovJGjNj19vbmNlLm1ha2VBbGxNYW5hZ2Vyc0RvKG1ha2VBbGxNYW5hZ2Vyc0RvKTtcbmNvbnN0IHByZXBhcmVWYXVsdERpcmVjdG9yID0gKFxuICBiYWdnYWdlLFxuICB6Y2YsXG4gIGRpcmVjdG9yUGFyYW1NYW5hZ2VyLFxuICBkZWJ0TWludCxcbiAgdGltZXIsXG4gIHN0b3JhZ2VOb2RlLFxuICBtYXJzaGFsbGVyLFxuICBtYWtlUmVjb3JkZXJLaXQsXG4gIG1ha2VFUmVjb3JkZXJLaXQsXG4gIG1hbmFnZXJQYXJhbXMsXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtTaG9ydGZhbGxSZXBvcnRlcn0gKi9cbiAgbGV0IHNob3J0ZmFsbFJlcG9ydGVyO1xuXG4gIC8qKiBGb3IgaG9sZGluZyBuZXdseSBtaW50ZWQgdG9rZW5zIHVudGlsIHRyYW5zZmVycmVkICovXG4gIGNvbnN0IHsgemNmU2VhdDogbWludFNlYXQgfSA9IHpjZi5tYWtlRW1wdHlTZWF0S2l0KCk7XG5cbiAgY29uc3QgcmV3YXJkUG9vbFNlYXQgPSBwcm92aWRlRW1wdHlTZWF0KHpjZiwgYmFnZ2FnZSwgJ3Jld2FyZFBvb2xTZWF0Jyk7XG5cbiAgLyoqIEB0eXBlIHtNYXBTdG9yZTxCcmFuZCwgbnVtYmVyPn0gaW5kZXggb2YgbWFuYWdlciBmb3IgdGhlIGdpdmVuIGNvbGxhdGVyYWwgKi9cbiAgY29uc3QgY29sbGF0ZXJhbE1hbmFnZXJzID0gcHJvdmlkZUR1cmFibGVNYXBTdG9yZShcbiAgICBiYWdnYWdlLFxuICAgICdjb2xsYXRlcmFsTWFuYWdlcnMnLFxuICApO1xuXG4gIC8qIE5vbi1kdXJhYmxlIG1hcCBiZWNhdXNlIHBhcmFtIG1hbmFnZXJzIGFyZW4ndCBkdXJhYmxlLiovXG4gIC8qIEluIHRoZSBldmVudCB0aGV5J3JlIG5lZWRlZCB0aGV5IGNhbiBiZSByZWNvbnN0cnVjdGVkIGZyb20gY29udHJhY3QgdGVybXMgYW5kIG9mZi1jaGFpbiBkYXRhLiovXG4gIC8qKiBhIHBvd2VyZnVsIG9iamVjdDsgY2FuIG1vZGlmeSBwYXJhbWV0ZXJzICovXG4gIGNvbnN0IHZhdWx0UGFyYW1NYW5hZ2VycyA9IHByb3ZpZGVWYXVsdFBhcmFtTWFuYWdlcnMoXG4gICAgYmFnZ2FnZSxcbiAgICBtYXJzaGFsbGVyLFxuICAgIG1hbmFnZXJQYXJhbXMsXG4gICk7XG5cbiAgY29uc3QgbWV0cmljc05vZGUgPSBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKCdtZXRyaWNzJyk7XG5cbiAgY29uc3QgbWV0cmljc0tpdCA9IG1ha2VFUmVjb3JkZXJLaXQoXG4gICAgbWV0cmljc05vZGUsXG4gICAgLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48TWV0cmljc05vdGlmaWNhdGlvbj59ICovIChNLmFueSgpKSxcbiAgKTtcblxuICBjb25zdCBtYW5hZ2Vyc05vZGUgPSBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKCdtYW5hZ2VycycpO1xuXG4gIC8qKiBAcmV0dXJucyB7TWV0cmljc05vdGlmaWNhdGlvbn0gKi9cbiAgY29uc3Qgc2FtcGxlTWV0cmljcyA9ICgpID0+IHtcbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIGNvbGxhdGVyYWxzOiBBcnJheS5mcm9tKGNvbGxhdGVyYWxNYW5hZ2Vycy5rZXlzKCkpLFxuICAgICAgcmV3YXJkUG9vbEFsbG9jYXRpb246IHJld2FyZFBvb2xTZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCksXG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHdyaXRlTWV0cmljcyA9ICgpID0+IEUobWV0cmljc0tpdC5yZWNvcmRlclApLndyaXRlKHNhbXBsZU1ldHJpY3MoKSk7XG5cbiAgY29uc3QgdXBkYXRlU2hvcnRmYWxsUmVwb3J0ZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb2xkSW52aXRhdGlvbiA9IGJhZ2dhZ2UuaGFzKHNob3J0ZmFsbEludml0YXRpb25LZXkpXG4gICAgICA/IGJhZ2dhZ2UuZ2V0KHNob3J0ZmFsbEludml0YXRpb25LZXkpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IG5ld0ludml0YXRpb24gPSBhd2FpdCBkaXJlY3RvclBhcmFtTWFuYWdlci5nZXRJbnRlcm5hbFBhcmFtVmFsdWUoXG4gICAgICBTSE9SVEZBTExfSU5WSVRBVElPTl9LRVksXG4gICAgKTtcblxuICAgIGlmIChuZXdJbnZpdGF0aW9uID09PSBvbGRJbnZpdGF0aW9uKSB7XG4gICAgICBzaG9ydGZhbGxSZXBvcnRlciB8fFxuICAgICAgICBGYWlsYHVwZGF0ZVNob3J0RmFsbFJlcG9ydGVkIGNhbGxlZCB3aXRoIHJlcGVhdCBpbnZpdGF0aW9uIGFuZCBubyBwcmlvciBzaG9ydGZhbGxSZXBvcnRlcmA7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLyogVXBkYXRlIHRoZSB2YWx1ZXMqL1xuICAgIGNvbnN0IHpvZSA9IHpjZi5nZXRab2VTZXJ2aWNlKCk7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICBzaG9ydGZhbGxSZXBvcnRlciA9IEUoRSh6b2UpLm9mZmVyKG5ld0ludml0YXRpb24pKS5nZXRPZmZlclJlc3VsdCgpO1xuICAgIGlmIChvbGRJbnZpdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGJhZ2dhZ2UuaW5pdChzaG9ydGZhbGxJbnZpdGF0aW9uS2V5LCBuZXdJbnZpdGF0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYmFnZ2FnZS5zZXQoc2hvcnRmYWxsSW52aXRhdGlvbktleSwgbmV3SW52aXRhdGlvbik7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGZhY3RvcnlQb3dlcnMgPSBGYXIoJ3ZhdWx0IGZhY3RvcnkgcG93ZXJzJywge1xuICAgIC8qKlxuICogR2V0IHJlYWQtb25seSBwYXJhbXMgZm9yIHRoaXMgbWFuYWdlciBhbmQgaXRzIGRpcmVjdG9yLiBUaGlzIGdyYW50cyBhbGxcbiAqIG1hbmFnZXJzIGFjY2VzcyB0byBwYXJhbXMgZnJvbSBhbGwgbWFuYWdlcnMuIEl0J3Mgbm90IFBPTEEgYnV0IGl0J3MgYVxuICogcHVibGljIGF1dGhvcml0eSBhbmQgaXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IHBvd2VyIG9iamVjdHMgdG9cbiAqIGNyZWF0ZS5cbiAqXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICovXG4gICAgZ2V0R292ZXJuZWRQYXJhbXM6IGJyYW5kID0+IHtcbiAgICAgIGNvbnN0IHZhdWx0UGFyYW1NYW5hZ2VyID0gdmF1bHRQYXJhbU1hbmFnZXJzLmdldChicmFuZCk7XG4gICAgICByZXR1cm4gRmFyKCd2YXVsdCBtYW5hZ2VyIHBhcmFtIG1hbmFnZXInLCB7XG4gICAgICAgIC8qIG1lcmdlIGRpcmVjdG9yIGFuZCBtYW5hZ2VyIHBhcmFtcyovXG4gICAgICAgIC4uLmRpcmVjdG9yUGFyYW1NYW5hZ2VyLnJlYWRvbmx5KCksXG4gICAgICAgIC4uLnZhdWx0UGFyYW1NYW5hZ2VyLnJlYWRvbmx5KCksXG4gICAgICAgIC8qIHJlZGVjbGFyZSB0aGVzZSBnZXR0ZXJzIGFzIHRvIHNwZWNpZnkgdGhlIGtpbmQgb2YgdGhlIEFtb3VudCovXG4gICAgICAgIGdldE1pbkluaXRpYWxEZWJ0OiAvKiogQHR5cGUgeygpID0+IEFtb3VudDwnbmF0Jz59ICovIChcbiAgICAgICAgICBkaXJlY3RvclBhcmFtTWFuYWdlci5yZWFkb25seSgpLmdldE1pbkluaXRpYWxEZWJ0XG4gICAgICAgICksXG4gICAgICAgIGdldERlYnRMaW1pdDogLyoqIEB0eXBlIHsoKSA9PiBBbW91bnQ8J25hdCc+fSAqLyAoXG4gICAgICAgICAgdmF1bHRQYXJhbU1hbmFnZXIucmVhZG9ubHkoKS5nZXREZWJ0TGltaXRcbiAgICAgICAgKSxcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvKipcbiAqIExldCB0aGUgbWFuYWdlciBhZGQgcmV3YXJkcyB0byB0aGUgcmV3YXJkUG9vbFNlYXQgd2l0aG91dCBleHBvc2luZyB0aGVcbiAqIHJld2FyZFBvb2xTZWF0IHRvIHRoZW0uXG4gKlxuICogQHR5cGUge01pbnRBbmRUcmFuc2Zlcn1cbiAqL1xuICAgIG1pbnRBbmRUcmFuc2ZlcjogKG1pbnRSZWNlaXZlciwgdG9NaW50LCBmZWUsIG5vbk1pbnRUcmFuc2ZlcnMpID0+IHtcbiAgICAgIGNvbnN0IGtlcHQgPSBBbW91bnRNYXRoLnN1YnRyYWN0KHRvTWludCwgZmVlKTtcbiAgICAgIGRlYnRNaW50Lm1pbnRHYWlucyhoYXJkZW4oeyBNaW50ZWQ6IHRvTWludCB9KSwgbWludFNlYXQpO1xuICAgICAgLyoqIEB0eXBlIHtUcmFuc2ZlclBhcnRbXX0gKi9cbiAgICAgIGNvbnN0IHRyYW5zZmVycyA9IFtcbiAgICAgICAgLi4ubm9uTWludFRyYW5zZmVycyxcbiAgICAgICAgW21pbnRTZWF0LCByZXdhcmRQb29sU2VhdCwgeyBNaW50ZWQ6IGZlZSB9XSxcbiAgICAgICAgW21pbnRTZWF0LCBtaW50UmVjZWl2ZXIsIHsgTWludGVkOiBrZXB0IH1dLFxuICAgICAgXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHpjZi5hdG9taWNSZWFycmFuZ2UoaGFyZGVuKHRyYW5zZmVycykpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdtaW50QW5kVHJhbnNmZXIgZmFpbGVkIHRvIHJlYXJyYW5nZScsIGUpO1xuICAgICAgICAvKiBJZiB0aGUgcmVhcnJhbmdlIGZhaWxzLCBidXJuIHRoZSBuZXdseSBtaW50ZWQgdG9rZW5zLiovXG4gICAgICAgIC8qIEFzc3VtZSB0aGlzIHdvbid0IGZhaWwgYmVjYXVzZSBpdCByZWxpZXMgb24gdGhlIGludGVybmFsIG1pbnQuKi9cbiAgICAgICAgLyogKEZhaWx1cmUgd291bGQgaW1wbHkgbXVjaCBsYXJnZXIgcHJvYmxlbXMuKSovXG4gICAgICAgIGRlYnRNaW50LmJ1cm5Mb3NzZXMoaGFyZGVuKHsgTWludGVkOiB0b01pbnQgfSksIG1pbnRTZWF0KTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICAgIHZvaWQgd3JpdGVNZXRyaWNzKCk7XG4gICAgfSxcbiAgICBnZXRTaG9ydGZhbGxSZXBvcnRlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdXBkYXRlU2hvcnRmYWxsUmVwb3J0ZXIoKTtcbiAgICAgIHJldHVybiBzaG9ydGZhbGxSZXBvcnRlcjtcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSB0b0J1cm5cbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICovXG4gICAgYnVybkRlYnQ6ICh0b0J1cm4sIHNlYXQpID0+IHtcbiAgICAgIGRlYnRNaW50LmJ1cm5Mb3NzZXMoaGFyZGVuKHsgTWludGVkOiB0b0J1cm4gfSksIHNlYXQpO1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IG1ha2VWYXVsdE1hbmFnZXJLaXQgPSBwcmVwYXJlVmF1bHRNYW5hZ2VyS2l0KGJhZ2dhZ2UsIHtcbiAgICBtYWtlRVJlY29yZGVyS2l0LFxuICAgIG1ha2VSZWNvcmRlcktpdCxcbiAgICBtYXJzaGFsbGVyLFxuICAgIGZhY3RvcnlQb3dlcnMsXG4gICAgemNmLFxuICB9KTtcblxuICBjb25zdCB2YXVsdE1hbmFnZXJzID0gcHJvdmlkZUFuZFN0YXJ0VmF1bHRNYW5hZ2VyS2l0cyhiYWdnYWdlKTtcblxuICAvKiogQHR5cGUgeyhicmFuZDogQnJhbmQpID0+IFZhdWx0TWFuYWdlcn0gKi9cbiAgY29uc3QgbWFuYWdlckZvckNvbGxhdGVyYWwgPSBicmFuZCA9PiB7XG4gICAgY29uc3QgbWFuYWdlckluZGV4ID0gY29sbGF0ZXJhbE1hbmFnZXJzLmdldChicmFuZCk7XG4gICAgY29uc3QgbWFuYWdlciA9IHZhdWx0TWFuYWdlcnMuZ2V0KG1hbmFnZXJJbmRleCkuc2VsZjtcbiAgICBtYW5hZ2VyIHx8IEZhaWxgbm8gbWFuYWdlciAke21hbmFnZXJJbmRleH0gZm9yIGNvbGxhdGVyYWwgJHticmFuZH1gO1xuICAgIHJldHVybiBtYW5hZ2VyO1xuICB9O1xuXG4gIC8qIFRPRE8gaGVscGVyIHRvIG1ha2UgYWxsIHRoZSB0b3BpY3MgYXQgb25jZSovXG4gIGNvbnN0IHRvcGljcyA9IGhhcmRlbih7XG4gICAgbWV0cmljczogbWFrZVJlY29yZGVyVG9waWMoJ1ZhdWx0IEZhY3RvcnkgbWV0cmljcycsIG1ldHJpY3NLaXQpLFxuICB9KTtcblxuICAvKiogQHJldHVybnMge1N0YXRlfSAqL1xuICBjb25zdCBpbml0U3RhdGUgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHt9O1xuICB9O1xuXG4gIC8qKlxuICogXCJEaXJlY3RvclwiIG9mIHRoZSB2YXVsdCBmYWN0b3J5LCBvdmVyc2VlaW5nIFwidmF1bHQgbWFuYWdlcnNcIi5cbiAqXG4gKiBAcGFyYW0ge1ZhdWx0RmFjdG9yeVpDRn0gemNmXG4gKiBAcGFyYW0ge1ZhdWx0RGlyZWN0b3JQYXJhbU1hbmFnZXJ9IGRpcmVjdG9yUGFyYW1NYW5hZ2VyXG4gKiBAcGFyYW0ge1pDRk1pbnQ8J25hdCc+fSBkZWJ0TWludFxuICovXG4gIGNvbnN0IG1ha2VWYXVsdERpcmVjdG9yID0gcHJlcGFyZUV4b0NsYXNzS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ1ZhdWx0RGlyZWN0b3InLFxuICAgIHtcbiAgICAgIGNyZWF0b3I6IE0uaW50ZXJmYWNlKCdjcmVhdG9yJywge1xuICAgICAgICAuLi5Hb3Zlcm5vckZhY2V0U2hhcGUsXG4gICAgICB9KSxcbiAgICAgIG1hY2hpbmU6IE0uaW50ZXJmYWNlKCdtYWNoaW5lJywge1xuICAgICAgICBhZGRWYXVsdFR5cGU6IE0uY2FsbChJc3N1ZXJTaGFwZSwgTS5zdHJpbmcoKSwgTS5yZWNvcmQoKSkucmV0dXJucyhcbiAgICAgICAgICBNLnByb21pc2UoKSxcbiAgICAgICAgKSxcbiAgICAgICAgbWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvbjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICAgIGdldFJld2FyZEFsbG9jYXRpb246IE0uY2FsbCgpLnJldHVybnMoeyBNaW50ZWQ6IEFtb3VudFNoYXBlIH0pLFxuICAgICAgICBzZXRTaG9ydGZhbGxSZXBvcnRlcjogTS5jYWxsKEludml0YXRpb25TaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICB9KSxcbiAgICAgIHB1YmxpYzogTS5pbnRlcmZhY2UoJ3B1YmxpYycsIHtcbiAgICAgICAgZ2V0Q29sbGF0ZXJhbE1hbmFnZXI6IE0uY2FsbChCcmFuZFNoYXBlKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCkpLFxuICAgICAgICBnZXREZWJ0SXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgICAgICAgZ2V0U3Vic2NyaXB0aW9uOiBNLmNhbGwoeyBjb2xsYXRlcmFsQnJhbmQ6IEJyYW5kU2hhcGUgfSkucmV0dXJucyhcbiAgICAgICAgICBTdWJzY3JpYmVyU2hhcGUsXG4gICAgICAgICksXG4gICAgICAgIGdldEVsZWN0b3JhdGVTdWJzY3JpcHRpb246IE0uY2FsbCgpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbiAgICAgICAgZ2V0R292ZXJuZWRQYXJhbXM6IE0uY2FsbFdoZW4oeyBjb2xsYXRlcmFsQnJhbmQ6IEJyYW5kU2hhcGUgfSkucmV0dXJucyhcbiAgICAgICAgICBNLnJlY29yZCgpLFxuICAgICAgICApLFxuICAgICAgICBnZXREaXJlY3RvckdvdmVybmVkUGFyYW1zOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICAgICAgZ2V0SW52aXRhdGlvbkFtb3VudDogTS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoQW1vdW50U2hhcGUpLFxuICAgICAgICBnZXRQdWJsaWNUb3BpY3M6IE0uY2FsbCgpLnJldHVybnMoVG9waWNzUmVjb3JkU2hhcGUpLFxuICAgICAgfSksXG4gICAgICBoZWxwZXI6IE0uaW50ZXJmYWNlKCdoZWxwZXInLCB7XG4gICAgICAgIHN0YXJ0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgaW5pdFN0YXRlLFxuICAgIHtcbiAgICAgIGNyZWF0b3I6IHtcbiAgICAgICAgZ2V0UGFyYW1NZ3JSZXRyaWV2ZXI6ICgpID0+XG4gICAgICAgICAgRmFyKCdwYXJhbU1hbmFnZXJSZXRyaWV2ZXInLCB7XG4gICAgICAgICAgICAvKiogQHBhcmFtIHtWYXVsdEZhY3RvcnlQYXJhbVBhdGh9IHBhcmFtUGF0aCAqL1xuICAgICAgICAgICAgZ2V0OiAoXG4gICAgICAgICAgICAgIHBhcmFtUGF0aCA9IHsga2V5OiAvKiogQHR5cGUge2NvbnN0fSAqLyAnZ292ZXJuZWRQYXJhbXMnIH0sXG4gICAgICAgICAgICApID0+IHtcbiAgICAgICAgICAgICAgaWYgKHBhcmFtUGF0aC5rZXkgPT09ICdnb3Zlcm5lZFBhcmFtcycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0b3JQYXJhbU1hbmFnZXI7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1QYXRoLmtleS5jb2xsYXRlcmFsQnJhbmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdmF1bHRQYXJhbU1hbmFnZXJzLmdldChwYXJhbVBhdGgua2V5LmNvbGxhdGVyYWxCcmFuZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ1Vuc3VwcG9ydGVkIHBhcmFtUGF0aCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWUgKi9cbiAgICAgICAgZ2V0SW52aXRhdGlvbihuYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIGRpcmVjdG9yUGFyYW1NYW5hZ2VyLmdldEludGVybmFsUGFyYW1WYWx1ZShuYW1lKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0TGltaXRlZENyZWF0b3JGYWNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMubWFjaGluZTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIEByZXR1cm5zIHtFUmVmPEdvdmVybmVkQXBpcz59ICovXG4gICAgICAgIGdldEdvdmVybmVkQXBpcygpIHtcbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgICAgICAgIHJldHVybiBGYXIoJ2dvdmVybmVkQVBJcycsIHt9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0R292ZXJuZWRBcGlOYW1lcygpIHtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKFtdKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0T2ZmZXJGaWx0ZXI6IHN0cmluZ3MgPT4gemNmLnNldE9mZmVyRmlsdGVyKHN0cmluZ3MpLFxuICAgICAgfSxcbiAgICAgIG1hY2hpbmU6IHtcbiAgICAgICAgLyogVE9ETyBtb3ZlIHRoaXMgdW5kZXIgZ292ZXJuYW5jZSAjMzkyNCovXG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtJc3N1ZXI8J25hdCc+fSBjb2xsYXRlcmFsSXNzdWVyXG4gKiBAcGFyYW0ge0tleXdvcmR9IGNvbGxhdGVyYWxLZXl3b3JkXG4gKiBAcGFyYW0ge1ZhdWx0TWFuYWdlclBhcmFtVmFsdWVzfSBpbml0aWFsUGFyYW1WYWx1ZXNcbiAqL1xuICAgICAgICBhc3luYyBhZGRWYXVsdFR5cGUoXG4gICAgICAgICAgY29sbGF0ZXJhbElzc3VlcixcbiAgICAgICAgICBjb2xsYXRlcmFsS2V5d29yZCxcbiAgICAgICAgICBpbml0aWFsUGFyYW1WYWx1ZXMsXG4gICAgICAgICkge1xuICAgICAgICAgIHRyYWNlKCdhZGRWYXVsdFR5cGUnLCBjb2xsYXRlcmFsS2V5d29yZCwgaW5pdGlhbFBhcmFtVmFsdWVzKTtcbiAgICAgICAgICBtdXN0TWF0Y2goY29sbGF0ZXJhbElzc3VlciwgTS5yZW1vdGFibGUoKSwgJ2NvbGxhdGVyYWxJc3N1ZXInKTtcbiAgICAgICAgICBhc3NlcnRLZXl3b3JkTmFtZShjb2xsYXRlcmFsS2V5d29yZCk7XG4gICAgICAgICAgbXVzdE1hdGNoKFxuICAgICAgICAgICAgaW5pdGlhbFBhcmFtVmFsdWVzLFxuICAgICAgICAgICAgdmF1bHRQYXJhbVBhdHRlcm4sXG4gICAgICAgICAgICAnaW5pdGlhbFBhcmFtVmFsdWVzJyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHpjZi5zYXZlSXNzdWVyKGNvbGxhdGVyYWxJc3N1ZXIsIGNvbGxhdGVyYWxLZXl3b3JkKTtcbiAgICAgICAgICBjb25zdCBjb2xsYXRlcmFsQnJhbmQgPSB6Y2YuZ2V0QnJhbmRGb3JJc3N1ZXIoY29sbGF0ZXJhbElzc3Vlcik7XG4gICAgICAgICAgLyogV2UgY3JlYXRlIG9ubHkgb25lIHZhdWx0IHBlciBjb2xsYXRlcmFsVHlwZS4qL1xuICAgICAgICAgICFjb2xsYXRlcmFsTWFuYWdlcnMuaGFzKGNvbGxhdGVyYWxCcmFuZCkgfHxcbiAgICAgICAgICAgIEZhaWxgQ29sbGF0ZXJhbCBicmFuZCAke3EoY29sbGF0ZXJhbEJyYW5kKX0gaGFzIGFscmVhZHkgYmVlbiBhZGRlZGA7XG5cbiAgICAgICAgICAvKiB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBtYW5hZ2VyIGJlaW5nIG1hZGUqL1xuICAgICAgICAgIGNvbnN0IG1hbmFnZXJJbmRleCA9IHZhdWx0TWFuYWdlcnMubGVuZ3RoKCk7XG4gICAgICAgICAgY29uc3QgbWFuYWdlcklkID0gYG1hbmFnZXIke21hbmFnZXJJbmRleH1gO1xuICAgICAgICAgIC8qKiBAdHlwZSB7UmVtb3RlPFN0b3JhZ2VOb2RlPn0gKi9cbiAgICAgICAgICBjb25zdCBtYW5hZ2VyU3RvcmFnZU5vZGUgPVxuICAgICAgICAgICAgYXdhaXQgRShtYW5hZ2Vyc05vZGUpLm1ha2VDaGlsZE5vZGUobWFuYWdlcklkKTtcblxuICAgICAgICAgIHZhdWx0UGFyYW1NYW5hZ2Vycy5hZGRQYXJhbU1hbmFnZXIoXG4gICAgICAgICAgICBjb2xsYXRlcmFsQnJhbmQsXG4gICAgICAgICAgICBtYW5hZ2VyU3RvcmFnZU5vZGUsXG4gICAgICAgICAgICBpbml0aWFsUGFyYW1WYWx1ZXMsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZVN0YW1wID0gYXdhaXQgRSh0aW1lcikuZ2V0Q3VycmVudFRpbWVzdGFtcCgpO1xuXG4gICAgICAgICAgY29uc3QgY29sbGF0ZXJhbFVuaXQgPSBhd2FpdCB1bml0QW1vdW50KGNvbGxhdGVyYWxCcmFuZCk7XG5cbiAgICAgICAgICBjb25zdCBraXQgPSBhd2FpdCBtYWtlVmF1bHRNYW5hZ2VyS2l0KHtcbiAgICAgICAgICAgIGRlYnRNaW50LFxuICAgICAgICAgICAgY29sbGF0ZXJhbEJyYW5kLFxuICAgICAgICAgICAgY29sbGF0ZXJhbFVuaXQsXG4gICAgICAgICAgICBkZXNjcmlwdGlvblNjb3BlOiBtYW5hZ2VySWQsXG4gICAgICAgICAgICBzdGFydFRpbWVTdGFtcCxcbiAgICAgICAgICAgIHN0b3JhZ2VOb2RlOiBtYW5hZ2VyU3RvcmFnZU5vZGUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdmF1bHRNYW5hZ2Vycy5hZGQoa2l0KTtcbiAgICAgICAgICB2YXVsdE1hbmFnZXJzLmxlbmd0aCgpIC0gMSA9PT0gbWFuYWdlckluZGV4IHx8XG4gICAgICAgICAgICBGYWlsYG1pc21hdGNoIFZhdWx0TWFuYWdlcktpdCBjb3VudGA7XG4gICAgICAgICAgY29uc3QgeyBzZWxmOiB2bSB9ID0ga2l0O1xuICAgICAgICAgIHZtIHx8IEZhaWxgbm8gdmF1bHRgO1xuICAgICAgICAgIGNvbGxhdGVyYWxNYW5hZ2Vycy5pbml0KGNvbGxhdGVyYWxCcmFuZCwgbWFuYWdlckluZGV4KTtcbiAgICAgICAgICB2b2lkIHdyaXRlTWV0cmljcygpO1xuICAgICAgICAgIHJldHVybiB2bTtcbiAgICAgICAgfSxcbiAgICAgICAgbWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gbWFrZUNvbGxlY3RGZWVzSW52aXRhdGlvbihcbiAgICAgICAgICAgIHpjZixcbiAgICAgICAgICAgIHJld2FyZFBvb2xTZWF0LFxuICAgICAgICAgICAgZGVidE1pbnQuZ2V0SXNzdWVyUmVjb3JkKCkuYnJhbmQsXG4gICAgICAgICAgICAnTWludGVkJyxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKiBYWFggYWNjZXNzb3JzIGZvciB0ZXN0cyovXG4gICAgICAgIGdldFJld2FyZEFsbG9jYXRpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHJld2FyZFBvb2xTZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgYXN5bmMgc2V0U2hvcnRmYWxsUmVwb3J0ZXIobmV3SW52aXRhdGlvbikge1xuICAgICAgICAgIGNvbnN0IHpvZSA9IHpjZi5nZXRab2VTZXJ2aWNlKCk7XG4gICAgICAgICAgc2hvcnRmYWxsUmVwb3J0ZXIgPSBhd2FpdCBFKFxuICAgICAgICAgICAgRSh6b2UpLm9mZmVyKG5ld0ludml0YXRpb24pLFxuICAgICAgICAgICkuZ2V0T2ZmZXJSZXN1bHQoKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwdWJsaWM6IHtcbiAgICAgICAgLyoqIEBwYXJhbSB7QnJhbmR9IGJyYW5kSW4gKi9cbiAgICAgICAgZ2V0Q29sbGF0ZXJhbE1hbmFnZXIoYnJhbmRJbikge1xuICAgICAgICAgIGNvbGxhdGVyYWxNYW5hZ2Vycy5oYXMoYnJhbmRJbikgfHxcbiAgICAgICAgICAgIEZhaWxgTm90IGEgc3VwcG9ydGVkIGNvbGxhdGVyYWwgdHlwZSAke2JyYW5kSW59YDtcbiAgICAgICAgICAvKiogQHR5cGUge1ZhdWx0TWFuYWdlcn0gKi9cbiAgICAgICAgICByZXR1cm4gbWFuYWdlckZvckNvbGxhdGVyYWwoYnJhbmRJbikuZ2V0UHVibGljRmFjZXQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0RGVidElzc3VlcigpIHtcbiAgICAgICAgICByZXR1cm4gZGVidE1pbnQuZ2V0SXNzdWVyUmVjb3JkKCkuaXNzdWVyO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAqIHN1YnNjcmlwdGlvbiBmb3IgdGhlIHBhcmFtTWFuYWdlciBmb3IgYSBwYXJ0aWN1bGFyIHZhdWx0TWFuYWdlclxuICpcbiAqIEBwYXJhbSB7eyBjb2xsYXRlcmFsQnJhbmQ6IEJyYW5kIH19IHNlbGVjdG9yXG4gKi9cbiAgICAgICAgZ2V0U3Vic2NyaXB0aW9uKHsgY29sbGF0ZXJhbEJyYW5kIH0pIHtcbiAgICAgICAgICByZXR1cm4gdmF1bHRQYXJhbU1hbmFnZXJzLmdldChjb2xsYXRlcmFsQnJhbmQpLmdldFN1YnNjcmlwdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRQdWJsaWNUb3BpY3MoKSB7XG4gICAgICAgICAgcmV0dXJuIHRvcGljcztcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIHN1YnNjcmlwdGlvbiBmb3IgdGhlIHBhcmFtTWFuYWdlciBmb3IgdGhlIHZhdWx0RmFjdG9yeSdzIGVsZWN0b3JhdGUgKi9cbiAgICAgICAgZ2V0RWxlY3RvcmF0ZVN1YnNjcmlwdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gZGlyZWN0b3JQYXJhbU1hbmFnZXIuZ2V0U3Vic2NyaXB0aW9uKCk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICogTm90ZSB0aGlzIHdvcmtzIG9ubHkgZm9yIGEgY29sbGF0ZXJhbCBtYW5hZ2VyLiBGb3IgdGhlIGRpcmVjdG9yIHVzZSxcbiAqIGBnZXREaXJlY3RvckdvdmVybmVkUGFyYW1zYFxuICpcbiAqIEBwYXJhbSB7eyBjb2xsYXRlcmFsQnJhbmQ6IEJyYW5kIH19IHNlbGVjdG9yXG4gKi9cbiAgICAgICAgZ2V0R292ZXJuZWRQYXJhbXMoeyBjb2xsYXRlcmFsQnJhbmQgfSkge1xuICAgICAgICAgIC8qIFRPRE8gdXNlIG5hbWVkIGdldHRlcnMgb2YgVHlwZWRQYXJhbU1hbmFnZXIqL1xuICAgICAgICAgIHJldHVybiB2YXVsdFBhcmFtTWFuYWdlcnMuZ2V0KGNvbGxhdGVyYWxCcmFuZCkuZ2V0UGFyYW1zKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldERpcmVjdG9yR292ZXJuZWRQYXJhbXMoKSB7XG4gICAgICAgICAgcmV0dXJuIGRpcmVjdG9yUGFyYW1NYW5hZ2VyLmdldFBhcmFtcygpO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWUgKi9cbiAgICAgICAgZ2V0SW52aXRhdGlvbkFtb3VudChuYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIGRpcmVjdG9yUGFyYW1NYW5hZ2VyLmdldEludml0YXRpb25BbW91bnQobmFtZSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaGVscGVyOiB7XG4gICAgICAgIC8qKiBTdGFydCBub24tZHVyYWJsZSBwcm9jZXNzZXMgKG9yIHJlc3RhcnQgaWYgbmVlZGVkIGFmdGVyIHZhdCByZXN0YXJ0KSAqL1xuICAgICAgICBhc3luYyBzdGFydCgpIHtcbiAgICAgICAgICB1cGRhdGVTaG9ydGZhbGxSZXBvcnRlcigpLmNhdGNoKGVyciA9PlxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgJ/Cfm6DvuI8gdXBkYXRlU2hvcnRmYWxsUmVwb3J0ZXIgZmFpbGVkIGR1cmluZyBzdGFydCgpOyByZXBhaXIgYnkgdXBkYXRpbmcgZ292ZXJuYW5jZScsXG4gICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIG1ha2VWYXVsdERpcmVjdG9yO1xufTtcbmhhcmRlbihwcmVwYXJlVmF1bHREaXJlY3Rvcik7XG4vKiogQHR5cGVkZWYge0VSZXR1cm48RVJldHVybjx0eXBlb2YgcHJlcGFyZVZhdWx0RGlyZWN0b3I+Pn0gVmF1bHREaXJlY3RvciAqL1xuXG4vKipcbiAqIFByZXBhcmUgdGhlIFZhdWx0RGlyZWN0b3Iga2luZCwgZ2V0IG9yIG1ha2UgdGhlIHNpbmdsZXRvblxuICpcbiAqIEB0eXBlIHsoXG4gKiAgIC4uLnB2ZEFyZ3M6IFBhcmFtZXRlcnM8dHlwZW9mIHByZXBhcmVWYXVsdERpcmVjdG9yPlxuICogKSA9PiBWYXVsdERpcmVjdG9yfVxuICovXG4gICAgICAgY29uc3QgcHJvdmlkZURpcmVjdG9yID0gKC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgbWFrZVZhdWx0RGlyZWN0b3IgPSBwcmVwYXJlVmF1bHREaXJlY3RvciguLi5hcmdzKTtcblxuICBjb25zdCBbYmFnZ2FnZV0gPSBhcmdzO1xuXG4gIHJldHVybiBwcm92aWRlKGJhZ2dhZ2UsICdkaXJlY3RvcicsIG1ha2VWYXVsdERpcmVjdG9yKTtcbn07JGjNj19vbmNlLnByb3ZpZGVEaXJlY3Rvcihwcm92aWRlRGlyZWN0b3IpO1xuaGFyZGVuKHByb3ZpZGVEaXJlY3Rvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQWxsTWFuYWdlcnNEbyI6WyJtYWtlQWxsTWFuYWdlcnNEbyJdLCJwcm92aWRlRGlyZWN0b3IiOlsicHJvdmlkZURpcmVjdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOHN9LcdHQAAHR0AAD8AAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ZhdWx0RmFjdG9yeS92YXVsdEZhY3RvcnkuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9nb3Zlcm5hbmNlIiwiQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMiLCJAYWdvcmljL2dvdmVybmFuY2Uvc3JjL2NvbnRyYWN0SGVscGVyLmpzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9wYXJhbXMuanMiLCIuL3ZhdWx0RGlyZWN0b3IuanMiXSwiZXhwb3J0cyI6WyJtZXRhIiwic3RhcnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBDT05UUkFDVF9FTEVDVE9SQVRFLG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMsdmFsaWRhdGVFbGVjdG9yYXRlLG1ha2VUcmFjZXIsU3RvcmFnZU5vZGVTaGFwZSx3cmFwUmVtb3RlTWFyc2hhbGxlcixtYWtlU3RvcmVkU3Vic2NyaXB0aW9uLG1ha2VTdWJzY3JpcHRpb25LaXQsTSxwcm92aWRlQWxsLHByZXBhcmVSZWNvcmRlcktpdE1ha2VycyxFLEZlZU1pbnRBY2Nlc3NTaGFwZSxTSE9SVEZBTExfSU5WSVRBVElPTl9LRVksdmF1bHREaXJlY3RvclBhcmFtVHlwZXMscHJvdmlkZURpcmVjdG9yOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9nb3Zlcm5hbmNlXCIsIFtbXCJDT05UUkFDVF9FTEVDVE9SQVRFXCIsWyRozY9fYSA9PiAoQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZ292ZXJuYW5jZS9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzXCIsIFtbXCJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zXCIsWyRozY9fYSA9PiAobWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZ292ZXJuYW5jZS9zcmMvY29udHJhY3RIZWxwZXIuanNcIiwgW1tcInZhbGlkYXRlRWxlY3RvcmF0ZVwiLFskaM2PX2EgPT4gKHZhbGlkYXRlRWxlY3RvcmF0ZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dLFtcIlN0b3JhZ2VOb2RlU2hhcGVcIixbJGjNj19hID0+IChTdG9yYWdlTm9kZVNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanNcIiwgW1tcIndyYXBSZW1vdGVNYXJzaGFsbGVyXCIsWyRozY9fYSA9PiAod3JhcFJlbW90ZU1hcnNoYWxsZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uXCIsWyRozY9fYSA9PiAobWFrZVN0b3JlZFN1YnNjcmlwdGlvbiA9ICRozY9fYSldXSxbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsWyRozY9fYSA9PiAobWFrZVN1YnNjcmlwdGlvbktpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzXCIsIFtbXCJwcm92aWRlQWxsXCIsWyRozY9fYSA9PiAocHJvdmlkZUFsbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanNcIiwgW1tcInByZXBhcmVSZWNvcmRlcktpdE1ha2Vyc1wiLFskaM2PX2EgPT4gKHByZXBhcmVSZWNvcmRlcktpdE1ha2VycyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanNcIiwgW1tcIkZlZU1pbnRBY2Nlc3NTaGFwZVwiLFskaM2PX2EgPT4gKEZlZU1pbnRBY2Nlc3NTaGFwZSA9ICRozY9fYSldXV1dLFtcIi4vcGFyYW1zLmpzXCIsIFtbXCJTSE9SVEZBTExfSU5WSVRBVElPTl9LRVlcIixbJGjNj19hID0+IChTSE9SVEZBTExfSU5WSVRBVElPTl9LRVkgPSAkaM2PX2EpXV0sW1widmF1bHREaXJlY3RvclBhcmFtVHlwZXNcIixbJGjNj19hID0+ICh2YXVsdERpcmVjdG9yUGFyYW1UeXBlcyA9ICRozY9fYSldXV1dLFtcIi4vdmF1bHREaXJlY3Rvci5qc1wiLCBbW1wicHJvdmlkZURpcmVjdG9yXCIsWyRozY9fYSA9PiAocHJvdmlkZURpcmVjdG9yID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZW1vdGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7Q29udHJhY3RNZXRhLCBGZWVNaW50QWNjZXNzLCBIYW5kbGVPZmZlciwgSW52aXRhdGlvbiwgT2ZmZXJIYW5kbGVyLCBUcmFuc2ZlclBhcnQsIFpDRiwgWkNGTWludCwgWkNGU2VhdH0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7Q29udHJhY3RPZn0gZnJvbSAnQGFnb3JpYy96b2Uvc3JjL3pvZVNlcnZpY2UvdXRpbHMuanMnO1xuICogQGltcG9ydCB7UHJpY2VBdXRob3JpdHksIFByaWNlRGVzY3JpcHRpb24sIFByaWNlUXVvdGUsIFByaWNlUXVvdGVWYWx1ZSwgUHJpY2VRdWVyeSx9IGZyb20gJ0BhZ29yaWMvem9lL3Rvb2xzL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1ZhdWx0RGlyZWN0b3JQYXJhbXN9IGZyb20gJy4vcGFyYW1zLmpzJztcbiAqIEBpbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSAnQGFnb3JpYy90aW1lJztcbiAqIEBpbXBvcnQge0Fzc2V0UmVzZXJ2ZVB1YmxpY0ZhY2V0fSBmcm9tICcuLi9yZXNlcnZlL2Fzc2V0UmVzZXJ2ZS5qcyc7XG4gKiBAaW1wb3J0IHtWYXVsdE1hbmFnZXJQYXJhbU92ZXJyaWRlc30gZnJvbSAnLi9wYXJhbXMuanMnO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7R292ZXJuYW5jZVRlcm1zfSBmcm9tICdAYWdvcmljL2dvdmVybmFuY2Uvc3JjL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1N0b3JhZ2VOb2RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzJztcbiAqIEBpbXBvcnQge01hcnNoYWxsZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbmNvbnN0IHRyYWNlID0gbWFrZVRyYWNlcignVkYnLCB0cnVlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7WkNGPFxuICogICBHb3Zlcm5hbmNlVGVybXM8VmF1bHREaXJlY3RvclBhcmFtcz4gJiB7XG4gKiAgICAgcHJpY2VBdXRob3JpdHk6IEVSZWY8UHJpY2VBdXRob3JpdHk+O1xuICogICAgIHJlc2VydmVQdWJsaWNGYWNldDogQXNzZXRSZXNlcnZlUHVibGljRmFjZXQ7XG4gKiAgICAgdGltZXJTZXJ2aWNlOiBUaW1lclNlcnZpY2U7XG4gKiAgIH1cbiAqID59IFZhdWx0RmFjdG9yeVpDRlxuICovXG5cbi8qKiBAdHlwZSB7Q29udHJhY3RNZXRhPHR5cGVvZiBzdGFydD59ICovXG4gICAgICAgY29uc3QgbWV0YSA9IHtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBzcGxpdFJlY29yZCBsb3NlcyB0aGUgcHJvcGVydHkga2V5cyovXG4gIHByaXZhdGVBcmdzU2hhcGU6IE0uc3BsaXRSZWNvcmQoXG4gICAge1xuICAgICAgbWFyc2hhbGxlcjogTS5yZW1vdGFibGUoJ01hcnNoYWxsZXInKSxcbiAgICAgIHN0b3JhZ2VOb2RlOiBTdG9yYWdlTm9kZVNoYXBlLFxuICAgIH0sXG4gICAge1xuICAgICAgLyogb25seSBuZWNlc3Nhcnkgb24gZmlyc3QgaW52b2NhdGlvbiwgbm90IHN1YnNlcXVlbnQqL1xuICAgICAgZmVlTWludEFjY2VzczogRmVlTWludEFjY2Vzc1NoYXBlLFxuICAgICAgaW5pdGlhbFBvc2VySW52aXRhdGlvbjogTS5hbnkoKSxcbiAgICAgIGluaXRpYWxTaG9ydGZhbGxJbnZpdGF0aW9uOiBNLmFueSgpLFxuICAgIH0sXG4gICksXG4gIHVwZ3JhZGFiaWxpdHk6ICdjYW5VcGdyYWRlJyxcbn07JGjNj19vbmNlLm1ldGEobWV0YSk7XG5oYXJkZW4obWV0YSk7XG5cbi8qKlxuICogQHBhcmFtIHtWYXVsdEZhY3RvcnlaQ0Z9IHpjZlxuICogQHBhcmFtIHt7XG4gKiAgIGZlZU1pbnRBY2Nlc3M6IEZlZU1pbnRBY2Nlc3M7XG4gKiAgIGluaXRpYWxQb3Nlckludml0YXRpb246IEludml0YXRpb247XG4gKiAgIGluaXRpYWxTaG9ydGZhbGxJbnZpdGF0aW9uOiBJbnZpdGF0aW9uO1xuICogICBzdG9yYWdlTm9kZTogUmVtb3RlPFN0b3JhZ2VOb2RlPjtcbiAqICAgbWFyc2hhbGxlcjogUmVtb3RlPE1hcnNoYWxsZXI+O1xuICogICBtYW5hZ2VyUGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBWYXVsdE1hbmFnZXJQYXJhbU92ZXJyaWRlcz47XG4gKiAgIGRpcmVjdG9yUGFyYW1PdmVycmlkZXM6IFtvYmplY3RdO1xuICogfX0gcHJpdmF0ZUFyZ3NcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICovXG4gICAgICAgY29uc3Qgc3RhcnQgPSBhc3luYyAoemNmLCBwcml2YXRlQXJncywgYmFnZ2FnZSkgPT4ge1xuICB0cmFjZSgncHJlcGFyZSBzdGFydCcsIHByaXZhdGVBcmdzLCBbLi4uYmFnZ2FnZS5rZXlzKCldKTtcbiAgY29uc3Qge1xuICAgIGluaXRpYWxQb3Nlckludml0YXRpb24sXG4gICAgaW5pdGlhbFNob3J0ZmFsbEludml0YXRpb24sXG4gICAgbWFyc2hhbGxlcjogcmVtb3RlTWFyc2hhbGxlcixcbiAgICBzdG9yYWdlTm9kZSxcbiAgICBtYW5hZ2VyUGFyYW1zLFxuICAgIGRpcmVjdG9yUGFyYW1PdmVycmlkZXMsXG4gIH0gPSBwcml2YXRlQXJncztcblxuICBjb25zdCBjYWNoaW5nTWFyc2hhbGxlciA9IHdyYXBSZW1vdGVNYXJzaGFsbGVyKHJlbW90ZU1hcnNoYWxsZXIpO1xuXG4gIHRyYWNlKCdhd2FpdGluZyBkZWJ0TWludCcpO1xuICBjb25zdCB7IGRlYnRNaW50IH0gPSBhd2FpdCBwcm92aWRlQWxsKGJhZ2dhZ2UsIHtcbiAgICBkZWJ0TWludDogKCkgPT4gemNmLnJlZ2lzdGVyRmVlTWludCgnTWludGVkJywgcHJpdmF0ZUFyZ3MuZmVlTWludEFjY2VzcyksXG4gIH0pO1xuXG4gIHpjZi5zZXRUZXN0SmlnKCgpID0+ICh7XG4gICAgbWludGVkSXNzdWVyUmVjb3JkOiBkZWJ0TWludC5nZXRJc3N1ZXJSZWNvcmQoKSxcbiAgfSkpO1xuXG4gIGNvbnN0IHsgdGltZXJTZXJ2aWNlIH0gPSB6Y2YuZ2V0VGVybXMoKTtcblxuICBjb25zdCB7IG1ha2VSZWNvcmRlcktpdCwgbWFrZUVSZWNvcmRlcktpdCB9ID0gcHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKFxuICAgIGJhZ2dhZ2UsXG4gICAgY2FjaGluZ01hcnNoYWxsZXIsXG4gICk7XG5cbiAgdHJhY2UoJ21ha2luZyBub24tZHVyYWJsZSBwdWJsaXNoZXJzJyk7XG4gIC8qIFhYWCBub24tZHVyYWJsZSwgd2lsbCBzZXZlciB1cG9uIHZhdCByZXN0YXJ0Ki9cbiAgY29uc3QgZ292ZXJuYW5jZVN1YnNjcmlwdGlvbktpdCA9IG1ha2VTdWJzY3JpcHRpb25LaXQoKTtcbiAgY29uc3QgZ292ZXJuYW5jZU5vZGUgPSBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKCdnb3Zlcm5hbmNlJyk7XG4gIGNvbnN0IGdvdmVybmFuY2VTdWJzY3JpYmVyID0gbWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbiAgICBnb3Zlcm5hbmNlU3Vic2NyaXB0aW9uS2l0LnN1YnNjcmlwdGlvbixcbiAgICBnb3Zlcm5hbmNlTm9kZSxcbiAgICBjYWNoaW5nTWFyc2hhbGxlcixcbiAgKTtcbiAgLyoqIGEgcG93ZXJmdWwgb2JqZWN0OyBjYW4gbW9kaWZ5IHRoZSBpbnZpdGF0aW9uICovXG4gIGNvbnN0IHZhdWx0RGlyZWN0b3JQYXJhbU1hbmFnZXIgPSBhd2FpdCBtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKFxuICAgIHtcbiAgICAgIHB1Ymxpc2hlcjogZ292ZXJuYW5jZVN1YnNjcmlwdGlvbktpdC5wdWJsaWNhdGlvbixcbiAgICAgIHN1YnNjcmliZXI6IGdvdmVybmFuY2VTdWJzY3JpYmVyLFxuICAgIH0sXG4gICAgemNmLFxuICAgIHtcbiAgICAgIFtDT05UUkFDVF9FTEVDVE9SQVRFXTogaW5pdGlhbFBvc2VySW52aXRhdGlvbixcbiAgICAgIFtTSE9SVEZBTExfSU5WSVRBVElPTl9LRVldOiBpbml0aWFsU2hvcnRmYWxsSW52aXRhdGlvbixcbiAgICB9LFxuICAgIHZhdWx0RGlyZWN0b3JQYXJhbVR5cGVzLFxuICAgIGRpcmVjdG9yUGFyYW1PdmVycmlkZXMsXG4gICk7XG5cbiAgY29uc3QgZGlyZWN0b3IgPSBwcm92aWRlRGlyZWN0b3IoXG4gICAgYmFnZ2FnZSxcbiAgICB6Y2YsXG4gICAgdmF1bHREaXJlY3RvclBhcmFtTWFuYWdlcixcbiAgICBkZWJ0TWludCxcbiAgICB0aW1lclNlcnZpY2UsXG4gICAgc3RvcmFnZU5vZGUsXG4gICAgLyogWFhYIHJlbW92ZSBSZWNvcmRlciBtYWtlcnM7IHJlbW92ZSBvbmNlIHdlIGV4Y2lzZSBkZXByZWNhdGVkIGtpdHMgZm9yIGdvdmVybmFuY2UqL1xuICAgIGNhY2hpbmdNYXJzaGFsbGVyLFxuICAgIG1ha2VSZWNvcmRlcktpdCxcbiAgICBtYWtlRVJlY29yZGVyS2l0LFxuICAgIG1hbmFnZXJQYXJhbXMsXG4gICk7XG5cbiAgLyogY2Fubm90IGF3YWl0IGJlY2F1c2UgaXQgd291bGQgbWFrZSByZW1vdGUgY2FsbHMgZHVyaW5nIHZhdCByZXN0YXJ0Ki9cbiAgZGlyZWN0b3IuaGVscGVyLnN0YXJ0KCkuY2F0Y2goZXJyID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCfwn5KAIHZhdWx0RGlyZWN0b3IgZmFpbGVkIHRvIHN0YXJ0OicsIGVycik7XG4gICAgemNmLnNodXRkb3duV2l0aEZhaWx1cmUoZXJyKTtcbiAgfSk7XG5cbiAgLyogdmFsaWRhdGUgYXN5bmMgdG8gd2FpdCBmb3IgcGFyYW1zIHRvIGJlIGZpbmlzaGVkKi9cbiAgLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzQzKi9cbiAgdm9pZCB2YWxpZGF0ZUVsZWN0b3JhdGUoemNmLCB2YXVsdERpcmVjdG9yUGFyYW1NYW5hZ2VyKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBjcmVhdG9yRmFjZXQ6IGRpcmVjdG9yLmNyZWF0b3IsXG4gICAgcHVibGljRmFjZXQ6IGRpcmVjdG9yLnB1YmxpYyxcbiAgfSk7XG59OyRozY9fb25jZS5zdGFydChzdGFydCk7XG5oYXJkZW4oc3RhcnQpO1xuXG4vKiogQHR5cGVkZWYge0NvbnRyYWN0T2Y8dHlwZW9mIHN0YXJ0Pn0gVmF1bHRGYWN0b3J5Q29udHJhY3QgKi9cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ldGEiOlsibWV0YSJdLCJzdGFydCI6WyJzdGFydCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABVg3jQ1xQAANcUAAA+AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy92YXVsdEZhY3RvcnkvdmF1bHRIb2xkZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiLCJAYWdvcmljL2ludGVybmFsL3NyYy90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVZhdWx0SG9sZGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxBbW91bnRTaGFwZSxNLHByZXBhcmVFeG9DbGFzc0tpdCxUb3BpY3NSZWNvcmRTaGFwZSxVbmd1YXJkZWRIZWxwZXJJOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50U2hhcGVcIixbJGjNj19hID0+IChBbW91bnRTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcIlRvcGljc1JlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoVG9waWNzUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJVbmd1YXJkZWRIZWxwZXJJXCIsWyRozY9fYSA9PiAoVW5ndWFyZGVkSGVscGVySSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1JlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtLZXksIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1JlY29yZGVyS2l0fSBmcm9tICdAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge01ha2VSZWNvcmRlcktpdH0gZnJvbSAnQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyc7XG4gKiBAaW1wb3J0IHtWYXVsdCwgVmF1bHROb3RpZmljYXRpb259IGZyb20gJy4vdmF1bHQuanMnO1xuICogQGltcG9ydCB7U3RvcmFnZU5vZGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqICAgdG9waWNLaXQ6IFJlY29yZGVyS2l0PFZhdWx0Tm90aWZpY2F0aW9uPjtcbiAqICAgdmF1bHQ6IFZhdWx0IHwgbnVsbDtcbiAqIH19IFN0YXRlXG4gKi9cblxuY29uc3QgSG9sZGVySSA9IE0uaW50ZXJmYWNlKCdob2xkZXInLCB7XG4gIGdldENvbGxhdGVyYWxBbW91bnQ6IE0uY2FsbCgpLnJldHVybnMoQW1vdW50U2hhcGUpLFxuICBnZXRDdXJyZW50RGVidDogTS5jYWxsKCkucmV0dXJucyhBbW91bnRTaGFwZSksXG4gIGdldE5vcm1hbGl6ZWREZWJ0OiBNLmNhbGwoKS5yZXR1cm5zKEFtb3VudFNoYXBlKSxcbiAgZ2V0UHVibGljVG9waWNzOiBNLmNhbGwoKS5yZXR1cm5zKFRvcGljc1JlY29yZFNoYXBlKSxcbiAgbWFrZUFkanVzdEJhbGFuY2VzSW52aXRhdGlvbjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIG1ha2VDbG9zZUludml0YXRpb246IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBtYWtlVHJhbnNmZXJJbnZpdGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn0pO1xuXG4vKiogQHR5cGUge3sgW25hbWU6IHN0cmluZ106IFtkZXNjcmlwdGlvbjogc3RyaW5nLCB2YWx1ZVNoYXBlOiBQYXR0ZXJuXSB9fSAqL1xuY29uc3QgUFVCTElDX1RPUElDUyA9IHtcbiAgdmF1bHQ6IFsnVmF1bHQgaG9sZGVyIHN0YXR1cycsIE0uYW55KCldLFxufTtcblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7TWFrZVJlY29yZGVyS2l0fSBtYWtlUmVjb3JkZXJLaXRcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVWYXVsdEhvbGRlciA9IChiYWdnYWdlLCBtYWtlUmVjb3JkZXJLaXQpID0+IHtcbiAgY29uc3QgbWFrZVZhdWx0SG9sZGVyS2l0ID0gcHJlcGFyZUV4b0NsYXNzS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ1ZhdWx0IEhvbGRlcicsXG4gICAge1xuICAgICAgaGVscGVyOiBVbmd1YXJkZWRIZWxwZXJJLFxuICAgICAgaG9sZGVyOiBIb2xkZXJJLFxuICAgICAgaW52aXRhdGlvbk1ha2VyczogTS5pbnRlcmZhY2UoJ2ludml0YXRpb25NYWtlcnMnLCB7XG4gICAgICAgIEFkanVzdEJhbGFuY2VzOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICAgICAgQ2xvc2VWYXVsdDogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICAgIFRyYW5zZmVyVmF1bHQ6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgICAgfSksXG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7VmF1bHR9IHZhdWx0XG4gKiBAcGFyYW0ge1JlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcmV0dXJucyB7U3RhdGV9XG4gKi9cbiAgICAodmF1bHQsIHN0b3JhZ2VOb2RlKSA9PiB7XG4gICAgICAvKiBtdXN0IGJlIHRoZSBmdWxseSBzeW5jaHJvbm91cyBtYWtlciBiZWNhdXNlIHRoZSBraXQgaXMgaGVsZCBpbiBkdXJhYmxlIHN0YXRlKi9cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIFBhdHRlcm5zKi9cbiAgICAgIGNvbnN0IHRvcGljS2l0ID0gbWFrZVJlY29yZGVyS2l0KHN0b3JhZ2VOb2RlLCBQVUJMSUNfVE9QSUNTLnZhdWx0WzFdKTtcblxuICAgICAgcmV0dXJuIHsgdG9waWNLaXQsIHZhdWx0IH07XG4gICAgfSxcbiAgICB7XG4gICAgICBoZWxwZXI6IHtcbiAgICAgICAgLyoqIEB0aHJvd3MgaWYgdGhpcyBob2xkZXIgbm8gbG9uZ2VyIG93bnMgdGhlIHZhdWx0ICovXG4gICAgICAgIG93bmVkKCkge1xuICAgICAgICAgIGNvbnN0IHsgdmF1bHQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgaWYgKCF2YXVsdCkge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBVc2luZyB2YXVsdCBob2xkZXIgYWZ0ZXIgdHJhbnNmZXJgO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmF1bHQ7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFVwZGF0ZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUudG9waWNLaXQucmVjb3JkZXI7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgaW52aXRhdGlvbk1ha2Vyczoge1xuICAgICAgICBBZGp1c3RCYWxhbmNlcygpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMuaG9sZGVyLm1ha2VBZGp1c3RCYWxhbmNlc0ludml0YXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgQ2xvc2VWYXVsdCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMuaG9sZGVyLm1ha2VDbG9zZUludml0YXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgVHJhbnNmZXJWYXVsdCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMuaG9sZGVyLm1ha2VUcmFuc2Zlckludml0YXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBob2xkZXI6IHtcbiAgICAgICAgZ2V0UHVibGljVG9waWNzKCkge1xuICAgICAgICAgIGNvbnN0IHsgdG9waWNLaXQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgICAgICB2YXVsdDoge1xuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogUFVCTElDX1RPUElDUy52YXVsdFswXSxcbiAgICAgICAgICAgICAgc3Vic2NyaWJlcjogdG9waWNLaXQuc3Vic2NyaWJlcixcbiAgICAgICAgICAgICAgc3RvcmFnZVBhdGg6IHRvcGljS2l0LnJlY29yZGVyLmdldFN0b3JhZ2VQYXRoKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtYWtlQWRqdXN0QmFsYW5jZXNJbnZpdGF0aW9uKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5oZWxwZXIub3duZWQoKS5tYWtlQWRqdXN0QmFsYW5jZXNJbnZpdGF0aW9uKCk7XG4gICAgICAgIH0sXG4gICAgICAgIG1ha2VDbG9zZUludml0YXRpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLmhlbHBlci5vd25lZCgpLm1ha2VDbG9zZUludml0YXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gKiBTdGFydGluZyBhIHRyYW5zZmVyIHJldm9rZXMgdGhlIHZhdWx0IGhvbGRlci4gVGhlIGFzc29jaWF0ZWQgdXBkYXRlclxuICogd2lsbCBnZXQgYSBzcGVjaWFsIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSB2YXVsdCBpcyBiZWluZyB0cmFuc2ZlcnJlZC5cbiAqL1xuICAgICAgICBtYWtlVHJhbnNmZXJJbnZpdGF0aW9uKCkge1xuICAgICAgICAgIGNvbnN0IHZhdWx0ID0gdGhpcy5mYWNldHMuaGVscGVyLm93bmVkKCk7XG4gICAgICAgICAgdGhpcy5zdGF0ZS52YXVsdCA9IG51bGw7XG4gICAgICAgICAgcmV0dXJuIHZhdWx0Lm1ha2VUcmFuc2Zlckludml0YXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyogZm9yIHN0YXR1cy9kZWJ1Z2dpbmcqL1xuICAgICAgICBnZXRDb2xsYXRlcmFsQW1vdW50KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5oZWxwZXIub3duZWQoKS5nZXRDb2xsYXRlcmFsQW1vdW50KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEN1cnJlbnREZWJ0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5oZWxwZXIub3duZWQoKS5nZXRDdXJyZW50RGVidCgpO1xuICAgICAgICB9LFxuICAgICAgICBnZXROb3JtYWxpemVkRGVidCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMuaGVscGVyLm93bmVkKCkuZ2V0Tm9ybWFsaXplZERlYnQoKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIG1ha2VWYXVsdEhvbGRlcktpdDtcbn07JGjNj19vbmNlLnByZXBhcmVWYXVsdEhvbGRlcihwcmVwYXJlVmF1bHRIb2xkZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVZhdWx0SG9sZGVyIjpbInByZXBhcmVWYXVsdEhvbGRlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB2OmpnhAgAAIQIAAA7AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy92YXVsdEZhY3RvcnkvdmF1bHRLaXQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9pbnRlcm5hbCIsIi4vdmF1bHRIb2xkZXIuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlVmF1bHRLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlVHJhY2VyLHByZXBhcmVWYXVsdEhvbGRlcjskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dXV0sW1wiLi92YXVsdEhvbGRlci5qc1wiLCBbW1wicHJlcGFyZVZhdWx0SG9sZGVyXCIsWyRozY9fYSA9PiAocHJlcGFyZVZhdWx0SG9sZGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdWSycsIHRydWUpO1xuXG4vKipcbiAqIEBpbXBvcnQge1JlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtFUmV0dXJufSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7TWFrZVJlY29yZGVyS2l0fSBmcm9tICdAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzJztcbiAqIEBpbXBvcnQge1ZhdWx0fSBmcm9tICcuL3ZhdWx0LmpzJztcbiAqIEBpbXBvcnQge1N0b3JhZ2VOb2RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzJztcbiAqL1xuXG4vKipcbiAqIFdyYXAgdGhlIFZhdWx0SG9sZGVyIGR1cmF0aW9uIG9iamVjdCBpbiBhIHJlY29yZCBzdWl0YWJsZSBmb3IgdGhlIHJlc3VsdCBvZlxuICogYW4gaW52aXRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7TWFrZVJlY29yZGVyS2l0fSBtYWtlUmVjb3JkZXJLaXRcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVWYXVsdEtpdCA9IChiYWdnYWdlLCBtYWtlUmVjb3JkZXJLaXQpID0+IHtcbiAgdHJhY2UoJ3ByZXBhcmVWYXVsdEtpdCcsIFsuLi5iYWdnYWdlLmtleXMoKV0pO1xuXG4gIGNvbnN0IG1ha2VWYXVsdEhvbGRlciA9IHByZXBhcmVWYXVsdEhvbGRlcihiYWdnYWdlLCBtYWtlUmVjb3JkZXJLaXQpO1xuICAvKipcbiAqIENyZWF0ZSBhIGtpdCBvZiB1dGlsaXRpZXMgZm9yIHVzZSBvZiB0aGUgdmF1bHQuXG4gKlxuICogQHBhcmFtIHtWYXVsdH0gdmF1bHRcbiAqIEBwYXJhbSB7UmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqL1xuICBjb25zdCBtYWtlVmF1bHRLaXQgPSAodmF1bHQsIHN0b3JhZ2VOb2RlKSA9PiB7XG4gICAgdHJhY2UoJ3ByZXBhcmVWYXVsdEtpdCBtYWtlVmF1bHRLaXQnKTtcbiAgICBjb25zdCB7IGhvbGRlciwgaGVscGVyLCBpbnZpdGF0aW9uTWFrZXJzIH0gPSBtYWtlVmF1bHRIb2xkZXIoXG4gICAgICB2YXVsdCxcbiAgICAgIHN0b3JhZ2VOb2RlLFxuICAgICk7XG4gICAgY29uc3QgaG9sZGVyVG9waWNzID0gaG9sZGVyLmdldFB1YmxpY1RvcGljcygpO1xuICAgIGNvbnN0IHZhdWx0S2l0ID0gaGFyZGVuKHtcbiAgICAgIHB1YmxpY1N1YnNjcmliZXJzOiB7XG4gICAgICAgIHZhdWx0OiBob2xkZXJUb3BpY3MudmF1bHQsXG4gICAgICB9LFxuICAgICAgaW52aXRhdGlvbk1ha2VycyxcbiAgICAgIHZhdWx0OiBob2xkZXIsXG4gICAgICB2YXVsdFVwZGF0ZXI6IGhlbHBlci5nZXRVcGRhdGVyKCksXG4gICAgfSk7XG4gICAgcmV0dXJuIHZhdWx0S2l0O1xuICB9O1xuICByZXR1cm4gbWFrZVZhdWx0S2l0O1xufTtcblxuLyoqIEB0eXBlZGVmIHtFUmV0dXJuPEVSZXR1cm48dHlwZW9mIHByZXBhcmVWYXVsdEtpdD4+fSBWYXVsdEtpdCAqLyRozY9fb25jZS5wcmVwYXJlVmF1bHRLaXQocHJlcGFyZVZhdWx0S2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVWYXVsdEtpdCI6WyJwcmVwYXJlVmF1bHRLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAn6lY+NSfAADUnwAAPwAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvdmF1bHRGYWN0b3J5L3ZhdWx0TWFuYWdlci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qcyIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiLCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCIuLi9jb250cmFjdFN1cHBvcnQuanMiLCIuLi9pbnRlcmVzdC5qcyIsIi4vbWF0aC5qcyIsIi4vcHJpb3JpdGl6ZWRWYXVsdHMuanMiLCIuL3ZhdWx0LmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVZhdWx0TWFuYWdlcktpdCIsInByb3ZpZGVBbmRTdGFydFZhdWx0TWFuYWdlcktpdHMiLCJ3YXRjaFF1b3RlTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRNYXRoLEFtb3VudFNoYXBlLEJyYW5kU2hhcGUsTm90aWZpZXJTaGFwZSxSYXRpb1NoYXBlLG11bHRpcGx5QnksbWFrZVRyYWNlcixtYWtlU3RvcmVkTm90aWZpZXIsb2JzZXJ2ZU5vdGlmaWVyLGFwcGVuZFRvU3RvcmVkQXJyYXksTSxtYWtlU2NhbGFyQmlnTWFwU3RvcmUsbWFrZVNjYWxhckJpZ1NldFN0b3JlLHByZXBhcmVFeG9DbGFzc0tpdCxwcm92aWRlLFRyYW5zZmVyUGFydFNoYXBlLGNlaWxNdWx0aXBseUJ5LGZsb29yRGl2aWRlQnksZ2V0QW1vdW50SW4sZ2V0QW1vdW50T3V0LG1ha2VFcGhlbWVyYVByb3ZpZGVyLG1ha2VSYXRpbyxtYWtlUmVjb3JkZXJUb3BpYyxvZmZlclRvLFN1YnNjcmliZXJTaGFwZSxUb3BpY3NSZWNvcmRTaGFwZSxQcmljZVF1b3RlU2hhcGUsU2VhdFNoYXBlLEZhaWwsbWFrZUVycm9yLFgsRSxjaGVja0RlYnRMaW1pdCxtYWtlTmF0QW1vdW50U2hhcGUscXVvdGVBc1JhdGlvLGNoYXJnZUludGVyZXN0LGNhbGN1bGF0ZU1pbmltdW1Db2xsYXRlcmFsaXphdGlvbixtaW5pbXVtUHJpY2UsbWFrZVByaW9yaXRpemVkVmF1bHRzLFBoYXNlLHByZXBhcmVWYXVsdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV0sW1wiQW1vdW50U2hhcGVcIixbJGjNj19hID0+IChBbW91bnRTaGFwZSA9ICRozY9fYSldXSxbXCJCcmFuZFNoYXBlXCIsWyRozY9fYSA9PiAoQnJhbmRTaGFwZSA9ICRozY9fYSldXSxbXCJOb3RpZmllclNoYXBlXCIsWyRozY9fYSA9PiAoTm90aWZpZXJTaGFwZSA9ICRozY9fYSldXSxbXCJSYXRpb1NoYXBlXCIsWyRozY9fYSA9PiAoUmF0aW9TaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanNcIiwgW1tcIm11bHRpcGx5QnlcIixbJGjNj19hID0+IChtdWx0aXBseUJ5ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlU3RvcmVkTm90aWZpZXJcIixbJGjNj19hID0+IChtYWtlU3RvcmVkTm90aWZpZXIgPSAkaM2PX2EpXV0sW1wib2JzZXJ2ZU5vdGlmaWVyXCIsWyRozY9fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZS9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJhcHBlbmRUb1N0b3JlZEFycmF5XCIsWyRozY9fYSA9PiAoYXBwZW5kVG9TdG9yZWRBcnJheSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnU2V0U3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dLFtcInByb3ZpZGVcIixbJGjNj19hID0+IChwcm92aWRlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qc1wiLCBbW1wiVHJhbnNmZXJQYXJ0U2hhcGVcIixbJGjNj19hID0+IChUcmFuc2ZlclBhcnRTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNcIiwgW1tcImNlaWxNdWx0aXBseUJ5XCIsWyRozY9fYSA9PiAoY2VpbE11bHRpcGx5QnkgPSAkaM2PX2EpXV0sW1wiZmxvb3JEaXZpZGVCeVwiLFskaM2PX2EgPT4gKGZsb29yRGl2aWRlQnkgPSAkaM2PX2EpXV0sW1wiZ2V0QW1vdW50SW5cIixbJGjNj19hID0+IChnZXRBbW91bnRJbiA9ICRozY9fYSldXSxbXCJnZXRBbW91bnRPdXRcIixbJGjNj19hID0+IChnZXRBbW91bnRPdXQgPSAkaM2PX2EpXV0sW1wibWFrZUVwaGVtZXJhUHJvdmlkZXJcIixbJGjNj19hID0+IChtYWtlRXBoZW1lcmFQcm92aWRlciA9ICRozY9fYSldXSxbXCJtYWtlUmF0aW9cIixbJGjNj19hID0+IChtYWtlUmF0aW8gPSAkaM2PX2EpXV0sW1wibWFrZVJlY29yZGVyVG9waWNcIixbJGjNj19hID0+IChtYWtlUmVjb3JkZXJUb3BpYyA9ICRozY9fYSldXSxbXCJvZmZlclRvXCIsWyRozY9fYSA9PiAob2ZmZXJUbyA9ICRozY9fYSldXSxbXCJTdWJzY3JpYmVyU2hhcGVcIixbJGjNj19hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaM2PX2EpXV0sW1wiVG9waWNzUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChUb3BpY3NSZWNvcmRTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJQcmljZVF1b3RlU2hhcGVcIixbJGjNj19hID0+IChQcmljZVF1b3RlU2hhcGUgPSAkaM2PX2EpXV0sW1wiU2VhdFNoYXBlXCIsWyRozY9fYSA9PiAoU2VhdFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIi4uL2NvbnRyYWN0U3VwcG9ydC5qc1wiLCBbW1wiY2hlY2tEZWJ0TGltaXRcIixbJGjNj19hID0+IChjaGVja0RlYnRMaW1pdCA9ICRozY9fYSldXSxbXCJtYWtlTmF0QW1vdW50U2hhcGVcIixbJGjNj19hID0+IChtYWtlTmF0QW1vdW50U2hhcGUgPSAkaM2PX2EpXV0sW1wicXVvdGVBc1JhdGlvXCIsWyRozY9fYSA9PiAocXVvdGVBc1JhdGlvID0gJGjNj19hKV1dXV0sW1wiLi4vaW50ZXJlc3QuanNcIiwgW1tcImNoYXJnZUludGVyZXN0XCIsWyRozY9fYSA9PiAoY2hhcmdlSW50ZXJlc3QgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGguanNcIiwgW1tcImNhbGN1bGF0ZU1pbmltdW1Db2xsYXRlcmFsaXphdGlvblwiLFskaM2PX2EgPT4gKGNhbGN1bGF0ZU1pbmltdW1Db2xsYXRlcmFsaXphdGlvbiA9ICRozY9fYSldXSxbXCJtaW5pbXVtUHJpY2VcIixbJGjNj19hID0+IChtaW5pbXVtUHJpY2UgPSAkaM2PX2EpXV1dXSxbXCIuL3ByaW9yaXRpemVkVmF1bHRzLmpzXCIsIFtbXCJtYWtlUHJpb3JpdGl6ZWRWYXVsdHNcIixbJGjNj19hID0+IChtYWtlUHJpb3JpdGl6ZWRWYXVsdHMgPSAkaM2PX2EpXV1dXSxbXCIuL3ZhdWx0LmpzXCIsIFtbXCJQaGFzZVwiLFskaM2PX2EgPT4gKFBoYXNlID0gJGjNj19hKV1dLFtcInByZXBhcmVWYXVsdFwiLFskaM2PX2EgPT4gKHByZXBhcmVWYXVsdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVtb3RlLCBSZW1vdGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7RU1hcnNoYWxsZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzJztcbiAqIEBpbXBvcnQge01hcFN0b3JlLCBTZXRTdG9yZX0gZnJvbSAnQGFnb3JpYy9zdG9yZSc7XG4gKiBAaW1wb3J0IHtFUmV0dXJufSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7WkNGTWludCwgWkNGU2VhdH0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7UHJpY2VRdW90ZX0gZnJvbSAnQGFnb3JpYy96b2UvdG9vbHMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7UHJvbWlzZVdhdGNoZXJ9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge1JlY29yZGVyS2l0fSBmcm9tICdAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzJztcbiAqIEBpbXBvcnQge0xhdGVzdFRvcGljLCBTdG9yZWROb3RpZmllcn0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtWYXVsdEZhY3RvcnlaQ0Z9IGZyb20gJy4vdmF1bHRGYWN0b3J5LmpzJztcbiAqIEBpbXBvcnQge01ha2VSZWNvcmRlcktpdH0gZnJvbSAnQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyc7XG4gKiBAaW1wb3J0IHtNYWtlRVJlY29yZGVyS2l0fSBmcm9tICdAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzJztcbiAqIEBpbXBvcnQge0ZhY3RvcnlQb3dlcnNGYWNldH0gZnJvbSAnLi92YXVsdERpcmVjdG9yLmpzJztcbiAqIEBpbXBvcnQge1JhdGlvfSBmcm9tICdAYWdvcmljL2VydHAnO1xuICogQGltcG9ydCB7VmF1bHR9IGZyb20gJy4vdmF1bHQuanMnO1xuICogQGltcG9ydCB7VmF1bHRQaGFzZX0gZnJvbSAnLi92YXVsdC5qcyc7XG4gKiBAaW1wb3J0IHtNaW50QW5kVHJhbnNmZXIsIFZhdWx0SWR9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7QW1vdW50fSBmcm9tICdAYWdvcmljL2VydHAnO1xuICogQGltcG9ydCB7QnJhbmR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtTdG9yYWdlTm9kZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdWTScpO1xuXG4vKipcbiAqIFdhdGNoIGEgbm90aWZpZXIgdGhhdCBpc24ndCBleHBlY3RlZCB0byBmYWlsIG9yIGZpbmlzaCB1bmxlc3MgdGhlIHZhdCBob3N0aW5nXG4gKiB0aGUgbm90aWZpZXIgaXMgdXBncmFkZWQuIFRoaXMgd2F0Y2hlciBzdXBwb3J0cyB0aGF0IGJ5IHByb3ZpZGluZyBhXG4gKiBzdHJhaWdodGZvcndhcmQgd2F5IHRvIGdldCBhIHJlcGxhY2VtZW50IGlmIHRoZSBub3RpZmllciBicmVha3MuXG4gKlxuICogQHRlbXBsYXRlIFQgbm90aWZpZXIgdG9waWNcbiAqIEB0ZW1wbGF0ZSB7YW55W119IFtBPXVua25vd25bXV0gYXJiaXRyYXJ5IGFyZ3VtZW50c1xuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcGFyYW0ge1Byb21pc2VXYXRjaGVyPFQsIEE+fSB3YXRjaGVyXG4gKiBAcGFyYW0ge0F9IGFyZ3NcbiAqL1xuICAgICAgIGNvbnN0IHdhdGNoUXVvdGVOb3RpZmllciA9IGFzeW5jIChub3RpZmllclAsIHdhdGNoZXIsIC4uLmFyZ3MpID0+IHtcbiAgYXdhaXQgdW5kZWZpbmVkO1xuXG4gIGxldCB1cGRhdGVDb3VudDtcbiAgZm9yICg7Oykge1xuICAgIGxldCB2YWx1ZTtcbiAgICB0cnkge1xuICAgICAgKHsgdmFsdWUsIHVwZGF0ZUNvdW50IH0gPSBhd2FpdCBFKG5vdGlmaWVyUCkuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpKTtcbiAgICAgIHdhdGNoZXIub25GdWxmaWxsZWQgJiYgd2F0Y2hlci5vbkZ1bGZpbGxlZCh2YWx1ZSwgLi4uYXJncyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgd2F0Y2hlci5vblJlamVjdGVkICYmIHdhdGNoZXIub25SZWplY3RlZChlLCAuLi5hcmdzKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAodXBkYXRlQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgd2F0Y2hlci5vblJlamVjdGVkICYmXG4gICAgICAgIHdhdGNoZXIub25SZWplY3RlZChFcnJvcignc3RyZWFtIGZpbmlzaGVkJyksIC4uLmFyZ3MpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG59O1xuXG4vKiogQGltcG9ydCB7Tm9ybWFsaXplZERlYnR9IGZyb20gJy4vc3RvcmVVdGlscy5qcycgKi9cbi8qKiBAaW1wb3J0IHtSZWxhdGl2ZVRpbWUsIFRpbWVzdGFtcH0gZnJvbSAnQGFnb3JpYy90aW1lJyAqL1xuXG4vKiBNZXRyaWNzIG5hbWluZyBzY2hlbWU6IG5vdW5zIGFyZSBwcmVzZW50IHZhbHVlczsgcGFzdC1wYXJ0aWNpcGxlcyBhcmUgYWNjdW11bGF0aXZlLiovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1ldHJpY3NOb3RpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7UmF0aW8gfCBudWxsfSBsb2NrZWRRdW90ZSBwcmljZVF1b3RlIHRoYXQgd2lsbCBiZSB1c2VkIGZvclxuICogICBsaXF1aWRhdGlvbi4gTm9uLW51bGwgZnJvbSBwcmljZUxvY2sgdGltZSB1bnRpbCBsaXF1aWRhdGlvbiBoYXMgdGFrZW5cbiAqICAgcGxhY2UuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtQWN0aXZlVmF1bHRzIHByZXNlbnQgY291bnQgb2YgdmF1bHRzXG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtTGlxdWlkYXRpbmdWYXVsdHMgcHJlc2VudCBjb3VudCBvZiBsaXF1aWRhdGluZyB2YXVsdHNcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gdG90YWxDb2xsYXRlcmFsIHByZXNlbnQgc3VtIG9mIGNvbGxhdGVyYWwgYWNyb3NzXG4gKiAgIGFsbCB2YXVsdHNcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gdG90YWxEZWJ0IHByZXNlbnQgc3VtIG9mIGRlYnQgYWNyb3NzIGFsbCB2YXVsdHNcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gcmV0YWluZWRDb2xsYXRlcmFsIGNvbGxhdGVyYWwgaGVsZCBhcyBhIHJlc3VsdCBvZlxuICogICBub3QgcmV0dXJuaW5nIGV4Y2VzcyByZWZ1bmRzIHRvIG93bmVycyBvZiB2YXVsdHMgbGlxdWlkYXRlZCB3aXRoXG4gKiAgIHNob3J0ZmFsbHNcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gbGlxdWlkYXRpbmdDb2xsYXRlcmFsIHByZXNlbnQgc3VtIG9mIGNvbGxhdGVyYWwgaW5cbiAqICAgdmF1bHRzIHNlbnQgZm9yIGxpcXVpZGF0aW9uXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IGxpcXVpZGF0aW5nRGVidCBwcmVzZW50IHN1bSBvZiBkZWJ0IGluIHZhdWx0cyBzZW50XG4gKiAgIGZvciBsaXF1aWRhdGlvblxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSB0b3RhbENvbGxhdGVyYWxTb2xkIHJ1bm5pbmcgc3VtIG9mIGNvbGxhdGVyYWwgc29sZFxuICogICBpbiBsaXF1aWRhdGlvblxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSB0b3RhbE92ZXJhZ2VSZWNlaXZlZCBydW5uaW5nIHN1bSBvZiBvdmVyYWdlcyxcbiAqICAgY2VudHJhbCByZWNlaXZlZCBncmVhdGVyIHRoYW4gZGVidFxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSB0b3RhbFByb2NlZWRzUmVjZWl2ZWQgcnVubmluZyBzdW0gb2YgbWludGVkXG4gKiAgIHJlY2VpdmVkIGZyb20gbGlxdWlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gdG90YWxTaG9ydGZhbGxSZWNlaXZlZCBydW5uaW5nIHN1bSBvZiBzaG9ydGZhbGxzLFxuICogICBtaW50ZWQgcmVjZWl2ZWQgbGVzcyB0aGFuIGRlYnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBudW1MaXF1aWRhdGlvbnNDb21wbGV0ZWQgcnVubmluZyBjb3VudCBvZiBsaXF1aWRhdGVkXG4gKiAgIHZhdWx0c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG51bUxpcXVpZGF0aW9uc0Fib3J0ZWQgcnVubmluZyBjb3VudCBvZiB2YXVsdCBsaXF1aWRhdGlvbnNcbiAqICAgdGhhdCB3ZXJlIHJldmVydGVkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqICAgY29tcG91bmRlZEludGVyZXN0OiBSYXRpbztcbiAqICAgaW50ZXJlc3RSYXRlOiBSYXRpbztcbiAqICAgbGF0ZXN0SW50ZXJlc3RVcGRhdGU6IFRpbWVzdGFtcDtcbiAqIH19IEFzc2V0U3RhdGVcbiAqXG4gKlxuICogQHR5cGVkZWYge3tcbiAqICAgZ2V0Q2hhcmdpbmdQZXJpb2Q6ICgpID0+IFJlbGF0aXZlVGltZTtcbiAqICAgZ2V0UmVjb3JkaW5nUGVyaW9kOiAoKSA9PiBSZWxhdGl2ZVRpbWU7XG4gKiAgIGdldERlYnRMaW1pdDogKCkgPT4gQW1vdW50PCduYXQnPjtcbiAqICAgZ2V0SW50ZXJlc3RSYXRlOiAoKSA9PiBSYXRpbztcbiAqICAgZ2V0TGlxdWlkYXRpb25QYWRkaW5nOiAoKSA9PiBSYXRpbztcbiAqICAgZ2V0TGlxdWlkYXRpb25NYXJnaW46ICgpID0+IFJhdGlvO1xuICogICBnZXRMaXF1aWRhdGlvblBlbmFsdHk6ICgpID0+IFJhdGlvO1xuICogICBnZXRNaW50RmVlOiAoKSA9PiBSYXRpbztcbiAqICAgZ2V0TWluSW5pdGlhbERlYnQ6ICgpID0+IEFtb3VudDwnbmF0Jz47XG4gKiB9fSBHb3Zlcm5lZFBhcmFtR2V0dGVyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlYWRvbmx5PHtcbiAqICAgZGVidE1pbnQ6IFpDRk1pbnQ8J25hdCc+O1xuICogICBjb2xsYXRlcmFsQnJhbmQ6IEJyYW5kPCduYXQnPjtcbiAqICAgY29sbGF0ZXJhbFVuaXQ6IEFtb3VudDwnbmF0Jz47XG4gKiAgIGRlc2NyaXB0aW9uU2NvcGU6IHN0cmluZztcbiAqICAgc3RhcnRUaW1lU3RhbXA6IFRpbWVzdGFtcDtcbiAqICAgc3RvcmFnZU5vZGU6IFJlbW90ZTxTdG9yYWdlTm9kZT47XG4gKiB9Pn0gSGVsZFBhcmFtc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqICAgYXNzZXRUb3BpY0tpdDogUmVjb3JkZXJLaXQ8QXNzZXRTdGF0ZT47XG4gKiAgIGRlYnRCcmFuZDogQnJhbmQ8J25hdCc+O1xuICogICBsaXF1aWRhdGluZ1ZhdWx0czogU2V0U3RvcmU8VmF1bHQ+O1xuICogICBtZXRyaWNzVG9waWNLaXQ6IFJlY29yZGVyS2l0PE1ldHJpY3NOb3RpZmljYXRpb24+O1xuICogICBwb29sSW5jcmVtZW50U2VhdDogWkNGU2VhdDtcbiAqICAgcmV0YWluZWRDb2xsYXRlcmFsU2VhdDogWkNGU2VhdDtcbiAqICAgdW5zZXR0bGVkVmF1bHRzOiBNYXBTdG9yZTxzdHJpbmcsIFZhdWx0PjtcbiAqIH19IEltbXV0YWJsZVN0YXRlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBjb21wb3VuZGVkSW50ZXJlc3Q6IFJhdGlvO1xuICogICBsYXRlc3RJbnRlcmVzdFVwZGF0ZTogVGltZXN0YW1wO1xuICogICBudW1MaXF1aWRhdGlvbnNDb21wbGV0ZWQ6IG51bWJlcjtcbiAqICAgbnVtTGlxdWlkYXRpb25zQWJvcnRlZDogbnVtYmVyO1xuICogICB0b3RhbENvbGxhdGVyYWw6IEFtb3VudDwnbmF0Jz47XG4gKiAgIHRvdGFsQ29sbGF0ZXJhbFNvbGQ6IEFtb3VudDwnbmF0Jz47XG4gKiAgIHRvdGFsRGVidDogQW1vdW50PCduYXQnPjtcbiAqICAgbGlxdWlkYXRpbmdDb2xsYXRlcmFsOiBBbW91bnQ8J25hdCc+O1xuICogICBsaXF1aWRhdGluZ0RlYnQ6IEFtb3VudDwnbmF0Jz47XG4gKiAgIHRvdGFsT3ZlcmFnZVJlY2VpdmVkOiBBbW91bnQ8J25hdCc+O1xuICogICB0b3RhbFByb2NlZWRzUmVjZWl2ZWQ6IEFtb3VudDwnbmF0Jz47XG4gKiAgIHRvdGFsU2hvcnRmYWxsUmVjZWl2ZWQ6IEFtb3VudDwnbmF0Jz47XG4gKiAgIHZhdWx0Q291bnRlcjogbnVtYmVyO1xuICogICBsb2NrZWRRdW90ZTogUHJpY2VRdW90ZSB8IHVuZGVmaW5lZDtcbiAqIH19IE11dGFibGVTdGF0ZVxuICovXG5cbi8qKlxuICogQHR5cGUgeyhicmFuZDogQnJhbmQpID0+IHtcbiAqICAgcHJpb3JpdGl6ZWRWYXVsdHM6IFJldHVyblR5cGU8dHlwZW9mIG1ha2VQcmlvcml0aXplZFZhdWx0cz47XG4gKiAgIHN0b3JlZFF1b3Rlc05vdGlmaWVyOiBTdG9yZWROb3RpZmllcjxQcmljZVF1b3RlPjtcbiAqICAgc3RvcmVkQ29sbGF0ZXJhbFF1b3RlOiBQcmljZVF1b3RlIHwgbnVsbDtcbiAqIH19XG4gKi9cbi8qIGFueSBiL2Mgd2lsbCBiZSBmaWxsZWQgYWZ0ZXIgc3RhcnQoKSovJGjNj19vbmNlLndhdGNoUXVvdGVOb3RpZmllcih3YXRjaFF1b3RlTm90aWZpZXIpO1xuY29uc3QgY29sbGF0ZXJhbEVwaGVtZXJhID0gbWFrZUVwaGVtZXJhUHJvdmlkZXIoKCkgPT4gLyoqIEB0eXBlIHthbnl9ICovICh7fSkpO1xuXG4vKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHt7XG4gKiAgIHpjZjogVmF1bHRGYWN0b3J5WkNGO1xuICogICBtYXJzaGFsbGVyOiBFUmVtb3RlPEVNYXJzaGFsbGVyPjtcbiAqICAgbWFrZVJlY29yZGVyS2l0OiBNYWtlUmVjb3JkZXJLaXQ7XG4gKiAgIG1ha2VFUmVjb3JkZXJLaXQ6IE1ha2VFUmVjb3JkZXJLaXQ7XG4gKiAgIGZhY3RvcnlQb3dlcnM6IEZhY3RvcnlQb3dlcnNGYWNldDtcbiAqIH19IHBvd2Vyc1xuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVZhdWx0TWFuYWdlcktpdCA9IChcbiAgYmFnZ2FnZSxcbiAgeyB6Y2YsIG1hcnNoYWxsZXIsIG1ha2VSZWNvcmRlcktpdCwgZmFjdG9yeVBvd2VycyB9LFxuKSA9PiB7XG4gIGNvbnN0IHsgcHJpY2VBdXRob3JpdHksIHRpbWVyU2VydmljZSwgcmVzZXJ2ZVB1YmxpY0ZhY2V0IH0gPSB6Y2YuZ2V0VGVybXMoKTtcbiAgY29uc3Qgd2F0Y2hlZEJyYW5kcyA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBtYWtlVmF1bHQgPSBwcmVwYXJlVmF1bHQoYmFnZ2FnZSwgbWFrZVJlY29yZGVyS2l0LCB6Y2YpO1xuXG4gIC8qKlxuICogQHBhcmFtIHtIZWxkUGFyYW1zICYgeyBtZXRyaWNzU3RvcmFnZU5vZGU6IFJlbW90ZTxTdG9yYWdlTm9kZT4gfX0gcGFyYW1zXG4gKiBAcmV0dXJucyB7SGVsZFBhcmFtcyAmIEltbXV0YWJsZVN0YXRlICYgTXV0YWJsZVN0YXRlfVxuICovXG4gIGNvbnN0IGluaXRTdGF0ZSA9IHBhcmFtcyA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZGVidE1pbnQsXG4gICAgICBjb2xsYXRlcmFsQnJhbmQsXG4gICAgICBtZXRyaWNzU3RvcmFnZU5vZGUsXG4gICAgICBzdGFydFRpbWVTdGFtcCxcbiAgICAgIHN0b3JhZ2VOb2RlLFxuICAgIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgZGVidEJyYW5kID0gZGVidE1pbnQuZ2V0SXNzdWVyUmVjb3JkKCkuYnJhbmQ7XG5cbiAgICAvKiogQHR5cGUge0ltbXV0YWJsZVN0YXRlfSAqL1xuICAgIGNvbnN0IGltbXV0YWJsZSA9IHtcbiAgICAgIGRlYnRCcmFuZCxcbiAgICAgIHBvb2xJbmNyZW1lbnRTZWF0OiB6Y2YubWFrZUVtcHR5U2VhdEtpdCgpLnpjZlNlYXQsXG5cbiAgICAgIC8qKlxuICogVmF1bHRzIHRoYXQgaGF2ZSBiZWVuIHNlbnQgZm9yIGxpcXVpZGF0aW9uLiBXaGVuIHdlIGdldCBwcm9jZWVkcyAob3JcbiAqIGxhY2sgdGhlcmVvZikgYmFjayBmcm9tIHRoZSBsaXF1aWRhdG9yLCB3ZSB3aWxsIGFsbG9jYXRlIHRoZW0gYW1vbmcgdGhlXG4gKiB2YXVsdHMuXG4gKlxuICogQHR5cGUge1NldFN0b3JlPFZhdWx0Pn1cbiAqL1xuICAgICAgbGlxdWlkYXRpbmdWYXVsdHM6IG1ha2VTY2FsYXJCaWdTZXRTdG9yZSgnbGlxdWlkYXRpbmdWYXVsdHMnLCB7XG4gICAgICAgIGR1cmFibGU6IHRydWUsXG4gICAgICB9KSxcblxuICAgICAgYXNzZXRUb3BpY0tpdDogbWFrZVJlY29yZGVyS2l0KHN0b3JhZ2VOb2RlKSxcblxuICAgICAgbWV0cmljc1RvcGljS2l0OiBtYWtlUmVjb3JkZXJLaXQobWV0cmljc1N0b3JhZ2VOb2RlKSxcblxuICAgICAgLyogVE9ETygjNzA3NCkgbm90IHVzZWQgd2hpbGUgbGlxdWlkYXRpb24gaXMgZGlzYWJsZWQuIFJlaW5zdGF0ZSB3aXRoICM3MDc0Ki9cbiAgICAgIHJldGFpbmVkQ29sbGF0ZXJhbFNlYXQ6IHpjZi5tYWtlRW1wdHlTZWF0S2l0KCkuemNmU2VhdCxcblxuICAgICAgdW5zZXR0bGVkVmF1bHRzOiBtYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ29yZGVyZWRWYXVsdFN0b3JlJywge1xuICAgICAgICBkdXJhYmxlOiB0cnVlLFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIGNvbnN0IHplcm9Db2xsYXRlcmFsID0gQW1vdW50TWF0aC5tYWtlRW1wdHkoY29sbGF0ZXJhbEJyYW5kLCAnbmF0Jyk7XG4gICAgY29uc3QgemVyb0RlYnQgPSBBbW91bnRNYXRoLm1ha2VFbXB0eShkZWJ0QnJhbmQsICduYXQnKTtcblxuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgLi4ucGFyYW1zLFxuICAgICAgLi4uaW1tdXRhYmxlLFxuICAgICAgY29tcG91bmRlZEludGVyZXN0OiBtYWtlUmF0aW8oMTAwbiwgZGVidEJyYW5kKSwgLyogc3RhcnRzIGF0IDEuMCwgbm8gaW50ZXJlc3QqL1xuICAgICAgbGF0ZXN0SW50ZXJlc3RVcGRhdGU6IHN0YXJ0VGltZVN0YW1wLFxuICAgICAgbnVtTGlxdWlkYXRpb25zQ29tcGxldGVkOiAwLFxuICAgICAgbnVtTGlxdWlkYXRpb25zQWJvcnRlZDogMCxcbiAgICAgIHRvdGFsQ29sbGF0ZXJhbDogemVyb0NvbGxhdGVyYWwsXG4gICAgICB0b3RhbENvbGxhdGVyYWxTb2xkOiB6ZXJvQ29sbGF0ZXJhbCxcbiAgICAgIHRvdGFsRGVidDogemVyb0RlYnQsXG4gICAgICBsaXF1aWRhdGluZ0NvbGxhdGVyYWw6IHplcm9Db2xsYXRlcmFsLFxuICAgICAgbGlxdWlkYXRpbmdEZWJ0OiB6ZXJvRGVidCxcbiAgICAgIHRvdGFsT3ZlcmFnZVJlY2VpdmVkOiB6ZXJvRGVidCxcbiAgICAgIHRvdGFsUHJvY2VlZHNSZWNlaXZlZDogemVyb0RlYnQsXG4gICAgICB0b3RhbFNob3J0ZmFsbFJlY2VpdmVkOiB6ZXJvRGVidCxcbiAgICAgIHZhdWx0Q291bnRlcjogMCxcbiAgICAgIGxvY2tlZFF1b3RlOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgbWFrZVZhdWx0TWFuYWdlcktpdEludGVybmFsID0gcHJlcGFyZUV4b0NsYXNzS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ1ZhdWx0TWFuYWdlcktpdCcsXG4gICAge1xuICAgICAgY29sbGF0ZXJhbDogTS5pbnRlcmZhY2UoJ2NvbGxhdGVyYWwnLCB7XG4gICAgICAgIG1ha2VWYXVsdEludml0YXRpb246IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgICAgICBnZXRQdWJsaWNUb3BpY3M6IE0uY2FsbCgpLnJldHVybnMoVG9waWNzUmVjb3JkU2hhcGUpLFxuICAgICAgICBnZXRRdW90ZXM6IE0uY2FsbCgpLnJldHVybnMoTm90aWZpZXJTaGFwZSksXG4gICAgICAgIGdldENvbXBvdW5kZWRJbnRlcmVzdDogTS5jYWxsKCkucmV0dXJucyhSYXRpb1NoYXBlKSxcbiAgICAgIH0pLFxuICAgICAgaGVscGVyOiBNLmludGVyZmFjZShcbiAgICAgICAgJ2hlbHBlcicsXG4gICAgICAgIC8qIG5vdCBleHBvc2VkIHNvIHVzaW5nIGBkZWZhdWx0R3VhcmRzYCBpcyBmaW5lLiovXG4gICAgICAgIHt9LFxuICAgICAgICB7IGRlZmF1bHRHdWFyZHM6ICdwYXNzYWJsZScgfSxcbiAgICAgICksXG4gICAgICBtYW5hZ2VyOiBNLmludGVyZmFjZSgnbWFuYWdlcicsIHtcbiAgICAgICAgZ2V0R292ZXJuZWRQYXJhbXM6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ2dvdmVybmVkUGFyYW1zJykpLFxuICAgICAgICBtYXhEZWJ0Rm9yOiBNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoQW1vdW50U2hhcGUpLFxuICAgICAgICBtaW50QW5kVHJhbnNmZXI6IE0uY2FsbChcbiAgICAgICAgICBTZWF0U2hhcGUsXG4gICAgICAgICAgQW1vdW50U2hhcGUsXG4gICAgICAgICAgQW1vdW50U2hhcGUsXG4gICAgICAgICAgTS5hcnJheU9mKFRyYW5zZmVyUGFydFNoYXBlKSxcbiAgICAgICAgKS5yZXR1cm5zKCksXG4gICAgICAgIGJ1cm46IE0uY2FsbChBbW91bnRTaGFwZSwgU2VhdFNoYXBlKS5yZXR1cm5zKCksXG4gICAgICAgIGdldEFzc2V0U3Vic2NyaWJlcjogTS5jYWxsKCkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuICAgICAgICBnZXRDb2xsYXRlcmFsQnJhbmQ6IE0uY2FsbCgpLnJldHVybnMoQnJhbmRTaGFwZSksXG4gICAgICAgIGdldERlYnRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhCcmFuZFNoYXBlKSxcbiAgICAgICAgZ2V0Q29tcG91bmRlZEludGVyZXN0OiBNLmNhbGwoKS5yZXR1cm5zKFJhdGlvU2hhcGUpLFxuICAgICAgICBzY29wZURlc2NyaXB0aW9uOiBNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgICAgICAgaGFuZGxlQmFsYW5jZUNoYW5nZTogTS5jYWxsKFxuICAgICAgICAgIEFtb3VudFNoYXBlLFxuICAgICAgICAgIEFtb3VudFNoYXBlLFxuICAgICAgICAgIE0uc3RyaW5nKCksXG4gICAgICAgICAgTS5zdHJpbmcoKSxcbiAgICAgICAgICBNLnJlbW90YWJsZSgndmF1bHQnKSxcbiAgICAgICAgKS5yZXR1cm5zKCksXG4gICAgICB9KSxcbiAgICAgIHNlbGY6IE0uaW50ZXJmYWNlKCdzZWxmJywge1xuICAgICAgICBnZXRHb3Zlcm5lZFBhcmFtczogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnZ292ZXJuZWRQYXJhbXMnKSksXG4gICAgICAgIG1ha2VWYXVsdEtpdDogTS5jYWxsKFNlYXRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICAgIGdldENvbGxhdGVyYWxRdW90ZTogTS5jYWxsKCkucmV0dXJucyhQcmljZVF1b3RlU2hhcGUpLFxuICAgICAgICBnZXRQdWJsaWNGYWNldDogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgncHVibGljRmFjZXQnKSksXG4gICAgICAgIGxvY2tPcmFjbGVQcmljZXM6IE0uY2FsbCgpLnJldHVybnMoUHJpY2VRdW90ZVNoYXBlKSxcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgaW5pdFN0YXRlLFxuICAgIHtcbiAgICAgIGNvbGxhdGVyYWw6IHtcbiAgICAgICAgbWFrZVZhdWx0SW52aXRhdGlvbigpIHtcbiAgICAgICAgICBjb25zdCB7IGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IGNvbGxhdGVyYWxCcmFuZCwgZGVidEJyYW5kIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIHJldHVybiB6Y2YubWFrZUludml0YXRpb24oXG4gICAgICAgICAgICBzZWF0ID0+IHRoaXMuZmFjZXRzLnNlbGYubWFrZVZhdWx0S2l0KHNlYXQpLFxuICAgICAgICAgICAgZmFjZXRzLm1hbmFnZXIuc2NvcGVEZXNjcmlwdGlvbignTWFrZVZhdWx0JyksXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICBNLnNwbGl0UmVjb3JkKHtcbiAgICAgICAgICAgICAgZ2l2ZToge1xuICAgICAgICAgICAgICAgIENvbGxhdGVyYWw6IG1ha2VOYXRBbW91bnRTaGFwZShjb2xsYXRlcmFsQnJhbmQpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB3YW50OiB7XG4gICAgICAgICAgICAgICAgTWludGVkOiBtYWtlTmF0QW1vdW50U2hhcGUoZGVidEJyYW5kKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFF1b3RlcygpIHtcbiAgICAgICAgICBjb25zdCBlcGhlbWVyYSA9IGNvbGxhdGVyYWxFcGhlbWVyYSh0aGlzLnN0YXRlLmNvbGxhdGVyYWxCcmFuZCk7XG4gICAgICAgICAgcmV0dXJuIGVwaGVtZXJhLnN0b3JlZFF1b3Rlc05vdGlmaWVyO1xuICAgICAgICB9LFxuICAgICAgICBnZXRDb21wb3VuZGVkSW50ZXJlc3QoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuY29tcG91bmRlZEludGVyZXN0O1xuICAgICAgICB9LFxuICAgICAgICBnZXRQdWJsaWNUb3BpY3MoKSB7XG4gICAgICAgICAgY29uc3QgeyBhc3NldFRvcGljS2l0LCBtZXRyaWNzVG9waWNLaXQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgICAgICBhc3NldDogbWFrZVJlY29yZGVyVG9waWMoXG4gICAgICAgICAgICAgICdTdGF0ZSBvZiB0aGUgYXNzZXRzIG1hbmFnZWQnLFxuICAgICAgICAgICAgICBhc3NldFRvcGljS2l0LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG1ldHJpY3M6IG1ha2VSZWNvcmRlclRvcGljKFxuICAgICAgICAgICAgICAnVmF1bHQgRmFjdG9yeSBtZXRyaWNzJyxcbiAgICAgICAgICAgICAgbWV0cmljc1RvcGljS2l0LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8qIFNvbWUgb2YgdGhlc2UgY291bGQgZ28gaW4gY2xvc3VyZXMgYnV0IGFyZSBrZXB0IG9uIGEgZmFjZXQgYW50aWNpcGF0aW5nIGZ1dHVyZSBkdXJhYmlsaXR5IG9wdGlvbnMuKi9cbiAgICAgIGhlbHBlcjoge1xuICAgICAgICAvKiogU3RhcnQgbm9uLWR1cmFibGUgcHJvY2Vzc2VzIChvciByZXN0YXJ0IGlmIG5lZWRlZCBhZnRlciB2YXQgcmVzdGFydCkgKi9cbiAgICAgICAgc3RhcnQoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuICAgICAgICAgIHRyYWNlKHN0YXRlLmNvbGxhdGVyYWxCcmFuZCwgJ2hlbHBlci5zdGFydCgpJywgc3RhdGUudmF1bHRDb3VudGVyKTtcbiAgICAgICAgICBjb25zdCB7IGNvbGxhdGVyYWxCcmFuZCwgdW5zZXR0bGVkVmF1bHRzIH0gPSBzdGF0ZTtcblxuICAgICAgICAgIGNvbnN0IGVwaGVtZXJhID0gY29sbGF0ZXJhbEVwaGVtZXJhKGNvbGxhdGVyYWxCcmFuZCk7XG4gICAgICAgICAgZXBoZW1lcmEucHJpb3JpdGl6ZWRWYXVsdHMgPSBtYWtlUHJpb3JpdGl6ZWRWYXVsdHModW5zZXR0bGVkVmF1bHRzKTtcblxuICAgICAgICAgIHRyYWNlKCdoZWxwZXIuc3RhcnQoKSBtYWtpbmcgcGVyaW9kTm90aWZpZXInKTtcbiAgICAgICAgICBjb25zdCBwZXJpb2ROb3RpZmllciA9IEUodGltZXJTZXJ2aWNlKS5tYWtlTm90aWZpZXIoXG4gICAgICAgICAgICAwbixcbiAgICAgICAgICAgIGZhY3RvcnlQb3dlcnNcbiAgICAgICAgICAgICAgLmdldEdvdmVybmVkUGFyYW1zKGNvbGxhdGVyYWxCcmFuZClcbiAgICAgICAgICAgICAgLmdldENoYXJnaW5nUGVyaW9kKCksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHRyYWNlKCdoZWxwZXIuc3RhcnQoKSBzdGFydGluZyBvYnNlcnZlIHBlcmlvZE5vdGlmaWVyJyk7XG4gICAgICAgICAgdm9pZCBvYnNlcnZlTm90aWZpZXIocGVyaW9kTm90aWZpZXIsIHtcbiAgICAgICAgICAgIHVwZGF0ZVN0YXRlOiB1cGRhdGVUaW1lID0+XG4gICAgICAgICAgICAgIGZhY2V0cy5oZWxwZXJcbiAgICAgICAgICAgICAgICAuY2hhcmdlQWxsVmF1bHRzKHVwZGF0ZVRpbWUpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGUgPT5cbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ/CfmqggdmF1bHRNYW5hZ2VyIGZhaWxlZCB0byBjaGFyZ2UgaW50ZXJlc3QnLCBlKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgZmFpbDogcmVhc29uID0+IHtcbiAgICAgICAgICAgICAgemNmLnNodXRkb3duV2l0aEZhaWx1cmUoXG4gICAgICAgICAgICAgICAgbWFrZUVycm9yKFhgVW5hYmxlIHRvIGNvbnRpbnVlIHdpdGhvdXQgYSB0aW1lcjogJHtyZWFzb259YCksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmluaXNoOiBkb25lID0+IHtcbiAgICAgICAgICAgICAgemNmLnNodXRkb3duV2l0aEZhaWx1cmUoXG4gICAgICAgICAgICAgICAgbWFrZUVycm9yKFhgVW5hYmxlIHRvIGNvbnRpbnVlIHdpdGhvdXQgYSB0aW1lcjogJHtkb25lfWApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHZvaWQgZmFjZXRzLmhlbHBlci5lbnN1cmVRdW90ZU5vdGlmaWVyV2F0Y2hlZCgpO1xuXG4gICAgICAgICAgdHJhY2UoJ2hlbHBlci5zdGFydCgpIGRvbmUnKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW5zdXJlUXVvdGVOb3RpZmllcldhdGNoZWQoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcblxuICAgICAgICAgIGNvbnN0IHsgY29sbGF0ZXJhbEJyYW5kLCBjb2xsYXRlcmFsVW5pdCwgZGVidEJyYW5kLCBzdG9yYWdlTm9kZSB9ID1cbiAgICAgICAgICAgIHN0YXRlO1xuICAgICAgICAgIGlmICh3YXRjaGVkQnJhbmRzLmhhcyhjb2xsYXRlcmFsQnJhbmQpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHdhdGNoZWRCcmFuZHMuYWRkKGNvbGxhdGVyYWxCcmFuZCk7XG5cbiAgICAgICAgICBjb25zdCBlcGhlbWVyYSA9IGNvbGxhdGVyYWxFcGhlbWVyYShjb2xsYXRlcmFsQnJhbmQpO1xuXG4gICAgICAgICAgY29uc3QgcXVvdGVOb3RpZmllclAgPSBFKHByaWNlQXV0aG9yaXR5KS5tYWtlUXVvdGVOb3RpZmllcihcbiAgICAgICAgICAgIGNvbGxhdGVyYWxVbml0LFxuICAgICAgICAgICAgZGVidEJyYW5kLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB2b2lkIEUud2hlbihcbiAgICAgICAgICAgIHF1b3RlTm90aWZpZXJQLFxuICAgICAgICAgICAgcXVvdGVOb3RpZmllciA9PiB7XG4gICAgICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIHF1b3RlcyovXG4gICAgICAgICAgICAgIGVwaGVtZXJhLnN0b3JlZFF1b3Rlc05vdGlmaWVyID0gbWFrZVN0b3JlZE5vdGlmaWVyKFxuICAgICAgICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIHF1b3RlcyovXG4gICAgICAgICAgICAgICAgcXVvdGVOb3RpZmllcixcbiAgICAgICAgICAgICAgICBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKCdxdW90ZXMnKSxcbiAgICAgICAgICAgICAgICBtYXJzaGFsbGVyLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB0cmFjZShcbiAgICAgICAgICAgICAgICAnaGVscGVyLnN0YXJ0KCkgYXdhaXRpbmcgb2JzZXJ2ZSBzdG9yZWRRdW90ZXNOb3RpZmllcicsXG4gICAgICAgICAgICAgICAgY29sbGF0ZXJhbEJyYW5kLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvKiBOQjogdXBvbiByZXN0YXJ0LCB0aGVyZSBtYXkgbm90IGJlIGEgcHJpY2UgZm9yIGEgd2hpbGUuIElmIG1hbmFnZXIqL1xuICAgICAgICAgICAgICAvKiBvcGVyYXRpb25zIGFyZSBwZXJtaXR0ZWQsIG9uZXMgdGhhdCBkZXBlbmQgb24gcHJpY2UgaW5mb3JtYXRpb24qL1xuICAgICAgICAgICAgICAvKiB3aWxsIHRocm93LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzE3Ki9cbiAgICAgICAgICAgICAgY29uc3QgcXVvdGVXYXRjaGVyID0gaGFyZGVuKHtcbiAgICAgICAgICAgICAgICBvbkZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgdHJhY2UoJ3dhdGNoZXIgdXBkYXRlZCBwcmljZScsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgIGVwaGVtZXJhLnN0b3JlZENvbGxhdGVyYWxRdW90ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25SZWplY3RlZCgpIHtcbiAgICAgICAgICAgICAgICAgIC8qIE5PVEU6IGRyYXN0aWMgYWN0aW9uLCBpZiB0aGUgcXVvdGVOb3RpZmllciBmYWlscywgd2UgZG9uJ3Qga25vdyovXG4gICAgICAgICAgICAgICAgICAvKiB0aGUgdmFsdWUgb2YgdGhlIGFzc2V0LCBub3IgZG8gd2Uga25vdyBob3cgbG9uZyB3ZSdsbCBiZSBpbiovXG4gICAgICAgICAgICAgICAgICAvKiBpZ25vcmFuY2UuIEJlc3QgY2hvaWNlIGlzIHRvIGRpc2FibGUgYWN0aW9ucyB0aGF0IHJlcXVpcmUqL1xuICAgICAgICAgICAgICAgICAgLyogcHJpY2VzIGFuZCByZXN0YXJ0IHdoZW4gd2UgaGF2ZSBhIG5ldyBwcmljZS4gSWYgd2UgcmVzdGFydCB0aGUqL1xuICAgICAgICAgICAgICAgICAgLyogbm90aWZpZXIgaW1tZWRpYXRlbHksIHdlJ2xsIHRyaWdnZXIgYW4gaW5maW5pdGUgbG9vcCwgc28gdHJ5Ki9cbiAgICAgICAgICAgICAgICAgIC8qIHRvIHJlc3RhcnQgZWFjaCB0aW1lIHdlIGdldCBhIHJlcXVlc3QuKi9cblxuICAgICAgICAgICAgICAgICAgZXBoZW1lcmEuc3RvcmVkQ29sbGF0ZXJhbFF1b3RlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIHdhdGNoZWRCcmFuZHMuZGVsZXRlKGNvbGxhdGVyYWxCcmFuZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHZvaWQgd2F0Y2hRdW90ZU5vdGlmaWVyKHF1b3RlTm90aWZpZXIsIHF1b3RlV2F0Y2hlcik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZSA9PiB7XG4gICAgICAgICAgICAgIHRyYWNlKCdtYWtlUXVvdGVOb3RpZmllciBmYWlsZWQsIHJlc2V0dGluZycsIGUpO1xuICAgICAgICAgICAgICBlcGhlbWVyYS5zdG9yZWRDb2xsYXRlcmFsUXVvdGUgPSBudWxsO1xuICAgICAgICAgICAgICB3YXRjaGVkQnJhbmRzLmRlbGV0ZShjb2xsYXRlcmFsQnJhbmQpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQHBhcmFtIHtUaW1lc3RhbXB9IHVwZGF0ZVRpbWUgKi9cbiAgICAgICAgYXN5bmMgY2hhcmdlQWxsVmF1bHRzKHVwZGF0ZVRpbWUpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBjb2xsYXRlcmFsQnJhbmQsIGRlYnRNaW50LCBwb29sSW5jcmVtZW50U2VhdCB9ID0gc3RhdGU7XG4gICAgICAgICAgdHJhY2UoY29sbGF0ZXJhbEJyYW5kLCAnY2hhcmdlQWxsVmF1bHRzJywge1xuICAgICAgICAgICAgdXBkYXRlVGltZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGludGVyZXN0UmF0ZSA9IGZhY3RvcnlQb3dlcnNcbiAgICAgICAgICAgIC5nZXRHb3Zlcm5lZFBhcmFtcyhjb2xsYXRlcmFsQnJhbmQpXG4gICAgICAgICAgICAuZ2V0SW50ZXJlc3RSYXRlKCk7XG5cbiAgICAgICAgICAvKiBVcGRhdGUgc3RhdGUgd2l0aCB0aGUgcmVzdWx0cyBvZiBjaGFyZ2luZyBpbnRlcmVzdCovXG5cbiAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gY2hhcmdlSW50ZXJlc3QoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG1pbnQ6IGRlYnRNaW50LFxuICAgICAgICAgICAgICBtaW50QW5kVHJhbnNmZXJXaXRoRmVlOiBmYWN0b3J5UG93ZXJzLm1pbnRBbmRUcmFuc2ZlcixcbiAgICAgICAgICAgICAgcG9vbEluY3JlbWVudFNlYXQsXG4gICAgICAgICAgICAgIHNlYXRBbGxvY2F0aW9uS2V5d29yZDogJ01pbnRlZCcsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBpbnRlcmVzdFJhdGUsXG4gICAgICAgICAgICAgIGNoYXJnaW5nUGVyaW9kOiBmYWN0b3J5UG93ZXJzXG4gICAgICAgICAgICAgICAgLmdldEdvdmVybmVkUGFyYW1zKGNvbGxhdGVyYWxCcmFuZClcbiAgICAgICAgICAgICAgICAuZ2V0Q2hhcmdpbmdQZXJpb2QoKSxcbiAgICAgICAgICAgICAgcmVjb3JkaW5nUGVyaW9kOiBmYWN0b3J5UG93ZXJzXG4gICAgICAgICAgICAgICAgLmdldEdvdmVybmVkUGFyYW1zKGNvbGxhdGVyYWxCcmFuZClcbiAgICAgICAgICAgICAgICAuZ2V0UmVjb3JkaW5nUGVyaW9kKCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBsYXRlc3RJbnRlcmVzdFVwZGF0ZTogc3RhdGUubGF0ZXN0SW50ZXJlc3RVcGRhdGUsXG4gICAgICAgICAgICAgIGNvbXBvdW5kZWRJbnRlcmVzdDogc3RhdGUuY29tcG91bmRlZEludGVyZXN0LFxuICAgICAgICAgICAgICB0b3RhbERlYnQ6IHN0YXRlLnRvdGFsRGVidCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB1cGRhdGVUaW1lLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzdGF0ZS5jb21wb3VuZGVkSW50ZXJlc3QgPSBjaGFuZ2VzLmNvbXBvdW5kZWRJbnRlcmVzdDtcbiAgICAgICAgICBzdGF0ZS5sYXRlc3RJbnRlcmVzdFVwZGF0ZSA9IGNoYW5nZXMubGF0ZXN0SW50ZXJlc3RVcGRhdGU7XG4gICAgICAgICAgc3RhdGUudG90YWxEZWJ0ID0gY2hhbmdlcy50b3RhbERlYnQ7XG5cbiAgICAgICAgICByZXR1cm4gZmFjZXRzLmhlbHBlci5hc3NldE5vdGlmeSgpO1xuICAgICAgICB9LFxuICAgICAgICBhc3NldE5vdGlmeSgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgY29sbGF0ZXJhbEJyYW5kLCBhc3NldFRvcGljS2l0IH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCBpbnRlcmVzdFJhdGUgPSBmYWN0b3J5UG93ZXJzXG4gICAgICAgICAgICAuZ2V0R292ZXJuZWRQYXJhbXMoY29sbGF0ZXJhbEJyYW5kKVxuICAgICAgICAgICAgLmdldEludGVyZXN0UmF0ZSgpO1xuICAgICAgICAgIC8qKiBAdHlwZSB7QXNzZXRTdGF0ZX0gKi9cbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gaGFyZGVuKHtcbiAgICAgICAgICAgIGNvbXBvdW5kZWRJbnRlcmVzdDogc3RhdGUuY29tcG91bmRlZEludGVyZXN0LFxuICAgICAgICAgICAgaW50ZXJlc3RSYXRlLFxuICAgICAgICAgICAgbGF0ZXN0SW50ZXJlc3RVcGRhdGU6IHN0YXRlLmxhdGVzdEludGVyZXN0VXBkYXRlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBhc3NldFRvcGljS2l0LnJlY29yZGVyLndyaXRlKHBheWxvYWQpO1xuICAgICAgICB9LFxuICAgICAgICBidXJuVG9Db3ZlckRlYnQoZGVidCwgcHJvY2VlZHMsIHNlYXQpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuXG4gICAgICAgICAgaWYgKEFtb3VudE1hdGguaXNHVEUocHJvY2VlZHMsIGRlYnQpKSB7XG4gICAgICAgICAgICBmYWN0b3J5UG93ZXJzLmJ1cm5EZWJ0KGRlYnQsIHNlYXQpO1xuICAgICAgICAgICAgc3RhdGUudG90YWxEZWJ0ID0gQW1vdW50TWF0aC5zdWJ0cmFjdChzdGF0ZS50b3RhbERlYnQsIGRlYnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmYWN0b3J5UG93ZXJzLmJ1cm5EZWJ0KHByb2NlZWRzLCBzZWF0KTtcbiAgICAgICAgICAgIHN0YXRlLnRvdGFsRGVidCA9IEFtb3VudE1hdGguc3VidHJhY3Qoc3RhdGUudG90YWxEZWJ0LCBwcm9jZWVkcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgc3RhdGUudG90YWxQcm9jZWVkc1JlY2VpdmVkID0gQW1vdW50TWF0aC5hZGQoXG4gICAgICAgICAgICBzdGF0ZS50b3RhbFByb2NlZWRzUmVjZWl2ZWQsXG4gICAgICAgICAgICBwcm9jZWVkcyxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBzZW5kVG9SZXNlcnZlKHBlbmFsdHksIHNlYXQsIHNlYXRLZXl3b3JkID0gJ0NvbGxhdGVyYWwnKSB7XG4gICAgICAgICAgY29uc3QgaW52aXRhdGlvbiA9XG4gICAgICAgICAgICBFKHJlc2VydmVQdWJsaWNGYWNldCkubWFrZUFkZENvbGxhdGVyYWxJbnZpdGF0aW9uKCk7XG4gICAgICAgICAgdHJhY2UoJ1NlbmRpbmcgdG8gcmVzZXJ2ZTogJywgcGVuYWx0eSk7XG5cbiAgICAgICAgICAvKiBkb24ndCB3YWl0IGZvciByZXNwb25zZSovXG4gICAgICAgICAgdm9pZCBFLndoZW4oaW52aXRhdGlvbiwgaW52aXRlID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHByb3Bvc2FsID0geyBnaXZlOiB7IENvbGxhdGVyYWw6IHBlbmFsdHkgfSB9O1xuICAgICAgICAgICAgcmV0dXJuIG9mZmVyVG8oXG4gICAgICAgICAgICAgIHpjZixcbiAgICAgICAgICAgICAgaW52aXRlLFxuICAgICAgICAgICAgICB7IFtzZWF0S2V5d29yZF06ICdDb2xsYXRlcmFsJyB9LFxuICAgICAgICAgICAgICBwcm9wb3NhbCxcbiAgICAgICAgICAgICAgc2VhdCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3NlbmRUb1Jlc2VydmUgZmFpbGVkJywgcmVhc29uKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbWFya0xpcXVpZGF0aW5nKGRlYnQsIGNvbGxhdGVyYWwpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuXG4gICAgICAgICAgc3RhdGUubGlxdWlkYXRpbmdDb2xsYXRlcmFsID0gQW1vdW50TWF0aC5hZGQoXG4gICAgICAgICAgICBzdGF0ZS5saXF1aWRhdGluZ0NvbGxhdGVyYWwsXG4gICAgICAgICAgICBjb2xsYXRlcmFsLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBzdGF0ZS5saXF1aWRhdGluZ0RlYnQgPSBBbW91bnRNYXRoLmFkZChzdGF0ZS5saXF1aWRhdGluZ0RlYnQsIGRlYnQpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gZGVidFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBjb2xsYXRlcmFsXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IG92ZXJhZ2VcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gc2hvcnRmYWxsXG4gKi9cbiAgICAgICAgbWFya0RvbmVMaXF1aWRhdGluZyhkZWJ0LCBjb2xsYXRlcmFsLCBvdmVyYWdlLCBzaG9ydGZhbGwpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuXG4gICAgICAgICAgLyogdXBkYXRlIGxpcXVpZGF0aW9uIHN0YXRlKi9cblxuICAgICAgICAgIHN0YXRlLmxpcXVpZGF0aW5nQ29sbGF0ZXJhbCA9IEFtb3VudE1hdGguc3VidHJhY3QoXG4gICAgICAgICAgICBzdGF0ZS5saXF1aWRhdGluZ0NvbGxhdGVyYWwsXG4gICAgICAgICAgICBjb2xsYXRlcmFsLFxuICAgICAgICAgICk7XG4gICAgICAgICAgc3RhdGUubGlxdWlkYXRpbmdEZWJ0ID0gQW1vdW50TWF0aC5zdWJ0cmFjdChcbiAgICAgICAgICAgIHN0YXRlLmxpcXVpZGF0aW5nRGVidCxcbiAgICAgICAgICAgIGRlYnQsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIC8qIHJlY29yZCBzaG9ydGZhbGwgYW5kIHByb2NlZWRzKi9cblxuICAgICAgICAgIC8qIGN1bXVsYXRpdmUgdmFsdWVzKi9cbiAgICAgICAgICBzdGF0ZS50b3RhbE92ZXJhZ2VSZWNlaXZlZCA9IEFtb3VudE1hdGguYWRkKFxuICAgICAgICAgICAgc3RhdGUudG90YWxPdmVyYWdlUmVjZWl2ZWQsXG4gICAgICAgICAgICBvdmVyYWdlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgc3RhdGUudG90YWxTaG9ydGZhbGxSZWNlaXZlZCA9IEFtb3VudE1hdGguYWRkKFxuICAgICAgICAgICAgc3RhdGUudG90YWxTaG9ydGZhbGxSZWNlaXZlZCxcbiAgICAgICAgICAgIHNob3J0ZmFsbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHN0YXRlLnRvdGFsRGVidCA9IEFtb3VudE1hdGguc3VidHJhY3Qoc3RhdGUudG90YWxEZWJ0LCBzaG9ydGZhbGwpO1xuXG4gICAgICAgICAgRS53aGVuKFxuICAgICAgICAgICAgZmFjdG9yeVBvd2Vycy5nZXRTaG9ydGZhbGxSZXBvcnRlcigpLFxuICAgICAgICAgICAgcmVwb3J0ZXIgPT4gRShyZXBvcnRlcikuaW5jcmVhc2VMaXF1aWRhdGlvblNob3J0ZmFsbChzaG9ydGZhbGwpLFxuICAgICAgICAgICAgZXJyID0+XG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ/Cfm6DvuI8gZ2V0U2hvcnRmYWxsUmVwb3J0ZXIoKSBmYWlsZWQgZHVyaW5nIGxpcXVpZGF0aW9uOyByZXBhaXIgYnkgdXBkYXRpbmcgZ292ZXJuYW5jZScsXG4gICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ/CfmqggZmFpbGVkIHRvIHJlcG9ydCBsaXF1aWRhdGlvbiBzaG9ydGZhbGwnLCBlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICB3cml0ZU1ldHJpY3MoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IGNvbGxhdGVyYWxCcmFuZCwgcmV0YWluZWRDb2xsYXRlcmFsU2VhdCwgbWV0cmljc1RvcGljS2l0IH0gPVxuICAgICAgICAgICAgc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyBwcmlvcml0aXplZFZhdWx0cyB9ID0gY29sbGF0ZXJhbEVwaGVtZXJhKGNvbGxhdGVyYWxCcmFuZCk7XG5cbiAgICAgICAgICBjb25zdCByZXRhaW5lZENvbGxhdGVyYWwgPVxuICAgICAgICAgICAgcmV0YWluZWRDb2xsYXRlcmFsU2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpPy5Db2xsYXRlcmFsID8/XG4gICAgICAgICAgICBBbW91bnRNYXRoLm1ha2VFbXB0eShjb2xsYXRlcmFsQnJhbmQsICduYXQnKTtcblxuICAgICAgICAgIGNvbnN0IHF1b3RlID0gc3RhdGUubG9ja2VkUXVvdGU7XG4gICAgICAgICAgY29uc3QgbG9ja2VkUXVvdGVSYXRpbyA9IHF1b3RlXG4gICAgICAgICAgICA/IHF1b3RlQXNSYXRpbyhxdW90ZS5xdW90ZUFtb3VudC52YWx1ZVswXSlcbiAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICAgIC8qKiBAdHlwZSB7TWV0cmljc05vdGlmaWNhdGlvbn0gKi9cbiAgICAgICAgICBjb25zdCBwYXlsb2FkID0gaGFyZGVuKHtcbiAgICAgICAgICAgIG51bUFjdGl2ZVZhdWx0czogcHJpb3JpdGl6ZWRWYXVsdHMuZ2V0Q291bnQoKSxcbiAgICAgICAgICAgIG51bUxpcXVpZGF0aW5nVmF1bHRzOiBzdGF0ZS5saXF1aWRhdGluZ1ZhdWx0cy5nZXRTaXplKCksXG4gICAgICAgICAgICB0b3RhbENvbGxhdGVyYWw6IHN0YXRlLnRvdGFsQ29sbGF0ZXJhbCxcbiAgICAgICAgICAgIHRvdGFsRGVidDogc3RhdGUudG90YWxEZWJ0LFxuICAgICAgICAgICAgcmV0YWluZWRDb2xsYXRlcmFsLFxuXG4gICAgICAgICAgICBudW1MaXF1aWRhdGlvbnNDb21wbGV0ZWQ6IHN0YXRlLm51bUxpcXVpZGF0aW9uc0NvbXBsZXRlZCxcbiAgICAgICAgICAgIG51bUxpcXVpZGF0aW9uc0Fib3J0ZWQ6IHN0YXRlLm51bUxpcXVpZGF0aW9uc0Fib3J0ZWQsXG4gICAgICAgICAgICB0b3RhbENvbGxhdGVyYWxTb2xkOiBzdGF0ZS50b3RhbENvbGxhdGVyYWxTb2xkLFxuICAgICAgICAgICAgbGlxdWlkYXRpbmdDb2xsYXRlcmFsOiBzdGF0ZS5saXF1aWRhdGluZ0NvbGxhdGVyYWwsXG4gICAgICAgICAgICBsaXF1aWRhdGluZ0RlYnQ6IHN0YXRlLmxpcXVpZGF0aW5nRGVidCxcbiAgICAgICAgICAgIHRvdGFsT3ZlcmFnZVJlY2VpdmVkOiBzdGF0ZS50b3RhbE92ZXJhZ2VSZWNlaXZlZCxcbiAgICAgICAgICAgIHRvdGFsUHJvY2VlZHNSZWNlaXZlZDogc3RhdGUudG90YWxQcm9jZWVkc1JlY2VpdmVkLFxuICAgICAgICAgICAgdG90YWxTaG9ydGZhbGxSZWNlaXZlZDogc3RhdGUudG90YWxTaG9ydGZhbGxSZWNlaXZlZCxcbiAgICAgICAgICAgIGxvY2tlZFF1b3RlOiBsb2NrZWRRdW90ZVJhdGlvLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIEUobWV0cmljc1RvcGljS2l0LnJlY29yZGVyKS53cml0ZShwYXlsb2FkKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIG1hbmFnZXI6IHtcbiAgICAgICAgZ2V0R292ZXJuZWRQYXJhbXMoKSB7XG4gICAgICAgICAgY29uc3QgeyBjb2xsYXRlcmFsQnJhbmQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgcmV0dXJuIGZhY3RvcnlQb3dlcnMuZ2V0R292ZXJuZWRQYXJhbXMoY29sbGF0ZXJhbEJyYW5kKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAqIExvb2sgdXAgdGhlIG1vc3QgcmVjZW50IHByaWNlIGF1dGhvcml0eSBwcmljZSB0byBkZXRlcm1pbmUgdGhlIG1heFxuICogZGVidCB0aGlzIG1hbmFnZXIgY29uZmlnIHdpbGwgYWxsb3cgZm9yIHRoZSBjb2xsYXRlcmFsLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gY29sbGF0ZXJhbEFtb3VudFxuICovXG4gICAgICAgIG1heERlYnRGb3IoY29sbGF0ZXJhbEFtb3VudCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IGNvbGxhdGVyYWxCcmFuZCB9ID0gc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyBzdG9yZWRDb2xsYXRlcmFsUXVvdGUgfSA9IGNvbGxhdGVyYWxFcGhlbWVyYShjb2xsYXRlcmFsQnJhbmQpO1xuICAgICAgICAgIGlmICghc3RvcmVkQ29sbGF0ZXJhbFF1b3RlKSB7XG4gICAgICAgICAgICBmYWNldHMuaGVscGVyLmVuc3VyZVF1b3RlTm90aWZpZXJXYXRjaGVkKCk7XG5cbiAgICAgICAgICAgIC8qIGl0IG1pZ2h0IHRha2UgYW4gYXJiaXRyYXJ5IGFtb3VudCBvZiB0aW1lIHRvIGdldCBhIG5ldyBxdW90ZSovXG4gICAgICAgICAgICB0aHJvdyBGYWlsYG1heERlYnRGb3IgY2FsbGVkIGJlZm9yZSBhIGNvbGxhdGVyYWwgcXVvdGUgd2FzIGF2YWlsYWJsZSBmb3IgJHtjb2xsYXRlcmFsQnJhbmR9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogdXNlIHRoZSBsb3dlciBwcmljZSB0byBwcmV2ZW50IHZhdWx0IGFkanVzdG1lbnRzIHRoYXQgcHV0IHRoZW0gaW1taW5lbnRseSB1bmRlcndhdGVyKi9cbiAgICAgICAgICBjb25zdCBjb2xsYXRlcmFsUHJpY2UgPSBtaW5pbXVtUHJpY2UoXG4gICAgICAgICAgICBzdG9yZWRDb2xsYXRlcmFsUXVvdGUsXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmxvY2tlZFF1b3RlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgY29sbGF0bFZhbCA9IGNlaWxNdWx0aXBseUJ5KGNvbGxhdGVyYWxBbW91bnQsIGNvbGxhdGVyYWxQcmljZSk7XG4gICAgICAgICAgY29uc3QgbWluaW11bUNvbGxhdGVyYWxpemF0aW9uID0gY2FsY3VsYXRlTWluaW11bUNvbGxhdGVyYWxpemF0aW9uKFxuICAgICAgICAgICAgZmFjdG9yeVBvd2Vyc1xuICAgICAgICAgICAgICAuZ2V0R292ZXJuZWRQYXJhbXMoY29sbGF0ZXJhbEJyYW5kKVxuICAgICAgICAgICAgICAuZ2V0TGlxdWlkYXRpb25NYXJnaW4oKSxcbiAgICAgICAgICAgIGZhY3RvcnlQb3dlcnNcbiAgICAgICAgICAgICAgLmdldEdvdmVybmVkUGFyYW1zKGNvbGxhdGVyYWxCcmFuZClcbiAgICAgICAgICAgICAgLmdldExpcXVpZGF0aW9uUGFkZGluZygpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLyogZmxvb3JEaXZpZGUgYmVjYXVzZSB3ZSB3YW50IHRoZSBkZWJ0IGNlaWxpbmcgbG93ZXIqL1xuICAgICAgICAgIHJldHVybiBmbG9vckRpdmlkZUJ5KGNvbGxhdGxWYWwsIG1pbmltdW1Db2xsYXRlcmFsaXphdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKiBAdHlwZSB7TWludEFuZFRyYW5zZmVyfSAqL1xuICAgICAgICBtaW50QW5kVHJhbnNmZXIobWludFJlY2VpdmVyLCB0b01pbnQsIGZlZSwgdHJhbnNmZXJzKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IGNvbGxhdGVyYWxCcmFuZCwgdG90YWxEZWJ0IH0gPSBzdGF0ZTtcblxuICAgICAgICAgIGNoZWNrRGVidExpbWl0KFxuICAgICAgICAgICAgZmFjdG9yeVBvd2Vycy5nZXRHb3Zlcm5lZFBhcmFtcyhjb2xsYXRlcmFsQnJhbmQpLmdldERlYnRMaW1pdCgpLFxuICAgICAgICAgICAgdG90YWxEZWJ0LFxuICAgICAgICAgICAgdG9NaW50LFxuICAgICAgICAgICk7XG4gICAgICAgICAgZmFjdG9yeVBvd2Vycy5taW50QW5kVHJhbnNmZXIobWludFJlY2VpdmVyLCB0b01pbnQsIGZlZSwgdHJhbnNmZXJzKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHRvQnVyblxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKi9cbiAgICAgICAgYnVybih0b0J1cm4sIHNlYXQpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgY29sbGF0ZXJhbEJyYW5kIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgICAgdHJhY2UoY29sbGF0ZXJhbEJyYW5kLCAnYnVybicsIHtcbiAgICAgICAgICAgIHRvQnVybixcbiAgICAgICAgICAgIHRvdGFsRGVidDogc3RhdGUudG90YWxEZWJ0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZhY3RvcnlQb3dlcnMuYnVybkRlYnQodG9CdXJuLCBzZWF0KTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0QXNzZXRTdWJzY3JpYmVyKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmFzc2V0VG9waWNLaXQuc3Vic2NyaWJlcjtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q29sbGF0ZXJhbEJyYW5kKCkge1xuICAgICAgICAgIGNvbnN0IHsgY29sbGF0ZXJhbEJyYW5kIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIHJldHVybiBjb2xsYXRlcmFsQnJhbmQ7XG4gICAgICAgIH0sXG4gICAgICAgIGdldERlYnRCcmFuZCgpIHtcbiAgICAgICAgICBjb25zdCB7IGRlYnRCcmFuZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICByZXR1cm4gZGVidEJyYW5kO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAqIFByZXBlbmQgd2l0aCBhbiBpZGVudGlmaWVyIG9mIHRoaXMgdmF1bHQgbWFuYWdlclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlXG4gKi9cbiAgICAgICAgc2NvcGVEZXNjcmlwdGlvbihiYXNlKSB7XG4gICAgICAgICAgY29uc3QgeyBkZXNjcmlwdGlvblNjb3BlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIHJldHVybiBgJHtkZXNjcmlwdGlvblNjb3BlfTogJHtiYXNlfWA7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKiBjb2VmZmljaWVudCBvbiBleGlzdGluZyBkZWJ0IHRvIGNhbGN1bGF0ZSBuZXcgZGVidCAqL1xuICAgICAgICBnZXRDb21wb3VuZGVkSW50ZXJlc3QoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUuY29tcG91bmRlZEludGVyZXN0O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAqIENhbGxlZCBieSBhIHZhdWx0IHdoZW4gaXRzIGJhbGFuY2VzIGNoYW5nZS5cbiAqXG4gKiBAcGFyYW0ge05vcm1hbGl6ZWREZWJ0fSBvbGREZWJ0Tm9ybWFsaXplZFxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBvbGRDb2xsYXRlcmFsXG4gKiBAcGFyYW0ge1ZhdWx0SWR9IHZhdWx0SWRcbiAqIEBwYXJhbSB7VmF1bHRQaGFzZX0gdmF1bHRQaGFzZSBhdCB0aGUgZW5kIG9mIHdoYXRldmVyIGNoYW5nZSB1cGRhdGVkXG4gKiAgIGJhbGFuY2VzXG4gKiBAcGFyYW0ge1ZhdWx0fSB2YXVsdFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgICAgICAgaGFuZGxlQmFsYW5jZUNoYW5nZShcbiAgICAgICAgICBvbGREZWJ0Tm9ybWFsaXplZCxcbiAgICAgICAgICBvbGRDb2xsYXRlcmFsLFxuICAgICAgICAgIHZhdWx0SWQsXG4gICAgICAgICAgdmF1bHRQaGFzZSxcbiAgICAgICAgICB2YXVsdCxcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuXG4gICAgICAgICAgLyogdGhlIG1hbmFnZXIgaG9sZHMgb25seSB2YXVsdHMgdGhhdCBjYW4gYWNjcnVlIGludGVyZXN0IG9yIGJlIGxpcXVpZGF0ZWQ7Ki9cbiAgICAgICAgICAvKiBpLmUuIHZhdWx0cyB0aGF0IGhhdmUgZGVidC4gVGhlIG9uZSBleGNlcHRpb24gaXMgYXQgdGhlIG91dHNldCB3aGVuKi9cbiAgICAgICAgICAvKiBhIHZhdWx0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBtYW5hZ2VyIGJ1dCBub3QgeWV0IGFjY291bnRlZCBmb3IuKi9cbiAgICAgICAgICBjb25zdCBzZXR0bGVkID1cbiAgICAgICAgICAgIEFtb3VudE1hdGguaXNFbXB0eShvbGREZWJ0Tm9ybWFsaXplZCkgJiZcbiAgICAgICAgICAgIHZhdWx0UGhhc2UgIT09IFBoYXNlLkFDVElWRTtcblxuICAgICAgICAgIHRyYWNlKCdoYW5kbGVCYWxhbmNlQ2hhbmdlJywge1xuICAgICAgICAgICAgb2xkRGVidE5vcm1hbGl6ZWQsXG4gICAgICAgICAgICBvbGRDb2xsYXRlcmFsLFxuICAgICAgICAgICAgdmF1bHRJZCxcbiAgICAgICAgICAgIHZhdWx0UGhhc2UsXG4gICAgICAgICAgICB2YXVsdCxcbiAgICAgICAgICAgIHNldHRsZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zdCB7IHByaW9yaXRpemVkVmF1bHRzIH0gPSBjb2xsYXRlcmFsRXBoZW1lcmEoXG4gICAgICAgICAgICBzdGF0ZS5jb2xsYXRlcmFsQnJhbmQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoc2V0dGxlZCkge1xuICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICAhcHJpb3JpdGl6ZWRWYXVsdHMuaGFzVmF1bHRCeUF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgb2xkRGVidE5vcm1hbGl6ZWQsXG4gICAgICAgICAgICAgICAgb2xkQ29sbGF0ZXJhbCxcbiAgICAgICAgICAgICAgICB2YXVsdElkLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAnU2V0dGxlZCB2YXVsdHMgbXVzdCBub3QgYmUgcmV0YWluZWQgaW4gc3RvcmFnZScsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGlzTmV3ID0gQW1vdW50TWF0aC5pc0VtcHR5KG9sZERlYnROb3JtYWxpemVkKTtcbiAgICAgICAgICB0cmFjZShzdGF0ZS5jb2xsYXRlcmFsQnJhbmQsIHsgaXNOZXcgfSk7XG4gICAgICAgICAgaWYgKCFpc05ldykge1xuICAgICAgICAgICAgLyogaXRzIHBvc2l0aW9uIGluIHRoZSBxdWV1ZSBpcyBubyBsb25nZXIgdmFsaWQqL1xuXG4gICAgICAgICAgICBjb25zdCB2YXVsdEluU3RvcmUgPSBwcmlvcml0aXplZFZhdWx0cy5yZW1vdmVWYXVsdEJ5QXR0cmlidXRlcyhcbiAgICAgICAgICAgICAgb2xkRGVidE5vcm1hbGl6ZWQsXG4gICAgICAgICAgICAgIG9sZENvbGxhdGVyYWwsXG4gICAgICAgICAgICAgIHZhdWx0SWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICB2YXVsdCA9PT0gdmF1bHRJblN0b3JlLFxuICAgICAgICAgICAgICAnaGFuZGxlQmFsYW5jZUNoYW5nZSBmb3IgdHdvIGRpZmZlcmVudCB2YXVsdHMnLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRyYWNlKCdyZW1vdmVkJywgdmF1bHQsIHZhdWx0SWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8qIHJlcGxhY2UgaW4gcXVldWUsIGJ1dCBvbmx5IGlmIGl0IGNhbiBhY2NydWUgaW50ZXJlc3Qgb3IgYmUgbGlxdWlkYXRlZCAoaS5lLiBoYXMgZGVidCkuKi9cbiAgICAgICAgICAvKiBnZXRDdXJyZW50RGVidCgpIHdvdWxkIGFsc28gd29yayAoMHggPSAwKSBidXQgcmVxdWlyZSBtb3JlIGNvbXB1dGF0aW9uLiovXG4gICAgICAgICAgaWYgKCFBbW91bnRNYXRoLmlzRW1wdHkodmF1bHQuZ2V0Tm9ybWFsaXplZERlYnQoKSkpIHtcbiAgICAgICAgICAgIHByaW9yaXRpemVkVmF1bHRzLmFkZFZhdWx0KHZhdWx0SWQsIHZhdWx0KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKiB0b3RhbCArPSB2YXVsdCdzIGRlbHRhIChwb3N0IOKAlCBwcmUpKi9cbiAgICAgICAgICBzdGF0ZS50b3RhbENvbGxhdGVyYWwgPSBBbW91bnRNYXRoLnN1YnRyYWN0KFxuICAgICAgICAgICAgQW1vdW50TWF0aC5hZGQoc3RhdGUudG90YWxDb2xsYXRlcmFsLCB2YXVsdC5nZXRDb2xsYXRlcmFsQW1vdW50KCkpLFxuICAgICAgICAgICAgb2xkQ29sbGF0ZXJhbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHN0YXRlLnRvdGFsRGVidCA9IEFtb3VudE1hdGguc3VidHJhY3QoXG4gICAgICAgICAgICBBbW91bnRNYXRoLmFkZChzdGF0ZS50b3RhbERlYnQsIHZhdWx0LmdldEN1cnJlbnREZWJ0KCkpLFxuICAgICAgICAgICAgbXVsdGlwbHlCeShvbGREZWJ0Tm9ybWFsaXplZCwgc3RhdGUuY29tcG91bmRlZEludGVyZXN0KSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdm9pZCBmYWNldHMuaGVscGVyLndyaXRlTWV0cmljcygpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNlbGY6IHtcbiAgICAgICAgZ2V0R292ZXJuZWRQYXJhbXMoKSB7XG4gICAgICAgICAgY29uc3QgeyBjb2xsYXRlcmFsQnJhbmQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgcmV0dXJuIGZhY3RvcnlQb3dlcnMuZ2V0R292ZXJuZWRQYXJhbXMoY29sbGF0ZXJhbEJyYW5kKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0ICovXG4gICAgICAgIGFzeW5jIG1ha2VWYXVsdEtpdChzZWF0KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBmYWNldHM6IHsgbWFuYWdlciB9LFxuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIHRyYWNlKHN0YXRlLmNvbGxhdGVyYWxCcmFuZCwgJ21ha2VWYXVsdEtpdCcpO1xuICAgICAgICAgIGNvbnN0IHsgc3RvcmFnZU5vZGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgYXNzZXJ0KG1hcnNoYWxsZXIsICdtYWtlVmF1bHRLaXQgbWlzc2luZyBtYXJzaGFsbGVyJyk7XG4gICAgICAgICAgYXNzZXJ0KHN0b3JhZ2VOb2RlLCAnbWFrZVZhdWx0S2l0IG1pc3Npbmcgc3RvcmFnZU5vZGUnKTtcbiAgICAgICAgICBhc3NlcnQoemNmLCAnbWFrZVZhdWx0S2l0IG1pc3NpbmcgemNmJyk7XG5cbiAgICAgICAgICBjb25zdCB2YXVsdElkID0gU3RyaW5nKHN0YXRlLnZhdWx0Q291bnRlcik7XG5cbiAgICAgICAgICAvKiBtdXN0IGJlIGEgcHJlc2VuY2UgdG8gYmUgc3RvcmVkIGluIHZhdWx0IHN0YXRlKi9cbiAgICAgICAgICAvKiogQHR5cGUge1JlbW90ZTxTdG9yYWdlTm9kZT59ICovXG4gICAgICAgICAgY29uc3QgdmF1bHRTdG9yYWdlTm9kZSA9IGF3YWl0IEUoXG4gICAgICAgICAgICBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGB2YXVsdHNgKSxcbiAgICAgICAgICApLm1ha2VDaGlsZE5vZGUoYHZhdWx0JHt2YXVsdElkfWApO1xuXG4gICAgICAgICAgY29uc3QgeyBzZWxmOiB2YXVsdCB9ID0gbWFrZVZhdWx0KG1hbmFnZXIsIHZhdWx0SWQsIHZhdWx0U3RvcmFnZU5vZGUpO1xuICAgICAgICAgIHRyYWNlKHN0YXRlLmNvbGxhdGVyYWxCcmFuZCwgJ21ha2VWYXVsdEtpdCBtYWRlIHZhdWx0JywgdmF1bHQpO1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8qIFRPRE8gYGF3YWl0YCBpcyBhbGxvd2VkIHVudGlsIHRoZSBhYm92ZSBvcmRlcmluZyBpcyBmaXhlZCovXG4gICAgICAgICAgICBjb25zdCB2YXVsdEtpdCA9IGF3YWl0IHZhdWx0LmluaXRWYXVsdEtpdChzZWF0LCB2YXVsdFN0b3JhZ2VOb2RlKTtcbiAgICAgICAgICAgIC8qIGluaXRWYXVsdEtpdCBjYWxscyBiYWNrIHRvIGhhbmRsZUJhbGFuY2VDaGFuZ2UoKSB3aGljaCB3aWxsIGFkZCB0aGUqL1xuICAgICAgICAgICAgLyogdmF1bHQgdG8gcHJpb3JpdGl6ZWRWYXVsdHMqL1xuXG4gICAgICAgICAgICAvKiBpbml0VmF1bHRLaXQgZG9lc24ndCB3cml0ZSB0byB0aGUgc3RvcmFnZSBub2RlIHVudGlsIGl0J3MgcmV0dXJuaW5nKi9cbiAgICAgICAgICAgIC8qIHNvIGlmIGl0IHJldHVybmVkIHRoZW4gd2Uga25vdyB0aGUgbm9kZSBrZXkgd2FzIGNvbnN1bWVkKi9cbiAgICAgICAgICAgIHN0YXRlLnZhdWx0Q291bnRlciArPSAxO1xuXG4gICAgICAgICAgICByZXR1cm4gdmF1bHRLaXQ7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAnYXR0ZW1wdGluZyByZWNvdmVyeSBhZnRlciBpbml0VmF1bHRLaXQgZmFpbHVyZScsXG4gICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvKiA/Pz8gZG8gd2Ugc3RpbGwgbmVlZCB0aGlzIGNsZWFudXA/IGl0IHdvbid0IGdldCBpbnRvIHRoZSBzdG9yZSB1bmxlc3MgaXQgaGFzIGNvbGxhdGVyYWwsKi9cbiAgICAgICAgICAgIC8qIHdoaWNoIHNob3VsZCBxdWFsaWZ5IGl0IHRvIGJlIGluIHRoZSBzdG9yZS4gSWYgd2UgZHJvcCB0aGlzIGNhdGNoIHRoZW4gdGhlIG5lc3RlZCBhd2FpdCovXG4gICAgICAgICAgICAvKiBmb3IgYHZhdWx0LmluaXRWYXVsdEtpdCgpYCBnb2VzIGF3YXkuKi9cblxuICAgICAgICAgICAgLyogcmVtb3ZlIGl0IGZyb20gdGhlIHN0b3JlIGlmIGl0IGdvdCBpbiovXG4gICAgICAgICAgICAvKiogQHR5cGUge05vcm1hbGl6ZWREZWJ0fSAqL1xuICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWREZWJ0ID0gQW1vdW50TWF0aC5tYWtlRW1wdHkoc3RhdGUuZGVidEJyYW5kKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhdGVyYWxQcmUgPSBzZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCkuQ29sbGF0ZXJhbDtcbiAgICAgICAgICAgIGNvbnN0IHsgcHJpb3JpdGl6ZWRWYXVsdHMgfSA9IGNvbGxhdGVyYWxFcGhlbWVyYShcbiAgICAgICAgICAgICAgc3RhdGUuY29sbGF0ZXJhbEJyYW5kLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHByaW9yaXRpemVkVmF1bHRzLnJlbW92ZVZhdWx0QnlBdHRyaWJ1dGVzKFxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWREZWJ0LFxuICAgICAgICAgICAgICAgIGNvbGxhdGVyYWxQcmUsXG4gICAgICAgICAgICAgICAgdmF1bHRJZCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICdyZW1vdmVkIHZhdWx0JyxcbiAgICAgICAgICAgICAgICB2YXVsdElkLFxuICAgICAgICAgICAgICAgICdhZnRlciBpbml0VmF1bHRLaXQgZmFpbHVyZScsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICAgICAgICAgICd2YXVsdCcsXG4gICAgICAgICAgICAgICAgdmF1bHRJZCxcbiAgICAgICAgICAgICAgICAnbmV2ZXIgc3RvcmVkIGR1cmluZyBpbml0VmF1bHRLaXQgZmFpbHVyZScsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICghc2VhdC5oYXNFeGl0ZWQoKSkge1xuICAgICAgICAgICAgICBzZWF0LmV4aXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0Q29sbGF0ZXJhbFF1b3RlKCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IHN0b3JlZENvbGxhdGVyYWxRdW90ZSB9ID0gY29sbGF0ZXJhbEVwaGVtZXJhKFxuICAgICAgICAgICAgc3RhdGUuY29sbGF0ZXJhbEJyYW5kLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFzdG9yZWRDb2xsYXRlcmFsUXVvdGUpIHtcbiAgICAgICAgICAgIGZhY2V0cy5oZWxwZXIuZW5zdXJlUXVvdGVOb3RpZmllcldhdGNoZWQoKTtcblxuICAgICAgICAgICAgLyogaXQgbWlnaHQgdGFrZSBhbiBhcmJpdHJhcnkgYW1vdW50IG9mIHRpbWUgdG8gZ2V0IGEgbmV3IHF1b3RlKi9cbiAgICAgICAgICAgIHRocm93IEZhaWxgZ2V0Q29sbGF0ZXJhbFF1b3RlIGNhbGxlZCBiZWZvcmUgYSBjb2xsYXRlcmFsIHF1b3RlIHdhcyBhdmFpbGFibGVgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzdG9yZWRDb2xsYXRlcmFsUXVvdGU7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZ2V0UHVibGljRmFjZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLmNvbGxhdGVyYWw7XG4gICAgICAgIH0sXG5cbiAgICAgICAgbG9ja09yYWNsZVByaWNlcygpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBzdG9yZWRDb2xsYXRlcmFsUXVvdGUgfSA9IGNvbGxhdGVyYWxFcGhlbWVyYShcbiAgICAgICAgICAgIHN0YXRlLmNvbGxhdGVyYWxCcmFuZCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmICghc3RvcmVkQ29sbGF0ZXJhbFF1b3RlKSB7XG4gICAgICAgICAgICBmYWNldHMuaGVscGVyLmVuc3VyZVF1b3RlTm90aWZpZXJXYXRjaGVkKCk7XG5cbiAgICAgICAgICAgIC8qIGl0IG1pZ2h0IHRha2UgYW4gYXJiaXRyYXJ5IGFtb3VudCBvZiB0aW1lIHRvIGdldCBhIG5ldyBxdW90ZSovXG4gICAgICAgICAgICB0aHJvdyBGYWlsYGxvY2tPcmFjbGVQcmljZXMgY2FsbGVkIGJlZm9yZSBhIGNvbGxhdGVyYWwgcXVvdGUgd2FzIGF2YWlsYWJsZSBmb3IgJHtzdGF0ZS5jb2xsYXRlcmFsQnJhbmR9YDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cmFjZShcbiAgICAgICAgICAgIGBsb2NrT3JhY2xlUHJpY2VzYCxcbiAgICAgICAgICAgIGdldEFtb3VudEluKHN0b3JlZENvbGxhdGVyYWxRdW90ZSksXG4gICAgICAgICAgICBnZXRBbW91bnRPdXQoc3RvcmVkQ29sbGF0ZXJhbFF1b3RlKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc3RhdGUubG9ja2VkUXVvdGUgPSBzdG9yZWRDb2xsYXRlcmFsUXVvdGU7XG4gICAgICAgICAgdm9pZCBmYWNldHMuaGVscGVyLndyaXRlTWV0cmljcygpO1xuICAgICAgICAgIHJldHVybiBzdG9yZWRDb2xsYXRlcmFsUXVvdGU7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG5cbiAgICB7XG4gICAgICBmaW5pc2g6ICh7IHN0YXRlLCBmYWNldHM6IHsgaGVscGVyIH0gfSkgPT4ge1xuICAgICAgICBoZWxwZXIuc3RhcnQoKTtcbiAgICAgICAgdm9pZCBzdGF0ZS5hc3NldFRvcGljS2l0LnJlY29yZGVyLndyaXRlKFxuICAgICAgICAgIGhhcmRlbih7XG4gICAgICAgICAgICBjb21wb3VuZGVkSW50ZXJlc3Q6IHN0YXRlLmNvbXBvdW5kZWRJbnRlcmVzdCxcbiAgICAgICAgICAgIGludGVyZXN0UmF0ZTogZmFjdG9yeVBvd2Vyc1xuICAgICAgICAgICAgICAuZ2V0R292ZXJuZWRQYXJhbXMoc3RhdGUuY29sbGF0ZXJhbEJyYW5kKVxuICAgICAgICAgICAgICAuZ2V0SW50ZXJlc3RSYXRlKCksXG4gICAgICAgICAgICBsYXRlc3RJbnRlcmVzdFVwZGF0ZTogc3RhdGUubGF0ZXN0SW50ZXJlc3RVcGRhdGUsXG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgLyogcHVzaCBpbml0aWFsIHN0YXRlIG9mIG1ldHJpY3MqL1xuICAgICAgICB2b2lkIGhlbHBlci53cml0ZU1ldHJpY3MoKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICAvKipcbiAqIEBwYXJhbSB7T21pdDxcbiAqICAgUGFyYW1ldGVyczx0eXBlb2YgbWFrZVZhdWx0TWFuYWdlcktpdEludGVybmFsPlswXSxcbiAqICAgJ21ldHJpY3NTdG9yYWdlTm9kZSdcbiAqID59IGV4dGVybmFsUGFyYW1zXG4gKi9cbiAgY29uc3QgbWFrZVZhdWx0TWFuYWdlcktpdCA9IGFzeW5jIGV4dGVybmFsUGFyYW1zID0+IHtcbiAgICAvKiogQHR5cGUge1JlbW90ZTxTdG9yYWdlTm9kZT59ICovXG4gICAgY29uc3QgbWV0cmljc1N0b3JhZ2VOb2RlID0gYXdhaXQgRShcbiAgICAgIGV4dGVybmFsUGFyYW1zLnN0b3JhZ2VOb2RlLFxuICAgICkubWFrZUNoaWxkTm9kZSgnbWV0cmljcycpO1xuICAgIHJldHVybiBtYWtlVmF1bHRNYW5hZ2VyS2l0SW50ZXJuYWwoe1xuICAgICAgLi4uZXh0ZXJuYWxQYXJhbXMsXG4gICAgICBtZXRyaWNzU3RvcmFnZU5vZGUsXG4gICAgfSk7XG4gIH07XG4gIHJldHVybiBtYWtlVmF1bHRNYW5hZ2VyS2l0O1xufTtcblxuLyoqIEB0eXBlZGVmIHtFUmV0dXJuPEVSZXR1cm48dHlwZW9mIHByZXBhcmVWYXVsdE1hbmFnZXJLaXQ+Pn0gVmF1bHRNYW5hZ2VyS2l0ICovXG4vKipcbiAqIEB0eXBlZGVmIHtWYXVsdE1hbmFnZXJLaXRbJ3NlbGYnXX0gVmF1bHRNYW5hZ2VyIEVhY2ggVmF1bHRNYW5hZ2VyIG1hbmFnZXMgYVxuICogICBzaW5nbGUgY29sbGF0ZXJhbCB0eXBlLlxuICpcbiAqICAgSXQgbWFuYWdlcyBzb21lIG51bWJlciBvZiBvdXRzdGFuZGluZyBkZWJ0IHBvc2l0aW9ucywgZWFjaCBjYWxsZWQgYSBWYXVsdCxcbiAqICAgZm9yIHdoaWNoIHRoZSBjb2xsYXRlcmFsIGlzIHByb3ZpZGVkIGluIGV4Y2hhbmdlIGZvciBib3Jyb3dlZCBNaW50ZWQuXG4gKi9cbi8qKiBAdHlwZWRlZiB7VmF1bHRNYW5hZ2VyS2l0Wydjb2xsYXRlcmFsJ119IENvbGxhdGVyYWxNYW5hZ2VyICovXG5cbi8qKlxuICogU3VwcG9ydCByZXN0YXJ0aW5nIGtpdHMgZnJvbSBiYWdnYWdlIGFuZCBtdXRhdGluZyB0aGUgYXJyYXkgaG9sZGluZyB0aGVtXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKi8kaM2PX29uY2UucHJlcGFyZVZhdWx0TWFuYWdlcktpdChwcmVwYXJlVmF1bHRNYW5hZ2VyS2l0KTtcbiAgICAgICBjb25zdCBwcm92aWRlQW5kU3RhcnRWYXVsdE1hbmFnZXJLaXRzID0gYmFnZ2FnZSA9PiB7XG4gIHRyYWNlKCdwcm92aWRlQW5kU3RhcnRWYXVsdE1hbmFnZXJLaXRzIHN0YXJ0Jyk7XG4gIGNvbnN0IGtleSA9ICd2YXVsdE1hbmFnZXJLaXRzJztcblxuICBjb25zdCBub0tpdHMgPSAvKiogQHR5cGUge1ZhdWx0TWFuYWdlcktpdFtdfSAqLyAoaGFyZGVuKFtdKSk7XG5cbiAgZm9yIChjb25zdCBraXQgb2YgcHJvdmlkZShiYWdnYWdlLCBrZXksICgpID0+IG5vS2l0cykpIHtcbiAgICBraXQuaGVscGVyLnN0YXJ0KCk7XG4gIH1cblxuICB0cmFjZSgncHJvdmlkZUFuZFN0YXJ0VmF1bHRNYW5hZ2VyS2l0cyByZXR1cm5pbmcnKTtcbiAgcmV0dXJuIHtcbiAgICAvKiogQHR5cGUgeyhraXQ6IFZhdWx0TWFuYWdlcktpdCkgPT4gdm9pZH0gKi9cbiAgICBhZGQ6IGtpdCA9PiB7XG4gICAgICBhcHBlbmRUb1N0b3JlZEFycmF5KGJhZ2dhZ2UsIGtleSwga2l0KTtcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7KGluZGV4OiBudW1iZXIpID0+IFZhdWx0TWFuYWdlcktpdH0gKi9cbiAgICBnZXQ6IGluZGV4ID0+IHtcbiAgICAgIGNvbnN0IGtpdHMgPSBiYWdnYWdlLmdldChrZXkpO1xuICAgICAgaW5kZXggPCBraXRzLmxlbmd0aCB8fCBGYWlsYG5vIFZhdWx0TWFuYWdlcktpdCBhdCBpbmRleCAke2luZGV4fWA7XG4gICAgICByZXR1cm4ga2l0c1tpbmRleF07XG4gICAgfSxcbiAgICBsZW5ndGg6ICgpID0+IGJhZ2dhZ2UuZ2V0KGtleSkubGVuZ3RoLFxuICB9O1xufTskaM2PX29uY2UucHJvdmlkZUFuZFN0YXJ0VmF1bHRNYW5hZ2VyS2l0cyhwcm92aWRlQW5kU3RhcnRWYXVsdE1hbmFnZXJLaXRzKTtcbmhhcmRlbihwcm92aWRlQW5kU3RhcnRWYXVsdE1hbmFnZXJLaXRzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndhdGNoUXVvdGVOb3RpZmllciI6WyJ3YXRjaFF1b3RlTm90aWZpZXIiXSwicHJlcGFyZVZhdWx0TWFuYWdlcktpdCI6WyJwcmVwYXJlVmF1bHRNYW5hZ2VyS2l0Il0sInByb3ZpZGVBbmRTdGFydFZhdWx0TWFuYWdlcktpdHMiOlsicHJvdmlkZUFuZFN0YXJ0VmF1bHRNYW5hZ2VyS2l0cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAFGAvc2SwAANksAAAnAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NhbGxiYWNrLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImNhbGxFIiwiY2FsbFN5bmMiLCJpc0NhbGxiYWNrIiwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siLCJtYWtlTWV0aG9kQ2FsbGJhY2siLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siLCJtYWtlU3luY01ldGhvZENhbGxiYWNrIiwicHJlcGFyZUF0dGVudWF0b3IiLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VFcnJvcixxLEUsaXNQcmltaXRpdmUsaXNQYXNzYWJsZVN5bWJvbCxnZXRJbnRlcmZhY2VNZXRob2RLZXlzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXSxbXCJpc1Bhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoaXNQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInXG4gKiBAaW1wb3J0IHtNZXRob2RzfSBmcm9tICdAZW5kby9leG8nO1xuICogQGltcG9ydCB7RmFyYWJsZX0gZnJvbSAnQGVuZG8vZXhvJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge0ludGVyZmFjZUd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtNZXRob2RHdWFyZH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICovXG4vKiogQGltcG9ydCB7Q2FsbGJhY2ssIFN5bmNDYWxsYmFja30gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuXG5jb25zdCB7IG93bktleXM6IHJhd093bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCBvd25LZXlzID1cbiAgLyoqIEB0eXBlIHs8VCBleHRlbmRzIFByb3BlcnR5S2V5PihvYmo6IHsgW0sgaW4gVF0/OiB1bmtub3duIH0pID0+IFRbXX0gKi8gKFxuICAgIHJhd093bktleXNcbiAgKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UmV0dXJuVHlwZTx0eXBlb2YgcHJlcGFyZUF0dGVudWF0b3I+PlxuICogKSA9PiBGYXJhYmxlPFQ+fSBNYWtlQXR0ZW51YXRvclxuICovXG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBrZXlcbiAqIEByZXR1cm5zIHtrZXkgaXMgUHJvcGVydHlLZXl9IEZJWE1FOiBzaG91bGQgYmUganVzdCBgUHJvcGVydHlLZXlgIGJ1dCBUU1xuICogICBjb21wbGFpbnMgaXQgY2FuJ3QgYmUgdXNlZCBhcyBhbiBpbmRleCB0eXBlLlxuICovXG5jb25zdCBpc1Byb3BlcnR5S2V5ID0ga2V5ID0+IHtcbiAgc3dpdGNoICh0eXBlb2Yga2V5KSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgY2FsbCBhIGNhbGxiYWNrLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEBwYXJhbSB7U3luY0NhbGxiYWNrPEk+fSBjYWxsYmFja1xuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTxJPn1cbiAqL1xuICAgICAgIGNvbnN0IGNhbGxTeW5jID0gKGNhbGxiYWNrLCAuLi5hcmdzKSA9PiB7XG4gIGNvbnN0IHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCB9ID0gY2FsbGJhY2s7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdGFyZ2V0KC4uLmJvdW5kLCAuLi5hcmdzKTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0W21ldGhvZE5hbWVdKC4uLmJvdW5kLCAuLi5hcmdzKTtcbn07JGjNj19vbmNlLmNhbGxTeW5jKGNhbGxTeW5jKTtcbmhhcmRlbihjYWxsU3luYyk7XG5cbi8qKlxuICogRXZlbnR1YWwgc2VuZCB0byBhIGNhbGxiYWNrLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEBwYXJhbSB7Q2FsbGJhY2s8ST59IGNhbGxiYWNrXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8UmV0dXJuVHlwZTxJPj4+fVxuICovXG4gICAgICAgY29uc3QgY2FsbEUgPSAoY2FsbGJhY2ssIC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kIH0gPSBjYWxsYmFjaztcbiAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBFKHRhcmdldCkoLi4uYm91bmQsIC4uLmFyZ3MpO1xuICB9XG4gIHJldHVybiBFKHRhcmdldClbbWV0aG9kTmFtZV0oLi4uYm91bmQsIC4uLmFyZ3MpO1xufTskaM2PX29uY2UuY2FsbEUoY2FsbEUpO1xuaGFyZGVuKGNhbGxFKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgbmVhciBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST59IFtUPUldXG4gKiBAdGVtcGxhdGUge2FueVtdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7U3luY0NhbGxiYWNrPEk+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrID0gKHRhcmdldCwgLi4uYm91bmQpID0+IHtcbiAgdHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIEZhaWxgc3luYyBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uOiAke3RhcmdldH1gO1xuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBib3VuZCwgaXNTeW5jOiB0cnVlIH0pO1xuICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovIChjYik7XG59OyRozY9fb25jZS5tYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sobWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHRlbXBsYXRlIHtFUmVmPCguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST4+fSBbVD1FUmVmPEk+XVxuICogQHRlbXBsYXRlIHthbnlbXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge0NhbGxiYWNrPEk+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUZ1bmN0aW9uQ2FsbGJhY2sgPSAodGFyZ2V0LCAuLi5ib3VuZCkgPT4ge1xuICAhaXNQcmltaXRpdmUodGFyZ2V0KSB8fFxuICAgIEZhaWxgZnVuY3Rpb24gY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYSBmdW5jdGlvbiBwcmVzZW5jZTogJHt0YXJnZXR9YDtcbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgYm91bmQgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge0NhbGxiYWNrPEk+fSAqLyAoY2IpO1xufTskaM2PX29uY2UubWFrZUZ1bmN0aW9uQ2FsbGJhY2sobWFrZUZ1bmN0aW9uQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VGdW5jdGlvbkNhbGxiYWNrKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgbmVhciBtZXRob2QuXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gUFxuICogQHRlbXBsYXRlIHt7XG4gKiAgIFt4IGluIFBdOiAoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+O1xuICogfX0gW1Q9eyBbeCBpbiBQXTogSSB9XVxuICogQHRlbXBsYXRlIHthbnlbXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQfSBtZXRob2ROYW1lXG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7U3luY0NhbGxiYWNrPEk+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVN5bmNNZXRob2RDYWxsYmFjayA9ICh0YXJnZXQsIG1ldGhvZE5hbWUsIC4uLmJvdW5kKSA9PiB7XG4gICFpc1ByaW1pdGl2ZSh0YXJnZXQpIHx8XG4gICAgRmFpbGBzeW5jIG1ldGhvZCBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3Q6ICR7dGFyZ2V0fWA7XG4gIHR5cGVvZiBtZXRob2ROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgIGlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkgfHxcbiAgICBGYWlsYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQsIGlzU3luYzogdHJ1ZSB9KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7U3luY0NhbGxiYWNrPEk+fSAqLyAoY2IpO1xufTskaM2PX29uY2UubWFrZVN5bmNNZXRob2RDYWxsYmFjayhtYWtlU3luY01ldGhvZENhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY01ldGhvZENhbGxiYWNrKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgcG90ZW50aWFsbHkgZmFyIG1ldGhvZC5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge0VSZWY8e1xuICogICBbeCBpbiBQXTogKC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPjtcbiAqIH0+fSBbVD1FUmVmPHsgW3ggaW4gUF06IEkgfT5dXG4gKiBAdGVtcGxhdGUge2FueVtdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtDYWxsYmFjazxJPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNZXRob2RDYWxsYmFjayA9ICh0YXJnZXQsIG1ldGhvZE5hbWUsIC4uLmJvdW5kKSA9PiB7XG4gICFpc1ByaW1pdGl2ZSh0YXJnZXQpIHx8XG4gICAgRmFpbGBtZXRob2QgY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0OiAke3RhcmdldH1gO1xuICB0eXBlb2YgbWV0aG9kTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICBpc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpIHx8XG4gICAgRmFpbGBtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIHBhc3NhYmxlIHN5bWJvbDogJHttZXRob2ROYW1lfWA7XG4gIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgY29uc3QgY2IgPSBoYXJkZW4oeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kIH0pO1xuICByZXR1cm4gLyoqIEB0eXBlIHtDYWxsYmFjazxJPn0gKi8gKGNiKTtcbn07JGjNj19vbmNlLm1ha2VNZXRob2RDYWxsYmFjayhtYWtlTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VNZXRob2RDYWxsYmFjayk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Y2FsbGJhY2sgaXMgQ2FsbGJhY2s8YW55Pn1cbiAqL1xuICAgICAgIGNvbnN0IGlzQ2FsbGJhY2sgPSBjYWxsYmFjayA9PiB7XG4gIGlmIChpc1ByaW1pdGl2ZShjYWxsYmFjaykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kIH0gPSBjYWxsYmFjaztcbiAgcmV0dXJuIChcbiAgICAhaXNQcmltaXRpdmUodGFyZ2V0KSAmJlxuICAgIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHR5cGVvZiBtZXRob2ROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKSkgJiZcbiAgICBBcnJheS5pc0FycmF5KGJvdW5kKVxuICApO1xufTskaM2PX29uY2UuaXNDYWxsYmFjayhpc0NhbGxiYWNrKTtcbmhhcmRlbihpc0NhbGxiYWNrKTtcblxuLyoqXG4gKiBQcmVwYXJlIGFuIGF0dGVudWF0b3IgY2xhc3Mgd2hvc2UgbWV0aG9kcyBjYW4gYmUgcmVkaXJlY3RlZCB2aWEgY2FsbGJhY2tzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IE1cbiAqIEBwYXJhbSB7Wm9uZX0gem9uZSBUaGUgem9uZSBpbiB3aGljaCB0byBhbGxvY2F0ZSBhdHRlbnVhdG9ycy5cbiAqIEBwYXJhbSB7TVtdfSBtZXRob2ROYW1lcyBNZXRob2RzIHRvIGZvcndhcmQuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZDx7XG4gKiAgIFtLIGluIE1dOiBNZXRob2RHdWFyZDtcbiAqIH0+fSBbb3B0cy5pbnRlcmZhY2VHdWFyZF1cbiAqICAgQW4gaW50ZXJmYWNlIGd1YXJkIGZvciB0aGUgbmV3IGF0dGVudWF0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMudGFnXSBBIHRhZyBmb3IgdGhlIG5ldyBhdHRlbnVhdG9yIGV4b0NsYXNzLlxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUF0dGVudWF0b3IgPSAoXG4gIHpvbmUsXG4gIG1ldGhvZE5hbWVzLFxuICB7IGludGVyZmFjZUd1YXJkLCB0YWcgPSAnQXR0ZW51YXRvcicgfSA9IHt9LFxuKSA9PiB7XG4gIC8qKlxuICogQHR5cGVkZWYgeyh0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IE1ldGhvZFxuICpcbiAqIEB0eXBlZGVmIHt7IFtLIGluIE1dPzogQ2FsbGJhY2s8YW55PiB8IG51bGwgfX0gT3ZlcnJpZGVzXG4gKlxuICogQHR5cGVkZWYge3sgW0sgaW4gTV06ICh0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgfX0gTWV0aG9kc1xuICovXG4gIGNvbnN0IG1ldGhvZHMgPSAvKiogQHR5cGUge01ldGhvZHN9ICovIChcbiAgICBmcm9tRW50cmllcyhcbiAgICAgIG1ldGhvZE5hbWVzLm1hcChrZXkgPT4ge1xuICAgICAgICAvKiBPbmx5IGFsbG93IHRoZSBgUHJvcGVydHlLZXlgIHR5cGUgZm9yIHRoZSB0YXJnZXQgbWV0aG9kIGtleS4qL1xuICAgICAgICBpZiAoIWlzUHJvcGVydHlLZXkoa2V5KSkge1xuICAgICAgICAgIHRocm93IEZhaWxga2V5ICR7cShrZXkpfSBpcyBub3QgYSBQcm9wZXJ0eUtleWA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtID0gLyoqIEB0eXBlIHtNZXRob2RzfSAqLyAoe1xuICAgICAgICAgIC8qIEV4cGxpY2l0bHkgdXNlIGNvbmNpc2UgbWV0aG9kIHN5bnRheCB0byBwcmVzZXJ2ZSBgdGhpc2AgYnV0IHByZXZlbnQqL1xuICAgICAgICAgIC8qIGNvbnN0cnVjdG9yIGJlaGF2aW9yLiovXG4gICAgICAgICAgLyoqIEB0eXBlIHtNZXRob2R9ICovXG4gICAgICAgICAgW2tleV0oLi4uYXJncykge1xuICAgICAgICAgICAgLyogU3VwcG9ydCBib3RoIHN5bmNocm9ub3VzIGFuZCBhc3luYyBjYWxsYmFja3MuKi9cbiAgICAgICAgICAgIGNvbnN0IGNiID0gdGhpcy5zdGF0ZS5jYnNba2V5XTtcbiAgICAgICAgICAgIGlmICghY2IpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyID0gbWFrZUVycm9yKGB1bmltcGxlbWVudGVkICR7cSh0YWcpfSBtZXRob2QgJHtxKGtleSl9YCk7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmlzU3luYykge1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjYi5pc1N5bmMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNhbGxTeW5jKGNiLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjYWxsRShjYiwgLi4uYXJncyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlba2V5XTtcbiAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7Y29uc3R9ICovIChba2V5LCBtXSk7XG4gICAgICB9KSxcbiAgICApXG4gICk7XG5cbiAgLyoqXG4gKiBDcmVhdGUgYW4gZXhvIG9iamVjdCB3aG9zZSBiZWhhdmlvciBpcyBjb21wb3NlZCBmcm9tIGEgZGVmYXVsdCB0YXJnZXRcbiAqIGFuZC9vciBpbmRpdmlkdWFsIG1ldGhvZCBvdmVycmlkZSBjYWxsYmFja3MuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7dW5rbm93bn0gW29wdHMudGFyZ2V0XSBUaGUgdGFyZ2V0IGZvciBhbnkgbWV0aG9kcyB0aGF0IHdlcmVuJ3RcbiAqICAgc3BlY2lmaWVkIGluIGBvcHRzLm92ZXJyaWRlc2AuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmlzU3luYz1mYWxzZV0gV2hldGhlciB0aGUgdGFyZ2V0IHNob3VsZCBiZSB0cmVhdGVkXG4gKiAgIGFzIHN5bmNocm9ub3VzbHkgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtPdmVycmlkZXN9IFtvcHRzLm92ZXJyaWRlc10gU2V0IGluZGl2aWR1YWwgY2FsbGJhY2tzIGZvciBtZXRob2RzXG4gKiAgICh3aG9zZSBuYW1lcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGBwcmVwYXJlQXR0ZW51YXRvcmAgb3JcbiAqICAgYHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcmAgY2FsbCkuIE51bGxpc2ggb3ZlcnJpZGVzIG1lYW4gdG8gdGhyb3cuXG4gKi9cbiAgY29uc3QgbWFrZUF0dGVudWF0b3IgPSB6b25lLmV4b0NsYXNzKFxuICAgIHRhZyxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICAvKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge2FueX0gW29wdHMudGFyZ2V0XVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pc1N5bmNdXG4gKiBAcGFyYW0ge092ZXJyaWRlc30gW29wdHMub3ZlcnJpZGVzXVxuICovXG4gICAgKHtcbiAgICAgIHRhcmdldCA9IG51bGwsXG4gICAgICBpc1N5bmMgPSBmYWxzZSxcbiAgICAgIG92ZXJyaWRlcyA9IC8qKiBAdHlwZSB7T3ZlcnJpZGVzfSAqLyAoe30pLFxuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IGNicyA9IC8qKiBAdHlwZSB7T3ZlcnJpZGVzfSAqLyAoe30pO1xuXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBuZXcgU2V0KG1ldGhvZE5hbWVzKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIG93bktleXMob3ZlcnJpZGVzKSkge1xuICAgICAgICByZW1haW5pbmcuaGFzKGtleSkgfHxcbiAgICAgICAgICBGYWlsYCR7cSh0YWcpfSBvdmVycmlkZXNbJHtxKGtleSl9XSBub3QgYWxsb3dlZCBieSBtZXRob2ROYW1lc2A7XG5cbiAgICAgICAgcmVtYWluaW5nLmRlbGV0ZShrZXkpO1xuICAgICAgICBjb25zdCBjYiA9IG92ZXJyaWRlc1trZXldO1xuICAgICAgICBjYiA9PSBudWxsIHx8XG4gICAgICAgICAgaXNDYWxsYmFjayhjYikgfHxcbiAgICAgICAgICBGYWlsYCR7cSh0YWcpfSBvdmVycmlkZXNbJHtxKGtleSl9XSBpcyBub3QgYSBjYWxsYmFjazsgZ290ICR7Y2J9YDtcbiAgICAgICAgY2JzW2tleV0gPSBjYjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlbWFpbmluZykge1xuICAgICAgICBpZiAoaXNTeW5jKSB7XG4gICAgICAgICAgY2JzW2tleV0gPSBtYWtlU3luY01ldGhvZENhbGxiYWNrKHRhcmdldCwga2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYnNba2V5XSA9IG1ha2VNZXRob2RDYWxsYmFjayh0YXJnZXQsIGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXJkZW4oeyBjYnMsIGlzU3luYyB9KTtcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7TWV0aG9kc30gKi8gKG1ldGhvZHMpLFxuICApO1xuICByZXR1cm4gbWFrZUF0dGVudWF0b3I7XG59OyRozY9fb25jZS5wcmVwYXJlQXR0ZW51YXRvcihwcmVwYXJlQXR0ZW51YXRvcik7XG5oYXJkZW4ocHJlcGFyZUF0dGVudWF0b3IpO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciB3aG9zZSBtZXRob2ROYW1lcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpbnRlcmZhY2VHdWFyZC5cbiAqXG4gKiBAdGVtcGxhdGUge0ludGVyZmFjZUd1YXJkfSBHXG4gKiBAcGFyYW0ge1pvbmV9IHpvbmVcbiAqIEBwYXJhbSB7R30gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0c11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy50YWddXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IgPSAoem9uZSwgaW50ZXJmYWNlR3VhcmQsIG9wdHMgPSB7fSkgPT4ge1xuICBjb25zdCBtZXRob2ROYW1lcyA9IGdldEludGVyZmFjZU1ldGhvZEtleXMoaW50ZXJmYWNlR3VhcmQpO1xuICBjb25zdCBtYWtlQXR0ZW51YXRvciA9IHByZXBhcmVBdHRlbnVhdG9yKHpvbmUsIG1ldGhvZE5hbWVzLCB7XG4gICAgLi4ub3B0cyxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge01ha2VBdHRlbnVhdG9yPGFueT59ICovIChtYWtlQXR0ZW51YXRvcik7XG59OyRozY9fb25jZS5wcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IocHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FsbFN5bmMiOlsiY2FsbFN5bmMiXSwiY2FsbEUiOlsiY2FsbEUiXSwibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIjpbIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayJdLCJtYWtlRnVuY3Rpb25DYWxsYmFjayI6WyJtYWtlRnVuY3Rpb25DYWxsYmFjayJdLCJtYWtlU3luY01ldGhvZENhbGxiYWNrIjpbIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siXSwibWFrZU1ldGhvZENhbGxiYWNrIjpbIm1ha2VNZXRob2RDYWxsYmFjayJdLCJpc0NhbGxiYWNrIjpbImlzQ2FsbGJhY2siXSwicHJlcGFyZUF0dGVudWF0b3IiOlsicHJlcGFyZUF0dGVudWF0b3IiXSwicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIjpbInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACjNk+m9QQAAPUEAAAoAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NsaS11dGlscy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsidG9DTElPcHRpb25zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qKlxuICogQ29udmVydCBhIHN0cmluZy1rZXllZCBvYmplY3QgaW50byBhbiBhcnJheSBvZiBDTEkgb3B0aW9ucywgdXNpbmcgZWFjaCBrZXkgYXNcbiAqIHRoZSBuYW1lIG9mIGEgR05VLXN0eWxlIGxvbmcgb3B0aW9uIGAtLSR7a2V5fWAsIGlnbm9yaW5nIGVhY2gga2V5IHdpdGggYW5cbiAqIHVuZGVmaW5lZCB2YWx1ZSBhbmQgY29udmVydGluZyBib29sZWFuIHZhbHVlcyBpbnRvIG5vLWFyZ3VtZW50IGAtLSR7a2V5fWAgb3JcbiAqIGAtLW5vLSR7a2V5fWAgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVuZGVmaW5lZCB8IGJvb2xlYW4gfCBzdHJpbmcgfCBzdHJpbmdbXT59IHJlY29yZCAtXG4gKiAgIGUuZy4geyBjb2xvcjogJ2JsdWUnIH1cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBlLmcuIFsnLS1jb2xvcicsICdibHVlJ11cbiAqL1xuICAgICAgIGNvbnN0IHRvQ0xJT3B0aW9ucyA9IHJlY29yZCA9PlxuICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSByZXR1cm4gW2AtLSR7a2V5fWBdO1xuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHJldHVybiBbYC0tbm8tJHtrZXl9YF07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvKiBSZXByZXNlbnQgYXMgYSByZXBlYXRlZCBvcHRpb24uKi9cbiAgICAgIHJldHVybiB2YWx1ZS5mbGF0TWFwKHYgPT4gW2AtLSR7a2V5fWAsIHZdKTtcbiAgICB9XG4gICAgcmV0dXJuIFtgLS0ke2tleX1gLCB2YWx1ZV07XG4gIH0pOyRozY9fb25jZS50b0NMSU9wdGlvbnModG9DTElPcHRpb25zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRvQ0xJT3B0aW9ucyI6WyJ0b0NMSU9wdGlvbnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbQ14FcoMAADKDAAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanN7ImltcG9ydHMiOlsiLi9rZXlNaXJyb3IuanMiXSwiZXhwb3J0cyI6WyJCcmlkZ2VJZCIsIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIiwiVkJhbmtBY2NvdW50IiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGtleU1pcnJvcjskaM2PX2ltcG9ydHMoW1tcIi4va2V5TWlycm9yLmpzXCIsIFtbXCJrZXlNaXJyb3JcIixbJGjNj19hID0+IChrZXlNaXJyb3IgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBmaWxlXG4gKlxuICogICBTb21lIG9mIHRoaXMgY29uZmlnIGluZm8gbWF5IG1ha2UgbW9yZSBzZW5zZSBpbiBhIHBhcnRpY3VsYXIgcGFja2FnZS4gSG93ZXZlclxuICogICBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwIGFuZCBvdXIgbGF4IHBhY2thZ2VcbiAqICAgZGVwZW5kZW5jeSBncmFwaCwgc29tZXRpbWVzIHJhdGlvbmFsIHBsYWNlbWVudHMgY2F1c2UgdHlwZSByZXNvbHV0aW9uXG4gKiAgIGVycm9ycy5cbiAqXG4gKiAgIFNvIGFzIGEgd29yay1hcm91bmQgc29tZSBjb25zdGFudHMgdGhhdCBuZWVkIGFjY2VzcyBmcm9tIG1vcmUgdGhhbiBvbmVcbiAqICAgcGFja2FnZSBhcmUgcGxhY2VkIGhlcmUuXG4gKi9cblxuLyoqXG4gKiBDbHVzdGVyTmFtZSBzcGVjaWZpZXMgYSBjb2xsZWN0aW9uIG9mIG5ldHdvcmtzLiBUaGUgc3BlY2lmaWMgbmV0d29ya3NcbiAqIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBtYXkgdmFyeSBmcm9tIGNvbnRleHQgdG8gY29udGV4dCwgYW5kIG1heVxuICogYWxzbyBvdmVybGFwIChlLmcuIGEgXCJsb2NhbFwiIGNsdXN0ZXIgbWF5IGNvbm5lY3QgdG8gdGhlIHNhbWUgcmVtb3RlIG5ldHdvcmtzXG4gKiBhcyBhIFwidGVzdG5ldFwiIGNsdXN0ZXIpLCBidXQgdGhpcyB0eXBlIG5ldmVydGhlbGVzcyBzdXBwb3J0cyBjcm9zcy1wYWNrYWdlXG4gKiBjb29yZGluYXRpb24gd2hlcmUgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggc3RhdGljIGxhYmVscyBhcmUgc3ViamVjdCB0b1xuICogY2hvaWNlIG9mIGNsdXN0ZXIuIFNvbWUgZXhhbXBsZXM6XG4gKlxuICogLSB0aGUgY2hhaW4gSUQgZm9yIGEgc3RhdGljIGxhYmVsIGxpa2UgXCJBZ29yaWNcIiBvciBcIkV0aGVyZXVtXCJcbiAqIC0gdGhlIGNyeXB0b2dyYXBoaWMgaGFzaCBmb3IgYSBzdGF0aWMgbGFiZWwgbGlrZSBcIkJMRFwiIG9yIFwiVVNEQ1wiXG4gKiAtIHRoZSBVUkwgZm9yIGEgc2VydmljZSBsaWtlIFwiQWdvcmljIFJQQ1wiIG9yIFwiQXhlbGFyXCIgb3IgXCJTcGVjdHJ1bVwiXG4gKlxuICogXCJtYWlubmV0XCIgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIHRoZSBBZ29yaWMgbmV0d29yayBkZXNjcmliZWQgYnlcbiAqIGh0dHBzOi8vbWFpbi5hZ29yaWMubmV0L25ldHdvcmstY29uZmlnIHJhdGhlciB0aGFuIHNvbWUgb3RoZXIgYWx0ZXJuYXRpdmUuXG4gKlxuICogWFhYIFRoaXMgYWN0dWFsbHkgYmVsb25ncyBzb21ld2hlcmUgZWxzZSwgcG9zc2libHkgd2l0aCByZWZhY3RvcmluZy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzEyMTg1I2Rpc2N1c3Npb25fcjI1MDAxMjMyMjZcbiAqXG4gKiBAdHlwZWRlZiB7J2xvY2FsJyB8ICd0ZXN0bmV0JyB8ICdtYWlubmV0J30gQ2x1c3Rlck5hbWVcbiAqL1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZHMgdXNlZCBieSB0aGUgYnJpZGdlIGRldmljZS5cbiAqXG4gKiBAZW51bSB7KHR5cGVvZiBCcmlkZ2VJZClba2V5b2YgdHlwZW9mIEJyaWRnZUlkXX1cbiAqL1xuICAgICAgIGNvbnN0IEJyaWRnZUlkID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgQkFOSzogJ2JhbmsnLFxuICBDT1JFOiAnY29yZScsXG4gIERJQkM6ICdkaWJjJyxcbiAgU1RPUkFHRTogJ3N0b3JhZ2UnLFxuICBQUk9WSVNJT046ICdwcm92aXNpb24nLFxuICBQUk9WSVNJT05fU01BUlRfV0FMTEVUOiAncHJvdmlzaW9uV2FsbGV0JyxcbiAgVkxPQ0FMQ0hBSU46ICd2bG9jYWxjaGFpbicsXG4gIFZUUkFOU0ZFUjogJ3Z0cmFuc2ZlcicsXG4gIFdBTExFVDogJ3dhbGxldCcsXG59KTskaM2PX29uY2UuQnJpZGdlSWQoQnJpZGdlSWQpO1xuaGFyZGVuKEJyaWRnZUlkKTtcblxuLyoqIEBzYXRpc2ZpZXMge1JlY29yZDxzdHJpbmcsIEJyaWRnZUlkPn0gKi9cbiAgICAgICBjb25zdCBDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCA9IHtcbiAgdmJhbmtQb3J0OiAnYmFuaycsXG4gIHZpYmNQb3J0OiAnZGliYycsXG59OyRozY9fb25jZS5Db3Ntb3NJbml0S2V5VG9CcmlkZ2VJZChDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCk7XG5oYXJkZW4oQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQpO1xuXG4gICAgICAgY29uc3QgV2FsbGV0TmFtZSA9IGtleU1pcnJvcih7XG4gIGRlcG9zaXRGYWNldDogbnVsbCxcbn0pOyRozY9fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuaGFyZGVuKFdhbGxldE5hbWUpO1xuXG4vKiBkZWZpbmVkIGluIGdvbGFuZy9jb3Ntb3MveC92YmFuayovXG4gICAgICAgY29uc3QgVkJhbmtBY2NvdW50ID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgcmVzZXJ2ZToge1xuICAgIG1vZHVsZTogJ3ZiYW5rL3Jlc2VydmUnLFxuICAgIGFkZHJlc3M6ICdhZ29yaWMxYWUwbG10emxncmNubGE5eGprcGFhcnE1ZDVkZmV6NjNoM251Y2wnLFxuICB9LFxuICBwcm92aXNpb246IHtcbiAgICBtb2R1bGU6ICd2YmFuay9wcm92aXNpb24nLFxuICAgIGFkZHJlc3M6ICdhZ29yaWMxbWVnenl0ZzY1Y3lyZ3pzNmZ2enhncmNxdnd3bDd1Z3B0NjIzNDYnLFxuICB9LFxufSk7JGjNj19vbmNlLlZCYW5rQWNjb3VudChWQmFua0FjY291bnQpO1xuaGFyZGVuKFZCYW5rQWNjb3VudCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmlkZ2VJZCI6WyJCcmlkZ2VJZCJdLCJDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCI6WyJDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCJdLCJXYWxsZXROYW1lIjpbIldhbGxldE5hbWUiXSwiVkJhbmtBY2NvdW50IjpbIlZCYW5rQWNjb3VudCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACNvaYBrggAAK4IAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVHJhY2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8xMTg0NCovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8xMTg0NSovXG5sZXQgZGVidWdJbnN0YW5jZSA9IDE7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCAndmVyYm9zZSd9IGVuYWJsZVxuICovXG4gICAgICAgY29uc3QgbWFrZVRyYWNlciA9IChsYWJlbCwgZW5hYmxlID0gdHJ1ZSkgPT4ge1xuICBjb25zdCBzdWIgPSAoc3ViTGFiZWwsIHN1YkVuYWJsZSA9IGVuYWJsZSkgPT5cbiAgICBtYWtlVHJhY2VyKGAke2xhYmVsfS4ke3N1YkxhYmVsfWAsIHN1YkVuYWJsZSk7XG4gIGNvbnN0IGtleSA9IGAtLS0tLSAke2xhYmVsfSwke2RlYnVnSW5zdGFuY2V9IGA7XG4gIGRlYnVnSW5zdGFuY2UgKz0gMTtcbiAgLyogdGhlIGNhc2VzIGJlbG93IGRlZmluZSBhIG5hbWVkIHZhcmlhYmxlIHRvIHByb3ZpZGUgYmV0dGVyIGRlYnVnIGluZm8qL1xuICBzd2l0Y2ggKGVuYWJsZSkge1xuICAgIGNhc2UgZmFsc2U6IHtcbiAgICAgIGNvbnN0IGxvZ0Rpc2FibGVkID0gKC4uLl9hcmdzKSA9PiB7fTtcbiAgICAgIHJldHVybiBoYXJkZW4oT2JqZWN0LmFzc2lnbihsb2dEaXNhYmxlZCwgeyBzdWIgfSkpO1xuICAgIH1cbiAgICBjYXNlICd2ZXJib3NlJzoge1xuICAgICAgY29uc3QgaW5mb1RpY2sgPSAob3B0TG9nLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgIC8qIFhYWCBTbmlmZiB0ZXN0cyBzdWNoIGFzIHRoaXMgYXJlIGluaGVyZW50bHkgdW5yZWxpYWJsZSBhbmQgc21lbGwgYmFkLiovXG4gICAgICAgIC8qIEV2ZW4gYXNpZGUgZnJvbSB0aGUgc2VjdXJpdHkgaGF6YXJkIG9mKi9cbiAgICAgICAgLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8xMTg0NSovXG4gICAgICAgIC8qIGFuIG9iamVjdCBpbnRlbmRlZCBhcyBhIG5vcm1hbCBsb2dnaW5nIGFyZ3VtZW50IG1heSBhY2NpZGVudGFsbHkqL1xuICAgICAgICAvKiBwYXNzIHRoaXMgc25pZmYgdGVzdCwgY2F1c2luZyBjb25mdXNpb24uKi9cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRMb2c/LmxvZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhrZXksIC4uLmFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhrZXksIG9wdExvZywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gaGFyZGVuKE9iamVjdC5hc3NpZ24oaW5mb1RpY2ssIHsgc3ViIH0pKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uc3QgZGVidWdUaWNrID0gKG9wdExvZywgLi4uYXJncykgPT4ge1xuICAgICAgICAvKiBBbm90aGVyIHVucmVsaWFibGUgc25pZmYgdGVzdCBsaWtlIHRoZSBvbmUgYWJvdmUqL1xuICAgICAgICBpZiAodHlwZW9mIG9wdExvZz8ubG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb3B0TG9nLmxvZyhrZXksIC4uLmFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhrZXksIG9wdExvZywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gaGFyZGVuKE9iamVjdC5hc3NpZ24oZGVidWdUaWNrLCB7IHN1YiB9KSk7XG4gICAgfVxuICB9XG59OyRozY9fb25jZS5tYWtlVHJhY2VyKG1ha2VUcmFjZXIpO1xuaGFyZGVuKG1ha2VUcmFjZXIpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlVHJhY2VyPn0gVHJhY2VMb2dnZXJcbiAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYWNlciI6WyJtYWtlVHJhY2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALGT1Y5eAwAAXgMAACUAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvZXJyb3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIk5vbk51bGxpc2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VCB8IG51bGwgfCB1bmRlZmluZWR9IHZhbFxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge1R9XG4gKi9cbiAgICAgICBjb25zdCBOb25OdWxsaXNoID0gKHZhbCwgb3B0RGV0YWlscyA9IGB1bmV4cGVjdGVkICR7cSh2YWwpfWApID0+IHtcbiAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgLyogVGhpcyBgIT0gbnVsbGAgaWRpb20gY2hlY2tzIHRoYXQgYHZhbGAgaXMgbmVpdGhlciBgbnVsbGAgbm9yIGB1bmRlZmluZWRgLiovXG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBhc3NlcnQuZmFpbChvcHREZXRhaWxzKTtcbn07JGjNj19vbmNlLk5vbk51bGxpc2goTm9uTnVsbGlzaCk7XG5oYXJkZW4oTm9uTnVsbGlzaCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJOb25OdWxsaXNoIjpbIk5vbk51bGxpc2giXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAaBzsGv4EAAD+BAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2NsaS11dGlscy5qcyIsIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vZXJyb3JzLmpzIiwiLi9qcy11dGlscy5qcyIsIi4va2V5TWlycm9yLmpzIiwiLi9tYXJzaGFsL3B1cmUtZGF0YS5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi9tZXRyaWNzLmpzIiwiLi9uYXR1cmFsLXNvcnQuanMiLCIuL3Nlcy11dGlscy5qcyIsIi4vdG1wRGlyLmpzIiwiLi90eXBlQ2hlY2suanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOltudWxsXSwicmVleHBvcnRzIjpbIi4vY2xpLXV0aWxzLmpzIiwiLi9jb25maWcuanMiLCIuL2RlYnVnLmpzIiwiLi9lcnJvcnMuanMiLCIuL2pzLXV0aWxzLmpzIiwiLi9rZXlNaXJyb3IuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vbWV0cmljcy5qcyIsIi4vbmF0dXJhbC1zb3J0LmpzIiwiLi9zZXMtdXRpbHMuanMiLCIuL3RtcERpci5qcyIsIi4vdHlwZUNoZWNrLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2NsaS11dGlscy5qc1wiLCBbXV0sW1wiLi9jb25maWcuanNcIiwgW11dLFtcIi4vZGVidWcuanNcIiwgW11dLFtcIi4vZXJyb3JzLmpzXCIsIFtdXSxbXCIuL2pzLXV0aWxzLmpzXCIsIFtdXSxbXCIuL2tleU1pcnJvci5qc1wiLCBbXV0sW1wiLi9tYXJzaGFsL3B1cmUtZGF0YS5qc1wiLCBbXV0sW1wiLi9tZXRob2QtdG9vbHMuanNcIiwgW11dLFtcIi4vbWV0cmljcy5qc1wiLCBbXV0sW1wiLi9uYXR1cmFsLXNvcnQuanNcIiwgW11dLFtcIi4vc2VzLXV0aWxzLmpzXCIsIFtdXSxbXCIuL3RtcERpci5qc1wiLCBbXV0sW1wiLi90eXBlQ2hlY2suanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vbWFyc2hhbC9wdXJlLWRhdGEuanMiOltbInB1cmVEYXRhTWFyc2hhbGxlciIsInB1cmVEYXRhTWFyc2hhbGxlciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqtWvjaYlAACmJQAAJwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9qcy11dGlscy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiVFJVRSIsImRlZXBDb3B5SnNvbmFibGUiLCJkZWVwTWFwT2JqZWN0IiwiZGVmaW5lTmFtZSIsImZyb21UeXBlZEVudHJpZXMiLCJsb2dMZXZlbHMiLCJtYWtlTWVhc3VyZVNlY29uZHMiLCJvYmplY3RNYXBNdXRhYmxlIiwicGFydGlhbE1hcCIsInByb3ZpZGVMYXp5TWFwIiwidHlwZWRFbnRyaWVzIiwidHlwZWRNYXAiLCJ1bnByZWZpeGVkUHJvcGVydGllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuLyogQGplc3NpZS1jaGVjayovXG4vKipcbiAqIEBmaWxlIFB1cmUgSmF2YVNjcmlwdCB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggYnV0IG5vdFxuICogICBkZXBlbmRlbnQgdXBvbiBhIGhhcmRlbmVkIGVudmlyb25tZW50LlxuICovXG5cbmNvbnN0IHsgZGVmaW5lUHJvcGVydHkgfSA9IE9iamVjdDtcblxuLyoqIEZvciBvdmVycmlkaW5nIFR5cGVTY3JpcHQgaW5mZXJyaW5nIHRoZSB0eXBlIG9mIGB0cnVlYCBhcyBib29sZWFuLiAqL1xuICAgICAgIGNvbnN0IFRSVUUgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAodHJ1ZSk7XG5cbi8qKlxuICogQHR5cGVkZWYgezxPIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICogICBvYmo6IE8sXG4gKiApID0+IEV4Y2x1ZGU8XG4gKiAgIHsgW0sgaW4ga2V5b2YgT106IEsgZXh0ZW5kcyBzdHJpbmcgPyBbSywgT1tLXV0gOiBuZXZlciB9W2tleW9mIE9dLFxuICogICB1bmRlZmluZWRcbiAqID5bXX0gVHlwZWRFbnRyaWVzXG4gKi8kaM2PX29uY2UuVFJVRShUUlVFKTtcbiAgICAgICBjb25zdCB0eXBlZEVudHJpZXMgPSAvKiogQHR5cGUge1R5cGVkRW50cmllc30gKi8gKE9iamVjdC5lbnRyaWVzKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7PFxuICogICBjb25zdCBFbnRyaWVzIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxyZWFkb25seSBbUHJvcGVydHlLZXksIHVua25vd25dPixcbiAqID4oXG4gKiAgIGVudHJpZXM6IEVudHJpZXMsXG4gKiApID0+IHsgW0VudHJ5IGluIEVudHJpZXNbbnVtYmVyXSBhcyBFbnRyeVswXV06IEVudHJ5WzFdIH19IEZyb21UeXBlZEVudHJpZXNcbiAqLyRozY9fb25jZS50eXBlZEVudHJpZXModHlwZWRFbnRyaWVzKTtcbiAgICAgICBjb25zdCBmcm9tVHlwZWRFbnRyaWVzID0gLyoqIEB0eXBlIHtGcm9tVHlwZWRFbnRyaWVzfSAqLyAoXG4gIE9iamVjdC5mcm9tRW50cmllc1xuKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7PEEgZXh0ZW5kcyB1bmtub3duW10sIFY+KFxuICogICBhcnI6IEEsXG4gKiAgIG1hcHBlcjogPEsgZXh0ZW5kcyBudW1iZXI+KGVsOiBBW0tdLCBpZHg6IEssIGFycjogQSkgPT4gVixcbiAqICkgPT4gVltdfSBUeXBlZE1hcFxuICovJGjNj19vbmNlLmZyb21UeXBlZEVudHJpZXMoZnJvbVR5cGVkRW50cmllcyk7XG4gICAgICAgY29uc3QgdHlwZWRNYXAgPSAvKiogQHR5cGUge1R5cGVkTWFwfSAqLyAoXG4gIEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLmJpbmQoQXJyYXkucHJvdG90eXBlLm1hcClcbik7JGjNj19vbmNlLnR5cGVkTWFwKHR5cGVkTWFwKTtcblxuICAgICAgIGNvbnN0IGxvZ0xldmVscyA9IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbXG4gICdkZWJ1ZycsXG4gICdsb2cnLFxuICAnaW5mbycsXG4gICd3YXJuJyxcbiAgJ2Vycm9yJyxcbl0pOyRozY9fb25jZS5sb2dMZXZlbHMobG9nTGV2ZWxzKTtcbk9iamVjdC5mcmVlemUobG9nTGV2ZWxzKTtcblxuLyoqIEB0eXBlZGVmIHsodHlwZW9mIGxvZ0xldmVscylba2V5b2YgbG9nTGV2ZWxzICYgbnVtYmVyXX0gTG9nTGV2ZWwgKi9cblxuLyoqIEB0eXBlZGVmIHtQaWNrPENvbnNvbGUsIExvZ0xldmVsPn0gTGltaXRlZENvbnNvbGUgKi9cblxuLyoqXG4gKiBEZWVwLWNvcHkgYSB2YWx1ZSBieSByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoIEpTT04gKHdoaWNoIGRyb3BzXG4gKiBmdW5jdGlvbi9zeW1ib2wvdW5kZWZpbmVkIHZhbHVlcyBhbmQgcHJvcGVydGllcyB0aGF0IGFyZSBub24tZW51bWVyYWJsZVxuICogYW5kL29yIHN5bWJvbC1rZXllZCwgYW5kIHJlamVjdHMgYmlnaW50IHZhbHVlcykuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gdmFsdWVcbiAqIEByZXR1cm5zIHtUfVxuICovXG4gICAgICAgY29uc3QgZGVlcENvcHlKc29uYWJsZSA9IHZhbHVlID0+IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj59IE9cbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nICYga2V5b2YgT30gS1xuICogQHRlbXBsYXRlIE1cbiAqIEBwYXJhbSB7T1tLXX0gdmFsdWVcbiAqIEBwYXJhbSB7SyB8IHVuZGVmaW5lZH0gbmFtZVxuICogQHBhcmFtIHtPIHwgdW5kZWZpbmVkfSBjb250YWluZXJcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW0tdLCBuYW1lOiBzdHJpbmcsIHJlY29yZDogTykgPT4gT1tLXSB8IE19IG1hcHBlclxuICogQHJldHVybnMge09bS10gfCBNIHwgeyBbSzIgaW4ga2V5b2YgT1tLXV06IE9bS11bSzJdIHwgTSB9fVxuICovJGjNj19vbmNlLmRlZXBDb3B5SnNvbmFibGUoZGVlcENvcHlKc29uYWJsZSk7XG5jb25zdCBkZWVwTWFwT2JqZWN0SW50ZXJuYWwgPSAodmFsdWUsIG5hbWUsIGNvbnRhaW5lciwgbWFwcGVyKSA9PiB7XG4gIGlmIChjb250YWluZXIgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgbWFwcGVkID0gbWFwcGVyKHZhbHVlLCBuYW1lLCBjb250YWluZXIpO1xuICAgIGlmIChtYXBwZWQgIT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gbWFwcGVkO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8ICF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGxldCB3YXNNYXBwZWQgPSBmYWxzZTtcbiAgY29uc3QgdmFsdWVPYmogPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpO1xuICAvKipcbiAqIEB0eXBlIHs8VCBleHRlbmRzIHR5cGVvZiB2YWx1ZSwgSzIgZXh0ZW5kcyBzdHJpbmcgJiBrZXlvZiBUPihcbiAqICAgZW50cnk6IFtLMiwgVFtLMl1dLFxuICogKSA9PiBbSzIsIFRbSzJdIHwgTV19XG4gKi9cbiAgY29uc3QgbWFwRW50cnkgPSAoW2lubmVyTmFtZSwgaW5uZXJWYWx1ZV0pID0+IHtcbiAgICBjb25zdCBtYXBwZWRJbm5lclZhbHVlID0gZGVlcE1hcE9iamVjdEludGVybmFsKFxuICAgICAgaW5uZXJWYWx1ZSxcbiAgICAgIGlubmVyTmFtZSxcbiAgICAgIHZhbHVlT2JqLFxuICAgICAgbWFwcGVyLFxuICAgICk7XG4gICAgd2FzTWFwcGVkIHx8PSBtYXBwZWRJbm5lclZhbHVlICE9PSBpbm5lclZhbHVlO1xuICAgIHJldHVybiBbaW5uZXJOYW1lLCAvKiogQHR5cGUge2FueX0gKi8gKG1hcHBlZElubmVyVmFsdWUpXTtcbiAgfTtcbiAgY29uc3QgbWFwcGVkRW50cmllcyA9IHR5cGVkRW50cmllcyh2YWx1ZU9iaikubWFwKG1hcEVudHJ5KTtcblxuICBpZiAoIXdhc01hcHBlZCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IG1hcHBlZE9iaiA9IGZyb21UeXBlZEVudHJpZXMobWFwcGVkRW50cmllcyk7XG4gIHJldHVybiAvKiogQHR5cGUge2FueX0gKi8gKG1hcHBlZE9iaik7XG59O1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlcyBhIHJlY29yZCBvYmplY3Qgc3RydWN0dXJlLCBjYWxsaW5nIGEgbWFwcGVyIGZ1bmN0aW9uXG4gKiBmb3IgZWFjaCBlbnVtZXJhYmxlIHN0cmluZy1rZXllZCBwcm9wZXJ0eSBhbmQgcmV0dXJuaW5nIGEgcmVjb3JkIGNvbXBvc2VkIG9mXG4gKiB0aGUgcmVzdWx0cy4gSWYgbm9uZSBvZiB0aGUgdmFsdWVzIGFyZSBjaGFuZ2VkLCB0aGUgb3JpZ2luYWwgb2JqZWN0IGlzXG4gKiByZXR1cm5lZCwgbWFpbnRhaW5pbmcgaXRzIGlkZW50aXR5LlxuICpcbiAqIFdoZW4gdGhlIHByb3BlcnR5IHZhbHVlIGlzIGFuIG9iamVjdCwgaXQgaXMgc2VudCB0byB0aGUgbWFwcGVyIGxpa2UgYW55IG90aGVyXG4gKiB2YWx1ZSwgYW5kIHRoZW4gcmVjdXJzaXZlbHkgdHJhdmVyc2VkIHVubGVzcyByZXBsYWNlZCB3aXRoIGEgZGlzdGluY3QgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gT1xuICogQHRlbXBsYXRlIE1cbiAqIEBwYXJhbSB7T30gb2JqXG4gKiBAcGFyYW0gezxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIEsgZXh0ZW5kcyBzdHJpbmcgJiBrZXlvZiBUPihcbiAqICAgdmFsdWU6IFRbS10sXG4gKiAgIG5hbWU6IEssXG4gKiAgIHJlY29yZDogVCxcbiAqICkgPT4gVFtLXSB8IE19IG1hcHBlclxuICogQHJldHVybnMge08gfCB7IFtLIGluIGtleW9mIE9dOiBLIGV4dGVuZHMgc3RyaW5nID8gT1tLXSB8IE0gOiBuZXZlciB9fVxuICovXG4gICAgICAgY29uc3QgZGVlcE1hcE9iamVjdCA9IChvYmosIG1hcHBlcikgPT5cbiAgLyoqIEB0eXBlIHthbnl9ICovIChkZWVwTWFwT2JqZWN0SW50ZXJuYWwob2JqLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbWFwcGVyKSk7XG5cbi8qKlxuICogRXhwbGljaXRseSBzZXQgYSBmdW5jdGlvbidzIG5hbWUsIHN1cHBvcnRpbmcgdXNlIG9mIGFycm93IGZ1bmN0aW9ucyBmb3Igd2hpY2hcbiAqIHNvdXJjZSB0ZXh0IGRvZXNuJ3QgaW5jbHVkZSBhIG5hbWUgYW5kIG5vIGluaXRpYWwgbmFtZSBpcyBzZXQgYnlcbiAqIE5hbWVkRXZhbHVhdGlvblxuICogaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvbXVsdGlwYWdlL3N5bnRheC1kaXJlY3RlZC1vcGVyYXRpb25zLmh0bWwjc2VjLXJ1bnRpbWUtc2VtYW50aWNzLW5hbWVkZXZhbHVhdGlvblxuICpcbiAqIGBuYW1lYCBpcyB0aGUgZmlyc3QgcGFyYW1ldGVyIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkgYXQgY2FsbCBzaXRlcyAoZS5nLixcbiAqIGByZXR1cm4gZGVmaW5lTmFtZSgnZm9vJywgKCkgPT4geyAuLi4gfSlgKS5cbiAqXG4gKiBAdGVtcGxhdGUge0Z1bmN0aW9ufSBGXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtGfSBmblxuICogQHJldHVybnMge0Z9XG4gKi8kaM2PX29uY2UuZGVlcE1hcE9iamVjdChkZWVwTWFwT2JqZWN0KTtcbiAgICAgICBjb25zdCBkZWZpbmVOYW1lID0gKG5hbWUsIGZuKSA9PlxuICBkZWZpbmVQcm9wZXJ0eShmbiwgJ25hbWUnLCB7IHZhbHVlOiBuYW1lIH0pO1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheVxuICogdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsIGBvYmplY3RNYXBNdXRhYmxlYFxuICogd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIGVudW1lcmFibGUgc3RyaW5nLWtleWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LlxuICpcbiAqIFVubGlrZSBlbmRvJ3MgYG9iamVjdE1hcGAsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5vbi1oYXJkZW5lZCBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gT1xuICogQHRlbXBsYXRlIE1cbiAqIEBwYXJhbSB7T30gb2JqXG4gKiBAcGFyYW0gezxLIGV4dGVuZHMga2V5b2YgTz4odmFsdWU6IE9bS10sIGtleTogSykgPT4gTX0gbWFwcGVyXG4gKiBAcmV0dXJucyB7eyBbSyBpbiBrZXlvZiBPXTogSyBleHRlbmRzIHN0cmluZyA/IE0gOiBuZXZlciB9fVxuICovJGjNj19vbmNlLmRlZmluZU5hbWUoZGVmaW5lTmFtZSk7XG4gICAgICAgY29uc3Qgb2JqZWN0TWFwTXV0YWJsZSA9IChvYmosIG1hcHBlcikgPT4ge1xuICBjb25zdCBvbGRFbnRyaWVzID0gdHlwZWRFbnRyaWVzKG9iaik7XG4gIC8qKiBAdHlwZSB7PEsgZXh0ZW5kcyBrZXlvZiBPPihlbnRyeTogW0ssIE9bS11dKSA9PiBbSywgTV19ICovXG4gIGNvbnN0IG1hcEVudHJ5ID0gKFtrLCB2XSkgPT4gW2ssIG1hcHBlcih2LCBrKV07XG4gIGNvbnN0IG5ld0VudHJpZXMgPSB0eXBlZE1hcChvbGRFbnRyaWVzLCBtYXBFbnRyeSk7XG4gIGNvbnN0IG5ld09iaiA9IGZyb21UeXBlZEVudHJpZXMobmV3RW50cmllcyk7XG4gIHJldHVybiAvKiogQHR5cGUge2FueX0gKi8gKG5ld09iaik7XG59O1xuXG4vKipcbiAqIE1hcCB0aGUgZWxlbWVudHMgb2YgYW4gYXJyYXkgdG8gbmV3IHZhbHVlcywgc2tpcHBpbmcgZWxlbWVudHMgZm9yIHdoaWNoIHRoZVxuICogbWFwcGluZyByZXN1bHRzIGluIGVpdGhlciBgdW5kZWZpbmVkYCBvciBgZmFsc2VgLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHBhcmFtIHtUW119IGFyclxuICogQHBhcmFtIHsodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycjogVFtdKSA9PiBVIHwgdW5kZWZpbmVkIHwgZmFsc2V9IG1hcE9yRHJvcFxuICogQHJldHVybnMge1VbXX1cbiAqLyRozY9fb25jZS5vYmplY3RNYXBNdXRhYmxlKG9iamVjdE1hcE11dGFibGUpO1xuICAgICAgIGNvbnN0IHBhcnRpYWxNYXAgPSAoYXJyLCBtYXBPckRyb3ApID0+XG4gIGFyci5yZWR1Y2UoKHJlc3VsdHMsIGVsLCBpLCBhcnJBcmcpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBtYXBPckRyb3AoZWwsIGksIGFyckFyZyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfSwgLyoqIEB0eXBlIHtVW119ICovIChbXSkpO1xuXG4vKipcbiAqIFJldHVybiB0aGUgdmFsdWUgZnJvbSBgbWFwYCBhc3NvY2lhdGVkIHdpdGggYGtleWAuIElmIHRoZXJlIGlzIG5vdCB5ZXQgc3VjaCBhXG4gKiB2YWx1ZSwgZ2V0IG9uZSBmcm9tIGBtYWtlVmFsdWUoa2V5KWAgYW5kIHVwZGF0ZSBgbWFwYCBiZWZvcmUgcmV0dXJuaW5nIHRoZVxuICogbmV3IHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtbS10gZXh0ZW5kcyBbV2Vha0tleV0gPyBXZWFrTWFwPEssIFY+IDogTWFwPEssIFY+fSBtYXBcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFZ9IG1ha2VWYWx1ZVxuICogQHJldHVybnMge1Z9XG4gKi8kaM2PX29uY2UucGFydGlhbE1hcChwYXJ0aWFsTWFwKTtcbiAgICAgICBjb25zdCBwcm92aWRlTGF6eU1hcCA9IChtYXAsIGtleSwgbWFrZVZhbHVlKSA9PiB7XG4gIGNvbnN0IGZvdW5kID0gbWFwLmdldChrZXkpO1xuICBpZiAoZm91bmQgIT09IHVuZGVmaW5lZCB8fCBtYXAuaGFzKGtleSkpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtWfSAqLyAoZm91bmQpO1xuICB9XG4gIGNvbnN0IHZhbHVlID0gbWFrZVZhbHVlKGtleSk7XG4gIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdXNlcyBhIG1pbGxpc2Vjb25kLWJhc2VkIGN1cnJlbnQtdGltZSBjYXBhYmlsaXR5XG4gKiAoc3VjaCBhcyBgcGVyZm9ybWFuY2Uubm93YCkgdG8gbWVhc3VyZSBleGVjdXRpb24gZHVyYXRpb24gb2YgYW4gYXN5bmNcbiAqIGZ1bmN0aW9uIGFuZCByZXBvcnQgdGhlIHJlc3VsdCBpbiBzZWNvbmRzIHRvIG1hdGNoIG91ciB0ZWxlbWV0cnkgc3RhbmRhcmQuXG4gKlxuICogQHBhcmFtIHsoKSA9PiBudW1iZXJ9IGN1cnJlbnRUaW1lTWlsbGlzZWNcbiAqLyRozY9fb25jZS5wcm92aWRlTGF6eU1hcChwcm92aWRlTGF6eU1hcCk7XG4gICAgICAgY29uc3QgbWFrZU1lYXN1cmVTZWNvbmRzID0gY3VycmVudFRpbWVNaWxsaXNlYyA9PiB7XG4gIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gZm5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHsgcmVzdWx0OiBUOyBkdXJhdGlvbjogbnVtYmVyIH0+fVxuICovXG4gIGNvbnN0IG1lYXN1cmVTZWNvbmRzID0gYXN5bmMgZm4gPT4ge1xuICAgIGNvbnN0IHQwID0gY3VycmVudFRpbWVNaWxsaXNlYygpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKCk7XG4gICAgY29uc3QgZHVyYXRpb25NaWxsaXNlYyA9IGN1cnJlbnRUaW1lTWlsbGlzZWMoKSAtIHQwO1xuICAgIHJldHVybiB7IHJlc3VsdCwgZHVyYXRpb246IGR1cmF0aW9uTWlsbGlzZWMgLyAxMDAwIH07XG4gIH07XG4gIHJldHVybiBtZWFzdXJlU2Vjb25kcztcbn07XG5cbi8qKlxuICogRmluZCBhbGwgb2YgYW4gb2JqZWN0J3MgcHJvcGVydGllcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGEgcHJlZml4LCBhbmRcbiAqIHJldHVybiBhIG5ldyBvYmplY3QgY29uc2lzdGluZyBvZiB0aG9zZSBwcm9wZXJ0aWVzIHdpdGhvdXQgdGhhdCBwcmVmaXguXG4gKiBVc2VmdWwgZm9yIGZpbHRlcmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsZXZhbnQgdG8gYSBwYXJ0aWN1bGFyIHB1cnBvc2UuXG4gKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFBcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtSZWNvcmQ8YCR7UH0ke0t9YCwgVj59IG9ialxuICogQHBhcmFtIHtQfSBwcmVmaXhcbiAqLyRozY9fb25jZS5tYWtlTWVhc3VyZVNlY29uZHMobWFrZU1lYXN1cmVTZWNvbmRzKTtcbiAgICAgICBjb25zdCB1bnByZWZpeGVkUHJvcGVydGllcyA9IChvYmosIHByZWZpeCkgPT5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8SywgVj59ICovIChcbiAgICBmcm9tVHlwZWRFbnRyaWVzKFxuICAgICAgdHlwZWRFbnRyaWVzKG9iailcbiAgICAgICAgLmZpbHRlcigoW2tleV0pID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleS5zbGljZShwcmVmaXgubGVuZ3RoKSwgdmFsdWVdKSxcbiAgICApXG4gICk7JGjNj19vbmNlLnVucHJlZml4ZWRQcm9wZXJ0aWVzKHVucHJlZml4ZWRQcm9wZXJ0aWVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRSVUUiOlsiVFJVRSJdLCJ0eXBlZEVudHJpZXMiOlsidHlwZWRFbnRyaWVzIl0sImZyb21UeXBlZEVudHJpZXMiOlsiZnJvbVR5cGVkRW50cmllcyJdLCJ0eXBlZE1hcCI6WyJ0eXBlZE1hcCJdLCJsb2dMZXZlbHMiOlsibG9nTGV2ZWxzIl0sImRlZXBDb3B5SnNvbmFibGUiOlsiZGVlcENvcHlKc29uYWJsZSJdLCJkZWVwTWFwT2JqZWN0IjpbImRlZXBNYXBPYmplY3QiXSwiZGVmaW5lTmFtZSI6WyJkZWZpbmVOYW1lIl0sIm9iamVjdE1hcE11dGFibGUiOlsib2JqZWN0TWFwTXV0YWJsZSJdLCJwYXJ0aWFsTWFwIjpbInBhcnRpYWxNYXAiXSwicHJvdmlkZUxhenlNYXAiOlsicHJvdmlkZUxhenlNYXAiXSwibWFrZU1lYXN1cmVTZWNvbmRzIjpbIm1ha2VNZWFzdXJlU2Vjb25kcyJdLCJ1bnByZWZpeGVkUHJvcGVydGllcyI6WyJ1bnByZWZpeGVkUHJvcGVydGllcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAi9VLVrAcAAKwHAAAoAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2tleU1pcnJvci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsia2V5TWlycm9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG5cbmNvbnN0IHsgZnJlZXplLCBlbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPiAmIFJlY29yZDxFeGNsdWRlPFByb3BlcnR5S2V5LCBzdHJpbmc+LCBuZXZlcj59IEluaXRcbiAqIEB0eXBlZGVmIHt7IHJlYWRvbmx5IFtLIGluIGtleW9mIEluaXRdOiBLIH19IEtleU1pcnJvclJlc3VsdFxuICovXG5cbi8qKlxuICogTWlycm9yIHRoZSBrZXlzIG9mIGFuIG9iamVjdCB0byBzdHJpbmcgdmFsdWVzIHRoYXQgbWF0Y2ggdGhlIGtleSBuYW1lcy4gVGhpc1xuICogd29ya3Mgd2VsbCB0byBkZWZpbmUgYSBUeXBlU2NyaXB0IGVudW0gdHlwZSBjb21wYXRpYmxlIHdpdGggZXJhc2FibGUgc3ludGF4OlxuICpcbiAqICAgIGBAZW51bSB7KHR5cGVvZiBNeUVudW0pW2tleW9mIHR5cGVvZiBNeUVudW1dfWBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgcmVjb3JkIG11c3Qgb25seSBtYXAgcHJvcGVydHkgbmFtZXMgdG8gZWl0aGVyIGBudWxsYCBvciB0aGVcbiAqIHByb3BlcnR5IG5hbWUgaXRzZWxmLiBUaGUgcmV0dXJuZWQgb2JqZWN0IGhhcyBpZGVudGljYWwga2V5cyB3aG9zZSB2YWx1ZXMgYXJlXG4gKiB0aGUgc3RyaW5nIGZvcm0gb2YgdGhlIGtleS5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ICYgUmVjb3JkPEV4Y2x1ZGU8UHJvcGVydHlLZXksIHN0cmluZz4sIG5ldmVyPn0gSW5pdFxuICogQHBhcmFtIHtJbml0ICYgeyByZWFkb25seSBbSyBpbiBrZXlvZiBJbml0XTogSW5pdFtLXSBleHRlbmRzIG51bGwgPyBudWxsIDogSyB9fSByZWNvcmRcbiAqIEByZXR1cm5zIHtLZXlNaXJyb3JSZXN1bHQ8SW5pdD59XG4gKi9cbiAgICAgICBjb25zdCBrZXlNaXJyb3IgPSByZWNvcmQgPT4ge1xuICBpZiAocmVjb3JkID09PSBudWxsIHx8IHR5cGVvZiByZWNvcmQgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdrZXlNaXJyb3IgZXhwZWN0cyBhIHJlY29yZCBvZiBzdHJpbmcga2V5cy4nKTtcbiAgfVxuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3QgbWlycm9yZWQgPSB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBSZWNvcmQgY29uZnVzZWQgYnkgbnVsbCBwcm90b3R5cGUqL1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgfTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcyhyZWNvcmQpKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSBrZXkpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcihcbiAgICAgICAgYFZhbHVlIGZvciBrZXkgXCIke2tleX1cIiBtdXN0IGJlIG51bGwgb3IgdGhlIGtleSBzdHJpbmc7IGdvdCAke1N0cmluZyh2YWx1ZSl9LmAsXG4gICAgICApO1xuICAgIH1cbiAgICBtaXJyb3JlZFtrZXldID0ga2V5O1xuICB9XG4gIHJldHVybiAvKiogQHR5cGUge0tleU1pcnJvclJlc3VsdDxJbml0Pn0gKi8gKGZyZWV6ZShtaXJyb3JlZCkpO1xufTskaM2PX29uY2Uua2V5TWlycm9yKGtleU1pcnJvcik7XG5cbmZyZWV6ZShrZXlNaXJyb3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsia2V5TWlycm9yIjpbImtleU1pcnJvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAClbB70VS0AAFUtAAAvAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vcGF0dGVybnMiLCJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzIiwiLi9jYWxsYmFjay5qcyJdLCJleHBvcnRzIjpbIlN0cmVhbUNlbGxTaGFwZSIsImFzc2VydFBhdGhTZWdtZW50IiwiaXNTdHJlYW1DZWxsIiwibWFrZUNoYWluU3RvcmFnZVJvb3QiLCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIiwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiLCJwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRSxGYXIsTSxtYWtlSGVhcFpvbmUsY2I7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzXCIsIFtbXCJtYWtlSGVhcFpvbmVcIixbJGjNj19hID0+IChtYWtlSGVhcFpvbmUgPSAkaM2PX2EpXV1dXSxbXCIuL2NhbGxiYWNrLmpzXCIsIFtbXCIqXCIsWyRozY9fYSA9PiAoY2IgPSAkaM2PX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlQ2hhaW5TdG9yYWdlUm9vdCwnbmFtZScse3ZhbHVlOlwibWFrZUNoYWluU3RvcmFnZVJvb3RcIn0pOyRozY9fb25jZS5tYWtlQ2hhaW5TdG9yYWdlUm9vdChtYWtlQ2hhaW5TdG9yYWdlUm9vdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VTdG9yYWdlTm9kZUNoaWxkLCduYW1lJyx7dmFsdWU6XCJtYWtlU3RvcmFnZU5vZGVDaGlsZFwifSk7JGjNj19vbmNlLm1ha2VTdG9yYWdlTm9kZUNoaWxkKG1ha2VTdG9yYWdlTm9kZUNoaWxkKTtcblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7TWFyc2hhbCwgUGFzc2FibGV9IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICogQGltcG9ydCB7UmVtb3RlLCBFUmVtb3RlLCBUeXBlZFBhdHRlcm59IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7RU1hcnNoYWxsZXJ9IGZyb20gJy4vbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMnO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICogQGltcG9ydCB7Q2FsbGJhY2t9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKiBAdHlwZWRlZiB7TWFyc2hhbDx1bmtub3duPn0gTWFyc2hhbGxlciAqL1xuLyoqIEB0eXBlZGVmIHtQaWNrPE1hcnNoYWxsZXIsICdmcm9tQ2FwRGF0YSc+fSBVbnNlcmlhbGl6ZXIgKi9cblxuLyoqXG4gKiBEZWZpbmVkIGJ5IHZzdG9yYWdlU3RvcmVLZXkgaW4gdnN0b3JhZ2UuZ29cbiAqXG4gKiBAdHlwZWRlZiBWU3RvcmFnZUtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlU3Via2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YVByZWZpeEJ5dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vRGF0YVZhbHVlXVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAdHlwZWRlZiBTdHJlYW1DZWxsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYmxvY2tIZWlnaHQgY29ycmVzcG9uZGluZyB3aXRoIHRoZSB3cml0ZSBvZiBgdmFsdWVzYFxuICogICAoZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiBhIG5hdHVyYWwgbnVtYmVyKVxuICogQHByb3BlcnR5IHtUW119IHZhbHVlc1xuICovXG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFN0cmVhbUNlbGw+fSAqL1xuICAgICAgIGNvbnN0IFN0cmVhbUNlbGxTaGFwZSA9IGhhcmRlbih7XG4gIGJsb2NrSGVpZ2h0OiBNLnN0cmluZygpLFxuICB2YWx1ZXM6IE0uYXJyYXkoKSxcbn0pO1xuXG4vKipcbiAqIFRoaXMgcmVwcmVzZW50cyBhIG5vZGUgaW4gYW4gSUFWTCB0cmVlLlxuICpcbiAqIFRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgeC92c3RvcmFnZSwgYW4gQWdvcmljIGV4dGVuc2lvbiBvZiB0aGUgQ29zbW9zXG4gKiBTREsuXG4gKlxuICogVnN0b3JhZ2UgaXMgYSBoaWVyYXJjaGljYWwgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmFnZSBzdHJ1Y3R1cmUgdGhhdFxuICogaWRlbnRpZmllcyBjaGlsZHJlbiBieSByZXN0cmljdGVkIEFTQ0lJIG5hbWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhcmJpdHJhcnlcbiAqIHN0cmluZy12YWx1ZWQgZGF0YSBmb3IgZWFjaCBub2RlLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmFnZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KGRhdGE6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gc2V0VmFsdWUgcHVibGlzaGVzIHNvbWUgZGF0YVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldFBhdGggdGhlIGNoYWluIHN0b3JhZ2UgcGF0aCBhdCB3aGljaCB0aGUgbm9kZSB3YXNcbiAqICAgY29uc3RydWN0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleT59IGdldFN0b3JlS2V5IERFUFJFQ0FURUQgdXNlIGdldFBhdGhcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBzdWJQYXRoOiBzdHJpbmcsXG4gKiAgIG9wdGlvbnM/OiB7IHNlcXVlbmNlPzogYm9vbGVhbiB9LFxuICogKSA9PiBTdG9yYWdlTm9kZX0gbWFrZUNoaWxkTm9kZVxuICovJGjNj19vbmNlLlN0cmVhbUNlbGxTaGFwZShTdHJlYW1DZWxsU2hhcGUpO1xuXG5jb25zdCBDaGFpblN0b3JhZ2VOb2RlSSA9IE0uaW50ZXJmYWNlKCdTdG9yYWdlTm9kZScsIHtcbiAgc2V0VmFsdWU6IE0uY2FsbFdoZW4oTS5zdHJpbmcoKSkucmV0dXJucygpLFxuICBnZXRQYXRoOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICBnZXRTdG9yZUtleTogTS5jYWxsV2hlbigpLnJldHVybnMoTS5yZWNvcmQoKSksXG4gIG1ha2VDaGlsZE5vZGU6IE0uY2FsbChNLnN0cmluZygpKVxuICAgIC5vcHRpb25hbChNLnNwbGl0UmVjb3JkKHt9LCB7IHNlcXVlbmNlOiBNLmJvb2xlYW4oKSB9LCB7fSkpXG4gICAgLnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJykpLFxufSk7XG5cbi8qKlxuICogVGhpcyBpcyBhbiBpbXBlcmZlY3QgaGV1cmlzdGljIHRvIG5hdmlnYXRlIHRoZSBtaWdyYXRpb24gZnJvbSB2YWx1ZSBjZWxscyB0b1xuICogc3RyZWFtIGNlbGxzLiBBdCB0aW1lIG9mIHdyaXRpbmcsIG5vIGxlZ2FjeSBjZWxscyBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIGFcbiAqIHN0cmVhbSBjZWxsLCBhbmQgd2UgZG8gbm90IGludGVuZCB0byBjcmVhdGUgYW55IG1vcmUgbGVnYWN5IHZhbHVlIGNlbGxzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBjZWxsXG4gKiBAcmV0dXJucyB7Y2VsbCBpcyBTdHJlYW1DZWxsfVxuICovXG4gICAgICAgY29uc3QgaXNTdHJlYW1DZWxsID0gY2VsbCA9PlxuICBjZWxsICYmXG4gIHR5cGVvZiBjZWxsID09PSAnb2JqZWN0JyAmJlxuICBBcnJheS5pc0FycmF5KGNlbGwudmFsdWVzKSAmJlxuICB0eXBlb2YgY2VsbC5ibG9ja0hlaWdodCA9PT0gJ3N0cmluZycgJiZcbiAgL14wJHxeWzEtOV1bMC05XSokLy50ZXN0KGNlbGwuYmxvY2tIZWlnaHQpOyRozY9fb25jZS5pc1N0cmVhbUNlbGwoaXNTdHJlYW1DZWxsKTtcbmhhcmRlbihpc1N0cmVhbUNlbGwpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZEZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8c3RyaW5nPn0gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZVxuICogICBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHtTdG9yYWdlTm9kZVsnZ2V0U3RvcmVLZXknXX0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoKSA9PiBVbnNlcmlhbGl6ZXJ9IGdldFVuc2VyaWFsaXplciBnZXQgdGhlIHVuc2VyaWFsaXplciBmb3IgdGhlXG4gKiAgIHN0b3JlZCBkYXRhXG4gKi9cblxuLyogVE9ETzogRm9ybWFsaXplIHNlZ21lbnQgY29uc3RyYWludHMuKi9cbi8qIE11c3QgYmUgbm9uZW1wdHkgYW5kIGRpc2FsbG93ICh1bmVzY2FwZWQpIGAuYCwgYW5kIGZvciBzaW1wbGljaXR5Ki9cbi8qIChhbmQgZnV0dXJlIHBvc3NpYmlsaXR5IG9mIGUuZy4gZXNjYXBpbmcpIHdlIGN1cnJlbnRseSBsaW1pdCB0byovXG4vKiBBU0NJSSBhbHBoYW51bWVyaWMgcGx1cyB1bmRlcnNjb3JlIGFuZCBkYXNoLiovXG4vKiBTaG91bGQgcmVtYWluIGNvbnNpc3RlbnQgd2l0aCBnb2xhbmcvY29zbW9zL3gvdnN0b3JhZ2UvdHlwZXMvcGF0aF9rZXlzLmdvKi9cbmNvbnN0IHBhdGhTZWdtZW50UGF0dGVybiA9IC9eW2EtekEtWjAtOV8tXXsxLDEwMH0kLztcblxuLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nKSA9PiB2b2lkfSAqL1xuICAgICAgIGNvbnN0IGFzc2VydFBhdGhTZWdtZW50ID0gbmFtZSA9PiB7XG4gIHBhdGhTZWdtZW50UGF0dGVybi50ZXN0KG5hbWUpIHx8XG4gICAgRmFpbGBQYXRoIHNlZ21lbnQgbmFtZXMgbXVzdCBjb25zaXN0IG9mIDEgdG8gMTAwIGNoYXJhY3RlcnMgbGltaXRlZCB0byBBU0NJSSBhbHBoYW51bWVyaWNzLCB1bmRlcnNjb3JlcywgYW5kL29yIGRhc2hlczogJHtuYW1lfWA7XG59OyRozY9fb25jZS5hc3NlcnRQYXRoU2VnbWVudChhc3NlcnRQYXRoU2VnbWVudCk7XG5oYXJkZW4oYXNzZXJ0UGF0aFNlZ21lbnQpO1xuXG4vKipcbiAqIE11c3QgbWF0Y2ggdGhlIHN3aXRjaCBpbiB2c3RvcmFnZS5nbyB1c2luZyBgdnN0b3JhZ2VNZXNzYWdlYCB0eXBlXG4gKlxuICogQHR5cGVkZWYgeydnZXQnXG4gKiAgIHwgJ2dldFN0b3JlS2V5J1xuICogICB8ICdoYXMnXG4gKiAgIHwgJ2NoaWxkcmVuJ1xuICogICB8ICdlbnRyaWVzJ1xuICogICB8ICd2YWx1ZXMnXG4gKiAgIHwgJ3NpemUnfSBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZFxuICpcbiAqXG4gKiBAdHlwZWRlZiB7J3NldCcgfCAnc2V0V2l0aG91dE5vdGlmeScgfCAnYXBwZW5kJ30gU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlTWV0aG9kXG4gKlxuICpcbiAqIEB0eXBlZGVmIHtTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZFxuICogICB8IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZH0gU3RvcmFnZU1lc3NhZ2VNZXRob2RcbiAqXG4gKlxuICogQHR5cGVkZWYge1twYXRoOiBzdHJpbmddfSBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZUFyZ3NcbiAqXG4gKiBAdHlwZWRlZiB7W3BhdGg6IHN0cmluZywgdmFsdWU/OiBzdHJpbmcgfCBudWxsXX0gU3RvcmFnZUVudHJ5XG4gKlxuICogQHR5cGVkZWYge1N0b3JhZ2VFbnRyeVtdfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VBcmdzXG4gKlxuICogQHR5cGVkZWYge3tcbiAqICAgICAgIG1ldGhvZDogU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VNZXRob2Q7XG4gKiAgICAgICBhcmdzOiBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZUFyZ3M7XG4gKiAgICAgfVxuICogICB8IHtcbiAqICAgICAgIG1ldGhvZDogU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlTWV0aG9kO1xuICogICAgICAgYXJnczogU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlQXJncztcbiAqICAgICB9fSBTdG9yYWdlTWVzc2FnZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtab25lfSB6b25lXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSA9IHpvbmUgPT4ge1xuICAvKipcbiAqIENyZWF0ZSBhIHN0b3JhZ2Ugbm9kZSBmb3IgYSBnaXZlbiBiYWNraW5nIHN0b3JhZ2UgaW50ZXJmYWNlIGFuZCBwYXRoLlxuICpcbiAqIEBwYXJhbSB7Q2FsbGJhY2s8KG1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlKSA9PiBhbnk+fSBtZXNzZW5nZXIgYSBjYWxsYmFja1xuICogICBmb3Igc2VuZGluZyBhIHN0b3JhZ2VNZXNzYWdlIG9iamVjdCB0byB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiAoY2YuXG4gKiAgIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS92c3RvcmFnZS5nbylcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNlcXVlbmNlXSBzZXQgdmFsdWVzIHdpdGggYGFwcGVuZGAgbWVzc2FnZXNcbiAqICAgcmF0aGVyIHRoYW4gYHNldGAgbWVzc2FnZXMgc28gdGhlIGJhY2tpbmcgaW1wbGVtZW50YXRpb24gZW1wbG95cyBhXG4gKiAgIHdyYXBwaW5nIHN0cnVjdHVyZSB0aGF0IHByZXNlcnZlcyBlYWNoIHZhbHVlIHNldCB3aXRoaW4gYSBzaW5nbGUgYmxvY2suXG4gKiAgIENoaWxkIG5vZGVzIGRlZmF1bHQgdG8gaW5oZXJpdGluZyB0aGlzIG9wdGlvbiBmcm9tIHRoZWlyIHBhcmVudC5cbiAqIEByZXR1cm5zIHtTdG9yYWdlTm9kZX1cbiAqL1xuICBjb25zdCBtYWtlQ2hhaW5TdG9yYWdlTm9kZSA9IHpvbmUuZXhvQ2xhc3MoXG4gICAgJ0NoYWluU3RvcmFnZU5vZGUnLFxuICAgIENoYWluU3RvcmFnZU5vZGVJLFxuICAgIC8qKlxuICogQHBhcmFtIHtDYWxsYmFjazwobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueT59IG1lc3NlbmdlclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VxdWVuY2VdXG4gKi9cbiAgICAobWVzc2VuZ2VyLCBwYXRoLCB7IHNlcXVlbmNlID0gZmFsc2UgfSA9IHt9KSA9PiB7XG4gICAgICBhc3NlcnQudHlwZW9mKHBhdGgsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydC50eXBlb2Yoc2VxdWVuY2UsICdib29sZWFuJyk7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgcGF0aCwgbWVzc2VuZ2VyLCBzZXF1ZW5jZSB9KTtcbiAgICB9LFxuICAgIHtcbiAgICAgIGdldFBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnBhdGg7XG4gICAgICB9LFxuICAgICAgLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UGF0aFxuICogQHR5cGUgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fVxuICovXG4gICAgICBhc3luYyBnZXRTdG9yZUtleSgpIHtcbiAgICAgICAgY29uc3QgeyBwYXRoLCBtZXNzZW5nZXIgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIHJldHVybiBjYi5jYWxsRShtZXNzZW5nZXIsIHtcbiAgICAgICAgICBtZXRob2Q6ICdnZXRTdG9yZUtleScsXG4gICAgICAgICAgYXJnczogW3BhdGhdLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAqIEB0eXBlIHsoXG4gKiAgIG5hbWU6IHN0cmluZyxcbiAqICAgY2hpbGROb2RlT3B0aW9ucz86IHsgc2VxdWVuY2U/OiBib29sZWFuIH0sXG4gKiApID0+IFN0b3JhZ2VOb2RlfVxuICovXG4gICAgICBtYWtlQ2hpbGROb2RlKG5hbWUsIGNoaWxkTm9kZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNlcXVlbmNlLCBwYXRoLCBtZXNzZW5nZXIgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGFzc2VydFBhdGhTZWdtZW50KG5hbWUpO1xuICAgICAgICBjb25zdCBtZXJnZWRPcHRpb25zID0geyBzZXF1ZW5jZSwgLi4uY2hpbGROb2RlT3B0aW9ucyB9O1xuICAgICAgICByZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGUoXG4gICAgICAgICAgbWVzc2VuZ2VyLFxuICAgICAgICAgIGAke3BhdGh9LiR7bmFtZX1gLFxuICAgICAgICAgIG1lcmdlZE9wdGlvbnMsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgLyoqIEB0eXBlIHsodmFsdWU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gKi9cbiAgICAgIGFzeW5jIHNldFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgc2VxdWVuY2UsIHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZih2YWx1ZSwgJ3N0cmluZycpO1xuICAgICAgICAvKiogQHR5cGUge1N0b3JhZ2VFbnRyeX0gKi9cbiAgICAgICAgbGV0IGVudHJ5O1xuICAgICAgICBpZiAoIXNlcXVlbmNlICYmICF2YWx1ZSkge1xuICAgICAgICAgIGVudHJ5ID0gW3BhdGhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudHJ5ID0gW3BhdGgsIHZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjYi5jYWxsRShtZXNzZW5nZXIsIHtcbiAgICAgICAgICBtZXRob2Q6IHNlcXVlbmNlID8gJ2FwcGVuZCcgOiAnc2V0JyxcbiAgICAgICAgICBhcmdzOiBbZW50cnldLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8qIFBvc3NpYmxlIGV4dGVuc2lvbnM6Ki9cbiAgICAgIC8qICogZ2V0VmFsdWUoKSovXG4gICAgICAvKiAqIGdldENoaWxkTmFtZXMoKSBhbmQvb3IgbWFrZUNoaWxkTm9kZXMoKSovXG4gICAgICAvKiAqIGdldE5hbWUoKSovXG4gICAgICAvKiAqIHJlY3Vyc2l2ZSBkZWxldGUqL1xuICAgICAgLyogKiBiYXRjaCBvcGVyYXRpb25zKi9cbiAgICAgIC8qICogbG9jYWwgYnVmZmVyaW5nICh3aXRoIGVuZC1vZi1ibG9jayBjb21taXQpKi9cbiAgICB9LFxuICApO1xuICByZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGU7XG59OyRozY9fb25jZS5wcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZShwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSk7XG5cbmNvbnN0IG1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZSA9IHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKG1ha2VIZWFwWm9uZSgpKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBoZWFwLWJhc2VkIHJvb3Qgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgZnVuY3Rpb24gYW5kIHJvb3RcbiAqIHBhdGguXG4gKlxuICogQHBhcmFtIHsobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueX0gaGFuZGxlU3RvcmFnZU1lc3NhZ2UgYSBmdW5jdGlvbiBmb3JcbiAqICAgc2VuZGluZyBhIHN0b3JhZ2VNZXNzYWdlIG9iamVjdCB0byB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiAoY2YuXG4gKiAgIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS92c3RvcmFnZS5nbylcbiAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtyb290T3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jvb3RPcHRpb25zLnNlcXVlbmNlXSBlbXBsb3kgYSB3cmFwcGluZyBzdHJ1Y3R1cmUgdGhhdFxuICogICBwcmVzZXJ2ZXMgZWFjaCB2YWx1ZSBzZXQgd2l0aGluIGEgc2luZ2xlIGJsb2NrLCBhbmQgZGVmYXVsdCBjaGlsZCBub2RlcyB0b1xuICogICBkbyB0aGUgc2FtZVxuICovXG4gICAgICAgZnVuY3Rpb24gbWFrZUNoYWluU3RvcmFnZVJvb3QoXG4gIGhhbmRsZVN0b3JhZ2VNZXNzYWdlLFxuICByb290UGF0aCxcbiAgcm9vdE9wdGlvbnMgPSB7fSxcbikge1xuICBjb25zdCBtZXNzZW5nZXIgPSBjYi5tYWtlRnVuY3Rpb25DYWxsYmFjayhoYW5kbGVTdG9yYWdlTWVzc2FnZSk7XG5cbiAgLyogVXNlIHRoZSBoZWFwWm9uZSBkaXJlY3RseS4qL1xuICBjb25zdCByb290Tm9kZSA9IG1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZShtZXNzZW5nZXIsIHJvb3RQYXRoLCByb290T3B0aW9ucyk7XG4gIHJldHVybiByb290Tm9kZTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7U3RvcmFnZU5vZGV9IGFuIG9iamVjdCB0aGF0IGNvbmZpcm1zIHRvIFN0b3JhZ2VOb2RlIEFQSSBidXQgZG9lc1xuICogICBub3Qgc3RvcmUgYW55d2hlcmUuXG4gKi9cbmNvbnN0IG1ha2VOdWxsU3RvcmFnZU5vZGUgPSAoKSA9PiB7XG4gIC8qIFhYWCByZS11c2UgXCJDaGFpblN0b3JhZ2VcIiBtZXRob2RzIGFib3ZlIHdoaWNoIGRvbid0IGFjdHVhbGx5IGRlcGVuZCBvbiBjaGFpbnMqL1xuICByZXR1cm4gbWFrZUNoYWluU3RvcmFnZVJvb3QoXG4gICAgRmFyKCdOdWxsTWVzc2VuZ2VyJywgKCkgPT4gbnVsbCksXG4gICAgJ251bGwnLFxuICApO1xufTtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcmV0dXJuaW5nIGEgc3RvcmFnZSBub2RlIGF0IG9yIHVuZGVyIGl0cyBpbnB1dCxcbiAqIGZhbGxpbmcgYmFjayB0byBhbiBpbmVydCBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnRlcmZhY2UgKGJ1dCBpbmNvbXBsZXRlXG4gKiBiZWhhdmlvcikgd2hlbiB0aGF0IGlzIHVuYXZhaWxhYmxlLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxSZW1vdGU8U3RvcmFnZU5vZGU+IHwgbnVsbD59IHN0b3JhZ2VOb2RlUmVmXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hpbGROYW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZW1vdGU8U3RvcmFnZU5vZGU+Pn1cbiAqL1xuICAgICAgIGFzeW5jIGZ1bmN0aW9uIG1ha2VTdG9yYWdlTm9kZUNoaWxkKHN0b3JhZ2VOb2RlUmVmLCBjaGlsZE5hbWUpIHtcbiAgY29uc3QgZXhpc3RpbmdTdG9yYWdlTm9kZSA9IGF3YWl0IHN0b3JhZ2VOb2RlUmVmO1xuICBjb25zdCBzdG9yYWdlTm9kZSA9IGV4aXN0aW5nU3RvcmFnZU5vZGUgfHwgbWFrZU51bGxTdG9yYWdlTm9kZSgpO1xuICByZXR1cm4gRShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZE5hbWUpO1xufVxuaGFyZGVuKG1ha2VTdG9yYWdlTm9kZUNoaWxkKTtcblxuLyogVE9ETyBmaW5kIGEgYmV0dGVyIG1vZHVsZSBmb3IgdGhpcyovXG4vKipcbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7KHZhbHVlOiBQYXNzYWJsZSkgPT4gUHJvbWlzZTx2b2lkPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpID0+IHtcbiAgcmV0dXJuIGFzeW5jIHZhbHVlID0+IHtcbiAgICBjb25zdCBtYXJzaGFsbGVkID0gYXdhaXQgRShtYXJzaGFsbGVyKS50b0NhcERhdGEodmFsdWUpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShtYXJzaGFsbGVkKTtcbiAgICByZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG4gIH07XG59OyRozY9fb25jZS5tYWtlU2VyaWFsaXplVG9TdG9yYWdlKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiU3RyZWFtQ2VsbFNoYXBlIjpbIlN0cmVhbUNlbGxTaGFwZSJdLCJpc1N0cmVhbUNlbGwiOlsiaXNTdHJlYW1DZWxsIl0sImFzc2VydFBhdGhTZWdtZW50IjpbImFzc2VydFBhdGhTZWdtZW50Il0sInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIjpbInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sIm1ha2VDaGFpblN0b3JhZ2VSb290IjpbIm1ha2VDaGFpblN0b3JhZ2VSb290Il0sIm1ha2VTdG9yYWdlTm9kZUNoaWxkIjpbIm1ha2VTdG9yYWdlTm9kZUNoaWxkIl0sIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiOlsibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAjRXL6pwMAAKcDAAA3AAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvaW5hY2Nlc3NpYmxlLXZhbC5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlSW5hY2Nlc3NpYmxlVmFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbmNvbnN0IGlmYWNlQWxsZWdlZFByZWZpeCA9ICdBbGxlZ2VkOiAnO1xuY29uc3QgaWZhY2VJbmFjY2Vzc2libGVQcmVmaXggPSAnU0VWRVJFRDogJztcbi8qKlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGlmYWNlXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG4gICAgICAgY29uc3QgbWFrZUluYWNjZXNzaWJsZVZhbCA9IGlmYWNlID0+IHtcbiAgaWYgKHR5cGVvZiBpZmFjZSA9PT0gJ3N0cmluZycgJiYgaWZhY2Uuc3RhcnRzV2l0aChpZmFjZUFsbGVnZWRQcmVmaXgpKSB7XG4gICAgaWZhY2UgPSBpZmFjZS5zbGljZShpZmFjZUFsbGVnZWRQcmVmaXgubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gRmFyKGAke2lmYWNlSW5hY2Nlc3NpYmxlUHJlZml4fSR7aWZhY2V9YCwge30pO1xufTskaM2PX29uY2UubWFrZUluYWNjZXNzaWJsZVZhbChtYWtlSW5hY2Nlc3NpYmxlVmFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VJbmFjY2Vzc2libGVWYWwiOlsibWFrZUluYWNjZXNzaWJsZVZhbCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACkg8+esQMAALEDAAAwAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvcHVyZS1kYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJwdXJlRGF0YU1hcnNoYWxsZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDYXBEYXRhfSBmcm9tICdAZW5kby9tYXJzaGFsJztcbiAqL1xuXG4vKiogQHBhcmFtIHtDYXBEYXRhPHVua25vd24+fSBjYXAgKi9cbmNvbnN0IHJlamVjdE9DYXAgPSBjYXAgPT4gRmFpbGAke2NhcH0gaXMgbm90IHB1cmUgZGF0YWA7XG4gICAgICAgY29uc3QgcHVyZURhdGFNYXJzaGFsbGVyID0gbWFrZU1hcnNoYWwocmVqZWN0T0NhcCwgcmVqZWN0T0NhcCwge1xuICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnc21hbGxjYXBzJyxcbn0pOyRozY9fb25jZS5wdXJlRGF0YU1hcnNoYWxsZXIocHVyZURhdGFNYXJzaGFsbGVyKTtcbmhhcmRlbihwdXJlRGF0YU1hcnNoYWxsZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHVyZURhdGFNYXJzaGFsbGVyIjpbInB1cmVEYXRhTWFyc2hhbGxlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADWXTPe5TwAAOU8AAA2AAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NhY2hlLW1hcCIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9mYXIiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIi4vaW5hY2Nlc3NpYmxlLXZhbC5qcyJdLCJleHBvcnRzIjpbIndyYXBSZW1vdGVNYXJzaGFsbGVyIiwid3JhcFJlbW90ZU1hcnNoYWxsZXJEaXJlY3RTZW5kIiwid3JhcFJlbW90ZU1hcnNoYWxsZXJTZW5kU2xvdHNPbmx5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZUNhY2hlTWFwS2l0LEZhaWwscSxFLEZhcixQQVNTX1NUWUxFLG1ha2VNYXJzaGFsLG1ha2VJbmFjY2Vzc2libGVWYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jYWNoZS1tYXBcIiwgW1tcIm1ha2VDYWNoZU1hcEtpdFwiLFskaM2PX2EgPT4gKG1ha2VDYWNoZU1hcEtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiLi9pbmFjY2Vzc2libGUtdmFsLmpzXCIsIFtbXCJtYWtlSW5hY2Nlc3NpYmxlVmFsXCIsWyRozY9fYSA9PiAobWFrZUluYWNjZXNzaWJsZVZhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtXZWFrTWFwQVBJfSBmcm9tICdAZW5kby9jYWNoZS1tYXAnO1xuICogQGltcG9ydCB7RU9ubHl9IGZyb20gJ0BlbmRvL2V2ZW50dWFsLXNlbmQnO1xuICogQGltcG9ydCB7UGFzc1N0eWxlZCwgU2ltcGxpZnl9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7Q2FwRGF0YSwgUGFzc2FibGUsIE1hcnNoYWwsIE1ha2VNYXJzaGFsT3B0aW9uc30gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKiBAaW1wb3J0IHtFUmVtb3RlfSBmcm9tICcuLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBBIE1hcnNoYWxsZXIgd2hpY2ggbWV0aG9kcyBtYXkgYmUgYXN5bmMuIFVzZSB0aGlzIHR5cGUgdG8gaW5kaWNhdGUgYWNjZXB0aW5nXG4gKiBlaXRoZXIgYSBzeW5jIG9yIGFzeW5jIG1hcnNoYWxsZXIsIHVzdWFsbHkgdGhyb3VnaCBgRWAgZXZlbnR1YWwtc2VuZHMuXG4gKlxuICogQHRlbXBsYXRlIFtTbG90PXVua25vd25dXG4gKiBAdHlwZWRlZiB7U2ltcGxpZnk8RU9ubHk8TWFyc2hhbDxTbG90Pj4+fSBFTWFyc2hhbGxlclxuICovXG5cbi8qKiBAdHlwZWRlZiB7J1JlbW90YWJsZScgfCBgQWxsZWdlZDogJHtzdHJpbmd9YH0gSW50ZXJmYWNlU3BlYyAqL1xuXG4vKiogQHRlbXBsYXRlIFtTbG90PXVua25vd25dICovXG5jbGFzcyBTbG90V3JhcHBlciB7XG4gIC8qKiBAdHlwZSB7U2xvdH0gKi9cbiAgI3Nsb3Q7XG5cbiAgLyoqIEB0eXBlIHtJbnRlcmZhY2VTcGVjfSAqL1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdBbGxlZ2VkOiBTbG90V3JhcHBlcic7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Nsb3R9IHNsb3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaWZhY2VdXG4gKi9cbiAgY29uc3RydWN0b3Ioc2xvdCwgaWZhY2UpIHtcbiAgICBpZiAoaWZhY2UgPT0gbnVsbCB8fCBpZmFjZSA9PT0gJ1JlbW90YWJsZScpIHtcbiAgICAgIGlmYWNlID0gJ1JlbW90YWJsZSc7XG4gICAgfSBlbHNlIGlmICghaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJykpIHtcbiAgICAgIGlmYWNlID0gYEFsbGVnZWQ6ICR7aWZhY2V9YDtcbiAgICB9XG4gICAgdGhpcy4jc2xvdCA9IHNsb3Q7XG4gICAgdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddID0gLyoqIEB0eXBlIHtJbnRlcmZhY2VTcGVjfSAqLyAoaWZhY2UpO1xuICB9XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7U2xvdFdyYXBwZXI8U2xvdD59IHdyYXBwZXJcbiAqIEByZXR1cm5zIHtTbG90fVxuICovXG4gIHN0YXRpYyBnZXRTbG90KHdyYXBwZXIpIHtcbiAgICByZXR1cm4gd3JhcHBlci4jc2xvdDtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU2xvdFdyYXBwZXIucHJvdG90eXBlLCB7XG4gIFtQQVNTX1NUWUxFXTogeyB2YWx1ZTogJ3JlbW90YWJsZScgfSxcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6ICdBbGxlZ2VkOiBTbG90V3JhcHBlcicgfSxcbn0pO1xuUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShTbG90V3JhcHBlci5wcm90b3R5cGUsICdjb25zdHJ1Y3RvcicpO1xuaGFyZGVuKFNsb3RXcmFwcGVyKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIHtTbG90V3JhcHBlcjxTbG90PiAmIFBhc3NTdHlsZWQ8J3JlbW90YWJsZScsIEludGVyZmFjZVNwZWM+fSBSZW1vdGFibGVTbG90V3JhcHBlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTbG90PXVua25vd25dXG4gKiBAcGFyYW0ge1Nsb3R9IHNsb3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaWZhY2VdXG4gKi9cbmNvbnN0IHNsb3RUb1dyYXBwZXIgPSAoc2xvdCwgaWZhY2UpID0+XG4gIC8qKiBAdHlwZSB7UmVtb3RhYmxlU2xvdFdyYXBwZXI8U2xvdD59ICovIChcbiAgICBoYXJkZW4obmV3IFNsb3RXcmFwcGVyKHNsb3QsIGlmYWNlKSlcbiAgKTtcblxuY29uc3Qgd3JhcHBlclRvU2xvdCA9IFNsb3RXcmFwcGVyLmdldFNsb3Q7XG5cbmNvbnN0IGNhcGFjaXR5T2ZEZWZhdWx0Q2FjaGUgPSA1MDtcblxuLyogVE9ETyhodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzEyMTExKSovXG4vKiBDaGVjayBjb3N0IG9mIHVzaW5nIHZpcnR1YWwtYXdhcmUgV2Vha01hcCBpbiBsaXZlc2xvdHMqL1xuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3dlYWtLZXldXG4gKi9cbmNvbnN0IG1ha2VEZWZhdWx0Q2FjaGVNYXAgPSB3ZWFrS2V5ID0+XG4gIC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBWPn0gKi8gKFxuICAgIG1ha2VDYWNoZU1hcEtpdChjYXBhY2l0eU9mRGVmYXVsdENhY2hlLCB7XG4gICAgICBtYWtlTWFwOiB3ZWFrS2V5ID8gV2Vha01hcCA6IE1hcCxcbiAgICB9KS5jYWNoZVxuICApO1xuXG4vKipcbiAqIFdyYXBzIGEgbWFyc2hhbGxlciwgZWl0aGVyIHN5bmMgb3IgYXN5bmMsIGxvY2FsIG9yIHJlbW90ZSwgaW50byBhIGxvY2FsIGFzeW5jXG4gKiBtYXJzaGFsbGVyIHdoaWNoIG9ubHkgc2VuZHMgc2xvdHMgZm9yIHJlc29sdXRpb24gdG8gdGhlIHdyYXBwZWQgbWFyc2hhbGxlci5cbiAqIE9wdGlvbmFsbHkgYW5kIGJ5IGRlZmF1bHQsIGNhY2hlcyB0aGUgcmVzb2x1dGlvbiBvZiBzbG90cy5cbiAqXG4gKiBBc3N1bWVzIHRoYXQgYSBudWxsLWlzaCBzbG90IHZhbHVlIGlzIGEgc2V2ZXJlZCBwcmVzZW5jZSB0aGF0IGNhbiBiZSByZXNvbHZlZFxuICogbG9jYWxseS4gQnkgZGVmYXVsdCBpZiBhIHByZXNlbmNlIGlzIG1hcHBlZCB0byBhIG51bGwtaXNoIHNsb3QgYnkgdGhlIHdyYXBwZWRcbiAqIG1hcnNoYWxsZXIsIHRoYXQgbWFwcGluZyBpcyBub3QgY2FjaGVkLCBhbGxvd2luZyB0aGUgd3JhcHBlZCBtYXJzaGFsbGVyIHRvXG4gKiBjcmVhdGUgYSBtYXBwaW5nIGluIHRoZSBmdXR1cmUuXG4gKlxuICogQHRlbXBsYXRlIFtTbG90PXVua25vd25dXG4gKiBAcGFyYW0ge0VSZW1vdGU8UGljazxFTWFyc2hhbGxlcjxTbG90PiwgJ2Zyb21DYXBEYXRhJyB8ICd0b0NhcERhdGEnPj59IG1hcnNoYWxsZXJcbiAqIEBwYXJhbSB7TWFrZU1hcnNoYWxPcHRpb25zfSBbbWFyc2hhbE9wdGlvbnNdXG4gKiBAcGFyYW0ge29iamVjdH0gW2NhY2hlc11cbiAqIEBwYXJhbSB7V2Vha01hcEFQSTxvYmplY3QsIFNsb3Q+IHwgbnVsbH0gW2NhY2hlcy52YWxUb1Nsb3RdXG4gKiBAcGFyYW0ge1dlYWtNYXBBUEk8U2xvdCwgb2JqZWN0PiB8IG51bGx9IFtjYWNoZXMuc2xvdFRvVmFsXVxuICogQHBhcmFtIHtib29sZWFufSBbY2FjaGVzLmNhY2hlU2V2ZXJlZFZhbF1cbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBGYXI8RU1hcnNoYWxsZXI8U2xvdD4+Pn1cbiAqL1xuICAgICAgIGNvbnN0IHdyYXBSZW1vdGVNYXJzaGFsbGVyU2VuZFNsb3RzT25seSA9IChcbiAgbWFyc2hhbGxlcixcbiAge1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQgPSAnc21hbGxjYXBzJyxcbiAgICBlcnJvclRhZ2dpbmcgPSAnb2ZmJywgLyogRGlzYWJsZSBlcnJvciB0YWdnaW5nIGJ5IGRlZmF1bHQqL1xuICAgIC4uLm90aGVyTWFyc2hhbE9wdGlvbnNcbiAgfSA9IHt9LFxuICB7XG4gICAgdmFsVG9TbG90ID0gbWFrZURlZmF1bHRDYWNoZU1hcCh0cnVlKSxcbiAgICBzbG90VG9WYWwgPSBtYWtlRGVmYXVsdENhY2hlTWFwKGZhbHNlKSxcbiAgICBjYWNoZVNldmVyZWRWYWwgPSBmYWxzZSxcbiAgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IG1hcnNoYWxPcHRpb25zID0gaGFyZGVuKHtcbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0LFxuICAgIGVycm9yVGFnZ2luZyxcbiAgICAuLi5vdGhlck1hcnNoYWxPcHRpb25zLFxuICB9KTtcbiAgLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgd3JhcHBlZCBtYXJzaGFsbGVyIGludGVybmFsbHkgdXNlcyAyIG1hcnNoYWxsZXJzKi9cbiAgLyogdG8gdHJhbnNmb3JtIHRoZSBDYXBEYXRhIGludG8gYSBQYXNzYWJsZSBzdHJ1Y3R1cmUgYW5kIHZpY2UtdmVyc2E6Ki9cbiAgLyogLSBBIGNhcCBwYXNzLXRocm91Z2ggbWFyc2hhbGxlciB3aGljaCBwbGFjZXMgY2FwYWJpbGl0aWVzIGFzLWlzIGluIHRoZSBzbG90cy4qL1xuICAvKiBXaGVuIHVuc2VyaWFsaXppbmcgQ2FwRGF0YSB3aXRoIG51bGwtaXNoIHNsb3RzLCBhIHNldmVyZWQgcHJlc2VuY2UgaXMgY3JlYXRlZC4qL1xuICAvKiBUaGlzIHBhc3MtdGhyb3VnaCBtYXJzaGFsbGVyIGlzIHVzZWQgdG8gbG9jYWxseSBwcm9jZXNzIHRoZSBzdHJ1Y3R1cmUsIGFuZCovXG4gIC8qIHNlcGFyYXRlIGNhcGFiaWxpdGllcyBpbnRvIGEgc2xvdHMgYXJyYXkgZm9yIHBvdGVudGlhbCByZXNvbHV0aW9uIGJ5IHRoZSovXG4gIC8qIHdyYXBwZWQgbWFyc2hhbGxlci4qL1xuICAvKiAtIEEgXCJTbG90V3JhcHBlclwiIG1hcnNoYWxsZXIgdXNlZCB0byB3cmFwIGludG8gcmVtb3RhYmxlcyB0aGUgc2xvdHMgb2YgdGhlKi9cbiAgLyogd3JhcHBlZCBtYXJzaGFsbGVyLiBXaGVuIHVuc2VyaWFsaXppbmcgQ2FwRGF0YSwgaXQgaXMgdXNlZCB0byByZWNyZWF0ZSovXG4gIC8qIENhcERhdGEgb2YgYSBzaW1wbGUgYXJyYXkgb2Ygbm9uLXNldmVyZWQgY2FwYWJpbGl0aWVzIGZvciByZXNvbHV0aW9uIGJ5Ki9cbiAgLyogdGhlIHdyYXBwZWQgbWFyc2hhbGxlci4gV2hlbiBzZXJpYWxpemluZyB0byBDYXBEYXRhLCBpdCBhbGxvd3MgZXh0cmFjdGluZyovXG4gIC8qIHRoZSBzbG90cyBmcm9tIHRoZSBjYXBhYmlsaXRpZXMgYXJyYXkgc2VyaWFsaXplZCBieSB0aGUgd3JhcHBlZCBtYXJzaGFsbGVyLiovXG5cbiAgLyoqIEB0eXBlIHtNYXJzaGFsPG9iamVjdCB8IG51bGw+fSAqL1xuICBjb25zdCBwYXNzVGhyb3VnaE1hcnNoYWxsZXIgPSBtYWtlTWFyc2hhbChcbiAgICB1bmRlZmluZWQsXG4gICAgKHNsb3QsIGlmYWNlKSA9PiBzbG90ID8/IG1ha2VJbmFjY2Vzc2libGVWYWwoaWZhY2UpLFxuICAgIG1hcnNoYWxPcHRpb25zLFxuICApO1xuXG4gIC8qKiBAdHlwZSB7TWFwPFNsb3QsIFJlbW90YWJsZVNsb3RXcmFwcGVyPE5vbk51bGxhYmxlPFNsb3Q+Pj59ICovXG4gIGNvbnN0IGN1cnJlbnRTbG90VG9XcmFwcGVyID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0IGNvbnZlcnRXcmFwcGVyVG9TbG90ID0gLyoqIEB0eXBlIHt0eXBlb2Ygd3JhcHBlclRvU2xvdDxTbG90Pn0gKi8gKFxuICAgIHdyYXBwZXJUb1Nsb3RcbiAgKTtcbiAgLyoqXG4gKiBAcGFyYW0ge1Nsb3R9IHNsb3RcbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBbaWZhY2VdXG4gKi9cbiAgY29uc3QgY29udmVydFNsb3RUb1dyYXBwZXIgPSAoc2xvdCwgaWZhY2UpID0+IHtcbiAgICBpZiAoc2xvdCA9PSBudWxsKSB7XG4gICAgICAvKiBUaGUgd3JhcHBlZCBtYXJzaGFsbGVyIG1heSBzZW5kIHVzIENhcERhdGEgd2l0aCBhIG51bGwgc2xvdC4gVGhlc2UgYXJlIG5vdCovXG4gICAgICAvKiBtZWFudCB0byBiZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgd2l0aCBlYWNoIG90aGVyLCBzbyBieXBhc3MgbWFwcGluZy4qL1xuICAgICAgcmV0dXJuIHNsb3RUb1dyYXBwZXIoc2xvdCwgaWZhY2UpO1xuICAgIH1cbiAgICBsZXQgd3JhcHBlciA9IGN1cnJlbnRTbG90VG9XcmFwcGVyLmdldChzbG90KTtcbiAgICBpZiAoIXdyYXBwZXIpIHtcbiAgICAgIHdyYXBwZXIgPSBzbG90VG9XcmFwcGVyKHNsb3QsIGlmYWNlKTtcbiAgICAgIGN1cnJlbnRTbG90VG9XcmFwcGVyLnNldChzbG90LCB3cmFwcGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcHBlcjtcbiAgfTtcblxuICAvKiogQHR5cGUge1BpY2s8TWFyc2hhbDxTbG90PiwgJ3RvQ2FwRGF0YScgfCAnZnJvbUNhcERhdGEnPn0gKi9cbiAgY29uc3Qgc2xvdFdyYXBwZXJNYXJzaGFsbGVyID0gbWFrZU1hcnNoYWwoXG4gICAgY29udmVydFdyYXBwZXJUb1Nsb3QsXG4gICAgY29udmVydFNsb3RUb1dyYXBwZXIsXG4gICAgbWFyc2hhbE9wdGlvbnMsXG4gICk7XG5cbiAgLyoqXG4gKiBSZXNvbHZlcyBhbiBhcnJheSBvZiB3cmFwcGVkIG1hcnNoYWxsZXIncyBzbG90cyB0byBhbiBhcnJheSBvZlxuICogY2FwYWJpbGl0aWVzLlxuICpcbiAqIFRoaXMgaXMgdXNlZCBieSBgZnJvbUNhcERhdGFgIHRvIG1hcCBzbG90cyBiZWZvcmUgdXNpbmcgdGhlIHBhc3MtdGhyb3VnaFxuICogbWFyc2hhbGxlciB0byByZWNyZWF0ZSB0aGUgcGFzc2FibGUgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge1Nsb3RbXX0gc2xvdHNcbiAqIEBwYXJhbSB7KGluZGV4OiBudW1iZXIpID0+IFJlbW90YWJsZVNsb3RXcmFwcGVyPE5vbk51bGxhYmxlPFNsb3Q+Pn0gZ2V0V3JhcHBlclxuICogQHJldHVybnMge1Byb21pc2U8KG9iamVjdCB8IG51bGwpW10+fVxuICovXG4gIGNvbnN0IG1hcFNsb3RzVG9DYXBzID0gYXN5bmMgKHNsb3RzLCBnZXRXcmFwcGVyKSA9PiB7XG4gICAgbGV0IGhhc1JlbW90ZUNhcCA9IGZhbHNlO1xuICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBzbG90cztcbiAgICAvKiogQHR5cGUgeyhSZW1vdGFibGVTbG90V3JhcHBlcjxOb25OdWxsYWJsZTxTbG90Pj4gfCBudWxsIHwgdW5kZWZpbmVkKVtdfSAqL1xuICAgIGNvbnN0IHNsb3RXcmFwcGVyTWFwcGVkU2xvdHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoIH0pO1xuICAgIC8qKiBAdHlwZSB7KG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQpW119ICovXG4gICAgY29uc3QgbG9jYWxseVJlc29sdmVkQ2FwU2xvdHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoIH0pO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHNsb3RdIG9mIHNsb3RzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHNsb3QgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgbnVsbFNsb3QgPSAvKiogQHR5cGUge251bGx9ICovIChzbG90KTtcbiAgICAgICAgc2xvdFdyYXBwZXJNYXBwZWRTbG90c1tpbmRleF0gPSBudWxsU2xvdDtcbiAgICAgICAgbG9jYWxseVJlc29sdmVkQ2FwU2xvdHNbaW5kZXhdID0gbnVsbFNsb3Q7XG4gICAgICB9IGVsc2UgaWYgKHNsb3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjYWNoZWRDYXAgPSBzbG90VG9WYWw/LmdldChzbG90KTtcbiAgICAgICAgaWYgKGNhY2hlZENhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsVG9TbG90Py5zZXQoY2FjaGVkQ2FwLCBzbG90KTtcbiAgICAgICAgICBsb2NhbGx5UmVzb2x2ZWRDYXBTbG90c1tpbmRleF0gPSBjYWNoZWRDYXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzUmVtb3RlQ2FwID0gdHJ1ZTtcbiAgICAgICAgICBzbG90V3JhcHBlck1hcHBlZFNsb3RzW2luZGV4XSA9IGdldFdyYXBwZXIoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgbnVsbDtcbiAgICBpZiAoaGFzUmVtb3RlQ2FwKSB7XG4gICAgICBoYXJkZW4oc2xvdFdyYXBwZXJNYXBwZWRTbG90cyk7XG4gICAgICBjb25zdCBzbG90c09ubHlDYXBEYXRhID0gc2xvdFdyYXBwZXJNYXJzaGFsbGVyLnRvQ2FwRGF0YShcbiAgICAgICAgc2xvdFdyYXBwZXJNYXBwZWRTbG90cyxcbiAgICAgICk7XG5cbiAgICAgIC8qKiBAdHlwZSB7KG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQpW119ICovXG4gICAgICBjb25zdCByZW1vdGVseVJlc29sdmVkQ2FwU2xvdHMgPVxuICAgICAgICBhd2FpdCBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKHNsb3RzT25seUNhcERhdGEpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgdmFsXSBvZiByZW1vdGVseVJlc29sdmVkQ2FwU2xvdHMuZW50cmllcygpKSB7XG4gICAgICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHNsb3QgPSBzbG90c1tpbmRleF07XG4gICAgICAgICAgc2xvdFRvVmFsPy5zZXQoc2xvdCwgdmFsKTtcbiAgICAgICAgICB2YWxUb1Nsb3Q/LnNldCh2YWwsIHNsb3QpO1xuICAgICAgICAgIGxvY2FsbHlSZXNvbHZlZENhcFNsb3RzW2luZGV4XSA9IHZhbDtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbGx5UmVzb2x2ZWRDYXBTbG90c1tpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHNsb3QgPSBzbG90c1tpbmRleF07XG4gICAgICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gVW5yZXNvbHZlZCBsb2NhbCBzbG90IGluIHdyYXBwZWQgbWFyc2hhbGxlcicsIHtcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgc2xvdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoYXJkZW4obG9jYWxseVJlc29sdmVkQ2FwU2xvdHMpO1xuICB9O1xuXG4gIC8qKlxuICogUmVzb2x2ZXMgYW4gYXJyYXkgb2YgY2FwYWJpbGl0aWVzIGludG8gYW4gYXJyYXkgb2Ygc2xvdHMgb2YgdGhlIHdyYXBwZWRcbiAqIG1hcnNoYWxsZXIuXG4gKlxuICogVGhpcyBpcyB1c2VkIGJ5IGB0b0NhcERhdGFgIHRvIG1hcCBzbG90cyBhZnRlciB0aGUgcGFzcy10aHJvdWdoIG1hcnNoYWxsZXJcbiAqIGhhcyBzZXJpYWxpemVkIHRoZSBwYXNzYWJsZSBkYXRhLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0W119IGNhcHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFNsb3RbXT59XG4gKi9cbiAgY29uc3QgbWFwQ2Fwc1RvU2xvdHMgPSBhc3luYyBjYXBzID0+IHtcbiAgICBpZiAoY2Fwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjYXBzO1xuICAgIH1cbiAgICBsZXQgaGFzUmVtb3RlQ2FwID0gZmFsc2U7XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IGNhcHM7XG4gICAgLyoqIEB0eXBlIHsoU2xvdCB8IG51bGwgfCB1bmRlZmluZWQpW119ICovXG4gICAgY29uc3QgbG9jYWxseVJlc29sdmVkU2xvdHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoIH0pO1xuICAgIC8qKiBAdHlwZSB7KG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQpW119ICovXG4gICAgY29uc3QgcmVtb3RlQ2Fwc1RvUmVzb2x2ZSA9IEFycmF5LmZyb20oeyBsZW5ndGggfSk7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY2FwXSBvZiBjYXBzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGNhcCA9PT0gbnVsbCkge1xuICAgICAgICAvKiBXZSBzaG91bGRuJ3QgZ2V0IG51bGwgY2FwcyBoZXJlLCBidXQgd2UgbWlycm9yIGhhbmRsZSB0aGVtIGFueXdheSovXG4gICAgICAgIGNvbnN0IG51bGxDYXAgPSAvKiogQHR5cGUge251bGx9ICovIChjYXApO1xuICAgICAgICByZW1vdGVDYXBzVG9SZXNvbHZlW2luZGV4XSA9IG51bGxDYXA7XG4gICAgICAgIGxvY2FsbHlSZXNvbHZlZFNsb3RzW2luZGV4XSA9IG51bGxDYXA7XG4gICAgICB9IGVsc2UgaWYgKGNhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGNhY2hlZFNsb3QgPSB2YWxUb1Nsb3Q/LmdldChjYXApO1xuICAgICAgICBpZiAoY2FjaGVkU2xvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGNhY2hlZFNsb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNsb3RUb1ZhbD8uc2V0KGNhY2hlZFNsb3QsIGNhcCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvY2FsbHlSZXNvbHZlZFNsb3RzW2luZGV4XSA9IGNhY2hlZFNsb3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzUmVtb3RlQ2FwID0gdHJ1ZTtcbiAgICAgICAgICByZW1vdGVDYXBzVG9SZXNvbHZlW2luZGV4XSA9IGNhcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IG51bGw7XG4gICAgaWYgKGhhc1JlbW90ZUNhcCkge1xuICAgICAgY29uc3QgcmVtb3RlbHlSZXNvbHZlZFNsb3RzQ2FwRGF0YSA9XG4gICAgICAgIGF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHJlbW90ZUNhcHNUb1Jlc29sdmUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLyoqIEB0eXBlIHsoUmVtb3RhYmxlU2xvdFdyYXBwZXI8U2xvdD4gfCBudWxsIHwgdW5kZWZpbmVkKVtdfSAqL1xuICAgICAgICBjb25zdCBzbG90V3JhcHBlck1hcHBlZFNsb3RzID0gc2xvdFdyYXBwZXJNYXJzaGFsbGVyLmZyb21DYXBEYXRhKFxuICAgICAgICAgIHJlbW90ZWx5UmVzb2x2ZWRTbG90c0NhcERhdGEsXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBzbG90V3JhcHBlcl0gb2Ygc2xvdFdyYXBwZXJNYXBwZWRTbG90cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBpZiAoc2xvdFdyYXBwZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc2xvdCA9IGNvbnZlcnRXcmFwcGVyVG9TbG90KHNsb3RXcmFwcGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNhcHNbaW5kZXhdO1xuICAgICAgICAgICAgbG9jYWxseVJlc29sdmVkU2xvdHNbaW5kZXhdID0gc2xvdDtcbiAgICAgICAgICAgIGlmIChzbG90ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgc2xvdFRvVmFsPy5zZXQoc2xvdCwgdmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzbG90ICE9IG51bGwgfHwgY2FjaGVTZXZlcmVkVmFsKSB7XG4gICAgICAgICAgICAgIHZhbFRvU2xvdD8uc2V0KHZhbCwgc2xvdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChsb2NhbGx5UmVzb2x2ZWRTbG90c1tpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY2FwID0gY2Fwc1tpbmRleF07XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyBVbnJlc29sdmVkIGxvY2FsIHNsb3QgaW4gd3JhcHBlZCBtYXJzaGFsbGVyJywge1xuICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgY2FwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIHNsb3RXcmFwcGVyTWFyc2hhbGxlciwgY2xlYXIgaXRzIHN0YXRlKi9cbiAgICAgICAgY3VycmVudFNsb3RUb1dyYXBwZXIuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBBbGwgc2xvdHMgc2hvdWxkIGhhdmUgYmVlbiByZXNvbHZlZCBieSBub3cgKG9yIHdhcm5lZCBhYm91dCkqL1xuICAgIHJldHVybiAvKiogQHR5cGUge1Nsb3RbXX0gKi8gKGhhcmRlbihsb2NhbGx5UmVzb2x2ZWRTbG90cykpO1xuICB9O1xuXG4gIC8qKlxuICogVW5mb3J0dW5hdGVseSBDYXBEYXRhIG9ubHkgY29udGFpbnMgaWZhY2UgaW5mb3JtYXRpb24gZm9yIHNsb3R0ZWRcbiAqIGNhcGFiaWxpdGllcyBuZXN0ZWQgaW5zaWRlIHRoZSBib2R5LCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlXG4gKiBib2R5IHRvIGV4dHJhY3QgaXQuIE1heWJlIGluIHRoZSBmdXR1cmUgQ2FwRGF0YSBjb3VsZCBiZSBleHRlbmRlZCB0byBjYXJyeVxuICogdGhpcyBzZXBhcmF0ZWx5LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8yOTkxXG4gKlxuICogU2luY2UgdGhpcyBoZWxwZXIgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHVsdGltYXRlbHkgcHJvdmlkZSBTbG90V3JhcHBlclxuICogb2JqZWN0cyB0byB0aGUgY29ycmVzcG9uZGluZyBtYXJzaGFsbGVyLCBhbmQgdGhhdCB3ZSB1c2UgdGhlIHNhbWVcbiAqIG1hcnNoYWxsZXIgdG8gZXh0cmFjdCB0aGUgaWZhY2UgaW5mb3JtYXRpb24sIGRpcmVjdGx5IHJldHVybiB0aGUgZnVsbFxuICogU2xvdFdyYXBwZXIgb2JqZWN0IGluc3RlYWQgb2YganVzdCB0aGUgaWZhY2UuXG4gKlxuICogQHBhcmFtIHtDYXBEYXRhPFNsb3Q+fSBkYXRhXG4gKi9cbiAgY29uc3QgbWFrZUlmYWNlRXh0cmFjdG9yID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyBzbG90cyB9ID0gZGF0YTtcbiAgICAvKiogQHBhcmFtIHtudW1iZXJ9IGluZGV4ICovXG4gICAgY29uc3QgZ2V0V3JhcHBlciA9IGluZGV4ID0+IHtcbiAgICAgIGNvbnN0IHNsb3QgPSBzbG90c1tpbmRleF07XG4gICAgICBsZXQgd3JhcHBlciA9IGN1cnJlbnRTbG90VG9XcmFwcGVyLmdldChzbG90KTtcbiAgICAgIGlmICghd3JhcHBlcikge1xuICAgICAgICB2b2lkIHNsb3RXcmFwcGVyTWFyc2hhbGxlci5mcm9tQ2FwRGF0YShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHdyYXBwZXIgPSBjdXJyZW50U2xvdFRvV3JhcHBlci5nZXQoc2xvdCk7XG4gICAgICBpZiAoIXdyYXBwZXIpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBNYXJzaGFsbGVyIGRpZG4ndCBjcmVhdGUgd3JhcHBlciBmb3Igc2xvdCAke3Eoc2xvdCl9IChpbmRleD0ke3EoaW5kZXgpfSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfTtcblxuICAgIHJldHVybiBnZXRXcmFwcGVyO1xuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxDYXBEYXRhPFNsb3Q+Pn1cbiAqL1xuICBjb25zdCB0b0NhcERhdGEgPSBhc3luYyB2YWwgPT4ge1xuICAgIGNvbnN0IGNhcERhdGEgPSBwYXNzVGhyb3VnaE1hcnNoYWxsZXIudG9DYXBEYXRhKHZhbCk7XG4gICAgY29uc3QgbWFwcGVkU2xvdHMgPSBhd2FpdCBtYXBDYXBzVG9TbG90cyhjYXBEYXRhLnNsb3RzKTtcbiAgICByZXR1cm4gaGFyZGVuKHsgLi4uY2FwRGF0YSwgc2xvdHM6IG1hcHBlZFNsb3RzIH0pO1xuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtDYXBEYXRhPFNsb3Q+fSBkYXRhXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXNzYWJsZT59XG4gKi9cbiAgY29uc3QgZnJvbUNhcERhdGEgPSBhc3luYyBkYXRhID0+IHtcbiAgICBjb25zdCBnZXRXcmFwcGVyID0gbWFrZUlmYWNlRXh0cmFjdG9yKGRhdGEpO1xuICAgIGF3YWl0IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1hcHBlZFNsb3RzID0gYXdhaXQgbWFwU2xvdHNUb0NhcHMoZGF0YS5zbG90cywgZ2V0V3JhcHBlcik7XG4gICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXJzaGFsbGVyLmZyb21DYXBEYXRhKHsgLi4uZGF0YSwgc2xvdHM6IG1hcHBlZFNsb3RzIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjdXJyZW50U2xvdFRvV3JhcHBlci5jbGVhcigpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gRmFyKCd3cmFwcGVkIHJlbW90ZSBtYXJzaGFsbGVyJywge1xuICAgIHRvQ2FwRGF0YSxcbiAgICBmcm9tQ2FwRGF0YSxcblxuICAgIC8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSovXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB0b0NhcERhdGEgKi9cbiAgICBzZXJpYWxpemU6IHRvQ2FwRGF0YSxcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIGZyb21DYXBEYXRhICovXG4gICAgdW5zZXJpYWxpemU6IGZyb21DYXBEYXRhLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFtTbG90PXVua25vd25dXG4gKiBAcGFyYW0ge0VSZW1vdGU8UGljazxFTWFyc2hhbGxlcjxTbG90PiwgJ2Zyb21DYXBEYXRhJyB8ICd0b0NhcERhdGEnPj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBGYXI8RU1hcnNoYWxsZXI8U2xvdD4+Pn1cbiAqLyRozY9fb25jZS53cmFwUmVtb3RlTWFyc2hhbGxlclNlbmRTbG90c09ubHkod3JhcFJlbW90ZU1hcnNoYWxsZXJTZW5kU2xvdHNPbmx5KTtcbiAgICAgICBjb25zdCB3cmFwUmVtb3RlTWFyc2hhbGxlckRpcmVjdFNlbmQgPSBtYXJzaGFsbGVyID0+IHtcbiAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPENhcERhdGE8U2xvdD4+fVxuICovXG4gIGNvbnN0IHRvQ2FwRGF0YSA9IHZhbCA9PiBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWwpO1xuXG4gIC8qKlxuICogQHBhcmFtIHtDYXBEYXRhPFNsb3Q+fSBkYXRhXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXNzYWJsZT59XG4gKi9cbiAgY29uc3QgZnJvbUNhcERhdGEgPSBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSk7XG5cbiAgcmV0dXJuIEZhcignd3JhcHBlZCByZW1vdGUgbWFyc2hhbGxlcicsIHtcbiAgICB0b0NhcERhdGEsXG4gICAgZnJvbUNhcERhdGEsXG5cbiAgICAvKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqL1xuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgdG9DYXBEYXRhICovXG4gICAgc2VyaWFsaXplOiB0b0NhcERhdGEsXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBmcm9tQ2FwRGF0YSAqL1xuICAgIHVuc2VyaWFsaXplOiBmcm9tQ2FwRGF0YSxcbiAgfSk7XG59OyRozY9fb25jZS53cmFwUmVtb3RlTWFyc2hhbGxlckRpcmVjdFNlbmQod3JhcFJlbW90ZU1hcnNoYWxsZXJEaXJlY3RTZW5kKTtcblxuICAgICAgIGNvbnN0IHdyYXBSZW1vdGVNYXJzaGFsbGVyID0gd3JhcFJlbW90ZU1hcnNoYWxsZXJTZW5kU2xvdHNPbmx5OyRozY9fb25jZS53cmFwUmVtb3RlTWFyc2hhbGxlcih3cmFwUmVtb3RlTWFyc2hhbGxlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwUmVtb3RlTWFyc2hhbGxlclNlbmRTbG90c09ubHkiOlsid3JhcFJlbW90ZU1hcnNoYWxsZXJTZW5kU2xvdHNPbmx5Il0sIndyYXBSZW1vdGVNYXJzaGFsbGVyRGlyZWN0U2VuZCI6WyJ3cmFwUmVtb3RlTWFyc2hhbGxlckRpcmVjdFNlbmQiXSwid3JhcFJlbW90ZU1hcnNoYWxsZXIiOlsid3JhcFJlbW90ZU1hcnNoYWxsZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAK+0QRfENAADxDQAAKwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRob2QtdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyJdLCJleHBvcnRzIjpbImJpbmRBbGxNZXRob2RzIiwiZ2V0TWV0aG9kTmFtZXMiLCJnZXRTdHJpbmdNZXRob2ROYW1lcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHJlYWxHZXRNZXRob2ROYW1lczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAocmVhbEdldE1ldGhvZE5hbWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBmaWxlIG1ldGhvZC10b29scyB1c2UgZHluYW1pYyBwcm9wZXJ0eSBsb29rdXAsIHdoaWNoIGlzIG5vdFxuICogICBKZXNzaWUtY29tcGF0aWJsZVxuICovXG5cbmNvbnN0IHsgY3JlYXRlLCBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggdGhlIGBnZXRNZXRob2ROYW1lc2AgaW4gYEBlbmRvL2V2ZW50dWFsLXNlbmRgXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBnZXRNZXRob2ROYW1lc2AgZnJvbSBgQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc2AgaW5zdGVhZC5cbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IEtcbiAqIEBwYXJhbSB7UmVjb3JkPEssIGFueT59IHZhbFxuICogQHJldHVybnMge0tbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldE1ldGhvZE5hbWVzID0gdmFsID0+XG4gIC8qKiBAdHlwZSB7S1tdfSAqLyAocmVhbEdldE1ldGhvZE5hbWVzKHZhbCkpOyRozY9fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7XG5oYXJkZW4oZ2V0TWV0aG9kTmFtZXMpO1xuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgYGdldE1ldGhvZE5hbWVzYCBjb250YWluaW5nIG9ubHkgc3RyaW5nIG5hbWVzLCB3aXRob3V0IHN5bWJvbHNcbiAqXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBLXG4gKiBAcGFyYW0ge1JlY29yZDxLLCBhbnk+fSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldFN0cmluZ01ldGhvZE5hbWVzID0gdmFsID0+XG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChcbiAgICByZWFsR2V0TWV0aG9kTmFtZXModmFsKS5maWx0ZXIobmFtZSA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpXG4gICk7XG5cbi8qKlxuICogVE9ETyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGVhc2UgdGhlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81OTcwIHRyYW5zaXRpb24sIGZyb20gYWxsIG1ldGhvZHNcbiAqIGJlaW5nIG93biBwcm9wZXJ0aWVzIHRvIG1ldGhvZHMgYmVpbmcgaW5oZXJpdGVkIGZyb20gYSBjb21tb24gcHJvdG90eXBlLiBUaGlzXG4gKiB0cmFuc2l0aW9uIGJyZWFrcyB0d28gcGF0dGVybnMgdXNlZCBpbiBwcmlvciBjb2RlOiBhdXRvYmluZGluZywgYW5kXG4gKiBlbnVtZXJhdGluZyBtZXRob2RzIGJ5IGVudW1lcmF0aW5nIG93biBwcm9wZXJ0aWVzLiBGb3IgYm90aCwgdGhlIHByZWZlcnJlZFxuICogcmVwYWlycyBhcmVcbiAqXG4gKiAtIGF1dG9iaW5kaW5nOiBSZXBsYWNlLCBmb3IgZXhhbXBsZSwgYGZvbyhvYmoubWV0aG9kKWAgd2l0aCBgZm9vKGFyZyA9PlxuICogICBgb2JqLm1ldGhvZChhcmcpKWAuIElPVywgc3RvcCByZWx5aW5nIG9uIGV4cHJlc3Npb25zIGxpa2UgYG9iai5tZXRob2RgdG9cbiAqICAgZXh0cmFjdCBhIG1ldGhvZCBzdGlsbCBib3VuZCB0byB0aGUgc3RhdGUgb2Zgb2JqYCBiZWNhdXNlLCBmb3IgdmlydHVhbCBhbmRcbiAqICAgZHVyYWJsZSBvYmplY3RzLCB0aGV5IG5vIGxvbmdlciB3aWxsIGFmdGVyICM1OTcwLlxuICogLSBtZXRob2QgZW51bWVyYXRpb246IFJlcGxhY2UsIGZvciBleGFtcGxlIGBSZWZsZWN0Lm93bktleXMob2JqKWAgd2l0aFxuICogICBgZ2V0TWV0aG9kTmFtZXMob2JqKWAuXG4gKlxuICogT25jZSBhbGwgcHJvYmxlbWF0aWMgY2FzZXMgaGF2ZSBiZWVuIGNvbnZlcnRlZCBpbiB0aGlzIG1hbm5lciwgdGhpc1xuICogYGJpbmRBbGxNZXRob2RzYCBoYWNrIGNhbiBhbmQgVE9ETyBzaG91bGQgYmUgZGVsZXRlZC4gSG93ZXZlciwgd2UgY3VycmVudGx5XG4gKiBoYXZlIG5vIHJlbGlhYmxlIHN0YXRpYyB3YXkgdG8gdHJhY2sgZG93biBhbmQgZml4IGFsbCBhdXRvYmluZGluZyBzaXRlcy4gRm9yXG4gKiB0aG9zZSBvYmplY3RzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gZnVsbHkgcmVwYWlyZWQgYnkgdGhlIGFib3ZlIHR3b1xuICogdGVjaG5pcXVlcywgYGJpbmRBbGxNZXRob2RzYCBjcmVhdGVzIGFuIG9iamVjdCB0aGF0IGFjdHMgbXVjaCBsaWtlIHRoZVxuICogcHJlLSM1OTcwIG9iamVjdHMsIHdpdGggYWxsIHRoZWlyIG1ldGhvZHMgYXMgaW5zdGFuY2UtYm91bmQgb3duIHByb3BlcnRpZXMuXG4gKiBJdCBkb2VzIHRoaXMgYnkgbWFraW5nIGEgbmV3IG9iamVjdCBpbmhlcml0aW5nIGZyb20gYG9iamAgd2hlcmUgdGhlIG5ld1xuICogb2JqZWN0IGhhcyBib3VuZCBvd24gbWV0aG9kcyBvdmVycmlkZGluZyBhbGwgdGhlIG1ldGhvZHMgaXQgd291bGQgaGF2ZVxuICogaW5oZXJpdGVkIGZyb20gYG9iamAuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIGFueT59IFRcbiAqIEBwYXJhbSB7VH0gb2JqXG4gKiBAcmV0dXJucyB7VH1cbiAqLyRozY9fb25jZS5nZXRTdHJpbmdNZXRob2ROYW1lcyhnZXRTdHJpbmdNZXRob2ROYW1lcyk7XG4gICAgICAgY29uc3QgYmluZEFsbE1ldGhvZHMgPSBvYmogPT5cbiAgaGFyZGVuKFxuICAgIGNyZWF0ZShcbiAgICAgIG9iaixcbiAgICAgIGZyb21FbnRyaWVzKFxuICAgICAgICByZWFsR2V0TWV0aG9kTmFtZXMob2JqKS5tYXAobmFtZSA9PiBbXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogKC8qKiBAdHlwZSB7dW5rbm93bltdfSAqLyAuLi5hcmdzKSA9PlxuICAgICAgICAgICAgICBhcHBseShvYmpbbmFtZV0sIG9iaiwgYXJncyksXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICApLFxuICApOyRozY9fb25jZS5iaW5kQWxsTWV0aG9kcyhiaW5kQWxsTWV0aG9kcyk7XG5oYXJkZW4oYmluZEFsbE1ldGhvZHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiOlsiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkP0geKBCAACgQgAAJgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRyaWNzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIkJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTIiwiSElTVE9HUkFNX01FVFJJQ1MiLCJLRVJORUxfU1RBVFNfTUVUUklDUyIsIktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyIsIktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyIsIlF1ZXVlTWV0cmljQXNwZWN0IiwibWFrZVF1ZXVlTWV0cmljcyIsIm1ha2VRdWV1ZU1ldHJpY3NNZXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxpc05hdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcImlzTmF0XCIsWyRozY9fYSA9PiAoaXNOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7TWV0ZXIgYXMgT1RlbE1ldGVyLCBNZXRyaWNBdHRyaWJ1dGVzfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGknO1xuICogQGltcG9ydCB7VG90YWxNYXB9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICovXG5cbmNvbnN0IEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMgPSBbXG4gIDUsXG4gIDEwLFxuICAyNSxcbiAgNTAsXG4gIDEwMCxcbiAgMjUwLFxuICA1MDAsXG4gIDEwMDAsXG4gIDI1MDAsXG4gIDUwMDAsXG4gIDEwMDAwLFxuICBJbmZpbml0eSxcbl07XG5jb25zdCBISVNUT0dSQU1fU0VDT05EU19MQVRFTkNZX0JPVU5EQVJJRVMgPVxuICBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTLm1hcChtcyA9PiBtcyAvIDEwMDApO1xuXG4vKiBUT0RPOiBWYWxpZGF0ZSB0aGVzZSBib3VuZGFyaWVzLiBXZSdyZSBub3QgZ29pbmcgdG8gaGF2ZSA1bXMgYmxvY2tzLCBidXQqL1xuLyogd2UgcHJvYmFibHkgY2FyZSBhYm91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEwIHZzLiAzMCBzZWNvbmRzLiovXG4gICAgICAgY29uc3QgSElTVE9HUkFNX01FVFJJQ1MgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBzd2luZ3NldF9jcmFua19wcm9jZXNzaW5nX3RpbWU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Byb2Nlc3NpbmcgdGltZSBwZXIgY3JhbmsgKG1zKScsXG4gICAgdW5pdDogJ21zJyxcbiAgICBib3VuZGFyaWVzOiBBcnJheS5vZigxLCAxMSwgMjEsIDMxLCA0MSwgNTEsIDYxLCA3MSwgODEsIDkxLCBJbmZpbml0eSksXG4gIH0sXG4gIHN3aW5nc2V0X2Jsb2NrX3Byb2Nlc3Npbmdfc2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUHJvY2Vzc2luZyB0aW1lIHBlciBibG9jaycsXG4gICAgdW5pdDogJ3MnLFxuICAgIGJvdW5kYXJpZXM6IEhJU1RPR1JBTV9TRUNPTkRTX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbiAgc3dpbmdzZXRfdmF0X3N0YXJ0dXA6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ZhdCBzdGFydHVwIHRpbWUgKG1zKScsXG4gICAgdW5pdDogJ21zJyxcbiAgICBib3VuZGFyaWVzOiBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTLFxuICB9LFxuICBzd2luZ3NldF92YXRfZGVsaXZlcnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ZhdCBkZWxpdmVyeSB0aW1lIChtcyknLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbiAgc3dpbmdzZXRfbWV0ZXJfdXNhZ2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ZhdCBtZXRlciB1c2FnZScsXG4gICAgdW5pdDogJ21zJyxcbiAgICBib3VuZGFyaWVzOiBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTLFxuICB9LFxufSk7JGjNj19vbmNlLkhJU1RPR1JBTV9NRVRSSUNTKEhJU1RPR1JBTV9NRVRSSUNTKTtcblxuY29uc3QgYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjID0ge1xuICAvKiBEaXNhYmxlZCBiZWNhdXNlIGltcG9ydGluZyBmcm9tIEBvcGVudGVsZW1ldHJ5L2FwaSBicmVha3Mga2VybmVsIGJ1bmRsaW5nLiovXG4gIC8qIFRoYW5rZnVsbHksIGl0J3MgdGhlIGRlZmF1bHQgYW55d2F5OiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWpzL2Jsb2IvZjRkZDJhMTA2MmY5ODBjZDM0NGNmYjE3MmE1MTVkMDAxMTVkZjU3MC9hcGkvc3JjL21ldHJpY3MvTWV0cmljLnRzI0w1My1MNTcqL1xuICAvKiB2YWx1ZVR5cGU6IFZhbHVlVHlwZS5ET1VCTEUsKi9cbiAgdW5pdDogJ3MnLFxuICBhZHZpY2U6IHtcbiAgICBleHBsaWNpdEJ1Y2tldEJvdW5kYXJpZXM6IFtcbiAgICAgIDAuMSwgMC4yLCAwLjMsIDAuNCwgMC41LCAxLCAyLCAzLCA0LCA1LCA2LCA3LCAxMCwgMTUsIDMwLFxuICAgIF0sXG4gIH0sXG59O1xuICAgICAgIGNvbnN0IEJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgc3dpbmdzZXRSdW5TZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdQZXItYmxvY2sgdGltZSBzcGVudCBleGVjdXRpbmcgU3dpbmdTZXQnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgc3dpbmdzZXRDaGFpblNhdmVTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdQZXItYmxvY2sgdGltZSBzcGVudCBwcm9wYWdhdGluZyBTd2luZ1NldCBzdGF0ZSBpbnRvIGNvc21vcycsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBzd2luZ3NldENvbW1pdFNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQZXItYmxvY2sgdGltZSBzcGVudCBjb21taXR0aW5nIFN3aW5nU2V0IHN0YXRlIHRvIGhvc3Qgc3RvcmFnZScsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBjb3Ntb3NDb21taXRTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdQZXItYmxvY2sgdGltZSBzcGVudCBjb21taXR0aW5nIGNvc21vcyBzdGF0ZScsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBmdWxsQ29tbWl0U2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1Blci1ibG9jayB0aW1lIHNwZW50IGNvbW1pdHRpbmcgc3RhdGUsIGluY2x1c2l2ZSBvZiBDT01NSVRfQkxPQ0sgcHJvY2Vzc2luZyBwbHVzIHRpbWUgc3BlbnQgW291dHNpZGUgb2YgY29zbWljLXN3aW5nc2V0XSBiZWZvcmUgYW5kIGFmdGVyIGl0JyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGludGVyQmxvY2tTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lIHNwZW50IGlkbGUgYmV0d2VlbiBibG9ja3MnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgYWZ0ZXJDb21taXRIYW5nb3ZlclNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQZXItYmxvY2sgdGltZSBzcGVudCB3YWl0aW5nIGZvciBwcmV2aW91cy1ibG9jayBhZnRlckNvbW1pdCB3b3JrJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGJsb2NrTGFnU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRlbGF5IG9mIGVhY2ggYmxvY2sgZnJvbSBpdHMgZXhwZWN0ZWQgYmVnaW4gdGltZScsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICAgIC8qIEFkZCBidWNrZXRzIGZvciBleGNlc3NpdmVseSBsb25nIGRlbGF5cy4qL1xuICAgIGFkdmljZToge1xuICAgICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLmFkdmljZSxcbiAgICAgIGV4cGxpY2l0QnVja2V0Qm91bmRhcmllczogLyoqIEB0eXBlIHtudW1iZXJbXX0gKi8gKFtcbiAgICAgICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLmFkdmljZS5leHBsaWNpdEJ1Y2tldEJvdW5kYXJpZXMsXG4gICAgICAgIC4uLls2MCwgMTIwLCAxODAsIDI0MCwgMzAwLCA2MDAsIDM2MDBdLFxuICAgICAgXSksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG4vKiogQGVudW0geyh0eXBlb2YgUXVldWVNZXRyaWNBc3BlY3QpW2tleW9mIHR5cGVvZiBRdWV1ZU1ldHJpY0FzcGVjdF19ICovJGjNj19vbmNlLkJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTKEJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTKTtcbiAgICAgICBjb25zdCBRdWV1ZU1ldHJpY0FzcGVjdCA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIExlbmd0aDogJ2xlbmd0aCcsXG4gIEluY3JlbWVudENvdW50OiAnaW5jcmVtZW50cycsXG4gIERlY3JlbWVudENvdW50OiAnZGVjcmVtZW50cycsXG59KTtcblxuLyoqXG4gKiBRdWV1ZSBtZXRyaWNzIGNvbWUgaW4ge2xlbmd0aCxhZGQscmVtb3ZlfSB0cmlwbGVzIHNoYXJpbmcgYSBjb21tb24gcHJlZml4LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lUHJlZml4XG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY1ByZWZpeFxuICogQHJldHVybnMge1JlY29yZDxcbiAqICAgUXVldWVNZXRyaWNBc3BlY3QsXG4gKiAgIHsgbmFtZTogc3RyaW5nOyBvcHRpb25zOiBNZXRyaWNBdHRyaWJ1dGVzIH1cbiAqID59XG4gKi8kaM2PX29uY2UuUXVldWVNZXRyaWNBc3BlY3QoUXVldWVNZXRyaWNBc3BlY3QpO1xuICAgICAgIGNvbnN0IG1ha2VRdWV1ZU1ldHJpY3NNZXRhID0gKG5hbWVQcmVmaXgsIGRlc2NQcmVmaXgpID0+IHtcbiAgLyoqIEB0eXBlIHtbUXVldWVNZXRyaWNBc3BlY3QsIHN0cmluZywgc3RyaW5nXVtdfSAqL1xuICBjb25zdCBtZXRyaWNzTWV0YSA9IFtcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuTGVuZ3RoLCAnbGVuZ3RoJywgJ2xlbmd0aCddLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5JbmNyZW1lbnRDb3VudCwgJ2FkZCcsICdpbmNyZW1lbnRzJ10sXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0LkRlY3JlbWVudENvdW50LCAncmVtb3ZlJywgJ2RlY3JlbWVudHMnXSxcbiAgXTtcbiAgY29uc3QgZW50cmllcyA9IG1ldHJpY3NNZXRhLm1hcCgoW2FzcGVjdCwgbmFtZVN1ZmZpeCwgZGVzY1N1ZmZpeF0pID0+IHtcbiAgICBjb25zdCBuYW1lID0gYCR7bmFtZVByZWZpeH1fJHtuYW1lU3VmZml4fWA7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBgJHtkZXNjUHJlZml4fSAke2Rlc2NTdWZmaXh9YDtcbiAgICAvKiBGdXR1cmUgT3BlblRlbGVtZXRyeSBTREtzIHNob3VsZCBhbHNvIHN1cHBvcnQgY3JlYXRpbmcgSW5zdHJ1bWVudHMgd2l0aCovXG4gICAgLyogYXR0cmlidXRlIGtleXMgKHN1Y2ggYXMgdGhlIFwicXVldWVcIiBhdHRyaWJ1dGUgZm9yKi9cbiAgICAvKiBcImNvc21pY19zd2luZ3NldF9pbmJvdW5kX3F1ZXVlX3tsZW5ndGgsYWRkLHJlbW92ZX1cIiBtZWFzdXJlbWVudHMpOiovXG4gICAgLyogaHR0cHM6Ly9vcGVudGVsZW1ldHJ5LmlvL2RvY3Mvc3BlY3Mvb3RlbC9tZXRyaWNzL2FwaS8jaW5zdHJ1bWVudC1hZHZpc29yeS1wYXJhbWV0ZXItYXR0cmlidXRlcyovXG4gICAgLyogQXQgdGhhdCB0aW1lLCBhIG5ldyBmaWVsZCB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgcmVjb3JkLiovXG4gICAgcmV0dXJuIFthc3BlY3QsIHsgbmFtZSwgb3B0aW9uczogeyBkZXNjcmlwdGlvbiB9IH1dO1xuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFF1ZXVlTmFtZVxuICogQHR5cGVkZWYgUXVldWVNZXRyaWNzXG4gKiBAcHJvcGVydHkgeyhsZW5ndGhzOiBSZWNvcmQ8UXVldWVOYW1lLCBudW1iZXI+KSA9PiB2b2lkfSBpbml0TGVuZ3RocyBtdXN0IGJlXG4gKiAgIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9uXG4gKiBAcHJvcGVydHkgeyhsZW5ndGhzOiBSZWNvcmQ8UXVldWVOYW1lLCBudW1iZXI+KSA9PiB2b2lkfSB1cGRhdGVMZW5ndGhzXG4gKiBAcHJvcGVydHkgeyhxdWV1ZTogUXVldWVOYW1lLCBkZWx0YT86IG51bWJlcikgPT4gdm9pZH0gaW5jTGVuZ3RoIGZvciBhXG4gKiAgIG5vbi1uZWdhdGl2ZSBkZWx0YVxuICogQHByb3BlcnR5IHsocXVldWU6IFF1ZXVlTmFtZSwgZGVsdGE/OiBudW1iZXIpID0+IHZvaWR9IGRlY0xlbmd0aCBmb3IgYVxuICogICBub24tbmVnYXRpdmUgZGVsdGFcbiAqL1xuXG4vKipcbiAqIENyZWF0ZSB7bGVuZ3RoLGFkZCxyZW1vdmV9IEluc3RydW1lbnRzIGZvciBhIHF1ZXVlIGFuZCByZXR1cm4gZnVuY3Rpb25zIGZvclxuICogY29uc2lzdGVudGx5IGluaXRpYWxpemluZyBhbmQgdXBkYXRpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gUXVldWVOYW1lXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnXG4gKiBAcGFyYW0ge09UZWxNZXRlcn0gY29uZmlnLm90ZWxNZXRlclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZy5uYW1lUHJlZml4XG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnLmRlc2NQcmVmaXhcbiAqIEBwYXJhbSB7UGljazxDb25zb2xlLCAnd2Fybic+fSBbY29uZmlnLmNvbnNvbGVdXG4gKiBAcmV0dXJucyB7UXVldWVNZXRyaWNzPFF1ZXVlTmFtZT59XG4gKi8kaM2PX29uY2UubWFrZVF1ZXVlTWV0cmljc01ldGEobWFrZVF1ZXVlTWV0cmljc01ldGEpO1xuICAgICAgIGNvbnN0IG1ha2VRdWV1ZU1ldHJpY3MgPSAoe1xuICBvdGVsTWV0ZXIsXG4gIG5hbWVQcmVmaXgsXG4gIGRlc2NQcmVmaXgsXG4gIGNvbnNvbGUsXG59KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuTGVuZ3RoXTogbGVuZ3RoTWV0YSxcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuSW5jcmVtZW50Q291bnRdOiB1cE1ldGEsXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0LkRlY3JlbWVudENvdW50XTogZG93bk1ldGEsXG4gIH0gPSBtYWtlUXVldWVNZXRyaWNzTWV0YShuYW1lUHJlZml4LCBkZXNjUHJlZml4KTtcbiAgLyogVE9ETzogV2hlbiBpdCdzIGRlZW1lZCBzYWZlIHRvIGNoYW5nZSByZXBvcnRlZCBtZXRyaWNzLCBtYWtlIHVwQ291bnRlciBhbmQqL1xuICAvKiBkb3duQ291bnRlciBzeW5jaHJvbm91cyAoYW5kIGRyb3AgYGluY3JlbWVudHNgIGFuZCBgZGVjcmVtZW50c2AgbWFwcykuKi9cbiAgLyogV2UgY2FuJ3QgZG8gc28gdW50aWwgdGhlbiBiZWNhdXNlIGl0IHdpbGwgYWRkIGEgXCJfdG90YWxcIiBzdWZmaXggdG8gdGhlKi9cbiAgLyogUHJvbWV0aGV1cyBleHBvcnQgbWV0cmljIG5hbWUsIGRpdmVyZ2luZyBmcm9tIGBtYWtlSW5ib3VuZFF1ZXVlTWV0cmljc2AgaW4qL1xuICAvKiBwYWNrYWdlcy9jb3NtaWMtc3dpbmdzZXQvc3JjL2tlcm5lbC1zdGF0cy5qcy4qL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vb3Blbi10ZWxlbWV0cnkvb3BlbnRlbGVtZXRyeS1qcy9ibG9iL21haW4vZG9jL3VwZ3JhZGUtdG8tMi54Lm1kIy1vdGhlci1jaGFuZ2VzKi9cbiAgY29uc3QgbGVuZ3RoQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVVcERvd25Db3VudGVyKFxuICAgIGxlbmd0aE1ldGEubmFtZSxcbiAgICBsZW5ndGhNZXRhLm9wdGlvbnMsXG4gICk7XG4gIC8qIGNvbnN0IHVwQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVDb3VudGVyKHVwTWV0YS5uYW1lLCB1cE1ldGEub3B0aW9ucyk7Ki9cbiAgLyogY29uc3QgZG93bkNvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlQ291bnRlcihkb3duTWV0YS5uYW1lLCBkb3duTWV0YS5vcHRpb25zKTsqL1xuICBjb25zdCB1cENvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlT2JzZXJ2YWJsZUNvdW50ZXIoXG4gICAgdXBNZXRhLm5hbWUsXG4gICAgdXBNZXRhLm9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRvd25Db3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZU9ic2VydmFibGVDb3VudGVyKFxuICAgIGRvd25NZXRhLm5hbWUsXG4gICAgZG93bk1ldGEub3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgaW5jcmVtZW50cyA9IC8qKiBAdHlwZSB7VG90YWxNYXA8c3RyaW5nLCBudW1iZXI+fSAqLyAobmV3IE1hcCgpKTtcbiAgY29uc3QgZGVjcmVtZW50cyA9IC8qKiBAdHlwZSB7VG90YWxNYXA8c3RyaW5nLCBudW1iZXI+fSAqLyAobmV3IE1hcCgpKTtcbiAgdXBDb3VudGVyLmFkZENhbGxiYWNrKG9ic2VydmVyID0+IHtcbiAgICBmb3IgKGNvbnN0IFtxdWV1ZU5hbWUsIHZhbHVlXSBvZiBpbmNyZW1lbnRzLmVudHJpZXMoKSkge1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh2YWx1ZSwgeyBxdWV1ZTogcXVldWVOYW1lIH0pO1xuICAgIH1cbiAgfSk7XG4gIGRvd25Db3VudGVyLmFkZENhbGxiYWNrKG9ic2VydmVyID0+IHtcbiAgICBmb3IgKGNvbnN0IFtxdWV1ZU5hbWUsIHZhbHVlXSBvZiBkZWNyZW1lbnRzLmVudHJpZXMoKSkge1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh2YWx1ZSwgeyBxdWV1ZTogcXVldWVOYW1lIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gIGNvbnN0IGxlbmd0aHMgPSAvKiogQHR5cGUge1RvdGFsTWFwPHN0cmluZywgbnVtYmVyPn0gKi8gKG5ldyBNYXAoKSk7XG4gIGNvbnN0IG51ZGdlID0gKHF1ZXVlTmFtZSwgZGVsdGEsIGluaXQgPSBmYWxzZSkgPT4ge1xuICAgIGlmICghbGVuZ3Rocy5oYXMocXVldWVOYW1lKSkge1xuICAgICAgaWYgKCFpbml0KSBjb25zb2xlPy53YXJuKCdVbmtub3duIHF1ZXVlJywgcXVldWVOYW1lKTtcbiAgICAgIGxlbmd0aHMuc2V0KHF1ZXVlTmFtZSwgMCk7XG4gICAgICBpbmNyZW1lbnRzLnNldChxdWV1ZU5hbWUsIDApO1xuICAgICAgZGVjcmVtZW50cy5zZXQocXVldWVOYW1lLCAwKTtcbiAgICB9XG4gICAgY29uc3Qgb2xkTGVuZ3RoID0gbGVuZ3Rocy5nZXQocXVldWVOYW1lKTtcbiAgICBsZW5ndGhzLnNldChxdWV1ZU5hbWUsIG9sZExlbmd0aCArIGRlbHRhKTtcbiAgICBjb25zdCBkaW1lbnNpb25zID0geyBxdWV1ZTogcXVldWVOYW1lIH07XG4gICAgbGVuZ3RoQ291bnRlci5hZGQoZGVsdGEsIGRpbWVuc2lvbnMpO1xuICAgIGlmIChpbml0KSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChkZWx0YSA+IDApIHtcbiAgICAgIC8qIFRPRE8gcGVyIGFib3ZlOiB1cENvdW50ZXIuYWRkKGRlbHRhLCBkaW1lbnNpb25zKTsqL1xuICAgICAgaW5jcmVtZW50cy5zZXQocXVldWVOYW1lLCAoaW5jcmVtZW50cy5nZXQocXVldWVOYW1lKSB8fCAwKSArIGRlbHRhKTtcbiAgICB9IGVsc2UgaWYgKGRlbHRhIDwgMCkge1xuICAgICAgLyogVE9ETyBwZXIgYWJvdmU6IGRvd25Db3VudGVyLmFkZCgtZGVsdGEsIGRpbWVuc2lvbnMpOyovXG4gICAgICBkZWNyZW1lbnRzLnNldChxdWV1ZU5hbWUsIChkZWNyZW1lbnRzLmdldChxdWV1ZU5hbWUpIHx8IDApIC0gZGVsdGEpO1xuICAgIH1cbiAgICByZWFkeSA9IHRydWU7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaW5pdExlbmd0aHM6IGluaXRpYWxMZW5ndGhzID0+IHtcbiAgICAgICFyZWFkeSB8fFxuICAgICAgICBjb25zb2xlPy53YXJuKFxuICAgICAgICAgIGBVbmV4cGVjdGVkIHJlcGVhdCBxdWV1ZSBsZW5ndGggaW5pdGlhbGl6YXRpb24gZnJvbSAke3EobGVuZ3Rocyl9IHRvICR7cShpbml0aWFsTGVuZ3Rocyl9YFxuICAgICAgICApO1xuICAgICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCBuZXdMZW5ndGhdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRpYWxMZW5ndGhzKSkge1xuICAgICAgICBpZiAoIWlzTmF0KG5ld0xlbmd0aCkpIHtcbiAgICAgICAgICBjb25zb2xlPy53YXJuKGBJbnZhbGlkIGxlbmd0aCBmb3IgcXVldWUgJHtxKHF1ZXVlTmFtZSl9OmAsIG5ld0xlbmd0aCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbnVkZ2UocXVldWVOYW1lLCBuZXdMZW5ndGgsIHRydWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXBkYXRlTGVuZ3RoczogbmV3TGVuZ3RocyA9PiB7XG4gICAgICByZWFkeSB8fCBjb25zb2xlPy53YXJuKCdNaXNzaW5nIGluaXRpYWwgcXVldWUgbGVuZ3RocycpO1xuICAgICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCBuZXdMZW5ndGhdIG9mIE9iamVjdC5lbnRyaWVzKG5ld0xlbmd0aHMpKSB7XG4gICAgICAgIGlmICghaXNOYXQobmV3TGVuZ3RoKSkge1xuICAgICAgICAgIGNvbnNvbGU/Lndhcm4oYEludmFsaWQgbGVuZ3RoIGZvciBxdWV1ZSAke3EocXVldWVOYW1lKX06YCwgbmV3TGVuZ3RoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBudWRnZShxdWV1ZU5hbWUsIG5ld0xlbmd0aCAtIChsZW5ndGhzLmdldChxdWV1ZU5hbWUpIHx8IDApKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGluY0xlbmd0aDogKHF1ZXVlTmFtZSwgZGVsdGEgPSAxKSA9PiB7XG4gICAgICBpZiAoIWlzTmF0KGRlbHRhKSkge1xuICAgICAgICBjb25zb2xlPy53YXJuKGBJbnZhbGlkIGluY3JlbWVudCBmb3IgcXVldWUgJHtxKHF1ZXVlTmFtZSl9OmAsIGRlbHRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbnVkZ2UocXVldWVOYW1lLCBkZWx0YSk7XG4gICAgfSxcbiAgICBkZWNMZW5ndGg6IChxdWV1ZU5hbWUsIGRlbHRhID0gMSkgPT4ge1xuICAgICAgaWYgKCFpc05hdChkZWx0YSkpIHtcbiAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBkZWNyZW1lbnQgZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBkZWx0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgLWRlbHRhKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbi8qIEFsbCB0aGUga2VybmVsIG1ldHJpY3Mgd2UgYXJlIHByZXBhcmVkIGZvci4qL1xuLyoqIEBlbnVtIHsodHlwZW9mIE1ldHJpY1R5cGUpW2tleW9mIHR5cGVvZiBNZXRyaWNUeXBlXX0gTWV0cmljVHlwZSAqLyRozY9fb25jZS5tYWtlUXVldWVNZXRyaWNzKG1ha2VRdWV1ZU1ldHJpY3MpO1xuY29uc3QgTWV0cmljVHlwZSA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIENvdW50ZXI6ICdjb3VudGVyJyxcbiAgR2F1Z2U6ICdnYXVnZScsXG59KTtcbi8qKlxuICogQHR5cGVkZWYgS2VybmVsTWV0cmljTWV0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7eyBkaW1lbnNpb246IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9fSBbc3ViXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zZW5zdXNdXG4gKiBAcHJvcGVydHkge01ldHJpY1R5cGV9IG1ldHJpY1R5cGVcbiAqL1xuLyoqIEB0eXBlIHtPbWl0PEtlcm5lbE1ldHJpY01ldGEsICdtZXRyaWNUeXBlJz5bXX0gKi9cbiAgICAgICBjb25zdCBLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MgPSBbXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxscycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2FsbF9zeXNjYWxsX3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFNlbmQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnc2VuZCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBtZXNzYWdlIHNlbmQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxDYWxsTm93JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ2NhbGxOb3cnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgc3luY2hyb25vdXMgZGV2aWNlIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsU3Vic2NyaWJlJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3N1YnNjcmliZScgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBwcm9taXNlIHN1YnNjcmlwdGlvbiBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFJlc29sdmUnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAncmVzb2x2ZScgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBwcm9taXNlIHJlc29sdXRpb24ga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxFeGl0JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ2V4aXQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0IGV4aXQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxWYXRzdG9yZUdldCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICd2YXRzdG9yZUdldCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXRzdG9yZSBnZXQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxWYXRzdG9yZVNldCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICd2YXRzdG9yZVNldCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXRzdG9yZSBzZXQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxWYXRzdG9yZUdldE5leHRLZXknLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVHZXROZXh0JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdHN0b3JlIGdldE5leHRLZXkga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxWYXRzdG9yZURlbGV0ZScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICd2YXRzdG9yZURlbGV0ZScgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXRzdG9yZSBkZWxldGUga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxEcm9wSW1wb3J0cycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdkcm9wSW1wb3J0cycgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBkcm9wIGltcG9ydHMga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2Rpc3BhdGNoZXMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9kaXNwYXRjaF90b3RhbCcsXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0IGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2Rpc3BhdGNoRGVsaXZlcicsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2Rpc3BhdGNoX2RlbGl2ZXJfdG90YWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBtZXNzYWdlIGRlbGl2ZXJpZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hOb3RpZnknLFxuICAgIG5hbWU6ICdzd2luZ3NldF9kaXNwYXRjaF9ub3RpZnlfdG90YWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBwcm9taXNlIG5vdGlmaWNhdGlvbnMnLFxuICB9LFxuXTtcblxuLyoqIEB0eXBlIHtPbWl0PEtlcm5lbE1ldHJpY01ldGEsICdtZXRyaWNUeXBlJz5bXX0gKi8kaM2PX29uY2UuS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTKEtFUk5FTF9TVEFUU19TVU1fTUVUUklDUyk7XG4gICAgICAgY29uc3QgS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTID0gW1xuICB7XG4gICAga2V5OiAna2VybmVsT2JqZWN0cycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2tlcm5lbF9vYmplY3RzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBrZXJuZWwgb2JqZWN0cycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrZXJuZWxEZXZpY2VzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfa2VybmVsX2RldmljZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZlIGtlcm5lbCBkZXZpY2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2tlcm5lbFByb21pc2VzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfa2VybmVsX3Byb21pc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBrZXJuZWwgcHJvbWlzZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna3BVbnJlc29sdmVkJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfdW5yZXNvbHZlZF9rZXJuZWxfcHJvbWlzZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnVW5yZXNvbHZlZCBrZXJuZWwgcHJvbWlzZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna3BGdWxmaWxsZWQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9mdWxmaWxsZWRfa2VybmVsX3Byb21pc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Z1bGZpbGxlZCBrZXJuZWwgcHJvbWlzZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna3BSZWplY3RlZCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3JlamVjdGVkX2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdSZWplY3RlZCBrZXJuZWwgcHJvbWlzZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAncnVuUXVldWVMZW5ndGgnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9ydW5fcXVldWVfbGVuZ3RoJyxcbiAgICBjb25zZW5zdXM6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdMZW5ndGggb2YgdGhlIGtlcm5lbCBydW4gcXVldWUnLFxuICB9LFxuICB7XG4gICAga2V5OiAnYWNjZXB0YW5jZVF1ZXVlTGVuZ3RoJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfYWNjZXB0YW5jZV9xdWV1ZV9sZW5ndGgnLFxuICAgIGNvbnNlbnN1czogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ0xlbmd0aCBvZiB0aGUga2VybmVsIGFjY2VwdGFuY2UgcXVldWUnLFxuICB9LFxuICB7XG4gICAga2V5OiAncHJvbWlzZVF1ZXVlc0xlbmd0aCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3Byb21pc2VfcXVldWVzX2xlbmd0aCcsXG4gICAgY29uc2Vuc3VzOiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOiAnQ29tYmluZWQgbGVuZ3RoIG9mIGFsbCBrZXJuZWwgcHJvbWlzZSBxdWV1ZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnY2xpc3RFbnRyaWVzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfY2xpc3RfZW50cmllcycsXG4gICAgZGVzY3JpcHRpb246ICdOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUga2VybmVsIGMtbGlzdCcsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICd2YXRzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfdmF0cycsXG4gICAgZGVzY3JpcHRpb246ICdOdW1iZXIgb2YgYWN0aXZlIHZhdHMnLFxuICB9LFxuXTskaM2PX29uY2UuS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTKEtFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyk7XG5cbmNvbnN0IHsgQ291bnRlciwgR2F1Z2UgfSA9IE1ldHJpY1R5cGU7XG4vKiogQHR5cGUge0tlcm5lbE1ldHJpY01ldGFbXX0gKi9cbiAgICAgICBjb25zdCBLRVJORUxfU1RBVFNfTUVUUklDUyA9IGhhcmRlbihbXG4gIC4uLktFUk5FTF9TVEFUU19TVU1fTUVUUklDUy5tYXAobSA9PiAoeyAuLi5tLCBtZXRyaWNUeXBlOiBDb3VudGVyIH0pKSxcbiAgLi4uS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTLm1hcChtID0+ICh7IC4uLm0sIG1ldHJpY1R5cGU6IEdhdWdlIH0pKSxcbl0pO1xuXG4vKiBFbnN1cmUga2VybmVsIHN0YXRzIGtleSB1bmlxdWVuZXNzLiovJGjNj19vbmNlLktFUk5FTF9TVEFUU19NRVRSSUNTKEtFUk5FTF9TVEFUU19NRVRSSUNTKTtcbmNvbnN0IGtlcm5lbFN0YXRzS2V5cyA9IG5ldyBNYXAoKTtcbmZvciAoY29uc3QgeyBrZXkgfSBvZiBLRVJORUxfU1RBVFNfTUVUUklDUykge1xuICBrZXJuZWxTdGF0c0tleXMuc2V0KGtleSwgKGtlcm5lbFN0YXRzS2V5cy5nZXQoa2V5KSB8fCAwKSArIDEpO1xufVxuY29uc3QgZHVwbGljYXRlS2VybmVsU3RhdHNLZXlzID0gWy4uLmtlcm5lbFN0YXRzS2V5cy5lbnRyaWVzKCldLmZsYXRNYXAoXG4gIChba2V5LCB2YWx1ZV0pID0+ICh2YWx1ZSA+IDEgPyBba2V5XSA6IFtdKSxcbik7XG5pZiAoZHVwbGljYXRlS2VybmVsU3RhdHNLZXlzLmxlbmd0aCA+IDApIHtcbiAgY29uc3QgbXNnID0gYER1cGxpY2F0ZSBrZXJuZWwgc3RhdHMga2V5cyAke0pTT04uc3RyaW5naWZ5KGR1cGxpY2F0ZUtlcm5lbFN0YXRzS2V5cyl9YDtcbiAgdGhyb3cgRXJyb3IobXNnKTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhJU1RPR1JBTV9NRVRSSUNTIjpbIkhJU1RPR1JBTV9NRVRSSUNTIl0sIkJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTIjpbIkJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTIl0sIlF1ZXVlTWV0cmljQXNwZWN0IjpbIlF1ZXVlTWV0cmljQXNwZWN0Il0sIm1ha2VRdWV1ZU1ldHJpY3NNZXRhIjpbIm1ha2VRdWV1ZU1ldHJpY3NNZXRhIl0sIm1ha2VRdWV1ZU1ldHJpY3MiOlsibWFrZVF1ZXVlTWV0cmljcyJdLCJLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MiOlsiS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTIl0sIktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyI6WyJLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MiXSwiS0VSTkVMX1NUQVRTX01FVFJJQ1MiOlsiS0VSTkVMX1NUQVRTX01FVFJJQ1MiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAirla8rYOAAC2DgAAKwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9uYXR1cmFsLXNvcnQuanN7ImltcG9ydHMiOlsiLi9qcy11dGlscy5qcyJdLCJleHBvcnRzIjpbIm5hdHVyYWxDb21wYXJlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcHJvdmlkZUxhenlNYXA7JGjNj19pbXBvcnRzKFtbXCIuL2pzLXV0aWxzLmpzXCIsIFtbXCJwcm92aWRlTGF6eU1hcFwiLFskaM2PX2EgPT4gKHByb3ZpZGVMYXp5TWFwID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gYVxuICogQHBhcmFtIHtzdHJpbmd9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG5jb25zdCBjb21wYXJlTmF0cyA9IChhLCBiKSA9PiB7XG4gIC8qIERlZmF1bHQgdG8gSUVFRSA3NTQgbnVtYmVyIGFyaXRobWV0aWMgZm9yIHNwZWVkLCBidXQgZmFsbCBiYWNrIG9uIGJpZ2ludCovXG4gIC8qIGFyaXRobWV0aWMgdG8gcmVzb2x2ZSB0aWVzIGJlY2F1c2UgYmlnIG51bWJlcnMgY2FuIGxvc2UgcmVzb2x1dGlvbiovXG4gIC8qIChzb21ldGltZXMgZXZlbiBiZWNvbWluZyBpbmZpbml0ZSkgYW5kIHRoZW4gdWx0aW1hdGVseSBvbiBsZW5ndGggdG8gcmVzb2x2ZSovXG4gIC8qIHRpZXMgYnkgYXNjZW5kaW5nIGNvdW50IG9mIGxlYWRpbmcgemVyb3MuKi9cbiAgY29uc3QgZGlmZiA9ICthIC0gK2I7XG4gIGNvbnN0IGZpbml0ZURpZmYgPVxuICAgIChOdW1iZXIuaXNGaW5pdGUoZGlmZikgJiYgZGlmZikgfHxcbiAgICAoYSA9PT0gYiA/IDAgOiBOdW1iZXIoQmlnSW50KGEpIC0gQmlnSW50KGIpKSB8fCBhLmxlbmd0aCAtIGIubGVuZ3RoKTtcblxuICAvKiBAdHMtZXhwZWN0LWVycm9yIHRoaXMgY2FsbCByZWFsbHkgZG9lcyByZXR1cm4gLTEgfCAwIHwgMSovXG4gIHJldHVybiBNYXRoLnNpZ24oZmluaXRlRGlmZik7XG59O1xuXG4vKiBUT0RPOiBjb21wYXJlQnlDb2RlUG9pbnRzKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzIwMDgqL1xuXG5jb25zdCBjb21wYXJlU3RyaW5ncyA9IChhLCBiKSA9PiAoYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDApO1xuXG5jb25zdCByQ2FwdHVyZURpZ2l0cyA9IC8oWzAtOV0rKS87XG5cbi8qKlxuICogU3BsaXR0aW5nIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbiBjYW4gYmUgZXhwZW5zaXZlOyB3ZSBkb24ndCB3YW50IHRvIHJlcGVhdFxuICogdGhhdCBmb3IgZXZlcnkgY29tcGFyaXNvbiBhZ2FpbnN0IHRoZSBzYW1lIHN0cmluZy5cbiAqXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nW10+fVxuICovXG5jb25zdCBwYXJ0c0NhY2hlID0gbmV3IE1hcCgpO1xuXG4vKipcbiAqIFBlcmZvcm0gYSBtdWx0aS1sZXZlbCBuYXR1cmFsLXNvcnQgY29tcGFyaXNvbiwgZmluZGluZyB0aGUgZGVjaW1hbCBkaWdpdFxuICogc2VxdWVuY2VzIGluIGVhY2ggb3BlcmFuZCBhbmQgY29tcGFyaW5nIGZpcnN0IGJ5IGVhY2ggKFtwb3NzaWJseSBlbXB0eV1cbiAqIHN0cmluZyBwcmVmaXgsIGludGVnZXIpIHBhaXIgaW4gdHVybiwgd2l0aCBhIGZpbmFsIGNvbXBhcmlzaW9uIGJ5IHN0cmluZ1xuICogc3VmZml4IGFzIG5lY2Vzc2FyeSAoZS5nLiwgc29ydGluZyAna280MicgYmVmb3JlICdrbzEwMCcgYXMgWydrbycsIDQyXSB2cy5cbiAqIFsna28nLCAxMDBdIGFuZCAncGFyZW50MS5jaGlsZDgnIGJlZm9yZSAncGFyZW50MS5jaGlsZDEwJyBhcyBbJ3BhcmVudCcsIDEsXG4gKiAnY2hpbGQnLCA4XSB2cy4gWydwYXJlbnQnLCAxLCAnY2hpbGQnLCAxMF0pLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhXG4gKiBAcGFyYW0ge3N0cmluZ30gYlxuICogQHJldHVybnMgey0xIHwgMCB8IDF9XG4gKi9cbiAgICAgICBjb25zdCBuYXR1cmFsQ29tcGFyZSA9IChhLCBiKSA9PiB7XG4gIC8qIFdlIHdhbnQgdG8gbWFpbnRhaW4gYSBjYWNoZSBvbmx5IGZvciB0aGUgZHVyYXRpb24gb2YgZWFjaCBjYWxsIHRvKi9cbiAgLyogYXJyYXkuc29ydCwgYW5kIGxldmVyYWdlIHRoZSBzeW5jaHJvbm91cyBuYXR1cmUgb2YgdGhhdCBtZXRob2QgaW4gdGhlIGZpcnN0Ki9cbiAgLyogaW52b2NhdGlvbiBvZiBlYWNoIHR1cm4gKGluZGljYXRlZCBieSBhbiBlbXB0eSBjYWNoZSkgdG8gc2NoZWR1bGUgY2FjaGUqL1xuICAvKiBjbGVhcmluZyBpbiB0aGUgKm5leHQqIHR1cm4uKi9cbiAgaWYgKCFwYXJ0c0NhY2hlLnNpemUpIHZvaWQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBwYXJ0c0NhY2hlLmNsZWFyKCkpO1xuXG4gIGNvbnN0IGFQYXJ0cyA9IHByb3ZpZGVMYXp5TWFwKHBhcnRzQ2FjaGUsIGEsICgpID0+IGEuc3BsaXQockNhcHR1cmVEaWdpdHMpKTtcbiAgY29uc3QgYlBhcnRzID0gcHJvdmlkZUxhenlNYXAocGFydHNDYWNoZSwgYiwgKCkgPT4gYi5zcGxpdChyQ2FwdHVyZURpZ2l0cykpO1xuXG4gIC8qIEFuIGV2ZW4gaW5kZXggY29ycmVzcG9uZHMgd2l0aCBhIHN0cmluZyBwYXJ0OyBhbiBvZGQgb25lIHdpdGggYSBkaWdpdCBwYXJ0LiovXG4gIGxldCBpID0gMDtcbiAgZm9yICg7IGkgKyAxIDwgYVBhcnRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgaWYgKGkgKyAxIDwgYlBhcnRzLmxlbmd0aCkge1xuICAgICAgLyogQm90aCBgYWAgYW5kIGBiYCBoYXZlIGEgZGlnaXQgcGFydCBoZXJlLCBidXQgd2UgY29tcGFyZSB0aGUgcHJlY2VkaW5nKi9cbiAgICAgIC8qIHN0cmluZyBwYXJ0IGZpcnN0IGluIGNhc2UgdGhvc2UgYXJlIHVuZXF1YWwuKi9cbiAgICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgIGNvbXBhcmVTdHJpbmdzKGFQYXJ0c1tpXSwgYlBhcnRzW2ldKSB8fFxuICAgICAgICBjb21wYXJlTmF0cyhhUGFydHNbaSArIDFdLCBiUGFydHNbaSArIDFdKTtcbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIEFmdGVyIGEgKHBvc3NpYmx5IGVtcHR5KSBjb21tb24gcHJlZml4LCBgYWAgaGFzIGRpZ2l0cyB3aGVyZSBgYmAgZG9lcyovXG4gICAgICAvKiBub3QsIHNvIHdlIHVzZSBzdHJpbmcgY29tcGFyaXNvbiBvZiBgJHthU3RyaW5nfSR7YURpZ2l0c31gIHZzLiovXG4gICAgICAvKiBgJHtiU3RyaW5nfWAuKi9cbiAgICAgIHJldHVybiBjb21wYXJlU3RyaW5ncyhgJHthUGFydHNbaV19JHthUGFydHNbaSArIDFdfWAsIGJQYXJ0c1tpXSk7XG4gICAgfVxuICB9XG4gIGlmIChiUGFydHMubGVuZ3RoID4gYVBhcnRzLmxlbmd0aCkge1xuICAgIC8qIGBiYCBoYXMgZGlnaXRzIHdoZXJlIGBhYCBkb2VzIG5vdC4qL1xuICAgIHJldHVybiBjb21wYXJlU3RyaW5ncyhhUGFydHNbaV0sIGAke2JQYXJ0c1tpXX0ke2JQYXJ0c1tpICsgMV19YCk7XG4gIH1cbiAgLyogSWYgYGFgIGFuZCBgYmAgZGlmZmVyLCBpdCdzIG9ubHkgaW4gdGhlIGZpbmFsIHN0cmluZyBzdWZmaXguKi9cbiAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKGFQYXJ0c1tpXSwgYlBhcnRzW2ldKTtcbn07JGjNj19vbmNlLm5hdHVyYWxDb21wYXJlKG5hdHVyYWxDb21wYXJlKTtcbmhhcmRlbihuYXR1cmFsQ29tcGFyZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJuYXR1cmFsQ29tcGFyZSI6WyJuYXR1cmFsQ29tcGFyZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABPxCWXakgAAGpIAAAoAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3Nlcy11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanMiLCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3N0cmVhbSIsImplc3NpZS5qcyIsIi4vanMtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJQcm9taXNlQWxsT3JFcnJvcnMiLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IiwiYWxsVmFsdWVzIiwiYXNzZXJ0QWxsRGVmaW5lZCIsImF0dGVudWF0ZSIsImRlZXBseUZ1bGZpbGxlZE9iamVjdCIsImZvcmV2ZXIiLCJmcm9tVW5pcXVlRW50cmllcyIsIm1ha2VMaW1pdGVkQ29uc29sZSIsIm9iamVjdE1hcCIsIm9iamVjdE1ldGFNYXAiLCJzdHJpcFByZWZpeCIsInN5bmNocm9uaXplZFRlZSIsInRocm93RXJyb3JDb2RlIiwidHJ5SnNvblBhcnNlIiwidHJ5Tm93IiwidW50aWxUcnVlIiwid2hpbGVUcnVlIiwid2l0aERlZmVycmVkQ2xlYW51cCIsInppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG9iamVjdE1hcCxvYmplY3RNZXRhTWFwLGZyb21VbmlxdWVFbnRyaWVzLHEsYixGYWlsLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yLFgsZGVlcGx5RnVsZmlsbGVkLGlzUHJpbWl0aXZlLG1ha2VQcm9taXNlS2l0LG1ha2VRdWV1ZSxhc3luY0dlbmVyYXRlLGxvZ0xldmVsczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpLCRozY9fbGl2ZVtcIm9iamVjdE1hcFwiXV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qc1wiLCBbW1wib2JqZWN0TWV0YU1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1ldGFNYXAgPSAkaM2PX2EpLCRozY9fbGl2ZVtcIm9iamVjdE1ldGFNYXBcIl1dXV1dLFtcIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzXCIsIFtbXCJmcm9tVW5pcXVlRW50cmllc1wiLFskaM2PX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjNj19hKSwkaM2PX2xpdmVbXCJmcm9tVW5pcXVlRW50cmllc1wiXV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJiXCIsWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIixbJGjNj19hID0+IChkZWVwbHlGdWxmaWxsZWQgPSAkaM2PX2EpXV0sW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vc3RyZWFtXCIsIFtbXCJtYWtlUXVldWVcIixbJGjNj19hID0+IChtYWtlUXVldWUgPSAkaM2PX2EpXV1dXSxbXCJqZXNzaWUuanNcIiwgW1tcImFzeW5jR2VuZXJhdGVcIixbJGjNj19hID0+IChhc3luY0dlbmVyYXRlID0gJGjNj19hKV1dXV0sW1wiLi9qcy11dGlscy5qc1wiLCBbW1wibG9nTGV2ZWxzXCIsWyRozY9fYSA9PiAobG9nTGV2ZWxzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBmcm9tRW50cmllcywga2V5cywgdmFsdWVzIH0gPSBPYmplY3Q7XG5cbi8qKiBAcGFyYW0geyhsZXZlbDogc3RyaW5nKSA9PiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkfSBtYWtlTG9nZ2VyICovXG4gICAgICAgY29uc3QgbWFrZUxpbWl0ZWRDb25zb2xlID0gbWFrZUxvZ2dlciA9PiB7XG4gIGNvbnN0IGxpbWl0ZWRDb25zb2xlID0gLyoqIEB0eXBlIHthbnl9ICovIChcbiAgICBmcm9tRW50cmllcyhsb2dMZXZlbHMubWFwKGxldmVsID0+IFtsZXZlbCwgbWFrZUxvZ2dlcihsZXZlbCldKSlcbiAgKTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7TGltaXRlZENvbnNvbGV9ICovIChoYXJkZW4obGltaXRlZENvbnNvbGUpKTtcbn07JGjNj19vbmNlLm1ha2VMaW1pdGVkQ29uc29sZShtYWtlTGltaXRlZENvbnNvbGUpO1xuaGFyZGVuKG1ha2VMaW1pdGVkQ29uc29sZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7IFtLZXlUeXBlIGluIGtleW9mIFRdOiBUW0tleVR5cGVdIH0gJiB7fX0gU2ltcGxpZnkgZmxhdHRlbiB0aGVcbiAqICAgdHlwZSBvdXRwdXQgdG8gaW1wcm92ZSB0eXBlIGhpbnRzIHNob3duIGluIGVkaXRvcnNcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy90eXBlLWZlc3QvYmxvYi9tYWluL3NvdXJjZS9zaW1wbGlmeS5kLnRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IENhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIENhbGxhYmxlID8gVFtLXSA6IERlZXBseUF3YWl0ZWQ8VFtLXT47XG4gKiB9fSBEZWVwbHlBd2FpdGVkT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyBQcm9taXNlTGlrZTxhbnk+XG4gKiAgICAgPyBBd2FpdGVkPFQ+XG4gKiAgICAgOiBUIGV4dGVuZHMgUmVtb3RhYmxlQnJhbmQ8YW55LCBhbnk+IHwgUmVtb3RhYmxlT2JqZWN0XG4gKiAgICAgICA/IFRcbiAqICAgICAgIDogVCBleHRlbmRzIHt9XG4gKiAgICAgICAgID8gU2ltcGxpZnk8RGVlcGx5QXdhaXRlZE9iamVjdDxUPj5cbiAqICAgICAgICAgOiBBd2FpdGVkPFQ+fSBEZWVwbHlBd2FpdGVkXG4gKi9cblxuLyoqXG4gKiBBIG1vcmUgY29uc3RyYWluZWQgdmVyc2lvbiBvZiB7ZGVlcGx5RnVsZmlsbGVkfSBmb3IgdHlwZSBzYWZldHkgdW50aWxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTI1NyBVc2VmdWwgaW4gc3RhcnRpbmcgY29udHJhY3RzIHRoYXRcbiAqIG5lZWQgYWxsIHRlcm1zIHRvIGJlIGZ1bGZpbGxlZCBpbiBvcmRlciB0byBiZSBkdXJhYmxlLlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIHt9Pih1bmZ1bGZpbGxlZFRlcm1zOiBUKSA9PiBQcm9taXNlPERlZXBseUF3YWl0ZWQ8VD4+fVxuICovXG4gICAgICAgY29uc3QgZGVlcGx5RnVsZmlsbGVkT2JqZWN0ID0gYXN5bmMgb2JqID0+IHtcbiAgIWlzUHJpbWl0aXZlKG9iaikgfHwgRmFpbGBwYXJhbSBtdXN0IGJlIGFuIG9iamVjdGA7XG4gIHJldHVybiBkZWVwbHlGdWxmaWxsZWQob2JqKTtcbn07XG5cbi8qKlxuICogVG9sZXJhdGUgYWJzZW5jZSBvZiBBZ2dyZWdhdGVFcnJvciBpbiBlLmcuIHhzbmFwLlxuICpcbiAqIEB0eXBlIHsoZXJyb3JzOiBFcnJvcltdLCBtZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogb2JqZWN0KSA9PiBFcnJvcn1cbiAqLyRozY9fb25jZS5kZWVwbHlGdWxmaWxsZWRPYmplY3QoZGVlcGx5RnVsZmlsbGVkT2JqZWN0KTtcbmNvbnN0IG1ha2VBZ2dyZWdhdGVFcnJvciA9XG4gIHR5cGVvZiBBZ2dyZWdhdGVFcnJvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gKGVycm9ycywgbWVzc2FnZSwgb3B0aW9ucykgPT4gQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBtZXNzYWdlLCBvcHRpb25zKVxuICAgIDogKGVycm9ycywgbWVzc2FnZSwgb3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gbWFrZUVycm9yKG1lc3NhZ2UgPz8gJ211bHRpcGxlIGVycm9ycycsIHVuZGVmaW5lZCwge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgZXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgYSBzdHJpbmcgaGFzIGEgcHJlZml4LCBhbmQgcmV0dXJuIHRoZSBwYXJ0IHRoYXQgZm9sbG93cyBpdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG4gICAgICAgY29uc3Qgc3RyaXBQcmVmaXggPSAocHJlZml4LCBzdHIpID0+IHtcbiAgc3RyLnN0YXJ0c1dpdGgocHJlZml4KSB8fCBGYWlsYCR7c3RyfSBpcyBtaXNzaW5nIHByZWZpeCAke3EocHJlZml4KX1gO1xuICByZXR1cm4gc3RyLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xufTtcblxuLyoqXG4gKiBUaHJvdyBhbiBlcnJvciB3aXRoIGFuIG93biBcImNvZGVcIiBkYXRhIHByb3BlcnR5LCBzdXBwb3J0aW5nIGlkZW50aWZpY2F0aW9uXG4gKiB3aXRob3V0IHBhcnNpbmcgYG1lc3NhZ2VgLiBOb3RlIHRoYXQgc3VjaCBlcnJvcnMgYXJlIG5vdCBQYXNzYWJsZSBhbmQgdGh1c1xuICogY2Fubm90IGFwcGVhciBpbnNpZGUgYSBQYXNzYWJsZSBzdHJ1Y3R1cmUsIGFuZCBldmVuIGF0IHRvcCBsZXZlbCB0aGUgXCJjb2RlXCJcbiAqIHByb3BlcnR5IHdpbGwgYmUgc2lsZW50bHkgZHJvcHBlZCBieSBtYXJzaGFsbGluZy5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gQ29kZVxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPHR5cGVvZiBtYWtlRXJyb3I+WzBdfSBkZXRhaWxzXG4gKiBAcGFyYW0ge0NvZGV9IGNvZGVcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczx0eXBlb2YgbWFrZUVycm9yPlsyXSAmIHtcbiAqICAgY29uc3RydWN0b3I/OiBQYXJhbWV0ZXJzPHR5cGVvZiBtYWtlRXJyb3I+WzFdO1xuICogfX0gW29wdHNdXG4gKi8kaM2PX29uY2Uuc3RyaXBQcmVmaXgoc3RyaXBQcmVmaXgpO1xuICAgICAgIGNvbnN0IHRocm93RXJyb3JDb2RlID0gKGRldGFpbHMsIGNvZGUsIG9wdHMpID0+IHtcbiAgY29uc3QgZXJyID0gbWFrZUVycm9yKGRldGFpbHMsIG9wdHM/LmNvbnN0cnVjdG9yLCB7XG4gICAgLi4ub3B0cyxcbiAgICBzYW5pdGl6ZTogZmFsc2UsXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCAnY29kZScsIHsgdmFsdWU6IGNvZGUsIGVudW1lcmFibGU6IHRydWUgfSk7XG4gIGhhcmRlbihlcnIpO1xuICB0aHJvdyBlcnI7XG59O1xuXG4vKipcbiAqIFN5bmNocm9udXNseSBpbnZva2UgYSBmdW5jdGlvbiB3aXRoIHRoZSBvcHBvcnR1bml0eSB0byBoYW5kbGUgYW55IGVycm9yXG4gKiBzaW1pbGFybHkgdG8gYSBQcm9taXNlIGBjYXRjaGAgY2FsbGJhY2sgKGUuZy4sIHN1YnN0aXR1dGluZyBhIG5vbi1lcnJvclxuICogcmV0dXJuZWQgdmFsdWUgb3IgdGhyb3dpbmcgYSBwb3NzaWJseS1uZXcgZXJyb3IpLiBUaGlzIGlzIHVzZWZ1bCBmb3IgKGFtb25nXG4gKiBvdGhlciB0aGluZ3MpIHJlcGxhY2luZyBnZW5lcmljIGVycm9yIG1lc3NhZ2VzIHdpdGggc3BlY2lmaWMgb25lcyAoYXMgaW5cbiAqIHtAc2VlIHRyeUpzb25QYXJzZX0pLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEZcbiAqIEB0ZW1wbGF0ZSBbVT1SZXR1cm5UeXBlPEY+XVxuICogQHBhcmFtIHtGfSBmbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7KGVycjogRXJyb3IpID0+IFV9IHRyYW5zZm9ybUVycm9yIGNhbGxiYWNrIHRvIHJlY2VpdmUgYW55IGVycm9yIGZyb21cbiAqICAgaW52b2tpbmcgYGZuYCBhbmQgZWl0aGVyIHJldHVybiBhIHN1YnN0aXR1dGUgdmFsdWUgb3IgdGhyb3cgYSBwb3RlbnRpYWxseVxuICogICBuZXcgZXJyb3JcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxGPn0gYXJncyBmb3IgYGZuYFxuICogQHJldHVybnMge1JldHVyblR5cGU8Rj4gfCBVfVxuICovJGjNj19vbmNlLnRocm93RXJyb3JDb2RlKHRocm93RXJyb3JDb2RlKTtcbiAgICAgICBjb25zdCB0cnlOb3cgPSAoZm4sIHRyYW5zZm9ybUVycm9yLCAuLi5hcmdzKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybUVycm9yKGVycik7XG4gICAgfSBjYXRjaCAobmV3RXJyKSB7XG4gICAgICAvKiBUcnkgdG8gYXNzb2NpYXRlIGBlcnJgIHdpdGggYG5ld0VycmAuKi9cbiAgICAgIGlmICghbmV3RXJyLmNhdXNlKSB7XG4gICAgICAgIGNvbnN0IGRlc2MgPSB7XG4gICAgICAgICAgdmFsdWU6IGVycixcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGlmICghUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShuZXdFcnIsICdjYXVzZScsIGRlc2MpKSB7XG4gICAgICAgICAgYXNzZXJ0Lm5vdGUobmV3RXJyLCBlcnIubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ld0VycjtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUGFyc2UgSlNPTiB0ZXh0LCBvciBoYW5kbGUgYW4gZXJyb3IgYnkgZS5nLiBzdWJzdGl0dXRpbmcgYSBkZWZhdWx0IHZhbHVlIG9yXG4gKiByZXBsYWNpbmcgaXQgd2l0aCBvbmUgYmVhcmluZyBhIG5vbi1nZW5lcmljIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGpzb25UZXh0XG4gKiBAcGFyYW0ge3N0cmluZyB8ICgoZXJyOiBFcnJvcikgPT4gdW5rbm93bil9IG9uRXJyb3IgYW4gZXJyb3IgbWVzc2FnZSBvclxuICogICBjYWxsYmFja1xuICovJGjNj19vbmNlLnRyeU5vdyh0cnlOb3cpO1xuICAgICAgIGNvbnN0IHRyeUpzb25QYXJzZSA9IChqc29uVGV4dCwgb25FcnJvcikgPT4ge1xuICBjb25zdCB0cmFuc2Zvcm1FcnJvciA9XG4gICAgdHlwZW9mIG9uRXJyb3IgPT09ICdmdW5jdGlvbidcbiAgICAgID8gb25FcnJvclxuICAgICAgOiBlcnIgPT4gRmFpbChbYCR7b25FcnJvcn06ICR7ZXJyLm1lc3NhZ2V9IGZvciBpbnB1dCBgLCAnJ10sIGpzb25UZXh0KTtcbiAgcmV0dXJuIHRyeU5vdygoKSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBqc29uVGV4dDtcbiAgICB0eXBlID09PSAnc3RyaW5nJyB8fCBGYWlsYElucHV0IG11c3QgYmUgYSBzdHJpbmcsIG5vdCAke2IodHlwZSl9YDtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uVGV4dCk7XG4gIH0sIHRyYW5zZm9ybUVycm9yKTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7cmVhZG9ubHkgKFQgfCBQcm9taXNlTGlrZTxUPilbXX0gaXRlbXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFRbXT59XG4gKi8kaM2PX29uY2UudHJ5SnNvblBhcnNlKHRyeUpzb25QYXJzZSk7XG4gICAgICAgY29uc3QgUHJvbWlzZUFsbE9yRXJyb3JzID0gYXN5bmMgaXRlbXMgPT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGl0ZW1zKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgIGNvbnN0IGVycm9ycyA9IC8qKiBAdHlwZSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0W119ICovIChcbiAgICAgIHJlc3VsdHMuZmlsdGVyKCh7IHN0YXR1cyB9KSA9PiBzdGF0dXMgPT09ICdyZWplY3RlZCcpXG4gICAgKS5tYXAocmVzdWx0ID0+IHJlc3VsdC5yZWFzb24pO1xuICAgIGlmICghZXJyb3JzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7UHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxUPltdfSAqLyAocmVzdWx0cykubWFwKFxuICAgICAgICByZXN1bHQgPT4gcmVzdWx0LnZhbHVlLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGVycm9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRocm93IGVycm9yc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbWFrZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gdHJpZXJcbiAqIEBwYXJhbSB7KGVycm9yPzogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPn0gZmluYWxpemVyXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0cmllcj59XG4gKi8kaM2PX29uY2UuUHJvbWlzZUFsbE9yRXJyb3JzKFByb21pc2VBbGxPckVycm9ycyk7XG4gICAgICAgY29uc3QgYWdncmVnYXRlVHJ5RmluYWxseSA9IGFzeW5jICh0cmllciwgZmluYWxpemVyKSA9PlxuICB0cmllcigpLnRoZW4oXG4gICAgYXN5bmMgcmVzdWx0ID0+IGZpbmFsaXplcigpLnRoZW4oKCkgPT4gcmVzdWx0KSxcbiAgICBhc3luYyB0cnlFcnJvciA9PlxuICAgICAgZmluYWxpemVyKHRyeUVycm9yKVxuICAgICAgICAudGhlbihcbiAgICAgICAgICAoKSA9PiB0cnlFcnJvcixcbiAgICAgICAgICBmaW5hbGl6ZUVycm9yID0+IG1ha2VBZ2dyZWdhdGVFcnJvcihbdHJ5RXJyb3IsIGZpbmFsaXplRXJyb3JdKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbihlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpLFxuICApO1xuXG4vKipcbiAqIFJ1biBhIGZ1bmN0aW9uIHdpdGggdGhlIGFiaWxpdHkgdG8gZGVmZXIgbGFzdC1pbi1maXJzdC1vdXQgY2xlYW51cCBjYWxsYmFja3MuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KFxuICogICBhZGRDbGVhbnVwOiAoZm46IChlcnI/OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiB2b2lkLFxuICogKSA9PiBQcm9taXNlPFQ+fSBmblxuICogQHJldHVybnMge1JldHVyblR5cGU8Zm4+fVxuICovJGjNj19vbmNlLmFnZ3JlZ2F0ZVRyeUZpbmFsbHkoYWdncmVnYXRlVHJ5RmluYWxseSk7XG4gICAgICAgY29uc3Qgd2l0aERlZmVycmVkQ2xlYW51cCA9IGFzeW5jIGZuID0+IHtcbiAgLyoqIEB0eXBlIHsoKGVycj86IHVua25vd24pID0+IHVua25vd24pW119ICovXG4gIGNvbnN0IGNsZWFudXBzTElGTyA9IFtdO1xuICAvKiogQHR5cGUgeyhjbGVhbnVwOiAoZXJyPzogdW5rbm93bikgPT4gdW5rbm93bikgPT4gdm9pZH0gKi9cbiAgY29uc3QgYWRkQ2xlYW51cCA9IGNsZWFudXAgPT4ge1xuICAgIGNsZWFudXBzTElGTy51bnNoaWZ0KGNsZWFudXApO1xuICB9O1xuICAvKiogQHR5cGUgeyhlcnI/OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+fSAqL1xuICBjb25zdCBmaW5hbGl6ZXIgPSBhc3luYyBlcnIgPT4ge1xuICAgIC8qIFJ1biBlYWNoIGNsZWFudXAgaW4gaXRzIG93biBpc29sYXRlZCBzdGFjay4qL1xuICAgIGNvbnN0IGNsZWFudXBSZXN1bHRzID0gY2xlYW51cHNMSUZPLm1hcChhc3luYyBjbGVhbnVwID0+IHtcbiAgICAgIGF3YWl0IG51bGw7XG4gICAgICByZXR1cm4gY2xlYW51cChlcnIpO1xuICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2VBbGxPckVycm9ycyhjbGVhbnVwUmVzdWx0cyk7XG4gIH07XG4gIHJldHVybiBhZ2dyZWdhdGVUcnlGaW5hbGx5KCgpID0+IGZuKGFkZENsZWFudXApLCBmaW5hbGl6ZXIpO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUXG4gKiBAdHlwZWRlZiB7eyBbUCBpbiBrZXlvZiBUXTogRXhjbHVkZTxUW1BdLCB1bmRlZmluZWQ+IH19IEFsbERlZmluZWRcbiAqL1xuXG4vKipcbiAqIENvbmNpc2Ugd2F5IHRvIGNoZWNrIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGZyb20gb2JqZWN0IGxpdGVyYWwgc2hvcnRoYW5kLlxuICogVGhyb3dzIGVycm9yIG1lc3NhZ2UgdG8gc3BlY2lmeSB0aGUgbWlzc2luZyB2YWx1ZXMuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCkgPT4gYXNzZXJ0cyBvYmogaXMgQWxsRGVmaW5lZDxUPn1cbiAqIEB0aHJvd3MgaWYgYW55IHZhbHVlIGluIHRoZSBvYmplY3QgZW50cmllcyBpcyBub3QgZGVmaW5lZFxuICovJGjNj19vbmNlLndpdGhEZWZlcnJlZENsZWFudXAod2l0aERlZmVycmVkQ2xlYW51cCk7XG4gICAgICAgY29uc3QgYXNzZXJ0QWxsRGVmaW5lZCA9IG9iaiA9PiB7XG4gIGNvbnN0IG1pc3NpbmcgPSBbXTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG1pc3NpbmcucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgRmFpbGBtaXNzaW5nICR7cShtaXNzaW5nKX1gO1xuICB9XG59O1xuXG4vKipcbiAqIEF0dGVudWF0ZSBgc3BlY2ltZW5gIHRvIG9ubHkgcHJvcGVydGllcyBhbGxvd2VkIGJ5IGBwZXJtaXRgLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge1Blcm1pdDxUPn0gUFxuICogQHBhcmFtIHtUfSBzcGVjaW1lblxuICogQHBhcmFtIHtQfSBwZXJtaXRcbiAqIEBwYXJhbSB7PFUsIFN1YlAgZXh0ZW5kcyBQZXJtaXQ8VT4+KGF0dGVudWF0aW9uOiBVLCBwZXJtaXQ6IFN1YlApID0+IFV9IFt0cmFuc2Zvcm1dXG4gKiAgIHVzZWQgdG8gcmVwbGFjZSB0aGUgcmVzdWx0cyBvZiByZWN1cnNpdmUgcGlja3MgKGJ1dCBub3QgYmxhbmtldCBwZXJtaXRzKVxuICogQHJldHVybnMge0F0dGVudWF0ZWQ8VCwgUD59XG4gKi8kaM2PX29uY2UuYXNzZXJ0QWxsRGVmaW5lZChhc3NlcnRBbGxEZWZpbmVkKTtcbiAgICAgICBjb25zdCBhdHRlbnVhdGUgPSAoc3BlY2ltZW4sIHBlcm1pdCwgdHJhbnNmb3JtID0geCA9PiB4KSA9PiB7XG4gIC8qIEZhc3QtcGF0aCBmb3Igbm8gYXR0ZW51YXRpb24uKi9cbiAgaWYgKHBlcm1pdCA9PT0gdHJ1ZSB8fCB0eXBlb2YgcGVybWl0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAvKiogQHR5cGUge0F0dGVudWF0ZWQ8VCwgUD59ICovIChzcGVjaW1lbik7XG4gIH1cblxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBwYXRoID0gW107XG4gIC8qKlxuICogQHRlbXBsYXRlIFN1YlRcbiAqIEB0ZW1wbGF0ZSB7RXhjbHVkZTxQZXJtaXQ8U3ViVD4sIFByaW1pdGl2ZT59IFN1YlBcbiAqIEB0eXBlIHsoc3BlY2ltZW46IFN1YlQsIHBlcm1pdDogU3ViUCkgPT4gQXR0ZW51YXRlZDxTdWJULCBTdWJQPn1cbiAqL1xuICBjb25zdCBleHRyYWN0ID0gKHN1YlNwZWNpbWVuLCBzdWJQZXJtaXQpID0+IHtcbiAgICBpZiAoc3ViUGVybWl0ID09PSBudWxsIHx8IHR5cGVvZiBzdWJQZXJtaXQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBwYXRoLmxlbmd0aCA9PT0gMFxuICAgICAgICA/IEZhaWxgaW52YWxpZCBwZXJtaXQ6ICR7cShwZXJtaXQpfWBcbiAgICAgICAgOiBGYWlsYGludmFsaWQgcGVybWl0IGF0IHBhdGggJHtxKHBhdGgpfTogJHtxKHN1YlBlcm1pdCl9YDtcbiAgICB9IGVsc2UgaWYgKHN1YlNwZWNpbWVuID09PSBudWxsIHx8IHR5cGVvZiBzdWJTcGVjaW1lbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IHBhdGgubGVuZ3RoID09PSAwXG4gICAgICAgID8gRmFpbGBzcGVjaW1lbiBtdXN0IGJlIGFuIG9iamVjdCBmb3IgcGVybWl0ICR7cShwZXJtaXQpfWBcbiAgICAgICAgOiBGYWlsYHNwZWNpbWVuIGF0IHBhdGggJHtxKHBhdGgpfSBtdXN0IGJlIGFuIG9iamVjdCBmb3IgcGVybWl0ICR7cShzdWJQZXJtaXQpfWA7XG4gICAgfVxuICAgIGNvbnN0IHBpY2tzID0gT2JqZWN0LmVudHJpZXMoc3ViUGVybWl0KS5tYXAoKFtzdWJLZXksIGRlZXBQZXJtaXRdKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oc3ViU3BlY2ltZW4sIHN1YktleSkpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBzcGVjaW1lbiBpcyBtaXNzaW5nIHBhdGggJHtxKHBhdGguY29uY2F0KHN1YktleSkpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWVwU3BlY2ltZW4gPSBSZWZsZWN0LmdldChzdWJTcGVjaW1lbiwgc3ViS2V5KTtcbiAgICAgIGlmIChkZWVwUGVybWl0ID09PSB0cnVlIHx8IHR5cGVvZiBkZWVwUGVybWl0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gW3N1YktleSwgZGVlcFNwZWNpbWVuXTtcbiAgICAgIH1cbiAgICAgIHBhdGgucHVzaChzdWJLZXkpO1xuICAgICAgY29uc3QgZXh0cmFjdGVkID0gZXh0cmFjdCgvKiogQHR5cGUge2FueX0gKi8gKGRlZXBTcGVjaW1lbiksIGRlZXBQZXJtaXQpO1xuICAgICAgY29uc3QgZW50cnkgPSBbc3ViS2V5LCBleHRyYWN0ZWRdO1xuICAgICAgcGF0aC5wb3AoKTtcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9KTtcbiAgICByZXR1cm4gdHJhbnNmb3JtKE9iamVjdC5mcm9tRW50cmllcyhwaWNrcyksIHN1YlBlcm1pdCk7XG4gIH07XG5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgcmV0dXJuIGV4dHJhY3Qoc3BlY2ltZW4sIHBlcm1pdCk7XG59O1xuXG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PHVuZGVmaW5lZCwgbmV2ZXI+fSAqLyRozY9fb25jZS5hdHRlbnVhdGUoYXR0ZW51YXRlKTtcbmNvbnN0IG5vdERvbmUgPSBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxuZXZlciwgdm9pZD59ICovXG5jb25zdCBhbHdheXNEb25lID0gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcblxuICAgICAgIGNvbnN0IGZvcmV2ZXIgPSBhc3luY0dlbmVyYXRlKCgpID0+IG5vdERvbmUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFR9IHByb2R1Y2UgVGhlIHZhbHVlIG9mIGBhd2FpdCBwcm9kdWNlKClgIGlzIHVzZWQgZm9yIGl0c1xuICogICB0cnV0aGluZXNzIHZzIGZhbHNpbmVzcy4gSU9XLCBpdCBpcyBjb2VyY2VkIHRvIGEgYm9vbGVhbiBzbyB0aGUgY2FsbGVyIG5lZWRcbiAqICAgbm90IGJvdGhlciBkb2luZyB0aGlzIHRoZW1zZWx2ZXMuXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxBd2FpdGVkPFQ+Pn1cbiAqLyRozY9fb25jZS5mb3JldmVyKGZvcmV2ZXIpO1xuICAgICAgIGNvbnN0IHdoaWxlVHJ1ZSA9IHByb2R1Y2UgPT5cbiAgYXN5bmNHZW5lcmF0ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwcm9kdWNlKCk7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGFsd2F5c0RvbmU7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVH0gcHJvZHVjZSBUaGUgdmFsdWUgb2YgYGF3YWl0IHByb2R1Y2UoKWAgaXMgdXNlZCBmb3IgaXRzXG4gKiAgIHRydXRoaW5lc3MgdnMgZmFsc2luZXNzLiBJT1csIGl0IGlzIGNvZXJjZWQgdG8gYSBib29sZWFuIHNvIHRoZSBjYWxsZXIgbmVlZFxuICogICBub3QgYm90aGVyIGRvaW5nIHRoaXMgdGhlbXNlbHZlcy5cbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPEF3YWl0ZWQ8VD4+fVxuICovJGjNj19vbmNlLndoaWxlVHJ1ZSh3aGlsZVRydWUpO1xuICAgICAgIGNvbnN0IHVudGlsVHJ1ZSA9IHByb2R1Y2UgPT5cbiAgYXN5bmNHZW5lcmF0ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwcm9kdWNlKCk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgZG9uZTogdHJ1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuICB9KTtcblxuLyoqIEB0eXBlIHs8WCwgWT4oeHM6IFhbXSwgeXM6IFlbXSkgPT4gW1gsIFldW119ICovJGjNj19vbmNlLnVudGlsVHJ1ZSh1bnRpbFRydWUpO1xuICAgICAgIGNvbnN0IHppcCA9ICh4cywgeXMpID0+IGhhcmRlbih4cy5tYXAoKHgsIGkpID0+IFt4LCB5c1sraV1dKSk7XG5cbi8qKlxuICogQHR5cGUgezxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgRVJlZjxhbnk+Pj4oXG4gKiAgIG9iajogVCxcbiAqICkgPT4gUHJvbWlzZTx7IFtLIGluIGtleW9mIFRdOiBBd2FpdGVkPFRbS10+IH0+fVxuICovJGjNj19vbmNlLnppcCh6aXApO1xuICAgICAgIGNvbnN0IGFsbFZhbHVlcyA9IGFzeW5jIG9iaiA9PiB7XG4gIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgUHJvbWlzZS5hbGwodmFsdWVzKG9iaikpO1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICByZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKHppcChrZXlzKG9iaiksIHJlc29sdmVkKSkpO1xufTtcblxuLyoqXG4gKiBBIHRlZSBpbXBsZW1lbnRhdGlvbiB3aGVyZSBhbGwgcmVhZGVycyBhcmUgc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlci4gVGhleVxuICogYWxsIGNvbnN1bWUgdGhlIHNvdXJjZSBzdHJlYW0gaW4gbG9ja3N0ZXAsIGFuZCBhbnkgb25lIHJldHVybmluZyBvciB0aHJvd2luZ1xuICogZWFybHkgd2lsbCBhZmZlY3QgdGhlIG90aGVycy5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7QXN5bmNJdGVyYXRvcjxULCB2b2lkLCB2b2lkPn0gc291cmNlU3RyZWFtXG4gKiBAcGFyYW0ge251bWJlcn0gcmVhZGVyQ291bnRcbiAqLyRozY9fb25jZS5hbGxWYWx1ZXMoYWxsVmFsdWVzKTtcbiAgICAgICBjb25zdCBzeW5jaHJvbml6ZWRUZWUgPSAoc291cmNlU3RyZWFtLCByZWFkZXJDb3VudCkgPT4ge1xuICAvKiogQHR5cGUge0l0ZXJhdG9yUmV0dXJuUmVzdWx0PHZvaWQ+IHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgZG9uZVJlc3VsdDtcblxuICAvKipcbiAqIEB0eXBlZGVmIHtJdGVyYXRvclJlc3VsdDxcbiAqICAgKHZhbHVlOiBQcm9taXNlTGlrZTxJdGVyYXRvclJlc3VsdDxUPj4pID0+IHZvaWRcbiAqID59IFF1ZXVlUGF5bG9hZFxuICovXG4gIC8qKiBAdHlwZSB7QXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+W119ICovXG4gIGNvbnN0IHF1ZXVlcyA9IFtdO1xuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgY29uc3QgcHVsbE5leHQgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocXVldWVzLm1hcChxdWV1ZSA9PiBxdWV1ZS5nZXQoKSkpO1xuICAgIGNvbnN0IHJlamVjdGlvbnMgPSBbXTtcbiAgICAvKiogQHR5cGUge0FycmF5PCh2YWx1ZTogUHJvbWlzZUxpa2U8SXRlcmF0b3JSZXN1bHQ8VD4+KSA9PiB2b2lkPn0gKi9cbiAgICBjb25zdCByZXNvbHZlcnMgPSBbXTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGZvciAoY29uc3Qgc2V0dGxlZFJlc3VsdCBvZiByZXF1ZXN0cykge1xuICAgICAgaWYgKHNldHRsZWRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIHJlamVjdGlvbnMucHVzaChzZXR0bGVkUmVzdWx0LnJlYXNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lIHx8PSAhIXNldHRsZWRSZXN1bHQudmFsdWUuZG9uZTtcbiAgICAgICAgcmVzb2x2ZXJzLnB1c2goc2V0dGxlZFJlc3VsdC52YWx1ZS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj59ICovXG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoZG9uZVJlc3VsdCkge1xuICAgICAgcmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKGRvbmVSZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAocmVqZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbWFrZUVycm9yKFhgVGVlZCBzdHJlYW0gdGhyZXdgKTtcbiAgICAgIGFubm90YXRlRXJyb3IoZXJyb3IsIFhgVGVlZCByZWplY3Rpb25zOiAke3JlamVjdGlvbnN9YCk7XG4gICAgICByZXN1bHQgPVxuICAgICAgICBzb3VyY2VTdHJlYW0udGhyb3c/LihlcnJvcikgfHxcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHNvdXJjZVN0cmVhbS5yZXR1cm4/LigpKS50aGVuKCgpID0+XG4gICAgICAgICAgUHJvbWlzZS5yZWplY3QoZXJyb3IpLFxuICAgICAgICApO1xuICAgIH0gZWxzZSBpZiAoZG9uZSkge1xuICAgICAgcmVzdWx0ID1cbiAgICAgICAgc291cmNlU3RyZWFtLnJldHVybj8uKCkgfHxcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc291cmNlU3RyZWFtLm5leHQoKTtcbiAgICB9XG4gICAgcmVzdWx0LnRoZW4oXG4gICAgICByID0+IHtcbiAgICAgICAgaWYgKHIuZG9uZSkge1xuICAgICAgICAgIGRvbmVSZXN1bHQgPSByO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBkb25lUmVzdWx0ID0geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICB9LFxuICAgICk7XG4gICAgZm9yIChjb25zdCByZXNvbHZlIG9mIHJlc29sdmVycykge1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcHVsbE5leHQoKTtcbiAgfTtcblxuICBjb25zdCByZWFkZXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogcmVhZGVyQ291bnQgfSkubWFwKCgpID0+IHtcbiAgICAvKiogQHR5cGUge0FzeW5jUXVldWU8UXVldWVQYXlsb2FkPn0gKi9cbiAgICBjb25zdCBxdWV1ZSA9IG1ha2VRdWV1ZSgpO1xuICAgIHF1ZXVlcy5wdXNoKHF1ZXVlKTtcblxuICAgIC8qKiBAdHlwZSB7QXN5bmNHZW5lcmF0b3I8VCwgdm9pZCwgdm9pZD59ICovXG4gICAgY29uc3QgcmVhZGVyID0gaGFyZGVuKHtcbiAgICAgIGFzeW5jIG5leHQoKSB7XG4gICAgICAgIC8qKlxuICogQHR5cGUge1Byb21pc2VLaXQ8SXRlcmF0b3JSZXN1bHQ8VD4+fVxuICovXG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgICAgcXVldWUucHV0KHsgdmFsdWU6IHJlc29sdmUsIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBhc3luYyByZXR1cm4oKSB7XG4gICAgICAgIC8qKlxuICogQHR5cGUge1Byb21pc2VLaXQ8SXRlcmF0b3JSZXN1bHQ8VD4+fVxuICovXG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgICAgcXVldWUucHV0KHsgdmFsdWU6IHJlc29sdmUsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHRocm93KHJlYXNvbikge1xuICAgICAgICBjb25zdCByZWplY3Rpb24gPSBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICAgICAgICBxdWV1ZS5wdXQocmVqZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlamVjdGlvbjtcbiAgICAgIH0sXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbiAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiByZWFkZXI7XG4gICAgICB9LFxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG4gICAgICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG4gICAgICAgIGF3YWl0IHJlYWRlci5yZXR1cm4oKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlYWRlcjtcbiAgfSk7XG5cbiAgdm9pZCBwdWxsTmV4dCgpO1xuICByZXR1cm4gcmVhZGVycztcbn07JGjNj19vbmNlLnN5bmNocm9uaXplZFRlZShzeW5jaHJvbml6ZWRUZWUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsib2JqZWN0TWFwIjpbIm9iamVjdE1hcCIsZmFsc2VdLCJvYmplY3RNZXRhTWFwIjpbIm9iamVjdE1ldGFNYXAiLGZhbHNlXSwiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGltaXRlZENvbnNvbGUiOlsibWFrZUxpbWl0ZWRDb25zb2xlIl0sImRlZXBseUZ1bGZpbGxlZE9iamVjdCI6WyJkZWVwbHlGdWxmaWxsZWRPYmplY3QiXSwic3RyaXBQcmVmaXgiOlsic3RyaXBQcmVmaXgiXSwidGhyb3dFcnJvckNvZGUiOlsidGhyb3dFcnJvckNvZGUiXSwidHJ5Tm93IjpbInRyeU5vdyJdLCJ0cnlKc29uUGFyc2UiOlsidHJ5SnNvblBhcnNlIl0sIlByb21pc2VBbGxPckVycm9ycyI6WyJQcm9taXNlQWxsT3JFcnJvcnMiXSwiYWdncmVnYXRlVHJ5RmluYWxseSI6WyJhZ2dyZWdhdGVUcnlGaW5hbGx5Il0sIndpdGhEZWZlcnJlZENsZWFudXAiOlsid2l0aERlZmVycmVkQ2xlYW51cCJdLCJhc3NlcnRBbGxEZWZpbmVkIjpbImFzc2VydEFsbERlZmluZWQiXSwiYXR0ZW51YXRlIjpbImF0dGVudWF0ZSJdLCJmb3JldmVyIjpbImZvcmV2ZXIiXSwid2hpbGVUcnVlIjpbIndoaWxlVHJ1ZSJdLCJ1bnRpbFRydWUiOlsidW50aWxUcnVlIl0sInppcCI6WyJ6aXAiXSwiYWxsVmFsdWVzIjpbImFsbFZhbHVlcyJdLCJzeW5jaHJvbml6ZWRUZWUiOlsic3luY2hyb25pemVkVGVlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANHeDdCREgAAkRIAACwAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdGVzdGluZy11dGlscy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZXZlbnRMb29wSXRlcmF0aW9uIiwiaW5zcGVjdE1hcFN0b3JlIiwidGVzdEludGVycnVwdGVkU3RlcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cbi8qKlxuICogQGZpbGUgbm90ZSB0aGlzIGNhbm5vdCBiZSBjYWxsZWQgdGVzdC11dGlscy5qcyBkdWUgdG9cbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy83NTAzXG4gKi9cbi8qIGdsb2JhbCBzZXRJbW1lZGlhdGUgKi9cbi8qKlxuICogQGltcG9ydCB7TWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICogQGltcG9ydCB7RXhlY3V0aW9uQ29udGV4dCBhcyBBdmFUfSBmcm9tICdhdmEnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZXZlbnR1YWwtc2VuZCc7XG4gKi9cblxuLyoqXG4gKiBBIHdvcmthcm91bmQgZm9yIHNvbWUgaXNzdWVzIHdpdGggZmFrZSB0aW1lIGluIHRlc3RzLlxuICpcbiAqIExpbmVzIG9mIHRlc3QgY29kZSBjYW4gZGVwZW5kIG9uIGFzeW5jIHByb21pc2VzIG91dHNpZGUgdGhlIHRlc3QgcmVzb2x2aW5nXG4gKiBiZWZvcmUgdGhleSBydW4uIEF3YWl0aW5nIHRoaXMgZnVuY3Rpb24gcmVzdWx0IGVuc3VyZXMgdGhhdCBhbGwgcHJvbWlzZXMgdGhhdFxuICogY2FuIGRvIHJlc29sdmUuIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgbWVhbiBhbGwgb3V0c3RhbmRpbmcgcHJvbWlzZXMuXG4gKi9cbiAgICAgICBjb25zdCBldmVudExvb3BJdGVyYXRpb24gPSBhc3luYyAoKSA9PlxuICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldEltbWVkaWF0ZShyZXNvbHZlKSk7JGjNj19vbmNlLmV2ZW50TG9vcEl0ZXJhdGlvbihldmVudExvb3BJdGVyYXRpb24pO1xuaGFyZGVuKGV2ZW50TG9vcEl0ZXJhdGlvbik7XG5cbi8qKiBAdHlwZSB7KHZhbHVlOiBhbnkpID0+IHN0cmluZ30gKi9cbmNvbnN0IHN0cmluZ09yVGFnID0gdmFsdWUgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddO1xuICB9XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufTtcbi8qKlxuICogQHBhcmFtIHtNYXBTdG9yZX0gc3RvcmVcbiAqIEByZXR1cm5zIHtvYmplY3R9IHRyZWUgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdG9yZVxuICovXG4gICAgICAgY29uc3QgaW5zcGVjdE1hcFN0b3JlID0gc3RvcmUgPT4ge1xuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqL1xuICBjb25zdCBvYmogPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygc3RvcmUua2V5cygpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICBjb25zdCBoYXNLZXlzID1cbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT0gbnVsbCAmJiAna2V5cycgaW4gdmFsdWU7XG4gICAgY29uc3QgaW5kZXggPSBzdHJpbmdPclRhZyhrZXkpO1xuICAgIGlmIChoYXNLZXlzICYmICdnZXQnIGluIHZhbHVlKSB7XG4gICAgICBvYmpbaW5kZXhdID0gaW5zcGVjdE1hcFN0b3JlKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0tleXMpIHtcbiAgICAgIG9ialtpbmRleF0gPSBBcnJheS5mcm9tKHZhbHVlLmtleXMoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtpbmRleF0gPVxuICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWVcbiAgICAgICAgICA/IHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ11cbiAgICAgICAgICA6IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufTskaM2PX29uY2UuaW5zcGVjdE1hcFN0b3JlKGluc3BlY3RNYXBTdG9yZSk7XG5oYXJkZW4oaW5zcGVjdE1hcFN0b3JlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW0lucHV0PWFueV1cbiAqIEB0eXBlZGVmIHtyZWFkb25seSBbXG4gKiAgIHN0ZXBOYW1lOiBzdHJpbmcsXG4gKiAgIGZuOiAoaW5wdXQ6IFBhcnRpYWw8SW5wdXQ+LCBsYWJlbDogc3RyaW5nKSA9PiBQYXJ0aWFsPElucHV0PiB8IFByb21pc2VMaWtlPFBhcnRpYWw8SW5wdXQ+PixcbiAqIF19IFRlc3RTdGVwXG4gKi9cblxuLyoqXG4gKiBGb3IgZWFjaCBzdGVwLCBydW4gdG8ganVzdCBiZWZvcmUgdGhhdCBwb2ludCBhbmQgcGF1c2UgZm9yIGNvbnRpbnVhdGlvbiBhZnRlclxuICogaW50ZXJydXB0LlxuICpcbiAqIEB0ZW1wbGF0ZSBbSW5wdXQ9YW55XVxuICogQHRlbXBsYXRlIFtDb250ZXh0PXVua25vd25dXG4gKiBAcGFyYW0ge0F2YVQ8Q29udGV4dD59IHRcbiAqIEBwYXJhbSB7cmVhZG9ubHkgVGVzdFN0ZXA8SW5wdXQ+W119IGFsbFN0ZXBzXG4gKiBAcGFyYW0geyh0OiBBdmFUPENvbnRleHQ+KSA9PiBFUmVmPHZvaWQ+fSBbZG9JbnRlcnJ1cHRdXG4gKi9cbiAgICAgICBjb25zdCB0ZXN0SW50ZXJydXB0ZWRTdGVwcyA9IGFzeW5jICh0LCBhbGxTdGVwcywgZG9JbnRlcnJ1cHQpID0+IHtcbiAgLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBsYWJlbDogc3RyaW5nO1xuICogICBhY2N1bTogUGFydGlhbDxJbnB1dD47XG4gKiB9fSBSdW5TdGF0ZVxuICovXG5cbiAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEBwYXJhbSB7cmVhZG9ubHkgVGVzdFN0ZXA8SW5wdXQ+W119IHN0ZXBzXG4gKiBAcGFyYW0ge1J1blN0YXRlfSBbcnVuU3RhdGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSdW5TdGF0ZT59XG4gKi9cbiAgY29uc3QgcnVuU3RlcHMgPSBhc3luYyAobGFiZWwsIHN0ZXBzLCBydW5TdGF0ZSA9IHsgbGFiZWwsIGFjY3VtOiB7fSB9KSA9PiB7XG4gICAgYXdhaXQgbnVsbDtcbiAgICBsZXQgYWNjdW0gPSBydW5TdGF0ZS5hY2N1bTtcbiAgICBjb25zdCBydW5MYWJlbCA9IHJ1blN0YXRlLmxhYmVsO1xuICAgIGZvciAoY29uc3QgW3N0ZXBOYW1lLCBmbl0gb2Ygc3RlcHMpIHtcbiAgICAgIGF3YWl0IHQubm90VGhyb3dzQXN5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhY2N1bSA9IGF3YWl0IGZuKGFjY3VtLCBydW5MYWJlbCk7XG4gICAgICB9LCBgJHtsYWJlbH0gJHtzdGVwTmFtZX0gbXVzdCBjb21wbGV0ZSBzdWNjZXNzZnVsbHlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbGFiZWw6IHJ1bkxhYmVsLCBhY2N1bSB9O1xuICB9O1xuXG4gIC8qIFNhbml0eSBjaGVjayovXG4gIGF3YWl0IHJ1blN0ZXBzKCdwcmUtaW50ZXJydXB0JywgYWxsU3RlcHMpO1xuICBpZiAoIWRvSW50ZXJydXB0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gKiBAdHlwZSB7e1xuICogICBydW5TdGF0ZTogUnVuU3RhdGU7XG4gKiAgIHJlbWFpbmluZ1N0ZXBzOiByZWFkb25seSBUZXN0U3RlcDxJbnB1dD5bXTtcbiAqIH1bXX1cbiAqL1xuICBjb25zdCBwYXVzZWRSdW5zID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsU3RlcHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBbYmVmb3JlU3RlcE5hbWVdID0gYWxsU3RlcHNbaV07XG4gICAgY29uc3QgcnVuU3RhdGUgPSBhd2FpdCBydW5TdGVwcyhcbiAgICAgIGBwcmUtJHtiZWZvcmVTdGVwTmFtZX1gLFxuICAgICAgYWxsU3RlcHMuc2xpY2UoMCwgaSksXG4gICAgICB7IGxhYmVsOiBgcGF1c2UtYmVmb3JlLSR7YmVmb3JlU3RlcE5hbWV9YCwgYWNjdW06IHt9IH0sXG4gICAgKTtcbiAgICBwYXVzZWRSdW5zLnB1c2goeyBydW5TdGF0ZSwgcmVtYWluaW5nU3RlcHM6IGFsbFN0ZXBzLnNsaWNlKGkpIH0pO1xuICB9XG5cbiAgLyogUnVuIHRoZSB1c2VyIGNvZGUgdGhhdCBpbnRlcnJ1cHRzIHRoZSBzdGVwcy4qL1xuICBhd2FpdCBkb0ludGVycnVwdCh0KTtcblxuICAvKiBWZXJpZnkgYSBjb21wbGV0ZSBydW4gcG9zdC1pbnRlcnJ1cHQuKi9cbiAgYXdhaXQgcnVuU3RlcHMoJ3Bvc3QtaW50ZXJydXB0JywgYWxsU3RlcHMpO1xuXG4gIC8qIFZlcmlmeSBjb21wbGV0aW9uIG9mIGVhY2ggcGF1c2VkIHN0ZXAuKi9cbiAgZm9yIChjb25zdCB7IHJ1blN0YXRlLCByZW1haW5pbmdTdGVwcyB9IG9mIHBhdXNlZFJ1bnMpIHtcbiAgICBjb25zdCBbYmVmb3JlU3RlcE5hbWVdID0gcmVtYWluaW5nU3RlcHNbMF07XG4gICAgYXdhaXQgcnVuU3RlcHMoYHJlc3VtZWQtJHtiZWZvcmVTdGVwTmFtZX1gLCByZW1haW5pbmdTdGVwcywgcnVuU3RhdGUpO1xuICB9XG59OyRozY9fb25jZS50ZXN0SW50ZXJydXB0ZWRTdGVwcyh0ZXN0SW50ZXJydXB0ZWRTdGVwcyk7XG5oYXJkZW4odGVzdEludGVycnVwdGVkU3RlcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZXZlbnRMb29wSXRlcmF0aW9uIjpbImV2ZW50TG9vcEl0ZXJhdGlvbiJdLCJpbnNwZWN0TWFwU3RvcmUiOlsiaW5zcGVjdE1hcFN0b3JlIl0sInRlc3RJbnRlcnJ1cHRlZFN0ZXBzIjpbInRlc3RJbnRlcnJ1cHRlZFN0ZXBzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANqI2yvWAwAA1gMAACUAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdG1wRGlyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVGVtcERpckZhY3RvcnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyoqXG4gKiBDcmVhdGUgYSBgdG1wRGlyYCBmdW5jdGlvbiB0aGF0IHN5bmNocm9ub3VzbHkgY3JlYXRlcyBhIHRlbXBvcmFyeSBkaXJlY3RvcnlcbiAqIGFuZCBhIGZ1bmN0aW9uIGZvciBkZWxldGluZyBpdCBhbG9uZyB3aXRoIGFueSBhZGRlZCBjb250ZW50cy5cbiAqXG4gKiBAcGFyYW0ge1BpY2s8SU1QT1JUKCd0bXAnKSwgJ2RpclN5bmMnPn0gdG1wXG4gKi9cbiAgICAgICBjb25zdCBtYWtlVGVtcERpckZhY3RvcnkgPSB0bXAgPT4ge1xuICAvKiogQHR5cGUgeyhwcmVmaXg/OiBzdHJpbmcpID0+IFtkaXJOYW1lOiBzdHJpbmcsIGNsZWFudXA6ICgpID0+IHZvaWRdfSAqL1xuICBjb25zdCB0bXBEaXIgPSBwcmVmaXggPT4ge1xuICAgIGNvbnN0IHsgbmFtZSwgcmVtb3ZlQ2FsbGJhY2sgfSA9IHRtcC5kaXJTeW5jKHtcbiAgICAgIHByZWZpeCxcbiAgICAgIHVuc2FmZUNsZWFudXA6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIFtuYW1lLCByZW1vdmVDYWxsYmFja107XG4gIH07XG4gIHJldHVybiB0bXBEaXI7XG59OyRozY9fb25jZS5tYWtlVGVtcERpckZhY3RvcnkobWFrZVRlbXBEaXJGYWN0b3J5KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUZW1wRGlyRmFjdG9yeSI6WyJtYWtlVGVtcERpckZhY3RvcnkiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATmKnlqEEAAChBAAAKAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlQ2hlY2suanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJjYXN0IiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAodHlwZWxlc3NNdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qKlxuICogQGltcG9ydCB7TXVzdE1hdGNoLCBQYXR0ZXJuVHlwZSwgVHlwZWRQYXR0ZXJufSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKiogQHR5cGUge011c3RNYXRjaH0gKi9cbiAgICAgICBjb25zdCBtdXN0TWF0Y2ggPSB0eXBlbGVzc011c3RNYXRjaDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHBhcmFtIHtUeXBlZFBhdHRlcm48TT59IHBhdHRcbiAqIEByZXR1cm5zIHtNfVxuICovJGjNj19vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpO1xuICAgICAgIGNvbnN0IGNhc3QgPSAoc3BlY2ltZW4sIHBhdHQpID0+IHtcbiAgLyogbXVzdE1hdGNoIHRocm93cyBpZiB0aGV5IGRvbid0LCB3aGljaCBtZWFucyB0aGF0IGBjYXN0YCBhbHNvIG5hcnJvd3MgdGhlKi9cbiAgLyogdHlwZSBidXQgYSBmdW5jdGlvbiBjYW4ndCBib3RoIG5hcnJvdyBhbmQgcmV0dXJuIGEgdHlwZS4gVGhhdCBpcyBieSBkZXNpZ246Ki9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zNDYzNiNpc3N1ZWNvbW1lbnQtNTQ1MDI1OTE2Ki9cbiAgbXVzdE1hdGNoKHNwZWNpbWVuLCBwYXR0KTtcbiAgcmV0dXJuIHNwZWNpbWVuO1xufTskaM2PX29uY2UuY2FzdChjYXN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXSwiY2FzdCI6WyJjYXN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKt8dcSjBQAAowUAACkAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIkJyaWRnZUJpZ0ludFNoYXBlIiwiU3RvcmFnZU5vZGVTaGFwZSIsIlVuZ3VhcmRlZEhlbHBlckkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm59IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbiAgICAgICBjb25zdCBTdG9yYWdlTm9kZVNoYXBlID0gTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJyk7XG5cbi8qKiBUbyBiZSB1c2VkIG9ubHkgZm9yICdoZWxwZXInIGZhY2V0cyB3aGVyZSB0aGUgY2FsbHMgYXJlIGZyb20gdHJ1c3RlZCBjb2RlLiAqLyRozY9fb25jZS5TdG9yYWdlTm9kZVNoYXBlKFN0b3JhZ2VOb2RlU2hhcGUpO1xuICAgICAgIGNvbnN0IFVuZ3VhcmRlZEhlbHBlckkgPSBNLmludGVyZmFjZShcbiAgJ2hlbHBlcicsXG4gIHt9LFxuICAvKiBub3QgZXhwb3NlZCBzbyB1c2luZyBgZGVmYXVsdEd1YXJkc2AgaXMgZmluZS4qL1xuICB7IGRlZmF1bHRHdWFyZHM6ICdwYXNzYWJsZScgfSxcbik7XG5cbi8qKlxuICogQHR5cGVkZWYge251bWJlciB8IGAke2JpZ2ludH1gfSBCcmlkZ2VCaWdJbnQgRW5zdXJlIHRoYXQgY2FsbGVlcyBwYXNzZWQgYVxuICogICBicmlkZ2UgbWVzc2FnZSB0aGF0IHdhcyBzZXJpYWxpc2VkIGZyb20gYSBHb2xhbmcgaW50NjQgb3IgdWludDY0IGFjY2VwdFxuICogICBlaXRoZXIgYSBKUyBudW1iZXIgb3IgYSBzdHJpbmdpZmllZCBKUyBiaWdpbnQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPEJyaWRnZUJpZ0ludD59XG4gKi8kaM2PX29uY2UuVW5ndWFyZGVkSGVscGVySShVbmd1YXJkZWRIZWxwZXJJKTtcbiAgICAgICBjb25zdCBCcmlkZ2VCaWdJbnRTaGFwZSA9IE0ub3IoTS5udW1iZXIoKSwgTS5zdHJpbmcoKSk7JGjNj19vbmNlLkJyaWRnZUJpZ0ludFNoYXBlKEJyaWRnZUJpZ0ludFNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlN0b3JhZ2VOb2RlU2hhcGUiOlsiU3RvcmFnZU5vZGVTaGFwZSJdLCJVbmd1YXJkZWRIZWxwZXJJIjpbIlVuZ3VhcmRlZEhlbHBlckkiXSwiQnJpZGdlQmlnSW50U2hhcGUiOlsiQnJpZGdlQmlnSW50U2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADXhxk9cAwAAHAMAAAqAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3VwZ3JhZGUtYXBpLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSIsImlzQWJhbmRvbmVkRXJyb3IiLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIiwibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSxtYXRjaGVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBpc0Zyb3plbiB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEFuIEVycm9yLWxpa2Ugb2JqZWN0IGZvciB1c2UgYXMgdGhlIHJlamVjdGlvbiByZWFzb24gb2YgcHJvbWlzZXMgYWJhbmRvbmVkIGJ5XG4gKiB1cGdyYWRlLlxuICpcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIG5hbWU6ICd2YXRVcGdyYWRlZCc7XG4gKiAgIHVwZ3JhZGVNZXNzYWdlOiBzdHJpbmc7XG4gKiAgIGluY2FybmF0aW9uTnVtYmVyOiBudW1iZXI7XG4gKiB9fSBVcGdyYWRlRGlzY29ubmVjdGlvblxuICovXG5cbiAgICAgICBjb25zdCBVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlID0gaGFyZGVuKHtcbiAgbmFtZTogJ3ZhdFVwZ3JhZGVkJyxcbiAgdXBncmFkZU1lc3NhZ2U6IE0uc3RyaW5nKCksXG4gIGluY2FybmF0aW9uTnVtYmVyOiBNLm51bWJlcigpLFxufSk7XG5cbi8qKlxuICogTWFrZXMgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIHVzZSBhcyB0aGUgcmVqZWN0aW9uIHJlYXNvbiBvZiBwcm9taXNlc1xuICogYWJhbmRvbmVkIGJ5IHVwZ3JhZGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVwZ3JhZGVNZXNzYWdlXG4gKiBAcGFyYW0ge251bWJlcn0gdG9JbmNhcm5hdGlvbk51bWJlclxuICogQHJldHVybnMge1VwZ3JhZGVEaXNjb25uZWN0aW9ufVxuICovJGjNj19vbmNlLlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUoVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSk7XG4gICAgICAgY29uc3QgbWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uID0gKHVwZ3JhZGVNZXNzYWdlLCB0b0luY2FybmF0aW9uTnVtYmVyKSA9PlxuICBoYXJkZW4oe1xuICAgIG5hbWU6ICd2YXRVcGdyYWRlZCcsXG4gICAgdXBncmFkZU1lc3NhZ2UsXG4gICAgaW5jYXJuYXRpb25OdW1iZXI6IHRvSW5jYXJuYXRpb25OdW1iZXIsXG4gIH0pOyRozY9fb25jZS5tYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcbmhhcmRlbihtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSByZWFzb24gSWYgYHJlYXNvbmAgaXMgbm90IGZyb3plbiwgaXQgY2Fubm90IGJlIGFuXG4gKiAgIFVwZ3JhZGVEaXNjb25uZWN0aW9uLCBzbyByZXR1cm5zIGZhbHNlIHdpdGhvdXQgZXZlbiBjaGVja2luZyBhZ2FpbnN0IHRoZVxuICogICBzaGFwZS5cbiAqIEByZXR1cm5zIHtyZWFzb24gaXMgVXBncmFkZURpc2Nvbm5lY3Rpb259XG4gKi9cbiAgICAgICBjb25zdCBpc1VwZ3JhZGVEaXNjb25uZWN0aW9uID0gcmVhc29uID0+XG4gIHJlYXNvbiAhPSBudWxsICYmIC8qIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxKi9cbiAgaXNGcm96ZW4ocmVhc29uKSAmJlxuICBtYXRjaGVzKHJlYXNvbiwgVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSk7JGjNj19vbmNlLmlzVXBncmFkZURpc2Nvbm5lY3Rpb24oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgcmVhc29uIGlzIGEgJ3ZhdCB0ZXJtaW5hdGVkJyBlcnJvciBnZW5lcmF0ZWQgd2hlbiBhbiBvYmplY3RcbiAqIGlzIGFiYW5kb25lZCBieSBhIHZhdCBkdXJpbmcgYW4gdXBncmFkZS5cbiAqXG4gKiBOb3JtYWxseSB3ZSBkbyBub3Qgd2FudCB0byByZWx5IG9uIHRoZSBgbWVzc2FnZWAgb2YgYW4gZXJyb3Igb2JqZWN0LCBidXQgdGhpc1xuICogaXMgYSBwcmFnbWF0aWMgc29sdXRpb24gdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdmF0IHVwZ3JhZGUgZXJyb3JzLiBJbiB0aGVcbiAqIGZ1dHVyZSB3ZSdkIHByZWZlciBoYXZpbmcgYW4gZXJyb3Igd2l0aCBhIGNhdXNlIHJlZmVyZW5jaW5nIGEgZGlzY29ubmVjdGlvblxuICogb2JqZWN0IGxpa2UgZm9yIHByb21pc2UgcmVqZWN0aW9ucy4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzk1ODJcbiAqXG4gKiBAcGFyYW0ge2FueX0gcmVhc29uXG4gKiBAcmV0dXJucyB7cmVhc29uIGlzIEVycm9yfVxuICovXG4gICAgICAgY29uc3QgaXNBYmFuZG9uZWRFcnJvciA9IHJlYXNvbiA9PlxuICByZWFzb24gIT0gbnVsbCAmJiAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcSovXG4gIGlzRnJvemVuKHJlYXNvbikgJiZcbiAgbWF0Y2hlcyhyZWFzb24sIE0uZXJyb3IoKSkgJiZcbiAgLyogV2UncmUgbm90IHVzaW5nIGEgY29uc3RhbnQgaGVyZSBzaW5jZSB0aGlzIHNwZWNpYWwgdmFsdWUgaXMgYWxyZWFkeSovXG4gIC8qIHNwcmlua2xlZCB0aHJvdWdob3V0IHRoZSBTREsqL1xuICByZWFzb24ubWVzc2FnZSA9PT0gJ3ZhdCB0ZXJtaW5hdGVkJzskaM2PX29uY2UuaXNBYmFuZG9uZWRFcnJvcihpc0FiYW5kb25lZEVycm9yKTtcbmhhcmRlbihpc0FiYW5kb25lZEVycm9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiOlsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSJdLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIl0sImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc0FiYW5kb25lZEVycm9yIjpbImlzQWJhbmRvbmVkRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP+FBPBkUAAAZFAAAMwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N1YnNjcmliZS5qcyJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsc3Vic2NyaWJlTGF0ZXN0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVMYXRlc3RcIixbJGjNj19hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtCYXNlTm90aWZpZXIsIEl0ZXJhdGlvbk9ic2VydmVyLCBMYXRlc3RUb3BpY30gZnJvbSAnLi4vc3JjL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgc3Vic2NyaWJlTGF0ZXN0YCBmcm9tIGBAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qc2AgaW5zdGVhZC5cbiAqXG4gKiBBZGFwdG9yIGZyb20gYSBub3RpZmllclAgdG8gYW4gYXN5bmMgaXRlcmFibGUuXG4gKiBUaGUgbm90aWZpZXJQIGNhbiBiZSBhbnkgb2JqZWN0IHRoYXQgaGFzIGFuIGV2ZW50dWFsbHkgaW52b2NhYmxlXG4gKiBgZ2V0VXBkYXRlU2luY2VgIG1ldGhvZCB0aGF0IGJlaGF2ZXMgYWNjb3JkaW5nIHRvIHRoZSBub3RpZmllclxuICogc3BlYy4gVGhpcyBjYW4gYmUgYSBub3RpZmllciwgYSBwcm9taXNlIGZvciBhIGxvY2FsIG9yIHJlbW90ZVxuICogbm90aWZpZXIsIG9yIGEgcHJlc2VuY2Ugb2YgYSByZW1vdGUgbm90aWZpZXIuXG4gKlxuICogSXQgaXMgYWxzbyB1c2VkIGludGVybmFsbHkgYnkgbm90aWZpZXIuanMgc28gdGhhdCBhIG5vdGlmaWVyIGl0c2VsZiBpcyBhblxuICogYXN5bmMgaXRlcmFibGUuXG4gKlxuICogQW4gYXN5bmMgaXRlcmFibGUgaXMgYW4gb2JqZWN0IHdpdGggYSBgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpYCBtZXRob2RcbiAqIHRoYXQgcmV0dXJucyBhbiBhc3luYyBpdGVyYXRvci4gVGhlIGFzeW5jIGl0ZXJhdG9yIHdlIHJldHVybiBoZXJlIGhhcyBvbmx5XG4gKiBhIGBuZXh0KClgIG1ldGhvZCwgd2l0aG91dCB0aGUgb3B0aW9uYWwgYHJldHVybmAgYW5kIGB0aHJvd2AgbWV0aG9kcy4gVGhlXG4gKiBvbWl0dGVkIG1ldGhvZHMsIGlmIHByZXNlbnQsIHdvdWxkIGJlIHVzZWQgYnkgdGhlIGZvci9hd2FpdC9vZiBsb29wIHRvXG4gKiBpbmZvcm0gdGhlIGl0ZXJhdG9yIG9mIGVhcmx5IHRlcm1pbmF0aW9uLiBCdXQgdGhpcyBhZGFwdG9yIHdvdWxkIG5vdCBkb1xuICogYW55dGhpbmcgdXNlZnVsIGluIHJlYWN0aW9uIHRvIHRoaXMgbm90aWZpY2F0aW9uLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhdG9yJ3MgYG5leHQoKWAgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIGZvciBhbiBpdGVyYXRpb25cbiAqIHJlc3VsdC4gQW4gaXRlcmF0aW9uIHJlc3VsdCBpcyBhIHJlY29yZCB3aXRoIGB2YWx1ZWAgYW5kIGBkb25lYCBwcm9wZXJ0aWVzLlxuICpcbiAqIFRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIG9uIHRoZSBub3RpZmllciBwcm90b2NvbCBpcyB0byBoYXZlIGEgbG9zc3lcbiAqIGFkYXB0b3IsIHdoZXJlIGludGVybWVkaWF0ZSByZXN1bHRzIGNhbiBiZSBtaXNzZWQgaW4gZmF2b3Igb2YgbW9yZSByZWNlbnRcbiAqIHJlc3VsdHMgd2hpY2ggYXJlIHRoZXJlZm9yZSBsZXNzIHN0YWxlLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvZG9jdW1lbnRhdGlvbi9ibG9iL0hFQUQvbWFpbi9ndWlkZXMvanMtcHJvZ3JhbW1pbmcvbm90aWZpZXJzLm1kXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxCYXNlTm90aWZpZXI8VD4+fSBub3RpZmllclBcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGU8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciA9IHN1YnNjcmliZUxhdGVzdDtcblxuLyoqXG4gKiBUaGlzIGFkdmFuY2VzIGBhc3luY0l0ZXJhdG9yUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdG9yYCBmZWF0dXJlIHRlc3RzIGZvciB0aG9zZSBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhdG9yPFQ+Pn0gYXN5bmNJdGVyYXRvclBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjNj19vbmNlLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKTtcbiAgICAgICBjb25zdCBvYnNlcnZlSXRlcmF0b3IgPSAoYXN5bmNJdGVyYXRvclAsIGl0ZXJhdGlvbk9ic2VydmVyKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgoYWNrLCBvYnNlcnZlckVycm9yKSA9PiB7XG4gICAgY29uc3QgcmVjdXIgPSAoKSA9PiB7XG4gICAgICBFLndoZW4oXG4gICAgICAgIEUoYXN5bmNJdGVyYXRvclApLm5leHQoKSxcbiAgICAgICAgKHsgdmFsdWUsIGRvbmUgfSkgPT4ge1xuICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICBpdGVyYXRpb25PYnNlcnZlci5maW5pc2ggJiYgaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGFjayh1bmRlZmluZWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSAmJlxuICAgICAgICAgICAgICBpdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICByZWN1cigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uID0+IHtcbiAgICAgICAgICBpdGVyYXRpb25PYnNlcnZlci5mYWlsICYmIGl0ZXJhdGlvbk9ic2VydmVyLmZhaWwocmVhc29uKTtcbiAgICAgICAgICBhY2sodW5kZWZpbmVkKTtcbiAgICAgICAgfSxcbiAgICAgICkuY2F0Y2gob2JzZXJ2ZXJFcnJvcik7XG4gICAgfTtcbiAgICByZWN1cigpO1xuICB9KTtcbn07XG5cbi8qKlxuICogVGhpcyByZWFkcyBmcm9tIGBhc3luY0l0ZXJhYmxlUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdGlvbmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRozY9fb25jZS5vYnNlcnZlSXRlcmF0b3Iob2JzZXJ2ZUl0ZXJhdG9yKTtcbiAgICAgICBjb25zdCBvYnNlcnZlSXRlcmF0aW9uID0gKGFzeW5jSXRlcmFibGVQLCBpdGVyYXRpb25PYnNlcnZlcikgPT4ge1xuICBjb25zdCBpdGVyYXRvclAgPSBFKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgcmV0dXJuIG9ic2VydmVJdGVyYXRvcihpdGVyYXRvclAsIGl0ZXJhdGlvbk9ic2VydmVyKTtcbn07XG5cbi8qKlxuICogQXMgdXBkYXRlcyBjb21lIGluIGZyb20gdGhlIHBvc3NpYmx5IHJlbW90ZSBgbm90aWZpZXJQYCwgdXBkYXRlXG4gKiB0aGUgbG9jYWwgYHVwZGF0ZXJgLiBTaW5jZSB0aGUgdXBkYXRlcyBjb21lIGZyb20gYSBub3RpZmllciwgdGhleVxuICogYXJlIGxvc3N5LCBpLmUuLCBvbmNlIGEgbW9yZSByZWNlbnQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkLCBsZXNzIHJlY2VudFxuICogc3RhdGVzIGFyZSBhc3N1bWVkIGlycmVsZXZhbnQgYW5kIGRyb3BwZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IG5vdGlmaWVyUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaM2PX29uY2Uub2JzZXJ2ZUl0ZXJhdGlvbihvYnNlcnZlSXRlcmF0aW9uKTtcbiAgICAgICBjb25zdCBvYnNlcnZlTm90aWZpZXIgPSAobm90aWZpZXJQLCBpdGVyYXRpb25PYnNlcnZlcikgPT5cbiAgb2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpYmVMYXRlc3Qobm90aWZpZXJQKSwgaXRlcmF0aW9uT2JzZXJ2ZXIpOyRozY9fb25jZS5vYnNlcnZlTm90aWZpZXIob2JzZXJ2ZU5vdGlmaWVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl0sIm9ic2VydmVJdGVyYXRvciI6WyJvYnNlcnZlSXRlcmF0b3IiXSwib2JzZXJ2ZUl0ZXJhdGlvbiI6WyJvYnNlcnZlSXRlcmF0aW9uIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwj7tuOsHAADrBwAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9zdWJzY3JpYmVyLmpzIiwiLi90b3BpYy5qcyIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi9zdG9yZWQtbm90aWZpZXIuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zdG9yZWQtbm90aWZpZXIuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbXV0sW1wiLi9ub3RpZmllci5qc1wiLCBbXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtdXSxbXCIuL3RvcGljLmpzXCIsIFtdXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtdXSxbXCIuL3N0b3Jlc3ViLmpzXCIsIFtdXSxbXCIuL3N0b3JlZC1ub3RpZmllci5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vcHVibGlzaC1raXQuanMiOltbIm1ha2VQdWJsaXNoS2l0IiwibWFrZVB1Ymxpc2hLaXQiXSxbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLFsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSxbIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlRWFjaFRvcGljSSJdLFsiSXRlcmFibGVMYXRlc3RUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLFsiU3Vic2NyaWJlclNoYXBlIiwiU3Vic2NyaWJlclNoYXBlIl1dLCIuL3N1YnNjcmliZS5qcyI6W1sic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUVhY2giXSxbInN1YnNjcmliZUxhdGVzdCIsInN1YnNjcmliZUxhdGVzdCJdXSwiLi9ub3RpZmllci5qcyI6W1sibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyIl0sWyJtYWtlTm90aWZpZXJLaXQiLCJtYWtlTm90aWZpZXJLaXQiXSxbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXSxbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXV0sIi4vc3Vic2NyaWJlci5qcyI6W1sibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb24iXSxbIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il1dLCIuL3RvcGljLmpzIjpbWyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIiwibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdXSwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyI6W1sib2JzZXJ2ZU5vdGlmaWVyIiwib2JzZXJ2ZU5vdGlmaWVyIl0sWyJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiXSxbIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0aW9uIl0sWyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACzSf9OxRsAAMUbAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL25vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQsRSxGYXIsbWFrZVB1Ymxpc2hLaXQsc3Vic2NyaWJlTGF0ZXN0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIixbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZW1vdGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7TGF0ZXN0VG9waWMsIE5vdGlmaWVyLCBOb3RpZmllclJlY29yZCwgUHVibGlzaEtpdCwgU3Vic2NyaWJlciwgVXBkYXRlUmVjb3JkfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSBzaGFyYWJsZUludGVybmFsc1BcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VOb3RpZmllciA9IHNoYXJhYmxlSW50ZXJuYWxzUCA9PiB7XG4gIC8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG4gIGNvbnN0IG5vdGlmaWVyID0gRmFyKCdub3RpZmllcicsIHtcbiAgICAuLi5zdWJzY3JpYmVMYXRlc3Qoc2hhcmFibGVJbnRlcm5hbHNQKSxcbiAgICBnZXRVcGRhdGVTaW5jZTogYXN5bmMgdXBkYXRlQ291bnQgPT5cbiAgICAgIEUoc2hhcmFibGVJbnRlcm5hbHNQKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG5cbiAgICAvKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuICAgIGdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHM6IGFzeW5jICgpID0+IHNoYXJhYmxlSW50ZXJuYWxzUCxcbiAgICAvKipcbiAqIEBkZXByZWNhdGVkXG4gKiBVc2VkIG9ubHkgYnkgYG1ha2VDYXN0aW5nU3BlY0Zyb21SZWZgLiAgSW5zdGVhZCB0aGF0IGZ1bmN0aW9uIHNob3VsZCB1c2VcbiAqIHRoZSBgU3RvcmVkRmFjZXRgIEFQSS5cbiAqL1xuICAgIGdldFN0b3JlS2V5OiAoKSA9PiBoYXJkZW4oeyBub3RpZmllciB9KSxcbiAgfSk7XG4gIHJldHVybiBub3RpZmllcjtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdWJzY3JpYmVyPFQ+PiB8IFJlbW90ZTxTdWJzY3JpYmVyPFQ+Pn0gc3Vic2NyaWJlclxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovJGjNj19vbmNlLm1ha2VOb3RpZmllcihtYWtlTm90aWZpZXIpO1xuICAgICAgIGNvbnN0IG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyID0gc3Vic2NyaWJlciA9PiB7XG4gIC8qKlxuICogQHR5cGUge0xhdGVzdFRvcGljPFQ+fVxuICovXG4gIGNvbnN0IGJhc2VOb3RpZmllciA9IGhhcmRlbih7XG4gICAgZ2V0VXBkYXRlU2luY2U6ICh1cGRhdGVDb3VudCA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIEUoc3Vic2NyaWJlcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuICB9KTtcblxuICAvKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuICBjb25zdCBub3RpZmllciA9IEZhcignbm90aWZpZXInLCB7XG4gICAgLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4gICAgLi4uYmFzZU5vdGlmaWVyLFxuICB9KTtcbiAgcmV0dXJuIG5vdGlmaWVyO1xufTskaM2PX29uY2UubWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIobWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcblxuLyoqXG4gKiBQcm9kdWNlcyBhIHBhaXIgb2Ygb2JqZWN0cywgd2hpY2ggYWxsb3cgYSBzZXJ2aWNlIHRvIHByb2R1Y2UgYSBzdHJlYW0gb2ZcbiAqIHVwZGF0ZSBwcm9taXNlcy5cbiAqXG4gKiBUaGUgaW5pdGlhbCBzdGF0ZSBhcmd1bWVudCBoYXMgdG8gYmUgdHJ1bHkgb3B0aW9uYWwgZXZlbiB0aG91Z2ggaXQgY2FuXG4gKiBiZSBhbnkgZmlyc3QgY2xhc3MgdmFsdWUgaW5jbHVkaW5nIGB1bmRlZmluZWRgLiBXZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZVxuICogcHJlc2VuY2UgdnMgdGhlIGFic2VuY2Ugb2YgaXQsIHdoaWNoIHdlIGNhbm5vdCBkbyB3aXRoIHRoZSBvcHRpb25hbCBhcmd1bWVudFxuICogc3ludGF4LiBSYXRoZXIgd2UgdXNlIHRoZSBhcml0eSBvZiB0aGUgYGluaXRpYWxTdGF0ZUFycmAgYXJyYXkuXG4gKlxuICogSWYgbm8gaW5pdGlhbCBzdGF0ZSBpcyBwcm92aWRlZCB0byBgbWFrZU5vdGlmaWVyS2l0YCwgdGhlbiBpdCBzdGFydHMgd2l0aG91dFxuICogYW4gaW5pdGlhbCBzdGF0ZS4gSXRzIGluaXRpYWwgc3RhdGUgd2lsbCBpbnN0ZWFkIGJlIHRoZSBzdGF0ZSBvZiB0aGUgZmlyc3RcbiAqIHVwZGF0ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbXSB8IFtUXX0gaW5pdGlhbFN0YXRlQXJyIHRoZSBmaXJzdCBzdGF0ZSB0byBiZSByZXR1cm5lZCAodHlwZWQgYXMgcmVzdCBhcnJheSB0byBwZXJtaXQgYHVuZGVmaW5lZGApXG4gKiBAcmV0dXJucyB7Tm90aWZpZXJSZWNvcmQ8VD59IHRoZSBub3RpZmllciBhbmQgdXBkYXRlclxuICovXG4gICAgICAgY29uc3QgbWFrZU5vdGlmaWVyS2l0ID0gKC4uLmluaXRpYWxTdGF0ZUFycikgPT4ge1xuICAvKiogQHR5cGUge1B1Ymxpc2hLaXQ8VD59ICovXG4gIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuXG4gIGNvbnN0IG5vdGlmaWVyID0gbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIoc3Vic2NyaWJlcik7XG5cbiAgY29uc3QgdXBkYXRlciA9IEZhcigndXBkYXRlcicsIHtcbiAgICB1cGRhdGVTdGF0ZTogc3RhdGUgPT4gcHVibGlzaGVyLnB1Ymxpc2goc3RhdGUpLFxuICAgIGZpbmlzaDogY29tcGxldGlvbiA9PiBwdWJsaXNoZXIuZmluaXNoKGNvbXBsZXRpb24pLFxuICAgIGZhaWw6IHJlYXNvbiA9PiBwdWJsaXNoZXIuZmFpbChyZWFzb24pLFxuICB9KTtcblxuICBhc3NlcnQoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aCA8PSAxLCAndG9vIG1hbnkgYXJndW1lbnRzJyk7XG4gIGlmIChpbml0aWFsU3RhdGVBcnIubGVuZ3RoID09PSAxKSB7XG4gICAgdXBkYXRlci51cGRhdGVTdGF0ZShpbml0aWFsU3RhdGVBcnJbMF0pO1xuICB9XG5cbiAgLyogbm90aWZpZXIgZmFjZXQgaXMgc2VwYXJhdGUgc28gaXQgY2FuIGJlIGhhbmRlZCBvdXQgd2hpbGUgdXBkYXRlciovXG4gIC8qIGlzIHRpZ2h0bHkgaGVsZCovXG4gIHJldHVybiBoYXJkZW4oeyBub3RpZmllciwgdXBkYXRlciB9KTtcbn07XG5cbi8qKlxuICogQWRhcHRvciBmcm9tIGFzeW5jIGl0ZXJhYmxlIHRvIG5vdGlmaWVyLlxuICpcbiAqIEBkZXByZWNhdGVkIFRoZSByZXN1bHRpbmcgbm90aWZpZXIgaXMgbG9zc2xlc3MsIHdoaWNoIGlzIG5vdCBkZXNpcmFibGUuXG4gKiBQcmVmZXIgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIsIGFuZCByZWZlciB0b1xuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy81NDEzIGFuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTY5NSBmb3IgY29udGV4dC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovJGjNj19vbmNlLm1ha2VOb3RpZmllcktpdChtYWtlTm90aWZpZXJLaXQpO1xuICAgICAgIGNvbnN0IG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlID0gYXN5bmNJdGVyYWJsZVAgPT4ge1xuICBjb25zdCBpdGVyYXRvclAgPSBFKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuICAvKiogQHR5cGUge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG4gIGxldCBvcHROZXh0UHJvbWlzZTtcbiAgbGV0IGN1cnJlbnRVcGRhdGVDb3VudCA9IDBuO1xuICAvKiogQHR5cGUge0VSZWY8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG4gIGxldCBjdXJyZW50UmVzcG9uc2U7XG4gIGxldCBmaW5hbCA9IGZhbHNlO1xuXG4gIC8qKlxuICogQHR5cGUge0xhdGVzdFRvcGljPFQ+fVxuICovXG4gIGNvbnN0IGJhc2VOb3RpZmllciA9IEZhcignYmFzZU5vdGlmaWVyJywge1xuICAgIGdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50ID0gLTFuKSB7XG4gICAgICBpZiAodXBkYXRlQ291bnQgPCBjdXJyZW50VXBkYXRlQ291bnQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRSZXNwb25zZSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh1cGRhdGVDb3VudCAhPT0gY3VycmVudFVwZGF0ZUNvdW50KSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICdnZXRVcGRhdGVTaW5jZSBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgdXBkYXRlQ291bnQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLyogUmV0dXJuIGEgZmluYWwgcmVzcG9uc2UgaWYgd2UgaGF2ZSBvbmUsIG90aGVyd2lzZSBhIHByb21pc2UgZm9yIHRoZSBuZXh0IHN0YXRlLiovXG4gICAgICBpZiAoZmluYWwpIHtcbiAgICAgICAgYXNzZXJ0KGN1cnJlbnRSZXNwb25zZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHROZXh0UHJvbWlzZSkge1xuICAgICAgICBjb25zdCBuZXh0SXRlclJlc3VsdFAgPSBFKGl0ZXJhdG9yUCkubmV4dCgpO1xuICAgICAgICBvcHROZXh0UHJvbWlzZSA9IEUud2hlbihcbiAgICAgICAgICBuZXh0SXRlclJlc3VsdFAsXG4gICAgICAgICAgKHsgZG9uZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0KCFmaW5hbCk7XG4gICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICBmaW5hbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50VXBkYXRlQ291bnQgKz0gMW47XG4gICAgICAgICAgICBjdXJyZW50UmVzcG9uc2UgPSBoYXJkZW4oe1xuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgdXBkYXRlQ291bnQ6IGRvbmUgPyB1bmRlZmluZWQgOiBjdXJyZW50VXBkYXRlQ291bnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9wdE5leHRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIF9yZWFzb24gPT4ge1xuICAgICAgICAgICAgZmluYWwgPSB0cnVlO1xuICAgICAgICAgICAgY3VycmVudFJlc3BvbnNlID1cbiAgICAgICAgICAgICAgLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59ICovXG4gICAgICAgICAgICAgIChuZXh0SXRlclJlc3VsdFApO1xuICAgICAgICAgICAgb3B0TmV4dFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0TmV4dFByb21pc2U7XG4gICAgfSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbiAgY29uc3Qgbm90aWZpZXIgPSBGYXIoJ25vdGlmaWVyJywge1xuICAgIC8qIERvbid0IGxlYWsgdGhlIG9yaWdpbmFsIGFzeW5jSXRlcmFibGVQIHNpbmNlIGl0IG1heSBiZSByZW1vdGUgYW5kIHdlIGFsc28qL1xuICAgIC8qIHdhbnQgdGhlIHNhbWUgc2VtYW50aWNzIGZvciB0aGlzIGV4cG9zZWQgaXRlcmFibGUgYW5kIHRoZSBiYXNlTm90aWZpZXIuKi9cbiAgICAuLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbiAgICAuLi5iYXNlTm90aWZpZXIsXG4gIH0pO1xuICByZXR1cm4gbm90aWZpZXI7XG59OyRozY9fb25jZS5tYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZShtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciJdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0Il0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABshF6MzQgAAM0IAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvcHVibGlzaC1raXQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9wYXR0ZXJucyIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIiwiSXRlcmFibGVFYWNoVG9waWNJIiwiSXRlcmFibGVMYXRlc3RUb3BpY0kiLCJQdWJsaXNoZXJJIiwiU3Vic2NyaWJlckkiLCJTdWJzY3JpYmVyU2hhcGUiLCJVcGRhdGVDb3VudFNoYXBlIiwibWFrZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwdWJsaXNoS2l0SUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxFLEZhcixtYWtlUHJvbWlzZUtpdCxNLGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCxjYW5CZUR1cmFibGUscHJlcGFyZUV4b0NsYXNzS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiY2FuQmVEdXJhYmxlXCIsWyRozY9fYSA9PiAoY2FuQmVEdXJhYmxlID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0R1cmFibGVQdWJsaXNoS2l0U3RhdGUsIER1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5LCBMYXRlc3RUb3BpYywgTm90aWZpZXIsIE5vdGlmaWVyUmVjb3JkLCBQdWJsaWNhdGlvblJlY29yZCwgUHVibGlzaGVyLCBQdWJsaXNoS2l0LCBTdWJzY3JpYmVyLCBVcGRhdGVSZWNvcmR9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKi9cblxuY29uc3Qgc2luayA9ICgpID0+IHt9O1xuY29uc3QgbWFrZVF1aWV0UmVqZWN0aW9uID0gcmVhc29uID0+IHtcbiAgY29uc3QgcmVqZWN0aW9uID0gaGFyZGVuKFByb21pc2UucmVqZWN0KHJlYXNvbikpO1xuICB2b2lkIEUud2hlbihyZWplY3Rpb24sIHNpbmssIHNpbmspO1xuICByZXR1cm4gcmVqZWN0aW9uO1xufTtcbmNvbnN0IHRvb0ZhclJlamVjdGlvbiA9IG1ha2VRdWlldFJlamVjdGlvbihcbiAgaGFyZGVuKEVycm9yKCdDYW5ub3QgcmVhZCBwYXN0IGVuZCBvZiBpdGVyYXRpb24uJykpLFxuKTtcblxuICAgICAgIGNvbnN0IFB1Ymxpc2hlckkgPSBNLmludGVyZmFjZSgnUHVibGlzaGVyJywge1xuICBwdWJsaXNoOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBmaW5pc2g6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gIGZhaWw6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG59KTtcblxuLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggTm90aWZpZXIgYGdldFVwZGF0ZVNpbmNlYC4qLyRozY9fb25jZS5QdWJsaXNoZXJJKFB1Ymxpc2hlckkpO1xuICAgICAgIGNvbnN0IFVwZGF0ZUNvdW50U2hhcGUgPSBNLm9yKE0uYmlnaW50KCksIE0ubnVtYmVyKCkpOyRozY9fb25jZS5VcGRhdGVDb3VudFNoYXBlKFVwZGF0ZUNvdW50U2hhcGUpO1xuICAgICAgIGNvbnN0IFN1YnNjcmliZXJJID0gTS5pbnRlcmZhY2UoJ1N1YnNjcmliZXInLCB7XG4gIHN1YnNjcmliZUFmdGVyOiBNLmNhbGwoKS5vcHRpb25hbChNLmJpZ2ludCgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0VXBkYXRlU2luY2U6IE0uY2FsbCgpLm9wdGlvbmFsKFVwZGF0ZUNvdW50U2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxufSk7JGjNj19vbmNlLlN1YnNjcmliZXJJKFN1YnNjcmliZXJJKTtcbiAgICAgICBjb25zdCBwdWJsaXNoS2l0SUtpdCA9IGhhcmRlbih7XG4gIHB1Ymxpc2hlcjogUHVibGlzaGVySSxcbiAgc3Vic2NyaWJlcjogU3Vic2NyaWJlckksXG59KTskaM2PX29uY2UucHVibGlzaEtpdElLaXQocHVibGlzaEtpdElLaXQpO1xuXG4gICAgICAgY29uc3QgRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSA9IE0uaW50ZXJmYWNlKFxuICAnRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InLFxuICB7XG4gICAgZm9yazogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiBNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLCAvKiBvb3BzOiByZWN1cnNpdmUgdHlwZSovXG4gICAgbmV4dDogTS5jYWxsV2hlbigpLnJldHVybnMoTS5hbnkoKSksXG4gIH0sXG4pOyRozY9fb25jZS5Gb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlKEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSXRlcmFibGVFYWNoVG9waWNJID0gTS5pbnRlcmZhY2UoJ0l0ZXJhYmxlRWFjaFRvcGljJywge1xuICBzdWJzY3JpYmVBZnRlcjpcbiAgICBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoU3Vic2NyaWJlckkpLm1ldGhvZEd1YXJkcy5zdWJzY3JpYmVBZnRlcixcbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogTS5jYWxsKCkucmV0dXJucyhcbiAgICBNLnJlbW90YWJsZSgnRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InKSxcbiAgKSxcbn0pOyRozY9fb25jZS5JdGVyYWJsZUVhY2hUb3BpY0koSXRlcmFibGVFYWNoVG9waWNJKTtcblxuICAgICAgIGNvbnN0IEl0ZXJhYmxlTGF0ZXN0VG9waWNJID0gTS5pbnRlcmZhY2UoJ0l0ZXJhYmxlTGF0ZXN0VG9waWMnLCB7XG4gIGdldFVwZGF0ZVNpbmNlOlxuICAgIGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChTdWJzY3JpYmVySSkubWV0aG9kR3VhcmRzLmdldFVwZGF0ZVNpbmNlLFxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiBNLmNhbGwoKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicpLFxuICApLFxufSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IEFyZ1xuICogQHRlbXBsYXRlIFJldFxuICogQHBhcmFtIHsoYXJnOiBBcmcpID0+IFJldH0gZm5cbiAqIEByZXR1cm5zIHsoYXJnOiBBcmcpID0+IFJldH1cbiAqLyRozY9fb25jZS5JdGVyYWJsZUxhdGVzdFRvcGljSShJdGVyYWJsZUxhdGVzdFRvcGljSSk7XG5jb25zdCB3ZWFrTWVtb2l6ZVVuYXJ5ID0gZm4gPT4ge1xuICBjb25zdCBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG4gIHJldHVybiBhcmcgPT4ge1xuICAgIC8qKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgIGNvbnN0IG9hcmcgPSBhcmc7XG4gICAgaWYgKGNhY2hlLmhhcyhvYXJnKSkge1xuICAgICAgcmV0dXJuIGNhY2hlLmdldChvYXJnKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZm4oYXJnKTtcbiAgICBjYWNoZS5zZXQob2FyZywgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQdWJsaWNhdGlvblJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7VXBkYXRlUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkID0gcmVjb3JkID0+IHtcbiAgY29uc3Qge1xuICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmUgfSxcbiAgICBwdWJsaXNoQ291bnQsXG4gIH0gPSByZWNvcmQ7XG4gIGlmIChkb25lKSB7XG4gICAgLyogRmluYWwgcmVzdWx0cyBoYXZlIHVuZGVmaW5lZCB1cGRhdGVDb3VudC4qL1xuICAgIHJldHVybiBoYXJkZW4oeyB2YWx1ZSwgdXBkYXRlQ291bnQ6IHVuZGVmaW5lZCB9KTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKHsgdmFsdWUsIHVwZGF0ZUNvdW50OiBwdWJsaXNoQ291bnQgfSk7XG59O1xuXG4vKipcbiAqIE1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UHVibGlzaEtpdDxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQdWJsaXNoS2l0ID0gKCkgPT4ge1xuICAvKiogQHR5cGUge1Byb21pc2U8UHVibGljYXRpb25SZWNvcmQ8VD4+fSAqL1xuICBsZXQgdGFpbFA7XG4gIC8qKiBAdHlwZSB7dW5kZWZpbmVkIHwgKCh2YWx1ZTogRVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj4pID0+IHZvaWQpfSAqL1xuICBsZXQgdGFpbFI7XG4gICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG5cbiAgbGV0IGN1cnJlbnRQdWJsaXNoQ291bnQgPSAwbjtcbiAgbGV0IGN1cnJlbnRQID0gdGFpbFA7XG4gIGNvbnN0IGFkdmFuY2VDdXJyZW50ID0gKGRvbmUsIHZhbHVlLCByZWplY3Rpb24pID0+IHtcbiAgICBpZiAodGFpbFIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gICAgfVxuXG4gICAgY3VycmVudFB1Ymxpc2hDb3VudCArPSAxbjtcbiAgICBjdXJyZW50UCA9IHRhaWxQO1xuICAgIGNvbnN0IHJlc29sdmVDdXJyZW50ID0gdGFpbFI7XG5cbiAgICBpZiAoZG9uZSkge1xuICAgICAgdGFpbFAgPSB0b29GYXJSZWplY3Rpb247XG4gICAgICB0YWlsUiA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcbiAgICB9XG5cbiAgICBpZiAocmVqZWN0aW9uKSB7XG4gICAgICByZXNvbHZlQ3VycmVudChyZWplY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlQ3VycmVudChcbiAgICAgICAgaGFyZGVuKHtcbiAgICAgICAgICBoZWFkOiB7IHZhbHVlLCBkb25lIH0sXG4gICAgICAgICAgcHVibGlzaENvdW50OiBjdXJyZW50UHVibGlzaENvdW50LFxuICAgICAgICAgIHRhaWw6IHRhaWxQLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCA9IHdlYWtNZW1vaXplVW5hcnkoXG4gICAgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZCxcbiAgKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7U3Vic2NyaWJlcjxUPn1cbiAqL1xuICBjb25zdCBzdWJzY3JpYmVyID0gRmFyKCdTdWJzY3JpYmVyJywge1xuICAgIHN1YnNjcmliZUFmdGVyOiAocHVibGlzaENvdW50ID0gLTFuKSA9PiB7XG4gICAgICBhc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwgJ2JpZ2ludCcpO1xuICAgICAgaWYgKHB1Ymxpc2hDb3VudCA9PT0gY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICByZXR1cm4gdGFpbFA7XG4gICAgICB9IGVsc2UgaWYgKHB1Ymxpc2hDb3VudCA8IGN1cnJlbnRQdWJsaXNoQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgJ3N1YnNjcmliZUFmdGVyIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCBwdWJsaXNoQ291bnQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldFVwZGF0ZVNpbmNlOiB1cGRhdGVDb3VudCA9PiB7XG4gICAgICBpZiAodXBkYXRlQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLnRoZW4obWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZUNvdW50ID0gQmlnSW50KHVwZGF0ZUNvdW50KTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHN1YnNjcmliZXJcbiAgICAgICAgICAvKiBgc3Vic2NyaWJlQWZ0ZXJgIG1heSByZXNvbHZlIHdpdGggdGhlIHVwZGF0ZSByZWNvcmQgbnVtYmVyZWQqL1xuICAgICAgICAgIC8qIGB1cGRhdGVDb3VudCArIDFgLCBldmVuIGlmIHNldmVyYWwgdXBkYXRlcyBhcmUgcHVibGlzaGVkIGluIHRoZSovXG4gICAgICAgICAgLyogc2FtZSBjcmFuay4uLiovXG4gICAgICAgICAgLnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuICAgICAgICAgIC8qIC4uLiBzbyB3ZSBwb2xsIHRoZSBsYXRlc3QgcHVibGlzaGVkIHVwZGF0ZSwgd2l0aG91dCB3YWl0aW5nIGZvciBhbnkqL1xuICAgICAgICAgIC8qIGZ1cnRoZXIgb25lcy4qL1xuICAgICAgICAgIC50aGVuKCgpID0+IHN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtQdWJsaXNoZXI8VD59ICovXG4gIGNvbnN0IHB1Ymxpc2hlciA9IEZhcignUHVibGlzaGVyJywge1xuICAgIHB1Ymxpc2g6IHZhbHVlID0+IHtcbiAgICAgIGFkdmFuY2VDdXJyZW50KGZhbHNlLCB2YWx1ZSk7XG4gICAgfSxcbiAgICBmaW5pc2g6IGZpbmFsVmFsdWUgPT4ge1xuICAgICAgYWR2YW5jZUN1cnJlbnQodHJ1ZSwgZmluYWxWYWx1ZSk7XG4gICAgfSxcbiAgICBmYWlsOiByZWFzb24gPT4ge1xuICAgICAgYWR2YW5jZUN1cnJlbnQodHJ1ZSwgdW5kZWZpbmVkLCBtYWtlUXVpZXRSZWplY3Rpb24ocmVhc29uKSk7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBoYXJkZW4oeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSk7XG59OyRozY9fb25jZS5tYWtlUHVibGlzaEtpdChtYWtlUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVB1Ymxpc2hLaXQpO1xuXG5jb25zdCBEdXJhYmxlUHVibGlzaEtpdFN0YXRlU2hhcGUgPSBoYXJkZW4oe1xuICB2YWx1ZUR1cmFiaWxpdHk6IE0uYW55KCksXG4gIHB1Ymxpc2hDb3VudDogTS5hbnkoKSxcbiAgc3RhdHVzOiBNLmFueSgpLFxuICBoYXNWYWx1ZTogTS5hbnkoKSxcbiAgdmFsdWU6IE0uYW55KCksXG59KTtcblxuLyogVE9ETzogTW92ZSBkdXJhYmxlIHB1Ymxpc2gga2l0IHRvIGEgbmV3IGZpbGU/Ki9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5ICYgJ21hbmRhdG9yeSd9IFtvcHRpb25zLnZhbHVlRHVyYWJpbGl0eV1cbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfVxuICovXG5jb25zdCBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSA9IChvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgeyB2YWx1ZUR1cmFiaWxpdHkgPSAnbWFuZGF0b3J5JyB9ID0gb3B0aW9ucztcbiAgYXNzZXJ0LmVxdWFsKHZhbHVlRHVyYWJpbGl0eSwgJ21hbmRhdG9yeScpO1xuICByZXR1cm4ge1xuICAgIC8qIGNvbmZpZ3VyYXRpb24qL1xuICAgIHZhbHVlRHVyYWJpbGl0eSxcblxuICAgIC8qIGxpZmVjeWNsZSBwcm9ncmVzcyovXG4gICAgcHVibGlzaENvdW50OiAwbixcbiAgICBzdGF0dXM6ICdsaXZlJywgLyogfCAnZmluaXNoZWQnIHwgJ2ZhaWxlZCcqL1xuXG4gICAgLyogcGVyc2lzdGVkIHJlc3VsdCBkYXRhKi9cbiAgICAvKiBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gbm9uLXRlcm1pbmFsIHZhbHVlcyBmcm9tIGBwdWJsaXNoYCwqL1xuICAgIC8qIHZhbHVlIGFsc28gaG9sZHMgdGhlIHRlcm1pbmFsIHZhbHVlIGZyb20gYGZpbmlzaGAgb3IgYGZhaWxgLiovXG4gICAgaGFzVmFsdWU6IGZhbHNlLFxuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gIH07XG59O1xuXG4vKiBXZSBuZWVkIHRoZSBXZWFrTWFwIGtleSBmb3IgYSBraXQgdG8gYmUgYSB2cmVmLWJlYXJpbmcgb2JqZWN0Ki9cbi8qIGluIGl0cyBjb2hvcnQsIGFuZCBoYXZlIGFyYml0cmFyaWx5IGNob3NlbiB0aGUgcHVibGlzaGVyIGZhY2V0LiovXG4vKiogQHR5cGVkZWYge1B1Ymxpc2hlcjwqPn0gRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXkgKi9cbi8qKlxuICogQHBhcmFtIHtQdWJsaXNoS2l0PCo+fSBmYWNldHNcbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleX1cbiAqL1xuY29uc3QgZ2V0RXBoZW1lcmFsS2V5ID0gZmFjZXRzID0+IGZhY2V0cy5wdWJsaXNoZXI7XG5cbi8qKlxuICogQHR5cGVkZWYgRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhXG4gKiBAcHJvcGVydHkge1Byb21pc2U8Kj4gfCB1bmRlZmluZWR9IGN1cnJlbnRQIFRoZSBjdXJyZW50LXJlc3VsdCBwcm9taXNlXG4gKiAgICh1bmRlZmluZWQgdW5sZXNzIHJlc29sdmVkIHdpdGggdW5yZWNvdmVyYWJsZSBlcGhlbWVyYWwgZGF0YSlcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTwqPn0gdGFpbFAgVGhlIG5leHQtcmVzdWx0IHByb21pc2VcbiAqIEBwcm9wZXJ0eSB7KCh2YWx1ZTogYW55KSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gdGFpbFIgVGhlIG5leHQtcmVzdWx0IHJlc29sdmVyXG4gKiAgICh1bmRlZmluZWQgd2hlbiB0aGUgcHVibGlzaCBraXQgaGFzIHRlcm1pbmF0ZWQpXG4gKi9cblxuLyoqIEB0eXBlIHtXZWFrTWFwPER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5LCBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE+fSAqL1xuY29uc3QgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50LXJlc3VsdCBwcm9taXNlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGR1cmFibGVcbiAqIHB1Ymxpc2gga2l0LCByZWNyZWF0ZWQgdW5sZXNzIHdlIGFscmVhZHkgaGF2ZSBvbmUgd2l0aCByZXRhaW5lZFxuICogZXBoZW1lcmFsIGRhdGEuXG4gKlxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfSBzdGF0ZVxuICogQHBhcmFtIHtQdWJsaXNoS2l0PCo+fSBmYWNldHNcbiAqIEBwYXJhbSB7UHJvbWlzZTwqPn0gdGFpbFxuICogQHJldHVybnMge1Byb21pc2U8Kj59XG4gKi9cbmNvbnN0IHByb3ZpZGVDdXJyZW50UCA9IChzdGF0ZSwgZmFjZXRzLCB0YWlsKSA9PiB7XG4gIGNvbnN0IGVwaGVtZXJhbEtleSA9IGdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuICBjb25zdCBmb3VuZERhdGEgPSBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG4gIGNvbnN0IGN1cnJlbnRQID0gZm91bmREYXRhICYmIGZvdW5kRGF0YS5jdXJyZW50UDtcbiAgaWYgKGN1cnJlbnRQKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRQO1xuICB9XG5cbiAgY29uc3QgeyBwdWJsaXNoQ291bnQsIHN0YXR1cywgaGFzVmFsdWUsIHZhbHVlIH0gPSBzdGF0ZTtcbiAgaWYgKCFoYXNWYWx1ZSkge1xuICAgIGFzc2VydChzdGF0dXMgPT09ICdsaXZlJyk7XG4gICAgcmV0dXJuIHRhaWw7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gJ2xpdmUnIHx8IHN0YXR1cyA9PT0gJ2ZpbmlzaGVkJykge1xuICAgIGNvbnN0IGNlbGwgPSBoYXJkZW4oe1xuICAgICAgaGVhZDogeyB2YWx1ZSwgZG9uZTogc3RhdHVzICE9PSAnbGl2ZScgfSxcbiAgICAgIHB1Ymxpc2hDb3VudCxcbiAgICAgIHRhaWwsXG4gICAgfSk7XG4gICAgcmV0dXJuIEUucmVzb2x2ZShjZWxsKTtcbiAgfSBlbHNlIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgcmV0dXJuIG1ha2VRdWlldFJlamVjdGlvbih2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG5leHQtcmVzdWx0IHByb21pc2UgYW5kIHJlc29sdmVyIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuXG4gKiBkdXJhYmxlIHB1Ymxpc2gga2l0LlxuICogVGhlc2UgYXJlIGxvc3Qgb24gdXBncmFkZSBidXQgcmVjcmVhdGVkIG9uLWRlbWFuZCwgcHJlc2VydmluZyB0aGVcbiAqIHZhbHVlIGluIChidXQgbm90IHRoZSBpZGVudGl0eSBvZikgdGhlIGN1cnJlbnQgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdFxuICogd2hlbiBwb3NzaWJsZSwgd2hpY2ggaXMgYWx3YXlzIHRoZSBjYXNlIHdoZW4gdGhhdCB2YWx1ZSBpcyB0ZXJtaW5hbFxuICogKGkuZS4sIGZyb20gYGZpbmlzaGAgb3IgYGZhaWxgKSBvciB3aGVuIHRoZSBkdXJhYmxlIHB1Ymxpc2gga2l0IGlzXG4gKiBjb25maWd1cmVkIHdpdGggYHZhbHVlRHVyYWJpbGl0eTogJ21hbmRhdG9yeSdgLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhfVxuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhID0gKHN0YXRlLCBmYWNldHMpID0+IHtcbiAgY29uc3QgZXBoZW1lcmFsS2V5ID0gZ2V0RXBoZW1lcmFsS2V5KGZhY2V0cyk7XG4gIGNvbnN0IGZvdW5kRGF0YSA9IGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbiAgaWYgKGZvdW5kRGF0YSkge1xuICAgIHJldHVybiBmb3VuZERhdGE7XG4gIH1cblxuICBjb25zdCB7IHN0YXR1cyB9ID0gc3RhdGU7XG4gIGxldCB0YWlsUDtcbiAgbGV0IHRhaWxSO1xuICBpZiAoc3RhdHVzID09PSAnbGl2ZScpIHtcbiAgICAoeyBwcm9taXNlOiB0YWlsUCwgcmVzb2x2ZTogdGFpbFIgfSA9IG1ha2VQcm9taXNlS2l0KCkpO1xuICAgIHZvaWQgRS53aGVuKHRhaWxQLCBzaW5rLCBzaW5rKTtcbiAgfSBlbHNlIGlmIChzdGF0dXMgPT09ICdmaW5pc2hlZCcgfHwgc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgIHRhaWxQID0gdG9vRmFyUmVqZWN0aW9uO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEZhaWxgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiAgfVxuICAvKiBjdXJyZW50UCBpcyBub3QgZXBoZW1lcmFsIHdoZW4gcmVzdG9yaW5nIGZyb20gcGVyc2lzdGVkIHN0YXRlLiovXG4gIGNvbnN0IG9iaiA9IGhhcmRlbih7IGN1cnJlbnRQOiB1bmRlZmluZWQsIHRhaWxQLCB0YWlsUiB9KTtcbiAgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChlcGhlbWVyYWxLZXksIG9iaik7XG4gIHJldHVybiBvYmo7XG59O1xuXG4vKipcbiAqIEV4dGVuZHMgdGhlIHNlcXVlbmNlIG9mIHJlc3VsdHMuXG4gKlxuICogQHBhcmFtIHt7c3RhdGU6IER1cmFibGVQdWJsaXNoS2l0U3RhdGUsIGZhY2V0czogUHVibGlzaEtpdDwqPn19IGNvbnRleHRcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlWydzdGF0dXMnXX0gW3RhcmdldFN0YXR1c11cbiAqL1xuY29uc3QgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0ID0gKGNvbnRleHQsIHZhbHVlLCB0YXJnZXRTdGF0dXMgPSAnbGl2ZScpID0+IHtcbiAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSBjb250ZXh0O1xuICBjb25zdCB7IHZhbHVlRHVyYWJpbGl0eSwgc3RhdHVzIH0gPSBzdGF0ZTtcbiAgaWYgKHN0YXR1cyAhPT0gJ2xpdmUnKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gIH1cbiAgY29uc3QgZG9uZSA9IHRhcmdldFN0YXR1cyAhPT0gJ2xpdmUnO1xuICBpZiAoZG9uZSB8fCB2YWx1ZUR1cmFiaWxpdHkgPT09ICdtYW5kYXRvcnknKSB7XG4gICAgY2FuQmVEdXJhYmxlKHZhbHVlKSB8fCBGYWlsYENhbm5vdCBhY2NlcHQgbm9uLWR1cmFibGUgdmFsdWU6ICR7dmFsdWV9YDtcbiAgfVxuICBjb25zdCB7IHRhaWxQOiBvbGRUYWlsUCwgdGFpbFI6IHJlc29sdmVPbGRUYWlsIH0gPVxuICAgIHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoc3RhdGUsIGZhY2V0cyk7XG4gIGFzc2VydC50eXBlb2YocmVzb2x2ZU9sZFRhaWwsICdmdW5jdGlvbicpO1xuXG4gIGNvbnN0IHB1Ymxpc2hDb3VudCA9IHN0YXRlLnB1Ymxpc2hDb3VudCArIDFuO1xuICBzdGF0ZS5wdWJsaXNoQ291bnQgPSBwdWJsaXNoQ291bnQ7XG5cbiAgbGV0IHRhaWxQO1xuICBsZXQgdGFpbFI7XG4gIGlmIChkb25lKSB7XG4gICAgc3RhdGUuc3RhdHVzID0gdGFyZ2V0U3RhdHVzO1xuICAgIHRhaWxQID0gdG9vRmFyUmVqZWN0aW9uO1xuICAgIHRhaWxSID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG4gICAgdm9pZCBFLndoZW4odGFpbFAsIHNpbmssIHNpbmspO1xuICB9XG5cbiAgbGV0IGN1cnJlbnRQO1xuICBpZiAodGFyZ2V0U3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgIHN0YXRlLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IHJlamVjdGlvbiA9IG1ha2VRdWlldFJlamVjdGlvbih2YWx1ZSk7XG4gICAgcmVzb2x2ZU9sZFRhaWwocmVqZWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvKiBQZXJzaXN0IGEgdGVybWluYWwgdmFsdWUsIG9yIGEgbm9uLXRlcm1pbmFsIHZhbHVlKi9cbiAgICAvKiBpZiBjb25maWd1cmVkIGFzICdtYW5kYXRvcnknIG9yICdvcHBvcnR1bmlzdGljJy4qL1xuICAgIGlmIChkb25lIHx8ICh2YWx1ZUR1cmFiaWxpdHkgIT09ICdpZ25vcmVkJyAmJiBjYW5CZUR1cmFibGUodmFsdWUpKSkge1xuICAgICAgc3RhdGUuaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgIHN0YXRlLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgLyogUmV0YWluIGFueSBwcm9taXNlIHdpdGggbm9uLWR1cmFibGUgcmVzb2x1dGlvbi4qL1xuICAgICAgY3VycmVudFAgPSBvbGRUYWlsUDtcbiAgICB9XG5cbiAgICByZXNvbHZlT2xkVGFpbChcbiAgICAgIGhhcmRlbih7XG4gICAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmUgfSxcbiAgICAgICAgcHVibGlzaENvdW50LFxuICAgICAgICB0YWlsOiB0YWlsUCxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KFxuICAgIGdldEVwaGVtZXJhbEtleShmYWNldHMpLFxuICAgIGhhcmRlbih7IGN1cnJlbnRQLCB0YWlsUCwgdGFpbFIgfSksXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcmV0dXJucyB7PFQ+KG9wdGlvbnM/OiBQYXJhbWV0ZXJzPHR5cGVvZiBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZT5bMF0pID0+IFB1Ymxpc2hLaXQ8VD59XG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQgPSAoYmFnZ2FnZSwga2luZE5hbWUpID0+IHtcbiAgLyogVE9ETzogT25jZSB3ZSB1bmlmeSB3aXRoIG1ha2VQdWJsaXNoS2l0LCB3ZSB3aWxsIHVzZSBhIFpvbmUtY29tcGF0aWJsZSB3ZWFrKi9cbiAgLyogbWFwIGZvciBtZW1vaXphdGlvbi4qL1xuICBjb25zdCBtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQgPSBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkO1xuXG4gIHJldHVybiBwcmVwYXJlRXhvQ2xhc3NLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBwdWJsaXNoS2l0SUtpdCxcbiAgICBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSxcbiAgICB7XG4gICAgICAvKiBUaGUgcHVibGlzaGVyIGZhY2V0IG9mIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCovXG4gICAgICAvKiBhY2NlcHRzIG5ldyB2YWx1ZXMuKi9cbiAgICAgIHB1Ymxpc2hlcjoge1xuICAgICAgICBwdWJsaXNoKHZhbHVlKSB7XG4gICAgICAgICAgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZmluaXNoKGZpbmFsVmFsdWUpIHtcbiAgICAgICAgICBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcywgZmluYWxWYWx1ZSwgJ2ZpbmlzaGVkJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGZhaWwocmVhc29uKSB7XG4gICAgICAgICAgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsIHJlYXNvbiwgJ2ZhaWxlZCcpO1xuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyogVGhlIHN1YnNjcmliZXIgZmFjZXQgb2YgYSBkdXJhYmxlIHB1Ymxpc2gga2l0Ki9cbiAgICAgIC8qIHByb3BhZ2F0ZXMgdmFsdWVzLiovXG4gICAgICBzdWJzY3JpYmVyOiB7XG4gICAgICAgIHN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCA9IC0xbikge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IHB1Ymxpc2hDb3VudDogY3VycmVudFB1Ymxpc2hDb3VudCB9ID0gc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyBjdXJyZW50UCwgdGFpbFAgfSA9IHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoXG4gICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgIGZhY2V0cyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwdWJsaXNoQ291bnQgPT09IGN1cnJlbnRQdWJsaXNoQ291bnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWlsUDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHB1Ymxpc2hDb3VudCA8IGN1cnJlbnRQdWJsaXNoQ291bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UCB8fCBwcm92aWRlQ3VycmVudFAoc3RhdGUsIGZhY2V0cywgdGFpbFApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgJ3N1YnNjcmliZUFmdGVyIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCBwdWJsaXNoQ291bnQuJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGZhY2V0czogeyBzdWJzY3JpYmVyIH0sXG4gICAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgICAgaWYgKHVwZGF0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCkudGhlbihtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVDb3VudCA9IEJpZ0ludCh1cGRhdGVDb3VudCk7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHN1YnNjcmliZXJcbiAgICAgICAgICAgICAgLyogYHN1YnNjcmliZUFmdGVyYCBtYXkgcmVzb2x2ZSB3aXRoIHRoZSB1cGRhdGUgcmVjb3JkIG51bWJlcmVkKi9cbiAgICAgICAgICAgICAgLyogYHVwZGF0ZUNvdW50ICsgMWAsIGV2ZW4gaWYgc2V2ZXJhbCB1cGRhdGVzIGFyZSBwdWJsaXNoZWQgaW4gdGhlKi9cbiAgICAgICAgICAgICAgLyogc2FtZSBjcmFuay4uLiovXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmVBZnRlcih1cGRhdGVDb3VudClcbiAgICAgICAgICAgICAgLyogLi4uIHNvIHdlIHBvbGwgdGhlIGxhdGVzdCBwdWJsaXNoZWQgdXBkYXRlLCB3aXRob3V0IHdhaXRpbmcgZm9yIGFueSovXG4gICAgICAgICAgICAgIC8qIGZ1cnRoZXIgb25lcy4qL1xuICAgICAgICAgICAgICAudGhlbigoKSA9PiBzdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzdGF0ZVNoYXBlOiBEdXJhYmxlUHVibGlzaEtpdFN0YXRlU2hhcGUsXG4gICAgfSxcbiAgKTtcbn07JGjNj19vbmNlLnByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5cbiAgICAgICBjb25zdCBTdWJzY3JpYmVyU2hhcGUgPSBNLnJlbW90YWJsZSgnU3Vic2NyaWJlcicpOyRozY9fb25jZS5TdWJzY3JpYmVyU2hhcGUoU3Vic2NyaWJlclNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlB1Ymxpc2hlckkiOlsiUHVibGlzaGVySSJdLCJVcGRhdGVDb3VudFNoYXBlIjpbIlVwZGF0ZUNvdW50U2hhcGUiXSwiU3Vic2NyaWJlckkiOlsiU3Vic2NyaWJlckkiXSwicHVibGlzaEtpdElLaXQiOlsicHVibGlzaEtpdElLaXQiXSwiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSI6WyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIl0sIkl0ZXJhYmxlRWFjaFRvcGljSSI6WyJJdGVyYWJsZUVhY2hUb3BpY0kiXSwiSXRlcmFibGVMYXRlc3RUb3BpY0kiOlsiSXRlcmFibGVMYXRlc3RUb3BpY0kiXSwibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiXSwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IjpbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACxIRDeqDAAAqgwAAC4AAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiQGVuZG8vZmFyIiwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyJdLCJleHBvcnRzIjpbIm1ha2VTdG9yZWROb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxFLEZhcixvYnNlcnZlTm90aWZpZXI7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIixbJGjNj19hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlTm90aWZpZXJcIixbJGjNj19hID0+IChvYnNlcnZlTm90aWZpZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7QmFzZU5vdGlmaWVyLCBOb3RpZmllcn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtFUmVtb3RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0VNYXJzaGFsbGVyfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyc7XG4gKiBAaW1wb3J0IHtTdG9yZWRGYWNldCwgU3RvcmFnZU5vZGUsIFVuc2VyaWFsaXplcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZUNhcH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0Jhc2VOb3RpZmllcjxUPiAmIE9taXQ8U3RvcmVkRmFjZXQsICdnZXRTdG9yZUtleSc+fSBTdG9yZWROb3RpZmllclxuICovXG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWROb3RpZmllciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZUNhcH0gVFxuICogQHBhcmFtIHtFUmVmPE5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJcbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkTm90aWZpZXI8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3RvcmVkTm90aWZpZXIgPSAobm90aWZpZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGFzc2VydEFsbERlZmluZWQoeyBub3RpZmllciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIgfSk7XG5cbiAgY29uc3QgbWFyc2hhbGxUb1N0b3JhZ2UgPSBtYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKTtcblxuICBvYnNlcnZlTm90aWZpZXIobm90aWZpZXIsIHtcbiAgICB1cGRhdGVTdGF0ZSh2YWx1ZSkge1xuICAgICAgbWFyc2hhbGxUb1N0b3JhZ2UodmFsdWUpLmNhdGNoKHJlYXNvbiA9PlxuICAgICAgICBjb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBmYWlsZWQgdG8gdXBkYXRlU3RhdGUnLCByZWFzb24pLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGZhaWwocmVhc29uKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBmYWlsZWQgdG8gaXRlcmF0ZScsIHJlYXNvbik7XG4gICAgfSxcbiAgfSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBoYWx0ZWQgaXRlcmF0aW9uJywgcmVhc29uKTtcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG4gIGNvbnN0IHVuc2VyaWFsaXplciA9IEZhcigndW5zZXJpYWxpemVyJywge1xuICAgIGZyb21DYXBEYXRhOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gICAgdW5zZXJpYWxpemU6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtTdG9yZWROb3RpZmllcjxUPn0gKi9cbiAgY29uc3Qgc3RvcmVkTm90aWZpZXIgPSBGYXIoJ1N0b3JlZE5vdGlmaWVyJywge1xuICAgIGdldFVwZGF0ZVNpbmNlOiB1cGRhdGVDb3VudCA9PiBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG4gICAgZ2V0UGF0aDogKCkgPT4gRShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuICAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gdW5zZXJpYWxpemVyLFxuICB9KTtcbiAgcmV0dXJuIHN0b3JlZE5vdGlmaWVyO1xufTskaM2PX29uY2UubWFrZVN0b3JlZE5vdGlmaWVyKG1ha2VTdG9yZWROb3RpZmllcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RvcmVkTm90aWZpZXIiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHrmTl4kJgAAJCYAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVzdWIuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZXIuanMiLCIuL3N1YnNjcmliZS5qcyJdLCJleHBvcnRzIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCIsIm1ha2VTdG9yZWRQdWJsaXNoS2l0IiwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCIsIm1ha2VTdG9yZWRTdWJzY3JpYmVyIiwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsRmFyLG1ha2VNYXJzaGFsLGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxvYnNlcnZlSXRlcmF0aW9uLG1ha2VQdWJsaXNoS2l0LG1ha2VTdWJzY3JpcHRpb25LaXQsc3Vic2NyaWJlRWFjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIixbJGjNj19hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLFskaM2PX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlSXRlcmF0aW9uXCIsWyRozY9fYSA9PiAob2JzZXJ2ZUl0ZXJhdGlvbiA9ICRozY9fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25LaXRcIixbJGjNj19hID0+IChtYWtlU3Vic2NyaXB0aW9uS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIixbJGjNj19hID0+IChzdWJzY3JpYmVFYWNoID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZW1vdGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0l0ZXJhdGlvbk9ic2VydmVyLCBMYXRlc3RUb3BpYywgTm90aWZpZXIsIE5vdGlmaWVyUmVjb3JkLCBQdWJsaWNhdGlvblJlY29yZCwgUHVibGlzaGVyLCBQdWJsaXNoS2l0LCBTdG9yZWRQdWJsaXNoS2l0LCBTdG9yZWRTdWJzY3JpcHRpb24sIFN0b3JlZFN1YnNjcmliZXIsIFN1YnNjcmliZXIsIFN1YnNjcmlwdGlvbiwgVXBkYXRlUmVjb3JkfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7U3RvcmFnZU5vZGUsIFVuc2VyaWFsaXplcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyc7XG4gKiBAaW1wb3J0IHtFTWFyc2hhbGxlcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMnO1xuICogQGltcG9ydCB7UGFzc2FibGVDYXB9IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICovXG5cbi8qKlxuICogTkI6IGRvZXMgbm90IHlldCBzdXJ2aXZlIHVwZ3JhZGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82ODkzXG4gKlxuICogQGFscGhhXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0geyh2OiBUKSA9PiB2b2lkfSBjb25zdW1lVmFsdWVcbiAqL1xuICAgICAgIGNvbnN0IGZvckVhY2hQdWJsaWNhdGlvblJlY29yZCA9IGFzeW5jIChzdWJzY3JpYmVyLCBjb25zdW1lVmFsdWUpID0+IHtcbiAgLyogV2Ugb3Blbi1jb2RlIHRoZSBmb3ItYXdhaXQtb2YgaW1wbGVtZW50YXRpb24gcmF0aGVyIHRoYW4gdXNpbmcgdGhhdCBzeW50YXgqL1xuICAvKiBkaXJlY3RseSBiZWNhdXNlIHdlIHdhbnQgdG8gcnVuIHRoZSBjb25zdW1lciBvbiB0aGUgZG9uZSB2YWx1ZSBhcyB3ZWxsLiovXG4gIGNvbnN0IGl0ZXJhdG9yID0gc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVyKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgYXdhaXQgbnVsbDtcbiAgd2hpbGUgKCFmaW5pc2hlZCkge1xuICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbiAgICBhd2FpdCBjb25zdW1lVmFsdWUodmFsdWUpO1xuICAgIGZpbmlzaGVkID0gISFkb25lO1xuICB9XG59O1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaWJlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZUNhcH0gVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmliZXI8VD59XG4gKi8kaM2PX29uY2UuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKGZvckVhY2hQdWJsaWNhdGlvblJlY29yZCk7XG4gICAgICAgY29uc3QgbWFrZVN0b3JlZFN1YnNjcmliZXIgPSAoc3Vic2NyaWJlciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpID0+IHtcbiAgYXNzZXJ0QWxsRGVmaW5lZCh7IHN1YnNjcmliZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyIH0pO1xuXG4gIGNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlID0gbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcik7XG5cbiAgLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG4gIGZvckVhY2hQdWJsaWNhdGlvblJlY29yZChzdWJzY3JpYmVyLCBtYXJzaGFsbFRvU3RvcmFnZSkuY2F0Y2goZXJyID0+IHtcbiAgICAvKiBUT0RPOiBIb3cgc2hvdWxkIHdlIGhhbmRsZSBhbmQvb3Igc3VyZmFjZSB0aGlzIGZhaWx1cmU/Ki9cbiAgICAvKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81NzY2I2Rpc2N1c3Npb25fcjkyMjQ5ODA4OCovXG4gICAgY29uc29sZS5lcnJvcignU3RvcmVkU3Vic2NyaWJlciBmYWlsZWQgdG8gaXRlcmF0ZScsIGVycik7XG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuICBjb25zdCB1bnNlcmlhbGl6ZXIgPSBGYXIoJ3Vuc2VyaWFsaXplcicsIHtcbiAgICBmcm9tQ2FwRGF0YTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICAgIHVuc2VyaWFsaXplOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaWJlcjxUPn0gKi9cbiAgY29uc3Qgc3RvcmVzdWIgPSBGYXIoJ1N0b3JlZFN1YnNjcmliZXInLCB7XG4gICAgc3Vic2NyaWJlQWZ0ZXI6IHB1Ymxpc2hDb3VudCA9PiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG4gICAgZ2V0VXBkYXRlU2luY2U6IHVwZGF0ZUNvdW50ID0+IHN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuICAgIGdldFBhdGg6ICgpID0+IEUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKSxcbiAgICBnZXRTdG9yZUtleTogKCkgPT4gRShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKSxcbiAgICBnZXRVbnNlcmlhbGl6ZXI6ICgpID0+IHVuc2VyaWFsaXplcixcbiAgfSk7XG4gIHJldHVybiBzdG9yZXN1Yjtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIG1ha2VTdG9yZWRTdWJzY3JpYmVyXG4gKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIHRoZSBpdGVyYXRpb24gd2lsbCBiZSB0ZXJtaW5hdGVkLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaXB0aW9uXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+IHwgbnVsbH0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gW21hcnNoYWxsZXJdXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fVxuICovJGjNj19vbmNlLm1ha2VTdG9yZWRTdWJzY3JpYmVyKG1ha2VTdG9yZWRTdWJzY3JpYmVyKTtcbiAgICAgICBjb25zdCBtYWtlU3RvcmVkU3Vic2NyaXB0aW9uID0gKFxuICBzdWJzY3JpcHRpb24sXG4gIHN0b3JhZ2VOb2RlLFxuICBtYXJzaGFsbGVyID0gbWFrZU1hcnNoYWwodW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcbiAgICBtYXJzaGFsU2F2ZUVycm9yOiAoKSA9PiB7fSxcbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnc21hbGxjYXBzJyxcbiAgfSksXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG4gIGNvbnN0IHVuc2VyaWFsaXplciA9IEZhcigndW5zZXJpYWxpemVyJywge1xuICAgIGZyb21DYXBEYXRhOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gICAgdW5zZXJpYWxpemU6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgfSk7XG5cbiAgLyogQWJvcnQgdGhlIGl0ZXJhdGlvbiBvbiB0aGUgbmV4dCBvYnNlcnZhdGlvbiBpZiB0aGUgcHVibGlzaGVyIGV2ZXIgZmFpbHMuKi9cbiAgbGV0IHB1Ymxpc2hGYWlsZWQgPSBmYWxzZTtcbiAgbGV0IHB1Ymxpc2hFeGNlcHRpb247XG5cbiAgY29uc3QgZmFpbCA9IGVyciA9PiB7XG4gICAgcHVibGlzaEZhaWxlZCA9IHRydWU7XG4gICAgcHVibGlzaEV4Y2VwdGlvbiA9IGVycjtcbiAgfTtcblxuICAvKiBNdXN0ICpub3QqIGJlIGFuIGFzeW5jIGZ1bmN0aW9uLCBiZWNhdXNlIGl0IHNvbWV0aW1lcyBtdXN0IHRocm93IHRvIGFib3J0Ki9cbiAgLyogdGhlIGl0ZXJhdGlvbi4qL1xuICBjb25zdCBwdWJsaXNoVmFsdWUgPSBvYmogPT4ge1xuICAgIGFzc2VydChzdG9yYWdlTm9kZSk7XG4gICAgaWYgKHB1Ymxpc2hGYWlsZWQpIHtcbiAgICAgIC8qIFRvIHByb3Blcmx5IGFib3J0IHRoZSBpdGVyYXRpb24sIHRoaXMgbXVzdCBiZSBhIHN5bmNocm9ub3VzIGV4Y2VwdGlvbi4qL1xuICAgICAgdGhyb3cgcHVibGlzaEV4Y2VwdGlvbjtcbiAgICB9XG5cbiAgICAvKiBQdWJsaXNoIHRoZSB2YWx1ZSwgY2FwdHVyaW5nIGFueSBlcnJvci4qL1xuICAgIEUobWFyc2hhbGxlcilcbiAgICAgIC50b0NhcERhdGEob2JqKVxuICAgICAgLnRoZW4oc2VyaWFsaXplZCA9PiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBKU09OLnN0cmluZ2lmeShzZXJpYWxpemVkKTtcbiAgICAgICAgcmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChmYWlsKTtcbiAgfTtcblxuICBpZiAoc3RvcmFnZU5vZGUpIHtcbiAgICAvKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbiAgICBvYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmlwdGlvbiwge1xuICAgICAgdXBkYXRlU3RhdGU6IHB1Ymxpc2hWYWx1ZSxcbiAgICAgIGZpbmlzaDogcHVibGlzaFZhbHVlLFxuICAgIH0pLmNhdGNoKGZhaWwpO1xuICB9XG5cbiAgLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpcHRpb248VD59ICovXG4gIGNvbnN0IHN0b3Jlc3ViID0gRmFyKCdTdG9yZWRTdWJzY3JpcHRpb24nLCB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBnZXRTdG9yZUtleSB0eXBlIGRvZXMgbm90IGhhdmUgYHN1YnNjcmlwdGlvbmAqL1xuICAgIGdldFN0b3JlS2V5OiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXN0b3JhZ2VOb2RlKSB7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBzdWJzY3JpcHRpb24gfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdG9yZUtleSA9IGF3YWl0IEUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgLi4uc3RvcmVLZXksIHN1YnNjcmlwdGlvbiB9KTtcbiAgICB9LFxuICAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gdW5zZXJpYWxpemVyLFxuICAgIGdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzOiAoKSA9PlxuICAgICAgc3Vic2NyaXB0aW9uLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gc3Vic2NyaXB0aW9uW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpLFxuICAgIHN1YnNjcmliZUFmdGVyOiBwdWJsaXNoQ291bnQgPT4gc3Vic2NyaXB0aW9uLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG4gIH0pO1xuICByZXR1cm4gc3RvcmVzdWI7XG59OyRozY9fb25jZS5tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBTdG9yZWRQdWJsaXNoS2l0XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaGVyS2l0XG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGlzaGVyXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbmNvbXBhdGlibGUgd2l0aCBkdXJhYmlsaXR5OyBpbnN0ZWFkIGhhbmRsZSB2c3RvcmFnZSBlcGhlbWVyYWxseSBvbiBhIGR1cmFibGUgUHVibGlzaEtpdFxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPiB8IG51bGx9IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IFttYXJzaGFsbGVyXVxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGlsZFBhdGhdXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaGVyS2l0PFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVN0b3JlZFB1Ymxpc2hlcktpdCA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciwgY2hpbGRQYXRoKSA9PiB7XG4gIGNvbnN0IHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9ID0gbWFrZVN1YnNjcmlwdGlvbktpdCgpO1xuXG4gIGlmIChzdG9yYWdlTm9kZSAmJiBjaGlsZFBhdGgpIHtcbiAgICBzdG9yYWdlTm9kZSA9IEUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGRQYXRoKTtcbiAgfVxuXG4gIC8qIHdyYXAgdGhlIHN1YnNjcmlwdGlvbiB0byB0ZWUgZXZlbnRzIHRvIHN0b3JhZ2UsIHJlcGVhdGluZyB0byB0aGlzIGBzdWJzY3JpYmVyYCovXG4gIGNvbnN0IHN1YnNjcmliZXIgPSBtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKFxuICAgIHN1YnNjcmlwdGlvbixcbiAgICBzdG9yYWdlTm9kZSxcbiAgICBtYXJzaGFsbGVyLFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgcHVibGlzaGVyOiBwdWJsaWNhdGlvbixcbiAgICBzdWJzY3JpYmVyLFxuICB9O1xufTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbmNvbXBhdGlibGUgd2l0aCBkdXJhYmlsaXR5OyBpbnN0ZWFkIGhhbmRsZSB2c3RvcmFnZSBlcGhlbWVyYWxseSBvbiBhIGR1cmFibGUgUHVibGlzaEtpdFxuICpcbiAqIExpa2UgbWFrZVB1Ymxpc2hLaXQgdGhpcyBtYWtlcyBhIGB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9YCBwYWlyIGZvciBkb2luZyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIgc3VwcG9ydGluZyBib3RoIFwiZWFjaFwiIGFuZCBcImxhdGVzdFwiIGl0ZXJhdGlvblxuICogb2YgcHVibGlzaGVkIHZhbHVlcy5cbiAqXG4gKiBXaGF0J3MgZGlmZmVyZW50IGlzIGBzdWJzY3JpYmVyYCB0ZWVzIHJlY29yZHMsIHdyaXRpbmcgb3V0IHRvIHN0b3JhZ2VOb2RlLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRQdWJsaXNoS2l0PFQ+fVxuICovJGjNj19vbmNlLm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQobWFrZVN0b3JlZFB1Ymxpc2hlcktpdCk7XG4gICAgICAgY29uc3QgbWFrZVN0b3JlZFB1Ymxpc2hLaXQgPSAoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpID0+IHtcbiAgY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VQdWJsaXNoS2l0KCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwdWJsaXNoZXIsXG4gICAgLyogd3JhcCB0aGUgc3Vic2NyaWJlciB0byB0ZWUgZXZlbnRzIHRvIHN0b3JhZ2UqL1xuICAgIHN1YnNjcmliZXI6IG1ha2VTdG9yZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSxcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VTdG9yZWRQdWJsaXNoS2l0KG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIl0sIm1ha2VTdG9yZWRTdWJzY3JpYmVyIjpbIm1ha2VTdG9yZWRTdWJzY3JpYmVyIl0sIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iOlsibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiXSwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZA69fPIpAADyKQAAKAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIl0sImV4cG9ydHMiOlsic3Vic2NyaWJlIiwic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUxhdGVzdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsRmFpbCxhbm5vdGF0ZUVycm9yLEUsRmFyLGlzUHJpbWl0aXZlLGlzVXBncmFkZURpc2Nvbm5lY3Rpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanNcIiwgW1tcImlzVXBncmFkZURpc2Nvbm5lY3Rpb25cIixbJGjNj19hID0+IChpc1VwZ3JhZGVEaXNjb25uZWN0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7SXRlcmF0aW9uT2JzZXJ2ZXIsIExhdGVzdFRvcGljLCBOb3RpZmllciwgTm90aWZpZXJSZWNvcmQsIFB1YmxpY2F0aW9uUmVjb3JkLCBQdWJsaXNoZXIsIFB1Ymxpc2hLaXQsIFN0b3JlZFB1Ymxpc2hLaXQsIFN0b3JlZFN1YnNjcmlwdGlvbiwgU3RvcmVkU3Vic2NyaWJlciwgU3Vic2NyaWJlciwgU3Vic2NyaXB0aW9uLCBVcGRhdGVSZWNvcmQsIEVhY2hUb3BpYywgRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3J9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKi9cblxuY29uc3Qgc2luayA9ICgpID0+IHt9O1xuXG4vKipcbiAqIENoZWNrIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IGEgZnVuY3Rpb24gZm9yIHJlamVjdGlvbiBieSB2YXQgdXBncmFkZSxcbiAqIGFuZCByZWZldGNoIHVwb24gZW5jb3VudGVyaW5nIHRoYXQgY29uZGl0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IEVSZWY8VD59IGdldHRlclxuICogQHBhcmFtIHtFUmVmPFQ+W119IFtzZWVkXVxuICogQHJldHVybnMge1Byb21pc2U8VD59XG4gKi9cbmNvbnN0IHJlY29ubmVjdEFzTmVlZGVkID0gYXN5bmMgKGdldHRlciwgc2VlZCA9IFtdKSA9PiB7XG4gIGxldCBkaXNjb25uZWN0aW9uO1xuICBsZXQgbGFzdFZlcnNpb24gPSAtSW5maW5pdHk7XG4gIC8qIEVuZCBzeW5jaHJvbm91cyBwcmVsdWRlLiovXG4gIGF3YWl0IG51bGw7XG4gIGZvciAobGV0IGkgPSAwOyA7IGkgKz0gMSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHRQID0gaSA8IHNlZWQubGVuZ3RoID8gc2VlZFtpXSA6IGdldHRlcigpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzdWx0UDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoaXNVcGdyYWRlRGlzY29ubmVjdGlvbihlcnIpKSB7XG4gICAgICAgIGlmICghZGlzY29ubmVjdGlvbikge1xuICAgICAgICAgIGRpc2Nvbm5lY3Rpb24gPSBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpbmNhcm5hdGlvbk51bWJlcjogdmVyc2lvbiB9ID0gZXJyO1xuICAgICAgICBpZiAodmVyc2lvbiA+IGxhc3RWZXJzaW9uKSB7XG4gICAgICAgICAgLyogV2UgZG9uJ3QgZXhwZWN0IGFub3RoZXIgdXBncmFkZSBpbiBiZXR3ZWVuIHJlY2VpdmluZyovXG4gICAgICAgICAgLyogYSBkaXNjb25uZWN0aW9uIGFuZCByZS1yZXF1ZXN0aW5nIGFuIHVwZGF0ZSwgYnV0IG11c3QqL1xuICAgICAgICAgIC8qIG5ldmVydGhlbGVzcyBiZSBwcmVwYXJlZCBmb3IgdGhhdC4qL1xuICAgICAgICAgIGxhc3RWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyogaWYgYGVycmAgaXMgYW4gKEVycm9yKSBvYmplY3QsIHdlIGNhbiB0cnkgdG8gYXNzb2NpYXRlIGl0IHdpdGgqL1xuICAgICAgLyogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRpc2Nvbm5lY3Rpb24gdGhhdCBwcm9tcHRlZCB0aGUgcmVxdWVzdCovXG4gICAgICAvKiBmb3Igd2hpY2ggaXQgaXMgYSByZXN1bHQuKi9cbiAgICAgIGlmICghaXNQcmltaXRpdmUoZXJyKSAmJiBkaXNjb25uZWN0aW9uICYmIGRpc2Nvbm5lY3Rpb24gIT09IGVycikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGFubm90YXRlRXJyb3IoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBYYEF0dGVtcHRpbmcgdG8gcmVjb3ZlciBmcm9tIGRpc2Nvbm5lY3Rpb246ICR7ZGlzY29ubmVjdGlvbn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAvKiBub29wKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZWFyIGl0ZXJhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwb3RlbnRpYWxseSBmYXIgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+Pn0gaXRQXG4gKi9cbiAgICAgICBjb25zdCBzdWJzY3JpYmUgPSBpdFAgPT5cbiAgRmFyKCdBc3luY0l0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGl0ID0gRShpdFApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgICAgY29uc3Qgc2VsZiA9IEZhcignQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJywge1xuICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgICAgICBuZXh0OiBhc3luYyAoKSA9PiBFKGl0KS5uZXh0KCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG4gIH0pO1xuXG4vKipcbiAqIEFzeW5jcm9ub3VzbHkgaXRlcmF0ZXMgb3ZlciB0aGUgY29udGVudHMgb2YgYSBQdWJsaWNhdGlvblJlY29yZCBjaGFpbiBhcyB0aGV5XG4gKiBhcHBlYXIuICBUaGlzIGl0ZXJhdGlvbiBtdXN0IGRyb3AgcGFydHMgb2YgcHVibGljYXRpb24gcmVjb3JkcyB0aGF0IGFyZSBub1xuICogbG9uZ2VyIG5lZWRlZCBzbyB0aGV5IGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEVhY2hUb3BpYzxUPj59IHRvcGljXG4gKiBAcGFyYW0ge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fSBuZXh0Q2VsbFBcbiAqICAgUHVibGljYXRpb25SZWNvcmQgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBmaXJzdCBpdGVyYXRpb24gcmVzdWx0XG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVD59XG4gKi8kaM2PX29uY2Uuc3Vic2NyaWJlKHN1YnNjcmliZSk7XG5jb25zdCBtYWtlRWFjaEl0ZXJhdG9yID0gKHRvcGljLCBuZXh0Q2VsbFApID0+IHtcbiAgLyogVG8gdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24sIHN0YXJ0IHdpdGgqL1xuICAvKiBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNjA0MDQxMjIyNTAvaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9c3RyYXdtYW46Y29uY3VycmVuY3kjaW5maW5pdGVfcXVldWUqL1xuICBjb25zdCBzZWxmID0gRmFyKCdFYWNoSXRlcmF0b3InLCB7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gc2VsZixcbiAgICBuZXh0OiAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGhlYWQ6IHJlc3VsdFAsXG4gICAgICAgIHB1Ymxpc2hDb3VudDogcHVibGlzaENvdW50UCxcbiAgICAgICAgdGFpbDogdGFpbFAsXG4gICAgICB9ID0gRS5nZXQobmV4dENlbGxQKTtcblxuICAgICAgLyogSWYgdGFpbFAgaXMgYnJva2VuIGJ5IHVwZ3JhZGUsIHdlIHdpbGwgbmVlZCB0byByZS1yZXF1ZXN0IGl0Ki9cbiAgICAgIC8qIGRpcmVjdGx5IGZyb20gYHRvcGljYC4qL1xuICAgICAgY29uc3QgZ2V0U3VjY2Vzc29yID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwdWJsaXNoQ291bnQgPSBhd2FpdCBwdWJsaXNoQ291bnRQO1xuICAgICAgICBhc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwgJ2JpZ2ludCcpO1xuICAgICAgICBjb25zdCBzdWNjZXNzb3IgPSBhd2FpdCBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuICAgICAgICBjb25zdCBuZXdQdWJsaXNoQ291bnQgPSBzdWNjZXNzb3IucHVibGlzaENvdW50O1xuICAgICAgICBpZiAobmV3UHVibGlzaENvdW50ICE9PSBwdWJsaXNoQ291bnQgKyAxbikge1xuICAgICAgICAgIEZhaWxgZWFjaEl0ZXJhdG9yIGJyb2tlbiBieSBnYXAgZnJvbSBwdWJsaXNoQ291bnQgJHtwdWJsaXNoQ291bnR9IHRvICR7bmV3UHVibGlzaENvdW50fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NvcjtcbiAgICAgIH07XG5cbiAgICAgIC8qIFJlcGxhY2UgbmV4dENlbGxQIG9uIGV2ZXJ5IGNhbGwgdG8gbmV4dCgpIHNvIHRoaW5ncyB3b3JrIGV2ZW4qL1xuICAgICAgLyogd2l0aCBhbiBlYWdlciBjb25zdW1lciB0aGF0IGRvZXNuJ3Qgd2FpdCBmb3IgcmVzdWx0cyB0byBzZXR0bGUuKi9cbiAgICAgIG5leHRDZWxsUCA9IHJlY29ubmVjdEFzTmVlZGVkKGdldFN1Y2Nlc3NvciwgW3RhaWxQXSk7XG5cbiAgICAgIC8qIEF2b2lkIHVuaGFuZGxlZCByZWplY3Rpb24gd2FybmluZ3MgaGVyZSBpZiB0aGUgcHJldmlvdXMgY2VsbCB3YXMgcmVqZWN0ZWQgb3IqL1xuICAgICAgLyogdGhlcmUgaXMgbm8gZnVydGhlciByZXF1ZXN0IG9mIHRoaXMgaXRlcmF0b3IuKi9cbiAgICAgIC8qIGB0YWlsUGAgaXMgaGFuZGxlZCBpbnNpZGUgYHJlY29ubmVjdEFzTmVlZGVkYCBhbmQgYHJlc3VsdFBgIGlzIHRoZSBjYWxsZXIncyovXG4gICAgICAvKiBjb25jZXJuLCBsZWF2aW5nIG9ubHkgYHB1Ymxpc2hDb3VudFBgIGFuZCB0aGUgbmV3IGBuZXh0Q2VsbFBgLiovXG4gICAgICB2b2lkIEUud2hlbihwdWJsaXNoQ291bnRQLCBzaW5rLCBzaW5rKTtcbiAgICAgIHZvaWQgRS53aGVuKG5leHRDZWxsUCwgc2luaywgc2luayk7XG4gICAgICByZXR1cm4gcmVzdWx0UDtcbiAgICB9LFxuICAgIGZvcms6ICgpID0+IG1ha2VFYWNoSXRlcmF0b3IodG9waWMsIG5leHRDZWxsUCksXG4gIH0pO1xuICByZXR1cm4gc2VsZjtcbn07XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwicHJlZml4IGxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcInByZWZpeCBsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGV2ZXJ5dGhpbmcgcHVibGlzaGVkIGJlZm9yZVxuICogeW91IGFzayB0aGUgcmV0dXJuZWQgaXRlcmFibGUgZm9yIGFuIGl0ZXJhdG9yLiBCdXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yXG4gKiB3aWxsIGVudW1lcmF0ZSBlYWNoIHRoaW5nIHB1Ymxpc2hlZCBmcm9tIHRoYXQgaXRlcmF0b3IncyBzdGFydGluZyBwb2ludFxuICogdXAgdG8gYSBkaXNjb25uZWN0aW9uIHJlc3VsdCBpbmRpY2F0aW5nIHVwZ3JhZGUgb2YgdGhlIHByb2R1Y2VyXG4gKiAod2hpY2ggYnJlYWtzIHRoZSBnYXAtZnJlZSBndWFyYW50ZWUgYW5kIHRoZXJlZm9yZSB0ZXJtaW5hdGVzIGFueSBhY3RpdmVcbiAqIGl0ZXJhdG9yIHdoaWxlIHN0aWxsIHN1cHBvcnRpbmcgY3JlYXRpb24gb2YgbmV3IGl0ZXJhdG9ycykuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQsIHRoYXQgdGVybWluYWwgdmFsdWUgd2lsbCBiZVxuICogcmVwb3J0ZWQgbG9zc2xlc3NseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEVhY2hUb3BpYzxUPj59IHRvcGljXG4gKi9cbiAgICAgICBjb25zdCBzdWJzY3JpYmVFYWNoID0gdG9waWMgPT4ge1xuICBjb25zdCBpdGVyYWJsZSA9IEZhcignRWFjaEl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2VsbFAgPSByZWNvbm5lY3RBc05lZWRlZCgoKSA9PiBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcigpKTtcbiAgICAgIHJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHRvcGljLCBmaXJzdENlbGxQKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2Uuc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVFYWNoKTtcbmhhcmRlbihzdWJzY3JpYmVFYWNoKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gdG9waWNcbiAqIEBwYXJhbSB7YmlnaW50fSBbbG9jYWxVcGRhdGVDb3VudF1cbiAqIEBwYXJhbSB7SXRlcmF0b3JSZXR1cm5SZXN1bHQ8VD59IFt0ZXJtaW5hbFJlc3VsdF1cbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUPn1cbiAqL1xuY29uc3QgY2xvbmVMYXRlc3RJdGVyYXRvciA9ICh0b3BpYywgbG9jYWxVcGRhdGVDb3VudCwgdGVybWluYWxSZXN1bHQpID0+IHtcbiAgbGV0IG11dGV4ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqXG4gKiBSZXF1ZXN0IHRoZSBuZXh0IHVwZGF0ZSByZWNvcmQgZnJvbSB0aGUgdG9waWMsIHVwZGF0aW5nIG91ciBsb2NhbCBzdGF0ZSxcbiAqIGFuZCBjb252ZXJ0IGl0IHRvIGFuIGl0ZXJhdG9yIHJlc3VsdC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUPj59XG4gKi9cbiAgY29uc3QgbWF5YmVSZXF1ZXN0TmV4dFJlc3VsdCA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAodGVybWluYWxSZXN1bHQpIHtcbiAgICAgIC8qIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdG9waWMsIGp1c3Qga2VlcCByZXR1cm5pbmcgdGhlIGxhc3QgcmVzdWx0Ki9cbiAgICAgIC8qIHdpdGhvdXQgZnVydGhlciByZXF1ZXN0cy4qL1xuICAgICAgcmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuICAgIH1cblxuICAgIC8qIFNlbmQgdGhlIG5leHQgcmVxdWVzdCBub3csIHNraXBwaW5nIHBhc3QgaW50ZXJtZWRpYXRlIHVwZGF0ZXMqL1xuICAgIC8qIGFuZCB1cGdyYWRlIGRpc2Nvbm5lY3Rpb25zLiovXG4gICAgY29uc3QgeyB2YWx1ZSwgdXBkYXRlQ291bnQgfSA9IGF3YWl0IHJlY29ubmVjdEFzTmVlZGVkKCgpID0+XG4gICAgICBFKHRvcGljKS5nZXRVcGRhdGVTaW5jZShsb2NhbFVwZGF0ZUNvdW50KSxcbiAgICApO1xuICAgIC8qIE1ha2Ugc3VyZSB0aGUgbmV4dCByZXF1ZXN0IGlzIGZvciBhIGZyZXNoZXIgdmFsdWUuKi9cbiAgICBsb2NhbFVwZGF0ZUNvdW50ID0gdXBkYXRlQ291bnQ7XG5cbiAgICAvKiBNYWtlIGFuIEl0ZXJhdG9yUmVzdWx0LiovXG4gICAgaWYgKHVwZGF0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlcm1pbmFsUmVzdWx0ID0gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWUgfSk7XG4gICAgICByZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gIH07XG5cbiAgY29uc3Qgc2VsZiA9IEZhcignTGF0ZXN0SXRlcmF0b3InLCB7XG4gICAgZm9yazogKCkgPT4gY2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYywgbG9jYWxVcGRhdGVDb3VudCwgdGVybWluYWxSZXN1bHQpLFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHNlbGYsXG4gICAgbmV4dDogYXN5bmMgKCkgPT4ge1xuICAgICAgLyogSW4gdGhpcyBhZGFwdG9yLCBvbmNlIGBuZXh0KClgIGlzIGNhbGxlZCBhbmQgcmV0dXJucyBhbiB1bnJlc29sdmVkKi9cbiAgICAgIC8qIHByb21pc2UsIGZ1cnRoZXIgYG5leHQoKWAgY2FsbHMgd2lsbCBhbHNvIHJldHVybiB1bnJlc29sdmVkIHByb21pc2VzKi9cbiAgICAgIC8qIGJ1dCBlYWNoIGNhbGwgd2lsbCBub3QgdHJpZ2dlciBhbm90aGVyIGB0b3BpY2AgcmVxdWVzdCB1bnRpbCB0aGUgcHJpb3IqL1xuICAgICAgLyogb25lIGhhcyBzZXR0bGVkLiovXG4gICAgICAvKiovXG4gICAgICAvKiBUaGlzIGxpbmVhciBxdWV1ZWluZyBiZWhhdmlvciBpcyBvbmx5IG5lZWRlZCBmb3IgY29kZSB0aGF0IHVzZXMgdGhlKi9cbiAgICAgIC8qIGFzeW5jIGl0ZXJhdG9yIHByb3RvY29sIGV4cGxpY2l0bHkuIFdoZW4gdGhpcyBhc3luYyBpdGVyYXRvciBpcyovXG4gICAgICAvKiBjb25zdW1lZCBieSBhIGZvci9hd2FpdC9vZiBsb29wLCBgbmV4dCgpYCB3aWxsIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZSovXG4gICAgICAvKiBwcm9taXNlIGZvciB0aGUgcHJldmlvdXMgaXRlcmF0aW9uIHJlc3VsdCBoYXMgZnVsZmlsbGVkLiBJZiBpdCBmdWxmaWxscyovXG4gICAgICAvKiB3aXRoIGBkb25lOiB0cnVlYCwgdGhlIGZvci9hd2FpdC9vZiBsb29wIHdpbGwgbmV2ZXIgY2FsbCBgbmV4dCgpYCovXG4gICAgICAvKiBhZ2Fpbi4qL1xuICAgICAgLyoqL1xuICAgICAgLyogU2VlKi9cbiAgICAgIC8qIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDE2LzEwL2FzeW5jaHJvbm91cy1pdGVyYXRpb24uaHRtbCNxdWV1aW5nLW5leHQoKS1pbnZvY2F0aW9ucyovXG4gICAgICAvKiBmb3IgYW4gZXhwbGljaXQgdXNlIHRoYXQgc2VuZHMgYG5leHQoKWAgd2l0aG91dCB3YWl0aW5nLiovXG5cbiAgICAgIGlmICh0ZXJtaW5hbFJlc3VsdCkge1xuICAgICAgICAvKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRvcGljLCBqdXN0IGtlZXAgcmV0dXJuaW5nIHRoZSBsYXN0Ki9cbiAgICAgICAgLyogcmVzdWx0LiovXG4gICAgICAgIHJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgLyogQkVHSU4gQ1JJVElDQUwgU0VDVElPTiAtIHN5bmNocm9ub3VzbHkgZW5xdWV1ZSBhbmQgcmVhc3NpZ24gYG11dGV4YCovXG4gICAgICAvKiovXG4gICAgICAvKiBVc2UgYG11dGV4YCB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlIG5vIG1vcmUgdGhhbiBhIHNpbmdsZSByZXF1ZXN0IGluKi9cbiAgICAgIC8qIGZsaWdodC4qL1xuICAgICAgY29uc3QgbmV4dFJlc3VsdCA9IG11dGV4LnRoZW4obWF5YmVSZXF1ZXN0TmV4dFJlc3VsdCk7XG4gICAgICBtdXRleCA9IG5leHRSZXN1bHQudGhlbihzaW5rLCBzaW5rKTtcbiAgICAgIC8qIEVORCBDUklUSUNBTCBTRUNUSU9OKi9cblxuICAgICAgcmV0dXJuIG5leHRSZXN1bHQ7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzZWxmO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gdG9waWNcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUPn1cbiAqL1xuY29uc3QgbWFrZUxhdGVzdEl0ZXJhdG9yID0gdG9waWMgPT4gY2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyk7XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwibG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwibG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBhbnkgcHVibGlzaGVkIHN0YXRlIGlmIGEgbW9yZVxuICogcmVjZW50IHB1Ymxpc2hlZCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCBieSB1cGdyYWRlIG9mIHRoZSBwcm9kdWNlcixcbiAqIGl0IHdpbGwgYmUgcmUtcmVxdWVzdGVkLiBBbGwgb3RoZXIgdGVybWluYWwgdmFsdWVzIHdpbGwgYmUgbG9zc2xlc3NseVxuICogcHJvcGFnYXRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gdG9waWNcbiAqL1xuICAgICAgIGNvbnN0IHN1YnNjcmliZUxhdGVzdCA9IHRvcGljID0+IHtcbiAgY29uc3QgaXRlcmFibGUgPSBGYXIoJ0xhdGVzdEl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IG1ha2VMYXRlc3RJdGVyYXRvcih0b3BpYyksXG4gIH0pO1xuICByZXR1cm4gaXRlcmFibGU7XG59OyRozY9fb25jZS5zdWJzY3JpYmVMYXRlc3Qoc3Vic2NyaWJlTGF0ZXN0KTtcbmhhcmRlbihzdWJzY3JpYmVMYXRlc3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3Vic2NyaWJlIjpbInN1YnNjcmliZSJdLCJzdWJzY3JpYmVFYWNoIjpbInN1YnNjcmliZUVhY2giXSwic3Vic2NyaWJlTGF0ZXN0IjpbInN1YnNjcmliZUxhdGVzdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABXqgSRKQ0AACkNAAApAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiLi9zdWJzY3JpYmUuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi90b3BpYy5qcyJdLCJleHBvcnRzIjpbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYXIsc3Vic2NyaWJlRWFjaCxtYWtlUHVibGlzaEtpdCxtYWtlUGlubmVkSGlzdG9yeVRvcGljOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi90b3BpYy5qc1wiLCBbW1wibWFrZVBpbm5lZEhpc3RvcnlUb3BpY1wiLFskaM2PX2EgPT4gKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFYWNoVG9waWMsIEl0ZXJhdGlvbk9ic2VydmVyLCBMYXRlc3RUb3BpYywgTm90aWZpZXIsIE5vdGlmaWVyUmVjb3JkLCBTdWJzY3JpcHRpb25SZWNvcmQsIFB1Ymxpc2hlciwgUHVibGlzaEtpdCwgU3RvcmVkUHVibGlzaEtpdCwgU3RvcmVkU3Vic2NyaXB0aW9uLCBTdG9yZWRTdWJzY3JpYmVyLCBTdWJzY3JpYmVyLCBTdWJzY3JpcHRpb24sIFVwZGF0ZVJlY29yZH0gZnJvbSAnLi4vc3JjL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb248VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb24gPSB0b3BpYyA9PiB7XG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IEZhcignU3Vic2NyaXB0aW9uJywge1xuICAgIC4uLnN1YnNjcmliZUVhY2godG9waWMpLFxuICAgIHN1YnNjcmliZUFmdGVyOiBhc3luYyBwdWJsaXNoQ291bnQgPT4gRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcblxuICAgIC8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIFN1YnNjcmlwdGlvbiBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgU3Vic2NyaXB0aW9uIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VTdWJzY3JpcHRpb25gIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogU3Vic2NyaXB0aW9uIGF0IHRoYXQgc2l0ZS5cbiAqL1xuICAgIGdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzOiBhc3luYyAoKSA9PiB0b3BpYyxcblxuICAgIGdldFN0b3JlS2V5OiAoKSA9PiBoYXJkZW4oeyBzdWJzY3JpcHRpb24gfSksXG4gIH0pO1xuICByZXR1cm4gc3Vic2NyaXB0aW9uO1xufTskaM2PX29uY2UubWFrZVN1YnNjcmlwdGlvbihtYWtlU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uKTtcblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFByb2R1Y2VycyBzaG91bGQgdXNlXG4gKiBgYGBqc1xuICogY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VQdWJsaXNoS2l0KCk7XG4gKiBjb25zdCB0b3BpYyA9IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG4gKiBgYGBcbiAqIGluc3RlYWQsIHdoaWNoIG1ha2VzIGl0IGNsZWFyZXIgdGhhdCBhbGwgdGhlIHN1YnNjcmliZXIncyBoaXN0b3J5IGlzXG4gKiByZXRhaW5lZCwgcHJldmVudGluZyBHQy4gIFBvdGVudGlhbGx5IHJlbW90ZSBjb25zdW1lcnMgdXNlXG4gKiBgYGBqc1xuICogZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBzdWJzY3JpYmVFYWNoKHRvcGljKSkgeyAuLi4gfVxuICogYGBgXG4gKlxuICogTWFrZXMgYSBgeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH1gIGZvciBkb2luZyBsb3NzbGVzcyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb25SZWNvcmQ8VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb25LaXQgPSAoKSA9PiB7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuXG4gIC8qIFRoZSBwdWJsaXNoIGtpdCBzdWJzY3JpYmVyIGlzIHByZWZpeC1sb3NzeSwgc28gbWFraW5nICp0aGlzKiBzdWJzY3JpYmVyIGNvbXBsZXRlbHkqL1xuICAvKiBsb3NzbGVzcyBmcm9tIGluaXRpYWxpc2F0aW9uIHJlcXVpcmVzIHBpbm5pbmcgdGhlIGZvcm1lcidzIGhpc3RvcnkuKi9cblxuICBjb25zdCBwaW5uZWRIaXN0b3J5VG9waWMgPSBtYWtlUGlubmVkSGlzdG9yeVRvcGljKHN1YnNjcmliZXIpO1xuICBjb25zdCBzdWJzY3JpcHRpb24gPSBtYWtlU3Vic2NyaXB0aW9uKHBpbm5lZEhpc3RvcnlUb3BpYyk7XG5cbiAgLyoqIEB0eXBlIHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gKi9cbiAgY29uc3QgcHVibGljYXRpb24gPSBGYXIoJ3B1YmxpY2F0aW9uJywge1xuICAgIHVwZGF0ZVN0YXRlOiBub25GaW5hbFZhbHVlID0+IHB1Ymxpc2hlci5wdWJsaXNoKG5vbkZpbmFsVmFsdWUpLFxuICAgIGZpbmlzaDogY29tcGxldGlvbiA9PiBwdWJsaXNoZXIuZmluaXNoKGNvbXBsZXRpb24pLFxuICAgIGZhaWw6IHJlYXNvbiA9PiBwdWJsaXNoZXIuZmFpbChyZWFzb24pLFxuICB9KTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9KTtcbn07JGjNj19vbmNlLm1ha2VTdWJzY3JpcHRpb25LaXQobWFrZVN1YnNjcmlwdGlvbktpdCk7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3Vic2NyaXB0aW9uIjpbIm1ha2VTdWJzY3JpcHRpb24iXSwibWFrZVN1YnNjcmlwdGlvbktpdCI6WyJtYWtlU3Vic2NyaXB0aW9uS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHfmSkaVBgAAlQYAACQAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdG9waWMuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogQGltcG9ydCB7RWFjaFRvcGljLCBMYXRlc3RUb3BpY30gZnJvbSAnLi4vc3JjL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIEEgcGlubmVkLWhpc3RvcnkgdG9waWMgcHJlc2VydmVzIGFsbCBvZiBpdHMgcHVibGlzaGVkIHZhbHVlcyBpblxuICogbWVtb3J5LiAgVXNlIGEgcHJlZml4LWxvc3N5IG1ha2VQdWJsaXNoS2l0IGluc3RlYWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RWFjaFRvcGljPFQ+ICYgTGF0ZXN0VG9waWM8VD59IHRvcGljIG5lZWRzIHRvIGJlIG5lYXIgaW4gb3JkZXIgdG9cbiAqIHByZXNlcnZlIHN1YnNjcmlwdGlvbiB0aW1pbmdzLiAgVE9ETzogZHJvcCBgTGF0ZXN0VG9waWM8VD5gIHJlcXVpcmVtZW50XG4gKiBAcmV0dXJucyB7RWFjaFRvcGljPFQ+ICYgTGF0ZXN0VG9waWM8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUGlubmVkSGlzdG9yeVRvcGljID0gdG9waWMgPT4ge1xuICAvKiBTdWNoIGxvc3NsZXNzbmVzcyBpbmhpYml0cyBHQywgd2hpY2ggaXMgd2h5IHdlJ3JlIG1vdmluZyBhd2F5IGZyb20gaXQuKi9cblxuICAvKiBXZSBuZWVkIHRvIHRha2UgYW4gaW1tZWRpYXRlIHNuYXBzaG90IG9mIHRoZSB0b3BpYydzIGN1cnJlbnQgc3RhdGUuKi9cbiAgY29uc3QgcGlubmVkUHViTGlzdCA9IHRvcGljLnN1YnNjcmliZUFmdGVyKCk7XG5cbiAgcmV0dXJuIEZhcignUGlubmVkSGlzdG9yeVRvcGljJywge1xuICAgIHN1YnNjcmliZUFmdGVyOiBhc3luYyAocHVibGlzaENvdW50ID0gLTFuKSA9PiB7XG4gICAgICBpZiAocHVibGlzaENvdW50ID09PSAtMW4pIHtcbiAgICAgICAgcmV0dXJuIHBpbm5lZFB1Ykxpc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gdG9waWMuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbiAgICB9LFxuICAgIGdldFVwZGF0ZVNpbmNlOiBhc3luYyAodXBkYXRlQ291bnQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIC8qIFRPRE86IEJ1aWxkIHRoaXMgb3V0IG9mIEVhY2hUb3BpYzxUPi4qL1xuICAgICAgcmV0dXJuIHRvcGljLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VQaW5uZWRIaXN0b3J5VG9waWMobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG5oYXJkZW4obWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADcc9M9YAcAAGAHAAAtAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZUZha2VNYXJzaGFsbGVyIiwibWFrZUZha2VTdG9yYWdlIixudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXIsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanNcIiwgW11dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtJdGVyYXRpb25PYnNlcnZlcjx1bmtub3duPn0gW3B1YmxpY2F0aW9uXVxuICovXG4gICAgICAgY29uc3QgbWFrZUZha2VTdG9yYWdlID0gKHBhdGgsIHB1YmxpY2F0aW9uKSA9PiB7XG4gIGxldCBzZXRWYWx1ZUNhbGxzID0gMDtcbiAgY29uc3QgZnVsbFBhdGggPSBgcHVibGlzaC4ke3BhdGh9YDtcbiAgY29uc3Qgc3RvcmVLZXkgPSBoYXJkZW4oe1xuICAgIHN0b3JlTmFtZTogJ3N3aW5nc2V0JyxcbiAgICBzdG9yZVN1YmtleTogYHN3aW5nc2V0L2RhdGE6JHtmdWxsUGF0aH1gLFxuICAgIGRhdGFQcmVmaXhCeXRlczogJycsXG4gIH0pO1xuICAvKiogQHR5cGUge1N0b3JhZ2VOb2RlICYgeyBjb3VudFNldFZhbHVlQ2FsbHM6ICgpID0+IG51bWJlcn19ICovXG4gIGNvbnN0IHN0b3JhZ2UgPSBGYXIoJ1N0b3JhZ2VOb2RlJywge1xuICAgIGdldFBhdGg6ICgpID0+IHBhdGgsXG4gICAgZ2V0U3RvcmVLZXk6IGFzeW5jICgpID0+IHN0b3JlS2V5LFxuICAgIHNldFZhbHVlOiBhc3luYyB2YWx1ZSA9PiB7XG4gICAgICBzZXRWYWx1ZUNhbGxzICs9IDE7XG4gICAgICBhc3NlcnQudHlwZW9mKHZhbHVlLCAnc3RyaW5nJyk7XG4gICAgICBpZiAocHVibGljYXRpb24pIHtcbiAgICAgICAgcHVibGljYXRpb24udXBkYXRlU3RhdGUodmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbWFrZUNoaWxkTm9kZTogKCkgPT4gc3RvcmFnZSxcbiAgICBjb3VudFNldFZhbHVlQ2FsbHM6ICgpID0+IHNldFZhbHVlQ2FsbHMsXG4gIH0pO1xuICByZXR1cm4gc3RvcmFnZTtcbn07JGjNj19vbmNlLm1ha2VGYWtlU3RvcmFnZShtYWtlRmFrZVN0b3JhZ2UpO1xuaGFyZGVuKG1ha2VGYWtlU3RvcmFnZSk7XG5cbiAgICAgICBjb25zdCBtYWtlRmFrZU1hcnNoYWxsZXIgPSAoKSA9PlxuICBtYWtlTWFyc2hhbCh1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuICAgIG1hcnNoYWxTYXZlRXJyb3I6ICgpID0+IHt9LFxuICB9KTskaM2PX29uY2UubWFrZUZha2VNYXJzaGFsbGVyKG1ha2VGYWtlTWFyc2hhbGxlcik7XG5oYXJkZW4obWFrZUZha2VNYXJzaGFsbGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanMiOltbImV2ZW50TG9vcEl0ZXJhdGlvbiIsImV2ZW50TG9vcEl0ZXJhdGlvbiJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRmFrZVN0b3JhZ2UiOlsibWFrZUZha2VTdG9yYWdlIl0sIm1ha2VGYWtlTWFyc2hhbGxlciI6WyJtYWtlRmFrZU1hcnNoYWxsZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARxpyk0YOAABGDgAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyIsIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsIkBlbmRvL2V4byIsIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyIsIm11c3RNYXRjaCIsInByb3ZpZGVMYXp5IiwicHJvdmlkZUxhenkiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+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+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG4gICAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVN0b3JlVXRpbHMobWFrZVN0b3JlVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxTdG9yZVV0aWxzID0gbWFrZVN0b3JlVXRpbHMoVmF0RGF0YUdsb2JhbCk7XG4gICAgICAgY29uc3Qge1xuICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxuICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVTZXRTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsXG59ID0gZ2xvYmFsU3RvcmVVdGlsczskaM2PX29uY2UucHJvdmlkZUR1cmFibGVNYXBTdG9yZShwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTskaM2PX29uY2UucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJWYXREYXRhIjpbIlZhdERhdGFFeHBvcnQiXSwiZGVmaW5lS2luZCI6WyJkZWZpbmVLaW5kIl0sImRlZmluZUtpbmRNdWx0aSI6WyJkZWZpbmVLaW5kTXVsdGkiXSwiZGVmaW5lRHVyYWJsZUtpbmQiOlsiZGVmaW5lRHVyYWJsZUtpbmQiXSwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSI6WyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIl0sIm1ha2VLaW5kSGFuZGxlIjpbIm1ha2VLaW5kSGFuZGxlIl0sInByb3ZpZGVQcm9taXNlV2F0Y2hlciI6WyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLCJjYW5CZUR1cmFibGUiOlsiY2FuQmVEdXJhYmxlIl0sInBpY2tGYWNldCI6WyJwaWNrRmFjZXQiXSwicGFydGlhbEFzc2lnbiI6WyJwYXJ0aWFsQXNzaWduIl0sInByb3ZpZGUiOlsicHJvdmlkZSJdLCJtYWtlU3RvcmVVdGlscyI6WyJtYWtlU3RvcmVVdGlscyJdLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAh9SthSHgAAUh4AACgAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jbGVhblByb3Bvc2FsLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIk1BWF9LRVlXT1JEX0xFTkdUSCIsImFzc2VydEtleXdvcmROYW1lIiwiY2xlYW5LZXl3b3JkcyIsImNsZWFuUHJvcG9zYWwiLCJjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkIiwiY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRNYXRoLGdldEFzc2V0S2luZCxvYmplY3RNYXAsYXNzZXJ0S2V5LGFzc2VydFBhdHRlcm4saXNLZXksbXVzdE1hdGNoLGFzc2VydCxGYWlsLHEsYXNzZXJ0UmVjb3JkLEZ1bGxQcm9wb3NhbFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXSxbXCJnZXRBc3NldEtpbmRcIixbJGjNj19hID0+IChnZXRBc3NldEtpbmQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV0sW1wiaXNLZXlcIixbJGjNj19hID0+IChpc0tleSA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRnVsbFByb3Bvc2FsU2hhcGVcIixbJGjNj19hID0+IChGdWxsUHJvcG9zYWxTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbiAgICAgICBjb25zdCBNQVhfS0VZV09SRF9MRU5HVEggPSAxMDA7XG5cbi8qKlxuICogQGltcG9ydCB7QW1vdW50S2V5d29yZFJlY29yZCwgRXhpdFJ1bGUsIFByb3Bvc2FsLCBQcm9wb3NhbFJlY29yZH0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7R2V0QXNzZXRLaW5kQnlCcmFuZH0gZnJvbSAnLi9pbnRlcm5hbC10eXBlcy5qcyc7XG4gKi8kaM2PX29uY2UuTUFYX0tFWVdPUkRfTEVOR1RIKE1BWF9LRVlXT1JEX0xFTkdUSCk7XG5cbmNvbnN0IGZpcnN0Q2FwQVNDSUkgPSAvXltBLVpdW2EtekEtWjAtOV8kXSokLztcblxuLyogV2UgYWRvcHQgc2ltcGxlIHJlcXVpcmVtZW50cyBvbiBrZXl3b3JkcyBzbyB0aGF0IHRoZXkgZG8gbm90IGFjY2lkZW50YWxseSovXG4vKiBjb25mbGljdCB3aXRoIGV4aXN0aW5nIHByb3BlcnR5IG5hbWVzLiovXG4vKiBXZSByZXF1aXJlIGtleXdvcmRzIHRvIGJlIHN0cmluZ3MsIGFzY2lpIGlkZW50aWZpZXJzIGJlZ2lubmluZyB3aXRoIGFuKi9cbi8qIHVwcGVyIGNhc2UgbGV0dGVyLCBhbmQgZGlzdGluY3QgZnJvbSB0aGUgc3RyaW5naWZpZWQgZm9ybSBvZiBhbnkgbnVtYmVyLiovXG4vKiovXG4vKiBPZiBudW1iZXJzLCBvbmx5IE5hTiBhbmQgSW5maW5pdHksIHdoZW4gc3RyaW5naWZpZWQgdG8gYSBwcm9wZXJ0eSBuYW1lLCovXG4vKiBwcm9kdWNlIGFuIGFzY2lpIGlkZW50aWZpZXIgYmVnaW5uaW5nIHdpdGggYW4gdXBwZXIgY2FzZSBsZXR0ZXIuKi9cbi8qIFdpdGggdGhpcyBydWxlLCBhIGNvbXB1dGVkIGluZGV4aW5nIGV4cHJlc3Npb24gbGlrZSBgYVsraV1gIGNhbm5vdCovXG4vKiBsb29rdXAgYSBrZXl3b3JkLW5hbWVkIHByb3BlcnR5IG5vIG1hdHRlciB3aGF0IGBpYCBpcy4qL1xuICAgICAgIGNvbnN0IGFzc2VydEtleXdvcmROYW1lID0ga2V5d29yZCA9PiB7XG4gIGFzc2VydC50eXBlb2Yoa2V5d29yZCwgJ3N0cmluZycpO1xuICBrZXl3b3JkLmxlbmd0aCA8PSBNQVhfS0VZV09SRF9MRU5HVEggfHxcbiAgICBGYWlsYGtleXdvcmQgJHtxKGtleXdvcmQpfSBleGNlZWRlZCBtYXhpbXVtIGxlbmd0aCAke3EoXG4gICAgICBNQVhfS0VZV09SRF9MRU5HVEgsXG4gICAgKX0gY2hhcmFjdGVyczsgZ290ICR7a2V5d29yZC5sZW5ndGh9YDtcbiAgZmlyc3RDYXBBU0NJSS50ZXN0KGtleXdvcmQpIHx8XG4gICAgRmFpbGBrZXl3b3JkICR7cShcbiAgICAgIGtleXdvcmQsXG4gICAgKX0gbXVzdCBiZSBhbiBhc2NpaSBpZGVudGlmaWVyIHN0YXJ0aW5nIHdpdGggdXBwZXIgY2FzZS5gO1xuICAoa2V5d29yZCAhPT0gJ05hTicgJiYga2V5d29yZCAhPT0gJ0luZmluaXR5JykgfHxcbiAgICBGYWlsYGtleXdvcmQgJHtxKGtleXdvcmQpfSBtdXN0IG5vdCBiZSBhIG51bWJlcidzIG5hbWVgO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3tbbmFtZTogc3RyaW5nXTogYW55fX0gdW5jbGVhbktleXdvcmRSZWNvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqLyRozY9fb25jZS5hc3NlcnRLZXl3b3JkTmFtZShhc3NlcnRLZXl3b3JkTmFtZSk7XG4gICAgICAgY29uc3QgY2xlYW5LZXl3b3JkcyA9IHVuY2xlYW5LZXl3b3JkUmVjb3JkID0+IHtcbiAgaGFyZGVuKHVuY2xlYW5LZXl3b3JkUmVjb3JkKTtcbiAgYXNzZXJ0UmVjb3JkKHVuY2xlYW5LZXl3b3JkUmVjb3JkLCAna2V5d29yZFJlY29yZCcpO1xuICBjb25zdCBrZXl3b3JkcyA9IG93bktleXModW5jbGVhbktleXdvcmRSZWNvcmQpO1xuXG4gIC8qIEFzc2VydCBhbGwgbmFtZXMgYXJlIGFzY2lpIGlkZW50aWZpZXJzIHN0YXJ0aW5nIHdpdGgqL1xuICAvKiBhbiB1cHBlciBjYXNlIGxldHRlci4qL1xuICBmb3IgKGNvbnN0IGtleXdvcmQgb2Yga2V5d29yZHMpIHtcbiAgICBhc3NlcnRLZXl3b3JkTmFtZShrZXl3b3JkKTtcbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAoa2V5d29yZHMpO1xufTskaM2PX29uY2UuY2xlYW5LZXl3b3JkcyhjbGVhbktleXdvcmRzKTtcblxuICAgICAgIGNvbnN0IGNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkID0gKFxuICBhbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCxcbiAgZ2V0QXNzZXRLaW5kQnlCcmFuZCxcbikgPT4ge1xuICBjbGVhbktleXdvcmRzKGFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkKTtcbiAgLyogRklYTUUgb2JqZWN0TWFwIHNob3VsZCBjb25zdHJhaW4gdGhlIG1hcHBpbmcgZnVuY3Rpb24gYnkgdGhlIHJlY29yZCdzIHR5cGUqL1xuICByZXR1cm4gb2JqZWN0TWFwKGFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkLCBhbW91bnQgPT4ge1xuICAgIC8qIENoZWNrIHRoYXQgZWFjaCB2YWx1ZSBjYW4gYmUgY29lcmNlZCB1c2luZyB0aGUgQW1vdW50TWF0aCovXG4gICAgLyogaW5kaWNhdGVkIGJ5IGJyYW5kLiBgQW1vdW50TWF0aC5jb2VyY2VgIHRocm93cyBpZiBjb2VyY2lvbiBmYWlscy4qL1xuICAgIGlmIChpc0tleShhbW91bnQpKSB7XG4gICAgICBjb25zdCBicmFuZEFzc2V0S2luZCA9IGdldEFzc2V0S2luZEJ5QnJhbmQoYW1vdW50LmJyYW5kKTtcbiAgICAgIGNvbnN0IGFzc2V0S2luZCA9IGdldEFzc2V0S2luZChhbW91bnQpO1xuICAgICAgLyogVE9ETzogcmVwbGFjZSB0aGlzIGFzc2VydGlvbiB3aXRoIGEgY2hlY2sgb2YgdGhlIGFzc2V0S2luZCovXG4gICAgICAvKiBwcm9wZXJ0eSBvbiB0aGUgYnJhbmQsIHdoZW4gdGhhdCBleGlzdHMuKi9cbiAgICAgIGFzc2V0S2luZCA9PT0gYnJhbmRBc3NldEtpbmQgfHxcbiAgICAgICAgRmFpbGBUaGUgYW1vdW50ICR7YW1vdW50fSBkaWQgbm90IGhhdmUgdGhlIGFzc2V0S2luZCBvZiB0aGUgYnJhbmQgJHticmFuZEFzc2V0S2luZH1gO1xuICAgICAgcmV0dXJuIEFtb3VudE1hdGguY29lcmNlKGFtb3VudC5icmFuZCwgYW1vdW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0UGF0dGVybihhbW91bnQpO1xuICAgICAgcmV0dXJuIGFtb3VudDtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZFxuICogQHBhcmFtIHsqfSBnZXRBc3NldEtpbmRCeUJyYW5kXG4gKiBAcmV0dXJucyB7QW1vdW50S2V5d29yZFJlY29yZH1cbiAqLyRozY9fb25jZS5jb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZChjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCk7XG4gICAgICAgY29uc3QgY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCA9IChcbiAgYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG4gIGdldEFzc2V0S2luZEJ5QnJhbmQsXG4pID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQoXG4gICAgYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG4gICAgZ2V0QXNzZXRLaW5kQnlCcmFuZCxcbiAgKTtcbiAgYXNzZXJ0S2V5KHJlc3VsdCk7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2hlY2tlZCBjYXN0Ki9cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogSnVzdCBjaGVja3MgcmVzaWR1YWwgaXNzdWVzIGFmdGVyIG1hdGNoaW5nIFByb3Bvc2FsU2hhcGUuXG4gKiBPbmx5IGtub3duIHJlc2lkdWFsIGlzc3VlIGlzIHZlcmlmeWluZyB0aGF0IGl0IG9ubHkgaGFzIG9uZSBvZiB0aGVcbiAqIG9wdGlvbmFsIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICovJGjNj19vbmNlLmNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQoY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCk7XG5jb25zdCBhc3NlcnRFeGl0ID0gZXhpdCA9PlxuICBvd25LZXlzKGV4aXQpLmxlbmd0aCA9PT0gMSB8fCBGYWlsYGV4aXQgJHtleGl0fSBzaG91bGQgb25seSBoYXZlIG9uZSBrZXlgO1xuXG4vKipcbiAqIGNoZWNrIHRoYXQga2V5d29yZCBpcyBub3QgaW4gYm90aCAnd2FudCcgYW5kICdnaXZlJy5cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkW1wid2FudFwiXX0gd2FudFxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZFtcImdpdmVcIl19IGdpdmVcbiAqL1xuY29uc3QgYXNzZXJ0S2V5d29yZE5vdEluQm90aCA9ICh3YW50LCBnaXZlKSA9PiB7XG4gIGNvbnN0IHdhbnRLZXl3b3JkU2V0ID0gbmV3IFNldChvd25LZXlzKHdhbnQpKTtcbiAgY29uc3QgZ2l2ZUtleXdvcmRzID0gb3duS2V5cyhnaXZlKTtcblxuICBmb3IgKGNvbnN0IGtleXdvcmQgb2YgZ2l2ZUtleXdvcmRzKSB7XG4gICAgIXdhbnRLZXl3b3JkU2V0LmhhcyhrZXl3b3JkKSB8fFxuICAgICAgRmFpbGBhIGtleXdvcmQgY2Fubm90IGJlIGluIGJvdGggJ3dhbnQnIGFuZCAnZ2l2ZSdgO1xuICB9XG59O1xuXG4vKipcbiAqIGNsZWFuUHJvcG9zYWwgY2hlY2tzIHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIHByb3Bvc2FsLCBpbmNsdWRpbmdcbiAqIHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIGludGVybmFsIG9iamVjdHMuIFRoZSBwcm9wb3NhbCBtYXkgaGF2ZVxuICogdGhlIGZvbGxvd2luZyBrZXlzOiBgZ2l2ZWAsIGB3YW50YCwgYW5kIGBleGl0YC4gVGhlc2Uga2V5cyBtYXkgYmVcbiAqIG9taXR0ZWQgaW4gdGhlIGBwcm9wb3NhbGAgYXJndW1lbnQgcGFzc2VkIHRvIGNsZWFuUHJvcG9zYWwsIGJ1dFxuICogYW55dGhpbmcgb3RoZXIgdGhhbiB0aGVzZSBrZXlzIGlzIG5vdCBhbGxvd2VkLiBUaGUgdmFsdWVzIG9mIGBnaXZlYFxuICogYW5kIGB3YW50YCBtdXN0IGJlIFwiYW1vdW50S2V5d29yZFJlY29yZHNcIiwgbWVhbmluZyB0aGF0IHRoZSBrZXlzXG4gKiBtdXN0IGJlIGtleXdvcmRzIGFuZCB0aGUgdmFsdWVzIG11c3QgYmUgYW1vdW50cy4gVGhlIHZhbHVlIG9mXG4gKiBgZXhpdGAsIGlmIHByZXNlbnQsIG11c3QgYmUgYSByZWNvcmQgb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6XG4gKiBgeyB3YWl2ZWQ6IG51bGwgfWAgYHsgb25EZW1hbmQ6IG51bGwgfWAgYHsgYWZ0ZXJEZWFkbGluZTogeyB0aW1lclxuICogOlRpbWVyLCBkZWFkbGluZSA6YmlnaW50IH0gfVxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWx9IHByb3Bvc2FsXG4gKiBAcGFyYW0ge0dldEFzc2V0S2luZEJ5QnJhbmR9IGdldEFzc2V0S2luZEJ5QnJhbmRcbiAqIEByZXR1cm5zIHtQcm9wb3NhbFJlY29yZH1cbiAqL1xuICAgICAgIGNvbnN0IGNsZWFuUHJvcG9zYWwgPSAocHJvcG9zYWwsIGdldEFzc2V0S2luZEJ5QnJhbmQpID0+IHtcbiAgYXNzZXJ0UmVjb3JkKHByb3Bvc2FsLCAncHJvcG9zYWwnKTtcbiAgLyogV2UgZmlsbCBpbiB0aGUgZGVmYXVsdCB2YWx1ZXMgaWYgdGhlIGtleXMgYXJlIGFic2VudCBvciB1bmRlZmluZWQuKi9cbiAgY29uc3Qge1xuICAgIHdhbnQgPSBoYXJkZW4oe30pLFxuICAgIGdpdmUgPSBoYXJkZW4oe30pLFxuICAgIGV4aXQgPSBoYXJkZW4oeyBvbkRlbWFuZDogbnVsbCB9KSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wb3NhbDtcbiAgb3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYCR7cHJvcG9zYWx9IC0gTXVzdCBvbmx5IGhhdmUgd2FudDosIGdpdmU6LCBleGl0OiBwcm9wZXJ0aWVzOiAke3Jlc3R9YDtcblxuICBjb25zdCBjbGVhbmVkV2FudCA9IGNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkKFxuICAgIHdhbnQsXG4gICAgZ2V0QXNzZXRLaW5kQnlCcmFuZCxcbiAgKTtcbiAgY29uc3QgY2xlYW5lZEdpdmUgPSBjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKGdpdmUsIGdldEFzc2V0S2luZEJ5QnJhbmQpO1xuXG4gIGNvbnN0IGNsZWFuZWRQcm9wb3NhbCA9IGhhcmRlbih7XG4gICAgd2FudDogY2xlYW5lZFdhbnQsXG4gICAgZ2l2ZTogY2xlYW5lZEdpdmUsXG4gICAgZXhpdCxcbiAgfSk7XG4gIG11c3RNYXRjaChjbGVhbmVkUHJvcG9zYWwsIEZ1bGxQcm9wb3NhbFNoYXBlLCAncHJvcG9zYWwnKTtcbiAgYXNzZXJ0RXhpdChleGl0KTtcbiAgYXNzZXJ0S2V5d29yZE5vdEluQm90aChjbGVhbmVkV2FudCwgY2xlYW5lZEdpdmUpO1xuICByZXR1cm4gY2xlYW5lZFByb3Bvc2FsO1xufTskaM2PX29uY2UuY2xlYW5Qcm9wb3NhbChjbGVhblByb3Bvc2FsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Ik1BWF9LRVlXT1JEX0xFTkdUSCI6WyJNQVhfS0VZV09SRF9MRU5HVEgiXSwiYXNzZXJ0S2V5d29yZE5hbWUiOlsiYXNzZXJ0S2V5d29yZE5hbWUiXSwiY2xlYW5LZXl3b3JkcyI6WyJjbGVhbktleXdvcmRzIl0sImNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkIjpbImNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkIl0sImNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQiOlsiY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCJdLCJjbGVhblByb3Bvc2FsIjpbImNsZWFuUHJvcG9zYWwiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoZZDmYkRAACJEQAANAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIl0sImV4cG9ydHMiOlsiaXNPZmZlclNhZmUiLCJzYXRpc2ZpZXNXYW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQW1vdW50TWF0aDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc09mZmVyU2FmZSwnbmFtZScse3ZhbHVlOlwiaXNPZmZlclNhZmVcIn0pOyRozY9fb25jZS5pc09mZmVyU2FmZShpc09mZmVyU2FmZSk7XG5cbi8qKlxuICogQGltcG9ydCB7QW1vdW50S2V5d29yZFJlY29yZCwgUHJvcG9zYWxSZWNvcmR9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqL1xuXG4vKipcbiAqIEhlbHBlciB0byBwZXJmb3JtIHNhdGlzZmllc1dhbnQgYW5kIHNhdGlzZmllc0dpdmUuIElzXG4gKiBhbGxvY2F0aW9uQW1vdW50IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byByZXF1aXJlZEFtb3VudCBmb3IgZXZlcnlcbiAqIGtleXdvcmQgb2YgZ2l2ZU9yV2FudD9cbiAqXG4gKiBUbyBwcmVwYXJlIGZvciBtdWx0aXBsZXMsIHNhdGlzZmllc1dhbnQgYW5kIHNhdGlzZmllc0dpdmUgcmV0dXJuIDAgb3IgMS5cbiAqIGlzT2ZmZXJTYWZlIHdpbGwgc3RpbGwgYmUgYm9vbGVhbi4gV2hlbiB3ZSBoYXZlIE11bHRpcGxlcywgc2F0aXNmaWVzV2FudCBhbmRcbiAqIHNhdGlzZmllc0dpdmUgd2lsbCB0ZWxsIGhvdyBtYW55IHRpbWVzIHRoZSBvZmZlciB3YXMgbWF0Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGdpdmVPcldhbnRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvblxuICogQHJldHVybnMgezB8MX1cbiAqL1xuY29uc3Qgc2F0aXNmaWVzSW50ZXJuYWwgPSAoZ2l2ZU9yV2FudCA9IHt9LCBhbGxvY2F0aW9uKSA9PiB7XG4gIGNvbnN0IGlzR1RFQnlLZXl3b3JkID0gKFtrZXl3b3JkLCByZXF1aXJlZEFtb3VudF0pID0+IHtcbiAgICAvKiBJZiB0aGVyZSBpcyBubyBhbGxvY2F0aW9uIGZvciBhIGtleXdvcmQsIHdlIGtub3cgdGhlIGdpdmVPcldhbnQqL1xuICAgIC8qIGlzIG5vdCBzYXRpc2ZpZWQgd2l0aG91dCBjaGVja2luZyBmdXJ0aGVyLiovXG4gICAgaWYgKGFsbG9jYXRpb25ba2V5d29yZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IGFsbG9jYXRpb25BbW91bnQgPSBhbGxvY2F0aW9uW2tleXdvcmRdO1xuICAgIHJldHVybiBBbW91bnRNYXRoLmlzR1RFKGFsbG9jYXRpb25BbW91bnQsIHJlcXVpcmVkQW1vdW50KSA/IDEgOiAwO1xuICB9O1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZ2l2ZU9yV2FudCkuZXZlcnkoaXNHVEVCeUtleXdvcmQpID8gMSA6IDA7XG59O1xuXG4vKipcbiAqIEZvciB0aGlzIGFsbG9jYXRpb24gdG8gc2F0aXNmeSB3aGF0IHRoZSB1c2VyIHdhbnRlZCwgdGhlaXJcbiAqIGFsbG9jYXRlZCBhbW91bnRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHByb3Bvc2FsLndhbnQuXG4gKlxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWwgLSB0aGUgcnVsZXMgdGhhdCBhY2NvbXBhbmllZCB0aGVcbiAqIGVzY3JvdyBvZiBwYXltZW50cyB0aGF0IGRpY3RhdGUgd2hhdCB0aGUgdXNlciBleHBlY3RlZCB0byBnZXQgYmFja1xuICogZnJvbSBab2UuIEEgcHJvcG9zYWwgaXMgYSByZWNvcmQgd2l0aCBrZXlzIGBnaXZlYCwgYHdhbnRgLCBhbmRcbiAqIGBleGl0YC4gYGdpdmVgIGFuZCBgd2FudGAgYXJlIHJlY29yZHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZFxuICogYW1vdW50cyBhcyB2YWx1ZXMuIFRoZSBwcm9wb3NhbCBpcyBhIHVzZXIncyB1bmRlcnN0YW5kaW5nIG9mIHRoZVxuICogY29udHJhY3QgdGhhdCB0aGV5IGFyZSBlbnRlcmluZyB3aGVuIHRoZXkgbWFrZSBhbiBvZmZlci5cbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvbiAtIGEgcmVjb3JkIHdpdGgga2V5d29yZHNcbiAqIGFzIGtleXMgYW5kIGFtb3VudHMgYXMgdmFsdWVzLiBUaGVzZSBhbW91bnRzIGFyZSB0aGUgcmVhbGxvY2F0aW9uXG4gKiB0byBiZSBnaXZlbiB0byBhIHVzZXIuXG4gKi9cbmNvbnN0IHNhdGlzZmllc1dhbnQgPSAocHJvcG9zYWwsIGFsbG9jYXRpb24pID0+XG4gIHNhdGlzZmllc0ludGVybmFsKHByb3Bvc2FsLndhbnQsIGFsbG9jYXRpb24pO1xuXG4vKipcbiAqIEZvciB0aGlzIGFsbG9jYXRpb24gdG8gY291bnQgYXMgYSBmdWxsIHJlZnVuZCwgdGhlIGFsbG9jYXRlZFxuICogYW1vdW50cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB3aGF0IHdhcyBvcmlnaW5hbGx5XG4gKiBvZmZlcmVkIChwcm9wb3NhbC5naXZlKS5cbiAqXG4gKiBAcGFyYW0gIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWwgLSB0aGUgcnVsZXMgdGhhdCBhY2NvbXBhbmllZCB0aGVcbiAqIGVzY3JvdyBvZiBwYXltZW50cyB0aGF0IGRpY3RhdGUgd2hhdCB0aGUgdXNlciBleHBlY3RlZCB0byBnZXQgYmFja1xuICogZnJvbSBab2UuIEEgcHJvcG9zYWwgaXMgYSByZWNvcmQgd2l0aCBrZXlzIGBnaXZlYCwgYHdhbnRgLCBhbmRcbiAqIGBleGl0YC4gYGdpdmVgIGFuZCBgd2FudGAgYXJlIHJlY29yZHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZFxuICogYW1vdW50cyBhcyB2YWx1ZXMuIFRoZSBwcm9wb3NhbCBpcyBhIHVzZXIncyB1bmRlcnN0YW5kaW5nIG9mIHRoZVxuICogY29udHJhY3QgdGhhdCB0aGV5IGFyZSBlbnRlcmluZyB3aGVuIHRoZXkgbWFrZSBhbiBvZmZlci5cbiAqIEBwYXJhbSAge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovJGjNj19vbmNlLnNhdGlzZmllc1dhbnQoc2F0aXNmaWVzV2FudCk7XG5jb25zdCBzYXRpc2ZpZXNHaXZlID0gKHByb3Bvc2FsLCBhbGxvY2F0aW9uKSA9PlxuICBzYXRpc2ZpZXNJbnRlcm5hbChwcm9wb3NhbC5naXZlLCBhbGxvY2F0aW9uKTtcblxuLyoqXG4gKiBgaXNPZmZlclNhZmVgIGNoZWNrcyBvZmZlciBzYWZldHkgZm9yIGEgc2luZ2xlIG9mZmVyLlxuICpcbiAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gY2hlY2tzIHdoZXRoZXIgd2UgZnVsbHkgc2F0aXNmeVxuICogYHByb3Bvc2FsLmdpdmVgIChnaXZpbmcgYSByZWZ1bmQpIG9yIHdoZXRoZXIgd2UgZnVsbHkgc2F0aXNmeVxuICogYHByb3Bvc2FsLndhbnRgLiBCb3RoIGNhbiBiZSBmdWxseSBzYXRpc2ZpZWQuXG4gKlxuICogQHBhcmFtICB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0gIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqL1xuZnVuY3Rpb24gaXNPZmZlclNhZmUocHJvcG9zYWwsIGFsbG9jYXRpb24pIHtcbiAgcmV0dXJuIChcbiAgICBzYXRpc2ZpZXNHaXZlKHByb3Bvc2FsLCBhbGxvY2F0aW9uKSA+IDAgfHxcbiAgICBzYXRpc2ZpZXNXYW50KHByb3Bvc2FsLCBhbGxvY2F0aW9uKSA+IDBcbiAgKTtcbn1cblxuaGFyZGVuKGlzT2ZmZXJTYWZlKTtcbmhhcmRlbihzYXRpc2ZpZXNXYW50KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNhdGlzZmllc1dhbnQiOlsic2F0aXNmaWVzV2FudCJdLCJpc09mZmVyU2FmZSI6WyJpc09mZmVyU2FmZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABrOE1yZxMAAGcTAAA5AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiVHJhbnNmZXJQYXJ0U2hhcGUiLCJhdG9taWNSZWFycmFuZ2UiLCJhdG9taWNUcmFuc2ZlciIsImZyb21Pbmx5IiwidG9Pbmx5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSxBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsU2VhdFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV0sW1wiU2VhdFNoYXBlXCIsWyRozY9fYSA9PiAoU2VhdFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBpbXBvcnQge0Ftb3VudEtleXdvcmRSZWNvcmQsIFRyYW5zZmVyUGFydCwgWkNGLCBaQ0ZTZWF0fSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKi9cblxuICAgICAgIGNvbnN0IFRyYW5zZmVyUGFydFNoYXBlID0gTS5zcGxpdEFycmF5KFxuICBoYXJkZW4oW00ub3B0KFNlYXRTaGFwZSksIE0ub3B0KFNlYXRTaGFwZSksIE0ub3B0KEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSldKSxcbiAgaGFyZGVuKFtNLm9wdChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpXSksXG4pO1xuXG4vKipcbiAqIEFza3MgWm9lICh2aWEgemNmKSB0byByZWFycmFuZ2UgdGhlIGFsbG9jYXRpb25zIGFtb25nIHRoZSBzZWF0c1xuICogbWVudGlvbmVkLiBUaGlzIGlzIGEgc2V0IG9mIGNoYW5nZXMgdG8gYWxsb2NhdGlvbnMgdGhhdCBtdXN0IHNhdGlzZnlcbiAqIHNldmVyYWwgY29uc3RyYWludHMuIElmIHRoZXNlIGNvbnN0cmFpbnRzIGFyZSBhbGwgbWV0LCB0aGVuIHRoZVxuICogcmVhbGxvY2F0aW9uIGhhcHBlbnMgYXRvbWljYWxseS4gT3RoZXJ3aXNlIGl0IGRvZXMgbm90IGhhcHBlblxuICogYXQgYWxsLlxuICpcbiAqIFRoZSBjb25kaXRpb25zXG4gKiAgICAqIEFsbCB0aGUgbWVudGlvbmVkIHNlYXRzIGFyZSBzdGlsbCBsaXZlIC0tIGVuZm9yY2VkIGJ5IFpDRi5cbiAqICAgICogTm8gb3V0c3RhbmRpbmcgc3RhZ2luZ3MgZm9yIGFueSBvZiB0aGUgbWVudGlvbmVkIHNlYXRzLlxuICogICAgICBTdGFnaW5ncyBub3cgZGVwcmVjYXRlZCBpbiBmYXZvciBvciBhdG9taWNSZWFycmFuZ2UuIFRvXG4gKiAgICAgIHByZXZlbnQgY29uZnVzaW9uLCBmb3IgZWFjaCByZWFsbG9jYXRpb24sIGl0IGNhbiBvbmx5IGJlXG4gKiAgICAgIGV4cHJlc3NlZCBpbiB0aGUgb2xkIHdheSBvciB0aGUgbmV3IHdheSwgYnV0IG5vdCBhIG1peHR1cmUuXG4gKiAgICAqIE9mZmVyIHNhZmV0eSAtLSBlbmZvcmNlZCBieSBaQ0YuXG4gKiAgICAqIE92ZXJhbGwgY29uc2VydmF0aW9uIC0tIGVuZm9yY2VkIGJ5IFpDRi5cbiAqICAgICogVGhlIG92ZXJhbGwgdHJhbnNmZXIgaXMgZXhwcmVzc2VkIGFzIGFuIGFycmF5IG9mIGBUcmFuc2ZlclBhcnRgLlxuICogICAgICBFYWNoIGluZGl2aWR1YWwgYFRyYW5zZmVyUGFydGAgaXMgb25lIG9mXG4gKiAgICAgICAtIEEgdHJhbnNmZXIgZnJvbSBhIGBmcm9tU2VhdGAgdG8gYSBgdG9TZWF0YC5cbiAqICAgICAgICAgVGhpcyBpcyBub3QgbmVlZGVkIGZvciBab2UncyBzYWZldHksIGFzIFpvZSBkb2VzXG4gaXRzIG93biBvdmVyYWxsIGNvbnNlcnZhdGlvbiBjaGVjay4gUmF0aGVyLCBpdCBoZWxwcyBjYXRjaFxuIGFuZCBkaWFnbm9zZSBjb250cmFjdCBidWdzIGVhcmxpZXIuXG4gKiAgICAgICAtIEEgdGFraW5nIGZyb20gYSBgZnJvbVNlYXRgJ3MgYWxsb2NhdGlvbi4gU2VlIHRoZSBgZnJvbU9ubHlgXG4gaGVscGVyLlxuIC0gQSBnaXZpbmcgaW50byBhIGB0b1NlYXRgJ3MgYWxsb2NhdGlvbi4gU2VlIHRoZSBgdG9Pbmx5YFxuIGhlbHBlci5cbiAqXG4gKiBUT0RPKDY2NzkpIFJlZmFjdG9yIGBhdG9taWNSZWFycmFuZ2VgZnJvbSBiZWluZyBhIGhlbHBlciBpbnRvIGJlaW5nXG4gKiB6Y2YncyByZXBsYWNlbWVudCBmb3IgcmVhbGxvY2F0ZS4gSXQgd2FzIG1hZGUgYSBoZWxwZXIgZHVyaW5nXG4gKiB0aGUgdHJhbnNpdGlvbiwgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIHdpdGggcHJvZ3Jlc3Mgb24gWm9lIGR1cmFiaWxpdHkuXG4gKlxuICogU2VlIHRoZSBoZWxwZXJzIGJlbG93LCBgZnJvbU9ubHlgLCBgdG9Pbmx5YCwgYW5kIGBhdG9taWNUcmFuc2ZlcmAsXG4gKiB3aGljaCB3aWxsIHJlbWFpbiBoZWxwZXJzLiBUaGVzZSBoZWxwZXIgYXJlIGZvciBjb252ZW5pZW5jZVxuICogaW4gZXhwcmVzc2luZyBhdG9taWMgcmVhcnJhbmdlbWVudHMgY2xlYXJseS5cbiAqXG4gKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHpjZiBidWlsdGluIGluc3RlYWRcbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1RyYW5zZmVyUGFydFtdfSB0cmFuc2ZlcnNcbiAqLyRozY9fb25jZS5UcmFuc2ZlclBhcnRTaGFwZShUcmFuc2ZlclBhcnRTaGFwZSk7XG4gICAgICAgY29uc3QgYXRvbWljUmVhcnJhbmdlID0gKHpjZiwgdHJhbnNmZXJzKSA9PiB7XG4gIHpjZi5hdG9taWNSZWFycmFuZ2UodHJhbnNmZXJzKTtcbn07XG5cbi8qKlxuICogU29tZXRpbWVzIGEgVHJhbnNmZXJQYXJ0IGluIGFuIGF0b21pY1JlYXJyYW5nZSBvbmx5IGV4cHJlc3NlcyB3aGF0IGFtb3VudHNcbiAqIHNob3VsZCBiZSB0YWtlbiBmcm9tIGEgc2VhdCwgbGVhdmluZyBpdCB0byBvdGhlciBUcmFuc2ZlclBhcnQgb2YgdGhlXG4gKiBzYW1lIGF0b21pY1JlYXJyYW5nZSB0byBiYWxhbmNlIGl0IG91dC4gRm9yIHRoaXMgY2FzZSwgdGhlXG4gKiBgW2Zyb21TZWF0LCB1bmRlZmluZWQsIGZyb21BbW91bnRzXWAgZm9ybSBpcyBtb3JlIGNsZWFybHkgZXhwcmVzc2VkIGFzXG4gKiBgZnJvbU9ubHkoZnJvbVNlYXQsIGZyb21BbW91bnRzKWAuIFVubGlrZSBUcmFuc2ZlclBhcnQsIGJvdGggYXJndW1lbnRzIHRvXG4gKiBgZnJvbU9ubHlgIGFyZSBub24tb3B0aW9uYWwsIGFzIG90aGVyd2lzZSBpdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZS5cbiAqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGZyb21TZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGZyb21BbW91bnRzXG4gKiBAcmV0dXJucyB7VHJhbnNmZXJQYXJ0fVxuICovJGjNj19vbmNlLmF0b21pY1JlYXJyYW5nZShhdG9taWNSZWFycmFuZ2UpO1xuICAgICAgIGNvbnN0IGZyb21Pbmx5ID0gKGZyb21TZWF0LCBmcm9tQW1vdW50cykgPT5cbiAgaGFyZGVuKFtmcm9tU2VhdCwgdW5kZWZpbmVkLCBmcm9tQW1vdW50c10pO1xuXG4vKipcbiAqIFNvbWV0aW1lcyBhIFRyYW5zZmVyUGFydCBpbiBhbiBhdG9taWNSZWFycmFuZ2Ugb25seSBleHByZXNzZXMgd2hhdCBhbW91bnRzXG4gKiBzaG91bGQgYmUgZ2l2ZW4gdG8gYSBzZWF0LCBsZWF2aW5nIGl0IHRvIG90aGVyIFRyYW5zZmVyUGFydCBvZiB0aGVcbiAqIHNhbWUgYXRvbWljUmVhcnJhbmdlIHRvIGJhbGFuY2UgaXQgb3V0LiBGb3IgdGhpcyBjYXNlLCB0aGVcbiAqIGBbdW5kZWZpbmVkLCB0b1NlYXQsIHVuZGVmaW5lZCwgdG9BbW91bnRzXWAgZm9ybSBpcyBtb3JlIGNsZWFybHkgZXhwcmVzc2VkIGFzXG4gKiBgdG9Pbmx5KHRvU2VhdCwgdG9BbW91bnRzKWAuIFVubGlrZSBUcmFuc2ZlclBhcnQsIGJvdGggYXJndW1lbnRzIHRvXG4gKiBgdG9Pbmx5YCBhcmUgbm9uLW9wdGlvbmFsLCBhcyBvdGhlcndpc2UgaXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UuXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSB0b1NlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gdG9BbW91bnRzXG4gKiBAcmV0dXJucyB7VHJhbnNmZXJQYXJ0fVxuICovJGjNj19vbmNlLmZyb21Pbmx5KGZyb21Pbmx5KTtcbiAgICAgICBjb25zdCB0b09ubHkgPSAodG9TZWF0LCB0b0Ftb3VudHMpID0+XG4gIGhhcmRlbihbdW5kZWZpbmVkLCB0b1NlYXQsIHVuZGVmaW5lZCwgdG9BbW91bnRzXSk7XG5cbi8qKlxuICogU3BlY2lhbCBjYXNlIG9mIGF0b21pY1JlYXJyYW5nZSBmb3IgYSBzaW5nbGUgb25lLXdheSB0cmFuc2ZlclxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gW2Zyb21TZWF0XVxuICogQHBhcmFtIHtaQ0ZTZWF0fSBbdG9TZWF0XVxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBbZnJvbUFtb3VudHNdXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IFt0b0Ftb3VudHNdXG4gKi8kaM2PX29uY2UudG9Pbmx5KHRvT25seSk7XG4gICAgICAgY29uc3QgYXRvbWljVHJhbnNmZXIgPSAoXG4gIHpjZixcbiAgZnJvbVNlYXQgPSB1bmRlZmluZWQsXG4gIHRvU2VhdCA9IHVuZGVmaW5lZCxcbiAgZnJvbUFtb3VudHMgPSB1bmRlZmluZWQsXG4gIHRvQW1vdW50cyA9IHVuZGVmaW5lZCxcbikgPT4gemNmLmF0b21pY1JlYXJyYW5nZShoYXJkZW4oW1tmcm9tU2VhdCwgdG9TZWF0LCBmcm9tQW1vdW50cywgdG9BbW91bnRzXV0pKTskaM2PX29uY2UuYXRvbWljVHJhbnNmZXIoYXRvbWljVHJhbnNmZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVHJhbnNmZXJQYXJ0U2hhcGUiOlsiVHJhbnNmZXJQYXJ0U2hhcGUiXSwiYXRvbWljUmVhcnJhbmdlIjpbImF0b21pY1JlYXJyYW5nZSJdLCJmcm9tT25seSI6WyJmcm9tT25seSJdLCJ0b09ubHkiOlsidG9Pbmx5Il0sImF0b21pY1RyYW5zZmVyIjpbImF0b21pY1RyYW5zZmVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEI+scmOHQAAjh0AADgAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAvc3JjL3NhZmVNYXRoLmpzIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiY2FsY0xpcVZhbHVlVG9NaW50IiwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIiwiY2FsY1ZhbHVlVG9SZW1vdmUiLCJnZXRJbnB1dFByaWNlIiwiZ2V0T3V0cHV0UHJpY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBuYXRTYWZlTWF0aCxGYWlsLE5hdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cC9zcmMvc2FmZU1hdGguanNcIiwgW1tcIm5hdFNhZmVNYXRoXCIsWyRozY9fYSA9PiAobmF0U2FmZU1hdGggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7TmF0VmFsdWV9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKi9cblxuY29uc3QgeyBzdWJ0cmFjdCwgYWRkLCBtdWx0aXBseSwgZmxvb3JEaXZpZGUgfSA9IG5hdFNhZmVNYXRoO1xuXG5jb25zdCBCQVNJU19QT0lOVFMgPSAxMDAwMG47IC8qIFRPRE8gY2hhbmdlIHRvIDEwXzAwMG4gb25jZSB0b29saW5nIGNvcGVzLiovXG5cbi8qKlxuICogQ2FsY3VsYXRpb25zIGZvciBjb25zdGFudCBwcm9kdWN0IG1hcmtldHMgbGlrZSBVbmlzd2FwLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3J1bnRpbWV2ZXJpZmljYXRpb24vdmVyaWZpZWQtc21hcnQtY29udHJhY3RzL2Jsb2IvdW5pc3dhcC91bmlzd2FwL3gteS1rLnBkZlxuICovXG5cbi8qKlxuICogQ29udGFpbnMgdGhlIGxvZ2ljIGZvciBjYWxjdWxhdGluZyBob3cgbXVjaCBzaG91bGQgYmUgZ2l2ZW5cbiAqIGJhY2sgdG8gdGhlIHVzZXIgaW4gZXhjaGFuZ2UgZm9yIHdoYXQgdGhleSBzZW50IGluLiBSZXVzZWQgaW5cbiAqIHNldmVyYWwgZGlmZmVyZW50IHBsYWNlcywgaW5jbHVkaW5nIHRvIGNoZWNrIHdoZXRoZXIgYW4gb2ZmZXJcbiAqIGlzIHZhbGlkLCBnZXR0aW5nIHRoZSBjdXJyZW50IHByaWNlIGZvciBhbiBhc3NldCBvbiB1c2VyXG4gKiByZXF1ZXN0LCBhbmQgdG8gZG8gdGhlIGFjdHVhbCByZWFsbG9jYXRpb24gYWZ0ZXIgYW4gb2ZmZXIgaGFzXG4gKiBiZWVuIG1hZGUuXG4gKlxuICogQHBhcmFtIHthbnl9IGlucHV0VmFsdWUgLSB0aGUgdmFsdWUgb2YgdGhlIGFzc2V0IHNlbnRcbiAqIGluIHRvIGJlIHN3YXBwZWRcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUga2luZCBvZiBhc3NldCBzZW50IGluXG4gKiBAcGFyYW0ge2FueX0gb3V0cHV0UmVzZXJ2ZSAtIHRoZSB2YWx1ZSBpbiB0aGUgbGlxdWlkaXR5XG4gKiBwb29sIG9mIHRoZSBraW5kIG9mIGFzc2V0IHRvIGJlIHNlbnQgb3V0XG4gKiBAcGFyYW0ge2JpZ2ludH0gW2ZlZUJhc2lzUG9pbnRzXSAtIHRoZSBmZWUgdGFrZW4gaW5cbiAqIGJhc2lzIHBvaW50cy4gVGhlIGRlZmF1bHQgaXMgMC4zJSBvciAzMCBiYXNpcyBwb2ludHMuIFRoZSBmZWVcbiAqIGlzIHRha2VuIGZyb20gaW5wdXRWYWx1ZVxuICogQHJldHVybnMge05hdFZhbHVlfSBvdXRwdXRWYWx1ZSAtIHRoZSBjdXJyZW50IHByaWNlLCBpbiB2YWx1ZSBmb3JtXG4gKi9cbiAgICAgICBjb25zdCBnZXRJbnB1dFByaWNlID0gKFxuICBpbnB1dFZhbHVlLFxuICBpbnB1dFJlc2VydmUsXG4gIG91dHB1dFJlc2VydmUsXG4gIGZlZUJhc2lzUG9pbnRzID0gMzBuLFxuKSA9PiB7XG4gIGlucHV0VmFsdWUgPSBOYXQoaW5wdXRWYWx1ZSk7XG4gIGlucHV0UmVzZXJ2ZSA9IE5hdChpbnB1dFJlc2VydmUpO1xuICBvdXRwdXRSZXNlcnZlID0gTmF0KG91dHB1dFJlc2VydmUpO1xuICBpbnB1dFZhbHVlID4gMG4gfHwgRmFpbGBpbnB1dFZhbHVlICR7aW5wdXRWYWx1ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG4gIGlucHV0UmVzZXJ2ZSA+IDBuIHx8IEZhaWxgaW5wdXRSZXNlcnZlICR7aW5wdXRSZXNlcnZlfSBtdXN0IGJlIHBvc2l0aXZlYDtcbiAgb3V0cHV0UmVzZXJ2ZSA+IDBuIHx8IEZhaWxgb3V0cHV0UmVzZXJ2ZSAke291dHB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgO1xuXG4gIGNvbnN0IG9uZU1pbnVzRmVlU2NhbGVkID0gc3VidHJhY3QoQkFTSVNfUE9JTlRTLCBmZWVCYXNpc1BvaW50cyk7XG4gIGNvbnN0IGlucHV0V2l0aEZlZSA9IG11bHRpcGx5KGlucHV0VmFsdWUsIG9uZU1pbnVzRmVlU2NhbGVkKTtcbiAgY29uc3QgbnVtZXJhdG9yID0gbXVsdGlwbHkoaW5wdXRXaXRoRmVlLCBvdXRwdXRSZXNlcnZlKTtcbiAgY29uc3QgZGVub21pbmF0b3IgPSBhZGQobXVsdGlwbHkoaW5wdXRSZXNlcnZlLCBCQVNJU19QT0lOVFMpLCBpbnB1dFdpdGhGZWUpO1xuICByZXR1cm4gZmxvb3JEaXZpZGUobnVtZXJhdG9yLCBkZW5vbWluYXRvcik7XG59O1xuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgY2FsY3VsYXRpbmcgaG93IG11Y2ggc2hvdWxkIGJlIHRha2VuXG4gKiBmcm9tIHRoZSB1c2VyIGluIGV4Y2hhbmdlIGZvciB3aGF0IHRoZXkgd2FudCB0byBvYnRhaW4uIFJldXNlZCBpblxuICogc2V2ZXJhbCBkaWZmZXJlbnQgcGxhY2VzLCBpbmNsdWRpbmcgdG8gY2hlY2sgd2hldGhlciBhbiBvZmZlclxuICogaXMgdmFsaWQsIGdldHRpbmcgdGhlIGN1cnJlbnQgcHJpY2UgZm9yIGFuIGFzc2V0IG9uIHVzZXJcbiAqIHJlcXVlc3QsIGFuZCB0byBkbyB0aGUgYWN0dWFsIHJlYWxsb2NhdGlvbiBhZnRlciBhbiBvZmZlciBoYXNcbiAqIGJlZW4gbWFkZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gb3V0cHV0VmFsdWUgLSB0aGUgdmFsdWUgb2YgdGhlIGFzc2V0IHRoZSB1c2VyIHdhbnRzXG4gKiB0byBnZXRcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUgYXNzZXQgYmVpbmcgc3BlbnRcbiAqIEBwYXJhbSB7YW55fSBvdXRwdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGtpbmQgb2YgYXNzZXQgdG8gYmUgc2VudCBvdXRcbiAqIEBwYXJhbSB7YmlnaW50fSBbZmVlQmFzaXNQb2ludHNdIC0gdGhlIGZlZSB0YWtlbiBpblxuICogYmFzaXMgcG9pbnRzLiBUaGUgZGVmYXVsdCBpcyAwLjMlIG9yIDMwIGJhc2lzIHBvaW50cy4gVGhlIGZlZSBpcyB0YWtlbiBmcm9tXG4gKiBvdXRwdXRWYWx1ZVxuICogQHJldHVybnMge05hdFZhbHVlfSBpbnB1dFZhbHVlIC0gdGhlIHZhbHVlIG9mIGlucHV0IHJlcXVpcmVkIHRvIHB1cmNoYXNlIG91dHB1dFxuICovJGjNj19vbmNlLmdldElucHV0UHJpY2UoZ2V0SW5wdXRQcmljZSk7XG4gICAgICAgY29uc3QgZ2V0T3V0cHV0UHJpY2UgPSAoXG4gIG91dHB1dFZhbHVlLFxuICBpbnB1dFJlc2VydmUsXG4gIG91dHB1dFJlc2VydmUsXG4gIGZlZUJhc2lzUG9pbnRzID0gMzBuLFxuKSA9PiB7XG4gIG91dHB1dFZhbHVlID0gTmF0KG91dHB1dFZhbHVlKTtcbiAgaW5wdXRSZXNlcnZlID0gTmF0KGlucHV0UmVzZXJ2ZSk7XG4gIG91dHB1dFJlc2VydmUgPSBOYXQob3V0cHV0UmVzZXJ2ZSk7XG5cbiAgaW5wdXRSZXNlcnZlID4gMG4gfHwgRmFpbGBpbnB1dFJlc2VydmUgJHtpbnB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgO1xuICBvdXRwdXRSZXNlcnZlID4gMG4gfHwgRmFpbGBvdXRwdXRSZXNlcnZlICR7b3V0cHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG4gIG91dHB1dFJlc2VydmUgPiBvdXRwdXRWYWx1ZSB8fFxuICAgIEZhaWxgb3V0cHV0UmVzZXJ2ZSAke291dHB1dFJlc2VydmV9IG11c3QgYmUgZ3JlYXRlciB0aGFuIG91dHB1dFZhbHVlICR7b3V0cHV0VmFsdWV9YDtcblxuICBjb25zdCBvbmVNaW51c0ZlZVNjYWxlZCA9IHN1YnRyYWN0KEJBU0lTX1BPSU5UUywgZmVlQmFzaXNQb2ludHMpO1xuICBjb25zdCBudW1lcmF0b3IgPSBtdWx0aXBseShtdWx0aXBseShvdXRwdXRWYWx1ZSwgaW5wdXRSZXNlcnZlKSwgQkFTSVNfUE9JTlRTKTtcbiAgY29uc3QgZGVub21pbmF0b3IgPSBtdWx0aXBseShcbiAgICBzdWJ0cmFjdChvdXRwdXRSZXNlcnZlLCBvdXRwdXRWYWx1ZSksXG4gICAgb25lTWludXNGZWVTY2FsZWQsXG4gICk7XG4gIHJldHVybiBhZGQoZmxvb3JEaXZpZGUobnVtZXJhdG9yLCBkZW5vbWluYXRvciksIDFuKTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlIGhvdyBtYW55IGxpcXVpZGl0eSB0b2tlbnMgd2Ugc2hvdWxkIGJlIG1pbnRpbmcgdG8gc2VuZCBiYWNrIHRvIHRoZVxuICogdXNlciB3aGVuIGFkZGluZyBsaXF1aWRpdHkuIFdlIHByb3ZpZGUgbmV3IGxpcXVpZGl0eSBlcXVhbCB0byB0aGUgZXhpc3RpbmdcbiAqIGxpcXVpZGl0eSBtdWx0aXBsaWVkIGJ5IHRoZSByYXRpbyBvZiBuZXcgY2VudHJhbCB0b2tlbnMgdG8gY2VudHJhbCB0b2tlbnNcbiAqIGFscmVhZHkgaGVsZC4gSWYgdGhlIGN1cnJlbnQgc3VwcGx5IGlzIHplcm8sIHJldHVybiB0aGUgaW5wdXRWYWx1ZSBhcyB0aGVcbiAqIGluaXRpYWwgbGlxdWlkaXR5IHRvIG1pbnQgaXMgYXJiaXRyYXJ5LlxuICpcbiAqIEBwYXJhbSB7YmlnaW50fSBsaXFUb2tlblN1cHBseVxuICogQHBhcmFtIHtiaWdpbnR9IGlucHV0VmFsdWVcbiAqIEBwYXJhbSB7YmlnaW50fSBpbnB1dFJlc2VydmVcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX1cbiAqLyRozY9fb25jZS5nZXRPdXRwdXRQcmljZShnZXRPdXRwdXRQcmljZSk7XG4gICAgICAgY29uc3QgY2FsY0xpcVZhbHVlVG9NaW50ID0gKFxuICBsaXFUb2tlblN1cHBseSxcbiAgaW5wdXRWYWx1ZSxcbiAgaW5wdXRSZXNlcnZlLFxuKSA9PiB7XG4gIGxpcVRva2VuU3VwcGx5ID0gTmF0KGxpcVRva2VuU3VwcGx5KTtcbiAgaW5wdXRWYWx1ZSA9IE5hdChpbnB1dFZhbHVlKTtcbiAgaW5wdXRSZXNlcnZlID0gTmF0KGlucHV0UmVzZXJ2ZSk7XG5cbiAgaWYgKGxpcVRva2VuU3VwcGx5ID09PSAwbikge1xuICAgIHJldHVybiBpbnB1dFZhbHVlO1xuICB9XG4gIHJldHVybiBmbG9vckRpdmlkZShtdWx0aXBseShpbnB1dFZhbHVlLCBsaXFUb2tlblN1cHBseSksIGlucHV0UmVzZXJ2ZSk7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSBob3cgbXVjaCBvZiB0aGUgc2Vjb25kYXJ5IHRva2VuIGlzIHJlcXVpcmVkIGZyb20gdGhlIHVzZXIgd2hlblxuICogYWRkaW5nIGxpcXVpZGl0eS4gV2UgcmVxdWlyZSB0aGF0IHRoZSBkZXBvc2l0ZWQgcmF0aW8gb2YgY2VudHJhbCB0byBzZWNvbmRhcnlcbiAqIG1hdGNoIHRoZSBjdXJyZW50IHJhdGlvIG9mIGhvbGRpbmdzIGluIHRoZSBwb29sLlxuICpcbiAqIEBwYXJhbSB7YW55fSBjZW50cmFsSW4gLSBUaGUgdmFsdWUgb2YgY2VudHJhbCBhc3NldHMgYmVpbmcgZGVwb3NpdGVkXG4gKiBAcGFyYW0ge2FueX0gY2VudHJhbFBvb2wgLSBUaGUgdmFsdWUgb2YgY2VudHJhbCBhc3NldHMgaW4gdGhlIHBvb2xcbiAqIEBwYXJhbSB7YW55fSBzZWNvbmRhcnlQb29sIC0gVGhlIHZhbHVlIG9mIHNlY29uZGFyeSBhc3NldHMgaW4gdGhlIHBvb2xcbiAqIEBwYXJhbSB7YW55fSBzZWNvbmRhcnlJbiAtIFRoZSB2YWx1ZSBvZiBzZWNvbmRhcnkgYXNzZXRzIHByb3ZpZGVkLiBJZlxuICogdGhlIHBvb2wgaXMgZW1wdHksIHRoZSBlbnRpcmUgYW1vdW50IHdpbGwgYmUgYWNjZXB0ZWRcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX0gLSB0aGUgYW1vdW50IG9mIHNlY29uZGFyeSByZXF1aXJlZFxuICovJGjNj19vbmNlLmNhbGNMaXFWYWx1ZVRvTWludChjYWxjTGlxVmFsdWVUb01pbnQpO1xuICAgICAgIGNvbnN0IGNhbGNTZWNvbmRhcnlSZXF1aXJlZCA9IChcbiAgY2VudHJhbEluLFxuICBjZW50cmFsUG9vbCxcbiAgc2Vjb25kYXJ5UG9vbCxcbiAgc2Vjb25kYXJ5SW4sXG4pID0+IHtcbiAgY2VudHJhbEluID0gTmF0KGNlbnRyYWxJbik7XG4gIGNlbnRyYWxQb29sID0gTmF0KGNlbnRyYWxQb29sKTtcbiAgc2Vjb25kYXJ5UG9vbCA9IE5hdChzZWNvbmRhcnlQb29sKTtcbiAgc2Vjb25kYXJ5SW4gPSBOYXQoc2Vjb25kYXJ5SW4pO1xuXG4gIGlmIChjZW50cmFsUG9vbCA9PT0gMG4gfHwgc2Vjb25kYXJ5UG9vbCA9PT0gMG4pIHtcbiAgICByZXR1cm4gc2Vjb25kYXJ5SW47XG4gIH1cblxuICBjb25zdCBzY2FsZWRTZWNvbmRhcnkgPSBmbG9vckRpdmlkZShcbiAgICBtdWx0aXBseShjZW50cmFsSW4sIHNlY29uZGFyeVBvb2wpLFxuICAgIGNlbnRyYWxQb29sLFxuICApO1xuICBjb25zdCBleGFjdCA9XG4gICAgbXVsdGlwbHkoY2VudHJhbEluLCBzZWNvbmRhcnlQb29sKSA9PT1cbiAgICBtdWx0aXBseShzY2FsZWRTZWNvbmRhcnksIGNlbnRyYWxQb29sKTtcblxuICAvKiBkb2Vzbid0IG1hdGNoIHRoZSB4LXktay5wZGYgcGFwZXIsIGJ1dCBtb3JlIGNvcnJlY3QuIFdoZW4gdGhlIHJhdGlvcyBhcmUqL1xuICAvKiBleGFjdGx5IGVxdWFsLCBsUHJpbWUgaXMgZXhhY3RseSBsICogKDEgKyBhbHBoYSkgYW5kIGFkZGluZyBvbmUgaXMgd3JvbmcqL1xuICByZXR1cm4gZXhhY3QgPyBzY2FsZWRTZWNvbmRhcnkgOiAxbiArIHNjYWxlZFNlY29uZGFyeTtcbn07XG5cbi8qIENhbGN1bGF0ZSBob3cgbWFueSB1bmRlcmx5aW5nIHRva2VucyAoaW4gdGhlIGZvcm0gb2YgYSB2YWx1ZSkgc2hvdWxkIGJlKi9cbi8qIHJldHVybmVkIHdoZW4gcmVtb3ZpbmcgbGlxdWlkaXR5LiovJGjNj19vbmNlLmNhbGNTZWNvbmRhcnlSZXF1aXJlZChjYWxjU2Vjb25kYXJ5UmVxdWlyZWQpO1xuICAgICAgIGNvbnN0IGNhbGNWYWx1ZVRvUmVtb3ZlID0gKFxuICBsaXFUb2tlblN1cHBseSxcbiAgcG9vbFZhbHVlLFxuICBsaXF1aWRpdHlWYWx1ZUluLFxuKSA9PiB7XG4gIGxpcVRva2VuU3VwcGx5ID0gTmF0KGxpcVRva2VuU3VwcGx5KTtcbiAgbGlxdWlkaXR5VmFsdWVJbiA9IE5hdChsaXF1aWRpdHlWYWx1ZUluKTtcbiAgcG9vbFZhbHVlID0gTmF0KHBvb2xWYWx1ZSk7XG5cbiAgcmV0dXJuIGZsb29yRGl2aWRlKG11bHRpcGx5KGxpcXVpZGl0eVZhbHVlSW4sIHBvb2xWYWx1ZSksIGxpcVRva2VuU3VwcGx5KTtcbn07JGjNj19vbmNlLmNhbGNWYWx1ZVRvUmVtb3ZlKGNhbGNWYWx1ZVRvUmVtb3ZlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldElucHV0UHJpY2UiOlsiZ2V0SW5wdXRQcmljZSJdLCJnZXRPdXRwdXRQcmljZSI6WyJnZXRPdXRwdXRQcmljZSJdLCJjYWxjTGlxVmFsdWVUb01pbnQiOlsiY2FsY0xpcVZhbHVlVG9NaW50Il0sImNhbGNTZWNvbmRhcnlSZXF1aXJlZCI6WyJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiXSwiY2FsY1ZhbHVlVG9SZW1vdmUiOlsiY2FsY1ZhbHVlVG9SZW1vdmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAN87WvjEUAAAxFAAANQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbIm1ha2VFcGhlbWVyYVByb3ZpZGVyIiwicHJvdmlkZUFsbCIsInByb3ZpZGVFbXB0eVNlYXQiLCJwcm92aWRlU2luZ2xldG9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYWxsVmFsdWVzLG9iamVjdE1hcCxwcm92aWRlLEU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhbGxWYWx1ZXNcIixbJGjNj19hID0+IChhbGxWYWx1ZXMgPSAkaM2PX2EpXV0sW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJvdmlkZVwiLFskaM2PX2EgPT4gKHByb3ZpZGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtaQ0YsIFpDRlNlYXR9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4vKipcbiAqIFNDQUxFOiBPbmx5IGZvciBsb3cgY2FyZGluYWxpdHkgcHJvdmlzaW9uaW5nLiBFdmVyeSB2YWx1ZSBmcm9tIGluaXQoKSB3aWxsXG4gKiByZW1haW4gaW4gdGhlIG1hcCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBoZWFwLiBJZiBhIGtleSBvYmplY3QgaXMgR0NlZCwgaXRzXG4gKiByZXByZXNlbnRhdGl2ZSBhbHNvIHJlbWFpbnMuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gRSBFcGhlbWVyYWwgc3RhdGVcbiAqIEB0ZW1wbGF0ZSB7V2Vha0tleX0gSyBrZXkgb24gd2hpY2ggdG8gcHJvdmlzaW9uXG4gKiBAcGFyYW0geyhrZXk6IEspID0+IEV9IGluaXRcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFcGhlbWVyYVByb3ZpZGVyID0gaW5pdCA9PiB7XG4gIC8qKiBAdHlwZSB7V2Vha01hcDxLLCBFPn0gKi9cbiAgY29uc3QgZXh0YW50ID0gbmV3IFdlYWtNYXAoKTtcblxuICAvKipcbiAqIFByb3ZpZGUgYW4gb2JqZWN0IHRvIGhvbGQgc3RhdGUgdGhhdCBuZWVkIG5vdCAob3IgY2Fubm90KSBiZSBkdXJhYmxlLlxuICpcbiAqIEB0eXBlIHsoa2V5OiBLKSA9PiBFfVxuICovXG4gIHJldHVybiBrZXkgPT4ge1xuICAgIGlmIChleHRhbnQuaGFzKGtleSkpIHtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gICAgICByZXR1cm4gZXh0YW50LmdldChrZXkpO1xuICAgIH1cbiAgICBjb25zdCBuZXdFcGggPSBpbml0KGtleSk7XG4gICAgZXh0YW50LnNldChrZXksIG5ld0VwaCk7XG4gICAgcmV0dXJuIG5ld0VwaDtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VFcGhlbWVyYVByb3ZpZGVyKG1ha2VFcGhlbWVyYVByb3ZpZGVyKTtcbmhhcmRlbihtYWtlRXBoZW1lcmFQcm92aWRlcik7XG5cbi8qKlxuICogUHJvdmlkZSBhbiBlbXB0eSBaQ0Ygc2VhdC5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7WkNGU2VhdH1cbiAqL1xuICAgICAgIGNvbnN0IHByb3ZpZGVFbXB0eVNlYXQgPSAoemNmLCBiYWdnYWdlLCBuYW1lKSA9PiB7XG4gIHJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+IHpjZi5tYWtlRW1wdHlTZWF0S2l0KCkuemNmU2VhdCk7XG59OyRozY9fb25jZS5wcm92aWRlRW1wdHlTZWF0KHByb3ZpZGVFbXB0eVNlYXQpO1xuaGFyZGVuKHByb3ZpZGVFbXB0eVNlYXQpO1xuXG4vKipcbiAqIEZvciB1c2UgaW4gY29udHJhY3QgdXBncmFkZXMgdG8gcHJvdmlkZSB2YWx1ZXMgdGhhdCBjb21lIGZyb20gb3RoZXIgdmF0cy5cbiAqIEFsbCB2YXRzIG11c3QgYmUgYWJsZSB0byBmaW5pc2ggdGhlaXIgdXBncmFkZSB3aXRob3V0IGNvbnRhY3Rpbmcgb3RoZXIgdmF0cyxcbiAqIHNvIHdoYXRldmVyIHZhbHVlcyBhbiBpbnN0YW5jZSBuZWVkcyBmcm9tIG90aGVyIHZhdHMgbXVzdCBiZSBzYXZlZCBpbiB0aGUgZmlyc3RcbiAqIGluY2FybmF0aW9uIGFuZCByZWFkIGZyb20gYmFnZ2FnZSBpbiBlYWNoIHN1YnNlcXVlbnQuXG4gKlxuICogVGhpcyBhYnN0cmFjdHMgdGhhdCBjb25kaXRpb24gc28gdGhhdCB0aGUgY29udHJhY3QgY2FuIGNvbnZlcnQgYSBkaWN0aW9uYXJ5XG4gKiBvZiB0aHVua3MgaW50byBhIGRpY3Rpb25hcnkgb2YgdmFsdWVzIGR1cmluZyBpdHMgZmlyc3QgYHByZXBhcmVgIChzdGFydCkuXG4gKiBFYWNoIHN1YnNlcXVlbnQgYHByZXBhcmVgIGNhbGwgd2lsbCBhdXRvbWF0aWNhbGx5IHJlYWQgZnJvbSB0aGUgYmFnZ2FnZSBhbmRcbiAqIGVzY2hldyByZW1vdGUgY2FsbHMuXG4gKlxuICogVGhlIHZhbHVlcyBhcmUgdGh1bmtzIGluc3RlYWQgb2YgcHJvbWlzZXMgc28gdGhhdCB0aGV5IGRvbid0IHN0YXJ0IGV4ZWN1dGluZ1xuICogdW5uZWNlc3NhcmlseSBvciBpbmR1Y2UgZmFpbHVyZXMuXG4gKlxuICogRm9yIGV4YW1wbGUsXG4gKlxuICogICAgIGNvbnN0IGludml0YXRpb25Jc3N1ZXJQID0gRSh6b2UpLmdldEludml0YXRpb25Jc3N1ZXIoKTtcbiAqICAgICBjb25zdCB7XG4gKiAgICAgICBpbnZpdGF0aW9uSXNzdWVyLFxuICogICAgICAgaW52aXRhdGlvbkJyYW5kLFxuICogICAgIH0gPSBhd2FpdCBwcm92aWRlQWxsKGJhZ2dhZ2UsIHtcbiAqICAgICAgIGludml0YXRpb25Jc3N1ZXI6ICgpID0+IGludml0YXRpb25Jc3N1ZXJQLFxuICogICAgICAgaW52aXRhdGlvbkJyYW5kOiAoKSA9PiBFKGludml0YXRpb25Jc3N1ZXJQKS5nZXRCcmFuZCgpLFxuICogICAgIH0pO1xuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgKCkgPT4gRVJlZjxhbnk+Pn0gVCBkaWN0IG9mIHRodW5rcyAocHJvbWlzZSBtYWtlcnMpXG4gKiBAcGFyYW0ge01hcFN0b3JlPHN0cmluZywgYW55Pn0gYmFnZ2FnZVxuICogQHBhcmFtIHtUfSB0aHVua3NcbiAqIEByZXR1cm5zIHtQcm9taXNlPHsgW0sgaW4ga2V5b2YgVF06IEF3YWl0ZWQ8UmV0dXJuVHlwZTxUW0tdPj4gfT59XG4gKi9cbiAgICAgICBjb25zdCBwcm92aWRlQWxsID0gKGJhZ2dhZ2UsIHRodW5rcykgPT4ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGh1bmtzKTtcbiAgLyogYXNzdW1lIGlmIGFueSBrZXlzIGFyZSBkZWZpbmVkIHRoZXkgYWxsIGFyZSovXG4gIGNvbnN0IGluQmFnZ2FnZSA9IGJhZ2dhZ2UuaGFzKGtleXNbMF0pO1xuICBpZiAoaW5CYWdnYWdlKSB7XG4gICAgY29uc3Qgb2JqID0gb2JqZWN0TWFwKFxuICAgICAgdGh1bmtzLFxuICAgICAgLyoqIEB0eXBlIHsodmFsdWU6IGFueSwga2V5OiBzdHJpbmcpID0+IGFueX0gKi9cbiAgICAgIChfLCBrKSA9PiBiYWdnYWdlLmdldChrKSxcbiAgICApO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaGFyZGVuKG9iaikpO1xuICB9XG5cbiAgY29uc3Qga2V5ZWRQcm9taXNlcyA9IG9iamVjdE1hcCh0aHVua3MsIGZuID0+IGZuKCkpO1xuXG4gIHJldHVybiBhbGxWYWx1ZXMoa2V5ZWRQcm9taXNlcykudGhlbihrZXllZFZhbHMgPT4ge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGtleWVkVmFscykpIHtcbiAgICAgIGJhZ2dhZ2UuaW5pdChrLCB2KTtcbiAgICB9XG4gICAgcmV0dXJuIGtleWVkVmFscztcbiAgfSk7XG59OyRozY9fb25jZS5wcm92aWRlQWxsKHByb3ZpZGVBbGwpO1xuaGFyZGVuKHByb3ZpZGVBbGwpO1xuXG4vKipcbiAqIExpa2UgcHJvdmlkZUFzeW5jIGluIEF0b21pY1Byb3ZpZGVyIGJ1dCBhc3N1bWVzIG9ubHkgb25lIGNhbGwgc28gdGhlcmUgYXJlIG5vIHJhY2UgY29uZGl0aW9ucy5cbiAqIEFkZGl0aW9uYWxseSBvZmZlcnMgYSBgd2l0aFZhbHVlYCBoZWxwZXIgdXNlZnVsIGZvciB0cmlnZ2VyaW5nIHByb2Nlc2VzcyBvbiBhIHByb3ZpZGVkIG9iamVjdC5cbiAqXG4gKiBAc2VlIHttYWtlQXRvbWljUHJvdmlkZXJ9XG4gKiBAc2VlIHtBdG9taWNQcm92aWRlcn1cbiAqIEB0ZW1wbGF0ZSB7KCkgPT4gRVJlZjxhbnk+fSBUXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IG1hcFN0b3JlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge1R9IG1ha2VWYWx1ZVxuICogQHBhcmFtIHsodmFsdWU6IEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj4pID0+IHZvaWR9IFt3aXRoVmFsdWVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8VD4+Pn1cbiAqL1xuICAgICAgIGNvbnN0IHByb3ZpZGVTaW5nbGV0b24gPSAobWFwU3RvcmUsIGtleSwgbWFrZVZhbHVlLCB3aXRoVmFsdWUpID0+IHtcbiAgY29uc3Qgc3RvcmVkID0gbWFwU3RvcmUuaGFzKGtleSlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogRS53aGVuKG1ha2VWYWx1ZSgpLCB2ID0+IG1hcFN0b3JlLmluaXQoa2V5LCBoYXJkZW4odikpKTtcblxuICByZXR1cm4gRS53aGVuKHN0b3JlZCwgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gbWFwU3RvcmUuZ2V0KGtleSk7XG4gICAgaWYgKHdpdGhWYWx1ZSkge1xuICAgICAgd2l0aFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9KTtcbn07JGjNj19vbmNlLnByb3ZpZGVTaW5nbGV0b24ocHJvdmlkZVNpbmdsZXRvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRXBoZW1lcmFQcm92aWRlciI6WyJtYWtlRXBoZW1lcmFQcm92aWRlciJdLCJwcm92aWRlRW1wdHlTZWF0IjpbInByb3ZpZGVFbXB0eVNlYXQiXSwicHJvdmlkZUFsbCI6WyJwcm92aWRlQWxsIl0sInByb3ZpZGVTaW5nbGV0b24iOlsicHJvdmlkZVNpbmdsZXRvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC1mK84pggAAKYIAAAwAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYm9uZGluZ0N1cnZlcy5qcyIsIkBhZ29yaWMvZXJ0cC9zcmMvc2FmZU1hdGguanMiLCIuL3N0YXRlTWFjaGluZS5qcyIsIi4vYXRvbWljVHJhbnNmZXIuanMiLCIuL3pvZUhlbHBlcnMuanMiLCJAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzIiwiLi9kdXJhYmlsaXR5LmpzIiwiLi9wcmVwYXJlLW93bmFibGUuanMiLCIuL3ByaWNlQXV0aG9yaXR5LmpzIiwiLi9wcmljZVF1b3RlLmpzIiwiLi9yZWNvcmRlci5qcyIsIi4vc3RhdGlzdGljcy5qcyIsIi4vdG9waWNzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0TmF0QXNzZXRLaW5kIiwiYXNzZXJ0TmF0QXNzZXRLaW5kIiwiYXRvbWljVHJhbnNmZXIiLCJhdG9taWNUcmFuc2ZlciIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vZHVyYWJpbGl0eS5qcyIsIi4vcHJlcGFyZS1vd25hYmxlLmpzIiwiLi9wcmljZUF1dGhvcml0eS5qcyIsIi4vcHJpY2VRdW90ZS5qcyIsIi4vcmVjb3JkZXIuanMiLCIuL3N0YXRpc3RpY3MuanMiLCIuL3RvcGljcy5qcyIsIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9ib25kaW5nQ3VydmVzLmpzXCIsIFtdXSxbXCJAYWdvcmljL2VydHAvc3JjL3NhZmVNYXRoLmpzXCIsIFtdXSxbXCIuL3N0YXRlTWFjaGluZS5qc1wiLCBbXV0sW1wiLi9hdG9taWNUcmFuc2Zlci5qc1wiLCBbXV0sW1wiLi96b2VIZWxwZXJzLmpzXCIsIFtdXSxbXCJAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzXCIsIFtdXSxbXCIuL2R1cmFiaWxpdHkuanNcIiwgW11dLFtcIi4vcHJlcGFyZS1vd25hYmxlLmpzXCIsIFtdXSxbXCIuL3ByaWNlQXV0aG9yaXR5LmpzXCIsIFtdXSxbXCIuL3ByaWNlUXVvdGUuanNcIiwgW11dLFtcIi4vcmVjb3JkZXIuanNcIiwgW11dLFtcIi4vc3RhdGlzdGljcy5qc1wiLCBbXV0sW1wiLi90b3BpY3MuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL2JvbmRpbmdDdXJ2ZXMuanMiOltbImNhbGNMaXFWYWx1ZVRvTWludCIsImNhbGNMaXFWYWx1ZVRvTWludCJdLFsiY2FsY1NlY29uZGFyeVJlcXVpcmVkIiwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIl0sWyJjYWxjVmFsdWVUb1JlbW92ZSIsImNhbGNWYWx1ZVRvUmVtb3ZlIl0sWyJnZXRJbnB1dFByaWNlIiwiZ2V0SW5wdXRQcmljZSJdLFsiZ2V0T3V0cHV0UHJpY2UiLCJnZXRPdXRwdXRQcmljZSJdXSwiQGFnb3JpYy9lcnRwL3NyYy9zYWZlTWF0aC5qcyI6W1sibmF0U2FmZU1hdGgiLCJuYXRTYWZlTWF0aCJdXSwiLi9zdGF0ZU1hY2hpbmUuanMiOltbIm1ha2VTdGF0ZU1hY2hpbmUiLCJtYWtlU3RhdGVNYWNoaW5lIl1dLCIuL2F0b21pY1RyYW5zZmVyLmpzIjpbWyJhdG9taWNSZWFycmFuZ2UiLCJhdG9taWNSZWFycmFuZ2UiXSxbImF0b21pY1RyYW5zZmVyIiwiYXRvbWljVHJhbnNmZXIiXSxbImZyb21Pbmx5IiwiZnJvbU9ubHkiXSxbInRvT25seSIsInRvT25seSJdXSwiLi96b2VIZWxwZXJzLmpzIjpbWyJhc3NlcnRJc3N1ZXJLZXl3b3JkcyIsImFzc2VydElzc3VlcktleXdvcmRzIl0sWyJhc3NlcnROYXRBc3NldEtpbmQiLCJhc3NlcnROYXRBc3NldEtpbmQiXSxbImFzc2VydFByb3Bvc2FsU2hhcGUiLCJhc3NlcnRQcm9wb3NhbFNoYXBlIl0sWyJkZWZhdWx0QWNjZXB0YW5jZU1zZyIsImRlZmF1bHRBY2NlcHRhbmNlTXNnIl0sWyJkZXBvc2l0VG9TZWF0IiwiZGVwb3NpdFRvU2VhdCJdLFsiZml0UHJvcG9zYWxTaGFwZSIsImZpdFByb3Bvc2FsU2hhcGUiXSxbIm9mZmVyVG8iLCJvZmZlclRvIl0sWyJzYXRpc2ZpZXMiLCJzYXRpc2ZpZXMiXSxbInNhdmVBbGxJc3N1ZXJzIiwic2F2ZUFsbElzc3VlcnMiXSxbInN3YXAiLCJzd2FwIl0sWyJzd2FwRXhhY3QiLCJzd2FwRXhhY3QiXSxbIndpdGhkcmF3RnJvbVNlYXQiLCJ3aXRoZHJhd0Zyb21TZWF0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB8zuEBqw8AAKsPAAA6AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByZXBhcmUtb3duYWJsZS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Jhc2Utem9uZS96b25lLWhlbHBlcnMuanMiLCJAZW5kby9wYXR0ZXJucyIsIi4uL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlT3duYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHByZXBhcmVSZXZvY2FibGVNYWtlcktpdCxNLE9mZmVySGFuZGxlckk7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2Jhc2Utem9uZS96b25lLWhlbHBlcnMuanNcIiwgW1tcInByZXBhcmVSZXZvY2FibGVNYWtlcktpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVSZXZvY2FibGVNYWtlcktpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIk9mZmVySGFuZGxlcklcIixbJGjNj19hID0+IChPZmZlckhhbmRsZXJJID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICogQGltcG9ydCB7WkNGfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtJbnZpdGF0aW9ufSBmcm9tICcuLi90eXBlcy1pbmRleC5qcyc7XG4gKi9cblxuY29uc3QgVHJhbnNmZXJQcm9wb3NhbFNoYXBlID0gTS5zcGxpdFJlY29yZCh7XG4gIGdpdmU6IHt9LFxuICB3YW50OiB7fSxcbiAgZXhpdDoge1xuICAgIG9uRGVtYW5kOiBudWxsLFxuICB9LFxufSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gT3duYWJsZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdUludGVyZmFjZU5hbWVdXG4gKiAgIFRoZSBgaW50ZXJmYWNlTmFtZWAgb2YgdGhlIHVuZGVybHlpbmcgaW50ZXJmYWNlIGd1YXJkLlxuICogICBEZWZhdWx0cyB0byB0aGUgYHVLaW5kTmFtZWAuXG4gKi9cblxuLyoqXG4gKiBQcmVwYXJlIGEga2luZCB0aGF0IHdyYXBzIGFuICdvd25hYmxlJyBvYmplY3Qgd2l0aCBhIGBtYWtlVHJhbnNmZXJJbnZpdGF0aW9uYFxuICogYWJpbGl0eSBhbmQgZGVsZWdhdGVzIHRvIHRoZSB1bmRlcmx5aW5nIG9iamVjdCBtZXRob2RzIHNwZWNpZmllZCBpbiBhblxuICogYWxsb3dsaXN0IG9mIG1ldGhvZCBuYW1lcy5cbiAqXG4gKiBAdGVtcGxhdGUgeyhzdHJpbmcgfCBzeW1ib2wpW119IE1OIE1ldGhvZCBuYW1lc1xuICogQHBhcmFtIHtab25lfSB6b25lXG4gKiBAcGFyYW0ge1pDRlsnbWFrZUludml0YXRpb24nXX0gbWFrZUludml0YXRpb25cbiAqICAgQSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIGJlaGF2aW9yIGFzIGB6Y2YubWFrZUludml0YXRpb25gLlxuICogICBBIGNvbnRyYWN0IHdpbGwgbm9ybWFsbHkganVzdCBleHRyYWN0IGl0IGZyb20gaXRzIG93biB6Y2YgdXNpbmcgdGhlXG4gKiAgIGFyZ3VtZW50IGV4cHJlc3Npb25cbiAqICAgYGBganNcbiAqICAgKC4uLmFyZ3MpID0+IHpjZi5tYWtlSW52aXRhdGlvbiguLi5hcmdzKVxuICogICBgYGBcbiAqICAgU2VlIG93bmFibGUtY291bnRlci5qcyBmb3IgdGhlIGNhbm9uaWNhbCBleGFtcGxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHVLaW5kTmFtZVxuICogICBUaGUgYGtpbmROYW1lYCBvZiB0aGUgdW5kZXJseWluZyBleG8gY2xhc3NcbiAqIEBwYXJhbSB7TU59IHVNZXRob2ROYW1lc1xuICogICBUaGUgbWV0aG9kIG5hbWVzIG9mIHRoZSB1bmRlcmx5aW5nIGV4byBjbGFzcyB0aGF0IHNob3VsZCBiZSByZXByZXNlbnRlZFxuICogICBieSB0cmFuc3BhcmVudGx5LWZvcndhcmRpbmcgbWV0aG9kcyBvZiB0aGUgd3JhcHBpbmcgb3duYWJsZSBvYmplY3QuXG4gKiBAcGFyYW0ge093bmFibGVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHs8VT4odW5kZXJseWluZzogVSkgPT4gUGFydGlhbDxVPiAmIHttYWtlVHJhbnNmZXJJbnZpdGF0aW9uOiAoKSA9PiBJbnZpdGF0aW9uPFU+fX1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVPd25hYmxlID0gKFxuICB6b25lLFxuICBtYWtlSW52aXRhdGlvbixcbiAgdUtpbmROYW1lLFxuICB1TWV0aG9kTmFtZXMsXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBjb25zdCB7IHVJbnRlcmZhY2VOYW1lID0gdUtpbmROYW1lIH0gPSBvcHRpb25zO1xuICBjb25zdCB7IHJldm9rZSwgbWFrZVJldm9jYWJsZSB9ID0gcHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0KFxuICAgIHpvbmUsXG4gICAgdUtpbmROYW1lLFxuICAgIHVNZXRob2ROYW1lcyxcbiAgICB7XG4gICAgICB1SW50ZXJmYWNlTmFtZSxcbiAgICAgIGV4dHJhTWV0aG9kR3VhcmRzOiB7XG4gICAgICAgIG1ha2VUcmFuc2Zlckludml0YXRpb246IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgICAgfSxcbiAgICAgIGV4dHJhTWV0aG9kczoge1xuICAgICAgICBtYWtlVHJhbnNmZXJJbnZpdGF0aW9uKCkge1xuICAgICAgICAgIGNvbnN0IHsgdW5kZXJseWluZyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBjb25zdCB7IHJldm9jYWJsZSB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRGV0YWlscyA9IHVuZGVybHlpbmcuZ2V0SW52aXRhdGlvbkN1c3RvbURldGFpbHMoKTtcbiAgICAgICAgICBjb25zdCB0cmFuc2ZlckhhbmRsZXIgPSBtYWtlVHJhbnNmZXJIYW5kbGVyKHVuZGVybHlpbmcpO1xuXG4gICAgICAgICAgY29uc3QgaW52aXRhdGlvbiA9IG1ha2VJbnZpdGF0aW9uKFxuICAgICAgICAgICAgdHJhbnNmZXJIYW5kbGVyLFxuICAgICAgICAgICAgJ3RyYW5zZmVyJyxcbiAgICAgICAgICAgIGN1c3RvbURldGFpbHMsXG4gICAgICAgICAgICBUcmFuc2ZlclByb3Bvc2FsU2hhcGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXZva2UocmV2b2NhYmxlKTtcbiAgICAgICAgICByZXR1cm4gaW52aXRhdGlvbjtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICBjb25zdCBtYWtlVHJhbnNmZXJIYW5kbGVyID0gem9uZS5leG9DbGFzcyhcbiAgICAnVHJhbnNmZXJIYW5kbGVyJyxcbiAgICBPZmZlckhhbmRsZXJJLFxuICAgIHVuZGVybHlpbmcgPT4gKHtcbiAgICAgIHVuZGVybHlpbmcsXG4gICAgfSksXG4gICAge1xuICAgICAgaGFuZGxlKHNlYXQpIHtcbiAgICAgICAgY29uc3QgeyB1bmRlcmx5aW5nIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBjb25zdCByZXZvY2FibGUgPSBtYWtlUmV2b2NhYmxlKHVuZGVybHlpbmcpO1xuICAgICAgICBzZWF0LmV4aXQoKTtcbiAgICAgICAgcmV0dXJuIHJldm9jYWJsZTtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICBjb25zdCBtYWtlT3duYWJsZSA9IHVuZGVybHlpbmcgPT4gbWFrZVJldm9jYWJsZSh1bmRlcmx5aW5nKTtcbiAgLyogVXNpbmcgYXQtdHMtaWdub3JlIHJhdGhlciB0aGFuIGF0LXRzLWV4cGVjdC1lcnJvciBiZWNhdXNlIHRoZSB2c2NvZGUqL1xuICAvKiB0cyBzZXJ2ZXIgc2F5cyBpdCBpcyBhbiBlcnJvciBidXQgYHlhcm4gbGludGAgc2F5cyBpdCBpcyBub3QuKi9cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCovXG4gIC8qIEB0cy1pZ25vcmUgUmV0dXJuIHR5cGUgaXMgbW9yZSBwcmVjaXNlIHRoYW4gcmV2b2NhYmxlIHN1cHBvcnRzKi9cbiAgcmV0dXJuIGhhcmRlbihtYWtlT3duYWJsZSk7XG59OyRozY9fb25jZS5wcmVwYXJlT3duYWJsZShwcmVwYXJlT3duYWJsZSk7XG5oYXJkZW4ocHJlcGFyZU93bmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZU93bmFibGUiOlsicHJlcGFyZU93bmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2cqrUYk1AACJNQAAOQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIl0sImV4cG9ydHMiOlsiUHJpY2VBdXRob3JpdHlJIiwibWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEUsRmFyLG1ha2VQcm9taXNlS2l0LEFtb3VudE1hdGgsQW1vdW50U2hhcGUsQnJhbmRTaGFwZSxtYWtlVHJhY2VyLG1ha2VOb3RpZmllcixNLFRpbWVzdGFtcFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dLFtcIkFtb3VudFNoYXBlXCIsWyRozY9fYSA9PiAoQW1vdW50U2hhcGUgPSAkaM2PX2EpXV0sW1wiQnJhbmRTaGFwZVwiLFskaM2PX2EgPT4gKEJyYW5kU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJtYWtlVHJhY2VyXCIsWyRozY9fYSA9PiAobWFrZVRyYWNlciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllclwiLFskaM2PX2EgPT4gKG1ha2VOb3RpZmllciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQcmljZUF1dGhvcml0eSwgUHJpY2VEZXNjcmlwdGlvbiwgUHJpY2VRdW90ZSwgUHJpY2VRdW90ZVZhbHVlLCBQcmljZVF1ZXJ5LCBQcmljZVF1b3RlQ3JlYXRlLCBQcmljZUF1dGhvcml0eUtpdCwgUHJpY2VRdW90ZVRyaWdnZXIsIE11dGFibGVRdW90ZSx9IGZyb20gJ0BhZ29yaWMvem9lL3Rvb2xzL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge05vdGlmaWVyfSBmcm9tICdAYWdvcmljL25vdGlmaWVyJztcbiAqIEBpbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSAnQGFnb3JpYy90aW1lJztcbiAqIEBpbXBvcnQge0Ftb3VudH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge0lzc3Vlcn0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge0JyYW5kfSBmcm9tICdAYWdvcmljL2VydHAnO1xuICogQGltcG9ydCB7UHJvbWlzZVJlY29yZH0gZnJvbSAnQGVuZG8vcHJvbWlzZS1raXQnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbmNvbnN0IHRyYWNlID0gbWFrZVRyYWNlcignUEEnLCBmYWxzZSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIENvbXBhcmVBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRMaW1pdFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNMVCA9IChhbW91bnQsIGFtb3VudExpbWl0KSA9PiAhQW1vdW50TWF0aC5pc0dURShhbW91bnQsIGFtb3VudExpbWl0KTtcblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNMVEUgPSAoYW1vdW50LCBhbW91bnRMaW1pdCkgPT4gQW1vdW50TWF0aC5pc0dURShhbW91bnRMaW1pdCwgYW1vdW50KTtcblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNHVEUgPSAoYW1vdW50LCBhbW91bnRMaW1pdCkgPT4gQW1vdW50TWF0aC5pc0dURShhbW91bnQsIGFtb3VudExpbWl0KTtcblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNHVCA9IChhbW91bnQsIGFtb3VudExpbWl0KSA9PiAhQW1vdW50TWF0aC5pc0dURShhbW91bnRMaW1pdCwgYW1vdW50KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgVHJpZ2dlclxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSBjcmVhdGVJbnN0YW50UXVvdGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5cbmNvbnN0IEd1YXJkQ2FsbEFtb3VudFR1cGxlID0gTS5jYWxsKEFtb3VudFNoYXBlLCBBbW91bnRTaGFwZSkucmV0dXJucyhcbiAgTS5wcm9taXNlKCksXG4pO1xuICAgICAgIGNvbnN0IFByaWNlQXV0aG9yaXR5SSA9IE0uaW50ZXJmYWNlKCdQcmljZUF1dGhvcml0eScsIHtcbiAgZ2V0UXVvdGVJc3N1ZXI6IE0uY2FsbChCcmFuZFNoYXBlLCBCcmFuZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0VGltZXJTZXJ2aWNlOiBNLmNhbGwoQnJhbmRTaGFwZSwgQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHF1b3RlR2l2ZW46IE0uY2FsbChBbW91bnRTaGFwZSwgQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHF1b3RlV2FudGVkOiBNLmNhbGwoQnJhbmRTaGFwZSwgQW1vdW50U2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBtYWtlUXVvdGVOb3RpZmllcjogTS5jYWxsKEFtb3VudFNoYXBlLCBCcmFuZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgcXVvdGVBdFRpbWU6IE0uY2FsbChUaW1lc3RhbXBTaGFwZSwgQW1vdW50U2hhcGUsIEJyYW5kU2hhcGUpLnJldHVybnMoXG4gICAgTS5wcm9taXNlKCksXG4gICksXG4gIHF1b3RlV2hlbkxUOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgcXVvdGVXaGVuTFRFOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgcXVvdGVXaGVuR1RFOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgcXVvdGVXaGVuR1Q6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBtdXRhYmxlUXVvdGVXaGVuTFQ6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBtdXRhYmxlUXVvdGVXaGVuTFRFOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgbXV0YWJsZVF1b3RlV2hlbkdURTogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIG11dGFibGVRdW90ZVdoZW5HVDogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG59KTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHtJc3N1ZXI8J3NldCcsIFByaWNlRGVzY3JpcHRpb24+fSBvcHRzLnF1b3RlSXNzdWVyXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8dW5rbm93bj4+fSBvcHRzLm5vdGlmaWVyXG4gKiBAcGFyYW0ge0VSZWY8VGltZXJTZXJ2aWNlPn0gb3B0cy50aW1lclxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSBvcHRzLmNyZWF0ZVF1b3RlXG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gb3B0cy5hY3R1YWxCcmFuZEluXG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gb3B0cy5hY3R1YWxCcmFuZE91dFxuICogQHJldHVybnMge1ByaWNlQXV0aG9yaXR5S2l0fVxuICovJGjNj19vbmNlLlByaWNlQXV0aG9yaXR5SShQcmljZUF1dGhvcml0eUkpO1xuICAgICAgIGNvbnN0IG1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCA9IG9wdHMgPT4ge1xuICBjb25zdCB7XG4gICAgdGltZXIsXG4gICAgY3JlYXRlUXVvdGUsXG4gICAgYWN0dWFsQnJhbmRJbixcbiAgICBhY3R1YWxCcmFuZE91dCxcbiAgICBxdW90ZUlzc3VlcixcbiAgICBub3RpZmllcixcbiAgfSA9IG9wdHM7XG5cbiAgbGV0IGhhdmVGaXJzdFF1b3RlID0gZmFsc2U7XG5cbiAgdm9pZCBFKG5vdGlmaWVyKVxuICAgIC5nZXRVcGRhdGVTaW5jZSgpXG4gICAgLnRoZW4oXyA9PiAoaGF2ZUZpcnN0UXVvdGUgPSB0cnVlKSk7XG5cbiAgLyoqIEB0eXBlIHtTZXQ8VHJpZ2dlcj59ICovXG4gIGNvbnN0IHRyaWdnZXJzID0gbmV3IFNldCgpO1xuICBjb25zdCBtdXRhYmxlVHJpZ2dlcnMgPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGVDcmVhdGV9IHRyaWdnZXJDcmVhdGVRdW90ZVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbiAgY29uc3QgZmlyZVRyaWdnZXJzID0gYXN5bmMgdHJpZ2dlckNyZWF0ZVF1b3RlID0+IHtcbiAgICBpZiAoIWhhdmVGaXJzdFF1b3RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLnRyaWdnZXJzLCAuLi5BcnJheS5mcm9tKG11dGFibGVUcmlnZ2Vycy52YWx1ZXMoKSldLm1hcCh0cmlnZ2VyID0+XG4gICAgICAgIHRyaWdnZXIodHJpZ2dlckNyZWF0ZVF1b3RlKSxcbiAgICAgICksXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAqIENyZWF0ZSBhIHF1b3RlV2hlbiogZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtDb21wYXJlQW1vdW50fSBjb21wYXJlQW1vdW50c0ZuXG4gKi9cbiAgY29uc3QgbWFrZVF1b3RlV2hlbk91dCA9XG4gICAgY29tcGFyZUFtb3VudHNGbiA9PlxuICAgIC8qKlxuICogUmV0dXJuIGEgcXVvdGUgd2hlbiB0cmlnZ2VyV2hlbiBpcyB0cnVlIG9mIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRJbiB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlIGNhbGNBbW91bnRUcmlnZ2VyXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50T3V0TGltaXQgdGhlIHZhbHVlIHRvIGNvbXBhcmUgd2l0aCB0aGUgb3V0cHV0XG4gKiBvZiBjYWxjQW1vdW50VHJpZ2dlclxuICovXG4gICAgYXN5bmMgKGFtb3VudEluLCBhbW91bnRPdXRMaW1pdCkgPT4ge1xuICAgICAgYW1vdW50SW4gPSBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLCBhbW91bnRJbik7XG4gICAgICBhbW91bnRPdXRMaW1pdCA9IEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kT3V0LCBhbW91bnRPdXRMaW1pdCk7XG5cbiAgICAgIC8qKiBAdHlwZSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gKi9cbiAgICAgIGNvbnN0IHRyaWdnZXJQSyA9IG1ha2VQcm9taXNlS2l0KCk7XG5cbiAgICAgIC8qKiBAdHlwZSB7UHJpY2VRdW90ZVRyaWdnZXJ9ICovXG4gICAgICBjb25zdCB0cmlnZ2VyID0gYXN5bmMgY3JlYXRlSW5zdGFudFF1b3RlID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBxdW90ZVAgPSBjcmVhdGVJbnN0YW50UXVvdGUoY2FsY0Ftb3VudE91dCA9PiB7XG4gICAgICAgICAgICBpZiAoIXRyaWdnZXJzLmhhcyh0cmlnZ2VyKSkge1xuICAgICAgICAgICAgICAvKiBBbHJlYWR5IGZpcmVkLiovXG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbW91bnRPdXQgPSBjYWxjQW1vdW50T3V0KGFtb3VudEluKTtcblxuICAgICAgICAgICAgaWYgKCFjb21wYXJlQW1vdW50c0ZuKGFtb3VudE91dCwgYW1vdW50T3V0TGltaXQpKSB7XG4gICAgICAgICAgICAgIC8qIERvbid0IGZpcmUgdGhlIHRyaWdnZXIgeWV0LiovXG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIEdlbmVyYXRlIHRoZSBxdW90ZS4qL1xuICAgICAgICAgICAgcmV0dXJuIHsgYW1vdW50SW4sIGFtb3VudE91dCB9O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFxdW90ZVApIHtcbiAgICAgICAgICAgIC8qIFdlIHNob3VsZG4ndCByZXNvbHZlIHlldC4qL1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyaWdnZXJzLmRlbGV0ZSh0cmlnZ2VyKTtcbiAgICAgICAgICB0cmlnZ2VyUEsucmVzb2x2ZShxdW90ZVApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLyogVHJpZ2dlciBmYWlsZWQsIHNvIHJlamVjdCBhbmQgZHJvcC4qL1xuICAgICAgICAgIHRyaWdnZXJQSy5yZWplY3QoZSk7XG4gICAgICAgICAgdHJpZ2dlcnMuZGVsZXRlKHRyaWdnZXIpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0cmlnZ2Vycy5hZGQodHJpZ2dlcik7XG5cbiAgICAgIC8qIEZpcmUgbm93LCBqdXN0IGluIGNhc2UuKi9cbiAgICAgIGF3YWl0IHRyaWdnZXIoY3JlYXRlUXVvdGUpO1xuXG4gICAgICByZXR1cm4gdHJpZ2dlclBLLnByb21pc2U7XG4gICAgfTtcblxuICAvKipcbiAqIENyZWF0ZSBhIG11dGFibGVRdW90ZVdoZW4qIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29tcGFyZUFtb3VudH0gY29tcGFyZUFtb3VudHNGblxuICovXG4gIGNvbnN0IG1ha2VNdXRhYmxlUXVvdGUgPVxuICAgIGNvbXBhcmVBbW91bnRzRm4gPT5cbiAgICAvKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50SW5cbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50T3V0TGltaXRcbiAqL1xuICAgIGFzeW5jIChhbW91bnRJbiwgYW1vdW50T3V0TGltaXQpID0+IHtcbiAgICAgIEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sIGFtb3VudEluKTtcbiAgICAgIEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kT3V0LCBhbW91bnRPdXRMaW1pdCk7XG5cbiAgICAgIC8qKiBAdHlwZSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gKi9cbiAgICAgIGNvbnN0IHRyaWdnZXJQSyA9IG1ha2VQcm9taXNlS2l0KCk7XG5cbiAgICAgIC8qKiBAdHlwZSB7TXV0YWJsZVF1b3RlfSAqL1xuICAgICAgY29uc3QgbXV0YWJsZVF1b3RlID0gRmFyKCdNdXRhYmxlUXVvdGUnLCB7XG4gICAgICAgIGNhbmNlbDogZSA9PiB0cmlnZ2VyUEsucmVqZWN0KGUpLFxuICAgICAgICB1cGRhdGVMZXZlbDogKG5ld0Ftb3VudEluLCBuZXdBbW91bnRPdXRMaW1pdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvZXJjZWRBbW91bnRJbiA9IEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sIG5ld0Ftb3VudEluKTtcbiAgICAgICAgICBjb25zdCBjb2VyY2VkQW1vdW50T3V0TGltaXQgPSBBbW91bnRNYXRoLmNvZXJjZShcbiAgICAgICAgICAgIGFjdHVhbEJyYW5kT3V0LFxuICAgICAgICAgICAgbmV3QW1vdW50T3V0TGltaXQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhbW91bnRJbiA9IGNvZXJjZWRBbW91bnRJbjtcbiAgICAgICAgICBhbW91bnRPdXRMaW1pdCA9IGNvZXJjZWRBbW91bnRPdXRMaW1pdDtcbiAgICAgICAgICB2b2lkIGZpcmVUcmlnZ2VycyhjcmVhdGVRdW90ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFByb21pc2U6ICgpID0+IHRyaWdnZXJQSy5wcm9taXNlLFxuICAgICAgfSk7XG5cbiAgICAgIC8qKiBAdHlwZSB7UHJpY2VRdW90ZVRyaWdnZXJ9ICovXG4gICAgICBjb25zdCBtdXRhYmxlVHJpZ2dlciA9IGFzeW5jIGNyZWF0ZUluc3RhbnRRdW90ZSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcXVvdGVQID0gY3JlYXRlSW5zdGFudFF1b3RlKGNhbGNBbW91bnRPdXQgPT4ge1xuICAgICAgICAgICAgaWYgKCFtdXRhYmxlVHJpZ2dlcnMuaGFzKG11dGFibGVRdW90ZSkpIHtcbiAgICAgICAgICAgICAgLyogQWxyZWFkeSBmaXJlZC4qL1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYW1vdW50T3V0ID0gY2FsY0Ftb3VudE91dChhbW91bnRJbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcGFyZUFtb3VudHNGbihhbW91bnRPdXQsIGFtb3VudE91dExpbWl0KSkge1xuICAgICAgICAgICAgICAvKiBEb24ndCBmaXJlIHRoZSBtdXRhYmxlVHJpZ2dlciB5ZXQuKi9cbiAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogR2VuZXJhdGUgdGhlIHF1b3RlLiovXG4gICAgICAgICAgICByZXR1cm4geyBhbW91bnRJbiwgYW1vdW50T3V0IH07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIXF1b3RlUCkge1xuICAgICAgICAgICAgLyogV2Ugc2hvdWxkbid0IHJlc29sdmUgeWV0LiovXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbXV0YWJsZVRyaWdnZXJzLmRlbGV0ZShtdXRhYmxlUXVvdGUpO1xuICAgICAgICAgIHRyaWdnZXJQSy5yZXNvbHZlKHF1b3RlUCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvKiBUcmlnZ2VyIGZhaWxlZCwgc28gcmVqZWN0IGFuZCBkcm9wLiovXG4gICAgICAgICAgdHJpZ2dlclBLLnJlamVjdChlKTtcbiAgICAgICAgICBtdXRhYmxlVHJpZ2dlcnMuZGVsZXRlKG11dGFibGVRdW90ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIG11dGFibGVUcmlnZ2Vycy5zZXQobXV0YWJsZVF1b3RlLCBtdXRhYmxlVHJpZ2dlcik7XG5cbiAgICAgIC8qIEZpcmUgbm93LCBqdXN0IGluIGNhc2UuKi9cbiAgICAgIGF3YWl0IG11dGFibGVUcmlnZ2VyKGNyZWF0ZVF1b3RlKTtcblxuICAgICAgcmV0dXJuIG11dGFibGVRdW90ZTtcbiAgICB9O1xuXG4gIC8qKlxuICogRW5zdXJlIHRoYXQgdGhlIGJyYW5kSW4vYnJhbmRPdXQgcGFpciBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRJblxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRPdXRcbiAqL1xuICBjb25zdCBhc3NlcnRCcmFuZHMgPSAoYnJhbmRJbiwgYnJhbmRPdXQpID0+IHtcbiAgICBicmFuZEluID09PSBhY3R1YWxCcmFuZEluIHx8XG4gICAgICBGYWlsYERlc2lyZWQgYnJhbmRJbiAke3EoYnJhbmRJbil9IG11c3QgbWF0Y2ggJHtxKGFjdHVhbEJyYW5kSW4pfWA7XG4gICAgYnJhbmRPdXQgPT09IGFjdHVhbEJyYW5kT3V0IHx8XG4gICAgICBGYWlsYERlc2lyZWQgYnJhbmRPdXQgJHtxKGJyYW5kT3V0KX0gbXVzdCBtYXRjaCAke3EoYWN0dWFsQnJhbmRPdXQpfWA7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHtQcmljZUF1dGhvcml0eX0gKi9cbiAgY29uc3QgcHJpY2VBdXRob3JpdHkgPSBGYXIoJ1ByaWNlQXV0aG9yaXR5Jywge1xuICAgIGdldFF1b3RlSXNzdWVyKGJyYW5kSW4sIGJyYW5kT3V0KSB7XG4gICAgICBhc3NlcnRCcmFuZHMoYnJhbmRJbiwgYnJhbmRPdXQpO1xuICAgICAgcmV0dXJuIHF1b3RlSXNzdWVyO1xuICAgIH0sXG4gICAgZ2V0VGltZXJTZXJ2aWNlKGJyYW5kSW4sIGJyYW5kT3V0KSB7XG4gICAgICBhc3NlcnRCcmFuZHMoYnJhbmRJbiwgYnJhbmRPdXQpO1xuICAgICAgcmV0dXJuIHRpbWVyO1xuICAgIH0sXG4gICAgbWFrZVF1b3RlTm90aWZpZXIoYW1vdW50SW4sIGJyYW5kT3V0KSB7XG4gICAgICBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLCBhbW91bnRJbik7XG4gICAgICBhc3NlcnRCcmFuZHMoYW1vdW50SW4uYnJhbmQsIGJyYW5kT3V0KTtcblxuICAgICAgLyogV3JhcCBvdXIgdW5kZXJseWluZyBub3RpZmllciB3aXRoIHNwZWNpZmljIHF1b3Rlcy4qL1xuICAgICAgY29uc3Qgc3BlY2lmaWNCYXNlTm90aWZpZXIgPSBoYXJkZW4oe1xuICAgICAgICBhc3luYyBnZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCA9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8qIFdlIHVzZSB0aGUgc2FtZSB1cGRhdGVDb3VudCBhcyBvdXIgdW5kZXJseWluZyBub3RpZmllci4qL1xuICAgICAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KTtcblxuICAgICAgICAgIC8qIFdlIGNyZWF0ZSBhIHF1b3RlIGlubGluZS4qL1xuICAgICAgICAgIGxldCBxdW90ZTtcbiAgICAgICAgICAvKiBjcmVhdGVRdW90ZSBjYW4gdGhyb3cgaWYgcHJpY2VBdXRob3JpdHkgaXMgcmVwbGFjZWQuKi9cblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBxdW90ZSA9IGNyZWF0ZVF1b3RlKGNhbGNBbW91bnRPdXQgPT4gKHtcbiAgICAgICAgICAgICAgYW1vdW50SW4sXG4gICAgICAgICAgICAgIGFtb3VudE91dDogY2FsY0Ftb3VudE91dChhbW91bnRJbiksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoKi9cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXF1b3RlKSB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYGNyZWF0ZVF1b3RlIHJldHVybmVkIG5vdGhpbmdgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcXVvdGU7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHVwZGF0ZUNvdW50OiByZWNvcmQudXBkYXRlQ291bnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLyoqIEB0eXBlIHtOb3RpZmllcjxQcmljZVF1b3RlPn0gKi9cbiAgICAgIGNvbnN0IHNwZWNpZmljTm90aWZpZXIgPSBGYXIoJ1F1b3RlTm90aWZpZXInLCB7XG4gICAgICAgIC4uLm1ha2VOb3RpZmllcihzcGVjaWZpY0Jhc2VOb3RpZmllciksXG4gICAgICAgIC8qIFRPRE8gc3RvcCBleHBvc2luZyBiYXNlTm90aWZpZXIgbWV0aG9kcyBkaXJlY3RseS4qL1xuICAgICAgICAuLi5zcGVjaWZpY0Jhc2VOb3RpZmllcixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNwZWNpZmljTm90aWZpZXI7XG4gICAgfSxcbiAgICBhc3luYyBxdW90ZUdpdmVuKGFtb3VudEluLCBicmFuZE91dCkge1xuICAgICAgdHJhY2UoJ3F1b3RlR2l2ZW4nLCBhbW91bnRJbiwgYnJhbmRPdXQpO1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgYW1vdW50SW4pO1xuICAgICAgYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLCBicmFuZE91dCk7XG5cbiAgICAgIGF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKCk7XG4gICAgICBjb25zdCBxdW90ZSA9IGNyZWF0ZVF1b3RlKGNhbGNBbW91bnRPdXQgPT4gKHtcbiAgICAgICAgYW1vdW50SW4sXG4gICAgICAgIGFtb3VudE91dDogY2FsY0Ftb3VudE91dChhbW91bnRJbiksXG4gICAgICB9KSk7XG4gICAgICBhc3NlcnQocXVvdGUpO1xuICAgICAgcmV0dXJuIHF1b3RlO1xuICAgIH0sXG4gICAgYXN5bmMgcXVvdGVXYW50ZWQoYnJhbmRJbiwgYW1vdW50T3V0KSB7XG4gICAgICBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCwgYW1vdW50T3V0KTtcbiAgICAgIGFzc2VydEJyYW5kcyhicmFuZEluLCBhbW91bnRPdXQuYnJhbmQpO1xuXG4gICAgICBhd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSgpO1xuICAgICAgY29uc3QgcXVvdGUgPSBjcmVhdGVRdW90ZSgoY2FsY0Ftb3VudE91dCwgY2FsY0Ftb3VudEluKSA9PiB7XG4gICAgICAgIC8qIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGFuIGFtb3VudEluIHRoYXQgZ3VhcmFudGVlcyBhdCBsZWFzdCB0aGUgYW1vdW50T3V0LiovXG4gICAgICAgIGNvbnN0IGFtb3VudEluID0gY2FsY0Ftb3VudEluKGFtb3VudE91dCk7XG4gICAgICAgIGNvbnN0IGFjdHVhbEFtb3VudE91dCA9IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pO1xuICAgICAgICBBbW91bnRNYXRoLmlzR1RFKGFjdHVhbEFtb3VudE91dCwgYW1vdW50T3V0KSB8fFxuICAgICAgICAgIEZhaWxgQ2FsY3VsYXRpb24gb2YgJHthY3R1YWxBbW91bnRPdXR9IGRpZG4ndCBjb3ZlciBleHBlY3RlZCAke2Ftb3VudE91dH1gO1xuICAgICAgICByZXR1cm4geyBhbW91bnRJbiwgYW1vdW50T3V0IH07XG4gICAgICB9KTtcbiAgICAgIGFzc2VydChxdW90ZSk7XG4gICAgICByZXR1cm4gcXVvdGU7XG4gICAgfSxcbiAgICBhc3luYyBxdW90ZUF0VGltZShkZWFkbGluZSwgYW1vdW50SW4sIGJyYW5kT3V0KSB7XG4gICAgICBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLCBhbW91bnRJbik7XG4gICAgICBhc3NlcnRCcmFuZHMoYW1vdW50SW4uYnJhbmQsIGJyYW5kT3V0KTtcblxuICAgICAgYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbiAgICAgIGNvbnN0IHF1b3RlUEsgPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgYXdhaXQgRSh0aW1lcikuc2V0V2FrZXVwKFxuICAgICAgICBkZWFkbGluZSxcbiAgICAgICAgRmFyKCd3YWtlT2JqJywge1xuICAgICAgICAgIGFzeW5jIHdha2UodGltZXN0YW1wKSB7XG4gICAgICAgICAgICBhd2FpdCBudWxsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcXVvdGVQID0gY3JlYXRlUXVvdGUoY2FsY0Ftb3VudE91dCA9PiAoe1xuICAgICAgICAgICAgICAgIGFtb3VudEluLFxuICAgICAgICAgICAgICAgIGFtb3VudE91dDogY2FsY0Ftb3VudE91dChhbW91bnRJbiksXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgLyogV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHF1b3RlIHRvIGJlIGF1dGhlbnRpY2F0ZWQ7IHJlc29sdmUqL1xuICAgICAgICAgICAgICAvKiBpbW1lZGlhdGVseS4qL1xuICAgICAgICAgICAgICBxdW90ZVBLLnJlc29sdmUocXVvdGVQKTtcbiAgICAgICAgICAgICAgYXdhaXQgcXVvdGVQSy5wcm9taXNlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBxdW90ZVBLLnJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8qIFdhaXQgdW50aWwgdGhlIHdha2V1cCBwYXNzZXMuKi9cbiAgICAgIHJldHVybiBxdW90ZVBLLnByb21pc2U7XG4gICAgfSxcbiAgICBxdW90ZVdoZW5MVDogbWFrZVF1b3RlV2hlbk91dChpc0xUKSxcbiAgICBxdW90ZVdoZW5MVEU6IG1ha2VRdW90ZVdoZW5PdXQoaXNMVEUpLFxuICAgIHF1b3RlV2hlbkdURTogbWFrZVF1b3RlV2hlbk91dChpc0dURSksXG4gICAgcXVvdGVXaGVuR1Q6IG1ha2VRdW90ZVdoZW5PdXQoaXNHVCksXG4gICAgbXV0YWJsZVF1b3RlV2hlbkxUOiBtYWtlTXV0YWJsZVF1b3RlKGlzTFQpLFxuICAgIG11dGFibGVRdW90ZVdoZW5MVEU6IG1ha2VNdXRhYmxlUXVvdGUoaXNMVEUpLFxuICAgIG11dGFibGVRdW90ZVdoZW5HVDogbWFrZU11dGFibGVRdW90ZShpc0dUKSxcbiAgICBtdXRhYmxlUXVvdGVXaGVuR1RFOiBtYWtlTXV0YWJsZVF1b3RlKGlzR1RFKSxcbiAgfSk7XG5cbiAgcmV0dXJuIHsgcHJpY2VBdXRob3JpdHksIGFkbWluRmFjZXQ6IHsgZmlyZVRyaWdnZXJzIH0gfTtcbn07JGjNj19vbmNlLm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdChtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHJpY2VBdXRob3JpdHlJIjpbIlByaWNlQXV0aG9yaXR5SSJdLCJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQiOlsibWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGgfyq7mCwAA5gsAADUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiZ2V0QW1vdW50SW4iLCJnZXRBbW91bnRPdXQiLCJnZXRQcmljZURlc2NyaXB0aW9uIiwiZ2V0VGltZXN0YW1wIiwibWFrZVByaWNlUXVvdGVJc3N1ZXIiLCJ1bml0QW1vdW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQW1vdW50TWF0aCxBc3NldEtpbmQsbWFrZUlzc3VlcktpdCxGYWlsLEUsTmF0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXSxbXCJBc3NldEtpbmRcIixbJGjNj19hID0+IChBc3NldEtpbmQgPSAkaM2PX2EpXV0sW1wibWFrZUlzc3VlcktpdFwiLFskaM2PX2EgPT4gKG1ha2VJc3N1ZXJLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1ByaWNlQXV0aG9yaXR5LCBQcmljZURlc2NyaXB0aW9uLCBQcmljZVF1b3RlLCBQcmljZVF1b3RlVmFsdWUsIFByaWNlUXVlcnksfSBmcm9tICdAYWdvcmljL3pvZS90b29scy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtUaW1lc3RhbXB9IGZyb20gJ0BhZ29yaWMvdGltZSc7XG4gKiBAaW1wb3J0IHtCcmFuZH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge0lzc3VlcktpdH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqL1xuXG4vKiBQcmljZUF1dGhvcml0aWVzIHJldHVybiBxdW90ZXMgYXMgYSBwYWlyIG9mIGFuIGFtb3VudCBhbmQgYSBwYXltZW50LCBib3RoKi9cbi8qIHdpdGggdGhlIHNhbWUgdmFsdWUuIFRoZSB1bmRlcmx5aW5nIGFtb3VudCB3cmFwcyBhbW91bnRJbiwgYW1vdW50T3V0LCB0aW1lciovXG4vKiBhbmQgdGltZXN0YW1wLiBUaGUgcGF5bWVudCBpcyBpc3N1ZWQgYnkgdGhlIHF1b3RlSXNzdWVyIHRvIHN1cHBvcnQgdmVyYWNpdHkqL1xuLyogY2hlY2tpbmcuIFRoZXNlIGhlbHBlcnMgbWFrZSBpdCBlYXNpZXIgdG8gZXh0cmFjdCB0aGUgY29tcG9uZW50cyBvZiB0aGUgUXVvdGUqL1xuXG4vKipcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGVcbiAqIEByZXR1cm5zIHtQcmljZURlc2NyaXB0aW9ufVxuICovXG4gICAgICAgY29uc3QgZ2V0UHJpY2VEZXNjcmlwdGlvbiA9IHF1b3RlID0+IHtcbiAgcXVvdGUucXVvdGVBbW91bnQudmFsdWUubGVuZ3RoID09PSAxIHx8XG4gICAgRmFpbGBxdW90ZUFtb3VudCBzZXQgbXVzdCBoYXZlIG9uZSBtZW1iZXJgO1xuICByZXR1cm4gcXVvdGUucXVvdGVBbW91bnQudmFsdWVbMF07XG59O1xuXG4vKiogQHBhcmFtIHtQcmljZVF1b3RlfSBxdW90ZSAqLyRozY9fb25jZS5nZXRQcmljZURlc2NyaXB0aW9uKGdldFByaWNlRGVzY3JpcHRpb24pO1xuICAgICAgIGNvbnN0IGdldEFtb3VudEluID0gcXVvdGUgPT4gZ2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkuYW1vdW50SW47XG4vKiogQHBhcmFtIHtQcmljZVF1b3RlfSBxdW90ZSAqLyRozY9fb25jZS5nZXRBbW91bnRJbihnZXRBbW91bnRJbik7XG4gICAgICAgY29uc3QgZ2V0QW1vdW50T3V0ID0gcXVvdGUgPT4gZ2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkuYW1vdW50T3V0O1xuLyoqIEB0eXBlIHsocXVvdGU6IFByaWNlUXVvdGUpID0+IFRpbWVzdGFtcH0gKi8kaM2PX29uY2UuZ2V0QW1vdW50T3V0KGdldEFtb3VudE91dCk7XG4gICAgICAgY29uc3QgZ2V0VGltZXN0YW1wID0gcXVvdGUgPT4gZ2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkudGltZXN0YW1wO1xuXG4vKiogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IGJyYW5kICovJGjNj19vbmNlLmdldFRpbWVzdGFtcChnZXRUaW1lc3RhbXApO1xuICAgICAgIGNvbnN0IHVuaXRBbW91bnQgPSBhc3luYyBicmFuZCA9PiB7XG4gIC8qIEJyYW5kIG1ldGhvZHMgYXJlIHJlbW90ZSovXG4gIGNvbnN0IGRpc3BsYXlJbmZvID0gYXdhaXQgRShicmFuZCkuZ2V0RGlzcGxheUluZm8oKTtcbiAgY29uc3QgZGVjaW1hbFBsYWNlcyA9IGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMgPz8gMDtcbiAgcmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCwgMTBuICoqIE5hdChkZWNpbWFsUGxhY2VzKSk7XG59OyRozY9fb25jZS51bml0QW1vdW50KHVuaXRBbW91bnQpO1xuaGFyZGVuKHVuaXRBbW91bnQpO1xuXG4gICAgICAgY29uc3QgbWFrZVByaWNlUXVvdGVJc3N1ZXIgPSAoKSA9PlxuICAvKiogQHR5cGUge0lzc3VlcktpdDwnc2V0JywgUHJpY2VEZXNjcmlwdGlvbj59ICovIChcbiAgICBtYWtlSXNzdWVyS2l0KCdxdW90ZScsIEFzc2V0S2luZC5TRVQpXG4gICk7JGjNj19vbmNlLm1ha2VQcmljZVF1b3RlSXNzdWVyKG1ha2VQcmljZVF1b3RlSXNzdWVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldFByaWNlRGVzY3JpcHRpb24iOlsiZ2V0UHJpY2VEZXNjcmlwdGlvbiJdLCJnZXRBbW91bnRJbiI6WyJnZXRBbW91bnRJbiJdLCJnZXRBbW91bnRPdXQiOlsiZ2V0QW1vdW50T3V0Il0sImdldFRpbWVzdGFtcCI6WyJnZXRUaW1lc3RhbXAiXSwidW5pdEFtb3VudCI6WyJ1bml0QW1vdW50Il0sIm1ha2VQcmljZVF1b3RlSXNzdWVyIjpbIm1ha2VQcmljZVF1b3RlSXNzdWVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFvRqkVjKQAAYykAADMAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbIlJlY29yZGVyS2l0U2hhcGUiLCJkZWZpbmVFUmVjb3JkZXJLaXQiLCJkZWZpbmVSZWNvcmRlcktpdCIsInByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMiLCJwcmVwYXJlUmVjb3JkZXIiLCJwcmVwYXJlUmVjb3JkZXJLaXQiLCJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBTdG9yYWdlTm9kZVNoYXBlLHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCxtYWtlRmFrZU1hcnNoYWxsZXIsbWFrZUZha2VTdG9yYWdlLG11c3RNYXRjaCxNLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxwcmVwYXJlRXhvQ2xhc3MsRmFpbCxFOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiU3RvcmFnZU5vZGVTaGFwZVwiLFskaM2PX2EgPT4gKFN0b3JhZ2VOb2RlU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc1wiLCBbW1wibWFrZUZha2VNYXJzaGFsbGVyXCIsWyRozY9fYSA9PiAobWFrZUZha2VNYXJzaGFsbGVyID0gJGjNj19hKV1dLFtcIm1ha2VGYWtlU3RvcmFnZVwiLFskaM2PX2EgPT4gKG1ha2VGYWtlU3RvcmFnZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybiwgRVJlbW90ZSwgUmVtb3RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0VNYXJzaGFsbGVyfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyc7XG4gKiBAaW1wb3J0IHtQdWJsaXNoS2l0fSBmcm9tICdAYWdvcmljL25vdGlmaWVyJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnO1xuICogQGltcG9ydCB7U3RvcmFnZU5vZGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbi8qKlxuICogUmVjb3JkZXJzIHN1cHBvcnQgcHVibGlzaGluZyBkYXRhIHRvIHZzdG9yYWdlLlxuICpcbiAqIGBSZWNvcmRlcmAgaXMgc2ltaWxhciB0byBgUHVibGlzaGVyYCAoaW4gdGhhdCB0aGV5IHNlbmQgb3V0IGRhdGEpIGJ1dCBoYXMgZGlmZmVyZW50IHNpZ25hdHVyZXM6XG4gKiAtIG1ldGhvZHMgYXJlIGFzeW5jIGJlY2F1c2UgdGhleSBhd2FpdCByZW1vdGUgY2FsbHMgdG8gTWFyc2hhbGxlciBhbmQgU3RvcmFnZU5vZGVcbiAqIC0gbWV0aG9kIG5hbWVzIGNvbnZleSB0aGUgZHVyYWJpbGl0eVxuICogLSBvbWl0cyBmYWlsKClcbiAqIC0gYWRkcyBnZXRTdG9yYWdlTm9kZSgpIGZyb20gaXRzIGR1cmFibGUgc3RhdGVcbiAqXG4gKiBPdGhlciBuYW1lcyBzdWNoIGFzIFN0b3JlZFB1Ymxpc2hlciBvciBDaGFpblN0b3JhZ2VQdWJsaXNoZXIgd2VyZSBjb25zaWRlcmVkLCBidXQgZm91bmQgdG8gYmUgc29tZXRpbWVzIGNvbmZ1c2VkIHdpdGggKmR1cmFiaWxpdHkqLCBhbm90aGVyIHRyYWl0IG9mIHRoaXMgY2xhc3MuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3sgZ2V0U3RvcmFnZU5vZGUoKTogUmVtb3RlPFN0b3JhZ2VOb2RlPiwgZ2V0U3RvcmFnZVBhdGgoKTogUHJvbWlzZTxzdHJpbmc+LCB3cml0ZSh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4sIHdyaXRlRmluYWwodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IH19IFJlY29yZGVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1BpY2s8UHVibGlzaEtpdDxUPiwgJ3N1YnNjcmliZXInPiAmIHsgcmVjb3JkZXI6IFJlY29yZGVyPFQ+IH19IFJlY29yZGVyS2l0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1BpY2s8UHVibGlzaEtpdDxUPiwgJ3N1YnNjcmliZXInPiAmIHsgcmVjb3JkZXJQOiBFUmVmPFJlY29yZGVyPFQ+PiB9fSBFdmVudHVhbFJlY29yZGVyS2l0XG4gKi9cblxuLyoqXG4gKiBXcmFwIGEgUHVibGlzaGVyIHRvIHJlY29yZCBhbGwgdGhlIHZhbHVlcyB0byBjaGFpbiBzdG9yYWdlLlxuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVJlY29yZGVyID0gKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpID0+IHtcbiAgY29uc3QgbWFrZVJlY29yZGVyID0gcHJlcGFyZUV4b0NsYXNzKFxuICAgIGJhZ2dhZ2UsXG4gICAgJ1JlY29yZGVyJyxcbiAgICBNLmludGVyZmFjZSgnUmVjb3JkZXInLCB7XG4gICAgICBnZXRTdG9yYWdlTm9kZTogTS5jYWxsKCkucmV0dXJucyhTdG9yYWdlTm9kZVNoYXBlKSxcbiAgICAgIGdldFN0b3JhZ2VQYXRoOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgvKiBzdHJpbmcgKi8pKSxcbiAgICAgIHdyaXRlOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICB3cml0ZUZpbmFsOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgfSksXG4gICAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQdWJsaXNoS2l0PFQ+WydwdWJsaXNoZXInXX0gcHVibGlzaGVyXG4gKiBAcGFyYW0ge1JlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge1R5cGVkUGF0dGVybjxhbnk+fSBbdmFsdWVTaGFwZV1cbiAqL1xuICAgIChcbiAgICAgIHB1Ymxpc2hlcixcbiAgICAgIHN0b3JhZ2VOb2RlLFxuICAgICAgdmFsdWVTaGFwZSA9IC8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPGFueT59ICovIChNLmFueSgpKSxcbiAgICApID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgICAgIHB1Ymxpc2hlcixcbiAgICAgICAgc3RvcmFnZU5vZGUsXG4gICAgICAgIHN0b3JhZ2VQYXRoOiAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi8gKHVuZGVmaW5lZCksXG4gICAgICAgIHZhbHVlU2hhcGUsXG4gICAgICB9O1xuICAgIH0sXG4gICAge1xuICAgICAgZ2V0U3RvcmFnZU5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnN0b3JhZ2VOb2RlO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICogTWVtb2l6ZXMgdGhlIHJlbW90ZSBjYWxsIHRvIHRoZSBzdG9yYWdlIG5vZGVcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICovXG4gICAgICBhc3luYyBnZXRTdG9yYWdlUGF0aCgpIHtcbiAgICAgICAgY29uc3QgeyBzdG9yYWdlUGF0aDogaGVsZFBhdGggfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIC8qIGVuZCBzeW5jaHJvbm91cyBwcmVsdWRlKi9cbiAgICAgICAgYXdhaXQgbnVsbDtcbiAgICAgICAgaWYgKGhlbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGVsZFBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IEUodGhpcy5zdGF0ZS5zdG9yYWdlTm9kZSkuZ2V0UGF0aCgpO1xuICAgICAgICB0aGlzLnN0YXRlLnN0b3JhZ2VQYXRoID0gcGF0aDtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9LFxuICAgICAgLyoqXG4gKiBNYXJzaGFsbHMgYmVmb3JlIHdyaXRpbmcgdG8gc3RvcmFnZSBvciBwdWJsaXNoZXIgdG8gaGVscCBlbnN1cmUgdGhlIHR3byBzdHJlYW1zIG1hdGNoLlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbiAgICAgIGFzeW5jIHdyaXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgY2xvc2VkLCBwdWJsaXNoZXIsIHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAhY2xvc2VkIHx8IEZhaWxgY2Fubm90IHdyaXRlIHRvIGNsb3NlZCByZWNvcmRlcmA7XG4gICAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSk7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgICAgYXdhaXQgRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG5cbiAgICAgICAgLyogYmVsb3cgaGVyZSBkaWZmZXJzIGZyb20gd3JpdGVGaW5hbCgpKi9cbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hlci5wdWJsaXNoKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAqIExpa2UgYHdyaXRlYCBidXQgcHJldmVudHMgZnV0dXJlIHdyaXRlcyBhbmQgdGVybWluYXRlcyB0aGUgcHVibGlzaGVyLlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbiAgICAgIGFzeW5jIHdyaXRlRmluYWwodmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBjbG9zZWQsIHB1Ymxpc2hlciwgc3RvcmFnZU5vZGUsIHZhbHVlU2hhcGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICFjbG9zZWQgfHwgRmFpbGBjYW5ub3Qgd3JpdGUgdG8gY2xvc2VkIHJlY29yZGVyYDtcbiAgICAgICAgbXVzdE1hdGNoKHZhbHVlLCB2YWx1ZVNoYXBlKTtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbHVlKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuICAgICAgICBhd2FpdCBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkKTtcblxuICAgICAgICAvKiBiZWxvdyBoZXJlIGRpZmZlcnMgZnJvbSB3cml0ZSgpKi9cbiAgICAgICAgdGhpcy5zdGF0ZS5jbG9zZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcHVibGlzaGVyLmZpbmlzaCh2YWx1ZSk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIG1ha2VSZWNvcmRlcjtcbn07JGjNj19vbmNlLnByZXBhcmVSZWNvcmRlcihwcmVwYXJlUmVjb3JkZXIpO1xuaGFyZGVuKHByZXBhcmVSZWNvcmRlcik7XG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIHByZXBhcmVSZWNvcmRlcj59IE1ha2VSZWNvcmRlciAqL1xuXG4vKipcbiAqIGBtYWtlUmVjb3JkZXJLaXRgIGlzIHN1aXRhYmxlIGZvciBtYWtpbmcgYSBkdXJhYmxlIGBSZWNvcmRlcktpdGAgd2hpY2ggY2FuIGJlIGhlbGQgaW4gRXhvIHN0YXRlLlxuICpcbiAqIEBzZWUge2RlZmluZUVSZWNvcmRlcktpdH1cbiAqXG4gKiBAcGFyYW0ge3ttYWtlUmVjb3JkZXI6IE1ha2VSZWNvcmRlciwgbWFrZUR1cmFibGVQdWJsaXNoS2l0OiBSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQ+fX0gbWFrZXJzXG4gKi9cbiAgICAgICBjb25zdCBkZWZpbmVSZWNvcmRlcktpdCA9ICh7IG1ha2VSZWNvcmRlciwgbWFrZUR1cmFibGVQdWJsaXNoS2l0IH0pID0+IHtcbiAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtUeXBlZFBhdHRlcm48VD59IFt2YWx1ZVNoYXBlXVxuICogQHJldHVybnMge1JlY29yZGVyS2l0PFQ+fVxuICovXG4gIGNvbnN0IG1ha2VSZWNvcmRlcktpdCA9IChzdG9yYWdlTm9kZSwgdmFsdWVTaGFwZSkgPT4ge1xuICAgIGNvbnN0IHsgc3Vic2NyaWJlciwgcHVibGlzaGVyIH0gPSBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQoKTtcbiAgICBjb25zdCByZWNvcmRlciA9IG1ha2VSZWNvcmRlcihwdWJsaXNoZXIsIHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlKTtcbiAgICByZXR1cm4gaGFyZGVuKHsgc3Vic2NyaWJlciwgcmVjb3JkZXIgfSk7XG4gIH07XG4gIHJldHVybiBtYWtlUmVjb3JkZXJLaXQ7XG59O1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBkZWZpbmVSZWNvcmRlcktpdD59IE1ha2VSZWNvcmRlcktpdCAqL1xuXG4vKipcbiAqIGBtYWtlRVJlY29yZGVyS2l0YCBpcyBmb3IgY2xvc3VyZXMgdGhhdCBtdXN0IHJldHVybiBhIGBzdWJzY3JpYmVyYCBzeW5jaHJvbm91c2x5IGJ1dCBjYW4gZGVmZXIgdGhlIGByZWNvcmRlcmAuXG4gKlxuICogQHNlZSB7ZGVmaW5lUmVjb3JkZXJLaXR9XG4gKlxuICogQHBhcmFtIHt7bWFrZVJlY29yZGVyOiBNYWtlUmVjb3JkZXIsIG1ha2VEdXJhYmxlUHVibGlzaEtpdDogUmV0dXJuVHlwZTx0eXBlb2YgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Pn19IG1ha2Vyc1xuICovJGjNj19vbmNlLmRlZmluZVJlY29yZGVyS2l0KGRlZmluZVJlY29yZGVyS2l0KTtcbiAgICAgICBjb25zdCBkZWZpbmVFUmVjb3JkZXJLaXQgPSAoeyBtYWtlUmVjb3JkZXIsIG1ha2VEdXJhYmxlUHVibGlzaEtpdCB9KSA9PiB7XG4gIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlUFxuICogQHBhcmFtIHtUeXBlZFBhdHRlcm48VD59IFt2YWx1ZVNoYXBlXVxuICogQHJldHVybnMge0V2ZW50dWFsUmVjb3JkZXJLaXQ8VD59XG4gKi9cbiAgY29uc3QgbWFrZUVSZWNvcmRlcktpdCA9IChzdG9yYWdlTm9kZVAsIHZhbHVlU2hhcGUpID0+IHtcbiAgICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZUR1cmFibGVQdWJsaXNoS2l0KCk7XG4gICAgY29uc3QgcmVjb3JkZXJQID0gRS53aGVuKHN0b3JhZ2VOb2RlUCwgc3RvcmFnZU5vZGUgPT5cbiAgICAgIG1ha2VSZWNvcmRlcihwdWJsaXNoZXIsIHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlKSxcbiAgICApO1xuICAgIHJldHVybiB7IHN1YnNjcmliZXIsIHJlY29yZGVyUCB9O1xuICB9O1xuICByZXR1cm4gbWFrZUVSZWNvcmRlcktpdDtcbn07JGjNj19vbmNlLmRlZmluZUVSZWNvcmRlcktpdChkZWZpbmVFUmVjb3JkZXJLaXQpO1xuaGFyZGVuKGRlZmluZUVSZWNvcmRlcktpdCk7XG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIGRlZmluZUVSZWNvcmRlcktpdD59IE1ha2VFUmVjb3JkZXJLaXQgKi9cblxuLyoqXG4gKiBDb252ZW5pZW5jZSB3cmFwcGVyIHRvIHByZXBhcmUgdGhlIER1cmFibGVQdWJsaXNoS2l0IGFuZCBSZWNvcmRlciBraW5kcy5cbiAqIE5vdGUgdGhhdCBiZWNhdXNlIHByZXBhcmVSZWNvcmRlcigpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBiYWdnYWdlLFxuICogdGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gbmVlZCBmb3IgYW4gRXZlbnR1YWxSZWNvcmRlcktpdC5cbiAqIFdoZW4gdGhlcmUgaXMsIHByZXBhcmUgdGhlIGtpbmRzIHNlcGFyYXRlbHkgYW5kIHBhc3MgdG8gdGhlIGtpdCBkZWZpbmVycy5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVSZWNvcmRlcktpdCA9IChiYWdnYWdlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGNvbnN0IG1ha2VEdXJhYmxlUHVibGlzaEtpdCA9IHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChcbiAgICBiYWdnYWdlLFxuICAgICdEdXJhYmxlIFB1Ymxpc2ggS2l0JyxcbiAgKTtcbiAgY29uc3QgbWFrZVJlY29yZGVyID0gcHJlcGFyZVJlY29yZGVyKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpO1xuICByZXR1cm4gZGVmaW5lUmVjb3JkZXJLaXQoeyBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQsIG1ha2VSZWNvcmRlciB9KTtcbn07XG5cbi8qKlxuICogQ29udmVuaWVuY2Ugd3JhcHBlciBmb3IgRHVyYWJsZVB1Ymxpc2hLaXQgYW5kIFJlY29yZGVyIGtpbmRzLlxuICpcbiAqIE5COiB0aGlzIGRlZmluZXMgdHdvIGR1cmFibGUga2luZHMuIE11c3QgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBwZXIgYmFnZ2FnZS5cbiAqXG4gKiBgbWFrZVJlY29yZGVyS2l0YCBpcyBzdWl0YWJsZSBmb3IgbWFraW5nIGEgZHVyYWJsZSBgUmVjb3JkZXJLaXRgIHdoaWNoIGNhbiBiZSBoZWxkIGluIEV4byBzdGF0ZS5cbiAqIGBtYWtlRVJlY29yZGVyS2l0YCBpcyBmb3IgY2xvc3VyZXMgdGhhdCBtdXN0IHJldHVybiBhIGBzdWJzY3JpYmVyYCBzeW5jaHJvbm91c2x5IGJ1dCBjYW4gZGVmZXIgdGhlIGByZWNvcmRlcmAuXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKi8kaM2PX29uY2UucHJlcGFyZVJlY29yZGVyS2l0KHByZXBhcmVSZWNvcmRlcktpdCk7XG4gICAgICAgY29uc3QgcHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzID0gKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpID0+IHtcbiAgY29uc3QgbWFrZUR1cmFibGVQdWJsaXNoS2l0ID0gcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ0R1cmFibGUgUHVibGlzaCBLaXQnLFxuICApO1xuICBjb25zdCBtYWtlUmVjb3JkZXIgPSBwcmVwYXJlUmVjb3JkZXIoYmFnZ2FnZSwgbWFyc2hhbGxlcik7XG5cbiAgY29uc3QgbWFrZVJlY29yZGVyS2l0ID0gZGVmaW5lUmVjb3JkZXJLaXQoe1xuICAgIG1ha2VSZWNvcmRlcixcbiAgICBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQsXG4gIH0pO1xuICBjb25zdCBtYWtlRVJlY29yZGVyS2l0ID0gZGVmaW5lRVJlY29yZGVyS2l0KHtcbiAgICBtYWtlUmVjb3JkZXIsXG4gICAgbWFrZUR1cmFibGVQdWJsaXNoS2l0LFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG1ha2VEdXJhYmxlUHVibGlzaEtpdCxcbiAgICBtYWtlUmVjb3JkZXIsXG4gICAgbWFrZVJlY29yZGVyS2l0LFxuICAgIG1ha2VFUmVjb3JkZXJLaXQsXG4gIH07XG59O1xuXG4vKipcbiAqIEZvciB1c2UgaW4gdGVzdHNcbiAqLyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMocHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKTtcbiAgICAgICBjb25zdCBwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzID0gKCkgPT4ge1xuICBjb25zdCBiYWdnYWdlID0gbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdtb2NrIHJlY29yZGVyIGJhZ2dhZ2UnKTtcbiAgY29uc3QgbWFyc2hhbGxlciA9IG1ha2VGYWtlTWFyc2hhbGxlcigpO1xuICByZXR1cm4ge1xuICAgIC4uLnByZXBhcmVSZWNvcmRlcktpdE1ha2VycyhiYWdnYWdlLCBtYXJzaGFsbGVyKSxcbiAgICBzdG9yYWdlTm9kZTogbWFrZUZha2VTdG9yYWdlKCdtb2NrIHJlY29yZGVyIHN0b3JhZ2UnKSxcbiAgfTtcbn07JGjNj19vbmNlLnByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMocHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2Vycyk7XG5cbiAgICAgICBjb25zdCBSZWNvcmRlcktpdFNoYXBlID0ge1xuICByZWNvcmRlcjogTS5yZW1vdGFibGUoKSxcbiAgc3Vic2NyaWJlcjogTS5yZW1vdGFibGUoKSxcbn07JGjNj19vbmNlLlJlY29yZGVyS2l0U2hhcGUoUmVjb3JkZXJLaXRTaGFwZSk7XG5oYXJkZW4oUmVjb3JkZXJLaXRTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUmVjb3JkZXIiOlsicHJlcGFyZVJlY29yZGVyIl0sImRlZmluZVJlY29yZGVyS2l0IjpbImRlZmluZVJlY29yZGVyS2l0Il0sImRlZmluZUVSZWNvcmRlcktpdCI6WyJkZWZpbmVFUmVjb3JkZXJLaXQiXSwicHJlcGFyZVJlY29yZGVyS2l0IjpbInByZXBhcmVSZWNvcmRlcktpdCJdLCJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMiOlsicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIl0sInByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMiOlsicHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyJdLCJSZWNvcmRlcktpdFNoYXBlIjpbIlJlY29yZGVyS2l0U2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKK+k+uwEAADsBAAANwAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZVN0YXRlTWFjaGluZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dXV1dKTtcblxuLyogYWxsb3dlZFRyYW5zaXRpb25zIGlzIGFuIGFycmF5IG9mIGFycmF5cyB3aGljaCBnZXRzIHR1cm5lZCBpbnRvIGFcbiAqIG1hcC4gVGhlIG1hcCBtYXBzIHN0cmluZyBzdGF0ZXMgdG8gYW4gYXJyYXkgb2YgcG90ZW50aWFsIG5leHRcbiAqIHN0YXRlcy4gRm9yIGV4YW1wbGUsXG4gKiBjb25zdCBhbGxvd2VkVHJhbnNpdGlvbnMgPSBbXG4gWydvcGVuJywgWydjbG9zZWQnXV0sXG4gWydjbG9zZWQnLCBbXV0sXG4gKiBdO1xuKi9cbmNvbnN0IG1ha2VTdGF0ZU1hY2hpbmUgPSAoaW5pdGlhbFN0YXRlLCBhbGxvd2VkVHJhbnNpdGlvbnNBcnJheSkgPT4ge1xuICBsZXQgc3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gIGNvbnN0IGFsbG93ZWRUcmFuc2l0aW9ucyA9IG5ldyBNYXAoYWxsb3dlZFRyYW5zaXRpb25zQXJyYXkpO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBjYW5UcmFuc2l0aW9uVG86IG5leHRTdGF0ZSA9PlxuICAgICAgYWxsb3dlZFRyYW5zaXRpb25zLmdldChzdGF0ZSkuaW5jbHVkZXMobmV4dFN0YXRlKSxcbiAgICB0cmFuc2l0aW9uVG86IG5leHRTdGF0ZSA9PiB7XG4gICAgICBhc3NlcnQoYWxsb3dlZFRyYW5zaXRpb25zLmdldChzdGF0ZSkuaW5jbHVkZXMobmV4dFN0YXRlKSk7XG4gICAgICBzdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICB9LFxuICAgIGdldFN0YXR1czogXyA9PiBzdGF0ZSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlU3RhdGVNYWNoaW5lKG1ha2VTdGF0ZU1hY2hpbmUpO1xuaGFyZGVuKG1ha2VTdGF0ZU1hY2hpbmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN0YXRlTWFjaGluZSI6WyJtYWtlU3RhdGVNYWNoaW5lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI0ZVBcGBgAABgYAADUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiY2FsY3VsYXRlTWVkaWFuIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFR5cGVkTWF0aFxuICogQHByb3BlcnR5IHsoYTogVCwgYjogVCkgPT4gVH0gYWRkXG4gKiBAcHJvcGVydHkgeyhhOiBULCBiOiBiaWdpbnQpID0+IFR9IGRpdmlkZVxuICogQHByb3BlcnR5IHsoYTogVCwgYjogVCkgPT4gYm9vbGVhbn0gaXNHVEVcbiAqL1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgbWVkaWFuIG9mIGEgc2V0IG9mIHNhbXBsZXNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtBcnJheTxUPn0gc2FtcGxlcyB0aGUgaW5wdXQgbWVhc3VyZW1lbnRzXG4gKiBAcGFyYW0ge1R5cGVkTWF0aDxUPn0gbWF0aFxuICogQHJldHVybnMge1QgfCB1bmRlZmluZWR9IHRoZSBtZWRpYW4gKHVuZGVmaW5lZCBpZiBubyBzYW1wbGVzKVxuICovXG4gICAgICAgY29uc3QgY2FsY3VsYXRlTWVkaWFuID0gKHNhbXBsZXMsIG1hdGgpID0+IHtcbiAgY29uc3Qgc29ydGVkID0gc2FtcGxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKCFtYXRoLmlzR1RFKGEsIGIpKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmICghbWF0aC5pc0dURShiLCBhKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9KTtcblxuICBpZiAoc29ydGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIC8qIE5vIHZhbGlkIHNhbXBsZXMsIGRvbid0IHJlcG9ydCBhbnl0aGluZy4qL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoc29ydGVkLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAvKiBPZGQgbGVuZ3RoLCBqdXN0IHBpY2sgdGhlIG1pZGRsZSBlbGVtZW50LiovXG4gICAgcmV0dXJuIHNvcnRlZFsoc29ydGVkLmxlbmd0aCAtIDEpIC8gMl07XG4gIH1cblxuICAvKiBFdmVuIGxlbmd0aCwgdGFrZSB0aGUgbWVhbiBvZiB0aGUgdHdvIG1pZGRsZSB2YWx1ZXMuKi9cbiAgY29uc3Qgc2Vjb25kSW5kZXggPSBzb3J0ZWQubGVuZ3RoIC8gMjtcbiAgY29uc3Qgc3VtID0gbWF0aC5hZGQoc29ydGVkW3NlY29uZEluZGV4IC0gMV0sIHNvcnRlZFtzZWNvbmRJbmRleF0pO1xuICByZXR1cm4gbWF0aC5kaXZpZGUoc3VtLCAybik7XG59OyRozY9fb25jZS5jYWxjdWxhdGVNZWRpYW4oY2FsY3VsYXRlTWVkaWFuKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGN1bGF0ZU1lZGlhbiI6WyJjYWxjdWxhdGVNZWRpYW4iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYwjL1L8JAAC/CQAAMQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC90b3BpY3MuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJQdWJsaWNUb3BpY1NoYXBlIiwiU3Vic2NyaWJlclNoYXBlIiwiVG9waWNzUmVjb3JkU2hhcGUiLCJtYWtlUmVjb3JkZXJUb3BpYyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFN1YnNjcmliZXJTaGFwZSxNLEU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIixbJGjNj19hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaM2PX2EpLCRozY9fbGl2ZVtcIlN1YnNjcmliZXJTaGFwZVwiXV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgIGNvbnN0IFB1YmxpY1RvcGljU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAgc3Vic2NyaWJlcjogU3Vic2NyaWJlclNoYXBlLFxuICAgIHN0b3JhZ2VQYXRoOiBNLm9yKE0ucHJvbWlzZSgvKiBzdHJpbmcgKi8pLCBNLnN0cmluZygpKSxcbiAgfSxcbiAgeyBkZXNjcmlwdGlvbjogTS5zdHJpbmcoKSB9LFxuKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gVCB0b3BpYyB2YWx1ZVxuICogQHR5cGVkZWYge3tcbiAqICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gKiAgIHN1YnNjcmliZXI6IFN1YnNjcmliZXI8VD4sXG4gKiAgIHN0b3JhZ2VQYXRoOiBFUmVmPHN0cmluZz4sXG4gKiB9fSBQdWJsaWNUb3BpY1xuICovXG5cbi8qKlxuICogQSB7UHVibGljVG9waWN9IGluIHdoaWNoIHRoZSBgc3RvcmFnZVBhdGhgIGlzIGFsd2F5cyBhIHJlc29sdmVkIHN0cmluZyBhbmQgdGhlIGBzdWJzY3JpYmVyIGlzIHJlbW90ZS5cbiAqXG4gKiBVc2VmdWwgd2hlbiB3b3JraW5nIHdpdGggVm93cyBhbmQgYXN5bmMtZmxvdy5cbiAqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gVCB0b3BpYyB2YWx1ZVxuICogQHR5cGVkZWYge3tcbiAqICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gKiAgIHN1YnNjcmliZXI6IFJlbW90ZTxTdWJzY3JpYmVyPFQ+PixcbiAqICAgc3RvcmFnZVBhdGg6IHN0cmluZyxcbiAqIH19IFJlc29sdmVkUHVibGljVG9waWNcbiAqLyRozY9fb25jZS5QdWJsaWNUb3BpY1NoYXBlKFB1YmxpY1RvcGljU2hhcGUpO1xuXG4gICAgICAgY29uc3QgVG9waWNzUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKE0uc3RyaW5nKCksIFB1YmxpY1RvcGljU2hhcGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFt0b3BpY05hbWU6IHN0cmluZ106IFB1YmxpY1RvcGljPHVua25vd24+LFxuICogfX0gVG9waWNzUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBbdG9waWNOYW1lOiBzdHJpbmddOiBSZXNvbHZlZFB1YmxpY1RvcGljPHVua25vd24+LFxuICogfX0gUmVzb2x2ZWRUb3BpY3NSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwYXJhbSB7UmVjb3JkZXJLaXQ8VD4gfCBFdmVudHVhbFJlY29yZGVyS2l0PFQ+fSByZWNvcmRlcktpdFxuICogQHJldHVybnMge1B1YmxpY1RvcGljPFQ+fVxuICovJGjNj19vbmNlLlRvcGljc1JlY29yZFNoYXBlKFRvcGljc1JlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBtYWtlUmVjb3JkZXJUb3BpYyA9IChkZXNjcmlwdGlvbiwgcmVjb3JkZXJLaXQpID0+IHtcbiAgY29uc3QgcmVjUCA9XG4gICAgJ3JlY29yZGVyJyBpbiByZWNvcmRlcktpdCA/IHJlY29yZGVyS2l0LnJlY29yZGVyIDogcmVjb3JkZXJLaXQucmVjb3JkZXJQO1xuICByZXR1cm4ge1xuICAgIGRlc2NyaXB0aW9uLFxuICAgIHN1YnNjcmliZXI6IHJlY29yZGVyS2l0LnN1YnNjcmliZXIsXG4gICAgc3RvcmFnZVBhdGg6IEUocmVjUCkuZ2V0U3RvcmFnZVBhdGgoKSxcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VSZWNvcmRlclRvcGljKG1ha2VSZWNvcmRlclRvcGljKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7IlN1YnNjcmliZXJTaGFwZSI6WyJTdWJzY3JpYmVyU2hhcGUiLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQdWJsaWNUb3BpY1NoYXBlIjpbIlB1YmxpY1RvcGljU2hhcGUiXSwiVG9waWNzUmVjb3JkU2hhcGUiOlsiVG9waWNzUmVjb3JkU2hhcGUiXSwibWFrZVJlY29yZGVyVG9waWMiOlsibWFrZVJlY29yZGVyVG9waWMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwa5TcJM9AACTPQAANQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsIi4vYXRvbWljVHJhbnNmZXIuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRJc3N1ZXJLZXl3b3JkcyIsImFzc2VydE5hdEFzc2V0S2luZCIsImFzc2VydFByb3Bvc2FsU2hhcGUiLCJkZWZhdWx0QWNjZXB0YW5jZU1zZyIsImRlcG9zaXRUb1NlYXQiLCJkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyIsImZpdFByb3Bvc2FsU2hhcGUiLCJtYXBLZXl3b3JkcyIsIm9mZmVyVG8iLCJzYXRpc2ZpZXMiLCJzYXZlQWxsSXNzdWVycyIsInN3YXAiLCJzd2FwRXhhY3QiLCJ3aXRoZHJhd0Zyb21TZWF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQXNzZXRLaW5kLGZyb21VbmlxdWVFbnRyaWVzLGtleUVRLG11c3RNYXRjaCxGYWlsLEUsbWFrZVByb21pc2VLaXQsc2F0aXNmaWVzV2FudCxhdG9taWNUcmFuc2Zlcixmcm9tT25seSx0b09ubHk7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFzc2V0S2luZFwiLFskaM2PX2EgPT4gKEFzc2V0S2luZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc1wiLCBbW1wic2F0aXNmaWVzV2FudFwiLFskaM2PX2EgPT4gKHNhdGlzZmllc1dhbnQgPSAkaM2PX2EpXV1dXSxbXCIuL2F0b21pY1RyYW5zZmVyLmpzXCIsIFtbXCJhdG9taWNUcmFuc2ZlclwiLFskaM2PX2EgPT4gKGF0b21pY1RyYW5zZmVyID0gJGjNj19hKV1dLFtcImZyb21Pbmx5XCIsWyRozY9fYSA9PiAoZnJvbU9ubHkgPSAkaM2PX2EpXV0sW1widG9Pbmx5XCIsWyRozY9fYSA9PiAodG9Pbmx5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1BhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge0Ftb3VudEtleXdvcmRSZWNvcmQsIENvbnRyYWN0TWV0YSwgSW52aXRhdGlvbiwgSXNzdWVyS2V5d29yZFJlY29yZCwgS2V5d29yZCwgUGF5bWVudFBLZXl3b3JkUmVjb3JkLCBQcm9wb3NhbCwgUHJvcG9zYWxSZWNvcmQsIFVzZXJTZWF0LCBaQ0YsIFpDRlNlYXR9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0tleXdvcmRLZXl3b3JkUmVjb3JkLCBNYXBLZXl3b3JkcywgUmV2ZXJzZSwgU3dhcCwgU3dhcEV4YWN0fSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0FsbG9jYXRpb259IGZyb20gJy4uL2NvbnRyYWN0RmFjZXQvdHlwZXMudHMnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbiAgICAgICBjb25zdCBkZWZhdWx0QWNjZXB0YW5jZU1zZyA9IGBUaGUgb2ZmZXIgaGFzIGJlZW4gYWNjZXB0ZWQuIE9uY2UgdGhlIGNvbnRyYWN0IGhhcyBiZWVuIGNvbXBsZXRlZCwgcGxlYXNlIGNoZWNrIHlvdXIgcGF5b3V0YDskaM2PX29uY2UuZGVmYXVsdEFjY2VwdGFuY2VNc2coZGVmYXVsdEFjY2VwdGFuY2VNc2cpO1xuXG5jb25zdCBnZXRLZXlzU29ydGVkID0gb2JqID0+IGhhcmRlbihSZWZsZWN0Lm93bktleXMob2JqIHx8IHt9KS5zb3J0KCkpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0SXNzdWVyS2V5d29yZHMgPSAoemNmLCBleHBlY3RlZCkgPT4ge1xuICBjb25zdCB7IGlzc3VlcnMgfSA9IHpjZi5nZXRUZXJtcygpO1xuICBjb25zdCBhY3R1YWwgPSBnZXRLZXlzU29ydGVkKGlzc3VlcnMpO1xuICBleHBlY3RlZCA9IFsuLi5leHBlY3RlZF07IC8qIGluIGNhc2UgaGFyZGVuZWQqL1xuICBleHBlY3RlZC5zb3J0KCk7XG4gIGtleUVRKGFjdHVhbCwgaGFyZGVuKGV4cGVjdGVkKSkgfHxcbiAgICBGYWlsYGtleXdvcmRzOiAke2FjdHVhbH0gd2VyZSBub3QgYXMgZXhwZWN0ZWQ6ICR7ZXhwZWN0ZWR9YDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWmNmU2VhdFBhcnRpYWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvcG9zYWxSZWNvcmR9IGdldFByb3Bvc2FsXG4gKiBAcHJvcGVydHkgeygpID0+IEFsbG9jYXRpb259IGdldEN1cnJlbnRBbGxvY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGFuIHVwZGF0ZSB0byBjdXJyZW50QWxsb2NhdGlvbiBzYXRpc2ZpZXNcbiAqIHByb3Bvc2FsLndhbnQuIE5vdGUgdGhhdCB0aGlzIGlzIGhhbGYgb2YgdGhlIG9mZmVyIHNhZmV0eVxuICogY2hlY2s7IHdoZXRoZXIgdGhlIGFsbG9jYXRpb24gY29uc3RpdHV0ZXMgYSByZWZ1bmQgaXMgbm90XG4gKiBjaGVja2VkLiBUaGUgdXBkYXRlIGlzIG1lcmdlZCB3aXRoIGN1cnJlbnRBbGxvY2F0aW9uXG4gKiAodXBkYXRlJ3MgdmFsdWVzIHByZXZhaWxpbmcgaWYgdGhlIGtleXdvcmRzIGFyZSB0aGUgc2FtZSlcbiAqIHRvIHByb2R1Y2UgdGhlIG5ld0FsbG9jYXRpb24uIFRoZSByZXR1cm4gdmFsdWUgaXMgMCBmb3JcbiAqIGZhbHNlIGFuZCAxIGZvciB0cnVlLiBXaGVuIG11bHRpcGxlcyBhcmUgaW50cm9kdWNlZCwgYW55XG4gKiBwb3NpdGl2ZSByZXR1cm4gdmFsdWUgd2lsbCBtZWFuIHRydWUuXG4gKlxuICogQHBhcmFtIHthbnl9IF9pZ25vcmVkIG5vIGxvbmdlciB1c2VkLlxuICogQHBhcmFtIHtaY2ZTZWF0UGFydGlhbH0gc2VhdFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSB1cGRhdGVcbiAqIEByZXR1cm5zIHswfDF9XG4gKi8kaM2PX29uY2UuYXNzZXJ0SXNzdWVyS2V5d29yZHMoYXNzZXJ0SXNzdWVyS2V5d29yZHMpO1xuICAgICAgIGNvbnN0IHNhdGlzZmllcyA9IChfaWdub3JlZCwgc2VhdCwgdXBkYXRlKSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRBbGxvY2F0aW9uID0gc2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpO1xuICBjb25zdCBuZXdBbGxvY2F0aW9uID0geyAuLi5jdXJyZW50QWxsb2NhdGlvbiwgLi4udXBkYXRlIH07XG4gIGNvbnN0IHByb3Bvc2FsID0gc2VhdC5nZXRQcm9wb3NhbCgpO1xuICByZXR1cm4gc2F0aXNmaWVzV2FudChwcm9wb3NhbCwgbmV3QWxsb2NhdGlvbik7XG59O1xuXG4vKiogQHR5cGUge1N3YXB9ICovJGjNj19vbmNlLnNhdGlzZmllcyhzYXRpc2ZpZXMpO1xuICAgICAgIGNvbnN0IHN3YXAgPSAoemNmLCBsZWZ0U2VhdCwgcmlnaHRTZWF0KSA9PiB7XG4gIHRyeSB7XG4gICAgemNmLmF0b21pY1JlYXJyYW5nZShcbiAgICAgIGhhcmRlbihbXG4gICAgICAgIFtyaWdodFNlYXQsIGxlZnRTZWF0LCBsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnRdLFxuICAgICAgICBbbGVmdFNlYXQsIHJpZ2h0U2VhdCwgcmlnaHRTZWF0LmdldFByb3Bvc2FsKCkud2FudF0sXG4gICAgICBdKSxcbiAgICApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsZWZ0U2VhdC5mYWlsKGVycik7XG4gICAgcmlnaHRTZWF0LmZhaWwoZXJyKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBsZWZ0U2VhdC5leGl0KCk7XG4gIHJpZ2h0U2VhdC5leGl0KCk7XG4gIHJldHVybiBkZWZhdWx0QWNjZXB0YW5jZU1zZztcbn07XG5cbi8qKiBAdHlwZSB7U3dhcEV4YWN0fSAqLyRozY9fb25jZS5zd2FwKHN3YXApO1xuICAgICAgIGNvbnN0IHN3YXBFeGFjdCA9ICh6Y2YsIGxlZnRTZWF0LCByaWdodFNlYXQpID0+IHtcbiAgdHJ5IHtcbiAgICB6Y2YuYXRvbWljUmVhcnJhbmdlKFxuICAgICAgaGFyZGVuKFtcbiAgICAgICAgZnJvbU9ubHkocmlnaHRTZWF0LCByaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS5naXZlKSxcbiAgICAgICAgZnJvbU9ubHkobGVmdFNlYXQsIGxlZnRTZWF0LmdldFByb3Bvc2FsKCkuZ2l2ZSksXG5cbiAgICAgICAgdG9Pbmx5KGxlZnRTZWF0LCBsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnQpLFxuICAgICAgICB0b09ubHkocmlnaHRTZWF0LCByaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KSxcbiAgICAgIF0pLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxlZnRTZWF0LmZhaWwoZXJyKTtcbiAgICByaWdodFNlYXQuZmFpbChlcnIpO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGxlZnRTZWF0LmV4aXQoKTtcbiAgcmlnaHRTZWF0LmV4aXQoKTtcbiAgcmV0dXJuIGRlZmF1bHRBY2NlcHRhbmNlTXNnO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiBFeHBlY3RlZFJlY29yZFxuICogQHByb3BlcnR5IHtSZWNvcmQ8S2V5d29yZCwgbnVsbD59IFt3YW50XVxuICogQHByb3BlcnR5IHtSZWNvcmQ8S2V5d29yZCwgbnVsbD59IFtnaXZlXVxuICogQHByb3BlcnR5IHtQYXJ0aWFsPFJlY29yZDxrZXlvZiBQcm9wb3NhbFJlY29yZFsnZXhpdCddLCBudWxsPj59IFtleGl0XVxuICovXG5cbi8qKlxuICogQ2hlY2sgdGhlIHNlYXQncyBwcm9wb3NhbCBhZ2FpbnN0IGBwcm9wb3NhbFNoYXBlYC5cbiAqIElmIHRoZSBjbGllbnQgc3VibWl0cyBhbiBvZmZlciB3aGljaCBkb2VzIG5vdCBtYXRjaFxuICogdGhlc2UgZXhwZWN0YXRpb25zLCB0aGUgc2VhdCB3aWxsIGJlIGV4aXRlZCAoYW5kIHBheW1lbnRzIHJlZnVuZGVkKS5cbiAqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7UGF0dGVybn0gcHJvcG9zYWxTaGFwZVxuICovJGjNj19vbmNlLnN3YXBFeGFjdChzd2FwRXhhY3QpO1xuICAgICAgIGNvbnN0IGZpdFByb3Bvc2FsU2hhcGUgPSAoc2VhdCwgcHJvcG9zYWxTaGFwZSkgPT5cbiAgLyogVE9ETyByZW1vdmUgdGhpcyBoYXJkZW4sIG9ibGlnYXRpbmcgb3VyIGNhbGxlciB0byBoYXJkZW4uKi9cbiAgbXVzdE1hdGNoKHNlYXQuZ2V0UHJvcG9zYWwoKSwgaGFyZGVuKHByb3Bvc2FsU2hhcGUpLCAncHJvcG9zYWwnKTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc2VhdCdzIHByb3Bvc2FsIGFnYWluc3QgYW4gYGV4cGVjdGVkYCByZWNvcmQgdGhhdCBzYXlzXG4gKiB3aGF0IFwic2hhcGVcIiBvZiBwcm9wb3NhbCBpcyBhY2NlcHRhYmxlLlxuICpcbiAqIE5vdGUgdGhhdCBieSBvdXIgY3VycmVudCB0ZXJtaW5vbG9neSwgdGhpcyBmdW5jdGlvbiBpcyBtaXNuYW1lZCBiZWNhdXNlXG4gKiB3ZSB1c2VcbiAqIFtcIlNoYXBlXCIgdG8gcmVmZXIgdG8gcGF0dGVybnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9ibG9iL21hc3Rlci9wYWNrYWdlcy9zdG9yZS9zcmMvdHlwZXMuanMjTDU2LUw3NCksXG4gKiBhbmQgdGhlIGBleHBlY3RlZGAgYXJndW1lbnQgaXMgbm90IHN1Y2ggYSBwYXR0ZXJuLiBSYXRoZXIgaXQgaXMgYW4gYWQtaG9jXG4gKiBwYXR0ZXJuLWxpa2Ugc3BlY2lhbCBjYXNlIHJlY29yZCB0aGF0IGlzIGRpZmZlcmVudCBhbmQgbXVjaCBsZXNzIGV4cHJlc3NpdmUuXG4gKlxuICogVGhpcyBFeHBlY3RlZFJlY29yZCBpcyBsaWtlIGEgUHJvcG9zYWwsIGJ1dCB0aGUgYW1vdW50cyBpbiAnd2FudCdcbiAqIGFuZCAnZ2l2ZScgc2hvdWxkIGJlIG51bGw7IHRoZSBleGl0IGNsYXVzZSBzaG91bGQgc3BlY2lmeSBhIHJ1bGUgd2l0aFxuICogbnVsbCBjb250ZW50cy4gSWYgdGhlIGNsaWVudCBzdWJtaXRzIGFuIG9mZmVyIHdoaWNoIGRvZXMgbm90IG1hdGNoXG4gKiB0aGVzZSBleHBlY3RhdGlvbnMsIHRoZSBzZWF0IHdpbGwgYmUgZXhpdGVkIChhbmQgcGF5bWVudHMgcmVmdW5kZWQpLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBvcHRpb25hbCBgcHJvcG9zYWxTaGFwZWAgYXJndW1lbnQgdG8gYG1ha2VJbnZpdGF0aW9uYCB3aXRoXG4gKiBhIGdlbnVpbmUgcGF0dGVybi5cbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtFeHBlY3RlZFJlY29yZH0gZXhwZWN0ZWRcbiAqLyRozY9fb25jZS5maXRQcm9wb3NhbFNoYXBlKGZpdFByb3Bvc2FsU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydFByb3Bvc2FsU2hhcGUgPSAoc2VhdCwgZXhwZWN0ZWQpID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihleHBlY3RlZCwgJ29iamVjdCcpO1xuICAhQXJyYXkuaXNBcnJheShleHBlY3RlZCkgfHwgRmFpbGBFeHBlY3RlZCBtdXN0IGJlIGFuIG5vbi1hcnJheSBvYmplY3RgO1xuICBjb25zdCBhc3NlcnRWYWx1ZXNOdWxsID0gZSA9PiB7XG4gICAgaWYgKGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKGUpKSB7XG4gICAgICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgICAgICAgRmFpbGBUaGUgdmFsdWUgb2YgdGhlIGV4cGVjdGVkIHJlY29yZCBtdXN0IGJlIG51bGwgYnV0IHdhcyAke3ZhbHVlfWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qIEFzc2VydCB2YWx1ZXMgb2YgdGhlIGV4cGVjdGVkIHJlY29yZCBhcmUgYWxsIG51bGwuIFdlIGRvIG5vdCovXG4gIC8qIGNoZWNrIHRoZSB2YWx1ZXMgb2YgdGhlIGFjdHVhbCBwcm9wb3NhbC4qL1xuICBhc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLmdpdmUpO1xuICBhc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLndhbnQpO1xuICBhc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLmV4aXQpO1xuXG4gIGNvbnN0IGFjdHVhbCA9IHNlYXQuZ2V0UHJvcG9zYWwoKTtcbiAgY29uc3QgYXNzZXJ0S2V5cyA9IChhLCBlKSA9PiB7XG4gICAgaWYgKGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5RVEoZ2V0S2V5c1NvcnRlZChhKSwgZ2V0S2V5c1NvcnRlZChlKSkgfHxcbiAgICAgICAgRmFpbGBhY3R1YWwgJHthfSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkICR7ZX1gO1xuICAgIH1cbiAgfTtcbiAgYXNzZXJ0S2V5cyhhY3R1YWwuZ2l2ZSwgZXhwZWN0ZWQuZ2l2ZSk7XG4gIGFzc2VydEtleXMoYWN0dWFsLndhbnQsIGV4cGVjdGVkLndhbnQpO1xuICBhc3NlcnRLZXlzKGFjdHVhbC5leGl0LCBleHBlY3RlZC5leGl0KTtcbn07XG5cbi8qIEdpdmVuIGEgYnJhbmQsIGFzc2VydCB0aGF0IGJyYW5kIGlzIEFzc2V0S2luZC5OQVQuICovJGjNj19vbmNlLmFzc2VydFByb3Bvc2FsU2hhcGUoYXNzZXJ0UHJvcG9zYWxTaGFwZSk7XG4gICAgICAgY29uc3QgYXNzZXJ0TmF0QXNzZXRLaW5kID0gKHpjZiwgYnJhbmQpID0+IHtcbiAgemNmLmdldEFzc2V0S2luZChicmFuZCkgPT09IEFzc2V0S2luZC5OQVQgfHxcbiAgICBGYWlsYGJyYW5kIG11c3QgYmUgQXNzZXRLaW5kLk5BVGA7XG59OyRozY9fb25jZS5hc3NlcnROYXRBc3NldEtpbmQoYXNzZXJ0TmF0QXNzZXRLaW5kKTtcblxuICAgICAgIGNvbnN0IGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnID0gYERlcG9zaXQgYW5kIHJlYWxsb2NhdGlvbiBzdWNjZXNzZnVsLmA7XG5cbi8qKlxuICogRGVwb3NpdCBwYXltZW50cyBzdWNoIHRoYXQgdGhlaXIgYW1vdW50cyBhcmUgcmVhbGxvY2F0ZWQgdG8gYSBzZWF0LlxuICogVGhlIGBhbW91bnRzYCBhbmQgYHBheW1lbnRzYCByZWNvcmRzIG11c3QgaGF2ZSBjb3JyZXNwb25kaW5nXG4gKiBrZXl3b3Jkcy5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHJlY2lwaWVudFNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYW1vdW50c1xuICogQHBhcmFtIHtQYXltZW50UEtleXdvcmRSZWNvcmR9IHBheW1lbnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBgRGVwb3NpdCBhbmQgcmVhbGxvY2F0aW9uIHN1Y2Nlc3NmdWwuYFxuICovJGjNj19vbmNlLmRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKTtcbiAgICAgICBjb25zdCBkZXBvc2l0VG9TZWF0ID0gYXN5bmMgKHpjZiwgcmVjaXBpZW50U2VhdCwgYW1vdW50cywgcGF5bWVudHMpID0+IHtcbiAgIXJlY2lwaWVudFNlYXQuaGFzRXhpdGVkKCkgfHwgRmFpbGBUaGUgcmVjaXBpZW50U2VhdCBjYW5ub3QgaGF2ZSBleGl0ZWQuYDtcblxuICAvKiBXZSB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBvZmZlciB0byBiZSBhYmxlIHRvIGVzY3JvdyBvdXIgcGF5bWVudHMqL1xuICAvKiB3aXRoIFpvZS4qL1xuICBjb25zdCByZWFsbG9jYXRlQWZ0ZXJEZXBvc2l0ID0gdGVtcFNlYXQgPT4ge1xuICAgIC8qIEFmdGVyIHRoZSBhc3NldHMgYXJlIGRlcG9zaXRlZCwgcmVhbGxvY2F0ZSB0aGVtIG9udG8gdGhlIHJlY2lwaWVudCBzZWF0IGFuZCovXG4gICAgLyogZXhpdCB0aGUgdGVtcG9yYXJ5IHNlYXQuIE5vdGUgdGhhdCB0aGUgb2ZmZXJSZXN1bHQgaXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzKi9cbiAgICAvKiBmdW5jdGlvbiwgc28gdGhpcyBzeW5jaHJvbm91cyB0cmFkZSBtdXN0IGhhcHBlbiBiZWZvcmUgdGhlKi9cbiAgICAvKiBvZmZlclJlc3VsdCByZXNvbHZlcy4qL1xuICAgIGF0b21pY1RyYW5zZmVyKHpjZiwgdGVtcFNlYXQsIHJlY2lwaWVudFNlYXQsIGFtb3VudHMpO1xuICAgIHRlbXBTZWF0LmV4aXQoKTtcbiAgICByZXR1cm4gZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2c7XG4gIH07XG4gIGNvbnN0IGludml0YXRpb24gPSB6Y2YubWFrZUludml0YXRpb24oXG4gICAgcmVhbGxvY2F0ZUFmdGVyRGVwb3NpdCxcbiAgICAndGVtcG9yYXJ5IHNlYXQgZm9yIGRlcG9zaXQnLFxuICApO1xuICBjb25zdCBwcm9wb3NhbCA9IGhhcmRlbih7IGdpdmU6IGFtb3VudHMgfSk7XG4gIGhhcmRlbihwYXltZW50cyk7XG4gIC8qIFRvIGVzY3JvdyB0aGUgcGF5bWVudCwgd2UgbXVzdCBnZXQgdGhlIFpvZSBTZXJ2aWNlIGZhY2V0IGFuZCovXG4gIC8qIG1ha2UgYW4gb2ZmZXIqL1xuICBjb25zdCB6b2UgPSB6Y2YuZ2V0Wm9lU2VydmljZSgpO1xuICBjb25zdCB0ZW1wVXNlclNlYXQgPSBFKHpvZSkub2ZmZXIoaW52aXRhdGlvbiwgcHJvcG9zYWwsIHBheW1lbnRzKTtcbiAgLyogVGhpcyB3aWxsIGJlIGEgcHJvbWlzZSBmb3IgdGhlIHN0cmluZzogYERlcG9zaXQgYW5kIHJlYWxsb2NhdGlvbiovXG4gIC8qIHN1Y2Nlc3NmdWwuYCBJdCB3aWxsIG9ubHkgZnVsZmlsbCBhZnRlciB0aGUgYXNzZXRzIGhhdmUgYmVlbiovXG4gIC8qIHN1Y2Nlc3NmdWxseSByZWFsbG9jYXRlZCB0byB0aGUgcmVjaXBpZW50IHNlYXQuKi9cbiAgcmV0dXJuIEUodGVtcFVzZXJTZWF0KS5nZXRPZmZlclJlc3VsdCgpO1xufTtcblxuLyoqXG4gKiBXaXRoZHJhdyBwYXltZW50cyBmcm9tIGEgc2VhdC4gTm90ZSB0aGF0IHdpdGhkcmF3aW5nIHRoZSBhbW91bnRzIG9mXG4gKiB0aGUgcGF5bWVudHMgbXVzdCBub3QgYW5kIGNhbm5vdCB2aW9sYXRlIG9mZmVyIHNhZmV0eSBmb3IgdGhlIHNlYXQuIFRoZVxuICogYGFtb3VudHNgIGFuZCBgcGF5bWVudHNgIHJlY29yZHMgbXVzdCBoYXZlIGNvcnJlc3BvbmRpbmcga2V5d29yZHMuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFtb3VudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnRQS2V5d29yZFJlY29yZD59XG4gKi8kaM2PX29uY2UuZGVwb3NpdFRvU2VhdChkZXBvc2l0VG9TZWF0KTtcbiAgICAgICBjb25zdCB3aXRoZHJhd0Zyb21TZWF0ID0gYXN5bmMgKHpjZiwgc2VhdCwgYW1vdW50cykgPT4ge1xuICAhc2VhdC5oYXNFeGl0ZWQoKSB8fCBGYWlsYFRoZSBzZWF0IGNhbm5vdCBoYXZlIGV4aXRlZC5gO1xuICBjb25zdCB7IHpjZlNlYXQ6IHRlbXBTZWF0LCB1c2VyU2VhdDogdGVtcFVzZXJTZWF0UCB9ID0gemNmLm1ha2VFbXB0eVNlYXRLaXQoKTtcbiAgYXRvbWljVHJhbnNmZXIoemNmLCBzZWF0LCB0ZW1wU2VhdCwgYW1vdW50cyk7XG4gIHRlbXBTZWF0LmV4aXQoKTtcbiAgcmV0dXJuIEUodGVtcFVzZXJTZWF0UCkuZ2V0UGF5b3V0cygpO1xufTtcblxuLyoqXG4gKiBTYXZlIGFsbCBvZiB0aGUgaXNzdWVycyBpbiBhbiBpc3N1ZXJzS2V5d29yZFJlY29yZCB0byBaQ0YsIHVzaW5nXG4gKiB0aGUgbWV0aG9kIGB6Y2Yuc2F2ZUlzc3VlcmAuIFRoaXMgZG9lcyBub3QgZXJyb3IgaWYgYW55IG9mIHRoZSBrZXl3b3Jkc1xuICogYWxyZWFkeSBleGlzdC4gSWYgdGhlIGtleXdvcmQgaXMgYWxyZWFkeSBwcmVzZW50LCBpdCBpcyBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7SXNzdWVyS2V5d29yZFJlY29yZH0gaXNzdWVyS2V5d29yZFJlY29yZCBJc3N1ZXJzIHRvIHNhdmUgdG9cbiAqIFpDRlxuICovJGjNj19vbmNlLndpdGhkcmF3RnJvbVNlYXQod2l0aGRyYXdGcm9tU2VhdCk7XG4gICAgICAgY29uc3Qgc2F2ZUFsbElzc3VlcnMgPSBhc3luYyAoemNmLCBpc3N1ZXJLZXl3b3JkUmVjb3JkID0gaGFyZGVuKHt9KSkgPT4ge1xuICBjb25zdCB7IGlzc3VlcnMgfSA9IHpjZi5nZXRUZXJtcygpO1xuICBjb25zdCBpc3N1ZXJzUFNhdmVkID0gT2JqZWN0LmVudHJpZXMoaXNzdWVyS2V5d29yZFJlY29yZCkubWFwKFxuICAgIChba2V5d29yZCwgaXNzdWVyXSkgPT4ge1xuICAgICAgLyogSWYgdGhlIGtleXdvcmQgZG9lcyBub3QgeWV0IGV4aXN0LCBhZGQgaXQgYW5kIHRoZSovXG4gICAgICAvKiBhc3NvY2lhdGVkIGlzc3Vlci4qL1xuICAgICAgaWYgKGlzc3VlcnNba2V5d29yZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gemNmLnNhdmVJc3N1ZXIoaXNzdWVyLCBrZXl3b3JkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGlzc3VlcnNQU2F2ZWQpO1xufTtcblxuLyoqIEB0eXBlIHtNYXBLZXl3b3Jkc30gKi8kaM2PX29uY2Uuc2F2ZUFsbElzc3VlcnMoc2F2ZUFsbElzc3VlcnMpO1xuICAgICAgIGNvbnN0IG1hcEtleXdvcmRzID0gKGtleXdvcmRSZWNvcmQgPSB7fSwga2V5d29yZE1hcHBpbmcpID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBmcm9tVW5pcXVlRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGtleXdvcmRSZWNvcmQpLm1hcCgoW2tleXdvcmQsIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoa2V5d29yZE1hcHBpbmdba2V5d29yZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBba2V5d29yZCwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBba2V5d29yZE1hcHBpbmdba2V5d29yZF0sIHZhbHVlXTtcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG59O1xuLyoqIEB0eXBlIHtSZXZlcnNlfSAqLyRozY9fb25jZS5tYXBLZXl3b3JkcyhtYXBLZXl3b3Jkcyk7XG5jb25zdCByZXZlcnNlID0gKGtleXdvcmRSZWNvcmQgPSB7fSkgPT4ge1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGZyb21VbmlxdWVFbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoa2V5d29yZFJlY29yZCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFt2YWx1ZSwga2V5XSksXG4gICAgKSxcbiAgKTtcbn07XG5cbi8qKlxuICogTWFrZSBhbiBvZmZlciB0byBhbm90aGVyIGNvbnRyYWN0IGluc3RhbmNlIChsYWJlbGVkIGNvbnRyYWN0QiBiZWxvdyksXG4gKiB3aXRoZHJhd2luZyB0aGUgcGF5bWVudHMgZm9yIHRoZSBvZmZlciBmcm9tIGEgc2VhdCBpbiB0aGUgY3VycmVudFxuICogY29udHJhY3QgaW5zdGFuY2UgKGNvbnRyYWN0QSkgYW5kIGRlcG9zaXRpbmcgdGhlIHBheW91dHMgaW4gYW5vdGhlclxuICogc2VhdCBpbiB0aGUgY3VycmVudCBjb250cmFjdCBpbnN0YW5jZSAoY29udHJhY3RBKS5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiAgIFpvZSBDb250cmFjdCBGYWNldCBmb3IgY29udHJhY3RBXG4gKlxuICogQHBhcmFtIHtFUmVmPEludml0YXRpb248UmVzdWx0LCBBcmdzPj59IGludml0YXRpb25cbiAqICAgSW52aXRhdGlvbiB0byBjb250cmFjdEJcbiAqXG4gKiBAcGFyYW0ge0tleXdvcmRLZXl3b3JkUmVjb3JkIHwgdW5kZWZpbmVkfSBrZXl3b3JkTWFwcGluZ1xuICogICBNYXBwaW5nIG9mIGtleXdvcmRzIHVzZWQgaW4gY29udHJhY3RBIHRvIGtleXdvcmRzIHRvIGJlIHVzZWQgaW5cbiAqICAgY29udHJhY3RCLiBOb3RlIHRoYXQgdGhlIHBhdGh3YXkgdG8gZGVwb3NpdCB0aGUgcGF5b3V0IGJhY2sgdG9cbiAqICAgY29udHJhY3RBIHJldmVyc2VzIHRoaXMgbWFwcGluZy5cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsfSBwcm9wb3NhbFxuICogICBUaGUgcHJvcG9zYWwgZm9yIHRoZSBvZmZlciB0byBiZSBtYWRlIHRvIGNvbnRyYWN0QlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gZnJvbVNlYXRcbiAqICAgVGhlIHNlYXQgaW4gY29udHJhY3RBIHRvIHRha2UgdGhlIG9mZmVyIHBheW1lbnRzIGZyb20uXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBbdG9TZWF0XVxuICogICBUaGUgc2VhdCBpbiBjb250cmFjdEEgdG8gZGVwb3NpdCB0aGUgcGF5b3V0IG9mIHRoZSBvZmZlciB0by5cbiAqICAgSWYgYHRvU2VhdGAgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGRlZmF1bHRzIHRvIHRoZSBgZnJvbVNlYXRgLlxuICpcbiAqIEBwYXJhbSB7QXJnc30gW29mZmVyQXJnc11cbiAqICAgQWRkaXRpb25hbCBjb250cmFjdC1zcGVjaWZpYyBvcHRpb25hbCBhcmd1bWVudHMgaW4gYSByZWNvcmQuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8e3VzZXJTZWF0UHJvbWlzZTogUHJvbWlzZTxVc2VyU2VhdDxSZXN1bHQ+PiwgZGVwb3NpdGVkOiBQcm9taXNlPEFtb3VudEtleXdvcmRSZWNvcmQ+fT59XG4gKiAgIEEgcHJvbWlzZSBmb3IgdGhlIHVzZXJTZWF0IGZvciB0aGUgb2ZmZXIgdG8gdGhlIG90aGVyIGNvbnRyYWN0LCBhbmQgYVxuICogICBwcm9taXNlIChgZGVwb3NpdGVkYCkgd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcGF5b3V0IGZvciB0aGUgb2ZmZXIgaGFzIGJlZW5cbiAqICAgZGVwb3NpdGVkIHRvIHRoZSBgdG9TZWF0YC5cbiAqICAgQW55IGZhaWx1cmVzIG9mIHRoZSBpbnZpdGF0aW9uIHdpbGwgYmUgcmV0dXJuZWQgYnkgYHVzZXJTZWF0UHJvbWlzZS5nZXRPZmZlclJlc3VsdCgpYC5cbiAqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gQXJncyBPZmZlciBhcmdzXG4gKiBAdGVtcGxhdGUge29iamVjdH0gUmVzdWx0IE9mZmVyIHJlc3VsdFxuICovXG4gICAgICAgY29uc3Qgb2ZmZXJUbyA9IGFzeW5jIChcbiAgemNmLFxuICBpbnZpdGF0aW9uLFxuICBrZXl3b3JkTWFwcGluZyxcbiAgcHJvcG9zYWwsXG4gIGZyb21TZWF0LFxuICB0b1NlYXQsXG4gIG9mZmVyQXJncyxcbikgPT4ge1xuICBpZiAoa2V5d29yZE1hcHBpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIGtleXdvcmRNYXBwaW5nID0gaGFyZGVuKHt9KTtcbiAgfVxuXG4gIGNvbnN0IGRlZmluZWRUb1NlYXQgPSB0b1NlYXQgIT09IHVuZGVmaW5lZCA/IHRvU2VhdCA6IGZyb21TZWF0O1xuXG4gIGNvbnN0IHpvZSA9IHpjZi5nZXRab2VTZXJ2aWNlKCk7XG4gIGNvbnN0IG1hcHBpbmdSZXZlcnNlZCA9IHJldmVyc2Uoa2V5d29yZE1hcHBpbmcpO1xuXG4gIGNvbnN0IG5ld0tleXdvcmRzID1cbiAgICBwcm9wb3NhbCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IG1hcEtleXdvcmRzKHByb3Bvc2FsLmdpdmUsIG1hcHBpbmdSZXZlcnNlZClcbiAgICAgIDogaGFyZGVuKHt9KTtcblxuICAvKiB0aGUgcHJvcG9zYWwgaXMgaW4gdGhlIG90aGVyIGNvbnRyYWN0J3Mga2V5d29yZHMsIGJ1dCB3ZSB3YW50IHRvKi9cbiAgLyogdXNlIGBwcm9wb3NhbC5naXZlYCB0byB3aXRoZHJhdyovXG4gIGNvbnN0IHBheW1lbnRzID0gYXdhaXQgd2l0aGRyYXdGcm9tU2VhdCh6Y2YsIGZyb21TZWF0LCBuZXdLZXl3b3Jkcyk7XG5cbiAgLyogTWFwIHRvIHRoZSBvdGhlciBjb250cmFjdCdzIGtleXdvcmRzKi9cbiAgY29uc3QgcGF5bWVudHNGb3JPdGhlckNvbnRyYWN0ID0gbWFwS2V5d29yZHMocGF5bWVudHMsIGtleXdvcmRNYXBwaW5nKTtcblxuICBjb25zdCB1c2VyU2VhdFByb21pc2UgPSBFKHpvZSkub2ZmZXIoXG4gICAgaW52aXRhdGlvbixcbiAgICBwcm9wb3NhbCxcbiAgICBwYXltZW50c0Zvck90aGVyQ29udHJhY3QsXG4gICAgb2ZmZXJBcmdzLFxuICApO1xuXG4gIGNvbnN0IGRlcG9zaXRlZFByb21pc2VLaXQgPSBtYWtlUHJvbWlzZUtpdCgpO1xuXG4gIGNvbnN0IGRvRGVwb3NpdCA9IGFzeW5jIHBheW91dFBheW1lbnRzID0+IHtcbiAgICAvKiBhZnRlciBnZXRQYXlvdXRzKCksIGdldEZpbmFsQWxsb2NhdGlvbigpIHJlc29sdmVzIHByb21wdGx5LiovXG4gICAgY29uc3QgYW1vdW50cyA9IGF3YWl0IEUodXNlclNlYXRQcm9taXNlKS5nZXRGaW5hbEFsbG9jYXRpb24oKTtcblxuICAgIC8qIE1hcCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250cmFjdCdzIGtleXdvcmRzKi9cbiAgICBjb25zdCBtYXBwZWRBbW91bnRzID0gbWFwS2V5d29yZHMoYW1vdW50cywgbWFwcGluZ1JldmVyc2VkKTtcbiAgICBjb25zdCBtYXBwZWRQYXltZW50cyA9IG1hcEtleXdvcmRzKHBheW91dFBheW1lbnRzLCBtYXBwaW5nUmV2ZXJzZWQpO1xuICAgIGF3YWl0IGRlcG9zaXRUb1NlYXQoemNmLCBkZWZpbmVkVG9TZWF0LCBtYXBwZWRBbW91bnRzLCBtYXBwZWRQYXltZW50cyk7XG4gICAgZGVwb3NpdGVkUHJvbWlzZUtpdC5yZXNvbHZlKG1hcHBlZEFtb3VudHMpO1xuICB9O1xuXG4gIHZvaWQgRSh1c2VyU2VhdFByb21pc2UpLmdldFBheW91dHMoKS50aGVuKGRvRGVwb3NpdCk7XG5cbiAgLyogVE9ETyByZW5hbWUgcmV0dXJuIGtleTsgdXNlclNlYXRQcm9taXNlIGlzIGEgcmVtb3RlIFVzZXJTZWF0Ki9cbiAgcmV0dXJuIGhhcmRlbih7IHVzZXJTZWF0UHJvbWlzZSwgZGVwb3NpdGVkOiBkZXBvc2l0ZWRQcm9taXNlS2l0LnByb21pc2UgfSk7XG59OyRozY9fb25jZS5vZmZlclRvKG9mZmVyVG8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciOlsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciXSwiYXNzZXJ0SXNzdWVyS2V5d29yZHMiOlsiYXNzZXJ0SXNzdWVyS2V5d29yZHMiXSwic2F0aXNmaWVzIjpbInNhdGlzZmllcyJdLCJzd2FwIjpbInN3YXAiXSwic3dhcEV4YWN0IjpbInN3YXBFeGFjdCJdLCJmaXRQcm9wb3NhbFNoYXBlIjpbImZpdFByb3Bvc2FsU2hhcGUiXSwiYXNzZXJ0UHJvcG9zYWxTaGFwZSI6WyJhc3NlcnRQcm9wb3NhbFNoYXBlIl0sImFzc2VydE5hdEFzc2V0S2luZCI6WyJhc3NlcnROYXRBc3NldEtpbmQiXSwiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciOlsiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciXSwiZGVwb3NpdFRvU2VhdCI6WyJkZXBvc2l0VG9TZWF0Il0sIndpdGhkcmF3RnJvbVNlYXQiOlsid2l0aGRyYXdGcm9tU2VhdCJdLCJzYXZlQWxsSXNzdWVycyI6WyJzYXZlQWxsSXNzdWVycyJdLCJtYXBLZXl3b3JkcyI6WyJtYXBLZXl3b3JkcyJdLCJvZmZlclRvIjpbIm9mZmVyVG8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARXv4GawIAACsCAAAJQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL21ha2VIYW5kbGUuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9lcnJvcnMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVEdXJhYmxlSGFuZGxlIiwibWFrZUhhbmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGluaXRFbXB0eSxtYWtlRXhvLHByZXBhcmVFeG9DbGFzcyxGYWlsLEhhbmRsZUk7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIixbJGjNj19hID0+IChpbml0RW1wdHkgPSAkaM2PX2EpXV0sW1wibWFrZUV4b1wiLFskaM2PX2EgPT4gKG1ha2VFeG8gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJIYW5kbGVJXCIsWyRozY9fYSA9PiAoSGFuZGxlSSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy92YXQtZGF0YSc7XG4gKiBAaW1wb3J0IHtIYW5kbGUsIEluc3RhbmNlfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSFxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge0h9IGhhbmRsZVR5cGVcbiAqIEByZXR1cm5zIHtIIGV4dGVuZHMgJ0luc3RhbmNlJyA/ICgpID0+IEluc3RhbmNlIDogKCkgPT4gSGFuZGxlPEg+fVxuICovXG4gICAgICAgY29uc3QgZGVmaW5lRHVyYWJsZUhhbmRsZSA9IChiYWdnYWdlLCBoYW5kbGVUeXBlKSA9PiB7XG4gIHR5cGVvZiBoYW5kbGVUeXBlID09PSAnc3RyaW5nJyB8fCBGYWlsYGhhbmRsZVR5cGUgbXVzdCBiZSBhIHN0cmluZ2A7XG4gIGNvbnN0IG1ha2VIYW5kbGUgPSBwcmVwYXJlRXhvQ2xhc3MoXG4gICAgYmFnZ2FnZSxcbiAgICBgJHtoYW5kbGVUeXBlfUhhbmRsZWAsXG4gICAgSGFuZGxlSSxcbiAgICBpbml0RW1wdHksXG4gICAge30sXG4gICk7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgQml0IGJ5IG91ciBvd24gb3BhcXVlIHR5cGVzLiovXG4gIHJldHVybiAvKiogQHR5cGUgeygpID0+IEhhbmRsZTxIPn0gKi8gKG1ha2VIYW5kbGUpO1xufTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUhhbmRsZShkZWZpbmVEdXJhYmxlSGFuZGxlKTtcbmhhcmRlbihkZWZpbmVEdXJhYmxlSGFuZGxlKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gb3BhcXVlIGhhbmRsZSBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IEhcbiAqIEBwYXJhbSB7SH0gaGFuZGxlVHlwZSB0aGUgc3RyaW5nIGxpdGVyYWwgdHlwZSBvZiB0aGUgaGFuZGxlXG4gKiBAcmV0dXJucyB7SCBleHRlbmRzICdJbnN0YW5jZScgPyBJbnN0YW5jZSA6IEhhbmRsZTxIPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VIYW5kbGUgPSBoYW5kbGVUeXBlID0+IHtcbiAgdHlwZW9mIGhhbmRsZVR5cGUgPT09ICdzdHJpbmcnIHx8IEZhaWxgaGFuZGxlVHlwZSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgLyogUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gdHlwZSAocmVhbGx5IGp1c3QgYW4gZW1wdHkgb2JqZWN0KS4qL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIEJpdCBieSBvdXIgb3duIG9wYXF1ZSB0eXBlcy4qL1xuICByZXR1cm4gLyoqIEB0eXBlIHtIYW5kbGU8SD59ICovIChtYWtlRXhvKGAke2hhbmRsZVR5cGV9SGFuZGxlYCwgSGFuZGxlSSwge30pKTtcbn07JGjNj19vbmNlLm1ha2VIYW5kbGUobWFrZUhhbmRsZSk7XG5oYXJkZW4obWFrZUhhbmRsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZpbmVEdXJhYmxlSGFuZGxlIjpbImRlZmluZUR1cmFibGVIYW5kbGUiXSwibWFrZUhhbmRsZSI6WyJtYWtlSGFuZGxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAHT9EtISwAASEsAACUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIl0sImV4cG9ydHMiOlsiQWRtaW5GYWNldEkiLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIiwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiLCJCdW5kbGVDYXBTaGFwZSIsIkJ1bmRsZVNoYXBlIiwiRW1wdHlQcm9wb3NhbFNoYXBlIiwiRXhpdE9iamVjdEkiLCJFeGl0T2JqZWN0U2hhcGUiLCJGZWVNaW50QWNjZXNzU2hhcGUiLCJGdWxsUHJvcG9zYWxTaGFwZSIsIkhhbmRsZUkiLCJIYW5kbGVPZmZlckkiLCJJbnN0YWxsYXRpb25TaGFwZSIsIkluc3RhbmNlQWRtaW5JIiwiSW5zdGFuY2VBZG1pblNoYXBlIiwiSW5zdGFuY2VIYW5kbGVTaGFwZSIsIkluc3RhbmNlUmVjb3JkU2hhcGUiLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCIsIkludml0YXRpb25FbGVtZW50U2hhcGUiLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUmVjb3JkU2hhcGUiLCJLZXl3b3JkU2hhcGUiLCJPZmZlckhhbmRsZXJJIiwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiLCJQcmljZVF1b3RlU2hhcGUiLCJQcm9wb3NhbFNoYXBlIiwiU2VhdERhdGFTaGFwZSIsIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIiwiU2VhdFNoYXBlIiwiVGVybXNTaGFwZSIsIlRpbWVyU2hhcGUiLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSIsIlpvZU1pbnRJIiwiWm9lTWludFNoYXBlIiwiWm9lU2VydmljZUkiLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSIsImlzT25EZW1hbmRFeGl0UnVsZSIsImlzV2FpdmVkRXhpdFJ1bGUiLCJtYWtlSGFuZGxlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRTaGFwZSxBc3NldEtpbmRTaGFwZSxCcmFuZFNoYXBlLERpc3BsYXlJbmZvU2hhcGUsSXNzdWVyS2l0U2hhcGUsSXNzdWVyU2hhcGUsUGF5bWVudFNoYXBlLFN1YnNjcmliZXJTaGFwZSxNLFRpbWVzdGFtcFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRTaGFwZVwiLFskaM2PX2EgPT4gKEFtb3VudFNoYXBlID0gJGjNj19hKV1dLFtcIkFzc2V0S2luZFNoYXBlXCIsWyRozY9fYSA9PiAoQXNzZXRLaW5kU2hhcGUgPSAkaM2PX2EpXV0sW1wiQnJhbmRTaGFwZVwiLFskaM2PX2EgPT4gKEJyYW5kU2hhcGUgPSAkaM2PX2EpXV0sW1wiRGlzcGxheUluZm9TaGFwZVwiLFskaM2PX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaM2PX2EpXV0sW1wiSXNzdWVyS2l0U2hhcGVcIixbJGjNj19hID0+IChJc3N1ZXJLaXRTaGFwZSA9ICRozY9fYSldXSxbXCJJc3N1ZXJTaGFwZVwiLFskaM2PX2EgPT4gKElzc3VlclNoYXBlID0gJGjNj19hKV1dLFtcIlBheW1lbnRTaGFwZVwiLFskaM2PX2EgPT4gKFBheW1lbnRTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIlN1YnNjcmliZXJTaGFwZVwiLFskaM2PX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtBZnRlckRlYWRsaW5lRXhpdFJ1bGUsIEluc3RhbGxhdGlvbiwgWm9lSXNzdWVyUmVjb3JkfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtFeGl0UnVsZSwgSW52aXRhdGlvbiwgSW52aXRhdGlvbkhhbmRsZSwgV2FpdmVkRXhpdFJ1bGV9IGZyb20gJy4vdHlwZXMtaW5kZXguanMnO1xuICogQGltcG9ydCB7SW52aXRhdGlvbkRldGFpbHN9IGZyb20gJy4vdHlwZXMtaW5kZXguanMnO1xuICovXG5cbi8qIGtleXdvcmRzIGhhdmUgYW4gaW5pdGlhbCBjYXAqL1xuICAgICAgIGNvbnN0IEtleXdvcmRTaGFwZSA9IE0uc3RyaW5nKCk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPEludml0YXRpb25IYW5kbGU+fSAqLyRozY9fb25jZS5LZXl3b3JkU2hhcGUoS2V5d29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBJbnZpdGF0aW9uSGFuZGxlU2hhcGUgPSBNLnJlbW90YWJsZSgnSW52aXRhdGlvbkhhbmRsZScpO1xuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48SW52aXRhdGlvbj59ICovJGjNj19vbmNlLkludml0YXRpb25IYW5kbGVTaGFwZShJbnZpdGF0aW9uSGFuZGxlU2hhcGUpO1xuICAgICAgIGNvbnN0IEludml0YXRpb25TaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uJyk7JGjNj19vbmNlLkludml0YXRpb25TaGFwZShJbnZpdGF0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IEluc3RhbmNlSGFuZGxlU2hhcGUgPSBNLnJlbW90YWJsZSgnSW5zdGFuY2VIYW5kbGUnKTtcbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPEluc3RhbGxhdGlvbj59ICovJGjNj19vbmNlLkluc3RhbmNlSGFuZGxlU2hhcGUoSW5zdGFuY2VIYW5kbGVTaGFwZSk7XG4gICAgICAgY29uc3QgSW5zdGFsbGF0aW9uU2hhcGUgPSBNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJyk7JGjNj19vbmNlLkluc3RhbGxhdGlvblNoYXBlKEluc3RhbGxhdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBTZWF0U2hhcGUgPSBNLnJlbW90YWJsZSgnU2VhdCcpOyRozY9fb25jZS5TZWF0U2hhcGUoU2VhdFNoYXBlKTtcblxuICAgICAgIGNvbnN0IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLCBBbW91bnRTaGFwZSk7JGjNj19vbmNlLkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZShBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKFxuICBLZXl3b3JkU2hhcGUsXG4gIE0ucGF0dGVybigpLFxuKTskaM2PX29uY2UuQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZShBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoXG4gIEtleXdvcmRTaGFwZSxcbiAgTS5lcmVmKFBheW1lbnRTaGFwZSksXG4pOyRozY9fb25jZS5QYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZShQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsIElzc3VlclNoYXBlKTskaM2PX29uY2UuSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoXG4gIEtleXdvcmRTaGFwZSxcbiAgTS5lcmVmKElzc3VlclNoYXBlKSxcbik7JGjNj19vbmNlLklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKEtleXdvcmRTaGFwZSwgQnJhbmRTaGFwZSk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFpvZUlzc3VlclJlY29yZD59ICovJGjNj19vbmNlLkJyYW5kS2V5d29yZFJlY29yZFNoYXBlKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJSZWNvcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBicmFuZDogQnJhbmRTaGFwZSxcbiAgICBpc3N1ZXI6IElzc3VlclNoYXBlLFxuICAgIGFzc2V0S2luZDogQXNzZXRLaW5kU2hhcGUsXG4gIH0sXG4gIHsgZGlzcGxheUluZm86IERpc3BsYXlJbmZvU2hhcGUgfSxcbik7JGjNj19vbmNlLklzc3VlclJlY29yZFNoYXBlKElzc3VlclJlY29yZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IFRlcm1zU2hhcGUgPSB7XG4gIGlzc3VlcnM6IElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSxcbiAgYnJhbmRzOiBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSxcbn07JGjNj19vbmNlLlRlcm1zU2hhcGUoVGVybXNTaGFwZSk7XG5oYXJkZW4oVGVybXNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBJbnN0YW5jZVJlY29yZFNoYXBlID0ge1xuICBpbnN0YWxsYXRpb246IEluc3RhbGxhdGlvblNoYXBlLFxuICBpbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbiAgdGVybXM6IE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSksXG59OyRozY9fb25jZS5JbnN0YW5jZVJlY29yZFNoYXBlKEluc3RhbmNlUmVjb3JkU2hhcGUpO1xuaGFyZGVuKEluc3RhbmNlUmVjb3JkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSGFuZGxlSSA9IE0uaW50ZXJmYWNlKCdIYW5kbGUnLCB7fSk7JGjNj19vbmNlLkhhbmRsZUkoSGFuZGxlSSk7XG5cbiAgICAgICBjb25zdCBtYWtlSGFuZGxlU2hhcGUgPSBuYW1lID0+IE0ucmVtb3RhYmxlKGAke25hbWV9SGFuZGxlYCk7JGjNj19vbmNlLm1ha2VIYW5kbGVTaGFwZShtYWtlSGFuZGxlU2hhcGUpO1xuICAgICAgIGNvbnN0IFRpbWVyU2hhcGUgPSBtYWtlSGFuZGxlU2hhcGUoJ3RpbWVyJyk7XG5cbi8qKlxuICogQWZ0ZXIgZGVmYXVsdHMgYXJlIGZpbGxlZCBpblxuICpcbiAqIEBzZWUge1Byb3Bvc2FsUmVjb3JkfSB0eXBlXG4gKi8kaM2PX29uY2UuVGltZXJTaGFwZShUaW1lclNoYXBlKTtcbiAgICAgICBjb25zdCBGdWxsUHJvcG9zYWxTaGFwZSA9IHtcbiAgd2FudDogQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSxcbiAgZ2l2ZTogQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuICAvKiBUbyBhY2NlcHQgb25seSBvbmUsIHdlIGNvdWxkIHVzZSBNLm9yIHJhdGhlciB0aGFuIE0uc3BsaXRSZWNvcmQsKi9cbiAgLyogYnV0IHRoZSBlcnJvciBtZXNzYWdlcyB3b3VsZCBoYXZlIGJlZW4gd29yc2UuIFJhdGhlciwqL1xuICAvKiBjbGVhblByb3Bvc2FsJ3MgYXNzZXJ0RXhpdCBjaGVja3MgdGhhdCB0aGVyZSdzIGV4YWN0bHkgb25lLiovXG4gIGV4aXQ6IE0uc3BsaXRSZWNvcmQoXG4gICAge30sXG4gICAge1xuICAgICAgb25EZW1hbmQ6IG51bGwsXG4gICAgICB3YWl2ZWQ6IG51bGwsXG4gICAgICBhZnRlckRlYWRsaW5lOiB7XG4gICAgICAgIHRpbWVyOiBNLmVyZWYoVGltZXJTaGFwZSksXG4gICAgICAgIGRlYWRsaW5lOiBUaW1lc3RhbXBTaGFwZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7fSxcbiAgKSxcbn07JGjNj19vbmNlLkZ1bGxQcm9wb3NhbFNoYXBlKEZ1bGxQcm9wb3NhbFNoYXBlKTtcbmhhcmRlbihGdWxsUHJvcG9zYWxTaGFwZSk7XG5cbi8qKiBAc2VlIHtQcm9wb3NhbH0gdHlwZSAqL1xuICAgICAgIGNvbnN0IFByb3Bvc2FsU2hhcGUgPSBNLnNwbGl0UmVjb3JkKHt9LCBGdWxsUHJvcG9zYWxTaGFwZSwge30pOyRozY9fb25jZS5Qcm9wb3NhbFNoYXBlKFByb3Bvc2FsU2hhcGUpO1xuXG4gICAgICAgY29uc3QgRW1wdHlQcm9wb3NhbFNoYXBlID0gTS5zcGxpdFJlY29yZCh7XG4gIGdpdmU6IHt9LFxuICB3YW50OiB7fSxcbiAgZXhpdDogeyBvbkRlbWFuZDogbnVsbCB9LFxufSk7JGjNj19vbmNlLkVtcHR5UHJvcG9zYWxTaGFwZShFbXB0eVByb3Bvc2FsU2hhcGUpO1xuXG4gICAgICAgY29uc3QgaXNPbkRlbWFuZEV4aXRSdWxlID0gZXhpdCA9PiB7XG4gIGNvbnN0IFtleGl0S2V5XSA9IE9iamVjdC5rZXlzKGV4aXQpO1xuICByZXR1cm4gZXhpdEtleSA9PT0gJ29uRGVtYW5kJztcbn07JGjNj19vbmNlLmlzT25EZW1hbmRFeGl0UnVsZShpc09uRGVtYW5kRXhpdFJ1bGUpO1xuaGFyZGVuKGlzT25EZW1hbmRFeGl0UnVsZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgV2FpdmVkRXhpdFJ1bGV9XG4gKi9cbiAgICAgICBjb25zdCBpc1dhaXZlZEV4aXRSdWxlID0gZXhpdCA9PiB7XG4gIGNvbnN0IFtleGl0S2V5XSA9IE9iamVjdC5rZXlzKGV4aXQpO1xuICByZXR1cm4gZXhpdEtleSA9PT0gJ3dhaXZlZCc7XG59OyRozY9fb25jZS5pc1dhaXZlZEV4aXRSdWxlKGlzV2FpdmVkRXhpdFJ1bGUpO1xuaGFyZGVuKGlzV2FpdmVkRXhpdFJ1bGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIEFmdGVyRGVhZGxpbmVFeGl0UnVsZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlID0gZXhpdCA9PiB7XG4gIGNvbnN0IFtleGl0S2V5XSA9IE9iamVjdC5rZXlzKGV4aXQpO1xuICByZXR1cm4gZXhpdEtleSA9PT0gJ2FmdGVyRGVhZGxpbmUnO1xufTskaM2PX29uY2UuaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUoaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUpO1xuaGFyZGVuKGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48SW52aXRhdGlvbkRldGFpbHM+fSAqL1xuICAgICAgIGNvbnN0IEludml0YXRpb25FbGVtZW50U2hhcGUgPSBNLnNwbGl0UmVjb3JkKHtcbiAgZGVzY3JpcHRpb246IE0uc3RyaW5nKCksXG4gIGhhbmRsZTogSW52aXRhdGlvbkhhbmRsZVNoYXBlLFxuICBpbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbiAgaW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb25TaGFwZSxcbn0pOyRozY9fb25jZS5JbnZpdGF0aW9uRWxlbWVudFNoYXBlKEludml0YXRpb25FbGVtZW50U2hhcGUpO1xuXG4gICAgICAgY29uc3QgT2ZmZXJIYW5kbGVySSA9IE0uaW50ZXJmYWNlKCdPZmZlckhhbmRsZXInLCB7XG4gIGhhbmRsZTogTS5jYWxsKFNlYXRTaGFwZSkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLmFueSgpKSxcbn0pOyRozY9fb25jZS5PZmZlckhhbmRsZXJJKE9mZmVySGFuZGxlckkpO1xuXG4gICAgICAgY29uc3QgU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUgPSBNLmFycmF5T2Yoe1xuICBzZWF0SGFuZGxlOiBTZWF0U2hhcGUsXG4gIGFsbG9jYXRpb246IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbn0pOyRozY9fb25jZS5TZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZShTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBab2VNaW50U2hhcGUgPSBNLnJlbW90YWJsZSgnWm9lTWludCcpOyRozY9fb25jZS5ab2VNaW50U2hhcGUoWm9lTWludFNoYXBlKTtcbiAgICAgICBjb25zdCBab2VNaW50SSA9IE0uaW50ZXJmYWNlKCdab2VNaW50Jywge1xuICBnZXRJc3N1ZXJSZWNvcmQ6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyUmVjb3JkU2hhcGUpLFxuICBtaW50QW5kRXNjcm93OiBNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKSxcbiAgd2l0aGRyYXdBbmRCdXJuOiBNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKSxcbn0pOyRozY9fb25jZS5ab2VNaW50SShab2VNaW50SSk7XG5cbiAgICAgICBjb25zdCBGZWVNaW50QWNjZXNzU2hhcGUgPSBNLnJlbW90YWJsZSgnRmVlTWludEFjY2VzcycpOyRozY9fb25jZS5GZWVNaW50QWNjZXNzU2hhcGUoRmVlTWludEFjY2Vzc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IEV4aXRPYmplY3RJID0gTS5pbnRlcmZhY2UoJ0V4aXQgT2JqZWN0Jywge1xuICBleGl0OiBNLmNhbGwoKS5yZXR1cm5zKCksXG59KTskaM2PX29uY2UuRXhpdE9iamVjdEkoRXhpdE9iamVjdEkpO1xuXG4gICAgICAgY29uc3QgRXhpdE9iamVjdFNoYXBlID0gTS5yZW1vdGFibGUoJ0V4aXRPYmonKTskaM2PX29uY2UuRXhpdE9iamVjdFNoYXBlKEV4aXRPYmplY3RTaGFwZSk7XG4gICAgICAgY29uc3QgSW5zdGFuY2VBZG1pblNoYXBlID0gTS5yZW1vdGFibGUoJ0luc3RhbmNlQWRtaW4nKTskaM2PX29uY2UuSW5zdGFuY2VBZG1pblNoYXBlKEluc3RhbmNlQWRtaW5TaGFwZSk7XG4gICAgICAgY29uc3QgSW5zdGFuY2VBZG1pbkkgPSBNLmludGVyZmFjZSgnSW5zdGFuY2VBZG1pbicsIHtcbiAgbWFrZUludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsIE0uc3RyaW5nKCkpXG4gICAgLm9wdGlvbmFsKE0ucmVjb3JkKCksIE0ucGF0dGVybigpKVxuICAgIC5yZXR1cm5zKEludml0YXRpb25TaGFwZSksXG4gIHNhdmVJc3N1ZXI6IE0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSksIEtleXdvcmRTaGFwZSkucmV0dXJucyhcbiAgICBJc3N1ZXJSZWNvcmRTaGFwZSxcbiAgKSxcbiAgbWFrZU5vRXNjcm93U2VhdDogTS5jYWxsKFxuICAgIEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgICBQcm9wb3NhbFNoYXBlLFxuICAgIEV4aXRPYmplY3RTaGFwZSxcbiAgICBTZWF0U2hhcGUsXG4gICkucmV0dXJucyhTZWF0U2hhcGUpLFxuICBleGl0QWxsU2VhdHM6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gIGZhaWxBbGxTZWF0czogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbiAgZXhpdFNlYXQ6IE0uY2FsbChTZWF0U2hhcGUsIE0uYW55KCkpLnJldHVybnMoKSxcbiAgZmFpbFNlYXQ6IE0uY2FsbChTZWF0U2hhcGUsIE0uYW55KCkpLnJldHVybnMoKSxcbiAgbWFrZVpvZU1pbnQ6IE0uY2FsbChLZXl3b3JkU2hhcGUpXG4gICAgLm9wdGlvbmFsKFxuICAgICAgQXNzZXRLaW5kU2hhcGUsXG4gICAgICBEaXNwbGF5SW5mb1NoYXBlLFxuICAgICAgTS5zcGxpdFJlY29yZCh7fSwgeyBlbGVtZW50U2hhcGU6IE0ucGF0dGVybigpIH0pLFxuICAgIClcbiAgICAucmV0dXJucyhNLnJlbW90YWJsZSgnem9lTWludCcpKSxcbiAgcmVnaXN0ZXJGZWVNaW50OiBNLmNhbGwoS2V5d29yZFNoYXBlLCBGZWVNaW50QWNjZXNzU2hhcGUpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKSxcbiAgKSxcbiAgcmVwbGFjZUFsbG9jYXRpb25zOiBNLmNhbGwoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpLnJldHVybnMoKSxcbiAgc3RvcEFjY2VwdGluZ09mZmVyczogTS5jYWxsKCkucmV0dXJucygpLFxuICBzZXRPZmZlckZpbHRlcjogTS5jYWxsKE0uYXJyYXlPZihNLnN0cmluZygpKSkucmV0dXJucygpLFxuICBnZXRPZmZlckZpbHRlcjogTS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuICBnZXRFeGl0U3Vic2NyaWJlcjogTS5jYWxsKFNlYXRTaGFwZSkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuICBpc0Jsb2NrZWQ6IE0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgcmVwYWlyQ29udHJhY3RDb21wbGV0aW9uV2F0Y2hlcjogTS5jYWxsKCkucmV0dXJucygpLFxufSk7JGjNj19vbmNlLkluc3RhbmNlQWRtaW5JKEluc3RhbmNlQWRtaW5JKTtcblxuICAgICAgIGNvbnN0IEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0ID0ge1xuICBpbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyOiBNLmludGVyZmFjZSgnSW5zdGFuY2VTdG9yYWdlTWFuYWdlcicsIHtcbiAgICBnZXRUZXJtczogTS5jYWxsKCkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbiAgICBnZXRJc3N1ZXJzOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgZ2V0QnJhbmRzOiBNLmNhbGwoKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbiAgICBnZXRJbnN0YWxsYXRpb246IE0uY2FsbCgpLnJldHVybnMoSW5zdGFsbGF0aW9uU2hhcGUpLFxuICAgIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuXG4gICAgc2F2ZUlzc3VlcjogTS5jYWxsKElzc3VlclNoYXBlLCBLZXl3b3JkU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIG1ha2Vab2VNaW50OiBNLmNhbGwoS2V5d29yZFNoYXBlKVxuICAgICAgLm9wdGlvbmFsKFxuICAgICAgICBBc3NldEtpbmRTaGFwZSxcbiAgICAgICAgRGlzcGxheUluZm9TaGFwZSxcbiAgICAgICAgTS5zcGxpdFJlY29yZCh7fSwgeyBlbGVtZW50U2hhcGU6IE0ucGF0dGVybigpIH0pLFxuICAgICAgKVxuICAgICAgLnJldHVybnMoTS5lcmVmKFpvZU1pbnRTaGFwZSkpLFxuICAgIHJlZ2lzdGVyRmVlTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSwgRmVlTWludEFjY2Vzc1NoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKSxcbiAgICApLFxuICAgIGdldEluc3RhbmNlUmVjb3JkOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlUmVjb3JkU2hhcGUpLFxuICAgIGdldElzc3VlclJlY29yZHM6IE0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKElzc3VlclJlY29yZFNoYXBlKSksXG4gICAgZ2V0V2l0aGRyYXdGYWNldDogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnV2l0aGRyYXdGYWNldCcpKSxcbiAgICBpbml0SW5zdGFuY2VBZG1pbjogTS5jYWxsKFxuICAgICAgSW5zdGFuY2VIYW5kbGVTaGFwZSxcbiAgICAgIE0ucmVtb3RhYmxlKCdpbnN0YW5jZUFkbWluJyksXG4gICAgKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBkZWxldGVJbnN0YW5jZUFkbWluOiBNLmNhbGwoSW5zdGFuY2VBZG1pblNoYXBlKS5yZXR1cm5zKCksXG4gICAgbWFrZUludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsIE0uc3RyaW5nKCkpXG4gICAgICAub3B0aW9uYWwoTS5yZWNvcmQoKSwgTS5wYXR0ZXJuKCkpXG4gICAgICAucmV0dXJucyhQYXltZW50U2hhcGUpLFxuICAgIGdldFJvb3Q6IE0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG4gICAgZ2V0QWRtaW5Ob2RlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKSksXG4gIH0pLFxuICB3aXRoZHJhd0ZhY2V0OiBNLmludGVyZmFjZSgnV2l0aGRyYXdGYWNldCcsIHtcbiAgICB3aXRoZHJhd1BheW1lbnRzOiBNLmNhbGwoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuICAgICAgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICAgKSxcbiAgfSksXG4gIGhlbHBlcnM6IE0uaW50ZXJmYWNlKCdJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyIGhlbHBlcicsIHtcbiAgICB3cmFwSXNzdWVyS2l0V2l0aFpvZU1pbnQ6IE0uY2FsbChcbiAgICAgIEtleXdvcmRTaGFwZSxcbiAgICAgIElzc3VlcktpdFNoYXBlLFxuICAgICAgTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpLFxuICAgICkucmV0dXJucyhab2VNaW50U2hhcGUpLFxuICB9KSxcbn07JGjNj19vbmNlLkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KTtcbmhhcmRlbihJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5cbiAgICAgICBjb25zdCBCdW5kbGVDYXBTaGFwZSA9IE0ucmVtb3RhYmxlKCdidW5kbGVDYXAnKTskaM2PX29uY2UuQnVuZGxlQ2FwU2hhcGUoQnVuZGxlQ2FwU2hhcGUpO1xuICAgICAgIGNvbnN0IEJ1bmRsZVNoYXBlID0gTS5hbmQoXG4gIE0uc3BsaXRSZWNvcmQoeyBtb2R1bGVGb3JtYXQ6IE0uYW55KCkgfSksXG4gIE0ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5zdHJpbmcoeyBzdHJpbmdMZW5ndGhMaW1pdDogSW5maW5pdHkgfSkpLFxuKTskaM2PX29uY2UuQnVuZGxlU2hhcGUoQnVuZGxlU2hhcGUpO1xuXG4gICAgICAgY29uc3QgVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7IGluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uU2hhcGUgfSxcbiAge1xuICAgIGJ1bmRsZTogTS5yZWNvcmRPZihNLnN0cmluZygpLCBNLnN0cmluZyh7IHN0cmluZ0xlbmd0aExpbWl0OiBJbmZpbml0eSB9KSksXG4gICAgYnVuZGxlQ2FwOiBCdW5kbGVDYXBTaGFwZSxcbiAgICBidW5kbGVJRDogTS5zdHJpbmcoKSxcbiAgfSxcbiAge30sXG4pOyRozY9fb25jZS5VbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZShVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBab2VTdG9yYWdlTWFuYWdlcklLaXQgPSB7XG4gIHpvZVNlcnZpY2VEYXRhQWNjZXNzOiBNLmludGVyZmFjZSgnWm9lU2VydmljZSBkYXRhQWNjZXNzJywge1xuICAgIGdldFRlcm1zOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbiAgICBnZXRJc3N1ZXJzOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuICAgIGdldEJyYW5kczogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuICAgIGdldEluc3RhbGxhdGlvbjogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLmVyZWYoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSxcbiAgICApLFxuICAgIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuXG4gICAgZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uOiBNLmNhbGwoSW5zdGFsbGF0aW9uU2hhcGUpLnJldHVybnMoXG4gICAgICBNLmVyZWYoTS5zdHJpbmcoKSksXG4gICAgKSxcbiAgICBpbnN0YWxsQnVuZGxlOiBNLmNhbGwoQnVuZGxlU2hhcGUpXG4gICAgICAub3B0aW9uYWwoTS5zdHJpbmcoKSlcbiAgICAgIC5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBpbnN0YWxsQnVuZGxlSUQ6IE0uY2FsbChNLnN0cmluZygpKVxuICAgICAgLm9wdGlvbmFsKE0uc3RyaW5nKCkpXG4gICAgICAucmV0dXJucyhNLnByb21pc2UoKSksXG5cbiAgICBnZXRQdWJsaWNGYWNldDogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLmVyZWYoTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JykpLFxuICAgICksXG4gICAgZ2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG4gICAgZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLm9wdChNLnBhdHRlcm4oKSksXG4gICAgKSxcbiAgfSksXG4gIG1ha2VPZmZlckFjY2VzczogTS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgbWFrZU9mZmVyIGFjY2VzcycsIHtcbiAgICBnZXRBc3NldEtpbmRCeUJyYW5kOiBNLmNhbGwoQnJhbmRTaGFwZSkucmV0dXJucyhBc3NldEtpbmRTaGFwZSksXG4gICAgZ2V0SW5zdGFuY2VBZG1pbjogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpLFxuICAgICksXG4gICAgZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLm9wdChNLnBhdHRlcm4oKSksXG4gICAgKSxcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgICBkZXBvc2l0UGF5bWVudHM6IE0uY2FsbChQcm9wb3NhbFNoYXBlLCBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcbiAgICAgIE0ucHJvbWlzZSgpLFxuICAgICksXG4gIH0pLFxuICBzdGFydEluc3RhbmNlQWNjZXNzOiBNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBzdGFydEluc3RhbmNlIGFjY2VzcycsIHtcbiAgICBtYWtlWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcjogTS5jYWxsKFxuICAgICAgSW5zdGFsbGF0aW9uU2hhcGUsXG4gICAgICBNLmFueSgpLFxuICAgICAgSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgICAgIEluc3RhbmNlSGFuZGxlU2hhcGUsXG4gICAgICBNLm9yKEJ1bmRsZUNhcFNoYXBlLCBCdW5kbGVTaGFwZSksXG4gICAgICBNLnN0cmluZygpLFxuICAgICkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgdW53cmFwSW5zdGFsbGF0aW9uOiBNLmNhbGxXaGVuKE0uZXJlZihJbnN0YWxsYXRpb25TaGFwZSkpLnJldHVybnMoXG4gICAgICBVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSxcbiAgICApLFxuICB9KSxcbiAgaW52aXRhdGlvbklzc3VlckFjY2VzczogTS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgaW52aXRhdGlvbklzc3VlcicsIHtcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgfSksXG59OyRozY9fb25jZS5ab2VTdG9yYWdlTWFuYWdlcklLaXQoWm9lU3RvcmFnZU1hbmFnZXJJS2l0KTtcbmhhcmRlbihab2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuXG4gICAgICAgY29uc3QgWm9lU2VydmljZUkgPSBNLmludGVyZmFjZSgnWm9lU2VydmljZScsIHtcbiAgaW5zdGFsbDogTS5jYWxsKE0uYW55KCkpLm9wdGlvbmFsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBpbnN0YWxsQnVuZGxlSUQ6IE0uY2FsbChNLnN0cmluZygpKS5vcHRpb25hbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgc3RhcnRJbnN0YW5jZTogTS5jYWxsKE0uZXJlZihJbnN0YWxsYXRpb25TaGFwZSkpXG4gICAgLm9wdGlvbmFsKElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUsIE0ucmVjb3JkKCksIE0ucmVjb3JkKCksIE0uc3RyaW5nKCkpXG4gICAgLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBvZmZlcjogTS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKVxuICAgIC5vcHRpb25hbChQcm9wb3NhbFNoYXBlLCBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSwgTS5hbnkoKSlcbiAgICAucmV0dXJucyhNLnByb21pc2UoKSksXG5cbiAgZ2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBNLmFycmF5T2YoTS5zdHJpbmcoKSksXG4gICksXG4gIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRGZWVJc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRCcmFuZHM6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgKSxcbiAgZ2V0SXNzdWVyczogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSxcbiAgKSxcbiAgZ2V0UHVibGljRmFjZXQ6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBNLnJlbW90YWJsZSgnUHVibGljRmFjZXQnKSxcbiAgKSxcbiAgZ2V0VGVybXM6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhNLmFueSgpKSxcbiAgZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2U6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBNLmVyZWYoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSxcbiAgKSxcbiAgZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKFxuICAgIE0uZXJlZihNLnN0cmluZygpKSxcbiAgKSxcblxuICBnZXRJbnN0YWxsYXRpb246IE0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldEluc3RhbmNlOiBNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRDb25maWd1cmF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKHtcbiAgICBmZWVJc3N1ZXJDb25maWc6IHtcbiAgICAgIG5hbWU6IE0uc3RyaW5nKCksXG4gICAgICBhc3NldEtpbmQ6ICduYXQnLFxuICAgICAgZGlzcGxheUluZm86IERpc3BsYXlJbmZvU2hhcGUsXG4gICAgfSxcbiAgfSksXG4gIGdldEludml0YXRpb25EZXRhaWxzOiBNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG4gIGdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgIE0ub3B0KE0ucGF0dGVybigpKSxcbiAgKSxcbn0pOyRozY9fb25jZS5ab2VTZXJ2aWNlSShab2VTZXJ2aWNlSSk7XG5cbiAgICAgICBjb25zdCBBZG1pbkZhY2V0SSA9IE0uaW50ZXJmYWNlKCdaY2ZBZG1pbkZhY2V0Jywge1xuICBnZXRWYXRTaHV0ZG93blByb21pc2U6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICByZXN0YXJ0Q29udHJhY3Q6IE0uY2FsbCgpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICB1cGdyYWRlQ29udHJhY3Q6IE0uY2FsbChNLnN0cmluZygpKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgdGVybWluYXRlQ29udHJhY3Q6IE0uY2FsbChNLmVycm9yKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxufSk7JGjNj19vbmNlLkFkbWluRmFjZXRJKEFkbWluRmFjZXRJKTtcblxuICAgICAgIGNvbnN0IFNlYXREYXRhU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAgcHJvcG9zYWw6IFByb3Bvc2FsU2hhcGUsXG4gICAgaW5pdGlhbEFsbG9jYXRpb246IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgICBzZWF0SGFuZGxlOiBTZWF0U2hhcGUsXG4gIH0sXG4gIHtcbiAgICBvZmZlckFyZ3M6IE0uYW55KCksXG4gIH0sXG4pOyRozY9fb25jZS5TZWF0RGF0YVNoYXBlKFNlYXREYXRhU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSGFuZGxlT2ZmZXJJID0gTS5pbnRlcmZhY2UoJ0hhbmRsZU9mZmVyJywge1xuICBoYW5kbGVPZmZlcjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSwgU2VhdERhdGFTaGFwZSkucmV0dXJucyh7XG4gICAgb2ZmZXJSZXN1bHRQcm9taXNlOiBNLnByb21pc2UoKSxcbiAgICBleGl0T2JqOiBFeGl0T2JqZWN0U2hhcGUsXG4gIH0pLFxufSk7JGjNj19vbmNlLkhhbmRsZU9mZmVySShIYW5kbGVPZmZlckkpO1xuXG4gICAgICAgY29uc3QgUHJpY2VRdW90ZVNoYXBlID0ge1xuICBxdW90ZUFtb3VudDogQW1vdW50U2hhcGUsXG4gIHF1b3RlUGF5bWVudDogTS5lcmVmKFBheW1lbnRTaGFwZSksXG59OyRozY9fb25jZS5QcmljZVF1b3RlU2hhcGUoUHJpY2VRdW90ZVNoYXBlKTtcbmhhcmRlbihQcmljZVF1b3RlU2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiS2V5d29yZFNoYXBlIjpbIktleXdvcmRTaGFwZSJdLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiOlsiSW52aXRhdGlvbkhhbmRsZVNoYXBlIl0sIkludml0YXRpb25TaGFwZSI6WyJJbnZpdGF0aW9uU2hhcGUiXSwiSW5zdGFuY2VIYW5kbGVTaGFwZSI6WyJJbnN0YW5jZUhhbmRsZVNoYXBlIl0sIkluc3RhbGxhdGlvblNoYXBlIjpbIkluc3RhbGxhdGlvblNoYXBlIl0sIlNlYXRTaGFwZSI6WyJTZWF0U2hhcGUiXSwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiXSwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIjpbIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIjpbIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiXSwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyUmVjb3JkU2hhcGUiOlsiSXNzdWVyUmVjb3JkU2hhcGUiXSwiVGVybXNTaGFwZSI6WyJUZXJtc1NoYXBlIl0sIkluc3RhbmNlUmVjb3JkU2hhcGUiOlsiSW5zdGFuY2VSZWNvcmRTaGFwZSJdLCJIYW5kbGVJIjpbIkhhbmRsZUkiXSwibWFrZUhhbmRsZVNoYXBlIjpbIm1ha2VIYW5kbGVTaGFwZSJdLCJUaW1lclNoYXBlIjpbIlRpbWVyU2hhcGUiXSwiRnVsbFByb3Bvc2FsU2hhcGUiOlsiRnVsbFByb3Bvc2FsU2hhcGUiXSwiUHJvcG9zYWxTaGFwZSI6WyJQcm9wb3NhbFNoYXBlIl0sIkVtcHR5UHJvcG9zYWxTaGFwZSI6WyJFbXB0eVByb3Bvc2FsU2hhcGUiXSwiaXNPbkRlbWFuZEV4aXRSdWxlIjpbImlzT25EZW1hbmRFeGl0UnVsZSJdLCJpc1dhaXZlZEV4aXRSdWxlIjpbImlzV2FpdmVkRXhpdFJ1bGUiXSwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiOlsiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiXSwiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSI6WyJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIl0sIk9mZmVySGFuZGxlckkiOlsiT2ZmZXJIYW5kbGVySSJdLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSI6WyJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSJdLCJab2VNaW50U2hhcGUiOlsiWm9lTWludFNoYXBlIl0sIlpvZU1pbnRJIjpbIlpvZU1pbnRJIl0sIkZlZU1pbnRBY2Nlc3NTaGFwZSI6WyJGZWVNaW50QWNjZXNzU2hhcGUiXSwiRXhpdE9iamVjdEkiOlsiRXhpdE9iamVjdEkiXSwiRXhpdE9iamVjdFNoYXBlIjpbIkV4aXRPYmplY3RTaGFwZSJdLCJJbnN0YW5jZUFkbWluU2hhcGUiOlsiSW5zdGFuY2VBZG1pblNoYXBlIl0sIkluc3RhbmNlQWRtaW5JIjpbIkluc3RhbmNlQWRtaW5JIl0sIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0IjpbIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0Il0sIkJ1bmRsZUNhcFNoYXBlIjpbIkJ1bmRsZUNhcFNoYXBlIl0sIkJ1bmRsZVNoYXBlIjpbIkJ1bmRsZVNoYXBlIl0sIlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlIjpbIlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlIl0sIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJab2VTdG9yYWdlTWFuYWdlcklLaXQiXSwiWm9lU2VydmljZUkiOlsiWm9lU2VydmljZUkiXSwiQWRtaW5GYWNldEkiOlsiQWRtaW5GYWNldEkiXSwiU2VhdERhdGFTaGFwZSI6WyJTZWF0RGF0YVNoYXBlIl0sIkhhbmRsZU9mZmVySSI6WyJIYW5kbGVPZmZlckkiXSwiUHJpY2VRdW90ZVNoYXBlIjpbIlByaWNlUXVvdGVTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADZ9JO0lgEAAJYBAAAeAAAAQGFnb3JpYy96b25lLXYwLjIuMi9kdXJhYmxlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2R1cmFibGUuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9kdXJhYmxlLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2R1cmFibGUuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgDJSytoTAADaEwAAIgAAAEBhZ29yaWMvem9uZS12MC4yLjIvc3JjL2R1cmFibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL2Jhc2Utem9uZSJdLCJleHBvcnRzIjpbIm1ha2VEdXJhYmxlWm9uZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRmFyLGlzUGFzc2FibGUsY2FuQmVEdXJhYmxlLG1ha2VTY2FsYXJNYXBTdG9yZSxwcmVwYXJlRXhvLHByZXBhcmVFeG9DbGFzcyxwcmVwYXJlRXhvQ2xhc3NLaXQscHJvdmlkZUR1cmFibGVNYXBTdG9yZSxwcm92aWRlRHVyYWJsZVNldFN0b3JlLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlLHdhdGNoUHJvbWlzZSxrZXlzLG1ha2VPbmNlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJpc1Bhc3NhYmxlXCIsWyRozY9fYSA9PiAoaXNQYXNzYWJsZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLFskaM2PX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG8gPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVNldFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVTZXRTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUgPSAkaM2PX2EpXV0sW1wid2F0Y2hQcm9taXNlXCIsWyRozY9fYSA9PiAod2F0Y2hQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9iYXNlLXpvbmVcIiwgW1tcImFnb3JpY1ZhdERhdGFLZXlzXCIsWyRozY9fYSA9PiAoa2V5cyA9ICRozY9fYSldXSxbXCJtYWtlT25jZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VPbmNlS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJy4vaW5kZXguanMnO1xuICogQGltcG9ydCB7U3RvcmVzfSBmcm9tICcuL2luZGV4LmpzJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqL1xuXG4vKipcbiAqIEEgdmFyaWFudCBvZiBgY2FuQmVEdXJhYmxlYCB0aGF0IHJldHVybnMgYGZhbHNlYCBpbnN0ZWFkIG9mIGV2ZXIgdGhyb3dpbmcuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzU3RvcmFibGUgPSBzcGVjaW1lbiA9PiBpc1Bhc3NhYmxlKHNwZWNpbWVuKSAmJiBjYW5CZUR1cmFibGUoc3BlY2ltZW4pO1xuaGFyZGVuKGlzU3RvcmFibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7KCkgPT4gQmFnZ2FnZX0gZ2V0QmFnZ2FnZVxuICovXG5jb25zdCBhdHRhY2hEdXJhYmxlU3RvcmVzID0gZ2V0QmFnZ2FnZSA9PiB7XG4gIC8qKiBAdHlwZSB7Wm9uZVsnbWFwU3RvcmUnXX0gKi9cbiAgY29uc3QgbWFwU3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBiYWdnYWdlID0gZ2V0QmFnZ2FnZSgpO1xuICAgIGNvbnN0IHJldCA9IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUoYmFnZ2FnZSwgbGFiZWwsIG9wdGlvbnMpO1xuICAgIHJldHVybiByZXQ7XG4gIH07XG4gIC8qKiBAdHlwZSB7Wm9uZVsnc2V0U3RvcmUnXX0gKi9cbiAgY29uc3Qgc2V0U3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+XG4gICAgcHJvdmlkZUR1cmFibGVTZXRTdG9yZShnZXRCYWdnYWdlKCksIGxhYmVsLCBvcHRpb25zKTtcbiAgLyoqIEB0eXBlIHtab25lWyd3ZWFrU2V0U3RvcmUnXX0gKi9cbiAgY29uc3Qgd2Vha1NldFN0b3JlID0gKGxhYmVsLCBvcHRpb25zKSA9PlxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKGdldEJhZ2dhZ2UoKSwgbGFiZWwsIG9wdGlvbnMpO1xuICAvKiogQHR5cGUge1pvbmVbJ3dlYWtNYXBTdG9yZSddfSAqL1xuICBjb25zdCB3ZWFrTWFwU3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+XG4gICAgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoZ2V0QmFnZ2FnZSgpLCBsYWJlbCwgb3B0aW9ucyk7XG5cbiAgLyoqIEB0eXBlIHtTdG9yZXN9ICovXG4gIHJldHVybiBGYXIoJ2R1cmFibGVTdG9yZXMnLCB7XG4gICAgZGV0YWNoZWQ6ICgpID0+IGRldGFjaGVkRHVyYWJsZVN0b3JlcyxcbiAgICBpc1N0b3JhYmxlLFxuICAgIG1hcFN0b3JlLFxuICAgIHNldFN0b3JlLFxuICAgIHdlYWtNYXBTdG9yZSxcbiAgICB3ZWFrU2V0U3RvcmUsXG4gIH0pO1xufTtcblxuLyoqIEB0eXBlIHtTdG9yZXN9ICovXG5jb25zdCBkZXRhY2hlZER1cmFibGVTdG9yZXMgPSBhdHRhY2hEdXJhYmxlU3RvcmVzKCgpID0+XG4gIG1ha2VTY2FsYXJNYXBTdG9yZSgnZGV0YWNoZWQnKSxcbik7XG5cbi8qKlxuICogQ3JlYXRlIGEgem9uZSB3aG9zZSBvYmplY3RzIHBlcnNpc3QgYmV0d2VlbiBBZ29yaWMgdmF0IHVwZ3JhZGVzLlxuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IFtiYXNlTGFiZWxdXG4gKiBAcmV0dXJucyB7Wm9uZX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEdXJhYmxlWm9uZSA9IChiYWdnYWdlLCBiYXNlTGFiZWwgPSAnZHVyYWJsZVpvbmUnKSA9PiB7XG4gIGJhZ2dhZ2UgfHwgRmFpbGBiYWdnYWdlIHJlcXVpcmVkYDtcblxuICBjb25zdCBhdHRhY2hlZFN0b3JlcyA9IGF0dGFjaER1cmFibGVTdG9yZXMoKCkgPT4gYmFnZ2FnZSk7XG5cbiAgY29uc3QgeyBtYWtlT25jZSwgd3JhcFByb3ZpZGVyIH0gPSBtYWtlT25jZUtpdChcbiAgICBiYXNlTGFiZWwsXG4gICAgYXR0YWNoZWRTdG9yZXMsXG4gICAgYmFnZ2FnZSxcbiAgKTtcblxuICAvKiogQHR5cGUge1pvbmVbJ2V4b0NsYXNzJ119ICovXG4gIGNvbnN0IGV4b0NsYXNzID0gKC4uLmFyZ3MpID0+IHByZXBhcmVFeG9DbGFzcyhiYWdnYWdlLCAuLi5hcmdzKTtcbiAgLyoqIEB0eXBlIHtab25lWydleG9DbGFzc0tpdCddfSAqL1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50IC0tIGhhcHBlbnMgb25seSBpbnRlZ3JhdGluZyB3aXRoIEVuZG8gbWFzdGVyKi9cbiAgLyogQHRzLWlnbm9yZSBGSVhNRSBpbiBFbmRvKi9cbiAgY29uc3QgZXhvQ2xhc3NLaXQgPSAoLi4uYXJncykgPT4gcHJlcGFyZUV4b0NsYXNzS2l0KGJhZ2dhZ2UsIC4uLmFyZ3MpO1xuICAvKiogQHR5cGUge1pvbmVbJ2V4byddfSAqL1xuICBjb25zdCBleG8gPSAoLi4uYXJncykgPT4gcHJlcGFyZUV4byhiYWdnYWdlLCAuLi5hcmdzKTtcblxuICBjb25zdCBzdWJab25lU3RvcmUgPSB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMubWFwU3RvcmUsIGtleXMuem9uZSk7XG5cbiAgLyoqIEB0eXBlIHtab25lWydzdWJab25lJ119ICovXG4gIGNvbnN0IHN1YlpvbmUgPSAobGFiZWwsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIC8qKiBAdHlwZSB7QmFnZ2FnZX0gKi9cbiAgICBjb25zdCBzdWJCYWdnYWdlID0gc3ViWm9uZVN0b3JlKGxhYmVsLCBvcHRpb25zKTtcbiAgICByZXR1cm4gbWFrZUR1cmFibGVab25lKHN1YkJhZ2dhZ2UsIGAke2Jhc2VMYWJlbH0uJHtsYWJlbH1gKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKCdkdXJhYmxlWm9uZScsIHtcbiAgICBleG86IHdyYXBQcm92aWRlcihleG8sIGtleXMuZXhvKSxcbiAgICBleG9DbGFzczogd3JhcFByb3ZpZGVyKGV4b0NsYXNzLCBrZXlzLmV4b0NsYXNzKSxcbiAgICBleG9DbGFzc0tpdDogd3JhcFByb3ZpZGVyKGV4b0NsYXNzS2l0LCBrZXlzLmV4b0NsYXNzS2l0KSxcbiAgICBzdWJab25lLFxuXG4gICAgbWFrZU9uY2UsXG4gICAgd2F0Y2hQcm9taXNlLFxuICAgIGRldGFjaGVkOiBhdHRhY2hlZFN0b3Jlcy5kZXRhY2hlZCxcbiAgICBpc1N0b3JhYmxlOiBhdHRhY2hlZFN0b3Jlcy5pc1N0b3JhYmxlLFxuXG4gICAgbWFwU3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5tYXBTdG9yZSwga2V5cy5zdG9yZSksXG4gICAgc2V0U3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5zZXRTdG9yZSwga2V5cy5zdG9yZSksXG4gICAgd2Vha01hcFN0b3JlOiB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMud2Vha01hcFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgICB3ZWFrU2V0U3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy53ZWFrU2V0U3RvcmUsIGtleXMuc3RvcmUpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VEdXJhYmxlWm9uZShtYWtlRHVyYWJsZVpvbmUpO1xuaGFyZGVuKG1ha2VEdXJhYmxlWm9uZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRHVyYWJsZVpvbmUiOlsibWFrZUR1cmFibGVab25lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANY4VALFAQAAxQEAAB8AAABAZW5kby9jYWNoZS1tYXAtdjEuMS4wL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2NhY2hlbWFwLmpzIl0sImV4cG9ydHMiOltudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvY2FjaGVtYXAuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9jYWNoZW1hcC5qcyI6W1sibWFrZUNhY2hlTWFwS2l0IiwibWFrZUNhY2hlTWFwS2l0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACBle78JicAACYnAAAmAAAAQGVuZG8vY2FjaGUtbWFwLXYxLjEuMC9zcmMvY2FjaGVtYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VDYWNoZU1hcEtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuLyogZ2xvYmFsIGdsb2JhbFRoaXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwgKi9cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG5jb25zdCB7IEVycm9yLCBUeXBlRXJyb3IsIFdlYWtNYXAgfSA9IGdsb2JhbFRoaXM7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbmNvbnN0IHsgcGFyc2UsIHN0cmluZ2lmeSB9ID0gSlNPTjtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgeyBpc1NhZmVJbnRlZ2VyIH0gPSBOdW1iZXI7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbmNvbnN0IHsgdG9TdHJpbmdUYWc6IHRvU3RyaW5nVGFnU3ltYm9sIH0gPSBTeW1ib2w7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgVU5LTk9XTl9LRVkgPSBTeW1ib2woJ1VOS05PV05fS0VZJyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgb2JqZWN0ID8geyAtcmVhZG9ubHkgW0sgaW4ga2V5b2YgVF06IFRbS10gfSA6IG5ldmVyfSBXcml0YWJsZURlZXBcbiAqICAgSW50ZW50aW9uYWxseSBsaW1pdGVkIHRvIGxvY2FsIG5lZWRzOyByZWZlciB0b1xuICogICBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdCBpZiBpbnN1ZmZpY2llbnQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZVxuICogQHBhcmFtIHs8VSw+KG5hbWU6IHN0cmluZywgdmFsdWU6IFUpID0+IFV9IFtyZXZpdmVyXVxuICogQHJldHVybnMge1dyaXRhYmxlRGVlcDxUPn1cbiAqL1xuY29uc3QgZGVlcENvcHlKc29uYWJsZSA9ICh2YWx1ZSwgcmV2aXZlcikgPT4ge1xuICBjb25zdCBlbmNvZGVkID0gc3RyaW5naWZ5KHZhbHVlKTtcbiAgY29uc3QgZGVjb2RlZCA9IHBhcnNlKGVuY29kZWQsIHJldml2ZXIpO1xuICByZXR1cm4gZGVjb2RlZDtcbn07XG5cbmNvbnN0IGZyZWV6aW5nUmV2aXZlciA9IChfbmFtZSwgdmFsdWUpID0+IGZyZWV6ZSh2YWx1ZSk7XG5cbi8qKiBAdHlwZSB7PFQsPih2YWx1ZTogVCkgPT4gVH0gKi9cbmNvbnN0IGRlZXBDb3B5QW5kRnJlZXplSnNvbmFibGUgPSB2YWx1ZSA9PlxuICBkZWVwQ29weUpzb25hYmxlKHZhbHVlLCBmcmVlemluZ1Jldml2ZXIpO1xuXG4vKipcbiAqIEEgY2FjaGUgb2YgYm91bmRlZCBzaXplLCBpbXBsZW1lbnRpbmcgdGhlIFdlYWtNYXAgaW50ZXJmYWNlIGJ1dCBob2xkaW5nIGtleXNcbiAqIHN0cm9uZ2x5IGlmIGNyZWF0ZWQgd2l0aCBhIG5vbi13ZWFrIGBtYWtlTWFwYCBvcHRpb24gb2ZcbiAqIHtAbGluayBtYWtlQ2FjaGVNYXBLaXR9LlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYge1BpY2s8TWFwPEssIFY+LCBFeGNsdWRlPGtleW9mIFdlYWtNYXA8V2Vha0tleSwgKj4sICdzZXQnPj4gJiB7c2V0OiAoa2V5OiBLLCB2YWx1ZTogVikgPT4gV2Vha01hcEFQSTxLLCBWPn19IFdlYWtNYXBBUElcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYge1dlYWtNYXBBUEk8SywgVj4gJiAoe2NsZWFyPzogdW5kZWZpbmVkfSB8IFBpY2s8TWFwPEssIFY+LCAnY2xlYXInPil9IFNpbmdsZUVudHJ5TWFwXG4gKi9cblxuLyoqXG4gKiBBIGNlbGwgb2YgYSBkb3VibHktbGlua2VkIHJpbmcgKGNpcmN1bGFyIGxpc3QpIGZvciBhIGNhY2hlIG1hcC5cbiAqIEluc3RhbmNlcyBhcmUgbm90IGZyb3plbiwgYW5kIHNvIHNob3VsZCBiZSBjbG9zZWx5IGVuY2Fwc3VsYXRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENhY2hlTWFwQ2VsbFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGlkIGZvciBkZWJ1Z2dpbmdcbiAqIEBwcm9wZXJ0eSB7Q2FjaGVNYXBDZWxsPEssIFY+fSBuZXh0XG4gKiBAcHJvcGVydHkge0NhY2hlTWFwQ2VsbDxLLCBWPn0gcHJldlxuICogQHByb3BlcnR5IHtTaW5nbGVFbnRyeU1hcDxLLCBWPn0gZGF0YVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge0NhY2hlTWFwQ2VsbDxLLCBWPn0gcHJldlxuICogQHBhcmFtIHtudW1iZXJ9IGlkXG4gKiBAcGFyYW0ge1NpbmdsZUVudHJ5TWFwPEssIFY+fSBkYXRhXG4gKiBAcmV0dXJucyB7Q2FjaGVNYXBDZWxsPEssIFY+fVxuICovXG5jb25zdCBhcHBlbmROZXdDZWxsID0gKHByZXYsIGlkLCBkYXRhKSA9PiB7XG4gIGNvbnN0IG5leHQgPSBwcmV2Py5uZXh0O1xuICBjb25zdCBjZWxsID0geyBpZCwgbmV4dCwgcHJldiwgZGF0YSB9O1xuICBwcmV2Lm5leHQgPSBjZWxsO1xuICBuZXh0LnByZXYgPSBjZWxsO1xuICByZXR1cm4gY2VsbDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge0NhY2hlTWFwQ2VsbDxLLCBWPn0gY2VsbFxuICogQHBhcmFtIHtDYWNoZU1hcENlbGw8SywgVj59IHByZXZcbiAqIEBwYXJhbSB7Q2FjaGVNYXBDZWxsPEssIFY+fSBbbmV4dF1cbiAqL1xuY29uc3QgbW92ZUNlbGxBZnRlciA9IChjZWxsLCBwcmV2LCBuZXh0ID0gcHJldi5uZXh0KSA9PiB7XG4gIGlmIChjZWxsID09PSBwcmV2IHx8IGNlbGwgPT09IG5leHQpIHJldHVybjsgLyogYWxyZWFkeSBpbiBwb3NpdGlvbiovXG5cbiAgLyogU3BsaWNlIG91dCBjZWxsLiovXG4gIGNvbnN0IHsgcHJldjogb2xkUHJldiwgbmV4dDogb2xkTmV4dCB9ID0gY2VsbDtcbiAgb2xkUHJldi5uZXh0ID0gb2xkTmV4dDtcbiAgb2xkTmV4dC5wcmV2ID0gb2xkUHJldjtcblxuICAvKiBTcGxpY2UgaW4gY2VsbCBhZnRlciBwcmV2LiovXG4gIGNlbGwucHJldiA9IHByZXY7XG4gIGNlbGwubmV4dCA9IG5leHQ7XG4gIHByZXYubmV4dCA9IGNlbGw7XG4gIG5leHQucHJldiA9IGNlbGw7XG59O1xuXG4vKipcbiAqIENsZWFyIG91dCBhIGNlbGwgdG8gcHJlcGFyZSBpdCBmb3IgZnV0dXJlIHVzZS4gSXRzIG1hcCBpcyBwcmVzZXJ2ZWQgd2hlblxuICogcG9zc2libGUsIGJ1dCBtdXN0IGluc3RlYWQgYmUgcmVwbGFjZWQgaWYgdGhlIGFzc29jaWF0ZWQga2V5IGlzIG5vdCBrbm93bi5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7Q2FjaGVNYXBDZWxsPEssIFY+fSBjZWxsXG4gKiBAcGFyYW0ge0sgfCBVTktOT1dOX0tFWX0gb2xkS2V5XG4gKiBAcGFyYW0geygpID0+IFNpbmdsZUVudHJ5TWFwPEssIFY+fSBbbWFrZU1hcF0gcmVxdWlyZWQgd2hlbiB0aGUga2V5IGlzIHVua25vd25cbiAqL1xuY29uc3QgcmVzZXRDZWxsID0gKGNlbGwsIG9sZEtleSwgbWFrZU1hcCkgPT4ge1xuICBpZiAob2xkS2V5ICE9PSBVTktOT1dOX0tFWSkge1xuICAgIGNlbGwuZGF0YS5kZWxldGUob2xkS2V5KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGNlbGwuZGF0YS5jbGVhcikge1xuICAgIGNlbGwuZGF0YS5jbGVhcigpO1xuICAgIHJldHVybjtcbiAgfVxuICAvKiBXZWFrTWFwIGluc3RhbmNlcyBtdXN0IGJlIHJlcGxhY2VkIHdoZW4gdGhlIGtleSBpcyB1bmtub3duLiovXG4gIGlmICghbWFrZU1hcCkge1xuICAgIHRocm93IEVycm9yKCdpbnRlcm5hbDogbWFrZU1hcCBpcyByZXF1aXJlZCB3aXRoIFVOS05PV05fS0VZJyk7XG4gIH1cbiAgY2VsbC5kYXRhID0gbWFrZU1hcCgpO1xufTtcblxuY29uc3QgemVyb01ldHJpY3MgPSBmcmVlemUoe1xuICB0b3RhbFF1ZXJ5Q291bnQ6IDAsXG4gIHRvdGFsSGl0Q291bnQ6IDBcbiAgLyogVE9ETz8qL1xuICAvKiAqIG1ldGhvZC1zcGVjaWZpYyBjb3VudHMqL1xuICAvKiAqIGxpdmVUb3VjaFN0YXRzL2V2aWN0ZWRUb3VjaFN0YXRzIHsgY291bnQsIHN1bSwgbWVhbiwgbWluLCBtYXggfSovXG4gIC8qICogcDUwL3A5MC9wOTUvcDk5IHZpYSBCZW4tSGFpbS9Ub20tVG92IHN0cmVhbWluZyBoaXN0b2dyYW1zKi9cbn0pO1xuLyoqIEB0eXBlZGVmIHt0eXBlb2YgemVyb01ldHJpY3N9IENhY2hlTWFwTWV0cmljcyAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7TWFwQ29uc3RydWN0b3IgfCBXZWFrTWFwQ29uc3RydWN0b3J9IFtDPVdlYWtNYXBDb25zdHJ1Y3Rvcl1cbiAqIEB0ZW1wbGF0ZSB7UGFyYW1ldGVyczxJbnN0YW5jZVR5cGU8Qz5bJ3NldCddPlswXX0gW0s9UGFyYW1ldGVyczxJbnN0YW5jZVR5cGU8Qz5bJ3NldCddPlswXV1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bn0gW1Y9dW5rbm93bl1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IENhY2hlTWFwS2l0XG4gKiBAcHJvcGVydHkge1dlYWtNYXBBUEk8SywgVj59IGNhY2hlXG4gKiBAcHJvcGVydHkgeygpID0+IENhY2hlTWFwTWV0cmljc30gZ2V0TWV0cmljc1xuICovXG5cbi8qKlxuICogQ3JlYXRlIGEgYm91bmRlZC1zaXplIGNhY2hlIGhhdmluZyBXZWFrTWFwLWNvbXBhdGlibGVcbiAqIGBoYXNgL2BnZXRgL2BzZXRgL2BkZWxldGVgIG1ldGhvZHMsIGNhcGFibGUgb2Ygc3VwcG9ydGluZyBTRVMgKHNwZWNpZmljYWxseVxuICogYGFzc2VydGAgZXJyb3Igbm90ZXMpLlxuICogS2V5IHZhbGlkaXR5LCBjb21wYXJpc29uLCBhbmQgcmVmZXJlbnRpYWwgc3RyZW5ndGggYXJlIGNvbnRyb2xsZWQgYnkgdGhlXG4gKiBgbWFrZU1hcGAgb3B0aW9uLCB3aGljaCBkZWZhdWx0cyB0byBgV2Vha01hcGAgYnV0IGNhbiBiZSBzZXQgdG8gYW55IHByb2R1Y2VyXG4gKiBvZiBvYmplY3RzIHdpdGggdGhvc2UgbWV0aG9kcyAoZS5nLiwgdXNpbmcgYE1hcGAgYWxsb3dzIGZvciBhcmJpdHJhcnkga2V5c1xuICogd2hpY2ggd2lsbCBiZSBzdHJvbmdseSBoZWxkKS5cbiAqIENhY2hlIGV2aWN0aW9uIHBvbGljeSBpcyBub3QgY3VycmVudGx5IGNvbmZpZ3VyYWJsZSwgYnV0IHN0cml2ZXMgZm9yIGEgaGl0XG4gKiByYXRpbyBhdCBsZWFzdCBhcyBnb29kIGFzXG4gKiBbTFJVXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYWNoZV9yZXBsYWNlbWVudF9wb2xpY2llcyNMUlUpIChlLmcuLCBpdFxuICogbWlnaHQgYmVcbiAqIFtDTE9DS10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGFnZV9yZXBsYWNlbWVudF9hbGdvcml0aG0jQ2xvY2spXG4gKiBvciBbU0lFVkVdKGh0dHBzOi8vc2lldmVjYWNoZS5jb20vKSkuXG4gKlxuICogQHRlbXBsYXRlIHtNYXBDb25zdHJ1Y3RvciB8IFdlYWtNYXBDb25zdHJ1Y3Rvcn0gW0M9V2Vha01hcENvbnN0cnVjdG9yXVxuICogQHRlbXBsYXRlIHtQYXJhbWV0ZXJzPEluc3RhbmNlVHlwZTxDPlsnc2V0J10+WzBdfSBbSz1QYXJhbWV0ZXJzPEluc3RhbmNlVHlwZTxDPlsnc2V0J10+WzBdXVxuICogQHRlbXBsYXRlIHt1bmtub3dufSBbVj11bmtub3duXVxuICogQHBhcmFtIHtudW1iZXJ9IGNhcGFjaXR5XG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0MgfCAoKCkgPT4gU2luZ2xlRW50cnlNYXA8SywgVj4pfSBbb3B0aW9ucy5tYWtlTWFwXVxuICogQHJldHVybnMge0NhY2hlTWFwS2l0PEMsIEssIFY+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUNhY2hlTWFwS2l0ID0gKGNhcGFjaXR5LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKCFpc1NhZmVJbnRlZ2VyKGNhcGFjaXR5KSB8fCBjYXBhY2l0eSA8IDApIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgICAnY2FwYWNpdHkgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBzYWZlIGludGVnZXIgbnVtYmVyIDw9IDIqKjUzIC0gMScsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlIHs8Viw+KCkgPT4gU2luZ2xlRW50cnlNYXA8SywgVj59XG4gKi9cbiAgY29uc3QgbWFrZU1hcCA9IChNYXliZUN0b3IgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yKi9cbiAgICAgIE1heWJlQ3RvcigpO1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAoTWF5YmVDdG9yKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IqL1xuICAgICAgY29uc3QgY29uc3RydWN0TmV3TWFwID0gKCkgPT4gbmV3IE1heWJlQ3RvcigpO1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdE5ld01hcDtcbiAgICB9XG4gIH0pKG9wdGlvbnMubWFrZU1hcCA/PyBXZWFrTWFwKTtcbiAgY29uc3QgdGFnID1cbiAgICAvKiogQHR5cGUge2FueX0gKi8gKG1ha2VNYXAoKSkuY2xlYXIgPT09IHVuZGVmaW5lZFxuICAgICAgPyAnV2Vha0NhY2hlTWFwJ1xuICAgICAgOiAnQ2FjaGVNYXAnO1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBDYWNoZU1hcENlbGw8SywgVj4+fSAqL1xuICBjb25zdCBrZXlUb0NlbGwgPSBtYWtlTWFwKCk7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgdGhpcyBzZW50aW5lbCBoZWFkIGlzIHNwZWNpYWwqL1xuICBjb25zdCBoZWFkID0gLyoqIEB0eXBlIHtDYWNoZU1hcENlbGw8SywgVj59ICovICh7XG4gICAgaWQ6IDAsXG4gICAgLyogbmV4dCBhbmQgcHJldiBhcmUgZXN0YWJsaXNoZWQgYmVsb3cgYXMgc2VsZi1yZWZlcmVudGlhbC4qL1xuICAgIG5leHQ6IHVuZGVmaW5lZCxcbiAgICBwcmV2OiB1bmRlZmluZWQsXG4gICAgZGF0YToge1xuICAgICAgaGFzOiAoKSA9PiB7XG4gICAgICAgIHRocm93IEVycm9yKCdpbnRlcm5hbDogc2VudGluZWwgaGVhZCBjZWxsIGhhcyBubyBkYXRhJyk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuICBoZWFkLm5leHQgPSBoZWFkO1xuICBoZWFkLnByZXYgPSBoZWFkO1xuICBsZXQgY2VsbENvdW50ID0gMDtcblxuICBjb25zdCBtZXRyaWNzID0gZGVlcENvcHlKc29uYWJsZSh6ZXJvTWV0cmljcyk7XG4gIGNvbnN0IGdldE1ldHJpY3MgPSAoKSA9PiBkZWVwQ29weUFuZEZyZWV6ZUpzb25hYmxlKG1ldHJpY3MpO1xuXG4gIC8qKlxuICogVG91Y2hpbmcgbW92ZXMgYSBjZWxsIHRvIGZpcnN0IHBvc2l0aW9uIHNvIExSVSBldmljdGlvbiBjYW4gdGFyZ2V0IHRoZSBsYXN0XG4gKiBjZWxsIChgaGVhZC5wcmV2YCkuXG4gKlxuICogQHR5cGUgeyhrZXk6IEspID0+IChDYWNoZU1hcENlbGw8SywgVj4gfCB1bmRlZmluZWQpfVxuICovXG4gIGNvbnN0IHRvdWNoS2V5ID0ga2V5ID0+IHtcbiAgICBtZXRyaWNzLnRvdGFsUXVlcnlDb3VudCArPSAxO1xuICAgIGNvbnN0IGNlbGwgPSBrZXlUb0NlbGwuZ2V0KGtleSk7XG4gICAgaWYgKCFjZWxsPy5kYXRhLmhhcyhrZXkpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgbWV0cmljcy50b3RhbEhpdENvdW50ICs9IDE7XG4gICAgbW92ZUNlbGxBZnRlcihjZWxsLCBoZWFkKTtcbiAgICByZXR1cm4gY2VsbDtcbiAgfTtcblxuICAvKiogQHR5cGUge1dlYWtNYXBBUEk8SywgVj5bJ2hhcyddfSAqL1xuICBjb25zdCBoYXMgPSBrZXkgPT4ge1xuICAgIGNvbnN0IGNlbGwgPSB0b3VjaEtleShrZXkpO1xuICAgIHJldHVybiBjZWxsICE9PSB1bmRlZmluZWQ7XG4gIH07XG4gIGZyZWV6ZShoYXMpO1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBWPlsnZ2V0J119ICovXG4gIGNvbnN0IGdldCA9IGtleSA9PiB7XG4gICAgY29uc3QgY2VsbCA9IHRvdWNoS2V5KGtleSk7XG4gICAgcmV0dXJuIGNlbGw/LmRhdGEuZ2V0KGtleSk7XG4gIH07XG4gIGZyZWV6ZShnZXQpO1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBWPlsnc2V0J119ICovXG4gIGNvbnN0IHNldCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgbGV0IGNlbGwgPSB0b3VjaEtleShrZXkpO1xuICAgIGlmIChjZWxsKSB7XG4gICAgICBjZWxsLmRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIHJldHVybiBpbXBsZW1lbnRhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoY2VsbENvdW50IDwgY2FwYWNpdHkpIHtcbiAgICAgIC8qIEFkZCBhbmQgdXNlIGEgbmV3IGNlbGwgYXQgZmlyc3QgcG9zaXRpb24uKi9cbiAgICAgIGNlbGwgPSBhcHBlbmROZXdDZWxsKGhlYWQsIGNlbGxDb3VudCArIDEsIG1ha2VNYXAoKSk7XG4gICAgICBjZWxsQ291bnQgKz0gMTsgLyogaW50ZW50aW9uYWxseSBmb2xsb3dzIGNlbGwgY3JlYXRpb24qL1xuICAgICAgY2VsbC5kYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGNhcGFjaXR5ID4gMCkge1xuICAgICAgLyogUmV1c2UgdGhlIGN1cnJlbnQgdGFpbCwgbW92aW5nIGl0IHRvIGZpcnN0IHBvc2l0aW9uLiovXG4gICAgICBjZWxsID0gaGVhZC5wcmV2O1xuICAgICAgcmVzZXRDZWxsKC8qKiBAdHlwZSB7YW55fSAqLyAoY2VsbCksIFVOS05PV05fS0VZLCBtYWtlTWFwKTtcbiAgICAgIGNlbGwuZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICBtb3ZlQ2VsbEFmdGVyKGNlbGwsIGhlYWQpO1xuICAgIH1cblxuICAgIC8qIERvbid0IGVzdGFibGlzaCB0aGlzIGVudHJ5IHVudGlsIHByaW9yIHN0ZXBzIHN1Y2NlZWQuKi9cbiAgICBpZiAoY2VsbCkga2V5VG9DZWxsLnNldChrZXksIGNlbGwpO1xuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICByZXR1cm4gaW1wbGVtZW50YXRpb247XG4gIH07XG4gIGZyZWV6ZShzZXQpO1xuXG4gIC8qIFwiZGVsZXRlXCIgaXMgYSBrZXl3b3JkLiovXG4gIGNvbnN0IHsgZGVsZXRlOiBkZWxldGVFbnRyeSB9ID0ge1xuICAgIC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBWPlsnZGVsZXRlJ119ICovXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgY29uc3QgY2VsbCA9IGtleVRvQ2VsbC5nZXQoa2V5KTtcbiAgICAgIGlmICghY2VsbD8uZGF0YS5oYXMoa2V5KSkge1xuICAgICAgICBrZXlUb0NlbGwuZGVsZXRlKGtleSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG1vdmVDZWxsQWZ0ZXIoY2VsbCwgaGVhZC5wcmV2KTtcbiAgICAgIHJlc2V0Q2VsbChjZWxsLCBrZXkpO1xuICAgICAga2V5VG9DZWxsLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfTtcbiAgZnJlZXplKGRlbGV0ZUVudHJ5KTtcblxuICBjb25zdCBpbXBsZW1lbnRhdGlvbiA9IC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBWPn0gKi8gKHtcbiAgICBoYXMsXG4gICAgZ2V0LFxuICAgIHNldCxcbiAgICBkZWxldGU6IGRlbGV0ZUVudHJ5LFxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9jaGVjay10eXBlcyovXG4gICAgWy8qKiBAdHlwZSB7dHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZ30gKi8gKHRvU3RyaW5nVGFnU3ltYm9sKV06IHRhZyxcbiAgfSk7XG4gIGZyZWV6ZShpbXBsZW1lbnRhdGlvbik7XG5cbiAgY29uc3Qga2l0ID0geyBjYWNoZTogaW1wbGVtZW50YXRpb24sIGdldE1ldHJpY3MgfTtcbiAgcmV0dXJuIGZyZWV6ZShraXQpO1xufTskaM2PX29uY2UubWFrZUNhY2hlTWFwS2l0KG1ha2VDYWNoZU1hcEtpdCk7XG5mcmVlemUobWFrZUNhY2hlTWFwS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VDYWNoZU1hcEtpdCI6WyJtYWtlQ2FjaGVNYXBLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAb1Ehj2ELAABhCwAALAAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIi4vdGhyb3ctbGFiZWxlZC5qcyJdLCJleHBvcnRzIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsaXNQcm9taXNlLHRocm93TGFiZWxlZDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vdGhyb3ctbGFiZWxlZC5qc1wiLCBbW1widGhyb3dMYWJlbGVkXCIsWyRozY9fYSA9PiAodGhyb3dMYWJlbGVkID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogQ2FsbHMgYGZ1bmMoLi4uYXJncylgLCBidXQgYW5ub3RhdGluZyBhbnkgZmFpbHVyZSBlcnJvciB3aXRoIGBsYWJlbGAuXG4gKlxuICogSWYgYGxhYmVsYCBpcyBvbWl0dGVkIG9yIGB1bmRlZmluZWRgLCB0aGVuIHRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICogYGZ1bmMoLi4uYXJncykuXG4gKlxuICogT3RoZXJ3aXNlLCBpZiBpdCBzdWNjZXNzZnVsbHkgcmV0dXJucyBhIG5vbi1wcm9taXNlLCB0aGF0IG5vbi1wcm9taXNlIGlzXG4gKiByZXR1cm5lZC5cbiAqXG4gKiBJZiBpdCB0aHJvd3MsIHJldGhyb3cgYSBzaW1pbGFyIGVycm9yIHdob3NlIG1lc3NhZ2UgaXNcbiAqIGBgYGpzXG4gKiBgJHtsYWJlbH06ICR7b3JpZ2luYWxNZXNzYWdlfWBcbiAqIGBgYFxuICogVGhhdCB3YXksIGluIGFuIGVycm9yIGhhcHBlbnMgZGVlcCB3aXRoaW4gYSBzdGFjayBvZiBjYWxscyB0b1xuICogYGFwcGx5TGFiZWxpbmdFcnJvcmAsIHRoZSByZXN1bHRpbmcgZXJyb3Igd2lsbCBzaG93IHRoZSBzdGFjayBvZiBsYWJlbHMuXG4gKlxuICogSWYgaXQgcmV0dXJucyBhIHByb21pc2UsIHRoZW4gYGFwcGx5TGFiZWxpbmdFcnJvcmAgY2Fubm90IHRlbGwgdW50aWwgdGhhdFxuICogcHJvbWlzZSBzZXR0bGVzIHdoZXRoZXIgaXQgcmVwcmVzZW50cyBhIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4gU28gaXQgaW1tZWRpYXRlbHlcbiAqIHJldHVybnMgYSBuZXcgcHJvbWlzZS4gSWYgdGhlIG9yaWdpbmFsIHByb21pc2UgZnVsZmlsbHMsIHRoZW4gdGhlXG4gKiBmdWxmaWxsbWVudCBpcyBwcm9wYWdhdGVkIHRvIHRoZSByZXR1cm5lZCBwcm9taXNlLlxuICpcbiAqIElmIHRoZSBwcm9taXNlIHJlamVjdHMgd2l0aCBhbiBlcnJvciwgdGhlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpc1xuICogcmVqZWN0ZWQgd2l0aCBhIHNpbWlsYXIgcHJvbWlzZSwgcHJlZml4ZWQgd2l0aCB0aGUgbGFiZWwgaW4gdGhhdCBzYW1lIHdheS5cbiAqXG4gKiBAdGVtcGxhdGUgQSxSXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFJ9IGZ1bmNcbiAqIEBwYXJhbSB7QVtdfSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtSfVxuICovXG4gICAgICAgY29uc3QgYXBwbHlMYWJlbGluZ0Vycm9yID0gKGZ1bmMsIGFyZ3MsIGxhYmVsID0gdW5kZWZpbmVkKSA9PiB7XG4gIGlmIChsYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZ1bmMoLi4uYXJncyk7XG4gIH1cbiAgbGV0IHJlc3VsdDtcbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBmdW5jKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvd0xhYmVsZWQoZXJyLCBsYWJlbCk7XG4gIH1cbiAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgLyogQ2Fubm90IGJlIGF0LXRzLWV4cGVjdC1lcnJvciBiZWNhdXNlIHRoZXJlIGlzIG5vIHR5cGUgZXJyb3IgbG9jYWxseS4qL1xuICAgIC8qIFJhdGhlciwgYSB0eXBlIGVycm9yIG9ubHkgYXMgaW1wb3J0ZWQgaW50byBleG8uKi9cbiAgICAvKiBAdHMtaWdub3JlIElmIHJlc3VsdCBpcyBhIHJlamVjdGVkIHByb21pc2UsIHRoaXMgd2lsbCovXG4gICAgLyogcmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEgZGlmZmVyZW50IHJlamVjdGlvbiByZWFzb24uIEJ1dCB0aGlzKi9cbiAgICAvKiBjb25mdXNlcyBUeXBlU2NyaXB0IGJlY2F1c2UgaXQgdHlwZXMgdGhhdCBjYXNlIGFzIGBQcm9taXNlPG5ldmVyPmAqL1xuICAgIC8qIHdoaWNoIGlzIGNvb2wgZm9yIGEgcHJvbWlzZSB0aGF0IHdpbGwgbmV2ZXIgZnVsZmxsLiovXG4gICAgLyogQnV0IFR5cGVTY3JpcHQgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgdGhpcyB3aWxsIG9ubHkgaGFwcGVuKi9cbiAgICAvKiB3aGVuIGByZXN1bHRgIHdhcyBhIHJlamVjdGVkIHByb21pc2UuIEluIG9ubHkgdGhpcyBjYXNlIGBSYCovXG4gICAgLyogc2hvdWxkIGFscmVhZHkgYWxsb3cgYFByb21pc2U8bmV2ZXI+YCBhcyBhIHN1YnR5cGUuKi9cbiAgICByZXR1cm4gRS53aGVuKHJlc3VsdCwgdW5kZWZpbmVkLCByZWFzb24gPT4gdGhyb3dMYWJlbGVkKHJlYXNvbiwgbGFiZWwpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59OyRozY9fb25jZS5hcHBseUxhYmVsaW5nRXJyb3IoYXBwbHlMYWJlbGluZ0Vycm9yKTtcbmhhcmRlbihhcHBseUxhYmVsaW5nRXJyb3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABI+ELK3QUAAN0FAAArAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvZnJvbS11bmlxdWUtZW50cmllcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qKlxuICogVGhyb3dzIGlmIG11bHRpcGxlIGVudHJpZXMgdXNlIHRoZSBzYW1lIHByb3BlcnR5IG5hbWUuIE90aGVyd2lzZSBhY3RzXG4gKiBsaWtlIGBPYmplY3QuZnJvbUVudHJpZXNgIGJ1dCBoYXJkZW5zIHRoZSByZXN1bHQuXG4gKiBVc2UgaXQgdG8gcHJvdGVjdCBmcm9tIHByb3BlcnR5IG5hbWVzIGNvbXB1dGVkIGZyb20gdXNlci1wcm92aWRlZCBkYXRhLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPHJlYWRvbmx5IFtQcm9wZXJ0eUtleSwgVF0+fSBhbGxFbnRyaWVzXG4gKiBAcmV0dXJucyB7eyBbazogc3RyaW5nXTogVDsgfX1cbiAqL1xuICAgICAgIGNvbnN0IGZyb21VbmlxdWVFbnRyaWVzID0gYWxsRW50cmllcyA9PiB7XG4gIGNvbnN0IGVudHJpZXNBcnJheSA9IFsuLi5hbGxFbnRyaWVzXTtcbiAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuICBpZiAob3duS2V5cyhyZXN1bHQpLmxlbmd0aCA9PT0gZW50cmllc0FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KCk7XG4gIGZvciAoY29uc3QgW25hbWUsIF9dIG9mIGVudHJpZXNBcnJheSkge1xuICAgIGlmIChuYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgIEZhaWxgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiAgICB9XG4gICAgbmFtZXMuYWRkKG5hbWUpO1xuICB9XG4gIHRocm93IEZhaWxgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xufTskaM2PX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImZyb21VbmlxdWVFbnRyaWVzIjpbImZyb21VbmlxdWVFbnRyaWVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALeVU+4lCAAAJQgAACUAAABAZW5kby9jb21tb24tdjEuMi4xMy9pZGVudC1jaGVja2VyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpZGVudENoZWNrZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogVE9ETyBDb21wbGV0ZSBtaWdyYXRpb24gb2YgQ2hlY2tlciB0eXBlIGZyb20gQGVuZG8vcGFzcy1zdHlsZSB0byBAZW5kby9jb21tb24qL1xuLyogYnkgaGF2aW5nIEBlbmRvL3Bhc3Mtc3R5bGUsIGFuZCBldmVyeW9uZSBlbHNlIHdobyBuZWVkcyBpdCwgaW1wb3J0IGl0IGZyb20qL1xuLyogYEBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzYC4qL1xuLyoqXG4gKiBAY2FsbGJhY2sgQ2hlY2tlclxuICogSW50ZXJuYWwgdG8gYSB1c2VmdWwgcGF0dGVybiBmb3Igd3JpdGluZyBjaGVja2luZyBsb2dpY1xuICogKGEgXCJjaGVja0Zvb1wiIGZ1bmN0aW9uKSB0aGF0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBhIHByZWRpY2F0ZVxuICogKGFuIFwiaXNGb29cIiBmdW5jdGlvbikgb3IgYSB2YWxpZGF0b3IgKGFuIFwiYXNzZXJ0Rm9vXCIgZnVuY3Rpb24pLlxuICpcbiAqICAgICogQSBwcmVkaWNhdGUgaWRlYWxseSBvbmx5IHJldHVybnMgYHRydWVgIG9yIGBmYWxzZWAgYW5kIHJhcmVseSB0aHJvd3MuXG4gKiAgICAqIEEgdmFsaWRhdG9yIHRocm93cyBhbiBpbmZvcm1hdGl2ZSBkaWFnbm9zdGljIHdoZW4gdGhlIHByZWRpY2F0ZVxuICogICAgICB3b3VsZCBoYXZlIHJldHVybmVkIGBmYWxzZWAsIGFuZCBzaW1wbHkgcmV0dXJucyBgdW5kZWZpbmVkYCBub3JtYWxseVxuICogICAgICB3aGVuIHRoZSBwcmVkaWNhdGUgd291bGQgaGF2ZSByZXR1cm5lZCBgdHJ1ZWAuXG4gKiAgICAqIFRoZSBpbnRlcm5hbCBjaGVja2luZyBmdW5jdGlvbiB0aGF0IHRoZXkgc2hhcmUgaXMgcGFyYW1ldGVyaXplZCBieSBhXG4gKiAgICAgIGBDaGVja2VyYCB0aGF0IGRldGVybWluZXMgaG93IHRvIHByb2NlZWQgd2l0aCBhIGZhaWx1cmUgY29uZGl0aW9uLlxuICogICAgICBQcmVkaWNhdGVzIHBhc3MgaW4gYW4gaWRlbnRpdHkgZnVuY3Rpb24gYXMgY2hlY2tlci4gVmFsaWRhdG9yc1xuICogICAgICBwYXNzIGluIGBhc3NlcnRDaGVja2VyYCB3aGljaCBpcyBhIHRyaXZpYWwgd3JhcHBlciBhcm91bmQgYGFzc2VydGAuXG4gKlxuICogU2VlIHRoZSB2YXJpb3VzIHVzZXMgZm9yIGdvb2QgZXhhbXBsZXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNvbmRcbiAqIEBwYXJhbSB7SU1QT1JUKCdzZXMnKS5EZXRhaWxzfSBbZGV0YWlsc11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5cbi8qKlxuICogSW4gdGhlIGBhc3NlcnRGb29gL2Bpc0Zvb2AvYGNoZWNrRm9vYCBwYXR0ZXJuLCBgY2hlY2tGb29gIGhhcyBhIGBjaGVja2BcbiAqIHBhcmFtZXRlciBvZiB0eXBlIGBDaGVja2VyYC4gYGFzc2VydEZvb2AgY2FsbHMgYGNoZWNrRm9vYCBwYXNzZXNcbiAqIGBhc3NlcnRDaGVja2VyYCBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlzRm9vYCBwYXNzZXMgYGlkZW50Q2hlY2tlcmBcbiAqIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaWRlbnRDaGVja2VyYCBhY3RzIHByZWNpc2VseSBsaWtlIGFuXG4gKiBpZGVudGl0eSBmdW5jdGlvbiwgYnV0IGlzIHR5cGVkIGFzIGEgYENoZWNrZXJgIHRvIGluZGljYXRlIGl0c1xuICogaW50ZW5kZWQgdXNlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG4gICAgICAgY29uc3QgaWRlbnRDaGVja2VyID0gKGNvbmQsIF9kZXRhaWxzKSA9PiBjb25kOyRozY9fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABhr/xquAQAALgEAAAnAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvbGlzdC1kaWZmZXJlbmNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJsaXN0RGlmZmVyZW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKipcbiAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyBwcmVzZW50IGluIHRoZSBgbGVmdExpc3RgIGFuZCBub3RcbiAqIGluIHRoZSBgcmlnaHRMaXN0YC4gUmV0dXJuIGluIHRoZSBvcmRlciBvZiB0aGVpciBhcHBlYXJhbmNlIGluIGBsZWZ0TGlzdGAuXG4gKiBVc2VzIHRoZSBjb21wYXJpc29uIGJ1aWx0IGludG8gYFNldGAgbWVtYmVyc2hpcCAoU2FtZVZhbHVlWmVybylcbiAqIHdoaWNoIGlzIGxpa2UgSmF2YVNjcmlwdCdzIGA9PT1gIGV4Y2VwdCB0aGF0IGl0IGp1ZGdlcyBhbnkgYE5hTmAgdG9cbiAqIGJlIHRoZSBzYW1lIGFzIGFueSBgTmFOYCBhbmQgaXQganVkZ2VzIGAwYCB0byBiZSB0aGUgc2FtZSBhIGAtMGAuXG4gKlxuICogVGhpcyBpcyBvZnRlbiB1c2VkIG9uIGxpc3RzIG9mIG5hbWVzIHRoYXQgc2hvdWxkIG1hdGNoLCBpbiBvcmRlciB0byBnZW5lcmF0ZVxuICogdXNlZnVsIGRpYWdub3N0aWNzIGFib3V0IHRoZSB1bm1hdGNoZWQgbmFtZXMuXG4gKlxuICogQHRlbXBsYXRlIHthbnl9IFZcbiAqIEBwYXJhbSB7VltdfSBsZWZ0TGlzdFxuICogQHBhcmFtIHtWW119IHJpZ2h0TGlzdFxuICovXG4gICAgICAgY29uc3QgbGlzdERpZmZlcmVuY2UgPSAobGVmdExpc3QsIHJpZ2h0TGlzdCkgPT4ge1xuICBjb25zdCByaWdodFNldCA9IG5ldyBTZXQocmlnaHRMaXN0KTtcbiAgcmV0dXJuIGxlZnRMaXN0LmZpbHRlcihlbGVtZW50ID0+ICFyaWdodFNldC5oYXMoZWxlbWVudCkpO1xufTskaM2PX29uY2UubGlzdERpZmZlcmVuY2UobGlzdERpZmZlcmVuY2UpO1xuaGFyZGVuKGxpc3REaWZmZXJlbmNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACXsXfd5BAAAeQQAACsAAABAZW5kby9jb21tb24tdjEuMi4xMy9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzeyJpbXBvcnRzIjpbIi4vbWFrZS1pdGVyYXRvci5qcyJdLCJleHBvcnRzIjpbIm1ha2VBcnJheUl0ZXJhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZUl0ZXJhdG9yOyRozY9faW1wb3J0cyhbW1wiLi9tYWtlLWl0ZXJhdG9yLmpzXCIsIFtbXCJtYWtlSXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlSXRlcmF0b3IgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEEgYGhhcmRlbmBpbmcgYW5hbG9nIG9mIEFycmF5LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtBcnJheTxUPn0gYXJyXG4gKiBAcmV0dXJucyB7SXRlcmFibGVJdGVyYXRvcjxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VBcnJheUl0ZXJhdG9yID0gYXJyID0+IHtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGFycjtcbiAgbGV0IGkgPSAwO1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHtcbiAgICAvKiogQHR5cGUge1R9ICovXG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICB2YWx1ZSA9IGFycltpXTtcbiAgICAgIGkgKz0gMTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gICAgfVxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgVGhlIHRlcm1pbmFsIHZhbHVlIGRvZXNuJ3QgbWF0dGVyKi9cbiAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWUgfSk7XG4gIH0pO1xufTskaM2PX29uY2UubWFrZUFycmF5SXRlcmF0b3IobWFrZUFycmF5SXRlcmF0b3IpO1xuaGFyZGVuKG1ha2VBcnJheUl0ZXJhdG9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBcnJheUl0ZXJhdG9yIjpbIm1ha2VBcnJheUl0ZXJhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF02r3oGAwAABgMAACUAAABAZW5kby9jb21tb24tdjEuMi4xMy9tYWtlLWl0ZXJhdG9yLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlSXRlcmF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyoqXG4gKiBNYWtlcyBhIG9uZS1zaG90IGl0ZXJhYmxlIGl0ZXJhdG9yIGZyb20gYSBwcm92aWRlZCBgbmV4dGAgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0geygpID0+IEl0ZXJhdG9yUmVzdWx0PFQ+fSBuZXh0XG4gKiBAcmV0dXJucyB7SXRlcmFibGVJdGVyYXRvcjxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VJdGVyYXRvciA9IG5leHQgPT4ge1xuICBjb25zdCBpdGVyID0gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gaXRlcixcbiAgICBuZXh0LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXI7XG59OyRozY9fb25jZS5tYWtlSXRlcmF0b3IobWFrZUl0ZXJhdG9yKTtcbmhhcmRlbihtYWtlSXRlcmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUl0ZXJhdG9yIjpbIm1ha2VJdGVyYXRvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB256sZbwoAAG8KAAAiAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1hcC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsib2JqZWN0TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO2NvbnN0IHsgZW50cmllcywgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2ZcbiAqIGFuIGFycmF5IHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLFxuICogYG9iamVjdE1hcGAgd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIHN0cmluZy1uYW1lZCBvd24gZW51bWVyYWJsZVxuICogcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVHlwaWNhbCB1c2FnZSBhcHBsaWVzIGBvYmplY3RNYXBgIHRvIGEgQ29weVJlY29yZCwgaS5lLixcbiAqIGFuIG9iamVjdCBmb3Igd2hpY2ggYHBhc3NTdHlsZU9mKG9yaWdpbmFsKSA9PT0gJ2NvcHlSZWNvcmQnYC4gRm9yIHRoZXNlLFxuICogbm9uZSBvZiB0aGUgZm9sbG93aW5nIGVkZ2UgY2FzZXMgYXJpc2UuIFRoZSByZXN1bHQgd2lsbCBiZSBhIENvcHlSZWNvcmRcbiAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lcywgd2hvc2UgdmFsdWVzIGFyZSB0aGUgbWFwcGVkIGZvcm0gb2ZcbiAqIHRoZSBvcmlnaW5hbCdzIHZhbHVlcy5cbiAqXG4gKiBXaGVuIHRoZSBvcmlnaW5hbCBpcyBub3QgYSBDb3B5UmVjb3JkLCBzb21lIGVkZ2UgY2FzZXMgdG8gYmUgYXdhcmUgb2ZcbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIE9ubHkgdGhlIHN0cmluZy1uYW1lZCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbFxuICogICAgICBhcmUgbWFwcGVkLiBBbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgaWdub3JlZC5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCBgT2JqZWN0LmVudHJpZXNgXG4gKiAgICAgIHdpbGwgY2F1c2UgaXRzIGBnZXR0ZXJgIHRvIGJlIGNhbGxlZCBhbmQgd2lsbCB1c2UgdGhlIHJlc3VsdGluZ1xuICogICAgICB2YWx1ZS5cbiAqICAgICogTm8gbWF0dGVyIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHByb3BlcnR5IHdhcyBhbiBhY2Nlc3Nvciwgd3JpdGFibGUsXG4gKiAgICAgIG9yIGNvbmZpZ3VyYWJsZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogICAgICBub24td3JpdGFibGUsIG5vbi1jb25maWd1cmFibGUsIGRhdGEgcHJvcGVydGllcy5cbiAqICAgICogTm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBtYXkgaGF2ZSBpbmhlcml0ZWQgZnJvbSwgYW5kXG4gKiAgICAgIG5vIG1hdHRlciB3aGV0aGVyIGl0IHdhcyBhIHNwZWNpYWwga2luZCBvZiBvYmplY3Qgc3VjaCBhcyBhbiBhcnJheSxcbiAqICAgICAgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCBpbmhlcml0aW5nIGRpcmVjdGx5XG4gKiAgICAgIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFuZCB3aG9zZSBzdGF0ZSBpcyBvbmx5IHRoZXNlIG5ldyBtYXBwZWRcbiAqICAgICAgb3duIHByb3BlcnRpZXMuXG4gKlxuICogV2l0aCB0aGVzZSBkaWZmZXJlbmNlcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyBub3QgYSBDb3B5UmVjb3JkLFxuICogaWYgYWxsIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqIGEgQ29weVJlY29yZC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IE9cbiAqIEB0ZW1wbGF0ZSBSIG1hcCByZXN1bHRcbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW2tleW9mIE9dLCBrZXk6IGtleW9mIE8pID0+IFJ9IG1hcEZuXG4gKiBAcmV0dXJucyB7UmVjb3JkPGtleW9mIE8sIFI+fVxuICovXG4gICAgICAgY29uc3Qgb2JqZWN0TWFwID0gKG9yaWdpbmFsLCBtYXBGbikgPT4ge1xuICBjb25zdCBlbnRzID0gZW50cmllcyhvcmlnaW5hbCk7XG4gIGNvbnN0IG1hcEVudHMgPSBlbnRzLm1hcChcbiAgICAoW2ssIHZdKSA9PiAvKiogQHR5cGUge1trZXlvZiBPLCBSXX0gKi8gKFtrLCBtYXBGbih2LCBrKV0pLFxuICApO1xuICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8a2V5b2YgTywgUj59ICovIChoYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cykpKTtcbn07JGjNj19vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKiaINo7CQAAOwkAACcAAABAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWV0YS1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1ldGFNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Y29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBjcmVhdGUsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qKlxuICogTGlrZSBgb2JqZWN0TWFwYCwgYnV0IGF0IHRoZSByZWZsZWN0aXZlIGxldmVsIG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzXG4gKiByYXRoZXIgdGhhbiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogRXhjZXB0IGZvciBoYXJkZW5pbmcsIHRoZSBlZGdlIGNhc2UgYmVoYXZpb3IgaXMgbW9zdGx5IHRoZSBvcHBvc2l0ZSBvZlxuICogdGhlIGBvYmplY3RNYXBgIGVkZ2UgY2FzZXMuXG4gKiAgICAqIE5vIG1hdHRlciBob3cgbXV0YWJsZSB0aGUgb3JpZ2luYWwgb2JqZWN0LCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzXG4gKiAgICAgIGhhcmRlbmVkLlxuICogICAgKiBBbGwgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsIGFyZSBtYXBwZWQsIGV2ZW4gaWYgc3ltYm9sLW5hbWVkXG4gKiAgICAgIG9yIG5vbi1lbnVtZXJhYmxlLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIHRoZSBkZXNjcmlwdG9yXG4gKiAgICAgIGNvbnRhaW5pbmcgdGhlIGdldHRlciBhbmQgc2V0dGVyIGFyZSBnaXZlbiB0byBgbWV0YU1hcEZuYC5cbiAqICAgICogVGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBhcmUgYWNjb3JkaW5nIHRvIHRoZSBkZXNjcmlwdG9yc1xuICogICAgICByZXR1cm5lZCBieSBgbWV0YU1hcEZuYC5cbiAqICAgICogVGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCB3aG9zZSBzdGF0ZSBpc1xuICogICAgICBvbmx5IHRoZXNlIG1hcHBlZCBvd24gcHJvcGVydGllcy4gSXQgd2lsbCBpbmhlcml0IGZyb20gdGhlIHRoaXJkXG4gKiAgICAgIGFyZ3VtZW50IGlmIHByb3ZpZGVkLCBkZWZhdWx0aW5nIHRvIGBPYmplY3QucHJvdG90eXBlYCBpZiBvbWl0dGVkLlxuICpcbiAqIEJlY2F1c2UgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGlzIGRpc3RpbmN0IGZyb20gYHVuZGVmaW5lZGAsIHdlIGJ1bmRsZVxuICogbWFwcGluZyBhbmQgZmlsdGVyaW5nIHRvZ2V0aGVyLiBXaGVuIHRoZSBgbWV0YU1hcEZuYCByZXR1cm5zIGB1bmRlZmluZWRgLFxuICogdGhhdCBwcm9wZXJ0eSBpcyBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgYW55Pn0gT1xuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHBhcmFtIHsoXG4gKiAgIGRlc2M6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPE9ba2V5b2YgT10+LFxuICogICBrZXk6IGtleW9mIE9cbiAqICkgPT4gKFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCl9IG1ldGFNYXBGblxuICogQHBhcmFtIHthbnl9IFtwcm90b11cbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbiAgICAgICBjb25zdCBvYmplY3RNZXRhTWFwID0gKFxuICBvcmlnaW5hbCxcbiAgbWV0YU1hcEZuLFxuICBwcm90byA9IE9iamVjdC5wcm90b3R5cGUsXG4pID0+IHtcbiAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9yaWdpbmFsKTtcbiAgY29uc3Qga2V5cyA9IG93bktleXMob3JpZ2luYWwpO1xuXG4gIGNvbnN0IGRlc2NFbnRyaWVzID0gLyoqIEB0eXBlIHtbUHJvcGVydHlLZXksUHJvcGVydHlEZXNjcmlwdG9yXVtdfSAqLyAoXG4gICAga2V5c1xuICAgICAgLm1hcChrZXkgPT4gW2tleSwgbWV0YU1hcEZuKGRlc2NzW2tleV0sIGtleSldKVxuICAgICAgLmZpbHRlcigoW19rZXksIG9wdERlc2NdKSA9PiBvcHREZXNjICE9PSB1bmRlZmluZWQpXG4gICk7XG4gIHJldHVybiBoYXJkZW4oY3JlYXRlKHByb3RvLCBmcm9tRW50cmllcyhkZXNjRW50cmllcykpKTtcbn07JGjNj19vbmNlLm9iamVjdE1ldGFNYXAob2JqZWN0TWV0YU1hcCk7XG5oYXJkZW4ob2JqZWN0TWV0YU1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJvYmplY3RNZXRhTWFwIjpbIm9iamVjdE1ldGFNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2LNBgpkFAACZBQAAJQAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL3Rocm93LWxhYmVsZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsidGhyb3dMYWJlbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBHaXZlbiBhbiBlcnJvciBgaW5uZXJFcnJgIGFuZCBhIGBsYWJlbGAsIHRocm93cyBhIHNpbWlsYXJcbiAqIGVycm9yIHdob3NlIG1lc3NhZ2Ugc3RyaW5nIGlzIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAuXG4gKiBTZWUgYGFwcGx5TGFiZWxpbmdFcnJvcmAgZm9yIHRoZSBtb3RpdmF0aW5nIHVzZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBpbm5lckVyclxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBsYWJlbFxuICogQHBhcmFtIHtJTVBPUlQoJ3NlcycpLkdlbmVyaWNFcnJvckNvbnN0cnVjdG9yfSBbZXJyQ29uc3RydWN0b3JdXG4gKiBAcGFyYW0ge0lNUE9SVCgnc2VzJykuQXNzZXJ0TWFrZUVycm9yT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cbiAgICAgICBjb25zdCB0aHJvd0xhYmVsZWQgPSAoXG4gIGlubmVyRXJyLFxuICBsYWJlbCxcbiAgZXJyQ29uc3RydWN0b3IgPSB1bmRlZmluZWQsXG4gIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKHR5cGVvZiBsYWJlbCA9PT0gJ251bWJlcicpIHtcbiAgICBsYWJlbCA9IGBbJHtsYWJlbH1dYDtcbiAgfVxuICBjb25zdCBvdXRlckVyciA9IG1ha2VFcnJvcihcbiAgICBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLFxuICAgIGVyckNvbnN0cnVjdG9yLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIGFubm90YXRlRXJyb3Iob3V0ZXJFcnIsIFhgQ2F1c2VkIGJ5ICR7aW5uZXJFcnJ9YCk7XG4gIHRocm93IG91dGVyRXJyO1xufTskaM2PX29uY2UudGhyb3dMYWJlbGVkKHRocm93TGFiZWxlZCk7XG5oYXJkZW4odGhyb3dMYWJlbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANKKhqaIBAACiAQAAIgAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC8ATOCOBYAADgWAAAsAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9zcmMvZW52LW9wdGlvbnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiLCJnZXRFbnZpcm9ubWVudE9wdGlvbiIsImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiLCJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogZ2xvYmFsIGdsb2JhbFRoaXMgKi9cbi8qIEB0cy1jaGVjayovXG5cbi8qIGBAZW5kby9lbnYtb3B0aW9uc2AgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgcXVpdGUgZWFybHksIGFuZCBzbyBzaG91bGQqL1xuLyogYXZvaWQgaW1wb3J0aW5nIGZyb20gc2VzIG9yIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiBzZXMuKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuLyogUHJlbHVkZSBvZiBjaGVhcCBnb29kIC0gZW5vdWdoIGltaXRhdGlvbnMgb2YgdGhpbmdzIHdlJ2QgdXNlIG9yKi9cbi8qIGRvIGRpZmZlcmVudGx5IGlmIHdlIGNvdWxkIGRlcGVuZCBvbiBzZXMqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbmNvbnN0IGxvY2FsVGhpcyA9IGdsb2JhbFRoaXM7XG5cbmNvbnN0IHsgT2JqZWN0LCBSZWZsZWN0LCBBcnJheSwgU3RyaW5nLCBKU09OLCBFcnJvciB9ID0gbG9jYWxUaGlzO1xuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qIFNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHRoZSBvbmUgaW4gc2VzJyBjb21tb25zLmpzIGV2ZW4gdGhvdWdoIGl0Ki9cbi8qIHVzZXMgdGhlIG90aGVyIHRlY2huaXF1ZS4qL1xuY29uc3QgdW5jdXJyeVRoaXMgPVxuICBmbiA9PlxuICAocmVjZWl2ZXIsIC4uLmFyZ3MpID0+XG4gICAgYXBwbHkoZm4sIHJlY2VpdmVyLCBhcmdzKTtcbmNvbnN0IGFycmF5UHVzaCA9IHVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbmNvbnN0IGFycmF5SW5jbHVkZXMgPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpO1xuY29uc3Qgc3RyaW5nU3BsaXQgPSB1bmN1cnJ5VGhpcyhTdHJpbmcucHJvdG90eXBlLnNwbGl0KTtcblxuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBGYWlsID0gKGxpdGVyYWxzLCAuLi5hcmdzKSA9PiB7XG4gIGxldCBtc2cgPSBsaXRlcmFsc1swXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbXNnID0gYCR7bXNnfSR7YXJnc1tpXX0ke2xpdGVyYWxzW2kgKyAxXX1gO1xuICB9XG4gIHRocm93IEVycm9yKG1zZyk7XG59O1xuXG4vKiBlbmQgcHJlbHVkZSovXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogYG1ha2VFbnZpcm9ubWVudENhcHRvcmAgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGdldHRpbmcgZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlcywgaWYgdGhleSBhcmUgbmVlZGVkLCBhbmQgYSB3YXkgdG8gY2F0YWxvZyB0aGUgbmFtZXMgb2YgYWxsXG4gKiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2VyZSBjYXB0dXJlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYUdsb2JhbFxuICogQHBhcmFtIHtib29sZWFufSBbZHJvcE5hbWVzXSBEZWZhdWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgZG9uJ3QgdHJhY2tcbiAqIG5hbWVzIHVzZWQuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW52aXJvbm1lbnRDYXB0b3IgPSAoYUdsb2JhbCwgZHJvcE5hbWVzID0gZmFsc2UpID0+IHtcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzID0gW107XG5cbiAgLyoqXG4gKiBHZXRzIGFuIGVudmlyb25tZW50IG9wdGlvbiBieSBuYW1lIGFuZCByZXR1cm5zIHRoZSBvcHRpb24gdmFsdWUgb3IgdGhlXG4gKiBnaXZlbiBkZWZhdWx0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVmYXVsdFNldHRpbmdcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtvcHRPdGhlclZhbHVlc11cbiAqIElmIHByb3ZpZGVkLCB0aGUgb3B0aW9uIHZhbHVlIG11c3QgYmUgaW5jbHVkZWQgb3IgbWF0Y2ggYGRlZmF1bHRTZXR0aW5nYC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbiAgY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAoXG4gICAgb3B0aW9uTmFtZSxcbiAgICBkZWZhdWx0U2V0dGluZyxcbiAgICBvcHRPdGhlclZhbHVlcyA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgdHlwZW9mIG9wdGlvbk5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lICR7cShvcHRpb25OYW1lKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuICAgIHR5cGVvZiBkZWZhdWx0U2V0dGluZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgRW52aXJvbm1lbnQgb3B0aW9uIGRlZmF1bHQgc2V0dGluZyAke3EoXG4gICAgICAgIGRlZmF1bHRTZXR0aW5nLFxuICAgICAgKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgbGV0IHNldHRpbmcgPSBkZWZhdWx0U2V0dGluZztcbiAgICBjb25zdCBnbG9iYWxQcm9jZXNzID0gYUdsb2JhbC5wcm9jZXNzIHx8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBnbG9iYWxFbnYgPVxuICAgICAgKHR5cGVvZiBnbG9iYWxQcm9jZXNzID09PSAnb2JqZWN0JyAmJiBnbG9iYWxQcm9jZXNzLmVudikgfHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsRW52ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKG9wdGlvbk5hbWUgaW4gZ2xvYmFsRW52KSB7XG4gICAgICAgIGlmICghZHJvcE5hbWVzKSB7XG4gICAgICAgICAgYXJyYXlQdXNoKGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcywgb3B0aW9uTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBnbG9iYWxFbnZbb3B0aW9uTmFtZV07XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsKi9cbiAgICAgICAgdHlwZW9mIG9wdGlvblZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIEZhaWxgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWVkICR7cShcbiAgICAgICAgICAgIG9wdGlvbk5hbWUsXG4gICAgICAgICAgKX0sIGlmIHByZXNlbnQsIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgc3RyaW5nIHZhbHVlLCBnb3QgJHtxKFxuICAgICAgICAgICAgb3B0aW9uVmFsdWUsXG4gICAgICAgICAgKX1gO1xuICAgICAgICBzZXR0aW5nID0gb3B0aW9uVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIG9wdE90aGVyVmFsdWVzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHNldHRpbmcgPT09IGRlZmF1bHRTZXR0aW5nIHx8XG4gICAgICBhcnJheUluY2x1ZGVzKG9wdE90aGVyVmFsdWVzLCBzZXR0aW5nKSB8fFxuICAgICAgRmFpbGBVbnJlY29nbml6ZWQgJHtxKG9wdGlvbk5hbWUpfSB2YWx1ZSAke3EoXG4gICAgICAgIHNldHRpbmcsXG4gICAgICApfS4gRXhwZWN0ZWQgb25lIG9mICR7cShbZGVmYXVsdFNldHRpbmcsIC4uLm9wdE90aGVyVmFsdWVzXSl9YDtcbiAgICByZXR1cm4gc2V0dGluZztcbiAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBbVD1zdHJpbmddXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0ID0gb3B0aW9uTmFtZSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJycpO1xuICAgIHJldHVybiBmcmVlemUob3B0aW9uID09PSAnJyA/IFtdIDogc3RyaW5nU3BsaXQob3B0aW9uLCAnLCcpKTtcbiAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFtUPXN0cmluZ11cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcGFyYW0ge1R9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAob3B0aW9uTmFtZSwgZWxlbWVudCkgPT5cbiAgICBhcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksIGVsZW1lbnQpO1xuXG4gIGNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9ICgpID0+IHtcbiAgICByZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiAgfTtcbiAgZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxuICAgIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuXG4vKipcbiAqIEZvciB0aGUgc2ltcGxlIGNhc2UsIHdoZXJlIHRoZSBnbG9iYWwgaW4gcXVlc3Rpb24gaXMgYGdsb2JhbFRoaXNgIGFuZCBub1xuICogcmVwb3J0aW5nIG9mIG9wdGlvbiBuYW1lcyBpcyBkZXNpcmVkLlxuICovXG4gICAgICAgY29uc3Qge1xuICBnZXRFbnZpcm9ubWVudE9wdGlvbixcbiAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyxcbn0gPSBtYWtlRW52aXJvbm1lbnRDYXB0b3IobG9jYWxUaGlzLCB0cnVlKTskaM2PX29uY2UuZ2V0RW52aXJvbm1lbnRPcHRpb24oZ2V0RW52aXJvbm1lbnRPcHRpb24pOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpOyRozY9fb25jZS5lbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVudmlyb25tZW50Q2FwdG9yIjpbIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJnZXRFbnZpcm9ubWVudE9wdGlvbiI6WyJnZXRFbnZpcm9ubWVudE9wdGlvbiJdLCJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0IjpbImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiXSwiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyI6WyJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGpmduJkDQAAZA0AAB0AAABAZW5kby9lcnJvcnMtdjEuMi4xMy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiRmFpbCIsIlgiLCJhbm5vdGF0ZUVycm9yIiwiYXNzZXJ0IiwiYiIsImJhcmUiLCJtYWtlRXJyb3IiLCJub3RlIiwicSIsInF1b3RlIiwicmVkYWN0ZWQiLCJ0aHJvd1JlZGFjdGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4vKiBUaGlzIG1vZHVsZSBhc3N1bWVzIHRoZSBleGlzdGVuY2Ugb2YgYSBub24tc3RhbmRhcmQgYGFzc2VydGAgaG9zdCBvYmplY3QuKi9cbi8qIFNFUyB2ZXJzaW9uIDAuMTEuMCBpbnRyb2R1Y2VzIHRoaXMgZ2xvYmFsIG9iamVjdCBhbmQgZW50YW5nbGVzIGl0Ki9cbi8qIHdpdGggdGhlIGBjb25zb2xlYCBob3N0IG9iamVjdCBpbiBzY29wZSB3aGVuIGl0IGluaXRpYWxpemVzLCovXG4vKiBhbGxvd2luZyBlcnJvcnMsIHBhcnRpY3VsYXJseSBhc3NlcnRpb24gZXJyb3JzLCB0byBoaWRlIHRoZWlyIFwiZGV0YWlsc1wiKi9cbi8qIGZyb20gY2FsbGVycyB0aGF0IG1pZ2h0IGNhdGNoIHRob3NlIGVycm9ycywgdGhlbiByZXZlYWwgdGhlbSB0byB0aGUqL1xuLyogdW5kZXJseWluZyBjb25zb2xlLiovXG4vKiBUbyB0aGUgZXh0ZW50IHRoYXQgdGhpcyBgY29uc29sZWAgaXMgY29uc2lkZXJlZCBhIHJlc291cmNlLCovXG4vKiB0aGlzIG1vZHVsZSBtdXN0IGJlIGNvbnNpZGVyZWQgYSByZXNvdXJjZSBtb2R1bGUuKi9cblxuLyogVGhlIGFzc2VydGlvbnMgcmUtZXhwb3J0ZWQgaGVyZSBhcmUgZGVmaW5lZCBpbiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9IRUFEL3BhY2thZ2VzL3Nlcy9zcmMvZXJyb3IvYXNzZXJ0LmpzKi9cblxuY29uc3QgZ2xvYmFsQXNzZXJ0ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbmlmIChnbG9iYWxBc3NlcnQgPT09IHVuZGVmaW5lZCkge1xuICB0aHJvdyBFcnJvcihcbiAgICBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0LCBpbXBvcnQgJ3NlcycgYmVmb3JlICdAZW5kby9lcnJvcnMnYCxcbiAgKTtcbn1cblxuY29uc3QgbWlzc2luZyA9IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbXG4gICd0eXBlb2YnLFxuICAnZXJyb3InLFxuICAnZmFpbCcsXG4gICdlcXVhbCcsXG4gICdzdHJpbmcnLFxuICAnbm90ZScsXG4gICdkZXRhaWxzJyxcbiAgJ0ZhaWwnLFxuICAncXVvdGUnLFxuICAvKiBBcyBvZiAyMDI0LTAyLCB0aGUgQWdvcmljIGNoYWluJ3MgYm9vdHN0cmFwIHZhdCBydW5zIHdpdGggYSB2ZXJzaW9uIG9mIFNFUyB0aGF0Ki9cbiAgLyogcHJlZGF0ZXMgYWRkaXRpb24gb2YgdGhlICdiYXJlJyBtZXRob2QsIHNvIHdlIG11c3QgdG9sZXJhdGUgaXRzIGFic2VuY2UgYW5kIGZhbGwqL1xuICAvKiBiYWNrIHRvIHF1b3RlIGJlaGF2aW9yIGluIHRoYXQgZW52aXJvbm1lbnQgKHNlZSBiZWxvdykuKi9cbiAgLyogJ2JhcmUnLCovXG4gICdtYWtlQXNzZXJ0Jyxcbl0pLmZpbHRlcihuYW1lID0+IGdsb2JhbEFzc2VydFtuYW1lXSA9PT0gdW5kZWZpbmVkKTtcbmlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgdGhyb3cgRXJyb3IoXG4gICAgYENhbm5vdCBpbml0aWFsaXplIEBlbmRvL2Vycm9ycywgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCBtZXRob2RzICR7bWlzc2luZy5qb2luKFxuICAgICAgJywgJyxcbiAgICApfWAsXG4gICk7XG59XG5cbi8qIFRoZSBnbG9iYWwgYXNzZXJ0IG1peGVkIGFzc2VydGlvbnMgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLiovXG4vKiBUaGlzIG1vZHVsZSBzcGxpdHMgdGhlbSBhcGFydCovXG4vKiBhbmQgYWxzbyB1cGRhdGVzIHRoZSBuYW1lcyBvZiB0aGUgdXRpbGl0eSBmdW5jdGlvbnMuKi9cbmNvbnN0IHtcbiAgYmFyZSxcbiAgZGV0YWlsczogcmVkYWN0ZWQsXG4gIGVycm9yOiBtYWtlRXJyb3IsXG4gIEZhaWw6IHRocm93UmVkYWN0ZWQsXG4gIG1ha2VBc3NlcnQ6IF9vbWl0dGVkTWFrZUFzc2VydCxcbiAgbm90ZSxcbiAgcXVvdGUsXG4gIC4uLmFzc2VydGlvbnNcbn0gPSBnbG9iYWxBc3NlcnQ7XG4vKiogQHR5cGUge0lNUE9SVChcInNlc1wiKS5Bc3NlcnRpb25GdW5jdGlvbnMgfSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBtaXNzaW5nIHByb3BlcnRpZXMgYXNzaWduZWQgbmV4dCovJGjNj19vbmNlLnJlZGFjdGVkKHJlZGFjdGVkKTskaM2PX29uY2UubWFrZUVycm9yKG1ha2VFcnJvcik7JGjNj19vbmNlLnRocm93UmVkYWN0ZWQodGhyb3dSZWRhY3RlZCk7JGjNj19vbmNlLm5vdGUobm90ZSk7JGjNj19vbmNlLnF1b3RlKHF1b3RlKTtcbmNvbnN0IGFzc2VydCA9ICh2YWx1ZSwgb3B0RGV0YWlscywgZXJyQ29udHJ1Y3Rvciwgb3B0aW9ucykgPT5cbiAgZ2xvYmFsQXNzZXJ0KHZhbHVlLCBvcHREZXRhaWxzLCBlcnJDb250cnVjdG9yLCBvcHRpb25zKTskaM2PX29uY2UuYXNzZXJ0KGFzc2VydCk7XG5PYmplY3QuYXNzaWduKGFzc2VydCwgYXNzZXJ0aW9ucyk7XG5cbi8qIEFzIG9mIDIwMjQtMDIsIHRoZSBBZ29yaWMgY2hhaW4ncyBib290c3RyYXAgdmF0IHJ1bnMgd2l0aCBhIHZlcnNpb24gb2YgU0VTKi9cbi8qIHRoYXQgcHJlZGF0ZXMgdGhlIGFkZGl0aW9uIG9mIHRoZSAnYmFyZScgbWV0aG9kLCBzbyB3ZSBtdXN0IGZhbGwgYmFjayB0byovXG4vKiBxdW90ZSBiZWhhdmlvciBmb3IgdGhhdCBlbnZpcm9ubWVudC4qL1xuY29uc3QgYmFyZU9yUXVvdGUgPSBiYXJlIHx8IHF1b3RlO1xuXG4vKiBYWFggbW9kdWxlIGV4cG9ydHMgZmFpbCBpZiB0aGVzZSBhcmVuJ3QgaW4gc2NvcGUqL1xuLyoqIEBpbXBvcnQge0Fzc2VydE1ha2VFcnJvck9wdGlvbnMsIERldGFpbHMsIEdlbmVyaWNFcnJvckNvbnN0cnVjdG9yfSBmcm9tICdzZXMnICovJGjNj19vbmNlLmJhcmVPclF1b3RlKGJhcmVPclF1b3RlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlZGFjdGVkIjpbInJlZGFjdGVkIl0sIlgiOlsicmVkYWN0ZWQiXSwibWFrZUVycm9yIjpbIm1ha2VFcnJvciJdLCJ0aHJvd1JlZGFjdGVkIjpbInRocm93UmVkYWN0ZWQiXSwiRmFpbCI6WyJ0aHJvd1JlZGFjdGVkIl0sIm5vdGUiOlsibm90ZSJdLCJhbm5vdGF0ZUVycm9yIjpbIm5vdGUiXSwicXVvdGUiOlsicXVvdGUiXSwicSI6WyJxdW90ZSJdLCJhc3NlcnQiOlsiYXNzZXJ0Il0sImJhcmUiOlsiYmFyZU9yUXVvdGUiXSwiYiI6WyJiYXJlT3JRdW90ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADT6UYIEEcAABBHAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyIsIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCB0cmFja1R1cm5zLG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcjskaM2PX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIixbJGjNj19hID0+ICh0cmFja1R1cm5zID0gJGjNj19hKV1dXV0sW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIixbJGjNj19hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbmNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEsIEZhaWwsIGVycm9yOiBtYWtlRXJyb3IgfSA9IGFzc2VydDtcbmNvbnN0IHsgYXNzaWduLCBmcmVlemUgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAaW1wb3J0IHsgSGFuZGxlZFByb21pc2VDb25zdHJ1Y3RvciwgUmVtb3RhYmxlQnJhbmQsIENhbGxhYmxlLCBTZXR0bGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuY29uc3Qgb25TZW5kID0gbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX1NFTkRfQlJFQUtQT0lOVFMnKTtcblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIgPSB7XG4gIHNldChfdGFyZ2V0LCBfcHJvcCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBpc0V4dGVuc2libGUoX3RhcmdldCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgc2V0UHJvdG90eXBlT2YoX3RhcmdldCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eShfdGFyZ2V0LCBfcHJvcCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbn07XG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHthbnl9IHJlY2lwaWVudCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUoeClcbiAqIEBwYXJhbSB7SGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXI8dW5rbm93bj59IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFUHJveHlIYW5kbGVyID0gKHJlY2lwaWVudCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgIHJldHVybiBoYXJkZW4oXG4gICAgICAgIHtcbiAgICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4gICAgICAgICAgLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbiAgICAgICAgICAvKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuICAgICAgICAgIC8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbiAgICAgICAgICAvKiogQHR5cGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTx1bmtub3duPn0gKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzICE9PSByZWNlaXZlcikge1xuICAgICAgICAgICAgICAvKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xuICAgICAgICAgICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UucmVqZWN0KFxuICAgICAgICAgICAgICAgIG1ha2VFcnJvcihcbiAgICAgICAgICAgICAgICAgIFhgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocHJvcGVydHlLZXkpfVwiIG1ldGhvZCBvZiBFKCR7cShcbiAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICAgICAgKX0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgICAgICAgICAgIGRlYnVnZ2VyOyAvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4gICAgICAgICAgICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBtZXRob2QtY2FsbCovXG4gICAgICAgICAgICAgIC8qIG1lc3NhZ2UsKi9cbiAgICAgICAgICAgICAgLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbiAgICAgICAgICAgICAgLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kKHJlY2lwaWVudCwgcHJvcGVydHlLZXksIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdBcnJheSA9IFtdKSA9PiB7XG4gICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgICAgICBkZWJ1Z2dlcjsgLyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuICAgICAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgZnVuY3Rpb24tY2FsbCBtZXNzYWdlLCovXG4gICAgICAgIC8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4gICAgICAgIC8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHJlY2lwaWVudCwgYXJnQXJyYXkpO1xuICAgIH0sXG4gICAgaGFzOiAoX3RhcmdldCwgX3ApID0+IHtcbiAgICAgIC8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFLnNlbmRPbmx5KHgpXG4gKiBJdCBpcyBhIHZhcmlhbnQgb24gdGhlIEUoeCkgUHJveHkgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcmVjaXBpZW50IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcjx1bmtub3duPn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVTZW5kT25seVByb3h5SGFuZGxlciA9IChyZWNpcGllbnQsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcGVydHlLZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKFxuICAgICAgICB7XG4gICAgICAgICAgLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuICAgICAgICAgIC8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4gICAgICAgICAgLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbiAgICAgICAgICAvKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG4gICAgICAgICAgLyoqIEB0eXBlIHsoLi4uYXJnczogYW55W10pID0+IHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIC8qIFRocm93IHNpbmNlIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vdGhpbmcqL1xuICAgICAgICAgICAgdGhpcyA9PT0gcmVjZWl2ZXIgfHxcbiAgICAgICAgICAgICAgRmFpbGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICAgICAgKX1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EocmVjaXBpZW50KX0pYDtcbiAgICAgICAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICAgICAgICAgICAgZGVidWdnZXI7IC8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbiAgICAgICAgICAgICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIG1ldGhvZC1jYWxsKi9cbiAgICAgICAgICAgICAgLyogbWVzc2FnZSwqL1xuICAgICAgICAgICAgICAvKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuICAgICAgICAgICAgICAvKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHJlY2lwaWVudCwgcHJvcGVydHlLZXksIGFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki9cbiAgICAgICAgfVtwcm9wZXJ0eUtleV0sXG4gICAgICApO1xuICAgIH0sXG4gICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJnc0FycmF5ID0gW10pID0+IHtcbiAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgICAgIGRlYnVnZ2VyOyAvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4gICAgICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBmdW5jdGlvbi1jYWxsIG1lc3NhZ2UsKi9cbiAgICAgICAgLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbiAgICAgICAgLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuICAgICAgfVxuICAgICAgSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvblNlbmRPbmx5KHJlY2lwaWVudCwgYXJnc0FycmF5KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICBoYXM6IChfdGFyZ2V0LCBfcCkgPT4ge1xuICAgICAgLyogV2UganVzdCBwcmV0ZW5kIHRoYXQgZXZlcnl0aGluZyBleGlzdHMuKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0pO1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5nZXQoeClcbiAqIEl0IGlzIGEgdmFyaWFudCBvbiB0aGUgRSh4KSBQcm94eSBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7YW55fSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5nZXQoeClcbiAqIEBwYXJhbSB7SGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXI8dW5rbm93bj59IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyID0gKHgsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgaGFzOiAoX3RhcmdldCwgX3Byb3ApID0+IHRydWUsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4gSGFuZGxlZFByb21pc2UuZ2V0KHgsIHByb3ApLFxuICB9KTtcblxuLyoqXG4gKiBgZnJlZXplYCBidXQgbm90IGBoYXJkZW5gIHRoZSBwcm94eSB0YXJnZXQgc28gaXQgcmVtYWlucyB0cmFwcGluZy5cbiAqIFRodXMsIGl0IHNob3VsZCBub3QgYmUgc2hhcmVkIG91dHNpZGUgdGhpcyBtb2R1bGUuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2VzL2RvY3MvcHJlcGFyaW5nLWZvci1zdGFiaWxpemUubWRcbiAqL1xuY29uc3QgZnVuY1RhcmdldCA9IGZyZWV6ZSgoKSA9PiB7fSk7XG5cbi8qKlxuLyoqXG4gKiBgZnJlZXplYCBidXQgbm90IGBoYXJkZW5gIHRoZSBwcm94eSB0YXJnZXQgc28gaXQgcmVtYWlucyB0cmFwcGluZy5cbiAqIFRodXMsIGl0IHNob3VsZCBub3QgYmUgc2hhcmVkIG91dHNpZGUgdGhpcyBtb2R1bGUuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2VzL2RvY3MvcHJlcGFyaW5nLWZvci1zdGFiaWxpemUubWRcbiAqL1xuY29uc3Qgb2JqVGFyZ2V0ID0gZnJlZXplKHsgX19wcm90b19fOiBudWxsIH0pO1xuXG4vKipcbiAqIEBwYXJhbSB7SGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqL1xuY29uc3QgbWFrZUUgPSBIYW5kbGVkUHJvbWlzZSA9PiB7XG4gIHJldHVybiBoYXJkZW4oXG4gICAgYXNzaWduKFxuICAgICAgLyoqXG4gKiBFKHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGNhbGwgYXJiaXRyYXJ5IG1ldGhvZHMuIEVhY2ggb2YgdGhlc2VcbiAqIG1ldGhvZCBjYWxscyByZXR1cm5zIGEgcHJvbWlzZS4gVGhlIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgb24gd2hhdGV2ZXJcbiAqICd4JyBkZXNpZ25hdGVzIChvciByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEFuIGV4YW1wbGUgY2FsbCB3b3VsZCBiZVxuICpcbiAqIEUoem9lKS5pbnN0YWxsKGJ1bmRsZSlcbiAqICAgLnRoZW4oaW5zdGFsbGF0aW9uSGFuZGxlID0+IHsgLi4uIH0pXG4gKiAgIC5jYXRjaChlcnIgPT4geyAuLi4gfSk7XG4gKlxuICogIFNlZSBodHRwczovL2VuZG9qcy5naXRodWIuaW8vZW5kby9mdW5jdGlvbnMvX2VuZG9fZmFyLkUuaHRtbCBmb3IgZGV0YWlscy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgbWV0aG9kL2Z1bmN0aW9uIGNhbGxcbiAqIEByZXR1cm5zIHtFQ2FsbGFibGVPck1ldGhvZHM8UmVtb3RlRnVuY3Rpb25zPFQ+Pn0gbWV0aG9kL2Z1bmN0aW9uIGNhbGwgcHJveHlcbiAqL1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggdHlwZWRlZiovXG4gICAgICB4ID0+IG5ldyBQcm94eShmdW5jVGFyZ2V0LCBtYWtlRVByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuICAgICAge1xuICAgICAgICAvKipcbiAqIEUuZ2V0KHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGdldCBhcmJpdHJhcnkgcHJvcGVydGllcy5cbiAqIEVhY2ggb2YgdGhlc2UgcHJvcGVydGllcyByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHByb3BlcnR5LiAgVGhlIHByb21pc2VcbiAqIHZhbHVlIHdpbGwgYmUgdGhlIHByb3BlcnR5IGZldGNoZWQgZnJvbSB3aGF0ZXZlciAneCcgZGVzaWduYXRlcyAob3JcbiAqIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB0YXJnZXQgZm9yIHByb3BlcnR5IGdldFxuICogQHJldHVybnMge0VHZXR0ZXJzPExvY2FsUmVjb3JkPFQ+Pn0gcHJvcGVydHkgZ2V0IHByb3h5XG4gKiBAcmVhZG9ubHlcbiAqL1xuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCB0eXBlZGVmKi9cbiAgICAgICAgZ2V0OiB4ID0+IG5ldyBQcm94eShvYmpUYXJnZXQsIG1ha2VFR2V0UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLyoqXG4gKiBFLnJlc29sdmUoeCkgY29udmVydHMgeCB0byBhIGhhbmRsZWQgcHJvbWlzZS4gSXQgaXNcbiAqIHNob3J0aGFuZCBmb3IgSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KVxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdmFsdWUgdG8gY29udmVydCB0byBhIGhhbmRsZWQgcHJvbWlzZVxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IGhhbmRsZWQgcHJvbWlzZSBmb3IgeFxuICogQHJlYWRvbmx5XG4gKi9cbiAgICAgICAgcmVzb2x2ZTogSGFuZGxlZFByb21pc2UucmVzb2x2ZSxcblxuICAgICAgICAvKipcbiAqIEUuc2VuZE9ubHkgcmV0dXJucyBhIHByb3h5IHNpbWlsYXIgdG8gRSwgYnV0IGZvciB3aGljaCB0aGUgcmVzdWx0c1xuICogYXJlIGlnbm9yZWQgKHVuZGVmaW5lZCBpcyByZXR1cm5lZCkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB0YXJnZXQgZm9yIG1ldGhvZC9mdW5jdGlvbiBjYWxsXG4gKiBAcmV0dXJucyB7RVNlbmRPbmx5Q2FsbGFibGVPck1ldGhvZHM8UmVtb3RlRnVuY3Rpb25zPFQ+Pn0gbWV0aG9kL2Z1bmN0aW9uIGNhbGwgcHJveHlcbiAqIEByZWFkb25seVxuICovXG4gICAgICAgIHNlbmRPbmx5OiB4ID0+XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggdHlwZWRlZiovXG4gICAgICAgICAgbmV3IFByb3h5KGZ1bmNUYXJnZXQsIG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcblxuICAgICAgICAvKipcbiAqIEUud2hlbih4LCByZXMsIHJlaikgaXMgZXF1aXZhbGVudCB0b1xuICogSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKHJlcywgcmVqKVxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgW1UgPSBUXVxuICogQHBhcmFtIHtUfFByb21pc2VMaWtlPFQ+fSB4IHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBoYW5kbGVkIHByb21pc2VcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBFUmVmPFU+fSBbb25mdWxmaWxsZWRdXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gRVJlZjxVPn0gW29ucmVqZWN0ZWRdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxVPn1cbiAqIEByZWFkb25seVxuICovXG4gICAgICAgIHdoZW46ICh4LCBvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkgPT5cbiAgICAgICAgICBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4oXG4gICAgICAgICAgICAuLi50cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCwgb25yZWplY3RlZF0pLFxuICAgICAgICAgICksXG4gICAgICB9LFxuICAgICksXG4gICk7XG59O1xuXG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6bWFrZUV9O1xuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8bWFrZUU+fSBFUHJveHkgKi9cblxuLyoqXG4gKiBEZWNsYXJlIGFuIG9iamVjdCB0aGF0IGlzIHBvdGVudGlhbGx5IGEgZmFyIHJlZmVyZW5jZSBvZiB0eXBlIFByaW1hcnkgd2hvc2VcbiAqIGF1eGlsbGlhcnkgZGF0YSBoYXMgdHlwZSBMb2NhbC4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgY29uc3VtZXJzIG9mXG4gKiBGYXIgb2JqZWN0cyBpbiBhcmd1bWVudHMgYW5kIGRlY2xhcmF0aW9uczsgdGhlIG9ubHkgY3JlYXRvcnMgb2YgRmFyIG9iamVjdHNcbiAqIGFyZSBkaXN0cmlidXRlZCBvYmplY3QgY3JlYXRvciBjb21wb25lbnRzIGxpa2UgdGhlIGBGYXJgIG9yIGBSZW1vdGFibGVgXG4gKiBmdW5jdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFByaW1hcnkgVGhlIHR5cGUgb2YgdGhlIHByaW1hcnkgcmVmZXJlbmNlLlxuICogQHRlbXBsYXRlIFtMb2NhbD1EYXRhT25seTxQcmltYXJ5Pl0gVGhlIGxvY2FsIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdC5cbiAqIEB0eXBlZGVmIHtFUmVmPExvY2FsICYgUmVtb3RhYmxlQnJhbmQ8TG9jYWwsIFByaW1hcnk+Pn0gRmFyUmVmXG4gKi9cblxuLyoqXG4gKiBgRGF0YU9ubHk8VD5gIG1lYW5zIHRvIHJldHVybiBhIHJlY29yZCB0eXBlIGBUMmAgY29uc2lzdGluZyBvbmx5IG9mXG4gKiBwcm9wZXJ0aWVzIHRoYXQgYXJlICpub3QqIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSB0byBiZSBmaWx0ZXJlZC5cbiAqIEB0eXBlZGVmIHtPbWl0PFQsIEZpbHRlcmVkS2V5czxULCBDYWxsYWJsZT4+fSBEYXRhT25seVxuICovXG5cbi8qKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zMTM5NH1cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7UHJvbWlzZUxpa2U8VD4gfCBUfSBFUmVmXG4gKiBEZWNsYXJlIHRoYXQgYFRgIG1heSBvciBtYXkgbm90IGJlIGEgUHJvbWlzZS4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSBmb3JcbiAqIGNvbnN1bWVycyBvZiBhcmd1bWVudHMgYW5kIGRlY2xhcmF0aW9uczsgcmV0dXJuIHZhbHVlcyBzaG91bGQgc3BlY2lmaWNhbGx5IGJlXG4gKiBgUHJvbWlzZTxUPmAgb3IgYFRgIGl0c2VsZi5cbiAqL1xuXG4vKipcbiAqIFRoZSBhd2FpdGVkIHJldHVybiB0eXBlIG9mIGEgZnVuY3Rpb24uXG4gKiBGb3IgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBFIGNhbGwsIEBzZWUge0VSZXN1bHR9IG9yIEBzZWUge0VDYWxsYWJsZVJldHVybn1cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gaW5mZXIgUiA/IEF3YWl0ZWQ8Uj4gOiBuZXZlcn0gRVJldHVyblxuICovXG5cbi8qKlxuICogQW4gZXZlbnR1YWwgdmFsdWUgd2hlcmUgcmVtb3RhYmxlIG9iamVjdHMgYXJlIHJlY3Vyc2l2ZWx5IG1hcHBlZCB0byBSZW1vdGUgdHlwZXNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0F3YWl0ZWQ8VD59IEVSZXN1bHRcbiAqL1xuXG4vKipcbiAqIEV4cGVyaW1lbnRhbCB0eXBlIG1hcHBpbmcgcmVtb3RhYmxlIG9iamVjdHMgdG8gUmVtb3RlIHR5cGVzXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIDAgZXh0ZW5kcyAoMSAmIFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIFQgaXMgYW55XG4gKiAgICAgPyBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSB0aGUgYW55IHR5cGUgdGhyb3VnaCB0aGUgcmVzdWx0XG4gKiAgICAgOiBUIGV4dGVuZHMgUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUD4gICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBSZW1vdGFibGVcbiAqICAgICAgID8gKFAgfCBSZW1vdGFibGVCcmFuZDxMLCBQPikgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFwIGl0IHRvIGl0cyBcIm1heWJlIHJlbW90ZVwiIGZvcm0gKHByaW1hcnkgYmVoYXZpb3Igb3IgcmVtb3RhYmxlIHByZXNlbmNlKVxuICogICAgICAgOiBUIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT4gICAgICAgICAgICAgICAgICAgICAvLyBJZiBUIGlzIGEgcHJvbWlzZVxuICogICAgICAgICA/IFByb21pc2U8RUF3YWl0ZWRSZXN1bHQ8QXdhaXRlZDxUPj4+ICAgICAgICAgICAgICAvLyBtYXAgaXRzIHJlc29sdXRpb25cbiAqICAgICAgICAgOiBUIGV4dGVuZHMgKG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgc3ltYm9sIHwgYmlnaW50IHwgQ2FsbGFibGUpIC8vIEludGVyc2VjdGlvbnMgb2YgdGhlc2UgdHlwZXMgd2l0aCBvYmplY3RzIGFyZSBub3QgbWFwcGVkXG4gKiAgICAgICAgICAgPyBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW1pdGl2ZXMgYW5kIG5vbi1yZW1vdGFibGUgZnVuY3Rpb25zIGFyZSBwYXNzZWQtdGhyb3VnaFxuICogICAgICAgICAgIDogVCBleHRlbmRzIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICogICAgICAgICAgICAgPyB7IFtQIGluIGtleW9mIFRdOiBFQXdhaXRlZFJlc3VsdDxUW1BdPjsgfSAgICAvLyBvdGhlciBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGNvcHkgZGF0YSBhbmQgcHJvcGVydGllcyBtYXBwZWRcbiAqICAgICAgICAgICAgIDogVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBhbnl0aGluZyB3YXNuJ3QgY292ZXJlZCwgZmFsbGJhY2sgdG8gcGFzcy10aHJvdWdoXG4gKiApfSBFQXdhaXRlZFJlc3VsdFxuICovXG5cbi8qKlxuICogVGhlIEBzZWUge0VSZXN1bHR9IHJldHVybiB0eXBlIG9mIGEgcmVtb3RlIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIDAgZXh0ZW5kcyAoMSAmIFQpICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBUIGlzIGFueVxuICogICAgID8gYW55ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBhbnkgdHlwZSB0aHJvdWdoIHRoZSByZXN1bHRcbiAqICAgICA6IFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGluZmVyIFIgIC8vIEVsc2UgaW5mZXIgdGhlIHJldHVybiB0eXBlXG4gKiAgICAgICA/IEVSZXN1bHQ8Uj4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgZnV0dXJlLCBtYXAgdGhlIGV2ZW50dWFsIHJlc3VsdFxuICogICAgICAgOiBuZXZlclxuICogKX0gRUNhbGxhYmxlUmV0dXJuXG4gKi9cblxuLyogVE9ETzogRmlndXJlIG91dCBhIHdheSB0byBtYXAgZ2VuZXJpYyBjYWxsYWJsZSByZXR1cm4gdHlwZXMsIG9yIGF0IGxlYXN0IGJldHRlciBkZXRlY3QgdGhlbS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNjE4MzguIFdpdGhvdXQgdGhhdCwgYEUoc3RhcnRHb3Zlcm5lZFVwZ3JhZGFibGUpYCovXG4vKiBpbiBhZ29yaWMtc2RrIGRvZXNuJ3QgcHJvcGFnYXRlIHRoZSBzdGFydCBmdW5jdGlvbiB0eXBlLiovXG4vKipcbiAqIE1hcHMgYSBjYWxsYWJsZSB0byBpdHMgcmVtb3RlbHkgY2FsbGVkIHR5cGVcbiAqXG4gKiBAdGVtcGxhdGUge0NhbGxhYmxlfSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICAgUmV0dXJuVHlwZTxUPiBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+ICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY2FsbGFibGUgcmV0dXJucyBhIHByb21pc2VcbiAqICAgICAgPyBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ5cGFzcyBtYXBwaW5nIHRvIG1haW50YWluIGFueSBnZW5lcmljXG4gKiAgICAgIDogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFByb21pc2U8RUNhbGxhYmxlUmV0dXJuPFQ+PiAvLyBNYXAgaXQgYW55d2F5IHRvIGVuc3VyZSBwcm9taXNlIHJldHVybiB0eXBlXG4gKiApfSBFQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyBFQ2FsbGFibGU8VFtQXT5cbiAqICAgICA6IG5ldmVyO1xuICogfX0gRU1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+XG4gKiAgICAgPyBUW1BdXG4gKiAgICAgOiBQcm9taXNlPEF3YWl0ZWQ8VFtQXT4+O1xuICogfX0gRUdldHRlcnNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q2FsbGFibGV9IFRcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTx2b2lkPn0gRVNlbmRPbmx5Q2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyBFU2VuZE9ubHlDYWxsYWJsZTxUW1BdPlxuICogICAgIDogbmV2ZXI7XG4gKiB9fSBFU2VuZE9ubHlNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyBFU2VuZE9ubHlDYWxsYWJsZTxUPiAmIEVTZW5kT25seU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiAgICAgOiAwIGV4dGVuZHMgKDEgJiBUKVxuICogICAgICAgPyBuZXZlclxuICogICAgICAgOiBFU2VuZE9ubHlNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogKX0gRVNlbmRPbmx5Q2FsbGFibGVPck1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUPiAmIEVNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogICAgIDogMCBleHRlbmRzICgxICYgVClcbiAqICAgICAgID8gbmV2ZXJcbiAqICAgICAgIDogRU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFQ2FsbGFibGVPck1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIFJldHVybiBhIHVuaW9uIG9mIHByb3BlcnR5IG5hbWVzL3N5bWJvbHMvbnVtYmVycyBQIGZvciB3aGljaCB0aGUgcmVjb3JkIGVsZW1lbnQgVFtQXSdzIHR5cGUgZXh0ZW5kcyBVLlxuICpcbiAqIEdpdmVuIGNvbnN0IHggPSB7IGE6IDEyMywgYjogJ2hlbGxvJywgYzogNDIsIDQ5OiAoKSA9PiB7fSwgNTM6IDY3IH0sXG4gKlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBudW1iZXI+IGlzIHRoZSB0eXBlICdhJyB8ICdjJyB8IDUzLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBzdHJpbmc+IGlzIHRoZSB0eXBlICdiJy5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgNDIgfCA2Nz4gaXMgdGhlIHR5cGUgJ2MnIHwgNTMuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIGJvb2xlYW4+IGlzIHRoZSB0eXBlIG5ldmVyLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHR5cGVkZWYge3sgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBVID8gUCA6IG5ldmVyOyB9W2tleW9mIFRdfSBGaWx0ZXJlZEtleXNcbiAqL1xuXG4vKipcbiAqIGBQaWNrQ2FsbGFibGU8VD5gIG1lYW5zIHRvIHJldHVybiBhIHNpbmdsZSByb290IGNhbGxhYmxlIG9yIGEgcmVjb3JkIHR5cGVcbiAqIGNvbnNpc3Rpbmcgb25seSBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUmV0dXJuVHlwZTxUPiAgICAgICAgICAgICAgICAgICAgIC8vIGEgcm9vdCBjYWxsYWJsZSwgbm8gbWV0aG9kc1xuICogICAgIDogUGljazxULCBGaWx0ZXJlZEtleXM8VCwgQ2FsbGFibGU+PiAgICAgICAgICAvLyBhbnkgY2FsbGFibGUgbWV0aG9kc1xuICogKX0gUGlja0NhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBgUmVtb3RlRnVuY3Rpb25zPFQ+YCBtZWFucyB0byByZXR1cm4gdGhlIGZ1bmN0aW9ucyBhbmQgcHJvcGVydGllcyB0aGF0IGFyZSByZW1vdGVseSBjYWxsYWJsZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+ICAgLy8gaWYgYSBnaXZlbiBUIGlzIHNvbWUgcmVtb3RlIGludGVyZmFjZSBSXG4gKiAgICAgPyBQaWNrQ2FsbGFibGU8Uj4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBjYWxsYWJsZSBwcm9wZXJ0aWVzIG9mIFJcbiAqICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPiAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpZiBUIGlzIGEgcHJvbWlzZVxuICogICAgICAgPyBSZW1vdGVGdW5jdGlvbnM8VT4gICAgICAgICAgICAgICAgICAgICAvLyByZWN1cnNlIG9uIHRoZSByZXNvbHZlZCB2YWx1ZSBvZiBUXG4gKiAgICAgICA6IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgcmV0dXJuIFRcbiAqICl9IFJlbW90ZUZ1bmN0aW9uc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBSZW1vdGFibGVCcmFuZDxpbmZlciBMLCBpbmZlciBSPlxuICogICAgID8gTFxuICogICAgIDogVCBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+XG4gKiAgICAgPyBMb2NhbFJlY29yZDxVPlxuICogICAgIDogVFxuICogKX0gTG9jYWxSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUiA9IHVua25vd25dXG4gKiBAdHlwZWRlZiB7e1xuICogICBwcm9taXNlOiBQcm9taXNlPFI+O1xuICogICBzZXR0bGVyOiBTZXR0bGVyPFI+O1xuICogfX0gRVByb21pc2VLaXRcbiAqL1xuXG4vKipcbiAqIERlY2xhcmUgYSBuZWFyIG9iamVjdCB0aGF0IG11c3Qgb25seSBiZSBpbnZva2VkIHdpdGggRSwgZXZlbiBsb2NhbGx5LiAgSXRcbiAqIHN1cHBvcnRzIHRoZSBgVGAgaW50ZXJmYWNlIGJ1dCBhZGRpdGlvbmFsbHkgcGVybWl0cyBgVGAncyBtZXRob2RzIHRvIHJldHVyblxuICogYFByb21pc2VMaWtlYHMgZXZlbiBpZiBgVGAgZGVjbGFyZXMgdGhlbSBhcyBvbmx5IHN5bmNocm9ub3VzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBFUmVmPEF3YWl0ZWQ8RU9ubHk8UmV0dXJuVHlwZTxUPj4+PlxuICogICAgIDogVCBleHRlbmRzIFJlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGU+XG4gKiAgICAgPyB7XG4gKiAgICAgICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICAgICAgICA/ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFRbS10+KSA9PiBFUmVmPEF3YWl0ZWQ8RU9ubHk8UmV0dXJuVHlwZTxUW0tdPj4+PlxuICogICAgICAgICAgIDogVFtLXTtcbiAqICAgICAgIH1cbiAqICAgICA6IFRcbiAqICl9IEVPbmx5XG4gKi8kaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABzlTFSchQAAHIUAAAnAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL2xvY2FsLmpzeyJpbXBvcnRzIjpbIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImdldE1ldGhvZE5hbWVzIiwibG9jYWxBcHBseUZ1bmN0aW9uIiwibG9jYWxBcHBseU1ldGhvZCIsImxvY2FsR2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIixbJGjNj19hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsIH0gPSBhc3NlcnQ7XG5cbmNvbnN0IHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgZ2V0UHJvdG90eXBlT2YsIGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSwgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuY29uc3QgbnR5cGVvZiA9IHNwZWNpbWVuID0+IChzcGVjaW1lbiA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBzcGVjaW1lbik7XG5cbmNvbnN0IG9uRGVsaXZlcnkgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fREVMSVZFUllfQlJFQUtQT0lOVFMnKTtcblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggYGlzUHJpbWl0aXZlYCB0aGF0J3MgY3VycmVudGx5IGluIGBAZW5kby9wYXNzLXN0eWxlYC5cbiAqIExheWVyaW5nIGNvbnN0cmFpbnRzIG1ha2UgdGhpcyB0cmlja3ksIHdoaWNoIGlzIHdoeSB3ZSBoYXZlbid0IHlldCBmaWd1cmVkXG4gKiBvdXQgaG93IHRvIGRvIHRoaXMuXG4gKlxuICogQHR5cGUgeyh2YWw6IHVua25vd24pID0+IHZhbCBpcyAodW5kZWZpbmVkXG4gKiB8IG51bGxcbiAqIHwgYm9vbGVhblxuICogfCBudW1iZXJcbiAqIHwgYmlnaW50XG4gKiB8IHN0cmluZ1xuICogfCBzeW1ib2wpfVxuICovXG5jb25zdCBpc1ByaW1pdGl2ZSA9IHZhbCA9PlxuICAhdmFsIHx8ICh0eXBlb2YgdmFsICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsICE9PSAnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBQcmlvcml0aXplIHN5bWJvbHMgYXMgZWFybGllciB0aGFuIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBhXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQgPSAoYSwgYikgPT4ge1xuICBpZiAodHlwZW9mIGEgPT09IHR5cGVvZiBiKSB7XG4gICAgY29uc3QgbGVmdCA9IFN0cmluZyhhKTtcbiAgICBjb25zdCByaWdodCA9IFN0cmluZyhiKTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xuICAgIHJldHVybiBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPiByaWdodCA/IDEgOiAwO1xuICB9XG4gIGlmICh0eXBlb2YgYSA9PT0gJ3N5bWJvbCcpIHtcbiAgICBhc3NlcnQodHlwZW9mIGIgPT09ICdzdHJpbmcnKTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgYXNzZXJ0KHR5cGVvZiBhID09PSAnc3RyaW5nJyk7XG4gIGFzc2VydCh0eXBlb2YgYiA9PT0gJ3N5bWJvbCcpO1xuICByZXR1cm4gMTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMgeyhzdHJpbmd8c3ltYm9sKVtdfVxuICovXG4gICAgICAgY29uc3QgZ2V0TWV0aG9kTmFtZXMgPSB2YWwgPT4ge1xuICBsZXQgbGF5ZXIgPSB2YWw7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpOyAvKiBTZXQgdG8gZGVkdXBsaWNhdGUqL1xuICB3aGlsZSAobGF5ZXIgIT09IG51bGwgJiYgbGF5ZXIgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAvKiBiZSB0b2xlcmFudCBvZiBub24tb2JqZWN0cyovXG4gICAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGxheWVyKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhkZXNjcykpIHtcbiAgICAgIC8qIEluIGNhc2UgYSBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBhIG5vbi1tZXRob2QsKi9cbiAgICAgIC8qIHRlc3QgYHZhbFtuYW1lXWAgcmF0aGVyIHRoYW4gYGxheWVyW25hbWVdYCovXG4gICAgICBpZiAodHlwZW9mIHZhbFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBuYW1lcy5hZGQobmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1ByaW1pdGl2ZSh2YWwpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbGF5ZXIgPSBnZXRQcm90b3R5cGVPZihsYXllcik7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG59O1xuLyogVGhlIHRvcCBsZXZlbCBvZiB0aGUgZXZlbnR1YWwgc2VuZCBtb2R1bGVzIGNhbiBiZSBldmFsdWF0ZWQgYmVmb3JlKi9cbi8qIHNlcyBjcmVhdGVzIGBoYXJkZW5gLCBhbmQgc28gY2Fubm90IHJlbHkgb24gYGhhcmRlbmAgYXQgdG9wIGxldmVsLiovJGjNj19vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmZyZWV6ZShnZXRNZXRob2ROYW1lcyk7XG5cbiAgICAgICBjb25zdCBsb2NhbEFwcGx5RnVuY3Rpb24gPSAocmVjaXBpZW50LCBhcmdzKSA9PiB7XG4gIHR5cGVvZiByZWNpcGllbnQgPT09ICdmdW5jdGlvbicgfHxcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgQ2Fubm90IGludm9rZSB0YXJnZXQgYXMgYSBmdW5jdGlvbjsgdHlwZW9mIHRhcmdldCBpcyAke3EoXG4gICAgICAgIG50eXBlb2YocmVjaXBpZW50KSxcbiAgICAgICl9YCxcbiAgICAgIFR5cGVFcnJvcixcbiAgICApO1xuICBpZiAob25EZWxpdmVyeSAmJiBvbkRlbGl2ZXJ5LnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCB1bmRlZmluZWQpKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICBkZWJ1Z2dlcjsgLyogU1RFUCBJTlRPIEFQUExZKi9cbiAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiB0aGlzIGRlbGl2ZXJ5IG9mIGFuIGV2ZW50dWFsIGZ1bmN0aW9uIGNhbGwqL1xuICAgIC8qIHNvIHRoYXQgeW91IGNhbiBzdGVwICppbnRvKiB0aGUgZm9sbG93aW5nIGBhcHBseWAgaW4gb3JkZXIgdG8gc2VlIHRoZSovXG4gICAgLyogZnVuY3Rpb24gY2FsbCBhcyBpdCBoYXBwZW5zLiBPciBzdGVwICpvdmVyKiB0byBzZWUgd2hhdCBoYXBwZW5zKi9cbiAgICAvKiBhZnRlciB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5zLiovXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gYXBwbHkocmVjaXBpZW50LCB1bmRlZmluZWQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseUZ1bmN0aW9uKGxvY2FsQXBwbHlGdW5jdGlvbik7XG5cbiAgICAgICBjb25zdCBsb2NhbEFwcGx5TWV0aG9kID0gKHJlY2lwaWVudCwgbWV0aG9kTmFtZSwgYXJncykgPT4ge1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAvKiBCYXNlIGNhc2U7IGJvdHRvbSBvdXQgdG8gYXBwbHkgZnVuY3Rpb25zLiovXG4gICAgcmV0dXJuIGxvY2FsQXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ3MpO1xuICB9XG4gIGlmIChyZWNpcGllbnQgPT09IHVuZGVmaW5lZCB8fCByZWNpcGllbnQgPT09IG51bGwpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgQ2Fubm90IGRlbGl2ZXIgJHtxKG1ldGhvZE5hbWUpfSB0byB0YXJnZXQ7IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmbiA9IHJlY2lwaWVudFttZXRob2ROYW1lXTtcbiAgaWYgKGZuID09PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgdGFyZ2V0IGhhcyBubyBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSwgaGFzICR7cShcbiAgICAgICAgZ2V0TWV0aG9kTmFtZXMocmVjaXBpZW50KSxcbiAgICAgICl9YCxcbiAgICAgIFR5cGVFcnJvcixcbiAgICApO1xuICB9XG4gIGNvbnN0IGZ0eXBlID0gbnR5cGVvZihmbik7XG4gIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIEZhaWxgaW52b2tlZCBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSBpcyBub3QgYSBmdW5jdGlvbjsgaXQgaXMgYSAke3EoXG4gICAgICBmdHlwZSxcbiAgICApfWA7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIG1ldGhvZE5hbWUpKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICBkZWJ1Z2dlcjsgLyogU1RFUCBJTlRPIEFQUExZKi9cbiAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiB0aGlzIGRlbGl2ZXJ5IG9mIGFuIGV2ZW50dWFsIG1ldGhvZCBjYWxsKi9cbiAgICAvKiBzbyB0aGF0IHlvdSBjYW4gc3RlcCAqaW50byogdGhlIGZvbGxvd2luZyBgYXBwbHlgIGluIG9yZGVyIHRvIHNlZSB0aGUqL1xuICAgIC8qIG1ldGhvZCBjYWxsIGFzIGl0IGhhcHBlbnMuIE9yIHN0ZXAgKm92ZXIqIHRvIHNlZSB3aGF0IGhhcHBlbnMqL1xuICAgIC8qIGFmdGVyIHRoZSBtZXRob2QgY2FsbCByZXR1cm5zLiovXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gYXBwbHkoZm4sIHJlY2lwaWVudCwgYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5sb2NhbEFwcGx5TWV0aG9kKGxvY2FsQXBwbHlNZXRob2QpO1xuXG4gICAgICAgY29uc3QgbG9jYWxHZXQgPSAodCwga2V5KSA9PiB0W2tleV07JGjNj19vbmNlLmxvY2FsR2V0KGxvY2FsR2V0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImxvY2FsQXBwbHlGdW5jdGlvbiI6WyJsb2NhbEFwcGx5RnVuY3Rpb24iXSwibG9jYWxBcHBseU1ldGhvZCI6WyJsb2NhbEFwcGx5TWV0aG9kIl0sImxvY2FsR2V0IjpbImxvY2FsR2V0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAId4iLn0GAAA9BgAADUAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IHF1b3RlOiBxLCBGYWlsIH0gPSBhc3NlcnQ7XG5cbmNvbnN0IHsgaGFzT3duLCBmcmVlemUsIGVudHJpZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgJyonfSBNYXRjaFN0cmluZ1RhZ1xuICogICBBIHN0YXIgYCcqJ2AgbWF0Y2hlcyBhbnkgcmVjaXBpZW50LiBPdGhlcndpc2UsIHRoZSBzdHJpbmcgaXNcbiAqICAgbWF0Y2hlZCBhZ2FpbnN0IHRoZSB2YWx1ZSBvZiBhIHJlY2lwaWVudCdzIGBAQHRvU3RyaW5nVGFnYFxuICogICBhZnRlciBzdHJpcHBpbmcgb3V0IGFueSBsZWFkaW5nIGAnQWxsZWdlZDogJ2Agb3IgYCdEZWJ1Z05hbWU6ICdgXG4gKiAgIHByZWZpeC4gRm9yIG9iamVjdHMgZGVmaW5lZCB3aXRoIGBGYXJgIHRoaXMgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogICBrbm93biBhcyB0aGUgYGZhck5hbWVgLiBGb3IgZXhvcywgdGhpcyBpcyB0aGUgdGFnLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCAnKid9IE1hdGNoTWV0aG9kTmFtZVxuICogICBBIHN0YXIgYCcqJ2AgbWF0Y2hlcyBhbnkgbWV0aG9kIG5hbWUuIE90aGVyd2lzZSwgdGhlIHN0cmluZyBpc1xuICogICBtYXRjaGVkIGFnYWluc3QgdGhlIG1ldGhvZCBuYW1lLiBDdXJyZW50bHksIHRoaXMgaXMgb25seSBhbiBleGFjdCBtYXRjaC5cbiAqICAgSG93ZXZlciwgYmV3YXJlIHRoYXQgd2UgbWF5IGludHJvZHVjZSBhIHN0cmluZyBzeW50YXggZm9yXG4gKiAgIHN5bWJvbCBtZXRob2QgbmFtZXMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge251bWJlciB8ICcqJ30gTWF0Y2hDb3VudGRvd25cbiAqICAgQSBzdGFyIGAnKidgIHdpbGwgYWx3YXlzIGJyZWFrcG9pbnQuIE90aGVyd2lzZSwgdGhlIHN0cmluZ1xuICogICBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuIE9uY2UgdGhhdCBpcyB6ZXJvLCBhbHdheXMgYnJlYWtwb2ludC5cbiAqICAgT3RoZXJ3aXNlIGRlY3JlbWVudCBieSBvbmUgZWFjaCB0aW1lIGl0IG1hdGNoZXMgdW50aWwgaXQgcmVhY2hlcyB6ZXJvLlxuICogICBJbiBvdGhlciB3b3JkcywgdGhlIGNvdW50ZG93biByZXByZXNlbnRzIHRoZSBudW1iZXIgb2ZcbiAqICAgYnJlYWtwb2ludCBvY2N1cnJlbmNlcyB0byBza2lwIGJlZm9yZSBhY3R1YWxseSBicmVha3BvaW50aW5nLlxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXh0ZXJuYWwgSlNPTiByZXByZXNlbnRhdGlvbiwgaW4gd2hpY2hcbiAqIC0gdGhlIG91dGVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIGNsYXNzLWxpa2UgdGFnIG9yICcqJyxcbiAqIC0gdGhlIGlubmVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIG1ldGhvZCBuYW1lIG9yICcqJyxcbiAqIC0gdGhlIHZhbHVlIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgY291bnRkb3duIG9yICcqJy5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPE1hdGNoU3RyaW5nVGFnLCBSZWNvcmQ8TWF0Y2hNZXRob2ROYW1lLCBNYXRjaENvdW50ZG93bj4+fSBNZXNzYWdlQnJlYWtwb2ludHNcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGludGVybmFsIEpTT04gcmVwcmVzZW50YXRpb24sIGluIHdoaWNoXG4gKiAtIHRoZSBvdXRlciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBtZXRob2QgbmFtZSBvciAnKicsXG4gKiAtIHRoZSBpbm5lciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBjbGFzcy1saWtlIHRhZyBvciAnKicsXG4gKiAtIHRoZSB2YWx1ZSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGNvdW50ZG93biBvciAnKicuXG4gKlxuICogQHR5cGVkZWYge1JlY29yZDxNYXRjaE1ldGhvZE5hbWUsIFJlY29yZDxNYXRjaFN0cmluZ1RhZywgTWF0Y2hDb3VudGRvd24+Pn0gQnJlYWtwb2ludFRhYmxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNZXNzYWdlQnJlYWtwb2ludFRlc3RlclxuICogQHByb3BlcnR5IHsoKSA9PiBNZXNzYWdlQnJlYWtwb2ludHN9IGdldEJyZWFrcG9pbnRzXG4gKiBAcHJvcGVydHkgeyhuZXdCcmVha3BvaW50cz86IE1lc3NhZ2VCcmVha3BvaW50cykgPT4gdm9pZH0gc2V0QnJlYWtwb2ludHNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZWNpcGllbnQ6IG9iamVjdCxcbiAqICAgbWV0aG9kTmFtZTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkXG4gKiApID0+IGJvb2xlYW59IHNob3VsZEJyZWFrcG9pbnRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHt2YWwgaXMgUmVjb3JkPHN0cmluZywgYW55Pn1cbiAqL1xuY29uc3QgaXNKU09OUmVjb3JkID0gdmFsID0+XG4gIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWwpO1xuXG4vKipcbiAqIFJldHVybiBgdGFnYCBhZnRlciBzdHJpcHBpbmcgb2ZmIGFueSBgJ0FsbGVnZWQ6ICdgIG9yIGAnRGVidWdOYW1lOiAnYFxuICogcHJlZml4IGlmIHByZXNlbnQuXG4gKiBgYGBqc1xuICogc2ltcGxpZnlUYWcoJ0FsbGVnZWQ6IG1vb2xhIGlzc3VlcicpID09PSAnbW9vbGEgaXNzdWVyJ1xuICogYGBgXG4gKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3VjaCBwcmVmaXhlcywgb25seSB0aGUgb3V0ZXIgb25lIGlzIHJlbW92ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc2ltcGxpZnlUYWcgPSB0YWcgPT4ge1xuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ0FsbGVnZWQ6ICcsICdEZWJ1Z05hbWU6ICddKSB7XG4gICAgaWYgKHRhZy5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIHJldHVybiB0YWcuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0YWc7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcmV0dXJucyB7TWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgfCB1bmRlZmluZWR9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSBvcHRpb25OYW1lID0+IHtcbiAgbGV0IGJyZWFrcG9pbnRzID0gSlNPTi5wYXJzZShnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCAnbnVsbCcpKTtcblxuICBpZiAoYnJlYWtwb2ludHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEB0eXBlIHtCcmVha3BvaW50VGFibGV9ICovXG4gIGxldCBicmVha3BvaW50c1RhYmxlO1xuXG4gIGNvbnN0IGdldEJyZWFrcG9pbnRzID0gKCkgPT4gYnJlYWtwb2ludHM7XG4gIGZyZWV6ZShnZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2V0QnJlYWtwb2ludHMgPSAobmV3QnJlYWtwb2ludHMgPSBicmVha3BvaW50cykgPT4ge1xuICAgIGlzSlNPTlJlY29yZChuZXdCcmVha3BvaW50cykgfHxcbiAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24gdG8gYmUgYSBKU09OIGJyZWFrcG9pbnRzIHJlY29yZGA7XG5cbiAgICAvKiogQHR5cGUge0JyZWFrcG9pbnRUYWJsZX0gKi9cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvbmZ1c2VkIGJ5IF9fcHJvdG9fXyovXG4gICAgY29uc3QgbmV3QnJlYWtwb2ludHNUYWJsZSA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICBmb3IgKGNvbnN0IFt0YWcsIG1ldGhvZEJQc10gb2YgZW50cmllcyhuZXdCcmVha3BvaW50cykpIHtcbiAgICAgIHRhZyA9PT0gc2ltcGxpZnlUYWcodGFnKSB8fFxuICAgICAgICBGYWlsYEp1c3QgdXNlIHNpbXBsZSB0YWcgJHtxKHNpbXBsaWZ5VGFnKHRhZykpfSByYXRoZXIgdGhhbiAke3EodGFnKX1gO1xuICAgICAgaXNKU09OUmVjb3JkKG1ldGhvZEJQcykgfHxcbiAgICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cShcbiAgICAgICAgICB0YWcsXG4gICAgICAgICl9IHRvIGJlIGEgSlNPTiBtZXRob2RzIGJyZWFrcG9pbnRzIHJlY29yZGA7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBjb3VudF0gb2YgZW50cmllcyhtZXRob2RCUHMpKSB7XG4gICAgICAgIGNvdW50ID09PSAnKicgfHxcbiAgICAgICAgICAodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpICYmXG4gICAgICAgICAgICBjb3VudCA+PSAwKSB8fFxuICAgICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EodGFnKX0uJHtxKFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICApfSB0byBiZSBcIipcIiBvciBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYDtcblxuICAgICAgICBjb25zdCBjbGFzc0JQcyA9IGhhc093bihuZXdCcmVha3BvaW50c1RhYmxlLCBtZXRob2ROYW1lKVxuICAgICAgICAgID8gbmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXVxuICAgICAgICAgIDogKG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gPSB7XG4gICAgICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY29uZnVzZWQgYnkgX19wcm90b19fKi9cbiAgICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNsYXNzQlBzW3RhZ10gPSBjb3VudDtcbiAgICAgIH1cbiAgICB9XG4gICAgYnJlYWtwb2ludHMgPSBuZXdCcmVha3BvaW50cztcbiAgICBicmVha3BvaW50c1RhYmxlID0gbmV3QnJlYWtwb2ludHNUYWJsZTtcbiAgfTtcbiAgZnJlZXplKHNldEJyZWFrcG9pbnRzKTtcblxuICBjb25zdCBzaG91bGRCcmVha3BvaW50ID0gKHJlY2lwaWVudCwgbWV0aG9kTmFtZSkgPT4ge1xuICAgIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHwgbWV0aG9kTmFtZSA9PT0gbnVsbCkge1xuICAgICAgLyogVE9ETyBlbmFibGUgZnVuY3Rpb24gYnJlYWtwb2ludGluZyovXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzQlBzID0gYnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXSB8fCBicmVha3BvaW50c1RhYmxlWycqJ107XG4gICAgaWYgKGNsYXNzQlBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHRhZyA9IHNpbXBsaWZ5VGFnKHJlY2lwaWVudFtTeW1ib2wudG9TdHJpbmdUYWddKTtcbiAgICBsZXQgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YWcgPSAnKic7XG4gICAgICBjb3VudCA9IGNsYXNzQlBzW3RhZ107XG4gICAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXNzZXJ0KHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiYgY291bnQgPj0gMSk7XG4gICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50IC0gMTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIGZyZWV6ZShzaG91bGRCcmVha3BvaW50KTtcblxuICBjb25zdCBicmVha3BvaW50VGVzdGVyID0gZnJlZXplKHtcbiAgICBnZXRCcmVha3BvaW50cyxcbiAgICBzZXRCcmVha3BvaW50cyxcbiAgICBzaG91bGRCcmVha3BvaW50LFxuICB9KTtcbiAgYnJlYWtwb2ludFRlc3Rlci5zZXRCcmVha3BvaW50cygpO1xuICByZXR1cm4gYnJlYWtwb2ludFRlc3Rlcjtcbn07JGjNj19vbmNlLm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcihtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xuZnJlZXplKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACkTVdnWBQAA1gUAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VFOyRozY9faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAobWFrZUUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7XG5cbi8qIFhYWCBtb2R1bGUgZXhwb3J0cyBmb3IgSGFuZGxlZFByb21pc2UgZmFpbCBpZiB0aGVzZSBhcmVuJ3QgaW4gc2NvcGUqL1xuLyoqIEBpbXBvcnQge0hhbmRsZXIsIEhhbmRsZWRFeGVjdXRvcn0gZnJvbSAnLi9oYW5kbGVkLXByb21pc2UuanMnICovXG4vKiogQGltcG9ydCB7RUNhbGxhYmxlT3JNZXRob2RzLCBFR2V0dGVycywgRVJlZiwgRVJlbW90ZUZ1bmN0aW9ucywgRVNlbmRPbmx5Q2FsbGFibGVPck1ldGhvZHMsIExvY2FsUmVjb3JkLCBSZW1vdGVGdW5jdGlvbnN9IGZyb20gJy4vRS5qcycgKi9cblxuY29uc3QgaHAgPSBIYW5kbGVkUHJvbWlzZTtcblxuLyoqXG4gKiBFKHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGNhbGwgYXJiaXRyYXJ5IG1ldGhvZHMuIEVhY2ggb2YgdGhlc2UgbWV0aG9kIGNhbGxzIHJldHVybnMgYSBwcm9taXNlLlxuICogVGhlIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgb24gd2hhdGV2ZXIgJ3gnIGRlc2lnbmF0ZXMgKG9yIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogRS5nZXQoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gZ2V0IGFyYml0cmFyeSBwcm9wZXJ0aWVzLiBFYWNoIG9mIHRoZXNlIHByb3BlcnRpZXMgcmV0dXJucyBhXG4gKiBwcm9taXNlIGZvciB0aGUgcHJvcGVydHkuICBUaGUgcHJvbWlzZSB2YWx1ZSB3aWxsIGJlIHRoZSBwcm9wZXJ0eSBmZXRjaGVkIGZyb20gd2hhdGV2ZXIgJ3gnIGRlc2lnbmF0ZXMgKG9yXG4gKiByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEUud2hlbih4LCByZXMsIHJlaikgaXMgZXF1aXZhbGVudCB0byBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4ocmVzLCByZWopXG4gKi8kaM2PX29uY2UuaHAoaHApO1xuICAgICAgIGNvbnN0IEUgPSBtYWtlRShocCk7JGjNj19vbmNlLkUoRSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMyikjlcSAABXEgAALQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbixlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV0sW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLFskaM2PX2EgPT4gKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qIE5PVEU6IFdlIGNhbid0IGltcG9ydCB0aGVzZSBiZWNhdXNlIHRoZXkncmUgbm90IGluIHNjb3BlIGJlZm9yZSBsb2NrZG93bi4qL1xuLyogV2UgYWxzbyBjYW5ub3QgY3VycmVudGx5IGltcG9ydCB0aGVtIGJlY2F1c2UgaXQgd291bGQgY3JlYXRlIGEgY3ljbGljKi9cbi8qIGRlcGVuZGVuY3ksIHRob3VnaCB0aGlzIGlzIG1vcmUgZWFzaWx5IGZpeGVkLiovXG4vKiBpbXBvcnQgeyBhc3NlcnQsIFgsIEZhaWwgfSBmcm9tICdAZW5kby9lcnJvcnMnOyovXG4vKiBTZWUgYWxzbyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzk1MTUqL1xuXG4vKiBXQVJOSU5HOiBHbG9iYWwgTXV0YWJsZSBTdGF0ZSEqL1xuLyogVGhpcyBzdGF0ZSBpcyBjb21tdW5pY2F0ZWQgdG8gYGFzc2VydGAgdGhhdCBtYWtlcyBpdCBhdmFpbGFibGUgdG8gdGhlKi9cbi8qIGNhdXNhbCBjb25zb2xlLCB3aGljaCBhZmZlY3RzIHRoZSBjb25zb2xlIGxvZyBvdXRwdXQuIE5vcm1hbGx5IHdlKi9cbi8qIHJlZ2FyZCB0aGUgYWJpbGl0eSB0byBzZWUgY29uc29sZSBsb2cgb3V0cHV0IGFzIGEgbWV0YS1sZXZlbCBwcml2aWxlZ2UqL1xuLyogYW5hbG9nb3VzIHRvIHRoZSBhYmlsaXR5IHRvIGRlYnVnLiBBc2lkZSBmcm9tIHRoYXQsIHRoaXMgbW9kdWxlIHNob3VsZCovXG4vKiBub3QgaGF2ZSBhbnkgb2JzZXJ2YWJseSBtdXRhYmxlIHN0YXRlLiovXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuID0gMDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQgPSAwO1xuXG4vKiBUdXJuIG9uIGlmIHlvdSBzZWVtIHRvIGJlIGxvc2luZyBlcnJvciBsb2dnaW5nIGF0IHRoZSB0b3Agb2YgdGhlIGV2ZW50IGxvb3AqL1xuY29uc3QgVkVSQk9TRSA9IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywgJ3RyYWNrLXR1cm5zJyk7XG5cbi8qIFRyYWNrLXR1cm5zIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBlbmFibGVkIGJ5IGFuIGVudmlyb25tZW50Ki9cbi8qIG9wdGlvbi4qL1xuY29uc3QgRU5BQkxFRCA9XG4gIC8qKiBAdHlwZSB7J2Rpc2FibGVkJyB8ICdlbmFibGVkJ30gKi9cbiAgKGdldEVudmlyb25tZW50T3B0aW9uKCdUUkFDS19UVVJOUycsICdkaXNhYmxlZCcsIFsnZW5hYmxlZCddKSkgPT09ICdlbmFibGVkJztcblxuLyogV2UgaG9pc3QgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgb3V0IG9mIHRyYWNrVHVybnMoKSB0byBkaXNjb3VyYWdlIHRoZSovXG4vKiBjbG9zdXJlcyBmcm9tIGhvbGRpbmcgb250byAnYXJncycgb3IgJ2Z1bmMnIGxvbmdlciB0aGFuIG5lY2Vzc2FyeSwqL1xuLyogd2hpY2ggd2UndmUgc2VlbiBjYXVzZSBIYW5kbGVkUHJvbWlzZSBhcmd1bWVudHMgdG8gYmUgcmV0YWluZWQgZm9yKi9cbi8qIGEgc3VycHJpc2luZ2x5IGxvbmcgdGltZS4qL1xuXG5jb25zdCBhZGRSZWplY3Rpb25Ob3RlID0gZGV0YWlsc05vdGUgPT4gcmVhc29uID0+IHtcbiAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgZ2xvYmFsVGhpcy5hc3NlcnQubm90ZShyZWFzb24sIGRldGFpbHNOb3RlKTtcbiAgfVxuICBpZiAoVkVSQk9TRSkge1xuICAgIGNvbnNvbGUubG9nKCdSRUpFQ1RFRCBhdCB0b3Agb2YgZXZlbnQgbG9vcCcsIHJlYXNvbik7XG4gIH1cbn07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbiA9XG4gIChmdW5jLCBzZW5kaW5nRXJyb3IsIFgpID0+XG4gICguLi5hcmdzKSA9PiB7XG4gICAgaGlkZGVuUHJpb3JFcnJvciA9IHNlbmRpbmdFcnJvcjtcbiAgICBoaWRkZW5DdXJyZW50VHVybiArPSAxO1xuICAgIGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG4gICAgdHJ5IHtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBmdW5jKC4uLmFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGdsb2JhbFRoaXMuYXNzZXJ0Lm5vdGUoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBYYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoVkVSQk9TRSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIC8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG4gICAgICBjb25zdCBkZXRhaWxzTm90ZSA9IFhgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcbiAgICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGhpZGRlblByaW9yRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIEdpdmVuIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzLCByZXR1cm5zIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzIHdob3NlXG4gKiBgdGhpc2AtZnJlZSBjYWxsIGJlaGF2aW9ycyBhcmUgbm90IG9ic2VydmFibHkgZGlmZmVyZW50IHRvIHRob3NlIHRoYXRcbiAqIGNhbm5vdCBzZWUgY29uc29sZSBvdXRwdXQuIFRoZSBvbmx5IHB1cnBvc2UgaXMgdG8gY2F1c2UgYWRkaXRpb25hbFxuICogaW5mb3JtYXRpb24gdG8gYXBwZWFyIG9uIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBjYWxsIHRvIGB0cmFja1R1cm5zYCBpcyBpdHNlbGYgYSBzZW5kaW5nIGV2ZW50LCB0aGF0IG9jY3VycyBpbiBzb21lIGNhbGxcbiAqIHN0YWNrIGluIHNvbWUgdHVybiBudW1iZXIgYXQgc29tZSBldmVudCBudW1iZXIgd2l0aGluIHRoYXQgdHVybi4gRWFjaCBjYWxsXG4gKiB0byBhbnkgb2YgdGhlIHJldHVybmVkIGBUdXJuU3RhcnRGbmBzIGlzIGEgcmVjZWl2aW5nIGV2ZW50IHRoYXQgYmVnaW5zIGEgbmV3XG4gKiB0dXJuLiBUaGlzIHNlbmRpbmcgZXZlbnQgY2F1c2VkIGVhY2ggb2YgdGhvc2UgcmVjZWl2aW5nIGV2ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUge1R1cm5TdGFydGVyRm5bXX0gVFxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbiAgICAgICBjb25zdCB0cmFja1R1cm5zID0gZnVuY3MgPT4ge1xuICBpZiAoIUVOQUJMRUQgfHwgdHlwZW9mIGdsb2JhbFRoaXMgPT09ICd1bmRlZmluZWQnIHx8ICFnbG9iYWxUaGlzLmFzc2VydCkge1xuICAgIHJldHVybiBmdW5jcztcbiAgfVxuICBjb25zdCB7IGRldGFpbHM6IFgsIG5vdGU6IGFubm90YXRlRXJyb3IgfSA9IGdsb2JhbFRoaXMuYXNzZXJ0O1xuXG4gIGhpZGRlbkN1cnJlbnRFdmVudCArPSAxO1xuICBjb25zdCBzZW5kaW5nRXJyb3IgPSBFcnJvcihcbiAgICBgRXZlbnQ6ICR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWAsXG4gICk7XG4gIGlmIChoaWRkZW5QcmlvckVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbm5vdGF0ZUVycm9yKHNlbmRpbmdFcnJvciwgWGBDYXVzZWQgYnk6ICR7aGlkZGVuUHJpb3JFcnJvcn1gKTtcbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge1R9ICovIChcbiAgICBmdW5jcy5tYXAoZnVuYyA9PiBmdW5jICYmIHdyYXBGdW5jdGlvbihmdW5jLCBzZW5kaW5nRXJyb3IsIFgpKVxuICApO1xufTtcblxuLyoqXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqXG4gKiBAdHlwZWRlZiB7KCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IHVuZGVmaW5lZH0gVHVyblN0YXJ0ZXJGblxuICovJGjNj19vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cmFja1R1cm5zIjpbInRyYWNrVHVybnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAe6GgR2QCAABkAgAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3V0aWxzLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2xvY2FsLmpzIiwiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbbnVsbCxudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvbG9jYWwuanNcIiwgW11dLFtcIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9sb2NhbC5qcyI6W1siZ2V0TWV0aG9kTmFtZXMiLCJnZXRNZXRob2ROYW1lcyJdXSwiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyI6W1sibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIiwibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADcRdmjYAIAAGACAAAaAAAAQGVuZG8vZXhvLXYxLjUuMTIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZXhvLW1ha2Vycy5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy9leG8tbWFrZXJzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZXhvLW1ha2Vycy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL2dldC1pbnRlcmZhY2UuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzIjpbWyJHRVRfSU5URVJGQUNFX0dVQVJEIiwiR0VUX0lOVEVSRkFDRV9HVUFSRCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsZMQ/xAgAAAQIAAAIwAAAEBlbmRvL2V4by12MS41LjEyL3NyYy9leG8tbWFrZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vZW52LW9wdGlvbnMiLCJAZW5kby9lcnJvcnMiLCIuL2V4by10b29scy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3NLaXQiLCJpbml0RW1wdHkiLCJtYWtlRXhvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgb2JqZWN0TWFwLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsRmFpbCxxLGRlZmVuZFByb3RvdHlwZSxkZWZlbmRQcm90b3R5cGVLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXNcIixbJGjNj19hID0+IChlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vZXhvLXRvb2xzLmpzXCIsIFtbXCJkZWZlbmRQcm90b3R5cGVcIixbJGjNj19hID0+IChkZWZlbmRQcm90b3R5cGUgPSAkaM2PX2EpXV0sW1wiZGVmZW5kUHJvdG90eXBlS2l0XCIsWyRozY9fYSA9PiAoZGVmZW5kUHJvdG90eXBlS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0FtcGxpZnksIEV4b0NsYXNzS2l0TWV0aG9kcywgRXhvQ2xhc3NNZXRob2RzLCBGYXJDbGFzc09wdGlvbnMsIEd1YXJkZWQsIEd1YXJkZWRLaXQsIEV4b0NsYXNzSW50ZXJmYWNlR3VhcmRLaXQsIElzSW5zdGFuY2UsIEtpdENvbnRleHQsIEV4b0NsYXNzSW50ZXJmYWNlR3VhcmQsIE1ldGhvZHMsIEZhY2V0TmFtZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIHNlYWwsIGZyZWV6ZSwgZGVmaW5lUHJvcGVydHksIHZhbHVlcyB9ID0gT2JqZWN0O1xuXG4vKiBUdXJuIG9uIHRvIGdpdmUgZWFjaCBleG8gaW5zdGFuY2UgaXRzIG93biB0b1N0cmluZ1RhZyB2YWx1ZS4qL1xuY29uc3QgTEFCRUxfSU5TVEFOQ0VTID0gZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcygnREVCVUcnLCAnbGFiZWwtaW5zdGFuY2VzJyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtUfSBwcm90b1xuICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbmNlQ291bnRcbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCBtYWtlU2VsZiA9IChwcm90bywgaW5zdGFuY2VDb3VudCkgPT4ge1xuICBjb25zdCBzZWxmID0gY3JlYXRlKHByb3RvKTtcbiAgaWYgKExBQkVMX0lOU1RBTkNFUykge1xuICAgIGRlZmluZVByb3BlcnR5KHNlbGYsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuICAgICAgdmFsdWU6IGAke3Byb3RvW1N5bWJvbC50b1N0cmluZ1RhZ119IyR7aW5zdGFuY2VDb3VudH1gLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBoYXJkZW4oc2VsZik7XG59O1xuXG5jb25zdCBlbXB0eVJlY29yZCA9IGhhcmRlbih7fSk7XG5cbi8qKlxuICogV2hlbiBjYWxsaW5nIGBkZWZpbmVEdXJhYmxlS2luZGAgYW5kXG4gKiBpdHMgc2libGluZ3MsIHVzZWQgYXMgdGhlIGBpbml0YCBmdW5jdGlvbiBhcmd1bWVudCB0byBpbmRpY2F0ZSB0aGF0IHRoZVxuICogc3RhdGUgcmVjb3JkIG9mIHRoZSAodmlydHVhbC9kdXJhYmxlKSBpbnN0YW5jZXMgb2YgdGhlIGtpbmQvZXhvQ2xhc3NcbiAqIHNob3VsZCBiZSBlbXB0eSwgYW5kIHRoYXQgdGhlIHJldHVybmVkIG1ha2VyIGZ1bmN0aW9uIHNob3VsZCBoYXZlIHplcm9cbiAqIHBhcmFtZXRlcnMuXG4gKlxuICogQHJldHVybnMge3t9fVxuICovXG4gICAgICAgY29uc3QgaW5pdEVtcHR5ID0gKCkgPT4gZW1wdHlSZWNvcmQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSSBpbml0IGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IE0gbWV0aG9kc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtFeG9DbGFzc0ludGVyZmFjZUd1YXJkPE0+IHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge0V4b0NsYXNzTWV0aG9kczxNLCBJPn0gbWV0aG9kc1xuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sIE0+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWQ8TT59XG4gKi8kaM2PX29uY2UuaW5pdEVtcHR5KGluaXRFbXB0eSk7XG4gICAgICAgY29uc3QgZGVmaW5lRXhvQ2xhc3MgPSAoXG4gIHRhZyxcbiAgaW50ZXJmYWNlR3VhcmQsXG4gIGluaXQsXG4gIG1ldGhvZHMsXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBoYXJkZW4obWV0aG9kcyk7XG4gIGNvbnN0IHtcbiAgICBmaW5pc2ggPSB1bmRlZmluZWQsXG4gICAgcmVjZWl2ZUFtcGxpZmllciA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlSW5zdGFuY2VUZXN0ZXIgPSB1bmRlZmluZWQsXG4gIH0gPSBvcHRpb25zO1xuICByZWNlaXZlQW1wbGlmaWVyID09PSB1bmRlZmluZWQgfHxcbiAgICBGYWlsYE9ubHkgZmFjZXRzIG9mIGFuIGV4byBjbGFzcyBraXQgY2FuIGJlIGFtcGxpZmllZCAke3EodGFnKX1gO1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcDxNLCBJTVBPUlQoJy4vdHlwZXMuanMnKS5DbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPiwgTT4+fSAqL1xuICBjb25zdCBjb250ZXh0TWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3QgcHJvdG8gPSBkZWZlbmRQcm90b3R5cGUoXG4gICAgdGFnLFxuICAgIHNlbGYgPT4gLyoqIEB0eXBlIHthbnl9ICovIChjb250ZXh0TWFwLmdldChzZWxmKSksXG4gICAgbWV0aG9kcyxcbiAgICB0cnVlLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICApO1xuICBsZXQgaW5zdGFuY2VDb3VudCA9IDA7XG4gIC8qKlxuICogQHBhcmFtICB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICovXG4gIGNvbnN0IG1ha2VJbnN0YW5jZSA9ICguLi5hcmdzKSA9PiB7XG4gICAgLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuICAgIGNvbnN0IHN0YXRlID0gc2VhbChpbml0KC4uLmFyZ3MpKTtcbiAgICBpbnN0YW5jZUNvdW50ICs9IDE7XG4gICAgY29uc3Qgc2VsZiA9IG1ha2VTZWxmKHByb3RvLCBpbnN0YW5jZUNvdW50KTtcblxuICAgIC8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbiAgICAvKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNsYXNzQ29udGV4dDxSZXR1cm5UeXBlPEk+LE0+fSAqL1xuICAgIGNvbnN0IGNvbnRleHQgPSBmcmVlemUoeyBzdGF0ZSwgc2VsZiB9KTtcbiAgICBjb250ZXh0TWFwLnNldChzZWxmLCBjb250ZXh0KTtcbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICBmaW5pc2goY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIGlmIChyZWNlaXZlSW5zdGFuY2VUZXN0ZXIpIHtcbiAgICAvKiogQHR5cGUge0lzSW5zdGFuY2V9ICovXG4gICAgY29uc3QgaXNJbnN0YW5jZSA9IChleG8sIGZhY2V0TmFtZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgZmFjZXROYW1lID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBmYWNldE5hbWUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGFuIGV4byBjbGFzcyBraXQ6ICR7cShcbiAgICAgICAgICB0YWcsXG4gICAgICAgICl9IGhhcyBubyBmYWNldCAke3EoZmFjZXROYW1lKX1gO1xuICAgICAgcmV0dXJuIGNvbnRleHRNYXAuaGFzKGV4byk7XG4gICAgfTtcbiAgICBoYXJkZW4oaXNJbnN0YW5jZSk7XG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyKGlzSW5zdGFuY2UpO1xuICB9XG5cbiAgcmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2UpO1xufTskaM2PX29uY2UuZGVmaW5lRXhvQ2xhc3MoZGVmaW5lRXhvQ2xhc3MpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJIGluaXQgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPEZhY2V0TmFtZSwgTWV0aG9kcz59IEYgZmFjZXQgbWV0aG9kc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtFeG9DbGFzc0ludGVyZmFjZUd1YXJkS2l0PEY+IHwgdW5kZWZpbmVkIH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtFeG9DbGFzc0tpdE1ldGhvZHM8RiwgST59IG1ldGhvZHNLaXRcbiAqIEBwYXJhbSB7RmFyQ2xhc3NPcHRpb25zPFxuICogICBLaXRDb250ZXh0PFJldHVyblR5cGU8ST4sIEd1YXJkZWRLaXQ8Rj4+LFxuICogICBHdWFyZGVkS2l0PEY+XG4gKiA+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZEtpdDxGPn1cbiAqL1xuICAgICAgIGNvbnN0IGRlZmluZUV4b0NsYXNzS2l0ID0gKFxuICB0YWcsXG4gIGludGVyZmFjZUd1YXJkS2l0LFxuICBpbml0LFxuICBtZXRob2RzS2l0LFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgaGFyZGVuKG1ldGhvZHNLaXQpO1xuICBjb25zdCB7XG4gICAgZmluaXNoID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVBbXBsaWZpZXIgPSB1bmRlZmluZWQsXG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyID0gdW5kZWZpbmVkLFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY29udGV4dE1hcEtpdCA9IG9iamVjdE1hcChtZXRob2RzS2l0LCAoKSA9PiBuZXcgV2Vha01hcCgpKTtcbiAgY29uc3QgZ2V0Q29udGV4dEtpdCA9IG9iamVjdE1hcChcbiAgICBjb250ZXh0TWFwS2l0LFxuICAgIGNvbnRleHRNYXAgPT4gZmFjZXQgPT4gY29udGV4dE1hcC5nZXQoZmFjZXQpLFxuICApO1xuICBjb25zdCBwcm90b3R5cGVLaXQgPSBkZWZlbmRQcm90b3R5cGVLaXQoXG4gICAgdGFnLFxuICAgIGdldENvbnRleHRLaXQsXG4gICAgbWV0aG9kc0tpdCxcbiAgICB0cnVlLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICApO1xuICBsZXQgaW5zdGFuY2VDb3VudCA9IDA7XG4gIC8qKlxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKi9cbiAgY29uc3QgbWFrZUluc3RhbmNlS2l0ID0gKC4uLmFyZ3MpID0+IHtcbiAgICAvKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG4gICAgY29uc3Qgc3RhdGUgPSBzZWFsKGluaXQoLi4uYXJncykpO1xuICAgIC8qIERvbid0IGZyZWV6ZSBjb250ZXh0IHVudGlsIHdlIGFkZCBmYWNldHMqL1xuICAgIC8qKiBAdHlwZSB7eyBzdGF0ZTogUmV0dXJuVHlwZTxJPiwgZmFjZXRzOiBhbnkgfX0gKi9cbiAgICBjb25zdCBjb250ZXh0ID0geyBzdGF0ZSwgZmFjZXRzOiBudWxsIH07XG4gICAgaW5zdGFuY2VDb3VudCArPSAxO1xuICAgIGNvbnN0IGZhY2V0cyA9IG9iamVjdE1hcChwcm90b3R5cGVLaXQsIChwcm90bywgZmFjZXROYW1lKSA9PiB7XG4gICAgICBjb25zdCBzZWxmID0gbWFrZVNlbGYocHJvdG8sIGluc3RhbmNlQ291bnQpO1xuICAgICAgY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLnNldChzZWxmLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0pO1xuICAgIGNvbnRleHQuZmFjZXRzID0gZmFjZXRzO1xuICAgIC8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbiAgICBmcmVlemUoY29udGV4dCk7XG4gICAgaWYgKGZpbmlzaCkge1xuICAgICAgZmluaXNoKGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtHdWFyZGVkS2l0PEY+fSAqLyAoY29udGV4dC5mYWNldHMpO1xuICB9O1xuXG4gIGlmIChyZWNlaXZlQW1wbGlmaWVyKSB7XG4gICAgLyoqIEB0eXBlIHtBbXBsaWZ5fSAqL1xuICAgIGNvbnN0IGFtcGxpZnkgPSBleG9GYWNldCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbnRleHRNYXAgb2YgdmFsdWVzKGNvbnRleHRNYXBLaXQpKSB7XG4gICAgICAgIGlmIChjb250ZXh0TWFwLmhhcyhleG9GYWNldCkpIHtcbiAgICAgICAgICBjb25zdCB7IGZhY2V0cyB9ID0gY29udGV4dE1hcC5nZXQoZXhvRmFjZXQpO1xuICAgICAgICAgIHJldHVybiBmYWNldHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IEZhaWxgTXVzdCBiZSBhIGZhY2V0IG9mICR7cSh0YWcpfTogJHtleG9GYWNldH1gO1xuICAgIH07XG4gICAgaGFyZGVuKGFtcGxpZnkpO1xuICAgIHJlY2VpdmVBbXBsaWZpZXIoYW1wbGlmeSk7XG4gIH1cblxuICBpZiAocmVjZWl2ZUluc3RhbmNlVGVzdGVyKSB7XG4gICAgLyoqIEB0eXBlIHtJc0luc3RhbmNlfSAqL1xuICAgIGNvbnN0IGlzSW5zdGFuY2UgPSAoZXhvRmFjZXQsIGZhY2V0TmFtZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGZhY2V0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXMoY29udGV4dE1hcEtpdCkuc29tZShjb250ZXh0TWFwID0+XG4gICAgICAgICAgY29udGV4dE1hcC5oYXMoZXhvRmFjZXQpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXNzZXJ0LnR5cGVvZihmYWNldE5hbWUsICdzdHJpbmcnKTtcbiAgICAgIGNvbnN0IGNvbnRleHRNYXAgPSBjb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV07XG4gICAgICBjb250ZXh0TWFwICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBleG8gY2xhc3Mga2l0ICR7cSh0YWcpfSBoYXMgbm8gZmFjZXQgbmFtZWQgJHtxKGZhY2V0TmFtZSl9YDtcbiAgICAgIHJldHVybiBjb250ZXh0TWFwLmhhcyhleG9GYWNldCk7XG4gICAgfTtcbiAgICBoYXJkZW4oaXNJbnN0YW5jZSk7XG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyKGlzSW5zdGFuY2UpO1xuICB9XG5cbiAgcmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2VLaXQpO1xufTskaM2PX29uY2UuZGVmaW5lRXhvQ2xhc3NLaXQoZGVmaW5lRXhvQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7SU1QT1JUKCdAZW5kby9wYXR0ZXJucycpLkludGVyZmFjZUd1YXJkPHtcbiAqICAgW00gaW4ga2V5b2YgVF06IElNUE9SVCgnQGVuZG8vcGF0dGVybnMnKS5NZXRob2RHdWFyZFxuICogfT4gfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkIENBVkVBVDogc3RhdGljIHR5cGluZyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBgY2FsbFdoZW5gIHRyYW5zZm9ybWF0aW9uXG4gKiBAcGFyYW0ge1R9IG1ldGhvZHNcbiAqIEBwYXJhbSB7RmFyQ2xhc3NPcHRpb25zPElNUE9SVCgnLi90eXBlcy5qcycpLkNsYXNzQ29udGV4dDx7fSxUPj59IFtvcHRpb25zXVxuICogQHJldHVybnMge0d1YXJkZWQ8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRXhvID0gKHRhZywgaW50ZXJmYWNlR3VhcmQsIG1ldGhvZHMsIG9wdGlvbnMgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgbWFrZUluc3RhbmNlID0gZGVmaW5lRXhvQ2xhc3MoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIGluaXRFbXB0eSxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIHJldHVybiBtYWtlSW5zdGFuY2UoKTtcbn07JGjNj19vbmNlLm1ha2VFeG8obWFrZUV4byk7XG5oYXJkZW4obWFrZUV4byk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbml0RW1wdHkiOlsiaW5pdEVtcHR5Il0sImRlZmluZUV4b0NsYXNzIjpbImRlZmluZUV4b0NsYXNzIl0sImRlZmluZUV4b0NsYXNzS2l0IjpbImRlZmluZUV4b0NsYXNzS2l0Il0sIm1ha2VFeG8iOlsibWFrZUV4byJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAVo/7rLkYAAC5GAAAiAAAAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9nZXQtaW50ZXJmYWNlLmpzIl0sImV4cG9ydHMiOlsiZGVmZW5kUHJvdG90eXBlIiwiZGVmZW5kUHJvdG90eXBlS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxnZXRSZW1vdGFibGVNZXRob2ROYW1lcyx0b1Rocm93YWJsZSxGYXIsbXVzdE1hdGNoLE0saXNBd2FpdEFyZ0d1YXJkLGlzUmF3R3VhcmQsZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQsZ2V0TWV0aG9kR3VhcmRQYXlsb2FkLGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCxnZXRDb3B5TWFwRW50cmllcyxsaXN0RGlmZmVyZW5jZSxvYmplY3RNYXAscSxGYWlsLEdFVF9JTlRFUkZBQ0VfR1VBUkQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFJlbW90YWJsZU1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMgPSAkaM2PX2EpXV0sW1widG9UaHJvd2FibGVcIixbJGjNj19hID0+ICh0b1Rocm93YWJsZSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImlzQXdhaXRBcmdHdWFyZFwiLFskaM2PX2EgPT4gKGlzQXdhaXRBcmdHdWFyZCA9ICRozY9fYSldXSxbXCJpc1Jhd0d1YXJkXCIsWyRozY9fYSA9PiAoaXNSYXdHdWFyZCA9ICRozY9fYSldXSxbXCJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dLFtcImdldE1ldGhvZEd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldE1ldGhvZEd1YXJkUGF5bG9hZCA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJpZXNcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanNcIiwgW1tcImxpc3REaWZmZXJlbmNlXCIsWyRozY9fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vZ2V0LWludGVyZmFjZS5qc1wiLCBbW1wiR0VUX0lOVEVSRkFDRV9HVUFSRFwiLFskaM2PX2EgPT4gKEdFVF9JTlRFUkZBQ0VfR1VBUkQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1JlbW90YWJsZU1ldGhvZE5hbWV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmQsIE1ldGhvZCwgTWV0aG9kR3VhcmQsIE1ldGhvZEd1YXJkUGF5bG9hZCwgRGVmYXVsdEd1YXJkVHlwZX0gZnJvbSAnQGVuZG8vcGF0dGVybnMnXG4gKiBAaW1wb3J0IHtDbGFzc0NvbnRleHQsIENvbnRleHRQcm92aWRlciwgRmFjZXROYW1lLCBLaXRDb250ZXh0LCBLaXRDb250ZXh0UHJvdmlkZXIsIE1hdGNoQ29uZmlnLCBNZXRob2RzfSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7R2V0SW50ZXJmYWNlR3VhcmR9IGZyb20gJy4vZ2V0LWludGVyZmFjZS5qcyc7XG4gKi9cblxuY29uc3QgeyBhcHBseSwgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZGVmaW5lUHJvcGVydGllcywgZnJvbUVudHJpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEEgbWV0aG9kIGd1YXJkLCBmb3IgaW5jbHVzaW9uIGluIGFuIGludGVyZmFjZSBndWFyZCwgdGhhdCBkb2VzIG5vdFxuICogZW5mb3JjZSBhbnkgY29uc3RyYWludHMgb2YgaW5jb21pbmcgYXJndW1lbnRzIG9yIHJldHVybiByZXN1bHRzLlxuICovXG5jb25zdCBSYXdNZXRob2RHdWFyZCA9IE0uY2FsbCgpLnJlc3QoTS5yYXcoKSkucmV0dXJucyhNLnJhdygpKTtcblxuY29uc3QgUkVEQUNURURfUkFXX0FSRyA9ICc8cmVkYWN0ZWQgcmF3IGFyZz4nO1xuXG4vKipcbiAqIEEgbWV0aG9kIGd1YXJkLCBmb3IgaW5jbHVzaW9uIGluIGFuIGludGVyZmFjZSBndWFyZCwgdGhhdCBlbmZvcmNlcyBvbmx5IHRoYXRcbiAqIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NhYmxlIGFuZCB0aGF0IHRoZSByZXN1bHQgaXMgcGFzc2FibGUuIChJbiBmYXIgY2xhc3NlcyxcbiAqIFwiYW55XCIgbWVhbnMgYW55ICpwYXNzYWJsZSouKSBUaGlzIGlzIHRoZSBsZWFzdCBwb3NzaWJsZSBub24tcmF3XG4gKiBlbmZvcmNlbWVudCBmb3IgYSBtZXRob2QgZ3VhcmQsIGFuZCBpcyBpbXBsaWVkIGJ5IGFsbCBvdGhlclxuICogbm9uLXJhdyBtZXRob2QgZ3VhcmRzLlxuICovXG5jb25zdCBQYXNzYWJsZU1ldGhvZEd1YXJkID0gTS5jYWxsKCkucmVzdChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpO1xuXG4vKipcbiAqIEBwYXJhbSB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGVbXX0gc3luY0FyZ3NcbiAqIEBwYXJhbSB7TWF0Y2hDb25maWd9IG1hdGNoQ29uZmlnXG4gKiBAcGFyYW0ge3N0cmluZ30gW2xhYmVsXVxuICogQHJldHVybnMge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlW119IFJldHVybnMgdGhlIGFyZ3MgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSByYXcgbWV0aG9kLlxuICovXG5jb25zdCBkZWZlbmRTeW5jQXJncyA9IChzeW5jQXJncywgbWF0Y2hDb25maWcsIGxhYmVsID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNsYXJlZExlbixcbiAgICBoYXNSZXN0QXJnR3VhcmQsXG4gICAgcmVzdEFyZ0d1YXJkSXNSYXcsXG4gICAgcGFyYW1zUGF0dGVybixcbiAgICByZWRhY3RlZEluZGljZXMsXG4gIH0gPSBtYXRjaENvbmZpZztcblxuICAvKiBVc2Ugc3luY0FyZ3MgaWYgcG9zc2libGUsIGJ1dCBjb3B5IGl0IHdoZW4gbmVjZXNzYXJ5IHRvIGltcGxlbWVudCovXG4gIC8qIHJlZGFjdGlvbnMuKi9cbiAgbGV0IG1hdGNoYWJsZUFyZ3MgPSBzeW5jQXJncztcbiAgaWYgKHJlc3RBcmdHdWFyZElzUmF3ICYmIHN5bmNBcmdzLmxlbmd0aCA+IGRlY2xhcmVkTGVuKSB7XG4gICAgY29uc3QgcmVzdExlbiA9IHN5bmNBcmdzLmxlbmd0aCAtIGRlY2xhcmVkTGVuO1xuICAgIGNvbnN0IHJlZGFjdGVkUmVzdCA9IEFycmF5KHJlc3RMZW4pLmZpbGwoUkVEQUNURURfUkFXX0FSRyk7XG4gICAgbWF0Y2hhYmxlQXJncyA9IFsuLi5zeW5jQXJncy5zbGljZSgwLCBkZWNsYXJlZExlbiksIC4uLnJlZGFjdGVkUmVzdF07XG4gIH0gZWxzZSBpZiAoXG4gICAgcmVkYWN0ZWRJbmRpY2VzLmxlbmd0aCA+IDAgJiZcbiAgICByZWRhY3RlZEluZGljZXNbMF0gPCBzeW5jQXJncy5sZW5ndGhcbiAgKSB7XG4gICAgLyogQ29weSB0aGUgYXJndW1lbnRzIGFycmF5LCBhdm9pZGluZyBoYXJkZW5pbmcgdGhlIHJlZGFjdGVkIG9uZXMgKHdoaWNoIGFyZSovXG4gICAgLyogdHJpdmlhbGx5IG1hdGNoZWQgdXNpbmcgUkVEQUNURURfUkFXX0FSRyBhcyBhIHNlbnRpbmVsIHZhbHVlKS4qL1xuICAgIG1hdGNoYWJsZUFyZ3MgPSBbLi4uc3luY0FyZ3NdO1xuICB9XG5cbiAgZm9yIChjb25zdCBpIG9mIHJlZGFjdGVkSW5kaWNlcykge1xuICAgIGlmIChpID49IG1hdGNoYWJsZUFyZ3MubGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbWF0Y2hhYmxlQXJnc1tpXSA9IFJFREFDVEVEX1JBV19BUkc7XG4gIH1cblxuICBtdXN0TWF0Y2goaGFyZGVuKG1hdGNoYWJsZUFyZ3MpLCBwYXJhbXNQYXR0ZXJuLCBsYWJlbCk7XG5cbiAgaWYgKGhhc1Jlc3RBcmdHdWFyZCkge1xuICAgIHJldHVybiBzeW5jQXJncztcbiAgfVxuICBzeW5jQXJncy5sZW5ndGggPD0gZGVjbGFyZWRMZW4gfHxcbiAgICBGYWlsYCR7cShsYWJlbCl9IGFjY2VwdHMgYXQgbW9zdCAke3EoZGVjbGFyZWRMZW4pfSBhcmd1bWVudHMsIG5vdCAke3EoXG4gICAgICBzeW5jQXJncy5sZW5ndGgsXG4gICAgKX06ICR7c3luY0FyZ3N9YDtcbiAgcmV0dXJuIHN5bmNBcmdzO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgbWV0aG9kIGd1YXJkIHRvIGEgbWF0Y2ggY29uZmlnIGZvciBtb3JlIGVmZmljaWVudCBwZXItY2FsbFxuICogZXhlY3V0aW9uLiAgVGhpcyBpcyBhIG9uZS10aW1lIGNvbnZlcnNpb24sIHNvIGl0J3MgT0sgdG8gYmUgc2xvdy5cbiAqXG4gKiBNb3N0IG9mIHRoZSB3b3JrIGlzIGRvbmUgdG8gZGV0ZWN0IGBNLnJhdygpYCBzbyB0aGF0IHdlIGJ1aWxkIGEgbWF0Y2ggcGF0dGVyblxuICogYW5kIG1ldGFkYXRhIGluc3RlYWQgb2YgZG9pbmcgdGhpcyBpbiB0aGUgaG90IHBhdGguXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkUGF5bG9hZH0gbWV0aG9kR3VhcmRQYXlsb2FkXG4gKiBAcmV0dXJucyB7TWF0Y2hDb25maWd9XG4gKi9cbmNvbnN0IGJ1aWxkTWF0Y2hDb25maWcgPSBtZXRob2RHdWFyZFBheWxvYWQgPT4ge1xuICBjb25zdCB7XG4gICAgYXJnR3VhcmRzLFxuICAgIG9wdGlvbmFsQXJnR3VhcmRzID0gW10sXG4gICAgcmVzdEFyZ0d1YXJkLFxuICB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuXG4gIGNvbnN0IG1hdGNoYWJsZUFyZ0d1YXJkcyA9IFsuLi5hcmdHdWFyZHMsIC4uLm9wdGlvbmFsQXJnR3VhcmRzXTtcblxuICBjb25zdCByZWRhY3RlZEluZGljZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaGFibGVBcmdHdWFyZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoaXNSYXdHdWFyZChtYXRjaGFibGVBcmdHdWFyZHNbaV0pKSB7XG4gICAgICBtYXRjaGFibGVBcmdHdWFyZHNbaV0gPSBSRURBQ1RFRF9SQVdfQVJHO1xuICAgICAgcmVkYWN0ZWRJbmRpY2VzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgLyogUGFzcyB0aHJvdWdoIHJhdyByZXN0IGFyZ3VtZW50cyB3aXRob3V0IG1hdGNoaW5nLiovXG4gIGxldCBtYXRjaGFibGVSZXN0QXJnR3VhcmQgPSByZXN0QXJnR3VhcmQ7XG4gIGlmIChpc1Jhd0d1YXJkKG1hdGNoYWJsZVJlc3RBcmdHdWFyZCkpIHtcbiAgICBtYXRjaGFibGVSZXN0QXJnR3VhcmQgPSBNLmFycmF5T2YoUkVEQUNURURfUkFXX0FSRyk7XG4gIH1cbiAgY29uc3QgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkID0gaGFyZGVuKHtcbiAgICAuLi5tZXRob2RHdWFyZFBheWxvYWQsXG4gICAgYXJnR3VhcmRzOiBtYXRjaGFibGVBcmdHdWFyZHMuc2xpY2UoMCwgYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgb3B0aW9uYWxBcmdHdWFyZHM6IG1hdGNoYWJsZUFyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICByZXN0QXJnR3VhcmQ6IG1hdGNoYWJsZVJlc3RBcmdHdWFyZCxcbiAgfSk7XG5cbiAgY29uc3QgcGFyYW1zUGF0dGVybiA9IE0uc3BsaXRBcnJheShcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQuYXJnR3VhcmRzLFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZC5vcHRpb25hbEFyZ0d1YXJkcyxcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQucmVzdEFyZ0d1YXJkLFxuICApO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGRlY2xhcmVkTGVuOiBtYXRjaGFibGVBcmdHdWFyZHMubGVuZ3RoLFxuICAgIGhhc1Jlc3RBcmdHdWFyZDogcmVzdEFyZ0d1YXJkICE9PSB1bmRlZmluZWQsXG4gICAgcmVzdEFyZ0d1YXJkSXNSYXc6IHJlc3RBcmdHdWFyZCAhPT0gbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkLFxuICAgIHBhcmFtc1BhdHRlcm4sXG4gICAgcmVkYWN0ZWRJbmRpY2VzLFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7KHJlcHJlc2VudGF0aXZlOiBhbnkpID0+IENsYXNzQ29udGV4dCB8IEtpdENvbnRleHR9IGdldENvbnRleHRcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmRQYXlsb2FkfSBtZXRob2RHdWFyZFBheWxvYWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHJldHVybnMge01ldGhvZH1cbiAqL1xuY29uc3QgZGVmZW5kU3luY01ldGhvZCA9IChcbiAgZ2V0Q29udGV4dCxcbiAgYmVoYXZpb3JNZXRob2QsXG4gIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgbGFiZWwsXG4pID0+IHtcbiAgY29uc3QgeyByZXR1cm5HdWFyZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBjb25zdCBpc1Jhd1JldHVybiA9IGlzUmF3R3VhcmQocmV0dXJuR3VhcmQpO1xuICBjb25zdCBtYXRjaENvbmZpZyA9IGJ1aWxkTWF0Y2hDb25maWcobWV0aG9kR3VhcmRQYXlsb2FkKTtcbiAgY29uc3QgeyBzeW5jTWV0aG9kIH0gPSB7XG4gICAgLyogTm90ZSBwdXJwb3NlZnVsIHVzZSBvZiBgdGhpc2AgYW5kIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4gICAgc3luY01ldGhvZCguLi5zeW5jQXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQodGhpcyk7XG4gICAgICAgIC8qIE9ubHkgaGFyZGVuIGFyZ3MgYW5kIHJldHVybiB2YWx1ZSBpZiBub3QgZGVhbGluZyB3aXRoIGEgcmF3IHZhbHVlIGd1YXJkLiovXG4gICAgICAgIGNvbnN0IHJlYWxBcmdzID0gZGVmZW5kU3luY0FyZ3Moc3luY0FyZ3MsIG1hdGNoQ29uZmlnLCBsYWJlbCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFwcGx5KGJlaGF2aW9yTWV0aG9kLCBjb250ZXh0LCByZWFsQXJncyk7XG4gICAgICAgIGlmICghaXNSYXdSZXR1cm4pIHtcbiAgICAgICAgICBtdXN0TWF0Y2goaGFyZGVuKHJlc3VsdCksIHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGNhdGNoICh0aHJvd25UaGluZykge1xuICAgICAgICB0aHJvdyB0b1Rocm93YWJsZSh0aHJvd25UaGluZyk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHN5bmNNZXRob2Q7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmRQYXlsb2FkfSBtZXRob2RHdWFyZFBheWxvYWRcbiAqL1xuY29uc3QgZGVzeW5jID0gbWV0aG9kR3VhcmRQYXlsb2FkID0+IHtcbiAgY29uc3Qge1xuICAgIGFyZ0d1YXJkcyxcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgIHJlc3RBcmdHdWFyZCxcbiAgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgIWlzQXdhaXRBcmdHdWFyZChyZXN0QXJnR3VhcmQpIHx8XG4gICAgRmFpbGBSZXN0IGFyZ3MgbWF5IG5vdCBiZSBhd2FpdGVkOiAke3Jlc3RBcmdHdWFyZH1gO1xuICBjb25zdCByYXdBcmdHdWFyZHMgPSBbLi4uYXJnR3VhcmRzLCAuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbiAgY29uc3QgYXdhaXRJbmRleGVzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3QXJnR3VhcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgYXJnR3VhcmQgPSByYXdBcmdHdWFyZHNbaV07XG4gICAgaWYgKGlzQXdhaXRBcmdHdWFyZChhcmdHdWFyZCkpIHtcbiAgICAgIHJhd0FyZ0d1YXJkc1tpXSA9IGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKGFyZ0d1YXJkKS5hcmdHdWFyZDtcbiAgICAgIGF3YWl0SW5kZXhlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGF3YWl0SW5kZXhlcyxcbiAgICByYXdNZXRob2RHdWFyZFBheWxvYWQ6IHtcbiAgICAgIC4uLm1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGFyZ0d1YXJkczogcmF3QXJnR3VhcmRzLnNsaWNlKDAsIGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgICAgb3B0aW9uYWxBcmdHdWFyZHM6IHJhd0FyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICB9LFxuICB9O1xufTtcblxuLyoqXG4gKiBAcGFyYW0geyhyZXByZXNlbnRhdGl2ZTogYW55KSA9PiBDbGFzc0NvbnRleHQgfCBLaXRDb250ZXh0fSBnZXRDb250ZXh0XG4gKiBAcGFyYW0ge0NhbGxhYmxlRnVuY3Rpb259IGJlaGF2aW9yTWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkUGF5bG9hZH0gbWV0aG9kR3VhcmRQYXlsb2FkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqL1xuY29uc3QgZGVmZW5kQXN5bmNNZXRob2QgPSAoXG4gIGdldENvbnRleHQsXG4gIGJlaGF2aW9yTWV0aG9kLFxuICBtZXRob2RHdWFyZFBheWxvYWQsXG4gIGxhYmVsLFxuKSA9PiB7XG4gIGNvbnN0IHsgcmV0dXJuR3VhcmQgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgY29uc3QgaXNSYXdSZXR1cm4gPSBpc1Jhd0d1YXJkKHJldHVybkd1YXJkKTtcblxuICBjb25zdCB7IGF3YWl0SW5kZXhlcywgcmF3TWV0aG9kR3VhcmRQYXlsb2FkIH0gPSBkZXN5bmMobWV0aG9kR3VhcmRQYXlsb2FkKTtcbiAgY29uc3QgbWF0Y2hDb25maWcgPSBidWlsZE1hdGNoQ29uZmlnKHJhd01ldGhvZEd1YXJkUGF5bG9hZCk7XG5cbiAgY29uc3QgeyBhc3luY01ldGhvZCB9ID0ge1xuICAgIC8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuICAgIGFzeW5jTWV0aG9kKC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IGF3YWl0TGlzdCA9IFtdO1xuICAgICAgZm9yIChjb25zdCBpIG9mIGF3YWl0SW5kZXhlcykge1xuICAgICAgICBpZiAoaSA+PSBhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0TGlzdC5wdXNoKGFyZ3NbaV0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcCA9IFByb21pc2UuYWxsKGF3YWl0TGlzdCk7XG4gICAgICBjb25zdCBzeW5jQXJncyA9IFsuLi5hcmdzXTtcbiAgICAgIGNvbnN0IHJlc3VsdFAgPSBFLndoZW4oXG4gICAgICAgIHAsXG4gICAgICAgIC8qKiBAcGFyYW0ge2FueVtdfSBhd2FpdGVkQXJncyAqLyBhd2FpdGVkQXJncyA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhd2FpdGVkQXJncy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgICAgc3luY0FyZ3NbYXdhaXRJbmRleGVzW2pdXSA9IGF3YWl0ZWRBcmdzW2pdO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBHZXQgdGhlIGNvbnRleHQgYWZ0ZXIgYWxsIHdhaXRpbmcgaW4gY2FzZSB3ZSBldmVyIGRvIHJldm9jYXRpb24qL1xuICAgICAgICAgIC8qIGJ5IHJlbW92aW5nIHRoZSBjb250ZXh0IGVudHJ5LiBBdm9pZCBUT0NUVE9VISovXG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQodGhpcyk7XG4gICAgICAgICAgY29uc3QgcmVhbEFyZ3MgPSBkZWZlbmRTeW5jQXJncyhzeW5jQXJncywgbWF0Y2hDb25maWcsIGxhYmVsKTtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsIGNvbnRleHQsIHJlYWxBcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gRS53aGVuKHJlc3VsdFAsIGZ1bGZpbGxtZW50ID0+IHtcbiAgICAgICAgaWYgKCFpc1Jhd1JldHVybikge1xuICAgICAgICAgIG11c3RNYXRjaChoYXJkZW4oZnVsZmlsbG1lbnQpLCByZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVsZmlsbG1lbnQ7XG4gICAgICB9KS5jYXRjaChyZWFzb24gPT5cbiAgICAgICAgLyogRG9uZSBpcyBhIGNoYWluZWQgYC5jYXRjaGAgcmF0aGVyIHRoYW4gYW4gb25SZWplY3RlZCBjbGF1c2Ugb2YgdGhlKi9cbiAgICAgICAgLyogYEUud2hlbmAgYWJvdmUgaW4gY2FzZSB0aGUgYG11c3RNYXRjaGAgdGhyb3dzLiovXG4gICAgICAgIFByb21pc2UucmVqZWN0KHRvVGhyb3dhYmxlKHJlYXNvbikpLFxuICAgICAgKTtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gYXN5bmNNZXRob2Q7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0geyhyZXByZXNlbnRhdGl2ZTogYW55KSA9PiBDbGFzc0NvbnRleHQgfCBLaXRDb250ZXh0fSBnZXRDb250ZXh0XG4gKiBAcGFyYW0ge0NhbGxhYmxlRnVuY3Rpb259IGJlaGF2aW9yTWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKi9cbmNvbnN0IGRlZmVuZE1ldGhvZCA9IChnZXRDb250ZXh0LCBiZWhhdmlvck1ldGhvZCwgbWV0aG9kR3VhcmQsIGxhYmVsKSA9PiB7XG4gIGNvbnN0IG1ldGhvZEd1YXJkUGF5bG9hZCA9IGdldE1ldGhvZEd1YXJkUGF5bG9hZChtZXRob2RHdWFyZCk7XG4gIGNvbnN0IHsgY2FsbEtpbmQgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgaWYgKGNhbGxLaW5kID09PSAnc3luYycpIHtcbiAgICByZXR1cm4gZGVmZW5kU3luY01ldGhvZChcbiAgICAgIGdldENvbnRleHQsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGxhYmVsLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0KGNhbGxLaW5kID09PSAnYXN5bmMnKTtcbiAgICByZXR1cm4gZGVmZW5kQXN5bmNNZXRob2QoXG4gICAgICBnZXRDb250ZXh0LFxuICAgICAgYmVoYXZpb3JNZXRob2QsXG4gICAgICBtZXRob2RHdWFyZFBheWxvYWQsXG4gICAgICBsYWJlbCxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RUYWdcbiAqIEBwYXJhbSB7Q29udGV4dFByb3ZpZGVyfSBjb250ZXh0UHJvdmlkZXJcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKi9cbmNvbnN0IGJpbmRNZXRob2QgPSAoXG4gIG1ldGhvZFRhZyxcbiAgY29udGV4dFByb3ZpZGVyLFxuICBiZWhhdmlvck1ldGhvZCxcbiAgbWV0aG9kR3VhcmQsXG4pID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihiZWhhdmlvck1ldGhvZCwgJ2Z1bmN0aW9uJyk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge2FueX0gcmVwcmVzZW50YXRpdmVcbiAqIEByZXR1cm5zIHtDbGFzc0NvbnRleHQgfCBLaXRDb250ZXh0fVxuICovXG4gIGNvbnN0IGdldENvbnRleHQgPSByZXByZXNlbnRhdGl2ZSA9PiB7XG4gICAgcmVwcmVzZW50YXRpdmUgfHxcbiAgICAgIC8qIHNlcGFyYXRlIGxpbmUgdG8gZWFzZSBicmVha3BvaW50aW5nKi9cbiAgICAgIEZhaWxgTWV0aG9kICR7bWV0aG9kVGFnfSBjYWxsZWQgd2l0aG91dCAndGhpcycgb2JqZWN0YDtcbiAgICBjb25zdCBjb250ZXh0ID0gY29udGV4dFByb3ZpZGVyKHJlcHJlc2VudGF0aXZlKTtcbiAgICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBGYWlsYCR7cShcbiAgICAgICAgbWV0aG9kVGFnLFxuICAgICAgKX0gbWF5IG9ubHkgYmUgYXBwbGllZCB0byBhIHZhbGlkIGluc3RhbmNlOiAke3JlcHJlc2VudGF0aXZlfWA7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0O1xuICB9O1xuXG4gIGNvbnN0IG1ldGhvZCA9IGRlZmVuZE1ldGhvZChcbiAgICBnZXRDb250ZXh0LFxuICAgIGJlaGF2aW9yTWV0aG9kLFxuICAgIG1ldGhvZEd1YXJkLFxuICAgIG1ldGhvZFRhZyxcbiAgKTtcblxuICBkZWZpbmVQcm9wZXJ0aWVzKG1ldGhvZCwge1xuICAgIG5hbWU6IHsgdmFsdWU6IG1ldGhvZFRhZyB9LFxuICAgIGxlbmd0aDogeyB2YWx1ZTogYmVoYXZpb3JNZXRob2QubGVuZ3RoIH0sXG4gIH0pO1xuICByZXR1cm4gbWV0aG9kO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxSZW1vdGFibGVNZXRob2ROYW1lLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtDb250ZXh0UHJvdmlkZXJ9IGNvbnRleHRQcm92aWRlclxuICogQHBhcmFtIHtUfSBiZWhhdmlvck1ldGhvZHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZDx7IFtNIGluIGtleW9mIFRdOiBNZXRob2RHdWFyZCB9Pn0gW2ludGVyZmFjZUd1YXJkXVxuICovXG4gICAgICAgY29uc3QgZGVmZW5kUHJvdG90eXBlID0gKFxuICB0YWcsXG4gIGNvbnRleHRQcm92aWRlcixcbiAgYmVoYXZpb3JNZXRob2RzLFxuICB0aGlzZnVsTWV0aG9kcyA9IGZhbHNlLFxuICBpbnRlcmZhY2VHdWFyZCA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBwcm90b3R5cGUgPSB7fTtcbiAgY29uc3QgbWV0aG9kTmFtZXMgPSBnZXRSZW1vdGFibGVNZXRob2ROYW1lcyhiZWhhdmlvck1ldGhvZHMpLmZpbHRlcihcbiAgICAvKiBCeSBpZ25vcmluZyBhbnkgbWV0aG9kIHRoYXQgc2VlbXMgdG8gYmUgYSBjb25zdHJ1Y3Rvciwgd2UgY2FuIHVzZSBhKi9cbiAgICAvKiBjbGFzcy5wcm90b3R5cGUgYXMgYSBiZWhhdmlvck1ldGhvZHMuKi9cbiAgICBrZXkgPT4ge1xuICAgICAgaWYgKGtleSAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gYmVoYXZpb3JNZXRob2RzLmNvbnN0cnVjdG9yO1xuICAgICAgcmV0dXJuICEoXG4gICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSAmJlxuICAgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPT09IGNvbnN0cnVjdG9yXG4gICAgICApO1xuICAgIH0sXG4gICk7XG4gIC8qKiBAdHlwZSB7UmVjb3JkPFJlbW90YWJsZU1ldGhvZE5hbWUsIE1ldGhvZEd1YXJkPiB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IG1ldGhvZEd1YXJkcztcbiAgLyoqIEB0eXBlIHtEZWZhdWx0R3VhcmRUeXBlfSAqL1xuICBsZXQgZGVmYXVsdEd1YXJkcztcbiAgaWYgKGludGVyZmFjZUd1YXJkKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW50ZXJmYWNlTmFtZSxcbiAgICAgIG1ldGhvZEd1YXJkczogbWcsXG4gICAgICBzeW1ib2xNZXRob2RHdWFyZHMsXG4gICAgICBzbG9wcHksXG4gICAgICBkZWZhdWx0R3VhcmRzOiBkZyA9IHNsb3BweSA/ICdwYXNzYWJsZScgOiBkZWZhdWx0R3VhcmRzLFxuICAgIH0gPSBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoaW50ZXJmYWNlR3VhcmQpO1xuICAgIG1ldGhvZEd1YXJkcyA9IGhhcmRlbih7XG4gICAgICAuLi5tZyxcbiAgICAgIC4uLihzeW1ib2xNZXRob2RHdWFyZHMgJiZcbiAgICAgICAgZnJvbUVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMoc3ltYm9sTWV0aG9kR3VhcmRzKSkpLFxuICAgIH0pO1xuICAgIGRlZmF1bHRHdWFyZHMgPSBkZztcbiAgICB7XG4gICAgICBjb25zdCBtZXRob2RHdWFyZE5hbWVzID0gb3duS2V5cyhtZXRob2RHdWFyZHMpO1xuICAgICAgY29uc3QgdW5pbXBsZW1lbnRlZCA9IGxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsIG1ldGhvZE5hbWVzKTtcbiAgICAgIHVuaW1wbGVtZW50ZWQubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIEZhaWxgbWV0aG9kcyAke3EodW5pbXBsZW1lbnRlZCl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuICAgICAgaWYgKGRlZmF1bHRHdWFyZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB1bmd1YXJkZWQgPSBsaXN0RGlmZmVyZW5jZShtZXRob2ROYW1lcywgbWV0aG9kR3VhcmROYW1lcyk7XG4gICAgICAgIHVuZ3VhcmRlZC5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICBGYWlsYG1ldGhvZHMgJHtxKHVuZ3VhcmRlZCl9IG5vdCBndWFyZGVkIGJ5ICR7cShpbnRlcmZhY2VOYW1lKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcykge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gYmVoYXZpb3JNZXRob2RzW3Byb3BdO1xuICAgIGNvbnN0IHsgc2hpZnRlZE1ldGhvZCB9ID0ge1xuICAgICAgc2hpZnRlZE1ldGhvZCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBiZWhhdmlvck1ldGhvZCA9IHRoaXNmdWxNZXRob2RzID8gb3JpZ2luYWxNZXRob2QgOiBzaGlmdGVkTWV0aG9kO1xuICAgIC8qIFRPRE8gc29tZSB0b29sIGRvZXMgbm90IHlldCB1bmRlcnN0YW5kIHRoZSBgPy5bYCBzeW50YXgqL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8yMjQ3I2Rpc2N1c3Npb25fcjE1ODM3MjQ0MjQqL1xuICAgIGxldCBtZXRob2RHdWFyZCA9IG1ldGhvZEd1YXJkcyAmJiBtZXRob2RHdWFyZHNbcHJvcF07XG4gICAgaWYgKCFtZXRob2RHdWFyZCkge1xuICAgICAgc3dpdGNoIChkZWZhdWx0R3VhcmRzKSB7XG4gICAgICAgIGNhc2UgdW5kZWZpbmVkOiB7XG4gICAgICAgICAgaWYgKHRoaXNmdWxNZXRob2RzKSB7XG4gICAgICAgICAgICBtZXRob2RHdWFyZCA9IFBhc3NhYmxlTWV0aG9kR3VhcmQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1ldGhvZEd1YXJkID0gUmF3TWV0aG9kR3VhcmQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Bhc3NhYmxlJzoge1xuICAgICAgICAgIG1ldGhvZEd1YXJkID0gUGFzc2FibGVNZXRob2RHdWFyZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdyYXcnOiB7XG4gICAgICAgICAgbWV0aG9kR3VhcmQgPSBSYXdNZXRob2RHdWFyZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgZGVmYXVsdEd1YXJkcyAke3EoZGVmYXVsdEd1YXJkcyl9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwcm90b3R5cGVbcHJvcF0gPSBiaW5kTWV0aG9kKFxuICAgICAgYEluICR7cShwcm9wKX0gbWV0aG9kIG9mICgke3RhZ30pYCxcbiAgICAgIGNvbnRleHRQcm92aWRlcixcbiAgICAgIGJlaGF2aW9yTWV0aG9kLFxuICAgICAgbWV0aG9kR3VhcmQsXG4gICAgKTtcbiAgfVxuXG4gIGlmICghaGFzT3duKHByb3RvdHlwZSwgR0VUX0lOVEVSRkFDRV9HVUFSRCkpIHtcbiAgICBjb25zdCBnZXRJbnRlcmZhY2VHdWFyZE1ldGhvZCA9IHtcbiAgICAgIFtHRVRfSU5URVJGQUNFX0dVQVJEXSgpIHtcbiAgICAgICAgLyogTm90ZTogTWF5IGJlIGB1bmRlZmluZWRgKi9cbiAgICAgICAgcmV0dXJuIGludGVyZmFjZUd1YXJkO1xuICAgICAgfSxcbiAgICB9W0dFVF9JTlRFUkZBQ0VfR1VBUkRdO1xuICAgIHByb3RvdHlwZVtHRVRfSU5URVJGQUNFX0dVQVJEXSA9IGJpbmRNZXRob2QoXG4gICAgICBgSW4gJHtxKEdFVF9JTlRFUkZBQ0VfR1VBUkQpfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuICAgICAgY29udGV4dFByb3ZpZGVyLFxuICAgICAgZ2V0SW50ZXJmYWNlR3VhcmRNZXRob2QsXG4gICAgICBQYXNzYWJsZU1ldGhvZEd1YXJkLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRmFyKHRhZywgLyoqIEB0eXBlIHtUICYgR2V0SW50ZXJmYWNlR3VhcmQ8VD59ICovIChwcm90b3R5cGUpKTtcbn07JGjNj19vbmNlLmRlZmVuZFByb3RvdHlwZShkZWZlbmRQcm90b3R5cGUpO1xuaGFyZGVuKGRlZmVuZFByb3RvdHlwZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gRlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHt7IFtLIGluIGtleW9mIEZdOiBLaXRDb250ZXh0UHJvdmlkZXIgfX0gY29udGV4dFByb3ZpZGVyS2l0XG4gKiBAcGFyYW0ge0Z9IGJlaGF2aW9yTWV0aG9kc0tpdFxuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge3sgW0sgaW4ga2V5b2YgRl06IEludGVyZmFjZUd1YXJkPFJlY29yZDxrZXlvZiBGW0tdLCBNZXRob2RHdWFyZD4+IH19IFtpbnRlcmZhY2VHdWFyZEtpdF1cbiAqL1xuICAgICAgIGNvbnN0IGRlZmVuZFByb3RvdHlwZUtpdCA9IChcbiAgdGFnLFxuICBjb250ZXh0UHJvdmlkZXJLaXQsXG4gIGJlaGF2aW9yTWV0aG9kc0tpdCxcbiAgdGhpc2Z1bE1ldGhvZHMgPSBmYWxzZSxcbiAgaW50ZXJmYWNlR3VhcmRLaXQgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgY29uc3QgZmFjZXROYW1lcyA9IG93bktleXMoYmVoYXZpb3JNZXRob2RzS2l0KS5zb3J0KCk7XG4gIGZhY2V0TmFtZXMubGVuZ3RoID4gMSB8fCBGYWlsYEEgbXVsdGktZmFjZXQgb2JqZWN0IG11c3QgaGF2ZSBtdWx0aXBsZSBmYWNldHNgO1xuICBpZiAoaW50ZXJmYWNlR3VhcmRLaXQpIHtcbiAgICBjb25zdCBpbnRlcmZhY2VOYW1lcyA9IG93bktleXMoaW50ZXJmYWNlR3VhcmRLaXQpO1xuICAgIGNvbnN0IGV4dHJhSW50ZXJmYWNlTmFtZXMgPSBsaXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLCBpbnRlcmZhY2VOYW1lcyk7XG4gICAgZXh0cmFJbnRlcmZhY2VOYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgSW50ZXJmYWNlcyAke3EoZXh0cmFJbnRlcmZhY2VOYW1lcyl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuICAgIGNvbnN0IGV4dHJhRmFjZXROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGludGVyZmFjZU5hbWVzLCBmYWNldE5hbWVzKTtcbiAgICBleHRyYUZhY2V0TmFtZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICBGYWlsYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG5vdCBndWFyZGVkIGJ5IGludGVyZmFjZXNgO1xuICB9XG4gIGNvbnN0IGNvbnRleHRNYXBOYW1lcyA9IG93bktleXMoY29udGV4dFByb3ZpZGVyS2l0KTtcbiAgY29uc3QgZXh0cmFDb250ZXh0TmFtZXMgPSBsaXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLCBjb250ZXh0TWFwTmFtZXMpO1xuICBleHRyYUNvbnRleHROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYENvbnRleHRzICR7cShleHRyYUNvbnRleHROYW1lcyl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuICBjb25zdCBleHRyYUZhY2V0TmFtZXMgPSBsaXN0RGlmZmVyZW5jZShjb250ZXh0TWFwTmFtZXMsIGZhY2V0TmFtZXMpO1xuICBleHRyYUZhY2V0TmFtZXMubGVuZ3RoID09PSAwIHx8XG4gICAgRmFpbGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBtaXNzaW5nIGNvbnRleHRzYDtcbiAgY29uc3QgcHJvdG9LaXQgPSBvYmplY3RNYXAoYmVoYXZpb3JNZXRob2RzS2l0LCAoYmVoYXZpb3JNZXRob2RzLCBmYWNldE5hbWUpID0+XG4gICAgZGVmZW5kUHJvdG90eXBlKFxuICAgICAgYCR7dGFnfSAke1N0cmluZyhmYWNldE5hbWUpfWAsXG4gICAgICBjb250ZXh0UHJvdmlkZXJLaXRbZmFjZXROYW1lXSxcbiAgICAgIGJlaGF2aW9yTWV0aG9kcyxcbiAgICAgIHRoaXNmdWxNZXRob2RzLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQgJiYgaW50ZXJmYWNlR3VhcmRLaXRbZmFjZXROYW1lXSxcbiAgICApLFxuICApO1xuICByZXR1cm4gcHJvdG9LaXQ7XG59OyRozY9fb25jZS5kZWZlbmRQcm90b3R5cGVLaXQoZGVmZW5kUHJvdG90eXBlS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmVuZFByb3RvdHlwZSI6WyJkZWZlbmRQcm90b3R5cGUiXSwiZGVmZW5kUHJvdG90eXBlS2l0IjpbImRlZmVuZFByb3RvdHlwZUtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADJJdo2CwUAAAsFAAAmAAAAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2dldC1pbnRlcmZhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVNZXRob2ROYW1lfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqL1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBhdXRvbWF0aWNhbGx5IGFkZGVkIGRlZmF1bHQgbWV0YS1tZXRob2QgZm9yXG4gKiBvYnRhaW5pbmcgYW4gZXhvJ3MgaW50ZXJmYWNlLCBpZiBpdCBoYXMgb25lLlxuICpcbiAqIEludGVuZGVkIHRvIGJlIHNpbWlsYXIgdG8gYEdFVF9NRVRIT0RfTkFNRVNgIGZyb20gYEBlbmRvL3Bhc3Mtc3R5bGVgLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xODA5I2Rpc2N1c3Npb25fcjEzODgwNTI0NTRcbiAqXG4gKiBCZXdhcmUgdGhhdCBhbiBleG8ncyBpbnRlcmZhY2UgY2FuIGNoYW5nZSBhY3Jvc3MgYW4gdXBncmFkZSxcbiAqIHNvIHJlbW90ZXMgdGhhdCBjYWNoZSBpdCBjYW4gYmVjb21lIHN0YWxlLlxuICovXG4gICAgICAgY29uc3QgR0VUX0lOVEVSRkFDRV9HVUFSRCA9ICdfX2dldEludGVyZmFjZUd1YXJkX18nO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFJlbW90YWJsZU1ldGhvZE5hbWUsIENhbGxhYmxlRnVuY3Rpb24+fSBNXG4gKiBAdHlwZWRlZiB7e1xuICogICBbR0VUX0lOVEVSRkFDRV9HVUFSRF0/OiAoKSA9PlxuICogICAgIElNUE9SVCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZDx7XG4gKiAgICAgICBbSyBpbiBrZXlvZiBNXTogSU1QT1JUKCdAZW5kby9wYXR0ZXJucycpLk1ldGhvZEd1YXJkXG4gKiAgICAgfT4gfCB1bmRlZmluZWRcbiAqIH19IEdldEludGVyZmFjZUd1YXJkXG4gKi8kaM2PX29uY2UuR0VUX0lOVEVSRkFDRV9HVUFSRChHRVRfSU5URVJGQUNFX0dVQVJEKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkdFVF9JTlRFUkZBQ0VfR1VBUkQiOlsiR0VUX0lOVEVSRkFDRV9HVUFSRCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAeAAAAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACAAAABAZW5kby9mYXItdjEuMS4xNC9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpJtZQmAIAAJgCAAAeAAAAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wYXNzLXN0eWxlIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiIsbnVsbF0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV0sW1wiLi9leHBvcnRzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGVuZG8vZXZlbnR1YWwtc2VuZCI6W1siRSIsIkUiXV0sIkBlbmRvL3Bhc3Mtc3R5bGUiOltbIkZhciIsIkZhciJdLFsiZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdLFsicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdUZ/2QcIAAAHCAAAHQAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL21hcnNoYWwuanMiLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiLCIuL3NyYy9yYW5rT3JkZXIuanMiLCIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJjb21wYXJlQnlDb2RlUG9pbnRzIiwiY29tcGFyZUJ5Q29kZVBvaW50cyIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhcnNlIiwicGFyc2UiLCJwYXNzYWJsZUFzSnVzdGluIiwicGFzc2FibGVBc0p1c3RpbiIsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvcmFua09yZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6W1siUUNMQVNTIiwiUUNMQVNTIl1dLCIuL3NyYy9tYXJzaGFsLmpzIjpbWyJtYWtlTWFyc2hhbCIsIm1ha2VNYXJzaGFsIl1dLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6W1sic3RyaW5naWZ5Iiwic3RyaW5naWZ5Il0sWyJwYXJzZSIsInBhcnNlIl1dLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6W1siZGVjb2RlVG9KdXN0aW4iLCJkZWNvZGVUb0p1c3RpbiJdLFsicGFzc2FibGVBc0p1c3RpbiIsInBhc3NhYmxlQXNKdXN0aW4iXSxbInFwIiwicXAiXV0sIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjpbWyJtYWtlUGFzc2FibGVLaXQiLCJtYWtlUGFzc2FibGVLaXQiXSxbIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSJdLFsibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIl0sWyJpc0VuY29kZWRSZW1vdGFibGUiLCJpc0VuY29kZWRSZW1vdGFibGUiXSxbInplcm9QYWQiLCJ6ZXJvUGFkIl0sWyJyZWNvcmROYW1lcyIsInJlY29yZE5hbWVzIl0sWyJyZWNvcmRWYWx1ZXMiLCJyZWNvcmRWYWx1ZXMiXV0sIi4vc3JjL3JhbmtPcmRlci5qcyI6W1siY29tcGFyZU51bWVyaWNzIiwiY29tcGFyZU51bWVyaWNzIl0sWyJjb21wYXJlQnlDb2RlUG9pbnRzIiwiY29tcGFyZUJ5Q29kZVBvaW50cyJdLFsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiXSxbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiXSxbImlzUmFua1NvcnRlZCIsImlzUmFua1NvcnRlZCJdLFsic29ydEJ5UmFuayIsInNvcnRCeVJhbmsiXSxbImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVBbnRpUmFuayJdLFsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdLFsiZ2V0UGFzc1N0eWxlQ292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciJdLFsiaW50ZXJzZWN0UmFua0NvdmVycyIsImludGVyc2VjdFJhbmtDb3ZlcnMiXSxbInVuaW9uUmFua0NvdmVycyIsInVuaW9uUmFua0NvdmVycyJdXSwiQGVuZG8vcGFzcy1zdHlsZSI6W1siZGVlcGx5RnVsZmlsbGVkIiwiZGVlcGx5RnVsZmlsbGVkIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABgv2qoyX0AAMl9AAAqAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJpc0VuY29kZWRSZW1vdGFibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlUGFzc2FibGVLaXQiLCJwYXNzU3R5bGVQcmVmaXhlcyIsInJlY29yZE5hbWVzIiwicmVjb3JkVmFsdWVzIiwiemVyb1BhZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGFzc2VydFJlY29yZCxpc0Vycm9yTGlrZSxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLGIscSxGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYlwiLFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBmcm9tRW50cmllcywgaXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXgqL1xuY29uc3QgckMwID0gL1tcXHgwMC1cXHgxRl0vO1xuXG4vKipcbiAqIFJldHVybiB0aGUgc3VmZml4IG9mIGEgc3RyaW5nIHN0YXJ0aW5nIGF0IGEgcGFydGljdWxhciBpbmRleC5cbiAqIFRoaXMgYm90aCBleHByZXNzZXMgaW50ZW50IGFuZCBwb3RlbnRpYWxseSBhdm9pZHMgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZ2V0U3VmZml4ID0gKHN0ciwgaW5kZXgpID0+IChpbmRleCA9PT0gMCA/IHN0ciA6IHN0ci5zdWJzdHJpbmcoaW5kZXgpKTtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCwgd2UgaGF2ZSBvbmx5XG4gKiBzdHJpbmctbmFtZWQgb3duIHByb3BlcnRpZXMuIGByZWNvcmROYW1lc2AgcmV0dXJucyB0aG9zZSBuYW1lICpyZXZlcnNlKlxuICogc29ydGVkLCBiZWNhdXNlIHRoYXQncyBob3cgcmVjb3JkcyBhcmUgY29tcGFyZWQsIGVuY29kZWQsIGFuZCBzb3J0ZWQuXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuICAgICAgIGNvbnN0IHJlY29yZE5hbWVzID0gcmVjb3JkID0+XG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNjAjZGlzY3Vzc2lvbl9yMTAwMzY1NzI0NCovXG4gIC8qIGNvbXBhcmVzIHR3byB3YXlzIG9mIHJldmVyc2Ugc29ydGluZywgYW5kIHNob3dzIHRoYXQgYC5zb3J0KCkucmV2ZXJzZSgpYCovXG4gIC8qIGlzIGN1cnJlbnRseSBmYXN0ZXIgb24gTW9kZGFibGUgWFMsIHdoaWxlIHRoZSBvdGhlciB3YXksKi9cbiAgLyogYC5zb3J0KHJldmVyc2VDb21wYXJhdG9yKWAsIGlzIGZhc3RlciBvbiB2OC4gV2UgY3VycmVudGx5IGNhcmUgbW9yZSBhYm91dCovXG4gIC8qIFhTIHBlcmZvcm1hbmNlLCBzbyB3ZSByZXZlcnNlIHNvcnQgdXNpbmcgYC5zb3J0KCkucmV2ZXJzZSgpYC4qL1xuICBoYXJkZW4oLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKG93bktleXMocmVjb3JkKSkuc29ydCgpLnJldmVyc2UoKSk7JGjNj19vbmNlLnJlY29yZE5hbWVzKHJlY29yZE5hbWVzKTtcbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQgYW5kIGBuYW1lc2AgaXMgYHJlY29yZE5hbWVzKHJlY29yZClgLFxuICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZXNcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbiAgICAgICBjb25zdCByZWNvcmRWYWx1ZXMgPSAocmVjb3JkLCBuYW1lcykgPT5cbiAgaGFyZGVuKG5hbWVzLm1hcChuYW1lID0+IHJlY29yZFtuYW1lXSkpOyRozY9fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG5jb25zdCB6ZXJvZXMgPSBBcnJheSgxNilcbiAgLmZpbGwodW5kZWZpbmVkKVxuICAubWFwKChfLCBpKSA9PiAnMCcucmVwZWF0KGkpKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IG5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG4gICAgICAgY29uc3QgemVyb1BhZCA9IChuLCBzaXplKSA9PiB7XG4gIGNvbnN0IG5TdHIgPSBgJHtufWA7XG4gIGNvbnN0IGZpbGxMZW4gPSBzaXplIC0gblN0ci5sZW5ndGg7XG4gIGlmIChmaWxsTGVuID09PSAwKSByZXR1cm4gblN0cjtcbiAgYXNzZXJ0KGZpbGxMZW4gPiAwICYmIGZpbGxMZW4gPCB6ZXJvZXMubGVuZ3RoKTtcbiAgcmV0dXJuIGAke3plcm9lc1tmaWxsTGVuXX0ke25TdHJ9YDtcbn07JGjNj19vbmNlLnplcm9QYWQoemVyb1BhZCk7XG5oYXJkZW4oemVyb1BhZCk7XG5cbi8qIFRoaXMgaXMgdGhlIEphdmFTY3JpcHQgYW5hbG9nIHRvIGEgQyB1bmlvbjogYSB3YXkgdG8gbWFwIGJldHdlZW4gYSBmbG9hdCBhcyBhKi9cbi8qIG51bWJlciBhbmQgdGhlIGJpdHMgdGhhdCByZXByZXNlbnQgdGhlIGZsb2F0IGFzIGEgYnVmZmVyIGZ1bGwgb2YgYnl0ZXMuICBOb3RlKi9cbi8qIHRoYXQgdGhlIG11dGF0aW9uIG9mIHN0YXRpYyBzdGF0ZSBoZXJlIG1ha2VzIHRoaXMgaW52YWxpZCBKZXNzaWUgY29kZSwgYnV0Ki9cbi8qIGRvaW5nIGl0IHRoaXMgd2F5IHNhdmVzIHRoZSBudWdhdG9yeSBhbmQgZ3JhdHVpdG91cyBhbGxvY2F0aW9ucyB0aGF0IHdvdWxkKi9cbi8qIGhhcHBlbiBldmVyeSB0aW1lIHlvdSBkbyBhIGNvbnZlcnNpb24gLS0gYW5kIGluIHByYWN0aWNhbCB0ZXJtcyBpdCdzIHNhZmUqL1xuLyogYmVjYXVzZSB3ZSBwdXQgdGhlIHZhbHVlIGluIG9uZSBzaWRlIGFuZCB0aGVuIGltbWVkaWF0ZWx5IHRha2UgaXQgb3V0IHRoZSovXG4vKiBvdGhlcjsgdGhlcmUgaXMgbm8gYWN0dWFsIHN0YXRlIHJldGFpbmVkIGluIHRoZSBjbGFzc2ljIHNlbnNlIGFuZCB0aHVzIG5vKi9cbi8qIHJlLWVudHJhbmN5IGlzc3VlLiovXG5jb25zdCBhc051bWJlciA9IG5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHMgPSBuZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLyogSmF2YVNjcmlwdCBudW1iZXJzIGFyZSBlbmNvZGVkIGJ5IG91dHB1dHRpbmcgdGhlIGJhc2UtMTYqL1xuLyogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBJRUVFIGZsb2F0aW5nIHBvaW50Ki9cbi8qIHJlcHJlc2VudGF0aW9uLiAgRm9yIG5lZ2F0aXZlIHZhbHVlcywgYWxsIGJpdHMgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBhcmUqL1xuLyogY29tcGxlbWVudGVkIHByaW9yIHRvIHRoZSBiYXNlLTE2IGNvbnZlcnNpb24sIHdoaWxlIGZvciBwb3NpdGl2ZSB2YWx1ZXMsIHRoZSovXG4vKiBzaWduIGJpdCBpcyBjb21wbGVtZW50ZWQuICBUaGlzIGVuc3VyZXMgYm90aCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGJlZm9yZSovXG4vKiBwb3NpdGl2ZSB2YWx1ZXMgYW5kIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYWNjb3JkaW5nIHRvIHRoZWlyIG5lZ2F0aXZlKi9cbi8qIG1hZ25pdHVkZSByYXRoZXIgdGhhbiB0aGVpciBwb3NpdGl2ZSBtYWduaXR1ZGUuICBUaGlzIHJlc3VsdHMgaW4gYW4gQVNDSUkqL1xuLyogZW5jb2Rpbmcgd2hvc2UgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1lcmljIHNvcnQgb3JkZXIqL1xuLyogb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycy4qL1xuXG4vKiBUT0RPIENob29zZSB0aGUgc2FtZSBjYW5vbmljYWwgTmFOIGVuY29kaW5nIHRoYXQgY29zbVdhc20gYW5kIGV3YXNtIGNob3NlLiovXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzID0gJ2ZmZjgwMDAwMDAwMDAwMDAnO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVCaW5hcnk2NCA9IG4gPT4ge1xuICAvKiBOb3JtYWxpemUgLTAgdG8gMCBhbmQgTmFOIHRvIGEgY2Fub25pY2FsIGVuY29kaW5nKi9cbiAgaWYgKGlzKG4sIC0wKSkge1xuICAgIG4gPSAwO1xuICB9IGVsc2UgaWYgKGlzKG4sIE5hTikpIHtcbiAgICByZXR1cm4gYGYke0Nhbm9uaWNhbE5hTkJpdHN9YDtcbiAgfVxuICBhc051bWJlclswXSA9IG47XG4gIGxldCBiaXRzID0gYXNCaXRzWzBdO1xuICBpZiAobiA8IDApIHtcbiAgICBiaXRzIF49IDB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gIH0gZWxzZSB7XG4gICAgYml0cyBePSAweDgwMDAwMDAwMDAwMDAwMDBuO1xuICB9XG4gIHJldHVybiBgZiR7emVyb1BhZChiaXRzLnRvU3RyaW5nKDE2KSwgMTYpfWA7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0ge251bWJlcn0gW3NraXBdXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCBkZWNvZGVCaW5hcnk2NCA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICBlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJ2YnIHx8IEZhaWxgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgYml0cyA9IEJpZ0ludChgMHgke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSl9YCk7XG4gIGlmIChlbmNvZGVkLmNoYXJBdChza2lwICsgMSkgPCAnOCcpIHtcbiAgICBiaXRzIF49IDB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gIH0gZWxzZSB7XG4gICAgYml0cyBePSAweDgwMDAwMDAwMDAwMDAwMDBuO1xuICB9XG4gIGFzQml0c1swXSA9IGJpdHM7XG4gIGNvbnN0IHJlc3VsdCA9IGFzTnVtYmVyWzBdO1xuICAhaXMocmVzdWx0LCAtMCkgfHxcbiAgICBGYWlsYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogRW5jb2RlIGEgSmF2YVNjcmlwdCBiaWdpbnQgdXNpbmcgYSB2YXJpYW50IG9mIEVsaWFzIGRlbHRhIGNvZGluZywgd2l0aCBhblxuICogaW5pdGlhbCBjb21wb25lbnQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2l0IGNvdW50IGFzIGEgdW5hcnkgc3RyaW5nLCBhXG4gKiBzZWNvbmQgY29tcG9uZW50IGZvciB0aGUgZGVjaW1hbCBkaWdpdCBjb3VudCwgYW5kIGEgdGhpcmQgY29tcG9uZW50IGZvciB0aGVcbiAqIGRlY2ltYWwgZGlnaXRzIHByZWNlZGVkIGJ5IGEgZ3JhdHVpdG91cyBzZXBhcmF0aW5nIGNvbG9uLlxuICogVG8gZW5zdXJlIHRoYXQgdGhlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBvZiBlbmNvZGVkIHZhbHVlcyBtYXRjaGVzIHRoZVxuICogbnVtZXJpYyBzb3J0IG9yZGVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMsIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bmFyeVxuICogcHJlZml4IGFyZSBkaWZmZXJlbnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyAodHlwZSBcIm5cIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mXG4gKiBcIiNcInMgW3doaWNoIHNvcnQgYmVmb3JlIGRlY2ltYWwgZGlnaXRzXSkgdnMuIHBvc2l0aXZlIGFuZCB6ZXJvIHZhbHVlcyAodHlwZVxuICogXCJwXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBcIn5cInMgW3doaWNoIHNvcnQgYWZ0ZXIgZGVjaW1hbCBkaWdpdHNdKSBhbmRcbiAqIGVhY2ggZGVjaW1hbCBkaWdpdCBvZiB0aGUgZW5jb2RpbmcgZm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBpdHNcbiAqIHRlbidzIGNvbXBsZW1lbnQgKHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzIG9mIHRoZSBzYW1lIHNjYWxlIHNvcnQgYnlcbiAqICpkZXNjZW5kaW5nKiBhYnNvbHV0ZSB2YWx1ZSkuXG4gKlxuICogQHBhcmFtIHtiaWdpbnR9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpZ0ludCA9IG4gPT4ge1xuICBjb25zdCBhYnMgPSBuIDwgMG4gPyAtbiA6IG47XG4gIGNvbnN0IG5EaWdpdHMgPSBhYnMudG9TdHJpbmcoKS5sZW5ndGg7XG4gIGNvbnN0IGxEaWdpdHMgPSBuRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuICBpZiAobiA8IDBuKSB7XG4gICAgcmV0dXJuIGBuJHtcbiAgICAgIC8qIEEgXCIjXCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4gICAgICAvKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4gICAgICAnIycucmVwZWF0KGxEaWdpdHMgLSAxKVxuICAgIH0ke1xuICAgICAgLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuICAgICAgKDEwICoqIGxEaWdpdHMgLSBuRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsICcwJylcbiAgICB9OiR7XG4gICAgICAvKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgZGlnaXRzLiovXG4gICAgICAoMTBuICoqIEJpZ0ludChuRGlnaXRzKSArIG4pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywgJzAnKVxuICAgIH1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgcCR7XG4gICAgICAvKiBBIFwiflwiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuICAgICAgLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuICAgICAgJ34nLnJlcGVhdChsRGlnaXRzIC0gMSlcbiAgICB9JHtcbiAgICAgIC8qIFRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbiAgICAgIG5EaWdpdHNcbiAgICB9OiR7XG4gICAgICAvKiBUaGUgZGlnaXRzLiovXG4gICAgICBuXG4gICAgfWA7XG4gIH1cbn07XG5cbmNvbnN0IHJCaWdJbnRQYXlsb2FkID0gLyhbMC05XSspKDooWzAtOV0rJHwpfCkvcztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuY29uc3QgZGVjb2RlQmlnSW50ID0gZW5jb2RlZCA9PiB7XG4gIGNvbnN0IHR5cGVQcmVmaXggPSBlbmNvZGVkLmNoYXJBdCgwKTsgLyogZmFzdGVyIHRoYW4gZW5jb2RlZFswXSovXG4gIHR5cGVQcmVmaXggPT09ICdwJyB8fFxuICAgIHR5cGVQcmVmaXggPT09ICduJyB8fFxuICAgIEZhaWxgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG4gIGNvbnN0IHtcbiAgICBpbmRleDogbERpZ2l0cyxcbiAgICAxOiBzbkRpZ2l0cyxcbiAgICAyOiB0YWlsLFxuICAgIDM6IGRpZ2l0cyxcbiAgfSA9IGVuY29kZWQubWF0Y2gockJpZ0ludFBheWxvYWQpIHx8IEZhaWxgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG4gIHNuRGlnaXRzLmxlbmd0aCA9PT0gbERpZ2l0cyB8fFxuICAgIEZhaWxgVW5hcnktcHJlZml4ZWQgZGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBuRGlnaXRzID0gcGFyc2VJbnQoc25EaWdpdHMsIDEwKTtcbiAgaWYgKHR5cGVQcmVmaXggPT09ICduJykge1xuICAgIC8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbiAgICAvKiBsaWtlIFwibjA6XCIgYW5kIFwibjAwOuKAplwiIGFuZCBcIm45MTrigKZcIiB0aHJvdWdoIFwibjk5OuKAplwiPyovXG4gICAgbkRpZ2l0cyA9IDEwICoqIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAobERpZ2l0cykgLSBuRGlnaXRzO1xuICB9XG5cbiAgdGFpbC5jaGFyQXQoMCkgPT09ICc6JyB8fCBGYWlsYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGRpZ2l0cy5sZW5ndGggPT09IG5EaWdpdHMgfHxcbiAgICBGYWlsYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBuID0gQmlnSW50KGRpZ2l0cyk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4gICAgLyogbGlrZSBcIm45OjBcIiBhbmQgXCJuODowMFwiIGFuZCBcIm44OjkxXCIgdGhyb3VnaCBcIm44Ojk5XCI/Ki9cbiAgICBuID0gLSgxMG4gKiogQmlnSW50KG5EaWdpdHMpIC0gbik7XG4gIH1cblxuICByZXR1cm4gbjtcbn07XG5cbi8qKlxuICogQSBzcGFyc2UgYXJyYXkgZm9yIHdoaWNoIGV2ZXJ5IHByZXNlbnQgaW5kZXggbWFwcyBhIGNvZGUgcG9pbnQgaW4gdGhlIEFTQ0lJXG4gKiByYW5nZSB0byBhIGNvcnJlc3BvbmRpbmcgZXNjYXBlIHNlcXVlbmNlLlxuICpcbiAqIEVzY2FwZXMgYWxsIGNoYXJhY3RlcnMgZnJvbSBVKzAwMDAgTlVMTCB0byBVKzAwMUYgSU5GT1JNQVRJT04gU0VQQVJBVE9SIE9ORVxuICogbGlrZSBgITxjaGFyYWN0ZXIgb2Zmc2V0IGJ5IDB4MjE+YCB0byBhdm9pZCBKU09OLnN0cmluZ2lmeSBleHBhbnNpb24gYXNcbiAqIGBcXHVISEhIYCwgYW5kIHNwZWNpYWxseSBlc2NhcGVzIFUrMDAyMCBTUEFDRSAodGhlIGFycmF5IGVsZW1lbnQgdGVybWluYXRvcilcbiAqIGFzIGAhX2AgYW5kIFUrMDAyMSBFWENMQU1BVElPTiBNQVJLICh0aGUgZXNjYXBlIHByZWZpeCkgYXMgYCF8YCAoYm90aCBjaG9zZW5cbiAqIGZvciB2aXN1YWwgYXBwcm94aW1hdGlvbikuXG4gKiBSZWxhdGl2ZSBsZXhpY29ncmFwaGljIG9yZGVyaW5nIGlzIHByZXNlcnZlZCBieSB0aGlzIG1hcHBpbmcgb2YgYW55IGNoYXJhY3RlclxuICogYXQgb3IgYmVmb3JlIGAhYCBpbiB0aGUgY29udGlndW91cyByYW5nZSBbMHgwMC4uMHgyMV0gdG8gYSByZXNwZWN0aXZlXG4gKiBjaGFyYWN0ZXIgaW4gWzB4MjEuLjB4NDAsIDB4NUYsIDB4N0NdIHByZWNlZGVkIGJ5IGAhYCAod2hpY2ggaXMgaXRzZWxmIGluIHRoZVxuICogcmVwbGFjZWQgcmFuZ2UpLlxuICogU2ltaWxhcmx5LCBlc2NhcGVzIGBeYCBhcyBgX0BgIGFuZCBgX2AgYXMgYF9fYCBiZWNhdXNlIGBeYCBpbmRpY2F0ZXMgdGhlXG4gKiBzdGFydCBvZiBhbiBlbmNvZGVkIGFycmF5LlxuICpcbiAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICovXG5jb25zdCBzdHJpbmdFc2NhcGVzID0gQXJyYXkoMHgyMilcbiAgLmZpbGwodW5kZWZpbmVkKVxuICAubWFwKChfLCBjcCkgPT4ge1xuICAgIHN3aXRjaCAoU3RyaW5nLmZyb21DaGFyQ29kZShjcCkpIHtcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgICByZXR1cm4gJyFfJztcbiAgICAgIGNhc2UgJyEnOlxuICAgICAgICByZXR1cm4gJyF8JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgISR7U3RyaW5nLmZyb21DaGFyQ29kZShjcCArIDB4MjEpfWA7XG4gICAgfVxuICB9KTtcbnN0cmluZ0VzY2FwZXNbJ14nLmNoYXJDb2RlQXQoMCldID0gJ19AJztcbnN0cmluZ0VzY2FwZXNbJ18nLmNoYXJDb2RlQXQoMCldID0gJ19fJztcblxuLyoqXG4gKiBFbmNvZGVzIGEgc3RyaW5nIHdpdGggZXNjYXBlIHNlcXVlbmNlcyBmb3IgdXNlIGluIHRoZSBcImNvbXBhY3RPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoc3RyOiBzdHJpbmcpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCA9IHN0ciA9PlxuICBzdHIucmVwbGFjZSgvW1xcMC0hXl9dL2csIGNoID0+IHN0cmluZ0VzY2FwZXNbY2guY2hhckNvZGVBdCgwKV0pO1xuXG4vKipcbiAqIERlY29kZXMgYSBzdHJpbmcgZnJvbSB0aGUgXCJjb21wYWN0T3JkZXJlZFwiIGZvcm1hdC5cbiAqXG4gKiBAdHlwZSB7KGVuY29kZWQ6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4ID0gZW5jb2RlZCA9PiB7XG4gIHJldHVybiBlbmNvZGVkLnJlcGxhY2UoLyhbXFwwLSFfXSkoLnxcXG4pPy9nLCAoZXNjLCBwcmVmaXgsIHN1ZmZpeCkgPT4ge1xuICAgIHN3aXRjaCAoZXNjKSB7XG4gICAgICBjYXNlICchXyc6XG4gICAgICAgIHJldHVybiAnICc7XG4gICAgICBjYXNlICchfCc6XG4gICAgICAgIHJldHVybiAnISc7XG4gICAgICBjYXNlICdfQCc6XG4gICAgICAgIHJldHVybiAnXic7XG4gICAgICBjYXNlICdfXyc6XG4gICAgICAgIHJldHVybiAnXyc7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IGNoID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzdWZmaXgpO1xuICAgICAgICAvKiBUaGUgcmFuZ2Ugb2YgdmFsaWQgYCFgLWVzY2FwZSBzdWZmaXhlcyBpcyBbKDB4MDArMHgyMSkuLigweDFGKzB4MjEpXSwgaS5lLiovXG4gICAgICAgIC8qIFsweDIxLi4weDQwXSAoVSswMDIxIEVYQ0xBTUFUSU9OIE1BUksgdG8gVSswMDQwIENPTU1FUkNJQUwgQVQpLiovXG4gICAgICAgIChwcmVmaXggPT09ICchJyAmJiBzdWZmaXggIT09IHVuZGVmaW5lZCAmJiBjaCA+PSAnIScgJiYgY2ggPD0gJ0AnKSB8fFxuICAgICAgICAgIEZhaWxgaW52YWxpZCBzdHJpbmcgZXNjYXBlOiAke3EoZXNjKX1gO1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaC5jaGFyQ29kZUF0KDApIC0gMHgyMSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogVHJpdmlhbGx5IGlkZW50aXR5LWVuY29kZXMgYSBzdHJpbmcgZm9yIHVzZSBpbiB0aGUgXCJsZWdhY3lPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoc3RyOiBzdHJpbmcpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4ID0gc3RyID0+IHN0cjtcblxuLyoqXG4gKiBUcml2aWFsbHkgaWRlbnRpdHktZGVjb2RlcyBhIHN0cmluZyBmcm9tIHRoZSBcImxlZ2FjeU9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhlbmNvZGVkOiBzdHJpbmcpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5U3RyaW5nU3VmZml4ID0gZW5jb2RlZCA9PiBlbmNvZGVkO1xuXG4vKipcbiAqIEVuY29kZXMgYW4gYXJyYXkgaW50byBhIHNlcXVlbmNlIG9mIGVuY29kZWQgZWxlbWVudHMgZm9yIHVzZSBpbiB0aGUgXCJjb21wYWN0T3JkZXJlZFwiXG4gKiBmb3JtYXQsIGVhY2ggdGVybWluYXRlZCBieSBhIHNwYWNlICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBlc2NhcGVkIHJhbmdlIGluXG4gKiBcImNvbXBhY3RPcmRlcmVkXCIgZW5jb2RlZCBzdHJpbmdzKS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGFycmF5XG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gc3RyaW5nfSBlbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQ29tcGFjdEFycmF5ID0gKGFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICBjb25zdCBjaGFycyA9IFsnXiddO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpIHtcbiAgICBjb25zdCBlbmMgPSBlbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbiAgICBjaGFycy5wdXNoKGVuYywgJyAnKTtcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJyk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfSBkZWNvZGVQYXNzYWJsZVxuICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5jb25zdCBkZWNvZGVDb21wYWN0QXJyYXkgPSAoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gW107XG4gIGxldCBkZXB0aCA9IDA7XG4gIC8qIFNjYW4gZW5jb2RlZCByYXRoZXIgdGhhbiBpdHMgdGFpbCB0byBhdm9pZCBzbG93IGBzdWJzdHJpbmdgIGluIFhTLiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG4gIGxldCBuZXh0SW5kZXggPSBza2lwICsgMTtcbiAgbGV0IGN1cnJlbnRFbGVtZW50U3RhcnQgPSBza2lwICsgMTtcbiAgZm9yIChjb25zdCB7IDA6IGNoLCBpbmRleDogaSB9IG9mIGVuY29kZWQubWF0Y2hBbGwoL1tcXF4gXS9nKSkge1xuICAgIGNvbnN0IGluZGV4ID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChpKTtcbiAgICBpZiAoaW5kZXggPD0gc2tpcCkge1xuICAgICAgaWYgKGluZGV4ID09PSBza2lwKSB7XG4gICAgICAgIGNoID09PSAnXicgfHwgRmFpbGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2ggPT09ICdeJykge1xuICAgICAgLyogVGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBuZXN0ZWQgYXJyYXkuKi9cbiAgICAgIC8qIFRPRE86IFNpbmNlIHRoZSBzeW50YXggb2YgbmVzdGVkIGFycmF5cyBtdXN0IGJlIHZhbGlkYXRlZCBhcyBwYXJ0IG9mKi9cbiAgICAgIC8qIGRlY29kaW5nIHRoZSBvdXRlciBvbmUsIGNvbnNpZGVyIGRlY29kaW5nIHRoZW0gaGVyZSBpbnRvIGEgc2hhcmVkIGNhY2hlKi9cbiAgICAgIC8qIHJhdGhlciB0aGFuIGRpc2NhcmRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIgY29udGVudHMgdW50aWwgdGhlIGxhdGVyKi9cbiAgICAgIC8qIGRlY29kZVBhc3NhYmxlLiovXG4gICAgICBkZXB0aCArPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGlzIGlzIGEgdGVybWluYXRlZCBlbGVtZW50LiovXG4gICAgICBpZiAoaW5kZXggPT09IG5leHRJbmRleCkge1xuICAgICAgICAvKiBBIHRlcm1pbmF0b3IgYWZ0ZXIgYFtgIG9yIGFuIGFub3RoZXIgdGVybWluYXRvciBpbmRpY2F0ZXMgdGhhdCBhbiBhcnJheSBpcyBkb25lLiovXG4gICAgICAgIGRlcHRoIC09IDE7XG4gICAgICAgIGRlcHRoID49IDAgfHxcbiAgICAgICAgICAvKiBwcmV0dGllci1pZ25vcmUqL1xuICAgICAgICAgIEZhaWxgdW5leHBlY3RlZCBhcnJheSBlbGVtZW50IHRlcm1pbmF0b3I6ICR7ZW5jb2RlZC5zbGljZShza2lwLCBpbmRleCArIDIpfWA7XG4gICAgICB9XG4gICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgLyogV2UgaGF2ZSBhIGNvbXBsZXRlIGVsZW1lbnQgb2YgdGhlIHRvcG1vc3QgYXJyYXkuKi9cbiAgICAgICAgZWxlbWVudHMucHVzaChcbiAgICAgICAgICBkZWNvZGVQYXNzYWJsZShlbmNvZGVkLnNsaWNlKGN1cnJlbnRFbGVtZW50U3RhcnQsIGluZGV4KSksXG4gICAgICAgICk7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50U3RhcnQgPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIEFkdmFuY2UgdGhlIGluZGV4LiovXG4gICAgbmV4dEluZGV4ID0gaW5kZXggKyAxO1xuICB9XG4gIGRlcHRoID09PSAwIHx8IEZhaWxgdW50ZXJtaW5hdGVkIGFycmF5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBuZXh0SW5kZXggPT09IGVuY29kZWQubGVuZ3RoIHx8XG4gICAgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXkgZWxlbWVudDogJHtnZXRTdWZmaXgoXG4gICAgICBlbmNvZGVkLFxuICAgICAgY3VycmVudEVsZW1lbnRTdGFydCxcbiAgICApfWA7XG4gIHJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyB0aGUgb3JpZ2luYWwgYXJyYXkgZW5jb2RpbmcsIHdoaWNoIGVzY2FwZXMgYWxsIGVuY29kZWQgYXJyYXlcbiAqIGVsZW1lbnRzIHJhdGhlciB0aGFuIGp1c3Qgc3RyaW5ncyAoYFxcdTAwMDBgIGFzIHRoZSBlbGVtZW50IHRlcm1pbmF0b3IgYW5kXG4gKiBgXFx1MDAwMWAgYXMgdGhlIGVzY2FwZSBwcmVmaXggZm9yIGBcXHUwMDAwYCBvciBgXFx1MDAwMWApLlxuICogVGhpcyBuZWNlc3NpdGF0ZWQgYW4gdW5kZXNpcmFibGUgYW1vdW50IG9mIGl0ZXJhdGlvbiBhbmQgZXhwYW5zaW9uOyBzZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNjAjZGlzY3Vzc2lvbl9yOTYwMzY5ODI2XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBhcnJheVxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHN0cmluZ30gZW5jb2RlUGFzc2FibGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUxlZ2FjeUFycmF5ID0gKGFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICBjb25zdCBjaGFycyA9IFsnWyddO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpIHtcbiAgICBjb25zdCBlbmMgPSBlbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgZW5jKSB7XG4gICAgICBpZiAoYyA9PT0gJ1xcdTAwMDAnIHx8IGMgPT09ICdcXHUwMDAxJykge1xuICAgICAgICBjaGFycy5wdXNoKCdcXHUwMDAxJyk7XG4gICAgICB9XG4gICAgICBjaGFycy5wdXNoKGMpO1xuICAgIH1cbiAgICBjaGFycy5wdXNoKCdcXHUwMDAwJyk7XG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX0gZGVjb2RlUGFzc2FibGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5QXJyYXkgPSAoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gW107XG4gIGNvbnN0IGVsZW1DaGFycyA9IFtdO1xuICAvKiBVc2UgYSBzdHJpbmcgaXRlcmF0b3IgdG8gYXZvaWQgc2xvdyBpbmRleGVkIGFjY2VzcyBpbiBYUy4qL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuICBsZXQgc3RpbGxUb1NraXAgPSBza2lwICsgMTtcbiAgbGV0IGluRXNjYXBlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgYyBvZiBlbmNvZGVkKSB7XG4gICAgaWYgKHN0aWxsVG9Ta2lwID4gMCkge1xuICAgICAgc3RpbGxUb1NraXAgLT0gMTtcbiAgICAgIGlmIChzdGlsbFRvU2tpcCA9PT0gMCkge1xuICAgICAgICBjID09PSAnWycgfHwgRmFpbGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5Fc2NhcGUpIHtcbiAgICAgIGMgPT09ICdcXHUwMDAwJyB8fFxuICAgICAgICBjID09PSAnXFx1MDAwMScgfHxcbiAgICAgICAgRmFpbGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciB1MDAwMSBlc2NhcGU6ICR7Y31gO1xuICAgICAgZWxlbUNoYXJzLnB1c2goYyk7XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFx1MDAwMCcpIHtcbiAgICAgIGNvbnN0IGVuY29kZWRFbGVtZW50ID0gZWxlbUNoYXJzLmpvaW4oJycpO1xuICAgICAgZWxlbUNoYXJzLmxlbmd0aCA9IDA7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZGVjb2RlUGFzc2FibGUoZW5jb2RlZEVsZW1lbnQpO1xuICAgICAgZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKGMgPT09ICdcXHUwMDAxJykge1xuICAgICAgaW5Fc2NhcGUgPSB0cnVlO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlKi9cbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtQ2hhcnMucHVzaChjKTtcbiAgICB9XG4gICAgaW5Fc2NhcGUgPSBmYWxzZTtcbiAgfVxuICAhaW5Fc2NhcGUgfHwgRmFpbGB1bmV4cGVjdGVkIGVuZCBvZiBlbmNvZGluZyAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBlbGVtQ2hhcnMubGVuZ3RoID09PSAwIHx8XG4gICAgRmFpbGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtCeXRlQXJyYXl9IGJ5dGVBcnJheVxuICogQHBhcmFtIHsoYnl0ZUFycmF5OiBCeXRlQXJyYXkpID0+IHN0cmluZ30gX2VuY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVCeXRlQXJyYXkgPSAoYnl0ZUFycmF5LCBfZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgLyogVE9ETyBpbXBsZW1lbnQqL1xuICBGYWlsYGVuY29kZVBhc3NhYmxlKGJ5dGVBcnJheSkgbm90IHlldCBpbXBsZW1lbnRlZDogJHtieXRlQXJyYXl9YDtcbiAgcmV0dXJuICcnOyAvKiBKdXN0IGZvciB0aGUgdHlwZSovXG59O1xuXG5jb25zdCBlbmNvZGVSZWNvcmQgPSAocmVjb3JkLCBlbmNvZGVBcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgbmFtZXMgPSByZWNvcmROYW1lcyhyZWNvcmQpO1xuICBjb25zdCB2YWx1ZXMgPSByZWNvcmRWYWx1ZXMocmVjb3JkLCBuYW1lcyk7XG4gIHJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcywgdmFsdWVzXSksIGVuY29kZVBhc3NhYmxlKX1gO1xufTtcblxuY29uc3QgZGVjb2RlUmVjb3JkID0gKGVuY29kZWQsIGRlY29kZUFycmF5LCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApID09PSAnKCcpO1xuICAvKiBTa2lwIHRoZSBcIihcIiBpbnNpZGUgYGRlY29kZUFycmF5YCB0byBhdm9pZCBzbG93IGBzdWJzdHJpbmdgIGluIFhTLiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG4gIGNvbnN0IHVuemlwcGVkRW50cmllcyA9IGRlY29kZUFycmF5KGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwICsgMSk7XG4gIHVuemlwcGVkRW50cmllcy5sZW5ndGggPT09IDIgfHxcbiAgICBGYWlsYGV4cGVjdGVkIGtleXMsdmFsdWVzIHBhaXI6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IFtrZXlzLCB2YWxzXSA9IHVuemlwcGVkRW50cmllcztcblxuICAocGFzc1N0eWxlT2Yoa2V5cykgPT09ICdjb3B5QXJyYXknICYmXG4gICAgcGFzc1N0eWxlT2YodmFscykgPT09ICdjb3B5QXJyYXknICYmXG4gICAga2V5cy5sZW5ndGggPT09IHZhbHMubGVuZ3RoICYmXG4gICAga2V5cy5ldmVyeShrZXkgPT4gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycpKSB8fFxuICAgIEZhaWxgbm90IGEgdmFsaWQgcmVjb3JkIGVuY29kaW5nOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBtYXBFbnRyaWVzID0ga2V5cy5tYXAoKGtleSwgaSkgPT4gW2tleSwgdmFsc1tpXV0pO1xuICBjb25zdCByZWNvcmQgPSBoYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cmllcykpO1xuICBhc3NlcnRSZWNvcmQocmVjb3JkLCAnZGVjb2RlZCByZWNvcmQnKTtcbiAgcmV0dXJuIHJlY29yZDtcbn07XG5cbmNvbnN0IGVuY29kZVRhZ2dlZCA9ICh0YWdnZWQsIGVuY29kZUFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT5cbiAgYDoke2VuY29kZUFycmF5KGhhcmRlbihbZ2V0VGFnKHRhZ2dlZCksIHRhZ2dlZC5wYXlsb2FkXSksIGVuY29kZVBhc3NhYmxlKX1gO1xuXG5jb25zdCBkZWNvZGVUYWdnZWQgPSAoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBhc3NlcnQoZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICc6Jyk7XG4gIC8qIFNraXAgdGhlIFwiOlwiIGluc2lkZSBgZGVjb2RlQXJyYXlgIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbiAgY29uc3QgdGFnZ2VkUGF5bG9hZCA9IGRlY29kZUFycmF5KGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwICsgMSk7XG4gIHRhZ2dlZFBheWxvYWQubGVuZ3RoID09PSAyIHx8XG4gICAgRmFpbGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBbdGFnLCBwYXlsb2FkXSA9IHRhZ2dlZFBheWxvYWQ7XG4gIHBhc3NTdHlsZU9mKHRhZykgPT09ICdzdHJpbmcnIHx8XG4gICAgRmFpbGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZCk7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlUmVtb3RhYmxlID0gKHVuc2FmZUVuY29kZVJlbW90YWJsZSwgdmVyaWZ5RW5jb2RpbmcpID0+IHtcbiAgY29uc3QgZW5jb2RlUmVtb3RhYmxlID0gKHIsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVSZW1vdGFibGUociwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJ3InKSB8fFxuICAgICAgRmFpbGBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdSZW1vdGFibGUnKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVSZW1vdGFibGU7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlUHJvbWlzZSA9ICh1bnNhZmVFbmNvZGVQcm9taXNlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVQcm9taXNlID0gKHAsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVQcm9taXNlKHAsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICc/JykgfHxcbiAgICAgIEZhaWxgUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ1Byb21pc2UnKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVQcm9taXNlO1xufTtcblxuY29uc3QgbWFrZUVuY29kZUVycm9yID0gKHVuc2FmZUVuY29kZUVycm9yLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVFcnJvciA9IChlcnIsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVFcnJvcihlcnIsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICchJykgfHxcbiAgICAgIEZhaWxgRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdFcnJvcicpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZUVycm9yO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGVPYmplY3QsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlRXJyb3JdXG4gKiBAcHJvcGVydHkgeydsZWdhY3lPcmRlcmVkJyB8ICdjb21wYWN0T3JkZXJlZCd9IFtmb3JtYXRdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0geyhzdHI6IHN0cmluZykgPT4gc3RyaW5nfSBlbmNvZGVTdHJpbmdTdWZmaXhcbiAqIEBwYXJhbSB7KGFycjogdW5rbm93bltdLCBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcpID0+IHN0cmluZ30gZW5jb2RlQXJyYXlcbiAqIEBwYXJhbSB7UmVxdWlyZWQ8RW5jb2RlT3B0aW9ucz4gJiB7dmVyaWZ5RW5jb2Rpbmc/OiAoZW5jb2RlZDogc3RyaW5nLCBsYWJlbDogc3RyaW5nKSA9PiB2b2lkfX0gb3B0aW9uc1xuICogQHJldHVybnMgeyhwOiBQYXNzYWJsZSkgPT4gc3RyaW5nfVxuICovXG5jb25zdCBtYWtlSW5uZXJFbmNvZGUgPSAoZW5jb2RlU3RyaW5nU3VmZml4LCBlbmNvZGVBcnJheSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlOiB1bnNhZmVFbmNvZGVSZW1vdGFibGUsXG4gICAgZW5jb2RlUHJvbWlzZTogdW5zYWZlRW5jb2RlUHJvbWlzZSxcbiAgICBlbmNvZGVFcnJvcjogdW5zYWZlRW5jb2RlRXJyb3IsXG4gICAgdmVyaWZ5RW5jb2RpbmcgPSAoKSA9PiB7fSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGVuY29kZVJlbW90YWJsZSA9IG1ha2VFbmNvZGVSZW1vdGFibGUoXG4gICAgdW5zYWZlRW5jb2RlUmVtb3RhYmxlLFxuICAgIHZlcmlmeUVuY29kaW5nLFxuICApO1xuICBjb25zdCBlbmNvZGVQcm9taXNlID0gbWFrZUVuY29kZVByb21pc2UodW5zYWZlRW5jb2RlUHJvbWlzZSwgdmVyaWZ5RW5jb2RpbmcpO1xuICBjb25zdCBlbmNvZGVFcnJvciA9IG1ha2VFbmNvZGVFcnJvcih1bnNhZmVFbmNvZGVFcnJvciwgdmVyaWZ5RW5jb2RpbmcpO1xuXG4gIGNvbnN0IGlubmVyRW5jb2RlID0gcGFzc2FibGUgPT4ge1xuICAgIGlmIChpc0Vycm9yTGlrZShwYXNzYWJsZSkpIHtcbiAgICAgIC8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuICAgICAgLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbiAgICAgIC8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4gICAgICAvKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbiAgICAgIC8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbiAgICAgIC8qKi9cbiAgICAgIC8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuICAgICAgLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuICAgICAgLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4gICAgICAvKiB0aGlzIGluZm9ybWF0aW9uLiovXG4gICAgICByZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICB9XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGFzc2FibGUpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdudWxsJzoge1xuICAgICAgICByZXR1cm4gJ3YnO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4gJ3onO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICByZXR1cm4gYHMke2VuY29kZVN0cmluZ1N1ZmZpeChwYXNzYWJsZSl9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOiB7XG4gICAgICAgIHJldHVybiBgYiR7cGFzc2FibGV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVSZW1vdGFibGUocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVQcm9taXNlKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIC8qIFN0cmluZ3MgYW5kIHN5bWJvbHMgc2hhcmUgZW5jb2RpbmcgbG9naWMuKi9cbiAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICByZXR1cm4gYHkke2VuY29kZVN0cmluZ1N1ZmZpeChuYW1lKX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUJ5dGVBcnJheShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVJlY29yZChwYXNzYWJsZSwgZW5jb2RlQXJyYXksIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVRhZ2dlZChwYXNzYWJsZSwgZW5jb2RlQXJyYXksIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBhICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbGxlY3Rpb24gcGFzc2FibGVgO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGlubmVyRW5jb2RlO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlT2JqZWN0fSBbZGVjb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JdXG4gKi9cblxuY29uc3QgbGliZXJhbERlY29kZXJzID0gLyoqIEB0eXBlIHtSZXF1aXJlZDxEZWNvZGVPcHRpb25zPn0gKi8gKFxuICAvKiogQHR5cGUge3Vua25vd259ICovICh7XG4gICAgZGVjb2RlUmVtb3RhYmxlOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgICBkZWNvZGVQcm9taXNlOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgICBkZWNvZGVFcnJvcjogKF9lbmNvZGluZywgX2lubmVyRGVjb2RlKSA9PiB1bmRlZmluZWQsXG4gIH0pXG4pO1xuXG4vKipcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZykgPT4gc3RyaW5nfSBkZWNvZGVTdHJpbmdTdWZmaXhcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZywgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlLCBza2lwPzogbnVtYmVyKSA9PiB1bmtub3duW119IGRlY29kZUFycmF5XG4gKiBAcGFyYW0ge1JlcXVpcmVkPERlY29kZU9wdGlvbnM+fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IHN0cmluZywgc2tpcD86IG51bWJlcikgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0IG1ha2VJbm5lckRlY29kZSA9IChkZWNvZGVTdHJpbmdTdWZmaXgsIGRlY29kZUFycmF5LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHsgZGVjb2RlUmVtb3RhYmxlLCBkZWNvZGVQcm9taXNlLCBkZWNvZGVFcnJvciB9ID0gb3B0aW9ucztcbiAgLyoqIEB0eXBlIHsoZW5jb2RlZDogc3RyaW5nLCBza2lwPzogbnVtYmVyKSA9PiBQYXNzYWJsZX0gKi9cbiAgY29uc3QgaW5uZXJEZWNvZGUgPSAoZW5jb2RlZCwgc2tpcCA9IDApID0+IHtcbiAgICBzd2l0Y2ggKGVuY29kZWQuY2hhckF0KHNraXApKSB7XG4gICAgICBjYXNlICd2Jzoge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3onOiB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjYXNlICdmJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlQmluYXJ5NjQoZW5jb2RlZCwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICdzJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlU3RyaW5nU3VmZml4KGdldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSkpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYic6IHtcbiAgICAgICAgY29uc3Qgc3Vic3RyaW5nID0gZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKTtcbiAgICAgICAgaWYgKHN1YnN0cmluZyA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3Vic3RyaW5nID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgZXhwZWN0ZWQgZW5jb2RlZCBib29sZWFuIHRvIGJlIFwiYnRydWVcIiBvciBcImJmYWxzZVwiOiAke3N1YnN0cmluZ31gO1xuICAgICAgfVxuICAgICAgY2FzZSAnbic6XG4gICAgICBjYXNlICdwJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlQmlnSW50KGdldFN1ZmZpeChlbmNvZGVkLCBza2lwKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdyJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUmVtb3RhYmxlKGdldFN1ZmZpeChlbmNvZGVkLCBza2lwKSwgaW5uZXJEZWNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnPyc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVByb21pc2UoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICchJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlRXJyb3IoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICd5Jzoge1xuICAgICAgICAvKiBTdHJpbmdzIGFuZCBzeW1ib2xzIHNoYXJlIGRlY29kaW5nIGxvZ2ljLiovXG4gICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdbJzpcbiAgICAgIGNhc2UgJ14nOiB7XG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgVHlwZSAndW5rbm93bltdJyBpcyBub3QgUGFzc2FibGUqL1xuICAgICAgICByZXR1cm4gZGVjb2RlQXJyYXkoZW5jb2RlZCwgaW5uZXJEZWNvZGUsIHNraXApO1xuICAgICAgfVxuICAgICAgY2FzZSAnKCc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVJlY29yZChlbmNvZGVkLCBkZWNvZGVBcnJheSwgaW5uZXJEZWNvZGUsIHNraXApO1xuICAgICAgfVxuICAgICAgY2FzZSAnOic6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVRhZ2dlZChlbmNvZGVkLCBkZWNvZGVBcnJheSwgaW5uZXJEZWNvZGUsIHNraXApO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZGF0YWJhc2Uga2V5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGlubmVyRGVjb2RlO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXNzYWJsZUtpdFxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPG1ha2VJbm5lckVuY29kZT59IGVuY29kZVBhc3NhYmxlXG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8bWFrZUlubmVyRGVjb2RlPn0gZGVjb2RlUGFzc2FibGVcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlT3B0aW9ucyAmIERlY29kZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1Bhc3NhYmxlS2l0fVxuICovXG4gICAgICAgY29uc3QgbWFrZVBhc3NhYmxlS2l0ID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlID0gKHIsIF8pID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cn1gLFxuICAgIGVuY29kZVByb21pc2UgPSAocCwgXykgPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cH1gLFxuICAgIGVuY29kZUVycm9yID0gKGVyciwgXykgPT4gRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gLFxuICAgIGZvcm1hdCA9ICdsZWdhY3lPcmRlcmVkJyxcblxuICAgIGRlY29kZVJlbW90YWJsZSA9IChlbmNvZGluZywgXykgPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICAgIGRlY29kZVByb21pc2UgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gICAgZGVjb2RlRXJyb3IgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICB9ID0gb3B0aW9ucztcblxuICAvKiogQHR5cGUge1Bhc3NhYmxlS2l0WydlbmNvZGVQYXNzYWJsZSddfSAqL1xuICBsZXQgZW5jb2RlUGFzc2FibGU7XG4gIGNvbnN0IGVuY29kZU9wdGlvbnMgPSB7IGVuY29kZVJlbW90YWJsZSwgZW5jb2RlUHJvbWlzZSwgZW5jb2RlRXJyb3IsIGZvcm1hdCB9O1xuICBpZiAoZm9ybWF0ID09PSAnY29tcGFjdE9yZGVyZWQnKSB7XG4gICAgY29uc3QgbGliZXJhbERlY29kZSA9IG1ha2VJbm5lckRlY29kZShcbiAgICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgICBsaWJlcmFsRGVjb2RlcnMsXG4gICAgKTtcbiAgICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuICAgIGNvbnN0IHZlcmlmeUVuY29kaW5nID0gKGVuY29kaW5nLCBsYWJlbCkgPT4ge1xuICAgICAgIWVuY29kaW5nLm1hdGNoKHJDMCkgfHxcbiAgICAgICAgRmFpbGAke2IoXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICl9IGVuY29kaW5nIG11c3Qgbm90IGNvbnRhaW4gYSBDMCBjb250cm9sIGNoYXJhY3RlcjogJHtlbmNvZGluZ31gO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUNvbXBhY3RBcnJheShgXnYgJHtlbmNvZGluZ30gdiBgLCBsaWJlcmFsRGVjb2RlKTtcbiAgICAgIChpc0FycmF5KGRlY29kZWQpICYmXG4gICAgICAgIGRlY29kZWQubGVuZ3RoID09PSAzICYmXG4gICAgICAgIGRlY29kZWRbMF0gPT09IG51bGwgJiZcbiAgICAgICAgZGVjb2RlZFsyXSA9PT0gbnVsbCkgfHxcbiAgICAgICAgRmFpbGAke2IobGFiZWwpfSBlbmNvZGluZyBtdXN0IGJlIGVtYmVkZGFibGU6ICR7ZW5jb2Rpbmd9YDtcbiAgICB9O1xuICAgIGNvbnN0IGVuY29kZUNvbXBhY3QgPSBtYWtlSW5uZXJFbmNvZGUoXG4gICAgICBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlQ29tcGFjdEFycmF5LFxuICAgICAgeyAuLi5lbmNvZGVPcHRpb25zLCB2ZXJpZnlFbmNvZGluZyB9LFxuICAgICk7XG4gICAgZW5jb2RlUGFzc2FibGUgPSBwYXNzYWJsZSA9PiBgfiR7ZW5jb2RlQ29tcGFjdChwYXNzYWJsZSl9YDtcbiAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdsZWdhY3lPcmRlcmVkJykge1xuICAgIGVuY29kZVBhc3NhYmxlID0gbWFrZUlubmVyRW5jb2RlKFxuICAgICAgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlTGVnYWN5QXJyYXksXG4gICAgICBlbmNvZGVPcHRpb25zLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgZm9ybWF0OiAke3EoZm9ybWF0KX1gO1xuICB9XG5cbiAgY29uc3QgZGVjb2RlT3B0aW9ucyA9IHsgZGVjb2RlUmVtb3RhYmxlLCBkZWNvZGVQcm9taXNlLCBkZWNvZGVFcnJvciB9O1xuICBjb25zdCBkZWNvZGVDb21wYWN0ID0gbWFrZUlubmVyRGVjb2RlKFxuICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlQ29tcGFjdEFycmF5LFxuICAgIGRlY29kZU9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRlY29kZUxlZ2FjeSA9IG1ha2VJbm5lckRlY29kZShcbiAgICBkZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlTGVnYWN5QXJyYXksXG4gICAgZGVjb2RlT3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZGVjb2RlUGFzc2FibGUgPSBlbmNvZGVkID0+IHtcbiAgICAvKiBBIGxlYWRpbmcgXCJ+XCIgaW5kaWNhdGVzIHRoZSB2MiBlbmNvZGluZyAod2l0aCBlc2NhcGluZyBpbiBzdHJpbmdzIHJhdGhlciB0aGFuIGFycmF5cykuKi9cbiAgICAvKiBTa2lwIGl0IGluc2lkZSBgZGVjb2RlQ29tcGFjdGAgdG8gYXZvaWQgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy4qL1xuICAgIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG4gICAgaWYgKGVuY29kZWQuY2hhckF0KDApID09PSAnficpIHtcbiAgICAgIHJldHVybiBkZWNvZGVDb21wYWN0KGVuY29kZWQsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVjb2RlTGVnYWN5KGVuY29kZWQpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyBlbmNvZGVQYXNzYWJsZSwgZGVjb2RlUGFzc2FibGUgfSk7XG59OyRozY9fb25jZS5tYWtlUGFzc2FibGVLaXQobWFrZVBhc3NhYmxlS2l0KTtcbmhhcmRlbihtYWtlUGFzc2FibGVLaXQpO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7UGFzc2FibGVLaXRbJ2VuY29kZVBhc3NhYmxlJ119XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlUGFzc2FibGUgPSBlbmNvZGVPcHRpb25zID0+IHtcbiAgY29uc3QgeyBlbmNvZGVQYXNzYWJsZSB9ID0gbWFrZVBhc3NhYmxlS2l0KGVuY29kZU9wdGlvbnMpO1xuICByZXR1cm4gZW5jb2RlUGFzc2FibGU7XG59OyRozY9fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7UGFzc2FibGVLaXRbJ2RlY29kZVBhc3NhYmxlJ119XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlUGFzc2FibGUgPSBkZWNvZGVPcHRpb25zID0+IHtcbiAgY29uc3QgeyBkZWNvZGVQYXNzYWJsZSB9ID0gbWFrZVBhc3NhYmxlS2l0KGRlY29kZU9wdGlvbnMpO1xuICByZXR1cm4gZGVjb2RlUGFzc2FibGU7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG4gICAgICAgY29uc3QgaXNFbmNvZGVkUmVtb3RhYmxlID0gZW5jb2RlZCA9PiBlbmNvZGVkLmNoYXJBdCgwKSA9PT0gJ3InOyRozY9fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGUge1JlY29yZDxQYXNzU3R5bGUsIHN0cmluZz59XG4gKiBUaGUgc2luZ2xlIHByZWZpeCBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQgZm9yIGVhY2ggUGFzc1N0eWxlIGNhdGVnb3J5LlxuICogYGJpZ2ludGAgaXMgYSB0d28tY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIGVhY2ggb2YgdGhvc2UgY2hhcmFjdGVyc1xuICogaW5kaXZpZHVhbGx5IGlzIGEgdmFsaWQgYmlnaW50IHByZWZpeCAoYG5gIGZvciBcIm5lZ2F0aXZlXCIgYW5kIGBwYCBmb3JcbiAqIFwicG9zaXRpdmVcIiksIGFuZCBjb3B5QXJyYXkgaXMgYSB0d28tY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIG9uZSBlbmNvZGluZ1xuICogcHJlZml4ZXMgYXJyYXlzIHdpdGggYFtgIHdoaWxlIHRoZSBvdGhlciB1c2VzIGBeYCAod2hpY2ggaXMgcHJvaGliaXRlZCBmcm9tXG4gKiBhcHBlYXJpbmcgaW4gYW4gZW5jb2RlZCBzdHJpbmcpLlxuICogVGhlIG9yZGVyaW5nIG9mIHRoZXNlIHByZWZpeGVzIGlzIHRoZSBzYW1lIGFzIHRoZSByYW5rT3JkZXJpbmcgb2YgdGhlaXJcbiAqIHJlc3BlY3RpdmUgUGFzc1N0eWxlcywgYW5kIHJhbmtPcmRlci5qcyBpbXBvcnRzIHRoZSB0YWJsZSBmb3IgdGhpcyBwdXJwb3NlLlxuICpcbiAqIEluIGFkZGl0aW9uLCBgfGAgaXMgdGhlIHJlbW90YWJsZS0+b3JkaW5hbCBtYXBwaW5nIHByZWZpeDpcbiAqIFRoaXMgaXMgbm90IHVzZWQgaW4gY292ZXJzIGJ1dCBpdCBpc1xuICogcmVzZXJ2ZWQgZnJvbSB0aGUgc2FtZSBzZXQgb2Ygc3RyaW5ncy4gTm90ZSB0aGF0IHRoZSBwcmVmaXggaXMgPiBhbnlcbiAqIHByZWZpeCB1c2VkIGJ5IGFueSBjb3ZlciBzbyB0aGF0IG9yZGluYWwgbWFwcGluZyBrZXlzIGFyZSBhbHdheXMgb3V0c2lkZVxuICogdGhlIHJhbmdlIG9mIHZhbGlkIGNvbGxlY3Rpb24gZW50cnkga2V5cy5cbiAqL1xuICAgICAgIGNvbnN0IHBhc3NTdHlsZVByZWZpeGVzID0ge1xuICBlcnJvcjogJyEnLFxuICBjb3B5UmVjb3JkOiAnKCcsXG4gIHRhZ2dlZDogJzonLFxuICBwcm9taXNlOiAnPycsXG4gIGNvcHlBcnJheTogJ1teJyxcbiAgYnl0ZUFycmF5OiAnYScsXG4gIGJvb2xlYW46ICdiJyxcbiAgbnVtYmVyOiAnZicsXG4gIGJpZ2ludDogJ25wJyxcbiAgcmVtb3RhYmxlOiAncicsXG4gIHN0cmluZzogJ3MnLFxuICBudWxsOiAndicsXG4gIHN5bWJvbDogJ3knLFxuICAvKiBCZWNhdXNlIEFycmF5LnByb3RvdHlwZS5zb3J0IHB1dHMgdW5kZWZpbmVkIHZhbHVlcyBhdCB0aGUgZW5kIHdpdGhvdXQqL1xuICAvKiBwYXNzaW5nIHRoZW0gdG8gYSBjb21wYXJpc29uIGZ1bmN0aW9uLCB1bmRlZmluZWQgTVVTVCBiZSB0aGUgbGFzdCovXG4gIC8qIGNhdGVnb3J5LiovXG4gIHVuZGVmaW5lZDogJ3onLFxufTskaM2PX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xuT2JqZWN0LnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVByZWZpeGVzLCBudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVQcmVmaXhlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWNvcmROYW1lcyI6WyJyZWNvcmROYW1lcyJdLCJyZWNvcmRWYWx1ZXMiOlsicmVjb3JkVmFsdWVzIl0sInplcm9QYWQiOlsiemVyb1BhZCJdLCJtYWtlUGFzc2FibGVLaXQiOlsibWFrZVBhc3NhYmxlS2l0Il0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANXCc7oXRAAAF0QAACsAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJRQ0xBU1MiLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiLCJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxpc1ByaW1pdGl2ZSxnZXRUYWcsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxYLEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge1Bhc3NhYmxlLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnICovXG4vKiogQGltcG9ydCB7RW5jb2RpbmcsIEVuY29kaW5nVW5pb259IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG4gIGRlZmluZVByb3BlcnRpZXMsXG4gIGlzLFxuICBlbnRyaWVzLFxuICBmcm9tRW50cmllcyxcbiAgZnJlZXplLFxuICBoYXNPd24sXG59ID0gT2JqZWN0O1xuXG4vKipcbiAqIFNwZWNpYWwgcHJvcGVydHkgbmFtZSB0aGF0IGluZGljYXRlcyBhbiBlbmNvZGluZyB0aGF0IG5lZWRzIHNwZWNpYWxcbiAqIGRlY29kaW5nLlxuICovXG5jb25zdCBRQ0xBU1MgPSAnQHFjbGFzcyc7JGjNj19vbmNlLlFDTEFTUyhRQ0xBU1MpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZyAmIG9iamVjdH0gZW5jb2RlZFxuICogQHJldHVybnMge2VuY29kZWQgaXMgRW5jb2RpbmdVbmlvbn1cbiAqL1xuY29uc3QgaGFzUUNsYXNzID0gZW5jb2RlZCA9PiBoYXNPd24oZW5jb2RlZCwgUUNMQVNTKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gcWNsYXNzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcyA9IChlbmNvZGVkLCBxY2xhc3MpID0+XG4gICFpc1ByaW1pdGl2ZShlbmNvZGVkKSAmJlxuICAhaXNBcnJheShlbmNvZGVkKSAmJlxuICBoYXNRQ2xhc3MoZW5jb2RlZCkgJiZcbiAgZW5jb2RlZFtRQ0xBU1NdID09PSBxY2xhc3M7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9DYXBEYXRhT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlT2JqZWN0LFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZUVycm9yVG9DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSByZW0gPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEgPSBwcm9tID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9DYXBEYXRhID0gZXJyID0+IEZhaWxgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7ZXJyfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb0NhcERhdGFPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ31cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbmNvZGVUb0NhcERhdGEgPSAoZW5jb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuICAgIGVuY29kZVByb21pc2VUb0NhcERhdGEgPSBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbiAgICBlbmNvZGVFcnJvclRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YSxcbiAgfSA9IGVuY29kZU9wdGlvbnM7XG5cbiAgLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7YW55fSBwYXNzYWJsZVxuICogQHJldHVybnMge0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9DYXBEYXRhYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvQ2FwRGF0YWAgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbiAgY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4gICAgLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGFzIFtRQ0xBU1NdIGNvbXBvc2l0ZXMuKi9cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIC8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ3VuZGVmaW5lZCcgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSkge1xuICAgICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAnTmFOJyB9O1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSBJbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAnSW5maW5pdHknIH07XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IC1JbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAnLUluZmluaXR5JyB9O1xuICAgICAgICB9XG4gICAgICAgIC8qIFBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGVsc2UsIHJlcGxhY2luZyAtMCB3aXRoIDAuKi9cbiAgICAgICAgcmV0dXJuIGlzKHBhc3NhYmxlLCAtMCkgPyAwIDogcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW1FDTEFTU106ICdiaWdpbnQnLFxuICAgICAgICAgIGRpZ2l0czogU3RyaW5nKHBhc3NhYmxlKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ3N5bWJvbCcsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIGlmIChoYXNPd24ocGFzc2FibGUsIFFDTEFTUykpIHtcbiAgICAgICAgICAvKiBIaWxiZXJ0IGhvdGVsKi9cbiAgICAgICAgICBjb25zdCB7IFtRQ0xBU1NdOiBxY2xhc3NWYWx1ZSwgLi4ucmVzdCB9ID0gcGFzc2FibGU7XG4gICAgICAgICAgLyoqIEB0eXBlIHtFbmNvZGluZ30gKi9cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBbUUNMQVNTXTogJ2hpbGJlcnQnLFxuICAgICAgICAgICAgb3JpZ2luYWw6IGVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChvd25LZXlzKHJlc3QpLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAvKiBXZSBoYXJkZW4gdGhlIGVudGlyZSBjYXBEYXRhIGVuY29kaW5nIGJlZm9yZSB3ZSByZXR1cm4gaXQuKi9cbiAgICAgICAgICAgIC8qIGBlbmNvZGVUb0NhcERhdGFgIHJlcXVpcmVzIHRoYXQgaXRzIGlucHV0IGJlIFBhc3NhYmxlLCBhbmQqL1xuICAgICAgICAgICAgLyogdGhlcmVmb3JlIGhhcmRlbmVkLiovXG4gICAgICAgICAgICAvKiBUaGUgYGZyZWV6ZWAgaGVyZSBpcyBuZWVkZWQgYW55d2F5LCBiZWNhdXNlIHRoZSBgcmVzdGAgaXMqL1xuICAgICAgICAgICAgLyogZnJlc2hseSBjb25zdHJ1Y3RlZCBieSB0aGUgYC4uLmAgYWJvdmUsIGFuZCB3ZSdyZSB1c2luZyBpdCovXG4gICAgICAgICAgICAvKiBhcyBpbXB1dCBpbiBhbm90aGVyIGNhbGwgdG8gYGVuY29kZVRvQ2FwRGF0YWAuKi9cbiAgICAgICAgICAgIHJlc3VsdC5yZXN0ID0gZW5jb2RlVG9DYXBEYXRhUmVjdXIoZnJlZXplKHJlc3QpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuICAgICAgICAvKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuICAgICAgICAvKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKFxuICAgICAgICAgIG5hbWVzLm1hcChuYW1lID0+IFtuYW1lLCBlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZVtuYW1lXSldKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gICAgICB9XG4gICAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICAgIC8qIFRPRE8gaW1wbGVtZW50Ki9cbiAgICAgICAgdGhyb3cgRmFpbGBtYXJzYWwgb2YgYnl0ZUFycmF5IG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7cGFzc2FibGV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ3RhZ2dlZCcsXG4gICAgICAgICAgdGFnOiBnZXRUYWcocGFzc2FibGUpLFxuICAgICAgICAgIHBheWxvYWQ6IGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhKFxuICAgICAgICAgIHBhc3NhYmxlLFxuICAgICAgICAgIGVuY29kZVRvQ2FwRGF0YVJlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnc2xvdCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICApfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ3Nsb3QnKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICAgICdzbG90JyxcbiAgICAgICAgKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnZXJyb3InKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICApfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb0NhcERhdGEgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4gICAgICAvKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuICAgICAgLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbiAgICAgIC8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuICAgICAgLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuICAgICAgLyoqL1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4gICAgICAvKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4gICAgICAvKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbiAgICAgIC8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbiAgICAgIHJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKSk7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xufTskaM2PX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZU9iamVjdCl9IFtkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZU9iamVjdCl9IFtkZWNvZGVQcm9taXNlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSA9IHNsb3RFbmNvZGluZyA9PlxuICBGYWlsYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IGVycm9yRW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycm9yRW5jb2Rpbmd9YDtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoXG4gKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb25cbiAqIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlXG4gKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLlxuICpcbiAqIFRoaXMgc2VlbXMgbGlrZSB0aGUgYmVzdCBzdGFydGluZyBwb2ludCB0byBpbmNyZW1lbnRhbGx5IGV2b2x2ZSB0byBhblxuICogQVBJIHdoZXJlIHRoZXNlIGNhbiByZWxpYWJseSBkaWZmZXIuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0XG4gKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZUZyb21DYXBEYXRhID0gKGRlY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgPSBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhID0gZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgIGRlY29kZUVycm9yRnJvbUNhcERhdGEgPSBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSxcbiAgfSA9IGRlY29kZU9wdGlvbnM7XG5cbiAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgPT09IGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSB8fFxuICAgIEZhaWxgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbiAgICAgIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhLFxuICAgICl9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbiAgLyoqXG4gKiBgZGVjb2RlRnJvbUNhcERhdGFgIG1heSByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGpzb25FbmNvZGVkYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9DYXBEYXRhYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tQ2FwRGF0YWAgY2Fubm90IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBqc29uRW5jb2RlZCBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbiAgY29uc3QgZGVjb2RlRnJvbUNhcERhdGEgPSBqc29uRW5jb2RlZCA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKGpzb25FbmNvZGVkKSkge1xuICAgICAgLyogcHJpbWl0aXZlcyBwYXNzIHRocm91Z2gqL1xuICAgICAgcmV0dXJuIGpzb25FbmNvZGVkO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShqc29uRW5jb2RlZCkpIHtcbiAgICAgIHJldHVybiBqc29uRW5jb2RlZC5tYXAoZW5jb2RlZFZhbCA9PiBkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gICAgfSBlbHNlIGlmIChoYXNRQ2xhc3MoanNvbkVuY29kZWQpKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSBqc29uRW5jb2RlZFtRQ0xBU1NdO1xuICAgICAgdHlwZW9mIHFjbGFzcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgRmFpbGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG4gICAgICBzd2l0Y2ggKHFjbGFzcykge1xuICAgICAgICAvKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdOYU4nOiB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdJbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICB0eXBlb2YgZGlnaXRzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICAvKiBEZXByZWNhdGVkIHFjbGFzcy4gVE9ETyBtYWtlIGNvbmRpdGlvbmFsKi9cbiAgICAgICAgICAvKiBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRXZlbnR1YWxseSByZW1vdmUsIGJ1dCBhZnRlciBjb25maWRlbnQqL1xuICAgICAgICAgIC8qIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgc3VwcG9ydGVkIHNlbmRlcnMuKi9cbiAgICAgICAgICAvKiovXG4gICAgICAgICAgcmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHsgdGFnLCBwYXlsb2FkIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICByZXR1cm4gbWFrZVRhZ2dlZCh0YWcsIGRlY29kZUZyb21DYXBEYXRhKHBheWxvYWQpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzbG90Jzoge1xuICAgICAgICAgIC8qIFNlZSBub3RlIGFib3ZlIGFib3V0IGhvdyB0aGUgY3VycmVudCBlbmNvZGluZyBjYW5ub3QgcmVsaWFibHkqL1xuICAgICAgICAgIC8qIGRpc3Rpbmd1aXNoIHdoaWNoIHdlIHNob3VsZCBjYWxsLCBzbyBpbiB0aGUgbm9uLWRlZmF1bHQgY2FzZSovXG4gICAgICAgICAgLyogYm90aCBtdXN0IGJlIHRoZSBzYW1lIGFuZCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCB3ZSBjYWxsLiovXG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKFxuICAgICAgICAgICAganNvbkVuY29kZWQsXG4gICAgICAgICAgICBkZWNvZGVGcm9tQ2FwRGF0YSxcbiAgICAgICAgICApO1xuICAgICAgICAgIC8qIEJFV0FSRTogY2FwZGF0YSBkb2VzIG5vdCBjaGVjayB0aGF0IGBkZWNvZGVkYCBpcyovXG4gICAgICAgICAgLyogYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLCBzaW5jZSB0aGF0IHdvdWxkIGJyZWFrIHNvbWUqL1xuICAgICAgICAgIC8qIGNhcGRhdGEgY2xpZW50cy4gV2UgYXJlIGRlcHJlY2F0aW5nIGNhcGRhdGEsIGFuZCB0aGVzZSBjbGllbnRzKi9cbiAgICAgICAgICAvKiB3aWxsIG5lZWQgdG8gdXBkYXRlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gc21hbGxjYXBzLiovXG4gICAgICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUVycm9yRnJvbUNhcERhdGEoXG4gICAgICAgICAgICBqc29uRW5jb2RlZCxcbiAgICAgICAgICAgIGRlY29kZUZyb21DYXBEYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKGRlY29kZWQpID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgaGFzT3duKGpzb25FbmNvZGVkLCAnb3JpZ2luYWwnKSB8fFxuICAgICAgICAgICAgRmFpbGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuICAgICAgICAgIC8qIERvbid0IGhhcmRlbiBzaW5jZSB3ZSdyZSBub3QgZG9uZSBtdXRhdGluZyBpdCovXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0geyBbUUNMQVNTXTogZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpIH07XG4gICAgICAgICAgaWYgKGhhc093bihqc29uRW5jb2RlZCwgJ3Jlc3QnKSkge1xuICAgICAgICAgICAgY29uc3QgaXNOb25FbXB0eU9iamVjdCA9XG4gICAgICAgICAgICAgIHR5cGVvZiByZXN0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICByZXN0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID49IDE7XG4gICAgICAgICAgICBpZiAoIWlzTm9uRW1wdHlPYmplY3QpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0IGVuY29kaW5nIG11c3QgYmUgYSBub24tZW1wdHkgb2JqZWN0OiAke3Jlc3R9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3RPYmogPSBkZWNvZGVGcm9tQ2FwRGF0YShyZXN0KTtcbiAgICAgICAgICAgIC8qIFRPRE8gcmVhbGx5IHNob3VsZCBhc3NlcnQgdGhhdCBgcGFzc1N0eWxlT2YocmVzdClgIGlzKi9cbiAgICAgICAgICAgIC8qIGAnY29weVJlY29yZCdgIGJ1dCB3ZSdkIGhhdmUgdG8gaGFyZGVuIGl0IGFuZCBpdCBpcyB0b28qL1xuICAgICAgICAgICAgLyogZWFybHkgdG8gZG8gdGhhdC4qL1xuICAgICAgICAgICAgIWhhc093bihyZXN0T2JqLCBRQ0xBU1MpIHx8XG4gICAgICAgICAgICAgIEZhaWxgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBpcyB0aGUgZXJyb3IgY2FzZSB3ZSdyZSB0ZXN0aW5nIGZvciovXG4gICAgICAgIGNhc2UgJ2liaWQnOiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbiAgICAgICAgICAgIHFjbGFzcyxcbiAgICAgICAgICApfWA7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG4gICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkID09PSAnb2JqZWN0JyAmJiBqc29uRW5jb2RlZCAhPT0gbnVsbCk7XG4gICAgICBjb25zdCBkZWNvZGVFbnRyeSA9IChbbmFtZSwgZW5jb2RlZFZhbF0pID0+IHtcbiAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICByZXR1cm4gW25hbWUsIGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkZWNvZGVkRW50cmllcyA9IGVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG4gICAgICByZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADVNfjvRFAAD0RQAALQAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFgsRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge1Bhc3NhYmxlLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnICovXG4vKiBGSVhNRSBkZWZpbmUgYWN0dWFsIHR5cGVzKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgaXMsIGVudHJpZXMsIGZyb21FbnRyaWVzLCBoYXNPd24gfSA9IE9iamVjdDtcblxuY29uc3QgQkFORyA9ICchJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgREFTSCA9ICctJy5jaGFyQ29kZUF0KDApO1xuXG4vKipcbiAqIEFuIGBlbmNvZGVUb1NtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYSBwYXNzYWJsZSBhbmQgcmV0dXJucyBhXG4gKiBKU09OLXJlcHJlc2VudGFibGUgb2JqZWN0IChpLmUuLCByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoXG4gKiBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXBsYWNlcnMgb3IgcmV2aXZlcnNcbiAqIHJldHVybnMgYW4gZXF1aXZhbGVudCBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBvYmplY3QgaWRlbnRpdHkpLlxuICogV2UgY2FsbCB0aGlzIHJlcHJlc2VudGF0aW9uIGEgU21hbGxjYXBzIEVuY29kaW5nLlxuICpcbiAqIEEgYGRlY29kZUZyb21TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGFzIGFyZ3VtZW50IHdoYXQgaXRcbiAqICphc3N1bWVzKiBpcyB0aGUgcmVzdWx0IG9mIGEgcGxhaW4gYEpTT04ucGFyc2VgIHdpdGggbm8gcmVzb2x2ZXIuIEl0IHRoZW5cbiAqIG11c3QgdmFsaWRhdGUgdGhhdCBpdCBpcyBhIHZhbGlkIFNtYWxsY2FwcyBFbmNvZGluZywgYW5kIGlmIGl0IGlzLFxuICogcmV0dXJuIGEgY29ycmVzcG9uZGluZyBwYXNzYWJsZS5cbiAqXG4gKiBTbWFsbGNhcHMgY29uc2lkZXJzIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gYCFgIChhc2NpaSBjb2RlIDMzLCBCQU5HKVxuICogYW5kIGAtYCAoYXNjaWkgY29kZSA0NSwgREFTSCkgdG8gYmUgc3BlY2lhbCBwcmVmaXhlcyBhbGxvd2luZ1xuICogcmVwcmVzZW50YXRpb24gb2YgSlNPTi1pbmNvbXBhdGlibGUgZGF0YSB1c2luZyBzdHJpbmdzLlxuICogVGhlc2UgY2hhcmFjdGVycywgaW4gb3JkZXIsIGFyZSBgIVwiIyQlJicoKSorLC1gXG4gKiBPZiB0aGVzZSwgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICogYCFgIC0gZXNjYXBlZCBzdHJpbmdcbiAqICAqIGArYCAtIG5vbi1uZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAtYCAtIG5lZ2F0aXZlIGJpZ2ludFxuICogICogYCNgIC0gbWFuaWZlc3QgY29uc3RhbnRcbiAqICAqIGAlYCAtIHN5bWJvbFxuICogICogYCRgIC0gcmVtb3RhYmxlXG4gKiAgKiBgJmAgLSBwcm9taXNlXG4gKlxuICogQWxsIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyAoYFwiJygpKixgKSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4gKlxuICogVGhlIG1hbmlmZXN0IGNvbnN0YW50cyB0aGF0IHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyBmb3IgdmFsdWVzOlxuICogICogYCN1bmRlZmluZWRgXG4gKiAgKiBgI05hTmBcbiAqICAqIGAjSW5maW5pdHlgXG4gKiAgKiBgIy1JbmZpbml0eWBcbiAqXG4gKiBhbmQgZm9yIHByb3BlcnR5IG5hbWVzIGFuYWxvZ291cyB0byBjYXBkYXRhIEBxY2xhc3M6XG4gKiAgKiBgI3RhZ2BcbiAqICAqIGAjZXJyb3JgXG4gKlxuICogQWxsIG90aGVyIGVuY29kZWQgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgI2AgYXJlIHJlc2VydmVkIGZvclxuICogZnV0dXJlIHVzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFN0clxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWwgPSBlbmNvZGVkU3RyID0+IHtcbiAgaWYgKGVuY29kZWRTdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qIGNoYXJDb2RlQXQoMCkgYW5kIG51bWJlciBjb21wYXJlIGlzIGEgYml0IGZhc3Rlci4qL1xuICBjb25zdCBjb2RlID0gZW5jb2RlZFN0ci5jaGFyQ29kZUF0KDApO1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgeW9kYSovXG4gIHJldHVybiBCQU5HIDw9IGNvZGUgJiYgY29kZSA8PSBEQVNIO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZU9iamVjdCxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSByZW0gPT5cbiAgRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IHByb20gPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2FwcyA9IGVyciA9PlxuICBGYWlsYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIGVuY29kZU9wdGlvbnMgaXMgYWN0dWFsbHkgb3B0aW9uYWwsIGJ1dCBub3QgbWFya2VkIGFzIHN1Y2ggdG8gd29yayBhcm91bmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAyODZcbiAqXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAoZW5jb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbiAgICBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuICAgIGVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2FwcyxcbiAgfSA9IGVuY29kZU9wdGlvbnM7XG5cbiAgY29uc3QgYXNzZXJ0RW5jb2RlZEVycm9yID0gZW5jb2RpbmcgPT4ge1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdvYmplY3QnICYmIGhhc093bihlbmNvZGluZywgJyNlcnJvcicpKSB8fFxuICAgICAgRmFpbGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShcbiAgICAgICAgZW5jb2RpbmcsXG4gICAgICApfWA7XG4gICAgLyogQXNzZXJ0IHRoYXQgdGhlICNlcnJvciBwcm9wZXJ0eSBkZWNvZGVzIHRvIGEgc3RyaW5nLiovXG4gICAgY29uc3QgbWVzc2FnZSA9IGVuY29kaW5nWycjZXJyb3InXTtcbiAgICAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAoIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSkgfHwgbWVzc2FnZS5jaGFyQXQoMCkgPT09ICchJykpIHx8XG4gICAgICBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuICB9O1xuXG4gIC8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRlbHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtTbWFsbGNhcHNFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvU21hbGxjYXBzYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvU21hbGxjYXBzYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuICBjb25zdCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyID0gcGFzc2FibGUgPT4ge1xuICAgIC8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuICAgIC8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBpbnRvIHNtYWxsY2FwcyBzdHJpbmdzLiovXG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGFzc2FibGUpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOiB7XG4gICAgICAgIC8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBpZiAoc3RhcnRzU3BlY2lhbChwYXNzYWJsZSkpIHtcbiAgICAgICAgICAvKiBTdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhIHNwZWNpYWwgY2hhciBhcmUgcXVvdGVkIHdpdGggYCFgLiovXG4gICAgICAgICAgLyogU2luY2UgYCFgIGlzIGl0c2VsZiBhIHNwZWNpYWwgY2hhcmFjdGVyLCB0aGlzIHRyaXZpYWxseSBkb2VzKi9cbiAgICAgICAgICAvKiB0aGUgSGlsYmVydCBob3RlbC4gQWxzbywgc2luY2UgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUqL1xuICAgICAgICAgIC8qIGEgY29udGludW91cyBzdWJyYW5nZSBvZiBhc2NpaSwgdGhpcyBxdW90aW5nIGlzIHNvcnQtb3JkZXIqL1xuICAgICAgICAgIC8qIHByZXNlcnZpbmcuKi9cbiAgICAgICAgICByZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gICAgICAgIH1cbiAgICAgICAgLyogQWxsIG90aGVyIHN0cmluZ3MgcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiAnI3VuZGVmaW5lZCc7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIC8qIFNwZWNpYWwtY2FzZSBudW1iZXJzIHdpdGggbm8gZGlnaXQtYmFzZWQgcmVwcmVzZW50YXRpb24uKi9cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihwYXNzYWJsZSkpIHtcbiAgICAgICAgICByZXR1cm4gJyNOYU4nO1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSBJbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiAnI0luZmluaXR5JztcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuICcjLUluZmluaXR5JztcbiAgICAgICAgfVxuICAgICAgICAvKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG4gICAgICAgIHJldHVybiBpcyhwYXNzYWJsZSwgLTApID8gMCA6IHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcocGFzc2FibGUpO1xuICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHtiaWdpbnR9ICovIChwYXNzYWJsZSkgPCAwbiA/IHN0ciA6IGArJHtzdHJ9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIGAlJHtuYW1lfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuICAgICAgICAvKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuICAgICAgICAvKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKFxuICAgICAgICAgIG5hbWVzLm1hcChuYW1lID0+IFtcbiAgICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG4gICAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgLyogVE9ETyBpbXBsZW1lbnQqL1xuICAgICAgICB0aHJvdyBGYWlsYG1hcnNhbCBvZiBieXRlQXJyYXkgbm90IHlldCBpbXBsZW1lbnRlZDogJHtwYXNzYWJsZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICcjdGFnJzogZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihnZXRUYWcocGFzc2FibGUpKSxcbiAgICAgICAgICBwYXlsb2FkOiBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlLnBheWxvYWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PT0gJyQnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIkXCI6ICR7cmVzdWx0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnICYmIHJlc3VsdC5jaGFyQXQoMCkgPT09ICcmJykge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCImXCI6ICR7cmVzdWx0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSwgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG4gICAgICAgIGFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICBYYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG4gICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgZW5jb2RlVG9TbWFsbGNhcHMgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4gICAgICAvKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuICAgICAgLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbiAgICAgIC8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuICAgICAgLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuICAgICAgLyoqL1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4gICAgICAvKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4gICAgICAvKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbiAgICAgIC8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGhhcmRlbihcbiAgICAgICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSwgZW5jb2RlVG9TbWFsbGNhcHNSZWN1ciksXG4gICAgICApO1xuICAgICAgYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwcyk7XG59OyRozY9fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZU9iamVjdH0gW2RlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBlbmNvZGluZyA9PlxuICBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBlbmNvZGluZyA9PlxuICBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9IChkZWNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbiAgICBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbiAgICBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzLFxuICB9ID0gZGVjb2RlT3B0aW9ucztcblxuICAvKipcbiAqIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtYXkgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBlbmNvZGluZ2BcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvU21hbGxjYXBzYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBjYW5ub3QgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21TbWFsbGNhcHNgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtTbWFsbGNhcHNFbmNvZGluZ30gZW5jb2RpbmcgbXVzdCBiZSBoYXJkZW5lZFxuICovXG4gIGNvbnN0IGRlY29kZUZyb21TbWFsbGNhcHMgPSBlbmNvZGluZyA9PiB7XG4gICAgc3dpdGNoICh0eXBlb2YgZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIGlmICghc3RhcnRzU3BlY2lhbChlbmNvZGluZykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYyA9IGVuY29kaW5nLmNoYXJBdCgwKTtcbiAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgY2FzZSAnISc6IHtcbiAgICAgICAgICAgIC8qIHVuLWhpbGJlcnQtaWZ5IHRoZSBzdHJpbmcqL1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICclJzoge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyMnOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICAgIGNhc2UgJyN1bmRlZmluZWQnOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjTmFOJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnI0luZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjLUluZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICAgICAgWGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsXG4gICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICBjYXNlICctJzoge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyQnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvKiBAdHMtaWdub3JlIFhYWCBTbWFsbENhcHNFbmNvZGluZyovXG4gICAgICAgICAgICBpZiAocGFzc1N0eWxlT2YocmVzdWx0KSAhPT0gJ3JlbW90YWJsZScpIHtcbiAgICAgICAgICAgICAgRmFpbGBpbnRlcm5hbDogZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSByZW1vdGFibGU6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcmJzoge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMoXG4gICAgICAgICAgICAgIGVuY29kaW5nLFxuICAgICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChwYXNzU3R5bGVPZihyZXN1bHQpICE9PSAncHJvbWlzZScpIHtcbiAgICAgICAgICAgICAgRmFpbGBpbnRlcm5hbDogZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZTogJHtyZXN1bHR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHRocm93IEZhaWxgU3BlY2lhbCBjaGFyICR7cShcbiAgICAgICAgICAgICAgYyxcbiAgICAgICAgICAgICl9IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlOiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdvYmplY3QnOiB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FycmF5KGVuY29kaW5nKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGluZy5tYXAodmFsID0+IGRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duKGVuY29kaW5nLCAnI3RhZycpKSB7XG4gICAgICAgICAgY29uc3QgeyAnI3RhZyc6IHRhZywgcGF5bG9hZCwgLi4ucmVzdCB9ID0gZW5jb2Rpbmc7XG4gICAgICAgICAgdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgVmFsdWUgb2YgXCIjdGFnXCIsIHRoZSB0YWcsIG11c3QgYmUgYSBzdHJpbmc6ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgRmFpbGAjdGFnIHJlY29yZCB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShvd25LZXlzKHJlc3QpKX1gO1xuICAgICAgICAgIHJldHVybiBtYWtlVGFnZ2VkKFxuICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyhwYXlsb2FkKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093bihlbmNvZGluZywgJyNlcnJvcicpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcGFzc1N0eWxlT2YocmVzdWx0KSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjb2RlRW50cnkgPSAoW2VuY29kZWROYW1lLCBlbmNvZGVkVmFsXSkgPT4ge1xuICAgICAgICAgIHR5cGVvZiBlbmNvZGVkTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgUHJvcGVydHkgbmFtZSAke3EoXG4gICAgICAgICAgICAgIGVuY29kZWROYW1lLFxuICAgICAgICAgICAgKX0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgZW5jb2RlZE5hbWUuY2hhckF0KDApICE9PSAnIycgfHxcbiAgICAgICAgICAgIEZhaWxgVW5yZWNvZ25pemVkIHJlY29yZCB0eXBlICR7cShlbmNvZGVkTmFtZSl9OiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZE5hbWUpO1xuICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBEZWNvZGVkIHByb3BlcnR5IG5hbWUgJHtuYW1lfSBmcm9tICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgIHJldHVybiBbbmFtZSwgZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkVmFsKV07XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRlY29kZWRFbnRyaWVzID0gZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgWGBpbnRlcm5hbDogdW5yZWNvZ25pemVkIEpTT04gdHlwZW9mICR7cShcbiAgICAgICAgICAgIHR5cGVvZiBlbmNvZGluZyxcbiAgICAgICAgICApfTogJHtlbmNvZGluZ31gLFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEJ0Fem+QgAAvkIAACoAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iLCJwYXNzYWJsZUFzSnVzdGluIiwicXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLFgsRmFpbCxOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc1ByaW1pdGl2ZSxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFFDTEFTUyxtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIixbJGjNj19hID0+IChRQ0xBU1MgPSAkaM2PX2EpXV1dXSxbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtTdHJpbmdhYmxlUGF5bG9hZH0gZnJvbSAnc2VzJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0VuY29kaW5nfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBzdHJpbmdpZnk6IHF1b3RlIH0gPSBKU09OO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluZGVudGVyXG4gKiBAcHJvcGVydHkgeyhvcGVuQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IG9wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBsaW5lXG4gKiBAcHJvcGVydHkgeyh0b2tlbjogc3RyaW5nKSA9PiBudW1iZXJ9IG5leHRcbiAqIEBwcm9wZXJ0eSB7KGNsb3NlQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IGNsb3NlXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZG9uZVxuICovXG5cbi8qKlxuICogR2VuZXJvdXMgd2hpdGVzcGFjZSBmb3IgcmVhZGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlciA9ICgpID0+IHtcbiAgY29uc3Qgc3RyaW5ncyA9IFtdO1xuICBsZXQgbGV2ZWwgPSAwO1xuICBsZXQgbmVlZFNwYWNlID0gZmFsc2U7XG4gIGNvbnN0IGxpbmUgPSAoKSA9PiB7XG4gICAgbmVlZFNwYWNlID0gZmFsc2U7XG4gICAgcmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywgJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgb3Blbjogb3BlbkJyYWNrZXQgPT4ge1xuICAgICAgbGV2ZWwgKz0gMTtcbiAgICAgIGlmIChuZWVkU3BhY2UpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuICAgIH0sXG4gICAgbGluZSxcbiAgICBuZXh0OiB0b2tlbiA9PiB7XG4gICAgICBpZiAobmVlZFNwYWNlICYmIHRva2VuICE9PSAnLCcgJiYgdG9rZW4gIT09ICcpJykge1xuICAgICAgICBzdHJpbmdzLnB1c2goJyAnKTtcbiAgICAgIH1cbiAgICAgIG5lZWRTcGFjZSA9IHRydWU7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiAgICB9LFxuICAgIGNsb3NlOiBjbG9zZUJyYWNrZXQgPT4ge1xuICAgICAgYXNzZXJ0KGxldmVsID49IDEpO1xuICAgICAgbGV2ZWwgLT0gMTtcbiAgICAgIGxpbmUoKTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiAgICB9LFxuICAgIGRvbmU6ICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChsZXZlbCwgMCk7XG4gICAgICByZXR1cm4gc3RyaW5ncy5qb2luKCcnKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogSWYgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIG9uZSB0b2tlbiB0b2dldGhlciB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiAqIG9mIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhpcyBwYXR0ZXJuLCB0aGVuIHRoZSB0d28gdG9rZW5zIG11c3QgYmVcbiAqIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHRvIHByZXNlcnZlIHRoZWlyIG1lYW5pbmcuIE90aGVyd2lzZSB0aGVcbiAqIHdoaXRlc3BhY2UgaW4gdW5uZWNlc3NhcnkuXG4gKlxuICogVGhlIGA8IWAgYW5kIGAtPmAgY2FzZXMgcHJldmVudCB0aGUgYWNjaWRlbnRhbCBmb3JtYXRpb24gb2YgYW5cbiAqIGh0bWwtbGlrZSBjb21tZW50LiBJIGRvbid0IHRoaW5rIHRoZSBkb3VibGUgYW5nbGUgYnJhY2tldHMgYXJlIGFjdHVhbGx5XG4gKiBuZWVkZWQgYnV0IEkgaGF2ZW4ndCB0aG91Z2h0IGFib3V0IGl0IGVub3VnaCB0byByZW1vdmUgdGhlbS5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm4gPSAvXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qKlxuICogTWluaW11bSB3aGl0ZXNwYWNlIG5lZWRlZCB0byBwcmVzZXZlIG1lYW5pbmcuXG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlciA9ICgpID0+IHtcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3Qgc3RyaW5ncyA9IFtdO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBvcGVuOiBvcGVuQnJhY2tldCA9PiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpLFxuICAgIGxpbmU6ICgpID0+IHN0cmluZ3MubGVuZ3RoLFxuICAgIG5leHQ6IHRva2VuID0+IHtcbiAgICAgIGlmIChzdHJpbmdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSBzdHJpbmdzW3N0cmluZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzIC0tIGVycm9yKi9cbiAgICAgICAgaWYgKGxhc3QubGVuZ3RoID49IDEgJiYgdG9rZW4ubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICBjb25zdCBwYWlyID0gYCR7bGFzdFtsYXN0Lmxlbmd0aCAtIDFdfSR7dG9rZW5bMF19YDtcbiAgICAgICAgICBpZiAoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSkge1xuICAgICAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiAgICB9LFxuICAgIGNsb3NlOiBjbG9zZUJyYWNrZXQgPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEgJiYgc3RyaW5nc1tzdHJpbmdzLmxlbmd0aCAtIDFdID09PSAnLCcpIHtcbiAgICAgICAgc3RyaW5ncy5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiAgICB9LFxuICAgIGRvbmU6ICgpID0+IHN0cmluZ3Muam9pbignJyksXG4gIH0pO1xufTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuID0gL15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm4gPSAvXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGluZ1xuICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkSW5kZW50XG4gKiBAcGFyYW0ge2FueVtdfSBbc2xvdHNdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVUb0p1c3RpbiA9IChlbmNvZGluZywgc2hvdWxkSW5kZW50ID0gZmFsc2UsIHNsb3RzID0gW10pID0+IHtcbiAgLyoqXG4gKiBUaGUgZmlyc3QgcGFzcyBkb2VzIHNvbWUgaW5wdXQgdmFsaWRhdGlvbi5cbiAqIEl0cyBjb250cm9sIGZsb3cgc2hvdWxkIG1pcnJvciBgcmVjdXJgIGFzIGNsb3NlbHkgYXMgcG9zc2libGVcbiAqIGFuZCB0aGUgdHdvIHNob3VsZCBiZSBtYWludGFpbmVkIHRvZ2V0aGVyLiBUaGV5IG11c3QgdmlzaXQgZXZlcnl0aGluZ1xuICogaW4gdGhlIHNhbWUgb3JkZXIuXG4gKlxuICogVE9ETyBub3cgdGhhdCBpYmlkcyBhcmUgZ29uZSwgd2Ugc2hvdWxkIGZvbGQgdGhpcyBiYWNrIHRvZ2V0aGVyIGludG9cbiAqIG9uZSB2YWxpZGF0aW5nIHBhc3MuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgY29uc3QgcHJlcGFyZSA9IHJhd1RyZWUgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShyYXdUcmVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbiAgICBhc3NlcnQudHlwZW9mKHJhd1RyZWUsICdvYmplY3QnKTtcbiAgICBhc3NlcnQocmF3VHJlZSAhPT0gbnVsbCk7XG4gICAgaWYgKFFDTEFTUyBpbiByYXdUcmVlKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSByYXdUcmVlW1FDTEFTU107XG4gICAgICB0eXBlb2YgcWNsYXNzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBGYWlsYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbiAgICAgIGFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4gICAgICBzd2l0Y2ggKHJhd1RyZWVbJ0BxY2xhc3MnXSkge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdOYU4nOlxuICAgICAgICBjYXNlICdJbmZpbml0eSc6XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgIHR5cGVvZiBkaWdpdHMgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICAgIGNvbnN0IHN5bSA9IHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHN5bSwgJ3N5bWJvbCcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZih0YWcsICdzdHJpbmcnKTtcbiAgICAgICAgICBwcmVwYXJlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzbG90Jzoge1xuICAgICAgICAgIGNvbnN0IHsgaW5kZXgsIGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcbiAgICAgICAgICBOYXQoaW5kZXgpO1xuICAgICAgICAgIGlmIChpZmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKGlmYWNlLCAnc3RyaW5nJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoaWxiZXJ0Jzoge1xuICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgJ29yaWdpbmFsJyBpbiByYXdUcmVlIHx8XG4gICAgICAgICAgICBGYWlsYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbiAgICAgICAgICBwcmVwYXJlKG9yaWdpbmFsKTtcbiAgICAgICAgICBpZiAoJ3Jlc3QnIGluIHJhd1RyZWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNBcnJheShyZXN0KSkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoUUNMQVNTIGluIHJlc3QpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJlc3QpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIEZhaWxgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgIHByZXBhcmUocmVzdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUsIG1lc3NhZ2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgbmFtZSl9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG4gICAgICAgICAgdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBhc3NlcnQuZmFpbChYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCwgVHlwZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShyYXdUcmVlKSkge1xuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHJhd1RyZWU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHByZXBhcmUocmF3VHJlZVtpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyYXdUcmVlKTtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgfVxuICAgICAgICBwcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlSW5kZW50ZXIgPSBzaG91bGRJbmRlbnQgPyBtYWtlWWVzSW5kZW50ZXIgOiBtYWtlTm9JbmRlbnRlcjtcbiAgbGV0IG91dCA9IG1ha2VJbmRlbnRlcigpO1xuXG4gIC8qKlxuICogVGhpcyBpcyB0aGUgc2Vjb25kIHBhc3MgcmVjdXJzaW9uIGFmdGVyIHRoZSBmaXJzdCBwYXNzIGBwcmVwYXJlYC5cbiAqIFRoZSBmaXJzdCBwYXNzIGRpZCBzb21lIGlucHV0IHZhbGlkYXRpb24gc29cbiAqIGhlcmUgd2UgY2FuIHNhZmVseSBhc3N1bWUgZXZlcnl0aGluZyB0aG9zZSB0aGluZ3MgYXJlIHZhbGlkYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gIGNvbnN0IGRlY29kZSA9IHJhd1RyZWUgPT4ge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgcmV0dXJuIHJlY3VyKHJhd1RyZWUpO1xuICB9O1xuXG4gIGNvbnN0IGRlY29kZVByb3BlcnR5ID0gKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgb3V0LmxpbmUoKTtcbiAgICBpZiAobmFtZSA9PT0gJ19fcHJvdG9fXycpIHtcbiAgICAgIC8qIEphdmFTY3JpcHQgaW50ZXJwcmV0cyBge19fcHJvdG9fXzogeCwgLi4ufWAqL1xuICAgICAgLyogYXMgbWFraW5nIGFuIG9iamVjdCBpbmhlcml0aW5nIGZyb20gYHhgLCB3aGVyZWFzKi9cbiAgICAgIC8qIGluIEpTT04gaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgbmFtZS4gUHJlc2VydmUgdGhlKi9cbiAgICAgIC8qIEpTT04gbWVhbmluZy4qL1xuICAgICAgb3V0Lm5leHQoYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiAgICB9IGVsc2UgaWYgKGlkZW50UGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICBvdXQubmV4dChgJHtuYW1lfTpgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lm5leHQoYCR7cXVvdGUobmFtZSl9OmApO1xuICAgIH1cbiAgICBkZWNvZGUodmFsdWUpO1xuICAgIG91dC5uZXh0KCcsJyk7XG4gIH07XG5cbiAgLyoqXG4gKiBNb2RlbGVkIGFmdGVyIGBmdWxsUmV2aXZlYCBpbiBtYXJzaGFsLmpzXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICBjb25zdCByZWN1ciA9IHJhd1RyZWUgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShyYXdUcmVlKSkge1xuICAgICAgLyogcHJpbWl0aXZlcyBnZXQgcXVvdGVkKi9cbiAgICAgIHJldHVybiBvdXQubmV4dChxdW90ZShyYXdUcmVlKSk7XG4gICAgfVxuICAgIC8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuICAgIGFzc2VydC50eXBlb2YocmF3VHJlZSwgJ29iamVjdCcpO1xuICAgIGFzc2VydChyYXdUcmVlICE9PSBudWxsKTtcbiAgICBpZiAoUUNMQVNTIGluIHJhd1RyZWUpIHtcbiAgICAgIGNvbnN0IHFjbGFzcyA9IHJhd1RyZWVbUUNMQVNTXTtcbiAgICAgIGFzc2VydC50eXBlb2YocWNsYXNzLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuICAgICAgLyogU3dpdGNoaW5nIG9uIGBlbmNvZGVkW1FDTEFTU11gIChvciBhbnl0aGluZyBsZXNzIGRpcmVjdCwgbGlrZSovXG4gICAgICAvKiBgcWNsYXNzYCkgZG9lcyBub3QgZGlzY3JpbWluYXRlIHJhd1RyZWUgaW4gdHlwZXNjcmlwdEA0LjIuMyBhbmQqL1xuICAgICAgLyogZWFybGllci4qL1xuICAgICAgc3dpdGNoIChyYXdUcmVlWydAcWNsYXNzJ10pIHtcbiAgICAgICAgLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbiAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgY2FzZSAnTmFOJzpcbiAgICAgICAgY2FzZSAnSW5maW5pdHknOlxuICAgICAgICBjYXNlICctSW5maW5pdHknOiB7XG4gICAgICAgICAgLyogVGhlaXIgcWNsYXNzIGlzIHRoZWlyIGV4cHJlc3Npb24gc291cmNlLiovXG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YoZGlnaXRzLCAnc3RyaW5nJyk7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgLyogVE9ETyBkZXByZWNhdGVkLiBFdmVudHVhbGx5IHJlbW92ZS4qL1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dCgnU3ltYm9sLmFzeW5jSXRlcmF0b3InKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICAgIGNvbnN0IHN5bSA9IHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHN5bSwgJ3N5bWJvbCcpO1xuICAgICAgICAgIGNvbnN0IHJlZ2lzdGVyZWROYW1lID0gbmFtZUZvclBhc3NhYmxlU3ltYm9sKHN5bSk7XG4gICAgICAgICAgaWYgKHJlZ2lzdGVyZWROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gQXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbiAgICAgICAgICAgIGFzc2VydChtYXRjaCAhPT0gbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBzdWZmaXggPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIGFzc2VydChTeW1ib2xbc3VmZml4XSA9PT0gc3ltKTtcbiAgICAgICAgICAgIGFzc2VydChpZGVudFBhdHRlcm4udGVzdChzdWZmaXgpKTtcbiAgICAgICAgICAgIHJldHVybiBvdXQubmV4dChgU3ltYm9sLiR7c3VmZml4fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYHBhc3NhYmxlU3ltYm9sRm9yTmFtZSgke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHsgdGFnLCBwYXlsb2FkIH0gPSByYXdUcmVlO1xuICAgICAgICAgIG91dC5uZXh0KGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX1gKTtcbiAgICAgICAgICBvdXQubmV4dCgnLCcpO1xuICAgICAgICAgIGRlY29kZShwYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoJyknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3Nsb3QnOiB7XG4gICAgICAgICAgY29uc3QgeyBpZmFjZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IE51bWJlcihOYXQocmF3VHJlZS5pbmRleCkpO1xuICAgICAgICAgIGNvbnN0IG5lc3RlZFJlbmRlciA9IGFyZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRPdXQgPSBvdXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBvdXQgPSBtYWtlTm9JbmRlbnRlcigpO1xuICAgICAgICAgICAgICBkZWNvZGUoYXJnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG91dC5kb25lKCk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBvdXQgPSBvbGRPdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoaW5kZXggPCBzbG90cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkU2xvdCA9IG5lc3RlZFJlbmRlcihzbG90c1tpbmRleF0pO1xuICAgICAgICAgICAgcmV0dXJuIGlmYWNlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBvdXQubmV4dChgc2xvdFRvVmFsKCR7cmVuZGVyZWRTbG90fSlgKVxuICAgICAgICAgICAgICA6IG91dC5uZXh0KGBzbG90VG9WYWwoJHtyZW5kZXJlZFNsb3R9LCR7bmVzdGVkUmVuZGVyKGlmYWNlKX0pYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpZmFjZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IG91dC5uZXh0KGBzbG90KCR7aW5kZXh9KWApXG4gICAgICAgICAgICA6IG91dC5uZXh0KGBzbG90KCR7aW5kZXh9LCR7bmVzdGVkUmVuZGVyKGlmYWNlKX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdoaWxiZXJ0Jzoge1xuICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgb3V0Lm9wZW4oJ3snKTtcbiAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShRQ0xBU1MsIG9yaWdpbmFsKTtcbiAgICAgICAgICBpZiAoJ3Jlc3QnIGluIHJhd1RyZWUpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YocmVzdCwgJ29iamVjdCcpO1xuICAgICAgICAgICAgYXNzZXJ0KHJlc3QgIT09IG51bGwpO1xuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJlc3QpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBGYWlsYFByb3BlcnR5IG5hbWUgJHtxKFxuICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICApfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRlY29kZVByb3BlcnR5KG5hbWUsIHJlc3RbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgIGNhdXNlID0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXJyb3JzID0gdW5kZWZpbmVkLFxuICAgICAgICAgIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGNhdXNlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgZXJyb3IgY2F1c2Ugbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG4gICAgICAgICAgbmFtZSAhPT0gYEFnZ3JlZ2F0ZUVycm9yYCB8fFxuICAgICAgICAgICAgRmFpbGBBZ2dyZWdhdGVFcnJvciBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICBlcnJvcnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgRmFpbGBlcnJvciBlcnJvcnMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGAke25hbWV9KCR7cXVvdGUobWVzc2FnZSl9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG4gICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShyYXdUcmVlKSkge1xuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHJhd1RyZWU7XG4gICAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQubmV4dCgnW10nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dC5vcGVuKCdbJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBvdXQubGluZSgpO1xuICAgICAgICAgIGRlY29kZShyYXdUcmVlW2ldKTtcbiAgICAgICAgICBvdXQubmV4dCgnLCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ10nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogcmF3VHJlZSBpcyBhbiBgRW5jb2RpbmdSZWNvcmRgIHdoaWNoIG9ubHkgaGFzIHN0cmluZyBrZXlzLCovXG4gICAgICAvKiBidXQgc2luY2Ugb3duS2V5cyBpcyBub3QgZ2VuZXJpYywgaXQgY2FuJ3QgcHJvcGFnYXRlIHRoYXQqL1xuICAgICAgY29uc3QgbmFtZXMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAob3duS2V5cyhyYXdUcmVlKSk7XG4gICAgICBpZiAobmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQubmV4dCgne30nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dC5vcGVuKCd7Jyk7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgIGRlY29kZVByb3BlcnR5KG5hbWUsIHJhd1RyZWVbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHByZXBhcmUoZW5jb2RpbmcpO1xuICBkZWNvZGUoZW5jb2RpbmcpO1xuICByZXR1cm4gb3V0LmRvbmUoKTtcbn07JGjNj19vbmNlLmRlY29kZVRvSnVzdGluKGRlY29kZVRvSnVzdGluKTtcbmhhcmRlbihkZWNvZGVUb0p1c3Rpbik7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtib29sZWFufSBbc2hvdWxkSW5kZW50XVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuICAgICAgIGNvbnN0IHBhc3NhYmxlQXNKdXN0aW4gPSAocGFzc2FibGUsIHNob3VsZEluZGVudCA9IHRydWUpID0+IHtcbiAgbGV0IHNsb3RDb3VudCA9IDA7XG4gIC8qIFVzaW5nIHBvc3QtaW5jcmVtZW50IGJlbG93IG9ubHkgc28gdGhhdCB0aGUgaW5kZXhlcyBzdGFydCBhdCB6ZXJvKi9cbiAgLyogYW5kIHRoZSBgc2xvdENvdW50YCB2YXJpYWJsZSBjYW4gYmUgaW5pdGlhbGl6ZWQgdG8gYDBgIHJhdGhlciB0aGFuKi9cbiAgLyogYC0xYC4qL1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuICBjb25zdCBjb252ZXJ0VmFsVG9TbG90ID0gdmFsID0+IGBzJHtzbG90Q291bnQrK31gO1xuICBjb25zdCB7IHRvQ2FwRGF0YSB9ID0gbWFrZU1hcnNoYWwoY29udmVydFZhbFRvU2xvdCk7XG4gIGNvbnN0IHsgYm9keSwgc2xvdHMgfSA9IHRvQ2FwRGF0YShwYXNzYWJsZSk7XG4gIGNvbnN0IGVuY29kZWQgPSBKU09OLnBhcnNlKGJvZHkpO1xuICByZXR1cm4gZGVjb2RlVG9KdXN0aW4oZW5jb2RlZCwgc2hvdWxkSW5kZW50LCBzbG90cyk7XG59OyRozY9fb25jZS5wYXNzYWJsZUFzSnVzdGluKHBhc3NhYmxlQXNKdXN0aW4pO1xuaGFyZGVuKHBhc3NhYmxlQXNKdXN0aW4pO1xuXG4vKiBUaGUgZXhhbXBsZSBiZWxvdyBpcyB0aGUgYHBhdHQxYCB0ZXN0IGNhc2UgZnJvbSBgcXAtb24tcGF0dGVybi50ZXN0LmpzYC4qL1xuLyogUGxlYXNlIGNvLW1haW50YWluIHRoZSBmb2xsb3dpbmcgZG9jLWNvbW1lbnQgYW5kIHRoYXQgdGVzdCBtb2R1bGUuKi9cbi8qKlxuICogYHFwYCBmb3IgcXVvdGUgcGFzc2FibGUgYXMgYSBxdWFzaS1xdW90ZWQgSnVzdGluIGV4cHJlc3Npb24uXG4gKlxuICogQm90aCBgcWAgZnJvbSBgQGVuZG8vZXJyb3JzYCBhbmQgdGhpcyBgcXBgIGZyb20gYEBlbmRvL21hcnNoYWxgIGNhblxuICogYmUgdXNlZCB0b2dldGhlciB3aXRoIGBGYWlsYCwgYFhgLCBldGMgZnJvbSBgQGVuZG8vZXJyb3JzYCB0byBtYXJrXG4gKiBhIHN1YnN0aXR1dGlvbiB2YWx1ZSB0byBiZSBib3RoXG4gKiAtIHZpc3VhbGx5IHF1b3RlZCBpbiBzb21lIHVzZWZ1bCBtYW5uZXJcbiAqIC0gdW5yZWRhY3RlZFxuICpcbiAqIERpZmZlcmVuY2VzOlxuICogLSBnaXZlbiBhIHBhdHRlcm4gYE0uYW5kKE0uZ3RlKC0xMDApLCBNLmx0ZSgxMDApKWAsXG4gKiAgIGBgYGpzXG4gKiAgIGAke3EocGF0dCl9YFxuICogICBgYGBcbiAqICAgcHJvZHVjZXMgYFwiW21hdGNoOmFuZF1cImAsIHdoZXJlYXNcbiAqICAgYGBganNcbiAqICAgYCR7cXAocGF0dCl9YFxuICogICBgYGBcbiAqICAgcHJvZHVjZXMgcXVhc2ktcXVvdGVzIEp1c3RpbiBvZiB3aGF0IHdvdWxkIGJlIHBhc3NlZDpcbiAqICAgYGBganNcbiAqICAgYG1ha2VUYWdnZWQoXCJtYXRjaDphbmRcIiwgW1xuICogICAgIG1ha2VUYWdnZWQoXCJtYXRjaDpndGVcIiwgLTEwMCksXG4gKiAgICAgbWFrZVRhZ2dlZChcIm1hdGNoOmx0ZVwiLCAxMDApLFxuICogICBdKWBcbiAqICAgYGBgXG4gKiAtIGBxYCBpcyBsYXp5LCBtaW5pbWl6aW5nIHRoZSBjb3N0IGZvciB1c2luZyBpdCBpbiBhbiBlcnJvciB0aGF0J3MgbmV2ZXJcbiAqICAgbG9nZ2VkLiBVbmZvcnR1bmF0ZWx5LCBkdWUgdG8gbGF5ZXJpbmcgY29uc3RyYWludHMsIGBxcGAgaXMgbm90XG4gKiAgIGxhenksIGFsd2F5cyByZW5kZXJpbmcgdG8gcXVhc2ktcXVvdGVkIEp1c3RpbiBpbW1lZGlhdGVseS5cbiAqXG4gKiBTaW5jZSBKdXN0aW4gaXMgYSBzdWJzZXQgb2YgSGFyZGVuZWRKUywgbmVpdGhlciB0aGUgbmFtZSBgcXBgIG5vciB0aGVcbiAqIHJlbmRlcmVkIGZvcm0gbmVlZCB0byBtYWtlIGNsZWFyIHRoYXQgdGhlIHJlbmRlcmVkIGZvcm0gaXMgaW4gSnVzdGluIHJhdGhlclxuICogdGhhbiBIYXJkZW5lZEpTLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBheWxvYWRcbiAqIEByZXR1cm5zIHtTdHJpbmdhYmxlUGF5bG9hZH1cbiAqL1xuICAgICAgIGNvbnN0IHFwID0gcGF5bG9hZCA9PiBgXFxgJHtwYXNzYWJsZUFzSnVzdGluKGhhcmRlbihwYXlsb2FkKSwgdHJ1ZSl9XFxgYDskaM2PX29uY2UucXAocXApO1xuaGFyZGVuKHFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl0sInBhc3NhYmxlQXNKdXN0aW4iOlsicGFzc2FibGVBc0p1c3RpbiJdLCJxcCI6WyJxcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACrcYH4oQkAAKEJAAAtAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbInBhcnNlIiwic3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnICovXG5cbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90ID0gdmFsID0+XG4gIEZhaWxgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWwgPSAoc2xvdCwgX2lmYWNlKSA9PlxuICBGYWlsYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXIgPSBoYXJkZW4oe1xuICBnZXQ6IChfdGFyZ2V0LCBuYW1lLCBfcmVjZWl2ZXIpID0+IHtcbiAgICBpZiAobmFtZSA9PT0gJ2xlbmd0aCcpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG4gICAgdGhyb3cgRmFpbGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90IHBvc2l0aW9ucyAke25hbWV9YDtcbiAgfSxcbn0pO1xuXG4vKipcbiAqIGBmcmVlemVgIGJ1dCBub3QgYGhhcmRlbmAgdGhlIHByb3h5IHRhcmdldCBzbyBpdCByZW1haW5zIHRyYXBwaW5nLlxuICogVGh1cywgaXQgc2hvdWxkIG5vdCBiZSBzaGFyZWQgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvZG9jcy9wcmVwYXJpbmctZm9yLXN0YWJpbGl6ZS5tZFxuICovXG5jb25zdCBhcnJheVRhcmdldCA9IGZyZWV6ZSgvKiogQHR5cGUge2FueVtdfSAqLyAoW10pKTtcbmNvbnN0IGJhZEFycmF5ID0gbmV3IFByb3h5KGFycmF5VGFyZ2V0LCBiYWRBcnJheUhhbmRsZXIpO1xuXG5jb25zdCB7IHNlcmlhbGl6ZSwgdW5zZXJpYWxpemUgfSA9IG1ha2VNYXJzaGFsKFxuICBkb05vdENvbnZlcnRWYWxUb1Nsb3QsXG4gIGRvTm90Q29udmVydFNsb3RUb1ZhbCxcbiAge1xuICAgIGVycm9yVGFnZ2luZzogJ29mZicsXG4gICAgLyogVE9ETyBmaXggdGVzdHMgdG8gd29ya3Mgd2l0aCBzbWFsbGNhcHMuKi9cbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnY2FwZGF0YScsXG4gIH0sXG4pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gdmFsID0+IHNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjNj19vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBwYXJzZSA9IHN0ciA9PlxuICB1bnNlcmlhbGl6ZShcbiAgICAvKiBgZnJlZXplYCBidXQgbm90IGBoYXJkZW5gIHNpbmNlIHRoZSBgYmFkQXJyYXlgIHByb3h5IGFuZCBpdHMgdGFyZ2V0Ki9cbiAgICAvKiBtdXN0IHJlbWFpbiB0cmFwcGluZy4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2VzL2RvY3MvcHJlcGFyaW5nLWZvci1zdGFiaWxpemUubWQqL1xuICAgIGZyZWV6ZSh7XG4gICAgICBib2R5OiBzdHIsXG4gICAgICBzbG90czogYmFkQXJyYXksXG4gICAgfSksXG4gICk7JGjNj19vbmNlLnBhcnNlKHBhcnNlKTtcbmhhcmRlbihwYXJzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdpZnkiOlsic3RyaW5naWZ5Il0sInBhcnNlIjpbInBhcnNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGVYhbV8PwAAfD8AACMAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlTWFyc2hhbCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLHRvUGFzc2FibGVFcnJvcixYLEZhaWwscSxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixvYmplY3RNYXAsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcInRvUGFzc2FibGVFcnJvclwiLFskaM2PX2EgPT4gKHRvUGFzc2FibGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIixbJGjNj19hID0+IChRQ0xBU1MgPSAkaM2PX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLFskaM2PX2EgPT4gKG1ha2VFbmNvZGVUb0NhcERhdGEgPSAkaM2PX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsWyRozY9fYSA9PiAobWFrZURlY29kZUZyb21DYXBEYXRhID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIixbJGjNj19hID0+IChtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9ICRozY9fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIixbJGjNj19hID0+IChtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDb252ZXJ0U2xvdFRvVmFsLCBDb252ZXJ0VmFsVG9TbG90LCBGcm9tQ2FwRGF0YSwgTWFrZU1hcnNoYWxPcHRpb25zLCBUb0NhcERhdGF9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7UGFzc2FibGUsIFBhc3NhYmxlQ2FwLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7SW50ZXJmYWNlU3BlY30gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtFbmNvZGluZ30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuY29uc3QgeyBkZWZpbmVQcm9wZXJ0aWVzLCBoYXNPd24gfSA9IE9iamVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qKiBAdHlwZSB7Q29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFZhbFRvU2xvdEZuID0geCA9PiB4O1xuLyoqIEB0eXBlIHtDb252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkZWZhdWx0U2xvdFRvVmFsRm4gPSAoeCwgXykgPT4geDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgU2xvdFxuICogQHBhcmFtIHtDb252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBbY29udmVydFZhbFRvU2xvdF1cbiAqIEBwYXJhbSB7Q29udmVydFNsb3RUb1ZhbDxTbG90Pn0gW2NvbnZlcnRTbG90VG9WYWxdXG4gKiBAcGFyYW0ge01ha2VNYXJzaGFsT3B0aW9uc30gb3B0aW9uc1xuICovXG4gICAgICAgY29uc3QgbWFrZU1hcnNoYWwgPSAoXG4gIGNvbnZlcnRWYWxUb1Nsb3QgPSBkZWZhdWx0VmFsVG9TbG90Rm4sXG4gIGNvbnZlcnRTbG90VG9WYWwgPSBkZWZhdWx0U2xvdFRvVmFsRm4sXG4gIHtcbiAgICBlcnJvclRhZ2dpbmcgPSAnb24nLFxuICAgIG1hcnNoYWxOYW1lID0gJ2Fub24tbWFyc2hhbCcsXG4gICAgLyogVE9ETyBUZW1wb3JhcnkgaGFjay4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3ODAqL1xuICAgIGVycm9ySWROdW0gPSAxMDAwMCxcbiAgICAvKiBXZSBwcmVmZXIgdGhhdCB0aGUgY2FsbGVyIGluc3RlYWQgbG9nIHRvIHNvbWV3aGVyZSBoaWRkZW4qL1xuICAgIC8qIHRvIGJlIHJldmVhbGVkIHdoZW4gY29ycmVsYXRpbmcgd2l0aCB0aGUgcmVjZWl2ZWQgZXJyb3IuKi9cbiAgICBtYXJzaGFsU2F2ZUVycm9yID0gZXJyID0+XG4gICAgICBjb25zb2xlLmxvZygnVGVtcG9yYXJ5IGxvZ2dpbmcgb2Ygc2VudCBlcnJvcicsIGVyciksXG4gICAgLyogRGVmYXVsdCB0byAnY2FwZGF0YScgYmVjYXVzZSBpdCB3YXMgaW1wbGVtZW50ZWQgZmlyc3QuKi9cbiAgICAvKiBTb21ldGltZXMsIG9udG9nZW55IGRvZXMgcmVjYXBpdHVsYXRlIHBoeWxvZ2VueSA7KSovXG4gICAgc2VyaWFsaXplQm9keUZvcm1hdCA9ICdjYXBkYXRhJyxcbiAgfSA9IHt9LFxuKSA9PiB7XG4gIGFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsICdzdHJpbmcnKTtcbiAgZXJyb3JUYWdnaW5nID09PSAnb24nIHx8XG4gICAgZXJyb3JUYWdnaW5nID09PSAnb2ZmJyB8fFxuICAgIEZhaWxgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbiAgY29uc3QgbmV4dEVycm9ySWQgPSAoKSA9PiB7XG4gICAgZXJyb3JJZE51bSArPSAxO1xuICAgIHJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gIH07XG5cbiAgLyoqXG4gKiBAdHlwZSB7VG9DYXBEYXRhPFNsb3Q+fVxuICovXG4gIGNvbnN0IHRvQ2FwRGF0YSA9IHJvb3QgPT4ge1xuICAgIGNvbnN0IHNsb3RzID0gW107XG4gICAgLyogbWFwcyB2YWwgKHByb21pc2Ugb3IgcmVtb3RhYmxlKSB0byBpbmRleCBvZiBzbG90c1tdKi9cbiAgICBjb25zdCBzbG90TWFwID0gbmV3IE1hcCgpO1xuXG4gICAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlQ2FwfSBwYXNzYWJsZVxuICogQHJldHVybnMge3tpbmRleDogbnVtYmVyLCByZXBlYXQ6IGJvb2xlYW59fVxuICovXG4gICAgY29uc3QgZW5jb2RlU2xvdENvbW1vbiA9IHBhc3NhYmxlID0+IHtcbiAgICAgIGxldCBpbmRleCA9IHNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8qIFRPRE8gYXNzZXJ0IHRoYXQgaXQncyB0aGUgc2FtZSBpZmFjZSBhcyBiZWZvcmUqL1xuICAgICAgICBhc3NlcnQudHlwZW9mKGluZGV4LCAnbnVtYmVyJyk7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBpbmRleCwgcmVwZWF0OiB0cnVlIH0pO1xuICAgICAgfVxuXG4gICAgICBpbmRleCA9IHNsb3RzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNsb3QgPSBjb252ZXJ0VmFsVG9TbG90KHBhc3NhYmxlKTtcbiAgICAgIHNsb3RzLnB1c2goc2xvdCk7XG4gICAgICBzbG90TWFwLnNldChwYXNzYWJsZSwgaW5kZXgpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IGluZGV4LCByZXBlYXQ6IGZhbHNlIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIGlzRXJyb3JMaWtlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHVua25vd259IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX1cbiAqL1xuICAgIGNvbnN0IGVuY29kZUVycm9yQ29tbW9uID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmNvZGVSZWN1cihgJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGFzc2VydC50eXBlb2YobWVzc2FnZSwgJ3N0cmluZycpO1xuICAgICAgY29uc3QgbmFtZSA9IGVuY29kZVJlY3VyKGAke2Vyci5uYW1lfWApO1xuICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAvKiBUT0RPIE11c3QgZW5jb2RlIGBjYXVzZWAsIGBlcnJvcnNgLCBidXQqL1xuICAgICAgLyogb25seSBvbmNlIGFsbCBwb3NzaWJsZSBjb3VudGVycGFydHkgZGVjb2RlcnMgYXJlIHRvbGVyYW50IG9mKi9cbiAgICAgIC8qIHJlY2VpdmluZyB0aGVtLiovXG4gICAgICBpZiAoZXJyb3JUYWdnaW5nID09PSAnb24nKSB7XG4gICAgICAgIC8qIFdlIGRlbGliZXJhdGVseSBkbyBub3Qgc2hhcmUgdGhlIHN0YWNrLCBidXQgaXQgd291bGQqL1xuICAgICAgICAvKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4gICAgICAgIC8qIHByaXZpbGVnZWQgYWNjZXNzIHRvIHRoZSB0aHJvd2luZyBWYXQgY2FuIGNvcnJlbGF0ZSovXG4gICAgICAgIC8qIHRoZSBwcm9ibGVtIHdpdGggdGhlIHJlbW90ZSBWYXQgdGhhdCBnZXRzIHRoaXMqL1xuICAgICAgICAvKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4gICAgICAgIC8qIGlkZW50aWZpZXIgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIG1lc3NhZ2UsIHRvIGhlbHAqL1xuICAgICAgICAvKiB3aXRoIHRoZSBjb3JyZWxhdGlvbi4qL1xuICAgICAgICBjb25zdCBlcnJvcklkID0gZW5jb2RlUmVjdXIobmV4dEVycm9ySWQoKSk7XG4gICAgICAgIGFzc2VydC50eXBlb2YoZXJyb3JJZCwgJ3N0cmluZycpO1xuICAgICAgICBhbm5vdGF0ZUVycm9yKGVyciwgWGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbiAgICAgICAgbWFyc2hhbFNhdmVFcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgZXJyb3JJZCwgbWVzc2FnZSwgbmFtZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBtZXNzYWdlLCBuYW1lIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoc2VyaWFsaXplQm9keUZvcm1hdCA9PT0gJ2NhcGRhdGEnKSB7XG4gICAgICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGVDYXB9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuICAgICAgY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YSA9IChwYXNzYWJsZSwgaWZhY2UgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgcmVwZWF0IH0gPSBlbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuICAgICAgICBpZiAocmVwZWF0ID09PSB0cnVlIHx8IGlmYWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdzbG90JywgaW5kZXggfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnc2xvdCcsIGlmYWNlLCBpbmRleCB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLyoqIEB0eXBlIHsocHJvbWlzZTogUmVtb3RhYmxlT2JqZWN0LCBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZykgPT4gRW5jb2Rpbmd9ICovXG4gICAgICBjb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSAodmFsLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb0NhcERhdGEodmFsLCBnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuICAgICAgLyoqIEB0eXBlIHsocHJvbWlzZTogUHJvbWlzZSwgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmcpID0+IEVuY29kaW5nfSAqL1xuICAgICAgY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IChwcm9taXNlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbiAgICAgIC8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gaXNFcnJvckxpa2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbiAgICAgIGNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgICAgY29uc3QgZXJyRGF0YSA9IGVuY29kZUVycm9yQ29tbW9uKGVyciwgZW5jb2RlUmVjdXIpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdlcnJvcicsIC4uLmVyckRhdGEgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNvZGVUb0NhcERhdGEgPSBtYWtlRW5jb2RlVG9DYXBEYXRhKHtcbiAgICAgICAgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuICAgICAgICBlbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuICAgICAgICBlbmNvZGVFcnJvclRvQ2FwRGF0YSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlVG9DYXBEYXRhKHJvb3QpO1xuICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIGJvZHksXG4gICAgICAgIHNsb3RzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChzZXJpYWxpemVCb2R5Rm9ybWF0ID09PSAnc21hbGxjYXBzJykge1xuICAgICAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge1Bhc3NhYmxlQ2FwfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG4gICAgICBjb25zdCBlbmNvZGVTbG90VG9TbWFsbGNhcHMgPSAocHJlZml4LCBwYXNzYWJsZSwgaWZhY2UgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgcmVwZWF0IH0gPSBlbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuICAgICAgICAvKiBUT0RPIGV4cGxvcmUgcmVtb3ZpbmcgdGhpcyBzcGVjaWFsIGNhc2UqL1xuICAgICAgICBpZiAocmVwZWF0ID09PSB0cnVlIHx8IGlmYWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9LiR7aWZhY2V9YDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gKHJlbW90YWJsZSwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLCByZW1vdGFibGUsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSkpO1xuXG4gICAgICBjb25zdCBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSAocHJvbWlzZSwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9TbWFsbGNhcHMoJyYnLCBwcm9taXNlKTtcblxuICAgICAgY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyA9IChlcnIsIGVuY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckRhdGEgPSBlbmNvZGVFcnJvckNvbW1vbihlcnIsIGVuY29kZVJlY3VyKTtcbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5yZXN0IH0gPSBlcnJEYXRhO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgJyNlcnJvcic6IG1lc3NhZ2UsIC4uLnJlc3QgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNvZGVUb1NtYWxsY2FwcyA9IG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyh7XG4gICAgICAgIGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuICAgICAgICBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG4gICAgICAgIGVuY29kZUVycm9yVG9TbWFsbGNhcHMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVRvU21hbGxjYXBzKHJvb3QpO1xuICAgICAgY29uc3Qgc21hbGxjYXBzQm9keSA9IEpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIC8qIFZhbGlkIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYSB2YWxpZCBzaWduYWwqL1xuICAgICAgICAvKiBpbmRpY2F0aW5nIHNtYWxsY2FwcyBmb3JtYXQuKi9cbiAgICAgICAgYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbiAgICAgICAgc2xvdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogVGhlIGB0aHJvd2AgaXMgYSBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEFkZGVkIGZvciBjb25mdXNlZCBsaW50ZXJzLiovXG4gICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBzZXJpYWxpemVCb2R5Rm9ybWF0OiAke3Eoc2VyaWFsaXplQm9keUZvcm1hdCl9YDtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbWFrZUZ1bGxSZXZpdmUgPSBzbG90cyA9PiB7XG4gICAgLyoqIEB0eXBlIHtNYXA8bnVtYmVyLCBSZW1vdGFibGVPYmplY3QgfCBQcm9taXNlPn0gKi9cbiAgICBjb25zdCB2YWxNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICAvKipcbiAqIEBwYXJhbSB7e2lmYWNlPzogc3RyaW5nLCBpbmRleDogbnVtYmVyfX0gc2xvdERhdGFcbiAqIEByZXR1cm5zIHtSZW1vdGFibGVPYmplY3QgfCBQcm9taXNlfVxuICovXG4gICAgY29uc3QgZGVjb2RlU2xvdENvbW1vbiA9IHNsb3REYXRhID0+IHtcbiAgICAgIGNvbnN0IHsgaWZhY2UgPSB1bmRlZmluZWQsIGluZGV4LCAuLi5yZXN0IH0gPSBzbG90RGF0YTtcbiAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIEZhaWxgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbiAgICAgIGNvbnN0IGV4dGFudCA9IHZhbE1hcC5nZXQoaW5kZXgpO1xuICAgICAgaWYgKGV4dGFudCkge1xuICAgICAgICByZXR1cm4gZXh0YW50O1xuICAgICAgfVxuICAgICAgLyogVE9ETyBTRUNVUklUWSBIQVpBUkQ6IG11c3QgZW5mb2NlIHRoYXQgcmVtb3RhYmxlIHZzIHByb21pc2UqL1xuICAgICAgLyogaXMgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGVkIHN0cmluZy4qL1xuICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzW051bWJlcihOYXQoaW5kZXgpKV07XG4gICAgICBjb25zdCB2YWwgPSBjb252ZXJ0U2xvdFRvVmFsKHNsb3QsIGlmYWNlKTtcbiAgICAgIHZhbE1hcC5zZXQoaW5kZXgsIHZhbCk7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH07XG5cbiAgICAvKipcbiAqIEBwYXJhbSB7e1xuICogICBlcnJvcklkPzogc3RyaW5nLFxuICogICBtZXNzYWdlOiBzdHJpbmcsXG4gKiAgIG5hbWU6IHN0cmluZyxcbiAqICAgY2F1c2U6IHVua25vd24sXG4gKiAgIGVycm9yczogdW5rbm93bixcbiAqIH19IGVyckRhdGFcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBkZWNvZGVSZWN1clxuICogQHJldHVybnMge0Vycm9yfVxuICovXG4gICAgY29uc3QgZGVjb2RlRXJyb3JDb21tb24gPSAoZXJyRGF0YSwgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZXJyb3JJZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgY2F1c2UgPSB1bmRlZmluZWQsXG4gICAgICAgIGVycm9ycyA9IHVuZGVmaW5lZCxcbiAgICAgICAgLi4ucmVzdFxuICAgICAgfSA9IGVyckRhdGE7XG4gICAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMjA1MiovXG4gICAgICAvKiBjYXBEYXRhIGRvZXMgbm90IHRyYW5zZm9ybSBzdHJpbmdzLiBUaGUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGNhbGxzKi9cbiAgICAgIC8qIHRvIGBkZWNvZGVSZWN1cmAgYXJlIGZvciByZXVzZSBieSBvdGhlciBlbmNvZGluZ3MgdGhhdCBkbywqL1xuICAgICAgLyogc3VjaCBhcyBzbWFsbGNhcHMuKi9cbiAgICAgIGNvbnN0IGROYW1lID0gZGVjb2RlUmVjdXIobmFtZSk7XG4gICAgICBjb25zdCBkTWVzc2FnZSA9IGRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuICAgICAgLyogZXJyb3JJZCBpcyBhIGxhdGUgYWRkaXRpb24gc28gYmUgdG9sZXJhbnQgb2YgaXRzIGFic2VuY2UuKi9cbiAgICAgIGNvbnN0IGRFcnJvcklkID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChlcnJvcklkICYmIGRlY29kZVJlY3VyKGVycm9ySWQpKTtcbiAgICAgIGlmICh0eXBlb2YgZE5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkTWVzc2FnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgZE1lc3NhZ2UpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJDb25zdHJ1Y3RvciA9IGdldEVycm9yQ29uc3RydWN0b3IoZE5hbWUpIHx8IEVycm9yO1xuICAgICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgICAgZEVycm9ySWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gYFJlbW90ZSR7ZXJyQ29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgOiBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfSgke2RFcnJvcklkfSlgO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgZXJyb3JOYW1lLFxuICAgICAgICBzYW5pdGl6ZTogZmFsc2UsXG4gICAgICB9O1xuICAgICAgaWYgKGNhdXNlKSB7XG4gICAgICAgIG9wdGlvbnMuY2F1c2UgPSBkZWNvZGVSZWN1cihjYXVzZSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgIG9wdGlvbnMuZXJyb3JzID0gZGVjb2RlUmVjdXIoZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhd0Vycm9yID0gbWFrZUVycm9yKGRNZXNzYWdlLCBlcnJDb25zdHJ1Y3Rvciwgb3B0aW9ucyk7XG4gICAgICAvKiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBkZWNvZGVSZWN1ciByZXN0J3MgcHJvcGVydHkgbmFtZXMuKi9cbiAgICAgIC8qIFRoaXMgd291bGQgYmUgaW5jb25zaXN0ZW50IHdpdGggc21hbGxjYXBzJyBleHBlY3RlZCBoYW5kbGluZywqL1xuICAgICAgLyogYnV0IGlzIGZpbmUgaGVyZSBzaW5jZSBpdCBpcyBvbmx5IHVzZWQgZm9yIGBhbm5vdGF0ZUVycm9yYCwqL1xuICAgICAgLyogd2hpY2ggaXMgZm9yIGRpYWdub3N0aWMgaW5mbyB0aGF0IGlzIG90aGVyd2lzZSB1bm9ic2VydmFibGUuKi9cbiAgICAgIGNvbnN0IGRlc2NzID0gb2JqZWN0TWFwKHJlc3QsIGRhdGEgPT4gKHtcbiAgICAgICAgdmFsdWU6IGRlY29kZVJlY3VyKGRhdGEpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgfSkpO1xuICAgICAgZGVmaW5lUHJvcGVydGllcyhyYXdFcnJvciwgZGVzY3MpO1xuICAgICAgaGFyZGVuKHJhd0Vycm9yKTtcbiAgICAgIHJldHVybiB0b1Bhc3NhYmxlRXJyb3IocmF3RXJyb3IpO1xuICAgIH07XG5cbiAgICAvKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoKi9cbiAgICAvKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb24qL1xuICAgIC8qIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlKi9cbiAgICAvKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNCovXG4gICAgY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEgPSAocmF3VHJlZSwgX2RlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7IFtRQ0xBU1NdOiBfLCAuLi5zbG90RGF0YSB9ID0gcmF3VHJlZTtcbiAgICAgIHJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IChyYXdUcmVlLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyBbUUNMQVNTXTogXywgLi4uZXJyRGF0YSB9ID0gcmF3VHJlZTtcbiAgICAgIHJldHVybiBkZWNvZGVFcnJvckNvbW1vbihlcnJEYXRhLCBkZWNvZGVSZWN1cik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldml2ZUZyb21DYXBEYXRhID0gbWFrZURlY29kZUZyb21DYXBEYXRhKHtcbiAgICAgIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhOiBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICAgIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTogZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgICBkZWNvZGVFcnJvckZyb21DYXBEYXRhLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzID0gcHJlZml4ID0+IHtcbiAgICAgIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ0VuY29kaW5nXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gX2RlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlT2JqZWN0IHwgUHJvbWlzZX1cbiAqL1xuICAgICAgcmV0dXJuIChzdHJpbmdFbmNvZGluZywgX2RlY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGFzc2VydChzdHJpbmdFbmNvZGluZy5jaGFyQXQoMCkgPT09IHByZWZpeCk7XG4gICAgICAgIC8qIHNsb3RzOiAkc2xvdEluZGV4LmlmYWNlIG9yICRzbG90SW5kZXgqL1xuICAgICAgICBjb25zdCBpID0gc3RyaW5nRW5jb2RpbmcuaW5kZXhPZignLicpO1xuICAgICAgICBjb25zdCBpbmRleCA9IE51bWJlcihzdHJpbmdFbmNvZGluZy5zbGljZSgxLCBpIDwgMCA/IHVuZGVmaW5lZCA6IGkpKTtcbiAgICAgICAgLyogaSA8IDAgbWVhbnMgdGhlcmUgd2FzIG5vIGlmYWNlIGluY2x1ZGVkLiovXG4gICAgICAgIGNvbnN0IGlmYWNlID0gaSA8IDAgPyB1bmRlZmluZWQgOiBzdHJpbmdFbmNvZGluZy5zbGljZShpICsgMSk7XG4gICAgICAgIHJldHVybiBkZWNvZGVTbG90Q29tbW9uKHsgaWZhY2UsIGluZGV4IH0pO1xuICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbiAgICBjb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG4gICAgY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gKGVuY29kaW5nLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyAnI2Vycm9yJzogbWVzc2FnZSwgLi4ucmVzdEVyckRhdGEgfSA9IGVuY29kaW5nO1xuICAgICAgIWhhc093bihyZXN0RXJyRGF0YSwgJ21lc3NhZ2UnKSB8fFxuICAgICAgICBGYWlsYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0eSAke3EoJ21lc3NhZ2UnKX1gO1xuICAgICAgcmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKHsgbWVzc2FnZSwgLi4ucmVzdEVyckRhdGEgfSwgZGVjb2RlUmVjdXIpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXZpdmVGcm9tU21hbGxjYXBzID0gbWFrZURlY29kZUZyb21TbWFsbGNhcHMoe1xuICAgICAgLyogQHRzLWlnbm9yZSBYWFggU21hbGxDYXBzRW5jb2RpbmcqL1xuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbiAgICAgIC8qIEB0cy1pZ25vcmUgWFhYIFNtYWxsQ2Fwc0VuY29kaW5nKi9cbiAgICAgIGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhhcmRlbih7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0pO1xuICB9O1xuXG4gIC8qKlxuICogQHR5cGUge0Zyb21DYXBEYXRhPFNsb3Q+fVxuICovXG4gIGNvbnN0IGZyb21DYXBEYXRhID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyBib2R5LCBzbG90cyB9ID0gZGF0YTtcbiAgICB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuICAgIGlzQXJyYXkoZGF0YS5zbG90cykgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbiAgICBjb25zdCB7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0gPSBtYWtlRnVsbFJldml2ZShzbG90cyk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICAvKiBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGFuIHVuYW1iaWd1b3VzIHNpZ25hbC4qL1xuICAgIGlmIChib2R5LmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gYm9keS5zbGljZSgxKTtcbiAgICAgIGNvbnN0IGVuY29kaW5nID0gaGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xuICAgICAgcmVzdWx0ID0gaGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmF3VHJlZSA9IGhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbiAgICAgIHJlc3VsdCA9IGhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gICAgfVxuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzcqL1xuICAgIC8qIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpeGVkIG9uY2Ugd2UndmUgY29tcGxldGVkIHRoZSBzd2l0Y2gqL1xuICAgIC8qIHRvIHNtYWxsY2Fwcy4qL1xuICAgIGFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UGFzc2FibGVDYXB9ICovIChyZXN1bHQpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHRvQ2FwRGF0YSxcbiAgICBmcm9tQ2FwRGF0YSxcblxuICAgIC8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSovXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB0b0NhcERhdGEgKi9cbiAgICBzZXJpYWxpemU6IHRvQ2FwRGF0YSxcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIGZyb21DYXBEYXRhICovXG4gICAgdW5zZXJpYWxpemU6IGZyb21DYXBEYXRhLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIGivjHoWQAA6FkAACUAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZW5jb2RlUGFzc2FibGUuanMiXSwiZXhwb3J0cyI6WyJGdWxsUmFua0NvdmVyIiwiYXNzZXJ0UmFua1NvcnRlZCIsImNvbXBhcmF0b3JNaXJyb3JJbWFnZSIsImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVCeUNvZGVQb2ludHMiLCJjb21wYXJlTnVtZXJpY3MiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0ZW52LEZhaWwscSxnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldGVudiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJwYXNzU3R5bGVQcmVmaXhlc1wiLFskaM2PX2EgPT4gKHBhc3NTdHlsZVByZWZpeGVzID0gJGjNj19hKV1dLFtcInJlY29yZE5hbWVzXCIsWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsWyRozY9fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBQYXNzU3R5bGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKiBAaW1wb3J0IHtGdWxsQ29tcGFyZSwgUGFydGlhbENvbXBhcmUsIFBhcnRpYWxDb21wYXJpc29uLCBSYW5rQ29tcGFyZSwgUmFua0NvbXBhcmlzb24sIFJhbmtDb3Zlcn0gZnJvbSAnLi90eXBlcy5qcydcbiAqL1xuXG5jb25zdCB7IGlzTmFOOiBOdW1iZXJJc05hTiB9ID0gTnVtYmVyO1xuY29uc3QgeyBlbnRyaWVzLCBmcm9tRW50cmllcywgc2V0UHJvdG90eXBlT2YsIGlzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IEVORE9fUkFOS19TVFJJTkdTID0gZ2V0ZW52KCdFTkRPX1JBTktfU1RSSU5HUycsICd1dGYxNi1jb2RlLXVuaXQtb3JkZXInLCBbXG4gICd1bmljb2RlLWNvZGUtcG9pbnQtb3JkZXInLFxuICAnZXJyb3ItaWYtb3JkZXItY2hvaWNlLW1hdHRlcnMnLFxuXSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFua0NvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGdWxsQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbbnVtYmVyLCBudW1iZXJdfSBJbmRleENvdmVyXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIHVzZWQgYnkgSmF2YVNjcmlwdCdzIE1hcCBhbmQgU2V0XG4gKiBhYnN0cmFjdGlvbnMsIHdoZXJlIE5hTiBpcyB0aGUgc2FtZSBhcyBOYU4gYW5kIC0wIGlzIHRoZSBzYW1lIGFzXG4gKiAwLiBNYXJzaGFsIHNlcmlhbGl6ZXMgLTAgYXMgemVybywgc28gdGhlIHNlbWFudGljcyBvZiBvdXIgZGlzdHJpYnV0ZWRcbiAqIG9iamVjdCBzeXN0ZW0gZG9lcyBub3QgZGlzdGluZ3Vpc2ggMCBmcm9tIC0wLlxuICpcbiAqIGBzYW1lVmFsdWVaZXJvYCBpcyB0aGUgRWNtYVNjcmlwdCBzcGVjIG5hbWUgZm9yIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbixcbiAqIGJ1dCBUT0RPIHdlIG5lZWQgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIEFQSS5cbiAqXG4gKiBAcGFyYW0ge2FueX0geFxuICogQHBhcmFtIHthbnl9IHlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvID0gKHgsIHkpID0+IHggPT09IHkgfHwgaXMoeCwgeSk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGxlZnRcbiAqIEBwYXJhbSB7YW55fSByaWdodFxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG5jb25zdCB0cml2aWFsQ29tcGFyYXRvciA9IChsZWZ0LCByaWdodCkgPT5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5LCBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbiAgbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID09PSByaWdodCA/IDAgOiAxO1xuaGFyZGVuKHRyaXZpYWxDb21wYXJhdG9yKTtcblxuLyogQXBwYXJlbnRseSBlc2xpbnQgY29uZnVzZWQgYWJvdXQgd2hldGhlciB0aGUgZnVuY3Rpb24gY2FuIGV2ZXIgZXhpdCovXG4vKiB3aXRob3V0IGFuIGV4cGxpY2l0IHJldHVybi4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJucy1jaGVjayovXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBsZWZ0XG4gKiBAcGFyYW0ge3N0cmluZ30gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuICAgICAgIGNvbnN0IGNvbXBhcmVCeUNvZGVQb2ludHMgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgY29uc3QgbGVmdEl0ZXIgPSBsZWZ0W1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgY29uc3QgcmlnaHRJdGVyID0gcmlnaHRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgeyB2YWx1ZTogbGVmdENoYXIgfSA9IGxlZnRJdGVyLm5leHQoKTtcbiAgICBjb25zdCB7IHZhbHVlOiByaWdodENoYXIgfSA9IHJpZ2h0SXRlci5uZXh0KCk7XG4gICAgaWYgKGxlZnRDaGFyID09PSB1bmRlZmluZWQgJiYgcmlnaHRDaGFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAobGVmdENoYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLyogbGVmdCBpcyBhIHByZWZpeCBvZiByaWdodC4qL1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gZWxzZSBpZiAocmlnaHRDaGFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIHJpZ2h0IGlzIGEgcHJlZml4IG9mIGxlZnQuKi9cbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0Q29kZXBvaW50ID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChsZWZ0Q2hhci5jb2RlUG9pbnRBdCgwKSk7XG4gICAgY29uc3QgcmlnaHRDb2RlcG9pbnQgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJpZ2h0Q2hhci5jb2RlUG9pbnRBdCgwKSk7XG4gICAgaWYgKGxlZnRDb2RlcG9pbnQgPCByaWdodENvZGVwb2ludCkgcmV0dXJuIC0xO1xuICAgIGlmIChsZWZ0Q29kZXBvaW50ID4gcmlnaHRDb2RlcG9pbnQpIHJldHVybiAxO1xuICB9XG59OyRozY9fb25jZS5jb21wYXJlQnlDb2RlUG9pbnRzKGNvbXBhcmVCeUNvZGVQb2ludHMpO1xuaGFyZGVuKGNvbXBhcmVCeUNvZGVQb2ludHMpO1xuXG4vKipcbiAqIENvbXBhcmUgdHdvIHNhbWUtdHlwZSBudW1lcmljIHZhbHVlcywgcmV0dXJuaW5nIHJlc3VsdHMgY29uc2lzdGVudCB3aXRoXG4gKiBgY29tcGFyZVJhbmtgJ3MgXCJyYW5rIG9yZGVyXCIgKGkuZS4sIHRyZWF0aW5nIGJvdGggcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHplcm9cbiAqIGFzIGVxdWFsIGFuZCBwbGFjaW5nIE5hTiBhcyBzZWxmLWVxdWFsIGFmdGVyIGFsbCBvdGhlciBudW1iZXJzKS5cbiAqXG4gKiBAdGVtcGxhdGUge251bWJlciB8IGJpZ2ludH0gVFxuICogQHBhcmFtIHtUfSBsZWZ0XG4gKiBAcGFyYW0ge1R9IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cbiAgICAgICBjb25zdCBjb21wYXJlTnVtZXJpY3MgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xuICBpZiAobGVmdCA8IHJpZ2h0KSByZXR1cm4gLTE7XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbiAgaWYgKGxlZnQgPiByaWdodCkgcmV0dXJuIDE7XG4gIGlmIChOdW1iZXJJc05hTihsZWZ0KSA9PT0gTnVtYmVySXNOYU4ocmlnaHQpKSByZXR1cm4gMDtcbiAgaWYgKE51bWJlcklzTmFOKHJpZ2h0KSkgcmV0dXJuIC0xO1xuICBhc3NlcnQoTnVtYmVySXNOYU4obGVmdCkpO1xuICByZXR1cm4gMTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxQYXNzU3R5bGUsIHsgaW5kZXg6IG51bWJlciwgY292ZXI6IFJhbmtDb3ZlciB9Pn0gUGFzc1N0eWxlUmFua3NSZWNvcmRcbiAqLyRozY9fb25jZS5jb21wYXJlTnVtZXJpY3MoY29tcGFyZU51bWVyaWNzKTtcblxuY29uc3QgcGFzc1N0eWxlUmFua3MgPSAvKiogQHR5cGUge1Bhc3NTdHlsZVJhbmtzUmVjb3JkfSAqLyAoXG4gIGZyb21FbnRyaWVzKFxuICAgIGVudHJpZXMocGFzc1N0eWxlUHJlZml4ZXMpXG4gICAgICAvKiBTb3J0IGVudHJpZXMgYnkgYXNjZW5kaW5nIHByZWZpeCwgYXNzdW1pbmcgdGhhdCBhbGwgcHJlZml4ZXMgYXJlKi9cbiAgICAgIC8qIGxpbWl0ZWQgdG8gdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoVSswMDAwIHRocm91Z2ggVStGRkZGKSBhbmQqL1xuICAgICAgLyogdGh1cyBjb250YWluIG9ubHkgY29kZSB1bml0cyB0aGF0IGFyZSBlcXVpdmFsZW50IHRvIGNvZGUgcG9pbnRzLiovXG4gICAgICAvKiBJbiBwcmFjdGljZSwgdGhleSBhcmUgZW50aXJlbHkgcHJpbnRhYmxlIEFTQ0lJKi9cbiAgICAgIC8qICgweDIwIFNQQUNFIHRocm91Z2ggMHg3RSBUSUxERSkuKi9cbiAgICAgIC5zb3J0KChbX2xlZnRTdHlsZSwgbGVmdFByZWZpeGVzXSwgW19yaWdodFN0eWxlLCByaWdodFByZWZpeGVzXSkgPT4ge1xuICAgICAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLCByaWdodFByZWZpeGVzKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChbcGFzc1N0eWxlLCBwcmVmaXhlc10sIGluZGV4KSA9PiB7XG4gICAgICAgIC8qIFZlcmlmeSB0aGF0IGBwcmVmaXhlc2AgaXMgc29ydGVkLCBhbmQgY292ZXIgYWxsIHN0cmluZ3MgdGhhdCBzdGFydCovXG4gICAgICAgIC8qIHdpdGggYW55IG9mIGl0cyBjaGFyYWN0ZXJzLCBpLmUuKi9cbiAgICAgICAgLyogYWxsIHMgc3VjaCB0aGF0IHByZWZpeGVzLmF0KDApIOKJpCBzIDwgc3VjY2Vzc29yKHByZWZpeGVzLmF0KC0xKSkuKi9cbiAgICAgICAgcHJlZml4ZXMgPT09IHByZWZpeGVzLnNwbGl0KCcnKS5zb3J0KCkuam9pbignJykgfHxcbiAgICAgICAgICBGYWlsYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG4gICAgICAgIGNvbnN0IGNvdmVyID0gW1xuICAgICAgICAgIHByZWZpeGVzLmNoYXJBdCgwKSxcbiAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoIC0gMSkgKyAxKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIFtwYXNzU3R5bGUsIHsgaW5kZXgsIGNvdmVyIH1dO1xuICAgICAgfSksXG4gIClcbik7XG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcywgbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKipcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbiAgICAgICBjb25zdCBnZXRQYXNzU3R5bGVDb3ZlciA9IHBhc3NTdHlsZSA9PiBwYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRozY9fb25jZS5nZXRQYXNzU3R5bGVDb3ZlcihnZXRQYXNzU3R5bGVDb3Zlcik7XG5oYXJkZW4oZ2V0UGFzc1N0eWxlQ292ZXIpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFdlYWtTZXQ8UGFzc2FibGVbXT4+fVxuICovXG5jb25zdCBtZW1vT2ZTb3J0ZWQgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXJ0aWFsQ29tcGFyZX0gW2NvbXBhcmVSZW1vdGFibGVzXVxuICogQSBjb21wYXJhdG9yIGZvciBhc3NpZ25pbmcgYW4gaW50ZXJuYWwgb3JkZXIgdG8gcmVtb3RhYmxlcy5cbiAqIEl0IGRlZmF1bHRzIHRvIGEgZnVuY3Rpb24gdGhhdCBhbHdheXMgcmV0dXJucyBgTmFOYCwgbWVhbmluZyB0aGF0IGFsbFxuICogcmVtb3RhYmxlcyBhcmUgaW5jb21wYXJhYmxlIGFuZCBzaG91bGQgdGllIGZvciB0aGUgc2FtZSByYW5rIGJ5XG4gKiBzaG9ydC1jaXJjdWl0aW5nIHdpdGhvdXQgZnVydGhlciByZWZpbmVtZW50IChlLmcuLCBub3Qgb25seSBhcmUgYHIxYCBhbmQgYHIyYFxuICogdGllZCwgYnV0IHNvIGFyZSBgW3IxLCAwXWAgYW5kIGBbcjIsIFwieFwiXWApLlxuICogQHJldHVybnMge1JhbmtDb21wYXJhdG9yS2l0fVxuICovXG4gICAgICAgY29uc3QgbWFrZUNvbXBhcmF0b3JLaXQgPSAoY29tcGFyZVJlbW90YWJsZXMgPSAoX3gsIF95KSA9PiBOYU4pID0+IHtcbiAgLyoqIEB0eXBlIHtQYXJ0aWFsQ29tcGFyZX0gKi9cbiAgY29uc3QgY29tcGFyYXRvciA9IChsZWZ0LCByaWdodCkgPT4ge1xuICAgIGlmIChzYW1lVmFsdWVaZXJvKGxlZnQsIHJpZ2h0KSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IGxlZnRTdHlsZSA9IHBhc3NTdHlsZU9mKGxlZnQpO1xuICAgIGNvbnN0IHJpZ2h0U3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodCk7XG4gICAgaWYgKGxlZnRTdHlsZSAhPT0gcmlnaHRTdHlsZSkge1xuICAgICAgcmV0dXJuIGNvbXBhcmVOdW1lcmljcyhcbiAgICAgICAgcGFzc1N0eWxlUmFua3NbbGVmdFN0eWxlXS5pbmRleCxcbiAgICAgICAgcGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgsXG4gICAgICApO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzIC0tXG4gKiBXZSBrbm93IGBsZWZ0YCBhbmQgYHJpZ2h0YCBhcmUgY29tcGFyYWJsZS5cbiAqL1xuICAgIHN3aXRjaCAobGVmdFN0eWxlKSB7XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICAvKiBGb3IgZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCBhbGwgbWVtYmVycyBvZiB0aGF0IHBhc3NTdHlsZSBhcmUgdGllZCovXG4gICAgICAgIC8qIGZvciB0aGUgc2FtZSByYW5rLiovXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIC8qIFdpdGhpbiBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIHRoZSByYW5rIG9yZGVyaW5nIGFncmVlcyB3aXRoKi9cbiAgICAgICAgLyogSmF2YVNjcmlwdCdzIHJlbGF0aW9uYWwgb3BlcmF0b3JzIGA8YCBhbmQgYD5gLiovXG4gICAgICAgIHJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIHN3aXRjaCAoRU5ET19SQU5LX1NUUklOR1MpIHtcbiAgICAgICAgICBjYXNlICd1dGYxNi1jb2RlLXVuaXQtb3JkZXInOiB7XG4gICAgICAgICAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICd1bmljb2RlLWNvZGUtcG9pbnQtb3JkZXInOiB7XG4gICAgICAgICAgICByZXR1cm4gY29tcGFyZUJ5Q29kZVBvaW50cyhsZWZ0LCByaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2Vycm9yLWlmLW9yZGVyLWNob2ljZS1tYXR0ZXJzJzoge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0MSA9IHRyaXZpYWxDb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDIgPSBjb21wYXJlQnlDb2RlUG9pbnRzKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICAgIHJlc3VsdDEgPT09IHJlc3VsdDIgfHxcbiAgICAgICAgICAgICAgRmFpbGBDb21wYXJpc29ucyBkaWZmZXJlZDogJHtsZWZ0fSB2cyAke3JpZ2h0fSwgJHtxKHJlc3VsdDEpfSB2cyAke3EocmVzdWx0Mil9YDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYFVuZXhwZWN0ZWQgRU5ET19SQU5LX1NUUklOR1MgJHtxKEVORE9fUkFOS19TVFJJTkdTKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihcbiAgICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG4gICAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sKHJpZ2h0KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVOdW1lcmljcyhsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvKiBMZXhpY29ncmFwaGljIGJ5IGludmVyc2Ugc29ydGVkIG9yZGVyIG9mIHByb3BlcnR5IG5hbWVzLCB0aGVuKi9cbiAgICAgICAgLyogbGV4aWNvZ3JhcGhpYyBieSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGF0IHNhbWUgaW52ZXJzZSovXG4gICAgICAgIC8qIG9yZGVyIG9mIHRoZWlyIHByb3BlcnR5IG5hbWVzLiBDb21wYXJpbmcgbmFtZXMgYnkgdGhlbXNlbHZlcyBmaXJzdCwqL1xuICAgICAgICAvKiBhbGwgcmVjb3JkcyB3aXRoIHRoZSBleGFjdCBzYW1lIHNldCBvZiBwcm9wZXJ0eSBuYW1lcyBzb3J0IG5leHQgdG8qL1xuICAgICAgICAvKiBlYWNoIG90aGVyIGluIGEgcmFuay1zb3J0IG9mIGNvcHlSZWNvcmRzLiovXG5cbiAgICAgICAgLyogVGhlIGNvcHlSZWNvcmQgaW52YXJpYW50cyBlbmZvcmNlZCBieSBwYXNzU3R5bGVPZiBlbnN1cmUgdGhhdCovXG4gICAgICAgIC8qIGFsbCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIHN0cmluZ3MuIFdlIG5lZWQgdGhlIHJldmVyc2Ugc29ydGVkIG9yZGVyKi9cbiAgICAgICAgLyogb2YgdGhlc2UgbmFtZXMsIHdoaWNoIHdlIHRoZW4gY29tcGFyZSBsZXhpY29ncmFwaGljYWxseS4gVGhpcyBlbnN1cmVzKi9cbiAgICAgICAgLyogdGhhdCBpZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFggYXJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiByZWNvcmQgWSwqL1xuICAgICAgICAvKiB0aGVuIHJlY29yZCBYIHdpbGwgaGF2ZSBhbiBlYXJsaWVyIHJhbmsgYW5kIHNvcnQgdG8gdGhlIGxlZnQgb2YgWS4qL1xuICAgICAgICBjb25zdCBsZWZ0TmFtZXMgPSByZWNvcmROYW1lcyhsZWZ0KTtcbiAgICAgICAgY29uc3QgcmlnaHROYW1lcyA9IHJlY29yZE5hbWVzKHJpZ2h0KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJhdG9yKGxlZnROYW1lcywgcmlnaHROYW1lcyk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlZnRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMobGVmdCwgbGVmdE5hbWVzKTtcbiAgICAgICAgY29uc3QgcmlnaHRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMocmlnaHQsIHJpZ2h0TmFtZXMpO1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0VmFsdWVzLCByaWdodFZhbHVlcyk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIC8qIExleGljb2dyYXBoaWMqL1xuICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdFtpXSwgcmlnaHRbaV0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyB3ZXJlIHRpZWQsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbiAgICAgICAgLyogSWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaGFzIGFuIGVhcmxpZXIgcmFuayB0aGFuIFkuKi9cbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICB9XG4gICAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICAgIC8qIEJ5dGVBcnJheXMgY29tcGFyZSBieSBzaG9ydGxleC4qL1xuICAgICAgICAvKiAtIGZpcnN0LCBpZiB0aGV5IGFyZSBvZiB1bmVxdWFsIGxlbmd0aCwgdGhlbiB0aGUgc2hvcnRlciBpcyBsZXNzLiovXG4gICAgICAgIC8qIC0gdGhlbiwgYW1vbmcgYnl0ZUFycmF5cyBvZiBlcXVhbCBsZW5ndGgsIGJ5IGxleGljb2dyYXBoaWMgY29tcGFyaXNvbiovXG4gICAgICAgIC8qIG9mIHRoZWlyIGJ5dGVzIGluIGFzY2VuZGluZyBvcmRlci4qL1xuICAgICAgICBjb25zdCB7IGJ5dGVMZW5ndGg6IGxlZnRMZW4gfSA9IGxlZnQ7XG4gICAgICAgIGNvbnN0IHsgYnl0ZUxlbmd0aDogcmlnaHRMZW4gfSA9IHJpZ2h0O1xuICAgICAgICBpZiAobGVmdExlbiA8IHJpZ2h0TGVuKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZWZ0TGVuID4gcmlnaHRMZW4pIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEFjY291bnQgZm9yIGdhcHMgaW4gdGhlIEBlbmRvL2ltbXV0YWJsZS1hcnJheWJ1ZmZlciBzaGltLiovXG4gICAgICAgIGNvbnN0IGxlZnRBcnJheSA9XG4gICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKGxlZnQpID09PSBBcnJheUJ1ZmZlci5wcm90b3R5cGVcbiAgICAgICAgICAgID8gbmV3IFVpbnQ4QXJyYXkobGVmdClcbiAgICAgICAgICAgIDogbmV3IFVpbnQ4QXJyYXkobGVmdC5zbGljZSgwKSk7XG4gICAgICAgIGNvbnN0IHJpZ2h0QXJyYXkgPVxuICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihyaWdodCkgPT09IEFycmF5QnVmZmVyLnByb3RvdHlwZVxuICAgICAgICAgICAgPyBuZXcgVWludDhBcnJheShyaWdodClcbiAgICAgICAgICAgIDogbmV3IFVpbnQ4QXJyYXkocmlnaHQuc2xpY2UoMCkpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlZnRMZW47IGkgKz0gMSkge1xuICAgICAgICAgIGNvbnN0IGxlZnRCeXRlID0gbGVmdEFycmF5W2ldO1xuICAgICAgICAgIGNvbnN0IHJpZ2h0Qnl0ZSA9IHJpZ2h0QXJyYXlbaV07XG4gICAgICAgICAgaWYgKGxlZnRCeXRlIDwgcmlnaHRCeXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChsZWZ0Qnl0ZSA+IHJpZ2h0Qnl0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAvKiBMZXhpY29ncmFwaGljIGJ5IGBbU3ltYm9sLnRvU3RyaW5nVGFnXWAgdGhlbiBgLnBheWxvYWRgLiovXG4gICAgICAgIGNvbnN0IGxhYmVsQ29tcCA9IGNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLCBnZXRUYWcocmlnaHQpKTtcbiAgICAgICAgaWYgKGxhYmVsQ29tcCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiBsYWJlbENvbXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IobGVmdC5wYXlsb2FkLCByaWdodC5wYXlsb2FkKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gIH07XG5cbiAgLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbiAgY29uc3Qgb3V0ZXJDb21wYXJhdG9yID0gKHgsIHkpID0+XG4gICAgLyogV2hlbiB0aGUgaW5uZXIgY29tcGFyYXRvciByZXR1cm5zIE5hTiB0byBpbmRpY2F0ZSBpbmNvbXBhcmFiaWxpdHksKi9cbiAgICAvKiByZXBsYWNlIHRoYXQgd2l0aCAwIHRvIGluZGljYXRlIGEgdGllLiovXG4gICAgLyoqIEB0eXBlIHtFeGNsdWRlPFBhcnRpYWxDb21wYXJpc29uLCBOYU4+fSAqLyAoY29tcGFyYXRvcih4LCB5KSB8fCAwKTtcblxuICAvKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuICBjb25zdCBhbnRpQ29tcGFyYXRvciA9ICh4LCB5KSA9PiBvdXRlckNvbXBhcmF0b3IoeSwgeCk7XG5cbiAgbWVtb09mU29ydGVkLnNldChvdXRlckNvbXBhcmF0b3IsIG5ldyBXZWFrU2V0KCkpO1xuICBtZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLCBuZXcgV2Vha1NldCgpKTtcbiAgY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQob3V0ZXJDb21wYXJhdG9yLCBhbnRpQ29tcGFyYXRvcik7XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLCBvdXRlckNvbXBhcmF0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBjb21wYXJhdG9yOiBvdXRlckNvbXBhcmF0b3IsIGFudGlDb21wYXJhdG9yIH0pO1xufTtcbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHJldHVybnMge1JhbmtDb21wYXJlPX1cbiAqLyRozY9fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG4gICAgICAgY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlID0gY29tcGFyYXRvciA9PlxuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLmdldChjb21wYXJhdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaM2PX29uY2UuY29tcGFyYXRvck1pcnJvckltYWdlKGNvbXBhcmF0b3JNaXJyb3JJbWFnZSk7XG4gICAgICAgY29uc3QgaXNSYW5rU29ydGVkID0gKHBhc3NhYmxlcywgY29tcGFyZSkgPT4ge1xuICBjb25zdCBzdWJNZW1vT2ZTb3J0ZWQgPSBtZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuICBhc3NlcnQoc3ViTWVtb09mU29ydGVkICE9PSB1bmRlZmluZWQpO1xuICBpZiAoc3ViTWVtb09mU29ydGVkLmhhcyhwYXNzYWJsZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcykgPT09ICdjb3B5QXJyYXknKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYXNzYWJsZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoY29tcGFyZShwYXNzYWJsZXNbaSAtIDFdLCBwYXNzYWJsZXNbaV0pID49IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3ViTWVtb09mU29ydGVkLmFkZChwYXNzYWJsZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn07JGjNj19vbmNlLmlzUmFua1NvcnRlZChpc1JhbmtTb3J0ZWQpO1xuaGFyZGVuKGlzUmFua1NvcnRlZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFJhbmtTb3J0ZWQgPSAoc29ydGVkLCBjb21wYXJlKSA9PlxuICBpc1JhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKSB8fFxuICAvKiBUT0RPIGFzc2VydCBvbiBidWcgY291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uIEZpeC4qL1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICBGYWlsYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLCBjb21wYXJlKX1gOyRozY9fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuICAgICAgIGNvbnN0IHNvcnRCeVJhbmsgPSAocGFzc2FibGVzLCBjb21wYXJlKSA9PiB7XG4gIC8qKiBAdHlwZSB7VFtdfSBtdXRhYmxlIGZvciBpbi1wbGFjZSBzb3J0aW5nLCBidXQgd2l0aCBoYXJkZW5lZCBlbGVtZW50cyAqL1xuICBsZXQgdW5zb3J0ZWQ7XG4gIGlmIChBcnJheS5pc0FycmF5KHBhc3NhYmxlcykpIHtcbiAgICBoYXJkZW4ocGFzc2FibGVzKTtcbiAgICAvKiBDYWxsaW5nIGlzUmFua1NvcnRlZCBnaXZlcyBpdCBhIGNoYW5jZSB0byBnZXQgbWVtb2l6ZWQgZm9yKi9cbiAgICAvKiB0aGlzIGBjb21wYXJlYCBmdW5jdGlvbiBldmVuIGlmIGl0IHdhcyBhbHJlYWR5IG1lbW9pemVkIGZvciBhIGRpZmZlcmVudCovXG4gICAgLyogYGNvbXBhcmVgIGZ1bmN0aW9uLiovXG4gICAgaWYgKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsIGNvbXBhcmUpKSB7XG4gICAgICByZXR1cm4gcGFzc2FibGVzO1xuICAgIH1cbiAgICB1bnNvcnRlZCA9IFsuLi5wYXNzYWJsZXNdO1xuICB9IGVsc2Uge1xuICAgIHVuc29ydGVkID0gQXJyYXkuZnJvbShwYXNzYWJsZXMsIGhhcmRlbik7XG4gIH1cbiAgY29uc3Qgc29ydGVkID0gdW5zb3J0ZWQuc29ydChjb21wYXJlKTtcbiAgLyogRm9yIHJldmVyc2UgY29tcGFyaXNvbiwgbW92ZSBgdW5kZWZpbmVkYCB2YWx1ZXMgZnJvbSB0aGUgZW5kIHRvIHRoZSBzdGFydC4qL1xuICAvKiBOb3RlIHRoYXQgcGFzc1N0eWxlUHJlZml4ZXMgKEBzZWUge0BsaW5rIC4vZW5jb2RlUGFzc2FibGUuanN9KSBNVVNUIE5PVCovXG4gIC8qIHNvcnQgYW55IGNhdGVnb3J5IGFmdGVyIGB1bmRlZmluZWRgLiovXG4gIGlmIChjb21wYXJlKHRydWUsIHVuZGVmaW5lZCkgPiAwKSB7XG4gICAgbGV0IGkgPSBzb3J0ZWQubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoaSA+PSAwICYmIHNvcnRlZFtpXSA9PT0gdW5kZWZpbmVkKSBpIC09IDE7XG4gICAgY29uc3QgbiA9IHNvcnRlZC5sZW5ndGggLSBpIC0gMTtcbiAgICBpZiAobiA+IDAgJiYgbiA8IHNvcnRlZC5sZW5ndGgpIHtcbiAgICAgIHNvcnRlZC5jb3B5V2l0aGluKG4sIDApO1xuICAgICAgc29ydGVkLmZpbGwoLyoqIEB0eXBlIHtUfSAqLyAodW5kZWZpbmVkKSwgMCwgbik7XG4gICAgfVxuICB9XG4gIGhhcmRlbihzb3J0ZWQpO1xuICBjb25zdCBzdWJNZW1vT2ZTb3J0ZWQgPSBtZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuICBhc3NlcnQoc3ViTWVtb09mU29ydGVkICE9PSB1bmRlZmluZWQpO1xuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG4gIHJldHVybiBzb3J0ZWQ7XG59OyRozY9fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKipcbiAqIFNlZVxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X3NlYXJjaF9hbGdvcml0aG0jUHJvY2VkdXJlX2Zvcl9maW5kaW5nX3RoZV9sZWZ0bW9zdF9lbGVtZW50XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHBhcmFtIHsoXCJsZWZ0TW9zdFwiIHwgXCJyaWdodE1vc3RcIik9fSBiaWFzXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByYW5rU2VhcmNoID0gKHNvcnRlZCwgY29tcGFyZSwga2V5LCBiaWFzID0gJ2xlZnRNb3N0JykgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKHNvcnRlZCwgY29tcGFyZSk7XG4gIGxldCBsZWZ0ID0gMDtcbiAgbGV0IHJpZ2h0ID0gc29ydGVkLmxlbmd0aDtcbiAgd2hpbGUgKGxlZnQgPCByaWdodCkge1xuICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKChsZWZ0ICsgcmlnaHQpIC8gMik7XG4gICAgY29uc3QgY29tcCA9IGNvbXBhcmUoc29ydGVkW21dLCBrZXkpO1xuICAgIGlmIChjb21wIDw9IC0xIHx8IChjb21wID09PSAwICYmIGJpYXMgPT09ICdyaWdodE1vc3QnKSkge1xuICAgICAgbGVmdCA9IG0gKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoY29tcCA+PSAxIHx8IChjb21wID09PSAwICYmIGJpYXMgPT09ICdsZWZ0TW9zdCcpKTtcbiAgICAgIHJpZ2h0ID0gbTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJpYXMgPT09ICdsZWZ0TW9zdCcgPyBsZWZ0IDogcmlnaHQgLSAxO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IHJhbmtDb3ZlclxuICogQHJldHVybnMge0luZGV4Q292ZXJ9XG4gKi9cbiAgICAgICBjb25zdCBnZXRJbmRleENvdmVyID0gKHNvcnRlZCwgY29tcGFyZSwgW2xlZnRLZXksIHJpZ2h0S2V5XSkgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKHNvcnRlZCwgY29tcGFyZSk7XG4gIGNvbnN0IGxlZnRJbmRleCA9IHJhbmtTZWFyY2goc29ydGVkLCBjb21wYXJlLCBsZWZ0S2V5LCAnbGVmdE1vc3QnKTtcbiAgY29uc3QgcmlnaHRJbmRleCA9IHJhbmtTZWFyY2goc29ydGVkLCBjb21wYXJlLCByaWdodEtleSwgJ3JpZ2h0TW9zdCcpO1xuICByZXR1cm4gW2xlZnRJbmRleCwgcmlnaHRJbmRleF07XG59OyRozY9fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiogQHR5cGUge1JhbmtDb3Zlcn0gKi9cbiAgICAgICBjb25zdCBGdWxsUmFua0NvdmVyID0gaGFyZGVuKFsnJywgJ3snXSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi8kaM2PX29uY2UuRnVsbFJhbmtDb3ZlcihGdWxsUmFua0NvdmVyKTtcbiAgICAgICBjb25zdCBjb3ZlcmVkRW50cmllcyA9IChzb3J0ZWQsIFtsZWZ0SW5kZXgsIHJpZ2h0SW5kZXhdKSA9PiB7XG4gIC8qKiBAdHlwZSB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn0gKi9cbiAgY29uc3QgaXRlcmFibGUgPSBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBsZXQgaSA9IGxlZnRJbmRleDtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKGkgPD0gcmlnaHRJbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHNvcnRlZFtpXTtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyB2YWx1ZTogW2ksIGVsZW1lbnRdLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZTtcbn07JGjNj19vbmNlLmNvdmVyZWRFbnRyaWVzKGNvdmVyZWRFbnRyaWVzKTtcbmhhcmRlbihjb3ZlcmVkRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtUfSBhXG4gKiBAcGFyYW0ge1R9IGJcbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCBtYXhSYW5rID0gKGNvbXBhcmUsIGEsIGIpID0+IChjb21wYXJlKGEsIGIpID49IDAgPyBhIDogYik7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtUfSBhXG4gKiBAcGFyYW0ge1R9IGJcbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCBtaW5SYW5rID0gKGNvbXBhcmUsIGEsIGIpID0+IChjb21wYXJlKGEsIGIpIDw9IDAgPyBhIDogYik7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG4gICAgICAgY29uc3QgdW5pb25SYW5rQ292ZXJzID0gKGNvbXBhcmUsIGNvdmVycykgPT4ge1xuICAvKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuICBjb25zdCB1bmlvblJhbmtDb3ZlclBhaXIgPSAoW2xlZnRBLCByaWdodEFdLCBbbGVmdEIsIHJpZ2h0Ql0pID0+IFtcbiAgICBtaW5SYW5rKGNvbXBhcmUsIGxlZnRBLCBsZWZ0QiksXG4gICAgbWF4UmFuayhjb21wYXJlLCByaWdodEEsIHJpZ2h0QiksXG4gIF07XG4gIHJldHVybiBjb3ZlcnMucmVkdWNlKHVuaW9uUmFua0NvdmVyUGFpciwgWyd7JywgJyddKTtcbn07JGjNj19vbmNlLnVuaW9uUmFua0NvdmVycyh1bmlvblJhbmtDb3ZlcnMpO1xuaGFyZGVuKHVuaW9uUmFua0NvdmVycyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG4gICAgICAgY29uc3QgaW50ZXJzZWN0UmFua0NvdmVycyA9IChjb21wYXJlLCBjb3ZlcnMpID0+IHtcbiAgLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbiAgY29uc3QgaW50ZXJzZWN0UmFua0NvdmVyUGFpciA9IChbbGVmdEEsIHJpZ2h0QV0sIFtsZWZ0QiwgcmlnaHRCXSkgPT4gW1xuICAgIG1heFJhbmsoY29tcGFyZSwgbGVmdEEsIGxlZnRCKSxcbiAgICBtaW5SYW5rKGNvbXBhcmUsIHJpZ2h0QSwgcmlnaHRCKSxcbiAgXTtcbiAgcmV0dXJuIGNvdmVycy5yZWR1Y2UoaW50ZXJzZWN0UmFua0NvdmVyUGFpciwgWycnLCAneyddKTtcbn07JGjNj19vbmNlLmludGVyc2VjdFJhbmtDb3ZlcnMoaW50ZXJzZWN0UmFua0NvdmVycyk7XG5cbiAgICAgICBjb25zdCB7IGNvbXBhcmF0b3I6IGNvbXBhcmVSYW5rLCBhbnRpQ29tcGFyYXRvcjogY29tcGFyZUFudGlSYW5rIH0gPVxuICBtYWtlQ29tcGFyYXRvcktpdCgpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNvbXBhcmF0b3Iga2l0IGluIHdoaWNoIHJlbW90YWJsZXMgYXJlIGZ1bGx5IG9yZGVyZWRcbiAqIGJ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBmaXJzdCBzZWVuIGJ5ICp0aGlzKiBjb21wYXJhdG9yIGtpdC5cbiAqIEJFV0FSRTogVGhpcyBpcyBvYnNlcnZhYmxlIG11dGFibGUgc3RhdGUsIHNvIHN1Y2ggYSBjb21wYXJhdG9yIGtpdFxuICogc2hvdWxkIG5ldmVyIGJlIHNoYXJlZCBhbW9uZyBzdWJzeXN0ZW1zIHRoYXQgc2hvdWxkIG5vdCBiZSBhYmxlXG4gKiB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBvcmRlciBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgZm9yIHN0b3JlXG4gKiBvcmRlcmluZywgc2luY2UgaXQgaGFzIG5vIG1lbW9yeSBvZiBkZWxldGVkIGtleXMuXG4gKlxuICogVGhlc2UgZnVsbCBvcmRlciBjb21wYXJhdG9yIGtpdCBpcyBzdHJpY3RseSBtb3JlIHByZWNpc2UgdGhhdCB0aGVcbiAqIHJhbmsgb3JkZXIgY29tcGFyYXRvciBraXRzIGFib3ZlLiBBcyBhIHJlc3VsdCwgYW55IGFycmF5IHdoaWNoIGlzXG4gKiBzb3J0ZWQgYnkgc3VjaCBhIGZ1bGwgb3JkZXIgd2lsbCBwYXNzIHRoZSBpc1JhbmtTb3J0ZWQgdGVzdCB3aXRoXG4gKiBhIGNvcnJlc3BvbmRpbmcgcmFuayBvcmRlci5cbiAqXG4gKiBBbiBhcnJheSB3aGljaCBpcyBzb3J0ZWQgYnkgYSAqZnJlc2gqIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgaS5lLixcbiAqIG9uZSB0aGF0IGhhcyBub3QgeWV0IHNlZW4gYW55IHJlbW90YWJsZXMsIHdpbGwgb2YgY291cnNlIHJlbWFpblxuICogc29ydGVkIGJ5IGFjY29yZGluZyB0byAqdGhhdCogZnVsbCBvcmRlciBjb21wYXJhdG9yLiBBbiBhcnJheSAqb2ZcbiAqIHNjYWxhcnMqIHNvcnRlZCBieSBhIGZyZXNoIGZ1bGwgb3JkZXIgd2lsbCByZW1haW4gc29ydGVkIGV2ZW5cbiAqIGFjY29yZGluZyB0byBhIG5ldyBmcmVzaCBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIHNpbmNlIGl0IHdpbGwgc2VlXG4gKiB0aGUgcmVtb3RhYmxlcyBpbiB0aGUgc2FtZSBvcmRlciBhZ2Fpbi4gVW5mb3J0dW5hdGVseSwgdGhpcyBpc1xuICogbm90IHRydWUgb2YgYXJyYXlzIG9mIHBhc3NhYmxlcyBpbiBnZW5lcmFsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxvbmdMaXZlZFxuICogQHJldHVybnMge0Z1bGxDb21wYXJhdG9yS2l0fVxuICovJGjNj19vbmNlLmNvbXBhcmVSYW5rKGNvbXBhcmVSYW5rKTskaM2PX29uY2UuY29tcGFyZUFudGlSYW5rKGNvbXBhcmVBbnRpUmFuayk7XG4gICAgICAgY29uc3QgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAobG9uZ0xpdmVkID0gZmFsc2UpID0+IHtcbiAgbGV0IG51bVNlZW4gPSAwO1xuICAvKiBXaGVuIGR5bmFtaWNhbGx5IGNyZWF0ZWQgd2l0aCBzaG9ydCBsaWZldGltZXMgKHRoZSBkZWZhdWx0KSBhIFdlYWtNYXAqL1xuICAvKiB3b3VsZCBwZXJmb3JtIHBvb3JseSwgYW5kIHRoZSBsZWFrIGNyZWF0ZWQgYnkgYSBNYXAgb25seSBsYXN0cyBhcyBsb25nKi9cbiAgLyogYXMgdGhlIE1hcC4qL1xuICBjb25zdCBNYXBDb25zdHJ1Y3RvciA9IGxvbmdMaXZlZCA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbnN0IHNlZW4gPSBuZXcgTWFwQ29uc3RydWN0b3IoKTtcbiAgY29uc3QgdGFnID0gciA9PiB7XG4gICAgaWYgKHNlZW4uaGFzKHIpKSB7XG4gICAgICByZXR1cm4gc2Vlbi5nZXQocik7XG4gICAgfVxuICAgIG51bVNlZW4gKz0gMTtcbiAgICBzZWVuLnNldChyLCBudW1TZWVuKTtcbiAgICByZXR1cm4gbnVtU2VlbjtcbiAgfTtcbiAgY29uc3QgY29tcGFyZVJlbW90YWJsZXMgPSAoeCwgeSkgPT4gY29tcGFyZVJhbmsodGFnKHgpLCB0YWcoeSkpO1xuICByZXR1cm4gbWFrZUNvbXBhcmF0b3JLaXQoY29tcGFyZVJlbW90YWJsZXMpO1xufTskaM2PX29uY2UubWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xuaGFyZGVuKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvbXBhcmVCeUNvZGVQb2ludHMiOlsiY29tcGFyZUJ5Q29kZVBvaW50cyJdLCJjb21wYXJlTnVtZXJpY3MiOlsiY29tcGFyZU51bWVyaWNzIl0sImdldFBhc3NTdHlsZUNvdmVyIjpbImdldFBhc3NTdHlsZUNvdmVyIl0sIm1ha2VDb21wYXJhdG9yS2l0IjpbIm1ha2VDb21wYXJhdG9yS2l0Il0sImNvbXBhcmF0b3JNaXJyb3JJbWFnZSI6WyJjb21wYXJhdG9yTWlycm9ySW1hZ2UiXSwiaXNSYW5rU29ydGVkIjpbImlzUmFua1NvcnRlZCJdLCJhc3NlcnRSYW5rU29ydGVkIjpbImFzc2VydFJhbmtTb3J0ZWQiXSwic29ydEJ5UmFuayI6WyJzb3J0QnlSYW5rIl0sImdldEluZGV4Q292ZXIiOlsiZ2V0SW5kZXhDb3ZlciJdLCJGdWxsUmFua0NvdmVyIjpbIkZ1bGxSYW5rQ292ZXIiXSwiY292ZXJlZEVudHJpZXMiOlsiY292ZXJlZEVudHJpZXMiXSwidW5pb25SYW5rQ292ZXJzIjpbInVuaW9uUmFua0NvdmVycyJdLCJpbnRlcnNlY3RSYW5rQ292ZXJzIjpbImludGVyc2VjdFJhbmtDb3ZlcnMiXSwiY29tcGFyZVJhbmsiOlsiY29tcGFyZVJhbmsiXSwiY29tcGFyZUFudGlSYW5rIjpbImNvbXBhcmVBbnRpUmFuayJdLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCI6WyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAhAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOMQ3SNJDAAASQwAAB0AAABAZW5kby9uYXQtdjUuMS4zL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzTmF0LCduYW1lJyx7dmFsdWU6XCJpc05hdFwifSk7JGjNj19vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCduYW1lJyx7dmFsdWU6XCJOYXRcIn0pOyRozY9fb25jZS5OYXQoTmF0KTsvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSkge1xuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIGFsbGVnZWROdW0gPj0gMDtcbiAgfVxuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pICYmIGFsbGVnZWROdW0gPj0gMDtcbn1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pIHtcbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnYmlnaW50Jykge1xuICAgIGlmIChhbGxlZ2VkTnVtIDwgMG4pIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbGVnZWROdW07XG4gIH1cblxuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSkge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtcbiAgICB9XG4gICAgaWYgKGFsbGVnZWROdW0gPCAwKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gICAgfVxuICAgIHJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gIH1cblxuICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmAsXG4gICk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG5u3nM2CwAANgsAACAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvc3RyaW5nLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyIsImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIiwiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSIsImlzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZSIsImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIixudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2l0ZXItaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL2Vycm9yLmpzXCIsIFtdXSxbXCIuL3NyYy9yZW1vdGFibGUuanNcIiwgW11dLFtcIi4vc3JjL3N5bWJvbC5qc1wiLCBbXV0sW1wiLi9zcmMvc3RyaW5nLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOltbIm1hcEl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSxbImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiXV0sIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjpbWyJQQVNTX1NUWUxFIiwiUEFTU19TVFlMRSJdLFsiaXNPYmplY3QiLCJpc09iamVjdCJdLFsiaXNQcmltaXRpdmUiLCJpc1ByaW1pdGl2ZSJdLFsiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENoZWNrZXIiXSxbImdldFRhZyIsImdldFRhZyJdLFsiaGFzT3duUHJvcGVydHlPZiIsImhhc093blByb3BlcnR5T2YiXV0sIi4vc3JjL2Vycm9yLmpzIjpbWyJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLFsiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSJdXSwiLi9zcmMvcmVtb3RhYmxlLmpzIjpbWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl0sWyJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyIsImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIl1dLCIuL3NyYy9zeW1ib2wuanMiOltbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSxbImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIl0sWyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSxbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLFsidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJ1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdXSwiLi9zcmMvc3RyaW5nLmpzIjpbWyJpc1dlbGxGb3JtZWRTdHJpbmciLCJpc1dlbGxGb3JtZWRTdHJpbmciXSxbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRQYXNzYWJsZVN0cmluZyIsImFzc2VydFBhc3NhYmxlU3RyaW5nIl1dLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6W1sicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdLFsiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiXSxbImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGUiXSxbInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciJdLFsidG9UaHJvd2FibGUiLCJ0b1Rocm93YWJsZSJdXSwiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6W1sibWFrZVRhZ2dlZCIsIm1ha2VUYWdnZWQiXV0sIi4vc3JjL21ha2UtZmFyLmpzIjpbWyJSZW1vdGFibGUiLCJSZW1vdGFibGUiXSxbIkZhciIsIkZhciJdLFsiVG9GYXJGdW5jdGlvbiIsIlRvRmFyRnVuY3Rpb24iXSxbIkdFVF9NRVRIT0RfTkFNRVMiLCJHRVRfTUVUSE9EX05BTUVTIl1dLCIuL3NyYy90eXBlR3VhcmRzLmpzIjpbWyJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZWNvcmQiXSxbImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSJdLFsiYXNzZXJ0UmVtb3RhYmxlIiwiYXNzZXJ0UmVtb3RhYmxlIl0sWyJpc1JlbW90YWJsZSIsImlzUmVtb3RhYmxlIl0sWyJpc1JlY29yZCIsImlzUmVjb3JkIl0sWyJpc0NvcHlBcnJheSIsImlzQ29weUFycmF5Il0sWyJpc0F0b20iLCJpc0F0b20iXSxbImFzc2VydEF0b20iLCJhc3NlcnRBdG9tIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABOhW4jFQ0AABUNAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2J5dGVBcnJheS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJCeXRlQXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvciB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzLCBhcHBseSB9ID0gUmVmbGVjdDtcblxuLyogRGV0ZWN0cyB0aGUgcHJlc2VuY2Ugb2YgYSBpbW11dGFibGUgQXJyYXlCdWZmZXIgc3VwcG9ydCBpbiB0aGUgdW5kZXJseWluZyovXG4vKiBwbGF0Zm9ybSBhbmQgcHJvdmlkZXMgZWl0aGVyIHN1aXRhYmxlIHZhbHVlcyBmcm9tIHRoYXQgaW1wbGVtZW50YXRpb24gb3IqL1xuLyogdmFsdWVzIHRoYXQgd2lsbCBjb25zaXN0ZW50bHkgZGVueSB0aGF0IGltbXV0YWJsZSBBcnJheUJ1ZmZlcnMgZXhpc3QuKi9cbmNvbnN0IGFkYXB0SW1tdXRhYmxlQXJyYXlCdWZmZXIgPSAoKSA9PiB7XG4gIGNvbnN0IGFuQXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG5cbiAgLyogT24gcGxhdGZvcm1zIHRoYXQgZG8gbm90IHN1cHBvcnQgc2xpY2VUb0ltbXV0YWJsZSwgcGFzcy1zdHlsZSBieXRlQXJyYXkqL1xuICAvKiBjYW5ub3QgYmUgY29uc3RydWN0ZWQuKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBUT0RPIFRoaXMgZXJyb3Igd2lsbCBiZSBhZGRyZXNzZWQgd2hlbiB1cGRhdGluZyovXG4gIC8qIFR5cGVTY3JpcHQncyBuYXRpdmUgdHlwZXMgdG8gYSB2ZXJzaW9uIHJlY29nbml6aW5nIHRoZSB1cGNvbWluZyBzdGFuZGFyZC4qL1xuICBpZiAoYW5BcnJheUJ1ZmZlci5zbGljZVRvSW1tdXRhYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGU6IG51bGwsXG4gICAgICBpbW11dGFibGVHZXR0ZXI6ICgpID0+IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvKiBAdHMtZXhwZWN0LWVycm9yIFRPRE8gVGhpcyBlcnJvciB3aWxsIGJlIGFkZHJlc3NlZCB3aGVuIHVwZGF0aW5nKi9cbiAgLyogVHlwZVNjcmlwdCdzIG5hdGl2ZSB0eXBlcyB0byBhIHZlcnNpb24gcmVjb2duaXppbmcgdGhlIHVwY29taW5nIHN0YW5kYXJkLiovXG4gIGNvbnN0IGFuSW1tdXRhYmxlQXJyYXlCdWZmZXIgPSBhbkFycmF5QnVmZmVyLnNsaWNlVG9JbW11dGFibGUoKTtcblxuICAvKipcbiAqIEFzIHByb3Bvc2VkLCB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgYEFycmF5QnVmZmVyLnByb3RvdHlwZWAuIEFzIHNoaW1tZWQsXG4gKiB0aGlzIHdpbGwgYmUgYSBoaWRkZW4gaW50cmluc2ljIHRoYXQgaW5oZXJpdHMgZnJvbSBgQXJyYXlCdWZmZXIucHJvdG90eXBlYC5cbiAqIEVpdGhlciB3YXksIGdldCB0aGlzIGluIGEgd2F5IHRoYXQgd2UgY2FuIHRydXN0IGl0IGFmdGVyIGxvY2tkb3duLCBhbmRcbiAqIHJlcXVpcmUgdGhhdCBhbGwgaW1tdXRhYmxlIEFycmF5QnVmZmVycyBkaXJlY3RseSBpbmhlcml0IGZyb20gaXQuXG4gKi9cbiAgY29uc3QgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbkltbXV0YWJsZUFycmF5QnVmZmVyKTtcblxuICBjb25zdCBpbW11dGFibGVHZXR0ZXIgPSAvKiogQHR5cGUgeyh0aGlzOiBBcnJheUJ1ZmZlcikgPT4gYm9vbGVhbn0gKi8gKFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyB0aGUgZGVzY2lwdG9yIGlzIHRoZXJlLiovXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlLCAnaW1tdXRhYmxlJykuZ2V0XG4gICk7XG5cbiAgcmV0dXJuIHsgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUsIGltbXV0YWJsZUdldHRlciB9O1xufTtcblxuY29uc3QgeyBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSwgaW1tdXRhYmxlR2V0dGVyIH0gPVxuICBhZGFwdEltbXV0YWJsZUFycmF5QnVmZmVyKCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IEJ5dGVBcnJheUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2J5dGVBcnJheScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gICAgKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyICYmXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFRPRE8gSG93IGRvIEkgYWRkIGl0IHRvIHRoZSBBcnJheUJ1ZmZlciB0eXBlPyovXG4gICAgICBjYW5kaWRhdGUuaW1tdXRhYmxlKSB8fFxuICAgICghIWNoZWNrICYmIGNoZWNrKGZhbHNlLCBYYEltbXV0YWJsZSBBcnJheUJ1ZmZlciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgX3Bhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBNYWxmb3JtZWQgQnl0ZUFycmF5ICR7Y2FuZGlkYXRlfWAsIFR5cGVFcnJvcik7XG4gICAgYXBwbHkoaW1tdXRhYmxlR2V0dGVyLCBjYW5kaWRhdGUsIFtdKSB8fFxuICAgICAgRmFpbGBNdXN0IGJlIGFuIGltbXV0YWJsZSBBcnJheUJ1ZmZlcjogJHtjYW5kaWRhdGV9YDtcbiAgICBvd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoID09PSAwIHx8XG4gICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgWGBCeXRlQXJyYXlzIG11c3Qgbm90IGhhdmUgb3duIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWAsXG4gICAgICAgIFR5cGVFcnJvcixcbiAgICAgICk7XG4gIH0sXG59KTskaM2PX29uY2UuQnl0ZUFycmF5SGVscGVyKEJ5dGVBcnJheUhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCeXRlQXJyYXlIZWxwZXIiOlsiQnl0ZUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJmnvdIICAAACAgAACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvY29weUFycmF5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5QXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLGFzc2VydENoZWNrZXIsZ2V0T3duRGF0YURlc2NyaXB0b3I7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSwgcHJvdG90eXBlOiBhcnJheVByb3RvdHlwZSB9ID0gQXJyYXk7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBDb3B5QXJyYXlIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdjb3B5QXJyYXknLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIGlzQXJyYXkoY2FuZGlkYXRlKSB8fFxuICAgICghIWNoZWNrICYmIGNoZWNrKGZhbHNlLCBYYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSksXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gYXJyYXlQcm90b3R5cGUgfHxcbiAgICAgIGFzc2VydC5mYWlsKFhgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICAgIC8qIFNpbmNlIHdlJ3JlIGFscmVhZHkgZW5zdXJlZCBjYW5kaWRhdGUgaXMgYW4gYXJyYXksIGl0IHNob3VsZCBub3QgYmUqL1xuICAgIC8qIHBvc3NpYmxlIGZvciB0aGUgZm9sbG93aW5nIGdldCB0byBmYWlsLiovXG4gICAgY29uc3QgbGVuID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChcbiAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgJ2xlbmd0aCcsIGZhbHNlLCBhc3NlcnRDaGVja2VyKS52YWx1ZVxuICAgICk7XG4gICAgLyogVmFsaWRhdGUgdGhhdCBlYWNoIGluZGV4IHByb3BlcnR5IGlzIG93bi9kYXRhL2VudW1lcmFibGUqL1xuICAgIC8qIGFuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZSBpcyByZWN1cnNpdmVseSBwYXNzYWJsZS4qL1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIoXG4gICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgaSwgdHJ1ZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWUsXG4gICAgICApO1xuICAgIH1cbiAgICAvKiBFeHBlY3Qgb25lIGtleSBwZXIgaW5kZXggcGx1cyBvbmUgZm9yICdsZW5ndGgnLiovXG4gICAgb3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aCA9PT0gbGVuICsgMSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCwgVHlwZUVycm9yKTtcbiAgfSxcbn0pOyRozY9fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARy+6HWcLAABnCwAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3JlbW90YWJsZS5qcyJdLCJleHBvcnRzIjpbIkNvcHlSZWNvcmRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLGdldE93bkRhdGFEZXNjcmlwdG9yLENYLGNhbkJlTWV0aG9kOyRozY9faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcImNhbkJlTWV0aG9kXCIsWyRozY9fYSA9PiAoY2FuQmVNZXRob2QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGdldFByb3RvdHlwZU9mLCBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tPYmplY3RQcm90b3R5cGUgPSAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkgPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgICghIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUmVjb3JkcyBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gKVxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtQcm9wZXJ0eUtleX0ga2V5XG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQgPSAoY2FuZGlkYXRlLCBrZXksIHZhbHVlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICByZXR1cm4gKFxuICAgICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoIWNhbkJlTWV0aG9kKHZhbHVlKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgLyogVE9ETzogVXBkYXRlIG1lc3NhZ2Ugbm93IHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBcImltcGxpY2l0IFJlbW90YWJsZVwiLiovXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFJlY29yZHMgY2Fubm90IGNvbnRhaW4gbm9uLWZhciBmdW5jdGlvbnMgYmVjYXVzZSB0aGV5IG1heSBiZSBtZXRob2RzIG9mIGFuIGltcGxpY2l0IFJlbW90YWJsZTogJHtjYW5kaWRhdGV9YCkpXG4gICk7XG59O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG4gICAgICAgY29uc3QgQ29weVJlY29yZEhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2NvcHlSZWNvcmQnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoZWNrT2JqZWN0UHJvdG90eXBlKGNhbmRpZGF0ZSwgY2hlY2spICYmXG4gICAgICAvKiBSZWplY3QgYW55IGNhbmRpZGF0ZSB3aXRoIGEgc3ltYm9sLWtleWVkIHByb3BlcnR5IG9yIG1ldGhvZC1saWtlIHByb3BlcnR5Ki9cbiAgICAgIC8qIChzdWNoIGlucHV0IGlzIHBvdGVudGlhbGx5IGEgUmVtb3RhYmxlKS4qL1xuICAgICAgb3duS2V5cyhjYW5kaWRhdGUpLmV2ZXJ5KGtleSA9PlxuICAgICAgICBjaGVja1Byb3BlcnR5Q2FuQmVWYWxpZChjYW5kaWRhdGUsIGtleSwgY2FuZGlkYXRlW2tleV0sIGNoZWNrKSxcbiAgICAgIClcbiAgICApO1xuICB9LFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIC8qIFZhbGlkYXRlIHRoYXQgZWFjaCBvd24gcHJvcGVydHkgaGFzIGEgcmVjdXJzaXZlbHkgcGFzc2FibGUgYXNzb2NpYXRlZCovXG4gICAgLyogdmFsdWUgKHdlIGFscmVhZHkga25vdyBmcm9tIGNhbkJlVmFsaWQgdGhhdCB0aGUgb3RoZXIgY29uc3RyYWludHMgYXJlKi9cbiAgICAvKiBzYXRpc2ZpZWQpLiovXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSkge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gZ2V0T3duRGF0YURlc2NyaXB0b3IoXG4gICAgICAgIGNhbmRpZGF0ZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgYXNzZXJ0Q2hlY2tlcixcbiAgICAgICk7XG4gICAgICBwYXNzU3R5bGVPZlJlY3VyKHZhbHVlKTtcbiAgICB9XG4gIH0sXG59KTskaM2PX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACeOsLT2BkAANgZAAAuAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgscSxFLGlzUHJvbWlzZSxnZXRUYWcscGFzc1N0eWxlT2YsbWFrZVRhZ2dlZCxpc0F0b207JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcImlzQXRvbVwiLFskaM2PX2EgPT4gKGlzQXRvbSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UmVtb3RhYmxlQnJhbmR9IGZyb20gJ0BlbmRvL2V2ZW50dWFsLXNlbmQnO1xuICogQGltcG9ydCB7UGFzc2FibGUsIEJ5dGVBcnJheSwgQ29weVJlY29yZCwgQ29weUFycmF5LCBDb3B5VGFnZ2VkLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEN1cnJlbnRseSBjb3BpZWQgZnJvbSBAYWdvcmljL2ludGVybmFsIHV0aWxzLmpzLlxuICogVE9ETyBTaG91bGQgbWlncmF0ZSBoZXJlIGFuZCB0aGVuLCBpZiBuZWVkZWQsIHJlZXhwb3J0ZWQgdGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7IFtLZXlUeXBlIGluIGtleW9mIFRdOiBUW0tleVR5cGVdIH0gJiB7fX0gU2ltcGxpZnkgZmxhdHRlbiB0aGVcbiAqICAgdHlwZSBvdXRwdXQgdG8gaW1wcm92ZSB0eXBlIGhpbnRzIHNob3duIGluIGVkaXRvcnNcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy90eXBlLWZlc3QvYmxvYi9tYWluL3NvdXJjZS9zaW1wbGlmeS5kLnRzXG4gKi9cblxuLyoqXG4gKiBDdXJyZW50bHkgY29waWVkIGZyb20gQGFnb3JpYy9pbnRlcm5hbCB1dGlscy5qcy5cbiAqIFRPRE8gU2hvdWxkIG1pZ3JhdGUgaGVyZSBhbmQgdGhlbiwgaWYgbmVlZGVkLCByZWV4cG9ydGVkIHRoZXJlLlxuICpcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEN1cnJlbnRseSBjb3BpZWQgZnJvbSBAYWdvcmljL2ludGVybmFsIHV0aWxzLmpzLlxuICogVE9ETyBTaG91bGQgbWlncmF0ZSBoZXJlIGFuZCB0aGVuLCBpZiBuZWVkZWQsIHJlZXhwb3J0ZWQgdGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHR5cGVkZWYge3tcbiAqICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBDYWxsYWJsZSA/IFRbS10gOiBEZWVwbHlBd2FpdGVkPFRbS10+O1xuICogfX0gRGVlcGx5QXdhaXRlZE9iamVjdFxuICovXG5cbi8qKlxuICogQ3VycmVudGx5IGNvcGllZCBmcm9tIEBhZ29yaWMvaW50ZXJuYWwgdXRpbHMuanMuXG4gKiBUT0RPIFNob3VsZCBtaWdyYXRlIGhlcmUgYW5kIHRoZW4sIGlmIG5lZWRlZCwgcmVleHBvcnRlZCB0aGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyBQcm9taXNlTGlrZTxhbnk+XG4gKiAgICAgPyBBd2FpdGVkPFQ+XG4gKiAgICAgOiBUIGV4dGVuZHMgKFJlbW90YWJsZUJyYW5kPGFueSwgYW55PiB8IFJlbW90YWJsZU9iamVjdClcbiAqICAgICAgID8gVFxuICogICAgICAgOiBUIGV4dGVuZHMge31cbiAqICAgICAgICAgPyBTaW1wbGlmeTxEZWVwbHlBd2FpdGVkT2JqZWN0PFQ+PlxuICogICAgICAgICA6IEF3YWl0ZWQ8VD59IERlZXBseUF3YWl0ZWRcbiAqL1xuXG4vKipcbiAqIEdpdmVuIGEgUGFzc2FibGUgYHZhbGAgd2hvc2UgcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBtYXkgY29udGFpbiBsZWFmXG4gKiBwcm9taXNlcywgcmV0dXJuIGEgcHJvbWlzZSBmb3IgYSByZXBsYWNlbWVudCBQYXNzYWJsZSxcbiAqIHdoZXJlIHRoYXQgcmVwbGFjZW1lbnQgaXMgKmRlZXBseSBmdWxmaWxsZWQqLCBpLmUuLCBpdHNcbiAqIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiBhbnkgcHJvbWlzZXMuXG4gKlxuICogVGhpcyBpcyBhIGRlZXAgZm9ybSBvZiBgUHJvbWlzZS5hbGxgIHNwZWNpYWxpemVkIGZvciBQYXNzYWJsZXMuIEZvciBlYWNoXG4gKiBlbmNvdW50ZXJlZCBwcm9taXNlLCByZXBsYWNlIGl0IHdpdGggdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybSBvZlxuICogaXRzIGZ1bGZpbGxtZW50LlxuICogSWYgYW55IG9mIHRoZSBwcm9taXNlcyByZWplY3QsIHRoZW4gdGhlIHByb21pc2UgZm9yIHRoZSByZXBsYWNlbWVudFxuICogcmVqZWN0cy4gSWYgYW55IG9mIHRoZSBwcm9taXNlcyBuZXZlciBzZXR0bGUsIHRoZW4gdGhlIHByb21pc2UgZm9yXG4gKiB0aGUgcmVwbGFjZW1lbnQgbmV2ZXIgc2V0dGxlcy5cbiAqXG4gKiBJZiB0aGUgcmVwbGFjZW1lbnQgd291bGQgbm90IGJlIFBhc3NhYmxlLCBpLmUuLCBpZiBgdmFsYCBpcyBub3RcbiAqIFBhc3NhYmxlLCBvciBpZiBhbnkgb2YgdGhlIHRyYW5zaXRpdmUgcHJvbWlzZXMgZnVsZmlsbCB0byBzb21ldGhpbmdcbiAqIHRoYXQgaXMgbm90IFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIHJlamVjdHMuXG4gKlxuICogSWYgYHZhbGAgb3IgaXRzIHBhcnRzIGFyZSBub24ta2V5IFBhc3NhYmxlcyBvbmx5ICpiZWNhdXNlKiB0aGV5IGNvbnRhaW5cbiAqIHByb21pc2VzLCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtcyBvZiB2YWwgb3IgaXRzIHBhcnRzIG1heSBiZSBrZXlzLiBUaGlzXG4gKiBpcyBmb3IgdGhlIGhpZ2hlciBcIkBlbmRvL3BhdHRlcm5zXCIgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gdG8gZGV0ZXJtaW5lLFxuICogYmVjYXVzZSBpdCBkZWZpbmVzIHRoZSBgS2V5YCBub3Rpb24gaW4gcXVlc3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gW1Q9UGFzc2FibGVdXG4gKiBAcGFyYW0ge1R9IHZhbFxuICogQHJldHVybnMge1Byb21pc2U8RGVlcGx5QXdhaXRlZDxUPj59XG4gKi9cbiAgICAgICBjb25zdCBkZWVwbHlGdWxmaWxsZWQgPSBhc3luYyB2YWwgPT4ge1xuICAvKiBUT0RPIEZpZ3VyZSBvdXQgd2h5IHdlIG5lZWQgdGhlc2UgYXQtZXhwZWN0LWVycm9yIGRpcmVjdGl2ZXMgYmVsb3cqL1xuICAvKiBhbmQgZml4IGlmIHBvc3NpYmxlLiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTI1NyBtYXkgYmUgcmVsZXZhbnQuKi9cblxuICAvKiBJZiBgdmFsYCBpcyBub3QgUGFzc2FibGUsIGBpc0F0b21gIHdpbGwgcmV0dXJuIGZhbHNlIHJhdGhlciB0aGFuKi9cbiAgLyogdGhyb3dpbmcuKi9cbiAgaWYgKGlzQXRvbSh2YWwpKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7RGVlcGx5QXdhaXRlZDxUPn0gKi8gKHZhbCk7XG4gIH1cbiAgLyogaWYgYHZhbGAgaXMgYSBwcm9taXNlIGJ1dCBub3QgYSBwYXNzYWJsZSBwcm9taXNlLCBmb3IgZXhhbXBsZSwqL1xuICAvKiBiZWNhdXNlIGl0IGlzIG5vdCBoYXJkZW5lZCwgYGlzUHJvbWlzZWAgd2lsbCByZXR1cm4gdHJ1ZSwgd2hpY2ggaXMqL1xuICAvKiBvayBoZXJlIGJhY2F1c2Ugd2UgdW53cmFwIGl0IHRvIGl0cyBzZXR0bGVtZW50IGFuZCBkaXNwZW5zZSB3aXRoIHRoZSovXG4gIC8qIHByb21pc2UqL1xuICBpZiAoaXNQcm9taXNlKHZhbCkpIHtcbiAgICByZXR1cm4gRS53aGVuKHZhbCwgbm9ucCA9PiBkZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuICB9XG4gIC8qIElmIGB2YWxgIGlzIGFueSBvdGhlciBub24tUGFzc2FibGUsIHRoZSBgcGFzc1N0eWxlT2YodmFsKWAgd2lsbCB0aHJvdy4qL1xuICAvKiBTbyB0aGlzIGV4ZW1wdGlvbiBmb3Igbm9uLVBhc3NhYmxlIHByb21pc2VzIGlzIG9ubHkgZm9yIHRoZSB0b3AtbGV2ZWwuKi9cbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsKTtcbiAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgY29uc3QgcmVjID0gLyoqIEB0eXBlIHtDb3B5UmVjb3JkfSAqLyAodmFsKTtcbiAgICAgIGNvbnN0IG5hbWVzID0gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKG93bktleXMocmVjKSk7XG4gICAgICBjb25zdCB2YWxQcyA9IG5hbWVzLm1hcChuYW1lID0+IGRlZXBseUZ1bGZpbGxlZChyZWNbbmFtZV0pKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3Igbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnRGVlcGx5QXdhaXRlZDxUPicqL1xuICAgICAgcmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksIHZhbHMgPT5cbiAgICAgICAgaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLCBpKSA9PiBbbmFtZXNbaV0sIGNdKSkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgY29uc3QgYXJyID0gLyoqIEB0eXBlIHtDb3B5QXJyYXl9ICovICh2YWwpO1xuICAgICAgY29uc3QgdmFsUHMgPSBhcnIubWFwKHAgPT4gZGVlcGx5RnVsZmlsbGVkKHApKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3Igbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnRGVlcGx5QXdhaXRlZDxUPicqL1xuICAgICAgcmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksIHZhbHMgPT4gaGFyZGVuKHZhbHMpKTtcbiAgICB9XG4gICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgY29uc3QgYnl0ZUFycmF5ID0gLyoqIEB0eXBlIHtCeXRlQXJyYXl9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh2YWwpKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3Igbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnRGVlcGx5QXdhaXRlZDxUPicqL1xuICAgICAgcmV0dXJuIGJ5dGVBcnJheTtcbiAgICB9XG4gICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgY29uc3QgdGdkID0gLyoqIEB0eXBlIHtDb3B5VGFnZ2VkfSAqLyAodmFsKTtcbiAgICAgIGNvbnN0IHRhZyA9IGdldFRhZyh0Z2QpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gRS53aGVuKGRlZXBseUZ1bGZpbGxlZCh0Z2QucGF5bG9hZCksIHBheWxvYWQgPT5cbiAgICAgICAgbWFrZVRhZ2dlZCh0YWcsIHBheWxvYWQpLFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgY29uc3QgcmVtID0gLyoqIEB0eXBlIHtSZW1vdGFibGVPYmplY3R9ICovICh2YWwpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gcmVtO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgIGNvbnN0IGVyciA9IC8qKiBAdHlwZSB7RXJyb3J9ICovICh2YWwpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgY29uc3QgcHJvbSA9IC8qKiBAdHlwZSB7UHJvbWlzZX0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHZhbCkpO1xuICAgICAgcmV0dXJuIEUud2hlbihwcm9tLCBub25wID0+IGRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IGFzc2VydC5mYWlsKFhgVW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCwgVHlwZUVycm9yKTtcbiAgICB9XG4gIH1cbn07JGjNj19vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGrLJkbNHQAAzR0AACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvZXJyb3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkVycm9ySGVscGVyIiwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyIsImdldEVycm9yQ29uc3RydWN0b3IiLCJpc0Vycm9yTGlrZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsYXNzZXJ0Q2hlY2tlcixDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqIEBpbXBvcnQge1Bhc3NTdHlsZUhlbHBlcn0gZnJvbSAnLi9pbnRlcm5hbC10eXBlcy5qcycgKi9cbi8qKiBAaW1wb3J0IHtDaGVja2VyLCBQYXNzU3R5bGUsIFBhc3NTdHlsZU9mfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IGdldFByb3RvdHlwZU9mLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBoYXNPd24sIGVudHJpZXMgfSA9IE9iamVjdDtcblxuLyogVE9ETzogTWFpbnRlbmFuY2UgaGF6YXJkOiBDb29yZGluYXRlIHdpdGggdGhlIGxpc3Qgb2YgZXJyb3JzIGluIHRoZSBTRVMqL1xuLyogd2hpbGVsaXN0LiovXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycyA9IG5ldyBNYXAoXG4gIC8qIENhc3QgYmVjYXVzZSBvdGhlcndpc2UgVFMgaXMgY29uZnVzZWQgYnkgQWdncmVnYXRlRXJyb3IqL1xuICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMjA0MiNkaXNjdXNzaW9uX3IxNDg0OTMzMDI4Ki9cbiAgLyoqIEB0eXBlIHtBcnJheTxbc3RyaW5nLCBJTVBPUlQoJ3NlcycpLkdlbmVyaWNFcnJvckNvbnN0cnVjdG9yXT59ICovXG4gIChbXG4gICAgWydFcnJvcicsIEVycm9yXSxcbiAgICBbJ0V2YWxFcnJvcicsIEV2YWxFcnJvcl0sXG4gICAgWydSYW5nZUVycm9yJywgUmFuZ2VFcnJvcl0sXG4gICAgWydSZWZlcmVuY2VFcnJvcicsIFJlZmVyZW5jZUVycm9yXSxcbiAgICBbJ1N5bnRheEVycm9yJywgU3ludGF4RXJyb3JdLFxuICAgIFsnVHlwZUVycm9yJywgVHlwZUVycm9yXSxcbiAgICBbJ1VSSUVycm9yJywgVVJJRXJyb3JdXG5cbiAgICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzU1MCovXG4gICAgLyogVG8gYWNjb21tb2RhdGUgcGxhdGZvcm1zIHByaW9yIHRvIEFnZ3JlZ2F0ZUVycm9yLCB3ZSBjb21tZW50IG91dCB0aGUqL1xuICAgIC8qIGZvbGxvd2luZyBsaW5lIGFuZCBpbnN0ZWFkIGNvbmRpdGlvbmFsbHkgYWRkIGl0IHRvIHRoZSBtYXAgYmVsb3cuKi9cbiAgICAvKiBbJ0FnZ3JlZ2F0ZUVycm9yJywgQWdncmVnYXRlRXJyb3JdLCovXG4gIF0pLFxuKTtcblxuaWYgKHR5cGVvZiBBZ2dyZWdhdGVFcnJvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLyogQ29uZGl0aW9uYWwsIHRvIGFjY29tbW9kYXRlIHBsYXRmb3JtcyBwcmlvciB0byBBZ2dyZWdhdGVFcnJvciovXG4gIGVycm9yQ29uc3RydWN0b3JzLnNldCgnQWdncmVnYXRlRXJyb3InLCBBZ2dyZWdhdGVFcnJvcik7XG59XG5cbi8qKlxuICogQmVjYXVzZSB0aGUgZXJyb3IgY29uc3RydWN0b3IgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBtaWdodCBiZVxuICogYEFnZ3JlZ2F0ZUVycm9yYCwgd2hpY2ggaGFzIGRpZmZlcmVudCBjb25zdHJ1Y3Rpb24gcGFyYW1ldGVyc1xuICogZnJvbSB0aGUgb3RoZXIgZXJyb3IgY29uc3RydWN0b3JzLCBkbyBub3QgdXNlIGl0IGRpcmVjdGx5IHRvIHRyeVxuICogdG8gbWFrZSBhbiBlcnJvciBpbnN0YW5jZS4gUmF0aGVyLCB1c2UgYG1ha2VFcnJvcmAgd2hpY2ggZW5jYXBzdWxhdGVzXG4gKiB0aGlzIG5vbi11bmlmb3JtaXR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7SU1QT1JUKCdzZXMnKS5HZW5lcmljRXJyb3JDb25zdHJ1Y3RvciB8IHVuZGVmaW5lZH1cbiAqL1xuICAgICAgIGNvbnN0IGdldEVycm9yQ29uc3RydWN0b3IgPSBuYW1lID0+IGVycm9yQ29uc3RydWN0b3JzLmdldChuYW1lKTskaM2PX29uY2UuZ2V0RXJyb3JDb25zdHJ1Y3RvcihnZXRFcnJvckNvbnN0cnVjdG9yKTtcbmhhcmRlbihnZXRFcnJvckNvbnN0cnVjdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tFcnJvckxpa2UgPSAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAvKiBUT0RPOiBOZWVkIGEgYmV0dGVyIHRlc3QgdGhhbiBpbnN0YW5jZW9mKi9cbiAgcmV0dXJuIChcbiAgICBjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvciB8fFxuICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBFcnJvciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YClcbiAgKTtcbn07XG5oYXJkZW4oY2hlY2tFcnJvckxpa2UpO1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBWYWxpZGF0aW5nIGVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlIHJhaXNlcyBhIHRlbnNpb24gYmV0d2VlbiBzZWN1cml0eVxuICogdnMgcHJlc2VydmluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBGb3IgZXJyb3JzLCB3ZSBuZWVkIHRvIHJlbWVtYmVyXG4gKiB0aGUgZXJyb3IgaXRzZWxmIGV4aXN0cyB0byBoZWxwIHVzIGRpYWdub3NlIGEgYnVnIHRoYXQncyBsaWtlbHkgbW9yZVxuICogcHJlc3NpbmcgdGhhbiBhIHZhbGlkaXR5IGJ1ZyBpbiB0aGUgZXJyb3IgaXRzZWxmLiBUaHVzLCB3aGVuZXZlciBpdCBpcyBzYWZlXG4gKiB0byBkbyBzbywgd2UgcHJlZmVyIHRvIGxldCB0aGUgZXJyb3ItbGlrZSB0ZXN0IHN1Y2NlZWQgYW5kIHRvIGNvdWNoIHRoZXNlXG4gKiBjb21wbGFpbnRzIGFzIG5vdGVzIG9uIHRoZSBlcnJvci5cbiAqXG4gKiBUbyByZXNvbHZlIHRoaXMsIHN1Y2ggYSBtYWxmb3JtZWQgZXJyb3Igb2JqZWN0IHdpbGwgc3RpbGwgcGFzc1xuICogYGlzRXJyb3JMaWtlYCBzbyBtYXJzaGFsIGNhbiB1c2UgdGhpcyBmb3IgdG9wIGxldmVsIGVycm9yIHRvIHJlcG9ydCBmcm9tLFxuICogZXZlbiBpZiBpdCB3b3VsZCBub3QgYWN0dWFsbHkgdmFsaWRhdGUuXG4gKiBJbnN0ZWFkLCB0aGUgZGlhZ25vc3RpY3MgdGhhdCBgYXNzZXJ0RXJyb3JgIHdvdWxkIGhhdmUgcmVwb3J0ZWQgYXJlXG4gKiBhdHRhY2hlZCBhcyBub3RlcyB0byB0aGUgbWFsZm9ybWVkIGVycm9yLiBUaHVzLCBhIG1hbGZvcm1lZFxuICogZXJyb3IgaXMgcGFzc2FibGUgYnkgaXRzZWxmLCBidXQgbm90IGFzIHBhcnQgb2YgYSBwYXNzYWJsZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgaXNFcnJvckxpa2UgPSBjYW5kaWRhdGUgPT4gY2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlKTskaM2PX29uY2UuaXNFcnJvckxpa2UoaXNFcnJvckxpa2UpO1xuaGFyZGVuKGlzRXJyb3JMaWtlKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcE5hbWVcbiAqIEBwYXJhbSB7UHJvcGVydHlEZXNjcmlwdG9yfSBkZXNjXG4gKiBAcGFyYW0geyh2YWw6IGFueSkgPT4gUGFzc1N0eWxlfSBwYXNzU3R5bGVPZlJlY3VyXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAoXG4gIHByb3BOYW1lLFxuICBkZXNjLFxuICBwYXNzU3R5bGVPZlJlY3VyLFxuICBjaGVjayA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAoZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgKX0gb3duIHByb3BlcnR5IG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7ZGVzY31gXG4gICAgKTtcbiAgfVxuICBpZiAoIWhhc093bihkZXNjLCAndmFsdWUnKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eTogJHtkZXNjfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHsgdmFsdWUgfSA9IGRlc2M7XG4gIHN3aXRjaCAocHJvcE5hbWUpIHtcbiAgICBjYXNlICdtZXNzYWdlJzpcbiAgICBjYXNlICdzdGFjayc6IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dmFsdWV9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ2NhdXNlJzoge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIHJldHVybiBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcih2YWx1ZSwgcGFzc1N0eWxlT2ZSZWN1ciwgY2hlY2spO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcnMnOiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpICE9PSAnY29weUFycmF5Jykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7dmFsdWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLmV2ZXJ5KGVyciA9PlxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIsIHBhc3NTdHlsZU9mUmVjdXIsIGNoZWNrKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgICEhY2hlY2sgJiZcbiAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnR5ICR7cShwcm9wTmFtZSl9YFxuICApO1xufTskaM2PX29uY2UuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuaGFyZGVuKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHsodmFsOiBhbnkpID0+IFBhc3NTdHlsZX0gcGFzc1N0eWxlT2ZSZWN1clxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yID0gKFxuICBjYW5kaWRhdGUsXG4gIHBhc3NTdHlsZU9mUmVjdXIsXG4gIGNoZWNrID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGlmICghY2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlLCBjaGVjaykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpO1xuICBjb25zdCB7IG5hbWUgfSA9IHByb3RvO1xuICBjb25zdCBlcnJDb25zdHJ1Y3RvciA9IGdldEVycm9yQ29uc3RydWN0b3IobmFtZSk7XG4gIGlmIChlcnJDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkIHx8IGVyckNvbnN0cnVjdG9yLnByb3RvdHlwZSAhPT0gcHJvdG8pIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goXG4gICAgICAgIGNoZWNrLFxuICAgICAgKWBQYXNzYWJsZSBFcnJvciBtdXN0IGluaGVyaXQgZnJvbSBhbiBlcnJvciBjbGFzcyAucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gXG4gICAgKTtcbiAgfVxuICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgaWYgKCEoJ21lc3NhZ2UnIGluIGRlc2NzKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2ssXG4gICAgICApYFBhc3NhYmxlIEVycm9yIG11c3QgaGF2ZSBhbiBvd24gXCJtZXNzYWdlXCIgc3RyaW5nIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzKGRlc2NzKS5ldmVyeSgoW3Byb3BOYW1lLCBkZXNjXSkgPT5cbiAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhcbiAgICAgIHByb3BOYW1lLFxuICAgICAgZGVzYyxcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIsXG4gICAgICBjaGVjayxcbiAgICApLFxuICApO1xufTskaM2PX29uY2UuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG4gICAgICAgY29uc3QgRXJyb3JIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdlcnJvcicsXG5cbiAgY2FuQmVWYWxpZDogY2hlY2tFcnJvckxpa2UsXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PlxuICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1ciwgYXNzZXJ0Q2hlY2tlciksXG59KTskaM2PX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIl0sImlzRXJyb3JMaWtlIjpbImlzRXJyb3JMaWtlIl0sImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIjpbImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIl0sImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIjpbImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIl0sIkVycm9ySGVscGVyIjpbIkVycm9ySGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHsGinp8CQAAfAkAACsAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvaXRlci1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4vbWFrZS1mYXIuanMiXSwiZXhwb3J0cyI6WyJmaWx0ZXJJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyOyRozY9faW1wb3J0cyhbW1wiLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCBhbmRcbiAqIGhhdmUgdGhlIHNhbWUgdGVybWluYXRpb24gLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZSBvciBmYWlsdXJlXG4gKiByZWFzb24uIEJ1dCB0aGUgbm9uLWZpbmFsIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbm9uLWZpbmFsXG4gKiB2YWx1ZXMgZnJvbSBgYmFzZUl0ZXJhdG9yYCBhcyB0cmFuc2Zvcm1lZCBieSBgZnVuY2AuXG4gKlxuICogQHRlbXBsYXRlIFQsVVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gVX0gZnVuY1xuICogQHJldHVybnMge0l0ZXJhYmxlPFU+fVxuICovXG4gICAgICAgY29uc3QgbWFwSXRlcmFibGUgPSAoYmFzZUl0ZXJhYmxlLCBmdW5jKSA9PlxuICAvKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuICBGYXIoJ21hcHBlZCBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZUl0ZXJhdG9yID0gYmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIHJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IGJhc2VWYWx1ZSwgZG9uZSB9ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRvbmUgPyBiYXNlVmFsdWUgOiBmdW5jKGJhc2VWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCBkb25lIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7JGjNj19vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYSBzdWJzZXQgb2YgdGhlIG5vbi1maW5hbCB2YWx1ZXMgZnJvbSB0aGVcbiAqIGBiYXNlSXRlcmF0b3JgIC0tLSB0aG9zZSBmb3Igd2hpY2ggYHByZWQodmFsdWUpYCB3YXMgdHJ1dGh5LiBUaGUgcmVzdWx0XG4gKiBoYXMgdGhlIHNhbWUgdGVybWluYXRpb24gYXMgdGhlIGBiYXNlSXRlcmF0b3JgIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWVcbiAqIG9yIGZhaWx1cmUgcmVhc29uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufSBwcmVkXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbiAgICAgICBjb25zdCBmaWx0ZXJJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIHByZWQpID0+XG4gIC8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG4gIEZhcignZmlsdGVyZWQgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VJdGVyYXRvciA9IGJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICByZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2VJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZG9uZSB8fCBwcmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pOyRozY9fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoSeMyfQlAAD0JQAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiR0VUX01FVEhPRF9OQU1FUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRNZXRob2ROYW1lcyxxLEZhaWwsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIixbJGjNj19hID0+IChhc3NlcnRJZmFjZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLFskaM2PX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UmVtb3RhYmxlQnJhbmR9IGZyb20gJ0BlbmRvL2V2ZW50dWFsLXNlbmQnICovXG4vKiogQGltcG9ydCB7SW50ZXJmYWNlU3BlYywgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgc2V0UHJvdG90eXBlT2YsXG4gIGNyZWF0ZSxcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxufSA9IE9iamVjdDtcblxuLyoqXG4gKiBOb3cgdGhhdCB0aGUgcmVtb3RhYmxlUHJvdG8gZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIGB0b1N0cmluZ2AgbWV0aG9kLFxuICogZW5zdXJlIGl0IGFsd2F5cyBpbmhlcml0cyBmcm9tIHNvbWV0aGluZy4gVGhlIG9yaWdpbmFsIHByb3RvdHlwZSBvZlxuICogYHJlbW90YWJsZWAgaWYgdGhlcmUgd2FzIG9uZSwgb3IgYE9iamVjdC5wcm90b3R5cGVgIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG8gPSAocmVtb3RhYmxlLCBpZmFjZSkgPT4ge1xuICBsZXQgb2xkUHJvdG8gPSBnZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuICBpZiAodHlwZW9mIHJlbW90YWJsZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAob2xkUHJvdG8gPT09IG51bGwpIHtcbiAgICAgIG9sZFByb3RvID0gb2JqZWN0UHJvdG90eXBlO1xuICAgIH1cbiAgICBvbGRQcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgICBGYWlsYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByZW1vdGFibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvbGRQcm90byAhPT0gbnVsbCB8fFxuICAgICAgRmFpbGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbiAgICBvbGRQcm90byA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIGdldFByb3RvdHlwZU9mKG9sZFByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIEZhaWxgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFxuICAgIGNyZWF0ZShvbGRQcm90bywge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAncmVtb3RhYmxlJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgfSksXG4gICk7XG59O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZSA9IGNhbmRpZGF0ZSA9PlxuICBSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBSZW1vdGFibGUuICBBZnRlciB0aGlzLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpXG4gKiByZXR1cm5zIGlmYWNlLlxuICpcbiAqIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvODA0XG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHRlbXBsYXRlIHtJbnRlcmZhY2VTcGVjfSBJXG4gKiBAcGFyYW0ge0l9IFtpZmFjZV0gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvclxuICogdGhlIHJlbW90YWJsZS4gRm9yIG5vdywgYSBzdHJpbmcgaWZhY2UgbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGhcbiAqIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiLCB0byBzZXJ2ZSBhcyB0aGUgYWxsZWdlZCBuYW1lLiBNb3JlXG4gKiBnZW5lcmFsIGlmYWNlcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZC4gVGhpcyBpcyB0ZW1wb3JhcnkuIFdlIGluY2x1ZGUgdGhlXG4gKiBcIkFsbGVnZWRcIiBvciBcIkRlYnVnTmFtZVwiIGFzIGEgcmVtaW5kZXIgdGhhdCB3ZSBkbyBub3QgeWV0IGhhdmUgU3dpbmdTZXRcbiAqIG9yIENvbW1zIFZhdFxuICogc3VwcG9ydCBmb3IgZW5zdXJpbmcgdGhpcyBpcyBhY2NvcmRpbmcgdG8gdGhlIHZhdCBob3N0aW5nIHRoZSBvYmplY3QuXG4gKiBDdXJyZW50bHksIEFsaWNlIGNhbiB0ZWxsIEJvYiBhYm91dCBDYXJvbCwgd2hlcmUgVmF0QSAob24gQWxpY2UncyBiZWhhbGYpXG4gKiBtaXNyZXByZXNlbnRzIENhcm9sJ3MgYGlmYWNlYC4gVmF0QiBhbmQgdGhlcmVmb3JlIEJvYiB3aWxsIHRoZW4gc2VlXG4gKiBDYXJvbCdzIGBpZmFjZWAgYXMgbWlzcmVwcmVzZW50ZWQgYnkgVmF0QS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSBbcHJvcHNdIEN1cnJlbnRseSBtYXkgb25seSBiZSB1bmRlZmluZWQuXG4gKiBUaGF0IHBsYW4gaXMgdGhhdCBvd24tcHJvcGVydGllcyBhcmUgY29waWVkIHRvIHRoZSByZW1vdGFibGVcbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlT2JqZWN0PEk+ICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fX0gcmVtb3RhYmxlLCBtb2RpZmllZCBmb3IgZGVidWdnYWJpbGl0eVxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlID0gKFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIEkgY291bGQgaGF2ZSBkaWZmZXJlbnQgc3VidHlwZSB0aGFuIHN0cmluZyovXG4gIGlmYWNlID0gJ1JlbW90YWJsZScsXG4gIHByb3BzID0gdW5kZWZpbmVkLFxuICByZW1vdGFibGUgPSAvKiogQHR5cGUge1R9ICovICh7fSksXG4pID0+IHtcbiAgYXNzZXJ0SWZhY2UoaWZhY2UpO1xuICBhc3NlcnQoaWZhY2UpO1xuICAvKiBUT0RPOiBXaGVuIGlmYWNlIGlzIHJpY2hlciB0aGFuIGp1c3Qgc3RyaW5nLCB3ZSBuZWVkIHRvIGdldCB0aGUgYWxsZWdlZE5hbWUqL1xuICAvKiBpbiBhIGRpZmZlcmVudCB3YXkuKi9cbiAgcHJvcHMgPT09IHVuZGVmaW5lZCB8fCBGYWlsYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuICAvKiBGYWlsIGZhc3Q6IGNoZWNrIHRoYXQgdGhlIHVubW9kaWZpZWQgb2JqZWN0IGlzIGFibGUgdG8gYmVjb21lIGEgUmVtb3RhYmxlLiovXG4gIGFzc2VydENhbkJlUmVtb3RhYmxlKHJlbW90YWJsZSk7XG5cbiAgLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IG1hcmtlZC4qL1xuICAhKFBBU1NfU1RZTEUgaW4gcmVtb3RhYmxlKSB8fFxuICAgIEZhaWxgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBhICR7cShcbiAgICAgIHJlbW90YWJsZVtQQVNTX1NUWUxFXSxcbiAgICApfWA7XG4gIC8qIGBpc0Zyb3plbmAgYWx3YXlzIHJldHVybnMgdHJ1ZSB3aXRoIGEgZmFrZSBgaGFyZGVuYCwgYnV0IHdlIHdhbnQgdGhhdCBjYXNlKi9cbiAgLyogdG8gc3VjY2VlZCBhbnl3YXkuIEZha2luZyBgaGFyZGVuYCBpcyBvbmx5IGNvcnJlY3RuZXNzIHByZXNlcnZpbmcqL1xuICAvKiBpZiB0aGUgY29kZSBpbiBxdWVzdGlvbiBjb250YWlucyBubyBidWdzIHRoYXQgdGhlIHJlYWwgYGhhcmRlbmAgd291bGQqL1xuICAvKiBoYXZlIGNhdWdodC4qL1xuICAvKiBAdHMtaWdub3JlIGBpc0Zha2VgIHB1cnBvc2VseSBub3QgaW4gdGhlIHR5cGUqL1xuICBoYXJkZW4uaXNGYWtlIHx8XG4gICAgLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IGZyb3plbi4qL1xuICAgICFpc0Zyb3plbihyZW1vdGFibGUpIHx8XG4gICAgRmFpbGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgZnJvemVuYDtcbiAgY29uc3QgcmVtb3RhYmxlUHJvdG8gPSBtYWtlUmVtb3RhYmxlUHJvdG8ocmVtb3RhYmxlLCBpZmFjZSk7XG5cbiAgLyogVGFrZSBhIHN0YXRpYyBjb3B5IG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGFzIGRhdGEgcHJvcGVydGllcy4qL1xuICAvKiBjb25zdCBwcm9wRGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHsgLi4ucHJvcHMgfSk7Ki9cbiAgY29uc3QgbXV0YXRlSGFyZGVuQW5kQ2hlY2sgPSB0YXJnZXQgPT4ge1xuICAgIC8qIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wRGVzY3MpOyovXG4gICAgc2V0UHJvdG90eXBlT2YodGFyZ2V0LCByZW1vdGFibGVQcm90byk7XG4gICAgaGFyZGVuKHRhcmdldCk7XG4gICAgYXNzZXJ0Q2FuQmVSZW1vdGFibGUodGFyZ2V0KTtcbiAgfTtcblxuICAvKiBGYWlsIGZhc3Q6IGNoZWNrIGEgZnJlc2ggcmVtb3RhYmxlIHRvIHNlZSBpZiBvdXIgcnVsZXMgZml0LiovXG4gIG11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuICAvKiBBY3R1YWxseSBmaW5pc2ggdGhlIG5ldyByZW1vdGFibGUuKi9cbiAgbXV0YXRlSGFyZGVuQW5kQ2hlY2socmVtb3RhYmxlKTtcblxuICAvKiBDT01NSVRURUQhKi9cbiAgLyogV2UncmUgY29tbWl0dGVkLCBzbyBrZWVwIHRoZSBpbnRlcmZhY2UgZm9yIGZ1dHVyZSByZWZlcmVuY2UuKi9cbiAgYXNzZXJ0KGlmYWNlICE9PSB1bmRlZmluZWQpOyAvKiBUbyBtYWtlIFR5cGVTY3JpcHQgaGFwcHkqL1xuICByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovIChyZW1vdGFibGUpO1xufTskaM2PX29uY2UuUmVtb3RhYmxlKFJlbW90YWJsZSk7XG5oYXJkZW4oUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgYXV0b21hdGljYWxseSBhZGRlZCBkZWZhdWx0IG1ldGEtbWV0aG9kIGZvciBvYnRhaW5pbmcgYVxuICogbGlzdCBvZiBhbGwgbWV0aG9kcyBvZiBhbiBvYmplY3QgZGVjbGFyZWQgd2l0aCBgRmFyYCwgb3IgYW4gb2JqZWN0IHRoYXRcbiAqIGluaGVyaXRzIGZyb20gYW4gb2JqZWN0IGRlY2xhcmVkIHdpdGggYEZhcmAuXG4gKlxuICogTW9kZWxlZCBvbiBgR0VUX0lOVEVSRkFDRV9HVUFSRGAgZnJvbSBgQGVuZG8vZXhvYC5cbiAqXG4gKiBUT0RPIE5hbWUgdG8gYmUgYmlrZXNoZWQuIFBlcmhhcHMgZXZlbiB3aGV0aGVyIGl0IGlzIGFcbiAqIHN0cmluZyBvciBzeW1ib2wgdG8gYmUgYmlrZXNoZWQuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTgwOSNkaXNjdXNzaW9uX3IxMzg4MDUyNDU0XG4gKlxuICogSEFaQVJEOiBCZXdhcmUgdGhhdCBhbiBleG8ncyBpbnRlcmZhY2UgY2FuIGNoYW5nZSBhY3Jvc3MgYW4gdXBncmFkZSxcbiAqIHNvIHJlbW90ZXMgdGhhdCBjYWNoZSBpdCBjYW4gYmVjb21lIHN0YWxlLlxuICovXG4gICAgICAgY29uc3QgR0VUX01FVEhPRF9OQU1FUyA9ICdfX2dldE1ldGhvZE5hbWVzX18nO1xuXG4vKipcbiAqIE5vdGUgdGhhdCBgZ2V0TWV0aG9kTmFtZXNNZXRob2RgIGlzIGEgdGhpc2Z1bCBtZXRob2QhIEl0IG11c3QgYmUgc28gdGhhdFxuICogaXQgd29ya3MgYXMgZXhwZWN0ZWQgd2l0aCBmYXItb2JqZWN0IGluaGVyaXRhbmNlLlxuICpcbiAqIEByZXR1cm5zIHsoc3RyaW5nfHN5bWJvbClbXX1cbiAqLyRozY9fb25jZS5HRVRfTUVUSE9EX05BTUVTKEdFVF9NRVRIT0RfTkFNRVMpO1xuY29uc3QgZ2V0TWV0aG9kTmFtZXNNZXRob2QgPSBoYXJkZW4oe1xuICBbR0VUX01FVEhPRF9OQU1FU10oKSB7XG4gICAgcmV0dXJuIGdldE1ldGhvZE5hbWVzKHRoaXMpO1xuICB9LFxufSlbR0VUX01FVEhPRF9OQU1FU107XG5cbmNvbnN0IGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvciA9IGhhcmRlbih7XG4gIHZhbHVlOiBnZXRNZXRob2ROYW1lc01ldGhvZCxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbn0pO1xuXG4vKipcbiAqIE1hcmsgYW4gb2JqZWN0IHRvIGJlIGV4cG9zZWQgZm9yIHJlbW90ZSBpbnRlcmFjdGlvblxuICogYW5kIGdpdmUgaXQgYSBzdWdnZXN0aXZlIGludGVyZmFjZSBuYW1lIGZvciBkZWJ1Z2dpbmcuXG4gKlxuICogQWxsIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBoYXZlIHRvIGJlIG1ldGhvZHMsIG5vdCBkYXRhLlxuICpcbiAqIFRoZSBvYmplY3QgbXVzdCBub3QgYmUgaGFyZGVuZWQgYmVmb3JlIGl0IGlzIG1hcmtlZC5cbiAqIEl0IHdpbGwgYmUgaGFyZGVuZWQgYWZ0ZXIgbWFya2luZy5cbiAqXG4gKiBGb3IgZmFyIG9iamVjdHMgKGFzIG9wcG9zZWQgdG8gZmFyIGZ1bmN0aW9ucyksIGFsc28gYWRkc1xuICogYF9fZ2V0TWV0aG9kTmFtZXNfX2AgbWV0aG9kIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIG1ldGhvZCBuYW1lcyxcbiAqIGlmIHRoZXJlIGlzIG5vdCB5ZXQgYW55IG1ldGhvZCBuYW1lZCBgX19nZXRNZXRob2ROYW1lc19fYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogRmFyKCdFbXBsb3llZScsIHsgZ2V0TWFuYWdlciB9KVxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgVGhpcyBuYW1lIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggYEFsbGVnZWQ6IGBcbiAqIGZvciBub3cgdG8gZm9ybSB0aGUgYFJlbW90YWJsZWAgYGlmYWNlYCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZV0gVGhlIG9iamVjdCB0byBiZSBtYXJrZWQgYXMgcmVtb3RhYmxlXG4gKi9cbiAgICAgICBjb25zdCBGYXIgPSAoZmFyTmFtZSwgcmVtb3RhYmxlID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IHIgPSByZW1vdGFibGUgPT09IHVuZGVmaW5lZCA/IC8qKiBAdHlwZSB7VH0gKi8gKHt9KSA6IHJlbW90YWJsZTtcbiAgaWYgKHR5cGVvZiByID09PSAnb2JqZWN0JyAmJiAhKEdFVF9NRVRIT0RfTkFNRVMgaW4gcikpIHtcbiAgICAvKiBUaGlzIHRlc3QgZXhjbHVkZXMgZmFyIGZ1bmN0aW9ucywgc2luY2Ugd2UgY3VycmVudGx5IGNvbnNpZGVyIHRoZW0qL1xuICAgIC8qIHRvIG9ubHkgaGF2ZSBhIGNhbGwtYmVoYXZpb3IsIHdpdGggbm8gY2FsbGFibGUgbWV0aG9kcy4qL1xuICAgIC8qIEJld2FyZTogTXV0YXRlcyB0aGUgaW5wdXQgYXJndW1lbnQhIEJ1dCBgUmVtb3RhYmxlYCovXG4gICAgLyogKiByZXF1aXJlcyB0aGUgb2JqZWN0IHRvIGJlIG11dGFibGUqL1xuICAgIC8qICogZG9lcyBmdXJ0aGVyIG11dGF0aW9ucywqL1xuICAgIC8qICogaGFyZGVucyB0aGUgbXV0YXRlZCBvYmplY3QgYmVmb3JlIHJldHVybmluZyBpdC4qL1xuICAgIC8qIHNvIHRoaXMgbXV0YXRpb24gaXMgbm90IHVucHJlY2VkZW50ZWQuIEJ1dCBpdCBpcyBzdXJwcmlzaW5nISovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIEdFVF9NRVRIT0RfTkFNRVMsIGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvcik7XG4gIH1cbiAgcmV0dXJuIFJlbW90YWJsZShgQWxsZWdlZDogJHtmYXJOYW1lfWAsIHVuZGVmaW5lZCwgcik7XG59OyRozY9fb25jZS5GYXIoRmFyKTtcbmhhcmRlbihGYXIpO1xuXG4vKipcbiAqIENvZXJjZSBgZnVuY2AgdG8gYSBmYXIgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgaXRzIGNhbGwgYmVoYXZpb3IuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGEgZmFyIGZ1bmN0aW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSBtYWtlIGFuZCByZXR1cm4gYVxuICogbmV3IGZhciBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgZm9yd2FyZHMgY2FsbHMgdG8gaXQuIFRoaXNcbiAqIHdvcmtzIGV2ZW4gaWYgYGZ1bmNgIGlzIGFscmVhZHkgZnJvemVuLiBgVG9GYXJGdW5jdGlvbmAgaXMgdG8gYmUgdXNlZFxuICogd2hlbiB0aGUgZnVuY3Rpb24gY29tZXMgZnJvbSBlbHNld2hlcmUgdW5kZXIgbGVzcyBjb250cm9sLiBGb3IgZnVuY3Rpb25zXG4gKiB5b3UgYXV0aG9yIGluIHBsYWNlLCBiZXR0ZXIgdG8gdXNlIGBGYXJgIG9uIHRoZWlyIGZ1bmN0aW9uIGxpdGVyYWwgZGlyZWN0bHkuXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gRlxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgdG8gYmUgdXNlZCBvbmx5IGlmIGBmdW5jYCBpcyBub3QgYWxyZWFkeSBhXG4gKiBmYXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0Z9IGZ1bmNcbiAqIEByZXR1cm5zIHtGICYgUmVtb3RhYmxlT2JqZWN0ICYgUmVtb3RhYmxlQnJhbmQ8e30sIEY+fVxuICovXG4gICAgICAgY29uc3QgVG9GYXJGdW5jdGlvbiA9IChmYXJOYW1lLCBmdW5jKSA9PiB7XG4gIGlmIChnZXRJbnRlcmZhY2VPZihmdW5jKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjaGVja2VkIGNhc3QqL1xuICAgIHJldHVybiBmdW5jO1xuICB9XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgZGlmZmVyZW50IHN1YnR5cGUqL1xuICByZXR1cm4gRmFyKGZhck5hbWUsICguLi5hcmdzKSA9PiBmdW5jKC4uLmFyZ3MpKTtcbn07JGjNj19vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkdFVF9NRVRIT0RfTkFNRVMiOlsiR0VUX01FVEhPRF9OQU1FUyJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACcUmBpgwUAAIMFAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZSxDb3B5VGFnZ2VkfSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbmNvbnN0IHsgY3JlYXRlLCBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBUXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBQXG4gKiBAcGFyYW0ge1R9IHRhZ1xuICogQHBhcmFtIHtQfSBwYXlsb2FkXG4gKiBAcmV0dXJucyB7Q29weVRhZ2dlZDxULFA+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVRhZ2dlZCA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG4gIGFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG4gIHJldHVybiBoYXJkZW4oXG4gICAgY3JlYXRlKG9iamVjdFByb3RvdHlwZSwge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAndGFnZ2VkJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IHRhZyB9LFxuICAgICAgcGF5bG9hZDogeyB2YWx1ZTogcGF5bG9hZCwgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIH0pLFxuICApO1xufTskaM2PX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB8Jer96iEAAOohAAAwAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIkNYIiwiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldE93bkRhdGFEZXNjcmlwdG9yIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNQcmltaXRpdmUiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q2hlY2tlciwgUGFzc1N0eWxlLCBKU1ByaW1pdGl2ZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgcHJvdG90eXBlOiBmdW5jdGlvblByb3RvdHlwZSB9ID0gRnVuY3Rpb247XG5jb25zdCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGhhc093bixcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxufSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IHRvU3RyaW5nVGFnOiB0b1N0cmluZ1RhZ1N5bWJvbCB9ID0gU3ltYm9sO1xuXG5jb25zdCB0eXBlZEFycmF5UHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheS5wcm90b3R5cGUpO1xuY29uc3QgdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgdHlwZWRBcnJheVByb3RvdHlwZSxcbiAgdG9TdHJpbmdUYWdTeW1ib2wsXG4pO1xuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnID0gdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYy5nZXQ7XG5hc3NlcnQodHlwZW9mIGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyA9PT0gJ2Z1bmN0aW9uJyk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBPYmplY3QuaGFzT3duYCBpbnN0ZWFkXG4gKi9cbiAgICAgICBjb25zdCBoYXNPd25Qcm9wZXJ0eU9mID0gaGFzT3duO1xuXG4vKipcbiAqIEB0eXBlIHsodmFsOiB1bmtub3duKSA9PiB2YWwgaXMgSlNQcmltaXRpdmV9XG4gKi8kaM2PX29uY2UuaGFzT3duUHJvcGVydHlPZihoYXNPd25Qcm9wZXJ0eU9mKTtcbiAgICAgICBjb25zdCBpc1ByaW1pdGl2ZSA9IHZhbCA9PlxuICAvKiBTYWZlciB3b3VsZCBiZSBgT2JqZWN0KHZhbCkgIT09IHZhbGAgYnV0IGlzIHRvbyBleHBlbnNpdmUgb24gWFMuKi9cbiAgLyogU28gaW5zdGVhZCB3ZSB1c2UgdGhpcyBhZGhvYyBzZXQgb2YgdHlwZSB0ZXN0cy4gQnV0IHRoaXMgaXMgbm90IHNhZmUgaW4qL1xuICAvKiB0aGUgZmFjZSBvZiBwb3NzaWJsZSBldm9sdXRpb24gb2YgdGhlIGxhbmd1YWdlLiBCZXdhcmUhKi9cbiAgIXZhbCB8fCAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJyk7JGjNj19vbmNlLmlzUHJpbWl0aXZlKGlzUHJpbWl0aXZlKTtcbmhhcmRlbihpc1ByaW1pdGl2ZSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGAhaXNQcmltaXRpdmVgIGluc3RlYWRcbiAqIEB0eXBlIHsodmFsOiB1bmtub3duKSA9PiB2YWwgaXMgKEZ1bmN0aW9uIHwgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4pfVxuICovXG4gICAgICAgY29uc3QgaXNPYmplY3QgPSB2YWwgPT5cbiAgLyogU2FmZXIgd291bGQgYmUgYE9iamVjdCh2YWwpIC09PSB2YWxgIGJ1dCBpcyB0b28gZXhwZW5zaXZlIG9uIFhTLiovXG4gIC8qIFNvIGluc3RlYWQgd2UgdXNlIHRoaXMgYWRob2Mgc2V0IG9mIHR5cGUgdGVzdHMuIEJ1dCB0aGlzIGlzIG5vdCBzYWZlIGluKi9cbiAgLyogdGhlIGZhY2Ugb2YgcG9zc2libGUgZXZvbHV0aW9uIG9mIHRoZSBsYW5ndWFnZS4gQmV3YXJlISovXG4gICEhdmFsICYmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKTskaM2PX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLyoqXG4gKiBEdXBsaWNhdGVzIHBhY2thZ2VzL3Nlcy9zcmMvbWFrZS1oYXJkZW5lci5qcyB0byBhdm9pZCBhIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmplY3RcbiAqL1xuICAgICAgIGNvbnN0IGlzVHlwZWRBcnJheSA9IG9iamVjdCA9PiB7XG4gIC8qIFRoZSBvYmplY3QgbXVzdCBwYXNzIGEgYnJhbmQgY2hlY2sgb3IgdG9TdHJpbmdUYWcgd2lsbCByZXR1cm4gdW5kZWZpbmVkLiovXG4gIGNvbnN0IHRhZyA9IGFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZywgb2JqZWN0LCBbXSk7XG4gIHJldHVybiB0YWcgIT09IHVuZGVmaW5lZDtcbn07JGjNj19vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbi8qKlxuICogV2UgY2FzdCBvdXIgYFN5bWJvbC5mb3IoKWAgdG8gYSBzdHJpbmcgY29uc3RhbnQgaGVyZSB0byBhdm9pZCBleHBvc2luZyB0aGVcbiAqIGB1bmlxdWUgc3ltYm9sYCB0eXBlIHB1YmxpY2x5LiAgVGhlIGNhc3QgZG9lc24ndCBjaGFuZ2UgYW55IHJ1bnRpbWVcbiAqIGJlaGF2aW9yLi4uIGl0J3Mgc3RpbGwgYWN0dWFsbHkgYSBzeW1ib2wuXG4gKlxuICogV2l0aG91dCB0aGlzIHdvcmthcm91bmQsIHdlJ3ZlIG9ic2VydmVkIGVycm9ycyB3aGVuIHVzaW5nXG4gKiBgdHlwZXNjcmlwdEA1LjkuM2AncyBgdHNjYCB0byBnZW5lcmF0ZSBkZWNsYXJhdGlvbiBmaWxlcyAoLmQudHMpIGZvclxuICogY29uc3VtZXJzIG9mIG1vZHVsZXMgdGhhdCBpbXBvcnQgYFBBU1NfU1RZTEVgOlxuICogQGV4YW1wbGVcbiAqICAgZXJyb3IgVFM5MDA2OiBEZWNsYXJhdGlvbiBlbWl0IGZvciB0aGlzIGZpbGUgcmVxdWlyZXMgdXNpbmcgcHJpdmF0ZSBuYW1lXG4gKiAgICdQQVNTX1NUWUxFJyBmcm9tIG1vZHVsZSAnLi4uL0BlbmRvL3Bhc3Mtc3R5bGUvc3JjL3R5cGVzXCInLiBBbiBleHBsaWNpdFxuICogICB0eXBlIGFubm90YXRpb24gbWF5IHVuYmxvY2sgZGVjbGFyYXRpb24gZW1pdC5cbiAqL1xuICAgICAgIGNvbnN0IFBBU1NfU1RZTEUgPSAvKiogQHR5cGUgeydTeW1ib2wocGFzc1N0eWxlKSd9ICovIChcbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoU3ltYm9sLmZvcigncGFzc1N0eWxlJykpXG4pO1xuXG4vKipcbiAqIEJlbG93IHdlIGhhdmUgYSBzZXJpZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBhbmQgdGhlaXIgKGN1cnJpZWQpIGFzc2VydGlvblxuICogZnVuY3Rpb25zLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBhc3NlcnRpb24gZnVuY3Rpb24gaXMganVzdCB0byBhc3NlcnQgdGhhdFxuICogdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGljYXRlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZS4gQnV0IGl0XG4gKiByZXByb2R1Y2VzIHRoZSBpbnRlcm5hbCB0ZXN0cyBzbyBmYWlsdXJlcyBjYW4gZ2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovJGjNj19vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG4gICAgICAgY29uc3QgYXNzZXJ0Q2hlY2tlciA9IChjb25kLCBkZXRhaWxzKSA9PiB7XG4gIGFzc2VydChjb25kLCBkZXRhaWxzKTtcbiAgcmV0dXJuIHRydWU7XG59OyRozY9fb25jZS5hc3NlcnRDaGVja2VyKGFzc2VydENoZWNrZXIpO1xuaGFyZGVuKGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIFJldHVybnMgYSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyBmdW5jdGlvbiB0byBmYWlsIHRoZSBwcm92aWRlZCBDaGVja2VyIHdpdGggZGV0YWlscy5cbiAqIFRoZSBuYW1lIG11c3QgYmUgc2hvcnQgZm9yIGVyZ29ub21pYyBpbmxpbmUgdXNlIGFzIGluOlxuICogYGBgXG4gKiByZXR1cm4gY2hlY2tDb25kaXRpb24oLi4uKSB8fCAoISFjaGVjayAmJiBDWChjaGVjaylgLi4uYCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbiAgICAgICBjb25zdCBDWCA9IGNoZWNrID0+IHtcbiAgY29uc3QgcmVqZWN0ID0gKFQsIC4uLnN1YnMpID0+IGNoZWNrKGZhbHNlLCBYKFQsIC4uLnN1YnMpKTtcbiAgcmV0dXJuIHJlamVjdDtcbn07JGjNj19vbmNlLkNYKENYKTtcbmhhcmRlbihDWCk7XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIHByZXNlbmNlIGFuZCBlbnVtZXJhYmlsaXR5IG9mIGFuIG93biBkYXRhIHByb3BlcnR5XG4gKiBhbmQgcmV0dXJucyBpdHMgZGVzY3JpcHRvci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBwcm9wTmFtZVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRCZUVudW1lcmFibGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge1Byb3BlcnR5RGVzY3JpcHRvcn1cbiAqL1xuICAgICAgIGNvbnN0IGdldE93bkRhdGFEZXNjcmlwdG9yID0gKFxuICBjYW5kaWRhdGUsXG4gIHByb3BOYW1lLFxuICBzaG91bGRCZUVudW1lcmFibGUsXG4gIGNoZWNrLFxuKSA9PiB7XG4gIGNvbnN0IGRlc2MgPSAvKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi8gKFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUsIHByb3BOYW1lKVxuICApO1xuICByZXR1cm4gKGRlc2MgIT09IHVuZGVmaW5lZCB8fFxuICAgICghIWNoZWNrICYmIENYKGNoZWNrKWAke3EocHJvcE5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKGhhc093bihkZXNjLCAndmFsdWUnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gYWNjZXNzb3IgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgIChzaG91bGRCZUVudW1lcmFibGVcbiAgICAgID8gZGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YClcbiAgICAgIDogIWRlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IG5vdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSlcbiAgICA/IGRlc2NcbiAgICA6IC8qKiBAdHlwZSB7UHJvcGVydHlEZXNjcmlwdG9yfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAodW5kZWZpbmVkKSk7XG59OyRozY9fb25jZS5nZXRPd25EYXRhRGVzY3JpcHRvcihnZXRPd25EYXRhRGVzY3JpcHRvcik7XG5oYXJkZW4oZ2V0T3duRGF0YURlc2NyaXB0b3IpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gVFxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVkPGFueSwgVD59IHRhZ1JlY29yZFxuICogQHJldHVybnMge1R9XG4gKi9cbiAgICAgICBjb25zdCBnZXRUYWcgPSB0YWdSZWNvcmQgPT4gdGFnUmVjb3JkW1N5bWJvbC50b1N0cmluZ1RhZ107JGjNj19vbmNlLmdldFRhZyhnZXRUYWcpO1xuaGFyZGVuKGdldFRhZyk7XG5cbiAgICAgICBjb25zdCBjaGVja1Bhc3NTdHlsZSA9IChvYmosIHBhc3NTdHlsZSwgZXhwZWN0ZWRQYXNzU3R5bGUsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgcGFzc1N0eWxlID09PSBleHBlY3RlZFBhc3NTdHlsZSB8fFxuICAgICghIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkUGFzc1N0eWxlKX0sIG5vdCAke3EocGFzc1N0eWxlKX06ICR7b2JqfWApXG4gICk7XG59OyRozY9fb25jZS5jaGVja1Bhc3NTdHlsZShjaGVja1Bhc3NTdHlsZSk7XG5oYXJkZW4oY2hlY2tQYXNzU3R5bGUpO1xuXG5jb25zdCBtYWtlQ2hlY2tUYWdSZWNvcmQgPSBjaGVja1Byb3RvID0+IHtcbiAgLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZWQ8YW55LCBhbnk+fSB0YWdSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBleHBlY3RlZFBhc3NTdHlsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja1RhZ1JlY29yZCA9ICh0YWdSZWNvcmQsIGV4cGVjdGVkUGFzc1N0eWxlLCBjaGVjaykgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICAoIWlzUHJpbWl0aXZlKHRhZ1JlY29yZCkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgQSBub24tb2JqZWN0IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICAoaXNGcm96ZW4odGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJiBDWChjaGVjaylgQSB0YWdSZWNvcmQgbXVzdCBiZSBmcm96ZW46ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgICAgKCFpc0FycmF5KHRhZ1JlY29yZCkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICBjaGVja1Bhc3NTdHlsZShcbiAgICAgICAgdGFnUmVjb3JkLFxuICAgICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsIFBBU1NfU1RZTEUsIGZhbHNlLCBjaGVjaykudmFsdWUsXG4gICAgICAgIGV4cGVjdGVkUGFzc1N0eWxlLFxuICAgICAgICBjaGVjayxcbiAgICAgICkgJiZcbiAgICAgICh0eXBlb2YgZ2V0T3duRGF0YURlc2NyaXB0b3IodGFnUmVjb3JkLCBTeW1ib2wudG9TdHJpbmdUYWcsIGZhbHNlLCBjaGVjaylcbiAgICAgICAgLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBBIFtTeW1ib2wudG9TdHJpbmdUYWddLW5hbWVkIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgICAgY2hlY2tQcm90byh0YWdSZWNvcmQsIGdldFByb3RvdHlwZU9mKHRhZ1JlY29yZCksIGNoZWNrKVxuICAgICk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xufTtcblxuICAgICAgIGNvbnN0IGNoZWNrVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gICAgcHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgICghIWNoZWNrICYmXG4gICAgICBjaGVjayhmYWxzZSwgWGBBIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke3ZhbH1gKSksXG4pOyRozY9fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuXG4gICAgICAgY29uc3QgY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9IG1ha2VDaGVja1RhZ1JlY29yZChcbiAgKHZhbCwgcHJvdG8sIGNoZWNrKSA9PlxuICAgIHByb3RvID09PSBmdW5jdGlvblByb3RvdHlwZSB8fFxuICAgIChwcm90byAhPT0gbnVsbCAmJiBnZXRQcm90b3R5cGVPZihwcm90bykgPT09IGZ1bmN0aW9uUHJvdG90eXBlKSB8fFxuICAgICghIWNoZWNrICYmXG4gICAgICBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgRm9yIGZ1bmN0aW9ucywgYSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlOiAke3ZhbH1gLFxuICAgICAgKSksXG4pOyRozY9fb25jZS5jaGVja0Z1bmN0aW9uVGFnUmVjb3JkKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xuaGFyZGVuKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIl0sImlzUHJpbWl0aXZlIjpbImlzUHJpbWl0aXZlIl0sImlzT2JqZWN0IjpbImlzT2JqZWN0Il0sImlzVHlwZWRBcnJheSI6WyJpc1R5cGVkQXJyYXkiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJDWCI6WyJDWCJdLCJnZXRPd25EYXRhRGVzY3JpcHRvciI6WyJnZXRPd25EYXRhRGVzY3JpcHRvciJdLCJnZXRUYWciOlsiZ2V0VGFnIl0sImNoZWNrUGFzc1N0eWxlIjpbImNoZWNrUGFzc1N0eWxlIl0sImNoZWNrVGFnUmVjb3JkIjpbImNoZWNrVGFnUmVjb3JkIl0sImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiOlsiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAmAo63Yj8AAGI/AAAqAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3Bhc3NTdHlsZU9mLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vY29weUFycmF5LmpzIiwiLi9ieXRlQXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL3RhZ2dlZC5qcyIsIi4vZXJyb3IuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc3ltYm9sLmpzIiwiLi9zYWZlLXByb21pc2UuanMiLCIuL3N0cmluZy5qcyJdLCJleHBvcnRzIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIiwiYXNzZXJ0UGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwicGFzc1N0eWxlT2YiLCJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Rocm93YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGlzUHJvbWlzZSxYLEZhaWwscSxhbm5vdGF0ZUVycm9yLG1ha2VFcnJvcixpc1ByaW1pdGl2ZSxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxhc3NlcnRDaGVja2VyLENvcHlBcnJheUhlbHBlcixCeXRlQXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsRXJyb3JIZWxwZXIsY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MsY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc0Vycm9yTGlrZSxSZW1vdGFibGVIZWxwZXIsYXNzZXJ0UGFzc2FibGVTeW1ib2wsYXNzZXJ0U2FmZVByb21pc2UsYXNzZXJ0UGFzc2FibGVTdHJpbmc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcImlzVHlwZWRBcnJheVwiLFskaM2PX2EgPT4gKGlzVHlwZWRBcnJheSA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIi4vY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIixbJGjNj19hID0+IChDb3B5QXJyYXlIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2J5dGVBcnJheS5qc1wiLCBbW1wiQnl0ZUFycmF5SGVscGVyXCIsWyRozY9fYSA9PiAoQnl0ZUFycmF5SGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5UmVjb3JkLmpzXCIsIFtbXCJDb3B5UmVjb3JkSGVscGVyXCIsWyRozY9fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vdGFnZ2VkLmpzXCIsIFtbXCJUYWdnZWRIZWxwZXJcIixbJGjNj19hID0+IChUYWdnZWRIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLFskaM2PX2EgPT4gKEVycm9ySGVscGVyID0gJGjNj19hKV1dLFtcImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjXCIsWyRozY9fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAkaM2PX2EpXV0sW1wiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JcIixbJGjNj19hID0+IChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciA9ICRozY9fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcIlJlbW90YWJsZUhlbHBlclwiLFskaM2PX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiLi9zYWZlLXByb21pc2UuanNcIiwgW1tcImFzc2VydFNhZmVQcm9taXNlXCIsWyRozY9fYSA9PiAoYXNzZXJ0U2FmZVByb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3N0cmluZy5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTdHJpbmdcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN0cmluZyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge1Bhc3NTdHlsZUhlbHBlcn0gZnJvbSAnLi9pbnRlcm5hbC10eXBlcy5qcycgKi9cbi8qKiBAaW1wb3J0IHtDb3B5QXJyYXksIENvcHlSZWNvcmQsIENvcHlUYWdnZWQsIFBhc3NhYmxlfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge1Bhc3NTdHlsZX0gZnJvbSAnLi90eXBlcy5qcycgKi9cbi8qKiBAaW1wb3J0IHtQYXNzU3R5bGVPZn0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0Zyb3plbiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgdmFsdWVzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UGFzc1N0eWxlLCBQYXNzU3R5bGVIZWxwZXI+fSBIZWxwZXJzUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzXG4gKiBAcmV0dXJucyB7SGVscGVyc1JlY29yZH1cbiAqL1xuY29uc3QgbWFrZUhlbHBlclRhYmxlID0gcGFzc1N0eWxlSGVscGVycyA9PiB7XG4gIGNvbnN0IEhlbHBlclRhYmxlID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBjb3B5QXJyYXk6IHVuZGVmaW5lZCxcbiAgICBieXRlQXJyYXk6IHVuZGVmaW5lZCxcbiAgICBjb3B5UmVjb3JkOiB1bmRlZmluZWQsXG4gICAgdGFnZ2VkOiB1bmRlZmluZWQsXG4gICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICByZW1vdGFibGU6IHVuZGVmaW5lZCxcbiAgfTtcbiAgZm9yIChjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycykge1xuICAgIGNvbnN0IHsgc3R5bGVOYW1lIH0gPSBoZWxwZXI7XG4gICAgc3R5bGVOYW1lIGluIEhlbHBlclRhYmxlIHx8IEZhaWxgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgIEZhaWxgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdID0gaGVscGVyO1xuICB9XG4gIGZvciAoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKSB7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBGYWlsYG1pc3NpbmcgaGVscGVyIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7SGVscGVyc1JlY29yZH0gKi8gKFxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGhhcmRlbihIZWxwZXJUYWJsZSkpXG4gICk7XG59O1xuXG4vKipcbiAqIFRoZSBgYXNzZXJ0UmVzdFZhbGlkYCBhc3N1bWVzIHRoYXQgdGhlIGBjYW5CZVZhbGlkYCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gKiBDb250ZXh0cyB3aGVyZSB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgc2hvdWxkIGNhbGwgYGFzc2VydFZhbGlkYCBpbnN0ZWFkLFxuICogd2hpY2ggY2hlY2tzIGJvdGggY29uZGl0aW9ucyBpbiB0aGUgcmlnaHQgb3JkZXIuXG4gKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJ9IGhlbHBlclxuICogQHBhcmFtIHthbnl9IGNhbmRpZGF0ZVxuICogQHBhcmFtIHsodmFsOiBhbnkpID0+IFBhc3NTdHlsZX0gcGFzc1N0eWxlT2ZSZWN1clxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydFZhbGlkID0gKGhlbHBlciwgY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gIGhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlcik7XG4gIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVycyBUaGUgcGFzc1N0eWxlSGVscGVycyB0byByZWdpc3RlcixcbiAqIGluIHByaW9yaXR5IG9yZGVyLlxuICogTk9URSBUaGVzZSBtdXN0IGFsbCBiZSBcInRydXN0ZWRcIixcbiAqIGNvbXBsZXRlLCBhbmQgbm9uLWNvbGxpZGluZy4gYG1ha2VQYXNzU3R5bGVPZmAgbWF5ICphc3N1bWUqIHRoYXQgZWFjaCBoZWxwZXJcbiAqIGRvZXMgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gYG1ha2VQYXNzU3R5bGVPZmAgaXMgbm90IHRyeWluZyB0byBkZWZlbmRcbiAqIGl0c2VsZiBhZ2FpbnN0IG1hbGljaW91cyBoZWxwZXJzLCB0aG91Z2ggaXQgZG9lcyBkZWZlbmQgYWdhaW5zdCBzb21lXG4gKiBhY2NpZGVudHMuXG4gKiBAcmV0dXJucyB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZiA9IHBhc3NTdHlsZUhlbHBlcnMgPT4ge1xuICBjb25zdCBIZWxwZXJUYWJsZSA9IG1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbiAgY29uc3QgcmVtb3RhYmxlSGVscGVyID0gSGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4gIC8qKlxuICogUHVyZWx5IGZvciBwZXJmb3JtYW5jZS4gSG93ZXZlciBpdCBpcyBtdXRhYmxlIHN0YXRpYyBzdGF0ZSwgYW5kXG4gKiBpdCBkb2VzIGhhdmUgc29tZSBvYnNlcnZhYmlsaXR5IG9uIHByb3hpZXMuIFRPRE8gbmVlZCB0byBhc3Nlc3NcbiAqIHdoZXRoZXIgdGhpcyBjcmVhdGVzIGEgc3RhdGljIGNvbW11bmljYXRpb25zIGNoYW5uZWwuXG4gKlxuICogcGFzc1N0eWxlT2YgZG9lcyBhIGZ1bGwgcmVjdXJzaXZlIHdhbGsgb2YgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHRoZXkgYXJlIGFjeWNsaWMuIEluIGFkZGl0aW9uXG4gKiBpdCBpcyB1c2VkIGJ5IG90aGVyIGFsZ29yaXRobXMgdG8gcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIHNvIHdpdGhvdXQgdGhpcyBjYWNoZSwgdGhlc2UgYWxnb3JpdGhtcyBjb3VsZCBiZVxuICogTyhOKioyKSBvciB3b3JzZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcDxXZWFrS2V5LCBQYXNzU3R5bGU+fVxuICovXG4gIGNvbnN0IHBhc3NTdHlsZU1lbW8gPSBuZXcgV2Vha01hcCgpO1xuXG4gIC8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIGNvbnN0IHBhc3NTdHlsZU9mID0gcGFzc2FibGUgPT4ge1xuICAgIC8qIEV2ZW4gd2hlbiBhIFdlYWtTZXQgaXMgY29ycmVjdCwgd2hlbiB0aGUgc2V0IGhhcyBhIHNob3J0ZXIgbGlmZXRpbWUqL1xuICAgIC8qIHRoYW4gaXRzIGtleXMsIHdlIHByZWZlciBhIFNldCBkdWUgdG8gZXhwZWN0ZWQgaW1wbGVtZW50YXRpb24qL1xuICAgIC8qIHRyYWRlb2Zmcy4qL1xuICAgIGNvbnN0IGluUHJvZ3Jlc3MgPSBuZXcgU2V0KCk7XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZlJlY3VyID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgaW5uZXJJc09iamVjdCA9ICFpc1ByaW1pdGl2ZShpbm5lcik7XG4gICAgICBpZiAoaW5uZXJJc09iamVjdCkge1xuICAgICAgICBjb25zdCBpbm5lclN0eWxlID0gcGFzc1N0eWxlTWVtby5nZXQoaW5uZXIpO1xuICAgICAgICBpZiAoaW5uZXJTdHlsZSkge1xuICAgICAgICAgIHJldHVybiBpbm5lclN0eWxlO1xuICAgICAgICB9XG4gICAgICAgICFpblByb2dyZXNzLmhhcyhpbm5lcikgfHxcbiAgICAgICAgICBGYWlsYFBhc3MtYnktY29weSBkYXRhIGNhbm5vdCBiZSBjeWNsaWMgJHtpbm5lcn1gO1xuICAgICAgICBpblByb2dyZXNzLmFkZChpbm5lcik7XG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2ZJbnRlcm5hbChpbm5lcik7XG4gICAgICBpZiAoaW5uZXJJc09iamVjdCkge1xuICAgICAgICBwYXNzU3R5bGVNZW1vLnNldChpbm5lciwgcGFzc1N0eWxlKTtcbiAgICAgICAgaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhc3NTdHlsZTtcbiAgICB9O1xuXG4gICAgY29uc3QgcGFzc1N0eWxlT2ZJbnRlcm5hbCA9IGlubmVyID0+IHtcbiAgICAgIGNvbnN0IHR5cGVzdHIgPSB0eXBlb2YgaW5uZXI7XG4gICAgICBzd2l0Y2ggKHR5cGVzdHIpIHtcbiAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICByZXR1cm4gdHlwZXN0cjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgICAgYXNzZXJ0UGFzc2FibGVTdHJpbmcoaW5uZXIpO1xuICAgICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2woaW5uZXIpO1xuICAgICAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdvYmplY3QnOiB7XG4gICAgICAgICAgaWYgKGlubmVyID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzRnJvemVuKGlubmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICAgIC8qIFR5cGVkQXJyYXlzIGdldCBzcGVjaWFsIHRyZWF0bWVudCBpbiBoYXJkZW4oKSovXG4gICAgICAgICAgICAgIC8qIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3BlY2lhbCBlcnJvciBtZXNzYWdlIGhlcmUuKi9cbiAgICAgICAgICAgICAgaXNUeXBlZEFycmF5KGlubmVyKVxuICAgICAgICAgICAgICAgID8gWGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmBcbiAgICAgICAgICAgICAgICA6IFhgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQcm9taXNlKGlubmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xuICAgICAgICAgICAgcmV0dXJuICdwcm9taXNlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdHlwZW9mIGlubmVyLnRoZW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbiAgICAgICAgICBjb25zdCBwYXNzU3R5bGVUYWcgPSBpbm5lcltQQVNTX1NUWUxFXTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlVGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCAnc3RyaW5nJyk7XG4gICAgICAgICAgICBjb25zdCBoZWxwZXIgPSBIZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuICAgICAgICAgICAgaGVscGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgRmFpbGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWQoaGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHtQYXNzU3R5bGV9ICovIChwYXNzU3R5bGVUYWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKSB7XG4gICAgICAgICAgICBpZiAoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKSB7XG4gICAgICAgICAgICAgIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgICAgICByZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzZXJ0VmFsaWQocmVtb3RhYmxlSGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgcmV0dXJuICdyZW1vdGFibGUnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoge1xuICAgICAgICAgIGlzRnJvemVuKGlubmVyKSB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbiAgICAgICAgICB0eXBlb2YgaW5uZXIudGhlbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuICAgICAgICAgIGFzc2VydFZhbGlkKHJlbW90YWJsZUhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgIHJldHVybiAncmVtb3RhYmxlJztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG59O1xuXG4gICAgICAgY29uc3QgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wgPSBTeW1ib2wuZm9yKCdAZW5kbyBwYXNzU3R5bGVPZicpO1xuXG4vKipcbiAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSBQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCBwcm9wZXJ0eSBvbiB0aGUgZ2xvYmFsLFxuICogdGhlbiBwcmVzdW1hYmx5IGl0IHdhcyBlbmRvd2VkIGZvciB1cyBieSBsaXZlc2xvdHMgd2l0aCBhIGBwYXNzU3R5bGVPZmBcbiAqIGZ1bmN0aW9uLCBzbyB3ZSBzaG91bGQgdXNlIGFuZCBleHBvcnQgdGhhdCBvbmUgaW5zdGVhZC5cbiAqIE90aGVyIHNvZnR3YXJlIG1heSBoYXZlIGxlZnQgaXQgZm9yIHVzIGhlcmUsXG4gKiBidXQgaXQgd291bGQgcmVxdWlyZSB3cml0ZSBhY2Nlc3MgdG8gb3VyIGdsb2JhbCwgb3IgdGhlIGFiaWxpdHkgdG9cbiAqIHByb3ZpZGUgZW5kb3dtZW50cyB0byBvdXIgZ2xvYmFsLCBib3RoIG9mIHdoaWNoIHNlZW1zIGFkZXF1YXRlIGFzIGEgdGVzdCBvZlxuICogd2hldGhlciBpdCBpcyBhdXRob3JpemVkIHRvIHNlcnZlIHRoZSBzYW1lIHJvbGUgYXMgbGl2ZXNsb3RzLlxuICpcbiAqIE5PVEUgSEFaQVJEOiBUaGlzIHVzZSBieSBsaXZlc2xvdHMgZG9lcyByZWx5IG9uIGBwYXNzU3R5bGVPZmAgYmVpbmdcbiAqIGRldGVybWluaXN0aWMuIElmIGl0IGlzIG5vdCwgdGhlbiBpbiBhIGxpdmVzbG90LWxpa2UgdmlydHVhbGl6ZWRcbiAqIGVudmlyb25tZW50LCBpdCBjYW4gYmUgdXNlZCB0byBkZXRlY3QgR0MuXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovJGjNj19vbmNlLlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sKFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sKTtcbiAgICAgICBjb25zdCBwYXNzU3R5bGVPZiA9XG4gIChnbG9iYWxUaGlzICYmIGdsb2JhbFRoaXNbUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2xdKSB8fFxuICBtYWtlUGFzc1N0eWxlT2YoW1xuICAgIENvcHlBcnJheUhlbHBlcixcbiAgICBCeXRlQXJyYXlIZWxwZXIsXG4gICAgQ29weVJlY29yZEhlbHBlcixcbiAgICBUYWdnZWRIZWxwZXIsXG4gICAgRXJyb3JIZWxwZXIsXG4gICAgUmVtb3RhYmxlSGVscGVyLFxuICBdKTskaM2PX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0UGFzc2FibGUgPSB2YWwgPT4ge1xuICBwYXNzU3R5bGVPZih2YWwpOyAvKiB0aHJvd3MgaWYgdmFsIGlzIG5vdCBhIHBhc3NhYmxlKi9cbn07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG5cbi8qKlxuICogSXMgYHNwZWNpbWVuYCBQYXNzYWJsZT8gVGhpcyByZXR1cm5zIHRydWUgaWZmIGBwYXNzU3R5bGVPZihzcGVjaW1lbilgXG4gKiByZXR1cm5zIGEgc3RyaW5nLiBUaGlzIHJldHVybnMgYGZhbHNlYCBpZmYgYHBhc3NTdHlsZU9mKHNwZWNpbWVuKWAgdGhyb3dzLlxuICogVW5kZXIgbm8gbm9ybWFsIGNpcmN1bXN0YW5jZSBzaG91bGQgYGlzUGFzc2FibGUoc3BlY2ltZW4pYCB0aHJvdy5cbiAqXG4gKiBUT0RPIERlcHJlY2F0ZSBhbmQgdWx0aW1hdGVseSBkZWxldGUgQGFnb3JpYy9iYXNlLXpvbmUncyBgaXNQYXNzYWJsZScgaW5cbiAqIGZhdm9yIG9mIHRoaXMgb25lLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMjA5NlxuICpcbiAqIFRPRE8gaW1wbGVtZW50IGFuIGlzUGFzc2FibGUgdGhhdCBkb2VzIG5vdCByZWx5IG9uIHRyeS9jYXRjaC5cbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMganVzdCBhIHN0YW5kaW4gdW50aWwgdGhlbi5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzIwOTZcbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtzcGVjaW1lbiBpcyBQYXNzYWJsZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGUgPSBzcGVjaW1lbiA9PiB7XG4gIHRyeSB7XG4gICAgLyogSW4gZmFjdCwgaXQgbmV2ZXIgcmV0dXJucyB1bmRlZmluZWQuIEl0IGVpdGhlciByZXR1cm5zIGEqL1xuICAgIC8qIHN0cmluZyBvciB0aHJvd3MuKi9cbiAgICByZXR1cm4gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pICE9PSB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07JGjNj19vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG5oYXJkZW4oaXNQYXNzYWJsZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7UHJvcGVydHlEZXNjcmlwdG9yfSBkZXNjXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gKG5hbWUsIGRlc2MpID0+XG4gIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKG5hbWUsIGRlc2MsIHBhc3NTdHlsZU9mKTtcblxuLyoqXG4gKiBBZnRlciBoYXJkZW5pbmcsIGlmIGBlcnJgIGlzIGEgcGFzc2FibGUgZXJyb3IsIHJldHVybiBpdC5cbiAqXG4gKiBPdGhlcndpc2UsIHJldHVybiBhIG5ldyBwYXNzYWJsZSBlcnJvciB0aGF0IHByb3BhZ2F0ZXMgdGhlIGRpYWdub3N0aWNcbiAqIGluZm8gb2YgdGhlIG9yaWdpbmFsLCBhbmQgaXMgbGlua2VkIHRvIHRoZSBvcmlnaW5hbCBhcyBhIG5vdGUuXG4gKlxuICogVE9ETyBBZG9wdCBhIG1vcmUgZmxleGlibGUgbm90aW9uIG9mIHBhc3NhYmxlIGVycm9yLCBpbiB3aGljaFxuICogYSBwYXNzYWJsZSBlcnJvciBjYW4gY29udGFpbiBvdGhlciBvd24gZGF0YSBwcm9wZXJ0aWVzIHdpdGhcbiAqIHRocm93YWJsZSB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbiAgICAgICBjb25zdCB0b1Bhc3NhYmxlRXJyb3IgPSBlcnIgPT4ge1xuICBoYXJkZW4oZXJyKTtcbiAgaWYgKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVyciwgcGFzc1N0eWxlT2YpKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuICBjb25zdCB7IG5hbWUsIG1lc3NhZ2UgfSA9IGVycjtcbiAgY29uc3QgeyBjYXVzZTogY2F1c2VEZXNjLCBlcnJvcnM6IGVycm9yc0Rlc2MgfSA9XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhlcnIpO1xuICBsZXQgY2F1c2U7XG4gIGxldCBlcnJvcnM7XG4gIGlmIChjYXVzZURlc2MgJiYgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKCdjYXVzZScsIGNhdXNlRGVzYykpIHtcbiAgICBjYXVzZSA9IGNhdXNlRGVzYy52YWx1ZTtcbiAgfVxuICBpZiAoZXJyb3JzRGVzYyAmJiBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2Vycm9ycycsIGVycm9yc0Rlc2MpKSB7XG4gICAgZXJyb3JzID0gZXJyb3JzRGVzYy52YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihgJHtuYW1lfWApIHx8IEVycm9yO1xuICBjb25zdCBuZXdFcnJvciA9IG1ha2VFcnJvcihgJHttZXNzYWdlfWAsIGVyckNvbnN0cnVjdG9yLCB7XG4gICAgLyogQHRzLWlnbm9yZSBBc3N1bWluZyBjYXVzZSBpcyBFcnJvciB8IHVuZGVmaW5lZCovXG4gICAgY2F1c2UsXG4gICAgZXJyb3JzLFxuICB9KTtcbiAgLyogU3RpbGwgbmVlZGVkLCBiZWNhdXNlIGBtYWtlRXJyb3JgIG9ubHkgZG9lcyBhIHNoYWxsb3cgZnJlZXplLiovXG4gIGhhcmRlbihuZXdFcnJvcik7XG4gIC8qIEV2ZW4gdGhlIGNsZWFuZWQgdXAgZXJyb3IgY29weSwgaWYgc2VudCB0byB0aGUgY29uc29sZSwgc2hvdWxkKi9cbiAgLyogY2F1c2UgaGlkZGVuIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gb2YgdGhlIG9yaWdpbmFsIGVycm9yKi9cbiAgLyogdG8gYmUgbG9nZ2VkLiovXG4gIGFubm90YXRlRXJyb3IobmV3RXJyb3IsIFhgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG4gIHBhc3NTdHlsZU9mKG5ld0Vycm9yKSA9PT0gJ2Vycm9yJyB8fFxuICAgIEZhaWxgRXhwZWN0ZWQgJHtuZXdFcnJvcn0gdG8gYmUgYSBwYXNzYWJsZSBlcnJvcmA7XG4gIHJldHVybiBuZXdFcnJvcjtcbn07JGjNj19vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG5cbi8qKlxuICogQWZ0ZXIgaGFyZGVuaW5nLCBpZiBgc3BlY2ltZW5gIGlzIHRocm93YWJsZSwgcmV0dXJuIGl0LlxuICogQSBzcGVjaW1lbiBpcyB0aHJvd2FibGUgaWZmIGl0IGlzIFBhc3NhYmxlIGFuZCBjb250YWlucyBubyBQYXNzYWJsZUNhcHMsXG4gKiBpLmUuLCBubyBSZW1vdGFibGVzIG9yIFByb21pc2VzLlxuICogSU9XLCBpZiBpdCBjb250YWlucyBvbmx5IGNvcHktZGF0YSBhbmQgcGFzc2FibGUgZXJyb3JzLlxuICpcbiAqIE90aGVyd2lzZSwgaWYgYHNwZWNpbWVuYCBpcyAqYWxtb3N0KiB0aHJvd2FibGUsIGZvciBleGFtcGxlLCBpdCBpc1xuICogYW4gZXJyb3IgdGhhdCBjYW4gYmUgbWFkZSB0aHJvd2FibGUgYnkgYHRvUGFzc2FibGVFcnJvcmAsIHRoZW5cbiAqIHJldHVybiBgc3BlY2ltZW5gIGNvbnZlcnRlZCB0byBhIHRocm93YWJsZS5cbiAqXG4gKiBPdGhlcndpc2UsIHRocm93IGEgZGlhZ25vc3RpYyBpbmRpY2F0aW5nIGEgZmFpbHVyZSB0byBjb2VyY2UuXG4gKlxuICogVGhpcyBpcyBpbiBzdXBwb3J0IG9mIHRoZSBleG8gYm91bmRhcnkgdGhyb3dpbmcgb25seSB0aHJvd2FibGVzLCB0byBlYXNlXG4gKiBzZWN1cml0eSByZXZpZXcuXG4gKlxuICogVE9ETyBBZG9wdCBhIG1vcmUgZmxleGl0YmxlIG5vdGlvbiBvZiB0aHJvd2FibGUsIGluIHdoaWNoXG4gKiBkYXRhIGNvbnRhaW5lcnMgY29udGFpbmluZyBub24tcGFzc2FibGUgZXJyb3JzIGNhbiB0aGVtc2VsdmVzIGJlIGNvZXJjZWRcbiAqIHRvIHRocm93YWJsZSBieSBjb2VyY2luZyB0byBhIHNpbWlsYXIgY29udGFpbmVycyBjb250YWluaW5nXG4gKiB0aGUgcmVzdWx0cyBvZiBjb2VyY2luZyB0aG9zZSBlcnJvcnMgdG8gcGFzc2FibGUgZXJyb3JzLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtQYXNzYWJsZTxuZXZlciwgRXJyb3I+fVxuICovXG4gICAgICAgY29uc3QgdG9UaHJvd2FibGUgPSBzcGVjaW1lbiA9PiB7XG4gIGhhcmRlbihzcGVjaW1lbik7XG4gIGlmIChpc0Vycm9yTGlrZShzcGVjaW1lbikpIHtcbiAgICByZXR1cm4gdG9QYXNzYWJsZUVycm9yKC8qKiBAdHlwZSB7RXJyb3J9ICovIChzcGVjaW1lbikpO1xuICB9XG4gIGlmICghaXNQcmltaXRpdmUoc3BlY2ltZW4pKSB7XG4gICAgLyogTm90ZSB0aGF0IHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgYHNwZWNpbWVuYCB3b3VsZCBiZSBhIHBhc3NhYmxlIGNvbnRhaW5lciovXG4gICAgLyogZXhjZXB0IHRoYXQgaXQgY29udGFpbnMgbm9uLXBhc3NhYmxlIGVycm9ycyB0aGF0IGNvdWxkIGJlIGNvbnZlcnRlZC4qL1xuICAgIC8qIFRoaXMgd2lsbCBuZWVkIHRvIGJlIGZpeGVkIHRvIGRvIHRoZSBUT0RPIGFib3ZlLiovXG4gICAgY29uc3QgcGFzc1N0eWxlID0gLyoqIEB0eXBlIHtQYXNzU3R5bGV9ICovIChwYXNzU3R5bGVPZihzcGVjaW1lbikpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gLyoqIEB0eXBlIHtDb3B5QXJyYXl9ICovIChzcGVjaW1lbik7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICAgIGVsZW1lbnQgPT09IHRvVGhyb3dhYmxlKGVsZW1lbnQpIHx8XG4gICAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VsZW1lbnR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIGNvbnN0IHJlYyA9IC8qKiBAdHlwZSB7Q29weVJlY29yZH0gKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKHJlYykpIHtcbiAgICAgICAgICB2YWwgPT09IHRvVGhyb3dhYmxlKHZhbCkgfHxcbiAgICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7dmFsfWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIGNvbnN0IHRnID0gLyoqIEB0eXBlIHtDb3B5VGFnZ2VkfSAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBjb25zdCB7IHBheWxvYWQgfSA9IHRnO1xuICAgICAgICBwYXlsb2FkID09PSB0b1Rocm93YWJsZShwYXlsb2FkKSB8fFxuICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7cGF5bG9hZH1gO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCBlciA9IC8qKiBAdHlwZSB7RXJyb3J9ICovIChzcGVjaW1lbik7XG4gICAgICAgIGVyID09PSB0b1Rocm93YWJsZShlcikgfHxcbiAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VyfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYEEgJHtxKHBhc3NTdHlsZSl9IGlzIG5vdCB0aHJvd2FibGU6ICR7c3BlY2ltZW59YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIC8qKiBAdHlwZSB7UGFzc2FibGU8bmV2ZXIsbmV2ZXI+fSAqLyAoc3BlY2ltZW4pO1xufTskaM2PX29uY2UudG9UaHJvd2FibGUodG9UaHJvd2FibGUpO1xuaGFyZGVuKHRvVGhyb3dhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIl0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl0sImlzUGFzc2FibGUiOlsiaXNQYXNzYWJsZSJdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIl0sInRvVGhyb3dhYmxlIjpbInRvVGhyb3dhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPucn7IwLgAAMC4AACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJjYW5CZU1ldGhvZCIsImdldEludGVyZmFjZU9mIiwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsZ2V0TWV0aG9kTmFtZXMsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNQcmltaXRpdmUsZ2V0VGFnLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NoZWNrZXIsIFJlbW90YWJsZU1ldGhvZE5hbWV9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VTcGVjLCBQYXNzU3R5bGVkfSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJ1xuICogQGltcG9ydCB7UmVtb3RhYmxlT2JqZWN0fSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbi8qKlxuICogRm9yIGEgZnVuY3Rpb24gdG8gYmUgYSB2YWxpZCBtZXRob2QsIGl0IG11c3Qgbm90IGJlIHBhc3NhYmxlLlxuICogT3RoZXJ3aXNlLCB3ZSByaXNrIGNvbmZ1c2luZyBwYXNzLWJ5LWNvcHkgZGF0YSBjYXJyeWluZ1xuICogZmFyIGZ1bmN0aW9ucyB3aXRoIGF0dGVtcHRzIGF0IGZhciBvYmplY3RzIHdpdGggbWV0aG9kcy5cbiAqXG4gKiBUT0RPIEhBWkFSRCBCZWNhdXNlIHdlIGNoZWNrIHRoaXMgb24gdGhlIHdheSB0byBoYXJkZW5pbmcgYSByZW1vdGFibGUsXG4gKiB3ZSBjYW5ub3QgeWV0IGNoZWNrIHRoYXQgYGZ1bmNgIGlzIGhhcmRlbmVkLiBIb3dldmVyLCB3aXRob3V0XG4gKiBkb2luZyBzbywgaXQncyBpbmhlcml0YW5jZSBtaWdodCBjaGFuZ2UgYWZ0ZXIgdGhlIGBQQVNTX1NUWUxFYFxuICogY2hlY2sgYmVsb3cuXG4gKlxuICogQHBhcmFtIHthbnl9IGZ1bmNcbiAqIEByZXR1cm5zIHtmdW5jIGlzIENhbGxhYmxlRnVuY3Rpb259XG4gKi9cbiAgICAgICBjb25zdCBjYW5CZU1ldGhvZCA9IGZ1bmMgPT5cbiAgdHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicgJiYgIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRozY9fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKiBUT0RPIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMjg4NCovXG4vKiBBYnN0cmFjdCBvdXQgY2FuQmVNZXRob2ROYW1lIHNvIGxhdGVyIFBScyBhZ3JlZSBvbiBtZXRob2QgbmFtZSByZXN0cmljdGlvbnMuKi9cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0ga2V5XG4gKiBAcmV0dXJucyB7a2V5IGlzIFJlbW90YWJsZU1ldGhvZE5hbWV9XG4gKi9cbmNvbnN0IGNhbkJlTWV0aG9kTmFtZSA9IGtleSA9PlxuICAvKiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Yga2V5ID09PSAnc3ltYm9sJzsqL1xuICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Yga2V5ID09PSAnc3ltYm9sJyB8fCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJztcbmhhcmRlbihjYW5CZU1ldGhvZE5hbWUpO1xuXG4vKipcbiAqIFVzZXMgdGhlIGBnZXRNZXRob2ROYW1lc2AgZnJvbSB0aGUgZXZlbnR1YWwtc2VuZCBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0aGF0XG4gKiBkb2VzIG5vdCBrbm93IGFueXRoaW5nIGFib3V0IHJlbW90YWJsZXMuXG4gKlxuICogQ3VycmVudGx5LCBqdXN0IGFsaWFzIGBnZXRNZXRob2ROYW1lc2AgYnV0IHRoaXMgYWJzdHJhY3Rpb24gZXhpc3RzIHNvXG4gKiBhIGZ1dHVyZSBQUiBjYW4gZW5mb3JjZSByZXN0cmljdGlvbnMgb24gbWV0aG9kIG5hbWVzIG9mIHJlbW90YWJsZXMuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVFxuICogQHBhcmFtIHtUfSBiZWhhdmlvck1ldGhvZHNcbiAqIEByZXR1cm5zIHtSZW1vdGFibGVNZXRob2ROYW1lW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRSZW1vdGFibGVNZXRob2ROYW1lcyA9IGJlaGF2aW9yTWV0aG9kcyA9PlxuICBnZXRNZXRob2ROYW1lcyhiZWhhdmlvck1ldGhvZHMpOyRozY9fb25jZS5nZXRSZW1vdGFibGVNZXRob2ROYW1lcyhnZXRSZW1vdGFibGVNZXRob2ROYW1lcyk7XG5oYXJkZW4oZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMpO1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBoYXNPd24sXG59ID0gT2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja0lmYWNlID0gKGlmYWNlLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIC8qIFRPRE8gb3RoZXIgcG9zc2libGUgaWZhY2VzLCBvbmNlIHdlIGhhdmUgdGhpcmQgcGFydHkgdmVyYWNpdHkqL1xuICAgICh0eXBlb2YgaWZhY2UgPT09ICdzdHJpbmcnIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBGb3Igbm93LCBpbnRlcmZhY2UgJHtpZmFjZX0gbXVzdCBiZSBhIHN0cmluZzsgdW5pbXBsZW1lbnRlZGApKSAmJlxuICAgIChpZmFjZSA9PT0gJ1JlbW90YWJsZScgfHxcbiAgICAgIGlmYWNlLnN0YXJ0c1dpdGgoJ0FsbGVnZWQ6ICcpIHx8XG4gICAgICBpZmFjZS5zdGFydHNXaXRoKCdEZWJ1Z05hbWU6ICcpIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChjaGVjaylgRm9yIG5vdywgaWZhY2UgJHtxKFxuICAgICAgICAgIGlmYWNlLFxuICAgICAgICApfSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aCBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIjsgdW5pbXBsZW1lbnRlZGApKVxuICApO1xufTtcblxuLyoqXG4gKiBBbiBgaWZhY2VgIG11c3QgYmUgcHVyZS4gUmlnaHQgbm93IGl0IG11c3QgYmUgYSBzdHJpbmcsIHdoaWNoIGlzIHB1cmUuXG4gKiBMYXRlciB3ZSBleHBlY3QgdG8gaW5jbHVkZSBzb21lIG90aGVyIHZhbHVlcyB0aGF0IHF1YWxpZnkgYXMgYFB1cmVEYXRhYCxcbiAqIHdoaWNoIGlzIGEgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGVuZGluZyBvbmx5IGluIHByaW1pdGl2ZXMgb3JcbiAqIGVtcHR5IHBhc3MtYnktY29weSBjb21wb3NpdGVzLiBObyByZW1vdGFibGVzLCBwcm9taXNlcywgb3IgZXJyb3JzLlxuICogV2UgKmFzc3VtZSogZm9yIG5vdyB0aGF0IHRoZSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgY29udGFpbnMgbm9cbiAqIHByb3hpZXMuXG4gKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0SWZhY2UgPSBpZmFjZSA9PiBjaGVja0lmYWNlKGlmYWNlLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdCB8IEZ1bmN0aW9ufSBvcmlnaW5hbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mID0gKG9yaWdpbmFsLCBjaGVjaykgPT4ge1xuICAhaXNQcmltaXRpdmUob3JpZ2luYWwpIHx8XG4gICAgRmFpbGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuICAvKiBBIHZhbGlkIHJlbW90YWJsZSBvYmplY3QgbXVzdCBpbmhlcml0IGZyb20gYSBcInRhZyByZWNvcmRcIiAtLSBhKi9cbiAgLyogcGxhaW4tb2JqZWN0IHByb3RvdHlwZSBjb25zaXN0aW5nIG9mIG9ubHkqL1xuICAvKiBhIGBQQVNTX1NUWUxFYCBwcm9wZXJ0eSB3aXRoIHZhbHVlIFwicmVtb3RhYmxlXCIgYW5kIGEgc3VpdGFibGUgYFN5bWJvbC50b1N0cmluZ1RhZ2AqL1xuICAvKiBwcm9wZXJ0eS4gVGhlIHJlbW90YWJsZSBjb3VsZCBpbmhlcml0IGRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQsIG9yKi9cbiAgLyogaXQgY291bGQgaW5oZXJpdCBmcm9tIGFub3RoZXIgdmFsaWQgcmVtb3RhYmxlLCB0aGF0IHRoZXJlZm9yZSBpdHNlbGYqL1xuICAvKiBpbmhlcml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQuKi9cbiAgLyoqL1xuICAvKiBUT0RPOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHR5cGVkZWYgdGhpcyBzaGFwZSwgYnV0IHdlIGNhbid0IGRlY2xhcmUgYSB0eXBlKi9cbiAgLyogd2l0aCBQQVNTX1NUWUxFIGZyb20gSlNEb2MuKi9cbiAgLyoqL1xuICAvKiBAdHlwZSB7eyBbUEFTU19TVFlMRV06IHN0cmluZywqL1xuICAvKiBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nLCovXG4gIC8qIH19Ki9cbiAgLyoqL1xuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbiAgaWYgKFxuICAgIHByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICBwcm90byA9PT0gbnVsbCB8fFxuICAgIHByb3RvID09PSBGdW5jdGlvbi5wcm90b3R5cGVcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBSZW1vdGFibGVzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZDogJHtxKG9yaWdpbmFsKX1gXG4gICAgKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3JpZ2luYWwgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgcHJvdG9Qcm90byA9IGdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICBpZiAocHJvdG9Qcm90byAhPT0gb2JqZWN0UHJvdG90eXBlICYmIHByb3RvUHJvdG8gIT09IG51bGwpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICByZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sIGNoZWNrKTtcbiAgICB9XG4gICAgaWYgKCFjaGVja1RhZ1JlY29yZChwcm90bywgJ3JlbW90YWJsZScsIGNoZWNrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygb3JpZ2luYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoIWNoZWNrRnVuY3Rpb25UYWdSZWNvcmQocHJvdG8sICdyZW1vdGFibGUnLCBjaGVjaykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuICBjb25zdCBwYXNzU3R5bGVLZXkgPSAvKiogQHR5cGUge3Vua25vd259ICovIChQQVNTX1NUWUxFKTtcbiAgY29uc3QgdGFnS2V5ID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoU3ltYm9sLnRvU3RyaW5nVGFnKTtcbiAgY29uc3Qge1xuICAgIC8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cbiAgICBbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXNzU3R5bGVLZXkpXTogX3Bhc3NTdHlsZURlc2MsXG4gICAgWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAodGFnS2V5KV06IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgLi4ucmVzdERlc2NzXG4gIH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHByb3RvKTtcblxuICByZXR1cm4gKFxuICAgIChvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoID09PSAwIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApKSAmJlxuICAgIGNoZWNrSWZhY2UoaWZhY2UsIGNoZWNrKVxuICApO1xufTtcblxuLyoqXG4gKiBLZWVwIGEgd2VhayBzZXQgb2YgY29uZmlybWVkIHJlbW90YWJsZXMgZm9yIG1hcnNoYWwgcGVyZm9ybWFuY2VcbiAqICh3aXRob3V0IHdoaWNoIHdlIHdvdWxkIGluY3VyIGEgcmVkdW5kYW50IHZlcmlmaWNhdGlvbiBpblxuICogZ2V0SW50ZXJmYWNlT2YpLlxuICogV2UgZG9uJ3QgcmVtZW1iZXIgcmVqZWN0aW9ucyBiZWNhdXNlIHRoZXkgYXJlIHBvc3NpYmxlIHRvIGNvcnJlY3RcbiAqIHdpdGggZS5nLiBgaGFyZGVuYC5cbiAqXG4gKiBAdHlwZSB7V2Vha1NldDxSZW1vdGFibGVPYmplY3Q+fVxuICovXG5jb25zdCBjb25maXJtZWRSZW1vdGFibGVzID0gbmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHt2YWwgaXMgUmVtb3RhYmxlT2JqZWN0fVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChjb25maXJtZWRSZW1vdGFibGVzLmhhcyh2YWwpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFpc0Zyb3plbih2YWwpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiYgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YFxuICAgICk7XG4gIH1cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgaWYgKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsIGNoZWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjaGVja1JlbW90YWJsZVByb3RvT2YodmFsLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBjb25maXJtZWRSZW1vdGFibGVzLmFkZCh2YWwpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFNpbXBsZSBzZW1hbnRpY3MsIGp1c3QgdGVsbCB3aGF0IGludGVyZmFjZSBzcGVjIGEgUmVtb3RhYmxlIGhhcyxcbiAqIG9yIHVuZGVmaW5lZCBpZiBub3QgZGVlbWVkIHRvIGJlIGEgUmVtb3RhYmxlLlxuICpcbiAqIEB0eXBlIHt7XG4gKiA8VCBleHRlbmRzIHN0cmluZz4odmFsOiBQYXNzU3R5bGVkPGFueSwgVD4pOiBUO1xuICogKHZhbDogYW55KTogSW50ZXJmYWNlU3BlYyB8IHVuZGVmaW5lZDtcbiAqIH19XG4gKi9cbiAgICAgICBjb25zdCBnZXRJbnRlcmZhY2VPZiA9IHZhbCA9PiB7XG4gIGlmIChcbiAgICBpc1ByaW1pdGl2ZSh2YWwpIHx8XG4gICAgdmFsW1BBU1NfU1RZTEVdICE9PSAncmVtb3RhYmxlJyB8fFxuICAgICFjaGVja1JlbW90YWJsZSh2YWwpXG4gICkge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gIHJldHVybiBnZXRUYWcodmFsKTtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBSZW1vdGFibGVIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdyZW1vdGFibGUnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgdmFsaWRUeXBlID1cbiAgICAgICghaXNQcmltaXRpdmUoY2FuZGlkYXRlKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICghaXNBcnJheShjYW5kaWRhdGUpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG4gICAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8qIEV2ZXJ5IG93biBwcm9wZXJ0eSAocmVnYXJkbGVzcyBvZiBlbnVtZXJhYmlsaXR5KSovXG4gICAgICAvKiBtdXN0IGhhdmUgYSBmdW5jdGlvbiB2YWx1ZS4qL1xuICAgICAgcmV0dXJuIG93bktleXMoZGVzY3MpLmV2ZXJ5KGtleSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgLyogVHlwZWNhc3QgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuICAgICAgICAgIChoYXNPd24oZGVzY3NbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChrZXkpXSwgJ3ZhbHVlJykgfHxcbiAgICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBhY2Nlc3NvcnMgbGlrZSAke3EoXG4gICAgICAgICAgICAgICAgU3RyaW5nKGtleSksXG4gICAgICAgICAgICAgICl9IGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICgoa2V5ID09PSBTeW1ib2wudG9TdHJpbmdUYWcgJiYgY2hlY2tJZmFjZShjYW5kaWRhdGVba2V5XSwgY2hlY2spKSB8fFxuICAgICAgICAgICAgKChjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSkgfHxcbiAgICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggbm9uLW1ldGhvZHMgbGlrZSAke3EoXG4gICAgICAgICAgICAgICAgICBTdHJpbmcoa2V5KSxcbiAgICAgICAgICAgICAgICApfSBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgICAgICAgKGtleSAhPT0gUEFTU19TVFlMRSB8fFxuICAgICAgICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICAgICAgICBDWChjaGVjaylgQSBwYXNzLWJ5LXJlbW90ZSBjYW5ub3Qgc2hhZG93ICR7cShQQVNTX1NUWUxFKX1gKSkpKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvKiBGYXIgZnVuY3Rpb25zIGNhbm5vdCBiZSBtZXRob2RzLCBhbmQgY2Fubm90IGhhdmUgbWV0aG9kcy4qL1xuICAgICAgLyogVGhleSBtdXN0IGhhdmUgZXhhY3RseSBleHBlY3RlZCBgLm5hbWVgIGFuZCBgLmxlbmd0aGAgcHJvcGVydGllcyovXG4gICAgICBjb25zdCB7XG4gICAgICAgIG5hbWU6IG5hbWVEZXNjLFxuICAgICAgICBsZW5ndGg6IGxlbmd0aERlc2MsXG4gICAgICAgIC8qIEB0cy1pZ25vcmUgVFMgZG9lc24ndCBsaWtlIHN5bWJvbHMgYXMgY29tcHV0ZWQgaW5kZXhlcz8/Ki9cbiAgICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHRvU3RyaW5nVGFnRGVzYyxcbiAgICAgICAgLi4ucmVzdERlc2NzXG4gICAgICB9ID0gZGVzY3M7XG4gICAgICBjb25zdCByZXN0S2V5cyA9IG93bktleXMocmVzdERlc2NzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICgobmFtZURlc2MgJiYgdHlwZW9mIG5hbWVEZXNjLnZhbHVlID09PSAnc3RyaW5nJykgfHxcbiAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgQ1goY2hlY2spYEZhciBmdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAoKGxlbmd0aERlc2MgJiYgdHlwZW9mIGxlbmd0aERlc2MudmFsdWUgPT09ICdudW1iZXInKSB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICApYEZhciBmdW5jdGlvbiBsZW5ndGggbXVzdCBiZSBhIG51bWJlciwgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICh0b1N0cmluZ1RhZ0Rlc2MgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICgodHlwZW9mIHRvU3RyaW5nVGFnRGVzYy52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgICApYEZhciBmdW5jdGlvbiBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICAgY2hlY2tJZmFjZSh0b1N0cmluZ1RhZ0Rlc2MudmFsdWUsIGNoZWNrKSkpICYmXG4gICAgICAgIChyZXN0S2V5cy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgKWBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gISFjaGVjayAmJiBDWChjaGVjaylgdW5yZWNvZ25pemVkIHR5cGVvZiAke2NhbmRpZGF0ZX1gO1xuICB9LFxuXG4gIGFzc2VydFJlc3RWYWxpZDogY2FuZGlkYXRlID0+IGNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlciksXG5cbiAgZXZlcnk6IChfcGFzc2FibGUsIF9mbikgPT4gdHJ1ZSxcbn0pOyRozY9fb25jZS5SZW1vdGFibGVIZWxwZXIoUmVtb3RhYmxlSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIjpbImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIl0sImFzc2VydElmYWNlIjpbImFzc2VydElmYWNlIl0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIl0sIlJlbW90YWJsZUhlbHBlciI6WyJSZW1vdGFibGVIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAh4APKFIWAABSFgAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zYWZlLXByb21pc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0U2FmZVByb21pc2UiLCJpc1NhZmVQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaXNQcm9taXNlLHEsYXNzZXJ0Q2hlY2tlcixDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqIEBpbXBvcnQge0NoZWNrZXJ9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IHsgaXNGcm96ZW4sIGdldFByb3RvdHlwZU9mLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsIGhhc093biB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyB0b1N0cmluZ1RhZyB9ID0gU3ltYm9sO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZX0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXMgPSAocHIsIGNoZWNrKSA9PiB7XG4gIGNvbnN0IGtleXMgPSBvd25LZXlzKHByKTtcblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICogVGhpcyBleGNsdWRlcyB0aG9zZSBzeW1ib2wtbmFtZWQgb3duIHByb3BlcnRpZXMgdGhhdCBhcmUgYWxzbyBmb3VuZCBvblxuICogYFByb21pc2UucHJvdG90eXBlYCwgc28gdGhhdCBvdmVycmlkZXMgb2YgdGhlc2UgcHJvcGVydGllcyBjYW4gYmVcbiAqIGV4cGxpY2l0bHkgdG9sZXJhdGVkIGlmIHRoZXkgcGFzcyB0aGUgYGNoZWNrU2FmZU93bktleWAgY2hlY2sgYmVsb3cuXG4gKiBJbiBwYXJ0aWN1bGFyLCB3ZSB3aXNoIHRvIHRvbGVyYXRlXG4gKiAgICogQW4gb3ZlcnJpZGluZyBgdG9TdHJpbmdUYWdgIG5vbi1lbnVtZXJhYmxlIGRhdGEgcHJvcGVydHlcbiAqICAgICB3aXRoIGEgc3RyaW5nIHZhbHVlLlxuICogICAqIFRob3NlIG93biBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgYmUgYWRkZWQgYnkgTm9kZSdzIGFzeW5jX2hvb2tzLlxuICovXG4gIGNvbnN0IHVua25vd25LZXlzID0ga2V5cy5maWx0ZXIoXG4gICAga2V5ID0+IHR5cGVvZiBrZXkgIT09ICdzeW1ib2wnIHx8ICFoYXNPd24oUHJvbWlzZS5wcm90b3R5cGUsIGtleSksXG4gICk7XG5cbiAgaWYgKHVua25vd25LZXlzLmxlbmd0aCAhPT0gMCkge1xuICAgIHJldHVybiBDWChcbiAgICAgIGNoZWNrLFxuICAgIClgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gO1xuICB9XG5cbiAgLyoqXG4gKiBFeHBsaWNpdGx5IHRvbGVyYXRlIGEgYHRvU3RyaW5nVGFnYCBzeW1ib2wtbmFtZWQgbm9uLWVudW1lcmFibGVcbiAqIGRhdGEgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgYSBzdHJpbmcuIE90aGVyd2lzZSwgdG9sZXJhdGUgdGhvc2VcbiAqIHN5bWJvbC1uYW1lZCBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgYmUgYWRkZWQgYnkgTm9kZUpTJ3MgYXN5bmNfaG9va3MsXG4gKiBpZiB0aGV5IG9iZXkgdGhlIGV4cGVjdGVkIHNhZmV0eSBwcm9wZXJ0aWVzLlxuICpcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBzYWZlbHkgdG9sZXJhdGVcbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gZGVzdHJveVRyYWNraW5nKHByb21pc2UsIHBhcmVudCkge1xuICogICB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuICBjb25zdCBjaGVja1NhZmVPd25LZXkgPSBrZXkgPT4ge1xuICAgIGlmIChrZXkgPT09IHRvU3RyaW5nVGFnKSB7XG4gICAgICAvKiBUT0RPIHNob3VsZCB3ZSBhbHNvIGVuZm9yY2UgYW55dGhpbmcgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcsKi9cbiAgICAgIC8qIHN1Y2ggYXMgdGhhdCBpdCBtdXN0IHN0YXJ0IHdpdGggYCdQcm9taXNlJ2A/Ki9cbiAgICAgIGNvbnN0IHRhZ0Rlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHIsIHRvU3RyaW5nVGFnKTtcbiAgICAgIGFzc2VydCh0YWdEZXNjICE9PSB1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGhhc093bih0YWdEZXNjLCAndmFsdWUnKSB8fFxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eSwgbm90IGFuIGFjY2Vzc29yOiAke3EodGFnRGVzYyl9YCkgJiZcbiAgICAgICAgKHR5cGVvZiB0YWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBPd24gQEB0b1N0cmluZ1RhZyB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nOiAke3EodGFnRGVzYy52YWx1ZSl9YCkgJiZcbiAgICAgICAgKCF0YWdEZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgICBDWChjaGVjaylgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtxKHRhZ0Rlc2MpfWApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBwcltrZXldO1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWwgIT09IG51bGwgJiZcbiAgICAgIGlzRnJvemVuKHZhbCkgJiZcbiAgICAgIGdldFByb3RvdHlwZU9mKHZhbCkgPT09IE9iamVjdC5wcm90b3R5cGVcbiAgICApIHtcbiAgICAgIGNvbnN0IHN1YktleXMgPSBvd25LZXlzKHZhbCk7XG4gICAgICBpZiAoc3ViS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgc3ViS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgc3ViS2V5c1swXSA9PT0gJ2Rlc3Ryb3llZCcgJiZcbiAgICAgICAgdmFsLmRlc3Ryb3llZCA9PT0gZmFsc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIENYKFxuICAgICAgY2hlY2ssXG4gICAgKWBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcbiAgICAgIFN0cmluZyhrZXkpLFxuICAgICl9IGlzICR7dmFsfWA7XG4gIH07XG5cbiAgcmV0dXJuIGtleXMuZXZlcnkoY2hlY2tTYWZlT3duS2V5KTtcbn07XG5cbi8qKlxuICogVW5kZXIgSGFyZGVuZWQgSlMgYSBwcm9taXNlIGlzIFwic2FmZVwiIGlmIGl0cyBgdGhlbmAgbWV0aG9kIGNhbiBiZSBjYWxsZWRcbiAqIHN5bmNocm9ub3VzbHkgd2l0aG91dCBnaXZpbmcgdGhlIHByb21pc2UgYW4gb3Bwb3J0dW5pdHkgZm9yIGFcbiAqIHJlZW50cmFuY3kgYXR0YWNrIGR1cmluZyB0aGF0IGNhbGwuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85XG4gKiByYWlzZXMgdGhlIGlzc3VlIG9mIHRlc3RpbmcgdGhhdCBhIHNwZWNpbWVuIGlzIGEgc2FmZSBwcm9taXNlXG4gKiBzdWNoIHRoYXQgdGhlIHRlc3QgYWxzbyBkb2VzIG5vdCBnaXZlIHRoZSBzcGVjaW1lbiBhXG4gKiByZWVudHJhbmN5IG9wcG9ydHVuaXR5LiBUaGF0IGlzIHdlbGwgYmV5b25kIHRoZSBhbWJpdGlvbiBoZXJlLlxuICogVE9ETyBUaG91Z2ggaWYgd2UgZmlndXJlIG91dCBhIG5pY2Ugc29sdXRpb24sIGl0IG1pZ2h0IGJlIGdvb2QgdG9cbiAqIHVzZSBpdCBoZXJlIGFzIHdlbGwuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZSA9IChwciwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICAoaXNGcm96ZW4ocHIpIHx8IENYKGNoZWNrKWAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkgJiZcbiAgICAoaXNQcm9taXNlKHByKSB8fCBDWChjaGVjaylgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApICYmXG4gICAgKGdldFByb3RvdHlwZU9mKHByKSA9PT0gUHJvbWlzZS5wcm90b3R5cGUgfHxcbiAgICAgIENYKGNoZWNrKWAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG4gICAgICAgIGdldFByb3RvdHlwZU9mKHByKSxcbiAgICAgICl9YCkgJiZcbiAgICBjaGVja1Byb21pc2VPd25LZXlzKC8qKiBAdHlwZSB7UHJvbWlzZX0gKi8gKHByKSwgY2hlY2spXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG4gICAgICAgY29uc3QgaXNTYWZlUHJvbWlzZSA9IHByID0+IGNoZWNrU2FmZVByb21pc2UocHIsIHggPT4geCk7JGjNj19vbmNlLmlzU2FmZVByb21pc2UoaXNTYWZlUHJvbWlzZSk7XG5oYXJkZW4oaXNTYWZlUHJvbWlzZSk7XG5cbiAgICAgICBjb25zdCBhc3NlcnRTYWZlUHJvbWlzZSA9IHByID0+IGNoZWNrU2FmZVByb21pc2UocHIsIGFzc2VydENoZWNrZXIpOyRozY9fb25jZS5hc3NlcnRTYWZlUHJvbWlzZShhc3NlcnRTYWZlUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1NhZmVQcm9taXNlIjpbImlzU2FmZVByb21pc2UiXSwiYXNzZXJ0U2FmZVByb21pc2UiOlsiYXNzZXJ0U2FmZVByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/KjZB9sPAADbDwAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zdHJpbmcuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN0cmluZyIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJpc1dlbGxGb3JtZWRTdHJpbmciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbixGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKiBrbm93IGFib3V0YGlzV2VsbEZvcm1lZGAqL1xuY29uc3QgaGFzV2VsbEZvcm1lZFN0cmluZ01ldGhvZCA9ICEhU3RyaW5nLnByb3RvdHlwZS5pc1dlbGxGb3JtZWQ7XG5cbi8qKlxuICogSXMgdGhlIGFyZ3VtZW50IGEgd2VsbC1mb3JtZWQgc3RyaW5nP1xuICpcbiAqIFVuZm9ydHVuYXRlbHksIHRoZVxuICogW3N0YW5kYXJkIGJ1aWx0LWluIGBTdHJpbmcucHJvdG90eXBlLmlzV2VsbEZvcm1lZGBdKGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWlzLXVzdi1zdHJpbmcpXG4gKiBkb2VzIGEgVG9TdHJpbmcgb24gaXRzIGlucHV0LCBjYXVzaW5nIGl0IHRvIGp1ZGdlIG5vbi1zdHJpbmdzIHRvIGJlXG4gKiB3ZWxsLWZvcm1lZCBzdHJpbmdzIGlmIHRoZXkgY29lcmNlIHRvIGEgd2VsbC1mb3JtZWQgc3RyaW5ncy4gVGhpc1xuICogcmVjYXBpdHVsYXRlcyB0aGUgbWlzdGFrZSBpbiBoYXZpbmcgdGhlIGdsb2JhbCBgaXNOYU5gIGNvZXJjZSBpdHMgaW5wdXRzLFxuICogY2F1c2luZyBpdCB0byBqdWRnZSBub24tc3RyaW5nIHRvIGJlIE5hTiBpZiB0aGV5IGNvZXJjZSB0byBOYU4uXG4gKlxuICogVGhpcyBgaXNXZWxsRm9ybWVkU3RyaW5nYCBmdW5jdGlvbiBvbmx5IGp1ZGdlcyB3ZWxsLWZvcm1lZCBzdHJpbmdzIHRvIGJlXG4gKiB3ZWxsLWZvcm1lZCBzdHJpbmdzLiBGb3IgYWxsIG5vbi1zdHJpbmdzIGl0IHJldHVybnMgZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBzdHJcbiAqIEByZXR1cm5zIHtzdHIgaXMgc3RyaW5nfVxuICovXG4gICAgICAgY29uc3QgaXNXZWxsRm9ybWVkU3RyaW5nID0gaGFzV2VsbEZvcm1lZFN0cmluZ01ldGhvZFxuICA/IHN0ciA9PiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyAmJiBzdHIuaXNXZWxsRm9ybWVkKClcbiAgOiBzdHIgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2ggb2Ygc3RyKSB7XG4gICAgICAgIC8qIFRoZSBzdHJpbmcgaXRlcmF0b3IgaXRlcmF0ZXMgYnkgVW5pY29kZSBjb2RlIHBvaW50LCBub3QqL1xuICAgICAgICAvKiBVVEYxNiBjb2RlIHVuaXQuIEJ1dCBpZiBpdCBlbmNvdW50ZXJzIGFuIHVucGFpcmVkIHN1cnJvZ2F0ZSwqL1xuICAgICAgICAvKiBpdCB3aWxsIHByb2R1Y2UgaXQuKi9cbiAgICAgICAgY29uc3QgY3AgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGNoLmNvZGVQb2ludEF0KDApKTtcbiAgICAgICAgaWYgKGNwID49IDB4ZDgwMCAmJiBjcCA8PSAweGRmZmYpIHtcbiAgICAgICAgICAvKiBBbGwgc3Vycm9nYXRlcyBhcmUgaW4gdGhpcyByYW5nZS4gVGhlIHN0cmluZyBpdGVyYXRvciBvbmx5Ki9cbiAgICAgICAgICAvKiBwcm9kdWNlcyBhIGNoYXJhY3RlciBpbiB0aGlzIHJhbmdlIGZvciB1bnBhaXJlZCBzdXJyb2dhdGVzLCovXG4gICAgICAgICAgLyogd2hpY2ggb25seSBoYXBwZW5zIGlmIHRoZSBzdHJpbmcgaXMgbm90IHdlbGwtZm9ybWVkLiovXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9OyRozY9fb25jZS5pc1dlbGxGb3JtZWRTdHJpbmcoaXNXZWxsRm9ybWVkU3RyaW5nKTtcbmhhcmRlbihpc1dlbGxGb3JtZWRTdHJpbmcpO1xuXG4vKipcbiAqIFJldHVybnMgbm9ybWFsbHkgd2hlbiBgaXNXZWxsRm9ybWVkU3RyaW5nKHN0cilgIHdvdWxkIHJldHVybiB0cnVlLlxuICogVGhyb3dzIGEgZGlhZ25vc3RpYyBlcnJvciB3aGVuIGBpc1dlbGxGb3JtZWRTdHJpbmcoc3RyKWAgd291bGQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3RyXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzdHIgaXMgc3RyaW5nfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyA9IHN0ciA9PiB7XG4gIGlzV2VsbEZvcm1lZFN0cmluZyhzdHIpIHx8IEZhaWxgRXhwZWN0ZWQgd2VsbC1mb3JtZWQgdW5pY29kZSBzdHJpbmc6ICR7c3RyfWA7XG59OyRozY9fb25jZS5hc3NlcnRXZWxsRm9ybWVkU3RyaW5nKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuXG5jb25zdCBPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUgPVxuICBnZXRFbnZpcm9ubWVudE9wdGlvbignT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFJywgJ2Rpc2FibGVkJywgW1xuICAgICdlbmFibGVkJyxcbiAgXSkgPT09ICdlbmFibGVkJztcblxuLyoqXG4gKiBGb3Igbm93LFxuICogaWYgYE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRWAgZW52aXJvbm1lbnQgb3B0aW9uIGlzIGAnZW5hYmxlZCdgLFxuICogdGhlbiBgYXNzZXJ0UGFzc2FibGVTdHJpbmdgIGlzIHRoZSBzYW1lIGFzIGBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nYC5cbiAqIE90aGVyd2lzZSBgYXNzZXJ0UGFzc2FibGVTdHJpbmdgIGp1c3QgYXNzZXJ0cyB0aGF0IGBzdHJgIGlzIGEgc3RyaW5nLlxuICpcbiAqIEN1cnJlbnRseSwgYE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRWAgZGVmYXVsdHMgdG8gYCdkaXNhYmxlZCdgXG4gKiBiZWNhdXNlIHdlIGRvIG5vdCB5ZXQga25vdyB0aGUgcGVyZm9ybWFuY2UgaW1wYWN0LiBMYXRlciwgaWYgd2UgZGVjaWRlIHdlXG4gKiBjYW4gYWZmb3JkIGl0LCB3ZSdsbCBmaXJzdCBjaGFuZ2UgdGhlIGRlZmF1bHQgdG8gYCdlbmFibGVkJ2AgYW5kIHVsdGltYXRlbHlcbiAqIHJlbW92ZSB0aGUgc3dpdGNoIGFsdG9nZXRoZXIuIEJlIHByZXBhcmVkIGZvciB0aGVzZSBjaGFuZ2VzLlxuICpcbiAqIFRPRE8gb25jZSB0aGUgc3dpdGNoIGlzIHJlbW92ZWQsIHNpbXBsaWZ5IGBhc3NlcnRQYXNzYWJsZVN0cmluZ2AgdG9cbiAqIHNpbXBseSBiZSBgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZ2AuXG4gKlxuICogQHBhcmFtIHsgdW5rbm93biB9IHN0clxuICogQHJldHVybnMge2Fzc2VydHMgc3RyIGlzIHN0cmluZyB9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRQYXNzYWJsZVN0cmluZyA9IHN0ciA9PiB7XG4gIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnIHx8IEZhaWxgRXhwZWN0ZWQgc3RyaW5nICR7c3RyfWA7XG4gICFPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUgfHwgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyhzdHIpO1xufTskaM2PX29uY2UuYXNzZXJ0UGFzc2FibGVTdHJpbmcoYXNzZXJ0UGFzc2FibGVTdHJpbmcpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3RyaW5nKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzV2VsbEZvcm1lZFN0cmluZyI6WyJpc1dlbGxGb3JtZWRTdHJpbmciXSwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyI6WyJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIl0sImFzc2VydFBhc3NhYmxlU3RyaW5nIjpbImFzc2VydFBhc3NhYmxlU3RyaW5nIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAL3NCLDFAAAwxQAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc3ltYm9sLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBUaGUgd2VsbCBrbm93biBzeW1ib2xzIGFyZSBzdGF0aWMgc3ltYm9sIHZhbHVlcyBvbiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzID0gbmV3IE1hcChcbiAgb3duS2V5cyhTeW1ib2wpXG4gICAgLmZpbHRlcihcbiAgICAgIG5hbWUgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBTeW1ib2xbbmFtZV0gPT09ICdzeW1ib2wnLFxuICAgIClcbiAgICAuZmlsdGVyKG5hbWUgPT4ge1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqL1xuICAgICAgIW5hbWUuc3RhcnRzV2l0aCgnQEAnKSB8fFxuICAgICAgICBGYWlsYERpZCBub3QgZXhwZWN0IFN5bWJvbCB0byBoYXZlIGEgc3ltYm9sLXZhbHVlZCBwcm9wZXJ0eSBuYW1lIHN0YXJ0aW5nIHdpdGggXCJAQFwiICR7cShcbiAgICAgICAgICBuYW1lLFxuICAgICAgICApfWA7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KVxuICAgIC8qIEB0cy1pZ25vcmUgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiAgICAubWFwKG5hbWUgPT4gW1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSxcbik7XG5cbi8qKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3ltXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGVTeW1ib2wgPSBzeW0gPT5cbiAgdHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcgJiZcbiAgKHR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSkgPT09ICdzdHJpbmcnIHx8IHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaM2PX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3ltYm9sID0gc3ltID0+XG4gIGlzUGFzc2FibGVTeW1ib2woc3ltKSB8fFxuICBGYWlsYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qKlxuICogSWYgYHN5bWAgaXMgYSBwYXNzYWJsZSBzeW1ib2wsIHJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpc1xuICogc3ltYm9sLiBJZiBgc3ltYCBpcyBhIG5vbi1wYXNzYWJsZSBzeW1ib2wsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLiBTaW5jZSB0aGUgcmVnaXN0cmF0aW9uIHN0cmluZyBvZiBhIHJlZ2lzdGVyZWQgc3ltYm9sIGNhbiBiZSBhbnlcbiAqIHN0cmluZywgaWYgd2Ugc2ltcGx5IHVzZWQgdGhhdCB0byBpZGVudGlmeSB0aG9zZSBzeW1ib2xzLCB0aGVyZSB3b3VsZCBub3RcbiAqIGJlIGFueSByZW1haW5pbmcgc3RyaW5ncyBsZWZ0IG92ZXIgdG8gaWRlbnRpZnkgdGhlIHdlbGwta25vd24gc3ltYm9scy5cbiAqIEluc3RlYWQsIHdlIHJlc2VydmUgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgXCJAQFwiYCBmb3IgcHVycG9zZXMgb2YgdGhpc1xuICogZW5jb2RpbmcuIFdlIGlkZW50aWZ5IGEgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhcyBgU3ltYm9sLml0ZXJhdG9yYFxuICogYnkgcHJlZml4aW5nIHRoZSBwcm9wZXJ0eSBuYW1lIHdpdGggYFwiQEBcImAsIHN1Y2ggYXMgYFwiQEBpdGVyYXRvclwiYC5cbiAqIEZvciByZWdpc3RlcmVkIHN5bWJvbHMgd2hvc2UgbmFtZSBoYXBwZW5zIHRvIGJlZ2luIHdpdGggYFwiQEBcImAsIHN1Y2hcbiAqIGFzIGBTeW1ib2wuZm9yKCdAQGl0ZXJhdG9yJylgIG9yIGBTeW1ib2wuZm9yKCdAQGZvbycpYCwgd2UgaWRlbnRpZnlcbiAqIHRoZW0gYnkgcHJlZml4aW5nIHRoZW0gd2l0aCBhbiBleHRyYSBgXCJAQFwiYCwgc3VjaCBhc1xuICogYFwiQEBAQGl0ZXJhdG9yXCJgIG9yIGBcIkBAQEBmb29cImAuIChUaGlzIGlzIHRoZSBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nXG4gKiB0ZWNobmlxdWUuKVxuICpcbiAqIEBwYXJhbSB7c3ltYm9sfSBzeW1cbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovXG4gICAgICAgY29uc3QgbmFtZUZvclBhc3NhYmxlU3ltYm9sID0gc3ltID0+IHtcbiAgY29uc3QgbmFtZSA9IFN5bWJvbC5rZXlGb3Ioc3ltKTtcbiAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB3ZWxsS25vd25TeW1ib2xOYW1lcy5nZXQoc3ltKTtcbiAgfVxuICBpZiAobmFtZS5zdGFydHNXaXRoKCdAQCcpKSB7XG4gICAgcmV0dXJuIGBAQCR7bmFtZX1gO1xuICB9XG4gIHJldHVybiBuYW1lO1xufTskaM2PX29uY2UubmFtZUZvclBhc3NhYmxlU3ltYm9sKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4obmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgQXRBdFByZWZpeFBhdHRlcm4gPSAvXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBJZiBgbmFtZWAgaXMgYSBzdHJpbmcgdGhhdCBjb3VsZCBoYXZlIGJlZW4gcHJvZHVjZWQgYnlcbiAqIGBuYW1lRm9yUGFzc2FibGVTeW1ib2xgLCByZXR1cm4gdGhlIHN5bWJvbCBhcmd1bWVudCBpdCB3YXMgcHJvZHVjZWQgdG9cbiAqIHJlcHJlc2VudC5cbiAqXG4gKiAgICBJZiBgbmFtZWAgZG9lcyBub3QgYmVnaW4gd2l0aCBgXCJAQFwiYCwgdGhlbiBqdXN0IHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICAgIHJlZ2lzdGVyZWQgc3ltYm9sLCBgU3ltYm9sLmZvcihuYW1lKWAuXG4gKiAgICBJZiBgbmFtZWAgaXMgYFwiQEBcImAgZm9sbG93ZWQgYnkgYSB3ZWxsIGtub3duIHN5bWJvbCdzIHByb3BlcnR5IG5hbWUgb25cbiAqICAgICAgYFN5bWJvbGAgc3VjaCBgXCJAQGl0ZXJhdG9yXCIsIHJldHVybiB0aGF0IHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXNcbiAqICAgICAgYFN5bWJvbC5pdGVyYXRvcmBcbiAqICAgIElmIGBuYW1lYCBiZWdpbnMgd2l0aCBgXCJAQEBAXCJgIGl0IGVuY29kZXMgdGhlIHJlZ2lzdGVyZWQgc3ltYm9sIHdob3NlXG4gKiAgICAgIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaW5zdGVhZC5cbiAqICAgIE90aGVyd2lzZSwgaWYgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpdCBtYXkgZW5jb2RlIGEgcmVnaXN0ZXJlZCBzeW1ib2xcbiAqICAgICAgZnJvbSBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEphdmFTY3JpcHQsIGJ1dCBpdCBpcyBub3Qgb25lIHdlIGNhbiBkZWNvZGVcbiAqICAgICAgeWV0LCBzbyB0aHJvdy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge3N5bWJvbH1cbiAqL1xuICAgICAgIGNvbnN0IHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9IG5hbWUgPT4ge1xuICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYCR7cShuYW1lKX0gbXVzdCBiZSBhIHN0cmluZywgbm90ICR7cSh0eXBlb2YgbmFtZSl9YDtcbiAgY29uc3QgbWF0Y2ggPSBBdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuICBpZiAobWF0Y2gpIHtcbiAgICBjb25zdCBzdWZmaXggPSBtYXRjaFsxXTtcbiAgICBpZiAoc3VmZml4LnN0YXJ0c1dpdGgoJ0BAJykpIHtcbiAgICAgIHJldHVybiBTeW1ib2wuZm9yKHN1ZmZpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN5bSA9IFN5bWJvbFtzdWZmaXhdO1xuICAgICAgaWYgKHR5cGVvZiBzeW0gPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiBzeW07XG4gICAgICB9XG4gICAgICBGYWlsYFJlc2VydmVkIGZvciB3ZWxsIGtub3duIHN5bWJvbCAke3Eoc3VmZml4KX06ICR7cShuYW1lKX1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gU3ltYm9sLmZvcihuYW1lKTtcbn07JGjNj19vbmNlLnBhc3NhYmxlU3ltYm9sRm9yTmFtZShwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xuaGFyZGVuKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2x9XG4gKi9cbiAgICAgICBjb25zdCB1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9IG5hbWUgPT4gU3ltYm9sKG5hbWUpOyRozY9fb25jZS51bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSh1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlU3ltYm9sIjpbImlzUGFzc2FibGVTeW1ib2wiXSwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFy4UNlkCQAAZAkAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdGFnZ2VkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJUYWdnZWRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxnZXRPd25EYXRhRGVzY3JpcHRvcixjaGVja1Bhc3NTdHlsZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV0sW1wiY2hlY2tQYXNzU3R5bGVcIixbJGjNj19hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJ1xuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB9ID0gT2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG4gICAgICAgY29uc3QgVGFnZ2VkSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAndGFnZ2VkJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT5cbiAgICBjaGVja1Bhc3NTdHlsZShjYW5kaWRhdGUsIGNhbmRpZGF0ZVtQQVNTX1NUWUxFXSwgJ3RhZ2dlZCcsIGNoZWNrKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBjaGVja1RhZ1JlY29yZChjYW5kaWRhdGUsICd0YWdnZWQnLCBhc3NlcnRDaGVja2VyKTtcblxuICAgIC8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4gICAgY29uc3QgcGFzc1N0eWxlS2V5ID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoUEFTU19TVFlMRSk7XG4gICAgY29uc3QgdGFnS2V5ID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoU3ltYm9sLnRvU3RyaW5nVGFnKTtcbiAgICBjb25zdCB7XG4gICAgICAvKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG4gICAgICBbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXNzU3R5bGVLZXkpXTogX3Bhc3NTdHlsZURlc2MsXG4gICAgICBbLyoqIEB0eXBlIHtzdHJpbmd9ICovICh0YWdLZXkpXTogX2xhYmVsRGVzYyxcbiAgICAgIHBheWxvYWQ6IF9wYXlsb2FkRGVzYywgLyogdmFsdWUgY2hlY2tlZCBieSByZWN1cnNpdmUgd2FsayBhdCB0aGUgZW5kKi9cbiAgICAgIC4uLnJlc3REZXNjc1xuICAgIH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG4gICAgb3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gdGFnZ2VkIHJlY29yZCAke293bktleXMocmVzdERlc2NzKX1gO1xuXG4gICAgLyogVmFsaWRhdGUgdGhhdCB0aGUgJ3BheWxvYWQnIHByb3BlcnR5IGlzIG93bi9kYXRhL2VudW1lcmFibGUqL1xuICAgIC8qIGFuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZSBpcyByZWN1cnNpdmVseSBwYXNzYWJsZS4qL1xuICAgIHBhc3NTdHlsZU9mUmVjdXIoXG4gICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsICdwYXlsb2FkJywgdHJ1ZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWUsXG4gICAgKTtcbiAgfSxcbn0pOyRozY9fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAt109XCYWAAAmFgAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRBdG9tIiwiYXNzZXJ0Qnl0ZUFycmF5IiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNBdG9tIiwiaXNCeXRlQXJyYXkiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsWCxpZGVudENoZWNrZXIscGFzc1N0eWxlT2YsYXNzZXJ0Q2hlY2tlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsWyRozY9fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDb3B5QXJyYXksIENvcHlSZWNvcmQsIFBhc3NhYmxlLCBSZW1vdGFibGVPYmplY3QsIEJ5dGVBcnJheSwgQ2hlY2tlciwgQXRvbX0gZnJvbSAnLi90eXBlcy5qcydcbiAqL1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBBS0EgYSBcImNvcHlBcnJheVwiXG4gKiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHthbnl9IGFyclxuICogQHJldHVybnMge2FyciBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weUFycmF5ID0gYXJyID0+IHBhc3NTdHlsZU9mKGFycikgPT09ICdjb3B5QXJyYXknOyRozY9fb25jZS5pc0NvcHlBcnJheShpc0NvcHlBcnJheSk7XG5oYXJkZW4oaXNDb3B5QXJyYXkpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IGJpbmFyeSBkYXRhLCBBS0EgYSBcImJ5dGVBcnJheVwiXG4gKiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyXG4gKiBAcmV0dXJucyB7YXJyIGlzIEJ5dGVBcnJheX1cbiAqL1xuICAgICAgIGNvbnN0IGlzQnl0ZUFycmF5ID0gYXJyID0+IHBhc3NTdHlsZU9mKGFycikgPT09ICdieXRlQXJyYXknOyRozY9fb25jZS5pc0J5dGVBcnJheShpc0J5dGVBcnJheSk7XG5oYXJkZW4oaXNCeXRlQXJyYXkpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgQUtBIGFcbiAqIFwiY29weVJlY29yZFwiIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge2FueX0gcmVjb3JkXG4gKiBAcmV0dXJucyB7cmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuICAgICAgIGNvbnN0IGlzUmVjb3JkID0gcmVjb3JkID0+IHBhc3NTdHlsZU9mKHJlY29yZCkgPT09ICdjb3B5UmVjb3JkJzskaM2PX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHJlbW90YWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtyZW1vdGFibGUgaXMgUmVtb3RhYmxlT2JqZWN0fVxuICovXG4gICAgICAgY29uc3QgaXNSZW1vdGFibGUgPSByZW1vdGFibGUgPT4gcGFzc1N0eWxlT2YocmVtb3RhYmxlKSA9PT0gJ3JlbW90YWJsZSc7JGjNj19vbmNlLmlzUmVtb3RhYmxlKGlzUmVtb3RhYmxlKTtcbmhhcmRlbihpc1JlbW90YWJsZSk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGFyclxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZBcnJheVxuICogQHJldHVybnMge2Fzc2VydHMgYXJyIGlzIENvcHlBcnJheTxhbnk+fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0Q29weUFycmF5ID0gKGFyciwgb3B0TmFtZU9mQXJyYXkgPSAnQWxsZWdlZCBhcnJheScpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YoYXJyKTtcbiAgcGFzc1N0eWxlID09PSAnY29weUFycmF5JyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJ9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFyciBpcyBCeXRlQXJyYXl9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRCeXRlQXJyYXkgPSAoYXJyLCBvcHROYW1lT2ZBcnJheSA9ICdBbGxlZ2VkIGJ5dGVBcnJheScpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YoYXJyKTtcbiAgcGFzc1N0eWxlID09PSAnYnl0ZUFycmF5JyB8fFxuICAgIEZhaWxgJHtxKFxuICAgICAgb3B0TmFtZU9mQXJyYXksXG4gICAgKX0gJHthcnJ9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYmluYXJ5IGRhdGEsIG5vdCAke3EocGFzc1N0eWxlKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0Qnl0ZUFycmF5KGFzc2VydEJ5dGVBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Qnl0ZUFycmF5KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVjb3JkXG4gKiBAcGFyYW0ge2FueX0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlY29yZFxuICogQHJldHVybnMge2Fzc2VydHMgcmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFJlY29yZCA9IChyZWNvcmQsIG9wdE5hbWVPZlJlY29yZCA9ICdBbGxlZ2VkIHJlY29yZCcpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmVjb3JkKTtcbiAgcGFzc1N0eWxlID09PSAnY29weVJlY29yZCcgfHxcbiAgICBGYWlsYCR7cShvcHROYW1lT2ZSZWNvcmQpfSAke3JlY29yZH0gbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0UmVjb3JkKGFzc2VydFJlY29yZCk7XG5oYXJkZW4oYXNzZXJ0UmVjb3JkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZW1vdGFibGUgaXMgUmVtb3RhYmxlT2JqZWN0fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UmVtb3RhYmxlID0gKFxuICByZW1vdGFibGUsXG4gIG9wdE5hbWVPZlJlbW90YWJsZSA9ICdBbGxlZ2VkIHJlbW90YWJsZScsXG4pID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmVtb3RhYmxlKTtcbiAgcGFzc1N0eWxlID09PSAncmVtb3RhYmxlJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxuICAgICAgcGFzc1N0eWxlLFxuICAgICl9YDtcbn07JGjNj19vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbCBOb3QgbmVjZXNzYXJpbHkgcGFzc2FibGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHt2YWwgaXMgQXRvbX1cbiAqL1xuY29uc3QgY2hlY2tBdG9tID0gKHZhbCwgY2hlY2spID0+IHtcbiAgbGV0IHBhc3NTdHlsZTtcbiAgdHJ5IHtcbiAgICBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hlY2sgIT09IGlkZW50Q2hlY2tlciAmJlxuICAgICAgY2hlY2soZmFsc2UsIFhgTm90IGV2ZW4gUGFzc2FibGU6ICR7cShlcnIpfTogJHt2YWx9YClcbiAgICApO1xuICB9XG4gIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICBjYXNlICdudWxsJzpcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdieXRlQXJyYXknOlxuICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgIC8qIFRoZSBBdG9tU3R5bGUgY2FzZXMqL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8qIFRoZSBvdGhlciBQYXNzU3R5bGUgY2FzZXMqL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2sgIT09IGlkZW50Q2hlY2tlciAmJlxuICAgICAgICBjaGVjayhmYWxzZSwgWGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYW4gYXRvbTogJHt2YWx9YClcbiAgICAgICk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHt2YWwgaXMgQXRvbX1cbiAqL1xuICAgICAgIGNvbnN0IGlzQXRvbSA9IHZhbCA9PiBjaGVja0F0b20odmFsLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0F0b20oaXNBdG9tKTtcbmhhcmRlbihpc0F0b20pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Fzc2VydHMgdmFsIGlzIEF0b219XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRBdG9tID0gdmFsID0+IHtcbiAgY2hlY2tBdG9tKHZhbCwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRBdG9tKGFzc2VydEF0b20pO1xuaGFyZGVuKGFzc2VydEF0b20pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNCeXRlQXJyYXkiOlsiaXNCeXRlQXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRCeXRlQXJyYXkiOlsiYXNzZXJ0Qnl0ZUFycmF5Il0sImFzc2VydFJlY29yZCI6WyJhc3NlcnRSZWNvcmQiXSwiYXNzZXJ0UmVtb3RhYmxlIjpbImFzc2VydFJlbW90YWJsZSJdLCJpc0F0b20iOlsiaXNBdG9tIl0sImFzc2VydEF0b20iOlsiYXNzZXJ0QXRvbSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVNktzvDgAA7w4AAB4AAABAZW5kby9wYXR0ZXJucy12MS43LjAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMva2V5cy9jaGVja0tleS5qcyIsIi4vc3JjL2tleXMvY29weVNldC5qcyIsIi4vc3JjL2tleXMvY29weUJhZy5qcyIsIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiLCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiLCJiYWdVbmlvbiIsImJhZ1VuaW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIiwiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIiwic2V0Q29tcGFyZSIsInNldENvbXBhcmUiLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMva2V5cy9jaGVja0tleS5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5U2V0LmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvcHlCYWcuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW11dLFtcIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzXCIsIFtdXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2tleXMvY2hlY2tLZXkuanMiOltbImlzS2V5IiwiaXNLZXkiXSxbImFzc2VydEtleSIsImFzc2VydEtleSJdLFsiYXNzZXJ0U2NhbGFyS2V5IiwiYXNzZXJ0U2NhbGFyS2V5Il0sWyJpc0NvcHlTZXQiLCJpc0NvcHlTZXQiXSxbImFzc2VydENvcHlTZXQiLCJhc3NlcnRDb3B5U2V0Il0sWyJtYWtlQ29weVNldCIsIm1ha2VDb3B5U2V0Il0sWyJnZXRDb3B5U2V0S2V5cyIsImdldENvcHlTZXRLZXlzIl0sWyJpc0NvcHlCYWciLCJpc0NvcHlCYWciXSxbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5QmFnIl0sWyJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnIl0sWyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sWyJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlCYWdFbnRyaWVzIl0sWyJpc0NvcHlNYXAiLCJpc0NvcHlNYXAiXSxbImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5TWFwIl0sWyJtYWtlQ29weU1hcCIsIm1ha2VDb3B5TWFwIl0sWyJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIl1dLCIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOltbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl1dLCIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOltbImNvZXJjZVRvQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyI6W1siYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbInNldENvbXBhcmUiLCJzZXRDb21wYXJlIl0sWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdXSwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjpbWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0VW5pb24iLCJzZXRVbmlvbiJdLFsic2V0RGlzam9pbnRVbmlvbiIsInNldERpc2pvaW50VW5pb24iXSxbInNldEludGVyc2VjdGlvbiIsInNldEludGVyc2VjdGlvbiJdLFsic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50U3VidHJhY3QiXV0sIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6W1siYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXV0sIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6W1siTSIsIk0iXSxbImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciJdLFsiaXNQYXR0ZXJuIiwiaXNQYXR0ZXJuIl0sWyJhc3NlcnRQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiJdLFsibWF0Y2hlcyIsIm1hdGNoZXMiXSxbIm11c3RNYXRjaCIsIm11c3RNYXRjaCJdLFsiaXNBd2FpdEFyZ0d1YXJkIiwiaXNBd2FpdEFyZ0d1YXJkIl0sWyJhc3NlcnRBd2FpdEFyZ0d1YXJkIiwiYXNzZXJ0QXdhaXRBcmdHdWFyZCJdLFsiaXNSYXdHdWFyZCIsImlzUmF3R3VhcmQiXSxbImFzc2VydFJhd0d1YXJkIiwiYXNzZXJ0UmF3R3VhcmQiXSxbImFzc2VydE1ldGhvZEd1YXJkIiwiYXNzZXJ0TWV0aG9kR3VhcmQiXSxbImFzc2VydEludGVyZmFjZUd1YXJkIiwiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiXSxbImtpbmRPZiIsImtpbmRPZiJdLFsiY29udGFpbmVySGFzU3BsaXQiLCJjb250YWluZXJIYXNTcGxpdCJdXSwiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyI6W1siZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiLCJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCJdLFsiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIl0sWyJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiLCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiXSxbImdldEludGVyZmFjZU1ldGhvZEtleXMiLCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIl1dLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIjpbWyJsaXN0RGlmZmVyZW5jZSIsImxpc3REaWZmZXJlbmNlIl1dLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6W1sib2JqZWN0TWFwIiwib2JqZWN0TWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACqIQPpC0gAAAtIAAAqAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NoZWNrS2V5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL21hcnNoYWwiLCIuL2NvcHlTZXQuanMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weU1hcCIsImFzc2VydENvcHlTZXQiLCJhc3NlcnRLZXkiLCJhc3NlcnRTY2FsYXJLZXkiLCJjaGVja0NvcHlCYWciLCJjaGVja0NvcHlNYXAiLCJjaGVja0NvcHlTZXQiLCJjaGVja0tleSIsImNoZWNrU2NhbGFyS2V5IiwiY29weU1hcEtleVNldCIsImV2ZXJ5Q29weUJhZ0VudHJ5IiwiZXZlcnlDb3B5TWFwS2V5IiwiZXZlcnlDb3B5TWFwVmFsdWUiLCJldmVyeUNvcHlTZXRLZXkiLCJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJ5QXJyYXkiLCJnZXRDb3B5TWFwS2V5cyIsImdldENvcHlNYXBWYWx1ZXMiLCJnZXRDb3B5U2V0S2V5cyIsImlzQ29weUJhZyIsImlzQ29weU1hcCIsImlzQ29weVNldCIsImlzS2V5IiwiaXNTY2FsYXJLZXkiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgscSxGYWlsLGlkZW50Q2hlY2tlcixhc3NlcnRDaGVja2VyLEZhcixnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixpc0F0b20sY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssY2hlY2tFbGVtZW50cyxtYWtlU2V0T2ZFbGVtZW50cyxjaGVja0JhZ0VudHJpZXMsbWFrZUJhZ09mRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsWyRozY9fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzQXRvbVwiLFskaM2PX2EgPT4gKGlzQXRvbSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5U2V0LmpzXCIsIFtbXCJjaGVja0VsZW1lbnRzXCIsWyRozY9fYSA9PiAoY2hlY2tFbGVtZW50cyA9ICRozY9fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLFskaM2PX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJjaGVja0JhZ0VudHJpZXNcIixbJGjNj19hID0+IChjaGVja0JhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLFskaM2PX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgQXRvbSwgQ2hlY2tlcn0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqIEBpbXBvcnQge0NvcHlCYWcsIENvcHlNYXAsIENvcHlTZXQsIEtleSwgU2NhbGFyS2V5fSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8gQXRvbSBhbmQgU2NhbGFyIGtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tTY2FsYXJLZXkgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoaXNBdG9tKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICBpZiAocGFzc1N0eWxlID09PSAncmVtb3RhYmxlJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBjaGVjayhmYWxzZSwgWGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBzY2FsYXIga2V5OiAke3ZhbH1gKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMge3ZhbCBpcyBTY2FsYXJLZXl9XG4gKi8kaM2PX29uY2UuY2hlY2tTY2FsYXJLZXkoY2hlY2tTY2FsYXJLZXkpO1xuICAgICAgIGNvbnN0IGlzU2NhbGFyS2V5ID0gdmFsID0+IGNoZWNrU2NhbGFyS2V5KHZhbCwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNTY2FsYXJLZXkoaXNTY2FsYXJLZXkpO1xuaGFyZGVuKGlzU2NhbGFyS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbCBpcyBTY2FsYXJLZXl9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRTY2FsYXJLZXkgPSB2YWwgPT4ge1xuICBjaGVja1NjYWxhcktleSh2YWwsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0U2NhbGFyS2V5KGFzc2VydFNjYWxhcktleSk7XG5oYXJkZW4oYXNzZXJ0U2NhbGFyS2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBAdHMtZXhwZWN0LWVycm9yIEtleSBkb2VzIG5vdCBzYXRpc2Z5IFdlYWtLZXkqL1xuLyoqIEB0eXBlIHtXZWFrU2V0PEtleT59ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIEtleSBkb2VzIG5vdCBzYXRpc2Z5IFdlYWtLZXkqL1xuY29uc3Qga2V5TWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tLZXkgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoaXNBdG9tKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgaWYgKGtleU1lbW8uaGFzKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICBjb25zdCByZXN1bHQgPSBjaGVja0tleUludGVybmFsKHZhbCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgLyogRG9uJ3QgY2FjaGUgdGhlIHVuZGVmaW5lZCBjYXNlcywgc28gdGhhdCBpZiBpdCBpcyB0cmllZCBhZ2FpbiovXG4gICAgLyogd2l0aCBgYXNzZXJ0Q2hlY2tlcmAgaXQnbGwgdGhyb3cgYSBkaWFnbm9zdGljIGFnYWluKi9cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICBrZXlNZW1vLmFkZCh2YWwpO1xuICB9XG4gIC8qIE5vdGUgdGhhdCB3ZSBkbyBub3QgbWVtb2l6ZSBhIG5lZ2F0aXZlIGp1ZGdlbWVudCwgc28gdGhhdCBpZiBpdCBpcyB0cmllZCovXG4gIC8qIGFnYWluIHdpdGggYSBjaGVja2VyLCBpdCB3aWxsIHN0aWxsIHByb2R1Y2UgYSB1c2VmdWwgZGlhZ25vc3RpYy4qL1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tLZXkoY2hlY2tLZXkpO1xuaGFyZGVuKGNoZWNrS2V5KTtcblxuLyoqXG4gKiBAdHlwZSB7e1xuICogICAodmFsOiBQYXNzYWJsZSk6IHZhbCBpcyBLZXk7XG4gKiAgICh2YWw6IGFueSk6IGJvb2xlYW47XG4gKiB9fVxuICovXG4gICAgICAgY29uc3QgaXNLZXkgPSB2YWwgPT4gY2hlY2tLZXkodmFsLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0tleShpc0tleSk7XG5oYXJkZW4oaXNLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7S2V5fSB2YWxcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbCBpcyBLZXl9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRLZXkgPSB2YWwgPT4ge1xuICBjaGVja0tleSh2YWwsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0S2V5KGFzc2VydEtleSk7XG5oYXJkZW4oYXNzZXJ0S2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5U2V0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlTZXQgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5U2V0Pn0gKi9cbmNvbnN0IGNvcHlTZXRNZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja0NvcHlTZXQgPSAocywgY2hlY2spID0+IHtcbiAgaWYgKGNvcHlTZXRNZW1vLmhhcyhzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgKChwYXNzU3R5bGVPZihzKSA9PT0gJ3RhZ2dlZCcgJiYgZ2V0VGFnKHMpID09PSAnY29weVNldCcpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBOb3QgYSBjb3B5U2V0OiAke3N9YCkpICYmXG4gICAgY2hlY2tFbGVtZW50cyhzLnBheWxvYWQsIGNoZWNrKSAmJlxuICAgIGNoZWNrS2V5KHMucGF5bG9hZCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weVNldE1lbW8uYWRkKHMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlTZXQoY2hlY2tDb3B5U2V0KTtcbmhhcmRlbihjaGVja0NvcHlTZXQpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzXG4gKiBAcmV0dXJucyB7cyBpcyBDb3B5U2V0fVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5U2V0ID0gcyA9PiBjaGVja0NvcHlTZXQocywgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNDb3B5U2V0KGlzQ29weVNldCk7XG5oYXJkZW4oaXNDb3B5U2V0KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weVNldFxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHJldHVybnMge2Fzc2VydHMgcyBpcyBDb3B5U2V0fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weVNldH0gKi9cbiAgICAgICBjb25zdCBhc3NlcnRDb3B5U2V0ID0gcyA9PiB7XG4gIGNoZWNrQ29weVNldChzLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydENvcHlTZXQoYXNzZXJ0Q29weVNldCk7XG5oYXJkZW4oYXNzZXJ0Q29weVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHJldHVybnMge0tbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlTZXRLZXlzID0gcyA9PiB7XG4gIGFzc2VydENvcHlTZXQocyk7XG4gIHJldHVybiBzLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRDb3B5U2V0S2V5cyhnZXRDb3B5U2V0S2V5cyk7XG5oYXJkZW4oZ2V0Q29weVNldEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgZXZlcnlDb3B5U2V0S2V5ID0gKHMsIGZuKSA9PlxuICBnZXRDb3B5U2V0S2V5cyhzKS5ldmVyeSgoa2V5LCBpbmRleCkgPT4gZm4oa2V5LCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlTZXRLZXkoZXZlcnlDb3B5U2V0S2V5KTtcbmhhcmRlbihldmVyeUNvcHlTZXRLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weVNldCA9IGVsZW1lbnRJdGVyID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gbWFrZVNldE9mRWxlbWVudHMoZWxlbWVudEl0ZXIpO1xuICBhc3NlcnRDb3B5U2V0KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5tYWtlQ29weVNldChtYWtlQ29weVNldCk7XG5oYXJkZW4obWFrZUNvcHlTZXQpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlCYWcgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weUJhZyBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PENvcHlCYWc+fSAqL1xuY29uc3QgY29weUJhZ01lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBiXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrQ29weUJhZyA9IChiLCBjaGVjaykgPT4ge1xuICBpZiAoY29weUJhZ01lbW8uaGFzKGIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID1cbiAgICAoKHBhc3NTdHlsZU9mKGIpID09PSAndGFnZ2VkJyAmJiBnZXRUYWcoYikgPT09ICdjb3B5QmFnJykgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYE5vdCBhIGNvcHlCYWc6ICR7Yn1gKSkgJiZcbiAgICBjaGVja0JhZ0VudHJpZXMoYi5wYXlsb2FkLCBjaGVjaykgJiZcbiAgICBjaGVja0tleShiLnBheWxvYWQsIGNoZWNrKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvcHlCYWdNZW1vLmFkZChiKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tDb3B5QmFnKGNoZWNrQ29weUJhZyk7XG5oYXJkZW4oY2hlY2tDb3B5QmFnKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gYlxuICogQHJldHVybnMge2IgaXMgQ29weUJhZ31cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weUJhZyA9IGIgPT4gY2hlY2tDb3B5QmFnKGIsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weUJhZyhpc0NvcHlCYWcpO1xuaGFyZGVuKGlzQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlCYWdcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHthc3NlcnRzIGIgaXMgQ29weUJhZ31cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlCYWd9ICovXG4gICAgICAgY29uc3QgYXNzZXJ0Q29weUJhZyA9IGIgPT4ge1xuICBjaGVja0NvcHlCYWcoYiwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRDb3B5QmFnKGFzc2VydENvcHlCYWcpO1xuaGFyZGVuKGFzc2VydENvcHlCYWcpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0NvcHlCYWc8Sz59IGJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+WydwYXlsb2FkJ119XG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5QmFnRW50cmllcyA9IGIgPT4ge1xuICBhc3NlcnRDb3B5QmFnKGIpO1xuICByZXR1cm4gYi5wYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0Q29weUJhZ0VudHJpZXMoZ2V0Q29weUJhZ0VudHJpZXMpO1xuaGFyZGVuKGdldENvcHlCYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtDb3B5QmFnPEs+fSBiXG4gKiBAcGFyYW0geyhlbnRyeTogW0ssIGJpZ2ludF0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGV2ZXJ5Q29weUJhZ0VudHJ5ID0gKGIsIGZuKSA9PlxuICBnZXRDb3B5QmFnRW50cmllcyhiKS5ldmVyeSgoZW50cnksIGluZGV4KSA9PiBmbihlbnRyeSwgaW5kZXgpKTskaM2PX29uY2UuZXZlcnlDb3B5QmFnRW50cnkoZXZlcnlDb3B5QmFnRW50cnkpO1xuaGFyZGVuKGV2ZXJ5Q29weUJhZ0VudHJ5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxiaWdpbnRdPn0gYmFnRW50cnlJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb3B5QmFnID0gYmFnRW50cnlJdGVyID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gbWFrZUJhZ09mRW50cmllcyhiYWdFbnRyeUl0ZXIpO1xuICBhc3NlcnRDb3B5QmFnKHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5tYWtlQ29weUJhZyhtYWtlQ29weUJhZyk7XG5oYXJkZW4obWFrZUNvcHlCYWcpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyA9IGVsZW1lbnRJdGVyID0+IHtcbiAgLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbiAgLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG4gIGNvbnN0IHNvcnRlZCA9IHNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsIGZ1bGxDb21wYXJlKTtcbiAgLyoqIEB0eXBlIHtbSyxiaWdpbnRdW119ICovXG4gIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyApIHtcbiAgICBjb25zdCBrID0gc29ydGVkW2ldO1xuICAgIGxldCBqID0gaSArIDE7XG4gICAgd2hpbGUgKGogPCBzb3J0ZWQubGVuZ3RoICYmIGZ1bGxDb21wYXJlKGssIHNvcnRlZFtqXSkgPT09IDApIHtcbiAgICAgIGogKz0gMTtcbiAgICB9XG4gICAgZW50cmllcy5wdXNoKFtrLCBCaWdJbnQoaiAtIGkpXSk7XG4gICAgaSA9IGo7XG4gIH1cbiAgcmV0dXJuIG1ha2VDb3B5QmFnKGVudHJpZXMpO1xufTskaM2PX29uY2UubWFrZUNvcHlCYWdGcm9tRWxlbWVudHMobWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5TWFwIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlNYXAncyBrZXlzIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weU1hcD59ICovXG5jb25zdCBjb3B5TWFwTWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG1cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tDb3B5TWFwID0gKG0sIGNoZWNrKSA9PiB7XG4gIGlmIChjb3B5TWFwTWVtby5oYXMobSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIShwYXNzU3R5bGVPZihtKSA9PT0gJ3RhZ2dlZCcgJiYgZ2V0VGFnKG0pID09PSAnY29weU1hcCcpKSB7XG4gICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYE5vdCBhIGNvcHlNYXA6ICR7bX1gKTtcbiAgfVxuICBjb25zdCB7IHBheWxvYWQgfSA9IG07XG4gIGlmIChwYXNzU3R5bGVPZihwYXlsb2FkKSAhPT0gJ2NvcHlSZWNvcmQnKSB7XG4gICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBiZSBhIHJlY29yZDogJHttfWApO1xuICB9XG4gIGNvbnN0IHsga2V5cywgdmFsdWVzLCAuLi5yZXN0IH0gPSBwYXlsb2FkO1xuICBjb25zdCByZXN1bHQgPVxuICAgIChvd25LZXlzKHJlc3QpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBvbmx5IGhhdmUgLmtleXMgYW5kIC52YWx1ZXM6ICR7bX1gLFxuICAgICAgKSkgJiZcbiAgICBjaGVja0VsZW1lbnRzKGtleXMsIGNoZWNrKSAmJlxuICAgIGNoZWNrS2V5KGtleXMsIGNoZWNrKSAmJlxuICAgIChwYXNzU3R5bGVPZih2YWx1ZXMpID09PSAnY29weUFycmF5JyB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgQSBjb3B5TWFwJ3MgLnZhbHVlcyBtdXN0IGJlIGEgY29weUFycmF5OiAke219YCkpICYmXG4gICAgKGtleXMubGVuZ3RoID09PSB2YWx1ZXMubGVuZ3RoIHx8XG4gICAgICBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgQSBjb3B5TWFwIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Yga2V5cyBhbmQgdmFsdWVzOiAke219YCxcbiAgICAgICkpO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weU1hcE1lbW8uYWRkKG0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlNYXAoY2hlY2tDb3B5TWFwKTtcbmhhcmRlbihjaGVja0NvcHlNYXApO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBtXG4gKiBAcmV0dXJucyB7bSBpcyBDb3B5TWFwPEtleSwgUGFzc2FibGU+fVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5TWFwID0gbSA9PiBjaGVja0NvcHlNYXAobSwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNDb3B5TWFwKGlzQ29weU1hcCk7XG5oYXJkZW4oaXNDb3B5TWFwKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBtIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRDb3B5TWFwID0gbSA9PiB7XG4gIGNoZWNrQ29weU1hcChtLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydENvcHlNYXAoYXNzZXJ0Q29weU1hcCk7XG5oYXJkZW4oYXNzZXJ0Q29weU1hcCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcEtleXMgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgcmV0dXJuIG0ucGF5bG9hZC5rZXlzO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcEtleXMoZ2V0Q29weU1hcEtleXMpO1xuaGFyZGVuKGdldENvcHlNYXBLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtWW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5TWFwVmFsdWVzID0gbSA9PiB7XG4gIGFzc2VydENvcHlNYXAobSk7XG4gIHJldHVybiBtLnBheWxvYWQudmFsdWVzO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcFZhbHVlcyhnZXRDb3B5TWFwVmFsdWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwVmFsdWVzKTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGEgQ29weU1hcCdzIGVudHJpZXMgaW4gc3RvcmFnZSBvcmRlci5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtBcnJheTxbSyxWXT59XG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5TWFwRW50cnlBcnJheSA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICBjb25zdCB7XG4gICAgcGF5bG9hZDogeyBrZXlzLCB2YWx1ZXMgfSxcbiAgfSA9IG07XG4gIHJldHVybiBoYXJkZW4oa2V5cy5tYXAoKGtleSwgaSkgPT4gW2tleSwgdmFsdWVzW2ldXSkpO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcEVudHJ5QXJyYXkoZ2V0Q29weU1hcEVudHJ5QXJyYXkpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyeUFycmF5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5TWFwRW50cmllcyA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICBjb25zdCB7XG4gICAgcGF5bG9hZDogeyBrZXlzLCB2YWx1ZXMgfSxcbiAgfSA9IG07XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSAvKiogQHR5cGUge0FycmF5fSAqLyAoa2V5cyk7XG4gIHJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgcmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhdG9yJywge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxbSyxWXSx2b2lkPn0gKi9cbiAgICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWU6IFtrZXlzW2ldLCB2YWx1ZXNbaV1dIH0pO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcEVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgZXZlcnlDb3B5TWFwS2V5ID0gKG0sIGZuKSA9PlxuICBnZXRDb3B5TWFwS2V5cyhtKS5ldmVyeSgoa2V5LCBpbmRleCkgPT4gZm4oa2V5LCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlNYXBLZXkoZXZlcnlDb3B5TWFwS2V5KTtcbmhhcmRlbihldmVyeUNvcHlNYXBLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsodmFsdWU6IFYsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGV2ZXJ5Q29weU1hcFZhbHVlID0gKG0sIGZuKSA9PlxuICBnZXRDb3B5TWFwVmFsdWVzKG0pLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IGZuKHZhbHVlLCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlNYXBWYWx1ZShldmVyeUNvcHlNYXBWYWx1ZSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwVmFsdWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbiAgICAgICBjb25zdCBjb3B5TWFwS2V5U2V0ID0gbSA9PlxuICAvKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBhbHJlYWR5IGluIHRoZSBpbnRlcm5hbCBmb3JtIHVzZWQgYnkgY29weVNldHMuKi9cbiAgbWFrZVRhZ2dlZCgnY29weVNldCcsIG0ucGF5bG9hZC5rZXlzKTskaM2PX29uY2UuY29weU1hcEtleVNldChjb3B5TWFwS2V5U2V0KTtcbmhhcmRlbihjb3B5TWFwS2V5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgVl0+fSBlbnRyaWVzXG4gKiBAcmV0dXJucyB7Q29weU1hcDxLLFY+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUNvcHlNYXAgPSBlbnRyaWVzID0+IHtcbiAgLyogVGhpcyBpcyB3ZWlyZCwgYnV0IHJldmVyc2UgcmFuayBzb3J0aW5nIHRoZSBlbnRyaWVzIGlzIGEgZ29vZCBmaXJzdCBzdGVwKi9cbiAgLyogZm9yIGdldHRpbmcgdGhlIHJhbmsgc29ydGVkIGtleXMgdG9nZXRoZXIgd2l0aCB0aGUgdmFsdWVzKi9cbiAgLyogb3JnYW5pemVkIGJ5IHRob3NlIGtleXMuIEFsc28sIGFtb25nIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGgqL1xuICAvKiBrZXlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzLCB0aG9zZSBhcmUgcmFuayBzb3J0ZWQuKi9cbiAgLyogVE9ETyBUaGlzKi9cbiAgLyogY291bGQgc29sdmUgdGhlIGNvcHlNYXAgY292ZXIgaXNzdWUgZXhwbGFpbmVkIGluIHBhdHRlcm5NYXRjaGVycy5qcy4qL1xuICAvKiBCdXQgb25seSBpZiB3ZSBpbmNsdWRlIHRoaXMgY3JpdGVyaWEgaW4gb3VyIHZhbGlkYXRpb24gb2YgY29weU1hcHMsKi9cbiAgLyogd2hpY2ggd2UgY3VycmVudGx5IGRvIG5vdC4qL1xuICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gc29ydEJ5UmFuayhlbnRyaWVzLCBjb21wYXJlQW50aVJhbmspO1xuICBjb25zdCBrZXlzID0gc29ydGVkRW50cmllcy5tYXAoKFtrLCBfdl0pID0+IGspO1xuICBjb25zdCB2YWx1ZXMgPSBzb3J0ZWRFbnRyaWVzLm1hcCgoW19rLCB2XSkgPT4gdik7XG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCB7IGtleXMsIHZhbHVlcyB9KTtcbiAgYXNzZXJ0Q29weU1hcChyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubWFrZUNvcHlNYXAobWFrZUNvcHlNYXApO1xuaGFyZGVuKG1ha2VDb3B5TWFwKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgUmVjdXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIGBjaGVja0tleUludGVybmFsYCBpcyBvbmx5IGNhbGxlZCBpZiBgdmFsYCBpcyBQYXNzYWJsZSBidXQgaXMgbm90IGFuIEF0b20uXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2V5SW50ZXJuYWwgPSAodmFsLCBjaGVjaykgPT4ge1xuICBjb25zdCBjaGVja0l0ID0gY2hpbGQgPT4gY2hlY2tLZXkoY2hpbGQsIGNoZWNrKTtcblxuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIC8qIEEgcmVtb3RhYmxlIGlzIGEgU2NhbGFyS2V5IGJ1dCBub3QgYW4gQXRvbSwgc28gd2UgcGljayBpdCB1cCBoZXJlLiovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIC8qIEEgY29weVJlY29yZCBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWwpLmV2ZXJ5KGNoZWNrSXQpO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAvKiBBIGNvcHlBcnJheSBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG4gICAgICByZXR1cm4gdmFsLmV2ZXJ5KGNoZWNrSXQpO1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICBjb25zdCB0YWcgPSBnZXRUYWcodmFsKTtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrQ29weVNldCh2YWwsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgICAgIHJldHVybiBjaGVja0NvcHlCYWcodmFsLCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY2hlY2tDb3B5TWFwKHZhbCwgY2hlY2spICYmXG4gICAgICAgICAgICAvKiBGb3IgYSBjb3B5TWFwIHRvIGJlIGEga2V5LCBhbGwgaXRzIGtleXMgYW5kIHZhbHVlcyBtdXN0Ki9cbiAgICAgICAgICAgIC8qIGJlIGtleXMuIEtleXMgYWxyZWFkeSBjaGVja2VkIGJ5IGBjaGVja0NvcHlNYXBgIHNpbmNlKi9cbiAgICAgICAgICAgIC8qIHRoYXQncyBhIGNvcHlNYXAgcmVxdWlyZW1lbnQgaW4gZ2VuZXJhbC4qL1xuICAgICAgICAgICAgZXZlcnlDb3B5TWFwVmFsdWUodmFsLCBjaGVja0l0KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICAgICAgICBjaGVjayhmYWxzZSwgWGBBIHBhc3NhYmxlIHRhZ2dlZCAke3EodGFnKX0gaXMgbm90IGEga2V5OiAke3ZhbH1gKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY2FzZSAnZXJyb3InOlxuICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEga2V5YCk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8qIFVuZXhwZWN0ZWQgdGFncyBhcmUganVzdCBub24ta2V5cywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbiAgICAgIC8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xuICAgICAgdGhyb3cgRmFpbGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7dmFsfWA7XG4gICAgfVxuICB9XG59O1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2hlY2tTY2FsYXJLZXkiOlsiY2hlY2tTY2FsYXJLZXkiXSwiaXNTY2FsYXJLZXkiOlsiaXNTY2FsYXJLZXkiXSwiYXNzZXJ0U2NhbGFyS2V5IjpbImFzc2VydFNjYWxhcktleSJdLCJjaGVja0tleSI6WyJjaGVja0tleSJdLCJpc0tleSI6WyJpc0tleSJdLCJhc3NlcnRLZXkiOlsiYXNzZXJ0S2V5Il0sImNoZWNrQ29weVNldCI6WyJjaGVja0NvcHlTZXQiXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCJdLCJhc3NlcnRDb3B5U2V0IjpbImFzc2VydENvcHlTZXQiXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiXSwiZXZlcnlDb3B5U2V0S2V5IjpbImV2ZXJ5Q29weVNldEtleSJdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCJdLCJjaGVja0NvcHlCYWciOlsiY2hlY2tDb3B5QmFnIl0sImlzQ29weUJhZyI6WyJpc0NvcHlCYWciXSwiYXNzZXJ0Q29weUJhZyI6WyJhc3NlcnRDb3B5QmFnIl0sImdldENvcHlCYWdFbnRyaWVzIjpbImdldENvcHlCYWdFbnRyaWVzIl0sImV2ZXJ5Q29weUJhZ0VudHJ5IjpbImV2ZXJ5Q29weUJhZ0VudHJ5Il0sIm1ha2VDb3B5QmFnIjpbIm1ha2VDb3B5QmFnIl0sIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIjpbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sImNoZWNrQ29weU1hcCI6WyJjaGVja0NvcHlNYXAiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJhc3NlcnRDb3B5TWFwIjpbImFzc2VydENvcHlNYXAiXSwiZ2V0Q29weU1hcEtleXMiOlsiZ2V0Q29weU1hcEtleXMiXSwiZ2V0Q29weU1hcFZhbHVlcyI6WyJnZXRDb3B5TWFwVmFsdWVzIl0sImdldENvcHlNYXBFbnRyeUFycmF5IjpbImdldENvcHlNYXBFbnRyeUFycmF5Il0sImdldENvcHlNYXBFbnRyaWVzIjpbImdldENvcHlNYXBFbnRyaWVzIl0sImV2ZXJ5Q29weU1hcEtleSI6WyJldmVyeUNvcHlNYXBLZXkiXSwiZXZlcnlDb3B5TWFwVmFsdWUiOlsiZXZlcnlDb3B5TWFwVmFsdWUiXSwiY29weU1hcEtleVNldCI6WyJjb3B5TWFwS2V5U2V0Il0sIm1ha2VDb3B5TWFwIjpbIm1ha2VDb3B5TWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP/bK5A/KAAAPygAAC0AAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29tcGFyZUtleXMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyIsIi4vY2hlY2tLZXkuanMiLCIuL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIl0sImV4cG9ydHMiOlsiYmFnQ29tcGFyZSIsImNvbXBhcmVLZXlzIiwia2V5RVEiLCJrZXlHVCIsImtleUdURSIsImtleUxUIiwia2V5TFRFIiwic2V0Q29tcGFyZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGdldFRhZyxjb21wYXJlTnVtZXJpY3MsY29tcGFyZVJhbmsscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLHEsRmFpbCxhc3NlcnRLZXksZ2V0Q29weUJhZ0VudHJpZXMsZ2V0Q29weU1hcEVudHJ5QXJyYXksZ2V0Q29weVNldEtleXMsbWFrZUNvbXBhcmVDb2xsZWN0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiY29tcGFyZU51bWVyaWNzXCIsWyRozY9fYSA9PiAoY29tcGFyZU51bWVyaWNzID0gJGjNj19hKV1dLFtcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJ5QXJyYXlcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cnlBcnJheSA9ICRozY9fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dXV0sW1wiLi9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc1wiLCBbW1wibWFrZUNvbXBhcmVDb2xsZWN0aW9uXCIsWyRozY9fYSA9PiAobWFrZUNvbXBhcmVDb2xsZWN0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtDb3B5U2V0LCBLZXksIEtleUNvbXBhcmV9IGZyb20gJy4uL3R5cGVzLmpzJyAqL1xuXG4vKipcbiAqIENvcHlTZXQgWCBpcyBzbWFsbGVyIHRoYW4gQ29weVNldCBZIGlmZiBhbGwgb2YgdGhlc2UgY29uZGl0aW9ucyBob2xkOlxuICogMS4gRm9yIGV2ZXJ5IHggaW4gWCwgeCBpcyBhbHNvIGluIFkuXG4gKiAyLiBUaGVyZSBpcyBhIHkgaW4gWSB0aGF0IGlzIG5vdCBpbiBYLlxuICpcbiAqIFggaXMgZXF1aXZhbGVudCB0byBZIGlmZiB0aGUgY29uZGl0aW9uIDEgaG9sZHMgYnV0IGNvbmRpdGlvbiAyIGRvZXMgbm90LlxuICovXG4gICAgICAgY29uc3Qgc2V0Q29tcGFyZSA9IG1ha2VDb21wYXJlQ29sbGVjdGlvbihcbiAgLyoqIEB0eXBlIHs8SyBleHRlbmRzIEtleT4oczogQ29weVNldDxLPikgPT4gQXJyYXk8W0ssIDFdPn0gKi8gKFxuICAgIHMgPT4gaGFyZGVuKGdldENvcHlTZXRLZXlzKHMpLm1hcChrZXkgPT4gW2tleSwgMV0pKVxuICApLFxuICAwLFxuICBjb21wYXJlTnVtZXJpY3MsXG4pOyRozY9fb25jZS5zZXRDb21wYXJlKHNldENvbXBhcmUpO1xuaGFyZGVuKHNldENvbXBhcmUpO1xuXG4vKipcbiAqIENvcHlCYWcgWCBpcyBzbWFsbGVyIHRoYW4gQ29weUJhZyBZIGlmZiBhbGwgb2YgdGhlc2UgY29uZGl0aW9ucyBob2xkXG4gKiAod2hlcmUgYGNvdW50KEEsIGEpYCBpcyBzaG9ydGhhbmQgZm9yIHRoZSBjb3VudCBhc3NvY2lhdGVkIHdpdGggYGFgIGluIGBBYCk6XG4gKiAxLiBGb3IgZXZlcnkgeCBpbiBYLCB4IGlzIGFsc28gaW4gWSBhbmQgY291bnQoWCwgeCkgPD0gY291bnQoWSwgeCkuXG4gKiAyLiBUaGVyZSBpcyBhIHkgaW4gWSBzdWNoIHRoYXQgeSBpcyBub3QgaW4gWCBvciBjb3VudChYLCB5KSA8IGNvdW50KFksIHkpLlxuICpcbiAqIFggaXMgZXF1aXZhbGVudCB0byBZIGlmZiB0aGUgY29uZGl0aW9uIDEgaG9sZHMgYnV0IGNvbmRpdGlvbiAyIGRvZXMgbm90LlxuICovXG4gICAgICAgY29uc3QgYmFnQ29tcGFyZSA9IG1ha2VDb21wYXJlQ29sbGVjdGlvbihcbiAgZ2V0Q29weUJhZ0VudHJpZXMsXG4gIDBuLFxuICBjb21wYXJlTnVtZXJpY3MsXG4pOyRozY9fb25jZS5iYWdDb21wYXJlKGJhZ0NvbXBhcmUpO1xuaGFyZGVuKGJhZ0NvbXBhcmUpO1xuXG4vKiBUT0RPIFRoZSBkZXNpcmVkIHNlbWFudGljcyBmb3IgQ29weU1hcCBjb21wYXJpc29uIGhhdmUgbm90IHlldCBiZWVuIGRlY2lkZWQuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzM3I3B1bGxyZXF1ZXN0cmV2aWV3LTE1OTY1OTU0MTEqL1xuLyogVGhlIGJlbG93IGlzIGEgY3VycmVudGx5LXVudXNlZCBleHRlbnNpb24gb2YgQ29weUJhZyBzZW1hbnRpY3MgKGkuZS4sIGFic2VudCovXG4vKiBlbnRyaWVzIHRyZWF0ZWQgYXMgcHJlc2VudCB3aXRoIGEgdmFsdWUgdGhhdCBpcyBzbWFsbGVyIHRoYW4gZXZlcnl0aGluZykuKi9cbi8qKlxuICogQSB1bmlxdWUgbG9jYWwgdmFsdWUgdGhhdCBpcyBndWFyYW50ZWVkIHRvIG5vdCBleGlzdCBpbiBhbnkgaW5ib3VuZCBkYXRhXG4gKiBzdHJ1Y3R1cmUgKHdoaWNoIHdvdWxkIG5vdCBiZSB0aGUgY2FzZSBpZiB3ZSB1c2VkIGBTeW1ib2wuZm9yYCkuXG4gKiBOb3RlIHRoYXQgYEFCU0VOVGAgaXMgbm90IHBhc3NhYmxlLCBhbmQgc28gb25seSBleGlzdHMgYXQgdGhlIEpTIGxldmVsIG9mXG4gKiBhYnN0cmFjdGlvbiwgbm90IHBhc3Mtc3R5bGUuXG4gKi9cbmNvbnN0IEFCU0VOVCA9IFN5bWJvbCgnYWJzZW50Jyk7XG5cbi8qKlxuICogQ29weU1hcCBYIGlzIHNtYWxsZXIgdGhhbiBDb3B5TWFwIFkgaWZmIGFsbCBvZiB0aGVzZSBjb25kaXRpb25zIGhvbGQ6XG4gKiAxLiBYIGFuZCBZIGFyZSBib3RoIEtleXMgKGkuZS4sIG5laXRoZXIgY29udGFpbnMgbm9uLWNvbXBhcmFibGUgZGF0YSkuXG4gKiAyLiBGb3IgZXZlcnkgeCBpbiBYLCB4IGlzIGFsc28gaW4gWSBhbmQgWFt4XSBpcyBzbWFsbGVyIHRoYW4gb3IgZXF1aXZhbGVudCB0byBZW3hdLlxuICogMy4gVGhlcmUgaXMgYSB5IGluIFkgc3VjaCB0aGF0IHkgaXMgbm90IGluIFggb3IgWFt5XSBpcyBzbWFsbGVyIHRoYW4gWVt5XS5cbiAqXG4gKiBYIGlzIGVxdWl2YWxlbnQgdG8gWSBpZmYgY29uZGl0aW9ucyAxIGFuZCAyIGhvbGQgYnV0IGNvbmRpdGlvbiAzIGRvZXMgbm90LlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGUqL1xuY29uc3QgX21hcENvbXBhcmUgPSBtYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG4gIGdldENvcHlNYXBFbnRyeUFycmF5LFxuICBBQlNFTlQsXG4gIChsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpID0+IHtcbiAgICBpZiAobGVmdFZhbHVlID09PSBBQlNFTlQgJiYgcmlnaHRWYWx1ZSA9PT0gQUJTRU5UKSB7XG4gICAgICB0aHJvdyBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGFic2VudCBlbnRyeSBwYWlyYDtcbiAgICB9IGVsc2UgaWYgKGxlZnRWYWx1ZSA9PT0gQUJTRU5UKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChyaWdodFZhbHVlID09PSBBQlNFTlQpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgcmV0dXJuIGNvbXBhcmVLZXlzKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7XG4gICAgfVxuICB9LFxuKTtcbmhhcmRlbihfbWFwQ29tcGFyZSk7XG5cbi8qKiBAdHlwZSB7S2V5Q29tcGFyZX0gKi9cbiAgICAgICBjb25zdCBjb21wYXJlS2V5cyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICBhc3NlcnRLZXkobGVmdCk7XG4gIGFzc2VydEtleShyaWdodCk7XG4gIGNvbnN0IGxlZnRTdHlsZSA9IHBhc3NTdHlsZU9mKGxlZnQpO1xuICBjb25zdCByaWdodFN0eWxlID0gcGFzc1N0eWxlT2YocmlnaHQpO1xuICBpZiAobGVmdFN0eWxlICE9PSByaWdodFN0eWxlKSB7XG4gICAgLyogRGlmZmVyZW50IHBhc3NTdHlsZXMgYXJlIGluY29tbWVuc3VyYXRlKi9cbiAgICByZXR1cm4gTmFOO1xuICB9XG4gIHN3aXRjaCAobGVmdFN0eWxlKSB7XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICBjYXNlICdudWxsJzpcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdiaWdpbnQnOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnYnl0ZUFycmF5JzpcbiAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAvKiBmb3IgdGhlc2UsIGtleXMgY29tcGFyZSB0aGUgc2FtZSBhcyByYW5rKi9cbiAgICAgIHJldHVybiBjb21wYXJlUmFuayhsZWZ0LCByaWdodCk7XG4gICAgfVxuICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgIGNvbnN0IHJhbmtDb21wID0gY29tcGFyZVJhbmsobGVmdCwgcmlnaHQpO1xuICAgICAgaWYgKHJhbmtDb21wID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKE51bWJlci5pc05hTihsZWZ0KSB8fCBOdW1iZXIuaXNOYU4ocmlnaHQpKSB7XG4gICAgICAgIC8qIE5hTiBpcyBlcXVhbCB0byBpdHNlbGYsIGJ1dCBpbmNvbW1lbnN1cmF0ZSB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSovXG4gICAgICAgIGFzc2VydCghTnVtYmVyLmlzTmFOKGxlZnQpIHx8ICFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIC8qIEFtb25nIG5vbi1OYU4gbnVtYmVycywga2V5IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHJhbmsgb3JkZXIuIE5vdGUgdGhhdCovXG4gICAgICAvKiBpbiBib3RoIG9yZGVycywgYC0wYCBpcyBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzcyBhcyBgMGAuKi9cbiAgICAgIHJldHVybiByYW5rQ29tcDtcbiAgICB9XG4gICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgaWYgKGxlZnQgPT09IHJpZ2h0KSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgLyogSWYgdHdvIHJlbW90YWJsZXMgYXJlIG5vdCBpZGVudGljYWwsIHRoZW4gYXMga2V5cyB0aGV5IGFyZSovXG4gICAgICAvKiBpbmNvbW1lbnN1cmF0ZS4qL1xuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG4gICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgLyogTGV4aWNvZ3JhcGhpYyBieSBrZXkgb3JkZXIuIFJhbmsgb3JkZXIgb2YgYXJyYXlzIGlzIGxleGljb2dyYXBoaWMgYnkqL1xuICAgICAgLyogcmFuayBvcmRlci4qL1xuICAgICAgLyogQmVjYXVzZSB0aGUgaW52YXJpYW50cyBhYm92ZSBhcHBseSB0byB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5LCovXG4gICAgICAvKiB0aGV5IGFwcGx5IHRvIHRoZSBhcnJheSBhcyBhIHdob2xlLiovXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyZUtleXMobGVmdFtpXSwgcmlnaHRbaV0pO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIGFyZSBrZXlFUSwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuICAgICAgLyogVGh1cywgaWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaXMgc21hbGxlciB0aGFuIFkuKi9cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgcmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgIH1cbiAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgLyogUGFyZXRvIHBhcnRpYWwgb3JkZXIgY29tcGFyaXNvbi4qL1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCBsZWZ0TmFtZXMgPSByZWNvcmROYW1lcyhsZWZ0KTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgcmlnaHROYW1lcyA9IHJlY29yZE5hbWVzKHJpZ2h0KTtcblxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIGlmICgha2V5RVEobGVmdE5hbWVzLCByaWdodE5hbWVzKSkge1xuICAgICAgICAvKiBJZiB0aGV5IGRvIG5vdCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydGllcywqL1xuICAgICAgICAvKiB0aGV5IGFyZSBpbmNvbW1lbnN1cmF0ZS4qL1xuICAgICAgICAvKiBOb3RlIHRoYXQgcmFuayBzb3J0aW5nIG9mIGNvcHlSZWNvcmRzIGdyb3VwcyBhbGwgY29weVJlY29yZHMgd2l0aCovXG4gICAgICAgIC8qIHRoZSBzYW1lIGtleXMgdG9nZXRoZXIsIGVuYWJsaW5nIHJhbmdlIHNlYXJjaGluZyBvdmVyIGNvcHlSZWNvcmRzKi9cbiAgICAgICAgLyogdG8gYXZvaWQgbW9yZSBpcnJlbGV2YW50IG9uZXMuKi9cbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgbGVmdFZhbHVlcyA9IHJlY29yZFZhbHVlcyhsZWZ0LCBsZWZ0TmFtZXMpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCByaWdodFZhbHVlcyA9IHJlY29yZFZhbHVlcyhyaWdodCwgcmlnaHROYW1lcyk7XG4gICAgICAvKiBQcmVzdW1lIHRoYXQgYm90aCBjb3B5UmVjb3JkcyBoYXZlIHRoZSBzYW1lIGtleSBvcmRlciovXG4gICAgICAvKiB1bnRpbCBlbmNvdW50ZXJpbmcgYSBwcm9wZXJ0eSBkaXNwcm92aW5nIHRoYXQgaHlwb3RoZXNpcy4qL1xuICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlZnRWYWx1ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgY29tcCA9IGNvbXBhcmVLZXlzKGxlZnRWYWx1ZXNbaV0sIHJpZ2h0VmFsdWVzW2ldKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihjb21wKSkge1xuICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gY29tcCAmJiBjb21wICE9PSAwKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gMCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gY29tcDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICAocmVzdWx0ID09PSAtMSAmJiBjb21wID09PSAxKSB8fCAocmVzdWx0ID09PSAxICYmIGNvbXAgPT09IC0xKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyogSWYgY29weVJlY29yZCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5UmVjb3JkIFksIHRoZW4gdGhleSBtdXN0IGhhdmUgdGhlKi9cbiAgICAgIC8qIHNhbWUgcHJvcGVydHkgbmFtZXMgYW5kIGV2ZXJ5IHZhbHVlIGluIFggbXVzdCBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvKi9cbiAgICAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIFkgKHdpdGggYXQgbGVhc3Qgb25lIHZhbHVlIHNtYWxsZXIpLiovXG4gICAgICAvKiBUaGUgcmFuayBvcmRlciBvZiBYIGFuZCBZIGlzIGJhc2VkIG9uIGxleGljb2dyYXBoaWMgcmFuayBvcmRlciBvZiovXG4gICAgICAvKiB0aGVpciB2YWx1ZXMsIGFzIG9yZ2FuaXplZCBieSByZXZlcnNlIGxleGljb2dyYXBoaWMgb3JkZXIgb2YgdGhlaXIqL1xuICAgICAgLyogcHJvcGVydHkgbmFtZXMuKi9cbiAgICAgIC8qIFRodXMgaWYgY29tcGFyZUtleXMoWCxZKSA8IDAgdGhlbiBjb21wYXJlUmFuayhYLFkpIDwgMC4qL1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCBsZWZ0VGFnID0gZ2V0VGFnKGxlZnQpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCByaWdodFRhZyA9IGdldFRhZyhyaWdodCk7XG4gICAgICBpZiAobGVmdFRhZyAhPT0gcmlnaHRUYWcpIHtcbiAgICAgICAgLyogZGlmZmVyZW50IHRhZ3MgYXJlIGluY29tbWVuc3VyYXRlKi9cbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAobGVmdFRhZykge1xuICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgICAgIHJldHVybiBzZXRDb21wYXJlKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgICAgIHJldHVybiBiYWdDb21wYXJlKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAgIC8qIFRPRE8gVGhlIGRlc2lyZWQgc2VtYW50aWNzIGZvciBDb3B5TWFwIGNvbXBhcmlzb24gaGF2ZSBub3QgeWV0IGJlZW4gZGVjaWRlZC4qL1xuICAgICAgICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzM3I3B1bGxyZXF1ZXN0cmV2aWV3LTE1OTY1OTU0MTEqL1xuICAgICAgICAgIHRocm93IEZhaWxgTWFwIGNvbXBhcmlzb24gbm90IHlldCBpbXBsZW1lbnRlZDogJHtsZWZ0fSB2cyAke3JpZ2h0fWA7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IEZhaWxgdW5leHBlY3RlZCB0YWcgJHtxKGxlZnRUYWcpfTogJHtsZWZ0fWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgRmFpbGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EobGVmdFN0eWxlKX06ICR7bGVmdH1gO1xuICAgIH1cbiAgfVxufTskaM2PX29uY2UuY29tcGFyZUtleXMoY29tcGFyZUtleXMpO1xuaGFyZGVuKGNvbXBhcmVLZXlzKTtcblxuICAgICAgIGNvbnN0IGtleUxUID0gKGxlZnQsIHJpZ2h0KSA9PiBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPCAwOyRozY9fb25jZS5rZXlMVChrZXlMVCk7XG5oYXJkZW4oa2V5TFQpO1xuXG4gICAgICAgY29uc3Qga2V5TFRFID0gKGxlZnQsIHJpZ2h0KSA9PiBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPD0gMDskaM2PX29uY2Uua2V5TFRFKGtleUxURSk7XG5oYXJkZW4oa2V5TFRFKTtcblxuICAgICAgIGNvbnN0IGtleUVRID0gKGxlZnQsIHJpZ2h0KSA9PiBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPT09IDA7JGjNj19vbmNlLmtleUVRKGtleUVRKTtcbmhhcmRlbihrZXlFUSk7XG5cbiAgICAgICBjb25zdCBrZXlHVEUgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA+PSAwOyRozY9fb25jZS5rZXlHVEUoa2V5R1RFKTtcbmhhcmRlbihrZXlHVEUpO1xuXG4gICAgICAgY29uc3Qga2V5R1QgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA+IDA7JGjNj19vbmNlLmtleUdUKGtleUdUKTtcbmhhcmRlbihrZXlHVCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiXSwiYmFnQ29tcGFyZSI6WyJiYWdDb21wYXJlIl0sImNvbXBhcmVLZXlzIjpbImNvbXBhcmVLZXlzIl0sImtleUxUIjpbImtleUxUIl0sImtleUxURSI6WyJrZXlMVEUiXSwia2V5RVEiOlsia2V5RVEiXSwia2V5R1RFIjpbImtleUdURSJdLCJrZXlHVCI6WyJrZXlHVCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA0W1NjTRUAAE0VAAApAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlCYWcuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydEJhZ0VudHJpZXMiLCJhc3NlcnROb0R1cGxpY2F0ZUtleXMiLCJjaGVja0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiLCJtYWtlQmFnT2ZFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqIEBpbXBvcnQge0NoZWNrZXIsIEZ1bGxDb21wYXJlfSBmcm9tICdAZW5kby9tYXJzaGFsJ1xuICogQGltcG9ydCB7Q29weUJhZywgS2V5fSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5XG4gKiBrbm93biB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdFxuICogcmF0aGVyIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmVcbiAqIGFycmF5IGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlLWtleXMgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZUtleXMgPSAoYmFnRW50cmllcywgZnVsbENvbXBhcmUsIGNoZWNrKSA9PiB7XG4gIC8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4gIC8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbiAgLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuICAvKiBsaW5lIHNob3VsZCBiZSByZXdyaXR0ZW4gdXNpbmcgaXQuKi9cbiAgZnVsbENvbXBhcmUgPSBmdWxsQ29tcGFyZSB8fCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIC8qIFNpbmNlIHRoZSBrZXkgaXMgbW9yZSBzaWduaWZpY2FudCB0aGFuIHRoZSB2YWx1ZSAodGhlIGNvdW50KSwqL1xuICAvKiBzb3J0aW5nIGJ5IGZ1bGxPcmRlciBpcyBndWFyYW50ZWVkIHRvIG1ha2UgZHVwbGljYXRlIGtleXMqL1xuICAvKiBhZGphY2VudCBpbmRlcGVuZGVudCBvZiB0aGVpciBjb3VudHMuKi9cbiAgYmFnRW50cmllcyA9IHNvcnRCeVJhbmsoYmFnRW50cmllcywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gYmFnRW50cmllcztcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGswID0gYmFnRW50cmllc1tpIC0gMV1bMF07XG4gICAgY29uc3QgazEgPSBiYWdFbnRyaWVzW2ldWzBdO1xuICAgIGlmIChmdWxsQ29tcGFyZShrMCwgazEpID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydE5vRHVwbGljYXRlS2V5cyA9IChiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSwgYXNzZXJ0Q2hlY2tlcik7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7W1Bhc3NhYmxlLGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaM2PX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKGFzc2VydE5vRHVwbGljYXRlS2V5cyk7XG4gICAgICAgY29uc3QgY2hlY2tCYWdFbnRyaWVzID0gKGJhZ0VudHJpZXMsIGNoZWNrKSA9PiB7XG4gIGlmIChwYXNzU3R5bGVPZihiYWdFbnRyaWVzKSAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7YmFnRW50cmllc31gLFxuICAgICk7XG4gIH1cbiAgaWYgKCFpc1JhbmtTb3J0ZWQoYmFnRW50cmllcywgY29tcGFyZUFudGlSYW5rKSkge1xuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGZhbHNlLFxuICAgICAgWGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2JhZ0VudHJpZXN9YCxcbiAgICApO1xuICB9XG4gIGZvciAoY29uc3QgZW50cnkgb2YgYmFnRW50cmllcykge1xuICAgIGlmIChcbiAgICAgIHBhc3NTdHlsZU9mKGVudHJ5KSAhPT0gJ2NvcHlBcnJheScgfHxcbiAgICAgIGVudHJ5Lmxlbmd0aCAhPT0gMiB8fFxuICAgICAgdHlwZW9mIGVudHJ5WzFdICE9PSAnYmlnaW50J1xuICAgICkge1xuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGJlIHBhaXIgb2YgYSBrZXkgYW5kIGEgYmlnaW50IHJlcHJlc2VudGluZyBhIGNvdW50OiAke2VudHJ5fWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZW50cnlbMV0gPCAxKSB7XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgaGF2ZSBhIHBvc2l0aXZlIGNvdW50OiAke2VudHJ5fWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBLZXkgdHlwZXMqL1xuICByZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcywgdW5kZWZpbmVkLCBjaGVjayk7XG59OyRozY9fb25jZS5jaGVja0JhZ0VudHJpZXMoY2hlY2tCYWdFbnRyaWVzKTtcbmhhcmRlbihjaGVja0JhZ0VudHJpZXMpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrIC0tIGRvZXNuJ3QgdW5kZXJzdGFuZCBhc3NlcnRzKi9cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiYWdFbnRyaWVzIGlzIFtQYXNzYWJsZSxiaWdpbnRdW119XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRCYWdFbnRyaWVzID0gYmFnRW50cmllcyA9PiB7XG4gIGNoZWNrQmFnRW50cmllcyhiYWdFbnRyaWVzLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEJhZ0VudHJpZXMoYXNzZXJ0QmFnRW50cmllcyk7XG5oYXJkZW4oYXNzZXJ0QmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyaWVzTGlzdFxuICovXG4gICAgICAgY29uc3QgY29lcmNlVG9CYWdFbnRyaWVzID0gYmFnRW50cmllc0xpc3QgPT4ge1xuICBjb25zdCBiYWdFbnRyaWVzID0gc29ydEJ5UmFuayhiYWdFbnRyaWVzTGlzdCwgY29tcGFyZUFudGlSYW5rKTtcbiAgYXNzZXJ0QmFnRW50cmllcyhiYWdFbnRyaWVzKTtcbiAgcmV0dXJuIGJhZ0VudHJpZXM7XG59OyRozY9fb25jZS5jb2VyY2VUb0JhZ0VudHJpZXMoY29lcmNlVG9CYWdFbnRyaWVzKTtcbmhhcmRlbihjb2VyY2VUb0JhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBiaWdpbnRdPn0gYmFnRW50cnlJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VCYWdPZkVudHJpZXMgPSBiYWdFbnRyeUl0ZXIgPT5cbiAgbWFrZVRhZ2dlZCgnY29weUJhZycsIGNvZXJjZVRvQmFnRW50cmllcyhiYWdFbnRyeUl0ZXIpKTskaM2PX29uY2UubWFrZUJhZ09mRW50cmllcyhtYWtlQmFnT2ZFbnRyaWVzKTtcbmhhcmRlbihtYWtlQmFnT2ZFbnRyaWVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALCODJiwRAAAsEQAAKQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb3B5U2V0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVtZW50cyIsImFzc2VydE5vRHVwbGljYXRlcyIsImNoZWNrRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIiwibWFrZVNldE9mRWxlbWVudHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLFg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIixbJGjNj19hID0+IChpc1JhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICogQGltcG9ydCB7Q2hlY2tlciwgRnVsbENvbXBhcmV9IGZyb20gJ0BlbmRvL21hcnNoYWwnXG4gKiBAaW1wb3J0IHtDb3B5U2V0LCBLZXl9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlIHwgdW5kZWZpbmVkfSBmdWxsQ29tcGFyZSBJZiBwcm92aWRlZCBhbmQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IGtub3duXG4gKiB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdCByYXRoZXJcbiAqIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmUgYXJyYXlcbiAqIGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlIGZpbmRpbmcgYXMgd2VsbCwgaW5kZXBlbmRlbnRcbiAqIG9mIHRoZSBgZnVsbE9yZGVyYCB1c2UgdG8gcmVhY2ggdGhpcyBmaW5kaW5nLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVzID0gKGVsZW1lbnRzLCBmdWxsQ29tcGFyZSwgY2hlY2spID0+IHtcbiAgLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbiAgLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuICAvKiBUT0RPIE9uY2UgYWxsIG91ciB0b29saW5nIGlzIHJlYWR5IGZvciBgJiY9YCwgdGhlIGZvbGxvd2luZyovXG4gIC8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuICBmdWxsQ29tcGFyZSA9IGZ1bGxDb21wYXJlIHx8IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgZWxlbWVudHMgPSBzb3J0QnlSYW5rKGVsZW1lbnRzLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBlbGVtZW50cztcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGswID0gZWxlbWVudHNbaSAtIDFdO1xuICAgIGNvbnN0IGsxID0gZWxlbWVudHNbaV07XG4gICAgaWYgKGZ1bGxDb21wYXJlKGswLCBrMSkgPT09IDApIHtcbiAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IFtmdWxsQ29tcGFyZV1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0Tm9EdXBsaWNhdGVzID0gKGVsZW1lbnRzLCBmdWxsQ29tcGFyZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjaGVja05vRHVwbGljYXRlcyhlbGVtZW50cywgZnVsbENvbXBhcmUsIGFzc2VydENoZWNrZXIpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRozY9fb25jZS5hc3NlcnROb0R1cGxpY2F0ZXMoYXNzZXJ0Tm9EdXBsaWNhdGVzKTtcbiAgICAgICBjb25zdCBjaGVja0VsZW1lbnRzID0gKGVsZW1lbnRzLCBjaGVjaykgPT4ge1xuICBpZiAocGFzc1N0eWxlT2YoZWxlbWVudHMpICE9PSAnY29weUFycmF5Jykge1xuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGZhbHNlLFxuICAgICAgWGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIGEgY29weUFycmF5OiAke2VsZW1lbnRzfWAsXG4gICAgKTtcbiAgfVxuICBpZiAoIWlzUmFua1NvcnRlZChlbGVtZW50cywgY29tcGFyZUFudGlSYW5rKSkge1xuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGZhbHNlLFxuICAgICAgWGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7ZWxlbWVudHN9YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBjaGVja05vRHVwbGljYXRlcyhlbGVtZW50cywgdW5kZWZpbmVkLCBjaGVjayk7XG59OyRozY9fb25jZS5jaGVja0VsZW1lbnRzKGNoZWNrRWxlbWVudHMpO1xuaGFyZGVuKGNoZWNrRWxlbWVudHMpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0RWxlbWVudHMgPSBlbGVtZW50cyA9PiB7XG4gIGNoZWNrRWxlbWVudHMoZWxlbWVudHMsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0RWxlbWVudHMoYXNzZXJ0RWxlbWVudHMpO1xuaGFyZGVuKGFzc2VydEVsZW1lbnRzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudHNMaXN0XG4gKi9cbiAgICAgICBjb25zdCBjb2VyY2VUb0VsZW1lbnRzID0gZWxlbWVudHNMaXN0ID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBzb3J0QnlSYW5rKGVsZW1lbnRzTGlzdCwgY29tcGFyZUFudGlSYW5rKTtcbiAgYXNzZXJ0RWxlbWVudHMoZWxlbWVudHMpO1xuICByZXR1cm4gZWxlbWVudHM7XG59OyRozY9fb25jZS5jb2VyY2VUb0VsZW1lbnRzKGNvZXJjZVRvRWxlbWVudHMpO1xuaGFyZGVuKGNvZXJjZVRvRWxlbWVudHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU2V0T2ZFbGVtZW50cyA9IGVsZW1lbnRJdGVyID0+XG4gIG1ha2VUYWdnZWQoJ2NvcHlTZXQnLCBjb2VyY2VUb0VsZW1lbnRzKGVsZW1lbnRJdGVyKSk7JGjNj19vbmNlLm1ha2VTZXRPZkVsZW1lbnRzKG1ha2VTZXRPZkVsZW1lbnRzKTtcbmhhcmRlbihtYWtlU2V0T2ZFbGVtZW50cyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVzIl0sImNoZWNrRWxlbWVudHMiOlsiY2hlY2tFbGVtZW50cyJdLCJhc3NlcnRFbGVtZW50cyI6WyJhc3NlcnRFbGVtZW50cyJdLCJjb2VyY2VUb0VsZW1lbnRzIjpbImNvZXJjZVRvRWxlbWVudHMiXSwibWFrZVNldE9mRWxlbWVudHMiOlsibWFrZVNldE9mRWxlbWVudHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2zWaQMMiAADDIgAAOQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vY29tbW9uL21ha2UtaXRlcmF0b3IuanMiLCJAZW5kby9jb21tb24vbWFrZS1hcnJheS1pdGVyYXRvci5qcyIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIiwibWFrZUNvbXBhcmVDb2xsZWN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxtYWtlSXRlcmF0b3IsbWFrZUFycmF5SXRlcmF0b3IscSxGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUl0ZXJhdG9yXCIsWyRozY9fYSA9PiAobWFrZUl0ZXJhdG9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL21ha2UtYXJyYXktaXRlcmF0b3IuanNcIiwgW1tcIm1ha2VBcnJheUl0ZXJhdG9yXCIsWyRozY9fYSA9PiAobWFrZUFycmF5SXRlcmF0b3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBSZWZpbmVzIGEgc2VxdWVuY2Ugb2YgZW50cmllcyB0aGF0IGlzIGFscmVhZHkgc29ydGVkIG92ZXIgaXRzIGtleXMgYnkgdGhlXG4gKiBgcmFua0NvbXBhcmVgIHByZW9yZGVyLCB3aGVyZSB0aGVyZSBtYXkgYmUgaW50ZXJuYWwgcnVucyB0aWVkIGZvciB0aGUgc2FtZVxuICogcmFuaywgaW50byBhbiBpdGVyYWJsZSB0aGF0IHJlc29sdmVzIHRob3NlIHRpZXMgdXNpbmcgYGZ1bGxDb21wYXJlYC5cbiAqXG4gKiBAdGVtcGxhdGUgW1Y9dW5rbm93bl1cbiAqIEBwYXJhbSB7QXJyYXk8W0tleSwgVl0+fSBlbnRyaWVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZUl0ZXJhdG9yPFtLZXksIFZdPn1cbiAqL1xuY29uc3QgZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyA9IChlbnRyaWVzLCByYW5rQ29tcGFyZSwgZnVsbENvbXBhcmUpID0+IHtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggS2V5IHR5cGVzKi9cbiAgYXNzZXJ0UmFua1NvcnRlZChlbnRyaWVzLCByYW5rQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBlbnRyaWVzO1xuICBsZXQgaSA9IDA7XG4gIGxldCBzYW1lUmFua0l0ZXJhdG9yO1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHtcbiAgICBpZiAoc2FtZVJhbmtJdGVyYXRvcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gc2FtZVJhbmtJdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoIXJlc3VsdC5kb25lKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBzYW1lUmFua0l0ZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldO1xuICAgICAgLyogTG9vayBhaGVhZCBmb3Igc2FtZS1yYW5rIHRpZXMuKi9cbiAgICAgIGxldCBqID0gaSArIDE7XG4gICAgICB3aGlsZSAoaiA8IGxlbmd0aCAmJiByYW5rQ29tcGFyZShlbnRyeVswXSwgZW50cmllc1tqXVswXSkgPT09IDApIHtcbiAgICAgICAgaiArPSAxO1xuICAgICAgfVxuICAgICAgaWYgKGogPT09IGkgKyAxKSB7XG4gICAgICAgIC8qIE5vIHRpZXMgZm91bmQuKi9cbiAgICAgICAgaSA9IGo7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWU6IGVudHJ5IH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdGllcyA9IGVudHJpZXMuc2xpY2UoaSwgaik7XG4gICAgICBpID0gajtcblxuICAgICAgLyogU29ydCB0aGUgdGllcyBieSBgZnVsbENvbXBhcmVgLCBlbmZvcmNlIGtleSB1bmlxdWVuZXNzLCBhbmQgZGVsZWdhdGUgdG8qL1xuICAgICAgLyogYSBzdWItaXRlcmF0b3IuKi9cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIEtleSB0eXBlcyovXG4gICAgICBjb25zdCBzb3J0ZWRUaWVzID0gc29ydEJ5UmFuayh0aWVzLCBmdWxsQ29tcGFyZSk7XG4gICAgICBmb3IgKGxldCBrID0gMTsgayA8IHNvcnRlZFRpZXMubGVuZ3RoOyBrICs9IDEpIHtcbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggS2V5IHR5cGVzKi9cbiAgICAgICAgY29uc3QgW2tleTBdID0gc29ydGVkVGllc1trIC0gMV07XG4gICAgICAgIGNvbnN0IFtrZXkxXSA9IHNvcnRlZFRpZXNba107XG4gICAgICAgIE1hdGguc2lnbihmdWxsQ29tcGFyZShrZXkwLCBrZXkxKSkgfHxcbiAgICAgICAgICBGYWlsYER1cGxpY2F0ZSBlbnRyeSBrZXk6ICR7a2V5MH1gO1xuICAgICAgfVxuICAgICAgc2FtZVJhbmtJdGVyYXRvciA9IG1ha2VBcnJheUl0ZXJhdG9yKHNvcnRlZFRpZXMpO1xuICAgICAgcmV0dXJuIHNhbWVSYW5rSXRlcmF0b3IubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgfSk7XG59O1xuaGFyZGVuKGdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXMpO1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBtZXJnZXMgcmV2ZXJzZS1yYW5rLXNvcnRlZCBba2V5LCB2YWx1ZV0gZW50cmllcyBvZlxuICogdHdvIEtleUNvbGxlY3Rpb25zIGludG8gYSByZXZlcnNlLWZ1bGwtc29ydGVkIFtrZXksIHZhbHVlMSwgdmFsdWUyXSBlbnRyaWVzXG4gKiBieSB0aGUga2V5IHRoZXkgaGF2ZSBpbiBjb21tb24sIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgZm9yIGFuIGFic2VudCBlbnRyeSBpblxuICogZWl0aGVyIGNvbGxlY3Rpb24gYXMgYGFic2VudFZhbHVlYC5cbiAqXG4gKiBAdGVtcGxhdGUgW0M9S2V5Q29sbGVjdGlvbl1cbiAqIEB0ZW1wbGF0ZSBbVj11bmtub3duXVxuICogQHBhcmFtIHtDfSBjMVxuICogQHBhcmFtIHtDfSBjMlxuICogQHBhcmFtIHsoY29sbGVjdGlvbjogQykgPT4gQXJyYXk8W0tleSwgVl0+fSBnZXRFbnRyaWVzXG4gKiBAcGFyYW0ge2FueX0gYWJzZW50VmFsdWVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZUl0ZXJhdG9yPFtLZXksIFYgfCBhYnNlbnRWYWx1ZSwgViB8IGFic2VudFZhbHVlXT59XG4gKi9cbiAgICAgICBjb25zdCBnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyA9IChcbiAgYzEsXG4gIGMyLFxuICBnZXRFbnRyaWVzLFxuICBhYnNlbnRWYWx1ZSxcbikgPT4ge1xuICBjb25zdCBlMSA9IGdldEVudHJpZXMoYzEpO1xuICBjb25zdCBlMiA9IGdldEVudHJpZXMoYzIpO1xuXG4gIC8qIEVzdGFibGlzaCBhIGhpc3RvcnktZGVwZW5kZW50IGNvbXBhcmlzb24gc2NvcGVkIHRvIHRoZSBhY3RpdmUgaW52b2NhdGlvbiovXG4gIC8qIGFuZCB1c2UgaXQgdG8gbWFwIHJldmVyc2UtcHJlb3JkZXJlZCBlbnRyaWVzIGludG8gYW4gaXRlcmF0b3Igd2l0aCBhKi9cbiAgLyogbmFycm93ZXIgdG90YWwgb3JkZXIuKi9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuICBjb25zdCB4ID0gZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyhlMSwgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHkgPSBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKGUyLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcblxuICAvKiBNYWludGFpbiBhIHNpbmdsZS1yZXN1bHQgeyBkb25lLCBrZXksIHZhbHVlIH0gYnVmZmVyIGZvciBlYWNoIGl0ZXJhdG9yKi9cbiAgLyogc28gdGhleSBjYW4gYmUgbWVyZ2VkLiovXG4gIGxldCB4RG9uZTtcbiAgbGV0IHhLZXk7XG4gIGxldCB4VmFsdWU7XG4gIGxldCB5RG9uZTtcbiAgbGV0IHlLZXk7XG4gIGxldCB5VmFsdWU7XG4gIGNvbnN0IG5vbkVudHJ5ID0gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcbiAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgIXhEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRYIG11c3Qgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgIGNvbnN0IHJlc3VsdCA9IHhWYWx1ZTtcbiAgICAoeyBkb25lOiB4RG9uZSwgdmFsdWU6IFt4S2V5LCB4VmFsdWVdID0gbm9uRW50cnkgfSA9IHgubmV4dCgpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBuZXh0WCgpO1xuICBjb25zdCBuZXh0WSA9ICgpID0+IHtcbiAgICAheURvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFkgbXVzdCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgY29uc3QgcmVzdWx0ID0geVZhbHVlO1xuICAgICh7IGRvbmU6IHlEb25lLCB2YWx1ZTogW3lLZXksIHlWYWx1ZV0gPSBub25FbnRyeSB9ID0geS5uZXh0KCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG5leHRZKCk7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4ge1xuICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgLyoqIEB0eXBlIHtbS2V5LCBWIHwgYWJzZW50VmFsdWUsIFYgfCBhYnNlbnRWYWx1ZV19ICovXG4gICAgbGV0IHZhbHVlO1xuICAgIGlmICh4RG9uZSAmJiB5RG9uZSkge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICB2YWx1ZSA9IFt1bmRlZmluZWQsIGFic2VudFZhbHVlLCBhYnNlbnRWYWx1ZV07XG4gICAgfSBlbHNlIGlmICh4RG9uZSkge1xuICAgICAgdmFsdWUgPSBbeUtleSwgYWJzZW50VmFsdWUsIG5leHRZKCldO1xuICAgIH0gZWxzZSBpZiAoeURvbmUpIHtcbiAgICAgIHZhbHVlID0gW3hLZXksIG5leHRYKCksIGFic2VudFZhbHVlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogQ29tcGFyZSB0aGUga2V5cyB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHJldHVybiBhIG1lcmdlZCByZXN1bHQqL1xuICAgICAgLyogb3IgYSBvbmUtc2lkZWQgcmVzdWx0LiovXG4gICAgICBjb25zdCBjb21wID0gZnVsbENvbXBhcmUoeEtleSwgeUtleSk7XG4gICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICB2YWx1ZSA9IFt4S2V5LCBuZXh0WCgpLCBuZXh0WSgpXTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgdmFsdWUgPSBbeEtleSwgbmV4dFgoKSwgYWJzZW50VmFsdWVdO1xuICAgICAgfSBlbHNlIGlmIChjb21wID4gMCkge1xuICAgICAgICB2YWx1ZSA9IFt5S2V5LCBhYnNlbnRWYWx1ZSwgbmV4dFkoKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBGYWlsYFVuZXhwZWN0ZWQga2V5IGNvbXBhcmlzb24gJHtxKGNvbXApfSBmb3IgJHt4S2V5fSB2cyAke3lLZXl9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmUsIHZhbHVlIH0pO1xuICB9KTtcbn07JGjNj19vbmNlLmdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKTtcbmhhcmRlbihnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyk7XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIGZvciBjb21wYXJpbmcgdHdvIEtleUNvbGxlY3Rpb25zIG9mIHRoZSBzYW1lIHR5cGUgdXNpbmdcbiAqIHRoZSBwcm92aWRlZCBlbnRyaWVzIGZhY3RvcnkgYW5kIHNhbWUta2V5IGVudHJ5IHZhbHVlIGNvbXBhcmF0b3IgKHdoZXJlIHRoZVxuICogdmFsdWUgZm9yIGFuIGFic2VudCBlbnRyeSBpbiBvbmUgY29sbGVjdGlvbiBpcyBgYWJzZW50VmFsdWVgKS5cbiAqXG4gKiBJZiB0aGUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGZvciBhbnkgc2luZ2xlIGtleSBhcmUgaW5jb21wYXJhYmxlIG9yIHRoZVxuICogY29tcGFyaXNvbiByZXN1bHQgaGFzIHRoZSBvcHBvc2l0ZSBzaWduIG9mIHRoZSByZXN1bHQgZm9yIGEgZGlmZmVyZW50IGtleSxcbiAqIHRoZW4gdGhlIEtleUNvbGxlY3Rpb25zIGFyZSBpbmNvbXBhcmFibGUuIE90aGVyd2lzZSwgdGhlIGNvbGxlY3Rpb25zIGNvbXBhcmVcbiAqIGJ5IHRoZSByZXN1bHQgb2YgYW55IG5vbi1lcXVhbCBlbnRyeSBjb21wYXJpc29uLCBvciBjb21wYXJlIGVxdWFsIGlmIHRoZXJlIGlzXG4gKiBubyBub24tZXF1YWwgZW50cnkgY29tcGFyaXNvbiByZXN1bHQuXG4gKiBGb3IgZXhhbXBsZSwgZ2l2ZW4gQ29weUJhZ3MgWCBhbmQgWSBhbmQgYSB2YWx1ZSBjb21wYXJhdG9yIHRoYXQgZ29lcyBieSBjb3VudFxuICogKGRlZmF1bHRpbmcgYWJzZW50IGtleXMgdG8gYSBjb3VudCBvZiAwKSwgWCBpcyBzbWFsbGVyIHRoYW4gWSAoYHJlc3VsdCA8IDBgKVxuICogaWZmIHRoZXJlIGFyZSBubyBrZXlzIGluIFggdGhhdCBhcmUgZWl0aGVyIGFic2VudCBmcm9tIFlcbiAqIChgY29tcGFyZVZhbHVlcyh4Q291bnQsIGFic2VudFZhbHVlKSA+IDBgKSBvciBwcmVzZW50IGluIFkgd2l0aCBhIGxvd2VyIGNvdW50XG4gKiAoYGNvbXBhcmVWYWx1ZXMoeENvdW50LCB5Q291bnQpID4gMGApIEFORCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUga2V5IGluIFkgdGhhdFxuICogaXMgZWl0aGVyIGFic2VudCBmcm9tIFggKGBjb21wYXJlVmFsdWVzKGFic2VudFZhbHVlLCB5Q291bnQpIDwgMGApIG9yIHByZXNlbnRcbiAqIHdpdGggYSBsb3dlciBjb3VudCAoYGNvbXBhcmVWYWx1ZXMoeENvdW50LCB5Q291bnQpIDwgMGApLlxuICpcbiAqIFRoaXMgY2FuIGJlIGdlbmVyYWxpemVkIHRvIHZpcnR1YWwgY29sbGVjdGlvbnMgaW4gdGhlIGZ1dHVyZSBieSByZXBsYWNpbmdcbiAqIGBnZXRFbnRyaWVzID0+IEFycmF5YCB3aXRoIGBnZW5lcmF0ZUVudHJpZXMgPT4gSXRlcmFibGVJdGVyYXRvcmAuXG4gKlxuICogQHRlbXBsYXRlIFtDPUtleUNvbGxlY3Rpb25dXG4gKiBAdGVtcGxhdGUgW1Y9dW5rbm93bl1cbiAqIEBwYXJhbSB7KGNvbGxlY3Rpb246IEMpID0+IEFycmF5PFtLZXksIFZdPn0gZ2V0RW50cmllc1xuICogQHBhcmFtIHtWfSBhYnNlbnRWYWx1ZVxuICogQHBhcmFtIHtLZXlDb21wYXJlfSBjb21wYXJlVmFsdWVzXG4gKiBAcmV0dXJucyB7KGxlZnQ6IEMsIHJpZ2h0OiBDKSA9PiBLZXlDb21wYXJpc29ufVxuICovXG4gICAgICAgY29uc3QgbWFrZUNvbXBhcmVDb2xsZWN0aW9uID0gKGdldEVudHJpZXMsIGFic2VudFZhbHVlLCBjb21wYXJlVmFsdWVzKSA9PlxuICBoYXJkZW4oKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgY29uc3QgbWVyZ2VkID0gZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMoXG4gICAgICBsZWZ0LFxuICAgICAgcmlnaHQsXG4gICAgICBnZXRFbnRyaWVzLFxuICAgICAgYWJzZW50VmFsdWUsXG4gICAgKTtcbiAgICBsZXQgbGVmdElzQmlnZ2VyID0gZmFsc2U7XG4gICAgbGV0IHJpZ2h0SXNCaWdnZXIgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtfa2V5LCBsZWZ0VmFsdWUsIHJpZ2h0VmFsdWVdIG9mIG1lcmdlZCkge1xuICAgICAgY29uc3QgY29tcCA9IGNvbXBhcmVWYWx1ZXMobGVmdFZhbHVlLCByaWdodFZhbHVlKTtcbiAgICAgIGlmIChjb21wID09PSAwKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZSovXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkge1xuICAgICAgICAvKiBCYXNlZCBvbiB0aGlzIGtleSwgbGVmdCA8IHJpZ2h0LiovXG4gICAgICAgIHJpZ2h0SXNCaWdnZXIgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChjb21wID4gMCkge1xuICAgICAgICAvKiBCYXNlZCBvbiB0aGlzIGtleSwgbGVmdCA+IHJpZ2h0LiovXG4gICAgICAgIGxlZnRJc0JpZ2dlciA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBOdW1iZXIuaXNOYU4oY29tcCkgfHxcbiAgICAgICAgICAvKiBwcmV0dGllci1pZ25vcmUqL1xuICAgICAgICAgIEZhaWxgVW5leHBlY3RlZCB2YWx1ZSBjb21wYXJpc29uICR7cShjb21wKX0gZm9yICR7bGVmdFZhbHVlfSB2cyAke3JpZ2h0VmFsdWV9YDtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIGlmIChsZWZ0SXNCaWdnZXIgJiYgcmlnaHRJc0JpZ2dlcikge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xuICAgIHJldHVybiBsZWZ0SXNCaWdnZXIgPyAxIDogcmlnaHRJc0JpZ2dlciA/IC0xIDogMDtcbiAgfSk7JGjNj19vbmNlLm1ha2VDb21wYXJlQ29sbGVjdGlvbihtYWtlQ29tcGFyZUNvbGxlY3Rpb24pO1xuaGFyZGVuKG1ha2VDb21wYXJlQ29sbGVjdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyI6WyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyJdLCJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iOlsibWFrZUNvbXBhcmVDb2xsZWN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJnEOAFXKAAAVygAADUAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIiwiLi9jb3B5QmFnLmpzIl0sImV4cG9ydHMiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzRGlzam9pbnQiLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLHEsRmFpbCxhc3NlcnROb0R1cGxpY2F0ZUtleXMsbWFrZUJhZ09mRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIixbJGjNj19hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzXCIsWyRozY9fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gJGjNj19hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIixbJGjNj19hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0Z1bGxDb21wYXJlLCBSYW5rQ29tcGFyZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCdcbiAqIEBpbXBvcnQge0tleX0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKi9cblxuLyogQmFzZWQgb24gbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgYnV0IGFsdGVyZWQgZm9yIHRoZSBiYWcgcmVwcmVzZW50YXRpb24uKi9cbi8qIFRPRE8gc2hhcmUgbW9yZSBjb2RlIHdpdGggdGhhdCBmaWxlIGFuZCBrZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcy4qL1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZVxuICogdGhlcmVcbiAqIG1heSBiZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgYmFnRW50cmllcyB3aG9zZSBrZXlzIGFyZSB0aWVkIGZvciB0aGUgc2FtZVxuICogcmFuay5cbiAqIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCB3aWxsIGVudW1lcmF0ZSBhbGwgdGhlIGJhZ0VudHJpZXMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBiYWdFbnRyaWVzYCBhcnJheVxuICogYWNjb3JkaW5nXG4gKiB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludF0+fVxuICovXG5jb25zdCBiYWdXaW5kb3dSZXNvcnQgPSAoYmFnRW50cmllcywgcmFua0NvbXBhcmUsIGZ1bGxDb21wYXJlKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoYmFnRW50cmllcywgcmFua0NvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gYmFnRW50cmllcztcbiAgbGV0IGkgPSAwO1xuICBsZXQgb3B0SW5uZXJJdGVyYXRvcjtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+XG4gICAgICBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKG9wdElubmVySXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgIG9wdElubmVySXRlcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCovXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBiYWdFbnRyaWVzW2ldO1xuICAgICAgICAgICAgbGV0IGogPSBpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgaiA8IGxlbmd0aCAmJlxuICAgICAgICAgICAgICByYW5rQ29tcGFyZShlbnRyeVswXSwgYmFnRW50cmllc1tqXVswXSkgPT09IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWU6IGVudHJ5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2ltaWxhclJ1biA9IGJhZ0VudHJpZXMuc2xpY2UoaSwgaik7XG4gICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgIGNvbnN0IHJlc29ydGVkID0gc29ydEJ5UmFuayhzaW1pbGFyUnVuLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4gICAgICAgICAgICAvKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4gICAgICAgICAgICAvKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG4gICAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZUtleXMocmVzb3J0ZWQsIGZ1bGxDb21wYXJlKTtcbiAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbiAgICAgICAgICAgIC8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuICAgICAgICAgICAgLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuICAgICAgICAgICAgLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4gICAgICAgICAgICAvKiBhcyBpcy4qL1xuICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgICAgICAgIHJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiBbbnVsbCwgMG5dIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB3aG9zZSBpdGVyYXRpb24gcmVzdWx0cyBhcmUgW2tleSwgeENvdW50LCB5Q291bnRdIHR1cGxlc1xuICogcmVwcmVzZW50aW5nIHRoZSBuZXh0IGtleSBpbiB0aGUgbG9jYWwgZnVsbCBvcmRlciwgYXMgd2VsbCBhcyBob3cgbWFueVxuICogdGltZXMgaXQgb2NjdXJyZWQgaW4gdGhlIHggaW5wdXQgaXRlcmF0b3IgYW5kIHRoZSB5IGlucHV0IGl0ZXJhdG9yLlxuICpcbiAqIEZvciBzZXRzLCB0aGVzZSBjb3VudHMgYXJlIGFsd2F5cyAwIG9yIDEsIGJ1dCB0aGlzIHJlcHJlc2VudGF0aW9uXG4gKiBnZW5lcmFsaXplcyBuaWNlbHkgZm9yIGJhZ3MuXG4gKlxuICogQHRlbXBsYXRlIHtLZXl9IFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB4YmFnRW50cmllc1xuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHliYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZSA9ICh4YmFnRW50cmllcywgeWJhZ0VudHJpZXMpID0+IHtcbiAgLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbiAgLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4gIGNvbnN0IGZ1bGxDb21wYXJlID0gbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuICBjb25zdCB4cyA9IGJhZ1dpbmRvd1Jlc29ydCh4YmFnRW50cmllcywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHlzID0gYmFnV2luZG93UmVzb3J0KHliYWdFbnRyaWVzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIC8qIFRoZXNlIHNpeCBgbGV0YCB2YXJpYWJsZXMgYXJlIGJ1ZmZlcmluZyBvbmUgYWhlYWQgZnJvbSB0aGUgdW5kZXJseWluZyovXG4gICAgICAvKiBpdGVyYXRvcnMuIEVhY2ggaXRlcmF0aW9uIHJlcG9ydHMgb25lIG9yIHRoZSBvdGhlciBvciBib3RoLCBhbmQqL1xuICAgICAgLyogdGhlbiByZWZpbGxzIHRoZSBidWZmZXJzIG9mIHRob3NlIGl0IGFkdmFuY2VkLiovXG4gICAgICAvKiogQHR5cGUge1R9ICovXG4gICAgICBsZXQgeDtcbiAgICAgIGxldCB4YztcbiAgICAgIGxldCB4RG9uZTtcbiAgICAgIC8qKiBAdHlwZSB7VH0gKi9cbiAgICAgIGxldCB5O1xuICAgICAgbGV0IHljO1xuICAgICAgbGV0IHlEb25lO1xuXG4gICAgICBjb25zdCB4aSA9IHhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IG5leHRYID0gKCkgPT4ge1xuICAgICAgICAheERvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICAgICAgKHtcbiAgICAgICAgICBkb25lOiB4RG9uZSxcbiAgICAgICAgICB2YWx1ZTogW3gsIHhjXSxcbiAgICAgICAgfSA9IHhpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFgoKTtcblxuICAgICAgY29uc3QgeWkgPSB5c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBuZXh0WSA9ICgpID0+IHtcbiAgICAgICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgICAgICh7XG4gICAgICAgICAgZG9uZTogeURvbmUsXG4gICAgICAgICAgdmFsdWU6IFt5LCB5Y10sXG4gICAgICAgIH0gPSB5aS5uZXh0KCkpO1xuICAgICAgfTtcbiAgICAgIG5leHRZKCk7XG5cbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICAgICAgLyoqIEB0eXBlIHtbVCxiaWdpbnQsYmlnaW50XX0gKi9cbiAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgaWYgKHhEb25lICYmIHlEb25lKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbiAgICAgICAgICAgIHZhbHVlID0gW251bGwsIDBuLCAwbl07XG4gICAgICAgICAgfSBlbHNlIGlmICh4RG9uZSkge1xuICAgICAgICAgICAgLyogb25seSB5cyBhcmUgbGVmdCovXG4gICAgICAgICAgICB2YWx1ZSA9IFt5LCAwbiwgeWNdO1xuICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHlEb25lKSB7XG4gICAgICAgICAgICAvKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbiAgICAgICAgICAgIHZhbHVlID0gW3gsIHhjLCAwbl07XG4gICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21wID0gZnVsbENvbXBhcmUoeCwgeSk7XG4gICAgICAgICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICAgICAgICAvKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG4gICAgICAgICAgICAgIHZhbHVlID0gW3gsIHhjLCB5Y107XG4gICAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgICAgICAgIC8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIDBuXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbiAgICAgICAgICAgICAgY29tcCA+IDAgfHwgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt5LCAwbiwgeWNdO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZSwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07XG5oYXJkZW4obWVyZ2UpO1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzU3VwZXJzZXQgYXMgd2VsbC4qL1xuLyogVGhlIGdlbmVyYWxpemF0aW9uIGlzIGZyZWUuKi9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBiYWdJdGVySXNTdXBlcmJhZyA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA8IHljKSB7XG4gICAgICAvKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcmJhZyBvZiB5Ki9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzRGlzam9pbnQgYXMgd2VsbC4qL1xuLyogVGhlIGNvZGUgaXMgaWRlbnRpY2FsLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgYmFnSXRlcklzRGlzam9pbnQgPSB4eWkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMW4gJiYgeWMgPj0gMW4pIHtcbiAgICAgIC8qIFNvbWV0aGluZyBpbiBib3RoLCBzbyBub3QgZGlzam9pbnQqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50LGJpZ2ludF1bXX0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVyVW5pb24gPSB4eWkgPT4ge1xuICAvKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgcmVzdWx0LnB1c2goW20sIHhjICsgeWNdKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlckludGVyc2VjdGlvbiA9IHh5aSA9PiB7XG4gIC8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBjb25zdCBtYyA9IHhjIDw9IHljID8geGMgOiB5YztcbiAgICByZXN1bHQucHVzaChbbSwgbWNdKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlckRpc2pvaW50U3VidHJhY3QgPSB4eWkgPT4ge1xuICAvKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgY29uc3QgbWMgPSB4YyAtIHljO1xuICAgIG1jID49IDBuIHx8IEZhaWxgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG4gICAgaWYgKG1jID49IDFuKSB7XG4gICAgICAvKiB0aGUgeCB3YXMgbm90IGluIHkqL1xuICAgICAgcmVzdWx0LnB1c2goW20sIG1jXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBtZXJnZWlmeSA9IGJhZ0l0ZXJPcCA9PiAoeGJhZ0VudHJpZXMsIHliYWdFbnRyaWVzKSA9PlxuICBiYWdJdGVyT3AobWVyZ2UoeGJhZ0VudHJpZXMsIHliYWdFbnRyaWVzKSk7XG5cbmNvbnN0IGJhZ0VudHJpZXNJc1N1cGVyYmFnID0gbWVyZ2VpZnkoYmFnSXRlcklzU3VwZXJiYWcpO1xuY29uc3QgYmFnRW50cmllc0lzRGlzam9pbnQgPSBtZXJnZWlmeShiYWdJdGVySXNEaXNqb2ludCk7XG5jb25zdCBiYWdFbnRyaWVzVW5pb24gPSBtZXJnZWlmeShiYWdJdGVyVW5pb24pO1xuY29uc3QgYmFnRW50cmllc0ludGVyc2VjdGlvbiA9IG1lcmdlaWZ5KGJhZ0l0ZXJJbnRlcnNlY3Rpb24pO1xuY29uc3QgYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QgPSBtZXJnZWlmeShiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd0JhZ2lmeSA9IGJhZ0VudHJpZXNPcCA9PiAoeGJhZywgeWJhZykgPT5cbiAgYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCwgeWJhZy5wYXlsb2FkKTtcblxuY29uc3QgYmFnaWZ5ID0gYmFnRW50cmllc09wID0+ICh4YmFnLCB5YmFnKSA9PlxuICBtYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQsIHliYWcucGF5bG9hZCkpO1xuXG4gICAgICAgY29uc3QgYmFnSXNTdXBlcmJhZyA9IHJhd0JhZ2lmeShiYWdFbnRyaWVzSXNTdXBlcmJhZyk7JGjNj19vbmNlLmJhZ0lzU3VwZXJiYWcoYmFnSXNTdXBlcmJhZyk7XG4gICAgICAgY29uc3QgYmFnSXNEaXNqb2ludCA9IHJhd0JhZ2lmeShiYWdFbnRyaWVzSXNEaXNqb2ludCk7JGjNj19vbmNlLmJhZ0lzRGlzam9pbnQoYmFnSXNEaXNqb2ludCk7XG4gICAgICAgY29uc3QgYmFnVW5pb24gPSBiYWdpZnkoYmFnRW50cmllc1VuaW9uKTskaM2PX29uY2UuYmFnVW5pb24oYmFnVW5pb24pO1xuICAgICAgIGNvbnN0IGJhZ0ludGVyc2VjdGlvbiA9IGJhZ2lmeShiYWdFbnRyaWVzSW50ZXJzZWN0aW9uKTskaM2PX29uY2UuYmFnSW50ZXJzZWN0aW9uKGJhZ0ludGVyc2VjdGlvbik7XG4gICAgICAgY29uc3QgYmFnRGlzam9pbnRTdWJ0cmFjdCA9IGJhZ2lmeShiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLmJhZ0Rpc2pvaW50U3VidHJhY3QoYmFnRGlzam9pbnRTdWJ0cmFjdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJiYWdJc1N1cGVyYmFnIjpbImJhZ0lzU3VwZXJiYWciXSwiYmFnSXNEaXNqb2ludCI6WyJiYWdJc0Rpc2pvaW50Il0sImJhZ1VuaW9uIjpbImJhZ1VuaW9uIl0sImJhZ0ludGVyc2VjdGlvbiI6WyJiYWdJbnRlcnNlY3Rpb24iXSwiYmFnRGlzam9pbnRTdWJ0cmFjdCI6WyJiYWdEaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHQfjxllLwAAZS8AADUAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIiwiLi9jb3B5U2V0LmpzIl0sImV4cG9ydHMiOlsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c1VuaW9uIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxxLEZhaWwsYXNzZXJ0Tm9EdXBsaWNhdGVzLG1ha2VTZXRPZkVsZW1lbnRzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5U2V0LmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZXNcIixbJGjNj19hID0+IChhc3NlcnROb0R1cGxpY2F0ZXMgPSAkaM2PX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIixbJGjNj19hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtGdWxsQ29tcGFyZSwgUmFua0NvbXBhcmV9IGZyb20gJ0BlbmRvL21hcnNoYWwnXG4gKiBAaW1wb3J0IHtLZXlDb21wYXJpc29ufSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKiBUT0RPIHNoYXJlIG1vcmUgY29kZSB3aXRoIGtleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzLiovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBlbGVtZW50c2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZSB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBlbGVtZW50cyB0aWVkIGZvciB0aGUgc2FtZSByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgZWxlbWVudHMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBlbGVtZW50c2AgYXJyYXkgYWNjb3JkaW5nXG4gKiAgdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3Qgd2luZG93UmVzb3J0ID0gKGVsZW1lbnRzLCByYW5rQ29tcGFyZSwgZnVsbENvbXBhcmUpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChlbGVtZW50cywgcmFua0NvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gZWxlbWVudHM7XG4gIGxldCBpID0gMDtcbiAgbGV0IG9wdElubmVySXRlcmF0b3I7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PlxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChvcHRJbm5lckl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2gqL1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudHNbaV07XG4gICAgICAgICAgICBsZXQgaiA9IGkgKyAxO1xuICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggJiYgcmFua0NvbXBhcmUodmFsdWUsIGVsZW1lbnRzW2pdKSA9PT0gMCkge1xuICAgICAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaW1pbGFyUnVuID0gZWxlbWVudHMuc2xpY2UoaSwgaik7XG4gICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgIGNvbnN0IHJlc29ydGVkID0gc29ydEJ5UmFuayhzaW1pbGFyUnVuLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4gICAgICAgICAgICAvKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4gICAgICAgICAgICAvKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG4gICAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXMocmVzb3J0ZWQsIGZ1bGxDb21wYXJlKTtcbiAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbiAgICAgICAgICAgIC8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuICAgICAgICAgICAgLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuICAgICAgICAgICAgLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4gICAgICAgICAgICAvKiBhcyBpcy4qL1xuICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgICAgICAgIHJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB3aG9zZSBpdGVyYXRpb24gcmVzdWx0cyBhcmUgW2tleSwgeENvdW50LCB5Q291bnRdIHR1cGxlc1xuICogcmVwcmVzZW50aW5nIHRoZSBuZXh0IGtleSBpbiB0aGUgbG9jYWwgZnVsbCBvcmRlciwgYXMgd2VsbCBhcyBob3cgbWFueVxuICogdGltZXMgaXQgb2NjdXJyZWQgaW4gdGhlIHggaW5wdXQgaXRlcmF0b3IgYW5kIHRoZSB5IGlucHV0IGl0ZXJhdG9yLlxuICpcbiAqIEZvciBzZXRzLCB0aGVzZSBjb3VudHMgYXJlIGFsd2F5cyAwIG9yIDEsIGJ1dCB0aGlzIHJlcHJlc2VudGF0aW9uXG4gKiBnZW5lcmFsaXplcyBuaWNlbHkgZm9yIGJhZ3MuXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtUW119IHhlbGVtZW50c1xuICogQHBhcmFtIHtUW119IHllbGVtZW50c1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2UgPSAoeGVsZW1lbnRzLCB5ZWxlbWVudHMpID0+IHtcbiAgLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbiAgLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4gIGNvbnN0IGZ1bGxDb21wYXJlID0gbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuICBjb25zdCB4cyA9IHdpbmRvd1Jlc29ydCh4ZWxlbWVudHMsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB5cyA9IHdpbmRvd1Jlc29ydCh5ZWxlbWVudHMsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgLyogVGhlc2UgZm91ciBgbGV0YCB2YXJpYWJsZXMgYXJlIGJ1ZmZlcmluZyBvbmUgYWhlYWQgZnJvbSB0aGUgdW5kZXJseWluZyovXG4gICAgICAvKiBpdGVyYXRvcnMuIEVhY2ggaXRlcmF0aW9uIHJlcG9ydHMgb25lIG9yIHRoZSBvdGhlciBvciBib3RoLCBhbmQqL1xuICAgICAgLyogdGhlbiByZWZpbGxzIHRoZSBidWZmZXJzIG9mIHRob3NlIGl0IGFkdmFuY2VkLiovXG4gICAgICAvKiogQHR5cGUge1R9ICovXG4gICAgICBsZXQgeDtcbiAgICAgIGxldCB4RG9uZTtcbiAgICAgIC8qKiBAdHlwZSB7VH0gKi9cbiAgICAgIGxldCB5O1xuICAgICAgbGV0IHlEb25lO1xuXG4gICAgICBjb25zdCB4aSA9IHhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IG5leHRYID0gKCkgPT4ge1xuICAgICAgICAheERvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICAgICAgKHsgZG9uZTogeERvbmUsIHZhbHVlOiB4IH0gPSB4aS5uZXh0KCkpO1xuICAgICAgfTtcbiAgICAgIG5leHRYKCk7XG5cbiAgICAgIGNvbnN0IHlpID0geXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFkgPSAoKSA9PiB7XG4gICAgICAgICF5RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoeyBkb25lOiB5RG9uZSwgdmFsdWU6IHkgfSA9IHlpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFkoKTtcblxuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAvKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xuICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICBpZiAoeERvbmUgJiYgeURvbmUpIHtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xuICAgICAgICAgICAgdmFsdWUgPSBbbnVsbCwgMG4sIDBuXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHhEb25lKSB7XG4gICAgICAgICAgICAvKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbiAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCAxbl07XG4gICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeURvbmUpIHtcbiAgICAgICAgICAgIC8qIG9ubHkgeHMgYXJlIGxlZnQqL1xuICAgICAgICAgICAgdmFsdWUgPSBbeCwgMW4sIDBuXTtcbiAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBmdWxsQ29tcGFyZSh4LCB5KTtcbiAgICAgICAgICAgIGlmIChjb21wID09PSAwKSB7XG4gICAgICAgICAgICAgIC8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgMW4sIDFuXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgICAgICAgLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMG5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuICAgICAgICAgICAgICBjb21wID4gMCB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG4gICAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCAxbl07XG4gICAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lLCB2YWx1ZSB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufTtcbmhhcmRlbihtZXJnZSk7XG5cbmNvbnN0IGl0ZXJJc1N1cGVyc2V0ID0geHlpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCBfeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA9PT0gMG4pIHtcbiAgICAgIC8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpdGVySXNEaXNqb2ludCA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA+PSAxbiAmJiB5YyA+PSAxbikge1xuICAgICAgLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge0tleUNvbXBhcmlzb259XG4gKi9cbmNvbnN0IGl0ZXJDb21wYXJlID0geHlpID0+IHtcbiAgbGV0IGxvbmVZID0gZmFsc2U7XG4gIGxldCBsb25lWCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPT09IDBuKSB7XG4gICAgICAvKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcnNldCBvZiB5Ki9cbiAgICAgIGxvbmVZID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHljID09PSAwbikge1xuICAgICAgLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJzZXQgb2YgeCovXG4gICAgICBsb25lWCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChsb25lWCAmJiBsb25lWSkge1xuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG4gIH1cbiAgaWYgKGxvbmVYKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSBpZiAobG9uZVkpIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSB7XG4gICAgKCFsb25lWCAmJiAhbG9uZVkpIHx8XG4gICAgICBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLCBsb25lWV0pfWA7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJVbmlvbiA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA+PSAwbikge1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHljID49IDBuIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xuICAgICAgLyogaWYgeCBhbmQgeSB3ZXJlIGJvdGggcmVhZHksIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQgYW5kKi9cbiAgICAgIC8qIGFib3ZlIGNsYXVzZSBhbHJlYWR5IHRvb2sgY2FyZSBvZiBpdC4gT3RoZXJ3aXNlIHB1c2ggaGVyZS4qL1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyRGlzam9pbnRVbmlvbiA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIHhjID09PSAwbiB8fCB5YyA9PT0gMG4gfHwgRmFpbGBTZXRzIG11c3Qgbm90IGhhdmUgY29tbW9uIGVsZW1lbnRzOiAke219YDtcbiAgICBpZiAoeGMgPj0gMW4pIHtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB5YyA+PSAxbiB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlckludGVyc2VjdGlvbiA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA+PSAxbiAmJiB5YyA+PSAxbikge1xuICAgICAgLyogSWYgdGhleSBhcmUgYm90aCBwcmVzZW50LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50Ki9cbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50U3VidHJhY3QgPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICB4YyA+PSAxbiB8fCBGYWlsYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuICAgIGlmICh5YyA9PT0gMG4pIHtcbiAgICAgIC8qIHRoZSB4IHdhcyBub3QgaW4geSovXG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IG1lcmdlaWZ5ID0gaXRlck9wID0+ICh4ZWxlbWVudHMsIHllbGVtZW50cykgPT5cbiAgaXRlck9wKG1lcmdlKHhlbGVtZW50cywgeWVsZW1lbnRzKSk7XG5cbiAgICAgICBjb25zdCBlbGVtZW50c0lzU3VwZXJzZXQgPSBtZXJnZWlmeShpdGVySXNTdXBlcnNldCk7JGjNj19vbmNlLmVsZW1lbnRzSXNTdXBlcnNldChlbGVtZW50c0lzU3VwZXJzZXQpO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzSXNEaXNqb2ludCA9IG1lcmdlaWZ5KGl0ZXJJc0Rpc2pvaW50KTskaM2PX29uY2UuZWxlbWVudHNJc0Rpc2pvaW50KGVsZW1lbnRzSXNEaXNqb2ludCk7XG4gICAgICAgY29uc3QgZWxlbWVudHNDb21wYXJlID0gbWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRozY9fb25jZS5lbGVtZW50c0NvbXBhcmUoZWxlbWVudHNDb21wYXJlKTtcbiAgICAgICBjb25zdCBlbGVtZW50c1VuaW9uID0gbWVyZ2VpZnkoaXRlclVuaW9uKTskaM2PX29uY2UuZWxlbWVudHNVbmlvbihlbGVtZW50c1VuaW9uKTtcbiAgICAgICBjb25zdCBlbGVtZW50c0Rpc2pvaW50VW5pb24gPSBtZXJnZWlmeShpdGVyRGlzam9pbnRVbmlvbik7JGjNj19vbmNlLmVsZW1lbnRzRGlzam9pbnRVbmlvbihlbGVtZW50c0Rpc2pvaW50VW5pb24pO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzSW50ZXJzZWN0aW9uID0gbWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjNj19vbmNlLmVsZW1lbnRzSW50ZXJzZWN0aW9uKGVsZW1lbnRzSW50ZXJzZWN0aW9uKTtcbiAgICAgICBjb25zdCBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QgPSBtZXJnZWlmeShpdGVyRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdTZXRpZnkgPSBlbGVtZW50c09wID0+ICh4c2V0LCB5c2V0KSA9PlxuICBlbGVtZW50c09wKHhzZXQucGF5bG9hZCwgeXNldC5wYXlsb2FkKTtcblxuY29uc3Qgc2V0aWZ5ID0gZWxlbWVudHNPcCA9PiAoeHNldCwgeXNldCkgPT5cbiAgbWFrZVNldE9mRWxlbWVudHMoZWxlbWVudHNPcCh4c2V0LnBheWxvYWQsIHlzZXQucGF5bG9hZCkpO1xuXG4gICAgICAgY29uc3Qgc2V0SXNTdXBlcnNldCA9IHJhd1NldGlmeShlbGVtZW50c0lzU3VwZXJzZXQpOyRozY9fb25jZS5zZXRJc1N1cGVyc2V0KHNldElzU3VwZXJzZXQpO1xuICAgICAgIGNvbnN0IHNldElzRGlzam9pbnQgPSByYXdTZXRpZnkoZWxlbWVudHNJc0Rpc2pvaW50KTskaM2PX29uY2Uuc2V0SXNEaXNqb2ludChzZXRJc0Rpc2pvaW50KTtcbiAgICAgICBjb25zdCBzZXRVbmlvbiA9IHNldGlmeShlbGVtZW50c1VuaW9uKTskaM2PX29uY2Uuc2V0VW5pb24oc2V0VW5pb24pO1xuICAgICAgIGNvbnN0IHNldERpc2pvaW50VW5pb24gPSBzZXRpZnkoZWxlbWVudHNEaXNqb2ludFVuaW9uKTskaM2PX29uY2Uuc2V0RGlzam9pbnRVbmlvbihzZXREaXNqb2ludFVuaW9uKTtcbiAgICAgICBjb25zdCBzZXRJbnRlcnNlY3Rpb24gPSBzZXRpZnkoZWxlbWVudHNJbnRlcnNlY3Rpb24pOyRozY9fb25jZS5zZXRJbnRlcnNlY3Rpb24oc2V0SW50ZXJzZWN0aW9uKTtcbiAgICAgICBjb25zdCBzZXREaXNqb2ludFN1YnRyYWN0ID0gc2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLnNldERpc2pvaW50U3VidHJhY3Qoc2V0RGlzam9pbnRTdWJ0cmFjdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJlbGVtZW50c0lzU3VwZXJzZXQiOlsiZWxlbWVudHNJc1N1cGVyc2V0Il0sImVsZW1lbnRzSXNEaXNqb2ludCI6WyJlbGVtZW50c0lzRGlzam9pbnQiXSwiZWxlbWVudHNDb21wYXJlIjpbImVsZW1lbnRzQ29tcGFyZSJdLCJlbGVtZW50c1VuaW9uIjpbImVsZW1lbnRzVW5pb24iXSwiZWxlbWVudHNEaXNqb2ludFVuaW9uIjpbImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLCJlbGVtZW50c0ludGVyc2VjdGlvbiI6WyJlbGVtZW50c0ludGVyc2VjdGlvbiJdLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiOlsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sInNldElzU3VwZXJzZXQiOlsic2V0SXNTdXBlcnNldCJdLCJzZXRJc0Rpc2pvaW50IjpbInNldElzRGlzam9pbnQiXSwic2V0VW5pb24iOlsic2V0VW5pb24iXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIl0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF0aWkIrLwAAKy8AADYAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCIuL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4uL2tleXMvY2hlY2tLZXkuanMiXSwiZXhwb3J0cyI6WyJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZU1ldGhvZEtleXMiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsQXJnR3VhcmRMaXN0U2hhcGUsQXdhaXRBcmdHdWFyZFNoYXBlLEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlLEludGVyZmFjZUd1YXJkU2hhcGUsTSxNZXRob2RHdWFyZFBheWxvYWRTaGFwZSxNZXRob2RHdWFyZFNoYXBlLFJhd0d1YXJkU2hhcGUsU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsU3luY1ZhbHVlR3VhcmRTaGFwZSxhc3NlcnRBd2FpdEFyZ0d1YXJkLG1hdGNoZXMsbXVzdE1hdGNoLGdldENvcHlNYXBLZXlzLG1ha2VDb3B5TWFwOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJBcmdHdWFyZExpc3RTaGFwZVwiLFskaM2PX2EgPT4gKEFyZ0d1YXJkTGlzdFNoYXBlID0gJGjNj19hKV1dLFtcIkF3YWl0QXJnR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKEF3YWl0QXJnR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZVwiLFskaM2PX2EgPT4gKEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gJGjNj19hKV1dLFtcIkludGVyZmFjZUd1YXJkU2hhcGVcIixbJGjNj19hID0+IChJbnRlcmZhY2VHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlXCIsWyRozY9fYSA9PiAoTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSAkaM2PX2EpXV0sW1wiTWV0aG9kR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKE1ldGhvZEd1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiUmF3R3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKFJhd0d1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGVcIixbJGjNj19hID0+IChTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSA9ICRozY9fYSldXSxbXCJTeW5jVmFsdWVHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoU3luY1ZhbHVlR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJhc3NlcnRBd2FpdEFyZ0d1YXJkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QXdhaXRBcmdHdWFyZCA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJnZXRDb3B5TWFwS2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBLZXlzID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UmVtb3RhYmxlTWV0aG9kTmFtZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtBd2FpdEFyZ0d1YXJkLCBBd2FpdEFyZ0d1YXJkUGF5bG9hZCwgSW50ZXJmYWNlR3VhcmQsIEludGVyZmFjZUd1YXJkUGF5bG9hZCwgTWV0aG9kR3VhcmQsIE1ldGhvZEd1YXJkUGF5bG9hZH0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKi9cblxuLyogVGhlIGdldCpHdWFyZFBheWxvYWQgZnVuY3Rpb25zIGV4aXN0IHRvIGFkYXB0IHRvIHRoZSB3b3JsZHMgYm90aCovXG4vKiBiZWZvcmUgYW5kIGFmdGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIgLiBXaGVuKi9cbi8qIGdpdmVuIHNvbWV0aGluZyB0aGF0IHdvdWxkIGJlIHRoZSBleHBlY3RlZCBndWFyZCBpbiBlaXRoZXIgd29ybGQsKi9cbi8qIGl0IHJldHVybnMgYSAqR3VhcmRQYXlsb2FkIHRoYXQgaXMgdmFsaWQgaW4gdGhlIGN1cnJlbnQgd29ybGQuIFRodXMqL1xuLyogaXQgaGVscHMgbmV3IGNvbnN1bWVycyBvZiB0aGVzZSBndWFyZHMgY29wZSB3aXRoIG9sZCBjb2RlIHRoYXQqL1xuLyogd291bGQgY29uc3RydWN0IGFuZCBzZW5kIHRoZXNlIGd1YXJkcy4qL1xuXG4vKiBCZWNhdXNlIHRoZSBtYWluIHVzZSBjYXNlIGZvciB0aGlzIGxlZ2FjeSBhZGFwdGF0aW9uIGlzIGluIEBlbmRvL2V4byovXG4vKiBvciBwYWNrYWdlcyB0aGF0IGRlcGVuZCBvbiBpdCwgdGhlIHRlc3RzIGZvciB0aGlzIGxlZ2FjeSBhZGFwdGF0aW9uKi9cbi8qIGFyZSBmb3VuZCBpbiB0aGUgQGVuZG8vZXhvIGB0ZXN0LWxlZ2FjeS1ndWFyZC10b2xlcmFuY2UuanNgLiovXG5cbi8qIFVubGlrZSBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUsKi9cbi8qIGFuZCBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlLCB0aGVyZSBpcyBubyBuZWVkIGZvciBhKi9cbi8qIExlZ2FjeVJhd0d1YXJkU2hhcGUsIGJlY2F1c2UgcmF3IGd1YXJkcyB3ZXJlIGludHJvZHVjZWQgYXQqL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTgzMSAsIHdoaWNoIHdhcyBtZXJnZWQgd2VsbCBhZnRlciovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyIC4gVGh1cywgdGhlcmUgd2FzIG5ldmVyIGEqL1xuLyogYGtsYXNzOmAgZm9ybSBvZiB0aGUgcmF3IGd1YXJkLiovXG5cbi8qIFRPRE8gQXQgc3VjaCBhIHRpbWUgdGhhdCB3ZSBkZWNpZGUgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gc3VwcG9ydCBjb2RlKi9cbi8qIHByZWNlZGluZyBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyIG9yIGd1YXJkIGRhdGEqL1xuLyogZ2VuZXJhdGVkIGJ5IHRoYXQgY29kZSwgYWxsIHRoZSBhZGFwdGF0aW9uIGNvbXBsZXhpdHkgaW4gdGhpcyBmaWxlKi9cbi8qIHNob3VsZCBiZSBkZWxldGVkLiovXG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlID0gaGFyZGVuKHtcbiAga2xhc3M6ICdhd2FpdEFyZycsXG4gIGFyZ0d1YXJkOiBNLnBhdHRlcm4oKSxcbn0pO1xuXG4vKipcbiAqIEJ5IHVzaW5nIHRoaXMgYWJzdHJhY3Rpb24gcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSBwcm9wZXJ0aWVzIGRpcmVjdGx5LFxuICogd2Ugc21vb3RoIHRoZSB0cmFuc2l0aW9uIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIsXG4gKiB0b2xlcmF0aW5nIGJvdGggdGhlIGxlZ2FjeSBhbmQgY3VycmVudCBndWFyZCBzaGFwZXMuXG4gKlxuICogTm90ZSB0aGF0IHRlY2huaWNhbGx5LCB0b2xlcmF0aW5nIHRoZSBvbGQgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlXG4gKiBpcyBhbiBleHBsb2l0YWJsZSBidWcsIGluIHRoYXQgYSByZWNvcmQgdGhhdCBtYXRjaGVzIHRoaXNcbiAqIHNoYXBlIGlzIGFsc28gYSB2YWxpZCBwYXJhbWV0ZXIgcGF0dGVybiB0aGF0IHNob3VsZCBhbGxvd1xuICogYW4gYXJndW1lbnQgdGhhdCBtYXRjaGVzIHRoYXQgcGF0dGVybiwgaS5lLiwgYSBjb3B5UmVjb3JkIGFyZ3VtZW50IHRoYXRcbiAqIGF0IGxlYXN0IGNvbnRhaW5zIGEgYGtsYXNzOiAnYXdhaXRBcmdHdWFyZCdgIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7QXdhaXRBcmdHdWFyZH0gYXdhaXRBcmdHdWFyZFxuICogQHJldHVybnMge0F3YWl0QXJnR3VhcmRQYXlsb2FkfVxuICovXG4gICAgICAgY29uc3QgZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQgPSBhd2FpdEFyZ0d1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMoYXdhaXRBcmdHdWFyZCwgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlKSkge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgY29uc3QgeyBrbGFzczogXywgLi4ucGF5bG9hZCB9ID0gYXdhaXRBcmdHdWFyZDtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG4gIGFzc2VydEF3YWl0QXJnR3VhcmQoYXdhaXRBcmdHdWFyZCk7XG4gIHJldHVybiBhd2FpdEFyZ0d1YXJkLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZChnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCk7XG5oYXJkZW4oZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQpO1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggU3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5U3luY01ldGhvZEd1YXJkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAga2xhc3M6ICdtZXRob2RHdWFyZCcsXG4gICAgY2FsbEtpbmQ6ICdzeW5jJyxcbiAgICBhcmdHdWFyZHM6IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFxuICAgIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuICB7XG4gICAgb3B0aW9uYWxBcmdHdWFyZHM6IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFxuICAgIHJlc3RBcmdHdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbik7XG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBBcmdHdWFyZFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5QXJnR3VhcmRTaGFwZSA9IE0ub3IoXG4gIFJhd0d1YXJkU2hhcGUsXG4gIEF3YWl0QXJnR3VhcmRTaGFwZSxcbiAgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlLFxuICBNLnBhdHRlcm4oKSxcbik7XG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggQXJnR3VhcmRMaXN0U2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lBcmdHdWFyZExpc3RTaGFwZSA9IE0uYXJyYXlPZihMZWdhY3lBcmdHdWFyZFNoYXBlKTtcblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIEFzeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lBc3luY01ldGhvZEd1YXJkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAga2xhc3M6ICdtZXRob2RHdWFyZCcsXG4gICAgY2FsbEtpbmQ6ICdhc3luYycsXG4gICAgYXJnR3VhcmRzOiBMZWdhY3lBcmdHdWFyZExpc3RTaGFwZSxcbiAgICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbiAge1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzOiBBcmdHdWFyZExpc3RTaGFwZSxcbiAgICByZXN0QXJnR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG4gIH0sXG4pO1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lNZXRob2RHdWFyZFNoYXBlID0gTS5vcihcbiAgTGVnYWN5U3luY01ldGhvZEd1YXJkU2hhcGUsXG4gIExlZ2FjeUFzeW5jTWV0aG9kR3VhcmRTaGFwZSxcbik7XG5cbmNvbnN0IGFkYXB0TGVnYWN5QXJnR3VhcmQgPSBhcmdHdWFyZCA9PlxuICBtYXRjaGVzKGFyZ0d1YXJkLCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUpXG4gICAgPyBNLmF3YWl0KGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKGFyZ0d1YXJkKS5hcmdHdWFyZClcbiAgICA6IGFyZ0d1YXJkO1xuXG4vKipcbiAqIEJ5IHVzaW5nIHRoaXMgYWJzdHJhY3Rpb24gcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSBwcm9wZXJ0aWVzIGRpcmVjdGx5LFxuICogd2Ugc21vb3RoIHRoZSB0cmFuc2l0aW9uIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIsXG4gKiB0b2xlcmF0aW5nIGJvdGggdGhlIGxlZ2FjeSBhbmQgY3VycmVudCBndWFyZCBzaGFwZXMuXG4gKlxuICogVW5saWtlIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSwgdG9sZXJhdGluZyBMZWdhY3lNZXRob2RHdWFyZFNoYXBlXG4gKiBkb2VzIG5vdCBzZWVtIGxpa2UgYSBjdXJyZW50bHkgZXhwbG9pdGFibGUgYnVnLCBiZWNhdXNlIHRoZXJlIGlzIG5vdFxuICogY3VycmVudGx5IGFueSBjb250ZXh0IHdoZXJlIGVpdGhlciBhIG1ldGhvZEd1YXJkIG9yIGEgY29weVJlY29yZCB3b3VsZFxuICogYm90aCBiZSBtZWFuaW5nZnVsLlxuICpcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcmV0dXJucyB7TWV0aG9kR3VhcmRQYXlsb2FkfVxuICovXG4gICAgICAgY29uc3QgZ2V0TWV0aG9kR3VhcmRQYXlsb2FkID0gbWV0aG9kR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhtZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRTaGFwZSkpIHtcbiAgICByZXR1cm4gbWV0aG9kR3VhcmQucGF5bG9hZDtcbiAgfVxuICBtdXN0TWF0Y2gobWV0aG9kR3VhcmQsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUsICdsZWdhY3lNZXRob2RHdWFyZCcpO1xuICBjb25zdCB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICBrbGFzczogXyxcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIGNhbGxLaW5kLFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgcmV0dXJuR3VhcmQsXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICByZXN0QXJnR3VhcmQsXG4gIH0gPSBtZXRob2RHdWFyZDtcbiAgbGV0IHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIGFyZ0d1YXJkcyxcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICB9ID0gbWV0aG9kR3VhcmQ7XG4gIGlmIChjYWxsS2luZCA9PT0gJ2FzeW5jJykge1xuICAgIGFyZ0d1YXJkcyA9IGFyZ0d1YXJkcy5tYXAoYWRhcHRMZWdhY3lBcmdHdWFyZCk7XG4gICAgb3B0aW9uYWxBcmdHdWFyZHMgPVxuICAgICAgb3B0aW9uYWxBcmdHdWFyZHMgJiYgb3B0aW9uYWxBcmdHdWFyZHMubWFwKGFkYXB0TGVnYWN5QXJnR3VhcmQpO1xuICB9XG4gIGNvbnN0IHBheWxvYWQgPSBoYXJkZW4oe1xuICAgIGNhbGxLaW5kLFxuICAgIGFyZ0d1YXJkcyxcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyxcbiAgICByZXN0QXJnR3VhcmQsXG4gICAgcmV0dXJuR3VhcmQsXG4gIH0pO1xuICAvKiBlbnN1cmUgdGhlIGFkYXB0YXRpb24gc3VjY2VlZGVkLiovXG4gIG11c3RNYXRjaChwYXlsb2FkLCBNZXRob2RHdWFyZFBheWxvYWRTaGFwZSwgJ2ludGVybmFsTWV0aG9kR3VhcmRBZGFwdG9yJyk7XG4gIHJldHVybiBwYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKGdldE1ldGhvZEd1YXJkUGF5bG9hZCk7XG5oYXJkZW4oZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKTtcblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5SW50ZXJmYWNlR3VhcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBrbGFzczogJ0ludGVyZmFjZScsXG4gICAgaW50ZXJmYWNlTmFtZTogTS5zdHJpbmcoKSxcbiAgICBtZXRob2RHdWFyZHM6IE0ucmVjb3JkT2YoXG4gICAgICBNLnN0cmluZygpLFxuICAgICAgTS5vcihNZXRob2RHdWFyZFNoYXBlLCBMZWdhY3lNZXRob2RHdWFyZFNoYXBlKSxcbiAgICApLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdEd1YXJkczogTS5vcihNLnVuZGVmaW5lZCgpLCAncGFzc2FibGUnLCAncmF3JyksXG4gICAgc2xvcHB5OiBNLmJvb2xlYW4oKSxcbiAgICAvKiBUaGVyZSBpcyBubyBuZWVkIHRvIGFjY29tbW9kYXRlIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUgaW4qL1xuICAgIC8qIHRoaXMgcG9zaXRpb24sIHNpbmNlIGBzeW1ib2xNZXRob2RHdWFyZHMgaGFwcGVuZWQqL1xuICAgIC8qIGFmdGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIqL1xuICAgIHN5bWJvbE1ldGhvZEd1YXJkczogTS5tYXBPZihNLnN5bWJvbCgpLCBNZXRob2RHdWFyZFNoYXBlKSxcbiAgfSxcbik7XG5cbmNvbnN0IGFkYXB0TWV0aG9kR3VhcmQgPSBtZXRob2RHdWFyZCA9PiB7XG4gIGlmIChtYXRjaGVzKG1ldGhvZEd1YXJkLCBMZWdhY3lNZXRob2RHdWFyZFNoYXBlKSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxLaW5kLFxuICAgICAgYXJnR3VhcmRzLFxuICAgICAgb3B0aW9uYWxBcmdHdWFyZHMgPSBbXSxcbiAgICAgIHJlc3RBcmdHdWFyZCA9IE0uYW55KCksXG4gICAgICByZXR1cm5HdWFyZCxcbiAgICB9ID0gZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKG1ldGhvZEd1YXJkKTtcbiAgICBjb25zdCBtQ2FsbCA9IGNhbGxLaW5kID09PSAnc3luYycgPyBNLmNhbGwgOiBNLmNhbGxXaGVuO1xuICAgIHJldHVybiBtQ2FsbCguLi5hcmdHdWFyZHMpXG4gICAgICAub3B0aW9uYWwoLi4ub3B0aW9uYWxBcmdHdWFyZHMpXG4gICAgICAucmVzdChyZXN0QXJnR3VhcmQpXG4gICAgICAucmV0dXJucyhyZXR1cm5HdWFyZCk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZEd1YXJkO1xufTtcblxuLyoqXG4gKiBCeSB1c2luZyB0aGlzIGFic3RyYWN0aW9uIHJhdGhlciB0aGFuIGFjY2Vzc2luZyB0aGUgcHJvcGVydGllcyBkaXJlY3RseSxcbiAqIHdlIHNtb290aCB0aGUgdHJhbnNpdGlvbiB0byBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyLFxuICogdG9sZXJhdGluZyBib3RoIHRoZSBsZWdhY3kgYW5kIGN1cnJlbnQgZ3VhcmQgc2hhcGVzLlxuICpcbiAqIFVubGlrZSBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUsIHRvbGVyYXRpbmcgTGVnYWN5SW50ZXJmYWNlR3VhcmRTaGFwZVxuICogZG9lcyBub3Qgc2VlbSBsaWtlIGEgY3VycmVudGx5IGV4cGxvaXRhYmxlIGJ1ZywgYmVjYXVzZSB0aGVyZSBpcyBub3RcbiAqIGN1cnJlbnRseSBhbnkgY29udGV4dCB3aGVyZSBlaXRoZXIgYW4gaW50ZXJmYWNlR3VhcmQgb3IgYSBjb3B5UmVjb3JkIHdvdWxkXG4gKiBib3RoIGJlIG1lYW5pbmdmdWwuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UmVtb3RhYmxlTWV0aG9kTmFtZSwgTWV0aG9kR3VhcmQ+fSBbVD1SZWNvcmQ8UmVtb3RhYmxlTWV0aG9kTmFtZSwgTWV0aG9kR3VhcmQ+XVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZDxUPn0gaW50ZXJmYWNlR3VhcmRcbiAqIEByZXR1cm5zIHtJbnRlcmZhY2VHdWFyZFBheWxvYWQ8VD59XG4gKi9cbiAgICAgICBjb25zdCBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSBpbnRlcmZhY2VHdWFyZCA9PiB7XG4gIGlmIChtYXRjaGVzKGludGVyZmFjZUd1YXJkLCBJbnRlcmZhY2VHdWFyZFNoYXBlKSkge1xuICAgIHJldHVybiBpbnRlcmZhY2VHdWFyZC5wYXlsb2FkO1xuICB9XG4gIG11c3RNYXRjaChpbnRlcmZhY2VHdWFyZCwgTGVnYWN5SW50ZXJmYWNlR3VhcmRTaGFwZSwgJ2xlZ2FjeUludGVyZmFjZUd1YXJkJyk7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QqL1xuICBsZXQgeyBrbGFzczogXywgaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCAuLi5yZXN0IH0gPSBpbnRlcmZhY2VHdWFyZDtcbiAgbWV0aG9kR3VhcmRzID0gb2JqZWN0TWFwKG1ldGhvZEd1YXJkcywgYWRhcHRNZXRob2RHdWFyZCk7XG4gIGNvbnN0IHBheWxvYWQgPSBoYXJkZW4oe1xuICAgIGludGVyZmFjZU5hbWUsXG4gICAgbWV0aG9kR3VhcmRzLFxuICAgIC4uLnJlc3QsXG4gIH0pO1xuICBtdXN0TWF0Y2goXG4gICAgcGF5bG9hZCxcbiAgICBJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSxcbiAgICAnaW50ZXJuYWxJbnRlcmZhY2VHdWFyZEFkYXB0b3InLFxuICApO1xuICByZXR1cm4gcGF5bG9hZDtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZUd1YXJkUGF5bG9hZChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCk7XG5cbmNvbnN0IGVtcHR5Q29weU1hcCA9IG1ha2VDb3B5TWFwKFtdKTtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBpbnRlcmZhY2VHdWFyZFxuICogQHJldHVybnMgeyhzdHJpbmcgfCBzeW1ib2wpW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRJbnRlcmZhY2VNZXRob2RLZXlzID0gaW50ZXJmYWNlR3VhcmQgPT4ge1xuICBjb25zdCB7IG1ldGhvZEd1YXJkcywgc3ltYm9sTWV0aG9kR3VhcmRzID0gZW1wdHlDb3B5TWFwIH0gPVxuICAgIGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChpbnRlcmZhY2VHdWFyZCk7XG4gIC8qKiBAdHlwZSB7KHN0cmluZyB8IHN5bWJvbClbXX0gKi9cbiAgLyogVE9ETyBhdC10cy1leHBlY3QtZXJyb3Igd29ya3MgbG9jYWxseSBidXQgbm90IGZyb20gQGVuZG8vZXhvKi9cbiAgLyogQHRzLWlnbm9yZSBpbmZlcmVuY2UgaXMgdG9vIHdlYWsgdG8gc2VlIHRoaXMgaXMgb2sqL1xuICByZXR1cm4gaGFyZGVuKFtcbiAgICAuLi5SZWZsZWN0Lm93bktleXMobWV0aG9kR3VhcmRzKSxcbiAgICAuLi5nZXRDb3B5TWFwS2V5cyhzeW1ib2xNZXRob2RHdWFyZHMpLFxuICBdKTtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZU1ldGhvZEtleXMoZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyk7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCI6WyJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCJdLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiOlsiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIl0sImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCI6WyJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiXSwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyI6WyJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGak7nu+MgEAvjIBADUAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyIsIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyIsIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiLi4va2V5cy9jb21wYXJlS2V5cy5qcyIsIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIl0sImV4cG9ydHMiOlsiQXJnR3VhcmRMaXN0U2hhcGUiLCJBd2FpdEFyZ0d1YXJkU2hhcGUiLCJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSIsIkludGVyZmFjZUd1YXJkU2hhcGUiLCJNIiwiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiLCJNZXRob2RHdWFyZFNoYXBlIiwiUmF3R3VhcmRTaGFwZSIsIlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlIiwiU3luY1ZhbHVlR3VhcmRTaGFwZSIsImFzc2VydEF3YWl0QXJnR3VhcmQiLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCIsImFzc2VydE1ldGhvZEd1YXJkIiwiYXNzZXJ0UGF0dGVybiIsImFzc2VydFJhd0d1YXJkIiwiY2hlY2tNYXRjaGVzIiwiY29udGFpbmVySGFzU3BsaXQiLCJkZWZhdWx0TGltaXRzIiwiZ2V0UmFua0NvdmVyIiwiaXNBd2FpdEFyZ0d1YXJkIiwiaXNQYXR0ZXJuIiwiaXNSYXdHdWFyZCIsImtpbmRPZiIsIm1hdGNoZXMiLCJtdXN0TWF0Y2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLGIsWCxGYWlsLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yLGlkZW50Q2hlY2tlcixhcHBseUxhYmVsaW5nRXJyb3IsZnJvbVVuaXF1ZUVudHJpZXMsbGlzdERpZmZlcmVuY2UsYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLGNvbXBhcmVSYW5rLGdldFBhc3NTdHlsZUNvdmVyLGludGVyc2VjdFJhbmtDb3ZlcnMsdW5pb25SYW5rQ292ZXJzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyxxcCxrZXlFUSxrZXlHVCxrZXlHVEUsa2V5TFQsa2V5TFRFLGFzc2VydEtleSxjaGVja0tleSxpc0tleSxjaGVja1NjYWxhcktleSxjaGVja0NvcHlTZXQsY2hlY2tDb3B5TWFwLGNvcHlNYXBLZXlTZXQsY2hlY2tDb3B5QmFnLGdldENvcHlNYXBFbnRyeUFycmF5LG1ha2VDb3B5TWFwLG1ha2VDb3B5U2V0LG1ha2VDb3B5QmFnLGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJiXCIsWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsWyRozY9fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzXCIsIFtbXCJhcHBseUxhYmVsaW5nRXJyb3JcIixbJGjNj19hID0+IChhcHBseUxhYmVsaW5nRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qc1wiLCBbW1wiZnJvbVVuaXF1ZUVudHJpZXNcIixbJGjNj19hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanNcIiwgW1tcImxpc3REaWZmZXJlbmNlXCIsWyRozY9fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiY29tcGFyZVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlUmFuayA9ICRozY9fYSldXSxbXCJnZXRQYXNzU3R5bGVDb3ZlclwiLFskaM2PX2EgPT4gKGdldFBhc3NTdHlsZUNvdmVyID0gJGjNj19hKV1dLFtcImludGVyc2VjdFJhbmtDb3ZlcnNcIixbJGjNj19hID0+IChpbnRlcnNlY3RSYW5rQ292ZXJzID0gJGjNj19hKV1dLFtcInVuaW9uUmFua0NvdmVyc1wiLFskaM2PX2EgPT4gKHVuaW9uUmFua0NvdmVycyA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXSxbXCJxcFwiLFskaM2PX2EgPT4gKHFwID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJrZXlHVFwiLFskaM2PX2EgPT4gKGtleUdUID0gJGjNj19hKV1dLFtcImtleUdURVwiLFskaM2PX2EgPT4gKGtleUdURSA9ICRozY9fYSldXSxbXCJrZXlMVFwiLFskaM2PX2EgPT4gKGtleUxUID0gJGjNj19hKV1dLFtcImtleUxURVwiLFskaM2PX2EgPT4gKGtleUxURSA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLFskaM2PX2EgPT4gKGFzc2VydEtleSA9ICRozY9fYSldXSxbXCJjaGVja0tleVwiLFskaM2PX2EgPT4gKGNoZWNrS2V5ID0gJGjNj19hKV1dLFtcImlzS2V5XCIsWyRozY9fYSA9PiAoaXNLZXkgPSAkaM2PX2EpXV0sW1wiY2hlY2tTY2FsYXJLZXlcIixbJGjNj19hID0+IChjaGVja1NjYWxhcktleSA9ICRozY9fYSldXSxbXCJjaGVja0NvcHlTZXRcIixbJGjNj19hID0+IChjaGVja0NvcHlTZXQgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5TWFwXCIsWyRozY9fYSA9PiAoY2hlY2tDb3B5TWFwID0gJGjNj19hKV1dLFtcImNvcHlNYXBLZXlTZXRcIixbJGjNj19hID0+IChjb3B5TWFwS2V5U2V0ID0gJGjNj19hKV1dLFtcImNoZWNrQ29weUJhZ1wiLFskaM2PX2EgPT4gKGNoZWNrQ29weUJhZyA9ICRozY9fYSldXSxbXCJnZXRDb3B5TWFwRW50cnlBcnJheVwiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyeUFycmF5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlTZXRcIixbJGjNj19hID0+IChtYWtlQ29weVNldCA9ICRozY9fYSldXSxbXCJtYWtlQ29weUJhZ1wiLFskaM2PX2EgPT4gKG1ha2VDb3B5QmFnID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc1wiLCBbW1wiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXNcIixbJGjNj19hID0+IChnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDaGVja2VyLCBDb3B5QXJyYXksIENvcHlSZWNvcmQsIENvcHlUYWdnZWQsIFBhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICogQGltcG9ydCB7Q29weVNldCwgQ29weUJhZywgQXJnR3VhcmQsIEF3YWl0QXJnR3VhcmQsIENoZWNrUGF0dGVybiwgR2V0UmFua0NvdmVyLCBJbnRlcmZhY2VHdWFyZCwgTWF0Y2hlck5hbWVzcGFjZSwgTWV0aG9kR3VhcmQsIE1ldGhvZEd1YXJkTWFrZXIsIFBhdHRlcm4sIFJhd0d1YXJkLCBTeW5jVmFsdWVHdWFyZCwgS2luZCwgTGltaXRzLCBBbGxMaW1pdHMsIEtleSwgRGVmYXVsdEd1YXJkVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtNYXRjaEhlbHBlciwgUGF0dGVybktpdH0gZnJvbSAnLi90eXBlcy5qcydcbiAqL1xuXG5jb25zdCB7IGVudHJpZXMsIHZhbHVlcywgaGFzT3duIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qKiBAdHlwZSB7V2Vha1NldDxQYXR0ZXJuPn0gKi9cbmNvbnN0IHBhdHRlcm5NZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTWF0Y2ggSGVscGVycyBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEZvciBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gYE1gICovXG5sZXQgTU07XG5cbi8qKlxuICogVGhlIGFjdHVhbCBkZWZhdWx0IHZhbHVlcyBoZXJlIGFyZSwgYXQgdGhlIHByZXNlbnQgdGltZSwgZmFpcmx5XG4gKiBhcmJpdHJhcnkgY2hvaWNlcyBhbmQgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBzZXR0bGUgZG93bi4gT2YgY291cnNlXG4gKiBhdCBzb21lIHBvaW50IHdlJ2xsIG5lZWQgdG8gc3RvcCBjaGFuZ2luZyB0aGVtLiBCdXQgd2Ugc2hvdWxkIGZpcnN0XG4gKiBzZWUgaG93IG91ciBzeXN0ZW0gaG9sZHMgdXAgd2l0aCB0aGVzZSBjaG9pY2VzLiBUaGUgbWFpbiBjcml0ZXJpYVxuICogaXMgdGhhdCB0aGV5IGJlIGJpZyBlbm91Z2ggdGhhdCBcIm5vcm1hbFwiIGlubm9jZW50IHByb2dyYW1zIHJhcmVseVxuICogZW5jb3VudGVyIHRoZXNlIGxpbWl0cy5cbiAqXG4gKiBFeHBvcnRlZCBwcmltYXJpbHkgZm9yIHRlc3RpbmcuXG4gKi9cbiAgICAgICBjb25zdCBkZWZhdWx0TGltaXRzID0gaGFyZGVuKHtcbiAgZGVjaW1hbERpZ2l0c0xpbWl0OiAxMDAsXG4gIHN0cmluZ0xlbmd0aExpbWl0OiAxMDBfMDAwLFxuICBzeW1ib2xOYW1lTGVuZ3RoTGltaXQ6IDEwMCxcbiAgbnVtUHJvcGVydGllc0xpbWl0OiA4MCxcbiAgcHJvcGVydHlOYW1lTGVuZ3RoTGltaXQ6IDEwMCxcbiAgYXJyYXlMZW5ndGhMaW1pdDogMTBfMDAwLFxuICBieXRlTGVuZ3RoTGltaXQ6IDEwMF8wMDAsXG4gIG51bVNldEVsZW1lbnRzTGltaXQ6IDEwXzAwMCxcbiAgbnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdDogMTBfMDAwLFxuICBudW1NYXBFbnRyaWVzTGltaXQ6IDUwMDAsXG59KTtcblxuLyoqXG4gKiBVc2UgdGhlIHJlc3VsdCBvbmx5IHRvIGdldCB0aGUgbGltaXRzIHlvdSBuZWVkIGJ5IGRlc3RydWN0dXJpbmcuXG4gKiBUaHVzLCB0aGUgcmVzdWx0IG9ubHkgbmVlZHMgdG8gc3VwcG9ydCBkZXN0cnVjdHVyaW5nLiBUaGUgY3VycmVudFxuICogaW1wbGVtZW50YXRpb24gdXNlcyBpbmhlcml0YW5jZSBhcyBhIGNoZWFwIGhhY2suXG4gKlxuICogQHBhcmFtIHtMaW1pdHN9IFtsaW1pdHNdXG4gKiBAcmV0dXJucyB7QWxsTGltaXRzfVxuICovJGjNj19vbmNlLmRlZmF1bHRMaW1pdHMoZGVmYXVsdExpbWl0cyk7XG5jb25zdCBsaW1pdCA9IChsaW1pdHMgPSB7fSkgPT5cbiAgLyoqIEB0eXBlIHtBbGxMaW1pdHN9ICovIChoYXJkZW4oeyBfX3Byb3RvX186IGRlZmF1bHRMaW1pdHMsIC4uLmxpbWl0cyB9KSk7XG5cbmNvbnN0IGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0ID0gKFxuICBwYXlsb2FkLFxuICBtYWluUGF5bG9hZFNoYXBlLFxuICBjaGVjayxcbiAgbGFiZWwsXG4pID0+IHtcbiAgYXNzZXJ0KEFycmF5LmlzQXJyYXkobWFpblBheWxvYWRTaGFwZSkpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHtcbiAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgJHtxKGxhYmVsKX0gcGF5bG9hZCBtdXN0IGJlIGFuIGFycmF5OiAke3BheWxvYWR9YCk7XG4gIH1cblxuICAvKiBXYXMgdGhlIGZvbGxvd2luZywgYnV0IGl0cyBvdmVydXNlIG9mIHBhdHRlcm5zIGNhdXNlZCBhbiBpbmZpbml0ZSByZWdyZXNzKi9cbiAgLyogY29uc3QgcGF5bG9hZExpbWl0U2hhcGUgPSBoYXJkZW4oKi9cbiAgLyogTS5zcGxpdCgqL1xuICAvKiBtYWluUGF5bG9hZFNoYXBlLCovXG4gIC8qIE0ucGFydGlhbChoYXJkZW4oW00ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5udW1iZXIoKSldKSwgaGFyZGVuKFtdKSksKi9cbiAgLyogKSwqL1xuICAvKiApOyovXG4gIC8qIHJldHVybiBjaGVja01hdGNoZXMocGF5bG9hZCwgcGF5bG9hZExpbWl0U2hhcGUsIGNoZWNrLCBsYWJlbCk7Ki9cblxuICBjb25zdCBtYWluTGVuZ3RoID0gbWFpblBheWxvYWRTaGFwZS5sZW5ndGg7XG4gIGlmICghKHBheWxvYWQubGVuZ3RoID09PSBtYWluTGVuZ3RoIHx8IHBheWxvYWQubGVuZ3RoID09PSBtYWluTGVuZ3RoICsgMSkpIHtcbiAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgJHtxKGxhYmVsKX0gcGF5bG9hZCB1bmV4cGVjdGVkIHNpemU6ICR7cGF5bG9hZH1gKTtcbiAgfVxuICBjb25zdCBsaW1pdHMgPSBwYXlsb2FkW21haW5MZW5ndGhdO1xuICBwYXlsb2FkID0gaGFyZGVuKHBheWxvYWQuc2xpY2UoMCwgbWFpbkxlbmd0aCkpO1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICBpZiAoIWNoZWNrTWF0Y2hlcyhwYXlsb2FkLCBtYWluUGF5bG9hZFNoYXBlLCBjaGVjaywgbGFiZWwpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChsaW1pdHMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiAoXG4gICAgKHBhc3NTdHlsZU9mKGxpbWl0cykgPT09ICdjb3B5UmVjb3JkJyB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgTGltaXRzIG11c3QgYmUgYSByZWNvcmQ6ICR7cShsaW1pdHMpfWApKSAmJlxuICAgIGVudHJpZXMobGltaXRzKS5ldmVyeShcbiAgICAgIChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgIHBhc3NTdHlsZU9mKHZhbHVlKSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgY2hlY2soZmFsc2UsIFhgVmFsdWUgb2YgbGltaXQgJHtxKGtleSl9IGJ1dCBiZSBhIG51bWJlcjogJHtxKHZhbHVlKX1gKSxcbiAgICApXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWNpbWFsRGlnaXRzTGltaXRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY29uc3QgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQgPSAoc3BlY2ltZW4sIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2spID0+IHtcbiAgaWYgKFxuICAgIE1hdGguZmxvb3IoTWF0aC5sb2cxMChNYXRoLmFicyhOdW1iZXIoc3BlY2ltZW4pKSkpICsgMSA8PVxuICAgIGRlY2ltYWxEaWdpdHNMaW1pdFxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gY2hlY2soXG4gICAgZmFsc2UsXG4gICAgWGBiaWdpbnQgJHtzcGVjaW1lbn0gbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtkZWNpbWFsRGlnaXRzTGltaXR9IGRpZ2l0c2AsXG4gICk7XG59O1xuXG4vKipcbiAqIEByZXR1cm5zIHtQYXR0ZXJuS2l0fVxuICovXG5jb25zdCBtYWtlUGF0dGVybktpdCA9ICgpID0+IHtcbiAgLyoqXG4gKiBJZiB0aGlzIGlzIGEgcmVjb2duaXplZCBtYXRjaCB0YWcsIHJldHVybiB0aGUgTWF0Y2hIZWxwZXIuXG4gKiBPdGhlcndpc2UgcmVzdWx0IHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7TWF0Y2hIZWxwZXIgfCB1bmRlZmluZWR9XG4gKi9cbiAgY29uc3QgbWF5YmVNYXRjaEhlbHBlciA9IHRhZyA9PlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgSGVscGVyc0J5TWF0Y2hUYWdbdGFnXTtcblxuICAvKipcbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGluZGljYXRlcyBhYnNlbmNlIGJ5IHJldHVybmluZyBgdW5kZWZpbmVkYCxcbiAqIGV2ZW4gdGhvdWdoIGB1bmRlZmluZWRgIGlzIGEgdmFsaWQgcGF0dGVybi4gVG8gZXZhZGUgdGhpcyBjb25mdXNpb24sXG4gKiB0byByZWdpc3RlciBhIHBheWxvYWQgc2hhcGUgd2l0aCB0aGF0IG1lYW5pbmcsIHVzZSBgTU0udW5kZWZpbmVkKClgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEByZXR1cm5zIHtQYXR0ZXJuIHwgdW5kZWZpbmVkfVxuICovXG4gIGNvbnN0IG1heWJlUGF5bG9hZFNoYXBlID0gdGFnID0+XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICBHdWFyZFBheWxvYWRTaGFwZXNbdGFnXTtcblxuICAvKiogQHR5cGUge01hcDxLaW5kLCB1bmtub3duPn0gKi9cbiAgY29uc3Qgc2luZ2xldG9uS2luZHMgPSBuZXcgTWFwKFtcbiAgICBbJ251bGwnLCBudWxsXSxcbiAgICBbJ3VuZGVmaW5lZCcsIHVuZGVmaW5lZF0sXG4gIF0pO1xuXG4gIC8qKlxuICogQHR5cGUge1dlYWtNYXA8Q29weVRhZ2dlZCwgS2luZD59XG4gKiBPbmx5IGZvciB0YWdnZWQgcmVjb3JkcyBvZiByZWNvZ25pemVkIGtpbmRzIHdob3NlIHN0b3JlLWxldmVsIGludmFyaWFudHNcbiAqIGhhdmUgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gKi9cbiAgY29uc3QgdGFnTWVtbyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIHRhZ3MsIGFuZCBvbmx5IGlmIHRoZSB0YWdnZWRcbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB0YWdnZWRcbiAqIEBwYXJhbSB7S2luZH0gdGFnXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja1RhZ2dlZCA9ICh0YWdnZWQsIHRhZywgY2hlY2spID0+IHtcbiAgICBjb25zdCBtYXRjaEhlbHBlciA9IG1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbiAgICBpZiAobWF0Y2hIZWxwZXIpIHtcbiAgICAgIC8qIEJ1cmllZCBoZXJlIGlzIHRoZSBpbXBvcnRhbnQgY2FzZSwgd2hlcmUgd2UgcHJvY2VzcyovXG4gICAgICAvKiB0aGUgdmFyaW91cyBwYXR0ZXJuTm9kZXMqL1xuICAgICAgcmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkKHRhZ2dlZC5wYXlsb2FkLCBjaGVjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBheWxvYWRTaGFwZSA9IG1heWJlUGF5bG9hZFNoYXBlKHRhZyk7XG4gICAgICBpZiAocGF5bG9hZFNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgICAgcmV0dXJuIGNoZWNrTWF0Y2hlcyh0YWdnZWQucGF5bG9hZCwgcGF5bG9hZFNoYXBlLCBjaGVjaywgdGFnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgIHJldHVybiBjaGVja0NvcHlTZXQodGFnZ2VkLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgICByZXR1cm4gY2hlY2tDb3B5QmFnKHRhZ2dlZCwgY2hlY2spO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29weU1hcCh0YWdnZWQsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9OiAke3RhZ2dlZH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAqIFJldHVybnMgb25seSBhIHJlY29nbml6ZWQga2luZCwgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuIHBhc3NlcyB0aGVcbiAqIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKiBPdGhlcndpc2UsIGBjaGVjayhmYWxzZSwgLi4uKWAgYW5kIHJldHVybnMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtLaW5kIHwgdW5kZWZpbmVkfVxuICovXG4gIGNvbnN0IGtpbmRPZiA9IChzcGVjaW1lbiwgY2hlY2sgPSBpZGVudENoZWNrZXIpID0+IHtcbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihzcGVjaW1lbik7XG4gICAgaWYgKHBhc3NTdHlsZSAhPT0gJ3RhZ2dlZCcpIHtcbiAgICAgIHJldHVybiBwYXNzU3R5bGU7XG4gICAgfVxuICAgIC8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHNwZWNpbWVuIGlzIHdlbGwgZm9ybWVkKi9cbiAgICAvKiBhcyBhIHRhZ2dlZCByZWNvcmQsIHdoaWNoIGlzIGRlZmluZWQgYXQgdGhlIG1hcnNoYWwgbGV2ZWwgb2YgYWJzdHJhY3Rpb24sKi9cbiAgICAvKiBzaW5jZSBgcGFzc1N0eWxlT2ZgIGNoZWNrcyB0aG9zZSBpbnZhcmlhbnRzLiovXG4gICAgaWYgKHRhZ01lbW8uaGFzKHNwZWNpbWVuKSkge1xuICAgICAgcmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiAgICB9XG4gICAgY29uc3QgdGFnID0gZ2V0VGFnKHNwZWNpbWVuKTtcbiAgICBpZiAoY2hlY2tUYWdnZWQoc3BlY2ltZW4sIHRhZywgY2hlY2spKSB7XG4gICAgICB0YWdNZW1vLnNldChzcGVjaW1lbiwgdGFnKTtcbiAgICAgIHJldHVybiB0YWc7XG4gICAgfVxuICAgIGlmIChjaGVjayAhPT0gaWRlbnRDaGVja2VyKSB7XG4gICAgICBjaGVjayhmYWxzZSwgWGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcbiAgaGFyZGVuKGtpbmRPZik7XG5cbiAgLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIGtpbmRzLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW5cbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tLaW5kID0gKHNwZWNpbWVuLCBraW5kLCBjaGVjaykgPT4ge1xuICAgIC8qIGNoZWNrIG51bGwgYW5kIHVuZGVmaW5lZCBhcyBLZXlzKi9cbiAgICBpZiAoc2luZ2xldG9uS2luZHMuaGFzKGtpbmQpKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBzaW5nbGV0b25LaW5kcy5nZXQoa2luZCksIGNoZWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWFsS2luZCA9IGtpbmRPZihzcGVjaW1lbiwgY2hlY2spO1xuICAgIGlmIChraW5kID09PSByZWFsS2luZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjaGVjayAhPT0gaWRlbnRDaGVja2VyKSB7XG4gICAgICAvKiBga2luZGAgYW5kIGByZWFsS2luZGAgY2FuIGJlIGVtYmVkZGVkIHdpdGhvdXQgcXVvdGVzKi9cbiAgICAgIC8qIGJlY2F1c2UgdGhleSBhcmUgZHJhd24gZnJvbSB0aGUgZW51bWVyYXRlZCBjb2xsZWN0aW9uIG9mIGtub3duIEtpbmRzLiovXG4gICAgICBjaGVjayhmYWxzZSwgWGAke2IocmVhbEtpbmQpfSAke3NwZWNpbWVufSAtIE11c3QgYmUgYSAke2Ioa2luZCl9YCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAqIENoZWNrcyBvbmx5IHJlY29nbml6ZWQga2luZHMsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lblxuICogcGFzc2VzIHRoZSBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtLaW5kfSBraW5kXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBpc0tpbmQgPSAoc3BlY2ltZW4sIGtpbmQpID0+IGNoZWNrS2luZChzcGVjaW1lbiwga2luZCwgaWRlbnRDaGVja2VyKTtcblxuICAvKipcbiAqIENoZWNrcyBpZiBhIHBhdHRlcm4gbWF0Y2hlcyBvbmx5IGB1bmRlZmluZWRgLlxuICpcbiAqIEBwYXJhbSB7YW55fSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBpc1VuZGVmaW5lZFBhdHQgPSBwYXR0ID0+XG4gICAgcGF0dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgKGlzS2luZChwYXR0LCAnbWF0Y2g6a2luZCcpICYmIHBhdHQucGF5bG9hZCA9PT0gJ3VuZGVmaW5lZCcpO1xuXG4gIC8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tleX0ga2V5QXNQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja0FzS2V5UGF0dCA9IChzcGVjaW1lbiwga2V5QXNQYXR0ZXJuLCBjaGVjaykgPT4ge1xuICAgIGlmIChpc0tleShzcGVjaW1lbikgJiYga2V5RVEoc3BlY2ltZW4sIGtleUFzUGF0dGVybikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgY2hlY2sgIT09IGlkZW50Q2hlY2tlciAmJlxuICAgICAgLyogV2hlbiB0aGUgbWlzbWF0Y2ggb2NjdXJzIGFnYWluc3QgYSBrZXkgdXNlZCBhcyBhIHBhdHRlcm4sKi9cbiAgICAgIC8qIHRoZSBwYXR0ZXJuIHNob3VsZCBzdGlsbCBiZSByZWRhY3RlZC4qL1xuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlOiAke2tleUFzUGF0dGVybn1gKVxuICAgICk7XG4gIH07XG5cbiAgLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuICAvKiogQHR5cGUge0NoZWNrUGF0dGVybn0gKi9cbiAgY29uc3QgY2hlY2tQYXR0ZXJuID0gKHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAvKiBBbGwga2V5cyBhcmUgcGF0dGVybnMuIEZvciB0aGVzZSwgdGhlIGtleU1lbW8gd2lsbCBkby4qL1xuICAgICAgLyogQWxsIHByaW1pdGl2ZXMgdGhhdCBhcmUgcGF0dGVybnMgYXJlIGFsc28ga2V5cywgd2hpY2ggdGhpcyovXG4gICAgICAvKiBhbHNvIHRha2VzIGNhcmUgb2Ygd2l0aG91dCBtZW1vLiBUaGUgcmVzdCBvZiBvdXIgY2hlY2tpbmcgbG9naWMqL1xuICAgICAgLyogaXMgb25seSBjb25jZXJuZWQgd2l0aCBub24ta2V5IHBhdHRlcm5zLiovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgY29uc3QgcmVzdWx0ID0gY2hlY2tQYXR0ZXJuSW50ZXJuYWwocGF0dCwgY2hlY2spO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHQgLSBrbm93biBub3QgdG8gYmUgYSBrZXksIGFuZCB0aGVyZWZvcmUga25vd25cbiAqIG5vdCB0byBiZSBwcmltaXRpdmUuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbCA9IChwYXR0LCBjaGVjaykgPT4ge1xuICAgIC8qIFB1cnBvc2VseSBwYXJhbGxlbHMgY2hlY2tLZXkuIFRPRE8gcmV1c2UgbW9yZSBsb2dpYyBiZXR3ZWVuIHRoZW0uKi9cbiAgICAvKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4gICAgLyogZXNzZW50aWFsbHkgaWRlbnRpY2FsLiovXG4gICAgY29uc3QgY2hlY2tJdCA9IGNoaWxkID0+IGNoZWNrUGF0dGVybihjaGlsZCwgY2hlY2spO1xuXG4gICAgY29uc3Qga2luZCA9IGtpbmRPZihwYXR0LCBjaGVjayk7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvKiBBIGNvcHlSZWNvcmQgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4gICAgICAgIC8qIHBhdHRlcm5zKi9cbiAgICAgICAgcmV0dXJuIHZhbHVlcyhwYXR0KS5ldmVyeShjaGVja0l0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLyogQSBjb3B5QXJyYXkgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4gICAgICAgIC8qIHBhdHRlcm5zKi9cbiAgICAgICAgcmV0dXJuIHBhdHQuZXZlcnkoY2hlY2tJdCk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAvKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBrZXlzIGFuZCB0aGVyZWZvcmUgYWxyZWFkeSBrbm93biB0byBiZSovXG4gICAgICAgIC8qIHBhdHRlcm5zLiovXG4gICAgICAgIC8qIEEgY29weU1hcCBpcyBhIHBhdHRlcm4gaWYgaXRzIHZhbHVlcyBhcmUgcGF0dGVybnMuKi9cbiAgICAgICAgcmV0dXJuIGNoZWNrUGF0dGVybihwYXR0LnZhbHVlcywgY2hlY2spO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYEEgJHtxKGtpbmQpfSBjYW5ub3QgYmUgYSBwYXR0ZXJuYCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGlmIChtYXliZU1hdGNoSGVscGVyKGtpbmQpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgWGBBIHBhc3NhYmxlIG9mIGtpbmQgJHtxKGtpbmQpfSBpcyBub3QgYSBwYXR0ZXJuOiAke3BhdHR9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBpc1BhdHRlcm4gPSBwYXR0ID0+IGNoZWNrUGF0dGVybihwYXR0LCBpZGVudENoZWNrZXIpO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKi9cbiAgY29uc3QgYXNzZXJ0UGF0dGVybiA9IHBhdHQgPT4ge1xuICAgIGNoZWNrUGF0dGVybihwYXR0LCBhc3NlcnRDaGVja2VyKTtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBtYXRjaGVzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRlcm5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tNYXRjaGVzID0gKHNwZWNpbWVuLCBwYXR0ZXJuLCBjaGVjaywgbGFiZWwgPSB1bmRlZmluZWQpID0+XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICBhcHBseUxhYmVsaW5nRXJyb3IoY2hlY2tNYXRjaGVzSW50ZXJuYWwsIFtzcGVjaW1lbiwgcGF0dGVybiwgY2hlY2tdLCBsYWJlbCk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tNYXRjaGVzSW50ZXJuYWwgPSAoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgLyogV29ydGggYmVpbmcgYSBiaXQgdmVyYm9zZSBhbmQgcmVwZXRpdGl2ZSBpbiBvcmRlciB0byBvcHRpbWl6ZSovXG4gICAgY29uc3QgcGF0dGVybktpbmQgPSBraW5kT2YocGF0dCwgY2hlY2spO1xuICAgIGNvbnN0IHNwZWNpbWVuS2luZCA9IGtpbmRPZihzcGVjaW1lbik7IC8qIG1heSBiZSB1bmRlZmluZWQqL1xuICAgIHN3aXRjaCAocGF0dGVybktpbmQpIHtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOiB7XG4gICAgICAgIHJldHVybiBGYWlsYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgcmV0dXJuIEZhaWxgcHJvbWlzZXMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICByZXR1cm4gRmFpbGBlcnJvcnMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6XG4gICAgICBjYXNlICdjb3B5U2V0JzpcbiAgICAgIGNhc2UgJ2NvcHlCYWcnOlxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICAvKiBUaGVzZSBraW5kcyBhcmUgbmVjZXNzYXJpbHkga2V5cyovXG4gICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgICAgICAvKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbiAgICAgICAgICAvKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG4gICAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWNpbWVuS2luZCAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weUFycmF5IHRvIG1hdGNoIGEgY29weUFycmF5IHBhdHRlcm46ICR7cXAoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcGF0dDtcbiAgICAgICAgaWYgKHNwZWNpbWVuLmxlbmd0aCAhPT0gbGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYEFycmF5ICR7c3BlY2ltZW59IC0gTXVzdCBiZSBhcyBsb25nIGFzIGNvcHlBcnJheSBwYXR0ZXJuOiAke3FwKFxuICAgICAgICAgICAgICBwYXR0LFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdHQuZXZlcnkoKHAsIGkpID0+IGNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSwgcCwgY2hlY2ssIGkpKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgICAgIC8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuICAgICAgICAgIC8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbiAgICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BlY2ltZW5LaW5kICE9PSAnY29weVJlY29yZCcpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weVJlY29yZCB0byBtYXRjaCBhIGNvcHlSZWNvcmQgcGF0dGVybjogJHtxcChcbiAgICAgICAgICAgICAgcGF0dCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8qIFRPRE8gRGV0ZWN0IGFuZCBhY2N1bXVsYXRlIGRpZmZlcmVuY2UgaW4gb25lIHBhc3MuKi9cbiAgICAgICAgLyogUmF0aGVyIHRoYW4gdXNpbmcgdHdvIGNhbGxzIHRvIGBsaXN0RGlmZmVyZW5jZWAgdG8gZGV0ZWN0IGFuZCovXG4gICAgICAgIC8qIHJlcG9ydCBpZiBhbmQgaG93IHRoZXNlIGxpc3RzIGRpZmZlciwgc2luY2UgdGhleSBhcmUgYWxyZWFkeSovXG4gICAgICAgIC8qIGluIHNvcnRlZCBvcmRlciwgd2Ugc2hvdWxkIGluc3RlYWQgdXNlIGFuIGFsZ29yaXRobSBsaWtlKi9cbiAgICAgICAgLyogYGl0ZXJEaXNqb2ludFVuaW9uYCBmcm9tIG1lcmdlLXNvcnQtb3BlcmF0b3JzLmpzKi9cbiAgICAgICAgY29uc3Qgc3BlY2ltZW5OYW1lcyA9IHJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbiAgICAgICAgY29uc3QgcGF0dE5hbWVzID0gcmVjb3JkTmFtZXMocGF0dCk7XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSBsaXN0RGlmZmVyZW5jZShwYXR0TmFtZXMsIHNwZWNpbWVuTmFtZXMpO1xuICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bmV4cGVjdGVkID0gbGlzdERpZmZlcmVuY2Uoc3BlY2ltZW5OYW1lcywgcGF0dE5hbWVzKTtcbiAgICAgICAgaWYgKHVuZXhwZWN0ZWQubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IG5vdCBoYXZlIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKFxuICAgICAgICAgICAgICB1bmV4cGVjdGVkLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BlY2ltZW5WYWx1ZXMgPSByZWNvcmRWYWx1ZXMoc3BlY2ltZW4sIHNwZWNpbWVuTmFtZXMpO1xuICAgICAgICBjb25zdCBwYXR0VmFsdWVzID0gcmVjb3JkVmFsdWVzKHBhdHQsIHBhdHROYW1lcyk7XG4gICAgICAgIHJldHVybiBwYXR0TmFtZXMuZXZlcnkoKGxhYmVsLCBpKSA9PlxuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlc1tpXSwgcGF0dFZhbHVlc1tpXSwgY2hlY2ssIGxhYmVsKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgICAgIC8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuICAgICAgICAgIC8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbiAgICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BlY2ltZW5LaW5kICE9PSAnY29weU1hcCcpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtxcChcbiAgICAgICAgICAgICAgcGF0dCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8qIENvbXBhcmUga2V5cyBhcyBjb3B5U2V0cyovXG4gICAgICAgIGNvbnN0IHBhdHRLZXlTZXQgPSBjb3B5TWFwS2V5U2V0KHBhdHQpO1xuICAgICAgICBjb25zdCBzcGVjaW1lbktleVNldCA9IGNvcHlNYXBLZXlTZXQoc3BlY2ltZW4pO1xuICAgICAgICBpZiAoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCwgcGF0dEtleVNldCwgY2hlY2spKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8qIENvbXBhcmUgdmFsdWVzIGFzIGNvcHlBcnJheXMgYWZ0ZXIgYXBwbHlpbmcgYSBzaGFyZWQgdG90YWwgb3JkZXIuKi9cbiAgICAgICAgLyogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgYW50aVJhbmtPcmRlciBzb3J0aW5nIG9mIGVhY2ggbWFwJ3MqL1xuICAgICAgICAvKiBlbnRyaWVzIGlzIGEgcHJlb3JkZXIgdGhhdCBhZG1pdHMgdGllcy4qL1xuICAgICAgICBjb25zdCBwYXR0VmFsdWVzID0gW107XG4gICAgICAgIGNvbnN0IHNwZWNpbWVuVmFsdWVzID0gW107XG4gICAgICAgIGNvbnN0IGVudHJ5UGFpcnMgPSBnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhcbiAgICAgICAgICBwYXR0LFxuICAgICAgICAgIHNwZWNpbWVuLFxuICAgICAgICAgIGdldENvcHlNYXBFbnRyeUFycmF5LFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBbX2tleSwgcGF0dFZhbHVlLCBzcGVjaW1lblZhbHVlXSBvZiBlbnRyeVBhaXJzKSB7XG4gICAgICAgICAgcGF0dFZhbHVlcy5wdXNoKHBhdHRWYWx1ZSk7XG4gICAgICAgICAgc3BlY2ltZW5WYWx1ZXMucHVzaChzcGVjaW1lblZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hlY2tNYXRjaGVzKGhhcmRlbihzcGVjaW1lblZhbHVlcyksIGhhcmRlbihwYXR0VmFsdWVzKSwgY2hlY2spO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBtYXRjaEhlbHBlciA9IG1heWJlTWF0Y2hIZWxwZXIocGF0dGVybktpbmQpO1xuICAgICAgICBpZiAobWF0Y2hIZWxwZXIpIHtcbiAgICAgICAgICByZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LnBheWxvYWQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBzaG91bGQgaGF2ZSByZWNvZ25pemVkICR7cShwYXR0ZXJuS2luZCl9IGA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IG1hdGNoZXMgPSAoc3BlY2ltZW4sIHBhdHQpID0+XG4gICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBpZGVudENoZWNrZXIpO1xuXG4gIC8qKlxuICogUmV0dXJuaW5nIG5vcm1hbGx5IGluZGljYXRlcyBzdWNjZXNzLiBNYXRjaCBmYWlsdXJlIGlzIGluZGljYXRlZCBieVxuICogdGhyb3dpbmcuXG4gKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICovXG4gIGNvbnN0IG11c3RNYXRjaCA9IChzcGVjaW1lbiwgcGF0dCwgbGFiZWwgPSB1bmRlZmluZWQpID0+IHtcbiAgICBsZXQgaW5uZXJFcnJvcjtcbiAgICB0cnkge1xuICAgICAgaWYgKGNoZWNrTWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCwgaWRlbnRDaGVja2VyLCB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcikge1xuICAgICAgaW5uZXJFcnJvciA9IGVyO1xuICAgIH1cbiAgICAvKiBzaG91bGQgb25seSB0aHJvdyovXG4gICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBhc3NlcnRDaGVja2VyLCBsYWJlbCk7XG4gICAgY29uc3Qgb3V0ZXJFcnJvciA9IG1ha2VFcnJvcihcbiAgICAgIFhgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxcChwYXR0KX1gLFxuICAgICk7XG4gICAgaWYgKGlubmVyRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYW5ub3RhdGVFcnJvcihvdXRlckVycm9yLCBYYGNhdXNlZCBieSAke2lubmVyRXJyb3J9YCk7XG4gICAgfVxuICAgIHRocm93IG91dGVyRXJyb3I7XG4gIH07XG5cbiAgLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZ2V0UmFua0NvdmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuICAvKiogQHR5cGUge0dldFJhbmtDb3Zlcn0gKi9cbiAgY29uc3QgZ2V0UmFua0NvdmVyID0gKHBhdHQsIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlUGFzc2FibGUocGF0dCk7XG4gICAgICBpZiAoZW5jb2RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhdHQpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIC8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbiAgICAgICAgLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuICAgICAgICAvKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlBcnJheXMuKi9cbiAgICAgICAgLyoqL1xuICAgICAgICAvKiBjb25zdCByYW5rQ292ZXJzID0gcGF0dC5tYXAocCA9PiBnZXRSYW5rQ292ZXIocCwgZW5jb2RlUGFzc2FibGUpKTsqL1xuICAgICAgICAvKiByZXR1cm4gaGFyZGVuKFsqL1xuICAgICAgICAvKiByYW5rQ292ZXJzLm1hcCgoW2xlZnQsIF9yaWdodF0pID0+IGxlZnQpLCovXG4gICAgICAgIC8qIHJhbmtDb3ZlcnMubWFwKChbX2xlZnQsIHJpZ2h0XSkgPT4gcmlnaHQpLCovXG4gICAgICAgIC8qIF0pOyovXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuICAgICAgICAvKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4gICAgICAgIC8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weVJlY29yZHMuKi9cbiAgICAgICAgLyoqL1xuICAgICAgICAvKiBjb25zdCBwYXR0S2V5cyA9IG93bktleXMocGF0dCk7Ki9cbiAgICAgICAgLyogY29uc3QgcGF0dEVudHJpZXMgPSBoYXJkZW4ocGF0dEtleXMubWFwKGtleSA9PiBba2V5LCBwYXR0W2tleV1dKSk7Ki9cbiAgICAgICAgLyogY29uc3QgW2xlZnRFbnRyaWVzTGltaXQsIHJpZ2h0RW50cmllc0xpbWl0XSA9Ki9cbiAgICAgICAgLyogZ2V0UmFua0NvdmVyKHBhdHRFbnRyaWVzKTsqL1xuICAgICAgICAvKiByZXR1cm4gaGFyZGVuKFsqL1xuICAgICAgICAvKiBmcm9tVW5pcXVlRW50cmllcyhsZWZ0RW50cmllc0xpbWl0KSwqL1xuICAgICAgICAvKiBmcm9tVW5pcXVlRW50cmllcyhyaWdodEVudHJpZXNMaW1pdCksKi9cbiAgICAgICAgLyogXSk7Ki9cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIGNvbnN0IHRhZyA9IGdldFRhZyhwYXR0KTtcbiAgICAgICAgY29uc3QgbWF0Y2hIZWxwZXIgPSBtYXliZU1hdGNoSGVscGVyKHRhZyk7XG4gICAgICAgIGlmIChtYXRjaEhlbHBlcikge1xuICAgICAgICAgIC8qIEJ1cmllZCBoZXJlIGlzIHRoZSBpbXBvcnRhbnQgY2FzZSwgd2hlcmUgd2UgcHJvY2VzcyovXG4gICAgICAgICAgLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbiAgICAgICAgICByZXR1cm4gbWF0Y2hIZWxwZXIuZ2V0UmFua0NvdmVyKHBhdHQucGF5bG9hZCwgZW5jb2RlUGFzc2FibGUpO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgICAgICAgIC8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbiAgICAgICAgICAgIC8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbiAgICAgICAgICAgIC8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weVNldHMuKi9cbiAgICAgICAgICAgIC8qKi9cbiAgICAgICAgICAgIC8qIC8vIFNob3VsZCBhbHJlYWR5IGJlIHZhbGlkYXRlZCBieSBjaGVja1BhdHRlcm4uIEJ1dCBiZWNhdXNlIHRoaXMqL1xuICAgICAgICAgICAgLyogLy8gaXMgYSBjaGVjayB0aGF0IG1heSBsb29zZW4gb3ZlciB0aW1lLCB3ZSBhbHNvIGFzc2VydCovXG4gICAgICAgICAgICAvKiAvLyBldmVyeXdoZXJlIHdlIHN0aWxsIHJlbHkgb24gdGhlIHJlc3RyaWN0aW9uLiovXG4gICAgICAgICAgICAvKiBgYGBqcyovXG4gICAgICAgICAgICAvKiBwYXR0LnBheWxvYWQubGVuZ3RoID09PSAxIHx8Ki9cbiAgICAgICAgICAgIC8qIEZhaWxgTm9uLXNpbmdsZXRvbiBjb3B5U2V0cyB3aXRoIG1hdGNoZXIgbm90IHlldCBpbXBsZW1lbnRlZDogJHtwYXR0fWA7Ki9cbiAgICAgICAgICAgIC8qIGBgYCovXG4gICAgICAgICAgICAvKiovXG4gICAgICAgICAgICAvKiBjb25zdCBbbGVmdEVsZW1lbnRMaW1pdCwgcmlnaHRFbGVtZW50TGltaXRdID0gZ2V0UmFua0NvdmVyKCovXG4gICAgICAgICAgICAvKiBwYXR0LnBheWxvYWRbMF0sKi9cbiAgICAgICAgICAgIC8qICk7Ki9cbiAgICAgICAgICAgIC8qIHJldHVybiBoYXJkZW4oWyovXG4gICAgICAgICAgICAvKiBtYWtlQ29weVNldChbbGVmdEVsZW1lbnRMaW1pdF0pLCovXG4gICAgICAgICAgICAvKiBtYWtlQ29weVNldChbcmlnaHRFbGVtZW50TGltaXRdKSwqL1xuICAgICAgICAgICAgLyogXSk7Ki9cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAgICAgLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuICAgICAgICAgICAgLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuICAgICAgICAgICAgLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5TWFwcy4qL1xuICAgICAgICAgICAgLyoqL1xuICAgICAgICAgICAgLyogLy8gQSBtYXRjaGluZyBjb3B5TWFwIG11c3QgaGF2ZSB0aGUgc2FtZSBrZXlzLCBvciBhdCBtb3N0IG9uZSovXG4gICAgICAgICAgICAvKiAvLyBub24ta2V5IGtleSBwYXR0ZXJuLiBUaHVzIHdlIGNhbiBhc3N1bWUgdGhhdCB2YWx1ZSBwb3NpdGlvbnMqL1xuICAgICAgICAgICAgLyogLy8gbWF0Y2ggMS10by0xLiovXG4gICAgICAgICAgICAvKiAvLyovXG4gICAgICAgICAgICAvKiAvLyBUT0RPIEkgbWF5IGJlIG92ZXJsb29raW5nIHRoYXQgdGhlIGxlc3MgcHJlY2lzZSByYW5rT3JkZXIqL1xuICAgICAgICAgICAgLyogLy8gZXF1aXZhbGVuY2UgY2xhc3MgbWF5IGNhdXNlIHZhbHVlcyB0byBiZSBvdXQgb2Ygb3JkZXIsKi9cbiAgICAgICAgICAgIC8qIC8vIG1ha2luZyB0aGlzIHJhbmtDb3ZlciBub3QgYWN0dWFsbHkgY292ZXIuIEluIHRoYXQgY2FzZSwgZm9yKi9cbiAgICAgICAgICAgIC8qIC8vIGFsbCB0aGUgdmFsdWVzIGZvciBrZXlzIGF0IHRoZSBzYW1lIHJhbmssIHdlIHNob3VsZCB1bmlvbiB0aGVpciovXG4gICAgICAgICAgICAvKiAvLyByYW5rIGNvdmVycy4gVE9ETyBQT1NTSUJMRSBTSUxFTlQgQ09SUkVDVE5FU1MgQlVHKi9cbiAgICAgICAgICAgIC8qIC8vKi9cbiAgICAgICAgICAgIC8qIC8vIElmIHRoaXMgaXMgYSBidWcsIGl0IHByb2JhYmx5IGFmZmVjdHMgdGhlIGdldFJhbmtDb3ZlciovXG4gICAgICAgICAgICAvKiAvLyBjYXNlcyBvZiBtYXRjaExURUhlbHBlciBhbmQgbWF0Y2hHVEVIZWxwZXIgb24gY29weU1hcCBhcyovXG4gICAgICAgICAgICAvKiAvLyB3ZWxsLiBTZWUgbWFrZUNvcHlNYXAgZm9yIGFuIGlkZWEgb24gZml4aW5nKi9cbiAgICAgICAgICAgIC8qIC8vIHRoaXMgYnVnLiovXG4gICAgICAgICAgICAvKiBjb25zdCBbbGVmdFBheWxvYWRMaW1pdCwgcmlnaHRQYXlsb2FkTGltaXRdID0gZ2V0UmFua0NvdmVyKCovXG4gICAgICAgICAgICAvKiBwYXR0LnBheWxvYWQsKi9cbiAgICAgICAgICAgIC8qIGVuY29kZVBhc3NhYmxlLCovXG4gICAgICAgICAgICAvKiApOyovXG4gICAgICAgICAgICAvKiByZXR1cm4gaGFyZGVuKFsqL1xuICAgICAgICAgICAgLyogbWFrZVRhZ2dlZCgnY29weU1hcCcsIGxlZnRQYXlsb2FkTGltaXQpLCovXG4gICAgICAgICAgICAvKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgcmlnaHRQYXlsb2FkTGltaXQpLCovXG4gICAgICAgICAgICAvKiBdKTsqL1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJyZWFrOyAvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGJyZWFrOyAvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBhcnJheVxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcGFyYW0ge3N0cmluZ30gW2xhYmVsUHJlZml4XVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgYXJyYXlFdmVyeU1hdGNoUGF0dGVybiA9IChhcnJheSwgcGF0dCwgY2hlY2ssIGxhYmVsUHJlZml4ID0gJycpID0+IHtcbiAgICBpZiAoaXNLaW5kKHBhdHQsICdtYXRjaDphbnknKSkge1xuICAgICAgLyogaWYgdGhlIHBhdHRlcm4gaXMgTS5hbnkoKSwgd2Uga25vdyBpdHMgdHJ1ZSovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5LmV2ZXJ5KChlbCwgaSkgPT5cbiAgICAgIGNoZWNrTWF0Y2hlcyhlbCwgcGF0dCwgY2hlY2ssIGAke2xhYmVsUHJlZml4fVske2l9XWApLFxuICAgICk7XG4gIH07XG5cbiAgLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTWF0Y2ggSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEFueUhlbHBlciA9IEZhcignbWF0Y2g6YW55IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChfc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgX2NoZWNrKSA9PiB0cnVlLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChtYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBtYXRjaGVyUGF5bG9hZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBtYXRjaDphbnkgcGF5bG9hZDogJHttYXRjaGVyUGF5bG9hZH0gLSBNdXN0IGJlIHVuZGVmaW5lZGApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJycsICd7J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQW5kSGVscGVyID0gRmFyKCdtYXRjaDphbmQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBwYXR0cywgY2hlY2spID0+IHtcbiAgICAgIHJldHVybiBwYXR0cy5ldmVyeShwYXR0ID0+IGNoZWNrTWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCwgY2hlY2spKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChhbGxlZ2VkUGF0dHMsIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCBjaGVja0l0ID0gcGF0dCA9PiBjaGVja1BhdHRlcm4ocGF0dCwgY2hlY2spO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHBhc3NTdHlsZU9mKGFsbGVnZWRQYXR0cykgPT09ICdjb3B5QXJyYXknIHx8XG4gICAgICAgICAgY2hlY2soZmFsc2UsIFhgTmVlZHMgYXJyYXkgb2Ygc3ViLXBhdHRlcm5zOiAke3FwKGFsbGVnZWRQYXR0cyl9YCkpICYmXG4gICAgICAgIGFsbGVnZWRQYXR0cy5ldmVyeShjaGVja0l0KVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocGF0dHMsIGVuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgaW50ZXJzZWN0UmFua0NvdmVycyhcbiAgICAgICAgY29tcGFyZVJhbmssXG4gICAgICAgIHBhdHRzLm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpLFxuICAgICAgKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hPckhlbHBlciA9IEZhcignbWF0Y2g6b3IgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBwYXR0cywgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBwYXR0cztcbiAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBubyBwYXR0ZXJuIGRpc2p1bmN0cyB0byBtYXRjaDogJHtxcChwYXR0cyl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8qIFNwZWNpYWwgY2FzZSBkaXNqdW5jdGlvbnMgcmVwcmVzZW50aW5nIGEgc2luZ2xlIG9wdGlvbmFsIHBhdHRlcm4gZm9yKi9cbiAgICAgIC8qIGJldHRlciBlcnJvciBtZXNzYWdlcy4qL1xuICAgICAgY29uc3QgYmluYXJ5VW5kZWZQYXR0SWR4ID1cbiAgICAgICAgcGF0dHMubGVuZ3RoID09PSAyXG4gICAgICAgICAgPyBwYXR0cy5maW5kSW5kZXgocGF0dCA9PiBpc1VuZGVmaW5lZFBhdHQocGF0dCkpXG4gICAgICAgICAgOiAtMTtcbiAgICAgIGlmIChiaW5hcnlVbmRlZlBhdHRJZHggIT09IC0xKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgc3BlY2ltZW4gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lbiwgcGF0dHNbMSAtIGJpbmFyeVVuZGVmUGF0dElkeF0sIGNoZWNrKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBhdHRzLnNvbWUocGF0dCA9PiBtYXRjaGVzKHNwZWNpbWVuLCBwYXR0KSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3FwKHBhdHRzKX1gKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocGF0dHMsIGVuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgdW5pb25SYW5rQ292ZXJzKFxuICAgICAgICBjb21wYXJlUmFuayxcbiAgICAgICAgcGF0dHMubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSksXG4gICAgICApLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaE5vdEhlbHBlciA9IEZhcignbWF0Y2g6bm90IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcGF0dCwgY2hlY2spID0+IHtcbiAgICAgIGlmIChtYXRjaGVzKHNwZWNpbWVuLCBwYXR0KSkge1xuICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgZmFpbCBuZWdhdGVkIHBhdHRlcm46ICR7cXAocGF0dCl9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tQYXR0ZXJuLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX3BhdHQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWycnLCAneyddLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFNjYWxhckhlbHBlciA9IEZhcignbWF0Y2g6c2NhbGFyIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgX21hdGNoZXJQYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrU2NhbGFyS2V5KHNwZWNpbWVuLCBjaGVjayksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogbWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+IFsnYScsICd6fiddLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEtleUhlbHBlciA9IEZhcignbWF0Y2g6a2V5IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgX21hdGNoZXJQYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrS2V5KHNwZWNpbWVuLCBjaGVjayksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogbWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+IFsnYScsICd6fiddLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFBhdHRlcm5IZWxwZXIgPSBGYXIoJ21hdGNoOnBhdHRlcm4gaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tQYXR0ZXJuKHNwZWNpbWVuLCBjaGVjayksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogbWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+IFsnYScsICd6fiddLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEtpbmRIZWxwZXIgPSBGYXIoJ21hdGNoOmtpbmQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogY2hlY2tLaW5kLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChhbGxlZ2VkS2V5S2luZCwgY2hlY2spID0+XG4gICAgICB0eXBlb2YgYWxsZWdlZEtleUtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgICBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgbWF0Y2g6a2luZDogcGF5bG9hZDogJHthbGxlZ2VkS2V5S2luZH0gLSBBIGtpbmQgbmFtZSBtdXN0IGJlIGEgc3RyaW5nYCxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChraW5kLCBfZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICAgIGxldCBzdHlsZTtcbiAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICBjYXNlICdjb3B5U2V0JzpcbiAgICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgICBzdHlsZSA9ICd0YWdnZWQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBzdHlsZSA9IGtpbmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihzdHlsZSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hUYWdnZWRIZWxwZXIgPSBGYXIoJ21hdGNoOnRhZ2dlZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFt0YWdQYXR0LCBwYXlsb2FkUGF0dF0sIGNoZWNrKSA9PiB7XG4gICAgICBpZiAocGFzc1N0eWxlT2Yoc3BlY2ltZW4pICE9PSAndGFnZ2VkJykge1xuICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgWGBFeHBlY3RlZCB0YWdnZWQgb2JqZWN0LCBub3QgJHtxKFxuICAgICAgICAgICAgcGFzc1N0eWxlT2Yoc3BlY2ltZW4pLFxuICAgICAgICAgICl9OiAke3NwZWNpbWVufWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja01hdGNoZXMoZ2V0VGFnKHNwZWNpbWVuKSwgdGFnUGF0dCwgY2hlY2ssICd0YWcnKSAmJlxuICAgICAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4ucGF5bG9hZCwgcGF5bG9hZFBhdHQsIGNoZWNrLCAncGF5bG9hZCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6dGFnZ2VkIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9raW5kLCBfZW5jb2RlUGFzc2FibGUpID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hCaWdpbnRIZWxwZXIgPSBGYXIoJ21hdGNoOmJpZ2ludCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBkZWNpbWFsRGlnaXRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdiaWdpbnQnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2spXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6YmlnaW50IHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hOYXRIZWxwZXIgPSBGYXIoJ21hdGNoOm5hdCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBkZWNpbWFsRGlnaXRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdiaWdpbnQnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgLyoqIEB0eXBlIHtiaWdpbnR9ICovIChzcGVjaW1lbikgPj0gMG4sXG4gICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgbm9uLW5lZ2F0aXZlYCxcbiAgICAgICAgKSAmJlxuICAgICAgICBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbiwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVjaylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtdKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpuYXQgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgLyogVE9ETyBDb3VsZCBiZSBtb3JlIHByZWNpc2UqL1xuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ2JpZ2ludCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFN0cmluZ0hlbHBlciA9IEZhcignbWF0Y2g6c3RyaW5nIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IHN0cmluZ0xlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgLyogcHJldHRpZXItaWdub3JlKi9cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ3N0cmluZycsIGNoZWNrKSAmJlxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbiAgICAgICAgICAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzcGVjaW1lbikubGVuZ3RoIDw9IHN0cmluZ0xlbmd0aExpbWl0IHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgc3RyaW5nICR7c3BlY2ltZW59IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3RyaW5nTGVuZ3RoTGltaXR9YCxcbiAgICAgICAgICApKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnN0cmluZyBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3Zlcignc3RyaW5nJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU3ltYm9sSGVscGVyID0gRmFyKCdtYXRjaDpzeW1ib2wgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgc3ltYm9sTmFtZUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgaWYgKCFjaGVja0tpbmQoc3BlY2ltZW4sICdzeW1ib2wnLCBjaGVjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3ltYm9sTmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChzcGVjaW1lbik7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3ltYm9sTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUGFzc2FibGUgc3ltYm9sICR7c3BlY2ltZW59IG11c3QgaGF2ZSBhIHBhc3NhYmxlIG5hbWVgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBzeW1ib2xOYW1lLmxlbmd0aCA8PSBzeW1ib2xOYW1lTGVuZ3RoTGltaXQsXG4gICAgICAgIFhgU3ltYm9sIG5hbWUgJHtxKFxuICAgICAgICAgIHN5bWJvbE5hbWUsXG4gICAgICAgICl9IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3ltYm9sTmFtZUxlbmd0aExpbWl0fWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6c3ltYm9sIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdzeW1ib2wnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hSZW1vdGFibGVIZWxwZXIgPSBGYXIoJ21hdGNoOnJlbW90YWJsZSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJlbW90YWJsZURlc2MsIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoaXNLaW5kKHNwZWNpbWVuLCAncmVtb3RhYmxlJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2sgPT09IGlkZW50Q2hlY2tlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGxhYmVsIH0gPSByZW1vdGFibGVEZXNjO1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuICAgICAgY29uc3Qga2luZERldGFpbHMgPVxuICAgICAgICBwYXNzU3R5bGUgIT09ICd0YWdnZWQnXG4gICAgICAgICAgPyAvKiBQYXNzIHN0eWxlIGNhbiBiZSBlbWJlZGRlZCBpbiBkZXRhaWxzIHdpdGhvdXQgcXVvdGVzLiovXG4gICAgICAgICAgICBiKHBhc3NTdHlsZSlcbiAgICAgICAgICA6IC8qIFRhZyBtdXN0IGJlIHF1b3RlZCBiZWNhdXNlIGl0IGlzIHBvdGVudGlhbGx5IGF0dGFja2VyLWNvbnRyb2xsZWQqL1xuICAgICAgICAgICAgLyogKHVubGlrZSBga2luZE9mYCwgdGhpcyBkb2VzIG5vdCByZWplY3QgdW5yZWNvZ25pemVkIHRhZ3MpLiovXG4gICAgICAgICAgICBxKGdldFRhZyhzcGVjaW1lbikpO1xuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgLyogYGxhYmVsYCBjYW4gYmUgZW1iZWRkZWQgd2l0aG91dCBxdW90ZXMgYmVjYXVzZSBpdCBpcyBwcm92aWRlZCBieSovXG4gICAgICAgIC8qIGxvY2FsIGNvZGUgbGlrZSBgTS5yZW1vdGFibGUoXCIuLi5cIilgLiovXG4gICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgcmVtb3RhYmxlICR7YihsYWJlbCl9LCBub3QgJHtraW5kRGV0YWlsc31gLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChhbGxlZ2VkUmVtb3RhYmxlRGVzYywgY2hlY2spID0+XG4gICAgICBjaGVja01hdGNoZXMoXG4gICAgICAgIGFsbGVnZWRSZW1vdGFibGVEZXNjLFxuICAgICAgICBoYXJkZW4oeyBsYWJlbDogTU0uc3RyaW5nKCkgfSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6cmVtb3RhYmxlIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9yZW1vdGFibGVEZXNjLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcigncmVtb3RhYmxlJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoTFRFSGVscGVyID0gRmFyKCdtYXRjaDpsdGUgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5TFRFKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPD0gJHtyaWdodE9wZXJhbmR9YCksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tLZXksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChyaWdodE9wZXJhbmQsIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuICAgICAgLyogVGhlIHByZWZlci1jb25zdCBtYWtlcyBubyBzZW5zZSB3aGVuIHNvbWUgb2YgdGhlIHZhcmlhYmxlcyBuZWVkKi9cbiAgICAgIC8qIHRvIGJlIGBsZXRgKi9cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QqL1xuICAgICAgbGV0IFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdID0gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbiAgICAgIGNvbnN0IG5ld1JpZ2h0Qm91bmQgPSBgJHtlbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpfX5gO1xuICAgICAgaWYgKG5ld1JpZ2h0Qm91bmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByaWdodEJvdW5kID0gbmV3UmlnaHRCb3VuZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbbGVmdEJvdW5kLCByaWdodEJvdW5kXTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaExUSGVscGVyID0gRmFyKCdtYXRjaDpsdCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCwgY2hlY2spID0+XG4gICAgICBrZXlMVChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDwgJHtyaWdodE9wZXJhbmR9YCksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tLZXksXG5cbiAgICBnZXRSYW5rQ292ZXI6IG1hdGNoTFRFSGVscGVyLmdldFJhbmtDb3ZlcixcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hHVEVIZWxwZXIgPSBGYXIoJ21hdGNoOmd0ZSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCwgY2hlY2spID0+XG4gICAgICBrZXlHVEUoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogKHJpZ2h0T3BlcmFuZCwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4gICAgICAvKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuICAgICAgLyogdG8gYmUgYGxldGAqL1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG4gICAgICBsZXQgW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF0gPSBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuICAgICAgY29uc3QgbmV3TGVmdEJvdW5kID0gZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKTtcbiAgICAgIGlmIChuZXdMZWZ0Qm91bmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZWZ0Qm91bmQgPSBuZXdMZWZ0Qm91bmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF07XG4gICAgfSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hHVEhlbHBlciA9IEZhcignbWF0Y2g6Z3QgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5R1Qoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiBtYXRjaEdURUhlbHBlci5nZXRSYW5rQ292ZXIsXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoUmVjb3JkT2ZIZWxwZXIgPSBGYXIoJ21hdGNoOnJlY29yZE9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW2tleVBhdHQsIHZhbHVlUGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBudW1Qcm9wZXJ0aWVzTGltaXQsIHByb3BlcnR5TmFtZUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weVJlY29yZCcsIGNoZWNrKSAmJlxuICAgICAgICBjaGVjayhcbiAgICAgICAgICBvd25LZXlzKHNwZWNpbWVuKS5sZW5ndGggPD0gbnVtUHJvcGVydGllc0xpbWl0LFxuICAgICAgICAgIFhgTXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxuICAgICAgICAgICAgbnVtUHJvcGVydGllc0xpbWl0LFxuICAgICAgICAgICl9IHByb3BlcnRpZXM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKSAmJlxuICAgICAgICBlbnRyaWVzKHNwZWNpbWVuKS5ldmVyeShcbiAgICAgICAgICAoW2tleSwgdmFsdWVdKSA9PlxuICAgICAgICAgICAgYXBwbHlMYWJlbGluZ0Vycm9yKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIGtleS5sZW5ndGggPD0gcHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG4gICAgICAgICAgICAgICAgWGBQcm9wZXJ0eSBuYW1lIG11c3Qgbm90IGJlIGxvbmdlciB0aGFuICR7cShcbiAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuICAgICAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICAgICAgICBoYXJkZW4oW2tleSwgdmFsdWVdKSxcbiAgICAgICAgICAgICAgaGFyZGVuKFtrZXlQYXR0LCB2YWx1ZVBhdHRdKSxcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnJlY29yZE9mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogX2VudHJ5UGF0dCA9PiBnZXRQYXNzU3R5bGVDb3ZlcignY29weVJlY29yZCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEFycmF5T2ZIZWxwZXIgPSBGYXIoJ21hdGNoOmFycmF5T2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbc3ViUGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgYXJyYXlMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIC8qIHByZXR0aWVyLWlnbm9yZSovXG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5QXJyYXknLCBjaGVjaykgJiZcbiAgICAgICAgKC8qKiBAdHlwZSB7QXJyYXl9ICovIChzcGVjaW1lbikubGVuZ3RoIDw9IGFycmF5TGVuZ3RoTGltaXQgfHxcbiAgICAgICAgICBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGBBcnJheSBsZW5ndGggJHtzcGVjaW1lbi5sZW5ndGh9IG11c3QgYmUgPD0gbGltaXQgJHthcnJheUxlbmd0aExpbWl0fWAsXG4gICAgICAgICAgKSkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbiwgc3ViUGF0dCwgY2hlY2spXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6YXJyYXlPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6ICgpID0+IGdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hCeXRlQXJyYXlIZWxwZXIgPSBGYXIoJ21hdGNoOmJ5dGVBcnJheSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBieXRlTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICAvKiBwcmV0dGllci1pZ25vcmUqL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnYnl0ZUFycmF5JywgY2hlY2spICYmXG4gICAgICAgICgvKiogQHR5cGUge0FycmF5QnVmZmVyfSAqLyAoc3BlY2ltZW4pLmJ5dGVMZW5ndGggPD0gYnl0ZUxlbmd0aExpbWl0IHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgYnl0ZUFycmF5ICR7c3BlY2ltZW59IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7Ynl0ZUxlbmd0aExpbWl0fWAsXG4gICAgICAgICAgKSlcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtdKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpieXRlQXJyYXkgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ2J5dGVBcnJheScpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFNldE9mSGVscGVyID0gRmFyKCdtYXRjaDpzZXRPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtrZXlQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBudW1TZXRFbGVtZW50c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weVNldCcsIGNoZWNrKSAmJlxuICAgICAgICBjaGVjayhcbiAgICAgICAgICAvKiogQHR5cGUge0FycmF5fSAqLyAoc3BlY2ltZW4ucGF5bG9hZCkubGVuZ3RoIDwgbnVtU2V0RWxlbWVudHNMaW1pdCxcbiAgICAgICAgICBYYFNldCBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EobnVtU2V0RWxlbWVudHNMaW1pdCl9IGVsZW1lbnRzOiAke1xuICAgICAgICAgICAgc3BlY2ltZW4ucGF5bG9hZC5sZW5ndGhcbiAgICAgICAgICB9YCxcbiAgICAgICAgKSAmJlxuICAgICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKHNwZWNpbWVuLnBheWxvYWQsIGtleVBhdHQsIGNoZWNrLCAnc2V0IGVsZW1lbnRzJylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpzZXRPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6ICgpID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hCYWdPZkhlbHBlciA9IEZhcignbWF0Y2g6YmFnT2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBba2V5UGF0dCwgY291bnRQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsIGRlY2ltYWxEaWdpdHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlCYWcnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgLyoqIEB0eXBlIHtBcnJheX0gKi8gKHNwZWNpbWVuLnBheWxvYWQpLmxlbmd0aCA8PVxuICAgICAgICAgICAgbnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxcbiAgICAgICAgICBYYEJhZyBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG4gICAgICAgICAgICBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuICAgICAgICAgICl9IHVuaXF1ZSBlbGVtZW50czogJHtzcGVjaW1lbn1gLFxuICAgICAgICApICYmXG4gICAgICAgIHNwZWNpbWVuLnBheWxvYWQuZXZlcnkoXG4gICAgICAgICAgKFtrZXksIGNvdW50XSwgaSkgPT5cbiAgICAgICAgICAgIGNoZWNrTWF0Y2hlcyhrZXksIGtleVBhdHQsIGNoZWNrLCBgYmFnIGtleXNbJHtpfV1gKSAmJlxuICAgICAgICAgICAgYXBwbHlMYWJlbGluZ0Vycm9yKFxuICAgICAgICAgICAgICBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdCxcbiAgICAgICAgICAgICAgW2NvdW50LCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrXSxcbiAgICAgICAgICAgICAgYGJhZyBjb3VudHNbJHtpfV1gLFxuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgY2hlY2tNYXRjaGVzKGNvdW50LCBjb3VudFBhdHQsIGNoZWNrLCBgYmFnIGNvdW50c1ske2l9XWApLFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpiYWdPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6ICgpID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0NvcHlBcnJheX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFBhdHRcbiAqIEBwYXJhbSB7YmlnaW50fSBib3VuZCBNdXN0IGJlID49IDFuXG4gKiBAcGFyYW0ge0NvcHlBcnJheX0gW2luUmVzdWx0c11cbiAqIEBwYXJhbSB7Q29weUFycmF5fSBbb3V0UmVzdWx0c11cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgZWxlbWVudHNIYXNTcGxpdCA9IChcbiAgICBlbGVtZW50cyxcbiAgICBlbGVtZW50UGF0dCxcbiAgICBib3VuZCxcbiAgICBpblJlc3VsdHMgPSB1bmRlZmluZWQsXG4gICAgb3V0UmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBjaGVjayA9IGlkZW50Q2hlY2tlcixcbiAgKSA9PiB7XG4gICAgbGV0IGNvdW50ID0gMG47XG4gICAgLyogU2luY2UgdGhpcyBmZWF0dXJlIGlzIG1vdGl2YXRlZCBieSBFUlRQJ3MgdXNlIG9uKi9cbiAgICAvKiBub24tZnVuZ2libGUgKGBzZXRgLCBgY29weVNldGApIGFtb3VudHMsKi9cbiAgICAvKiB0aGVpciBhcnJheXMgc3RvcmUgdGhlaXIgZWxlbWVudHMgaW4gZGVjZW5kaW5nIGxleGljb2dyYXBoaWMgb3JkZXIuKi9cbiAgICAvKiBCdXQgdGhpcyBmdW5jdGlvbiBoYXMgdG8gbWFrZSBzb21lIGNob2ljZSBhbW91bmcgZXF1YWxseSBnb29kIG1pbmltYWwqL1xuICAgIC8qIHJlc3VsdHMuIEl0IGlzIG1vcmUgaW50dWl0aXZlIGZvciB0aGUgY2hvaWNlIHRvIGJlIHRoZSBmaXJzdCBgYm91bmRgKi9cbiAgICAvKiBtYXRjaGluZyBlbGVtZW50cyBpbiBhc2NlbmRpbmcgbGV4aWNpZ3JhcGhpYyBvcmRlciwgcmF0aGVyIHRoYW4qL1xuICAgIC8qIGRlY2VuZGluZy4gVGh1cyB3ZSBpdGVyYXRlIGBlbGVtZW50c2AgaW4gcmV2ZXJzZSBvcmRlci4qL1xuICAgIGZvciAobGV0IGkgPSBlbGVtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xuICAgICAgaWYgKGNvdW50IDwgYm91bmQpIHtcbiAgICAgICAgaWYgKG1hdGNoZXMoZWxlbWVudCwgZWxlbWVudFBhdHQpKSB7XG4gICAgICAgICAgY291bnQgKz0gMW47XG4gICAgICAgICAgaWYgKGluUmVzdWx0cykgaW5SZXN1bHRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3V0UmVzdWx0cykge1xuICAgICAgICAgIG91dFJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRSZXN1bHRzLnB1c2goZWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGNvdW50ID49IGJvdW5kLFxuICAgICAgWGBIYXMgb25seSAke3EoY291bnQpfSBtYXRjaGVzLCBidXQgbmVlZHMgJHtxKGJvdW5kKX1gLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0NvcHlBcnJheTxbS2V5LCBiaWdpbnRdPn0gcGFpcnNcbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFBhdHRcbiAqIEBwYXJhbSB7YmlnaW50fSBib3VuZCBNdXN0IGJlID49IDFuXG4gKiBAcGFyYW0ge0NvcHlBcnJheTxbS2V5LCBiaWdpbnRdPn0gW2luUmVzdWx0c11cbiAqIEBwYXJhbSB7Q29weUFycmF5PFtLZXksIGJpZ2ludF0+fSBbb3V0UmVzdWx0c11cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgcGFpcnNIYXNTcGxpdCA9IChcbiAgICBwYWlycyxcbiAgICBlbGVtZW50UGF0dCxcbiAgICBib3VuZCxcbiAgICBpblJlc3VsdHMgPSB1bmRlZmluZWQsXG4gICAgb3V0UmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBjaGVjayA9IGlkZW50Q2hlY2tlcixcbiAgKSA9PiB7XG4gICAgbGV0IGNvdW50ID0gMG47XG4gICAgLyogU2luY2UgdGhpcyBmZWF0dXJlIGlzIG1vdGl2YXRlZCBieSBFUlRQJ3MgdXNlIG9uKi9cbiAgICAvKiBzZW1pLWZ1bmdpYmxlIChgY29weUJhZ2ApIGFtb3VudHMsKi9cbiAgICAvKiB0aGVpciBhcnJheXMgc3RvcmUgdGhlaXIgZWxlbWVudHMgaW4gZGVjZW5kaW5nIGxleGljb2dyYXBoaWMgb3JkZXIuKi9cbiAgICAvKiBCdXQgdGhpcyBmdW5jdGlvbiBoYXMgdG8gbWFrZSBzb21lIGNob2ljZSBhbW91bmcgZXF1YWxseSBnb29kIG1pbmltYWwqL1xuICAgIC8qIHJlc3VsdHMuIEl0IGlzIG1vcmUgaW50dWl0aXZlIGZvciB0aGUgY2hvaWNlIHRvIGJlIHRoZSBmaXJzdCBgYm91bmRgKi9cbiAgICAvKiBtYXRjaGluZyBlbGVtZW50cyBpbiBhc2NlbmRpbmcgbGV4aWNpZ3JhcGhpYyBvcmRlciwgcmF0aGVyIHRoYW4qL1xuICAgIC8qIGRlY2VuZGluZy4gVGh1cyB3ZSBpdGVyYXRlIGBwYWlyc2AgaW4gcmV2ZXJzZSBvcmRlci4qL1xuICAgIGZvciAobGV0IGkgPSBwYWlycy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgY29uc3QgW2VsZW1lbnQsIG51bV0gPSBwYWlyc1tpXTtcbiAgICAgIGNvbnN0IG51bVJlc3QgPSBib3VuZCAtIGNvdW50O1xuICAgICAgaWYgKG51bVJlc3QgPj0gMW4pIHtcbiAgICAgICAgaWYgKG1hdGNoZXMoZWxlbWVudCwgZWxlbWVudFBhdHQpKSB7XG4gICAgICAgICAgaWYgKG51bSA8PSBudW1SZXN0KSB7XG4gICAgICAgICAgICBjb3VudCArPSBudW07XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHRzKSBpblJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG51bUluID0gbnVtUmVzdDtcbiAgICAgICAgICAgIGNvdW50ICs9IG51bUluO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0cykgaW5SZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bVJlc3RdKTtcbiAgICAgICAgICAgIGlmIChvdXRSZXN1bHRzKSBvdXRSZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bSAtIG51bVJlc3RdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3V0UmVzdWx0cykge1xuICAgICAgICAgIG91dFJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob3V0UmVzdWx0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0UmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW1dKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgY291bnQgPj0gYm91bmQsXG4gICAgICBYYEhhcyBvbmx5ICR7cShjb3VudCl9IG1hdGNoZXMsIGJ1dCBuZWVkcyAke3EoYm91bmQpfWAsXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAqIEB0eXBlZGVmIHtDb3B5QXJyYXkgfCBDb3B5U2V0IHwgQ29weUJhZ30gQ29udGFpbmVyXG4gKiBAcGFyYW0ge0NvbnRhaW5lcn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFBhdHRcbiAqIEBwYXJhbSB7YmlnaW50fSBib3VuZCBNdXN0IGJlID49IDFuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtuZWVkSW5SZXN1bHRzXVxuICogQHBhcmFtIHtib29sZWFufSBbbmVlZE91dFJlc3VsdHNdXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtbQ29udGFpbmVyIHwgdW5kZWZpbmVkLCBDb250YWluZXIgfCB1bmRlZmluZWRdIHwgZmFsc2V9XG4gKi9cbiAgY29uc3QgY29udGFpbmVySGFzU3BsaXQgPSAoXG4gICAgc3BlY2ltZW4sXG4gICAgZWxlbWVudFBhdHQsXG4gICAgYm91bmQsXG4gICAgbmVlZEluUmVzdWx0cyA9IGZhbHNlLFxuICAgIG5lZWRPdXRSZXN1bHRzID0gZmFsc2UsXG4gICAgY2hlY2sgPSBpZGVudENoZWNrZXIsXG4gICkgPT4ge1xuICAgIGNvbnN0IGluUmVzdWx0cyA9IG5lZWRJblJlc3VsdHMgPyBbXSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvdXRSZXN1bHRzID0gbmVlZE91dFJlc3VsdHMgPyBbXSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBraW5kID0ga2luZE9mKHNwZWNpbWVuKTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFlbGVtZW50c0hhc1NwbGl0KFxuICAgICAgICAgICAgc3BlY2ltZW4sXG4gICAgICAgICAgICBlbGVtZW50UGF0dCxcbiAgICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgICAgaW5SZXN1bHRzLFxuICAgICAgICAgICAgb3V0UmVzdWx0cyxcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLyogY2hlY2sgbG9naWMgYWxyZWFkeSBwZXJmb3JtZWQgYnkgZWxlbWVudHNIYXNTcGxpdCovXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbaW5SZXN1bHRzLCBvdXRSZXN1bHRzXTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhZWxlbWVudHNIYXNTcGxpdChcbiAgICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQsXG4gICAgICAgICAgICBlbGVtZW50UGF0dCxcbiAgICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgICAgaW5SZXN1bHRzLFxuICAgICAgICAgICAgb3V0UmVzdWx0cyxcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgaW5SZXN1bHRzICYmIG1ha2VDb3B5U2V0KGluUmVzdWx0cyksXG4gICAgICAgICAgb3V0UmVzdWx0cyAmJiBtYWtlQ29weVNldChvdXRSZXN1bHRzKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhcGFpcnNIYXNTcGxpdChcbiAgICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQsXG4gICAgICAgICAgICBlbGVtZW50UGF0dCxcbiAgICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgICAgaW5SZXN1bHRzLFxuICAgICAgICAgICAgb3V0UmVzdWx0cyxcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgaW5SZXN1bHRzICYmIG1ha2VDb3B5QmFnKGluUmVzdWx0cyksXG4gICAgICAgICAgb3V0UmVzdWx0cyAmJiBtYWtlQ29weUJhZyhvdXRSZXN1bHRzKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYHVuZXhwZWN0ZWQgJHtxKGtpbmQpfWApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaENvbnRhaW5lckhhc0hlbHBlciA9IEZhcignTS5jb250YWluZXJIYXMgaGVscGVyJywge1xuICAgIC8qKlxuICogQHBhcmFtIHtDb3B5QXJyYXkgfCBDb3B5U2V0IHwgQ29weUJhZ30gc3BlY2ltZW5cbiAqIEBwYXJhbSB7W1BhdHRlcm4sIGJpZ2ludCwgTGltaXRzP119IHBheWxvYWRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBbZWxlbWVudFBhdHQsIGJvdW5kLCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBraW5kID0ga2luZE9mKHNwZWNpbWVuLCBjaGVjayk7XG4gICAgICBjb25zdCB7IGRlY2ltYWxEaWdpdHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWFwcGx5TGFiZWxpbmdFcnJvcihcbiAgICAgICAgICBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdCxcbiAgICAgICAgICBbYm91bmQsIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2tdLFxuICAgICAgICAgIGAke2tpbmR9IG1hdGNoZXNgLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuICEhY29udGFpbmVySGFzU3BsaXQoXG4gICAgICAgIHNwZWNpbWVuLFxuICAgICAgICBlbGVtZW50UGF0dCxcbiAgICAgICAgYm91bmQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgY2hlY2ssXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5ndGUoMW4pXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnTS5jb250YWluZXJIYXMgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoTWFwT2ZIZWxwZXIgPSBGYXIoJ21hdGNoOm1hcE9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW2tleVBhdHQsIHZhbHVlUGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBudW1NYXBFbnRyaWVzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5TWFwJywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovIChzcGVjaW1lbi5wYXlsb2FkLmtleXMpLmxlbmd0aCA8PVxuICAgICAgICAgICAgbnVtTWFwRW50cmllc0xpbWl0LFxuICAgICAgICAgIFhgQ29weU1hcCBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuICR7cShcbiAgICAgICAgICAgIG51bU1hcEVudHJpZXNMaW1pdCxcbiAgICAgICAgICApfSBlbnRyaWVzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbiAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLmtleXMsXG4gICAgICAgICAga2V5UGF0dCxcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAnbWFwIGtleXMnLFxuICAgICAgICApICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG4gICAgICAgICAgc3BlY2ltZW4ucGF5bG9hZC52YWx1ZXMsXG4gICAgICAgICAgdmFsdWVQYXR0LFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICdtYXAgdmFsdWVzJyxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6bWFwT2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiBfZW50cnlQYXR0ID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gb3B0aW9uYWxQYXR0XG4gKiBAcmV0dXJucyB7e1xuICogICByZXF1aXJlZFNwZWNpbWVuOiBQYXNzYWJsZVtdLFxuICogICBvcHRpb25hbFNwZWNpbWVuOiBQYXNzYWJsZVtdLFxuICogICByZXN0U3BlY2ltZW46IFBhc3NhYmxlW11cbiAqIH19XG4gKi9cbiAgY29uc3Qgc3BsaXRBcnJheVBhcnRzID0gKHNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCkgPT4ge1xuICAgIGNvbnN0IG51bVJlcXVpcmVkID0gcmVxdWlyZWRQYXR0Lmxlbmd0aDtcbiAgICBjb25zdCBudW1PcHRpb25hbCA9IG9wdGlvbmFsUGF0dC5sZW5ndGg7XG4gICAgY29uc3QgcmVxdWlyZWRTcGVjaW1lbiA9IHNwZWNpbWVuLnNsaWNlKDAsIG51bVJlcXVpcmVkKTtcbiAgICBjb25zdCBvcHRpb25hbFNwZWNpbWVuID0gc3BlY2ltZW4uc2xpY2UoXG4gICAgICBudW1SZXF1aXJlZCxcbiAgICAgIG51bVJlcXVpcmVkICsgbnVtT3B0aW9uYWwsXG4gICAgKTtcbiAgICBjb25zdCByZXN0U3BlY2ltZW4gPSBzcGVjaW1lbi5zbGljZShudW1SZXF1aXJlZCArIG51bU9wdGlvbmFsKTtcbiAgICByZXR1cm4gaGFyZGVuKHsgcmVxdWlyZWRTcGVjaW1lbiwgb3B0aW9uYWxTcGVjaW1lbiwgcmVzdFNwZWNpbWVuIH0pO1xuICB9O1xuXG4gIC8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gZWxlbWVudHMgd2hpY2ggYXJlIGB1bmRlZmluZWRgIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICogV2UgZW5jb2RlIHRoaXMgd2l0aCB0aGUgYE0ub3JgIHBhdHRlcm4gc28gaXQgYWxzbyBwcm9kdWNlcyBhIGdvb2RcbiAqIGNvbXByZXNzaW9uIGRpc3Rpbmd1aXNoaW5nIGB1bmRlZmluZWRgIGZyb20gYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcmV0dXJucyB7UGF0dGVybltdfSBUaGUgcGFydGlhbFBhdHRcbiAqL1xuICBjb25zdCBhZGFwdEFycmF5UGF0dGVybiA9IChvcHRpb25hbFBhdHQsIGxlbmd0aCkgPT5cbiAgICBoYXJkZW4ob3B0aW9uYWxQYXR0LnNsaWNlKDAsIGxlbmd0aCkubWFwKHBhdHQgPT4gTU0ub3B0KHBhdHQpKSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTcGxpdEFycmF5SGVscGVyID0gRmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0gW10sIHJlc3RQYXR0ID0gTU0uYW55KCldLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBpZiAoIWNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlBcnJheScsIGNoZWNrKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHJlcXVpcmVkU3BlY2ltZW4sIG9wdGlvbmFsU3BlY2ltZW4sIHJlc3RTcGVjaW1lbiB9ID1cbiAgICAgICAgc3BsaXRBcnJheVBhcnRzKHNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCk7XG4gICAgICBjb25zdCBwYXJ0aWFsUGF0dCA9IGFkYXB0QXJyYXlQYXR0ZXJuKFxuICAgICAgICBvcHRpb25hbFBhdHQsXG4gICAgICAgIG9wdGlvbmFsU3BlY2ltZW4ubGVuZ3RoLFxuICAgICAgKTtcbiAgICAgIGxldCBhcmdOdW0gPSAwO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHJlcXVpcmVkU3BlY2ltZW4ubGVuZ3RoID09PSByZXF1aXJlZFBhdHQubGVuZ3RoIHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgRXhwZWN0ZWQgYXQgbGVhc3QgJHtxKFxuICAgICAgICAgICAgICByZXF1aXJlZFBhdHQubGVuZ3RoLFxuICAgICAgICAgICAgKX0gYXJndW1lbnRzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICAgKSkgJiZcbiAgICAgICAgcmVxdWlyZWRQYXR0LmV2ZXJ5KChwLCBpKSA9PlxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG4gICAgICAgICAgY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0sIHAsIGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9YCksXG4gICAgICAgICkgJiZcbiAgICAgICAgcGFydGlhbFBhdHQuZXZlcnkoKHAsIGkpID0+XG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbiAgICAgICAgICBjaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSwgcCwgY2hlY2ssIGBhcmcgJHthcmdOdW0rK30/YCksXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbiwgcmVzdFBhdHQsIGNoZWNrLCAnLi4ucmVzdCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICAvKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoc3BsaXRBcnJheSwgY2hlY2spID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcGFzc1N0eWxlT2Yoc3BsaXRBcnJheSkgPT09ICdjb3B5QXJyYXknICYmXG4gICAgICAgIChzcGxpdEFycmF5Lmxlbmd0aCA+PSAxIHx8IHNwbGl0QXJyYXkubGVuZ3RoIDw9IDMpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLCByZXN0UGF0dCA9IHVuZGVmaW5lZF0gPVxuICAgICAgICAgIHNwbGl0QXJyYXk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc1BhdHRlcm4ocmVxdWlyZWRQYXR0KSAmJlxuICAgICAgICAgIHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkgPT09ICdjb3B5QXJyYXknICYmXG4gICAgICAgICAgKG9wdGlvbmFsUGF0dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkgJiZcbiAgICAgICAgICAgICAgcGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KSA9PT0gJ2NvcHlBcnJheScpKSAmJlxuICAgICAgICAgIChyZXN0UGF0dCA9PT0gdW5kZWZpbmVkIHx8IGlzUGF0dGVybihyZXN0UGF0dCkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgYXJyYXksIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCBhcnJheSwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG4gICAgICAgICAgc3BsaXRBcnJheSxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoW1xuICAgICAgX3JlcXVpcmVkUGF0dCxcbiAgICAgIF9vcHRpb25hbFBhdHQgPSB1bmRlZmluZWQsXG4gICAgICBfcmVzdFBhdHQgPSB1bmRlZmluZWQsXG4gICAgXSkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpLFxuICB9KTtcblxuICAvKipcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXNzYWJsZT59IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBvcHRpb25hbFBhdHRcbiAqIEByZXR1cm5zIHt7XG4gKiAgIHJlcXVpcmVkU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICBvcHRpb25hbFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPixcbiAqICAgcmVzdFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPlxuICogfX1cbiAqL1xuICBjb25zdCBzcGxpdFJlY29yZFBhcnRzID0gKHNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCkgPT4ge1xuICAgIC8qIE5vdCBmcm96ZW4hIE11dGF0ZWQgaW4gcGxhY2UqL1xuICAgIC8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG4gICAgY29uc3QgcmVxdWlyZWRFbnRyaWVzID0gW107XG4gICAgLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbiAgICBjb25zdCBvcHRpb25hbEVudHJpZXMgPSBbXTtcbiAgICAvKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuICAgIGNvbnN0IHJlc3RFbnRyaWVzID0gW107XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIGVudHJpZXMoc3BlY2ltZW4pKSB7XG4gICAgICBpZiAoaGFzT3duKHJlcXVpcmVkUGF0dCwgbmFtZSkpIHtcbiAgICAgICAgcmVxdWlyZWRFbnRyaWVzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9IGVsc2UgaWYgKGhhc093bihvcHRpb25hbFBhdHQsIG5hbWUpKSB7XG4gICAgICAgIG9wdGlvbmFsRW50cmllcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdEVudHJpZXMucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICByZXF1aXJlZFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhyZXF1aXJlZEVudHJpZXMpLFxuICAgICAgb3B0aW9uYWxTcGVjaW1lbjogZnJvbVVuaXF1ZUVudHJpZXMob3B0aW9uYWxFbnRyaWVzKSxcbiAgICAgIHJlc3RTcGVjaW1lbjogZnJvbVVuaXF1ZUVudHJpZXMocmVzdEVudHJpZXMpLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gdmFsdWVzIHdoaWNoIGFyZSBgdW5kZWZpbmVkYCBwYXNzIHVuY29uZGl0aW9uYWxseS5cbiAqIFdlIGVuY29kZSB0aGlzIHdpdGggdGhlIGBNLm9yYCBwYXR0ZXJuIHNvIGl0IGFsc28gcHJvZHVjZXMgYSBnb29kXG4gKiBjb21wcmVzc2lvbiBkaXN0aW5ndWlzaGluZyBgdW5kZWZpbmVkYCBmcm9tIGFic2VuY2UuXG4gKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7Q29weVJlY29yZDxQYXR0ZXJuPn0gVGhlIHBhcnRpYWxQYXR0XG4gKi9cbiAgY29uc3QgYWRhcHRSZWNvcmRQYXR0ZXJuID0gKG9wdGlvbmFsUGF0dCwgbmFtZXMpID0+XG4gICAgZnJvbVVuaXF1ZUVudHJpZXMobmFtZXMubWFwKG5hbWUgPT4gW25hbWUsIE1NLm9wdChvcHRpb25hbFBhdHRbbmFtZV0pXSkpO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXIgPSBGYXIoJ21hdGNoOnNwbGl0UmVjb3JkIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0ge30sIHJlc3RQYXR0ID0gTU0uYW55KCldLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBpZiAoIWNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlSZWNvcmQnLCBjaGVjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyByZXF1aXJlZFNwZWNpbWVuLCBvcHRpb25hbFNwZWNpbWVuLCByZXN0U3BlY2ltZW4gfSA9XG4gICAgICAgIHNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KTtcblxuICAgICAgY29uc3QgcGFydGlhbE5hbWVzID0gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKG93bktleXMob3B0aW9uYWxTcGVjaW1lbikpO1xuICAgICAgY29uc3QgcGFydGlhbFBhdHQgPSBhZGFwdFJlY29yZFBhdHRlcm4ob3B0aW9uYWxQYXR0LCBwYXJ0aWFsTmFtZXMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgY2hlY2spICYmXG4gICAgICAgIHBhcnRpYWxOYW1lcy5ldmVyeShuYW1lID0+XG4gICAgICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICAgICAgb3B0aW9uYWxTcGVjaW1lbltuYW1lXSxcbiAgICAgICAgICAgIHBhcnRpYWxQYXR0W25hbWVdLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICBgJHtuYW1lfT9gLFxuICAgICAgICAgICksXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbiwgcmVzdFBhdHQsIGNoZWNrLCAnLi4ucmVzdCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICAvKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoc3BsaXRBcnJheSwgY2hlY2spID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcGFzc1N0eWxlT2Yoc3BsaXRBcnJheSkgPT09ICdjb3B5QXJyYXknICYmXG4gICAgICAgIChzcGxpdEFycmF5Lmxlbmd0aCA+PSAxIHx8IHNwbGl0QXJyYXkubGVuZ3RoIDw9IDMpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLCByZXN0UGF0dCA9IHVuZGVmaW5lZF0gPVxuICAgICAgICAgIHNwbGl0QXJyYXk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc1BhdHRlcm4ocmVxdWlyZWRQYXR0KSAmJlxuICAgICAgICAgIHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkgPT09ICdjb3B5UmVjb3JkJyAmJlxuICAgICAgICAgIChvcHRpb25hbFBhdHQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKGlzUGF0dGVybihvcHRpb25hbFBhdHQpICYmXG4gICAgICAgICAgICAgIHBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCkgPT09ICdjb3B5UmVjb3JkJykpICYmXG4gICAgICAgICAgKHJlc3RQYXR0ID09PSB1bmRlZmluZWQgfHwgaXNQYXR0ZXJuKHJlc3RQYXR0KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCByZWNvcmQsIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCByZWNvcmQsIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuICAgICAgICAgIHNwbGl0QXJyYXksXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGdldFJhbmtDb3ZlcjogKFtcbiAgICAgIHJlcXVpcmVkUGF0dCxcbiAgICAgIF9vcHRpb25hbFBhdHQgPSB1bmRlZmluZWQsXG4gICAgICBfcmVzdFBhdHQgPSB1bmRlZmluZWQsXG4gICAgXSkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgTWF0Y2hIZWxwZXI+fSAqL1xuICBjb25zdCBIZWxwZXJzQnlNYXRjaFRhZyA9IGhhcmRlbih7XG4gICAgJ21hdGNoOmFueSc6IG1hdGNoQW55SGVscGVyLFxuICAgICdtYXRjaDphbmQnOiBtYXRjaEFuZEhlbHBlcixcbiAgICAnbWF0Y2g6b3InOiBtYXRjaE9ySGVscGVyLFxuICAgICdtYXRjaDpub3QnOiBtYXRjaE5vdEhlbHBlcixcblxuICAgICdtYXRjaDpzY2FsYXInOiBtYXRjaFNjYWxhckhlbHBlcixcbiAgICAnbWF0Y2g6a2V5JzogbWF0Y2hLZXlIZWxwZXIsXG4gICAgJ21hdGNoOnBhdHRlcm4nOiBtYXRjaFBhdHRlcm5IZWxwZXIsXG4gICAgJ21hdGNoOmtpbmQnOiBtYXRjaEtpbmRIZWxwZXIsXG4gICAgJ21hdGNoOnRhZ2dlZCc6IG1hdGNoVGFnZ2VkSGVscGVyLFxuICAgICdtYXRjaDpiaWdpbnQnOiBtYXRjaEJpZ2ludEhlbHBlcixcbiAgICAnbWF0Y2g6bmF0JzogbWF0Y2hOYXRIZWxwZXIsXG4gICAgJ21hdGNoOnN0cmluZyc6IG1hdGNoU3RyaW5nSGVscGVyLFxuICAgICdtYXRjaDpzeW1ib2wnOiBtYXRjaFN5bWJvbEhlbHBlcixcbiAgICAnbWF0Y2g6cmVtb3RhYmxlJzogbWF0Y2hSZW1vdGFibGVIZWxwZXIsXG5cbiAgICAnbWF0Y2g6bHQnOiBtYXRjaExUSGVscGVyLFxuICAgICdtYXRjaDpsdGUnOiBtYXRjaExURUhlbHBlcixcbiAgICAnbWF0Y2g6Z3RlJzogbWF0Y2hHVEVIZWxwZXIsXG4gICAgJ21hdGNoOmd0JzogbWF0Y2hHVEhlbHBlcixcblxuICAgICdtYXRjaDphcnJheU9mJzogbWF0Y2hBcnJheU9mSGVscGVyLFxuICAgICdtYXRjaDpieXRlQXJyYXknOiBtYXRjaEJ5dGVBcnJheUhlbHBlcixcbiAgICAnbWF0Y2g6cmVjb3JkT2YnOiBtYXRjaFJlY29yZE9mSGVscGVyLFxuICAgICdtYXRjaDpzZXRPZic6IG1hdGNoU2V0T2ZIZWxwZXIsXG4gICAgJ21hdGNoOmJhZ09mJzogbWF0Y2hCYWdPZkhlbHBlcixcbiAgICAnbWF0Y2g6Y29udGFpbmVySGFzJzogbWF0Y2hDb250YWluZXJIYXNIZWxwZXIsXG4gICAgJ21hdGNoOm1hcE9mJzogbWF0Y2hNYXBPZkhlbHBlcixcbiAgICAnbWF0Y2g6c3BsaXRBcnJheSc6IG1hdGNoU3BsaXRBcnJheUhlbHBlcixcbiAgICAnbWF0Y2g6c3BsaXRSZWNvcmQnOiBtYXRjaFNwbGl0UmVjb3JkSGVscGVyLFxuICB9KTtcblxuICBjb25zdCBtYWtlTWF0Y2hlciA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgICBjb25zdCBtYXRjaGVyID0gbWFrZVRhZ2dlZCh0YWcsIHBheWxvYWQpO1xuICAgIGFzc2VydFBhdHRlcm4obWF0Y2hlcik7XG4gICAgcmV0dXJuIG1hdGNoZXI7XG4gIH07XG5cbiAgY29uc3QgbWFrZUtpbmRNYXRjaGVyID0ga2luZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6a2luZCcsIGtpbmQpO1xuXG4gIGNvbnN0IEFueVNoYXBlID0gbWFrZU1hdGNoZXIoJ21hdGNoOmFueScsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IFNjYWxhclNoYXBlID0gbWFrZU1hdGNoZXIoJ21hdGNoOnNjYWxhcicsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IEtleVNoYXBlID0gbWFrZU1hdGNoZXIoJ21hdGNoOmtleScsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IFBhdHRlcm5TaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDpwYXR0ZXJuJywgdW5kZWZpbmVkKTtcbiAgY29uc3QgQm9vbGVhblNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdib29sZWFuJyk7XG4gIGNvbnN0IE51bWJlclNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdudW1iZXInKTtcbiAgY29uc3QgQmlnSW50U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpiaWdpbnQnLCBbXSk7XG4gIGNvbnN0IE5hdFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6bmF0JywgW10pO1xuICBjb25zdCBTdHJpbmdTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnN0cmluZycsIFtdKTtcbiAgY29uc3QgU3ltYm9sU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpzeW1ib2wnLCBbXSk7XG4gIGNvbnN0IFJlY29yZFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6cmVjb3JkT2YnLCBbQW55U2hhcGUsIEFueVNoYXBlXSk7XG4gIGNvbnN0IEFycmF5U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDphcnJheU9mJywgW0FueVNoYXBlXSk7XG4gIGNvbnN0IEJ5dGVBcnJheVNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6Ynl0ZUFycmF5JywgW10pO1xuICBjb25zdCBTZXRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnNldE9mJywgW0FueVNoYXBlXSk7XG4gIGNvbnN0IEJhZ1NoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6YmFnT2YnLCBbQW55U2hhcGUsIEFueVNoYXBlXSk7XG4gIGNvbnN0IE1hcFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6bWFwT2YnLCBbQW55U2hhcGUsIEFueVNoYXBlXSk7XG4gIGNvbnN0IFJlbW90YWJsZVNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdyZW1vdGFibGUnKTtcbiAgY29uc3QgRXJyb3JTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcignZXJyb3InKTtcbiAgY29uc3QgUHJvbWlzZVNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdwcm9taXNlJyk7XG4gIGNvbnN0IFVuZGVmaW5lZFNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCd1bmRlZmluZWQnKTtcblxuICAvKipcbiAqIEZvciB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBheWxvYWQgaXMgdGhlIG9wdGlvbmFsIGxpbWl0cyxcbiAqIHNvIHRoYXQgd2hlbiBpdCBpcyBgdW5kZWZpbmVkYCBpdCBpcyBkcm9wcGVkIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAqIHBheWxvYWRzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGF5bG9hZFxuICovXG4gIGNvbnN0IG1ha2VMaW1pdHNNYXRjaGVyID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICAgIGlmIChwYXlsb2FkW3BheWxvYWQubGVuZ3RoIC0gMV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGF5bG9hZCA9IGhhcmRlbihwYXlsb2FkLnNsaWNlKDAsIHBheWxvYWQubGVuZ3RoIC0gMSkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZU1hdGNoZXIodGFnLCBwYXlsb2FkKTtcbiAgfTtcblxuICBjb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlciA9IChsYWJlbCA9IHVuZGVmaW5lZCkgPT5cbiAgICBsYWJlbCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IFJlbW90YWJsZVNoYXBlXG4gICAgICA6IG1ha2VNYXRjaGVyKCdtYXRjaDpyZW1vdGFibGUnLCBoYXJkZW4oeyBsYWJlbCB9KSk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSBlbXB0eVxuICogQHBhcmFtIHtUfSBiYXNlXG4gKiBAcGFyYW0ge1R9IFtvcHRpb25hbF1cbiAqIEBwYXJhbSB7VH0gW3Jlc3RdXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG4gIGNvbnN0IG1ha2VTcGxpdFBheWxvYWQgPSAoXG4gICAgZW1wdHksXG4gICAgYmFzZSxcbiAgICBvcHRpb25hbCA9IHVuZGVmaW5lZCxcbiAgICByZXN0ID0gdW5kZWZpbmVkLFxuICApID0+IHtcbiAgICBpZiAocmVzdCkge1xuICAgICAgcmV0dXJuIFtiYXNlLCBvcHRpb25hbCB8fCBlbXB0eSwgcmVzdF07XG4gICAgfVxuICAgIGlmIChvcHRpb25hbCkge1xuICAgICAgcmV0dXJuIFtiYXNlLCBvcHRpb25hbF07XG4gICAgfVxuICAgIHJldHVybiBbYmFzZV07XG4gIH07XG5cbiAgLyogLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuICAvKiogQHR5cGUge01hdGNoZXJOYW1lc3BhY2V9ICovXG4gIGNvbnN0IE0gPSBoYXJkZW4oe1xuICAgIGFueTogKCkgPT4gQW55U2hhcGUsXG4gICAgYW5kOiAoLi4ucGF0dHMpID0+IG1ha2VNYXRjaGVyKCdtYXRjaDphbmQnLCBwYXR0cyksXG4gICAgb3I6ICguLi5wYXR0cykgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOm9yJywgcGF0dHMpLFxuICAgIG5vdDogc3ViUGF0dCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6bm90Jywgc3ViUGF0dCksXG5cbiAgICBzY2FsYXI6ICgpID0+IFNjYWxhclNoYXBlLFxuICAgIGtleTogKCkgPT4gS2V5U2hhcGUsXG4gICAgcGF0dGVybjogKCkgPT4gUGF0dGVyblNoYXBlLFxuICAgIGtpbmQ6IG1ha2VLaW5kTWF0Y2hlcixcbiAgICB0YWdnZWQ6ICh0YWdQYXR0ID0gTS5zdHJpbmcoKSwgcGF5bG9hZFBhdHQgPSBNLmFueSgpKSA9PlxuICAgICAgbWFrZU1hdGNoZXIoJ21hdGNoOnRhZ2dlZCcsIGhhcmRlbihbdGFnUGF0dCwgcGF5bG9hZFBhdHRdKSksXG4gICAgYm9vbGVhbjogKCkgPT4gQm9vbGVhblNoYXBlLFxuICAgIG51bWJlcjogKCkgPT4gTnVtYmVyU2hhcGUsXG4gICAgYmlnaW50OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJpZ2ludCcsIFtsaW1pdHNdKSA6IEJpZ0ludFNoYXBlLFxuICAgIG5hdDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpuYXQnLCBbbGltaXRzXSkgOiBOYXRTaGFwZSxcbiAgICBzdHJpbmc6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3RyaW5nJywgW2xpbWl0c10pIDogU3RyaW5nU2hhcGUsXG4gICAgc3ltYm9sOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN5bWJvbCcsIFtsaW1pdHNdKSA6IFN5bWJvbFNoYXBlLFxuICAgIHJlY29yZDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IE0ucmVjb3JkT2YoTS5hbnkoKSwgTS5hbnkoKSwgbGltaXRzKSA6IFJlY29yZFNoYXBlLFxuICAgIC8qIHN0cnVjdDogQSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBDb3B5UmVjb3JkcyB3aXRoIGEgZml4ZWQgcXVhbnRpdHkgb2YqL1xuICAgIC8qIGVudHJpZXMgd2hlcmUgdGhlIHZhbHVlcyBtYXRjaCBwYXR0ZXJucyBmb3IgY29ycmVzcG9uZGluZyBrZXlzIGlzIG1lcmVseSovXG4gICAgLyogYSBoYXJkZW5lZCBvYmplY3Qgd2l0aCBwYXR0ZXJucyBpbiB0aGUgcGxhY2VzIG9mIHZhbHVlcyBmb3IqL1xuICAgIC8qIGNvcnJlc3BvbmRpbmcga2V5cy4qL1xuICAgIC8qIEZvciBleGFtcGxlLCBhIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlSZWNvcmRzIHRoYXQgaGF2ZSBhIHN0cmluZyB2YWx1ZSovXG4gICAgLyogZm9yIHRoZSBrZXkgJ3gnIGFuZCBhIG51bWJlciBmb3IgdGhlIGtleSAneScgaXM6Ki9cbiAgICAvKiBoYXJkZW4oeyB4OiBNLnN0cmluZygpLCB5OiBNLm51bWJlcigpIH0pLiovXG4gICAgYXJyYXk6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLmFycmF5T2YoTS5hbnkoKSwgbGltaXRzKSA6IEFycmF5U2hhcGUsXG4gICAgLyogdHVwbGU6IEEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weUFycmF5cyB3aXRoIGEgZml4ZWQgcXVhbnRpdHkgb2YgdmFsdWVzKi9cbiAgICAvKiB0aGF0IG1hdGNoIGEgaGV0ZXJvZ2VuZW91cyBhcnJheSBvZiBwYXR0ZXJucyBpcyBtZXJlbHkgYSBoYXJkZW5lZCBhcnJheSovXG4gICAgLyogb2YgdGhlIHJlc3BlY3RpdmUgcGF0dGVybnMuKi9cbiAgICAvKiBGb3IgZXhhbXBsZSwgYSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBDb3B5QXJyYXlzIG9mIGxlbmd0aCAyIHRoYXQgaGF2ZSBhKi9cbiAgICAvKiBzdHJpbmcgYXQgaW5kZXggMCBhbmQgYSBudW1iZXIgYXQgaW5kZXggMSBpczoqL1xuICAgIC8qIGhhcmRlbihbIE0uc3RyaW5nKCksIE0ubnVtYmVyKCkgXSkuKi9cbiAgICBieXRlQXJyYXk6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6Ynl0ZUFycmF5JywgW2xpbWl0c10pIDogQnl0ZUFycmF5U2hhcGUsXG4gICAgc2V0OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PiAobGltaXRzID8gTS5zZXRPZihNLmFueSgpLCBsaW1pdHMpIDogU2V0U2hhcGUpLFxuICAgIGJhZzogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IE0uYmFnT2YoTS5hbnkoKSwgTS5hbnkoKSwgbGltaXRzKSA6IEJhZ1NoYXBlLFxuICAgIG1hcDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IE0ubWFwT2YoTS5hbnkoKSwgTS5hbnkoKSwgbGltaXRzKSA6IE1hcFNoYXBlLFxuICAgIC8qIGhldGVyb2dlbmVvdXMgbWFwOiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlNYXBzIHdpdGggYSBmaXhlZCBxdWFudGl0eSovXG4gICAgLyogb2YgZW50cmllcyB3aGVyZSB0aGUgdmFsdWUgZm9yIGVhY2gga2V5IG1hdGNoZXMgYSBjb3JyZXNwb25kaW5nIHBhdHRlcm4qL1xuICAgIC8qIGlzIG1lcmVseSBhIChoYXJkZW5lZCkgQ29weU1hcCB3aXRoIHBhdHRlcm5zIGluc3RlYWQgb2YgdmFsdWVzIGZvciB0aGUqL1xuICAgIC8qIGNvcnJlc3BvbmRpbmcga2V5cy4qL1xuICAgIC8qIEZvciBleGFtcGxlLCBhIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlNYXBzIHdoZXJlIHRoZSB2YWx1ZSBmb3IgdGhlIGtleSovXG4gICAgLyogJ3gnIGlzIGEgbnVtYmVyIGFuZCB0aGUgdmFsdWUgZm9yIHRoZSBrZXkgJ3knIGlzIGEgc3RyaW5nIGlzOiovXG4gICAgLyogbWFrZUNvcHlNYXAoW1sneCcsIE0ubnVtYmVyKCldLCBbJ3knLCBNLnN0cmluZygpXV0pLiovXG4gICAgcmVtb3RhYmxlOiBtYWtlUmVtb3RhYmxlTWF0Y2hlcixcbiAgICBlcnJvcjogKCkgPT4gRXJyb3JTaGFwZSxcbiAgICBwcm9taXNlOiAoKSA9PiBQcm9taXNlU2hhcGUsXG4gICAgdW5kZWZpbmVkOiAoKSA9PiBVbmRlZmluZWRTaGFwZSxcbiAgICBudWxsOiAoKSA9PiBudWxsLFxuXG4gICAgbHQ6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6bHQnLCByaWdodE9wZXJhbmQpLFxuICAgIGx0ZTogcmlnaHRPcGVyYW5kID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpsdGUnLCByaWdodE9wZXJhbmQpLFxuICAgIGVxOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5KGtleSk7XG4gICAgICByZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgPyBNLnVuZGVmaW5lZCgpIDoga2V5O1xuICAgIH0sXG4gICAgbmVxOiBrZXkgPT4gTS5ub3QoTS5lcShrZXkpKSxcbiAgICBndGU6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6Z3RlJywgcmlnaHRPcGVyYW5kKSxcbiAgICBndDogcmlnaHRPcGVyYW5kID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpndCcsIHJpZ2h0T3BlcmFuZCksXG5cbiAgICByZWNvcmRPZjogKGtleVBhdHQgPSBNLmFueSgpLCB2YWx1ZVBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6cmVjb3JkT2YnLCBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHNdKSxcbiAgICBhcnJheU9mOiAoc3ViUGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDphcnJheU9mJywgW3N1YlBhdHQsIGxpbWl0c10pLFxuICAgIHNldE9mOiAoa2V5UGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzZXRPZicsIFtrZXlQYXR0LCBsaW1pdHNdKSxcbiAgICBiYWdPZjogKGtleVBhdHQgPSBNLmFueSgpLCBjb3VudFBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmFnT2YnLCBba2V5UGF0dCwgY291bnRQYXR0LCBsaW1pdHNdKSxcbiAgICBjb250YWluZXJIYXM6IChlbGVtZW50UGF0dCA9IE0uYW55KCksIGNvdW50UGF0dCA9IDFuLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6Y29udGFpbmVySGFzJywgW2VsZW1lbnRQYXR0LCBjb3VudFBhdHQsIGxpbWl0c10pLFxuICAgIG1hcE9mOiAoa2V5UGF0dCA9IE0uYW55KCksIHZhbHVlUGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDptYXBPZicsIFtrZXlQYXR0LCB2YWx1ZVBhdHQsIGxpbWl0c10pLFxuICAgIHNwbGl0QXJyYXk6IChiYXNlLCBvcHRpb25hbCA9IHVuZGVmaW5lZCwgcmVzdCA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VNYXRjaGVyKFxuICAgICAgICAnbWF0Y2g6c3BsaXRBcnJheScsXG4gICAgICAgIG1ha2VTcGxpdFBheWxvYWQoW10sIGJhc2UsIG9wdGlvbmFsLCByZXN0KSxcbiAgICAgICksXG4gICAgc3BsaXRSZWNvcmQ6IChiYXNlLCBvcHRpb25hbCA9IHVuZGVmaW5lZCwgcmVzdCA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VNYXRjaGVyKFxuICAgICAgICAnbWF0Y2g6c3BsaXRSZWNvcmQnLFxuICAgICAgICBtYWtlU3BsaXRQYXlsb2FkKHt9LCBiYXNlLCBvcHRpb25hbCwgcmVzdCksXG4gICAgICApLFxuICAgIHNwbGl0OiAoYmFzZSwgcmVzdCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSkgPT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgIC8qIFRPRE8gYXQtdHMtZXhwZWN0LWVycm9yIHdvcmtzIGxvY2FsbHkgYnV0IG5vdCBmcm9tIEBlbmRvL2V4byovXG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xuICAgICAgICByZXR1cm4gTS5zcGxpdEFycmF5KGJhc2UsIHJlc3QgJiYgW10sIHJlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE0uc3BsaXRSZWNvcmQoYmFzZSwgcmVzdCAmJiB7fSwgcmVzdCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBwYXJ0aWFsOiAoYmFzZSwgcmVzdCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSkgPT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgIC8qIFRPRE8gYXQtdHMtZXhwZWN0LWVycm9yIHdvcmtzIGxvY2FsbHkgYnV0IG5vdCBmcm9tIEBlbmRvL2V4byovXG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xuICAgICAgICByZXR1cm4gTS5zcGxpdEFycmF5KFtdLCBiYXNlLCByZXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNLnNwbGl0UmVjb3JkKHt9LCBiYXNlLCByZXN0KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZXJlZjogdCA9PiBNLm9yKHQsIE0ucHJvbWlzZSgpKSxcbiAgICBvcHQ6IHQgPT4gTS5vcihNLnVuZGVmaW5lZCgpLCB0KSxcblxuICAgIGludGVyZmFjZTogKGludGVyZmFjZU5hbWUsIG1ldGhvZEd1YXJkcywgb3B0aW9ucykgPT5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBtYWtlSW50ZXJmYWNlR3VhcmQoaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCBvcHRpb25zKSxcbiAgICBjYWxsOiAoLi4uYXJnUGF0dGVybnMpID0+XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgbWFrZU1ldGhvZEd1YXJkTWFrZXIoJ3N5bmMnLCBhcmdQYXR0ZXJucyksXG4gICAgY2FsbFdoZW46ICguLi5hcmdHdWFyZHMpID0+XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgbWFrZU1ldGhvZEd1YXJkTWFrZXIoJ2FzeW5jJywgYXJnR3VhcmRzKSxcblxuICAgIGF3YWl0OiBhcmdQYXR0ZXJuID0+XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgbWFrZUF3YWl0QXJnR3VhcmQoYXJnUGF0dGVybiksXG4gICAgcmF3OiAoKSA9PlxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIG1ha2VSYXdHdWFyZCgpLFxuICB9KTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBjaGVja01hdGNoZXMsXG4gICAgbWF0Y2hlcyxcbiAgICBtdXN0TWF0Y2gsXG4gICAgYXNzZXJ0UGF0dGVybixcbiAgICBpc1BhdHRlcm4sXG4gICAgZ2V0UmFua0NvdmVyLFxuICAgIE0sXG4gICAga2luZE9mLFxuICAgIGNvbnRhaW5lckhhc1NwbGl0LFxuICB9KTtcbn07XG5cbi8qIE9ubHkgaW5jbHVkZSB0aG9zZSB3aG9zZSBtZWFuaW5nIGlzIGluZGVwZW5kZW50IG9mIGFuIGltcHV0ZWQgc29ydCBvcmRlciovXG4vKiBvZiByZW1vdGFibGVzLCBvciBvZiBlbmNvZGluZyBvZiBwYXNzYWJsZSBhcyBzb3J0YWJsZSBzdHJpbmdzLiBUaHVzLCovXG4vKiBnZXRSYW5rQ292ZXIgaXMgb21pdHRlZC4gVG8gZ2V0IG9uZSwgeW91J2QgbmVlZCB0byBpbnN0YW50aWF0ZSovXG4vKiBgbWFrZVBhdHRlcm5LaXQoKWAgeW91cnNlbGYuIFNpbmNlIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZXh0ZXJuYWwqL1xuLyogdXNlcyBvZiBgZ2V0UmFua0NvdmVyYCwgZm9yIGNsYXJpdHkgZHVyaW5nIGRldmVsb3BtZW50LCBgbWFrZVBhdHRlcm5LaXRgKi9cbi8qIGlzIG5vdCBjdXJyZW50bHkgZXhwb3J0ZWQuKi9cbiAgICAgICBjb25zdCB7XG4gIGNoZWNrTWF0Y2hlcyxcbiAgbWF0Y2hlcyxcbiAgbXVzdE1hdGNoLFxuICBhc3NlcnRQYXR0ZXJuLFxuICBpc1BhdHRlcm4sXG4gIGdldFJhbmtDb3ZlcixcbiAgTSxcbiAga2luZE9mLFxuICBjb250YWluZXJIYXNTcGxpdCxcbn0gPSBtYWtlUGF0dGVybktpdCgpOyRozY9fb25jZS5jaGVja01hdGNoZXMoY2hlY2tNYXRjaGVzKTskaM2PX29uY2UubWF0Y2hlcyhtYXRjaGVzKTskaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7JGjNj19vbmNlLmFzc2VydFBhdHRlcm4oYXNzZXJ0UGF0dGVybik7JGjNj19vbmNlLmlzUGF0dGVybihpc1BhdHRlcm4pOyRozY9fb25jZS5nZXRSYW5rQ292ZXIoZ2V0UmFua0NvdmVyKTskaM2PX29uY2UuTShNKTskaM2PX29uY2Uua2luZE9mKGtpbmRPZik7JGjNj19vbmNlLmNvbnRhaW5lckhhc1NwbGl0KGNvbnRhaW5lckhhc1NwbGl0KTtcblxuTU0gPSBNO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEd1YXJkcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNLmF3YWl0KC4uLikqL1xuY29uc3QgQXdhaXRBcmdHdWFyZFBheWxvYWRTaGFwZSA9IGhhcmRlbih7XG4gIGFyZ0d1YXJkOiBNLnBhdHRlcm4oKSxcbn0pO1xuXG4gICAgICAgY29uc3QgQXdhaXRBcmdHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDphd2FpdEFyZ0d1YXJkJyk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7c3BlY2ltZW4gaXMgQXdhaXRBcmdHdWFyZH1cbiAqLyRozY9fb25jZS5Bd2FpdEFyZ0d1YXJkU2hhcGUoQXdhaXRBcmdHdWFyZFNoYXBlKTtcbiAgICAgICBjb25zdCBpc0F3YWl0QXJnR3VhcmQgPSBzcGVjaW1lbiA9PlxuICBtYXRjaGVzKHNwZWNpbWVuLCBBd2FpdEFyZ0d1YXJkU2hhcGUpOyRozY9fb25jZS5pc0F3YWl0QXJnR3VhcmQoaXNBd2FpdEFyZ0d1YXJkKTtcbmhhcmRlbihpc0F3YWl0QXJnR3VhcmQpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgQXdhaXRBcmdHdWFyZH1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEF3YWl0QXJnR3VhcmQgPSBzcGVjaW1lbiA9PiB7XG4gIG11c3RNYXRjaChzcGVjaW1lbiwgQXdhaXRBcmdHdWFyZFNoYXBlLCAnYXdhaXRBcmdHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0QXdhaXRBcmdHdWFyZChhc3NlcnRBd2FpdEFyZ0d1YXJkKTtcbmhhcmRlbihhc3NlcnRBd2FpdEFyZ0d1YXJkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IGFyZ1BhdHRlcm5cbiAqIEByZXR1cm5zIHtBd2FpdEFyZ0d1YXJkfVxuICovXG5jb25zdCBtYWtlQXdhaXRBcmdHdWFyZCA9IGFyZ1BhdHRlcm4gPT4ge1xuICAvKiogQHR5cGUge0F3YWl0QXJnR3VhcmR9ICovXG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOmF3YWl0QXJnR3VhcmQnLCB7XG4gICAgYXJnR3VhcmQ6IGFyZ1BhdHRlcm4sXG4gIH0pO1xuICBhc3NlcnRBd2FpdEFyZ0d1YXJkKHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKiBNLnJhdygpKi9cblxuY29uc3QgUmF3R3VhcmRQYXlsb2FkU2hhcGUgPSBNLnJlY29yZCgpO1xuXG4gICAgICAgY29uc3QgUmF3R3VhcmRTaGFwZSA9IE0ua2luZCgnZ3VhcmQ6cmF3R3VhcmQnKTskaM2PX29uY2UuUmF3R3VhcmRTaGFwZShSYXdHdWFyZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IGlzUmF3R3VhcmQgPSBzcGVjaW1lbiA9PiBtYXRjaGVzKHNwZWNpbWVuLCBSYXdHdWFyZFNoYXBlKTskaM2PX29uY2UuaXNSYXdHdWFyZChpc1Jhd0d1YXJkKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFJhd0d1YXJkID0gc3BlY2ltZW4gPT5cbiAgbXVzdE1hdGNoKHNwZWNpbWVuLCBSYXdHdWFyZFNoYXBlLCAncmF3R3VhcmQnKTtcblxuLyoqXG4gKiBAcmV0dXJucyB7UmF3R3VhcmR9XG4gKi8kaM2PX29uY2UuYXNzZXJ0UmF3R3VhcmQoYXNzZXJ0UmF3R3VhcmQpO1xuY29uc3QgbWFrZVJhd0d1YXJkID0gKCkgPT4gbWFrZVRhZ2dlZCgnZ3VhcmQ6cmF3R3VhcmQnLCB7fSk7XG5cbi8qIE0uY2FsbCguLi4pKi9cbi8qIE0uY2FsbFdoZW4oLi4uKSovXG5cbiAgICAgICBjb25zdCBTeW5jVmFsdWVHdWFyZFNoYXBlID0gTS5vcihSYXdHdWFyZFNoYXBlLCBNLnBhdHRlcm4oKSk7JGjNj19vbmNlLlN5bmNWYWx1ZUd1YXJkU2hhcGUoU3luY1ZhbHVlR3VhcmRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSA9IE0uYXJyYXlPZihTeW5jVmFsdWVHdWFyZFNoYXBlKTskaM2PX29uY2UuU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUoU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUpO1xuXG5jb25zdCBBcmdHdWFyZFNoYXBlID0gTS5vcihSYXdHdWFyZFNoYXBlLCBBd2FpdEFyZ0d1YXJkU2hhcGUsIE0ucGF0dGVybigpKTtcbiAgICAgICBjb25zdCBBcmdHdWFyZExpc3RTaGFwZSA9IE0uYXJyYXlPZihBcmdHdWFyZFNoYXBlKTskaM2PX29uY2UuQXJnR3VhcmRMaXN0U2hhcGUoQXJnR3VhcmRMaXN0U2hhcGUpO1xuXG5jb25zdCBTeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSBoYXJkZW4oe1xuICBjYWxsS2luZDogJ3N5bmMnLFxuICBhcmdHdWFyZHM6IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFxuICBvcHRpb25hbEFyZ0d1YXJkczogTS5vcHQoU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUpLFxuICByZXN0QXJnR3VhcmQ6IE0ub3B0KFN5bmNWYWx1ZUd1YXJkU2hhcGUpLFxuICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbn0pO1xuXG5jb25zdCBBc3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgY2FsbEtpbmQ6ICdhc3luYycsXG4gIGFyZ0d1YXJkczogQXJnR3VhcmRMaXN0U2hhcGUsXG4gIG9wdGlvbmFsQXJnR3VhcmRzOiBNLm9wdChBcmdHdWFyZExpc3RTaGFwZSksXG4gIHJlc3RBcmdHdWFyZDogTS5vcHQoU3luY1ZhbHVlR3VhcmRTaGFwZSksXG4gIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxufSk7XG5cbiAgICAgICBjb25zdCBNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9IE0ub3IoXG4gIFN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSxcbiAgQXN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSxcbik7JGjNj19vbmNlLk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlKE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IE1ldGhvZEd1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOm1ldGhvZEd1YXJkJyk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBNZXRob2RHdWFyZH1cbiAqLyRozY9fb25jZS5NZXRob2RHdWFyZFNoYXBlKE1ldGhvZEd1YXJkU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydE1ldGhvZEd1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIE1ldGhvZEd1YXJkU2hhcGUsICdtZXRob2RHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0TWV0aG9kR3VhcmQoYXNzZXJ0TWV0aG9kR3VhcmQpO1xuaGFyZGVuKGFzc2VydE1ldGhvZEd1YXJkKTtcblxuLyoqXG4gKiBAcGFyYW0geydzeW5jJ3wnYXN5bmMnfSBjYWxsS2luZFxuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBhcmdHdWFyZHNcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gW29wdGlvbmFsQXJnR3VhcmRzXVxuICogQHBhcmFtIHtTeW5jVmFsdWVHdWFyZH0gW3Jlc3RBcmdHdWFyZF1cbiAqIEByZXR1cm5zIHtNZXRob2RHdWFyZE1ha2VyfVxuICovXG5jb25zdCBtYWtlTWV0aG9kR3VhcmRNYWtlciA9IChcbiAgY2FsbEtpbmQsXG4gIGFyZ0d1YXJkcyxcbiAgb3B0aW9uYWxBcmdHdWFyZHMgPSB1bmRlZmluZWQsXG4gIHJlc3RBcmdHdWFyZCA9IHVuZGVmaW5lZCxcbikgPT5cbiAgaGFyZGVuKHtcbiAgICBvcHRpb25hbDogKC4uLm9wdEFyZ0d1YXJkcykgPT4ge1xuICAgICAgb3B0aW9uYWxBcmdHdWFyZHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYENhbiBvbmx5IGhhdmUgb25lIHNldCBvZiBvcHRpb25hbCBndWFyZHNgO1xuICAgICAgcmVzdEFyZ0d1YXJkID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBvcHRpb25hbCBhcmcgZ3VhcmRzIG11c3QgY29tZSBiZWZvcmUgcmVzdCBhcmdgO1xuICAgICAgcmV0dXJuIG1ha2VNZXRob2RHdWFyZE1ha2VyKGNhbGxLaW5kLCBhcmdHdWFyZHMsIG9wdEFyZ0d1YXJkcyk7XG4gICAgfSxcbiAgICByZXN0OiByQXJnR3VhcmQgPT4ge1xuICAgICAgcmVzdEFyZ0d1YXJkID09PSB1bmRlZmluZWQgfHwgRmFpbGBDYW4gb25seSBoYXZlIG9uZSByZXN0IGFyZ2A7XG4gICAgICByZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoXG4gICAgICAgIGNhbGxLaW5kLFxuICAgICAgICBhcmdHdWFyZHMsXG4gICAgICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICAgICAgICByQXJnR3VhcmQsXG4gICAgICApO1xuICAgIH0sXG4gICAgcmV0dXJuczogKHJldHVybkd1YXJkID0gTS51bmRlZmluZWQoKSkgPT4ge1xuICAgICAgLyoqIEB0eXBlIHtNZXRob2RHdWFyZH0gKi9cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOm1ldGhvZEd1YXJkJywge1xuICAgICAgICBjYWxsS2luZCxcbiAgICAgICAgYXJnR3VhcmRzLFxuICAgICAgICBvcHRpb25hbEFyZ0d1YXJkcyxcbiAgICAgICAgcmVzdEFyZ0d1YXJkLFxuICAgICAgICByZXR1cm5HdWFyZCxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0TWV0aG9kR3VhcmQocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfSk7XG5cbiAgICAgICBjb25zdCBJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBpbnRlcmZhY2VOYW1lOiBNLnN0cmluZygpLFxuICAgIG1ldGhvZEd1YXJkczogTS5yZWNvcmRPZihNLnN0cmluZygpLCBNZXRob2RHdWFyZFNoYXBlKSxcbiAgfSxcbiAge1xuICAgIGRlZmF1bHRHdWFyZHM6IE0ub3IoTS51bmRlZmluZWQoKSwgJ3Bhc3NhYmxlJywgJ3JhdycpLFxuICAgIHNsb3BweTogTS5ib29sZWFuKCksXG4gICAgc3ltYm9sTWV0aG9kR3VhcmRzOiBNLm1hcE9mKE0uc3ltYm9sKCksIE1ldGhvZEd1YXJkU2hhcGUpLFxuICB9LFxuKTskaM2PX29uY2UuSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUoSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSW50ZXJmYWNlR3VhcmRTaGFwZSA9IE0ua2luZCgnZ3VhcmQ6aW50ZXJmYWNlR3VhcmQnKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIEludGVyZmFjZUd1YXJkfVxuICovJGjNj19vbmNlLkludGVyZmFjZUd1YXJkU2hhcGUoSW50ZXJmYWNlR3VhcmRTaGFwZSk7XG4gICAgICAgY29uc3QgYXNzZXJ0SW50ZXJmYWNlR3VhcmQgPSBzcGVjaW1lbiA9PiB7XG4gIG11c3RNYXRjaChzcGVjaW1lbiwgSW50ZXJmYWNlR3VhcmRTaGFwZSwgJ2ludGVyZmFjZUd1YXJkJyk7XG59OyRozY9fb25jZS5hc3NlcnRJbnRlcmZhY2VHdWFyZChhc3NlcnRJbnRlcmZhY2VHdWFyZCk7XG5oYXJkZW4oYXNzZXJ0SW50ZXJmYWNlR3VhcmQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBNZXRob2RHdWFyZD59IFtNID0gUmVjb3JkPFByb3BlcnR5S2V5LCBNZXRob2RHdWFyZD5dXG4gKiBAcGFyYW0ge3N0cmluZ30gaW50ZXJmYWNlTmFtZVxuICogQHBhcmFtIHtNfSBtZXRob2RHdWFyZHNcbiAqIEBwYXJhbSB7eyBzbG9wcHk/OiBib29sZWFuLCBkZWZhdWx0R3VhcmRzPzogRGVmYXVsdEd1YXJkVHlwZSB9fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJbnRlcmZhY2VHdWFyZDxNPn1cbiAqL1xuY29uc3QgbWFrZUludGVyZmFjZUd1YXJkID0gKGludGVyZmFjZU5hbWUsIG1ldGhvZEd1YXJkcywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHsgc2xvcHB5ID0gZmFsc2UsIGRlZmF1bHRHdWFyZHMgPSBzbG9wcHkgPyAncGFzc2FibGUnIDogdW5kZWZpbmVkIH0gPVxuICAgIG9wdGlvbnM7XG4gIC8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgc3RyaW5nLWtleWVkIG1ldGhvZCBndWFyZHMgYXJlIHJlcHJlc2VudGVkIGluKi9cbiAgLyogYSBDb3B5UmVjb3JkLiBCdXQgc3ltYm9sLWtleWVkIG1ldGhvZHMgY2Fubm90IGJlLCBzbyB3ZSBwdXQgdGhvc2UgaW4gYSovXG4gIC8qIENvcHlNYXAgd2hlbiBwcmVzZW50LiovXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgTWV0aG9kR3VhcmQ+fSAqL1xuICBjb25zdCBzdHJpbmdNZXRob2RHdWFyZHMgPSB7fTtcbiAgLyoqIEB0eXBlIHtBcnJheTxbc3ltYm9sLCBNZXRob2RHdWFyZF0+fSAqL1xuICBjb25zdCBzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzID0gW107XG4gIGZvciAoY29uc3Qga2V5IG9mIG93bktleXMobWV0aG9kR3VhcmRzKSkge1xuICAgIGNvbnN0IHZhbHVlID0gbWV0aG9kR3VhcmRzWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoa2V5KV07XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzeW1ib2wnKSB7XG4gICAgICBzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyaW5nTWV0aG9kR3VhcmRzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgLyoqIEB0eXBlIHtJbnRlcmZhY2VHdWFyZH0gKi9cbiAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnZ3VhcmQ6aW50ZXJmYWNlR3VhcmQnLCB7XG4gICAgaW50ZXJmYWNlTmFtZSxcbiAgICBtZXRob2RHdWFyZHM6IHN0cmluZ01ldGhvZEd1YXJkcyxcbiAgICAuLi4oc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcy5sZW5ndGhcbiAgICAgID8geyBzeW1ib2xNZXRob2RHdWFyZHM6IG1ha2VDb3B5TWFwKHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMpIH1cbiAgICAgIDoge30pLFxuICAgIGRlZmF1bHRHdWFyZHMsXG4gIH0pO1xuICBhc3NlcnRJbnRlcmZhY2VHdWFyZChyZXN1bHQpO1xuICByZXR1cm4gLyoqIEB0eXBlIHtJbnRlcmZhY2VHdWFyZDxNPn0gKi8gKHJlc3VsdCk7XG59O1xuXG5jb25zdCBHdWFyZFBheWxvYWRTaGFwZXMgPSBoYXJkZW4oe1xuICAnZ3VhcmQ6YXdhaXRBcmdHdWFyZCc6IEF3YWl0QXJnR3VhcmRQYXlsb2FkU2hhcGUsXG4gICdndWFyZDpyYXdHdWFyZCc6IFJhd0d1YXJkUGF5bG9hZFNoYXBlLFxuICAnZ3VhcmQ6bWV0aG9kR3VhcmQnOiBNZXRob2RHdWFyZFBheWxvYWRTaGFwZSxcbiAgJ2d1YXJkOmludGVyZmFjZUd1YXJkJzogSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsXG59KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRMaW1pdHMiOlsiZGVmYXVsdExpbWl0cyJdLCJjaGVja01hdGNoZXMiOlsiY2hlY2tNYXRjaGVzIl0sIm1hdGNoZXMiOlsibWF0Y2hlcyJdLCJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiJdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIl0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiXSwiTSI6WyJNIl0sImtpbmRPZiI6WyJraW5kT2YiXSwiY29udGFpbmVySGFzU3BsaXQiOlsiY29udGFpbmVySGFzU3BsaXQiXSwiQXdhaXRBcmdHdWFyZFNoYXBlIjpbIkF3YWl0QXJnR3VhcmRTaGFwZSJdLCJpc0F3YWl0QXJnR3VhcmQiOlsiaXNBd2FpdEFyZ0d1YXJkIl0sImFzc2VydEF3YWl0QXJnR3VhcmQiOlsiYXNzZXJ0QXdhaXRBcmdHdWFyZCJdLCJSYXdHdWFyZFNoYXBlIjpbIlJhd0d1YXJkU2hhcGUiXSwiaXNSYXdHdWFyZCI6WyJpc1Jhd0d1YXJkIl0sImFzc2VydFJhd0d1YXJkIjpbImFzc2VydFJhd0d1YXJkIl0sIlN5bmNWYWx1ZUd1YXJkU2hhcGUiOlsiU3luY1ZhbHVlR3VhcmRTaGFwZSJdLCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSI6WyJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSJdLCJBcmdHdWFyZExpc3RTaGFwZSI6WyJBcmdHdWFyZExpc3RTaGFwZSJdLCJNZXRob2RHdWFyZFBheWxvYWRTaGFwZSI6WyJNZXRob2RHdWFyZFBheWxvYWRTaGFwZSJdLCJNZXRob2RHdWFyZFNoYXBlIjpbIk1ldGhvZEd1YXJkU2hhcGUiXSwiYXNzZXJ0TWV0aG9kR3VhcmQiOlsiYXNzZXJ0TWV0aG9kR3VhcmQiXSwiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUiOlsiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUiXSwiSW50ZXJmYWNlR3VhcmRTaGFwZSI6WyJJbnRlcmZhY2VHdWFyZFNoYXBlIl0sImFzc2VydEludGVyZmFjZUd1YXJkIjpbImFzc2VydEludGVyZmFjZUd1YXJkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACIAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAsCsWGzCQAAswkAACIAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwiLi9zcmMvbWVtby1yYWNlLmpzIiwiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZVByb21pc2VLaXQiLCJyYWNlUHJvbWlzZXMiXSwicmVleHBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCxtZW1vUmFjZTskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIixbJGjNj19hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsWyRozY9fYSA9PiAobWVtb1JhY2UgPSAkaM2PX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsJ25hbWUnLHt2YWx1ZTpcIm1ha2VQcm9taXNlS2l0XCJ9KTskaM2PX29uY2UubWFrZVByb21pc2VLaXQobWFrZVByb21pc2VLaXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyYWNlUHJvbWlzZXMsJ25hbWUnLHt2YWx1ZTpcInJhY2VQcm9taXNlc1wifSk7JGjNj19vbmNlLnJhY2VQcm9taXNlcyhyYWNlUHJvbWlzZXMpO1xuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSAqL1xuY29uc3QgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSA9IGdsb2JhbFRoaXMuSGFuZGxlZFByb21pc2UgfHwgUHJvbWlzZTtcblxuLyoqXG4gKiBtYWtlUHJvbWlzZUtpdCgpIGJ1aWxkcyBhIFByb21pc2Ugb2JqZWN0LCBhbmQgcmV0dXJucyBhIHJlY29yZFxuICogY29udGFpbmluZyB0aGUgcHJvbWlzZSBpdHNlbGYsIGFzIHdlbGwgYXMgc2VwYXJhdGUgZmFjZXRzIGZvciByZXNvbHZpbmdcbiAqIGFuZCByZWplY3RpbmcgaXQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vc3JjL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPn1cbiAqL1xuICAgICAgIGZ1bmN0aW9uIG1ha2VQcm9taXNlS2l0KCkge1xuICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCwgZXhlY3V0b3IgfSA9IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpO1xuXG4gIGNvbnN0IHByb21pc2UgPSBuZXcgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZShleGVjdXRvcik7XG5cbiAgcmV0dXJuIGhhcmRlbih7IHByb21pc2UsIHJlc29sdmUsIHJlamVjdCB9KTtcbn1cbmhhcmRlbihtYWtlUHJvbWlzZUtpdCk7XG5cbi8qIE5COiBBbm90aGVyIGltcGxlbWVudGF0aW9uIGZvciBQcm9taXNlLnJhY2Ugd291bGQgYmUgdG8gdXNlIHRoZSByZWxlYXNpbmcgZXhlY3V0b3IsKi9cbi8qIEhvd2V2ZXIgd2hpbGUgaXQgd291bGQgbm8gbG9uZ2VyIGxlYWsgdGhlIHJhY2VkIHByb21pc2Ugb2JqZWN0cyB0aGVtc2VsdmVzLCBpdCB3b3VsZCovXG4vKiBzdGlsbCBsZWFrIHJlYWN0aW9ucyBvbiB0aGUgbm9uLXJlc29sdmVkIHByb21pc2VzIGNvbnRlbmRpbmcgZm9yIHRoZSByYWNlLiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7cmVhZG9ubHkgdW5rbm93bltdIHwgW119IFRcbiAqIEBwYXJhbSB7VH0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUW251bWJlcl0+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIHJhY2VQcm9taXNlcyh2YWx1ZXMpIHtcbiAgcmV0dXJuIGhhcmRlbihtZW1vUmFjZS5jYWxsKEJlc3RQaXBlbGluYWJsZVByb21pc2UsIHZhbHVlcykpO1xufVxuaGFyZGVuKHJhY2VQcm9taXNlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZUtpdCI6WyJtYWtlUHJvbWlzZUtpdCJdLCJyYWNlUHJvbWlzZXMiOlsicmFjZVByb21pc2VzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOeuEJkDAwAAAwMAACsAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9pcy1wcm9taXNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpc1Byb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzUHJvbWlzZSwnbmFtZScse3ZhbHVlOlwiaXNQcm9taXNlXCJ9KTskaM2PX29uY2UuaXNQcm9taXNlKGlzUHJvbWlzZSk7LyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG1heWJlUHJvbWlzZSBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge21heWJlUHJvbWlzZSBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG4gICAgICAgZnVuY3Rpb24gaXNQcm9taXNlKG1heWJlUHJvbWlzZSkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSkgPT09IG1heWJlUHJvbWlzZTtcbn1cbmhhcmRlbihpc1Byb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcm9taXNlIjpbImlzUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADHaE2fRBYAAEQWAAAqAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBJbml0aWFsIHZlcnNpb24gYXV0aG9yZWQgYnkgQnJpYW4gS2ltOlxuaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8xNzQ2OSNpc3N1ZWNvbW1lbnQtNjg1MjE2Nzc3XG4gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbiBBbnlvbmUgaXMgZnJlZSB0byBjb3B5LCBtb2RpZnksIHB1Ymxpc2gsIHVzZSwgY29tcGlsZSwgc2VsbCwgb3JcbmRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgZWl0aGVyIGluIHNvdXJjZSBjb2RlIGZvcm0gb3IgYXMgYSBjb21waWxlZFxuYmluYXJ5LCBmb3IgYW55IHB1cnBvc2UsIGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwsIGFuZCBieSBhbnlcbm1lYW5zLlxuIEluIGp1cmlzZGljdGlvbnMgdGhhdCByZWNvZ25pemUgY29weXJpZ2h0IGxhd3MsIHRoZSBhdXRob3Igb3IgYXV0aG9yc1xub2YgdGhpcyBzb2Z0d2FyZSBkZWRpY2F0ZSBhbnkgYW5kIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlXG5zb2Z0d2FyZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0XG5vZiB0aGUgcHVibGljIGF0IGxhcmdlIGFuZCB0byB0aGUgZGV0cmltZW50IG9mIG91ciBoZWlycyBhbmRcbnN1Y2Nlc3NvcnMuIFdlIGludGVuZCB0aGlzIGRlZGljYXRpb24gdG8gYmUgYW4gb3ZlcnQgYWN0IG9mXG5yZWxpbnF1aXNobWVudCBpbiBwZXJwZXR1aXR5IG9mIGFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXNcbnNvZnR3YXJlIHVuZGVyIGNvcHlyaWdodCBsYXcuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Jcbk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLFxuQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SXG5PVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byA8aHR0cDovL3VubGljZW5zZS5vcmcvPlxuKi9cblxuXG5cblxuXG5cblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggYGlzUHJpbWl0aXZlYCB0aGF0J3MgY3VycmVudGx5IGluIGBAZW5kby9wYXNzLXN0eWxlYC5cbiAqIExheWVyaW5nIGNvbnN0cmFpbnRzIG1ha2UgdGhpcyB0cmlja3ksIHdoaWNoIGlzIHdoeSB3ZSBoYXZlbid0IHlldCBmaWd1cmVkXG4gKiBvdXQgaG93IHRvIGRvIHRoaXMuXG4gKlxuICogQHR5cGUgeyh2YWw6IHVua25vd24pID0+IHZhbCBpcyAodW5kZWZpbmVkXG4gKiB8IG51bGxcbiAqIHwgYm9vbGVhblxuICogfCBudW1iZXJcbiAqIHwgYmlnaW50XG4gKiB8IHN0cmluZ1xuICogfCBzeW1ib2wpfVxuICovXG5jb25zdCBpc1ByaW1pdGl2ZSA9IHZhbCA9PlxuICAhdmFsIHx8ICh0eXBlb2YgdmFsICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsICE9PSAnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gRGVmZXJyZWRcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlPzogSU1QT1JUKFwiLi90eXBlcy5qc1wiKS5FUmVmPFQ+ICkgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHByb3BlcnR5IHsoZXJyPzogYW55ICkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IG5ldmVyXG4gKiAgfCB7c2V0dGxlZDogZmFsc2UsIGRlZmVycmVkczogU2V0PERlZmVycmVkPn1cbiAqICB8IHtzZXR0bGVkOiB0cnVlLCBkZWZlcnJlZHM/OiB1bmRlZmluZWR9XG4gKiB9IFByb21pc2VNZW1vUmVjb3JkXG4gKi9cblxuLyogS2V5cyBhcmUgdGhlIHZhbHVlcyBwYXNzZWQgdG8gcmFjZSwgdmFsdWVzIGFyZSBhIHJlY29yZCBvZiBkYXRhIGNvbnRhaW5pbmcgYSovXG4vKiBzZXQgb2YgZGVmZXJyZWRzIGFuZCB3aGV0aGVyIHRoZSB2YWx1ZSBoYXMgc2V0dGxlZC4qL1xuLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgUHJvbWlzZU1lbW9SZWNvcmQ+fSAqL1xuY29uc3Qga25vd25Qcm9taXNlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlTWVtb1JlY29yZCB8IHVuZGVmaW5lZH0gcmVjb3JkXG4gKiBAcmV0dXJucyB7U2V0PERlZmVycmVkPn1cbiAqL1xuY29uc3QgbWFya1NldHRsZWQgPSByZWNvcmQgPT4ge1xuICBpZiAoIXJlY29yZCB8fCByZWNvcmQuc2V0dGxlZCkge1xuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cblxuICBjb25zdCB7IGRlZmVycmVkcyB9ID0gcmVjb3JkO1xuICBPYmplY3QuYXNzaWduKHJlY29yZCwge1xuICAgIGRlZmVycmVkczogdW5kZWZpbmVkLFxuICAgIHNldHRsZWQ6IHRydWUsXG4gIH0pO1xuICBPYmplY3QuZnJlZXplKHJlY29yZCk7XG4gIHJldHVybiBkZWZlcnJlZHM7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlTWVtb1JlY29yZH1cbiAqL1xuY29uc3QgZ2V0TWVtb1JlY29yZCA9IHZhbHVlID0+IHtcbiAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgIC8qIElmIHRoZSBjb250ZW5kZXIgaXMgYSBwcmltaXRpdmUsIGF0dGVtcHRpbmcgdG8gdXNlIGl0IGFzIGEga2V5IGluIHRoZSovXG4gICAgLyogd2Vha21hcCB3b3VsZCB0aHJvdyBhbiBlcnJvci4gTHVja2lseSwgaXQgaXMgc2FmZSB0byBjYWxsKi9cbiAgICAvKiBgUHJvbWlzZS5yZXNvbHZlKGNvbnRlbmRlcikudGhlbmAgb24gYSBwcmltaXRpdmUgdmFsdWUgbXVsdGlwbGUgdGltZXMqL1xuICAgIC8qIGJlY2F1c2UgdGhlIHByb21pc2UgZnVsZmlsbHMgaW1tZWRpYXRlbHkuIFNvIHdlIGZha2UgYSBzZXR0bGVkIHJlY29yZC4qL1xuICAgIHJldHVybiBoYXJkZW4oeyBzZXR0bGVkOiB0cnVlIH0pO1xuICB9XG5cbiAgbGV0IHJlY29yZCA9IGtub3duUHJvbWlzZXMuZ2V0KHZhbHVlKTtcblxuICBpZiAoIXJlY29yZCkge1xuICAgIHJlY29yZCA9IHsgZGVmZXJyZWRzOiBuZXcgU2V0KCksIHNldHRsZWQ6IGZhbHNlIH07XG4gICAga25vd25Qcm9taXNlcy5zZXQodmFsdWUsIHJlY29yZCk7XG4gICAgLyogVGhpcyBjYWxsIHRvIGB0aGVuYCBoYXBwZW5zIG9uY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgdmFsdWUuKi9cbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oXG4gICAgICB2YWwgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHsgcmVzb2x2ZSB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZXNvbHZlKHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnIgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHsgcmVqZWN0IH0gb2YgbWFya1NldHRsZWQocmVjb3JkKSkge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlY29yZDtcbn07XG5cbmNvbnN0IHsgcmFjZSB9ID0ge1xuICAvKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUge3JlYWRvbmx5IHVua25vd25bXSB8IFtdfSBUXG4gKiBAdGVtcGxhdGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gW1A9UHJvbWlzZUNvbnN0cnVjdG9yXVxuICogQHRoaXMge1B9XG4gKiBAcGFyYW0ge1R9IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbiAgcmFjZSh2YWx1ZXMpIHtcbiAgICBsZXQgZGVmZXJyZWQ7XG4gICAgLyoqIEB0eXBlIHtbLi4uVF19ICovXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBmaWxsZWQgYnkgdGhlIGxvb3AqL1xuICAgIGNvbnN0IGNhY2hlZFZhbHVlcyA9IFtdO1xuICAgIGNvbnN0IEMgPSB0aGlzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBDKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRlZmVycmVkID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgY29uc3QgeyBzZXR0bGVkLCBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoc2V0dGxlZCkge1xuICAgICAgICAgIC8qIElmIHRoZSBjb250ZW5kZXIgaXMgc2V0dGxlZCAoaW5jbHVkaW5nIHByaW1pdGl2ZXMpLCBpdCBpcyBzYWZlKi9cbiAgICAgICAgICAvKiB0byBjYWxsIGBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW5gIG9uIGl0LiovXG4gICAgICAgICAgQy5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qIFRoZSBmaW5hbGx5IGNhbGxiYWNrIGV4ZWN1dGVzIHdoZW4gYW55IHZhbHVlIHNldHRsZXMsIHByZXZlbnRpbmcgYW55IG9mKi9cbiAgICAvKiB0aGUgdW5yZXNvbHZlZCB2YWx1ZXMgZnJvbSByZXRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIHJlc29sdmVkIHZhbHVlLiovXG4gICAgcmV0dXJuIHJlc3VsdC5maW5hbGx5KCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgY2FjaGVkVmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IHsgZGVmZXJyZWRzIH0gPSBnZXRNZW1vUmVjb3JkKHZhbHVlKTtcbiAgICAgICAgaWYgKGRlZmVycmVkcykge1xuICAgICAgICAgIGRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG59OyRozY9fb25jZS5yYWNlKHJhY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWVtb1JhY2UiOlsicmFjZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAIn6hoHQgAAB0IAAA1AAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2FsbGJhY2sgUHJvbWlzZUV4ZWN1dG9yIFRoZSBwcm9taXNlIGV4ZWN1dG9yXG4gKiBAcGFyYW0geyh2YWx1ZTogSU1QT1JUKCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCkgYnVpbGRzIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyB3aGljaCBkcm9wIHJlZmVyZW5jZXNcbiAqIHRvIHRoZSByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgZ2F0aGVyZWQgZnJvbSBhbiBleGVjdXRvciB0byBiZSB1c2VkIHdpdGggYVxuICogcHJvbWlzZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1BpY2s8SU1QT1JUKCcuL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPiwgJ3Jlc29sdmUnIHwgJ3JlamVjdCc+ICYgeyBleGVjdXRvcjogUHJvbWlzZUV4ZWN1dG9yPFQ+fX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICgpID0+IHtcbiAgLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKCh2YWx1ZTogSU1QT1JUKCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZCl9ICovXG4gIGxldCBpbnRlcm5hbFJlc29sdmU7XG4gIC8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgocmVhc29uOiB1bmtub3duKSA9PiB2b2lkKX0gKi9cbiAgbGV0IGludGVybmFsUmVqZWN0O1xuXG4gIC8qKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD59IHZhbHVlICovXG4gIGNvbnN0IHJlc29sdmUgPSB2YWx1ZSA9PiB7XG4gICAgaWYgKGludGVybmFsUmVzb2x2ZSkge1xuICAgICAgaW50ZXJuYWxSZXNvbHZlKHZhbHVlKTtcbiAgICAgIGludGVybmFsUmVzb2x2ZSA9IG51bGw7XG4gICAgICBpbnRlcm5hbFJlamVjdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChpbnRlcm5hbFJlc29sdmUgPT09IG51bGwpO1xuICAgIH1cbiAgfTtcblxuICAvKiogQHBhcmFtIHt1bmtub3dufSByZWFzb24gKi9cbiAgY29uc3QgcmVqZWN0ID0gcmVhc29uID0+IHtcbiAgICBpZiAoaW50ZXJuYWxSZWplY3QpIHtcbiAgICAgIGludGVybmFsUmVqZWN0KHJlYXNvbik7XG4gICAgICBpbnRlcm5hbFJlc29sdmUgPSBudWxsO1xuICAgICAgaW50ZXJuYWxSZWplY3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoaW50ZXJuYWxSZWplY3QgPT09IG51bGwpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBleGVjdXRvciA9IChyZXMsIHJlaikgPT4ge1xuICAgIGFzc2VydChpbnRlcm5hbFJlc29sdmUgPT09IHVuZGVmaW5lZCAmJiBpbnRlcm5hbFJlamVjdCA9PT0gdW5kZWZpbmVkKTtcbiAgICBpbnRlcm5hbFJlc29sdmUgPSByZXM7XG4gICAgaW50ZXJuYWxSZWplY3QgPSByZWo7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IHJlc29sdmUsIHJlamVjdCwgZXhlY3V0b3IgfSk7XG59OyRozY9fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0IjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALOZ7ulEcAABRHAAAHQAAAEBlbmRvL3N0cmVhbS12MS4yLjEzL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIm1ha2VQaXBlIiwibWFrZVF1ZXVlIiwibWFrZVN0cmVhbSIsIm1hcFJlYWRlciIsIm1hcFdyaXRlciIsInByaW1lIiwicHVtcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsbWFrZVByb21pc2VLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIFR5cGVTY3JpcHQgUmVhZE9ubHkgc2VtYW50aWNzIGFyZSBub3Qgc3VmZmljaWVudGx5IGV4cHJlc3NpdmUgdG8gZGlzdGluZ3Vpc2gqL1xuLyogYSB2YWx1ZSBvbmUgcHJvbWlzZXMgbm90IHRvIGFsdGVyIGZyb20gYSB2YWx1ZSBvbmUgbXVzdCBub3QgYWx0ZXIsKi9cbi8qIG1ha2luZyBpdCB1c2VsZXNzLiovXG5jb25zdCBmcmVlemUgPSAvKiogQHR5cGUgezxUPih2OiBUIHwgUmVhZG9ubHk8VD4pID0+IFR9ICovIChPYmplY3QuZnJlZXplKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLkFzeW5jUXVldWU8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUXVldWUgPSAoKSA9PiB7XG4gIGxldCB7IHByb21pc2U6IHRhaWxQcm9taXNlLCByZXNvbHZlOiB0YWlsUmVzb2x2ZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgcmV0dXJuIHtcbiAgICBwdXQodmFsdWUpIHtcbiAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcHJvbWlzZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgIHRhaWxSZXNvbHZlKGZyZWV6ZSh7IHZhbHVlLCBwcm9taXNlIH0pKTtcbiAgICAgIHRhaWxSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB9LFxuICAgIGdldCgpIHtcbiAgICAgIGNvbnN0IHByb21pc2UgPSB0YWlsUHJvbWlzZS50aGVuKG5leHQgPT4gbmV4dC52YWx1ZSk7XG4gICAgICB0YWlsUHJvbWlzZSA9IHRhaWxQcm9taXNlLnRoZW4obmV4dCA9PiBuZXh0LnByb21pc2UpO1xuICAgICAgcmV0dXJuIGhhcmRlbihwcm9taXNlKTtcbiAgICB9LFxuICB9O1xufTskaM2PX29uY2UubWFrZVF1ZXVlKG1ha2VRdWV1ZSk7XG5oYXJkZW4obWFrZVF1ZXVlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmVhZFJldHVyblxuICogQHRlbXBsYXRlIFRXcml0ZVJldHVyblxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Bc3luY1NwcmluZzxJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJlYWRSZXR1cm4+Pn0gYWNrc1xuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Bc3luY1Npbms8SXRlcmF0b3JSZXN1bHQ8VFdyaXRlLCBUV3JpdGVSZXR1cm4+Pn0gZGF0YVxuICovXG4gICAgICAgY29uc3QgbWFrZVN0cmVhbSA9IChhY2tzLCBkYXRhKSA9PiB7XG4gIGNvbnN0IHN0cmVhbSA9IGhhcmRlbih7XG4gICAgLyoqXG4gKiBAcGFyYW0ge1RXcml0ZX0gdmFsdWVcbiAqL1xuICAgIG5leHQodmFsdWUpIHtcbiAgICAgIC8qIE5vdGUgdGhlIHNoYWxsb3cgZnJlZXplIHNpbmNlIHZhbHVlIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGZyZWV6YWJsZSovXG4gICAgICAvKiAodHlwZWQgYXJyYXlzIGFyZSBub3QpLiovXG4gICAgICBkYXRhLnB1dChmcmVlemUoeyB2YWx1ZSwgZG9uZTogZmFsc2UgfSkpO1xuICAgICAgcmV0dXJuIGFja3MuZ2V0KCk7XG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7VFdyaXRlUmV0dXJufSB2YWx1ZVxuICovXG4gICAgcmV0dXJuKHZhbHVlKSB7XG4gICAgICBkYXRhLnB1dChmcmVlemUoeyB2YWx1ZSwgZG9uZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm4gYWNrcy5nZXQoKTtcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqL1xuICAgIHRocm93KGVycm9yKSB7XG4gICAgICBkYXRhLnB1dChoYXJkZW4oUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG4gICAgICByZXR1cm4gYWNrcy5nZXQoKTtcbiAgICB9LFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufTskaM2PX29uY2UubWFrZVN0cmVhbShtYWtlU3RyZWFtKTtcbmhhcmRlbihtYWtlU3RyZWFtKTtcblxuLyogSlNEb2MgVHlwZVNjcmlwdCBzZWVtcyB1bmFibGUgdG8gZXhwcmVzcyB0aGlzIHBhcnRpY3VsYXIgZnVuY3Rpb24ncyovXG4vKiBlbnRhbmdsZW1lbnQgb2YgcXVldWVzLCBidXQgdGhlIGRlZmluaXRpb24gaW4gdHlwZXMuZC50cyB3b3JrcyBmb3IgdGhlIGVuZCovXG4vKiB1c2VyLiovXG4gICAgICAgY29uc3QgbWFrZVBpcGUgPSAoKSA9PiB7XG4gIGNvbnN0IGRhdGEgPSBtYWtlUXVldWUoKTtcbiAgY29uc3QgYWNrcyA9IG1ha2VRdWV1ZSgpO1xuICBjb25zdCByZWFkZXIgPSBtYWtlU3RyZWFtKGFja3MsIGRhdGEpO1xuICBjb25zdCB3cml0ZXIgPSBtYWtlU3RyZWFtKGRhdGEsIGFja3MpO1xuICByZXR1cm4gaGFyZGVuKFt3cml0ZXIsIHJlYWRlcl0pO1xufTskaM2PX29uY2UubWFrZVBpcGUobWFrZVBpcGUpO1xuaGFyZGVuKG1ha2VQaXBlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmVhZFJldHVyblxuICogQHRlbXBsYXRlIFRXcml0ZVJldHVyblxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5TdHJlYW08VFdyaXRlLCBUUmVhZCwgVFdyaXRlUmV0dXJuLCBUUmVhZFJldHVybj59IHdyaXRlclxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5TdHJlYW08VFJlYWQsIFRXcml0ZSwgVFJlYWRSZXR1cm4sIFRXcml0ZVJldHVybj59IHJlYWRlclxuICogQHBhcmFtIHtUV3JpdGV9IHByaW1lclxuICovXG4gICAgICAgY29uc3QgcHVtcCA9IGFzeW5jICh3cml0ZXIsIHJlYWRlciwgcHJpbWVyKSA9PiB7XG4gIC8qKiBAcGFyYW0ge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VFJlYWQsIFRSZWFkUmV0dXJuPj59IHByb21pc2UgKi9cbiAgY29uc3QgdGljayA9IHByb21pc2UgPT5cbiAgICBFLndoZW4oXG4gICAgICBwcm9taXNlLFxuICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHdyaXRlci5yZXR1cm4ocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiBCZWhvbGQ6IG11dHVhbCByZWN1cnNpb24uKi9cbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgICAgIHJldHVybiB0b2NrKHdyaXRlci5uZXh0KHJlc3VsdC52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKC8qKiBAdHlwZSB7RXJyb3J9ICovIGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuICAgICAgfSxcbiAgICApO1xuICAvKiogQHBhcmFtIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRXcml0ZSwgVFdyaXRlUmV0dXJuPj59IHByb21pc2UgKi9cbiAgY29uc3QgdG9jayA9IHByb21pc2UgPT5cbiAgICBFLndoZW4oXG4gICAgICBwcm9taXNlLFxuICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHJlYWRlci5yZXR1cm4ocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGljayhyZWFkZXIubmV4dChyZXN1bHQudmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgvKiogQHR5cGUge0Vycm9yfSAqLyBlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gcmVhZGVyLnRocm93KGVycm9yKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgYXdhaXQgdGljayhyZWFkZXIubmV4dChwcmltZXIpKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07JGjNj19vbmNlLnB1bXAocHVtcCk7XG5oYXJkZW4ocHVtcCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRSZWFkXG4gKiBAdGVtcGxhdGUgVFdyaXRlXG4gKiBAdGVtcGxhdGUgVFJldHVyblxuICogQHBhcmFtIHtBc3luY0dlbmVyYXRvcjxUUmVhZCwgVFJldHVybiwgVFdyaXRlPn0gZ2VuZXJhdG9yXG4gKiBAcGFyYW0ge1RXcml0ZX0gcHJpbWVyXG4gKi9cbiAgICAgICBjb25zdCBwcmltZSA9IChnZW5lcmF0b3IsIHByaW1lcikgPT4ge1xuICAvKiBXZSBjYXB0dXJlIHRoZSBmaXJzdCByZXR1cm5lZCBwcm9taXNlLiovXG4gIGNvbnN0IGZpcnN0ID0gZ2VuZXJhdG9yLm5leHQocHJpbWVyKTtcbiAgLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJldHVybj49fSAqL1xuICBsZXQgcmVzdWx0O1xuICBjb25zdCBwcmltZWQgPSBoYXJkZW4oe1xuICAgIC8qKiBAcGFyYW0ge1RXcml0ZX0gdmFsdWUgKi9cbiAgICBhc3luYyBuZXh0KHZhbHVlKSB7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBqZXNzaWUuanMvc2FmZS1hd2FpdC1zZXBhcmF0b3IqL1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBmaXJzdDtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdlbmVyYXRvci5uZXh0KHZhbHVlKTtcbiAgICB9LFxuICAgIC8qKiBAcGFyYW0ge1RSZXR1cm59IHZhbHVlICovXG4gICAgYXN5bmMgcmV0dXJuKHZhbHVlKSB7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBqZXNzaWUuanMvc2FmZS1hd2FpdC1zZXBhcmF0b3IqL1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBmaXJzdDtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdlbmVyYXRvci5yZXR1cm4odmFsdWUpO1xuICAgIH0sXG4gICAgLyoqIEBwYXJhbSB7RXJyb3J9IGVycm9yICovXG4gICAgYXN5bmMgdGhyb3coZXJyb3IpIHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGplc3NpZS5qcy9zYWZlLWF3YWl0LXNlcGFyYXRvciovXG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGZpcnN0O1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdlbmVyYXRvci50aHJvdyhlcnJvcik7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBwcmltZWQ7XG59OyRozY9fb25jZS5wcmltZShwcmltZSk7XG5oYXJkZW4ocHJpbWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUSW5cbiAqIEB0ZW1wbGF0ZSBUT3V0XG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRlcjxUSW4+fSByZWFkZXJcbiAqIEBwYXJhbSB7KHZhbHVlOiBUSW4pID0+IFRPdXR9IHRyYW5zZm9ybVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRlcjxUT3V0Pn1cbiAqL1xuICAgICAgIGNvbnN0IG1hcFJlYWRlciA9IChyZWFkZXIsIHRyYW5zZm9ybSkgPT4ge1xuICBhc3luYyBmdW5jdGlvbiogdHJhbnNmb3JtR2VuZXJhdG9yKCkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgcmVhZGVyKSB7XG4gICAgICB5aWVsZCB0cmFuc2Zvcm0odmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGhhcmRlbih0cmFuc2Zvcm1HZW5lcmF0b3IpO1xuICByZXR1cm4gaGFyZGVuKHRyYW5zZm9ybUdlbmVyYXRvcigpKTtcbn07JGjNj19vbmNlLm1hcFJlYWRlcihtYXBSZWFkZXIpO1xuaGFyZGVuKG1hcFJlYWRlcik7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRJblxuICogQHRlbXBsYXRlIFRPdXRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuV3JpdGVyPFRPdXQ+fSB3cml0ZXJcbiAqIEBwYXJhbSB7KHZhbHVlOiBUSW4pID0+IFRPdXR9IHRyYW5zZm9ybVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLldyaXRlcjxUSW4+fVxuICovXG4gICAgICAgY29uc3QgbWFwV3JpdGVyID0gKHdyaXRlciwgdHJhbnNmb3JtKSA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybWVkV3JpdGVyID0gaGFyZGVuKHtcbiAgICAvKipcbiAqIEBwYXJhbSB7VElufSB2YWx1ZVxuICovXG4gICAgYXN5bmMgbmV4dCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHdyaXRlci5uZXh0KHRyYW5zZm9ybSh2YWx1ZSkpO1xuICAgIH0sXG4gICAgLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICovXG4gICAgYXN5bmMgdGhyb3coZXJyb3IpIHtcbiAgICAgIHJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuICAgIH0sXG4gICAgLyoqXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gdmFsdWVcbiAqL1xuICAgIGFzeW5jIHJldHVybih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHdyaXRlci5yZXR1cm4odmFsdWUpO1xuICAgIH0sXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHRyYW5zZm9ybWVkV3JpdGVyO1xufTskaM2PX29uY2UubWFwV3JpdGVyKG1hcFdyaXRlcik7XG5oYXJkZW4obWFwV3JpdGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VRdWV1ZSI6WyJtYWtlUXVldWUiXSwibWFrZVN0cmVhbSI6WyJtYWtlU3RyZWFtIl0sIm1ha2VQaXBlIjpbIm1ha2VQaXBlIl0sInB1bXAiOlsicHVtcCJdLCJwcmltZSI6WyJwcmltZSJdLCJtYXBSZWFkZXIiOlsibWFwUmVhZGVyIl0sIm1hcFdyaXRlciI6WyJtYXBXcml0ZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7lv2v9EBAADRAQAAHAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL21haW4uanN7ImltcG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vcmluZzAvbWFpbi5qc1wiLCBbXV0sW1wiLi9yaW5nMS9tYWluLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPZgJeSBAQAAgQEAAB8AAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9FLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIkBlbmRvL2ZhciJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3oc4g/UDAAD1AwAALAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhc3luY0dlbmVyYXRlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogUmV0dXJuIGFuIGFzeW5jIGl0ZXJhYmxlIHRoYXQgcHJvZHVjZXMgaXRlcmF0b3IgcmVzdWx0cyB2aWEgYG5leHRgLlxuICpcbiAqIFRoaXMgd29ya3MgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIFN5bWJvbC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxUUmV0dXJuXG4gKiBAcGFyYW0geygpID0+IEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+IHxcbiAqICAgICAgICAgICAgICAgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj5cbiAqIH0gbmV4dCBwcm9kdWNlIGEgc2luZ2xlLXN0ZXAgaXRlcmF0b3IgcmVzdWx0XG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuICAgICAgIGNvbnN0IGFzeW5jR2VuZXJhdGUgPSBuZXh0ID0+IHtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6IGFzeW5jICgpID0+IGhhcmRlbihuZXh0KCkpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5hc3luY0dlbmVyYXRlKGFzeW5jR2VuZXJhdGUpO1xuaGFyZGVuKGFzeW5jR2VuZXJhdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNHZW5lcmF0ZSI6WyJhc3luY0dlbmVyYXRlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP56+f30AQAA9AEAACIAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWluLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyIsIi4vbWFrZXJzLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vRS5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiLCIuL21ha2Vycy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL0UuanNcIiwgW11dLFtcIi4vbWFrZXJzLmpzXCIsIFtdXSxbXCIuL2FzeW5jLWdlbmVyYXRlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMMZsXgzCQAAMwkAACQAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWtlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VNYXAiLCJtYWtlUHJvbWlzZSIsIm1ha2VTZXQiLCJtYWtlV2Vha01hcCIsIm1ha2VXZWFrU2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG4vKiBUaGVzZSB3b3JrIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBgbmV3YC4qL1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIiAvPiovXG5cbi8qKlxuICogQHR5cGUgezxUPihleGVjdXRvcjogKFxuICogICByZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWQsXG4gKiAgIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZFxuICogKSA9PiB2b2lkKSA9PiBQcm9taXNlPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVByb21pc2UgPSBleGVjdXRvciA9PiBoYXJkZW4obmV3IFByb21pc2UoZXhlY3V0b3IpKTskaM2PX29uY2UubWFrZVByb21pc2UobWFrZVByb21pc2UpO1xuaGFyZGVuKG1ha2VQcm9taXNlKTtcblxuLyoqIEB0eXBlZGVmIHs8SywgVj4oZW50cmllcz86IHJlYWRvbmx5IChyZWFkb25seSBbSywgVl0pW10pID0+IE1hcDxLLCBWPn0gTWFwRnJvbUVudHJpZXMgKi9cbi8qKiBAdHlwZWRlZiB7PEssIFY+KGl0ZXJhYmxlOiBJdGVyYWJsZTxyZWFkb25seSBbSywgVl0+KSA9PiBNYXA8SywgVj59IE1hcEZyb21JdGVyYWJsZSAqL1xuXG4vKiogQHR5cGUge01hcEZyb21FbnRyaWVzICYgTWFwRnJvbUl0ZXJhYmxlfSAqL1xuICAgICAgIGNvbnN0IG1ha2VNYXAgPSBlbnRyaWVzT3JJdGVyYWJsZSA9PiBoYXJkZW4obmV3IE1hcChlbnRyaWVzT3JJdGVyYWJsZSkpOyRozY9fb25jZS5tYWtlTWFwKG1ha2VNYXApO1xuaGFyZGVuKG1ha2VNYXApO1xuXG4vKiogQHR5cGVkZWYgezxUPih2YWx1ZXM/OiByZWFkb25seSBUW10pID0+IFNldDxUPn0gU2V0RnJvbVZhbHVlcyAqL1xuLyoqIEB0eXBlZGVmIHs8VD4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+KSA9PiBTZXQ8VD59IFNldEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtTZXRGcm9tVmFsdWVzICYgU2V0RnJvbUl0ZXJhYmxlfSAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXQgPSB2YWx1ZXMgPT4gaGFyZGVuKG5ldyBTZXQodmFsdWVzKSk7JGjNj19vbmNlLm1ha2VTZXQobWFrZVNldCk7XG5oYXJkZW4obWFrZVNldCk7XG5cbi8qKlxuICogQHR5cGVkZWYgezxLIGV4dGVuZHMge30sIFYgPSBhbnk+KFxuICogICAgZW50cmllcz86IHJlYWRvbmx5IFtLLCBWXVtdIHwgbnVsbFxuICogKSA9PiBXZWFrTWFwPEssIFY+fSBXZWFrTWFwRnJvbUVudHJpZXNcbiAqL1xuLyoqIEB0eXBlZGVmIHs8SyBleHRlbmRzIHt9LCBWPihpdGVyYWJsZTogSXRlcmFibGU8W0ssIFZdPikgPT4gV2Vha01hcDxLLCBWPn0gV2Vha01hcEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtXZWFrTWFwRnJvbUVudHJpZXMgJiBXZWFrTWFwRnJvbUl0ZXJhYmxlfSAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrTWFwID0gZW50cmllcyA9PiBoYXJkZW4obmV3IFdlYWtNYXAoZW50cmllcykpOyRozY9fb25jZS5tYWtlV2Vha01hcChtYWtlV2Vha01hcCk7XG5oYXJkZW4obWFrZVdlYWtNYXApO1xuXG4vKiogQHR5cGVkZWYgezxUIGV4dGVuZHMge30+KHZhbHVlcz86IHJlYWRvbmx5IFRbXSkgPT4gV2Vha1NldDxUPn0gV2Vha1NldEZyb21WYWx1ZXMgKi9cbi8qKiBAdHlwZWRlZiB7PFQgZXh0ZW5kcyB7fT4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+KSA9PiBXZWFrU2V0PFQ+fSBXZWFrU2V0RnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1dlYWtTZXRGcm9tVmFsdWVzICYgV2Vha1NldEZyb21JdGVyYWJsZX0gKi9cbiAgICAgICBjb25zdCBtYWtlV2Vha1NldCA9IHZhbHVlcyA9PiBoYXJkZW4obmV3IFdlYWtTZXQodmFsdWVzKSk7JGjNj19vbmNlLm1ha2VXZWFrU2V0KG1ha2VXZWFrU2V0KTtcbmhhcmRlbihtYWtlV2Vha1NldCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZSI6WyJtYWtlUHJvbWlzZSJdLCJtYWtlTWFwIjpbIm1ha2VNYXAiXSwibWFrZVNldCI6WyJtYWtlU2V0Il0sIm1ha2VXZWFrTWFwIjpbIm1ha2VXZWFrTWFwIl0sIm1ha2VXZWFrU2V0IjpbIm1ha2VXZWFrU2V0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGlUeF5SBQAAUgUAACkAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMS9hc3luYy10b29scy5qc3siaW1wb3J0cyI6WyIuLi9yaW5nMC9tYWluLmpzIl0sImV4cG9ydHMiOlsiYXN5bmNEb1doaWxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVByb21pc2U7JGjNj19pbXBvcnRzKFtbXCIuLi9yaW5nMC9tYWluLmpzXCIsIFtbXCJtYWtlUHJvbWlzZVwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogUmVzb2x2ZSByZXR1cm5lZCBwcm9taXNlIHdpdGggdW5kZWZpbmVkIHdoZW4gYGJvZHlgIHJldHVybnMgZmFsc3kuXG4gKlxuICogVGhpcyB3b3JrcyBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgYGF3YWl0YCBub3QgYXQgdGhlIGZ1bmN0aW9uLWxldmVsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFQgfCBQcm9taXNlPFQ+fSBib2R5IHBlcmZvcm0gc2lkZS1lZmZlY3RzLCBhbmQgcmV0dXJuIHRydXRoeSBpZlxuICogd2Ugc2hvdWxkIHJ1biBhZ2FpblxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbiAgICAgICBjb25zdCBhc3luY0RvV2hpbGUgPSBib2R5ID0+IHtcbiAgcmV0dXJuIG1ha2VQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBsb29wID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZG9Db250aW51ZSA9IGF3YWl0IGJvZHkoKTtcbiAgICAgIGlmICghZG9Db250aW51ZSkge1xuICAgICAgICAvKiBSZXNvbHZlIHRoZSBvdXRlcm1vc3QgcHJvbWlzZS4qL1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLyogRG8gdGhlIGxvb3AgYWdhaW4uICBXZSBhcmUgY2FyZWZ1bCBub3QgdG8gYXdhaXQgc28gdGhhdCB3ZSBkb24ndCBjcmVhdGUgYSovXG4gICAgICAvKiBwcm9taXNlIGNoYWluLiovXG4gICAgICBsb29wKCkuY2F0Y2gocmVqZWN0KTtcbiAgICB9O1xuXG4gICAgbG9vcCgpLmNhdGNoKHJlamVjdCk7XG4gIH0pO1xufTskaM2PX29uY2UuYXN5bmNEb1doaWxlKGFzeW5jRG9XaGlsZSk7XG5oYXJkZW4oYXN5bmNEb1doaWxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jRG9XaGlsZSI6WyJhc3luY0RvV2hpbGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAG2g3A5YBAACWAQAAIgAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL21haW4uanN7ImltcG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9hc3luYy10b29scy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAAJFkGxiyQgEAskIBABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAADGASPiNAQAAjQEAACAAAAAAAAAAAAAAAKSB5EIBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9oZWFwLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAAAAAAAAAAAAAKSBr0QBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAAATMwWR8wsAAPMLAAAkAAAAAAAAAAAAAACkgUxGAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2hlYXAuanNQSwECHgMKAAAAAAAAAAAAFW6x+nkCAAB5AgAAJQAAAAAAAAAAAAAApIGBUgEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAtTNWRIQMAACEDAAArAAAAAAAAAAAAAACkgT1VAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2lzLXBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAGwVpz8iBAAAIgQAACQAAAAAAAAAAAAAAKSBp1gBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMva2V5cy5qc1BLAQIeAwoAAAAAAAAAAACpG42q+g4AAPoOAAApAAAAAAAAAAAAAACkgQtdAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL21ha2Utb25jZS5qc1BLAQIeAwoAAAAAAAAAAAACATuUgBoAAIAaAAAyAAAAAAAAAAAAAACkgUxsAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3ByZXBhcmUtYXR0ZW51YXRvci5qc1BLAQIeAwoAAAAAAAAAAAAd2z2IchQAAHIUAAAxAAAAAAAAAAAAAACkgRyHAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAGC/2hirDQAAqw0AAC0AAAAAAAAAAAAAAKSB3ZsBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvd2F0Y2gtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAABsJLBqFgIAABYCAAAoAAAAAAAAAAAAAACkgdOpAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvem9uZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAOGDnYDnPAAA5zwAACYAAAAAAAAAAAAAAKSBL6wBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzUEsBAh4DCgAAAAAAAAAAAF/pvV56BQAAegUAACcAAAAAAAAAAAAAAKSBWukBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABDvXvZdAYAAHQGAAAnAAAAAAAAAAAAAACkgRnvAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanNQSwECHgMKAAAAAAAAAAAA819NA00CAABNAgAAIQAAAAAAAAAAAAAApIHS9QEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGg+kHPHPAAAxzwAACUAAAAAAAAAAAAAAKSBXvgBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pc3N1ZXJLaXQuanNQSwECHgMKAAAAAAAAAAAAVOfcJRMGAAATBgAAOgAAAAAAAAAAAAAApIFoNQIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABaHe9JJgYAACYGAAA6AAAAAAAAAAAAAACkgdM7AgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAABnzLX7PBgAAzwYAADYAAAAAAAAAAAAAAKSBUUICAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAA93DX//QcAAP0HAAA2AAAAAAAAAAAAAACkgXRJAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAMnLESlgFAABYBQAAIwAAAAAAAAAAAAAApIHFUQIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanNQSwECHgMKAAAAAAAAAAAA2CdIdr42AAC+NgAAKQAAAAAAAAAAAAAApIFeVwIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanNQSwECHgMKAAAAAAAAAAAAPiCeiZccAACXHAAAIQAAAAAAAAAAAAAApIFjjgIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3B1cnNlLmpzUEsBAh4DCgAAAAAAAAAAAL6roXInPQAAJz0AACEAAAAAAAAAAAAAAKSBOasCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9yYXRpby5qc1BLAQIeAwoAAAAAAAAAAABwLxbligcAAIoHAAAkAAAAAAAAAAAAAACkgZ/oAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvc2FmZU1hdGguanNQSwECHgMKAAAAAAAAAAAAYOSsWxkHAAAZBwAALQAAAAAAAAAAAAAApIFr8AIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAOX636tALQAAQC0AACYAAAAAAAAAAAAAAKSBz/cCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAAAAAAAAAAAAAKSBUyUDAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACl7EmvGwUAABsFAAArAAAAAAAAAAAAAACkgfAmAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29uc3RhbnRzLmpzUEsBAh4DCgAAAAAAAAAAACLoBfPFDAAAxQwAAD8AAAAAAAAAAAAAAKSBVCwDAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvYXNzZXJ0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAABi0T1+1BUAANQVAAA+AAAAAAAAAAAAAACkgXY5AwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qc1BLAQIeAwoAAAAAAAAAAABtReazuxIAALsSAABBAAAAAAAAAAAAAACkgaZPAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc1BLAQIeAwoAAAAAAAAAAADJNUggcRoAAHEaAABAAAAAAAAAAAAAAACkgcBiAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzUEsBAh4DCgAAAAAAAAAAAEvWdhq2SQAAtkkAAEEAAAAAAAAAAAAAAKSBj30DAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzUEsBAh4DCgAAAAAAAAAAAKaX7U68GwAAvBsAAEYAAAAAAAAAAAAAAKSBpMcDAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanNQSwECHgMKAAAAAAAAAAAAwRXEfxwmAAAcJgAAMgAAAAAAAAAAAAAApIHE4wMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJub3IuanNQSwECHgMKAAAAAAAAAAAAnW3DHeUuAADlLgAANQAAAAAAAAAAAAAApIEwCgQAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanNQSwECHgMKAAAAAAAAAAAA47HTKeExAADhMQAAMAAAAAAAAAAAAAAApIFoOQQAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0SGVscGVyLmpzUEsBAh4DCgAAAAAAAAAAALlkfWprCQAAawkAACcAAAAAAAAAAAAAAKSBl2sEAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAC3mGJdAxEAAAMRAAAqAAAAAAAAAAAAAACkgUd1BABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvcXVlc3Rpb24uanNQSwECHgMKAAAAAAAAAAAAm0DIbSxAAAAsQAAALAAAAAAAAAAAAAAApIGShgQAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIEIxwQAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAABpMRidJDAAASQwAACwAAAAAAAAAAAAAAKSBpcgEAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy92YWxpZGF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAABPKH3AXCwAAFwsAADIAAAAAAAAAAAAAAKSBONUEAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvYXVjdGlvbi91dGlsLmpzUEsBAh4DCgAAAAAAAAAAAMHVLgiHBQAAhwUAADEAAAAAAAAAAAAAAKSBn+AEAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvY29sbGVjdEZlZXMuanNQSwECHgMKAAAAAAAAAAAA8hw3+CAUAAAgFAAANQAAAAAAAAAAAAAApIF15gQAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9jb250cmFjdFN1cHBvcnQuanNQSwECHgMKAAAAAAAAAAAA+skIk0IJAABCCQAAMwAAAAAAAAAAAAAApIHo+gQAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9pbnRlcmVzdC1tYXRoLmpzUEsBAh4DCgAAAAAAAAAAAMGed6MoIQAAKCEAAC4AAAAAAAAAAAAAAKSBewQFAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvaW50ZXJlc3QuanNQSwECHgMKAAAAAAAAAAAAmlmXIuEQAADhEAAANwAAAAAAAAAAAAAApIHvJQUAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy92YXVsdEZhY3RvcnkvbWF0aC5qc1BLAQIeAwoAAAAAAAAAAADnjj3C4QgAAOEIAABEAAAAAAAAAAAAAACkgSU3BQBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ZhdWx0RmFjdG9yeS9vcmRlcmVkVmF1bHRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAAoxIy9Oi0AADotAAA5AAAAAAAAAAAAAACkgWhABQBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ZhdWx0RmFjdG9yeS9wYXJhbXMuanNQSwECHgMKAAAAAAAAAAAAJwNEmhgWAAAYFgAARAAAAAAAAAAAAAAApIH5bQUAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy92YXVsdEZhY3RvcnkvcHJpb3JpdGl6ZWRWYXVsdHMuanNQSwECHgMKAAAAAAAAAAAAblGAEDEZAAAxGQAAPQAAAAAAAAAAAAAApIFzhAUAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy92YXVsdEZhY3Rvcnkvc3RvcmVVdGlscy5qc1BLAQIeAwoAAAAAAAAAAAC1iHSn5nwAAOZ8AAA4AAAAAAAAAAAAAACkgf+dBQBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ZhdWx0RmFjdG9yeS92YXVsdC5qc1BLAQIeAwoAAAAAAAAAAADN4kWnl08AAJdPAABAAAAAAAAAAAAAAACkgTsbBgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ZhdWx0RmFjdG9yeS92YXVsdERpcmVjdG9yLmpzUEsBAh4DCgAAAAAAAAAAAOHN9LcdHQAAHR0AAD8AAAAAAAAAAAAAAKSBMGsGAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvdmF1bHRGYWN0b3J5L3ZhdWx0RmFjdG9yeS5qc1BLAQIeAwoAAAAAAAAAAABVg3jQ1xQAANcUAAA+AAAAAAAAAAAAAACkgaqIBgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ZhdWx0RmFjdG9yeS92YXVsdEhvbGRlci5qc1BLAQIeAwoAAAAAAAAAAAB2OmpnhAgAAIQIAAA7AAAAAAAAAAAAAACkgd2dBgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ZhdWx0RmFjdG9yeS92YXVsdEtpdC5qc1BLAQIeAwoAAAAAAAAAAACfqVj41J8AANSfAAA/AAAAAAAAAAAAAACkgbqmBgBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ZhdWx0RmFjdG9yeS92YXVsdE1hbmFnZXIuanNQSwECHgMKAAAAAAAAAAAABRgL3NksAADZLAAAJwAAAAAAAAAAAAAApIHrRgcAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NhbGxiYWNrLmpzUEsBAh4DCgAAAAAAAAAAAKM2T6b1BAAA9QQAACgAAAAAAAAAAAAAAKSBCXQHAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jbGktdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAbQ14FcoMAADKDAAAJQAAAAAAAAAAAAAApIFEeQcAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NvbmZpZy5qc1BLAQIeAwoAAAAAAAAAAACNvaYBrggAAK4IAAAkAAAAAAAAAAAAAACkgVGGBwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvZGVidWcuanNQSwECHgMKAAAAAAAAAAAAsZPVjl4DAABeAwAAJQAAAAAAAAAAAAAApIFBjwcAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2Vycm9ycy5qc1BLAQIeAwoAAAAAAAAAAABoHOwa/gQAAP4EAAAkAAAAAAAAAAAAAACkgeKSBwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAqtWvjaYlAACmJQAAJwAAAAAAAAAAAAAApIEimAcAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2pzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAACL1UtWsBwAArAcAACgAAAAAAAAAAAAAAKSBDb4HAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9rZXlNaXJyb3IuanNQSwECHgMKAAAAAAAAAAAApWwe9FUtAABVLQAALwAAAAAAAAAAAAAApIH/xQcAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNQSwECHgMKAAAAAAAAAAAAI0Vy+qcDAACnAwAANwAAAAAAAAAAAAAApIGh8wcAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvaW5hY2Nlc3NpYmxlLXZhbC5qc1BLAQIeAwoAAAAAAAAAAACkg8+esQMAALEDAAAwAAAAAAAAAAAAAACkgZ33BwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC9wdXJlLWRhdGEuanNQSwECHgMKAAAAAAAAAAAA1l0z3uU8AADlPAAANgAAAAAAAAAAAAAApIGc+wcAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzUEsBAh4DCgAAAAAAAAAAACvtEEXxDQAA8Q0AACsAAAAAAAAAAAAAAKSB1TgIAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRob2QtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAkP0geKBCAACgQgAAJgAAAAAAAAAAAAAApIEPRwgAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldHJpY3MuanNQSwECHgMKAAAAAAAAAAAAirla8rYOAAC2DgAAKwAAAAAAAAAAAAAApIHziQgAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL25hdHVyYWwtc29ydC5qc1BLAQIeAwoAAAAAAAAAAABPxCWXakgAAGpIAAAoAAAAAAAAAAAAAACkgfKYCABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvc2VzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAANHeDdCREgAAkRIAACwAAAAAAAAAAAAAAKSBouEIAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90ZXN0aW5nLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAANqI2yvWAwAA1gMAACUAAAAAAAAAAAAAAKSBffQIAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90bXBEaXIuanNQSwECHgMKAAAAAAAAAAAATmKnlqEEAAChBAAAKAAAAAAAAAAAAAAApIGW+AgAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVDaGVjay5qc1BLAQIeAwoAAAAAAAAAAACrfHXEowUAAKMFAAApAAAAAAAAAAAAAACkgX39CABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAAAAAAAAAAACkgWcDCQBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAA14cZPXAMAABwDAAAKgAAAAAAAAAAAAAApIEHBQkAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3VwZ3JhZGUtYXBpLmpzUEsBAh4DCgAAAAAAAAAAAD/hQTwZFAAAGRQAADMAAAAAAAAAAAAAAKSBvxEJAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAADCPu246wcAAOsHAAAkAAAAAAAAAAAAAACkgSkmCQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAs0n/TsUbAADFGwAAJwAAAAAAAAAAAAAApIFWLgkAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAABshF6MzQgAAM0IAACoAAAAAAAAAAAAAAKSBYEoJAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAAsSEQ3qgwAAKoMAAAuAAAAAAAAAAAAAACkgduMCQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAHrmTl4kJgAAJCYAACcAAAAAAAAAAAAAAKSB0ZkJAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc1BLAQIeAwoAAAAAAAAAAABkDr188ikAAPIpAAAoAAAAAAAAAAAAAACkgTrACQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlLmpzUEsBAh4DCgAAAAAAAAAAAFeqBJEpDQAAKQ0AACkAAAAAAAAAAAAAAKSBcuoJAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmVyLmpzUEsBAh4DCgAAAAAAAAAAAHfmSkaVBgAAlQYAACQAAAAAAAAAAAAAAKSB4vcJAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90b3BpYy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAAAAAAAAAAACkgbn+CQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAA3HPTPWAHAABgBwAALQAAAAAAAAAAAAAApIFZAAoAQGFnb3JpYy9ub3RpZmllci12MC42LjIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAEcacpNGDgAARg4AACEAAAAAAAAAAAAAAKSBBAgKAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAP0kYu4gsAAOILAAAsAAAAAAAAAAAAAACkgYkWCgBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc1BLAQIeAwoAAAAAAAAAAADbxEI1bQcAAG0HAAAwAAAAAAAAAAAAAACkgbUiCgBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNQSwECHgMKAAAAAAAAAAAA16FBRuoYAADqGAAAMQAAAAAAAAAAAAAApIFwKgoAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACmQkq1EREAABERAAAxAAAAAAAAAAAAAACkgalDCgBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAPk186ftFgAA7RYAADUAAAAAAAAAAAAAAKSBCVUKAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAJRapRtOEQAAThEAADUAAAAAAAAAAAAAAKSBSWwKAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAKpX7y7bGgAA2xoAAC4AAAAAAAAAAAAAAKSB6n0KAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIERmQoAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAAO31mJswAgAAMAIAABwAAAAAAAAAAAAAAKSBrpoKAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAtDNtlAolAAAKJQAAIwAAAAAAAAAAAAAApIEYnQoAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdGltZU1hdGguanNQSwECHgMKAAAAAAAAAAAANPYVxPMJAADzCQAAJQAAAAAAAAAAAAAApIFjwgoAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAAAAAAAAAAACkgZnMCgBAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAA2D1iULSwAAC0sAAAoAAAAAAAAAAAAAACkgTXOCgBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAM+c6+m2CAAAtggAACQAAAAAAAAAAAAAAKSBqPoKAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADvd74wOSMAADkjAAAwAAAAAAAAAAAAAACkgaADCwBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAACH1K2FIeAABSHgAAKAAAAAAAAAAAAAAApIEnJwsAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY2xlYW5Qcm9wb3NhbC5qc1BLAQIeAwoAAAAAAAAAAAChlkOZiREAAIkRAAA0AAAAAAAAAAAAAACkgb9FCwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzUEsBAh4DCgAAAAAAAAAAAGs4TXJnEwAAZxMAADkAAAAAAAAAAAAAAKSBmlcLAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qc1BLAQIeAwoAAAAAAAAAAABCPrHJjh0AAI4dAAA4AAAAAAAAAAAAAACkgVhrCwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qc1BLAQIeAwoAAAAAAAAAAAA3zta+MRQAADEUAAA1AAAAAAAAAAAAAACkgTyJCwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qc1BLAQIeAwoAAAAAAAAAAAC1mK84pggAAKYIAAAwAAAAAAAAAAAAAACkgcCdCwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAfM7hAasPAACrDwAAOgAAAAAAAAAAAAAApIG0pgsAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByZXBhcmUtb3duYWJsZS5qc1BLAQIeAwoAAAAAAAAAAADZyqtRiTUAAIk1AAA5AAAAAAAAAAAAAACkgbe2CwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanNQSwECHgMKAAAAAAAAAAAAaB/KruYLAADmCwAANQAAAAAAAAAAAAAApIGX7AsAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanNQSwECHgMKAAAAAAAAAAAAW9GqRWMpAABjKQAAMwAAAAAAAAAAAAAApIHQ+AsAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzUEsBAh4DCgAAAAAAAAAAACivpPrsBAAA7AQAADcAAAAAAAAAAAAAAKSBhCIMAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanNQSwECHgMKAAAAAAAAAAAAjRlUFwYGAAAGBgAANQAAAAAAAAAAAAAApIHFJwwAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanNQSwECHgMKAAAAAAAAAAAAYwjL1L8JAAC/CQAAMQAAAAAAAAAAAAAApIEeLgwAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3RvcGljcy5qc1BLAQIeAwoAAAAAAAAAAADBrlNwkz0AAJM9AAA1AAAAAAAAAAAAAACkgSw4DABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABFe/gZrAgAAKwIAAAlAAAAAAAAAAAAAACkgRJ2DABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9tYWtlSGFuZGxlLmpzUEsBAh4DCgAAAAAAAAAAAAHT9EtISwAASEsAACUAAAAAAAAAAAAAAKSBAX8MAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAA2fSTtJYBAACWAQAAHgAAAAAAAAAAAAAApIGMygwAQGFnb3JpYy96b25lLXYwLjIuMi9kdXJhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAIAyUsraEwAA2hMAACIAAAAAAAAAAAAAAKSBXswMAEBhZ29yaWMvem9uZS12MC4yLjIvc3JjL2R1cmFibGUuanNQSwECHgMKAAAAAAAAAAAA1jhUAsUBAADFAQAAHwAAAAAAAAAAAAAApIF44AwAQGVuZG8vY2FjaGUtbWFwLXYxLjEuMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACBle78JicAACYnAAAmAAAAAAAAAAAAAACkgXriDABAZW5kby9jYWNoZS1tYXAtdjEuMS4wL3NyYy9jYWNoZW1hcC5qc1BLAQIeAwoAAAAAAAAAAABvUSGPYQsAAGELAAAsAAAAAAAAAAAAAACkgeQJDQBAZW5kby9jb21tb24tdjEuMi4xMy9hcHBseS1sYWJlbGluZy1lcnJvci5qc1BLAQIeAwoAAAAAAAAAAABI+ELK3QUAAN0FAAArAAAAAAAAAAAAAACkgY8VDQBAZW5kby9jb21tb24tdjEuMi4xMy9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzUEsBAh4DCgAAAAAAAAAAALeVU+4lCAAAJQgAACUAAAAAAAAAAAAAAKSBtRsNAEBlbmRvL2NvbW1vbi12MS4yLjEzL2lkZW50LWNoZWNrZXIuanNQSwECHgMKAAAAAAAAAAAAYa/8argEAAC4BAAAJwAAAAAAAAAAAAAApIEdJA0AQGVuZG8vY29tbW9uLXYxLjIuMTMvbGlzdC1kaWZmZXJlbmNlLmpzUEsBAh4DCgAAAAAAAAAAACXsXfd5BAAAeQQAACsAAAAAAAAAAAAAAKSBGikNAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtYXJyYXktaXRlcmF0b3IuanNQSwECHgMKAAAAAAAAAAAAXTavegYDAAAGAwAAJQAAAAAAAAAAAAAApIHcLQ0AQGVuZG8vY29tbW9uLXYxLjIuMTMvbWFrZS1pdGVyYXRvci5qc1BLAQIeAwoAAAAAAAAAAAB256sZbwoAAG8KAAAiAAAAAAAAAAAAAACkgSUxDQBAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWFwLmpzUEsBAh4DCgAAAAAAAAAAAKiaINo7CQAAOwkAACcAAAAAAAAAAAAAAKSB1DsNAEBlbmRvL2NvbW1vbi12MS4yLjEzL29iamVjdC1tZXRhLW1hcC5qc1BLAQIeAwoAAAAAAAAAAADYs0GCmQUAAJkFAAAlAAAAAAAAAAAAAACkgVRFDQBAZW5kby9jb21tb24tdjEuMi4xMy90aHJvdy1sYWJlbGVkLmpzUEsBAh4DCgAAAAAAAAAAADSioamiAQAAogEAACIAAAAAAAAAAAAAAKSBMEsNAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAvAEzgjgWAAA4FgAALAAAAAAAAAAAAAAApIESTQ0AQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9zcmMvZW52LW9wdGlvbnMuanNQSwECHgMKAAAAAAAAAAAAamZ24mQNAABkDQAAHQAAAAAAAAAAAAAApIGUYw0AQGVuZG8vZXJyb3JzLXYxLjIuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA0+lGCBBHAAAQRwAAIwAAAAAAAAAAAAAApIEzcQ0AQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKQAAAAAAAAAAAAAApIGEuA0AQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAc5UxUnIUAAByFAAAJwAAAAAAAAAAAAAApIEjug0AQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL2xvY2FsLmpzUEsBAh4DCgAAAAAAAAAAAId4iLn0GAAA9BgAADUAAAAAAAAAAAAAAKSB2s4NAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzUEsBAh4DCgAAAAAAAAAAACkTVdnWBQAA1gUAACkAAAAAAAAAAAAAAKSBIegNAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAADMopI5XEgAAVxIAAC0AAAAAAAAAAAAAAKSBPu4NAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy90cmFjay10dXJucy5qc1BLAQIeAwoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAAAAAAAAAAACkgeAADgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC91dGlscy5qc1BLAQIeAwoAAAAAAAAAAADcRdmjYAIAAGACAAAaAAAAAAAAAAAAAACkgYUDDgBAZW5kby9leG8tdjEuNS4xMi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACxkxD/ECAAABAgAAAjAAAAAAAAAAAAAACkgR0GDgBAZW5kby9leG8tdjEuNS4xMi9zcmMvZXhvLW1ha2Vycy5qc1BLAQIeAwoAAAAAAAAAAAAVo/7rLkYAAC5GAAAiAAAAAAAAAAAAAACkgW4mDgBAZW5kby9leG8tdjEuNS4xMi9zcmMvZXhvLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAMkl2jYLBQAACwUAACYAAAAAAAAAAAAAAKSB3GwOAEBlbmRvL2V4by12MS41LjEyL3NyYy9nZXQtaW50ZXJmYWNlLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAAB4AAAAAAAAAAAAAAKSBK3IOAEBlbmRvL2V4by12MS41LjEyL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAgAAAAAAAAAAAAAACkgb9zDgBAZW5kby9mYXItdjEuMS4xNC9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAACpJtZQmAIAAJgCAAAeAAAAAAAAAAAAAACkgVV1DgBAZW5kby9mYXItdjEuMS4xNC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAdUZ/2QcIAAAHCAAAHQAAAAAAAAAAAAAApIEpeA4AQGVuZG8vbWFyc2hhbC12MS44LjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAYL9qqMl9AADJfQAAKgAAAAAAAAAAAAAApIFrgA4AQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAANXCc7oXRAAAF0QAACsAAAAAAAAAAAAAAKSBfP4OAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAADVNfjvRFAAD0RQAALQAAAAAAAAAAAAAApIHcQg8AQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAEJ0Fem+QgAAvkIAACoAAAAAAAAAAAAAAKSBG4kPAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAACrcYH4oQkAAKEJAAAtAAAAAAAAAAAAAACkgSHMDwBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAZViFtXw/AAB8PwAAIwAAAAAAAAAAAAAApIEN1g8AQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAgaK+MehZAADoWQAAJQAAAAAAAAAAAAAApIHKFRAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAhAAAAAAAAAAAAAACkgfVvEABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAA4xDdI0kMAABJDAAAHQAAAAAAAAAAAAAApIGMcRAAQGVuZG8vbmF0LXY1LjEuMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAbm7eczYLAAA2CwAAIAAAAAAAAAAAAAAApIEQfhAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAToVuIxUNAAAVDQAAKAAAAAAAAAAAAAAApIGEiRAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2J5dGVBcnJheS5qc1BLAQIeAwoAAAAAAAAAAACZp73SCAgAAAgIAAAoAAAAAAAAAAAAAACkgd+WEABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAAEcvuh1nCwAAZwsAACkAAAAAAAAAAAAAAKSBLZ8QAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAJ46wtPYGQAA2BkAAC4AAAAAAAAAAAAAAKSB26oQAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAassmRs0dAADNHQAAJAAAAAAAAAAAAAAApIH/xBAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAAHsGinp8CQAAfAkAACsAAAAAAAAAAAAAAKSBDuMQAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAoSeMyfQlAAD0JQAAJwAAAAAAAAAAAAAApIHT7BAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAJxSYGmDBQAAgwUAACkAAAAAAAAAAAAAAKSBDBMRAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAHwl6v3qIQAA6iEAADAAAAAAAAAAAAAAAKSB1hgRAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAmAo63Yj8AAGI/AAAqAAAAAAAAAAAAAACkgQ47EQBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAA+5yfsjAuAAAwLgAAKAAAAAAAAAAAAAAApIG4ehEAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAACHgA8oUhYAAFIWAAArAAAAAAAAAAAAAACkgS6pEQBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAPyo2QfbDwAA2w8AACUAAAAAAAAAAAAAAKSByb8RAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zdHJpbmcuanNQSwECHgMKAAAAAAAAAAAAAvc0IsMUAADDFAAAJQAAAAAAAAAAAAAApIHnzxEAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAABcuFDZZAkAAGQJAAAlAAAAAAAAAAAAAACkge3kEQBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAALddPVwmFgAAJhYAACkAAAAAAAAAAAAAAKSBlO4RAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAAAAAAAAAAAAAKSBAQUSAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAB1TZLc7w4AAO8OAAAeAAAAAAAAAAAAAACkgZsGEgBAZW5kby9wYXR0ZXJucy12MS43LjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAqiED6QtIAAALSAAAKgAAAAAAAAAAAAAApIHGFRIAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NoZWNrS2V5LmpzUEsBAh4DCgAAAAAAAAAAAP/bK5A/KAAAPygAAC0AAAAAAAAAAAAAAKSBGV4SAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1BLAQIeAwoAAAAAAAAAAAA0W1NjTRUAAE0VAAApAAAAAAAAAAAAAACkgaOGEgBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29weUJhZy5qc1BLAQIeAwoAAAAAAAAAAAAsI4MmLBEAACwRAAApAAAAAAAAAAAAAACkgTecEgBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29weVNldC5qc1BLAQIeAwoAAAAAAAAAAADbNZpAwyIAAMMiAAA5AAAAAAAAAAAAAACkgaqtEgBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAmcQ4AVcoAABXKAAANQAAAAAAAAAAAAAApIHE0BIAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAdB+PGWUvAABlLwAANQAAAAAAAAAAAAAApIFu+RIAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAXRpaQisvAAArLwAANgAAAAAAAAAAAAAApIEmKRMAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzUEsBAh4DCgAAAAAAAAAAAGak7nu+MgEAvjIBADUAAAAAAAAAAAAAAKSBpVgTAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACIAAAAAAAAAAAAAAKSBtosUAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAACwKxYbMJAACzCQAAIgAAAAAAAAAAAAAApIFOjRQAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADnrhCZAwMAAAMDAAArAAAAAAAAAAAAAACkgUGXFABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAMdoTZ9EFgAARBYAACoAAAAAAAAAAAAAAKSBjZoUAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAAAIn6hoHQgAAB0IAAA1AAAAAAAAAAAAAACkgRmxFABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAAAAAAAAAAACkgYm5FABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAs5nu6URwAAFEcAAAdAAAAAAAAAAAAAACkgSW7FABAZW5kby9zdHJlYW0tdjEuMi4xMy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADuW/a/0QEAANEBAAAcAAAAAAAAAAAAAACkgbHXFABqZXNzaWUuanMtdjAuMy40L3NyYy9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAPZgJeSBAQAAgQEAAB8AAAAAAAAAAAAAAKSBvNkUAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL0UuanNQSwECHgMKAAAAAAAAAAAA3oc4g/UDAAD1AwAALAAAAAAAAAAAAAAApIF62xQAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanNQSwECHgMKAAAAAAAAAAAA/nr5/fQBAAD0AQAAIgAAAAAAAAAAAAAApIG53xQAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAADDGbF4MwkAADMJAAAkAAAAAAAAAAAAAACkge3hFABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAaVR4XlIFAABSBQAAKQAAAAAAAAAAAAAApIFi6xQAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAG2g3A5YBAACWAQAAIgAAAAAAAAAAAAAApIH78BQAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvbWFpbi5qc1BLBQYAAAAAzwDPAChIAADR8hQAAAA=","endoZipBase64Sha512":"257673ad1cadc4d0eab609f05ace2dc1d5ca308e7e6d7029cf2073878251a860df87373159eb1107e599b4acadeb12e06ffe620a5ec9cf7a4e7e6a0dd86b8aaa"};
|