@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.
Files changed (30) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/package.json +17 -17
  3. package/scripts/bundles/bundle-binaryVoteCounter-js-meta.json +0 -790
  4. package/scripts/bundles/bundle-binaryVoteCounter.js +0 -1
  5. package/scripts/bundles/bundle-committee-js-meta.json +0 -810
  6. package/scripts/bundles/bundle-committee.js +0 -1
  7. package/scripts/bundles/bundle-contractGovernor-js-meta.json +0 -805
  8. package/scripts/bundles/bundle-contractGovernor.js +0 -1
  9. package/scripts/bundles/bundle-econCommitteeCharter-js-meta.json +0 -765
  10. package/scripts/bundles/bundle-econCommitteeCharter.js +0 -1
  11. package/scripts/bundles/bundle-feeDistributor-js-meta.json +0 -770
  12. package/scripts/bundles/bundle-feeDistributor.js +0 -1
  13. package/scripts/bundles/bundle-fluxAggregatorKit-js-meta.json +0 -960
  14. package/scripts/bundles/bundle-fluxAggregatorKit.js +0 -1
  15. package/scripts/bundles/bundle-mintHolder-js-meta.json +0 -740
  16. package/scripts/bundles/bundle-mintHolder.js +0 -1
  17. package/scripts/bundles/bundle-priceAggregator-js-meta.json +0 -990
  18. package/scripts/bundles/bundle-priceAggregator.js +0 -1
  19. package/scripts/bundles/bundle-provisionPool-js-meta.json +0 -915
  20. package/scripts/bundles/bundle-provisionPool.js +0 -1
  21. package/scripts/bundles/bundle-psm-js-meta.json +0 -980
  22. package/scripts/bundles/bundle-psm.js +0 -1
  23. package/scripts/bundles/bundle-reserve-js-meta.json +0 -975
  24. package/scripts/bundles/bundle-reserve.js +0 -1
  25. package/scripts/bundles/bundle-scaledPriceAuthority-js-meta.json +0 -880
  26. package/scripts/bundles/bundle-scaledPriceAuthority.js +0 -1
  27. package/scripts/bundles/bundle-vaultFactory-js-meta.json +0 -1045
  28. package/scripts/bundles/bundle-vaultFactory.js +0 -1
  29. package/scripts/bundles/bundle-walletFactory-js-meta.json +0 -990
  30. package/scripts/bundles/bundle-walletFactory.js +0 -1
@@ -1 +0,0 @@
1
- export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAAz35ZPQygBAEMoAQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICJtb2R1bGUiOiAiLi9zcmMvcHJpY2UvZmx1eEFnZ3JlZ2F0b3JDb250cmFjdC5qcyIKICB9LAogICJjb21wYXJ0bWVudHMiOiB7CiAgICAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2Jhc2Utem9uZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4byI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjEuNS4xMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2hlYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaGVhcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMyZmM5NmFlMmZlMDg2NmU2N2Q3YTI4NmI1MjM0MzE5NThlZGRhNjZlNjAwYjJiYzRjNDVjZmMxZDJjNjIxZjY0NDAzZmEwMmFiNTVhZjY3NzA4N2YyMjYwZDJiNGU2ZDY1ZDM2NmY5ODc4YWRlNTk2N2U5ZTA5YTVmNjYyOGRhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTFlMDNmNmM1MjBlN2M4MzdiZTE2MWZmN2RlNmU2Mjk2MzI2NzUwZWU4YTM5OTQ0ODVhOWZlODdhODM1OTc0Y2JlNmI1NWU1M2ZmZWE5ZjlmYjUzNzNhOWEzZjJmMGNhNjkzNjhmYjAyMWU4NmUwMDBkYWVhZDQ4MzhiZTA0MDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDViYTc5MTUzZGI4ODNkZWEwODA4YTkwNjM2ZDcxNmRmMDM0YTcwNmI3Zjg1ZGFkMzc3NzMyODUwOWFjNmZkZjllOTU0YWNmOTk5OTkzMDk1NzRmMTNjM2Y3YWNjOTYxMDM5Yjk0NDliODM1ODQzZGQ5ZDk5NDU1M2FkNzcwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjFlYWY3MTI4Y2U3MWM5ZDU1ZjkwMTQwYTEyZDYyMWNhM2U4NWZjNTc1MWZjZTI0YmVmYmI0MjY5MzM2YTNkYzNjMjVlMDhmMGJjNTU5YzBjMzI4OGZhOTg2MDg3YTMyMWMwYTE4NDJhYTA1YTc3NWQyMTEwZjY4NDQ3ZDU3YWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE4OWUyMzk0ZjdkYTFkYjc3NGJiN2VkMDMxODc0MDU4MzRkNzE4MDU1YzEyZGNjNWZhZTE1MTA2ZDIyNjg2YjU2YzM1ODgxOTY5NzMwNzgzNzQ5MzA5MTRkNDQ4NDNiMTc4ZTgwMGRlNDI5NGQ5NDQ3ZWNhZjkyNTQxY2RmYzhjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2Utb25jZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1vbmNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWJmODllMjM4ZWM5NmY4NWQ0NTI5NzhmZmZmNzRiOWM1OWJhZjExMzA2MDY5ZjI2NjFjNDNhMGMyYTVkMTk1ZDY3MGQxZGZjNmIwOWVlNmM3NTQ5Y2U4YTFjNTliN2Y0YWI3MzZlM2ZjMzMwM2E4ZDNlZTk2ZmMxNDk2ZDczYzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJlcGFyZS1hdHRlbnVhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcmVwYXJlLWF0dGVudWF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NzI3NjdmZGRkYzU5YTA4OWE5NzAyNGY0Y2M0ZTEyNmE5ZDM3NGM5Y2M0MjRiODE1M2ViZjMzYzY1YTNkNTI5MWEyN2I2YjJiZWMxMzViMmU1NWNhOGEwZDE5ODZhNWE5MzBjZDNlZmNjMDMyMzI3ZGJlMjc5MTgyMTdkYzg1OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcmVwYXJlLXJldm9jYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJlcGFyZS1yZXZvY2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NWQ3ZGFjNGE1ODhhZjQ5ODhkZGVjN2E4Zjg5YTE1ZmQyZTZhYzAxMmY4MmYwM2MzZmE1MTdkOGQ3ZTZlMjhkMGRmMzU3ZmNhZTQ1ZjlmMGRlYTRmMzVlYWU3OTM4OTk0NmFkYTQ0ODJiZDRlZDM1ODM4MGE5MDJkYjE1ZjVhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93YXRjaC1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy93YXRjaC1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWM2NWJiNTVmZWQ4NGVlOWQ1NjgxMTA3Y2Q2MTcwYWUyYjdiYTI1YmNjMTVjYWY0YzViOTA5YjIxZmFmYzU4ZDI4ODRmNjFhZTI2ZDU5NzY2NjA4MDg5ZGU3ODM1MGZjN2UzMzRmNTYyYWIzY2Q0ZmE2YWE1MmVlZGRkZDdlNGQiCiAgICAgICAgfSwKICAgICAgICAiLi96b25lLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiem9uZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTFmYjk1N2FiMjM2ZjdjOTNjMzk5ZDZiODk4MzY5ZmYxMjMwYWEwN2EwOWZlZmVhYTQ1NDk3ZjRjNjc3Yjk3YmJlZjQxMGRjODg5NWEwM2ZjYmE2NWI0YmM1MTYzZWY0MmEzMjc4Zjc3MGYyNjcwYTU2ZTg5M2Y0ZWZiZTM5ZWQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZXJ0cC12MC4xNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2VydHAiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZHVyYWJsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hbW91bnRNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hbW91bnRNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmRiNGZiN2EyODAwYWE3NWE4YzFhYmYxYzlkYjZmOWNiYTgwODdhNjk1YWNjMWU0MWQ0N2VkNzQ3YWQyMWFiMjQ4MzhiYjZiMGFhMWU0NzM1MjQyZmVkMzlmMjI1MDhkZTc3YTZhMjAyNzU5M2Q4MWZhMzU1YjRmZWRkNWU5ZmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGUwYWE4MDkxMmU0NWY0OThlYTczNmNhMTRiY2U4ODYyYjBkNGZiZTMwYjg1M2FkNGQ5NzMyYzZkYjlkNGYyODk3ZmU0ZmI2NjQwNWUzOTgwNzE4ZTZmNDViYWU4YzM1ODMwYmU2YTRmODA4NmY5ZmJjMTc2ZGM1ZTFlYjhmY2MiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGlzcGxheUluZm8uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Rpc3BsYXlJbmZvLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWZhZjdiOTIxMjk1NWUwY2NlNWE4ZjUxNWE3NWE1YmViZDYxYmY3ZmE4NTU0OTVlYTA0YmIyMjU1MDE4MjY1N2MwODIwZDA3MWRlM2VkMjhhNzZmZGQwZjY5NDlkYTE5ZDQwZjkyZGRkODRmMGRlYzJiZmFkMzU5MDQ4ZDc3MGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmFlNDYxZTA2YWE3OTQxMGVhYTcwZTE2NWMzNTQxNjdlZGFlNzUzNGJlOTI3MGFjNDU2ZmQ3OTI3MGJmN2Q4Y2IyMDYxNDAxMmM1MjgzMzUyYzgyNDJkYTE3ZWM1YWE3N2ZlMDJlZGQ3N2Y5ZjliMTU5MTk1MTlkYWNmZDQ5YTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXNzdWVyS2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pc3N1ZXJLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNTVlNWExZjk5YzJkNDhmYjIzMzc3NzBjMzg4NzA5NWY2MzdkOWRhYzY5OTFhZDRhZjc1NzA4MTdjNjYwNDc1Nzk0NWM4Zjg4NTI4N2ZkNWZkMzYwNDA2MGVlZTYxOGI2OTdkMTIxMjQ1N2RhNzFkMzA5ZThiMmZlMzQ5OWVmNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhMDk4YzRhZTBiOGM1YTE5MDM0NWRlMzAwMjVhYjdkN2Q1MGE2OTRmMzViMTAxYzhiYzg2YWU5MjE5NTdjNzZkMzJjZWVhNTYzOTg5NmNmMjQ5OWU4OWQwZGYwNjg4Mjk5YWMxMDc1MjllMWZkZWE1NGVjZDU4YTNiZjFiODY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTljMTRlY2UyZjk5NjI0OTVjZmE2ODNlZTllYmY0Mjg4ZThlMDE2MmIzNWJiZGI2ZWMzNzk4M2Y1ZTkxZmE4YWIwZTIyMWQyNzVmYzkxZWI3ZjEyNGNjN2QwODM3ZTdjYzgxM2I4NzNlYzFkMWMzMGU1NmM5N2UwZmFkZjI3NjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjIzYzYzZDEzNzYyZjA0OTRhMGM4NzMwMWJhYzZlMTQ4YTZlNzc1NmEzYTIxY2MxMWE3ZWY4YTZiOGM4YzFhMmZhMDgyOGIzM2IzNzFkM2Y2MGMyOTNhZDczZDU0NmI5OWMwY2E1ODFjNWEyYjUzMTQ0MWNmYmQ4NmQwM2UzZjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWM1NzQ2OTE2YjRjZGZmMTgzOGU4MWM0NmIzZDE5NDM4OThjOWI2ZjhjMjMwYjZhYWRkOTI5ZWVjMmU2NDk0ZDVkYmU3Mzk5ZTFmNWY2ZDIxZWNlYTIyNmM2ODAyODVkNDJkNzllZjEwYjg4MTg2MWVhNGE5NmVhYTM2M2I4Y2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY5NzVhNDdjOThkZmRiOTI3YzgwMTg2ZjhhN2NiMjI2ZjY0MmQ2MDNiMzQwMzE2Zjk0Y2EyZWRjMzU2Zjk0ZDliYmZkNjkzODcxYTg1NTljNGE2Yzk4YTZiOGJiNWM4YzM1NzI1YzkwYTU4ZmUzMTNlMjI1MGVmNWNiYTY4NmYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnRMZWRnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnRMZWRnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNmUwMjY4YWU0OWE2YjZkMGEyMmFhZjFjZGFiMWFmNTQ2MjE1OWNlOTZlOWUzY2RiMjVlMTMzZjIzOWM1N2Y4Y2I1NDgyMjQ1NGIyZjRiMTFjMTE0M2I1Njc5ZDUxODM3ZWY0YjIwNGVhMTM5M2NiODgyZGNlNjc0MDUyYzc1MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wdXJzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHVyc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNzAzNGY3NTgwOTcwMzkyMjEwMzhkZjY5ZmM1ZjY5MDExYTUxMmU4NzhiZTc2NWZjZDNiYmJjMTMzODUxZTBmOGM0OGY0MzVmMDdlZWFmNGQ5YTY4MzM5YjU1OGZiOWYzZGRjMjgzNjMyNDdlYzI2YTIyYWQyMjRiYTEyMDVmOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYXRpby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmF0aW8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MGYxZjc1ZTRmZGYyYjk3ZDU1YWEwZjlkYTNhYjQ0YTJmYTlhMjlmN2RlZmQ5ODkzYWU0ZjdjZGU2NTdjMWZkMzg1ZWFmMDNlYmQ3ODg5YTkyNTk3ZGY5YmZlMThkZTg0NGJiMmEyMWNiYWI0ZGNkNWFkODE1YzRiYWQyZDM3NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYmEzYTIxZWQ2ZmRmMGY1ZDRhZTE3NWJiNTk2MzNkMmFkNWE0ODAzY2UwMzk1YmU4MWRhY2E5MTNhYjkxOTM4NDc2MGMxMTkwNWU2YmE2YzhlZWVmMmFmZDNkNmNkYTZmZjAzZWEzZDMzZWY2YzQ1ZTE4NTY1YTFjMzRlYWJkZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFuc2llbnROb3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MThlOWE0NWI4ZjVkODZkMzc5ZGQwZjI5YTJiZGRiMTQ0N2NlMzI4OWU1MWVhYTk2ZmY2NTllYjE0OGNlNzljNTIxNWM2NDk4MzNjMTlkYTI5MWUzYjI3MWFhOTgwYmE2NTBmNWU5MGVlYTM2YmNiZmJjYjYzNWVhNDdlYjU0ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2U4MGE3YWMwMTU4NDIzNzlhNDMzMTQ3NDA3ZjdmYzdkYzM4OTg1ZDg2YzZkYTQ5NWMwZjE4NDkwZTBiNzkwNjFjOTVkY2IxODE5YWNkZjQzZDU5NGVhY2MxNmNhODNmYTE4MmNjMDVhZDQ3MWZlMmE3YjMzOTc0MjhmNWNkNzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2dvdmVybmFuY2UiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3JhdGlvLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NsZWFuUHJvcG9zYWwuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NsZWFuUHJvcG9zYWwuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFrZUhhbmRsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uc3RhbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25zdGFudHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3Yzc1ZDFmYWU3YTFkZmFlZjA2ODZjOTI5Yzg5OTVhNDMzYzMxZmFkNjVjMGFiMDY2NDBjNGUzYmJiYzZhODYwYjM0ZWJhODJhNzhkYzFkZmZhYWQyOTQ4YzFmZjY2ODU5NDkwZjViOTI0YWZlZmVjYjc5Y2Y2MzIzYWE5ODJjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvYXNzZXJ0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2Fzc2VydGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMDI4MGFjZjEwN2ExNTQ1NGE1MWNhZGYwN2JlYzIwY2I1MzkzNWRlNzRhYmY2ZmUzMzAzMTViOGQzZWI1NDNlZjEyMTQzZGY0ODcxMDIwYWQwMmQxZjVkZjFiYzc5M2Y0MzYwOTJiZTA1MTMwYmY3OGNhYjVjOWRiZjJjYmQ0MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDNjMDA2NmRjN2E4Zjc0MWUyOWE4NzE0MWU0MTlhNDQyNjFmOTc0MzkyZDBiZGFjMGMxZmM1NDIwZTcxNmIzODI2YzBkM2I1Zjc2NDU0ZTg3YTgyNDg1NDc2NTQzMGVkMjZlZGI0NWQ0OTM1YzRmMWYyYmNiYjQyZDhhMjRhOTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyMjllOWI1NzJmMmQ3ZTNjMTgxOWU1ZjE5MzNkZGExMDYwYWYzMWRkOGNhNGNlMWQzMjE4OGFmMGMwNmQyNWJhZTc5NWZhNTIzOWI3ZTYwYjM0OGYwYTkxNDQzZTVjYzI1MzRiZmQ3ZTFiNjc0ZDcyZTIzZTIzNDJmOWVmZWU4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjBjZTkwODViZDJhZTg2ZTIzOWU4Yjg4NDhiNzhmZGFlMTYwZGQ5M2NhZTNjOTZjYWYxODNiN2FlZDU5OTVmY2RhZGIzNDE3MzIzYTAzMTY1OTllODY0ZDcwNGY5N2I4Yjk5OWE2YTliZTBiYzMyZDUwMTE3MGUxYTMyMDUxOWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcwZGE3MmY1NWNlNjgyNTdhZGZiYjJjYWQzM2M2M2QwYjU2YjE5MzU4NTk5NGJmMzE4NzU4Y2ZhOTc0NWQwN2RmMWM3MWNkZmEwNGEzN2MyMDhkMDEyN2U4ZWIyNmQzZGU0NTQzM2ZjNzE3NDFlZWNhMTJhYjgyOWUzMDk1ZTY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWQ1ZjRiNTNkZGIyNDM5NzRkMDQ5MDI2NzU5MzZmYjJlNzYxMDI1Yjc2ZTIxOGQ1Y2IwODY5ZGY1MGNlMTgyYWJmYTk2YTdlNWYxNDU0MmRkOTdkMjE2MjVlNTJjMmQ4ZGFkMDY0NmZhNDNmZDA0OTE0MzJiZWJlYTBmNzg4ZTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5vci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5vci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAxNTkzMTc4YTA0OGMzOThiZDA4NWY3ZGIwNGZjMGI0ZjcyNjU4NzcxNjdiNTAzNTI1ZjJmYTFhMzVhYWMxZDI1NTkyZjQwMWIwY2U1NDgyY2UyNWFkNDYyM2UxYTU3MDZlOWU1MjYwMGZkZDVkMjg4ZDFkODMyZTZjZWJlZjhmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMzkxODNlZjJmMWJhYTMwOTY4MTM1MTRjZjhjZTEyNGRjYzNjODExMDhkYTkzNmExNGY5ZjljYjA3ODY0ZjkzZDA2YTFmMDE2ZGQyNzU2NjZhN2RkZTI5ZjIwMDVkY2E0OWVmZDMxNmEzMWMyMmY2OTExZGU5Nzk5NzcwOTQ3NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEhlbHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RIZWxwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NjE3NmNjNjMzNWQ0MTZkMjFiZDM2MjllNDE4NTNhNzA2ZDhhZGNhMmIzNTRjYzIxNTcwMDg2MzVhNzllZWI4ZDQ4MTc3Y2NiMDUzNzA5NTVlODVkYmNjMGUwZGI3YzZjYjQ4MzIyM2E5ZDNmYTU0NmQ4N2ZiZDUzODRiYTRmNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZWYxNGM2OTg1NTZmYWRlMDg3ZWUwOWY1OGUyNWU2ZDkwOTE2NWJiMTI5NTg0YjI4NDA1YzFiNzllYTkwZDdjYTQ5ZjQzZjAzMDcyZjczOWFkYjI3ZWE5YWE1MGFjNTI5NDA2YjJjOThlZDgzN2I5YWQxMDI4MzI4MjQ0YWU4NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9xdWVzdGlvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcXVlc3Rpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNWE2Nzc1ZmViMzZkNTkyNjE3MmZiNDIxYjY1N2ZiM2VlYWFkZDk2ODNhOTgyODA2OGRmNjg1MTlkYjJlNjM5Y2IzMjViYTI0NDg1N2I5M2JiNDY5MTdmYTExZGMyNjA3NmE5OGYwMzA1Y2Y2ZWU2ODMxZWY2M2JjMjFjYzhhNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDQzZTY3NDE1NGM0YTFhYmQzODViNjYxMjlmZTVmODQ3NjYxOGZlNWIwZGRjZTc5MzkxM2I1Njc5YTk1OThkMmJjYzgwOTkxNDIyY2YxNmUzZDYxODc1ZWY4Y2RiYjdjNGRhYWZlOTNmNWQ3NjAyYTUzOTVhOTI0ZmFiZGI4N2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmFsaWRhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmFsaWRhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiMGZmYjAxNDZkMjQxMmVhMDVhZTk3YTZjNzBmYzliMDlkYTIxNGVkMjYzNzUzOTc1YTE1MDhhYmY2ZThlMGM1ZGYwODM5M2MxN2RkZWE4ZjQxNzllZDA5NWMxMjY2MGE2MGFkYTQ5MzYwMjNmYjIxNWI2MTcyNjc2NTNhN2YxIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2dvdmVybmFuY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3R5cGVHdWFyZHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJpY2UvZmx1eEFnZ3JlZ2F0b3JDb250cmFjdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJpY2UvZmx1eEFnZ3JlZ2F0b3JDb250cmFjdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM5YjE0OTE5MTVmODhlMmM0NzFiMjQyYmZlYjcwOThlZGNjMjRhZjQzMDRmZWRjYzZjMzJmOTk2YzI1NDg0OTBiNTczMzI4NDRhZGI2OWU1OTM3Mjg0NWY0NmZlYTEyY2IxMzRmMTk5ZjljOWEyMTFkNjBkNjQ2ODI1YjJlMjdhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ByaWNlL2ZsdXhBZ2dyZWdhdG9yS2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcmljZS9mbHV4QWdncmVnYXRvcktpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM4N2E0NTQyMzcxOGI2NzBlYjNjZjhjZmI3NTM2MjA2Y2JiNmFlMDUxNmY3ZGQwYTA0NWUxYzYwMWQ5NTg5Y2RiODEzZDk2MTAyNTE2ZjEzN2YyMDBjNTJmYTdjMzVlMGNmYjUyMTA5YjRlZWVhMzQ2YTNkNDdmNWU5ZDQ4MmNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ByaWNlL3ByaWNlT3JhY2xlS2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcmljZS9wcmljZU9yYWNsZUtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFjNWExMjU0YzE5ODhkZjQxOTI1ZGY3MWU1YzlmZmQ0YTk5ZGFjN2IyZjg3Yzg4NGMyZWIwMWQ1Mzg3OGM3ZjhmMzRkOWZmZDljZTVjNWU4ZmFiZDc4ZGQ2NDU5MzM3YjM0YzVlZWU2MTQyNGRhMjI4OTQ5MGRiYmY5YmYwOTRhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ByaWNlL3JvdW5kc01hbmFnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ByaWNlL3JvdW5kc01hbmFnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNmU0NWZjNTg2MzU5NmRlNzQ2ZDk5YTUxZWViMTA5MGQyYTFjMTM1ZWU1OTgyYmIxNTI5OTQ5MDE2NjQ0NDY0MDU2NGM4Y2YyOWQ0YjJhMmE5MDk1MGQ0Zjc2YWE5OTdkYTJlMzg2YmRjMGY0NDFjZTg3OTUwMjkzYjVmMjZhNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9wb3NhbHMvdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb3Bvc2Fscy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU3YTY1MWZiODE2YWM5YjNjYmYwMWY1NjEzZjY2MmRmNWM4NzJlZmIyN2IyY2E5ZDE5MTYwYTQ0OTFjYjA0NDNkYTg1M2JmOTJjNDg4NWJlZmI4YTg2ZWZiMTVkNjkxZmZhMTBhZTVkNzE5NzJjNGM2M2IzNjg2Y2E2YTRmMDRiIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlcm5hbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1ldGEtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWV0YS1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2FsbGJhY2suanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NhbGxiYWNrLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzBmNzIxODVlOTlmMzNmNmUwMDQ1ZGZhMzI0MGQ0MzYyYzc1Y2FjNzJiNGY1MTE4Nzg2ODFkZmY2MGI3ZmI0ZmFkYjJlNzVjZmFkM2U0Y2Y2Y2Y2YWI3MDgxZDJmNzgyMDNlMTdmMGJiNmU4NjFjMjRmZmRkMDFmYTBlMmI4NjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2xpLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jbGktdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxMmYzNjk2MzM4OGI3NGI1OGJiOWZkN2E4MWUwMmI3ZjY5ZGZkM2ZjMDQzM2JjOTg5ZDRjZGVhMTZkNzE4YTY0YzhjZmQ3MzEwNWUxODU5MjIyOGJjMjEyZGZiYjVlYjEyMGNiZmE5MjhlMWQ1YTkzNzkzMzIxYzNmYjRkODNkOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb25maWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbmZpZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ2ZTQ5MTVmOWFjOWI0ZTFlMTIyYzU5YjI0ZmNiY2U5OWM0YjFiMjQzNTFlOWIxOGQ5ODAxY2Y3YTA4MGRiNjg1MjIzZGIzYmI4MDM5NTIwOGIyYzA1MGI2NDRiYzAwZmNmNGQ5ODA0YWVmZjk3Yjk2NTViNmJhMWMyNjcwOTFiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlYnVnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWJ1Zy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNjZWQzZmVhMjQzOWMyMTIyMTRjMmFkMmY0MzQ4MGRkZDBkNWEzNDM4YmYwYmFmZGYzMjc2ZjIyODUxZjVjMTEwYTBjOGU5ODU4NzkzZDk4ZmI3ZTI1NmYwMDlmY2ViOGM4ZTA3YjdmZGEwM2IxYTUwMjljOWRiYzcyMWMyYTI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vycm9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDI1OGM0ZDdlYmZmMzExODJmODQyNWUwZWQ1ZTg5YTNhZmU3NDUwM2E5ZjM2OTU4OWIyYTA1NjNiN2RmNzUzM2NhODQxODk4YTUyNzY4MjI5ZWIwNTUwN2UxZjE5NTg1ZTYxZmY1OTVjNWMxMDMxMjM2NTcyMTBlNTVlZDdmMjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzFiMGE1ZTdiM2U4Y2JiOTBkNzNkYjM2MmI1OTIwZmMwOTc4NzMzYTY5ZWU1NDA0ZDAzYTNjMDFjNjE3YzdhNGRhOWJiMTBmNGU2YzlkZjFmZWViMmYxMmI4NjhlNDgwY2FkZTRhMTRlY2MxMzVjYTJmM2Q4ZTAzNTU5NGY5N2EiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvanMtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2pzLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2Q4ZjU5ZGYzZjNjNmNmZTExMmU0ZTlkYTRiNjc5OTJlNGJhNTgxODBjZWM3NGQxNTYyZWEzODc3YjA5NjdmZjM2MDQ2NDQxY2QzOWQ2OWYzNmZlM2ExYmFhMGNhNmE4NTY5OGEzNmY2ZDk4OTVlZWI4MzdmYzQ5MGE0OTZkZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY2Mzg3NDFlOTA0NWVlZjlmNmFiMDg3YzI1YmE1YmEzNTY2MzllNzk3NjEzN2UzN2Q1NTA1ZGQzMjRjYzFmMzQ5NThhNjM3NmY4YzgzMWM3ODczOTQ3NmIyOTgzNThlNmEwMzVlYzAxMGM4YWE0MWFhYWVkZTQ3MmY2YmE1Yjc4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYTdkZmMxYzhjY2Q0ZTEyZWJhODlmNjMxM2Q0Zjk5MDMwM2M1OWU1NzA0MTRmZDE1Mzk1ZmVkZGJmMGVjNWNlOWRjMWE5MDAxODU5NWYxZjMyNzYxZGMwYmNjMDUyNzRhZmZjNDVlOWE2MjIyNGJjZTI5ZTQ1NDIwN2M2YmMyOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXRob2QtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldGhvZC10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA1NWE3OWZkMjQ2NjE0NWFlNjhlY2JjNzc2OTQzNzlkOGMwNTJmMmM3ZjQ0MmNhY2E5MDg3NDkyMTFkOTdlOTU2NGE4ZGRlYTZmNDJmODI1M2QzMjYwZGZiNzk3MDllYTI5N2JjODcxNGFhODYyZTY5ZTFhMzhmMjRjYmRiNWMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ldHJpY3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldHJpY3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Y2RkNzZkZjIyZjY3ZWFjYjQzNzYzMTk3ODhhMjk3YjFmMTM3NDYwYjQwNDc0Yjk1ZTQyNzA4YmUwMmEwNzViOTQ2ZDBkNGVmNTg1OThjZjQ0NTFhYzA2MDJkZTcyOWIwMmZjZDM2OTY1ZGIwMzgzYzgxMDE3MjJmN2RmYjNiMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uYXR1cmFsLXNvcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25hdHVyYWwtc29ydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhiYzY4MDZjZTFhOTY4Y2ZlNjljNmE0ODUyMTNkYmIzNzFhZWNkNTg4ZWIzZDE5Yjk2ZDhmYjE2MjQ1OGQ4MjBjMTU2MDRjNzAwM2M3ZGI1MWFmYWY1NDI4MzBkZjEwOGIzNWJmNWNjYjExZjkyOWFiZWY2ZmM3N2ZlZWZiN2VmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Nlcy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2VzLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmVhYjE3NGM3NjFjMGJiOWQ3NDhkNmI3Y2QwNWNlZWRjMTQ1MTVlYmZlZjhiMTYwMjJkOGE1ZTQxMjAzMmNmNjU2OTMzMTJkOWU4ZTM1YzU3NTg3MTllNzE2OTc5NTI4MjcxMmUzMDZmOWVmMDU3YjQ5YWZhYmRkZTQ4ZDY2ZDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGVzdGluZy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGVzdGluZy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE4MzFhZjIyMmNiMDIzZDdkZGZjYjJkYmNlZWU4YjhmNDdmN2Y3OTg4YWUyMzUxYWZlYTU3Y2RlODIyNjVkYmViNTFiODNiZjNiNTM2NmZkYWM1NzhjYWJmNDhiNDdhOTZjYTdlOGVkNTZhMjM3YTUxNThhNzc5NmRmZTE5NDUyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RtcERpci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG1wRGlyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDZhYWJhZjAwMDVkODdjMzQzNjM5YjFiZGNlOWY0NGI2MzkzNGNjNTFjOTBjNThiMWEwZDU3NzcyM2I2ZTJjYzFhZTZlMmNlZGViMTQyYzczZTFiNzcyNTFiNjc5NWNkMzYyZmU1NDcwNTI0NWVhNGZkYjYyZjk0OGM3Mzk3M2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUNoZWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlQ2hlY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZjA2YTMxY2ZkNWVkNWJmZTdhOGEwN2Y4MGZhYTFhYmM3ZWVlZjg2ZWZiNzlmOGI3Njk4M2E0NGM0ZGE3NWE5YjYzZGVjM2U3ZWVlM2QxY2QzZWI4NTI2ZDk0NzU4OGFjYTk5MTIyODU0ZDMzMDhiNDdkMzQ0NjIwODg0N2M5MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTdkNWM4MDJmNGJmNDg5NDc5NjI3NDk4MzlmYmM5OTZmMDlkMDQ5N2VlNTE1Njc3OGFkNWNlZTUzMTVmN2U4MDg1Yzg2MmVlMTZjZGZkNmVmNzBhMmNjZGNiYzhmOTRiYjJlNDg4NDYwMThkOTFmODhlMzI4NzM5MWJhYzM0ODciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3VwZ3JhZGUtYXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGNiMDk4MTNiNWQxMzU0NGEyNDEyNTE2OWZhOThjMDM2YTUzZjAzYWMxMGY0YjAyM2VmMjQ5MzgyMzQ5ODE0MDFhOGMxMmFhMWE4MzZiNDBmY2M3YzlhYjhlMTEwYTYyMGU5YjFlZTlhNDA5MjFkN2U5NzQzOTg0NmE5NjA2YzciCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL25vdGlmaWVyIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdGVzdGluZy11dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTcyMGRmMzU1ZWVmNWZhYmUyZDEyYWVkMDg5YzEwNDU5MDE5MDBiZmFhM2EwNmMxMTFjYWM3ZThmMzEzM2IwZmIxMDUwNTJmZjNlZGU4NTE0NTNmNzEyMDJhNTljMWNiOTE0ZTFmMTI0ODZhZjZjOGE1YjVjMzg5OWQxMzJkNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODI3ZGVkYTQxZjRlZmZkNDFkMmM5Y2ViYjdlZjkxNDcxNmU4MDM5MjUwYTNmYzY0ZTMyYWZkYTY1ZmNkMmViMTUzYmMyZWY4NzQ2NWY4OTBkMzFhOWY5NDBjMGQ0MDA3ZGQ4ODU2ODZkNWZjMjViYzBjY2U3MWQxZTJmNzBlZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjNhZDhkODlmZTgyNmM0YzE3NDkzNzk4NDEzZjVlMWZmN2ExNTg0OGIzNmIxZDA1ZDE1Yzk0ZGU0MmVmZDkzOWIwZDQzMjgyNjU3ODkwNjNkZmY4OTUyZjg0ZTA0ZGZiMmIzOGFhMmRmNDJjNjNmMDc0ODY0OWIzYzJhZjg1M2EiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVibGlzaC1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1Ymxpc2gta2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTViYWQ5YjM4Mzg0ZDBkZDdjOTJiZTg5ZjAyMjM2NDZkNmIzOWEyNDI2YTgzMzliZjhkYWM3ODRiZGFhZDYwYTc4NzJkMWQzMDcyYzE1NjQxNWRiMWE5ZDdmYjU0MDk4MWM1MmVkYmIwY2ExMjUwOTBkZDY1MzIwZmRlNjE3NDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZWQtbm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyODk0ZGVlZjc4YzRjZGM4NzAwYjI4MTU4ZGI5OWNiMGViYWFiYTFhNGU2OGY5OGIxODg1MzBlMmUwNTE3MWI5Mjg0Y2ExNzYyMmU0YjUxZTkzM2I3NjNjZDc1YjA2N2RhNWIxNWYzN2M1OTAwYmZmYjc0ZTU3YTM0MzQxNDhjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXN1Yi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzdWIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlOWRiODg5ZWY0YjNlZDVmMjQwN2Y0YzQzY2FmMWM2NzJiNGFiM2QxMzMwZmI1OWNlZDc5MWUwNjI0OTU5NjFkNmUzZTQ5MjgwNjI4YTMzMmE5MTEzN2ZlYmEzZmEwZDg3Y2ZlOWQwZmVmN2FjNjlmNDc3ZDYyOTUwYmVhY2RhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjcxMzFmNzk4NDg2ZDFhM2E2ZDNmZmRmZDU1MzA4Njc2ODQyN2Y5ZTM4Yjg1OTA4OGI5MWFkMzYyMmE5NGYyZWNiNTc0NjE5NjA2Njc2YjM3YTY2MWI3ODA1MjYxNzk5NGY4NDFmODcxZTdjZGJlMTY0MWU4NWZlNGIxZTdjOGJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YjEwNzgxZjU2ODU5OGMyMmY3OTNlYmU4YTM0MGMwY2NiODljNGVkYjI5Y2FiYzYzMzM1MzkyYWQ4M2ZmMWE2OGNhNzBhYmYxOThjOTE3NzQ0ZTc4NzhlYWZhYTlhOTJmODRmMmI4MTJlYTNmOThiODZiNjgzNmNhZWNlODkzOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90b3BpYy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG9waWMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjJiMzRlMDUzZjE4YzA5MzMyMWVjMzRiMWY3NGNiZjMzNzBlZjk0MTk5MDc4OTFjOGU4ZmFlZDJkNGVkYWI1MDMyZWUyOWRiM2VjMDM5NWFlY2Q3Y2MzNjNmYzcyZjNlNmM3OTM3MDY1MDdkMWNmM2QwNDkyZmFlNWMyOGVkZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ0b29scy90ZXN0U3VwcG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMmRmNTMxNWFlOWMyZmVkNDJlN2UwOTYxN2Y4Zjk5NDk3ZjBkMTJiZDQ3YTBmNTIyMDI1YTBkYzcyMWNhYTc5YzZlODExMjU5MjlhNWJlYmFiOTUxZTdhZDAyMTQzZDgxMmM5YmRhNWVmYmE0ODQ0ZDQ3Y2EzYzgzM2U2MTM0ZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zdG9yZS12MC45LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvc3RvcmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmI5MjM5NjQ4NzVjZGU5N2MyNmJjZDE4M2U4MDNiZTAxZWFkNzI4NjViNWIyNTgxNzAzN2JhZmVmZGJjYWRkNmYwZTY0YTYwNTQ1ZGViYWUyYzUzOGQwYmVkYzdjY2FlZDY5ZGUzZWEyMjU5MzQzOGYwNWU2YmE4MDQ5OTczYmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQwYWNhNmVlZGEyYjZkMzdhZjM0ODg2NzU1NzVmMWYyZmQ1NjQ5OGZmYjM1ZGI5ZGNkZDg0OWE3YTczMDRhNWMxN2ZhNjEyODcyZGQ4Njc0ZjJjOWFlYzg0YmRhYWE0ZjgxOTYwY2FjZTAxOWFjZjIzNDYyYTExZTFlMWY0ZTUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg0OWIxNjhlZjA0ZjhkOWI4MzQyYzAzM2E3YjZlOWQwZDg1MDQ1NGE4MmFlYzcxOWE1OTU0ZWI4MDdmNmVmMWI4MDA0NDliMGJmNzM3MWY0OTc5OTRhOTc1MzUzZWUxODMyMDBlMWI5MmU2MWU0ZDQ1NDZiZmY0MzNkY2U5ODZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzM5NzZjODc0NjMzMDgwNjNiYTU5NjYwMjA4MTY2YmMzNGJjOWM2ZTZjY2E0ODJmZTQ5YmJiZWVlZDg1MDhkMjRmYjdmMTM4MzRmMjFkNTBhMWE1MGQxYTBlNzIyOWI4YmI0ODEwYWQyZjE2ZmZkMDU3NjAxNWVjZjg1Y2VjNzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZmQxNzZjNzhlZDBhOWZjZTA2OGVlOWI3NzYzY2FjNzcyMmIxZDdiZjdlOWZkMGVhMjNkMjVkYWQyZjMxNGQyZTY2MDhlYmRiNjU1OTY2ZTc5ZDJiNmM4MzE0YWUyYjgwNDU2NmZhNjBiN2YwMDMzNTliNDZmY2U1MjU1MGZmNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODNhZWUxNTNjYmYxZTc2ODY4ZDQzN2I4OGQ1ZTcwYjY4YjNiOGUzODA3MTE0YzAyNTk1ODlkYTk1ZmE1NGIzMjcyZWI1MTJlYTIwNjljMDU5MmUwYTIxNWNkODI0OTNmY2JhMmQzOTJhOTkzY2EyOTY0MTg5MjNkN2Q5ZGJmMTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ4ZGMwYWQ5ODM2OTg4YmEwMjRkOWIyNTA5ZDE4MjgzODFjNGU5ZWM1ZmM2NjAwM2FhZmIzMTY2ODkxM2JmMzI1ZjIyMmJlY2U1N2IyM2Q2Mzc3MGRmMmQ2MGM1ZjZiNWE3ZTliZDFiNDU5MGMwOGJlYThkYjUwMjI0NTExZGRkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWVkMjJhNDY4MGVlYWM2ZGY3NGEyNmM4OWViOTVlOWU1YzMyNTVhZWM0YTFhNmUyM2ZmN2ZhM2I2NDEwNDlhZDA0ZjEzMmQ0ZWZiYTQ0Zjk1NmFlODA3OTNmZTM3ODQ0MDFlZmNhZDUxZmM5MzI3NTk4NjI1ZDg1MTdkZTkxNDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdGltZS12MC4zLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdGltZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMGJjNGIyMWEyOGMzYTViNzZmNDdmYWRhNGVjMTc2MWUxMTU5YzQxZTFmZWJiZjA5NWVhZWQ2MTE4ZTE3MzZlNTk0NjAzYzE4ZWYwMjRhYzU2ZjZhNWFiM2YzY2YwODZjNWY1YjU0NGVkZTEwMDMwMWZiMzU4MjljNTFhYjI3ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90aW1lTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGltZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiY2RmMWViYzhlNTliY2U3OTkwODJjMWM3ODRjZmQ2MWQ3Y2YxNjRlZDM3YTNiNWJmYmZjMTdiMzY2NjdmMTM3ZTBmYWQ1NDFlNjQ0OGQwYTU1NGE2ZWZlOGM0NDViNzVmMjAyMTIxMzllOTQyNGUxMmY4N2EwNGI5ZTUyZWIxMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzc2ZDY5MTE4ZDhkMTE0ZmZkYWNkNTI2ZWYyMzVhNGM0NzAyYzU1M2U1MGVhZjg1NDkyYTJkNGE4M2NiZmY1ZTFjNWQxY2IxYWMyNjRlMjVlNTlmZTI0OTAwZjE1NzJjYTgzZTJhNjNlOWU2Yzc0NGJkYzY4MzA5OGEwNDQ4NDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdC1kYXRhIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2VjOTdiZDI4ZmJhZTE0ODU3OThlYWQyZDgwZDFkMjc1MGI3ODQ2NjJiM2E4NzIwOTBjZmMyYmEyMWM4MTY2NTlhMDI4MmRiM2RhODk5YTk5YmUxMTk5ZDYxMGU1ZmQxNTU0YWVkNjcyMzFjYzM5MzI3YjllOGY0MzJiMWY2OGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDcyZmUzYTY4Mzg4M2U4NWNjNGRkM2I4NmE4YjVmYzFmMmJhMWY2NzdlYjgwMzMxOTkwZmQ1NDUwNTZmOGYxYTMxYmQ0ZTY5MzU4ZWJhMTNjZTkwZDFhMmM1Y2MxYzMyZmY5NTkwZDI5MGY0Y2Q4NzQ1OThlODdkMDI3OTczOTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjhmYzVlNmE3Yzc1Mzk0ZTAxNjViMGZmMzFkNWU1MzZjNDA1MDFjMjM2ZTVkZTIzNjJlYWZiMDE0NjY0YmQzNDhlZjU5MGVjMjhhYzQ1NDMwYzEyODI2NTk2MWIwZjBmZmQ2NTM5N2JhMDA5ZDIwOTYyODcyMWE2MzA4YWFmYzQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9lLXYwLjI2LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZS96b25lLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi96b25lLWhlbHBlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3JhdGlvLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cC9zcmMvc2FmZU1hdGguanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9zYWZlTWF0aC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2xlYW5Qcm9wb3NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2xlYW5Qcm9wb3NhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI2Nzk3ZTk3NWRlZDQ0ZjA1ZjI4ZjdjMzBhODg0NmFhNjJmNjdlMWY1ZGNkMTk3OTJiZDA2MDY4YzRjYTIwM2U5YWU4M2VlZTZlNDVmOWYzYTNjMDdlZGNhNTVmMmFiN2ZlYWM3N2Q3YTc0MmY5MzY3ZTc4OGZmZTJkYjQwZGNjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmM2VkNzM1NGYxZGJmYzk5MTk3ZWEzMzI4NTY4YTI2ZTAzNTM0ZWM5M2NkMWUxYzU2OWQ3NGMwMDdkOTYwNzQ3Mjk4N2QxNDE4ZGU5NWQ3ODNlZWQwNDVhNWU3MDQ5ZjkwNzcyMjJjYzZjNzkwY2Y3ZTZjYWE3OGQ2YWYzY2JiMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM3MGM4YjJhMmU4NzBhM2NjZDUyNjNkZjg2MDNlMDZhZDZlNzY5OTM0NTU3OWI3M2JjZmI0ZjcyZTc2ZDlkN2NlYTYxNDNjMWEzN2E3NWIyZDU1YzAyY2YyM2JmYWFhOWRjMGY2MjM5ZGEwNGIwODNjMzlkMzQ2YTI4MjQwNDlmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9ib25kaW5nQ3VydmVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk0NzU1ZTI5MmEyNmQyYjI5N2E3Y2E5ZTQ5ZjhiYjg0NTU4ZjMzYjZkMzRlYTIxOWQ3NzdiMmVlODBiNDg1MGIxN2E1MTg5N2JhMzI5ZWY2ZTE1ZTE5OGE3Y2MxYjllN2YwMmMxMmVjOWFjNjAwNDhhMDYxMWJiZDk3NzA1OTMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM5NTNmZjMxOWY2MzljNjgxNWZlYjBlMTJkMjc0M2I4OTA0MTZiNTUxNDJkZTVlZDQ1NGFmZDM1NzdjZTA2MGMwNzRkY2ExYTZmODdiOTFiODE2N2I0N2RiMjNkNjA3YTcyYzg5YTgxMzRlMjdjYzU3MmQ4YmIzYmVjNjIxYWNjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODAwMDk0NjEzYTU2OWIxZDNlZmRjY2ViYzQ0NDU4MTFmMTEwZjc3N2RkOTE2ZWFhYWMwNWE1ZWZmYzM1ZTlkYWFiNTlhMzI3ZmJiZmUzMGUxYmQxMjkzYzJiZDA2YzU0MDg1NWZjNzJiYmU0MDA4NTY0MzBhZDY2YWYzOTkyNWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3ByZXBhcmUtb3duYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3ByZXBhcmUtb3duYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ5MjcyMWQ4ODc1MmMxYzRjYjMyYjM4MWRmMTBmMTI2YzRiNTNlMjBmNmM5OGI1NzQ4YWJkYjg1NDM4MDkxMGI2MTg5N2ZlMGQxZWIwNzk2ZjBhNWI3OTdhYzQxY2U1ZTdlMDIwYzZlNjQxMWNiNzBmOWZhYjAyMGM5M2IwNDYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWZlNWEwNTg2NTcyY2NiNzFjYTQzZjkxYTcyYzc4OWUyYzVhOGE3NWU1YWVmYjQzN2I0ZTY2ZGQ0YjhjZTNlYzgyMjI0ZTc2MThkNDFhNTIyNTlhMWU2YTNhMmEwNTBjNTc5YjExNzI4ODVjMmZkNTc0MjdlNmIwYTUwYTA3ZTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDA4OTI4NDc2YmYxZGQ5MGMxM2U3Y2E5MDAyNmQ4ZjZjMjQyNjIzMjUzYzhhNTcyMzdjYjE5ZTcxMjg4MDM3NWY3MGY3N2RhMjRmYmRjNGQzMDU0NTZkMzYzNjc3YTc5YmQ4N2U4NzJmNjYwZWJhNDIwN2M5N2NlZTk2NTExZmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMTY2YmYyY2MxYzYwNzAzMDVhZmM2ZDZmMmI0MGE3ZWU1ZmQ4YzIyZTgzZjUzMzRhODQwNzYwYzgxYjQzMzY4OTNmNzE2ZTRmNTBjYTE3YWZhYTA1MGQ5MmRmZjBkYjc0MGIzMGEyMGFlYzk4ZDZkMzJhZTQyNGZiMTMzNDhjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmY0Y2QxOTdhOGU0N2NjMDcyMDc2MWJkNjNmZGFhZTU4ZWQyYmQ0MDc2OGNhZmI1NDlkZmVhYThkMzc2ODc1YTQ2MjkwYTgwOTdlZDJjYjRkODQyY2E3YWZmYzg0ZjIzMWRmMjhiOTRlYjhmMmNjMmE1NGNlYTkxZDM3ZjkxOGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0aXN0aWNzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGI4NWZjZGIyMDQ4NDYyMTRhZmI1NGJlM2YwMGRhOWQ4ZThiYjQ5OTczYmE0MWUxYjQzMGYyODQ3ZmM0NTQyOGMxMjY5MmRkNTZjNjUxZjQ5ZWMwYmRhMDAzNDQzOTVlMDQ0ODExOGUwY2MyNjkxMmUwMWQzYTk5NzUwZjAwMzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3RvcGljcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3RvcGljcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImViOTRjMWY2NmUwYWM1MmI2MThhN2I1Y2U3OGVhZDM3MWQ0ZDc4YjkwNDRhZjEyY2NiNDQ2MDlhMjMwNmFmNDQwMzcwYTMzNmQ5N2FlODI5YjJlNGJjYzk5NGZiNzg5MTA4YWI0YjczZjFiMWMxYWZkMmFkODJmMzRhOTYwZDI5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg2YzU2YjdlMzkyY2IwYjhhOGQ3ZDFkY2E3MTc5Y2Y5MTEwNDkwYjgxYjNjZWI0OTRlYTIzOGI1Njk2Y2Y3YzBhY2ZkNDUyMTZlNzg2NmY2MzVmMDA5YjhhODdkYTA2NmJjNDkwZDFiYmMwMmEwYTdiMTUxMWNiZDg2ZTA3MTdlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VIYW5kbGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VIYW5kbGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMzNjYzZjNDNmYTI2NWE0NWZmODY4YTc0YTc4M2Y5ZTE5Y2FiNjQ0OGY4YWEzMjdiODlkZDRhYmM2NGM0ODQ2YzI4ZDY4MWU4ZmJjZWY4MmY5ZjRhYjU5YjYyY2FmYzYyMzc1Yjg1NGVlMzM0NWFmZWFmMGRjZjk0ODVlZTM5ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzVkYTQ3NDQ3OTkwZmNmMzFlNTkyMTk3YzE4ZTdiODI0YTdhNDhlZTIwY2RlMzEzMGY1OWZmODY4ZjU2MDc4N2FjYTI0YzgzNjM5NDA4MmY3MTNlMDY2ZThhMTJlMmRhNzMyNjExMmQ3Y2ZiN2QwNWZlODc3YzczOWI2MTEzNDciCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9uZS12MC4yLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9uZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9iYXNlLXpvbmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9kdXJhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImR1cmFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiMjA4ZGVmOGRmMWNiZTE0MTg2NjlkZWRmODBiZGY1OTUzNThmNTM2NmQxMTg4YWMwNGZlNGEyY2I5YzUzY2E4ODRkODUyMTVjOTBmMWI4N2Y5NDliYjA0OGE3OTZlZTViNmZkYTEzZDUxYTI1OWUyNTc0NDY0ODE5ZDYyMmNkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kdXJhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kdXJhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTc5YjE5MWE3MzgwNDhkNjY0YWRjMjI1MjY2ZmI1MjViMGFkODhjMTVkY2RiNDhkNWFhMGVhZjg4MDc2ZjlkNTgyN2ViZTg5ZDY0NzUxNDNkNjAyOTFjM2FmZDRjY2E3NmY1NjkxZjU3MWZkMTIxZDYyNTc0ZWJiMjM5YWM2YTEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2NvbW1vbi12MS4yLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9jb21tb24iLAogICAgICAibGFiZWwiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImFwcGx5LWxhYmVsaW5nLWVycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTUzMTFkNDIyNzljMzkwM2Q2MjVmMTNlYTZiM2ZlNzk3YmIxZWEwMmI5NWUwNjM3M2E5M2VjMzhjODM5MmE4NmJkYTUxMmM4NDFiOGI0YmU0MGVhYjVmNTNiYTU2NmYxODIwMzVlMGU4MWQzNjNkYjY2NGFhMDdlY2MyZTY1N2MiCiAgICAgICAgfSwKICAgICAgICAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImZyb20tdW5pcXVlLWVudHJpZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwOGY0MDI2NjE4OGVlYjhhNGZkYWQxMDdjMDYyNDU3ZTgxNGFkYWQ5ZGNmMWE2Yzc3MWZjOWQzNDQzZTg4M2U0MzI4N2U0MmQ0ZDkxZmVjMWM0NDI3YzNiZTVkYzM1OTZkYTMzMGMyYzAyZTQ0NGZjZWI4NTIzODMwYzgzNDAwZCIKICAgICAgICB9LAogICAgICAgICIuL2lkZW50LWNoZWNrZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaWRlbnQtY2hlY2tlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU5N2YxODkzMDVmZjBlNDg3NmZlNWY0YThkY2Y4NGUzODM1NmI4YTM5NWU5ZWFjZDczYjg5NTdjYjE5MTIxNDViODU3NzhhY2I3MDVmMTAwMGEyODI4Y2ZhYjc3MDVmOTVjZjRkMThkNDhiNjBlZTg0MTExNzAzYjZjYTM3YTliIgogICAgICAgIH0sCiAgICAgICAgIi4vbGlzdC1kaWZmZXJlbmNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImxpc3QtZGlmZmVyZW5jZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI2NjY2YTQ2OTNmMGNjZDYzNmRjMzdlMjI1YjI0OTJiYmM5ODA0M2RlMjBmMDU3M2M0YzIwMmVmYmMzMjliODJkODEzNzZjYzcyZGE3ODY2ZGYwOWJhODkzMTk1NTZhYTBhYzlhZTQxM2RlZjYwM2ExNGM5MGQ0OWM4NjFiNWNiIgogICAgICAgIH0sCiAgICAgICAgIi4vbWFrZS1hcnJheS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJtYWtlLWFycmF5LWl0ZXJhdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2M1MzQ4YWJlZDAyYzlkNWRjMTk0MmNhYjg4ODM4OTI0MDI1N2U0MWFkNzFjODdmMzk0NmI1MWNkNTIxMWNmODk5OTQzNDEyYjY5NzQ5NTc0YTQxZDVhNThhMDA3YWYwYTQ0N2UzNTE1Mzk5ZGVjYWE2MzI0MTk5NjU1MjM2OTIiCiAgICAgICAgfSwKICAgICAgICAiLi9tYWtlLWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm1ha2UtaXRlcmF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYjJjNDg2NWJhZjYxZGRhODg3M2RkZGYzMTQ0Y2I0NTUzZjFiZjdlNTczZTNkZTg2MmJhZWU0YWEwNWQ5Yzg4MzYzOTk0NjNkMTY2YmY3Y2Q4Y2Q4MjRmNmFmYzViYmQ4YWFmOGQyYWY0OGM0MDNjYWJkOTJjZmI5Yjg0Y2FmYiIKICAgICAgICB9LAogICAgICAgICIuL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAib2JqZWN0LW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNiM2VmMWIwYjk0YjcwZDU1MmE0M2JiZGExYWM0NmZiYWFkNTY4ZWUwMjQ4MTNlOGU1ZDgyMDI1YzExNmQ0YTE3OTMzNzEzY2IzNDAyNzU4NTlmYjNiZTNmNWEzOTc0YWU2NTZlZjFiZWIwMWFhMGVmYTA1ZTgwYmU1YzA4ZDA2IgogICAgICAgIH0sCiAgICAgICAgIi4vb2JqZWN0LW1ldGEtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm9iamVjdC1tZXRhLW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk5ODFjOGM2MzA1OGMyN2MwY2ExMjcwNGI0ZjVlZGJjMzg0OTRjNTk1NzhmYWRiZTdiMGZjYTMwYmZkNjkzZTk0MDBlOGQzN2M4MGIxZDEzZGNmNDFiZDUzZjIyNDNmNGQzZGZlYWM2NmY2YzRkZjhkNmJhMDFmNTk4ZTljYjkyIgogICAgICAgIH0sCiAgICAgICAgIi4vdGhyb3ctbGFiZWxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ0aHJvdy1sYWJlbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWU2YThhZGRlZjViN2IzNTE2YmE1OWMyZWJjMzgwZWIwYzBkZmI0ZDA3NDUzOTM5ZTVhNGVjM2M3OGM1YThlOGUzYTYzYzIyOGFjNDlkMTRjYjk5NTk2YTE0ZTU4ZDE3YmZiY2I5ZDJmZTY2NWM4ZDI4OTY3NGQ1ODU0ZWM5NTgiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vudi1vcHRpb25zIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJhY2E3NmVkN2M2YjY1NjcxZjcwYjI2NDZmNjg5NDM1NzI0ZDhiOTkzMGE1ZmYyOWQxZmIzMjdlZDk2ZmQ0MTQ0Njk1MjU4OTYyZGFmYjk4Mjg2MmEyZWZjMWIwM2QwYWQ5NmIzM2MyY2FlNWJlYmZhMzcyNjg4NmEwNmY2NjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW52LW9wdGlvbnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vudi1vcHRpb25zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzBmYjUzZjJlZmU3MTNjNzI1NTIyMjE5ZDMwODM3MGY3MDc1YTEwY2M5ZmJlYWYxNzkyNDNlNzAzZjYxMTRkNmMxNGIzZGZjMzQxN2FkZDg4MjMyYjgwYzBlZDVhOGJiYjRiNjhmZTc1M2RlMGU0MzY4YjE1YWZiNGIzZDYwYjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Vycm9ycy12MS4yLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9lcnJvcnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJiYWM5MmJjMGI5MjA3N2ZjYTA1N2QwNjJjZDRmNTliYjg5YmViOTMwZTgzNTk4NjM0NmI2MWJlMDEwODIyODBlMjg0ZjViMTQ1NmJhODhkMDk2ZjI4NmIxMDFkYWQ4YTJiZDNiMjhkNzE5ZDc3YjliMmZkNmNmZGZlNWZkOTY1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDE1NWFhM2Q0MTdkMjg3Yzk5Yzk4MWQyMzdiMmRhYzQ3M2UxN2ZmZWJhZTJmM2RhYTMyOTkxYmQ2MTI3NWFmMGZhZmYwNzkwN2IzMDlkODNkNTBiNjM1MjNmZDkyNzA5YTdiZmU5MWU4ODliY2JjMjcxYWU1ZDhlMmNjYmUxZmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhwb3J0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xvY2FsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sb2NhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYwZWZlOTI4ZWU1MDM5ZTdkNDA5NTk0Y2UwOTgyMWJmZjVlZDUxYWJlMGMyNGVhOTU4MGY5NjQ4NzY1NzU0YTNkNDZkZDU5NTc4YmU2ZDM0MzZhZTNkMTVjODMyYTYzNTI0MzhkZTcxYTNlYzgxOTgzYjYzN2E0MGUzODJjMDM1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiY2YyNWNmZWExYzQzN2IzM2ExMzQyNzMyY2M4NmMxOGYwMzYwYTlhZGY5NjliNWJjNGMxODJmYjdmMzk3NDlmOTk0YzU1MTM5ZTllNTY1NWJlYmE5N2I1NDJkYzM1MzM3NTFkYTA1ODY5ZTIxZWExZTFkMDdhODEwMDcxZWJhOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2MzYWQ3MDBkMDY1NGU2YTRmZjI3N2FlYzI2MTE1MWM5N2I5MzAwM2ZkNTAyM2M4YjNhMzZlNTFkOGI4YzU5ZWNlMmU5NWUyNDU0MGE0NDU5M2JiNjQ0ZjZiMTNmYWQwZmE2NGY0YjYyZDYwNmJjOTkwMjJkNGZjMTMyODliMjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjRkMjdiNjUyYmRhOWIxMGNjZjI5ODY3YmE4ZTdlOTBhODQyNTlmNDk4ZjcxNzM4MmI1M2JjY2EyOTk4MDY5ZWExZjE0ZWYyYjNmMjg3Mjg0ZDI1ODkwYzYwMjg2OWRmN2NmNjRkOGVkODFjN2NkMGM3M2ZkZWZlNWRlZGNiMTciCiAgICAgICAgfSwKICAgICAgICAiLi91dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ1dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2MDcxMjM4YjI1ZDMwNzY2ZjQ0NzNiMzYwNzVkYjA1MDA0YTMwOTViN2JhNmFkZDA0NGQ5ODY2NWM3ZTBjM2MzMDlkMDRkNDM1OGFhZDhiMDVkZDhmY2YwMGY3ZGYyOTYxNTVjNWY4MjliMmY4YmYzOGRkYmVmYjEwZDU4MzQ5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9leG8tdjEuNS4xMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXhvIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V4by12MS41LjEyIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V4by12MS41LjEyIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpc3QtZGlmZmVyZW5jZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM5NDE0NzNjMzA1YmU1N2U3NzgzMWI4NDZiNWRkNzJmMDViMDNlOTc3MDY5ODQxNzRhY2QxZjNhMTNmZjhjY2E0NmMyZDUxMDBmMzVmY2E3ZDhmMDcxNGE1ZGJkOTNkZDA5YjdlNmRiNmRiNGM2MDg5Mzk5YzI0NGVjNDZjY2I3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by1tYWtlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by1tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxM2QwNTZlYjk3NWJmNTA5MzhlNzUxNTJiNjJkYjdkZmJjMjI2NWM0N2EyOGM3MTcyZGI2NWMwNzkxYTRhYjFiMjI3Y2QzYzIyNjEwN2IyNjg2MDczODViYTViZThhYzlmOTBmNjJkYjVkMGRhYzM5MmRiZTVkZTcyMjQ0OGVmOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgxYzkyNTkwNmU1MDIyYTNiOWI3YTE4YzEyMjA3MTU4YmJiYjc5ZWNmODgwZTA3NWMwNTZjZWFkOWM0M2RiY2M4NzI5NjM1N2QzYTVjNzdjNmIxYmNhZjM5MmIzMmRjMTIyYjUwZjBjOGNiYjdjZDg0YjEyMTllNGNlZTYzODYzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2dldC1pbnRlcmZhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2dldC1pbnRlcmZhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MGNiODI4NjFjM2ViZGM1ZjY4NDQzZTg4OGU4MjAwNDgwMTZjMTNkZDFkYjE5ZjQ1ZTZmODk5MzQ5MjQ2YzI5OTY4YmQ1YTNmZjE4ZmJlMmY1YWI4OTNjNzIxYTAwYWYzNzhiZmQwNGUwNzgwMTNkODQ2MTkwNTBlMWYyOWUzNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZmFyLXYxLjEuMTQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ZhciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGFiY2U1YjA1ODQ2MDFhYjU1MDY5OTA0MmQxNmU2NmQwNzRjMjU1YjA0MTkzNmQyYjA3ODczMmE2NDkyN2MzNTE1YTNkNGY5NTBlZTk2MDk5ZWEwNGVkMWRjMTZlNGY0YTg4YWViMGQ4MTFiNGVlYjRkOTdhNDkyZGY1MDRkM2IiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjEuOC4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzg4NDMwZmNiNzg2YjU2MWNmMDNlY2Y2NTlkYTg4MGZjOGM0YTZiZTIxZWM2YTI1NmZkODg0M2M5MmJjNjZjMWYxMGY5ODM3MWNjODVjMzY3MGVhN2NjZjc0NDAwYWIxMTJlNGQxMGJjYzM5YjY1Y2UwNWI0ODc1MmEyOGQyY2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjI4ZjMyNWE0NTRjYWQyMzE5MWZjOGQ1MWYwYmNlOTI2OTBiNzhjOTM4NGVjZTVhNjI2M2RjZjFiZDQyYWYzZDliYjE1YmI3NmFkNDE1NmQwMDkwNjM1M2Q1ZmNkZWQ2ZWNhNjhhZWEzODcyYjZkZWNlNzE0YzMwOWRiYmVjOTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb0NhcERhdGEuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTU2YWYyOGViYWY2OGQ0ZmYwZmUyOTQ1MjRjOTEyMzM4OTMyYjhlMjkxZTA2OGFkNjA0MGM2MzEyMDc0OGM1NjdkYjFkNWE0YjYyMzE3ZTM3YzMzNGE3NzNjYjBiMmJlOTMyYjhlMzI2YTczZDEzZTVkYTNjMzUwMDNkNjA0NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MGU4MGE1MDFmNTcwMTQ0NzFmM2RjYjYzMTMzMTBmZWNiOGE5OWM1ZjY3OTE5NGM1MTI5MjJiOTg3MmNiOGYxZGI1MTI2MzZhZWViMDYzOTU5ZjQ4NjJiNmQ4YjQ1MTQ5ZGQwZGFiNDgwNmVjNmFiMTU4YzY5N2UwYWM0OWY3NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1qdXN0aW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiMjQ1M2IxOWY1N2JiOWM5ZmUyNGNkOTIxNjc2ZmJjMDg1MmY0N2FiOWE2NmVjZmE3NTEzNmFmYzY1Mjg1NTU1NGRkODkyY2IzOTRmOGJiNzIyM2E1MTgyZjYxYTMzM2IwODNkNjJiYmRhMDdkZDYzMWVlYTVmYzU1NjllMzJhNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZDRiNWVjY2JiOWFmYmI2YmIyZTVmZTYxMzJjNjhkMDM0NDRjYjA5NDk0NGRiNzk1NzU2ZThmNDI2ZmIwMjQ5NWFiYWNjOWVmMjFkNmE4MWE0NzcwMGRjY2QwMzViNjE0NDExZjA5NTNlMzZiNTc0NzU5MmI1MjU1MmQyMzc4ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWM4M2VlNmU3YTU2NGJlYTdmN2EyZjcwNzJiNWI3MTg1ZWFmODI1ZTQzNTExY2I1ZmZmNTg0M2NhYTZjNmMxYmIyYmZlNjU0Mzg1NWFmZmFlNzA1ZGI3ZjQ5YTI0ZjkzM2M2MDExOTk1NTQxMDVlYjZlYjhiOGEzZjY2NDZkYTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmFua09yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yYW5rT3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxY2M3Y2MzMDIxZGUxOGUxMWYxMjE5ZTIxZTI4Yjk4MDRmNDEzNTFmMzA0ZDJmMWU2YjY4YTNiNjQ1NjU2OTgyN2ZjYWY2ZWVlYjAzODQ2ZDM2MDE5MjE2NThhYTU4M2FiOGNjNjNmOGI2MGJhZTQ1ODY0ZDdiZDkyMmI1NmQ4YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbmF0LXY1LjEuMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNzMxYzgyNGIxZDliNDE3N2ZiM2ZlYjVhMWViMDdhMWM1ZGYzY2ExZWE0NzZhMWU1NTg2ZTEwY2IzZjkzYzE0ZDNkNDM2ZjkxNDg5NjE5MzI5MjFlZWVmMjNlYmUzMGZiNmJiMjMzMDQ0ZmJlZWI3NmM2ZjhlMzM1NGI5ZTZlNSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Bhc3Mtc3R5bGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2lkZW50LWNoZWNrZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWUyNDRkOTQwOGNlZGI1ZjA4ZDAyYjExZWJjM2Q5MjA1MzQ1MjA2ZGE4YTJlMDhkNmUxYjZhZjUwZWM5OGZhMDRkMDJhN2MwODUxYzllZTA1MmMxZTdmMmRjMDg2ZjQ5ZDU4ZjgwY2ZjYzRiZDk2YTI5MzhkODFkNGQ5MmFjMjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnl0ZUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ieXRlQXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Njg4MjE1MzFkOWYxZmNhMTI4NTYwOTRkMzI1ZDdjNjU2YTI3Nzk2NGQyMzBiZDY0YzIzNWJmZGM3ZGE0MWFkZDNhZGQ4NjBhMmU3N2U3Y2I2NzBlMWFiNWUzMTExNDRkY2YwMjVmNGU5MzZhM2M5YzJmMDBlY2Y0MGVhOTRlYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAzNmMyMzhjMzBhOWZmODY2M2ZkMjZiNTc4YmI5M2VjMjBkZDY1YWFhN2VjZGE0Y2MyODM1Njc5NDkxNDY0NTg5MWRmOGY3OWUxYjIzMjI2YTg0OWEwN2Q0YTlmNWRkZTM1Mzk5NTM0MjZhOWVhNDFmNjM4YmU2OGYyMTQ3ZGEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNTYwOWY3ZjA5NDBkZjM5YmJhYTU4MGEwNTZmZjAzZDU0ZTdhZTI1ZTU5YTA1NGU3NTQyODdjM2M3ZjgwOGVjZTEyOWExYTA0YWEwNmJiMTk1NjJlY2MyOTAyZGQ3MjlmODMwMzM5MjdjMzk3MzExYTZlZjU1NWQ4ZWVmYjczNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZhZWQ3Y2E0OTZjMWYwYzc5YTUyOGQ3YjNmZjYwMDJiZDk1N2U3MjFiYjg4NTBkMmM1OGY2ZTNmOGE1ZDY4NTkyYTg0Yjg2MzNmMmRkMmFkNzdjYjhjZWJmYWVmYWEyZjJhZGM5YzUxODcwNGQ3MTA3ZGRjMDgwOGM3ZGJjNzA4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjViYWUyZjFmNDI2MDBiYjk3MjhlYzFkMWU3YWNlN2U1M2E0ZjY5ZDM2ZGU1YThmY2ZiYzg1MGZjNGZkYThiZWI0NjM3YmE2MGE1ZWEwYzZjZmEwZWY1Y2I5YTFkODIxNjFhNzczZGQ0N2U0ZDRlNzY2Y2NhNjU1ODg4ODNlOTIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2l0ZXItaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXRlci1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmFlZmQ5ZTIzNzA5ZmQxY2VjOGQ2ZGQxZWQwYWMxMjUyNTlhZTNhOGJjYWEyYjkxOGJiMzczYTY5ZTdlZjc5YTM5Y2Q2ZDljZjY2NzQzNjY3Njc0OTRlMzkzODMzMmQyNzAzNzEwNDJmODIzMjRjODM0NmJlNTg1NzE4ZDdiY2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZS1mYXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2UtZmFyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmU4NzU0YzI5ODkzYmRmODhhZWQyOWMyNmZhYzA3M2I1MGEyZjAxMmVhOWM2YzQwYTUyNDE0MGNmZmNlYWVhNGI5ZTJiZTRkNDY0ZTI3M2JmYTg0Y2NkMjdkYzM0OTc3ZGM3NjcyYTQzZWZhMzNiMmEyMjg4NDUxYTFhMDIxOTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZVRhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVkNWYyYzlkOGM0MWYxYjhiYTk4N2ViODc0YzI2MzUwOWIyMmQ5MGFmYTNhM2YzYmI4ODFkYjlmMGU4MGJhNmEzYjM5M2E5MzBlYmIyOTFlNmY0NzNlZTU2MDUzMGZjY2VlZjNmMzFmZDM2MGZlMzEyNTkxMjVhZWZhNDg3OGY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkYzZlN2JiOGNkY2VmZWNlOTYwMDg2Y2NmOWI2ZDk0M2Y0MGY3ZGRlODY4ZWIxMjUxNDczM2ViZDNlZTM3NWQ5NGU5OGY1NjEyNmE4Y2NjNDg1YTM1ZjdmYmE3MDZhODk4MTdhZjQ3OThmN2RlODIzOGU4MWMyMjYwZWRhMmJjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGVPZi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVhMjZlMDRkYTVjNjI5MjNlMWY0NDdhMGI2MjhmMTdkOTQ5ZTMxZTA4ODUxNmFmMGNkNjg4N2U4NTBjOTE1ZTBkZGVjZDQyYTRlMDhhNWIzODFjMDc2M2Y0MzVmMTJiZjRjZDM5NDZhMTU1MDZlODQ0NTdiZWVlMDU4MmE0ZTY0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlbW90YWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVtb3RhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTQ3OWJmYmMxYWM2NWZmNDQzMzc1ZWYyODIwZTVmNThlZjFmNTNkZDBlMDNlYWQ1Y2FiODE1NDMzYWIxZDA2NWE4MWQ5NDdkMGZhNjYwZjUxYjY3YzBjNjg5NGQxY2JjNDg1NjBmY2U5ZmYyZjFlNTA3ZDUzMmYwMTQ3ZGVmN2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2FmZS1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zYWZlLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZTI3NzA3ZWE4NjkxZDZmMjE3MGYyZTEyN2JiODNiNDRkMjY4NmY5ZjkzZWVmMzdhZjBkYmZmNzBjYzQ5ZmFkYzljNTg0YWRmZmRlOWUyYTZkOWY2MWIxODY1ZmNhYTE4ZGRkOTY4MWQ1NzU1NDUzMWVjNzJkNTEyYjQyZjYwOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdHJpbmcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0cmluZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJlNTMxNWE2NGJmZDMxOGFmOWIzNTBlNDNhYWRkZWY2MThiOWUwNTIzMjI3ZGRiNDFkZjNiMzZiYTcwODc2MDA0NWI0YzRlMTJmOGJiMGM3ZTU0YWMyNGJhZGQyMTNlMGNmOWQ1YzA0MzZmZGQzOGRiYTcwYjQ4NzE2MmEyOTI1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTU5ZGFkMzIyMTIzMDJkYjk5M2ZjNzZmZjRiMDJjMGUwNjA2OTllYzQ0MmUyMjc0N2Y0NDRhYWJjYWYyZTNmNGY3MTkxZWIyNjc3YTU5MzRiZjI4Zjc4OWExNzYyYWQ1NzA2MGJhY2I4N2IxZDU1YjlhMDJiZjNmOWJlNDgxNTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhOTI3ZjExZWFlYTYxNGMxOTFmOThjOGQ1N2ZjNzE0OWVmODgzODAzMzdiZmY0OWNhZDkzNGM3YjNmZjFmYWIzYTA4YmU3NGY2NmZmZWE5NWFhYTJiOWM0NDNiM2ZlMDVjZDdmOTAxNzVmODM2N2ZlYjg3NDViYmMyNDE4NzI3MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWQ1YTczYjRjOTE2NzJjNTc1NjkzNzY3OTE5MzdmOWIwMzk2MjczOGU3YzJhNDQ4ZGMwZTZmOGM1ZmM5MGYxM2M1OTdjMGQ0MmViODBhODU5MDcyZmU5OGFiNTYyYWUzNDFlNWY4NTM4OTZlNjRiY2JkODdlYjQyZTg4OTgxNzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGF0dGVybnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pZGVudC1jaGVja2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpc3QtZGlmZmVyZW5jZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vbWFrZS1hcnJheS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1hcnJheS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YzliN2FiYTMyNWIzYTk0MDhiYjk3NzNkMmI4MjM0OGUwZWM1YzhhOGVmZGQ0N2ZjY2NlNTFkNGM1MmFiZjJmZDUwMjBmZGFiOWVhZjBkMGQwNTI4Yjc5MTcwYmYwM2ZjMjkwNmMzMjYyY2NkMDJiMTFlZmEzMmVlMjIzN2M3MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NoZWNrS2V5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjAwNWZlOTdlMzQ0YTc3YTAyZjk0ZTdmYmE1YzcxNGNkOTJlNzFjMzRmZTQxN2Q1NTNmMmI2NDU2YjUxODhmMDFlNDkyN2RhOGUxMDFmZGVlYzQ3YzVjNTZlZTc5OTJlNDhlNzVhZWMzMjU4ODU3OTQzYzdiY2ExZTRhOTkxOTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb21wYXJlS2V5cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUwMzBiZDhjMDU4ZThmMTJkZmUyZGYxZWE3ZTBhNTQ4Mjg1YzUyYjY4YWY3NTU5NTZiZjhlZWQ5OGM2ZDcwYWI4MTY1OTczNDEyY2U1ZjVlYjkxMDBhYzNjNzkyNzM5MDJiODQ0MDA4NDMzN2E0YmExZjg0MzdmMjljYWI2Yzk0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29weUJhZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb3B5QmFnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjRhZDIwYjc0YmQzNmE0NzQyMjk5ZDgzMjhhNGE2NzNiMDA3NDU5OGU3MjBhYTA3M2JlZmY3ODY3ZDdlYWYzOWIwYTE5MzBiODljZjM4YmQwODdjNzUyN2I0ZWMwNzY4Y2ZjZmIyOWI5M2YzZDkzZDM1ZTFlNmI0NjI3ZTlmNDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlTZXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NGM4Yjc3MmRkZTZiNDk3NDMzZjAzOWU2YjEwZDIxMTllMDJlZmRjMGEzYWJmNTZhMGIwYzA2ZTM1ZGIwNDYyYzE1MTcwMTFmM2U4YzgzYWJlM2FjMTZhZDU1ZGVlODQzODRhY2RlYmM3ZmNhYmMyYjliZTI5ZjBjMzk2YTFlMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTE0MmFhZmFkOTRjN2Y4ZDIzZDg3M2I2MGZiMGIyN2QwMjMxODk5NTFhOWVjNTEzOGQ1ZTY5MWQxNjA4MjU4OTcxYjhhMTU2ZWQ1ZjFmZjU5Y2JhZTgxZDI5YjQ2OTk3OTIxMDBmZjAzZjQ3M2Y3YTg5M2YwYTVlN2M1OGMzZmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTU1ODdiY2EyNDVkNDNhZDM0N2JhMWIwOTZjZjZmM2NiMGVmMDg1MzVlMDgzNzM1Mjg1ZTY2NTljMTc1ZjY1N2JkY2VmZTBmZTc1ZGNjMTE2NmYyYTlmMDRmNTg5YzdhMGVkNzhhOTAxNmFmMDhjMWZkM2JlZTJiZDYyMWUwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdhODkwZjgzYjQ3MTUxYWQ3OGM4YWQ1YzQ0MzE0MmNmMzk5ZTA1YTIxMWIxMjdlNTE1OTY2M2YwNzY2NzdmMTEwYThhMWFjMjVlZjhiODI4Y2IyYjQ5ZjNmNDY2OTg1OTU0YjljY2JjMzc3M2EyMDUxYmZkNGQ0ODc4N2QxNDNhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYTAyNmNjM2Q5ZTY0MzM1ZjkyMzY5N2UyN2EwZmYzZGZmM2ZjZTRiNmJiZDkxOWI1NDA5ZmE1YzdiZGUxODE1NDI0NWIyZWE5MmIyODAyOTIyYTJjM2E0YTc1ZTUxZjZhNDk1YzdmMzY4M2VlYzMyYjE5OGIxZTEyYTA2MDJjYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJmNjA3MDNiYmFlMWQyNzQ4Y2MzNDNiYjVlNTE2YWQ5OGRmZmMzZGE2ZTU5MzVjNzRhNDk0NjI0NzU4YTIyZWVkNzBiOWQ1ZWY3MTZhMDc0MzZlN2ZkYzE0MGI2MWM0NzhhMjFhYzI2Mjg0ZjVmZGRlMGUzOWNhMmZlMjU3YjQ2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJmNDY1MzMwN2Y4MDZmMTNiMmFkYjU5NmJiNmUyNGNhZmU4ZjA4MzQ0MmY4YjUwYjMyYTBlY2FiMWFmOGRlZTUyYjZhOWI4M2U2NGJjMmQ2NmJkNWRkNDIzZGRmMDZhMTIxNDFmOWFiOGU2NGNiMjYxNDA2NGVlNjUyZDA0MDA0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZDNhMjU2MzZlNTQyNzhiMzNmNmMzNjIxNDc4ODllNmZmMTBiZWRhODBjMDdlNmExNmQxOTA0N2I3YjNjNmEzNGQ3MzBlOWIzY2ZjOWY4NTExYjZlMjdiNmE2OTc3NjRmOTY4M2Q3MGRmNzA4NmUwODVmOTNkN2Y5NWZjNGZmYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRmYTZkMTJkNDdiYmExODZhNTJmMWY2ODY4NjAyZTA1YTk5ODJjYjNjYzcyODY4MjY4YzViMDc5OGNmYzk5OTM1NTA0MjQzOTU4MWY4MmE4NTUxNGNiMzIyZjQxZGFkYWQ2OWI5MTE5NjgyNzcwZmE0NTdjZWZkNTI3YWE1OThhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjODRkMDc2ZTBhNDE5ZmM4NjM3YWIzOGYyNDQzMzhjNDc2YzUwMTMyY2ZlMDkwMDJkZGRjYmJmY2QzNjViZjZjZjNkMzJiMDlkYTMyNTI1Zjc1YjYwZjVmYzY2MGRkYzBlMDhmMzZhNjA3YmEwNzdmNTk5YmM1NWYyOWVjYjM2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9zdHJlYW0tdjEuMi4xMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vc3RyZWFtIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3N0cmVhbS12MS4yLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3N0cmVhbS12MS4yLjEzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiMDA1MmM2ZTZmYTI1YjFkMjgyYjAyMDYxOTRhOTU5OWM2N2QzMmI1YTBjZTllN2U5OTU3NzRjZmQ5ZmY3YTBiOTJkNzUwMDlhMzA5MzBhYTZjYzEzNDgxM2JiMjdkYzYyYThlYWU5MDY0NmIxOThhNjdkMGRmM2FlYjE4OGFjMCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiamVzc2llLmpzLXYwLjMuNCI6IHsKICAgICAgIm5hbWUiOiAiamVzc2llLmpzIiwKICAgICAgImxhYmVsIjogImplc3NpZS5qcy12MC4zLjQiLAogICAgICAibG9jYXRpb24iOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGFmMTA5OTcyOTAxZWVjM2U3ZDljMDFkYWUyNmFlZDY3OWZmMTBjNmI4YzJlYWI5ZjdiODUwMmEyN2Q5MTVmNGZjMGQ4OGNmZjI1ZjE1YjY5ODVmNGUxY2UyYmQ0NTNiNzgzMTBiZjZjM2M2YTI1ODMzYzUxYjA3MDY1YjAzMjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3ZGU2Y2JiNTFlMTZhMmRkNTIwZjdlNTY2MGFkZmEzZDM2YjlkMjBlZWJhN2NkM2QwMzZhMGQ1YmZkNmQxNGFkODVmNTYzOTAwZjE2YzZhMDdiYzU3MmZmODQzNmMzZmQxYWZkYzc1Njc3MjM3MDk4Mzc0M2U2ZDI0ZDc0N2MxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhZmY3ZjdkMGM0Yzk3Y2I1NWVlNDhiM2UzNDI5YjdhYzg2ZTgyYzM5NTgyN2RmYzNiZmE4OGUzY2M2MWJiNjk0YTg1ZWY1ODA5MzRhYTZmMmE0MTRhNTU5YTNmNGZiMWI0NmViNzc5ZDAwYmIxZTBhM2RmNTk2MGQ1N2NkNmMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZmQ1MmVmMzAyYzFmMTRjNjIwZmRkZDQzNzI3ZDgyMzI0MDNiOWJkMzU2MWUxZjEyM2RjZTlkNGU5YTEzYjU1YTJkMWVlNGFkODA3MDJmMjUxMTE5ZTlkNDkyYThjN2EzNDVmZTU3MWE0NzlkMzkxZTJiNzgxZmZiMTM4YzAwNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWtlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL21ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJlOGY4MGYzM2FkNzVkN2UwMjEyYzllYWQ3Zjk4ZjgyOWI3YmYyZTZkMTkyYWM3MDhlZGQ3NzNjNTI4NDdkYmRmMzgzMDQ3OTg4M2JjNmM0NDA2NWUwNTU0NzBjZDkzOGQwODUxMDZmYTEyYzdkZmNlZTM5NjkzNWE0Y2UxNTZhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9hc3luYy10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY3MGRjNWViNDE0NzdlNGRkZWZkMGUwODY4YmYwM2E4NzFhZDU5OTZmMjdmNzFjNzAwYzU5N2YxYzkxMzE2ODZlYzlmYmQzYWNhN2RkN2M1YjY0NWM4NzUxZmVmMDFmNWY5MTFkMjUxZjU5ZWQ5MjhhOTJiYTY4ZDk5MDIyZTcxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcxL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcxL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NDZiNmFiYmNlYTcwYjUxMjBhMDU0MjYzOWE5ODVkODk4YTI1ZjI1YTIzOTQwZWNjMGZhMjZlNmVmYzhkNjUyYTVkYjlhZTVhNzVlYzI3OGY3OWM0NGQ4ODAwZDk3YTdiZGVlYmZlNjU3MzNiM2FiNjY0YmIyMzUzYzQ2NTVlZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn1QSwMECgAAAAAAAAAAADGASPiNAQAAjQEAACAAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvaGVhcC5qc3siaW1wb3J0cyI6WyIuL3NyYy9oZWFwLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaGVhcC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9oZWFwLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABPPCnc8KAADPCgAAJAAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaGVhcC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXhvIiwiQGFnb3JpYy9zdG9yZSIsIi4vbWFrZS1vbmNlLmpzIiwiLi9rZXlzLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sImV4cG9ydHMiOlsibWFrZUhlYXBab25lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyLGlzUGFzc2FibGUsbWFrZUV4byxkZWZpbmVFeG9DbGFzcyxkZWZpbmVFeG9DbGFzc0tpdCxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhclNldFN0b3JlLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxtYWtlT25jZUtpdCxrZXlzLHdhdGNoUHJvbWlzZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJpc1Bhc3NhYmxlXCIsWyRozY9fYSA9PiAoaXNQYXNzYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V4b1wiLCBbW1wibWFrZUV4b1wiLFskaM2PX2EgPT4gKG1ha2VFeG8gPSAkaM2PX2EpXV0sW1wiZGVmaW5lRXhvQ2xhc3NcIixbJGjNj19hID0+IChkZWZpbmVFeG9DbGFzcyA9ICRozY9fYSldXSxbXCJkZWZpbmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKGRlZmluZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJTZXRTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9ICRozY9fYSldXV1dLFtcIi4vbWFrZS1vbmNlLmpzXCIsIFtbXCJtYWtlT25jZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VPbmNlS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9rZXlzLmpzXCIsIFtbXCJhZ29yaWNWYXREYXRhS2V5c1wiLFskaM2PX2EgPT4gKGtleXMgPSAkaM2PX2EpXV1dXSxbXCIuL3dhdGNoLXByb21pc2UuanNcIiwgW1tcIndhdGNoUHJvbWlzZVwiLFskaM2PX2EgPT4gKHdhdGNoUHJvbWlzZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cbmNvbnN0IGRldGFjaGVkSGVhcFN0b3JlcyA9IEZhcignaGVhcFN0b3JlcycsIHtcbiAgZGV0YWNoZWQ6ICgpID0+IGRldGFjaGVkSGVhcFN0b3JlcyxcbiAgaXNTdG9yYWJsZTogaXNQYXNzYWJsZSxcblxuICBzZXRTdG9yZTogbWFrZVNjYWxhclNldFN0b3JlLFxuICBtYXBTdG9yZTogbWFrZVNjYWxhck1hcFN0b3JlLFxuICB3ZWFrTWFwU3RvcmU6IG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsXG4gIHdlYWtTZXRTdG9yZTogbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxcbn0pO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlSGVhcFpvbmUgPSAoYmFzZUxhYmVsID0gJ2hlYXBab25lJykgPT4ge1xuICBjb25zdCB7IG1ha2VPbmNlLCB3cmFwUHJvdmlkZXIgfSA9IG1ha2VPbmNlS2l0KGJhc2VMYWJlbCwgZGV0YWNoZWRIZWFwU3RvcmVzKTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VTdWJab25lID0gKGxhYmVsLCBfb3B0aW9ucykgPT5cbiAgICBtYWtlSGVhcFpvbmUoYCR7YmFzZUxhYmVsfS4ke2xhYmVsfWApO1xuXG4gIHJldHVybiBGYXIoJ2hlYXBab25lJywge1xuICAgIGV4bzogd3JhcFByb3ZpZGVyKG1ha2VFeG8sIGtleXMuZXhvKSxcbiAgICBleG9DbGFzczogd3JhcFByb3ZpZGVyKGRlZmluZUV4b0NsYXNzLCBrZXlzLmV4b0NsYXNzKSxcbiAgICBleG9DbGFzc0tpdDogd3JhcFByb3ZpZGVyKGRlZmluZUV4b0NsYXNzS2l0LCBrZXlzLmV4b0NsYXNzS2l0KSxcbiAgICBzdWJab25lOiB3cmFwUHJvdmlkZXIobWFrZVN1YlpvbmUpLFxuXG4gICAgbWFrZU9uY2UsXG4gICAgd2F0Y2hQcm9taXNlLFxuICAgIGRldGFjaGVkOiBkZXRhY2hlZEhlYXBTdG9yZXMuZGV0YWNoZWQsXG4gICAgaXNTdG9yYWJsZTogZGV0YWNoZWRIZWFwU3RvcmVzLmlzU3RvcmFibGUsXG5cbiAgICBtYXBTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy5tYXBTdG9yZSksXG4gICAgc2V0U3RvcmU6IHdyYXBQcm92aWRlcihkZXRhY2hlZEhlYXBTdG9yZXMuc2V0U3RvcmUpLFxuICAgIHdlYWtNYXBTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy53ZWFrTWFwU3RvcmUpLFxuICAgIHdlYWtTZXRTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy53ZWFrU2V0U3RvcmUpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VIZWFwWm9uZShtYWtlSGVhcFpvbmUpO1xuaGFyZGVuKG1ha2VIZWFwWm9uZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSGVhcFpvbmUiOlsibWFrZUhlYXBab25lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABVusfp5AgAAeQIAACUAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vZXhwb3J0cy5qcyIsIi4vbWFrZS1vbmNlLmpzIiwiLi9rZXlzLmpzIiwiLi9pcy1wYXNzYWJsZS5qcyIsIi4vd2F0Y2gtcHJvbWlzZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyIsIi4vaXMtcGFzc2FibGUuanMiLCIuL2tleXMuanMiLCIuL21ha2Utb25jZS5qcyIsIi4vd2F0Y2gtcHJvbWlzZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2V4cG9ydHMuanNcIiwgW11dLFtcIi4vbWFrZS1vbmNlLmpzXCIsIFtdXSxbXCIuL2tleXMuanNcIiwgW11dLFtcIi4vaXMtcGFzc2FibGUuanNcIiwgW11dLFtcIi4vd2F0Y2gtcHJvbWlzZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA5fdIMdAIAAHQCAAArAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pcy1wYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiaXNQYXNzYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHJlYWxJc1Bhc3NhYmxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiaXNQYXNzYWJsZVwiLFskaM2PX2EgPT4gKHJlYWxJc1Bhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuICovXG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1Bhc3NhYmxlID0gc3BlY2ltZW4gPT4gcmVhbElzUGFzc2FibGUoc3BlY2ltZW4pOyRozY9fb25jZS5pc1Bhc3NhYmxlKGlzUGFzc2FibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZSI6WyJpc1Bhc3NhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMuP7MWYAwAAmAMAACQAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2tleXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFnb3JpY1ZhdERhdGFLZXlzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGtpbmQgPSBsYWJlbCA9PiBgJHtsYWJlbH1fa2luZEhhbmRsZWA7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHNpbmdsZXRvbiA9IGxhYmVsID0+IGAke2xhYmVsfV9zaW5nbGV0b25gO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgYWdvcmljVmF0RGF0YUtleXMgPSB7XG4gIGV4b0NsYXNzOiBsYWJlbCA9PiBoYXJkZW4oW2tpbmQobGFiZWwpXSksXG4gIGV4b0NsYXNzS2l0OiBsYWJlbCA9PiBoYXJkZW4oW2tpbmQobGFiZWwpXSksXG4gIGV4bzogbGFiZWwgPT4gaGFyZGVuKFtraW5kKGxhYmVsKSwgc2luZ2xldG9uKGxhYmVsKV0pLFxuICBzdG9yZTogbGFiZWwgPT4gaGFyZGVuKFtsYWJlbF0pLFxuICB6b25lOiBsYWJlbCA9PiBoYXJkZW4oW2xhYmVsXSksXG59OyRozY9fb25jZS5hZ29yaWNWYXREYXRhS2V5cyhhZ29yaWNWYXREYXRhS2V5cyk7XG5oYXJkZW4oYWdvcmljVmF0RGF0YUtleXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYWdvcmljVmF0RGF0YUtleXMiOlsiYWdvcmljVmF0RGF0YUtleXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGu6Z26UHAAClBwAAKQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvbWFrZS1vbmNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VPbmNlS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRlZmF1bHRMYWJlbFRvS2V5cyA9IGxhYmVsID0+IGhhcmRlbihbbGFiZWxdKTtcbmhhcmRlbihkZWZhdWx0TGFiZWxUb0tleXMpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZU9uY2VLaXQgPSAoZGVidWdOYW1lLCBzdG9yZXMsIGJhY2tpbmdTdG9yZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCB1c2VkS2V5cyA9IHN0b3Jlcy5kZXRhY2hlZCgpLnNldFN0b3JlKGAke2RlYnVnTmFtZX0gdXNlZCBrZXlzYCk7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXNzZXJ0T25seU9uY2UgPSBrZXkgPT4ge1xuICAgIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8IEZhaWxga2V5ICR7a2V5fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAhdXNlZEtleXMuaGFzKGtleSkgfHxcbiAgICAgIEZhaWxga2V5ICR7a2V5fSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gdGhpcyB6b25lIGFuZCBpbmNhcm5hdGlvbmA7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgdXNlZEtleXMuYWRkKGtleSk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3Qgd3JhcFByb3ZpZGVyID0gKHByb3ZpZGVyLCBsYWJlbFRvS2V5cyA9IGRlZmF1bHRMYWJlbFRvS2V5cykgPT4ge1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3Qgd3JhcHBlciA9IChsYWJlbCwgLi4ucmVzdCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgbGFiZWxUb0tleXMobGFiZWwpKSB7XG4gICAgICAgIGFzc2VydE9ubHlPbmNlKGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvdmlkZXIobGFiZWwsIC4uLnJlc3QpO1xuICAgIH07XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgKi8gKHdyYXBwZXIpO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VPbmNlID0gKGtleSwgbWFrZXIpID0+IHtcbiAgICBhc3NlcnRPbmx5T25jZShrZXkpO1xuICAgIGlmIChiYWNraW5nU3RvcmUgJiYgYmFja2luZ1N0b3JlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gYmFja2luZ1N0b3JlLmdldChrZXkpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IG1ha2VyKGtleSk7XG4gICAgc3RvcmVzLmlzU3RvcmFibGUodmFsdWUpIHx8XG4gICAgICBGYWlsYG1ha2VyIHJldHVybiB2YWx1ZSAke3ZhbHVlfSBpcyBub3Qgc3RvcmFibGVgO1xuICAgIGJhY2tpbmdTdG9yZSAmJiBiYWNraW5nU3RvcmUuaW5pdChrZXksIHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IG1ha2VPbmNlLCB3cmFwUHJvdmlkZXIgfSk7XG59OyRozY9fb25jZS5tYWtlT25jZUtpdChtYWtlT25jZUtpdCk7XG5oYXJkZW4obWFrZU9uY2VLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU9uY2VLaXQiOlsibWFrZU9uY2VLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABIX2R1EMAABRDAAAMgAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvcHJlcGFyZS1hdHRlbnVhdG9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIiwiQGVuZG8vcGF0dGVybnMiLCIuL2hlYXAuanMiXSwiZXhwb3J0cyI6WyJhdHRlbnVhdGVPbmUiLCJwcmVwYXJlQXR0ZW51YXRvck1ha2VyIiwid3JhcHBlck1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsZnJvbVVuaXF1ZUVudHJpZXMsTSxtYWtlSGVhcFpvbmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanNcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCIuL2hlYXAuanNcIiwgW1tcIm1ha2VIZWFwWm9uZVwiLFskaM2PX2EgPT4gKG1ha2VIZWFwWm9uZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3Qgd3JhcHBlck1ldGhvZHMgPSAoXG4gIHdyYXBwZXJLaW5kTmFtZSxcbiAgdU1ldGhvZE5hbWVzLFxuICBleHRyYU1ldGhvZHMgPSB7fSxcbikgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5mcm9tVW5pcXVlRW50cmllcyhcbiAgICAgIHVNZXRob2ROYW1lcy5tYXAobmFtZSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIFtuYW1lXSguLi5hcmdzKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgY29uc3QgeyB1bmRlcmx5aW5nIH0gPSB0aGlzLnN0YXRlO1xuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB1bmRlcmx5aW5nICE9PSB1bmRlZmluZWQgfHwgRmFpbGAke3Eod3JhcHBlcktpbmROYW1lKX0gcmV2b2tlZGA7XG5cbiAgICAgICAgICAgIHJldHVybiB1bmRlcmx5aW5nW25hbWVdKC4uLmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL1xuICAgICAgICB9W25hbWVdLFxuICAgICAgXSksXG4gICAgKSxcbiAgICAuLi5leHRyYU1ldGhvZHMsXG4gIH0pOyRozY9fb25jZS53cmFwcGVyTWV0aG9kcyh3cmFwcGVyTWV0aG9kcyk7XG5oYXJkZW4od3JhcHBlck1ldGhvZHMpO1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVBdHRlbnVhdG9yTWFrZXIgPSAoXG4gIHpvbmUsXG4gIHVLaW5kTmFtZSxcbiAgdU1ldGhvZE5hbWVzLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIHVJbnRlcmZhY2VOYW1lID0gdUtpbmROYW1lLFxuICAgIGV4dHJhTWV0aG9kR3VhcmRzID0ge30sXG4gICAgZXh0cmFNZXRob2RzID0ge30sXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBBdHRlbnVhdG9ySSA9IE0uaW50ZXJmYWNlKFxuICAgIGAke3VJbnRlcmZhY2VOYW1lfV9hdHRlbnVhdG9yYCxcbiAgICBleHRyYU1ldGhvZEd1YXJkcyxcbiAgICB7IGRlZmF1bHRHdWFyZHM6ICdyYXcnIH0sXG4gICk7XG5cbiAgY29uc3QgYXR0ZW51YXRvcktpbmROYW1lID0gYCR7dUtpbmROYW1lfV9hdHRlbnVhdG9yYDtcblxuICByZXR1cm4gem9uZS5leG9DbGFzcyhcbiAgICBhdHRlbnVhdG9yS2luZE5hbWUsXG4gICAgQXR0ZW51YXRvckksXG4gICAgdW5kZXJseWluZyA9PiAoeyB1bmRlcmx5aW5nIH0pLFxuICAgIHdyYXBwZXJNZXRob2RzKGF0dGVudWF0b3JLaW5kTmFtZSwgdU1ldGhvZE5hbWVzLCBleHRyYU1ldGhvZHMpLFxuICAgIHtcbiAgICAgIHN0YXRlU2hhcGU6IHsgdW5kZXJseWluZzogTS5vcHQoTS5yZW1vdGFibGUoJ3VuZGVybHlpbmcnKSkgfSxcbiAgICB9LFxuICApO1xufTskaM2PX29uY2UucHJlcGFyZUF0dGVudWF0b3JNYWtlcihwcmVwYXJlQXR0ZW51YXRvck1ha2VyKTtcbmhhcmRlbihwcmVwYXJlQXR0ZW51YXRvck1ha2VyKTtcblxuLy9cbmNvbnN0IFJlbW90YWJsZVByZWZpeFJFID0gL14oQWxsZWdlZDogfERlYnVnTmFtZTogKS87XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGF0dGVudWF0ZU9uZSA9ICh1bmRlcmx5aW5nLCB1TWV0aG9kTmFtZXMsIG9wdGlvbnMgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgaGVhcFpvbmUgPSBtYWtlSGVhcFpvbmUoKTtcbiAgY29uc3QgdUtpbmROYW1lID0gKHVuZGVybHlpbmdbU3ltYm9sLnRvU3RyaW5nVGFnXSB8fCAnVW5kZXJseWluZycpLnJlcGxhY2UoXG4gICAgUmVtb3RhYmxlUHJlZml4UkUsXG4gICAgJycsXG4gICk7XG4gIGNvbnN0IG1ha2VBdHRlbnVhdG9yID0gcHJlcGFyZUF0dGVudWF0b3JNYWtlcihcbiAgICBoZWFwWm9uZSxcbiAgICB1S2luZE5hbWUsXG4gICAgdU1ldGhvZE5hbWVzLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIHJldHVybiBtYWtlQXR0ZW51YXRvcih1bmRlcmx5aW5nKTtcbn07JGjNj19vbmNlLmF0dGVudWF0ZU9uZShhdHRlbnVhdGVPbmUpO1xuaGFyZGVuKGF0dGVudWF0ZU9uZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwcGVyTWV0aG9kcyI6WyJ3cmFwcGVyTWV0aG9kcyJdLCJwcmVwYXJlQXR0ZW51YXRvck1ha2VyIjpbInByZXBhcmVBdHRlbnVhdG9yTWFrZXIiXSwiYXR0ZW51YXRlT25lIjpbImF0dGVudWF0ZU9uZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACJVBCFgQoAAIEKAAAxAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9wcmVwYXJlLXJldm9jYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyIsIi4vcHJlcGFyZS1hdHRlbnVhdG9yLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSx3cmFwcGVyTWV0aG9kczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIi4vcHJlcGFyZS1hdHRlbnVhdG9yLmpzXCIsIFtbXCJ3cmFwcGVyTWV0aG9kc1wiLFskaM2PX2EgPT4gKHdyYXBwZXJNZXRob2RzID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0ID0gKFxuICB6b25lLFxuICB1S2luZE5hbWUsXG4gIHVNZXRob2ROYW1lcyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICB1SW50ZXJmYWNlTmFtZSA9IHVLaW5kTmFtZSxcbiAgICBleHRyYU1ldGhvZEd1YXJkcyA9IHt9LFxuICAgIGV4dHJhTWV0aG9kcyA9IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgUmV2b2NhYmxlSUtpdCA9IGhhcmRlbih7XG4gICAgcmV2b2tlcjogTS5pbnRlcmZhY2UoYCR7dUludGVyZmFjZU5hbWV9X3Jldm9rZXJgLCB7XG4gICAgICByZXZva2U6IE0uY2FsbCgpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICAgIH0pLFxuICAgIHJldm9jYWJsZTogTS5pbnRlcmZhY2UoYCR7dUludGVyZmFjZU5hbWV9X3Jldm9jYWJsZWAsIGV4dHJhTWV0aG9kR3VhcmRzLCB7XG4gICAgICBkZWZhdWx0R3VhcmRzOiAncmF3JyxcbiAgICB9KSxcbiAgfSk7XG5cbiAgY29uc3QgcmV2b2NhYmxlS2luZE5hbWUgPSBgJHt1S2luZE5hbWV9X2NhcmV0YWtlcmA7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBhbXBsaWZpZXI7XG5cbiAgY29uc3QgbWFrZVJldm9jYWJsZUtpdCA9IHpvbmUuZXhvQ2xhc3NLaXQoXG4gICAgcmV2b2NhYmxlS2luZE5hbWUsXG4gICAgUmV2b2NhYmxlSUtpdCxcbiAgICB1bmRlcmx5aW5nID0+ICh7IHVuZGVybHlpbmcgfSksXG4gICAge1xuICAgICAgcmV2b2tlcjoge1xuICAgICAgICByZXZva2UoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBpZiAoc3RhdGUudW5kZXJseWluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXRlLnVuZGVybHlpbmcgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcmV2b2NhYmxlOiB3cmFwcGVyTWV0aG9kcyhyZXZvY2FibGVLaW5kTmFtZSwgdU1ldGhvZE5hbWVzLCBleHRyYU1ldGhvZHMpLFxuICAgIH0sXG4gICAge1xuICAgICAgc3RhdGVTaGFwZTogeyB1bmRlcmx5aW5nOiBNLm9wdChNLnJlbW90YWJsZSgndW5kZXJseWluZycpKSB9LFxuICAgICAgcmVjZWl2ZUFtcGxpZmllcjogYW1wID0+IHtcbiAgICAgICAgYW1wbGlmaWVyID0gYW1wO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IG1ha2VSZXZvY2FibGUgPSB1bmRlcmx5aW5nID0+IG1ha2VSZXZvY2FibGVLaXQodW5kZXJseWluZykucmV2b2NhYmxlO1xuXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgcmV2b2tlID0gcmV2b2NhYmxlID0+IHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBmYWNldHMgPSBhbXBsaWZpZXIocmV2b2NhYmxlKTtcbiAgICBpZiAoZmFjZXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhY2V0cy5yZXZva2VyLnJldm9rZSgpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHJldm9rZSxcbiAgICBtYWtlUmV2b2NhYmxlLFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBtYWtlUmV2b2NhYmxlS2l0LFxuICB9KTtcbn07JGjNj19vbmNlLnByZXBhcmVSZXZvY2FibGVNYWtlcktpdChwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQpO1xuaGFyZGVuKHByZXBhcmVSZXZvY2FibGVNYWtlcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQiOlsicHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJVLZf3bCQAA2wkAAC0AAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3dhdGNoLXByb21pc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGF0dGVybnMiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiLCJQcm9taXNlV2F0Y2hlckhhbmRsZXIiLCJQcm9taXNlV2F0Y2hlckkiLCJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTSxFOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCBQcm9taXNlV2F0Y2hlckhhbmRsZXIgPSBNLmNhbGwoTS5yYXcoKSkucmVzdChNLnJhdygpKS5yZXR1cm5zKCk7XG5cbi8qXG5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlckhhbmRsZXIoUHJvbWlzZVdhdGNoZXJIYW5kbGVyKTtcbiAgICAgICBjb25zdCBQcm9taXNlV2F0Y2hlckkgPSBNLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXInLCB7XG4gIG9uRnVsZmlsbGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXIsXG4gIG9uUmVqZWN0ZWQ6IFByb21pc2VXYXRjaGVySGFuZGxlcixcbn0pO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJJKFByb21pc2VXYXRjaGVySSk7XG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJID0gTS5pbnRlcmZhY2UoJ1Byb21pc2VXYXRjaGVyRnVsZmlsbGVkJywge1xuICBvbkZ1bGZpbGxlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxufSk7XG5cbi8qXG5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkoUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJKTtcbiAgICAgICBjb25zdCBQcm9taXNlV2F0Y2hlclJlamVjdGVkSSA9IE0uaW50ZXJmYWNlKCdQcm9taXNlV2F0Y2hlclJlamVjdGVkJywge1xuICBvblJlamVjdGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXIsXG59KTtcblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkoUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkpO1xuY29uc3QgY2FsbE1lTWF5YmUgPSAodGhhdCwgcHJvcCwgcG9zdEFyZ3MpID0+IHtcbiAgY29uc3QgZm4gPSB0aGF0W3Byb3BdO1xuICBpZiAoIWZuKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBhc3NlcnQudHlwZW9mKGZuLCAnZnVuY3Rpb24nKTtcbiAgLypcblxuICAgKi9cbiAgY29uc3Qgd3JhcHBlZCA9IGFyZyA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGFwcGx5KGZuLCB0aGF0LCBbYXJnLCAuLi5wb3N0QXJnc10pO1xuICB9O1xuICByZXR1cm4gd3JhcHBlZDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB3YXRjaFByb21pc2UgPSAocCwgd2F0Y2hlciwgLi4ud2F0Y2hlckFyZ3MpID0+IHtcbiAgUHJvbWlzZS5yZXNvbHZlKHApID09PSBwIHx8IEZhaWxgd2F0Y2hQcm9taXNlIG9ubHkgd2F0Y2hlcyBwcm9taXNlc2A7XG4gIGNvbnN0IG9uRnVsZmlsbGVkID0gY2FsbE1lTWF5YmUod2F0Y2hlciwgJ29uRnVsZmlsbGVkJywgd2F0Y2hlckFyZ3MpO1xuICBjb25zdCBvblJlamVjdGVkID0gY2FsbE1lTWF5YmUod2F0Y2hlciwgJ29uUmVqZWN0ZWQnLCB3YXRjaGVyQXJncyk7XG4gIG9uRnVsZmlsbGVkIHx8XG4gICAgb25SZWplY3RlZCB8fFxuICAgIEZhaWxgcHJvbWlzZSB3YXRjaGVyIG11c3QgaW1wbGVtZW50IGF0IGxlYXN0IG9uZSBoYW5kbGVyIG1ldGhvZGA7XG4gIHZvaWQgRS53aGVuKHAsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbn07JGjNj19vbmNlLndhdGNoUHJvbWlzZSh3YXRjaFByb21pc2UpO1xuaGFyZGVuKHdhdGNoUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQcm9taXNlV2F0Y2hlckhhbmRsZXIiOlsiUHJvbWlzZVdhdGNoZXJIYW5kbGVyIl0sIlByb21pc2VXYXRjaGVySSI6WyJQcm9taXNlV2F0Y2hlckkiXSwiUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJIjpbIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSJdLCJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSI6WyJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSJdLCJ3YXRjaFByb21pc2UiOlsid2F0Y2hQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGwksGoWAgAAFgIAACgAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvem9uZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzIiwiLi9zcmMvcHJlcGFyZS1hdHRlbnVhdG9yLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvcHJlcGFyZS1hdHRlbnVhdG9yLmpzIiwiLi9zcmMvcHJlcGFyZS1yZXZvY2FibGUuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvcHJlcGFyZS1yZXZvY2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3ByZXBhcmUtYXR0ZW51YXRvci5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABDcFklox8AAKMfAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudE1hdGguanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJBbW91bnRNYXRoIiwiQXNzZXRLaW5kIiwiYXNzZXJ0QXNzZXRLaW5kIiwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIiwiZ2V0QXNzZXRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLHBhc3NTdHlsZU9mLGFzc2VydFJlbW90YWJsZSxhc3NlcnRSZWNvcmQsTSxtYXRjaGVzLG5hdE1hdGhIZWxwZXJzLHNldE1hdGhIZWxwZXJzLGNvcHlTZXRNYXRoSGVscGVycyxjb3B5QmFnTWF0aEhlbHBlcnM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJhc3NlcnRSZW1vdGFibGVcIixbJGjNj19hID0+IChhc3NlcnRSZW1vdGFibGUgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJuYXRNYXRoSGVscGVyc1wiLFskaM2PX2EgPT4gKG5hdE1hdGhIZWxwZXJzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1wiLCBbW1wic2V0TWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChzZXRNYXRoSGVscGVycyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5U2V0TWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChjb3B5U2V0TWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weUJhZ01hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoY29weUJhZ01hdGhIZWxwZXJzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vL1xuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IEFzc2V0S2luZCA9IC8qICAgICAgICAgICAgICAgICovICh7XG4gIE5BVDogJ25hdCcsXG4gIFNFVDogJ3NldCcsXG4gIENPUFlfU0VUOiAnY29weVNldCcsXG4gIENPUFlfQkFHOiAnY29weUJhZycsXG59KTskaM2PX29uY2UuQXNzZXRLaW5kKEFzc2V0S2luZCk7XG5oYXJkZW4oQXNzZXRLaW5kKTtcbmNvbnN0IGFzc2V0S2luZE5hbWVzID0gaGFyZGVuKE9iamVjdC52YWx1ZXMoQXNzZXRLaW5kKS5zb3J0KCkpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IGFzc2VydEFzc2V0S2luZCA9IGFsbGVnZWRBSyA9PiB7XG4gIGFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSykgfHxcbiAgICBGYWlsYFRoZSBhc3NldEtpbmQgJHthbGxlZ2VkQUt9IG11c3QgYmUgb25lIG9mICR7cShhc3NldEtpbmROYW1lcyl9YDtcbn07JGjNj19vbmNlLmFzc2VydEFzc2V0S2luZChhc3NlcnRBc3NldEtpbmQpO1xuaGFyZGVuKGFzc2VydEFzc2V0S2luZCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBoZWxwZXJzID0ge1xuICBuYXQ6IG5hdE1hdGhIZWxwZXJzLFxuICBzZXQ6IHNldE1hdGhIZWxwZXJzLFxuICBjb3B5U2V0OiBjb3B5U2V0TWF0aEhlbHBlcnMsXG4gIGNvcHlCYWc6IGNvcHlCYWdNYXRoSGVscGVycyxcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCA9IHZhbHVlID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsdWUpO1xuICBpZiAocGFzc1N0eWxlID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiAnbmF0JztcbiAgfVxuICBpZiAocGFzc1N0eWxlID09PSAnY29weUFycmF5Jykge1xuICAgIHJldHVybiAnc2V0JztcbiAgfVxuICBpZiAobWF0Y2hlcyh2YWx1ZSwgTS5zZXQoKSkpIHtcbiAgICByZXR1cm4gJ2NvcHlTZXQnO1xuICB9XG4gIGlmIChtYXRjaGVzKHZhbHVlLCBNLmJhZygpKSkge1xuICAgIHJldHVybiAnY29weUJhZyc7XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgdGhyb3cgRmFpbGB2YWx1ZSAke3ZhbHVlfSBtdXN0IGJlIGEgYmlnaW50LCBjb3B5U2V0LCBjb3B5QmFnLCBvciBhbiBhcnJheSwgbm90ICR7cShcbiAgICBwYXNzU3R5bGUsXG4gICl9YDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFZhbHVlR2V0SGVscGVycyA9IHZhbHVlID0+XG4gIC8vXG4gIGhlbHBlcnNbYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpXTtcblxuLypcblxuICovJGjNj19vbmNlLmFzc2VydFZhbHVlR2V0SGVscGVycyhhc3NlcnRWYWx1ZUdldEhlbHBlcnMpO1xuY29uc3Qgb3B0aW9uYWxCcmFuZENoZWNrID0gKGFsbGVnZWRCcmFuZCwgYnJhbmQpID0+IHtcbiAgaWYgKGJyYW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGFsbGVnZWRCcmFuZCA9PT0gYnJhbmQgfHxcbiAgICAgIEZhaWxgYW1vdW50J3MgYnJhbmQgJHtxKGFsbGVnZWRCcmFuZCl9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgYnJhbmQgJHtxKFxuICAgICAgICBicmFuZCxcbiAgICAgICl9YDtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrTFJBbmRHZXRIZWxwZXJzID0gKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICBhc3NlcnRSZWNvcmQobGVmdEFtb3VudCwgJ2xlZnRBbW91bnQnKTtcbiAgYXNzZXJ0UmVjb3JkKHJpZ2h0QW1vdW50LCAncmlnaHRBbW91bnQnKTtcbiAgY29uc3QgeyB2YWx1ZTogbGVmdFZhbHVlLCBicmFuZDogbGVmdEJyYW5kIH0gPSBsZWZ0QW1vdW50O1xuICBjb25zdCB7IHZhbHVlOiByaWdodFZhbHVlLCBicmFuZDogcmlnaHRCcmFuZCB9ID0gcmlnaHRBbW91bnQ7XG4gIGFzc2VydFJlbW90YWJsZShsZWZ0QnJhbmQsICdsZWZ0QnJhbmQnKTtcbiAgYXNzZXJ0UmVtb3RhYmxlKHJpZ2h0QnJhbmQsICdyaWdodEJyYW5kJyk7XG4gIG9wdGlvbmFsQnJhbmRDaGVjayhsZWZ0QnJhbmQsIGJyYW5kKTtcbiAgb3B0aW9uYWxCcmFuZENoZWNrKHJpZ2h0QnJhbmQsIGJyYW5kKTtcbiAgbGVmdEJyYW5kID09PSByaWdodEJyYW5kIHx8XG4gICAgRmFpbGBCcmFuZHMgaW4gbGVmdCAke3EobGVmdEJyYW5kKX0gYW5kIHJpZ2h0ICR7cShcbiAgICAgIHJpZ2h0QnJhbmQsXG4gICAgKX0gc2hvdWxkIG1hdGNoIGJ1dCBkbyBub3RgO1xuICBjb25zdCBsZWZ0SGVscGVycyA9IGFzc2VydFZhbHVlR2V0SGVscGVycyhsZWZ0VmFsdWUpO1xuICBjb25zdCByaWdodEhlbHBlcnMgPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnMocmlnaHRWYWx1ZSk7XG4gIGxlZnRIZWxwZXJzID09PSByaWdodEhlbHBlcnMgfHxcbiAgICBGYWlsYFRoZSBsZWZ0ICR7bGVmdEFtb3VudH0gYW5kIHJpZ2h0IGFtb3VudCAke3JpZ2h0QW1vdW50fSBoYWQgZGlmZmVyZW50IGFzc2V0S2luZHNgO1xuICByZXR1cm4gbGVmdEhlbHBlcnM7XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29lcmNlTFIgPSAoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpID0+IHtcbiAgLy9cbiAgcmV0dXJuIFtoLmRvQ29lcmNlKGxlZnRBbW91bnQudmFsdWUpLCBoLmRvQ29lcmNlKHJpZ2h0QW1vdW50LnZhbHVlKV07XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgaXNHVEUgPSAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IGggPSBjaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQpO1xuICByZXR1cm4gaC5kb0lzR1RFKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgQW1vdW50TWF0aCA9IHtcbiAgLy9cbiAgLy9cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgbWFrZTogKGJyYW5kLCBhbGxlZ2VkVmFsdWUpID0+IHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGNvbnN0IGggPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnMoYWxsZWdlZFZhbHVlKTtcbiAgICBjb25zdCB2YWx1ZSA9IGguZG9Db2VyY2UoYWxsZWdlZFZhbHVlKTtcbiAgICAvL1xuICAgIHJldHVybiBoYXJkZW4oeyBicmFuZCwgdmFsdWUgfSk7XG4gIH0sXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvZXJjZTogKGJyYW5kLCBhbGxlZ2VkQW1vdW50KSA9PiB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBhc3NlcnRSZWNvcmQoYWxsZWdlZEFtb3VudCwgJ2Ftb3VudCcpO1xuICAgIGNvbnN0IHsgYnJhbmQ6IGFsbGVnZWRCcmFuZCwgdmFsdWU6IGFsbGVnZWRWYWx1ZSB9ID0gYWxsZWdlZEFtb3VudDtcbiAgICBicmFuZCA9PT0gYWxsZWdlZEJyYW5kIHx8XG4gICAgICBGYWlsYFRoZSBicmFuZCBpbiB0aGUgYWxsZWdlZEFtb3VudCAke2FsbGVnZWRBbW91bnR9IGluICdjb2VyY2UnIGRpZG4ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIGJyYW5kICR7YnJhbmR9LmA7XG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiBBbW91bnRNYXRoLm1ha2UoYnJhbmQsIGFsbGVnZWRWYWx1ZSk7XG4gIH0sXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBnZXRWYWx1ZTogKGJyYW5kLCBhbW91bnQpID0+IEFtb3VudE1hdGguY29lcmNlKGJyYW5kLCBhbW91bnQpLnZhbHVlLFxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBtYWtlRW1wdHk6IChicmFuZCwgYXNzZXRLaW5kID0gLyogICAgICAgICAgICAgICAgKi8gKCduYXQnKSkgPT4ge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG4gICAgY29uc3QgdmFsdWUgPSBoZWxwZXJzW2Fzc2V0S2luZF0uZG9NYWtlRW1wdHkoKTtcbiAgICAvL1xuICAgIHJldHVybiBoYXJkZW4oeyBicmFuZCwgdmFsdWUgfSk7XG4gIH0sXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBtYWtlRW1wdHlGcm9tQW1vdW50OiBhbW91bnQgPT4ge1xuICAgIGFzc2VydFJlY29yZChhbW91bnQsICdhbW91bnQnKTtcbiAgICBjb25zdCB7IGJyYW5kLCB2YWx1ZSB9ID0gYW1vdW50O1xuICAgIGNvbnN0IGFzc2V0S2luZCA9IGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbiAgICAvL1xuICAgIHJldHVybiBBbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCwgYXNzZXRLaW5kKTtcbiAgfSxcbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBpc0VtcHR5OiAoYW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFzc2VydFJlY29yZChhbW91bnQsICdhbW91bnQnKTtcbiAgICBjb25zdCB7IGJyYW5kOiBhbGxlZ2VkQnJhbmQsIHZhbHVlIH0gPSBhbW91bnQ7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGFsbGVnZWRCcmFuZCwgJ2JyYW5kJyk7XG4gICAgb3B0aW9uYWxCcmFuZENoZWNrKGFsbGVnZWRCcmFuZCwgYnJhbmQpO1xuICAgIGNvbnN0IGggPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnModmFsdWUpO1xuICAgIHJldHVybiBoLmRvSXNFbXB0eShoLmRvQ29lcmNlKHZhbHVlKSk7XG4gIH0sXG4gIGlzR1RFLFxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGlzRXF1YWw6IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgICByZXR1cm4gaC5kb0lzRXF1YWwoLi4uY29lcmNlTFIoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpKTtcbiAgfSxcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBhZGQ6IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgICBjb25zdCB2YWx1ZSA9IGguZG9BZGQoLi4uY29lcmNlTFIoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpKTtcbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQ6IGxlZnRBbW91bnQuYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgc3VidHJhY3Q6IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgICBjb25zdCB2YWx1ZSA9IGguZG9TdWJ0cmFjdCguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xuICAgIC8vXG4gICAgcmV0dXJuIGhhcmRlbih7IGJyYW5kOiBsZWZ0QW1vdW50LmJyYW5kLCB2YWx1ZSB9KTtcbiAgfSxcbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgbWluOiAoeCwgeSwgYnJhbmQgPSB1bmRlZmluZWQpID0+XG4gICAgLy9cbiAgICBpc0dURSh4LCB5LCBicmFuZClcbiAgICAgID8geVxuICAgICAgOiBpc0dURSh5LCB4LCBicmFuZClcbiAgICAgICAgPyB4XG4gICAgICAgIDogRmFpbGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgLFxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBtYXg6ICh4LCB5LCBicmFuZCA9IHVuZGVmaW5lZCkgPT5cbiAgICAvL1xuICAgIGlzR1RFKHgsIHksIGJyYW5kKVxuICAgICAgPyB4XG4gICAgICA6IGlzR1RFKHksIHgpXG4gICAgICAgID8geVxuICAgICAgICA6IEZhaWxgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYCxcbn07JGjNj19vbmNlLkFtb3VudE1hdGgoQW1vdW50TWF0aCk7XG5oYXJkZW4oQW1vdW50TWF0aCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgZ2V0QXNzZXRLaW5kID0gYW1vdW50ID0+IHtcbiAgYXNzZXJ0UmVjb3JkKGFtb3VudCwgJ2Ftb3VudCcpO1xuICBjb25zdCB7IHZhbHVlIH0gPSBhbW91bnQ7XG4gIHJldHVybiBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG59OyRozY9fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQXNzZXRLaW5kIjpbIkFzc2V0S2luZCJdLCJhc3NlcnRBc3NldEtpbmQiOlsiYXNzZXJ0QXNzZXRLaW5kIl0sImFzc2VydFZhbHVlR2V0SGVscGVycyI6WyJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiXSwiQW1vdW50TWF0aCI6WyJBbW91bnRNYXRoIl0sImdldEFzc2V0S2luZCI6WyJnZXRBc3NldEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAExpaUjEEAAAxBAAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRTdG9yZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiXSwiZXhwb3J0cyI6WyJtYWtlQW1vdW50U3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRNYXRoOyRozY9faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dXSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUFtb3VudFN0b3JlID0gKHN0YXRlLCBrZXkpID0+IHtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgZ2V0QW1vdW50OiAoKSA9PiBzdGF0ZVtrZXldLFxuICAgIGluY3JlbWVudDogZGVsdGEgPT4ge1xuICAgICAgc3RhdGVba2V5XSA9IEFtb3VudE1hdGguYWRkKHN0YXRlW2tleV0sIGRlbHRhKTtcbiAgICB9LFxuICAgIGRlY3JlbWVudDogZGVsdGEgPT4ge1xuICAgICAgaWYgKEFtb3VudE1hdGguaXNHVEUoc3RhdGVba2V5XSwgZGVsdGEpKSB7XG4gICAgICAgIHN0YXRlW2tleV0gPSBBbW91bnRNYXRoLnN1YnRyYWN0KHN0YXRlW2tleV0sIGRlbHRhKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQW1vdW50U3RvcmUobWFrZUFtb3VudFN0b3JlKTtcbmhhcmRlbihtYWtlQW1vdW50U3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFtb3VudFN0b3JlIjpbIm1ha2VBbW91bnRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC4O4ykBwYAAAcGAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Rpc3BsYXlJbmZvLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbXVzdE1hdGNoLERpc3BsYXlJbmZvU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJEaXNwbGF5SW5mb1NoYXBlXCIsWyRozY9fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgY29lcmNlRGlzcGxheUluZm8gPSAoYWxsZWdlZERpc3BsYXlJbmZvLCBhc3NldEtpbmQpID0+IHtcbiAgbXVzdE1hdGNoKGFsbGVnZWREaXNwbGF5SW5mbywgRGlzcGxheUluZm9TaGFwZSwgJ2Rpc3BsYXlJbmZvJyk7XG5cbiAgaWYgKGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQgPT09IGFzc2V0S2luZCB8fFxuICAgICAgRmFpbGBkaXNwbGF5SW5mby5hc3NldEtpbmQgd2FzIHByZXNlbnQgKCR7YWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZH0pIGFuZCBkaWQgbm90IG1hdGNoIHRoZSBhc3NldEtpbmQgYXJndW1lbnQgKCR7YXNzZXRLaW5kfSlgO1xuICB9XG4gIGNvbnN0IGRpc3BsYXlJbmZvID0gaGFyZGVuKHsgLi4uYWxsZWdlZERpc3BsYXlJbmZvLCBhc3NldEtpbmQgfSk7XG5cbiAgaWYgKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMpIHx8XG4gICAgICBGYWlsYGRlY2ltYWxQbGFjZXMgJHtkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzfSBpcyBub3QgYSBzYWZlIGludGVnZXJgO1xuICB9XG5cbiAgcmV0dXJuIGRpc3BsYXlJbmZvO1xufTskaM2PX29uY2UuY29lcmNlRGlzcGxheUluZm8oY29lcmNlRGlzcGxheUluZm8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29lcmNlRGlzcGxheUluZm8iOlsiY29lcmNlRGlzcGxheUluZm8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA819NA00CAABNAgAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ1k6WEdGAAAHRgAACUAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaXNzdWVyS2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b25lL2R1cmFibGUuanMiLCIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIl0sImV4cG9ydHMiOlsiaGFzSXNzdWVyIiwibWFrZUR1cmFibGVJc3N1ZXJLaXQiLCJtYWtlSXNzdWVyS2l0IiwicHJlcGFyZUlzc3VlcktpdCIsInVwZ3JhZGVJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQsRmFpbCxhc3NlcnRQYXR0ZXJuLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxtYWtlRHVyYWJsZVpvbmUsQXNzZXRLaW5kLGFzc2VydEFzc2V0S2luZCxjb2VyY2VEaXNwbGF5SW5mbyxwcmVwYXJlUGF5bWVudExlZGdlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvbmUvZHVyYWJsZS5qc1wiLCBbW1wibWFrZUR1cmFibGVab25lXCIsWyRozY9fYSA9PiAobWFrZUR1cmFibGVab25lID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBc3NldEtpbmRcIixbJGjNj19hID0+IChBc3NldEtpbmQgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0QXNzZXRLaW5kXCIsWyRozY9fYSA9PiAoYXNzZXJ0QXNzZXRLaW5kID0gJGjNj19hKV1dXV0sW1wiLi9kaXNwbGF5SW5mby5qc1wiLCBbW1wiY29lcmNlRGlzcGxheUluZm9cIixbJGjNj19hID0+IChjb2VyY2VEaXNwbGF5SW5mbyA9ICRozY9fYSldXV1dLFtcIi4vcGF5bWVudExlZGdlci5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRMZWRnZXJcIixbJGjNj19hID0+IChwcmVwYXJlUGF5bWVudExlZGdlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzZXR1cElzc3VlcktpdCA9IChcbiAgeyBuYW1lLCBhc3NldEtpbmQsIGRpc3BsYXlJbmZvLCBlbGVtZW50U2hhcGUgfSxcbiAgaXNzdWVyWm9uZSxcbiAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gIGFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuXG4gIC8vXG4gIGNvbnN0IGNsZWFuRGlzcGxheUluZm8gPSBjb2VyY2VEaXNwbGF5SW5mbyhkaXNwbGF5SW5mbywgYXNzZXRLaW5kKTtcbiAgaWYgKG9wdFNodXRkb3duV2l0aEZhaWx1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwgJ2Z1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAoZWxlbWVudFNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gIH1cblxuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8vXG4gIGNvbnN0IHsgaXNzdWVyLCBtaW50LCBicmFuZCwgbWludFJlY292ZXJ5UHVyc2UgfSA9IHByZXBhcmVQYXltZW50TGVkZ2VyKFxuICAgIGlzc3VlclpvbmUsXG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgY2xlYW5EaXNwbGF5SW5mbyxcbiAgICBlbGVtZW50U2hhcGUsXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBicmFuZCxcbiAgICBpc3N1ZXIsXG4gICAgbWludCxcbiAgICBtaW50UmVjb3ZlcnlQdXJzZSxcbiAgICBkaXNwbGF5SW5mbzogY2xlYW5EaXNwbGF5SW5mbyxcbiAgfSk7XG59O1xuaGFyZGVuKHNldHVwSXNzdWVyS2l0KTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgSU5TVEFOQ0VfS0VZID0gJ2lzc3Vlcic7XG4vKlxuXG5cblxuICovXG5jb25zdCBSRUNPVkVSWV9TRVRTX1NUQVRFID0gJ3JlY292ZXJ5U2V0c1N0YXRlJztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHVwZ3JhZGVJc3N1ZXJLaXQgPSAoXG4gIGlzc3VlckJhZ2dhZ2UsXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBpc3N1ZXJSZWNvcmQgPSBpc3N1ZXJCYWdnYWdlLmdldChJTlNUQU5DRV9LRVkpO1xuICBjb25zdCBpc3N1ZXJab25lID0gbWFrZUR1cmFibGVab25lKGlzc3VlckJhZ2dhZ2UpO1xuICBjb25zdCBvbGRSZWNvdmVyeVNldHNTdGF0ZSA9IGlzc3VlckJhZ2dhZ2UuaGFzKFJFQ09WRVJZX1NFVFNfU1RBVEUpXG4gICAgPyBpc3N1ZXJCYWdnYWdlLmdldChSRUNPVkVSWV9TRVRTX1NUQVRFKVxuICAgIDogJ2hhc1JlY292ZXJ5U2V0cyc7XG4gIGlmIChcbiAgICBvbGRSZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJyAmJlxuICAgIHJlY292ZXJ5U2V0c09wdGlvbiA9PT0gJ2hhc1JlY292ZXJ5U2V0cydcbiAgKSB7XG4gICAgRmFpbGBDYW5ub3QgKHlldD8pIHVwZ3JhZGUgZnJvbSAnbm9SZWNvdmVyeVNldHMnIHRvICdoYXNSZWNvdmVyeVNldHMnYDtcbiAgfVxuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCByZWNvdmVyeVNldHNTdGF0ZSA9IHJlY292ZXJ5U2V0c09wdGlvbiB8fCBvbGRSZWNvdmVyeVNldHNTdGF0ZTtcbiAgcmV0dXJuIHNldHVwSXNzdWVyS2l0KFxuICAgIGlzc3VlclJlY29yZCxcbiAgICBpc3N1ZXJab25lLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICk7XG59OyRozY9fb25jZS51cGdyYWRlSXNzdWVyS2l0KHVwZ3JhZGVJc3N1ZXJLaXQpO1xuaGFyZGVuKHVwZ3JhZGVJc3N1ZXJLaXQpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgaGFzSXNzdWVyID0gYmFnZ2FnZSA9PiBiYWdnYWdlLmhhcyhJTlNUQU5DRV9LRVkpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaGFzSXNzdWVyKGhhc0lzc3Vlcik7XG4gICAgICAgY29uc3QgbWFrZUR1cmFibGVJc3N1ZXJLaXQgPSAoXG4gIGlzc3VlckJhZ2dhZ2UsXG4gIG5hbWUsXG4gIC8vXG4gIGFzc2V0S2luZCA9IEFzc2V0S2luZC5OQVQsXG4gIGRpc3BsYXlJbmZvID0gaGFyZGVuKHt9KSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbiAgeyBlbGVtZW50U2hhcGUgPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgaXNzdWVyRGF0YSA9IGhhcmRlbih7XG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgZGlzcGxheUluZm8sXG4gICAgZWxlbWVudFNoYXBlLFxuICB9KTtcbiAgaXNzdWVyQmFnZ2FnZS5pbml0KElOU1RBTkNFX0tFWSwgaXNzdWVyRGF0YSk7XG4gIGNvbnN0IGlzc3VlclpvbmUgPSBtYWtlRHVyYWJsZVpvbmUoaXNzdWVyQmFnZ2FnZSk7XG4gIGNvbnN0IHJlY292ZXJ5U2V0c1N0YXRlID0gcmVjb3ZlcnlTZXRzT3B0aW9uIHx8ICdoYXNSZWNvdmVyeVNldHMnO1xuICBpc3N1ZXJCYWdnYWdlLmluaXQoUkVDT1ZFUllfU0VUU19TVEFURSwgcmVjb3ZlcnlTZXRzU3RhdGUpO1xuICByZXR1cm4gc2V0dXBJc3N1ZXJLaXQoXG4gICAgaXNzdWVyRGF0YSxcbiAgICBpc3N1ZXJab25lLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICk7XG59OyRozY9fb25jZS5tYWtlRHVyYWJsZUlzc3VlcktpdChtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlSXNzdWVyS2l0ID0gKFxuICBpc3N1ZXJCYWdnYWdlLFxuICBuYW1lLFxuICAvL1xuICBhc3NldEtpbmQgPSBBc3NldEtpbmQuTkFULFxuICBkaXNwbGF5SW5mbyA9IGhhcmRlbih7fSksXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIC8vXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBpZiAoaGFzSXNzdWVyKGlzc3VlckJhZ2dhZ2UpKSB7XG4gICAgY29uc3QgeyBlbGVtZW50U2hhcGU6IF8gPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID1cbiAgICAgIG9wdGlvbnM7XG4gICAgY29uc3QgaXNzdWVyS2l0ID0gdXBncmFkZUlzc3VlcktpdChcbiAgICAgIGlzc3VlckJhZ2dhZ2UsXG4gICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICAgICAgcmVjb3ZlcnlTZXRzT3B0aW9uLFxuICAgICk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG5cbiAgICAvL1xuICAgIHJldHVybiBpc3N1ZXJLaXQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaXNzdWVyS2l0ID0gbWFrZUR1cmFibGVJc3N1ZXJLaXQoXG4gICAgICBpc3N1ZXJCYWdnYWdlLFxuICAgICAgbmFtZSxcbiAgICAgIGFzc2V0S2luZCxcbiAgICAgIGRpc3BsYXlJbmZvLFxuICAgICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgICAvL1xuICAgIHJldHVybiBpc3N1ZXJLaXQ7XG4gIH1cbn07JGjNj19vbmNlLnByZXBhcmVJc3N1ZXJLaXQocHJlcGFyZUlzc3VlcktpdCk7XG5oYXJkZW4ocHJlcGFyZUlzc3VlcktpdCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUlzc3VlcktpdCA9IChcbiAgbmFtZSxcbiAgLy9cbiAgYXNzZXRLaW5kID0gQXNzZXRLaW5kLk5BVCxcbiAgZGlzcGxheUluZm8gPSBoYXJkZW4oe30pLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuICAvL1xuICB7IGVsZW1lbnRTaGFwZSA9IHVuZGVmaW5lZCwgcmVjb3ZlcnlTZXRzT3B0aW9uID0gdW5kZWZpbmVkIH0gPSB7fSxcbikgPT5cbiAgLy9cbiAgbWFrZUR1cmFibGVJc3N1ZXJLaXQoXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLCB7IGR1cmFibGU6IHRydWUgfSksXG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgZGlzcGxheUluZm8sXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgICB7IGVsZW1lbnRTaGFwZSwgcmVjb3ZlcnlTZXRzT3B0aW9uIH0sXG4gICk7JGjNj19vbmNlLm1ha2VJc3N1ZXJLaXQobWFrZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUlzc3VlcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ1cGdyYWRlSXNzdWVyS2l0IjpbInVwZ3JhZGVJc3N1ZXJLaXQiXSwiaGFzSXNzdWVyIjpbImhhc0lzc3VlciJdLCJtYWtlRHVyYWJsZUlzc3VlcktpdCI6WyJtYWtlRHVyYWJsZUlzc3VlcktpdCJdLCJwcmVwYXJlSXNzdWVyS2l0IjpbInByZXBhcmVJc3N1ZXJLaXQiXSwibWFrZUlzc3VlcktpdCI6WyJtYWtlSXNzdWVyS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADTpUBQSBgAAEgYAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBrZXlFUSxtYWtlQ29weUJhZyxtdXN0TWF0Y2gsTSxnZXRDb3B5QmFnRW50cmllcyxiYWdJc1N1cGVyYmFnLGJhZ1VuaW9uLGJhZ0Rpc2pvaW50U3VidHJhY3Q7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5QmFnXCIsWyRozY9fYSA9PiAobWFrZUNvcHlCYWcgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLFskaM2PX2EgPT4gKGJhZ0lzU3VwZXJiYWcgPSAkaM2PX2EpXV0sW1wiYmFnVW5pb25cIixbJGjNj19hID0+IChiYWdVbmlvbiA9ICRozY9fYSldXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsWyRozY9fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZW1wdHkgPSBtYWtlQ29weUJhZyhbXSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IGNvcHlCYWdNYXRoSGVscGVycyA9IGhhcmRlbih7XG4gIGRvQ29lcmNlOiBiYWcgPT4ge1xuICAgIG11c3RNYXRjaChiYWcsIE0uYmFnKCksICdiYWcgb2YgYW1vdW50Jyk7XG4gICAgcmV0dXJuIGJhZztcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IGJhZyA9PiBnZXRDb3B5QmFnRW50cmllcyhiYWcpLmxlbmd0aCA9PT0gMCxcbiAgZG9Jc0dURTogYmFnSXNTdXBlcmJhZyxcbiAgZG9Jc0VxdWFsOiBrZXlFUSxcbiAgZG9BZGQ6IGJhZ1VuaW9uLFxuICBkb1N1YnRyYWN0OiBiYWdEaXNqb2ludFN1YnRyYWN0LFxufSk7JGjNj19vbmNlLmNvcHlCYWdNYXRoSGVscGVycyhjb3B5QmFnTWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weUJhZ01hdGhIZWxwZXJzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAChmPGE0AUAANAFAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weVNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQga2V5RVEsbWFrZUNvcHlTZXQsbXVzdE1hdGNoLE0sZ2V0Q29weVNldEtleXMsc2V0SXNTdXBlcnNldCxzZXREaXNqb2ludFVuaW9uLHNldERpc2pvaW50U3VidHJhY3Q7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImdldENvcHlTZXRLZXlzXCIsWyRozY9fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaM2PX2EpXV0sW1wic2V0SXNTdXBlcnNldFwiLFskaM2PX2EgPT4gKHNldElzU3VwZXJzZXQgPSAkaM2PX2EpXV0sW1wic2V0RGlzam9pbnRVbmlvblwiLFskaM2PX2EgPT4gKHNldERpc2pvaW50VW5pb24gPSAkaM2PX2EpXV0sW1wic2V0RGlzam9pbnRTdWJ0cmFjdFwiLFskaM2PX2EgPT4gKHNldERpc2pvaW50U3VidHJhY3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZW1wdHkgPSBtYWtlQ29weVNldChbXSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgY29weVNldE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IHNldCA9PiB7XG4gICAgbXVzdE1hdGNoKHNldCwgTS5zZXQoKSwgJ3NldCBvZiBhbW91bnQnKTtcbiAgICByZXR1cm4gc2V0O1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogc2V0ID0+IGdldENvcHlTZXRLZXlzKHNldCkubGVuZ3RoID09PSAwLFxuICBkb0lzR1RFOiBzZXRJc1N1cGVyc2V0LFxuICBkb0lzRXF1YWw6IGtleUVRLFxuICBkb0FkZDogc2V0RGlzam9pbnRVbmlvbixcbiAgZG9TdWJ0cmFjdDogc2V0RGlzam9pbnRTdWJ0cmFjdCxcbn0pOyRozY9fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlTZXRNYXRoSGVscGVycyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA82r1OrsEAAC7BAAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJuYXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTmF0LGlzTmF0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dLFtcImlzTmF0XCIsWyRozY9fYSA9PiAoaXNOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgZW1wdHkgPSAwbjtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG5hdE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IG5hdCA9PiB7XG4gICAgLy9cbiAgICBhc3NlcnQudHlwZW9mKG5hdCwgJ2JpZ2ludCcpO1xuICAgIGlzTmF0KG5hdCkgfHwgRmFpbGB2YWx1ZSAke25hdH0gbXVzdCBiZSBhIG5hdHVyYWwgbnVtYmVyYDtcbiAgICByZXR1cm4gTmF0KG5hdCk7XG4gIH0sXG4gIGRvTWFrZUVtcHR5OiAoKSA9PiBlbXB0eSxcbiAgZG9Jc0VtcHR5OiBuYXQgPT4gbmF0ID09PSBlbXB0eSxcbiAgZG9Jc0dURTogKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ID49IHJpZ2h0LFxuICBkb0lzRXF1YWw6IChsZWZ0LCByaWdodCkgPT4gbGVmdCA9PT0gcmlnaHQsXG4gIC8vXG4gIGRvQWRkOiAobGVmdCwgcmlnaHQpID0+IGxlZnQgKyByaWdodCxcbiAgZG9TdWJ0cmFjdDogKGxlZnQsIHJpZ2h0KSA9PiBOYXQobGVmdCAtIHJpZ2h0KSxcbn0pOyRozY9fb25jZS5uYXRNYXRoSGVscGVycyhuYXRNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJuYXRNYXRoSGVscGVycyI6WyJuYXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACB+ofGmAYAAJgGAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsic2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixhc3NlcnRLZXksZWxlbWVudHNJc1N1cGVyc2V0LGVsZW1lbnRzRGlzam9pbnRVbmlvbixlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QsY29lcmNlVG9FbGVtZW50cyxlbGVtZW50c0NvbXBhcmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImVsZW1lbnRzSXNTdXBlcnNldFwiLFskaM2PX2EgPT4gKGVsZW1lbnRzSXNTdXBlcnNldCA9ICRozY9fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50VW5pb25cIixbJGjNj19hID0+IChlbGVtZW50c0Rpc2pvaW50VW5pb24gPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0XCIsWyRozY9fYSA9PiAoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0ID0gJGjNj19hKV1dLFtcImNvZXJjZVRvRWxlbWVudHNcIixbJGjNj19hID0+IChjb2VyY2VUb0VsZW1lbnRzID0gJGjNj19hKV1dLFtcImVsZW1lbnRzQ29tcGFyZVwiLFskaM2PX2EgPT4gKGVsZW1lbnRzQ29tcGFyZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGVtcHR5ID0gaGFyZGVuKFtdKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBzZXRNYXRoSGVscGVycyA9IGhhcmRlbih7XG4gIGRvQ29lcmNlOiBsaXN0ID0+IHtcbiAgICBsaXN0ID0gY29lcmNlVG9FbGVtZW50cyhsaXN0KTtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGFzc2VydEtleShsaXN0KTtcbiAgICByZXR1cm4gbGlzdDtcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IGxpc3QgPT4gcGFzc1N0eWxlT2YobGlzdCkgPT09ICdjb3B5QXJyYXknICYmIGxpc3QubGVuZ3RoID09PSAwLFxuICBkb0lzR1RFOiBlbGVtZW50c0lzU3VwZXJzZXQsXG4gIGRvSXNFcXVhbDogKHgsIHkpID0+IGVsZW1lbnRzQ29tcGFyZSh4LCB5KSA9PT0gMCxcbiAgZG9BZGQ6IGVsZW1lbnRzRGlzam9pbnRVbmlvbixcbiAgZG9TdWJ0cmFjdDogZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LFxufSk7JGjNj19vbmNlLnNldE1hdGhIZWxwZXJzKHNldE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNldE1hdGhIZWxwZXJzIjpbInNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ57M0HJAwAAyQMAACMAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaW5pdEVtcHR5OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsWyRozY9fYSA9PiAoaW5pdEVtcHR5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vL1xuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVQYXltZW50S2luZCA9IChpc3N1ZXJab25lLCBuYW1lLCBicmFuZCwgUGF5bWVudEkpID0+IHtcbiAgY29uc3QgbWFrZVBheW1lbnQgPSBpc3N1ZXJab25lLmV4b0NsYXNzKFxuICAgIGAke25hbWV9IHBheW1lbnRgLFxuICAgIFBheW1lbnRJLFxuICAgIGluaXRFbXB0eSxcbiAgICB7XG4gICAgICBnZXRBbGxlZ2VkQnJhbmQoKSB7XG4gICAgICAgIHJldHVybiBicmFuZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbiAgLy9cbiAgcmV0dXJuIG1ha2VQYXltZW50O1xufTskaM2PX29uY2UucHJlcGFyZVBheW1lbnRLaW5kKHByZXBhcmVQYXltZW50S2luZCk7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRLaW5kKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50S2luZCI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAslt9GjAlAAAwJQAAKQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50TGVkZ2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vcGF0dGVybnMiLCIuL2Ftb3VudE1hdGguanMiLCIuL3BheW1lbnQuanMiLCIuL3B1cnNlLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsYW5ub3RhdGVFcnJvcixYLGlzUHJvbWlzZSxtdXN0TWF0Y2gsTSxrZXlFUSxBbW91bnRNYXRoLHByZXBhcmVQYXltZW50S2luZCxwcmVwYXJlUHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRLaW5kXCIsWyRozY9fYSA9PiAocHJlcGFyZVBheW1lbnRLaW5kID0gJGjNj19hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1wicHJlcGFyZVB1cnNlS2luZFwiLFskaM2PX2EgPT4gKHByZXBhcmVQdXJzZUtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLFskaM2PX2EgPT4gKEJyYW5kSSA9ICRozY9fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLFskaM2PX2EgPT4gKG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUgPSAoYnJhbmQsIGFzc2V0S2luZCwgZWxlbWVudFNoYXBlKSA9PiB7XG4gIGxldCB2YWx1ZVNoYXBlO1xuICBzd2l0Y2ggKGFzc2V0S2luZCkge1xuICAgIGNhc2UgJ25hdCc6IHtcbiAgICAgIHZhbHVlU2hhcGUgPSBNLm5hdCgpO1xuICAgICAgZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBGdW5naWJsZSBhc3NldHMgY2Fubm90IGhhdmUgYW4gZWxlbWVudFNoYXBlOiAke3EoZWxlbWVudFNoYXBlKX1gO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3NldCc6IHtcbiAgICAgIGlmIChlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5hcnJheU9mKE0ua2V5KCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYXJyYXlPZihNLmFuZChNLmtleSgpLCBlbGVtZW50U2hhcGUpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgaWYgKGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLnNldCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgaWYgKGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLmJhZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYmFnT2YoZWxlbWVudFNoYXBlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBGYWlsYHVuZXhwZWN0ZWQgYXNzZXQga2luZCAke3EoYXNzZXRLaW5kKX1gO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFtb3VudFNoYXBlID0gaGFyZGVuKHtcbiAgICBicmFuZCwgLy9cbiAgICB2YWx1ZTogdmFsdWVTaGFwZSxcbiAgfSk7XG4gIHJldHVybiBhbW91bnRTaGFwZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUGF5bWVudExlZGdlciA9IChcbiAgaXNzdWVyWm9uZSxcbiAgbmFtZSxcbiAgYXNzZXRLaW5kLFxuICBkaXNwbGF5SW5mbyxcbiAgZWxlbWVudFNoYXBlLFxuICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICAvL1xuICBjb25zdCBicmFuZCA9IGlzc3VlclpvbmUuZXhvKGAke25hbWV9IGJyYW5kYCwgQnJhbmRJLCB7XG4gICAgaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGFsbGVnZWRJc3N1ZXIgPT09IGlzc3VlcjtcbiAgICB9LFxuICAgIGdldEFsbGVnZWROYW1lKCkge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfSxcbiAgICAvL1xuICAgIGdldERpc3BsYXlJbmZvKCkge1xuICAgICAgcmV0dXJuIGRpc3BsYXlJbmZvO1xuICAgIH0sXG4gICAgZ2V0QW1vdW50U2hhcGUoKSB7XG4gICAgICByZXR1cm4gYW1vdW50U2hhcGU7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgYW1vdW50U2hhcGUgPSBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG4gICAgYnJhbmQsXG4gICAgYXNzZXRLaW5kLFxuICAgIGVsZW1lbnRTaGFwZSxcbiAgKTtcblxuICBjb25zdCB7IElzc3VlckksIE1pbnRJLCBQYXltZW50SSwgUHVyc2VJS2l0IH0gPSBtYWtlSXNzdWVySW50ZXJmYWNlcyhcbiAgICBicmFuZCxcbiAgICBhc3NldEtpbmQsXG4gICAgYW1vdW50U2hhcGUsXG4gICk7XG5cbiAgY29uc3QgbWFrZVBheW1lbnQgPSBwcmVwYXJlUGF5bWVudEtpbmQoaXNzdWVyWm9uZSwgbmFtZSwgYnJhbmQsIFBheW1lbnRJKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUgPSByZWFzb24gPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAob3B0U2h1dGRvd25XaXRoRmFpbHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlKHJlYXNvbik7XG4gICAgICB9IGNhdGNoIChlcnJJblNodXRkb3duKSB7XG4gICAgICAgIGFubm90YXRlRXJyb3IoZXJySW5TaHV0ZG93biwgWGBDYXVzZWQgYnk6ICR7cmVhc29ufWApO1xuICAgICAgICB0aHJvdyBlcnJJblNodXRkb3duO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyByZWFzb247XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcGF5bWVudExlZGdlciA9IGlzc3VlclpvbmUud2Vha01hcFN0b3JlKCdwYXltZW50TGVkZ2VyJywge1xuICAgIHZhbHVlU2hhcGU6IGFtb3VudFNoYXBlLFxuICB9KTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHMgPSBpc3N1ZXJab25lLndlYWtNYXBTdG9yZSgncGF5bWVudFJlY292ZXJ5U2V0cycpO1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBpbml0UGF5bWVudCA9IChwYXltZW50LCBhbW91bnQsIG9wdFJlY292ZXJ5U2V0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnKSB7XG4gICAgICBvcHRSZWNvdmVyeVNldCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgd2hlbiByZWNvdmVyU2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnLCBvcHRSZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcbiAgICB9XG4gICAgaWYgKG9wdFJlY292ZXJ5U2V0ICE9PSB1bmRlZmluZWQgJiYgIUFtb3VudE1hdGguaXNFbXB0eShhbW91bnQpKSB7XG4gICAgICBvcHRSZWNvdmVyeVNldC5hZGQocGF5bWVudCk7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzLmluaXQocGF5bWVudCwgb3B0UmVjb3ZlcnlTZXQpO1xuICAgIH1cbiAgICBwYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCwgYW1vdW50KTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWxldGVQYXltZW50ID0gcGF5bWVudCA9PiB7XG4gICAgcGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG4gICAgaWYgKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKSB7XG4gICAgICBjb25zdCByZWNvdmVyeVNldCA9IHBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xuICAgICAgcGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG4gICAgICByZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb2VyY2UgPSBhbGxlZ2VkQW1vdW50ID0+IEFtb3VudE1hdGguY29lcmNlKGJyYW5kLCBhbGxlZ2VkQW1vdW50KTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBhc3NlcnRBbW91bnRDb25zaXN0ZW50ID0gKHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSkgPT4ge1xuICAgIGlmIChvcHRBbW91bnRTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2gocGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlLCAnYW1vdW50Jyk7XG4gICAgfVxuICB9O1xuXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgYXNzZXJ0TGl2ZVBheW1lbnQgPSBwYXltZW50ID0+IHtcbiAgICBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KSB8fFxuICAgICAgRmFpbGAke3BheW1lbnR9IHdhcyBub3QgYSBsaXZlIHBheW1lbnQgZm9yIGJyYW5kICR7cShcbiAgICAgICAgYnJhbmQsXG4gICAgICApfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZGVwb3NpdEludGVybmFsID0gKFxuICAgIGJhbGFuY2VTdG9yZSxcbiAgICBzcmNQYXltZW50LFxuICAgIG9wdEFtb3VudFNoYXBlID0gdW5kZWZpbmVkLFxuICApID0+IHtcbiAgICAhaXNQcm9taXNlKHNyY1BheW1lbnQpIHx8XG4gICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgYGRlcG9zaXQgZG9lcyBub3QgYWNjZXB0IHByb21pc2VzIGFzIGZpcnN0IGFyZ3VtZW50LiBJbnN0ZWFkIG9mIHBhc3NpbmcgdGhlIHByb21pc2UgKGRlcG9zaXQocGF5bWVudFByb21pc2UpKSwgY29uc2lkZXIgdW53cmFwcGluZyB0aGUgcHJvbWlzZSBmaXJzdDogRS53aGVuKHBheW1lbnRQcm9taXNlLCAoYWN0dWFsUGF5bWVudCA9PiBkZXBvc2l0KGFjdHVhbFBheW1lbnQpKWAsXG4gICAgICAgIFR5cGVFcnJvcixcbiAgICAgICk7XG4gICAgYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG4gICAgY29uc3Qgc3JjUGF5bWVudEJhbGFuY2UgPSBwYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbiAgICBhc3NlcnRBbW91bnRDb25zaXN0ZW50KHNyY1BheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSk7XG4gICAgdHJ5IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGRlbGV0ZVBheW1lbnQoc3JjUGF5bWVudCk7XG4gICAgICBiYWxhbmNlU3RvcmUuaW5jcmVtZW50KHNyY1BheW1lbnRCYWxhbmNlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCB3aXRoZHJhd0ludGVybmFsID0gKGJhbGFuY2VTdG9yZSwgYW1vdW50LCByZWNvdmVyeVNldCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFtb3VudCA9IGNvZXJjZShhbW91bnQpO1xuICAgIGNvbnN0IHBheW1lbnQgPSBtYWtlUGF5bWVudCgpO1xuICAgIC8vXG4gICAgLy9cbiAgICBiYWxhbmNlU3RvcmUuZGVjcmVtZW50KGFtb3VudCkgfHxcbiAgICAgIEZhaWxgV2l0aGRyYXdhbCBvZiAke2Ftb3VudH0gZmFpbGVkIGJlY2F1c2UgdGhlIHB1cnNlIG9ubHkgY29udGFpbmVkICR7YmFsYW5jZVN0b3JlLmdldEFtb3VudCgpfWA7XG4gICAgdHJ5IHtcbiAgICAgIGluaXRQYXltZW50KHBheW1lbnQsIGFtb3VudCwgcmVjb3ZlcnlTZXQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bWVudDtcbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvL1xuICBjb25zdCBtYWtlRW1wdHlQdXJzZSA9IHByZXBhcmVQdXJzZUtpbmQoXG4gICAgaXNzdWVyWm9uZSxcbiAgICBuYW1lLFxuICAgIGFzc2V0S2luZCxcbiAgICBicmFuZCxcbiAgICBQdXJzZUlLaXQsXG4gICAgaGFyZGVuKHtcbiAgICAgIGRlcG9zaXRJbnRlcm5hbCxcbiAgICAgIHdpdGhkcmF3SW50ZXJuYWwsXG4gICAgfSksXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgcGF5bWVudFJlY292ZXJ5U2V0cyxcbiAgKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgKi9cbiAgLy9cbiAgY29uc3QgaXNzdWVyID0gaXNzdWVyWm9uZS5leG8oYCR7bmFtZX0gaXNzdWVyYCwgSXNzdWVySSwge1xuICAgIGdldEJyYW5kKCkge1xuICAgICAgcmV0dXJuIGJyYW5kO1xuICAgIH0sXG4gICAgZ2V0QWxsZWdlZE5hbWUoKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIGdldEFzc2V0S2luZCgpIHtcbiAgICAgIHJldHVybiBhc3NldEtpbmQ7XG4gICAgfSxcbiAgICBnZXREaXNwbGF5SW5mbygpIHtcbiAgICAgIHJldHVybiBkaXNwbGF5SW5mbztcbiAgICB9LFxuICAgIG1ha2VFbXB0eVB1cnNlKCkge1xuICAgICAgcmV0dXJuIG1ha2VFbXB0eVB1cnNlKCk7XG4gICAgfSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBpc0xpdmUocGF5bWVudCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KTtcbiAgICB9LFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGdldEFtb3VudE9mKHBheW1lbnQpIHtcbiAgICAgIC8vXG4gICAgICBhc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbiAgICAgIHJldHVybiBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiAgICB9LFxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGJ1cm4ocGF5bWVudCwgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQpIHtcbiAgICAgIC8vXG4gICAgICBhc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbiAgICAgIGNvbnN0IHBheW1lbnRCYWxhbmNlID0gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gICAgICBhc3NlcnRBbW91bnRDb25zaXN0ZW50KHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSk7XG4gICAgICB0cnkge1xuICAgICAgICAvL1xuICAgICAgICBkZWxldGVQYXltZW50KHBheW1lbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBheW1lbnRCYWxhbmNlO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgbWludFJlY292ZXJ5UHVyc2UgPSAvKiAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgaXNzdWVyWm9uZS5tYWtlT25jZSgnbWludFJlY292ZXJ5UHVyc2UnLCAoKSA9PiBtYWtlRW1wdHlQdXJzZSgpKVxuICApO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWludCA9IGlzc3VlclpvbmUuZXhvKGAke25hbWV9IG1pbnRgLCBNaW50SSwge1xuICAgIGdldElzc3VlcigpIHtcbiAgICAgIHJldHVybiBpc3N1ZXI7XG4gICAgfSxcbiAgICBtaW50UGF5bWVudChuZXdBbW91bnQpIHtcbiAgICAgIG5ld0Ftb3VudCA9IGNvZXJjZShuZXdBbW91bnQpO1xuICAgICAgbXVzdE1hdGNoKG5ld0Ftb3VudCwgYW1vdW50U2hhcGUsICdtaW50ZWQgYW1vdW50Jyk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHJhd1BheW1lbnQgPSBtYWtlUGF5bWVudCgpO1xuICAgICAgaW5pdFBheW1lbnQocmF3UGF5bWVudCwgbmV3QW1vdW50LCB1bmRlZmluZWQpO1xuXG4gICAgICBjb25zdCBtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSA9IG1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbiAgICAgIG1pbnRSZWNvdmVyeVB1cnNlLmRlcG9zaXQocmF3UGF5bWVudCwgbmV3QW1vdW50KTtcbiAgICAgIGNvbnN0IHBheW1lbnQgPSBtaW50UmVjb3ZlcnlQdXJzZS53aXRoZHJhdyhuZXdBbW91bnQpO1xuICAgICAgY29uc3QgbWludFJlY292ZXJ5UHVyc2VBZnRlciA9IG1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbiAgICAgIGFzc2VydChrZXlFUShtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSwgbWludFJlY292ZXJ5UHVyc2VBZnRlcikpO1xuICAgICAgcmV0dXJuIHBheW1lbnQ7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaXNzdWVyS2l0ID0gaGFyZGVuKHsgaXNzdWVyLCBtaW50LCBicmFuZCwgbWludFJlY292ZXJ5UHVyc2UgfSk7XG4gIHJldHVybiBpc3N1ZXJLaXQ7XG59OyRozY9fb25jZS5wcmVwYXJlUGF5bWVudExlZGdlcihwcmVwYXJlUGF5bWVudExlZGdlcik7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRMZWRnZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRMZWRnZXIiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACc2lSAcVAAAHFQAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiLi9hbW91bnRNYXRoLmpzIiwiLi90cmFuc2llbnROb3RpZmllci5qcyIsIi4vYW1vdW50U3RvcmUuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUHVyc2VLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxNLG1ha2VDb3B5U2V0LEFtb3VudE1hdGgsbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0LG1ha2VBbW91bnRTdG9yZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIi4vdHJhbnNpZW50Tm90aWZpZXIuanNcIiwgW1tcIm1ha2VUcmFuc2llbnROb3RpZmllcktpdFwiLFskaM2PX2EgPT4gKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50U3RvcmUuanNcIiwgW1tcIm1ha2VBbW91bnRTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VBbW91bnRTdG9yZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgRU1QVFlfQ09QWV9TRVQgPSBtYWtlQ29weVNldChbXSk7XG5cbi8vXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVQdXJzZUtpbmQgPSAoXG4gIGlzc3VlclpvbmUsXG4gIG5hbWUsXG4gIGFzc2V0S2luZCxcbiAgYnJhbmQsXG4gIFB1cnNlSUtpdCxcbiAgcHVyc2VNZXRob2RzLFxuICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgcGF5bWVudFJlY292ZXJ5U2V0cyxcbikgPT4ge1xuICBjb25zdCBhbW91bnRTaGFwZSA9IGJyYW5kLmdldEFtb3VudFNoYXBlKCk7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgeyBwcm92aWRlTm90aWZpZXIsIHVwZGF0ZTogdXBkYXRlQmFsYW5jZSB9ID0gbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KCk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgbWF5YmVSZWNvdmVyeVNldCA9IHN0YXRlID0+IHtcbiAgICBjb25zdCB7IHJlY292ZXJ5U2V0IH0gPSBzdGF0ZTtcbiAgICBpZiAocmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdoYXNSZWNvdmVyeVNldHMnKSB7XG4gICAgICByZXR1cm4gcmVjb3ZlcnlTZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnIHx8XG4gICAgICAgIEZhaWxgcmVjb3ZlclNldHNTdGF0ZSBtdXN0IGJlIG5vUmVjb3ZlcnlTZXRzIGlmIGl0IGlzbid0IGhhc1JlY292ZXJTZXRzYDtcbiAgICAgIHBheW1lbnRSZWNvdmVyeVNldHMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYHBheW1lbnRSZWNvdmVyeVNldHMgbXVzdCBhbHdheXMgYmUgZGVmaW5lZGA7XG4gICAgICByZWNvdmVyeVNldC5nZXRTaXplKCkgPT09IDAgfHxcbiAgICAgICAgRmFpbGBXaXRoIG5vUmVjb3ZlcnlTZXRzLCByZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgeyBkZXBvc2l0SW50ZXJuYWwsIHdpdGhkcmF3SW50ZXJuYWwgfSA9IHB1cnNlTWV0aG9kcztcbiAgY29uc3QgbWFrZVB1cnNlS2l0ID0gaXNzdWVyWm9uZS5leG9DbGFzc0tpdChcbiAgICBgJHtuYW1lfSBQdXJzZWAsXG4gICAgUHVyc2VJS2l0LFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRCYWxhbmNlID0gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG5cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCByZWNvdmVyeVNldCA9IGlzc3VlclpvbmUuZGV0YWNoZWQoKS5zZXRTdG9yZSgncmVjb3Zlcnkgc2V0Jyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbnRCYWxhbmNlLFxuICAgICAgICByZWNvdmVyeVNldCxcbiAgICAgIH07XG4gICAgfSxcbiAgICB7XG4gICAgICBwdXJzZToge1xuICAgICAgICBkZXBvc2l0KHNyY1BheW1lbnQsIG9wdEFtb3VudFNoYXBlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdXJzZSB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgY29uc3QgYmFsYW5jZVN0b3JlID0gbWFrZUFtb3VudFN0b3JlKHN0YXRlLCAnY3VycmVudEJhbGFuY2UnKTtcbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IHNyY1BheW1lbnRCYWxhbmNlID0gZGVwb3NpdEludGVybmFsKFxuICAgICAgICAgICAgYmFsYW5jZVN0b3JlLFxuICAgICAgICAgICAgc3JjUGF5bWVudCxcbiAgICAgICAgICAgIG9wdEFtb3VudFNoYXBlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQmFsYW5jZShwdXJzZSwgYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpKTtcbiAgICAgICAgICByZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIHdpdGhkcmF3KGFtb3VudCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdXJzZSB9ID0gdGhpcy5mYWNldHM7XG5cbiAgICAgICAgICBjb25zdCBvcHRSZWNvdmVyeVNldCA9IG1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2VTdG9yZSA9IG1ha2VBbW91bnRTdG9yZShzdGF0ZSwgJ2N1cnJlbnRCYWxhbmNlJyk7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBwYXltZW50ID0gd2l0aGRyYXdJbnRlcm5hbChcbiAgICAgICAgICAgIGJhbGFuY2VTdG9yZSxcbiAgICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAgIG9wdFJlY292ZXJ5U2V0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQmFsYW5jZShwdXJzZSwgYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpKTtcbiAgICAgICAgICByZXR1cm4gcGF5bWVudDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q3VycmVudEFtb3VudCgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2VTdG9yZSA9IG1ha2VBbW91bnRTdG9yZShzdGF0ZSwgJ2N1cnJlbnRCYWxhbmNlJyk7XG4gICAgICAgICAgcmV0dXJuIGJhbGFuY2VTdG9yZS5nZXRBbW91bnQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyKCkge1xuICAgICAgICAgIHJldHVybiBwcm92aWRlTm90aWZpZXIodGhpcy5mYWNldHMucHVyc2UpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRBbGxlZ2VkQnJhbmQoKSB7XG4gICAgICAgICAgcmV0dXJuIGJyYW5kO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldERlcG9zaXRGYWNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldFJlY292ZXJ5U2V0KCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3Qgb3B0UmVjb3ZlcnlTZXQgPSBtYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbiAgICAgICAgICBpZiAob3B0UmVjb3ZlcnlTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0NPUFlfU0VUO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb3B0UmVjb3ZlcnlTZXQuc25hcHNob3QoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVjb3ZlckFsbCgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgbGV0IGFtb3VudCA9IEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLCBhc3NldEtpbmQpO1xuICAgICAgICAgIGNvbnN0IG9wdFJlY292ZXJ5U2V0ID0gbWF5YmVSZWNvdmVyeVNldChzdGF0ZSk7XG4gICAgICAgICAgaWYgKG9wdFJlY292ZXJ5U2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQ7IC8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgcGF5bWVudCBvZiBvcHRSZWNvdmVyeVNldC5rZXlzKCkpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBmYWNldHMucHVyc2UuZGVwb3NpdChwYXltZW50KTtcbiAgICAgICAgICAgIGFtb3VudCA9IEFtb3VudE1hdGguYWRkKGFtb3VudCwgZGVsdGEsIGJyYW5kKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3B0UmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpID09PSAwIHx8XG4gICAgICAgICAgICBGYWlsYGludGVybmFsOiBSZW1haW5pbmcgdW5yZWNvdmVyZWQgcGF5bWVudHM6ICR7ZmFjZXRzLnB1cnNlLmdldFJlY292ZXJ5U2V0KCl9YDtcbiAgICAgICAgICByZXR1cm4gYW1vdW50O1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRlcG9zaXRGYWNldDoge1xuICAgICAgICByZWNlaXZlKC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzdGF0ZVNoYXBlOiB7XG4gICAgICAgIGN1cnJlbnRCYWxhbmNlOiBhbW91bnRTaGFwZSxcbiAgICAgICAgcmVjb3ZlcnlTZXQ6IE0ucmVtb3RhYmxlKCdyZWNvdmVyeVNldCcpLFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuICByZXR1cm4gKCkgPT4gbWFrZVB1cnNlS2l0KCkucHVyc2U7XG59OyRozY9fb25jZS5wcmVwYXJlUHVyc2VLaW5kKHByZXBhcmVQdXJzZUtpbmQpO1xuaGFyZGVuKHByZXBhcmVQdXJzZUtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVB1cnNlS2luZCI6WyJwcmVwYXJlUHVyc2VLaW5kIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIkTInFgLQAAYC0AACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcmF0aW8uanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL25hdCIsIi4vYW1vdW50TWF0aC5qcyIsIi4vc2FmZU1hdGguanMiXSwiZXhwb3J0cyI6WyJhZGRSYXRpb3MiLCJhc3NlcnRJc1JhdGlvIiwiYXNzZXJ0UGFyc2FibGVOdW1iZXIiLCJjZWlsRGl2aWRlQnkiLCJjZWlsTXVsdGlwbHlCeSIsImRpdmlkZUJ5IiwiZmxvb3JEaXZpZGVCeSIsImZsb29yTXVsdGlwbHlCeSIsImludmVydFJhdGlvIiwibWFrZVJhdGlvIiwibWFrZVJhdGlvRnJvbUFtb3VudHMiLCJtdWx0aXBseUJ5IiwibXVsdGlwbHlSYXRpb3MiLCJvbmVNaW51cyIsInBhcnNlUmF0aW8iLCJxdWFudGl6ZSIsInJhdGlvR1RFIiwicmF0aW9Ub051bWJlciIsInJhdGlvc1NhbWUiLCJzdWJ0cmFjdFJhdGlvcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbCxhc3NlcnRSZWNvcmQsaXNOYXQsQW1vdW50TWF0aCxuYXRTYWZlTWF0aDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcImlzTmF0XCIsWyRozY9fYSA9PiAoaXNOYXQgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiLi9zYWZlTWF0aC5qc1wiLCBbW1wibmF0U2FmZU1hdGhcIixbJGjNj19hID0+IChuYXRTYWZlTWF0aCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgeyBtdWx0aXBseSwgZmxvb3JEaXZpZGUsIGNlaWxEaXZpZGUsIGJhbmtlcnNEaXZpZGUsIGFkZCwgc3VidHJhY3QgfSA9XG4gIG5hdFNhZmVNYXRoO1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbmNvbnN0IFBFUkNFTlQgPSAxMDBuO1xuXG5jb25zdCByYXRpb1Byb3BlcnR5TmFtZXMgPSBbJ251bWVyYXRvcicsICdkZW5vbWluYXRvciddO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0SXNSYXRpbyA9IHJhdGlvID0+IHtcbiAgYXNzZXJ0UmVjb3JkKHJhdGlvLCAncmF0aW8nKTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJhdGlvKTtcbiAga2V5cy5sZW5ndGggPT09IDIgfHwgRmFpbGBSYXRpbyAke3JhdGlvfSBtdXN0IGJlIGEgcmVjb3JkIHdpdGggMiBmaWVsZHMuYDtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGtleXMpIHtcbiAgICByYXRpb1Byb3BlcnR5TmFtZXMuaW5jbHVkZXMobmFtZSkgfHxcbiAgICAgIEZhaWxgUGFyYW1ldGVyIG11c3QgYmUgYSBSYXRpbyByZWNvcmQsIGJ1dCAke3JhdGlvfSBoYXMgJHtxKG5hbWUpfWA7XG4gIH1cbiAgY29uc3QgbnVtZXJhdG9yVmFsdWUgPSByYXRpby5udW1lcmF0b3IudmFsdWU7XG4gIGNvbnN0IGRlbm9taW5hdG9yVmFsdWUgPSByYXRpby5kZW5vbWluYXRvci52YWx1ZTtcbiAgaXNOYXQobnVtZXJhdG9yVmFsdWUpIHx8XG4gICAgRmFpbGBUaGUgbnVtZXJhdG9yIHZhbHVlIG11c3QgYmUgYSBOYXRWYWx1ZSwgbm90ICR7bnVtZXJhdG9yVmFsdWV9YDtcbiAgaXNOYXQoZGVub21pbmF0b3JWYWx1ZSkgfHxcbiAgICBGYWlsYFRoZSBkZW5vbWluYXRvciB2YWx1ZSBtdXN0IGJlIGEgTmF0VmFsdWUsIG5vdCAke2Rlbm9taW5hdG9yVmFsdWV9YDtcbn07XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLmFzc2VydElzUmF0aW8oYXNzZXJ0SXNSYXRpbyk7XG4gICAgICAgY29uc3QgbWFrZVJhdGlvID0gKFxuICBudW1lcmF0b3IsXG4gIG51bWVyYXRvckJyYW5kLFxuICBkZW5vbWluYXRvciA9IFBFUkNFTlQsXG4gIGRlbm9taW5hdG9yQnJhbmQgPSBudW1lcmF0b3JCcmFuZCxcbikgPT4ge1xuICBkZW5vbWluYXRvciA+IDBuIHx8XG4gICAgRmFpbGBObyBpbmZpbml0ZSByYXRpb3MhIERlbm9taW5hdG9yIHdhcyAwICR7cShkZW5vbWluYXRvckJyYW5kKX1gO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG51bWVyYXRvcjogQW1vdW50TWF0aC5tYWtlKG51bWVyYXRvckJyYW5kLCBudW1lcmF0b3IpLFxuICAgIGRlbm9taW5hdG9yOiBBbW91bnRNYXRoLm1ha2UoZGVub21pbmF0b3JCcmFuZCwgZGVub21pbmF0b3IpLFxuICB9KTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZVJhdGlvKG1ha2VSYXRpbyk7XG4gICAgICAgY29uc3QgbWFrZVJhdGlvRnJvbUFtb3VudHMgPSAobnVtZXJhdG9yQW1vdW50LCBkZW5vbWluYXRvckFtb3VudCkgPT4ge1xuICBBbW91bnRNYXRoLmNvZXJjZShudW1lcmF0b3JBbW91bnQuYnJhbmQsIG51bWVyYXRvckFtb3VudCk7XG4gIEFtb3VudE1hdGguY29lcmNlKGRlbm9taW5hdG9yQW1vdW50LmJyYW5kLCBkZW5vbWluYXRvckFtb3VudCk7XG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgLy9cbiAgICBudW1lcmF0b3JBbW91bnQudmFsdWUsXG4gICAgbnVtZXJhdG9yQW1vdW50LmJyYW5kLFxuICAgIGRlbm9taW5hdG9yQW1vdW50LnZhbHVlLFxuICAgIGRlbm9taW5hdG9yQW1vdW50LmJyYW5kLFxuICApO1xufTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VSYXRpb0Zyb21BbW91bnRzKG1ha2VSYXRpb0Zyb21BbW91bnRzKTtcbmNvbnN0IG11bHRpcGx5SGVscGVyID0gKGFtb3VudCwgcmF0aW8sIGRpdmlkZU9wKSA9PiB7XG4gIEFtb3VudE1hdGguY29lcmNlKGFtb3VudC5icmFuZCwgYW1vdW50KTtcbiAgYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG4gIGFtb3VudC5icmFuZCA9PT0gcmF0aW8uZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYGFtb3VudCdzIGJyYW5kICR7cShhbW91bnQuYnJhbmQpfSBtdXN0IG1hdGNoIHJhdGlvJ3MgZGVub21pbmF0b3IgJHtxKFxuICAgICAgcmF0aW8uZGVub21pbmF0b3IuYnJhbmQsXG4gICAgKX1gO1xuXG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICBBbW91bnRNYXRoLm1ha2UoXG4gICAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICAgICBkaXZpZGVPcChcbiAgICAgICAgbXVsdGlwbHkoYW1vdW50LnZhbHVlLCByYXRpby5udW1lcmF0b3IudmFsdWUpLFxuICAgICAgICByYXRpby5kZW5vbWluYXRvci52YWx1ZSxcbiAgICAgICksXG4gICAgKVxuICApO1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBmbG9vck11bHRpcGx5QnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LCByYXRpbywgZmxvb3JEaXZpZGUpO1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuZmxvb3JNdWx0aXBseUJ5KGZsb29yTXVsdGlwbHlCeSk7XG4gICAgICAgY29uc3QgY2VpbE11bHRpcGx5QnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LCByYXRpbywgY2VpbERpdmlkZSk7XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5jZWlsTXVsdGlwbHlCeShjZWlsTXVsdGlwbHlCeSk7XG4gICAgICAgY29uc3QgbXVsdGlwbHlCeSA9IChhbW91bnQsIHJhdGlvKSA9PiB7XG4gIHJldHVybiBtdWx0aXBseUhlbHBlcihhbW91bnQsIHJhdGlvLCBiYW5rZXJzRGl2aWRlKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5tdWx0aXBseUJ5KG11bHRpcGx5QnkpO1xuY29uc3QgZGl2aWRlSGVscGVyID0gKGFtb3VudCwgcmF0aW8sIGRpdmlkZU9wKSA9PiB7XG4gIEFtb3VudE1hdGguY29lcmNlKGFtb3VudC5icmFuZCwgYW1vdW50KTtcbiAgYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG4gIGFtb3VudC5icmFuZCA9PT0gcmF0aW8ubnVtZXJhdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBhbW91bnQncyBicmFuZCAke3EoYW1vdW50LmJyYW5kKX0gbXVzdCBtYXRjaCByYXRpbydzIG51bWVyYXRvciAke3EoXG4gICAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICAgKX1gO1xuXG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICBBbW91bnRNYXRoLm1ha2UoXG4gICAgICByYXRpby5kZW5vbWluYXRvci5icmFuZCxcbiAgICAgIGRpdmlkZU9wKFxuICAgICAgICBtdWx0aXBseShhbW91bnQudmFsdWUsIHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlKSxcbiAgICAgICAgcmF0aW8ubnVtZXJhdG9yLnZhbHVlLFxuICAgICAgKSxcbiAgICApXG4gICk7XG59O1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgZmxvb3JEaXZpZGVCeSA9IChhbW91bnQsIHJhdGlvKSA9PiB7XG4gIHJldHVybiBkaXZpZGVIZWxwZXIoYW1vdW50LCByYXRpbywgZmxvb3JEaXZpZGUpO1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5mbG9vckRpdmlkZUJ5KGZsb29yRGl2aWRlQnkpO1xuICAgICAgIGNvbnN0IGNlaWxEaXZpZGVCeSA9IChhbW91bnQsIHJhdGlvKSA9PiB7XG4gIHJldHVybiBkaXZpZGVIZWxwZXIoYW1vdW50LCByYXRpbywgY2VpbERpdmlkZSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuY2VpbERpdmlkZUJ5KGNlaWxEaXZpZGVCeSk7XG4gICAgICAgY29uc3QgZGl2aWRlQnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCwgcmF0aW8sIGJhbmtlcnNEaXZpZGUpO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuZGl2aWRlQnkoZGl2aWRlQnkpO1xuICAgICAgIGNvbnN0IGludmVydFJhdGlvID0gcmF0aW8gPT4ge1xuICBhc3NlcnRJc1JhdGlvKHJhdGlvKTtcblxuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlLFxuICAgIHJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuICAgIHJhdGlvLm51bWVyYXRvci52YWx1ZSxcbiAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICk7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmludmVydFJhdGlvKGludmVydFJhdGlvKTtcbiAgICAgICBjb25zdCBhZGRSYXRpb3MgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG4gIGFzc2VydElzUmF0aW8obGVmdCk7XG4gIGxlZnQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5udW1lcmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYG51bWVyYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG4gIGxlZnQuZGVub21pbmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBkZW5vbWluYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBhZGQoXG4gICAgICBtdWx0aXBseShsZWZ0Lm51bWVyYXRvci52YWx1ZSwgcmlnaHQuZGVub21pbmF0b3IudmFsdWUpLCAvL1xuICAgICAgbXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSwgcmlnaHQubnVtZXJhdG9yLnZhbHVlKSAgLy9cbiAgICApLCAvL1xuICAgIGxlZnQubnVtZXJhdG9yLmJyYW5kLFxuICAgIG11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUsIHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwgLy9cbiAgICBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kLFxuICApO1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5hZGRSYXRpb3MoYWRkUmF0aW9zKTtcbiAgICAgICBjb25zdCBzdWJ0cmFjdFJhdGlvcyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICBhc3NlcnRJc1JhdGlvKHJpZ2h0KTtcbiAgYXNzZXJ0SXNSYXRpbyhsZWZ0KTtcbiAgbGVmdC5udW1lcmF0b3IuYnJhbmQgPT09IHJpZ2h0Lm51bWVyYXRvci5icmFuZCB8fFxuICAgIEZhaWxgbnVtZXJhdG9yIGJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcbiAgbGVmdC5kZW5vbWluYXRvci5icmFuZCA9PT0gcmlnaHQuZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYGRlbm9taW5hdG9yIGJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcblxuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIHN1YnRyYWN0KFxuICAgICAgbXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUsIHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwgLy9cbiAgICAgIG11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUsIHJpZ2h0Lm51bWVyYXRvci52YWx1ZSkgIC8vXG4gICAgKSwgLy9cbiAgICBsZWZ0Lm51bWVyYXRvci5icmFuZCxcbiAgICBtdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksIC8vXG4gICAgbGVmdC5kZW5vbWluYXRvci5icmFuZCxcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2Uuc3VidHJhY3RSYXRpb3Moc3VidHJhY3RSYXRpb3MpO1xuICAgICAgIGNvbnN0IG11bHRpcGx5UmF0aW9zID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGFzc2VydElzUmF0aW8ocmlnaHQpO1xuICBhc3NlcnRJc1JhdGlvKGxlZnQpO1xuXG4gIGNvbnN0IGdldFJlbWFpbmluZ0JyYW5kcyA9ICgpID0+IHtcbiAgICAvL1xuICAgIGlmIChyaWdodC5udW1lcmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kKSB7XG4gICAgICByZXR1cm4gW2xlZnQubnVtZXJhdG9yLmJyYW5kLCBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiAgICB9XG4gICAgaWYgKHJpZ2h0Lm51bWVyYXRvci5icmFuZCA9PT0gbGVmdC5kZW5vbWluYXRvci5icmFuZCkge1xuICAgICAgcmV0dXJuIFtsZWZ0Lm51bWVyYXRvci5icmFuZCwgcmlnaHQuZGVub21pbmF0b3IuYnJhbmRdO1xuICAgIH1cbiAgICBpZiAobGVmdC5udW1lcmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kKSB7XG4gICAgICByZXR1cm4gW3JpZ2h0Lm51bWVyYXRvci5icmFuZCwgbGVmdC5kZW5vbWluYXRvci5icmFuZF07XG4gICAgfVxuICAgIGlmIChsZWZ0Lm51bWVyYXRvci5icmFuZCA9PT0gbGVmdC5kZW5vbWluYXRvci5icmFuZCkge1xuICAgICAgcmV0dXJuIFtyaWdodC5udW1lcmF0b3IuYnJhbmQsIHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiAgICB9XG4gICAgdGhyb3cgRmFpbGBhdCBsZWFzdCBvbmUgYnJhbmQgbXVzdCBjYW5jZWwgb3V0OiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcbiAgfTtcblxuICBjb25zdCBbbnVtZXJhdG9yQnJhbmQsIGRlbm9taW5hdG9yQnJhbmRdID0gZ2V0UmVtYWluaW5nQnJhbmRzKCk7XG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgbXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUsIHJpZ2h0Lm51bWVyYXRvci52YWx1ZSksXG4gICAgbnVtZXJhdG9yQnJhbmQsXG4gICAgbXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSwgcmlnaHQuZGVub21pbmF0b3IudmFsdWUpLFxuICAgIGRlbm9taW5hdG9yQnJhbmQsXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UubXVsdGlwbHlSYXRpb3MobXVsdGlwbHlSYXRpb3MpO1xuICAgICAgIGNvbnN0IG9uZU1pbnVzID0gcmF0aW8gPT4ge1xuICBhc3NlcnRJc1JhdGlvKHJhdGlvKTtcbiAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kID09PSByYXRpby5kZW5vbWluYXRvci5icmFuZCB8fFxuICAgIEZhaWxgb25lTWludXMgb25seSBzdXBwb3J0cyByYXRpb3Mgd2l0aCBhIHNpbmdsZSBicmFuZCwgYnV0ICR7cmF0aW8ubnVtZXJhdG9yLmJyYW5kfSBkb2Vzbid0IG1hdGNoICR7cmF0aW8uZGVub21pbmF0b3IuYnJhbmR9YDtcbiAgcmF0aW8ubnVtZXJhdG9yLnZhbHVlIDw9IHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlIHx8XG4gICAgRmFpbGBQYXJhbWV0ZXIgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTogJHtyYXRpby5udW1lcmF0b3IudmFsdWV9LyR7cmF0aW8uZGVub21pbmF0b3IudmFsdWV9YDtcbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBzdWJ0cmFjdChyYXRpby5kZW5vbWluYXRvci52YWx1ZSwgcmF0aW8ubnVtZXJhdG9yLnZhbHVlKSxcbiAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICAgcmF0aW8uZGVub21pbmF0b3IudmFsdWUsXG4gICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuICApO1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5vbmVNaW51cyhvbmVNaW51cyk7XG4gICAgICAgY29uc3QgcmF0aW9HVEUgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgaWYgKGxlZnQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5udW1lcmF0b3IuYnJhbmQpIHtcbiAgICBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kID09PSByaWdodC5kZW5vbWluYXRvci5icmFuZCB8fFxuICAgICAgRmFpbGBudW1lcmF0b3IgYnJhbmRzIG1hdGNoLCBidXQgZGVub21pbmF0b3IgYnJhbmRzIGRvbid0OiAke3EobGVmdCl9ICR7cShcbiAgICAgICAgcmlnaHQsXG4gICAgICApfWA7XG4gIH0gZWxzZSBpZiAobGVmdC5udW1lcmF0b3IuYnJhbmQgPT09IGxlZnQuZGVub21pbmF0b3IuYnJhbmQpIHtcbiAgICByaWdodC5udW1lcmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gICAgICBGYWlsYGxlZnRoYW5kIGJyYW5kcyBtYXRjaCwgYnV0IHJpZ2h0aGFuZCBicmFuZHMgZG9uJ3Q6ICR7cShsZWZ0KX0gJHtxKFxuICAgICAgICByaWdodCxcbiAgICAgICl9YDtcbiAgfVxuICByZXR1cm4gbmF0U2FmZU1hdGguaXNHVEUoXG4gICAgbXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUsIHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSxcbiAgICBtdWx0aXBseShyaWdodC5udW1lcmF0b3IudmFsdWUsIGxlZnQuZGVub21pbmF0b3IudmFsdWUpLFxuICApO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5yYXRpb0dURShyYXRpb0dURSk7XG4gICAgICAgY29uc3QgcmF0aW9zU2FtZSA9IChsZWZ0LCByaWdodCkgPT4ge1xuICByZXR1cm4gKFxuICAgIEFtb3VudE1hdGguaXNFcXVhbChsZWZ0Lm51bWVyYXRvciwgcmlnaHQubnVtZXJhdG9yKSAmJlxuICAgIEFtb3VudE1hdGguaXNFcXVhbChsZWZ0LmRlbm9taW5hdG9yLCByaWdodC5kZW5vbWluYXRvcilcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5yYXRpb3NTYW1lKHJhdGlvc1NhbWUpO1xuICAgICAgIGNvbnN0IHF1YW50aXplID0gKHJhdGlvLCBuZXdEZW4pID0+IHtcbiAgY29uc3Qgb2xkRGVuID0gcmF0aW8uZGVub21pbmF0b3IudmFsdWU7XG4gIGNvbnN0IG9sZE51bSA9IHJhdGlvLm51bWVyYXRvci52YWx1ZTtcbiAgaWYgKG5ld0RlbiA+IG9sZERlbikge1xuICAgIHJldHVybiByYXRpbztcbiAgfVxuXG4gIGNvbnN0IG5ld051bSA9XG4gICAgbmV3RGVuID09PSBvbGREZW4gPyBvbGROdW0gOiBiYW5rZXJzRGl2aWRlKG9sZE51bSAqIG5ld0Rlbiwgb2xkRGVuKTtcbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBuZXdOdW0sXG4gICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kLFxuICAgIG5ld0RlbixcbiAgICByYXRpby5kZW5vbWluYXRvci5icmFuZCxcbiAgKTtcbn07JGjNj19vbmNlLnF1YW50aXplKHF1YW50aXplKTtcblxuY29uc3QgTlVNRVJJQ19SRSA9IC9eKFxcZFxcZCopKD86XFwuKFxcZCopKT8kLztcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFyc2VSYXRpbyA9IChcbiAgbnVtZXJpYyxcbiAgbnVtZXJhdG9yQnJhbmQsXG4gIGRlbm9taW5hdG9yQnJhbmQgPSBudW1lcmF0b3JCcmFuZCxcbikgPT4ge1xuICBjb25zdCBtYXRjaCA9IGAke251bWVyaWN9YC5tYXRjaChOVU1FUklDX1JFKTtcbiAgaWYgKCFtYXRjaCkge1xuICAgIHRocm93IEZhaWxgSW52YWxpZCBudW1lcmljIGRhdGE6ICR7bnVtZXJpY31gO1xuICB9XG5cbiAgY29uc3QgW18sIHdob2xlLCBwYXJ0ID0gJyddID0gbWF0Y2g7XG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgQmlnSW50KGAke3dob2xlfSR7cGFydH1gKSxcbiAgICBudW1lcmF0b3JCcmFuZCxcbiAgICAxMG4gKiogQmlnSW50KHBhcnQubGVuZ3RoKSxcbiAgICBkZW5vbWluYXRvckJyYW5kLFxuICApO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UucGFyc2VSYXRpbyhwYXJzZVJhdGlvKTtcbiAgICAgICBjb25zdCBhc3NlcnRQYXJzYWJsZU51bWJlciA9IHNwZWNpbWVuID0+IHtcbiAgY29uc3QgbWF0Y2ggPSBgJHtzcGVjaW1lbn1gLm1hdGNoKE5VTUVSSUNfUkUpO1xuICBtYXRjaCB8fCBGYWlsYEludmFsaWQgbnVtZXJpYyBkYXRhOiAke3NwZWNpbWVufWA7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0UGFyc2FibGVOdW1iZXIoYXNzZXJ0UGFyc2FibGVOdW1iZXIpO1xuICAgICAgIGNvbnN0IHJhdGlvVG9OdW1iZXIgPSByYXRpbyA9PiB7XG4gIGNvbnN0IG4gPSBOdW1iZXIocmF0aW8ubnVtZXJhdG9yLnZhbHVlKTtcbiAgY29uc3QgZCA9IE51bWJlcihyYXRpby5kZW5vbWluYXRvci52YWx1ZSk7XG4gIHJldHVybiBuIC8gZDtcbn07JGjNj19vbmNlLnJhdGlvVG9OdW1iZXIocmF0aW9Ub051bWJlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJc1JhdGlvIjpbImFzc2VydElzUmF0aW8iXSwibWFrZVJhdGlvIjpbIm1ha2VSYXRpbyJdLCJtYWtlUmF0aW9Gcm9tQW1vdW50cyI6WyJtYWtlUmF0aW9Gcm9tQW1vdW50cyJdLCJmbG9vck11bHRpcGx5QnkiOlsiZmxvb3JNdWx0aXBseUJ5Il0sImNlaWxNdWx0aXBseUJ5IjpbImNlaWxNdWx0aXBseUJ5Il0sIm11bHRpcGx5QnkiOlsibXVsdGlwbHlCeSJdLCJmbG9vckRpdmlkZUJ5IjpbImZsb29yRGl2aWRlQnkiXSwiY2VpbERpdmlkZUJ5IjpbImNlaWxEaXZpZGVCeSJdLCJkaXZpZGVCeSI6WyJkaXZpZGVCeSJdLCJpbnZlcnRSYXRpbyI6WyJpbnZlcnRSYXRpbyJdLCJhZGRSYXRpb3MiOlsiYWRkUmF0aW9zIl0sInN1YnRyYWN0UmF0aW9zIjpbInN1YnRyYWN0UmF0aW9zIl0sIm11bHRpcGx5UmF0aW9zIjpbIm11bHRpcGx5UmF0aW9zIl0sIm9uZU1pbnVzIjpbIm9uZU1pbnVzIl0sInJhdGlvR1RFIjpbInJhdGlvR1RFIl0sInJhdGlvc1NhbWUiOlsicmF0aW9zU2FtZSJdLCJxdWFudGl6ZSI6WyJxdWFudGl6ZSJdLCJwYXJzZVJhdGlvIjpbInBhcnNlUmF0aW8iXSwiYXNzZXJ0UGFyc2FibGVOdW1iZXIiOlsiYXNzZXJ0UGFyc2FibGVOdW1iZXIiXSwicmF0aW9Ub051bWJlciI6WyJyYXRpb1RvTnVtYmVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADW7UdqYBQAAmAUAACQAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvc2FmZU1hdGguanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsibmF0U2FmZU1hdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dXSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbmF0U2FmZU1hdGggPSBoYXJkZW4oe1xuICAvKiAgICAgICAgICAgICAgICAqL1xuICAvL1xuICBhZGQ6ICh4LCB5KSA9PiBOYXQoeCkgKyBOYXQoeSksXG4gIC8qICAgICAgICAgICAgICAgICovXG4gIHN1YnRyYWN0OiAoeCwgeSkgPT4gTmF0KE5hdCh4KSAtIE5hdCh5KSksXG4gIC8qICAgICAgICAgICAgICAgICovXG4gIG11bHRpcGx5OiAoeCwgeSkgPT4gTmF0KHgpICogTmF0KHkpLFxuICAvKiAgICAgICAgICAgICAgICAqL1xuICBmbG9vckRpdmlkZTogKHgsIHkpID0+IE5hdCh4KSAvIE5hdCh5KSxcbiAgLyogICAgICAgICAgICAgICAgKi9cbiAgY2VpbERpdmlkZTogKHgsIHkpID0+IHtcbiAgICB5ID0gTmF0KHkpO1xuICAgIHJldHVybiBOYXQoTmF0KHgpICsgeSAtIDFuKSAvIHk7XG4gIH0sXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGJhbmtlcnNEaXZpZGU6IChhLCBiKSA9PiB7XG4gICAgYSA9IE5hdChhKTtcbiAgICBiID0gTmF0KGIpO1xuXG4gICAgY29uc3QgZGl2ID0gYSAvIGI7XG4gICAgY29uc3QgcmVtID0gYSAlIGI7XG4gICAgLy9cbiAgICBpZiAocmVtICogMm4gPiBiKSB7XG4gICAgICByZXR1cm4gZGl2ICsgMW47XG4gICAgfSBlbHNlIGlmIChyZW0gKiAybiA9PT0gYikge1xuICAgICAgLy9cbiAgICAgIGlmIChkaXYgJSAybiA9PT0gMW4pIHJldHVybiBkaXYgKyAxbjtcbiAgICB9XG4gICAgcmV0dXJuIGRpdjtcbiAgfSxcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGlzR1RFOiAoeCwgeSkgPT4gTmF0KHgpID49IE5hdCh5KSxcbn0pOyRozY9fb25jZS5uYXRTYWZlTWF0aChuYXRTYWZlTWF0aCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJuYXRTYWZlTWF0aCI6WyJuYXRTYWZlTWF0aCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABNlMZDMgYAADIGAAAtAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9ub3RpZmllciJdLCJleHBvcnRzIjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUscHJvdmlkZUxhenksbWFrZU5vdGlmaWVyS2l0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLFskaM2PX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsWyRozY9fYSA9PiAobWFrZU5vdGlmaWVyS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vL1xuLy9cbiAgICAgICBjb25zdCBtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgdHJhbnNpZW50Tm90aWZlcktpdHMgPSBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKFxuICAgICd0cmFuc2llbnROb3RpZmVyS2l0cycsXG4gICk7XG5cbiAgY29uc3QgcHJvdmlkZU5vdGlmaWVyS2l0ID0ga2V5ID0+XG4gICAgcHJvdmlkZUxhenkodHJhbnNpZW50Tm90aWZlcktpdHMsIGtleSwgKCkgPT5cbiAgICAgIG1ha2VOb3RpZmllcktpdChrZXkuZ2V0Q3VycmVudEFtb3VudCgpKSxcbiAgICApO1xuXG4gIGNvbnN0IHByb3ZpZGVOb3RpZmllciA9IGtleSA9PiBwcm92aWRlTm90aWZpZXJLaXQoa2V5KS5ub3RpZmllcjtcbiAgY29uc3QgdXBkYXRlID0gKGtleSwgbmV3VmFsdWUpID0+IHtcbiAgICBpZiAodHJhbnNpZW50Tm90aWZlcktpdHMuaGFzKGtleSkpIHtcbiAgICAgIGNvbnN0IHsgdXBkYXRlciB9ID0gdHJhbnNpZW50Tm90aWZlcktpdHMuZ2V0KGtleSk7XG4gICAgICB1cGRhdGVyLnVwZGF0ZVN0YXRlKG5ld1ZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHsgcHJvdmlkZU5vdGlmaWVyLCB1cGRhdGUgfTtcbn07JGjNj19vbmNlLm1ha2VUcmFuc2llbnROb3RpZmllcktpdChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xuaGFyZGVuKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHAbIY50GgAAdBoAACYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIkFtb3VudFBhdHRlcm5TaGFwZSIsIkFtb3VudFNoYXBlIiwiQXNzZXRLaW5kU2hhcGUiLCJCcmFuZEkiLCJCcmFuZFNoYXBlIiwiRGVwb3NpdEZhY2V0U2hhcGUiLCJEaXNwbGF5SW5mb1NoYXBlIiwiSXNzdWVyS2l0U2hhcGUiLCJJc3N1ZXJTaGFwZSIsIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyIsIk1pbnRTaGFwZSIsIk5vdGlmaWVyU2hhcGUiLCJQYXltZW50U2hhcGUiLCJQdXJzZVNoYXBlIiwiUmF0aW9TaGFwZSIsImlzQ29weUJhZ1ZhbHVlIiwiaXNDb3B5U2V0VmFsdWUiLCJpc05hdFZhbHVlIiwiaXNTZXRWYWx1ZSIsIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSxtYXRjaGVzLGdldEludGVyZmFjZUd1YXJkUGF5bG9hZDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qXG5cblxuXG4gKi9cblxuICAgICAgIGNvbnN0IEJyYW5kU2hhcGUgPSBNLnJlbW90YWJsZSgnQnJhbmQnKTskaM2PX29uY2UuQnJhbmRTaGFwZShCcmFuZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdJc3N1ZXInKTskaM2PX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuICAgICAgIGNvbnN0IFBheW1lbnRTaGFwZSA9IE0ucmVtb3RhYmxlKCdQYXltZW50Jyk7JGjNj19vbmNlLlBheW1lbnRTaGFwZShQYXltZW50U2hhcGUpO1xuICAgICAgIGNvbnN0IFB1cnNlU2hhcGUgPSBNLnJlbW90YWJsZSgnUHVyc2UnKTskaM2PX29uY2UuUHVyc2VTaGFwZShQdXJzZVNoYXBlKTtcbiAgICAgICBjb25zdCBEZXBvc2l0RmFjZXRTaGFwZSA9IE0ucmVtb3RhYmxlKCdEZXBvc2l0RmFjZXQnKTskaM2PX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuICAgICAgIGNvbnN0IE5vdGlmaWVyU2hhcGUgPSBNLnJlbW90YWJsZSgnTm90aWZpZXInKTskaM2PX29uY2UuTm90aWZpZXJTaGFwZShOb3RpZmllclNoYXBlKTtcbiAgICAgICBjb25zdCBNaW50U2hhcGUgPSBNLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlID0gTS5uYXQoKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IENvcHlTZXRWYWx1ZVNoYXBlID0gTS5zZXQoKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IFNldFZhbHVlU2hhcGUgPSBNLmFycmF5T2YoTS5rZXkoKSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IENvcHlCYWdWYWx1ZVNoYXBlID0gTS5iYWcoKTtcblxuY29uc3QgQW1vdW50VmFsdWVTaGFwZSA9IE0ub3IoXG4gIE5hdFZhbHVlU2hhcGUsXG4gIENvcHlTZXRWYWx1ZVNoYXBlLFxuICBTZXRWYWx1ZVNoYXBlLFxuICBDb3B5QmFnVmFsdWVTaGFwZSxcbik7XG5cbiAgICAgICBjb25zdCBBbW91bnRTaGFwZSA9IHsgYnJhbmQ6IEJyYW5kU2hhcGUsIHZhbHVlOiBBbW91bnRWYWx1ZVNoYXBlIH07JGjNj19vbmNlLkFtb3VudFNoYXBlKEFtb3VudFNoYXBlKTtcbmhhcmRlbihBbW91bnRTaGFwZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBBbW91bnRQYXR0ZXJuU2hhcGUgPSBNLnBhdHRlcm4oKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5BbW91bnRQYXR0ZXJuU2hhcGUoQW1vdW50UGF0dGVyblNoYXBlKTtcbiAgICAgICBjb25zdCBSYXRpb1NoYXBlID0geyBudW1lcmF0b3I6IEFtb3VudFNoYXBlLCBkZW5vbWluYXRvcjogQW1vdW50U2hhcGUgfTskaM2PX29uY2UuUmF0aW9TaGFwZShSYXRpb1NoYXBlKTtcbmhhcmRlbihSYXRpb1NoYXBlKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNOYXRWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIE5hdFZhbHVlU2hhcGUpOyRozY9fb25jZS5pc05hdFZhbHVlKGlzTmF0VmFsdWUpO1xuaGFyZGVuKGlzTmF0VmFsdWUpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlTZXRWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIENvcHlTZXRWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNDb3B5U2V0VmFsdWUoaXNDb3B5U2V0VmFsdWUpO1xuaGFyZGVuKGlzQ29weVNldFZhbHVlKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNTZXRWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIFNldFZhbHVlU2hhcGUpOyRozY9fb25jZS5pc1NldFZhbHVlKGlzU2V0VmFsdWUpO1xuaGFyZGVuKGlzU2V0VmFsdWUpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlCYWdWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIENvcHlCYWdWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNDb3B5QmFnVmFsdWUoaXNDb3B5QmFnVmFsdWUpO1xuaGFyZGVuKGlzQ29weUJhZ1ZhbHVlKTtcblxuLy9cbiAgICAgICBjb25zdCBNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMgPSAxMDA7JGjNj19vbmNlLk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyhNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpO1xuXG4gICAgICAgY29uc3QgQXNzZXRLaW5kU2hhcGUgPSBNLm9yKCduYXQnLCAnc2V0JywgJ2NvcHlTZXQnLCAnY29weUJhZycpOyRozY9fb25jZS5Bc3NldEtpbmRTaGFwZShBc3NldEtpbmRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBEaXNwbGF5SW5mb1NoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge30sXG4gIHtcbiAgICBkZWNpbWFsUGxhY2VzOiBNLmFuZChcbiAgICAgIE0uZ3RlKC1NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuICAgICAgTS5sdGUoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbiAgICApLFxuICAgIGFzc2V0S2luZDogQXNzZXRLaW5kU2hhcGUsXG4gIH0sXG4gIHtcbiAgICAvL1xuICAgIC8vXG4gIH0sXG4pOyRozY9fb25jZS5EaXNwbGF5SW5mb1NoYXBlKERpc3BsYXlJbmZvU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSXNzdWVyS2l0U2hhcGUgPSB7XG4gIGJyYW5kOiBCcmFuZFNoYXBlLFxuICBtaW50OiBNaW50U2hhcGUsXG4gIG1pbnRSZWNvdmVyeVB1cnNlOiBQdXJzZVNoYXBlLFxuICBpc3N1ZXI6IElzc3VlclNoYXBlLFxuICBkaXNwbGF5SW5mbzogRGlzcGxheUluZm9TaGFwZSxcbn07JGjNj19vbmNlLklzc3VlcktpdFNoYXBlKElzc3VlcktpdFNoYXBlKTtcbmhhcmRlbihJc3N1ZXJLaXRTaGFwZSk7XG5cbi8vXG5cbiAgICAgICBjb25zdCBCcmFuZEkgPSBNLmludGVyZmFjZSgnQnJhbmQnLCB7XG4gIGlzTXlJc3N1ZXI6IE0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICBnZXRBbGxlZ2VkTmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0RGlzcGxheUluZm86IE0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG4gIGdldEFtb3VudFNoYXBlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKSxcbn0pO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLkJyYW5kSShCcmFuZEkpO1xuICAgICAgIGNvbnN0IG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gKFxuICBicmFuZFNoYXBlID0gQnJhbmRTaGFwZSxcbiAgYXNzZXRLaW5kU2hhcGUgPSBBc3NldEtpbmRTaGFwZSxcbiAgYW1vdW50U2hhcGUgPSBBbW91bnRTaGFwZSxcbikgPT4ge1xuICBjb25zdCBJc3N1ZXJJID0gTS5pbnRlcmZhY2UoJ0lzc3VlcicsIHtcbiAgICBnZXRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbiAgICBnZXRBbGxlZ2VkTmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgICBnZXRBc3NldEtpbmQ6IE0uY2FsbCgpLnJldHVybnMoYXNzZXRLaW5kU2hhcGUpLFxuICAgIGdldERpc3BsYXlJbmZvOiBNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxuICAgIG1ha2VFbXB0eVB1cnNlOiBNLmNhbGwoKS5yZXR1cm5zKFB1cnNlU2hhcGUpLFxuXG4gICAgaXNMaXZlOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gICAgZ2V0QW1vdW50T2Y6IE0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgICBidXJuOiBNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSlcbiAgICAgIC5vcHRpb25hbChBbW91bnRQYXR0ZXJuU2hhcGUpXG4gICAgICAucmV0dXJucyhhbW91bnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IE1pbnRJID0gTS5pbnRlcmZhY2UoJ01pbnQnLCB7XG4gICAgZ2V0SXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgICBtaW50UGF5bWVudDogTS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IFBheW1lbnRJID0gTS5pbnRlcmZhY2UoJ1BheW1lbnQnLCB7XG4gICAgZ2V0QWxsZWdlZEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICB9KTtcblxuICBjb25zdCBQdXJzZUkgPSBNLmludGVyZmFjZSgnUHVyc2UnLCB7XG4gICAgZ2V0QWxsZWdlZEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICAgIGdldEN1cnJlbnRBbW91bnQ6IE0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICAgIGdldEN1cnJlbnRBbW91bnROb3RpZmllcjogTS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGRlcG9zaXQ6IE0uY2FsbChQYXltZW50U2hhcGUpXG4gICAgICAub3B0aW9uYWwoQW1vdW50UGF0dGVyblNoYXBlKVxuICAgICAgLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICAgIGdldERlcG9zaXRGYWNldDogTS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG4gICAgd2l0aGRyYXc6IE0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpLFxuICAgIGdldFJlY292ZXJ5U2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0uc2V0T2YoUGF5bWVudFNoYXBlKSksXG4gICAgcmVjb3ZlckFsbDogTS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IERlcG9zaXRGYWNldEkgPSBNLmludGVyZmFjZSgnRGVwb3NpdEZhY2V0Jywge1xuICAgIHJlY2VpdmU6IGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChQdXJzZUkpLm1ldGhvZEd1YXJkcy5kZXBvc2l0LFxuICB9KTtcblxuICBjb25zdCBQdXJzZUlLaXQgPSB7XG4gICAgcHVyc2U6IFB1cnNlSSxcbiAgICBkZXBvc2l0RmFjZXQ6IERlcG9zaXRGYWNldEksXG4gIH07XG4gIGhhcmRlbihQdXJzZUlLaXQpO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIElzc3VlckksXG4gICAgTWludEksXG4gICAgUGF5bWVudEksXG4gICAgUHVyc2VJS2l0LFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VJc3N1ZXJJbnRlcmZhY2VzKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbmhhcmRlbihtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmFuZFNoYXBlIjpbIkJyYW5kU2hhcGUiXSwiSXNzdWVyU2hhcGUiOlsiSXNzdWVyU2hhcGUiXSwiUGF5bWVudFNoYXBlIjpbIlBheW1lbnRTaGFwZSJdLCJQdXJzZVNoYXBlIjpbIlB1cnNlU2hhcGUiXSwiRGVwb3NpdEZhY2V0U2hhcGUiOlsiRGVwb3NpdEZhY2V0U2hhcGUiXSwiTm90aWZpZXJTaGFwZSI6WyJOb3RpZmllclNoYXBlIl0sIk1pbnRTaGFwZSI6WyJNaW50U2hhcGUiXSwiQW1vdW50U2hhcGUiOlsiQW1vdW50U2hhcGUiXSwiQW1vdW50UGF0dGVyblNoYXBlIjpbIkFtb3VudFBhdHRlcm5TaGFwZSJdLCJSYXRpb1NoYXBlIjpbIlJhdGlvU2hhcGUiXSwiaXNOYXRWYWx1ZSI6WyJpc05hdFZhbHVlIl0sImlzQ29weVNldFZhbHVlIjpbImlzQ29weVNldFZhbHVlIl0sImlzU2V0VmFsdWUiOlsiaXNTZXRWYWx1ZSJdLCJpc0NvcHlCYWdWYWx1ZSI6WyJpc0NvcHlCYWdWYWx1ZSJdLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiOlsiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIl0sIkFzc2V0S2luZFNoYXBlIjpbIkFzc2V0S2luZFNoYXBlIl0sIkRpc3BsYXlJbmZvU2hhcGUiOlsiRGlzcGxheUluZm9TaGFwZSJdLCJJc3N1ZXJLaXRTaGFwZSI6WyJJc3N1ZXJLaXRTaGFwZSJdLCJCcmFuZEkiOlsiQnJhbmRJIl0sIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIjpbIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApRHoiqIDAACiAwAAKwAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb25zdGFudHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlBhcmFtVHlwZSIsIlBhcmFtVHlwZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IFBhcmFtVHlwZSA9IC8qICAgICAgICAgICAgICAgICovICh7XG4gIEFNT1VOVDogJ2Ftb3VudCcsXG4gIEJSQU5EOiAnYnJhbmQnLFxuICBJTlNUQUxMQVRJT046ICdpbnN0YWxsYXRpb24nLFxuICBJTlNUQU5DRTogJ2luc3RhbmNlJyxcbiAgSU5WSVRBVElPTjogJ2ludml0YXRpb24nLFxuICBOQVQ6ICduYXQnLFxuICBSQVRJTzogJ3JhdGlvJyxcbiAgU1RSSU5HOiAnc3RyaW5nJyxcbiAgUEFTU0FCTEVfUkVDT1JEOiAncmVjb3JkJyxcbiAgVElNRVNUQU1QOiAndGltZXN0YW1wJyxcbiAgUkVMQVRJVkVfVElNRTogJ3JlbGF0aXZlVGltZScsXG4gIFVOS05PV046ICd1bmtub3duJyxcbn0pOyRozY9fb25jZS5QYXJhbVR5cGUoUGFyYW1UeXBlKTtcbmhhcmRlbihQYXJhbVR5cGUpO1xuXG4vL1xuLy9cbiAgICAgICBjb25zdCBQYXJhbVR5cGVzID0geyAuLi5QYXJhbVR5cGUgfTskaM2PX29uY2UuUGFyYW1UeXBlcyhQYXJhbVR5cGVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlBhcmFtVHlwZSI6WyJQYXJhbVR5cGUiXSwiUGFyYW1UeXBlcyI6WyJQYXJhbVR5cGVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEykTUgIDAAACAwAAD8AAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2Fzc2VydGlvbnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIl0sImV4cG9ydHMiOlsiYXNzZXJ0UmVsYXRpdmVUaW1lIiwiYXNzZXJ0VGltZXN0YW1wIiwibWFrZUFzc2VydEJyYW5kZWRSYXRpbyIsIm1ha2VBc3NlcnRJbnN0YWxsYXRpb24iLCJtYWtlQXNzZXJ0SW5zdGFuY2UiLCJtYWtlTG9va3NMaWtlQnJhbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLGlzUmVtb3RhYmxlLGFzc2VydElzUmF0aW8sbXVzdE1hdGNoLFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLFRpbWVzdGFtcFJlY29yZFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzUmVtb3RhYmxlXCIsWyRozY9fYSA9PiAoaXNSZW1vdGFibGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzXCIsIFtbXCJhc3NlcnRJc1JhdGlvXCIsWyRozY9fYSA9PiAoYXNzZXJ0SXNSYXRpbyA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSA9ICRozY9fYSldXSxbXCJUaW1lc3RhbXBSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFJlY29yZFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5jb25zdCBtYWtlTG9va3NMaWtlQnJhbmQgPSBuYW1lID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIHJldHVybiBicmFuZCA9PiB7XG4gICAgaXNSZW1vdGFibGUoYnJhbmQpIHx8IEZhaWxgdmFsdWUgZm9yICR7bmFtZX0gbXVzdCBiZSBhIGJyYW5kLCB3YXMgJHticmFuZH1gO1xuICB9O1xufTskaM2PX29uY2UubWFrZUxvb2tzTGlrZUJyYW5kKG1ha2VMb29rc0xpa2VCcmFuZCk7XG5oYXJkZW4obWFrZUxvb2tzTGlrZUJyYW5kKTtcblxuY29uc3QgbWFrZUFzc2VydEluc3RhbGxhdGlvbiA9IG5hbWUgPT4ge1xuICByZXR1cm4gaW5zdGFsbGF0aW9uID0+IHtcbiAgICAvL1xuICAgIHR5cGVvZiBpbnN0YWxsYXRpb24gPT09ICdvYmplY3QnIHx8XG4gICAgICBGYWlsYHZhbHVlIGZvciAke25hbWV9IG11c3QgYmUgYW4gSW5zdGFsbGF0aW9uLCB3YXMgJHtpbnN0YWxsYXRpb259YDtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VBc3NlcnRJbnN0YWxsYXRpb24obWFrZUFzc2VydEluc3RhbGxhdGlvbik7XG5oYXJkZW4obWFrZUFzc2VydEluc3RhbGxhdGlvbik7XG5cbmNvbnN0IG1ha2VBc3NlcnRJbnN0YW5jZSA9IG5hbWUgPT4ge1xuICByZXR1cm4gaW5zdGFuY2UgPT4ge1xuICAgIC8vXG4gICAgdHlwZW9mIGluc3RhbmNlID09PSAnb2JqZWN0JyB8fFxuICAgICAgRmFpbGB2YWx1ZSBmb3IgJHtuYW1lfSBtdXN0IGJlIGFuIEluc3RhbmNlLCB3YXMgJHtpbnN0YW5jZX1gO1xuICB9O1xufTskaM2PX29uY2UubWFrZUFzc2VydEluc3RhbmNlKG1ha2VBc3NlcnRJbnN0YW5jZSk7XG5oYXJkZW4obWFrZUFzc2VydEluc3RhbmNlKTtcblxuY29uc3QgbWFrZUFzc2VydEJyYW5kZWRSYXRpbyA9IChuYW1lLCBtb2RlbFJhdGlvKSA9PiB7XG4gIHJldHVybiByYXRpbyA9PiB7XG4gICAgYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG4gICAgcmF0aW8ubnVtZXJhdG9yLmJyYW5kID09PSBtb2RlbFJhdGlvLm51bWVyYXRvci5icmFuZCB8fFxuICAgICAgRmFpbGBOdW1lcmF0b3IgYnJhbmQgZm9yICR7bmFtZX0gbXVzdCBiZSAke21vZGVsUmF0aW8ubnVtZXJhdG9yLmJyYW5kfWA7XG4gICAgcmF0aW8uZGVub21pbmF0b3IuYnJhbmQgPT09IG1vZGVsUmF0aW8uZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgICAgIEZhaWxgRGVub21pbmF0b3IgYnJhbmQgZm9yICR7bmFtZX0gbXVzdCBiZSAke21vZGVsUmF0aW8uZGVub21pbmF0b3IuYnJhbmR9YDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VBc3NlcnRCcmFuZGVkUmF0aW8obWFrZUFzc2VydEJyYW5kZWRSYXRpbyk7XG5oYXJkZW4obWFrZUFzc2VydEJyYW5kZWRSYXRpbyk7XG5cbmNvbnN0IGFzc2VydFJlbGF0aXZlVGltZSA9IHZhbHVlID0+IHtcbiAgbXVzdE1hdGNoKHZhbHVlLCBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSk7XG59OyRozY9fb25jZS5hc3NlcnRSZWxhdGl2ZVRpbWUoYXNzZXJ0UmVsYXRpdmVUaW1lKTtcbmhhcmRlbihhc3NlcnRSZWxhdGl2ZVRpbWUpO1xuXG5jb25zdCBhc3NlcnRUaW1lc3RhbXAgPSB2YWx1ZSA9PiB7XG4gIG11c3RNYXRjaCh2YWx1ZSwgVGltZXN0YW1wUmVjb3JkU2hhcGUsICd0aW1lc3RhbXAnKTtcbn07JGjNj19vbmNlLmFzc2VydFRpbWVzdGFtcChhc3NlcnRUaW1lc3RhbXApO1xuaGFyZGVuKGFzc2VydFRpbWVzdGFtcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTG9va3NMaWtlQnJhbmQiOlsibWFrZUxvb2tzTGlrZUJyYW5kIl0sIm1ha2VBc3NlcnRJbnN0YWxsYXRpb24iOlsibWFrZUFzc2VydEluc3RhbGxhdGlvbiJdLCJtYWtlQXNzZXJ0SW5zdGFuY2UiOlsibWFrZUFzc2VydEluc3RhbmNlIl0sIm1ha2VBc3NlcnRCcmFuZGVkUmF0aW8iOlsibWFrZUFzc2VydEJyYW5kZWRSYXRpbyJdLCJhc3NlcnRSZWxhdGl2ZVRpbWUiOlsiYXNzZXJ0UmVsYXRpdmVUaW1lIl0sImFzc2VydFRpbWVzdGFtcCI6WyJhc3NlcnRUaW1lc3RhbXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqxd/EBkQAAAZEAAAPgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSIsIi4uL3F1ZXN0aW9uLmpzIl0sImV4cG9ydHMiOlsibWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMiLCJzZXR1cEFwaUdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRSxGYXIsa2V5RVEsQ2hvaWNlTWV0aG9kLFF1b3J1bVJ1bGUsRWxlY3Rpb25UeXBlLGNvZXJjZVF1ZXN0aW9uU3BlYzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV1dXSxbXCIuLi9xdWVzdGlvbi5qc1wiLCBbW1wiQ2hvaWNlTWV0aG9kXCIsWyRozY9fYSA9PiAoQ2hvaWNlTWV0aG9kID0gJGjNj19hKV1dLFtcIlF1b3J1bVJ1bGVcIixbJGjNj19hID0+IChRdW9ydW1SdWxlID0gJGjNj19hKV1dLFtcIkVsZWN0aW9uVHlwZVwiLFskaM2PX2EgPT4gKEVsZWN0aW9uVHlwZSA9ICRozY9fYSldXSxbXCJjb2VyY2VRdWVzdGlvblNwZWNcIixbJGjNj19hID0+IChjb2VyY2VRdWVzdGlvblNwZWMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMgPSAoYXBpTWV0aG9kTmFtZSwgbWV0aG9kQXJncykgPT4ge1xuICBjb25zdCBwb3NpdGl2ZSA9IGhhcmRlbih7IGFwaU1ldGhvZE5hbWUsIG1ldGhvZEFyZ3MgfSk7XG4gIGNvbnN0IG5lZ2F0aXZlID0gaGFyZGVuKHsgZG9udEludm9rZTogYXBpTWV0aG9kTmFtZSB9KTtcbiAgcmV0dXJuIGhhcmRlbih7IHBvc2l0aXZlLCBuZWdhdGl2ZSB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyhtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyk7XG5jb25zdCBzZXR1cEFwaUdvdmVybmFuY2UgPSAoXG4gIGdldEdvdmVybmVkQXBpcyxcbiAgZ2V0R292ZXJuZWROYW1lcyxcbiAgdGltZXIsXG4gIGdldFVwZGF0ZWRQb3NlckZhY2V0LFxuKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHZvdGVDb3VudGVycyA9IG5ldyBXZWFrU2V0KCk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB2b3RlT25BcGlJbnZvY2F0aW9uID0gYXN5bmMgKFxuICAgIGFwaU1ldGhvZE5hbWUsXG4gICAgbWV0aG9kQXJncyxcbiAgICB2b3RlQ291bnRlckluc3RhbGxhdGlvbixcbiAgICBkZWFkbGluZSxcbiAgKSA9PiB7XG4gICAgY29uc3QgZ292ZXJuZWROYW1lcyA9IGF3YWl0IGdldEdvdmVybmVkTmFtZXMoKTtcbiAgICBnb3Zlcm5lZE5hbWVzLmluY2x1ZGVzKGFwaU1ldGhvZE5hbWUpIHx8XG4gICAgICBGYWlsYCR7YXBpTWV0aG9kTmFtZX0gaXMgbm90IGEgZ292ZXJuZWQgQVBJLmA7XG5cbiAgICBjb25zdCB7IHBvc2l0aXZlLCBuZWdhdGl2ZSB9ID0gbWFrZUFwaUludm9jYXRpb25Qb3NpdGlvbnMoXG4gICAgICBhcGlNZXRob2ROYW1lLFxuICAgICAgbWV0aG9kQXJncyxcbiAgICApO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaXNzdWUgPSBoYXJkZW4oeyBhcGlNZXRob2ROYW1lLCBtZXRob2RBcmdzIH0pO1xuICAgIGNvbnN0IHF1ZXN0aW9uU3BlYyA9IGNvZXJjZVF1ZXN0aW9uU3BlYyh7XG4gICAgICBtZXRob2Q6IENob2ljZU1ldGhvZC5VTlJBTktFRCxcbiAgICAgIGlzc3VlLFxuICAgICAgcG9zaXRpb25zOiBbcG9zaXRpdmUsIG5lZ2F0aXZlXSxcbiAgICAgIGVsZWN0aW9uVHlwZTogRWxlY3Rpb25UeXBlLkFQSV9JTlZPQ0FUSU9OLFxuICAgICAgbWF4Q2hvaWNlczogMSxcbiAgICAgIG1heFdpbm5lcnM6IDEsXG4gICAgICBjbG9zaW5nUnVsZTogeyB0aW1lciwgZGVhZGxpbmUgfSxcbiAgICAgIHF1b3J1bVJ1bGU6IFF1b3J1bVJ1bGUuTUFKT1JJVFksXG4gICAgICB0aWVPdXRjb21lOiBuZWdhdGl2ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcHVibGljRmFjZXQ6IGNvdW50ZXJQdWJsaWNGYWNldCwgaW5zdGFuY2U6IHZvdGVDb3VudGVyIH0gPSBhd2FpdCBFKFxuICAgICAgZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSxcbiAgICApLmFkZFF1ZXN0aW9uKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLCBxdWVzdGlvblNwZWMpO1xuXG4gICAgdm90ZUNvdW50ZXJzLmFkZCh2b3RlQ291bnRlcik7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3Qgb3V0Y29tZU9mVXBkYXRlID0gRShjb3VudGVyUHVibGljRmFjZXQpXG4gICAgICAuZ2V0T3V0Y29tZSgpXG4gICAgICAudGhlbihcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICBhc3luYyBvdXRjb21lID0+IHtcbiAgICAgICAgICBhd2FpdCBudWxsO1xuXG4gICAgICAgICAgaWYgKGtleUVRKHBvc2l0aXZlLCBvdXRjb21lKSkge1xuICAgICAgICAgICAga2V5RVEob3V0Y29tZSwgaGFyZGVuKHsgYXBpTWV0aG9kTmFtZSwgbWV0aG9kQXJncyB9KSkgfHxcbiAgICAgICAgICAgICAgRmFpbGBUaGUgcXVlc3Rpb24ncyBtZXRob2QgbmFtZSAoJHtxKFxuICAgICAgICAgICAgICAgIGFwaU1ldGhvZE5hbWUsXG4gICAgICAgICAgICAgICl9KSBhbmQgYXJncyAoJHttZXRob2RBcmdzfSkgZGlkbid0IG1hdGNoIHRoZSBvdXRjb21lICR7b3V0Y29tZX1gO1xuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgY29uc3QgZ292ZXJuZWRBcGlzID0gYXdhaXQgZ2V0R292ZXJuZWRBcGlzKCk7XG4gICAgICAgICAgICByZXR1cm4gRShnb3Zlcm5lZEFwaXMpXG4gICAgICAgICAgICAgIFthcGlNZXRob2ROYW1lXSguLi5tZXRob2RBcmdzKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aXZlO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG5lZ2F0aXZlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIG91dGNvbWVPZlVwZGF0ZSxcbiAgICAgIGluc3RhbmNlOiB2b3RlQ291bnRlcixcbiAgICAgIGRldGFpbHM6IEUoY291bnRlclB1YmxpY0ZhY2V0KS5nZXREZXRhaWxzKCksXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIEZhcigncGFyYW1Hb3Zlcm5vcicsIHtcbiAgICB2b3RlT25BcGlJbnZvY2F0aW9uLFxuICAgIGNyZWF0ZWRRdWVzdGlvbjogYiA9PiB2b3RlQ291bnRlcnMuaGFzKGIpLFxuICB9KTtcbn07JGjNj19vbmNlLnNldHVwQXBpR292ZXJuYW5jZShzZXR1cEFwaUdvdmVybmFuY2UpO1xuXG5oYXJkZW4oc2V0dXBBcGlHb3Zlcm5hbmNlKTtcbmhhcmRlbihtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyI6WyJtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyJdLCJzZXR1cEFwaUdvdmVybmFuY2UiOlsic2V0dXBBcGlHb3Zlcm5hbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHT7L9zwDQAA8A0AAEEAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiLi4vcXVlc3Rpb24uanMiXSwiZXhwb3J0cyI6WyJtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMiLCJzZXR1cEZpbHRlckdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixtdXN0TWF0Y2gsa2V5RVEsTSxDaG9pY2VNZXRob2QsUXVvcnVtUnVsZSxFbGVjdGlvblR5cGUsY29lcmNlUXVlc3Rpb25TcGVjOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiLi4vcXVlc3Rpb24uanNcIiwgW1tcIkNob2ljZU1ldGhvZFwiLFskaM2PX2EgPT4gKENob2ljZU1ldGhvZCA9ICRozY9fYSldXSxbXCJRdW9ydW1SdWxlXCIsWyRozY9fYSA9PiAoUXVvcnVtUnVsZSA9ICRozY9fYSldXSxbXCJFbGVjdGlvblR5cGVcIixbJGjNj19hID0+IChFbGVjdGlvblR5cGUgPSAkaM2PX2EpXV0sW1wiY29lcmNlUXVlc3Rpb25TcGVjXCIsWyRozY9fYSA9PiAoY29lcmNlUXVlc3Rpb25TcGVjID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zID0gc3RyaW5ncyA9PiB7XG4gIGNvbnN0IHBvc2l0aXZlID0gaGFyZGVuKHsgc3RyaW5ncyB9KTtcbiAgY29uc3QgbmVnYXRpdmUgPSBoYXJkZW4oeyBkb250VXBkYXRlOiBzdHJpbmdzIH0pO1xuICByZXR1cm4geyBwb3NpdGl2ZSwgbmVnYXRpdmUgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zKG1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyk7XG5jb25zdCBzZXR1cEZpbHRlckdvdmVybmFuY2UgPSAodGltZXIsIGdldFVwZGF0ZWRQb3NlckZhY2V0LCBnb3Zlcm5lZENGKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHZvdGVDb3VudGVycyA9IG5ldyBXZWFrU2V0KCk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgdm90ZU9uRmlsdGVyID0gYXN5bmMgKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLCBkZWFkbGluZSwgc3RyaW5ncykgPT4ge1xuICAgIG11c3RNYXRjaChzdHJpbmdzLCBNLmFycmF5T2YoTS5zdHJpbmcoKSkpO1xuICAgIGNvbnN0IHsgcG9zaXRpdmUsIG5lZ2F0aXZlIH0gPSBtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMoc3RyaW5ncyk7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaXNzdWUgPSBoYXJkZW4oeyBzdHJpbmdzIH0pO1xuICAgIGNvbnN0IHF1ZXN0aW9uU3BlYyA9IGNvZXJjZVF1ZXN0aW9uU3BlYyh7XG4gICAgICBtZXRob2Q6IENob2ljZU1ldGhvZC5VTlJBTktFRCxcbiAgICAgIGlzc3VlLFxuICAgICAgcG9zaXRpb25zOiBbcG9zaXRpdmUsIG5lZ2F0aXZlXSxcbiAgICAgIGVsZWN0aW9uVHlwZTogRWxlY3Rpb25UeXBlLk9GRkVSX0ZJTFRFUixcbiAgICAgIG1heENob2ljZXM6IDEsXG4gICAgICBtYXhXaW5uZXJzOiAxLFxuICAgICAgY2xvc2luZ1J1bGU6IHsgdGltZXIsIGRlYWRsaW5lIH0sXG4gICAgICBxdW9ydW1SdWxlOiBRdW9ydW1SdWxlLk1BSk9SSVRZLFxuICAgICAgdGllT3V0Y29tZTogbmVnYXRpdmUsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHB1YmxpY0ZhY2V0OiBjb3VudGVyUHVibGljRmFjZXQsIGluc3RhbmNlOiB2b3RlQ291bnRlciB9ID0gYXdhaXQgRShcbiAgICAgIGdldFVwZGF0ZWRQb3NlckZhY2V0KCksXG4gICAgKS5hZGRRdWVzdGlvbih2b3RlQ291bnRlckluc3RhbGxhdGlvbiwgcXVlc3Rpb25TcGVjKTtcblxuICAgIHZvdGVDb3VudGVycy5hZGQodm90ZUNvdW50ZXIpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IG91dGNvbWVPZlVwZGF0ZSA9IEUoY291bnRlclB1YmxpY0ZhY2V0KVxuICAgICAgLmdldE91dGNvbWUoKVxuICAgICAgLnRoZW4oXG4gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgb3V0Y29tZSA9PiB7XG4gICAgICAgICAgaWYgKGtleUVRKG91dGNvbWUsIHBvc2l0aXZlKSkge1xuICAgICAgICAgICAgcmV0dXJuIEUoZ292ZXJuZWRDRilcbiAgICAgICAgICAgICAgLnNldE9mZmVyRmlsdGVyKHN0cmluZ3MpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXRpdmU7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5RVEob3V0Y29tZSwgbmVnYXRpdmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmVnYXRpdmU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKCd1bnJlY29nbml6ZWQgb3V0Y29tZScpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG5cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIG91dGNvbWVPZlVwZGF0ZSxcbiAgICAgIGluc3RhbmNlOiB2b3RlQ291bnRlcixcbiAgICAgIGRldGFpbHM6IEUoY291bnRlclB1YmxpY0ZhY2V0KS5nZXREZXRhaWxzKCksXG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIEZhcignZmlsdGVyR292ZXJub3InLCB7XG4gICAgdm90ZU9uRmlsdGVyLFxuICAgIGNyZWF0ZWRRdWVzdGlvbjogYiA9PiB2b3RlQ291bnRlcnMuaGFzKGIpLFxuICB9KTtcbn07JGjNj19vbmNlLnNldHVwRmlsdGVyR292ZXJuYW5jZShzZXR1cEZpbHRlckdvdmVybmFuY2UpO1xuXG5oYXJkZW4oc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlKTtcbmhhcmRlbihtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zIjpbIm1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyJdLCJzZXR1cEZpbHRlckdvdmVybmFuY2UiOlsic2V0dXBGaWx0ZXJHb3Zlcm5hbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM+iMc06FAAAOhQAAEAAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSIsIi4uL3F1ZXN0aW9uLmpzIiwiLi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIkNPTlRSQUNUX0VMRUNUT1JBVEUiLCJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwic2V0dXBQYXJhbUdvdmVybmFuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEUsZGVlcGx5RnVsZmlsbGVkLEZhcixtdXN0TWF0Y2gsa2V5RVEsQ2hvaWNlTWV0aG9kLGNvZXJjZVF1ZXN0aW9uU3BlYyxFbGVjdGlvblR5cGUsUXVvcnVtUnVsZSxQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLFskaM2PX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXV1dLFtcIi4uL3F1ZXN0aW9uLmpzXCIsIFtbXCJDaG9pY2VNZXRob2RcIixbJGjNj19hID0+IChDaG9pY2VNZXRob2QgPSAkaM2PX2EpXV0sW1wiY29lcmNlUXVlc3Rpb25TcGVjXCIsWyRozY9fYSA9PiAoY29lcmNlUXVlc3Rpb25TcGVjID0gJGjNj19hKV1dLFtcIkVsZWN0aW9uVHlwZVwiLFskaM2PX2EgPT4gKEVsZWN0aW9uVHlwZSA9ICRozY9fYSldXSxbXCJRdW9ydW1SdWxlXCIsWyRozY9fYSA9PiAoUXVvcnVtUnVsZSA9ICRozY9fYSldXV1dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlXCIsWyRozY9fYSA9PiAoUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLypcblxuXG4gKi9cbmNvbnN0IENPTlRSQUNUX0VMRUNUT1JBVEUgPSAnRWxlY3RvcmF0ZSc7XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLkNPTlRSQUNUX0VMRUNUT1JBVEUoQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG5jb25zdCBtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMgPSBjaGFuZ2VzID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcG9zaXRpdmUgPSB7IGNoYW5nZXMgfTtcbiAgY29uc3QgbmFtZXNPbmx5ID0gT2JqZWN0LmtleXMoY2hhbmdlcyk7XG4gIGNvbnN0IG5lZ2F0aXZlID0geyBub0NoYW5nZTogbmFtZXNPbmx5IH07XG4gIHJldHVybiBoYXJkZW4oeyBwb3NpdGl2ZSwgbmVnYXRpdmUgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMobWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zKTtcbmNvbnN0IGFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0gPSAocGFyYW1TcGVjLCBxdWVzdGlvblNwZWMpID0+IHtcbiAgbXVzdE1hdGNoKHF1ZXN0aW9uU3BlYywgUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG4gIGNvbnN0IHsgcGFyYW1ldGVyTmFtZSwgcGFyYW1QYXRoIH0gPSBwYXJhbVNwZWM7XG4gIGNvbnN0IHsgaXNzdWUgfSA9IHF1ZXN0aW9uU3BlYztcbiAgaXNzdWUuc3BlYy5jaGFuZ2VzW3BhcmFtZXRlck5hbWVdIHx8XG4gICAgRmFpbGBRdWVzdGlvbiAoJHtpc3N1ZS5zcGVjLmNoYW5nZXN9KSBkb2VzIG5vdCBjb25jZXJuICR7cGFyYW1ldGVyTmFtZX1gO1xuICBrZXlFUShpc3N1ZS5zcGVjLnBhcmFtUGF0aCwgcGFyYW1QYXRoKSB8fFxuICAgIEZhaWxgUXVlc3Rpb24gcGF0aCAoJHtpc3N1ZS5zcGVjLnBhcmFtUGF0aH0pIGRvZXNuJ3QgbWF0Y2ggcmVxdWVzdCAoJHtwYXJhbVBhdGh9KWA7XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtKGFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0pO1xuY29uc3Qgc2V0dXBQYXJhbUdvdmVybmFuY2UgPSAoXG4gIHBhcmFtTWFuYWdlclJldHJpZXZlckFjY2Vzc29yLFxuICBjb250cmFjdEluc3RhbmNlLFxuICB0aW1lcixcbiAgZ2V0VXBkYXRlZFBvc2VyRmFjZXQsXG4pID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgdm90ZUNvdW50ZXJzID0gbmV3IFdlYWtTZXQoKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgdm90ZU9uUGFyYW1DaGFuZ2VzID0gYXN5bmMgKFxuICAgIHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuICAgIGRlYWRsaW5lLFxuICAgIHBhcmFtU3BlYyxcbiAgKSA9PiB7XG4gICAgY29uc3QgcGFyYW1NYW5hZ2VyUmV0cmlldmVyID0gcGFyYW1NYW5hZ2VyUmV0cmlldmVyQWNjZXNzb3IoKTtcbiAgICBjb25zdCBwYXJhbU1nciA9IGF3YWl0IEUocGFyYW1NYW5hZ2VyUmV0cmlldmVyKS5nZXQocGFyYW1TcGVjLnBhcmFtUGF0aCk7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBjaGFuZ2VQcyA9IHt9O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhwYXJhbVNwZWMuY2hhbmdlcykpIHtcbiAgICAgIGNvbnN0IHByb3Bvc2VkVmFsdWUgPSBFKHBhcmFtTWdyKS5nZXRWaXNpYmxlVmFsdWUoXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBhcmFtU3BlYy5jaGFuZ2VzW25hbWVdLFxuICAgICAgKTtcbiAgICAgIGNoYW5nZVBzW25hbWVdID0gcHJvcG9zZWRWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgY2hhbmdlcyA9IGF3YWl0IGRlZXBseUZ1bGZpbGxlZChoYXJkZW4oY2hhbmdlUHMpKTtcblxuICAgIGNvbnN0IHsgcG9zaXRpdmUsIG5lZ2F0aXZlIH0gPSBtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMoY2hhbmdlcyk7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaXNzdWUgPSBoYXJkZW4oe1xuICAgICAgc3BlYzoge1xuICAgICAgICBwYXJhbVBhdGg6IHBhcmFtU3BlYy5wYXJhbVBhdGgsXG4gICAgICAgIGNoYW5nZXMsXG4gICAgICB9LFxuICAgICAgY29udHJhY3Q6IGNvbnRyYWN0SW5zdGFuY2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCBxdWVzdGlvblNwZWMgPSBjb2VyY2VRdWVzdGlvblNwZWMoe1xuICAgICAgbWV0aG9kOiBDaG9pY2VNZXRob2QuVU5SQU5LRUQsXG4gICAgICBpc3N1ZSxcbiAgICAgIHBvc2l0aW9uczogW3Bvc2l0aXZlLCBuZWdhdGl2ZV0sXG4gICAgICBlbGVjdGlvblR5cGU6IEVsZWN0aW9uVHlwZS5QQVJBTV9DSEFOR0UsXG4gICAgICBtYXhDaG9pY2VzOiAxLFxuICAgICAgbWF4V2lubmVyczogMSxcbiAgICAgIGNsb3NpbmdSdWxlOiB7IHRpbWVyLCBkZWFkbGluZSB9LFxuICAgICAgcXVvcnVtUnVsZTogUXVvcnVtUnVsZS5NQUpPUklUWSxcbiAgICAgIHRpZU91dGNvbWU6IG5lZ2F0aXZlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBwdWJsaWNGYWNldDogY291bnRlclB1YmxpY0ZhY2V0LCBpbnN0YW5jZTogdm90ZUNvdW50ZXIgfSA9IGF3YWl0IEUoXG4gICAgICBnZXRVcGRhdGVkUG9zZXJGYWNldCgpLFxuICAgICkuYWRkUXVlc3Rpb24odm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIHF1ZXN0aW9uU3BlYyk7XG5cbiAgICB2b3RlQ291bnRlcnMuYWRkKHZvdGVDb3VudGVyKTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBvdXRjb21lT2ZVcGRhdGUgPSBFKGNvdW50ZXJQdWJsaWNGYWNldClcbiAgICAgIC5nZXRPdXRjb21lKClcbiAgICAgIC50aGVuKGFzeW5jIG91dGNvbWUgPT4ge1xuICAgICAgICBpZiAoa2V5RVEocG9zaXRpdmUsIG91dGNvbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIEUud2hlbihcbiAgICAgICAgICAgIEUocGFyYW1NZ3IpLnVwZGF0ZVBhcmFtcyhwYXJhbVNwZWMuY2hhbmdlcyksXG4gICAgICAgICAgICAoKSA9PiBwb3NpdGl2ZSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZWdhdGl2ZTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG91dGNvbWVPZlVwZGF0ZSxcbiAgICAgIGluc3RhbmNlOiB2b3RlQ291bnRlcixcbiAgICAgIGRldGFpbHM6IEUoY291bnRlclB1YmxpY0ZhY2V0KS5nZXREZXRhaWxzKCksXG4gICAgfTtcbiAgfTtcblxuICByZXR1cm4gRmFyKCdwYXJhbUdvdmVybm9yJywge1xuICAgIHZvdGVPblBhcmFtQ2hhbmdlcyxcbiAgICBjcmVhdGVkUXVlc3Rpb246IGIgPT4gdm90ZUNvdW50ZXJzLmhhcyhiKSxcbiAgfSk7XG59OyRozY9fb25jZS5zZXR1cFBhcmFtR292ZXJuYW5jZShzZXR1cFBhcmFtR292ZXJuYW5jZSk7XG5cbmhhcmRlbihzZXR1cFBhcmFtR292ZXJuYW5jZSk7XG5oYXJkZW4obWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zKTtcbmhhcmRlbihhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNPTlRSQUNUX0VMRUNUT1JBVEUiOlsiQ09OVFJBQ1RfRUxFQ1RPUkFURSJdLCJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiOlsibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIl0sImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0iOlsiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSJdLCJzZXR1cFBhcmFtR292ZXJuYW5jZSI6WyJzZXR1cFBhcmFtR292ZXJuYW5jZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADI1Y/fiTcAAIk3AABBAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvem9lL3NyYy9jbGVhblByb3Bvc2FsLmpzIiwiQGVuZG8vbmF0IiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL2ludGVybmFsIiwiLi4vY29uc3RhbnRzLmpzIiwiLi9hc3NlcnRpb25zLmpzIiwiLi9nb3Zlcm5QYXJhbS5qcyJdLCJleHBvcnRzIjpbImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzIiwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRmFyLHBhc3NTdHlsZU9mLEFtb3VudE1hdGgsYXNzZXJ0S2V5d29yZE5hbWUsTmF0LGtleUVRLG1ha2VTY2FsYXJNYXBTdG9yZSxFLGFzc2VydEFsbERlZmluZWQsUGFyYW1UeXBlcyxhc3NlcnRUaW1lc3RhbXAsYXNzZXJ0UmVsYXRpdmVUaW1lLG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8sbWFrZUFzc2VydEluc3RhbGxhdGlvbixtYWtlQXNzZXJ0SW5zdGFuY2UsbWFrZUxvb2tzTGlrZUJyYW5kLENPTlRSQUNUX0VMRUNUT1JBVEU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NsZWFuUHJvcG9zYWwuanNcIiwgW1tcImFzc2VydEtleXdvcmROYW1lXCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5d29yZE5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRozY9fYSldXV1dLFtcIi4uL2NvbnN0YW50cy5qc1wiLCBbW1wiUGFyYW1UeXBlc1wiLFskaM2PX2EgPT4gKFBhcmFtVHlwZXMgPSAkaM2PX2EpXV1dXSxbXCIuL2Fzc2VydGlvbnMuanNcIiwgW1tcImFzc2VydFRpbWVzdGFtcFwiLFskaM2PX2EgPT4gKGFzc2VydFRpbWVzdGFtcCA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWxhdGl2ZVRpbWVcIixbJGjNj19hID0+IChhc3NlcnRSZWxhdGl2ZVRpbWUgPSAkaM2PX2EpXV0sW1wibWFrZUFzc2VydEJyYW5kZWRSYXRpb1wiLFskaM2PX2EgPT4gKG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8gPSAkaM2PX2EpXV0sW1wibWFrZUFzc2VydEluc3RhbGxhdGlvblwiLFskaM2PX2EgPT4gKG1ha2VBc3NlcnRJbnN0YWxsYXRpb24gPSAkaM2PX2EpXV0sW1wibWFrZUFzc2VydEluc3RhbmNlXCIsWyRozY9fYSA9PiAobWFrZUFzc2VydEluc3RhbmNlID0gJGjNj19hKV1dLFtcIm1ha2VMb29rc0xpa2VCcmFuZFwiLFskaM2PX2EgPT4gKG1ha2VMb29rc0xpa2VCcmFuZCA9ICRozY9fYSldXV1dLFtcIi4vZ292ZXJuUGFyYW0uanNcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIixbJGjNj19hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMgPSAocGFyYW1NYW5hZ2VyLCBnb3Zlcm5lZFBhcmFtcykgPT4ge1xuICBjb25zdCBtYW5hZ2VyRWxlY3RvcmF0ZSA9XG4gICAgcGFyYW1NYW5hZ2VyLmdldEludml0YXRpb25BbW91bnQoQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG4gIGNvbnN0IHtcbiAgICBbQ09OVFJBQ1RfRUxFQ1RPUkFURV06IHsgdmFsdWU6IHBhcmFtRWxlY3RvcmF0ZSB9LFxuICB9ID0gZ292ZXJuZWRQYXJhbXM7XG4gIHBhcmFtRWxlY3RvcmF0ZSB8fFxuICAgIEZhaWxgTWlzc2luZyAke3EoQ09OVFJBQ1RfRUxFQ1RPUkFURSl9IHRlcm0gaW4gJHtxKGdvdmVybmVkUGFyYW1zKX1gO1xuICBrZXlFUShtYW5hZ2VyRWxlY3RvcmF0ZSwgcGFyYW1FbGVjdG9yYXRlKSB8fFxuICAgIEZhaWxgRWxlY3RvcmF0ZSBpbiBtYW5hZ2VyICgke21hbmFnZXJFbGVjdG9yYXRlfSl9IGluY29tcGF0aWJsZSB3aXRoIHRlcm1zICgke3BhcmFtRWxlY3RvcmF0ZX1gO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMoYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMpO1xuY29uc3QgbWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIgPSAocHVibGlzaGVyS2l0LCB6b2UpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBuYW1lc1RvUGFyYW1zID0gbWFrZVNjYWxhck1hcFN0b3JlKCdQYXJhbWV0ZXIgTmFtZScpO1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gcHVibGlzaGVyS2l0O1xuICBhc3NlcnRBbGxEZWZpbmVkKHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0pO1xuXG4gIGNvbnN0IGdldHRlcnMgPSB7fTtcbiAgY29uc3Qgc2V0dGVycyA9IHt9O1xuICBjb25zdCB1bmZpbmlzaGVkUGFyYW1zID0gW107XG5cbiAgLy9cbiAgLy9cbiAgY29uc3QgZmluaXNoQnVpbGRpbmcgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodW5maW5pc2hlZFBhcmFtcyk7XG4gICAgdW5maW5pc2hlZFBhcmFtcy5sZW5ndGggPSAwO1xuICB9O1xuXG4gIGNvbnN0IHB1Ymxpc2ggPSAoKSA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGN1cnJlbnQgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBbLi4ubmFtZXNUb1BhcmFtcy5lbnRyaWVzKCldLm1hcCgoW2ssIHZdKSA9PiBbaywgdi5tYWtlRGVzY3JpcHRpb24oKV0pLFxuICAgICk7XG4gICAgcHVibGlzaGVyLnVwZGF0ZVN0YXRlKHsgY3VycmVudCB9KTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGJ1aWxkQ29weVBhcmFtID0gKG5hbWUsIHZhbHVlLCBhc3NlcnRpb24sIHR5cGUpID0+IHtcbiAgICBsZXQgY3VycmVudDtcbiAgICBhc3NlcnRLZXl3b3JkTmFtZShuYW1lKTtcbiAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IEZhaWxgcGFyYW0gJHtxKG5hbWUpfSBtdXN0IGJlIGRlZmluZWRgO1xuXG4gICAgY29uc3Qgc2V0UGFyYW1WYWx1ZSA9IG5ld1ZhbHVlID0+IHtcbiAgICAgIGFzc2VydGlvbihuZXdWYWx1ZSk7XG4gICAgICBjdXJyZW50ID0gbmV3VmFsdWU7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgW25hbWVdOiBuZXdWYWx1ZSB9KTtcbiAgICB9O1xuICAgIHNldFBhcmFtVmFsdWUodmFsdWUpO1xuXG4gICAgY29uc3QgZ2V0VmlzaWJsZVZhbHVlID0gcHJvcG9zZWQgPT4ge1xuICAgICAgYXNzZXJ0aW9uKHByb3Bvc2VkKTtcbiAgICAgIHJldHVybiBwcm9wb3NlZDtcbiAgICB9O1xuXG4gICAgY29uc3QgcHVibGljTWV0aG9kcyA9IEZhcihgUGFyYW1ldGVyICR7bmFtZX1gLCB7XG4gICAgICBnZXRWYWx1ZTogKCkgPT4gY3VycmVudCxcbiAgICAgIGFzc2VydFR5cGU6IGFzc2VydGlvbixcbiAgICAgIG1ha2VEZXNjcmlwdGlvbjogKCkgPT4gKHsgdHlwZSwgdmFsdWU6IGN1cnJlbnQgfSksXG4gICAgICBnZXRWaXNpYmxlVmFsdWUsXG4gICAgICBnZXRUeXBlOiAoKSA9PiB0eXBlLFxuICAgIH0pO1xuXG4gICAgLy9cbiAgICBnZXR0ZXJzW2BnZXQke25hbWV9YF0gPSAoKSA9PiBnZXRUeXBlZFBhcmFtKHR5cGUsIG5hbWUpO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgc2V0dGVyc1tgdXBkYXRlJHtuYW1lfWBdID0gc2V0UGFyYW1WYWx1ZTtcbiAgICBzZXR0ZXJzW2BwcmVwYXJlVG9VcGRhdGUke25hbWV9YF0gPSBwcm9wb3NlZFZhbHVlID0+IHByb3Bvc2VkVmFsdWU7XG4gICAgbmFtZXNUb1BhcmFtcy5pbml0KG5hbWUsIHB1YmxpY01ldGhvZHMpO1xuICB9O1xuXG4gIC8vXG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhZGRBbW91bnQgPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBjb25zdCBhc3NlcnRBbW91bnQgPSBhID0+IHtcbiAgICAgIGEuYnJhbmQgfHwgRmFpbGBFeHBlY3RlZCBhbiBBbW91bnQgZm9yICR7cShuYW1lKX0sIGdvdDogJHthfWA7XG4gICAgICByZXR1cm4gQW1vdW50TWF0aC5jb2VyY2UodmFsdWUuYnJhbmQsIGEpO1xuICAgIH07XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydEFtb3VudCwgUGFyYW1UeXBlcy5BTU9VTlQpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhZGRCcmFuZCA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydEJyYW5kID0gbWFrZUxvb2tzTGlrZUJyYW5kKG5hbWUpO1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRCcmFuZCwgUGFyYW1UeXBlcy5CUkFORCk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhZGRJbnN0YWxsYXRpb24gPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBjb25zdCBhc3NlcnRJbnN0YWxsYXRpb24gPSBtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uKG5hbWUpO1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRJbnN0YWxsYXRpb24sIFBhcmFtVHlwZXMuSU5TVEFMTEFUSU9OKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYWRkSW5zdGFuY2UgPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBjb25zdCBhc3NlcnRJbnN0YW5jZSA9IG1ha2VBc3NlcnRJbnN0YW5jZShuYW1lKTtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0SW5zdGFuY2UsIFBhcmFtVHlwZXMuSU5TVEFOQ0UpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYWRkTmF0ID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0TmF0ID0gdiA9PiB7XG4gICAgICBhc3NlcnQudHlwZW9mKHYsICdiaWdpbnQnKTtcbiAgICAgIE5hdCh2KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydE5hdCwgUGFyYW1UeXBlcy5OQVQpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhZGRSYXRpbyA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydEJyYW5kZWRSYXRpbyA9IG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8obmFtZSwgdmFsdWUpO1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRCcmFuZGVkUmF0aW8sIFBhcmFtVHlwZXMuUkFUSU8pO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGFkZFJlY29yZCA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydFJlY29yZCA9IHYgPT4ge1xuICAgICAgcGFzc1N0eWxlT2Yodik7XG4gICAgICBhc3NlcnQudHlwZW9mKHYsICdvYmplY3QnKTtcbiAgICB9O1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRSZWNvcmQsIFBhcmFtVHlwZXMuUEFTU0FCTEVfUkVDT1JEKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGFkZFN0cmluZyA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydFN0cmluZyA9IHYgPT4gYXNzZXJ0LnR5cGVvZih2LCAnc3RyaW5nJyk7XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydFN0cmluZywgUGFyYW1UeXBlcy5TVFJJTkcpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhZGRUaW1lc3RhbXAgPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0VGltZXN0YW1wLCBQYXJhbVR5cGVzLlRJTUVTVEFNUCk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGFkZFJlbGF0aXZlVGltZSA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRSZWxhdGl2ZVRpbWUsIFBhcmFtVHlwZXMuUkVMQVRJVkVfVElNRSk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhZGRVbmtub3duID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0VW5rbm93biA9IF92ID0+IHRydWU7XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydFVua25vd24sIFBhcmFtVHlwZXMuVU5LTk9XTik7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0SW52aXRhdGlvbiA9IGFzeW5jIGkgPT4ge1xuICAgIGlmICghem9lKSB7XG4gICAgICB0aHJvdyBGYWlsYHpvZSBtdXN0IGJlIHByb3ZpZGVkIGZvciBnb3Zlcm5lZCBJbnZpdGF0aW9ucyAke3pvZX1gO1xuICAgIH1cblxuICAgIC8vXG4gICAgY29uc3QgaXNMaXZlID0gYXdhaXQgRShFKHpvZSkuZ2V0SW52aXRhdGlvbklzc3VlcigpKS5pc0xpdmUoaSk7XG4gICAgaXNMaXZlIHx8IEZhaWxgSW52aXRhdGlvbiBwYXNzZWQgdG8gcGFyYW1NYW5hZ2VyIGlzIG5vdCBsaXZlICR7aX1gO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBidWlsZEludml0YXRpb25QYXJhbSA9IChuYW1lLCBpbnZpdGF0aW9uKSA9PiB7XG4gICAgaWYgKCF6b2UpIHtcbiAgICAgIHRocm93IEZhaWxgem9lIG11c3QgYmUgcHJvdmlkZWQgZm9yIGdvdmVybmVkIEludml0YXRpb25zICR7em9lfWA7XG4gICAgfVxuICAgIGxldCBjdXJyZW50SW52aXRhdGlvbjtcbiAgICBsZXQgY3VycmVudEFtb3VudDtcblxuICAgIC8qXG5cbiAgICAgKi9cblxuICAgIC8qXG5cblxuXG5cbiAgICAgKi9cbiAgICBjb25zdCBwcmVwYXJlVG9TZXRJbnZpdGF0aW9uID0gYXN5bmMgaW52aXRlID0+IHtcbiAgICAgIGNvbnN0IFtwcmVwYXJlZEFtb3VudF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIEUoRSh6b2UpLmdldEludml0YXRpb25Jc3N1ZXIoKSkuZ2V0QW1vdW50T2YoaW52aXRlKSxcbiAgICAgICAgYXNzZXJ0SW52aXRhdGlvbihpbnZpdGUpLFxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiBbaW52aXRlLCBwcmVwYXJlZEFtb3VudF07XG4gICAgfTtcblxuICAgIC8qXG5cblxuXG4gICAgICovXG4gICAgY29uc3Qgc2V0SW52aXRhdGlvbiA9IChbbmV3SW52aXRhdGlvbiwgYW1vdW50XSkgPT4ge1xuICAgICAgY3VycmVudEFtb3VudCA9IGFtb3VudDtcbiAgICAgIGN1cnJlbnRJbnZpdGF0aW9uID0gbmV3SW52aXRhdGlvbjtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBbbmFtZV06IGN1cnJlbnRBbW91bnQgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IG1ha2VEZXNjcmlwdGlvbiA9ICgpID0+IHtcbiAgICAgIHJldHVybiB7IHR5cGU6IFBhcmFtVHlwZXMuSU5WSVRBVElPTiwgdmFsdWU6IGN1cnJlbnRBbW91bnQgfTtcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0VmlzaWJsZVZhbHVlID0gYXN5bmMgYWxsZWdlZEludml0YXRpb24gPT5cbiAgICAgIEUoRSh6b2UpLmdldEludml0YXRpb25Jc3N1ZXIoKSkuZ2V0QW1vdW50T2YoYWxsZWdlZEludml0YXRpb24pO1xuXG4gICAgY29uc3QgcHVibGljTWV0aG9kcyA9IEZhcihgUGFyYW1ldGVyICR7bmFtZX1gLCB7XG4gICAgICBnZXRWYWx1ZTogKCkgPT4gY3VycmVudEFtb3VudCxcbiAgICAgIGdldEludGVybmFsVmFsdWU6ICgpID0+IGN1cnJlbnRJbnZpdGF0aW9uLFxuICAgICAgYXNzZXJ0VHlwZTogYXNzZXJ0SW52aXRhdGlvbixcbiAgICAgIG1ha2VEZXNjcmlwdGlvbixcbiAgICAgIGdldFR5cGU6ICgpID0+IFBhcmFtVHlwZXMuSU5WSVRBVElPTixcbiAgICAgIGdldFZpc2libGVWYWx1ZSxcbiAgICB9KTtcblxuICAgIGdldHRlcnNbYGdldCR7bmFtZX1gXSA9ICgpID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5JTlZJVEFUSU9OLCBuYW1lKTtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHNldHRlcnNbYHByZXBhcmVUb1VwZGF0ZSR7bmFtZX1gXSA9IHByZXBhcmVUb1NldEludml0YXRpb247XG4gICAgc2V0dGVyc1tgdXBkYXRlJHtuYW1lfWBdID0gc2V0SW52aXRhdGlvbjtcblxuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBmaW5pc2hJbnZpdGF0aW9uUGFyYW0gPSBFLndoZW4oXG4gICAgICBwcmVwYXJlVG9TZXRJbnZpdGF0aW9uKGludml0YXRpb24pLFxuICAgICAgaW52aXRhdGlvbkFuZEFtb3VudCA9PiB7XG4gICAgICAgIHNldEludml0YXRpb24oaW52aXRhdGlvbkFuZEFtb3VudCk7XG4gICAgICAgIC8vXG4gICAgICAgIG5hbWVzVG9QYXJhbXMuaW5pdChuYW1lLCBwdWJsaWNNZXRob2RzKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICB1bmZpbmlzaGVkUGFyYW1zLnB1c2goZmluaXNoSW52aXRhdGlvblBhcmFtKTtcblxuICAgIHJldHVybiBuYW1lO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGFkZEludml0YXRpb24gPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBhc3NlcnRLZXl3b3JkTmFtZShuYW1lKTtcbiAgICB2YWx1ZSAhPT0gbnVsbCB8fCBGYWlsYHBhcmFtICR7cShuYW1lKX0gbXVzdCBiZSBkZWZpbmVkYDtcblxuICAgIGJ1aWxkSW52aXRhdGlvblBhcmFtKG5hbWUsIHZhbHVlKTtcblxuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8vXG5cbiAgY29uc3QgZ2V0VHlwZWRQYXJhbSA9ICh0eXBlLCBuYW1lKSA9PiB7XG4gICAgY29uc3QgcGFyYW0gPSBuYW1lc1RvUGFyYW1zLmdldChuYW1lKTtcbiAgICB0eXBlID09PSBwYXJhbS5nZXRUeXBlKCkgfHwgRmFpbGAke25hbWV9IGlzIG5vdCAke3R5cGV9YDtcbiAgICByZXR1cm4gcGFyYW0uZ2V0VmFsdWUoKTtcbiAgfTtcblxuICBjb25zdCBnZXRWaXNpYmxlVmFsdWUgPSAobmFtZSwgcHJvcG9zZWQpID0+IHtcbiAgICBjb25zdCBwYXJhbSA9IG5hbWVzVG9QYXJhbXMuZ2V0KG5hbWUpO1xuICAgIHJldHVybiBwYXJhbS5nZXRWaXNpYmxlVmFsdWUocHJvcG9zZWQpO1xuICB9O1xuXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZ2V0SW50ZXJuYWxQYXJhbVZhbHVlID0gYXN5bmMgbmFtZSA9PiB7XG4gICAgYXdhaXQgZmluaXNoQnVpbGRpbmcoKTtcbiAgICByZXR1cm4gbmFtZXNUb1BhcmFtcy5nZXQobmFtZSkuZ2V0SW50ZXJuYWxWYWx1ZSgpO1xuICB9O1xuXG4gIGNvbnN0IGdldFBhcmFtcyA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBmaW5pc2hCdWlsZGluZygpO1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBkZXNjcmlwdGlvbnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBwYXJhbV0gb2YgbmFtZXNUb1BhcmFtcy5lbnRyaWVzKCkpIHtcbiAgICAgIGRlc2NyaXB0aW9uc1tuYW1lXSA9IHBhcmFtLm1ha2VEZXNjcmlwdGlvbigpO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKGRlc2NyaXB0aW9ucyk7XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHVwZGF0ZVBhcmFtcyA9IGFzeW5jIHBhcmFtQ2hhbmdlcyA9PiB7XG4gICAgYXdhaXQgZmluaXNoQnVpbGRpbmcoKTtcbiAgICBjb25zdCBwYXJhbU5hbWVzID0gT2JqZWN0LmtleXMocGFyYW1DaGFuZ2VzKTtcblxuICAgIC8vXG4gICAgY29uc3QgYXN5bmNSZXN1bHRzID0gcGFyYW1OYW1lcy5tYXAobmFtZSA9PlxuICAgICAgc2V0dGVyc1tgcHJlcGFyZVRvVXBkYXRlJHtuYW1lfWBdKHBhcmFtQ2hhbmdlc1tuYW1lXSksXG4gICAgKTtcbiAgICAvL1xuICAgIGNvbnN0IHByZXBhcmVkID0gYXdhaXQgUHJvbWlzZS5hbGwoYXN5bmNSZXN1bHRzKTtcblxuICAgIC8vXG4gICAgZm9yIChjb25zdCBbaSwgbmFtZV0gb2YgcGFyYW1OYW1lcy5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHNldEZuID0gc2V0dGVyc1tgdXBkYXRlJHtuYW1lfWBdO1xuICAgICAgc2V0Rm4ocHJlcGFyZWRbaV0pO1xuICAgIH1cbiAgICBwdWJsaXNoKCk7XG4gIH07XG5cbiAgLy9cbiAgY29uc3QgYnVpbGQgPSAoKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIHZvaWQgRS53aGVuKGZpbmlzaEJ1aWxkaW5nKCksICgpID0+IHB1Ymxpc2goKSk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gRmFyKCdwYXJhbSBtYW5hZ2VyJywge1xuICAgICAgZ2V0UGFyYW1zLFxuICAgICAgZ2V0U3Vic2NyaXB0aW9uOiAoKSA9PiBzdWJzY3JpYmVyLFxuICAgICAgZ2V0QW1vdW50OiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5BTU9VTlQsIG5hbWUpLFxuICAgICAgZ2V0QnJhbmQ6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLkJSQU5ELCBuYW1lKSxcbiAgICAgIGdldEluc3RhbmNlOiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5JTlNUQU5DRSwgbmFtZSksXG4gICAgICBnZXRJbnN0YWxsYXRpb246IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOU1RBTExBVElPTiwgbmFtZSksXG4gICAgICBnZXRJbnZpdGF0aW9uQW1vdW50OiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5JTlZJVEFUSU9OLCBuYW1lKSxcbiAgICAgIGdldE5hdDogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuTkFULCBuYW1lKSxcbiAgICAgIGdldFJhdGlvOiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5SQVRJTywgbmFtZSksXG4gICAgICBnZXRSZWNvcmQ6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlBBU1NBQkxFX1JFQ09SRCwgbmFtZSksXG4gICAgICBnZXRTdHJpbmc6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlNUUklORywgbmFtZSksXG4gICAgICBnZXRUaW1lc3RhbXA6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlRJTUVTVEFNUCwgbmFtZSksXG4gICAgICBnZXRSZWxhdGl2ZVRpbWU6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlJFTEFUSVZFX1RJTUUsIG5hbWUpLFxuICAgICAgZ2V0VW5rbm93bjogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuVU5LTk9XTiwgbmFtZSksXG4gICAgICBnZXRWaXNpYmxlVmFsdWUsXG4gICAgICBnZXRJbnRlcm5hbFBhcmFtVmFsdWUsXG4gICAgICAvL1xuICAgICAgLi4uZ2V0dGVycyxcbiAgICAgIHVwZGF0ZVBhcmFtcyxcbiAgICAgIC8vXG4gICAgICByZWFkb25seTogKCkgPT4gaGFyZGVuKGdldHRlcnMpLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYnVpbGRlciA9IHtcbiAgICBhZGRBbW91bnQ6IChuLCB2KSA9PiBhZGRBbW91bnQobiwgdiwgYnVpbGRlciksXG4gICAgYWRkQnJhbmQ6IChuLCB2KSA9PiBhZGRCcmFuZChuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRJbnN0YWxsYXRpb246IChuLCB2KSA9PiBhZGRJbnN0YWxsYXRpb24obiwgdiwgYnVpbGRlciksXG4gICAgYWRkSW5zdGFuY2U6IChuLCB2KSA9PiBhZGRJbnN0YW5jZShuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRVbmtub3duOiAobiwgdikgPT4gYWRkVW5rbm93bihuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRJbnZpdGF0aW9uOiAobiwgdikgPT4gYWRkSW52aXRhdGlvbihuLCB2LCBidWlsZGVyKSxcbiAgICBhZGROYXQ6IChuLCB2KSA9PiBhZGROYXQobiwgdiwgYnVpbGRlciksXG4gICAgYWRkUmF0aW86IChuLCB2KSA9PiBhZGRSYXRpbyhuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRSZWNvcmQ6IChuLCB2KSA9PiBhZGRSZWNvcmQobiwgdiwgYnVpbGRlciksXG4gICAgYWRkU3RyaW5nOiAobiwgdikgPT4gYWRkU3RyaW5nKG4sIHYsIGJ1aWxkZXIpLFxuICAgIGFkZFJlbGF0aXZlVGltZTogKG4sIHYpID0+IGFkZFJlbGF0aXZlVGltZShuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRUaW1lc3RhbXA6IChuLCB2KSA9PiBhZGRUaW1lc3RhbXAobiwgdiwgYnVpbGRlciksXG4gICAgYnVpbGQsXG4gIH07XG4gIHJldHVybiBidWlsZGVyO1xufTskaM2PX29uY2UubWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIobWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIpO1xuXG5oYXJkZW4oYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMpO1xuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzIjpbImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzIl0sIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyIjpbIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABojdIbiDgAA4g4AAEYAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9lcnJvcnMiLCIuLi9jb25zdGFudHMuanMiLCIuL2dvdmVyblBhcmFtLmpzIiwiLi9wYXJhbU1hbmFnZXIuanMiXSwiZXhwb3J0cyI6WyJtYWtlUGFyYW1NYW5hZ2VyIiwibWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyIsIm1ha2VQYXJhbU1hbmFnZXJTeW5jIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYWlsLHEsUGFyYW1UeXBlcyxDT05UUkFDVF9FTEVDVE9SQVRFLG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi4vY29uc3RhbnRzLmpzXCIsIFtbXCJQYXJhbVR5cGVzXCIsWyRozY9fYSA9PiAoUGFyYW1UeXBlcyA9ICRozY9fYSldXV1dLFtcIi4vZ292ZXJuUGFyYW0uanNcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIixbJGjNj19hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjNj19hKV1dXV0sW1wiLi9wYXJhbU1hbmFnZXIuanNcIiwgW1tcIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyXCIsWyRozY9fYSA9PiAobWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuICovXG4vKlxuXG5cbiAqL1xuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG4gKi9cbmNvbnN0IGJ1aWxkZXJNZXRob2ROYW1lID0gdHlwZSA9PlxuICBgYWRkJHt0eXBlWzBdLnRvVXBwZXJDYXNlKCkgKyB0eXBlLnN1YnN0cmluZygxKX1gO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgaXNBc3luYyA9IHtcbiAgaW52aXRhdGlvbjogdHJ1ZSxcbn07XG5cbi8qXG5cblxuICovXG5cbi8qXG5cbiAqL1xuXG4vL1xuLy9cbi8vXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlUGFyYW1NYW5hZ2VyID0gKHB1Ymxpc2hlcktpdCwgc3BlYywgemNmKSA9PiB7XG4gIGNvbnN0IGJ1aWxkZXIgPSBtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcihwdWJsaXNoZXJLaXQsIHpjZi5nZXRab2VTZXJ2aWNlKCkpO1xuXG4gIGNvbnN0IHByb21pc2VzID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIFt0eXBlLCB2YWx1ZV1dIG9mIE9iamVjdC5lbnRyaWVzKHNwZWMpKSB7XG4gICAgY29uc3QgYWRkID0gYnVpbGRlcltidWlsZGVyTWV0aG9kTmFtZSh0eXBlKV07XG4gICAgaWYgKGlzQXN5bmNbdHlwZV0pIHtcbiAgICAgIHByb21pc2VzLnB1c2goYWRkKG5hbWUsIHZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIC8vXG4gIC8vXG4gIC8vXG4gIHZvaWQgRS53aGVuKFByb21pc2UuYWxsKHByb21pc2VzKSwgdW5kZWZpbmVkLCByZWFzb24gPT5cbiAgICB6Y2Yuc2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pLFxuICApO1xuXG4gIC8vXG4gIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7XG59OyRozY9fb25jZS5tYWtlUGFyYW1NYW5hZ2VyKG1ha2VQYXJhbU1hbmFnZXIpO1xuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXIpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQYXJhbU1hbmFnZXJTeW5jID0gKHB1Ymxpc2hlcktpdCwgc3BlYykgPT4ge1xuICBjb25zdCBidWlsZGVyID0gbWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIocHVibGlzaGVyS2l0KTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBbdHlwZSwgdmFsdWVdXSBvZiBPYmplY3QuZW50cmllcyhzcGVjKSkge1xuICAgIGNvbnN0IGFkZCA9IGJ1aWxkZXJbYnVpbGRlck1ldGhvZE5hbWUodHlwZSldO1xuICAgIGFkZCB8fCBGYWlsYE5vIGJ1aWxkZXIgbWV0aG9kIGZvciBwYXJhbSB0eXBlICR7cSh0eXBlKX1gO1xuICAgIGFkZChuYW1lLCB2YWx1ZSk7XG4gIH1cblxuICAvL1xuICByZXR1cm4gYnVpbGRlci5idWlsZCgpO1xufTskaM2PX29uY2UubWFrZVBhcmFtTWFuYWdlclN5bmMobWFrZVBhcmFtTWFuYWdlclN5bmMpO1xuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXJTeW5jKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zID0gKFxuICBwdWJsaXNoZXJLaXQsXG4gIHpjZixcbiAgaW52aXRhdGlvbnMsXG4gIHBhcmFtVHlwZXNNYXAsXG4gIG92ZXJyaWRlcyxcbikgPT4ge1xuICBpZiAob3ZlcnJpZGVzKSB7XG4gICAgY29uc29sZS5sb2coJ1RQTSAnLCB7IG92ZXJyaWRlcyB9KTtcbiAgfVxuXG4gIGNvbnN0IHsgZ292ZXJuZWRQYXJhbXMgfSA9IHpjZi5nZXRUZXJtcygpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYWtlclNwZWNFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMocGFyYW1UeXBlc01hcCkubWFwKFxuICAgIChbcGFyYW1LZXksIHBhcmFtVHlwZV0pID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgb3ZlcnJpZGVzICYmIG92ZXJyaWRlc1twYXJhbUtleV1cbiAgICAgICAgICA/IG92ZXJyaWRlc1twYXJhbUtleV1cbiAgICAgICAgICA6IGdvdmVybmVkUGFyYW1zW3BhcmFtS2V5XS52YWx1ZTtcblxuICAgICAgcmV0dXJuIFtwYXJhbUtleSwgLyogICAgICAgICAgICAgICAgICAgICAgICAqLyAoW3BhcmFtVHlwZSwgdmFsdWVdKV07XG4gICAgfSxcbiAgKTtcbiAgLy9cbiAgZm9yIChjb25zdCBbbmFtZSwgaW52aXRhdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMoaW52aXRhdGlvbnMpKSB7XG4gICAgbWFrZXJTcGVjRW50cmllcy5wdXNoKFtuYW1lLCBbUGFyYW1UeXBlcy5JTlZJVEFUSU9OLCBpbnZpdGF0aW9uXV0pO1xuICB9XG4gIGNvbnN0IG1ha2VyU3BlYyA9IE9iamVjdC5mcm9tRW50cmllcyhtYWtlclNwZWNFbnRyaWVzKTtcbiAgbWFrZXJTcGVjW0NPTlRSQUNUX0VMRUNUT1JBVEVdIHx8XG4gICAgRmFpbGBtaXNzaW5nIEVsZWN0b3JhdGUgaW52aXRhdGlvbiBwYXJhbSB2YWx1ZWA7XG5cbiAgLy9cbiAgcmV0dXJuIG1ha2VQYXJhbU1hbmFnZXIocHVibGlzaGVyS2l0LCBtYWtlclNwZWMsIHpjZik7XG59OyRozY9fb25jZS5tYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zKG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMpO1xuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBhcmFtTWFuYWdlciI6WyJtYWtlUGFyYW1NYW5hZ2VyIl0sIm1ha2VQYXJhbU1hbmFnZXJTeW5jIjpbIm1ha2VQYXJhbU1hbmFnZXJTeW5jIl0sIm1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMiOlsibWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAnPiVhWRMAAFkTAAAyAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJub3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiLCIuL2NvbnRyYWN0R292ZXJub3JLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJtZXRhIiwic3RhcnQiLCJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyIsInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRSxtdXN0TWF0Y2gsbWFrZVRyYWNlcixwcm92aWRlU2luZ2xldG9uLENPTlRSQUNUX0VMRUNUT1JBVEUscHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQsUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJtYWtlVHJhY2VyXCIsWyRozY9fYSA9PiAobWFrZVRyYWNlciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qc1wiLCBbW1wicHJvdmlkZVNpbmdsZXRvblwiLFskaM2PX2EgPT4gKHByb3ZpZGVTaW5nbGV0b24gPSAkaM2PX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc1wiLCBbW1wiQ09OVFJBQ1RfRUxFQ1RPUkFURVwiLFskaM2PX2EgPT4gKENPTlRSQUNUX0VMRUNUT1JBVEUgPSAkaM2PX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJub3JLaXQuanNcIiwgW1tcInByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlXCIsWyRozY9fYSA9PiAoUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdDR292JywgZmFsc2UpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IG1ldGEgPSB7XG4gIHVwZ3JhZGFiaWxpdHk6ICdjYW5VcGdyYWRlJyxcbn07JGjNj19vbmNlLm1ldGEobWV0YSk7XG5oYXJkZW4obWV0YSk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzID0gYXN5bmMgKHpvZSwgZWxlY3RvcmF0ZSwgZGV0YWlscykgPT4ge1xuICBjb25zdCB7XG4gICAgY291bnRlckluc3RhbmNlLFxuICAgIGlzc3VlOiB7IGNvbnRyYWN0OiBnb3Zlcm5lZEluc3RhbmNlIH0sXG4gIH0gPSBkZXRhaWxzO1xuICBtdXN0TWF0Y2goZGV0YWlscywgUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG4gIGNvbnN0IGdvdmVybm9ySW5zdGFuY2UgPSBhd2FpdCBFLmdldChFKHpvZSkuZ2V0VGVybXMoZ292ZXJuZWRJbnN0YW5jZSkpXG4gICAgLmVsZWN0aW9uTWFuYWdlcjtcbiAgY29uc3QgZ292ZXJub3JQdWJsaWMgPSBFKHpvZSkuZ2V0UHVibGljRmFjZXQoZ292ZXJub3JJbnN0YW5jZSk7XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKFtcbiAgICBFKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZVZvdGVDb3VudGVyKGNvdW50ZXJJbnN0YW5jZSksXG4gICAgRShnb3Zlcm5vclB1YmxpYykudmFsaWRhdGVFbGVjdG9yYXRlKGVsZWN0b3JhdGUpLFxuICAgIEUoZ292ZXJub3JQdWJsaWMpLnZhbGlkYXRlVGltZXIoZGV0YWlscy5jbG9zaW5nUnVsZSksXG4gIF0pO1xufTskaM2PX29uY2UudmFsaWRhdGVRdWVzdGlvbkRldGFpbHModmFsaWRhdGVRdWVzdGlvbkRldGFpbHMpO1xuaGFyZGVuKHZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyID0gYXN5bmMgKFxuICB6b2UsXG4gIGVsZWN0b3JhdGUsXG4gIHZvdGVDb3VudGVyLFxuKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb3VudGVyUHVibGljUCA9IEUoem9lKS5nZXRQdWJsaWNGYWNldCh2b3RlQ291bnRlcik7XG4gIGNvbnN0IHF1ZXN0aW9uRGV0YWlscyA9IGF3YWl0IEUoY291bnRlclB1YmxpY1ApLmdldERldGFpbHMoKTtcblxuICByZXR1cm4gdmFsaWRhdGVRdWVzdGlvbkRldGFpbHMoem9lLCBlbGVjdG9yYXRlLCBxdWVzdGlvbkRldGFpbHMpO1xufTskaM2PX29uY2UudmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyKHZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlcik7XG5oYXJkZW4odmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyKTtcblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHN0YXJ0ID0gYXN5bmMgKHpjZiwgcHJpdmF0ZUFyZ3MsIGJhZ2dhZ2UpID0+IHtcbiAgdHJhY2UoJ3N0YXJ0Jyk7XG4gIGNvbnN0IHpvZSA9IHpjZi5nZXRab2VTZXJ2aWNlKCk7XG4gIHRyYWNlKCdnZXRUZXJtcycsIHpjZi5nZXRUZXJtcygpKTtcbiAgY29uc3Qge1xuICAgIHRpbWVyLFxuICAgIGdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb24sXG4gICAgZ292ZXJuZWQ6IHtcbiAgICAgIGlzc3VlcktleXdvcmRSZWNvcmQ6IGdvdmVybmVkSXNzdWVyS2V5d29yZFJlY29yZCxcbiAgICAgIHRlcm1zOiBjb250cmFjdFRlcm1zLFxuICAgICAgbGFiZWw6IGdvdmVybmVkQ29udHJhY3RMYWJlbCxcbiAgICB9LFxuICB9ID0gemNmLmdldFRlcm1zKCk7XG4gIHRyYWNlKCdjb250cmFjdFRlcm1zJywgY29udHJhY3RUZXJtcyk7XG4gIGNvbnRyYWN0VGVybXMuZ292ZXJuZWRQYXJhbXNbQ09OVFJBQ1RfRUxFQ1RPUkFURV0gfHxcbiAgICBGYWlsYENvbnRyYWN0IG11c3QgZGVjbGFyZSAke0NPTlRSQUNUX0VMRUNUT1JBVEV9IGFzIGEgZ292ZXJuZWQgcGFyYW1ldGVyYDtcblxuICBjb25zdCBtYWtlQ29udHJhY3RHb3Zlcm5vcktpdCA9IHByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0KGJhZ2dhZ2UsIHtcbiAgICB0aW1lcixcbiAgICB6b2UsXG4gIH0pO1xuXG4gIHRyYWNlKCdhd2FpdGluZyBwcm92aWRlU2luZ2xldG9uKCknKTtcbiAgY29uc3QgZ292ZXJub3JLaXQgPSBhd2FpdCBwcm92aWRlU2luZ2xldG9uKFxuICAgIGJhZ2dhZ2UsXG4gICAgJ2NvbnRyYWN0R292ZXJub3JLaXQnLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGF1Z21lbnRlZFRlcm1zID0gaGFyZGVuKHtcbiAgICAgICAgLi4uY29udHJhY3RUZXJtcyxcbiAgICAgICAgZWxlY3Rpb25NYW5hZ2VyOiB6Y2YuZ2V0SW5zdGFuY2UoKSxcbiAgICAgIH0pO1xuXG4gICAgICB0cmFjZSgnc3RhcnRpbmcgZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbiBvZicsIGdvdmVybmVkQ29udHJhY3RMYWJlbCk7XG4gICAgICBjb25zdCBzdGFydGVkSW5zdGFuY2VLaXQgPSBhd2FpdCBFKHpvZSkuc3RhcnRJbnN0YW5jZShcbiAgICAgICAgZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbixcbiAgICAgICAgZ292ZXJuZWRJc3N1ZXJLZXl3b3JkUmVjb3JkLFxuXG4gICAgICAgIC8vXG4gICAgICAgIGF1Z21lbnRlZFRlcm1zLFxuICAgICAgICBwcml2YXRlQXJncy5nb3Zlcm5lZCxcbiAgICAgICAgZ292ZXJuZWRDb250cmFjdExhYmVsLFxuICAgICAgKTtcbiAgICAgIHRyYWNlKCdhd2FpdGluZyByZW1vdGUgbGltaXRlZENyZWF0b3JGYWNldCcpO1xuICAgICAgY29uc3QgbGltaXRlZENyZWF0b3JGYWNldCA9IGF3YWl0IEUoXG4gICAgICAgIHN0YXJ0ZWRJbnN0YW5jZUtpdC5jcmVhdG9yRmFjZXQsXG4gICAgICApLmdldExpbWl0ZWRDcmVhdG9yRmFjZXQoKTtcblxuICAgICAgcmV0dXJuIG1ha2VDb250cmFjdEdvdmVybm9yS2l0KHN0YXJ0ZWRJbnN0YW5jZUtpdCwgbGltaXRlZENyZWF0b3JGYWNldCk7XG4gICAgfSxcbiAgKTtcblxuICAvL1xuICAvL1xuICAvL1xuXG4gIHRyYWNlKCdzdGFydCBjb21wbGV0ZScpO1xuXG4gIC8vXG4gIHJldHVybiB7IGNyZWF0b3JGYWNldDogZ292ZXJub3JLaXQuY3JlYXRvciwgcHVibGljRmFjZXQ6IGdvdmVybm9yS2l0LnB1YmxpYyB9O1xufTskaM2PX29uY2Uuc3RhcnQoc3RhcnQpO1xuaGFyZGVuKHN0YXJ0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ldGEiOlsibWV0YSJdLCJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyI6WyJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyJdLCJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiOlsidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIl0sInN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAcRbr5kKgAAZCoAADUAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5vcktpdC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvdGltZSIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qcyIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLFVuZ3VhcmRlZEhlbHBlckksbWFrZVRyYWNlcixNLHByZXBhcmVFeG9DbGFzc0tpdCxFLEludml0YXRpb25TaGFwZSxJbnN0YW5jZUhhbmRsZVNoYXBlLEluc3RhbGxhdGlvblNoYXBlLFRpbWVzdGFtcFNoYXBlLHNldHVwQXBpR292ZXJuYW5jZSxzZXR1cEZpbHRlckdvdmVybmFuY2UsQ09OVFJBQ1RfRUxFQ1RPUkFURSxzZXR1cFBhcmFtR292ZXJuYW5jZSxDbG9zaW5nUnVsZVNoYXBlLFBhcmFtQ2hhbmdlc1NwZWNTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJVbmd1YXJkZWRIZWxwZXJJXCIsWyRozY9fYSA9PiAoVW5ndWFyZGVkSGVscGVySSA9ICRozY9fYSldXSxbXCJtYWtlVHJhY2VyXCIsWyRozY9fYSA9PiAobWFrZVRyYWNlciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanNcIiwgW1tcIkludml0YXRpb25TaGFwZVwiLFskaM2PX2EgPT4gKEludml0YXRpb25TaGFwZSA9ICRozY9fYSldXSxbXCJJbnN0YW5jZUhhbmRsZVNoYXBlXCIsWyRozY9fYSA9PiAoSW5zdGFuY2VIYW5kbGVTaGFwZSA9ICRozY9fYSldXSxbXCJJbnN0YWxsYXRpb25TaGFwZVwiLFskaM2PX2EgPT4gKEluc3RhbGxhdGlvblNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjNj19hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzXCIsIFtbXCJzZXR1cEFwaUdvdmVybmFuY2VcIixbJGjNj19hID0+IChzZXR1cEFwaUdvdmVybmFuY2UgPSAkaM2PX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5GaWx0ZXIuanNcIiwgW1tcInNldHVwRmlsdGVyR292ZXJuYW5jZVwiLFskaM2PX2EgPT4gKHNldHVwRmlsdGVyR292ZXJuYW5jZSA9ICRozY9fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzXCIsIFtbXCJDT05UUkFDVF9FTEVDVE9SQVRFXCIsWyRozY9fYSA9PiAoQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICRozY9fYSldXSxbXCJzZXR1cFBhcmFtR292ZXJuYW5jZVwiLFskaM2PX2EgPT4gKHNldHVwUGFyYW1Hb3Zlcm5hbmNlID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJDbG9zaW5nUnVsZVNoYXBlXCIsWyRozY9fYSA9PiAoQ2xvc2luZ1J1bGVTaGFwZSA9ICRozY9fYSldXSxbXCJQYXJhbUNoYW5nZXNTcGVjU2hhcGVcIixbJGjNj19hID0+IChQYXJhbUNoYW5nZXNTcGVjU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdDR0snLCBmYWxzZSk7XG5cbmNvbnN0IENvbnRyYWN0R292ZXJub3JLaXRJID0ge1xuICBoZWxwZXI6IFVuZ3VhcmRlZEhlbHBlckksXG4gIGNyZWF0b3I6IE0uaW50ZXJmYWNlKCdDb250cmFjdCBHb3Zlcm5vciBLaXQgY3JlYXRvcicsIHtcbiAgICByZXBsYWNlRWxlY3RvcmF0ZTogTS5jYWxsKEludml0YXRpb25TaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgdm90ZU9uUGFyYW1DaGFuZ2VzOiBNLmNhbGwoXG4gICAgICBJbnN0YWxsYXRpb25TaGFwZSxcbiAgICAgIFRpbWVzdGFtcFNoYXBlLFxuICAgICAgUGFyYW1DaGFuZ2VzU3BlY1NoYXBlLFxuICAgICkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgdm90ZU9uQXBpSW52b2NhdGlvbjogTS5jYWxsKFxuICAgICAgTS5zdHJpbmcoKSxcbiAgICAgIE0uYXJyYXlPZihNLmFueSgpKSxcbiAgICAgIEluc3RhbGxhdGlvblNoYXBlLFxuICAgICAgVGltZXN0YW1wU2hhcGUsXG4gICAgKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICB2b3RlT25PZmZlckZpbHRlcjogTS5jYWxsKFxuICAgICAgSW5zdGFsbGF0aW9uU2hhcGUsXG4gICAgICBUaW1lc3RhbXBTaGFwZSxcbiAgICAgIE0uYXJyYXlPZihNLnN0cmluZygpKSxcbiAgICApLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIGdldENyZWF0b3JGYWNldDogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnRWxlY3RvcmF0ZUNyZWF0b3InKSksXG4gICAgZ2V0QWRtaW5GYWNldDogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnRWxlY3RvcmF0ZUFkbWluJykpLFxuICAgIGdldEluc3RhbmNlOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpLFxuICAgIGdldFB1YmxpY0ZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdFbGVjdG9yYXRlUHVibGljJykpLFxuICB9KSxcbiAgcHVibGljOiBNLmludGVyZmFjZSgnQ29udHJhY3QgR292ZXJub3IgS2l0IHB1YmxpYycsIHtcbiAgICBnZXRFbGVjdG9yYXRlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgvKiAgICAgICAgICAqLykpLFxuICAgIGdldEdvdmVybmVkQ29udHJhY3Q6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG4gICAgdmFsaWRhdGVWb3RlQ291bnRlcjogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIHZhbGlkYXRlRWxlY3RvcmF0ZTogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIHZhbGlkYXRlVGltZXI6IE0uY2FsbChDbG9zaW5nUnVsZVNoYXBlKS5yZXR1cm5zKCksXG4gIH0pLFxufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0ID0gKGJhZ2dhZ2UsIHBvd2VycykgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBmaWx0ZXJHb3Zlcm5hbmNlO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IHBhcmFtR292ZXJuYW5jZTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgYXBpR292ZXJuYW5jZTtcblxuICAvKiAgICAgICAgICAgICAgKi9cbiAgbGV0IHBvc2VyRmFjZXQ7XG5cbiAgY29uc3QgbWFrZUNvbnRyYWN0R292ZXJub3JLaXQgPSBwcmVwYXJlRXhvQ2xhc3NLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICAnQ29udHJhY3RHb3Zlcm5vcktpdCcsXG4gICAgQ29udHJhY3RHb3Zlcm5vcktpdEksXG4gICAgLypcblxuXG4gICAgICovXG4gICAgKHN0YXJ0ZWRJbnN0YW5jZUtpdCwgbGltaXRlZENyZWF0b3JGYWNldCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhcnRlZEluc3RhbmNlS2l0LFxuICAgICAgICBsaW1pdGVkQ3JlYXRvckZhY2V0LFxuICAgICAgICBjdXJyZW50SW52aXRhdGlvbjogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChudWxsKSxcbiAgICAgIH07XG4gICAgfSxcbiAgICB7XG4gICAgICBoZWxwZXI6IHtcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZ2V0RWxlY3RvcmF0ZUluc3RhbmNlKCkge1xuICAgICAgICAgIGNvbnN0IHsgcHVibGljRmFjZXQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgaW52aXRhdGlvbkFtb3VudCA9XG4gICAgICAgICAgICBhd2FpdCBFKHB1YmxpY0ZhY2V0KS5nZXRJbnZpdGF0aW9uQW1vdW50KENPTlRSQUNUX0VMRUNUT1JBVEUpO1xuICAgICAgICAgIHJldHVybiBpbnZpdGF0aW9uQW1vdW50LnZhbHVlWzBdLmluc3RhbmNlO1xuICAgICAgICB9LFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGdldFVwZGF0ZWRQb3NlckZhY2V0KCkge1xuICAgICAgICAgIGNvbnN0IHsgY3JlYXRvckZhY2V0IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IG5ld0ludml0YXRpb24gPSBhd2FpdCBFKFxuICAgICAgICAgICAgRShFKGNyZWF0b3JGYWNldCkuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSkuZ2V0KHtcbiAgICAgICAgICAgICAga2V5OiAnZ292ZXJuZWRQYXJhbXMnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKS5nZXRJbnRlcm5hbFBhcmFtVmFsdWUoQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG5cbiAgICAgICAgICBpZiAobmV3SW52aXRhdGlvbiAhPT0gdGhpcy5zdGF0ZS5jdXJyZW50SW52aXRhdGlvbikge1xuICAgICAgICAgICAgcG9zZXJGYWNldCA9IEUoRShwb3dlcnMuem9lKS5vZmZlcihuZXdJbnZpdGF0aW9uKSkuZ2V0T2ZmZXJSZXN1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuY3VycmVudEludml0YXRpb24gPSBuZXdJbnZpdGF0aW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcG9zZXJGYWNldDtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgcHJvdmlkZUFwaUdvdmVybmFuY2UoKSB7XG4gICAgICAgICAgY29uc3QgeyB0aW1lciB9ID0gcG93ZXJzO1xuICAgICAgICAgIGNvbnN0IHsgY3JlYXRvckZhY2V0IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGF3YWl0IG51bGw7XG4gICAgICAgICAgaWYgKCFhcGlHb3Zlcm5hbmNlKSB7XG4gICAgICAgICAgICB0cmFjZSgnYXdhaXRpbmcgZ292ZXJuZWQgQVBJIGRlcGVuZGVuY2llcycpO1xuICAgICAgICAgICAgY29uc3QgZ292ZXJuZWROYW1lcyA9IGF3YWl0IEUoY3JlYXRvckZhY2V0KS5nZXRHb3Zlcm5lZEFwaU5hbWVzKCk7XG4gICAgICAgICAgICB0cmFjZSgnc2V0dXBBcGlHb3Zlcm5hbmNlJyk7XG4gICAgICAgICAgICBhcGlHb3Zlcm5hbmNlID0gZ292ZXJuZWROYW1lcy5sZW5ndGhcbiAgICAgICAgICAgICAgPyBzZXR1cEFwaUdvdmVybmFuY2UoXG4gICAgICAgICAgICAgICAgICAoKSA9PiBFKGNyZWF0b3JGYWNldCkuZ2V0R292ZXJuZWRBcGlzKCksXG4gICAgICAgICAgICAgICAgICAoKSA9PiBFKGNyZWF0b3JGYWNldCkuZ2V0R292ZXJuZWRBcGlOYW1lcygpLFxuICAgICAgICAgICAgICAgICAgdGltZXIsXG4gICAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLmZhY2V0cy5oZWxwZXIuZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgIHZvdGVPbkFwaUludm9jYXRpb246ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ2FwaSBnb3Zlcm5hbmNlIG5vdCBjb25maWd1cmVkJyk7XG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgY3JlYXRlZFF1ZXN0aW9uOiAoKSA9PiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYXBpR292ZXJuYW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJvdmlkZUZpbHRlckdvdmVybmFuY2UoKSB7XG4gICAgICAgICAgaWYgKCFmaWx0ZXJHb3Zlcm5hbmNlKSB7XG4gICAgICAgICAgICBjb25zdCB7IHRpbWVyIH0gPSBwb3dlcnM7XG4gICAgICAgICAgICBjb25zdCB7IGNyZWF0b3JGYWNldCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICAgIGZpbHRlckdvdmVybmFuY2UgPSBzZXR1cEZpbHRlckdvdmVybmFuY2UoXG4gICAgICAgICAgICAgIHRpbWVyLFxuICAgICAgICAgICAgICAoKSA9PiB0aGlzLmZhY2V0cy5oZWxwZXIuZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSxcbiAgICAgICAgICAgICAgY3JlYXRvckZhY2V0LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZpbHRlckdvdmVybmFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIHByb3ZpZGVQYXJhbUdvdmVybmFuY2UoKSB7XG4gICAgICAgICAgaWYgKCFwYXJhbUdvdmVybmFuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGltZXIgfSA9IHBvd2VycztcbiAgICAgICAgICAgIGNvbnN0IHsgY3JlYXRvckZhY2V0LCBpbnN0YW5jZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICAgIHBhcmFtR292ZXJuYW5jZSA9IHNldHVwUGFyYW1Hb3Zlcm5hbmNlKFxuICAgICAgICAgICAgICAoKSA9PiBFKGNyZWF0b3JGYWNldCkuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSxcbiAgICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICAgIHRpbWVyLFxuICAgICAgICAgICAgICAoKSA9PiB0aGlzLmZhY2V0cy5oZWxwZXIuZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBwYXJhbUdvdmVybmFuY2U7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY3JlYXRvcjoge1xuICAgICAgICAvKlxuXG5cbiAgICAgICAgICovXG4gICAgICAgIHJlcGxhY2VFbGVjdG9yYXRlKHBvc2VySW52aXRhdGlvbikge1xuICAgICAgICAgIGNvbnN0IHsgY3JlYXRvckZhY2V0IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBwYXJhbU1nciA9IEUoRShjcmVhdG9yRmFjZXQpLmdldFBhcmFtTWdyUmV0cmlldmVyKCkpLmdldCh7XG4gICAgICAgICAgICBrZXk6ICdnb3Zlcm5lZFBhcmFtcycsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBFKHBhcmFtTWdyKS51cGRhdGVQYXJhbXMoe1xuICAgICAgICAgICAgRWxlY3RvcmF0ZTogcG9zZXJJbnZpdGF0aW9uLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgdm90ZU9uUGFyYW1DaGFuZ2VzKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLCBkZWFkbGluZSwgcGFyYW1TcGVjKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIHJldHVybiBoZWxwZXJcbiAgICAgICAgICAgIC5wcm92aWRlUGFyYW1Hb3Zlcm5hbmNlKClcbiAgICAgICAgICAgIC52b3RlT25QYXJhbUNoYW5nZXModm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIGRlYWRsaW5lLCBwYXJhbVNwZWMpO1xuICAgICAgICB9LFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgIHZvdGVPbkFwaUludm9jYXRpb24oXG4gICAgICAgICAgYXBpTWV0aG9kTmFtZSxcbiAgICAgICAgICBtZXRob2RBcmdzLFxuICAgICAgICAgIHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuICAgICAgICAgIGRlYWRsaW5lLFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgcmV0dXJuIEUoaGVscGVyLnByb3ZpZGVBcGlHb3Zlcm5hbmNlKCkpLnZvdGVPbkFwaUludm9jYXRpb24oXG4gICAgICAgICAgICBhcGlNZXRob2ROYW1lLFxuICAgICAgICAgICAgbWV0aG9kQXJncyxcbiAgICAgICAgICAgIHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuICAgICAgICAgICAgZGVhZGxpbmUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgdm90ZU9uT2ZmZXJGaWx0ZXIodm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIGRlYWRsaW5lLCBzdHJpbmdzKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIHJldHVybiBoZWxwZXJcbiAgICAgICAgICAgIC5wcm92aWRlRmlsdGVyR292ZXJuYW5jZSgpXG4gICAgICAgICAgICAudm90ZU9uRmlsdGVyKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLCBkZWFkbGluZSwgc3RyaW5ncyk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldENyZWF0b3JGYWNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5saW1pdGVkQ3JlYXRvckZhY2V0O1xuICAgICAgICB9LFxuICAgICAgICBnZXRBZG1pbkZhY2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmFkbWluRmFjZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEluc3RhbmNlKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmluc3RhbmNlO1xuICAgICAgICB9LFxuICAgICAgICBnZXRQdWJsaWNGYWNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5wdWJsaWNGYWNldDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwdWJsaWM6IHtcbiAgICAgICAgZ2V0RWxlY3RvcmF0ZSgpIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgcmV0dXJuIGhlbHBlci5nZXRFbGVjdG9yYXRlSW5zdGFuY2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0R292ZXJuZWRDb250cmFjdCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pbnN0YW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdmFsaWRhdGVWb3RlQ291bnRlcihjb3VudGVyKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXG4gICAgICAgICAgICBFLmdldChoZWxwZXIucHJvdmlkZUFwaUdvdmVybmFuY2UoKSksXG4gICAgICAgICAgICBoZWxwZXIucHJvdmlkZUZpbHRlckdvdmVybmFuY2UoKSxcbiAgICAgICAgICAgIGhlbHBlci5wcm92aWRlUGFyYW1Hb3Zlcm5hbmNlKCksXG4gICAgICAgICAgXTtcbiAgICAgICAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWFwKHZhbGlkYXRlID0+IEUodmFsaWRhdGUuY3JlYXRlZFF1ZXN0aW9uKShjb3VudGVyKSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNoZWNrcy5zb21lKEJvb2xlYW4pIHx8XG4gICAgICAgICAgICBGYWlsYFZvdGVDb3VudGVyIHdhcyBub3QgY3JlYXRlZCBieSB0aGlzIGNvbnRyYWN0R292ZXJub3JgO1xuICAgICAgICB9LFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICB2YWxpZGF0ZUVsZWN0b3JhdGUocmVnUCkge1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICByZXR1cm4gRS53aGVuKHJlZ1AsIGFzeW5jIHJlZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVjdG9yYXRlSW5zdGFuY2UgPSBhd2FpdCBoZWxwZXIuZ2V0RWxlY3RvcmF0ZUluc3RhbmNlKCk7XG4gICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgIHJlZyA9PT0gZWxlY3RvcmF0ZUluc3RhbmNlLFxuICAgICAgICAgICAgICBcIkVsZWN0b3JhdGUgZG9lc24ndCBtYXRjaCBteSBFbGVjdG9yYXRlXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgdmFsaWRhdGVUaW1lcihjbG9zaW5nUnVsZSkge1xuICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgIGNsb3NpbmdSdWxlLnRpbWVyID09PSBwb3dlcnMudGltZXIsXG4gICAgICAgICAgICAnY2xvc2luZyBydWxlIG11c3QgdXNlIG15IHRpbWVyJyxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBtYWtlQ29udHJhY3RHb3Zlcm5vcktpdDtcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLnByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0KHByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0IjpbInByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPfykb0zIgAAMyIAADAAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RIZWxwZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy90aW1lIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiXSwiZXhwb3J0cyI6WyJHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZIiwiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIiwicHVibGljTWl4aW5BUEkiLCJ2YWxpZGF0ZUVsZWN0b3JhdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEZhcixnZXRNZXRob2ROYW1lcyxtYWtlU3RvcmVkUHVibGlzaGVyS2l0LG9iamVjdE1hcCxpZ25vcmVDb250ZXh0LHByZXBhcmVFeG8sTSxBbW91bnRTaGFwZSxCcmFuZFNoYXBlLFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLFRpbWVzdGFtcFJlY29yZFNoYXBlLEUsbWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyxHb3Zlcm5vckZhY2V0U2hhcGUsQ09OVFJBQ1RfRUxFQ1RPUkFURTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLFskaM2PX2EgPT4gKGdldE1ldGhvZE5hbWVzID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZVN0b3JlZFB1Ymxpc2hlcktpdFwiLFskaM2PX2EgPT4gKG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJpZ25vcmVDb250ZXh0XCIsWyRozY9fYSA9PiAoaWdub3JlQ29udGV4dCA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4byA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRTaGFwZVwiLFskaM2PX2EgPT4gKEFtb3VudFNoYXBlID0gJGjNj19hKV1dLFtcIkJyYW5kU2hhcGVcIixbJGjNj19hID0+IChCcmFuZFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlID0gJGjNj19hKV1dLFtcIlRpbWVzdGFtcFJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzXCIsIFtbXCJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zXCIsWyRozY9fYSA9PiAobWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiR292ZXJub3JGYWNldFNoYXBlXCIsWyRozY9fYSA9PiAoR292ZXJub3JGYWNldFNoYXBlID0gJGjNj19hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanNcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIixbJGjNj19hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4gICAgICAgY29uc3QgR09WRVJOQU5DRV9TVE9SQUdFX0tFWSA9ICdnb3Zlcm5hbmNlJzskaM2PX29uY2UuR09WRVJOQU5DRV9TVE9SQUdFX0tFWShHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZKTtcblxuY29uc3QgcHVibGljTWl4aW5BUEkgPSBoYXJkZW4oe1xuICBnZXRTdWJzY3JpcHRpb246IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JlZFN1YnNjcmlwdGlvbicpKSxcbiAgZ2V0R292ZXJuZWRQYXJhbXM6IE0uY2FsbCgpLnJldHVybnMoTS5vcihNLnJlY29yZCgpLCBNLnByb21pc2UoKSkpLFxuICBnZXRBbW91bnQ6IE0uY2FsbCgpLnJldHVybnMoQW1vdW50U2hhcGUpLFxuICBnZXRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhCcmFuZFNoYXBlKSxcbiAgZ2V0SW5zdGFuY2U6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ0luc3RhbmNlJykpLFxuICBnZXRJbnN0YWxsYXRpb246IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSxcbiAgZ2V0SW52aXRhdGlvbkFtb3VudDogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldE5hdDogTS5jYWxsKCkucmV0dXJucyhNLmJpZ2ludCgpKSxcbiAgZ2V0UmF0aW86IE0uY2FsbCgpLnJldHVybnMoTS5yZWNvcmQoKSksXG4gIGdldFN0cmluZzogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0VGltZXN0YW1wOiBNLmNhbGwoKS5yZXR1cm5zKFRpbWVzdGFtcFJlY29yZFNoYXBlKSxcbiAgZ2V0UmVsYXRpdmVUaW1lOiBNLmNhbGwoKS5yZXR1cm5zKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlKSxcbiAgZ2V0VW5rbm93bjogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbn0pO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UucHVibGljTWl4aW5BUEkocHVibGljTWl4aW5BUEkpO1xuICAgICAgIGNvbnN0IHZhbGlkYXRlRWxlY3RvcmF0ZSA9ICh6Y2YsIHBhcmFtTWFuYWdlcikgPT4ge1xuICBjb25zdCBpbnZpdGF0aW9uID0gcGFyYW1NYW5hZ2VyLmdldEludGVybmFsUGFyYW1WYWx1ZShDT05UUkFDVF9FTEVDVE9SQVRFKTtcbiAgcmV0dXJuIEUud2hlbihcbiAgICBFKHpjZi5nZXRJbnZpdGF0aW9uSXNzdWVyKCkpLmlzTGl2ZShpbnZpdGF0aW9uKSxcbiAgICBpc0xpdmUgPT4gaXNMaXZlIHx8IEZhaWxgRWxlY3RvcmF0ZSBpbnZpdGF0aW9uIGlzIG5vdCBsaXZlLmAsXG4gICk7XG59OyRozY9fb25jZS52YWxpZGF0ZUVsZWN0b3JhdGUodmFsaWRhdGVFbGVjdG9yYXRlKTtcbmhhcmRlbih2YWxpZGF0ZUVsZWN0b3JhdGUpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgZmFjZXRIZWxwZXJzID0gKHpjZiwgcGFyYW1NYW5hZ2VyKSA9PiB7XG4gIC8vXG4gIC8vXG4gIHZvaWQgdmFsaWRhdGVFbGVjdG9yYXRlKHpjZiwgcGFyYW1NYW5hZ2VyKTtcblxuICBjb25zdCB0eXBlZEFjY2Vzc29ycyA9IHtcbiAgICBnZXRBbW91bnQ6IHBhcmFtTWFuYWdlci5nZXRBbW91bnQsXG4gICAgZ2V0QnJhbmQ6IHBhcmFtTWFuYWdlci5nZXRCcmFuZCxcbiAgICBnZXRJbnN0YW5jZTogcGFyYW1NYW5hZ2VyLmdldEluc3RhbmNlLFxuICAgIGdldEluc3RhbGxhdGlvbjogcGFyYW1NYW5hZ2VyLmdldEluc3RhbGxhdGlvbixcbiAgICBnZXRJbnZpdGF0aW9uQW1vdW50OiBwYXJhbU1hbmFnZXIuZ2V0SW52aXRhdGlvbkFtb3VudCxcbiAgICBnZXROYXQ6IHBhcmFtTWFuYWdlci5nZXROYXQsXG4gICAgZ2V0UmF0aW86IHBhcmFtTWFuYWdlci5nZXRSYXRpbyxcbiAgICBnZXRTdHJpbmc6IHBhcmFtTWFuYWdlci5nZXRTdHJpbmcsXG4gICAgZ2V0VGltZXN0YW1wOiBwYXJhbU1hbmFnZXIuZ2V0VGltZXN0YW1wLFxuICAgIGdldFJlbGF0aXZlVGltZTogcGFyYW1NYW5hZ2VyLmdldFJlbGF0aXZlVGltZSxcbiAgICBnZXRVbmtub3duOiBwYXJhbU1hbmFnZXIuZ2V0VW5rbm93bixcbiAgfTtcblxuICBjb25zdCBjb21tb25QdWJsaWNNZXRob2RzID0ge1xuICAgIGdldFN1YnNjcmlwdGlvbjogKCkgPT4gcGFyYW1NYW5hZ2VyLmdldFN1YnNjcmlwdGlvbigpLFxuICAgIGdldEdvdmVybmVkUGFyYW1zOiAoKSA9PiBwYXJhbU1hbmFnZXIuZ2V0UGFyYW1zKCksXG4gIH07XG5cbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBhdWdtZW50UHVibGljRmFjZXQgPSBvcmlnaW5hbFB1YmxpY0ZhY2V0ID0+IHtcbiAgICByZXR1cm4gRmFyKCdwdWJsaWNGYWNldCcsIHtcbiAgICAgIC4uLm9yaWdpbmFsUHVibGljRmFjZXQsXG4gICAgICAuLi5jb21tb25QdWJsaWNNZXRob2RzLFxuICAgICAgLi4udHlwZWRBY2Nlc3NvcnMsXG4gICAgfSk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgYXVnbWVudFZpcnR1YWxQdWJsaWNGYWNldCA9IG9yaWdpbmFsUHVibGljRmFjZXQgPT4ge1xuICAgIHJldHVybiBGYXIoJ3B1YmxpY0ZhY2V0Jywge1xuICAgICAgLi4ub3JpZ2luYWxQdWJsaWNGYWNldCxcbiAgICAgIC4uLmNvbW1vblB1YmxpY01ldGhvZHMsXG4gICAgICAuLi5vYmplY3RNYXAodHlwZWRBY2Nlc3NvcnMsIGlnbm9yZUNvbnRleHQpLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VGYXJHb3Zlcm5vckZhY2V0ID0gKGxpbWl0ZWRDcmVhdG9yRmFjZXQsIGdvdmVybmVkQXBpcyA9IHt9KSA9PiB7XG4gICAgY29uc3QgZ292ZXJub3JGYWNldCA9IEZhcignZ292ZXJub3JGYWNldCcsIHtcbiAgICAgIGdldFBhcmFtTWdyUmV0cmlldmVyOiAoKSA9PlxuICAgICAgICBGYXIoJ3BhcmFtUmV0cmlldmVyJywgeyBnZXQ6ICgpID0+IHBhcmFtTWFuYWdlciB9KSxcbiAgICAgIGdldEludml0YXRpb246IG5hbWUgPT4gcGFyYW1NYW5hZ2VyLmdldEludGVybmFsUGFyYW1WYWx1ZShuYW1lKSxcbiAgICAgIGdldExpbWl0ZWRDcmVhdG9yRmFjZXQ6ICgpID0+IGxpbWl0ZWRDcmVhdG9yRmFjZXQsXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgZ2V0R292ZXJuZWRBcGlzOiAoKSA9PiBGYXIoJ2dvdmVybmVkQVBJcycsIGdvdmVybmVkQXBpcyksXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBnZXRHb3Zlcm5lZEFwaU5hbWVzOiAoKSA9PiBPYmplY3Qua2V5cyhnb3Zlcm5lZEFwaXMpLFxuICAgICAgc2V0T2ZmZXJGaWx0ZXI6IHN0cmluZ3MgPT4gemNmLnNldE9mZmVyRmlsdGVyKHN0cmluZ3MpLFxuICAgIH0pO1xuXG4gICAgLy9cbiAgICByZXR1cm4gZ292ZXJub3JGYWNldDtcbiAgfTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYWtlR292ZXJub3JGYWNldCA9IChvcmlnaW5hbENyZWF0b3JGYWNldCwgZ292ZXJuZWRBcGlzID0ge30pID0+IHtcbiAgICByZXR1cm4gbWFrZUZhckdvdmVybm9yRmFjZXQob3JpZ2luYWxDcmVhdG9yRmFjZXQsIGdvdmVybmVkQXBpcyk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VWaXJ0dWFsR292ZXJub3JGYWNldCA9IGxpbWl0ZWRDcmVhdG9yRmFjZXQgPT4ge1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBnb3Zlcm5vckZhY2V0ID0gaGFyZGVuKHtcbiAgICAgIGdldFBhcmFtTWdyUmV0cmlldmVyOiAoKSA9PlxuICAgICAgICBGYXIoJ3BhcmFtUmV0cmlldmVyJywgeyBnZXQ6ICgpID0+IHBhcmFtTWFuYWdlciB9KSxcbiAgICAgIGdldEludml0YXRpb246IChfY29udGV4dCwgLyogICAgICAgICAgICAgICAgICovIG5hbWUpID0+XG4gICAgICAgIHBhcmFtTWFuYWdlci5nZXRJbnRlcm5hbFBhcmFtVmFsdWUobmFtZSksXG4gICAgICBnZXRMaW1pdGVkQ3JlYXRvckZhY2V0OiAoeyBmYWNldHMgfSkgPT4gZmFjZXRzLmxpbWl0ZWRDcmVhdG9yRmFjZXQsXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGdldEdvdmVybmVkQXBpczogKHsgZmFjZXRzIH0pID0+IGZhY2V0cy5nb3Zlcm5lZEFwaXMsXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBnZXRHb3Zlcm5lZEFwaU5hbWVzOiAoeyBmYWNldHMgfSkgPT5cbiAgICAgICAgZ2V0TWV0aG9kTmFtZXMoZmFjZXRzLmdvdmVybmVkQXBpcyB8fCB7fSksXG4gICAgICBzZXRPZmZlckZpbHRlcjogKF9jb250ZXh0LCBzdHJpbmdzKSA9PiB6Y2Yuc2V0T2ZmZXJGaWx0ZXIoc3RyaW5ncyksXG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBnb3Zlcm5vckZhY2V0LCBsaW1pdGVkQ3JlYXRvckZhY2V0IH07XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYWtlRHVyYWJsZUdvdmVybm9yRmFjZXQgPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBsaW1pdGVkQ3JlYXRvckZhY2V0LFxuICAgIGdvdmVybmVkQXBpcyA9IHt9LFxuICApID0+IHtcbiAgICBjb25zdCBmYXJHb3Zlcm5lZEFwaXMgPSBGYXIoJ2dvdmVybmVkQVBJcycsIHsgLi4uZ292ZXJuZWRBcGlzIH0pO1xuICAgIGNvbnN0IGdvdmVybm9yRmFjZXQgPSBwcmVwYXJlRXhvKFxuICAgICAgYmFnZ2FnZSxcbiAgICAgICdnb3Zlcm5vckZhY2V0JyxcbiAgICAgIE0uaW50ZXJmYWNlKCdnb3Zlcm5vckZhY2V0JywgR292ZXJub3JGYWNldFNoYXBlKSxcbiAgICAgIHtcbiAgICAgICAgZ2V0UGFyYW1NZ3JSZXRyaWV2ZXI6ICgpID0+XG4gICAgICAgICAgRmFyKCdwYXJhbVJldHJpZXZlcicsIHsgZ2V0OiAoKSA9PiBwYXJhbU1hbmFnZXIgfSksXG4gICAgICAgIGdldEludml0YXRpb246IG5hbWUgPT4gcGFyYW1NYW5hZ2VyLmdldEludGVybmFsUGFyYW1WYWx1ZShuYW1lKSxcbiAgICAgICAgZ2V0TGltaXRlZENyZWF0b3JGYWNldDogKCkgPT4gbGltaXRlZENyZWF0b3JGYWNldCxcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgIGdldEdvdmVybmVkQXBpczogKCkgPT4gZmFyR292ZXJuZWRBcGlzLFxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBnZXRHb3Zlcm5lZEFwaU5hbWVzOiAoKSA9PiBPYmplY3Qua2V5cyhnb3Zlcm5lZEFwaXMgfHwge30pLFxuICAgICAgICBzZXRPZmZlckZpbHRlcjogc3RyaW5ncyA9PiB6Y2Yuc2V0T2ZmZXJGaWx0ZXIoc3RyaW5ncyksXG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXR1cm4geyBnb3Zlcm5vckZhY2V0LCBsaW1pdGVkQ3JlYXRvckZhY2V0IH07XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgcHVibGljTWl4aW46IHtcbiAgICAgIC4uLmNvbW1vblB1YmxpY01ldGhvZHMsXG4gICAgICAuLi50eXBlZEFjY2Vzc29ycyxcbiAgICB9LFxuICAgIGF1Z21lbnRQdWJsaWNGYWNldCxcbiAgICBhdWdtZW50VmlydHVhbFB1YmxpY0ZhY2V0LFxuICAgIG1ha2VHb3Zlcm5vckZhY2V0LFxuXG4gICAgbWFrZUZhckdvdmVybm9yRmFjZXQsXG4gICAgbWFrZVZpcnR1YWxHb3Zlcm5vckZhY2V0LFxuICAgIG1ha2VEdXJhYmxlR292ZXJub3JGYWNldCxcblxuICAgIHBhcmFtczogcGFyYW1NYW5hZ2VyLnJlYWRvbmx5KCksXG4gIH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBoYW5kbGVQYXJhbUdvdmVybmFuY2UgPSAoXG4gIHpjZixcbiAgaW5pdGlhbFBvc2VySW52aXRhdGlvbixcbiAgcGFyYW1UeXBlc01hcCxcbiAgc3RvcmFnZU5vZGUsXG4gIG1hcnNoYWxsZXIsXG4gIG92ZXJyaWRlcyxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwdWJsaXNoZXJLaXQgPSBtYWtlU3RvcmVkUHVibGlzaGVyS2l0KFxuICAgIHN0b3JhZ2VOb2RlLFxuICAgIG1hcnNoYWxsZXIsXG4gICAgR09WRVJOQU5DRV9TVE9SQUdFX0tFWSxcbiAgKTtcbiAgY29uc3QgcGFyYW1NYW5hZ2VyID0gbWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyhcbiAgICBwdWJsaXNoZXJLaXQsXG4gICAgemNmLFxuICAgIHsgRWxlY3RvcmF0ZTogaW5pdGlhbFBvc2VySW52aXRhdGlvbiB9LFxuICAgIHBhcmFtVHlwZXNNYXAsXG4gICAgb3ZlcnJpZGVzLFxuICApO1xuXG4gIHJldHVybiBmYWNldEhlbHBlcnMoemNmLCBwYXJhbU1hbmFnZXIpO1xufTskaM2PX29uY2UuaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlKGhhbmRsZVBhcmFtR292ZXJuYW5jZSk7XG5cbmhhcmRlbihoYW5kbGVQYXJhbUdvdmVybmFuY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHVibGljTWl4aW5BUEkiOlsicHVibGljTWl4aW5BUEkiXSwiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIjpbImhhbmRsZVBhcmFtR292ZXJuYW5jZSJdLCJHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZIjpbIkdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkiXSwidmFsaWRhdGVFbGVjdG9yYXRlIjpbInZhbGlkYXRlRWxlY3RvcmF0ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADsUWPwPQkAAD0JAAAnAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vcXVlc3Rpb24uanMiLCIuL2NvbnRyYWN0R292ZXJub3IuanMiLCIuL2NvbnRyYWN0SGVscGVyLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyIsIi4vdmFsaWRhdG9ycy5qcyIsIi4vY29uc3RhbnRzLmpzIl0sImV4cG9ydHMiOlsiRWxlY3Rpb25UeXBlIiwiRWxlY3Rpb25UeXBlIiwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIiwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciIsIm1ha2VQYXJhbU1hbmFnZXJTeW5jIiwibWFrZVBhcmFtTWFuYWdlclN5bmMiLCJwdWJsaWNNaXhpbkFQSSIsInB1YmxpY01peGluQVBJIiwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIiwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIixudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9xdWVzdGlvbi5qc1wiLCBbXV0sW1wiLi9jb250cmFjdEdvdmVybm9yLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0SGVscGVyLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qc1wiLCBbXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzXCIsIFtdXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qc1wiLCBbXV0sW1wiLi92YWxpZGF0b3JzLmpzXCIsIFtdXSxbXCIuL2NvbnN0YW50cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vcXVlc3Rpb24uanMiOltbIkNob2ljZU1ldGhvZCIsIkNob2ljZU1ldGhvZCJdLFsiRWxlY3Rpb25UeXBlIiwiRWxlY3Rpb25UeXBlIl0sWyJRdW9ydW1SdWxlIiwiUXVvcnVtUnVsZSJdLFsiY29lcmNlUXVlc3Rpb25TcGVjIiwiY29lcmNlUXVlc3Rpb25TcGVjIl0sWyJwb3NpdGlvbkluY2x1ZGVkIiwicG9zaXRpb25JbmNsdWRlZCJdLFsiYnVpbGRRdWVzdGlvbiIsImJ1aWxkUXVlc3Rpb24iXV0sIi4vY29udHJhY3RHb3Zlcm5vci5qcyI6W1sidmFsaWRhdGVRdWVzdGlvbkRldGFpbHMiLCJ2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyJdLFsidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIiwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIl1dLCIuL2NvbnRyYWN0SGVscGVyLmpzIjpbWyJoYW5kbGVQYXJhbUdvdmVybmFuY2UiLCJoYW5kbGVQYXJhbUdvdmVybmFuY2UiXSxbInB1YmxpY01peGluQVBJIiwicHVibGljTWl4aW5BUEkiXV0sIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIjpbWyJhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtIiwiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSJdLFsibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIiwibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIl0sWyJzZXR1cFBhcmFtR292ZXJuYW5jZSIsInNldHVwUGFyYW1Hb3Zlcm5hbmNlIl0sWyJDT05UUkFDVF9FTEVDVE9SQVRFIiwiQ09OVFJBQ1RfRUxFQ1RPUkFURSJdXSwiLi9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzIjpbWyJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyIsImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzIl0sWyJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciIsIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyIl1dLCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyI6W1sibWFrZVBhcmFtTWFuYWdlciIsIm1ha2VQYXJhbU1hbmFnZXIiXSxbIm1ha2VQYXJhbU1hbmFnZXJTeW5jIiwibWFrZVBhcmFtTWFuYWdlclN5bmMiXV0sIi4vdmFsaWRhdG9ycy5qcyI6W1siYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIiwiYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIl0sWyJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiLCJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiXV0sIi4vY29uc3RhbnRzLmpzIjpbWyJQYXJhbVR5cGVzIiwiUGFyYW1UeXBlcyJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwYj+rZ8MAACfDAAAKgAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9xdWVzdGlvbi5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy96b2Uvc3JjL21ha2VIYW5kbGUuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJDaG9pY2VNZXRob2QiLCJFbGVjdGlvblR5cGUiLCJRdW9ydW1SdWxlIiwiYnVpbGRRdWVzdGlvbiIsImNvZXJjZVF1ZXN0aW9uU3BlYyIsInBvc2l0aW9uSW5jbHVkZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlRXhvLG11c3RNYXRjaCxrZXlFUSxNLG1ha2VIYW5kbGUsUXVlc3Rpb25JLFF1ZXN0aW9uU3BlY1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZUV4b1wiLFskaM2PX2EgPT4gKG1ha2VFeG8gPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qc1wiLCBbW1wibWFrZUhhbmRsZVwiLFskaM2PX2EgPT4gKG1ha2VIYW5kbGUgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlF1ZXN0aW9uSVwiLFskaM2PX2EgPT4gKFF1ZXN0aW9uSSA9ICRozY9fYSldXSxbXCJRdWVzdGlvblNwZWNTaGFwZVwiLFskaM2PX2EgPT4gKFF1ZXN0aW9uU3BlY1NoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLypcblxuICovXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgQ2hvaWNlTWV0aG9kID0gLyogICAgICAgICAgICAgICAgKi8gKHtcbiAgVU5SQU5LRUQ6ICd1bnJhbmtlZCcsXG4gIE9SREVSOiAnb3JkZXInLFxuICBQTFVSQUxJVFk6ICdwbHVyYWxpdHknLFxufSk7JGjNj19vbmNlLkNob2ljZU1ldGhvZChDaG9pY2VNZXRob2QpO1xuXG5jb25zdCBFbGVjdGlvblR5cGUgPSAvKiAgICAgICAgICAgICAgICAqLyAoe1xuICAvL1xuICBQQVJBTV9DSEFOR0U6ICdwYXJhbV9jaGFuZ2UnLFxuICAvL1xuICBFTEVDVElPTjogJ2VsZWN0aW9uJyxcbiAgU1VSVkVZOiAnc3VydmV5JyxcbiAgLy9cbiAgQVBJX0lOVk9DQVRJT046ICdhcGlfaW52b2NhdGlvbicsXG4gIE9GRkVSX0ZJTFRFUjogJ29mZmVyX2ZpbHRlcicsXG59KTskaM2PX29uY2UuRWxlY3Rpb25UeXBlKEVsZWN0aW9uVHlwZSk7XG5cbmNvbnN0IFF1b3J1bVJ1bGUgPSAvKiAgICAgICAgICAgICAgICAqLyAoe1xuICBNQUpPUklUWTogJ21ham9yaXR5JyxcbiAgTk9fUVVPUlVNOiAnbm9fcXVvcnVtJyxcbiAgLy9cbiAgQUxMOiAnYWxsJyxcbn0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLlF1b3J1bVJ1bGUoUXVvcnVtUnVsZSk7XG5jb25zdCBwb3NpdGlvbkluY2x1ZGVkID0gKHBvc2l0aW9ucywgcCkgPT4gcG9zaXRpb25zLnNvbWUoZSA9PiBrZXlFUShlLCBwKSk7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UucG9zaXRpb25JbmNsdWRlZChwb3NpdGlvbkluY2x1ZGVkKTtcbmNvbnN0IGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICh7XG4gIG1ldGhvZCxcbiAgaXNzdWUsXG4gIHBvc2l0aW9ucyxcbiAgZWxlY3Rpb25UeXBlLFxuICBtYXhDaG9pY2VzLFxuICBtYXhXaW5uZXJzLFxuICBjbG9zaW5nUnVsZSxcbiAgcXVvcnVtUnVsZSxcbiAgdGllT3V0Y29tZSxcbn0pID0+IHtcbiAgY29uc3QgcXVlc3Rpb24gPSBoYXJkZW4oe1xuICAgIG1ldGhvZCxcbiAgICBpc3N1ZSxcbiAgICBwb3NpdGlvbnMsXG4gICAgbWF4Q2hvaWNlczogTnVtYmVyKG1heENob2ljZXMpLFxuICAgIG1heFdpbm5lcnM6IE51bWJlcihtYXhXaW5uZXJzKSxcbiAgICBlbGVjdGlvblR5cGUsXG4gICAgY2xvc2luZ1J1bGUsXG4gICAgcXVvcnVtUnVsZSxcbiAgICB0aWVPdXRjb21lLFxuICB9KTtcblxuICBtdXN0TWF0Y2gocXVlc3Rpb24sIFF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBtdXN0TWF0Y2gocXVlc3Rpb24udGllT3V0Y29tZSwgTS5vciguLi5xdWVzdGlvbi5wb3NpdGlvbnMpKTtcblxuICByZXR1cm4gcXVlc3Rpb247XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLmNvZXJjZVF1ZXN0aW9uU3BlYyhjb2VyY2VRdWVzdGlvblNwZWMpO1xuY29uc3QgYnVpbGRRdWVzdGlvbiA9IChxdWVzdGlvblNwZWMsIGNvdW50ZXJJbnN0YW5jZSkgPT4ge1xuICBjb25zdCBxdWVzdGlvbkhhbmRsZSA9IG1ha2VIYW5kbGUoJ1F1ZXN0aW9uJyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgKi9cbiAgcmV0dXJuIG1ha2VFeG8oJ3F1ZXN0aW9uIGRldGFpbHMnLCBRdWVzdGlvbkksIHtcbiAgICBnZXRWb3RlQ291bnRlcigpIHtcbiAgICAgIHJldHVybiBjb3VudGVySW5zdGFuY2U7XG4gICAgfSxcbiAgICBnZXREZXRhaWxzKCkge1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIC4uLnF1ZXN0aW9uU3BlYyxcbiAgICAgICAgcXVlc3Rpb25IYW5kbGUsXG4gICAgICAgIGNvdW50ZXJJbnN0YW5jZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UuYnVpbGRRdWVzdGlvbihidWlsZFF1ZXN0aW9uKTtcblxuaGFyZGVuKGJ1aWxkUXVlc3Rpb24pO1xuaGFyZGVuKENob2ljZU1ldGhvZCk7XG5oYXJkZW4oRWxlY3Rpb25UeXBlKTtcbmhhcmRlbihjb2VyY2VRdWVzdGlvblNwZWMpO1xuaGFyZGVuKHBvc2l0aW9uSW5jbHVkZWQpO1xuaGFyZGVuKFF1b3J1bVJ1bGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ2hvaWNlTWV0aG9kIjpbIkNob2ljZU1ldGhvZCJdLCJFbGVjdGlvblR5cGUiOlsiRWxlY3Rpb25UeXBlIl0sIlF1b3J1bVJ1bGUiOlsiUXVvcnVtUnVsZSJdLCJwb3NpdGlvbkluY2x1ZGVkIjpbInBvc2l0aW9uSW5jbHVkZWQiXSwiY29lcmNlUXVlc3Rpb25TcGVjIjpbImNvZXJjZVF1ZXN0aW9uU3BlYyJdLCJidWlsZFF1ZXN0aW9uIjpbImJ1aWxkUXVlc3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5nP7Lr0+AAC9PgAALAAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3RpbWUiLCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvbm90aWZpZXIiXSwiZXhwb3J0cyI6WyJBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUiLCJBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUiLCJCaW5hcnlWb3RlQ291bnRlckFkbWluSSIsIkJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJIiwiQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJIiwiQ2hvaWNlTWV0aG9kU2hhcGUiLCJDbG9zaW5nUnVsZVNoYXBlIiwiRWxlY3Rpb25UeXBlU2hhcGUiLCJFbGVjdG9yYXRlQ3JlYXRvckkiLCJFbGVjdG9yYXRlUHVibGljSSIsIkdvdmVybm9yRmFjZXRTaGFwZSIsIkludml0YXRpb25TaGFwZSIsIk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiLCJOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSIsIk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSIsIk5vU2ltcGxlUG9zaXRpb25TaGFwZSIsIk9mZmVyRmlsdGVySXNzdWVTaGFwZSIsIk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUiLCJPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSIsIlBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUiLCJQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSIsIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUiLCJQYXJhbUNoYW5nZXNTcGVjU2hhcGUiLCJQYXJhbVBhdGhTaGFwZSIsIlBvc2l0aW9uU2hhcGUiLCJRdWVzdGlvbkRldGFpbHNTaGFwZSIsIlF1ZXN0aW9uSGFuZGxlU2hhcGUiLCJRdWVzdGlvbkkiLCJRdWVzdGlvblNwZWNTaGFwZSIsIlF1ZXN0aW9uU3RhdHNTaGFwZSIsIlF1b3J1bVJ1bGVTaGFwZSIsIlNpbXBsZUlzc3VlU2hhcGUiLCJTaW1wbGVQb3NpdGlvbnNTaGFwZSIsIlNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUiLCJWb3RlQ291bnRlckFkbWluSSIsIlZvdGVDb3VudGVyQ2xvc2VJIiwiVm90ZUNvdW50ZXJQdWJsaWNJIiwiVm90ZXJIYW5kbGUiLCJZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSIsIlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSIsIlllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiLCJZZXNTaW1wbGVQb3NpdGlvblNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSxUaW1lc3RhbXBTaGFwZSxJbnN0YW5jZUhhbmRsZVNoYXBlLFRpbWVyU2hhcGUsbWFrZUhhbmRsZVNoYXBlLFN1YnNjcmliZXJTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanNcIiwgW1tcIkluc3RhbmNlSGFuZGxlU2hhcGVcIixbJGjNj19hID0+IChJbnN0YW5jZUhhbmRsZVNoYXBlID0gJGjNj19hKV1dLFtcIlRpbWVyU2hhcGVcIixbJGjNj19hID0+IChUaW1lclNoYXBlID0gJGjNj19hKV1dLFtcIm1ha2VIYW5kbGVTaGFwZVwiLFskaM2PX2EgPT4gKG1ha2VIYW5kbGVTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIlN1YnNjcmliZXJTaGFwZVwiLFskaM2PX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuICAgICAgIGNvbnN0IENob2ljZU1ldGhvZFNoYXBlID0gTS5vcigndW5yYW5rZWQnLCAnb3JkZXInLCAncGx1cmFsaXR5Jyk7JGjNj19vbmNlLkNob2ljZU1ldGhvZFNoYXBlKENob2ljZU1ldGhvZFNoYXBlKTtcbiAgICAgICBjb25zdCBRdW9ydW1SdWxlU2hhcGUgPSBNLm9yKCdtYWpvcml0eScsICdub19xdW9ydW0nLCAnYWxsJyk7JGjNj19vbmNlLlF1b3J1bVJ1bGVTaGFwZShRdW9ydW1SdWxlU2hhcGUpO1xuICAgICAgIGNvbnN0IEVsZWN0aW9uVHlwZVNoYXBlID0gTS5vcihcbiAgJ3BhcmFtX2NoYW5nZScsXG4gICdlbGVjdGlvbicsXG4gICdzdXJ2ZXknLFxuICAnYXBpX2ludm9jYXRpb24nLFxuICAnb2ZmZXJfZmlsdGVyJyxcbik7JGjNj19vbmNlLkVsZWN0aW9uVHlwZVNoYXBlKEVsZWN0aW9uVHlwZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IENsb3NpbmdSdWxlU2hhcGUgPSB7XG4gIHRpbWVyOiBNLmVyZWYoVGltZXJTaGFwZSksXG4gIGRlYWRsaW5lOiBUaW1lc3RhbXBTaGFwZSxcbn07JGjNj19vbmNlLkNsb3NpbmdSdWxlU2hhcGUoQ2xvc2luZ1J1bGVTaGFwZSk7XG5oYXJkZW4oQ2xvc2luZ1J1bGVTaGFwZSk7XG5cbi8vXG4gICAgICAgY29uc3QgWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlID0ge1xuICBzdHJpbmdzOiBNLmFycmF5T2YoTS5zdHJpbmcoKSksXG59OyRozY9fb25jZS5ZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUoWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKTtcbmhhcmRlbihZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUgPSB7IGRvbnRVcGRhdGU6IE0uYXJyYXlPZihNLnN0cmluZygpKSB9OyRozY9fb25jZS5Ob09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZShOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSA9IFtcbiAgWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlLFxuICBOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbl07JGjNj19vbmNlLk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUoT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSk7XG5oYXJkZW4oT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBPZmZlckZpbHRlcklzc3VlU2hhcGUgPSB7IHN0cmluZ3M6IE0uYXJyYXlPZihNLnN0cmluZygpKSB9OyRozY9fb25jZS5PZmZlckZpbHRlcklzc3VlU2hhcGUoT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlKTtcbmhhcmRlbihPZmZlckZpbHRlcklzc3VlU2hhcGUpO1xuXG4gICAgICAgY29uc3QgT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSA9IHtcbiAgbWV0aG9kOiBDaG9pY2VNZXRob2RTaGFwZSxcbiAgaXNzdWU6IE9mZmVyRmlsdGVySXNzdWVTaGFwZSxcbiAgcG9zaXRpb25zOiBPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlLFxuICBlbGVjdGlvblR5cGU6ICdvZmZlcl9maWx0ZXInLFxuICBtYXhDaG9pY2VzOiAxLFxuICBtYXhXaW5uZXJzOiAxLFxuICBjbG9zaW5nUnVsZTogQ2xvc2luZ1J1bGVTaGFwZSxcbiAgcXVvcnVtUnVsZTogUXVvcnVtUnVsZVNoYXBlLFxuICB0aWVPdXRjb21lOiBOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSxcbn07JGjNj19vbmNlLk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUoT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSk7XG5oYXJkZW4oT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlID0ge1xuICAuLi5PZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlLFxuICBxdWVzdGlvbkhhbmRsZTogbWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuICBjb3VudGVySW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG59OyRozY9fb25jZS5PZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlKE9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuaGFyZGVuKE9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG4vL1xuICAgICAgIGNvbnN0IFBhcmFtQ2hhbmdlc1NwZWNTaGFwZSA9IE0ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5hbnkoKSk7JGjNj19vbmNlLlBhcmFtQ2hhbmdlc1NwZWNTaGFwZShQYXJhbUNoYW5nZXNTcGVjU2hhcGUpO1xuICAgICAgIGNvbnN0IFllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUgPSBQYXJhbUNoYW5nZXNTcGVjU2hhcGU7JGjNj19vbmNlLlllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUoWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSk7XG4gICAgICAgY29uc3QgTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlID0geyBub0NoYW5nZTogTS5hcnJheU9mKE0uc3RyaW5nKCkpIH07JGjNj19vbmNlLk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZShOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSA9IFtcbiAgWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbiAgTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlLFxuXTskaM2PX29uY2UuUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUoUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUpO1xuaGFyZGVuKFBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFBhcmFtUGF0aFNoYXBlID0geyBrZXk6IE0uYW55KCkgfTskaM2PX29uY2UuUGFyYW1QYXRoU2hhcGUoUGFyYW1QYXRoU2hhcGUpO1xuaGFyZGVuKFBhcmFtUGF0aFNoYXBlKTtcblxuICAgICAgIGNvbnN0IFBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUgPSB7XG4gIHNwZWM6IHtcbiAgICBwYXJhbVBhdGg6IFBhcmFtUGF0aFNoYXBlLFxuICAgIGNoYW5nZXM6IFBhcmFtQ2hhbmdlc1NwZWNTaGFwZSxcbiAgfSxcbiAgY29udHJhY3Q6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG59OyRozY9fb25jZS5QYXJhbUNoYW5nZXNJc3N1ZVNoYXBlKFBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUpO1xuaGFyZGVuKFBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUgPSB7XG4gIG1ldGhvZDogJ3VucmFua2VkJyxcbiAgaXNzdWU6IFBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUsXG4gIHBvc2l0aW9uczogUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUsXG4gIGVsZWN0aW9uVHlwZTogJ3BhcmFtX2NoYW5nZScsXG4gIG1heENob2ljZXM6IDEsXG4gIG1heFdpbm5lcnM6IDEsXG4gIGNsb3NpbmdSdWxlOiBDbG9zaW5nUnVsZVNoYXBlLFxuICBxdW9ydW1SdWxlOiAnbWFqb3JpdHknLFxuICB0aWVPdXRjb21lOiBOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUsXG59OyRozY9fb25jZS5QYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZShQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSk7XG5oYXJkZW4oUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSB7XG4gIC4uLlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlLFxuICBxdWVzdGlvbkhhbmRsZTogbWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuICBjb3VudGVySW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG59OyRozY9fb25jZS5QYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZShQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5oYXJkZW4oUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG5jb25zdCBBcGlJbnZvY2F0aW9uU3BlY1NoYXBlID0ge1xuICBhcGlNZXRob2ROYW1lOiBNLnN0cmluZygpLFxuICBtZXRob2RBcmdzOiBNLmFycmF5T2YoTS5hbnkoKSksXG59O1xuaGFyZGVuKEFwaUludm9jYXRpb25TcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUgPSBBcGlJbnZvY2F0aW9uU3BlY1NoYXBlOyRozY9fb25jZS5ZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZShZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSk7XG4gICAgICAgY29uc3QgTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSA9IHsgZG9udEludm9rZTogTS5zdHJpbmcoKSB9OyRozY9fb25jZS5Ob0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlID0gW1xuICBZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbiAgTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbl07JGjNj19vbmNlLkFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZShBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUpO1xuaGFyZGVuKEFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUgPSB7XG4gIG1ldGhvZDogJ3VucmFua2VkJyxcbiAgaXNzdWU6IEFwaUludm9jYXRpb25TcGVjU2hhcGUsXG4gIHBvc2l0aW9uczogQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlLFxuICBlbGVjdGlvblR5cGU6ICdhcGlfaW52b2NhdGlvbicsXG4gIG1heENob2ljZXM6IDEsXG4gIG1heFdpbm5lcnM6IDEsXG4gIGNsb3NpbmdSdWxlOiBDbG9zaW5nUnVsZVNoYXBlLFxuICBxdW9ydW1SdWxlOiBRdW9ydW1SdWxlU2hhcGUsXG4gIHRpZU91dGNvbWU6IE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUsXG59OyRozY9fb25jZS5BcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUoQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlKTtcbmhhcmRlbihBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlID0ge1xuICAuLi5BcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUsXG4gIHF1ZXN0aW9uSGFuZGxlOiBtYWtlSGFuZGxlU2hhcGUoJ1F1ZXN0aW9uJyksXG4gIGNvdW50ZXJJbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbn07JGjNj19vbmNlLkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZShBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuaGFyZGVuKEFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cbmNvbnN0IFNpbXBsZVNwZWNTaGFwZSA9IHsgdGV4dDogTS5zdHJpbmcoKSB9O1xuaGFyZGVuKFNpbXBsZVNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBZZXNTaW1wbGVQb3NpdGlvblNoYXBlID0geyB0ZXh0OiBNLnN0cmluZygpIH07JGjNj19vbmNlLlllc1NpbXBsZVBvc2l0aW9uU2hhcGUoWWVzU2ltcGxlUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oWWVzU2ltcGxlUG9zaXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBOb1NpbXBsZVBvc2l0aW9uU2hhcGUgPSB7IHRleHQ6IE0uc3RyaW5nKCkgfTskaM2PX29uY2UuTm9TaW1wbGVQb3NpdGlvblNoYXBlKE5vU2ltcGxlUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oTm9TaW1wbGVQb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IFNpbXBsZVBvc2l0aW9uc1NoYXBlID0gW1xuICBZZXNTaW1wbGVQb3NpdGlvblNoYXBlLFxuICBOb1NpbXBsZVBvc2l0aW9uU2hhcGUsXG5dOyRozY9fb25jZS5TaW1wbGVQb3NpdGlvbnNTaGFwZShTaW1wbGVQb3NpdGlvbnNTaGFwZSk7XG5oYXJkZW4oU2ltcGxlUG9zaXRpb25zU2hhcGUpO1xuXG4gICAgICAgY29uc3QgU2ltcGxlSXNzdWVTaGFwZSA9IFNpbXBsZVNwZWNTaGFwZTskaM2PX29uY2UuU2ltcGxlSXNzdWVTaGFwZShTaW1wbGVJc3N1ZVNoYXBlKTtcbmhhcmRlbihTaW1wbGVJc3N1ZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IFNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlID0ge1xuICBtZXRob2Q6IENob2ljZU1ldGhvZFNoYXBlLFxuICBpc3N1ZTogU2ltcGxlSXNzdWVTaGFwZSxcbiAgcG9zaXRpb25zOiBNLmFycmF5T2YoeyB0ZXh0OiBNLnN0cmluZygpIH0pLFxuICBlbGVjdGlvblR5cGU6IE0ub3IoJ2VsZWN0aW9uJywgJ3N1cnZleScpLFxuICBtYXhDaG9pY2VzOiBNLmd0ZSgxKSxcbiAgbWF4V2lubmVyczogTS5ndGUoMSksXG4gIGNsb3NpbmdSdWxlOiBDbG9zaW5nUnVsZVNoYXBlLFxuICBxdW9ydW1SdWxlOiBRdW9ydW1SdWxlU2hhcGUsXG4gIHRpZU91dGNvbWU6IE5vU2ltcGxlUG9zaXRpb25TaGFwZSxcbn07JGjNj19vbmNlLlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlKFNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlKTtcbmhhcmRlbihTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSA9IHtcbiAgLi4uU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUsXG4gIHF1ZXN0aW9uSGFuZGxlOiBtYWtlSGFuZGxlU2hhcGUoJ1F1ZXN0aW9uJyksXG4gIGNvdW50ZXJJbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbn07JGjNj19vbmNlLlNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlKFNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcbmhhcmRlbihTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBRdWVzdGlvblNwZWNTaGFwZSA9IE0ub3IoXG4gIEFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSxcbiAgT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSxcbiAgUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUsXG4gIFNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlLFxuKTskaM2PX29uY2UuUXVlc3Rpb25TcGVjU2hhcGUoUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUG9zaXRpb25TaGFwZSA9IE0ub3IoXG4gIFllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxuICBOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxuICBZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUsXG4gIE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlLFxuICBZZXNTaW1wbGVQb3NpdGlvblNoYXBlLFxuICBOb1NpbXBsZVBvc2l0aW9uU2hhcGUsXG4gIFllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUsXG4gIE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbik7JGjNj19vbmNlLlBvc2l0aW9uU2hhcGUoUG9zaXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBRdWVzdGlvbkhhbmRsZVNoYXBlID0gbWFrZUhhbmRsZVNoYXBlKCdxdWVzdGlvbicpO1xuXG4vL1xuJGjNj19vbmNlLlF1ZXN0aW9uSGFuZGxlU2hhcGUoUXVlc3Rpb25IYW5kbGVTaGFwZSk7Y29uc3QgSW52aXRhdGlvblNoYXBlPU0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uJyk7XG5cbi8vXG4vL1xuLy9cbiRozY9fb25jZS5JbnZpdGF0aW9uU2hhcGUoSW52aXRhdGlvblNoYXBlKTtjb25zdCBRdWVzdGlvbkRldGFpbHNTaGFwZT1NLm9yKFxuICBQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSxcbiAgQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlLFxuICBPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlLFxuICBTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSxcbik7JGjNj19vbmNlLlF1ZXN0aW9uRGV0YWlsc1NoYXBlKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IEVsZWN0b3JhdGVQdWJsaWNJID0gTS5pbnRlcmZhY2UoJ0NvbW1pdHRlZSBQdWJsaWNGYWNldCcsIHtcbiAgZ2V0UXVlc3Rpb25TdWJzY3JpYmVyOiBNLmNhbGwoKS5yZXR1cm5zKFN1YnNjcmliZXJTaGFwZSksXG4gIGdldE9wZW5RdWVzdGlvbnM6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXROYW1lOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICBnZXRJbnN0YW5jZTogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbiAgZ2V0UXVlc3Rpb246IE0uY2FsbChRdWVzdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn0pOyRozY9fb25jZS5FbGVjdG9yYXRlUHVibGljSShFbGVjdG9yYXRlUHVibGljSSk7XG5jb25zdCBFbGVjdG9yYXRlUHVibGljU2hhcGUgPSBNLnJlbW90YWJsZSgnRWxlY3RvcmF0ZVB1YmxpYycpO1xuXG4gICAgICAgY29uc3QgRWxlY3RvcmF0ZUNyZWF0b3JJID0gTS5pbnRlcmZhY2UoJ0NvbW1pdHRlZSBBZG1pbkZhY2V0Jywge1xuICBnZXRQb3Nlckludml0YXRpb246IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBhZGRRdWVzdGlvbjogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUsIFF1ZXN0aW9uU3BlY1NoYXBlKS5yZXR1cm5zKFxuICAgIE0ucHJvbWlzZSgpLFxuICApLFxuICBnZXRWb3Rlckludml0YXRpb25zOiBNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihNLnByb21pc2UoKSkpLFxuICBnZXRRdWVzdGlvblN1YnNjcmliZXI6IE0uY2FsbCgpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbiAgZ2V0UHVibGljRmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoRWxlY3RvcmF0ZVB1YmxpY1NoYXBlKSxcbn0pOyRozY9fb25jZS5FbGVjdG9yYXRlQ3JlYXRvckkoRWxlY3RvcmF0ZUNyZWF0b3JJKTtcblxuICAgICAgIGNvbnN0IFF1ZXN0aW9uU3RhdHNTaGFwZSA9IHtcbiAgc3BvaWxlZDogTS5uYXQoKSxcbiAgdm90ZXM6IE0ubmF0KCksXG4gIHJlc3VsdHM6IE0uYXJyYXlPZih7IHBvc2l0aW9uOiBQb3NpdGlvblNoYXBlLCB0b3RhbDogTS5uYXQoKSB9KSxcbn07JGjNj19vbmNlLlF1ZXN0aW9uU3RhdHNTaGFwZShRdWVzdGlvblN0YXRzU2hhcGUpO1xuaGFyZGVuKFF1ZXN0aW9uU3RhdHNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBRdWVzdGlvbkkgPSBNLmludGVyZmFjZSgnUXVlc3Rpb24nLCB7XG4gIGdldFZvdGVDb3VudGVyOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpLFxuICBnZXREZXRhaWxzOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKSxcbn0pOyRozY9fb25jZS5RdWVzdGlvbkkoUXVlc3Rpb25JKTtcbmNvbnN0IFF1ZXN0aW9uU2hhcGUgPSBNLnJlbW90YWJsZSgnUXVlc3Rpb24nKTtcblxuICAgICAgIGNvbnN0IEJpbmFyeVZvdGVDb3VudGVyUHVibGljSSA9IE0uaW50ZXJmYWNlKFxuICAnQmluYXJ5Vm90ZUNvdW50ZXIgUHVibGljRmFjZXQnLFxuICB7XG4gICAgZ2V0UXVlc3Rpb246IE0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25TaGFwZSksXG4gICAgaXNPcGVuOiBNLmNhbGwoKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgICBnZXRPdXRjb21lOiBNLmNhbGwoKS5yZXR1cm5zKE0uZXJlZihNLnByb21pc2UoKSkpLFxuICAgIGdldFN0YXRzOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBnZXREZXRhaWxzOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKSxcbiAgICBnZXRJbnN0YW5jZTogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbiAgfSxcbik7JGjNj19vbmNlLkJpbmFyeVZvdGVDb3VudGVyUHVibGljSShCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kpO1xuXG4gICAgICAgY29uc3QgVm90ZXJIYW5kbGUgPSBNLnJlbW90YWJsZSgpOyRozY9fb25jZS5Wb3RlckhhbmRsZShWb3RlckhhbmRsZSk7XG4gICAgICAgY29uc3QgQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkgPSBNLmludGVyZmFjZShcbiAgJ0JpbmFyeVZvdGVDb3VudGVyIEFkbWluRmFjZXQnLFxuICB7XG4gICAgc3VibWl0Vm90ZTogTS5jYWxsKFZvdGVySGFuZGxlLCBNLmFycmF5T2YoUG9zaXRpb25TaGFwZSkpXG4gICAgICAub3B0aW9uYWwoTS5uYXQoKSlcbiAgICAgIC5yZXR1cm5zKHsgY2hvc2VuOiBQb3NpdGlvblNoYXBlLCBzaGFyZXM6IE0ubmF0KCkgfSksXG4gIH0sXG4pOyRozY9fb25jZS5CaW5hcnlWb3RlQ291bnRlckFkbWluSShCaW5hcnlWb3RlQ291bnRlckFkbWluSSk7XG5cbiAgICAgICBjb25zdCBCaW5hcnlWb3RlQ291bnRlckNsb3NlSSA9IE0uaW50ZXJmYWNlKFxuICAnQmluYXJ5Vm90ZUNvdW50ZXIgQ2xvc2VGYWNldCcsXG4gIHtcbiAgICBjbG9zZVZvdGluZzogTS5jYWxsKCkucmV0dXJucygpLFxuICB9LFxuKTskaM2PX29uY2UuQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkoQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkpO1xuXG4gICAgICAgY29uc3QgVm90ZUNvdW50ZXJQdWJsaWNJID0gTS5pbnRlcmZhY2UoJ1ZvdGVDb3VudGVyIFB1YmxpY0ZhY2V0Jywge1xuICBnZXRRdWVzdGlvbjogTS5jYWxsKCkucmV0dXJucyhRdWVzdGlvblNoYXBlKSxcbiAgaXNPcGVuOiBNLmNhbGwoKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgZ2V0T3V0Y29tZTogTS5jYWxsKCkucmV0dXJucyhNLmVyZWYoTS5wcm9taXNlKCkpKSxcbiAgZ2V0U3RhdHM6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXREZXRhaWxzOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uRGV0YWlsc1NoYXBlKSxcbiAgZ2V0SW5zdGFuY2U6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG59KTskaM2PX29uY2UuVm90ZUNvdW50ZXJQdWJsaWNJKFZvdGVDb3VudGVyUHVibGljSSk7XG5cbiAgICAgICBjb25zdCBWb3RlQ291bnRlckFkbWluSSA9IE0uaW50ZXJmYWNlKCdWb3RlQ291bnRlciBBZG1pbkZhY2V0Jywge1xuICBzdWJtaXRWb3RlOiBNLmNhbGwoVm90ZXJIYW5kbGUsIE0uYXJyYXlPZihQb3NpdGlvblNoYXBlKSlcbiAgICAub3B0aW9uYWwoTS5uYXQoKSlcbiAgICAucmV0dXJucyh7IGNob3NlbjogTS5hcnJheU9mKFBvc2l0aW9uU2hhcGUpLCBzaGFyZXM6IE0ubmF0KCkgfSksXG59KTskaM2PX29uY2UuVm90ZUNvdW50ZXJBZG1pbkkoVm90ZUNvdW50ZXJBZG1pbkkpO1xuXG4gICAgICAgY29uc3QgVm90ZUNvdW50ZXJDbG9zZUkgPSBNLmludGVyZmFjZSgnVm90ZUNvdW50ZXIgQ2xvc2VGYWNldCcsIHtcbiAgY2xvc2VWb3Rpbmc6IE0uY2FsbCgpLnJldHVybnMoKSxcbn0pOyRozY9fb25jZS5Wb3RlQ291bnRlckNsb3NlSShWb3RlQ291bnRlckNsb3NlSSk7XG5cbiAgICAgICBjb25zdCBHb3Zlcm5vckZhY2V0U2hhcGUgPSB7XG4gIGdldFBhcmFtTWdyUmV0cmlldmVyOiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdwYXJhbVJldHJpZXZlcicpKSxcbiAgZ2V0SW52aXRhdGlvbjogTS5jYWxsKCkucmV0dXJucyhJbnZpdGF0aW9uU2hhcGUpLFxuICBnZXRMaW1pdGVkQ3JlYXRvckZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCkpLFxuICBnZXRHb3Zlcm5lZEFwaXM6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ2dvdmVybmVkQVBJcycpKSxcbiAgZ2V0R292ZXJuZWRBcGlOYW1lczogTS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuICBzZXRPZmZlckZpbHRlcjogTS5jYWxsKE0uYXJyYXlPZihNLnN0cmluZygpKSkucmV0dXJucyhNLnByb21pc2UoKSksXG59OyRozY9fb25jZS5Hb3Zlcm5vckZhY2V0U2hhcGUoR292ZXJub3JGYWNldFNoYXBlKTtcbmhhcmRlbihHb3Zlcm5vckZhY2V0U2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ2hvaWNlTWV0aG9kU2hhcGUiOlsiQ2hvaWNlTWV0aG9kU2hhcGUiXSwiUXVvcnVtUnVsZVNoYXBlIjpbIlF1b3J1bVJ1bGVTaGFwZSJdLCJFbGVjdGlvblR5cGVTaGFwZSI6WyJFbGVjdGlvblR5cGVTaGFwZSJdLCJDbG9zaW5nUnVsZVNoYXBlIjpbIkNsb3NpbmdSdWxlU2hhcGUiXSwiWWVzT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlIjpbIlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSJdLCJOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSI6WyJOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSJdLCJPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlIjpbIk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUiXSwiT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlIjpbIk9mZmVyRmlsdGVySXNzdWVTaGFwZSJdLCJPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlIjpbIk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUiXSwiT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlBhcmFtQ2hhbmdlc1NwZWNTaGFwZSI6WyJQYXJhbUNoYW5nZXNTcGVjU2hhcGUiXSwiWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSI6WyJZZXNQYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIl0sIk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSI6WyJOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiXSwiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiOlsiUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUiXSwiUGFyYW1QYXRoU2hhcGUiOlsiUGFyYW1QYXRoU2hhcGUiXSwiUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSI6WyJQYXJhbUNoYW5nZXNJc3N1ZVNoYXBlIl0sIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlIl0sIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIjpbIlllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIl0sIk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiOlsiTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSJdLCJBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUiOlsiQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlIl0sIkFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSI6WyJBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUiXSwiQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJZZXNTaW1wbGVQb3NpdGlvblNoYXBlIjpbIlllc1NpbXBsZVBvc2l0aW9uU2hhcGUiXSwiTm9TaW1wbGVQb3NpdGlvblNoYXBlIjpbIk5vU2ltcGxlUG9zaXRpb25TaGFwZSJdLCJTaW1wbGVQb3NpdGlvbnNTaGFwZSI6WyJTaW1wbGVQb3NpdGlvbnNTaGFwZSJdLCJTaW1wbGVJc3N1ZVNoYXBlIjpbIlNpbXBsZUlzc3VlU2hhcGUiXSwiU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUiOlsiU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUiXSwiU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiUXVlc3Rpb25TcGVjU2hhcGUiOlsiUXVlc3Rpb25TcGVjU2hhcGUiXSwiUG9zaXRpb25TaGFwZSI6WyJQb3NpdGlvblNoYXBlIl0sIlF1ZXN0aW9uSGFuZGxlU2hhcGUiOlsiUXVlc3Rpb25IYW5kbGVTaGFwZSJdLCJJbnZpdGF0aW9uU2hhcGUiOlsiSW52aXRhdGlvblNoYXBlIl0sIlF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIlF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIkVsZWN0b3JhdGVQdWJsaWNJIjpbIkVsZWN0b3JhdGVQdWJsaWNJIl0sIkVsZWN0b3JhdGVDcmVhdG9ySSI6WyJFbGVjdG9yYXRlQ3JlYXRvckkiXSwiUXVlc3Rpb25TdGF0c1NoYXBlIjpbIlF1ZXN0aW9uU3RhdHNTaGFwZSJdLCJRdWVzdGlvbkkiOlsiUXVlc3Rpb25JIl0sIkJpbmFyeVZvdGVDb3VudGVyUHVibGljSSI6WyJCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kiXSwiVm90ZXJIYW5kbGUiOlsiVm90ZXJIYW5kbGUiXSwiQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkiOlsiQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkiXSwiQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkiOlsiQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkiXSwiVm90ZUNvdW50ZXJQdWJsaWNJIjpbIlZvdGVDb3VudGVyUHVibGljSSJdLCJWb3RlQ291bnRlckFkbWluSSI6WyJWb3RlQ291bnRlckFkbWluSSJdLCJWb3RlQ291bnRlckNsb3NlSSI6WyJWb3RlQ291bnRlckNsb3NlSSJdLCJHb3Zlcm5vckZhY2V0U2hhcGUiOlsiR292ZXJub3JGYWNldFNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAGdNyXVCQAA1QkAACwAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvdmFsaWRhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIiwiYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBhc3NlcnRDb250cmFjdEdvdmVybmFuY2UgPSBhc3luYyAoXG4gIHpvZSxcbiAgYWxsZWdlZEdvdmVybmVkLFxuICBhbGxlZ2VkR292ZXJub3IsXG4gIGNvbnRyYWN0R292ZXJub3JJbnN0YWxsYXRpb24sXG4pID0+IHtcbiAgY29uc3QgYWxsZWdlZEdvdmVybm9yUEYgPSBFKHpvZSkuZ2V0UHVibGljRmFjZXQoYWxsZWdlZEdvdmVybm9yKTtcbiAgY29uc3QgcmVhbEdvdmVybmVkUCA9IEUoYWxsZWdlZEdvdmVybm9yUEYpLmdldEdvdmVybmVkQ29udHJhY3QoKTtcbiAgY29uc3QgYWxsZWdlZEdvdmVybmVkVGVybXNQID0gRSh6b2UpLmdldFRlcm1zKGFsbGVnZWRHb3Zlcm5lZCk7XG5cbiAgY29uc3QgW3sgZWxlY3Rpb25NYW5hZ2VyOiByZWFsR292ZXJub3JJbnN0YW5jZSB9LCByZWFsR292ZXJuZWRJbnN0YW5jZV0gPVxuICAgIGF3YWl0IFByb21pc2UuYWxsKFthbGxlZ2VkR292ZXJuZWRUZXJtc1AsIHJlYWxHb3Zlcm5lZFBdKTtcblxuICBhc3NlcnQoXG4gICAgLy9cbiAgICBhbGxlZ2VkR292ZXJub3IgPT09IHJlYWxHb3Zlcm5vckluc3RhbmNlLFxuICAgICdUaGUgYWxsZWdlZCBnb3Zlcm5vciBkaWQgbm90IG1hdGNoIHRoZSBnb3Zlcm5vciByZXRyaWV2ZWQgZnJvbSB0aGUgZ292ZXJuZWQgY29udHJhY3QnLFxuICApO1xuXG4gIGFzc2VydChcbiAgICBhbGxlZ2VkR292ZXJuZWQgPT09IHJlYWxHb3Zlcm5lZEluc3RhbmNlLFxuICAgICdUaGUgYWxsZWdlZCBnb3Zlcm5lZCBkaWQgbm90IG1hdGNoIHRoZSBnb3Zlcm5lZCBjb250cmFjdCByZXRyaWV2ZWQgZnJvbSB0aGUgZ292ZXJub3InLFxuICApO1xuXG4gIGNvbnN0IGdvdmVybm9ySW5zdGFsbGF0aW9uRnJvbUdvdmVybmVkID1cbiAgICBhd2FpdCBFKHpvZSkuZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2UocmVhbEdvdmVybm9ySW5zdGFuY2UpO1xuXG4gIGFzc2VydChcbiAgICBnb3Zlcm5vckluc3RhbGxhdGlvbkZyb21Hb3Zlcm5lZCA9PT0gY29udHJhY3RHb3Zlcm5vckluc3RhbGxhdGlvbixcbiAgICAnVGhlIGdvdmVybmVkIGNvbnRyYWN0IGlzIG5vdCBnb3Zlcm5lZCBieSBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvdmlkZWQgaW5zdGFsbGF0aW9uLicsXG4gICk7XG5cbiAgcmV0dXJuIHsgZ292ZXJub3I6IHJlYWxHb3Zlcm5vckluc3RhbmNlLCBnb3Zlcm5lZDogcmVhbEdvdmVybmVkSW5zdGFuY2UgfTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlKGFzc2VydENvbnRyYWN0R292ZXJuYW5jZSk7XG5jb25zdCBhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUgPSBhc3luYyAoXG4gIHpvZSxcbiAgYWxsZWdlZEdvdmVybm9yLFxuICBhbGxlZ2VkRWxlY3RvcmF0ZSxcbikgPT4ge1xuICBjb25zdCBhbGxlZ2VkR292ZXJub3JQRiA9IEUoem9lKS5nZXRQdWJsaWNGYWNldChhbGxlZ2VkR292ZXJub3IpO1xuICBjb25zdCBlbGVjdG9yYXRlID0gYXdhaXQgRShhbGxlZ2VkR292ZXJub3JQRikuZ2V0RWxlY3RvcmF0ZSgpO1xuICBlbGVjdG9yYXRlID09PSBhbGxlZ2VkRWxlY3RvcmF0ZSB8fFxuICAgIEZhaWxgVGhlIGFsbGVnZWRFbGVjdG9yYXRlIGRpZG4ndCBtYXRjaCB0aGUgYWN0dWFsICR7cShlbGVjdG9yYXRlKX1gO1xuXG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlKGFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSk7XG5cbmhhcmRlbihhc3NlcnRDb250cmFjdEdvdmVybmFuY2UpO1xuaGFyZGVuKGFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRDb250cmFjdEdvdmVybmFuY2UiOlsiYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIl0sImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSI6WyJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqAlI0jsUAAA7FAAAQgAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvcHJpY2UvZmx1eEFnZ3JlZ2F0b3JDb250cmFjdC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAYWdvcmljL2dvdmVybmFuY2UiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIi4uL3Byb3Bvc2Fscy91dGlscy5qcyIsIi4vZmx1eEFnZ3JlZ2F0b3JLaXQuanMiXSwiZXhwb3J0cyI6WyJtZXRhIiwic3RhcnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwcmVwYXJlSXNzdWVyS2l0LGhhbmRsZVBhcmFtR292ZXJuYW5jZSxtYWtlVHJhY2VyLFN0b3JhZ2VOb2RlU2hhcGUscHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0LE0scHJvdmlkZUFsbCxwcmVwYXJlUmVjb3JkZXIsRSxyZXNlcnZlVGhlbkRlcG9zaXQscHJlcGFyZUZsdXhBZ2dyZWdhdG9yS2l0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJwcmVwYXJlSXNzdWVyS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUlzc3VlcktpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZ292ZXJuYW5jZVwiLCBbW1wiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlXCIsWyRozY9fYSA9PiAoaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV0sW1wiU3RvcmFnZU5vZGVTaGFwZVwiLFskaM2PX2EgPT4gKFN0b3JhZ2VOb2RlU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qc1wiLCBbW1wicHJvdmlkZUFsbFwiLFskaM2PX2EgPT4gKHByb3ZpZGVBbGwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzXCIsIFtbXCJwcmVwYXJlUmVjb3JkZXJcIixbJGjNj19hID0+IChwcmVwYXJlUmVjb3JkZXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIi4uL3Byb3Bvc2Fscy91dGlscy5qc1wiLCBbW1wicmVzZXJ2ZVRoZW5EZXBvc2l0XCIsWyRozY9fYSA9PiAocmVzZXJ2ZVRoZW5EZXBvc2l0ID0gJGjNj19hKV1dXV0sW1wiLi9mbHV4QWdncmVnYXRvcktpdC5qc1wiLCBbW1wicHJlcGFyZUZsdXhBZ2dyZWdhdG9yS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUZsdXhBZ2dyZWdhdG9yS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHRyYWNlID0gbWFrZVRyYWNlcignRmx1eEFnZycsIGZhbHNlKTtcbi8qXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IG1ldGEgPSB7XG4gIHByaXZhdGVBcmdzU2hhcGU6IE0uc3BsaXRSZWNvcmQoXG4gICAge1xuICAgICAgc3RvcmFnZU5vZGU6IFN0b3JhZ2VOb2RlU2hhcGUsXG4gICAgICBtYXJzaGFsbGVyOiBNLmVyZWYoTS5yZW1vdGFibGUoJ21hcnNoYWxsZXInKSksXG4gICAgICBuYW1lc0J5QWRkcmVzc0FkbWluOiBNLmFueSgpLFxuICAgIH0sXG4gICAge1xuICAgICAgLy9cbiAgICAgIGhpZ2hQcmlvcml0eVNlbmRlcnNNYW5hZ2VyOiBNLm9yKFxuICAgICAgICBNLnJlbW90YWJsZSgncHJpb3JpdHlTZW5kZXJzIG1hbmFnZXInKSxcbiAgICAgICAgTS5udWxsKCksXG4gICAgICApLFxuICAgICAgLy9cbiAgICAgIGluaXRpYWxQb3Nlckludml0YXRpb246IE0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uJyksXG4gICAgfSxcbiAgKSxcbiAgdXBncmFkYWJpbGl0eTogJ2NhblVwZ3JhZGUnLFxufTskaM2PX29uY2UubWV0YShtZXRhKTtcbmhhcmRlbihtZXRhKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHN0YXJ0ID0gYXN5bmMgKHpjZiwgcHJpdmF0ZUFyZ3MsIGJhZ2dhZ2UpID0+IHtcbiAgdHJhY2UoJ3ByZXBhcmUgd2l0aCBiYWdnYWdlIGtleXMnLCBbLi4uYmFnZ2FnZS5rZXlzKCldKTtcblxuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8vXG4gIGNvbnN0IHF1b3RlSXNzdWVyS2l0ID0gcHJlcGFyZUlzc3VlcktpdChcbiAgICBiYWdnYWdlLFxuICAgICdxdW90ZScsXG4gICAgJ3NldCcsXG4gICAgdW5kZWZpbmVkLFxuICAgIHVuZGVmaW5lZCxcbiAgICB7IHJlY292ZXJ5U2V0c09wdGlvbjogJ25vUmVjb3ZlcnlTZXRzJyB9LFxuICApO1xuXG4gIGNvbnN0IHtcbiAgICBoaWdoUHJpb3JpdHlTZW5kZXJzTWFuYWdlcixcbiAgICBpbml0aWFsUG9zZXJJbnZpdGF0aW9uLFxuICAgIG1hcnNoYWxsZXIsXG4gICAgbmFtZXNCeUFkZHJlc3NBZG1pbixcbiAgICBzdG9yYWdlTm9kZSxcbiAgfSA9IHByaXZhdGVBcmdzO1xuXG4gIGNvbnN0IHsgZGVzY3JpcHRpb24sIHRpbWVyIH0gPSB6Y2YuZ2V0VGVybXMoKTtcblxuICB0cmFjZSgnYXdhaXRlZCBhcmdzJyk7XG5cbiAgY29uc3QgbWFrZUR1cmFibGVQdWJsaXNoS2l0ID0gcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ1ByaWNlIEFnZ3JlZ2F0b3IgcHVibGlzaCBraXQnLFxuICApO1xuICBjb25zdCBtYWtlUmVjb3JkZXIgPSBwcmVwYXJlUmVjb3JkZXIoYmFnZ2FnZSwgbWFyc2hhbGxlcik7XG5cbiAgY29uc3QgbWFrZUZsdXhBZ2dyZWdhdG9yS2l0ID0gYXdhaXQgcHJlcGFyZUZsdXhBZ2dyZWdhdG9yS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgemNmLFxuICAgIHRpbWVyLFxuICAgIHF1b3RlSXNzdWVyS2l0LFxuICAgIHN0b3JhZ2VOb2RlLFxuICAgIG1ha2VEdXJhYmxlUHVibGlzaEtpdCxcbiAgICBtYWtlUmVjb3JkZXIsXG4gICk7XG5cbiAgY29uc3QgeyBmYUtpdCB9ID0gYXdhaXQgcHJvdmlkZUFsbChiYWdnYWdlLCB7XG4gICAgZmFLaXQ6ICgpID0+IG1ha2VGbHV4QWdncmVnYXRvcktpdCgpLFxuICB9KTtcbiAgdHJhY2UoJ2dvdCBmYUtpdCcsIGZhS2l0KTtcblxuICAvL1xuICAvL1xuICBjb25zdCB7IG1ha2VEdXJhYmxlR292ZXJub3JGYWNldCB9ID0gaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlKFxuICAgIC8vXG4gICAgemNmLFxuICAgIGluaXRpYWxQb3Nlckludml0YXRpb24sXG4gICAge1xuICAgICAgLy9cbiAgICB9LFxuICAgIHN0b3JhZ2VOb2RlLFxuICAgIG1hcnNoYWxsZXIsXG4gICk7XG5cbiAgdHJhY2UoJ2dvdCBtYWtlRHVyYWJsZUdvdmVybm9yRmFjZXQnLCBtYWtlRHVyYWJsZUdvdmVybm9yRmFjZXQpO1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBhZGRPcmFjbGUgPSBhc3luYyBhZGRyID0+IHtcbiAgICB0cmFjZSgnYWRkT3JhY2xlJywgYWRkcik7XG4gICAgY29uc3QgaW52aXRhdGlvbiA9IGF3YWl0IEUoZmFLaXQuY3JlYXRvcikubWFrZU9yYWNsZUludml0YXRpb24oYWRkcik7XG4gICAgLy9cbiAgICBhd2FpdCByZXNlcnZlVGhlbkRlcG9zaXQoXG4gICAgICBgZmx1eEFnZ3JlZ2F0b3Igb3JhY2xlICR7YWRkcn1gLFxuICAgICAgbmFtZXNCeUFkZHJlc3NBZG1pbixcbiAgICAgIGFkZHIsXG4gICAgICBbaW52aXRhdGlvbl0sXG4gICAgKTtcbiAgICBhd2FpdCAoaGlnaFByaW9yaXR5U2VuZGVyc01hbmFnZXIgJiZcbiAgICAgIEUoaGlnaFByaW9yaXR5U2VuZGVyc01hbmFnZXIpLmFkZChkZXNjcmlwdGlvbiwgYWRkcikpO1xuICAgIHJldHVybiBgYWRkZWQgJHthZGRyfWA7XG4gIH07XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IHJlbW92ZU9yYWNsZSA9IGFzeW5jIGFkZHIgPT4ge1xuICAgIHRyYWNlKCdyZW1vdmVPcmFjbGUnLCBhZGRyKTtcbiAgICBhd2FpdCBFKGZhS2l0LmNyZWF0b3IpLnJlbW92ZU9yYWNsZShhZGRyKTtcbiAgICBhd2FpdCAoaGlnaFByaW9yaXR5U2VuZGVyc01hbmFnZXIgJiZcbiAgICAgIEUoaGlnaFByaW9yaXR5U2VuZGVyc01hbmFnZXIpLnJlbW92ZShkZXNjcmlwdGlvbiwgYWRkcikpO1xuICAgIHJldHVybiBgcmVtb3ZlZCAke2FkZHJ9YDtcbiAgfTtcblxuICBjb25zdCBnb3Zlcm5lZEFwaXMgPSB7XG4gICAgLypcblxuXG5cblxuXG4gICAgICovXG4gICAgYWRkT3JhY2xlczogYWRkcnMgPT4ge1xuICAgICAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChhZGRycy5tYXAoYWRkT3JhY2xlKSk7XG4gICAgfSxcbiAgICAvKlxuXG5cblxuXG5cblxuICAgICAqL1xuICAgIHJlbW92ZU9yYWNsZXM6IGFkZHJzID0+IHtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoYWRkcnMubWFwKHJlbW92ZU9yYWNsZSkpO1xuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgeyBnb3Zlcm5vckZhY2V0IH0gPSBtYWtlRHVyYWJsZUdvdmVybm9yRmFjZXQoXG4gICAgYmFnZ2FnZSxcbiAgICBmYUtpdC5jcmVhdG9yLFxuICAgIGdvdmVybmVkQXBpcyxcbiAgKTtcbiAgdHJhY2UoJ21hZGUgZ292ZXJub3JGYWNldCcsIGdvdmVybm9yRmFjZXQpO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGNyZWF0b3JGYWNldDogZ292ZXJub3JGYWNldCxcbiAgICBwdWJsaWNGYWNldDogZmFLaXQucHVibGljLFxuICB9KTtcbn07JGjNj19vbmNlLnN0YXJ0KHN0YXJ0KTtcbmhhcmRlbihzdGFydCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWV0YSI6WyJtZXRhIl0sInN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP3Vz2xrJwAAaycAAD0AAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ByaWNlL2ZsdXhBZ2dyZWdhdG9yS2l0LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIi4vcHJpY2VPcmFjbGVLaXQuanMiLCIuL3JvdW5kc01hbmFnZXIuanMiXSwiZXhwb3J0cyI6WyJJTlZJVEFUSU9OX01BS0VSU19ERVNDIiwicHJlcGFyZUZsdXhBZ2dyZWdhdG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQW1vdW50TWF0aCxhc3NlcnRBbGxEZWZpbmVkLG1ha2VUcmFjZXIsbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIsb2JzZXJ2ZU5vdGlmaWVyLE0sbWFrZVNjYWxhckJpZ01hcFN0b3JlLHByZXBhcmVFeG9DbGFzc0tpdCxkZWZpbmVSZWNvcmRlcktpdCxtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQsbWFrZVJlY29yZGVyVG9waWMscHJvdmlkZUFsbCxFLEZhcixwcmVwYXJlT3JhY2xlQWRtaW5LaXQscHJlcGFyZVJvdW5kc01hbmFnZXJLaXQ7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLFskaM2PX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaM2PX2EpXV0sW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlclwiLFskaM2PX2EgPT4gKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyID0gJGjNj19hKV1dLFtcIm9ic2VydmVOb3RpZmllclwiLFskaM2PX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzXCIsIFtbXCJkZWZpbmVSZWNvcmRlcktpdFwiLFskaM2PX2EgPT4gKGRlZmluZVJlY29yZGVyS2l0ID0gJGjNj19hKV1dLFtcIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdFwiLFskaM2PX2EgPT4gKG1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCA9ICRozY9fYSldXSxbXCJtYWtlUmVjb3JkZXJUb3BpY1wiLFskaM2PX2EgPT4gKG1ha2VSZWNvcmRlclRvcGljID0gJGjNj19hKV1dLFtcInByb3ZpZGVBbGxcIixbJGjNj19hID0+IChwcm92aWRlQWxsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL3ByaWNlT3JhY2xlS2l0LmpzXCIsIFtbXCJwcmVwYXJlT3JhY2xlQWRtaW5LaXRcIixbJGjNj19hID0+IChwcmVwYXJlT3JhY2xlQWRtaW5LaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3JvdW5kc01hbmFnZXIuanNcIiwgW1tcInByZXBhcmVSb3VuZHNNYW5hZ2VyS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZVJvdW5kc01hbmFnZXJLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdGbHhBZ2cnLCB0cnVlKTtcblxuICAgICAgIGNvbnN0IElOVklUQVRJT05fTUFLRVJTX0RFU0MgPSAnb3JhY2xlIGludml0YXRpb24nO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5JTlZJVEFUSU9OX01BS0VSU19ERVNDKElOVklUQVRJT05fTUFLRVJTX0RFU0MpO1xuY29uc3QgcHJpY2VEZXNjcmlwdGlvbkZyb21RdW90ZSA9IHF1b3RlID0+IHF1b3RlLnF1b3RlQW1vdW50LnZhbHVlWzBdO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLy9cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUZsdXhBZ2dyZWdhdG9yS2l0ID0gYXN5bmMgKFxuICBiYWdnYWdlLFxuICB6Y2YsXG4gIHRpbWVyUHJlc2VuY2UsXG4gIHF1b3RlS2l0LFxuICBzdG9yYWdlTm9kZSxcbiAgbWFrZUR1cmFibGVQdWJsaXNoS2l0LFxuICBtYWtlUmVjb3JkZXIsXG4pID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3Qge1xuICAgIGJyYW5kSW4sXG4gICAgYnJhbmRPdXQsXG4gICAgbWF4U3VibWlzc2lvbkNvdW50LFxuICAgIG1heFN1Ym1pc3Npb25WYWx1ZSxcbiAgICBtaW5TdWJtaXNzaW9uQ291bnQsXG4gICAgbWluU3VibWlzc2lvblZhbHVlLFxuICAgIHJlc3RhcnREZWxheSxcbiAgICB0aW1lb3V0LFxuXG4gICAgdW5pdEFtb3VudEluID0gQW1vdW50TWF0aC5tYWtlKGJyYW5kSW4sIDFuKSxcbiAgfSA9IHpjZi5nZXRUZXJtcygpO1xuXG4gIGFzc2VydEFsbERlZmluZWQoe1xuICAgIGJyYW5kSW4sXG4gICAgYnJhbmRPdXQsXG4gICAgbWF4U3VibWlzc2lvbkNvdW50LFxuICAgIG1heFN1Ym1pc3Npb25WYWx1ZSxcbiAgICBtaW5TdWJtaXNzaW9uQ291bnQsXG4gICAgbWluU3VibWlzc2lvblZhbHVlLFxuICAgIHJlc3RhcnREZWxheSxcbiAgICB0aW1lb3V0LFxuICAgIHVuaXRBbW91bnRJbixcbiAgfSk7XG5cbiAgY29uc3QgbWFrZVJvdW5kc01hbmFnZXJLaXQgPSBwcmVwYXJlUm91bmRzTWFuYWdlcktpdChiYWdnYWdlKTtcbiAgY29uc3QgbWFrZU9yYWNsZUFkbWluS2l0ID0gcHJlcGFyZU9yYWNsZUFkbWluS2l0KGJhZ2dhZ2UpO1xuXG4gIGNvbnN0IG1ha2VSZWNvcmRlcktpdCA9IGRlZmluZVJlY29yZGVyS2l0KHtcbiAgICBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQsXG4gICAgbWFrZVJlY29yZGVyLFxuICB9KTtcblxuICAvL1xuXG4gIGNvbnN0IHsgYW5zd2VyS2l0LCBsYXRlc3RSb3VuZEtpdCwgcHJpY2VLaXQgfSA9IGF3YWl0IHByb3ZpZGVBbGwoYmFnZ2FnZSwge1xuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGFuc3dlcktpdDogKCkgPT4gbWFrZUR1cmFibGVQdWJsaXNoS2l0KCksXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHByaWNlS2l0OiAoKSA9PlxuICAgICAgbWFrZVJlY29yZGVyS2l0KFxuICAgICAgICBzdG9yYWdlTm9kZSxcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChNLmFueSgpKSxcbiAgICAgICksXG4gICAgbGF0ZXN0Um91bmRLaXQ6ICgpID0+XG4gICAgICBFLndoZW4oRShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZSgnbGF0ZXN0Um91bmQnKSwgbm9kZSA9PlxuICAgICAgICBtYWtlUmVjb3JkZXJLaXQoXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICAvKlxuXG4gICAgICAgICAgICovIChNLmFueSgpKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gIH0pO1xuXG4gIGNvbnN0IHsgcm91bmRzTWFuYWdlcktpdCB9ID0gYXdhaXQgcHJvdmlkZUFsbChiYWdnYWdlLCB7XG4gICAgcm91bmRzTWFuYWdlcktpdDogKCkgPT5cbiAgICAgIG1ha2VSb3VuZHNNYW5hZ2VyS2l0KFxuICAgICAgICBoYXJkZW4oe1xuICAgICAgICAgIGFuc3dlclB1Ymxpc2hlcjogYW5zd2VyS2l0LnB1Ymxpc2hlcixcbiAgICAgICAgICBicmFuZEluLFxuICAgICAgICAgIGJyYW5kT3V0LFxuICAgICAgICAgIGxhdGVzdFJvdW5kUHVibGlzaGVyOiBsYXRlc3RSb3VuZEtpdC5yZWNvcmRlcixcbiAgICAgICAgICBtaW5TdWJtaXNzaW9uQ291bnQsXG4gICAgICAgICAgbWF4U3VibWlzc2lvbkNvdW50LFxuICAgICAgICAgIG1pblN1Ym1pc3Npb25WYWx1ZSxcbiAgICAgICAgICBtYXhTdWJtaXNzaW9uVmFsdWUsXG4gICAgICAgICAgcXVvdGVLaXQsXG4gICAgICAgICAgcmVzdGFydERlbGF5LFxuICAgICAgICAgIHRpbWVyUHJlc2VuY2UsXG4gICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICB1bml0QW1vdW50SW4sXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgfSk7XG5cbiAgLy9cbiAgY29uc3QgeyBwcmljZUF1dGhvcml0eSB9ID0gbWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0KHtcbiAgICBjcmVhdGVRdW90ZTogcm91bmRzTWFuYWdlcktpdC5jb250cmFjdC5tYWtlQ3JlYXRlUXVvdGUoKSxcbiAgICBub3RpZmllcjogbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIoYW5zd2VyS2l0LnN1YnNjcmliZXIpLFxuICAgIHF1b3RlSXNzdWVyOiBxdW90ZUtpdC5pc3N1ZXIsXG4gICAgdGltZXI6IHRpbWVyUHJlc2VuY2UsXG4gICAgYWN0dWFsQnJhbmRJbjogYnJhbmRJbixcbiAgICBhY3R1YWxCcmFuZE91dDogYnJhbmRPdXQsXG4gIH0pO1xuXG4gIC8vXG4gIHZvaWQgb2JzZXJ2ZU5vdGlmaWVyKFxuICAgIHByaWNlQXV0aG9yaXR5Lm1ha2VRdW90ZU5vdGlmaWVyKHVuaXRBbW91bnRJbiwgYnJhbmRPdXQpLFxuICAgIHtcbiAgICAgIHVwZGF0ZVN0YXRlOiBxdW90ZSA9PiB7XG4gICAgICAgIHRyYWNlKCduZXcgcXVvdGUnLCBxdW90ZSk7XG4gICAgICAgIHZvaWQgcHJpY2VLaXQucmVjb3JkZXIud3JpdGUocHJpY2VEZXNjcmlwdGlvbkZyb21RdW90ZShxdW90ZSkpO1xuICAgICAgfSxcbiAgICAgIGZhaWw6IHJlYXNvbiA9PiB7XG4gICAgICAgIHRocm93IEVycm9yKGBwcmljZUF1dGhvcml0eSBvYnNlcnZlciBmYWlsZWQ6ICR7cmVhc29ufWApO1xuICAgICAgfSxcbiAgICAgIGZpbmlzaDogZG9uZSA9PiB7XG4gICAgICAgIHRocm93IEVycm9yKGBwcmljZUF1dGhvcml0eSBvYnNlcnZlciBkaWVkOiAke2RvbmV9YCk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgY29uc3QgbWFrZUZsdXhBZ2dyZWdhdG9yS2l0ID0gcHJlcGFyZUV4b0NsYXNzS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ2ZsdXhBZ2dyZWdhdG9yJyxcbiAgICB7XG4gICAgICBjcmVhdG9yOiBNLmludGVyZmFjZSgnZmx1eEFnZ3JlZ2F0b3IgY3JlYXRvckZhY2V0Jywge30sIHsgc2xvcHB5OiB0cnVlIH0pLFxuICAgICAgcHVibGljOiBNLmludGVyZmFjZSgnZmx1eEFnZ3JlZ2F0b3IgcHVibGljRmFjZXQnLCB7XG4gICAgICAgIGdldFByaWNlQXV0aG9yaXR5OiBNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuICAgICAgICBnZXRQdWJsaWNUb3BpY3M6IE0uY2FsbCgpLnJldHVybnMoe1xuICAgICAgICAgIHF1b3RlczogTS5hbnkoKSxcbiAgICAgICAgICBsYXRlc3RSb3VuZDogTS5hbnkoKSxcbiAgICAgICAgfSksXG4gICAgICB9KSxcbiAgICB9LFxuICAgICgpID0+IHtcbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3Qgb3JhY2xlcyA9IG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnb3JhY2xlcycsIHtcbiAgICAgICAgZHVyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgb3JhY2xlcyB9O1xuICAgIH0sXG4gICAge1xuICAgICAgY3JlYXRvcjoge1xuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIG1ha2VPcmFjbGVJbnZpdGF0aW9uKG9yYWNsZUlkKSB7XG4gICAgICAgICAgY29uc3QgeyBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgdHJhY2UoJ21ha2VPcmFjbGVJbnZpdGF0aW9uJywgb3JhY2xlSWQpO1xuICAgICAgICAgIC8qXG5cblxuXG5cblxuXG4gICAgICAgICAgICovXG4gICAgICAgICAgY29uc3Qgb2ZmZXJIYW5kbGVyID0gYXN5bmMgc2VhdCA9PiB7XG4gICAgICAgICAgICBzZWF0LmV4aXQoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgb3JhY2xlIH0gPSBhd2FpdCBmYWNldHMuY3JlYXRvci5pbml0T3JhY2xlKG9yYWNsZUlkKTtcbiAgICAgICAgICAgIGNvbnN0IGludml0YXRpb25NYWtlcnMgPSBGYXIoJ2ludml0YXRpb24gbWFrZXJzJywge1xuICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICBQdXNoUHJpY2UocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHpjZi5tYWtlSW52aXRhdGlvbihcbiAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICBhc3luYyBjU2VhdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNTZWF0LmV4aXQoKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb3JhY2xlLnB1c2hQcmljZShyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICdQdXNoUHJpY2UnLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgICAgICAgIGludml0YXRpb25NYWtlcnMsXG4gICAgICAgICAgICAgIG9yYWNsZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICByZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKG9mZmVySGFuZGxlciwgSU5WSVRBVElPTl9NQUtFUlNfREVTQyk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcmVtb3ZlT3JhY2xlKG9yYWNsZUlkKSB7XG4gICAgICAgICAgY29uc3QgeyBvcmFjbGVzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIHRyYWNlKCdkZWxldGVPcmFjbGUnLCBvcmFjbGVJZCk7XG4gICAgICAgICAgY29uc3Qga2l0ID0gb3JhY2xlcy5nZXQob3JhY2xlSWQpO1xuICAgICAgICAgIGtpdC5hZG1pbi5kaXNhYmxlKCk7XG4gICAgICAgICAgb3JhY2xlcy5kZWxldGUob3JhY2xlSWQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldFJvdW5kRGF0YTogcm91bmRJZFJhdyA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJvdW5kc01hbmFnZXJLaXQuY29udHJhY3QuZ2V0Um91bmREYXRhKHJvdW5kSWRSYXcpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5pdE9yYWNsZShvcmFjbGVJZCkge1xuICAgICAgICAgIGNvbnN0IHsgb3JhY2xlcyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICB0cmFjZSgnaW5pdE9yYWNsZScsIG9yYWNsZUlkKTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKG9yYWNsZUlkLCAnc3RyaW5nJyk7XG5cbiAgICAgICAgICBjb25zdCBvcmFjbGVLaXQgPSBtYWtlT3JhY2xlQWRtaW5LaXQoXG4gICAgICAgICAgICBoYXJkZW4oe1xuICAgICAgICAgICAgICBtaW5TdWJtaXNzaW9uVmFsdWUsXG4gICAgICAgICAgICAgIG1heFN1Ym1pc3Npb25WYWx1ZSxcbiAgICAgICAgICAgICAgb3JhY2xlSWQsIC8vXG4gICAgICAgICAgICAgIHJvdW5kUG93ZXJzOiByb3VuZHNNYW5hZ2VyS2l0Lm9yYWNsZSxcbiAgICAgICAgICAgICAgdGltZXI6IHRpbWVyUHJlc2VuY2UsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICAgIG9yYWNsZXMuaW5pdChvcmFjbGVJZCwgb3JhY2xlS2l0KTtcblxuICAgICAgICAgIHJldHVybiBvcmFjbGVLaXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgb3JhY2xlUm91bmRTdGF0ZShvcmFjbGVJZCwgcXVlcmllZFJvdW5kSWQpIHtcbiAgICAgICAgICBjb25zdCB7IG9yYWNsZXMgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgYmxvY2tUaW1lc3RhbXAgPSBhd2FpdCBFKHRpbWVyUHJlc2VuY2UpLmdldEN1cnJlbnRUaW1lc3RhbXAoKTtcbiAgICAgICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBFKG9yYWNsZXMuZ2V0KG9yYWNsZUlkKS5vcmFjbGUpLmdldFN0YXR1cygpO1xuXG4gICAgICAgICAgY29uc3Qgb3JhY2xlQ291bnQgPSBvcmFjbGVzLmdldFNpemUoKTtcblxuICAgICAgICAgIGNvbnN0IHsgY29udHJhY3QgfSA9IHJvdW5kc01hbmFnZXJLaXQ7XG4gICAgICAgICAgaWYgKHF1ZXJpZWRSb3VuZElkID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgcm91bmRTdGF0dXMgPSBjb250cmFjdC5nZXRSb3VuZFN0YXR1cyhxdWVyaWVkUm91bmRJZCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBlbGlnaWJsZUZvclNwZWNpZmljUm91bmQ6IGNvbnRyYWN0LmVsaWdpYmxlRm9yU3BlY2lmaWNSb3VuZChcbiAgICAgICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICAgICAgcXVlcmllZFJvdW5kSWQsXG4gICAgICAgICAgICAgICAgYmxvY2tUaW1lc3RhbXAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHF1ZXJpZWRSb3VuZElkLFxuICAgICAgICAgICAgICBsYXRlc3RTdWJtaXNzaW9uOiBzdGF0dXMubGF0ZXN0U3VibWlzc2lvbixcbiAgICAgICAgICAgICAgc3RhcnRlZEF0OiByb3VuZFN0YXR1cy5zdGFydGVkQXQsXG4gICAgICAgICAgICAgIHJvdW5kVGltZW91dDogcm91bmRTdGF0dXMucm91bmRUaW1lb3V0LFxuICAgICAgICAgICAgICBvcmFjbGVDb3VudCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmNvbnRyYWN0Lm9yYWNsZVJvdW5kU3RhdGVTdWdnZXN0Um91bmQoc3RhdHVzLCBibG9ja1RpbWVzdGFtcCksXG4gICAgICAgICAgICAgIG9yYWNsZUNvdW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgcHVibGljOiB7XG4gICAgICAgIGdldFByaWNlQXV0aG9yaXR5KCkge1xuICAgICAgICAgIHJldHVybiBwcmljZUF1dGhvcml0eTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0UHVibGljVG9waWNzKCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBxdW90ZXM6IG1ha2VSZWNvcmRlclRvcGljKFxuICAgICAgICAgICAgICAnUXVvdGVzIGZyb20gdGhpcyBwcmljZSBhZ2dyZWdhdG9yJyxcbiAgICAgICAgICAgICAgcHJpY2VLaXQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbGF0ZXN0Um91bmQ6IG1ha2VSZWNvcmRlclRvcGljKFxuICAgICAgICAgICAgICAnTm90aWZpY2F0aW9uIG9mIGVhY2ggcm91bmQnLFxuICAgICAgICAgICAgICBsYXRlc3RSb3VuZEtpdCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICByZXR1cm4gbWFrZUZsdXhBZ2dyZWdhdG9yS2l0O1xufTskaM2PX29uY2UucHJlcGFyZUZsdXhBZ2dyZWdhdG9yS2l0KHByZXBhcmVGbHV4QWdncmVnYXRvcktpdCk7XG5oYXJkZW4ocHJlcGFyZUZsdXhBZ2dyZWdhdG9yS2l0KTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IklOVklUQVRJT05fTUFLRVJTX0RFU0MiOlsiSU5WSVRBVElPTl9NQUtFUlNfREVTQyJdLCJwcmVwYXJlRmx1eEFnZ3JlZ2F0b3JLaXQiOlsicHJlcGFyZUZsdXhBZ2dyZWdhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIfpezcSDgAAEg4AADoAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ByaWNlL3ByaWNlT3JhY2xlS2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsiSU5WSVRBVElPTl9NQUtFUlNfREVTQyIsInByZXBhcmVPcmFjbGVBZG1pbktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbWFrZVRyYWNlcixNLHByZXBhcmVFeG9DbGFzc0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJtYWtlVHJhY2VyXCIsWyRozY9fYSA9PiAobWFrZVRyYWNlciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5jb25zdCB0cmFjZSA9IG1ha2VUcmFjZXIoJ09yS2l0JywgdHJ1ZSk7XG5cbiAgICAgICBjb25zdCBJTlZJVEFUSU9OX01BS0VSU19ERVNDID0gJ29yYWNsZSBpbnZpdGF0aW9uJztcblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbi8qXG5cblxuXG4gKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuICovJGjNj19vbmNlLklOVklUQVRJT05fTUFLRVJTX0RFU0MoSU5WSVRBVElPTl9NQUtFUlNfREVTQyk7XG5jb25zdCBpbml0U3RhdGUgPSAoeyBvcmFjbGVJZCwgcm91bmRQb3dlcnMgfSkgPT4ge1xuICByZXR1cm4ge1xuICAgIG9yYWNsZUlkLFxuICAgIHJvdW5kUG93ZXJzLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBsYXN0UmVwb3J0ZWRSb3VuZDogMG4sXG4gICAgbGFzdFN0YXJ0ZWRSb3VuZDogMG4sXG4gICAgbGF0ZXN0U3VibWlzc2lvbjogMG4sXG4gIH07XG59O1xuXG5jb25zdCBBZG1pbkkgPSBNLmludGVyZmFjZSgnT3JhY2xlS2l0QWRtaW4nLCB7XG4gIGRpc2FibGU6IE0uY2FsbCgpLnJldHVybnMoKSxcbn0pO1xuXG5jb25zdCBPcmFjbGVJID0gTS5pbnRlcmZhY2UoJ09yYWNsZScsIHtcbiAgcHVzaFByaWNlOiBNLmNhbGwoXG4gICAgTS5zcGxpdFJlY29yZChcbiAgICAgIHsgdW5pdFByaWNlOiBNLmJpZ2ludCgpIH0sXG4gICAgICB7IHJvdW5kSWQ6IE0ub3IoTS5iaWdpbnQoKSwgTS5udW1iZXIoKSkgfSxcbiAgICApLFxuICApLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRTdGF0dXM6IE0uY2FsbCgpLnJldHVybnMoTS5yZWNvcmQoKSksXG59KTtcblxuICAgICAgIGNvbnN0IHByZXBhcmVPcmFjbGVBZG1pbktpdCA9IGJhZ2dhZ2UgPT5cbiAgcHJlcGFyZUV4b0NsYXNzS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ09yYWNsZUtpdCcsXG4gICAgeyBhZG1pbjogQWRtaW5JLCBvcmFjbGU6IE9yYWNsZUkgfSxcbiAgICBpbml0U3RhdGUsXG4gICAge1xuICAgICAgYWRtaW46IHtcbiAgICAgICAgZGlzYWJsZSgpIHtcbiAgICAgICAgICB0cmFjZShgb3JhY2xlICR7dGhpcy5zdGF0ZS5vcmFjbGVJZH0gZGlzYWJsZWRgKTtcbiAgICAgICAgICB0aGlzLnN0YXRlLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvcmFjbGU6IHtcbiAgICAgICAgLypcblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHB1c2hQcmljZSh7XG4gICAgICAgICAgcm91bmRJZDogcm91bmRJZFJhdyA9IHVuZGVmaW5lZCxcbiAgICAgICAgICB1bml0UHJpY2U6IHZhbHVlUmF3LFxuICAgICAgICB9KSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICAhc3RhdGUuZGlzYWJsZWQgfHwgRmFpbGBwdXNoUHJpY2UgZm9yIGRpc2FibGVkIG9yYWNsZWA7XG4gICAgICAgICAgY29uc3QgeyByb3VuZFBvd2VycyB9ID0gc3RhdGU7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcm91bmRQb3dlcnMuaGFuZGxlUHVzaChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgb3JhY2xlSWQ6IHN0YXRlLm9yYWNsZUlkLFxuICAgICAgICAgICAgICBsYXN0UmVwb3J0ZWRSb3VuZDogc3RhdGUubGFzdFJlcG9ydGVkUm91bmQsXG4gICAgICAgICAgICAgIGxhc3RTdGFydGVkUm91bmQ6IHN0YXRlLmxhc3RTdGFydGVkUm91bmQsXG4gICAgICAgICAgICAgIGxhdGVzdFN1Ym1pc3Npb246IHN0YXRlLmxhdGVzdFN1Ym1pc3Npb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICByb3VuZElkOiByb3VuZElkUmF3LFxuICAgICAgICAgICAgICB1bml0UHJpY2U6IHZhbHVlUmF3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc3RhdGUubGFzdFJlcG9ydGVkUm91bmQgPSByZXN1bHQubGFzdFJlcG9ydGVkUm91bmQ7XG4gICAgICAgICAgc3RhdGUubGFzdFN0YXJ0ZWRSb3VuZCA9IHJlc3VsdC5sYXN0U3RhcnRlZFJvdW5kO1xuICAgICAgICAgIHN0YXRlLmxhdGVzdFN1Ym1pc3Npb24gPSByZXN1bHQubGF0ZXN0U3VibWlzc2lvbjtcbiAgICAgICAgfSxcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgIGdldFN0YXR1cygpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcmFjbGVJZDogc3RhdGUub3JhY2xlSWQsXG4gICAgICAgICAgICBkaXNhYmxlZDogc3RhdGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBsYXN0UmVwb3J0ZWRSb3VuZDogc3RhdGUubGFzdFJlcG9ydGVkUm91bmQsXG4gICAgICAgICAgICBsYXN0U3RhcnRlZFJvdW5kOiBzdGF0ZS5sYXN0U3RhcnRlZFJvdW5kLFxuICAgICAgICAgICAgbGF0ZXN0U3VibWlzc2lvbjogc3RhdGUubGF0ZXN0U3VibWlzc2lvbixcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wcmVwYXJlT3JhY2xlQWRtaW5LaXQocHJlcGFyZU9yYWNsZUFkbWluS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IklOVklUQVRJT05fTUFLRVJTX0RFU0MiOlsiSU5WSVRBVElPTl9NQUtFUlNfREVTQyJdLCJwcmVwYXJlT3JhY2xlQWRtaW5LaXQiOlsicHJlcGFyZU9yYWNsZUFkbWluS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADUbIb2kVwAApFcAADkAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ByaWNlL3JvdW5kc01hbmFnZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvdGltZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9uYXQiLCJAYWdvcmljL2ludGVybmFsL3NyYy90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiUk9VTkRfTUFYIiwicHJlcGFyZVJvdW5kc01hbmFnZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsQW1vdW50TWF0aCxtYWtlVHJhY2VyLFRpbWVNYXRoLFRpbWVzdGFtcFNoYXBlLE0sbWFrZVNjYWxhckJpZ01hcFN0b3JlLHByZXBhcmVFeG9DbGFzc0tpdCxjYWxjdWxhdGVNZWRpYW4sbmF0U2FmZU1hdGgsRSxGYXIsaXNOYXQsTmF0LFVuZ3VhcmRlZEhlbHBlckk7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lTWF0aFwiLFskaM2PX2EgPT4gKFRpbWVNYXRoID0gJGjNj19hKV1dLFtcIlRpbWVzdGFtcFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wiY2FsY3VsYXRlTWVkaWFuXCIsWyRozY9fYSA9PiAoY2FsY3VsYXRlTWVkaWFuID0gJGjNj19hKV1dLFtcIm5hdFNhZmVNYXRoXCIsWyRozY9fYSA9PiAobmF0U2FmZU1hdGggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiaXNOYXRcIixbJGjNj19hID0+IChpc05hdCA9ICRozY9fYSldXSxbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJVbmd1YXJkZWRIZWxwZXJJXCIsWyRozY9fYSA9PiAoVW5ndWFyZGVkSGVscGVySSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgYWRkLCBzdWJ0cmFjdCwgbXVsdGlwbHksIGZsb29yRGl2aWRlLCBjZWlsRGl2aWRlLCBpc0dURSB9ID0gbmF0U2FmZU1hdGg7XG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IFYzX05PX0RBVEFfRVJST1IgPSAnTm8gZGF0YSBwcmVzZW50JztcblxuLyogICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgUk9VTkRfTUFYID0gQmlnSW50KDIgKiogMzIgLSAxKTskaM2PX29uY2UuUk9VTkRfTUFYKFJPVU5EX01BWCk7XG5cbmNvbnN0IHRyYWNlID0gbWFrZVRyYWNlcignUm91bmRzTScsIHRydWUpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHZhbGlkUm91bmRJZCA9IHJvdW5kSWQgPT4ge1xuICByZXR1cm4gcm91bmRJZCA8PSBST1VORF9NQVg7XG59O1xuXG4vKlxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgY29uc3QgcHJlcGFyZVJvdW5kc01hbmFnZXJLaXQgPSBiYWdnYWdlID0+XG4gIHByZXBhcmVFeG9DbGFzc0tpdChcbiAgICBiYWdnYWdlLFxuICAgICdSb3VuZHNNYW5hZ2VyJyxcbiAgICB7XG4gICAgICBoZWxwZXI6IFVuZ3VhcmRlZEhlbHBlckksXG4gICAgICBjb250cmFjdDogTS5pbnRlcmZhY2UoJ2NvbnRyYWN0Jywge1xuICAgICAgICBhdXRoZW50aWNhdGVRdW90ZTogTS5jYWxsKFtNLnJlY29yZCgpXSkucmV0dXJucyhNLmFueSgpKSxcbiAgICAgICAgbWFrZUNyZWF0ZVF1b3RlOiBNLmNhbGwoKVxuICAgICAgICAgIC5vcHRpb25hbCh7XG4gICAgICAgICAgICBvdmVycmlkZVZhbHVlT3V0OiBNLm51bWJlcigpLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBUaW1lc3RhbXBTaGFwZSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5yZXR1cm5zKE0uYW55KCkpLFxuICAgICAgICBlbGlnaWJsZUZvclNwZWNpZmljUm91bmQ6IE0uY2FsbChcbiAgICAgICAgICBNLmFueSgpLFxuICAgICAgICAgIE0uYmlnaW50KCksXG4gICAgICAgICAgVGltZXN0YW1wU2hhcGUsXG4gICAgICAgICkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gICAgICAgIGdldFJvdW5kRGF0YTogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgICAgICBnZXRSb3VuZFN0YXR1czogTS5jYWxsKE0uYmlnaW50KCkpLnJldHVybnMoTS5yZWNvcmQoKSksXG4gICAgICAgIG9yYWNsZVJvdW5kU3RhdGVTdWdnZXN0Um91bmQ6IE0uY2FsbChNLmFueSgpLCBUaW1lc3RhbXBTaGFwZSkucmV0dXJucyhcbiAgICAgICAgICBNLnJlY29yZCgpLFxuICAgICAgICApLFxuICAgICAgfSksXG4gICAgICBvcmFjbGU6IE0uaW50ZXJmYWNlKCdvcmFjbGUnLCB7XG4gICAgICAgIGhhbmRsZVB1c2g6IE0uY2FsbChNLnJlY29yZCgpLCBNLnJlY29yZCgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgLypcblxuXG5cbiAgICAgKi9cbiAgICAoe1xuICAgICAgLy9cbiAgICAgIG1heFN1Ym1pc3Npb25Db3VudCxcbiAgICAgIG1pblN1Ym1pc3Npb25Db3VudCxcbiAgICAgIHJlc3RhcnREZWxheSxcbiAgICAgIG1pblN1Ym1pc3Npb25WYWx1ZSxcbiAgICAgIG1heFN1Ym1pc3Npb25WYWx1ZSxcbiAgICAgIHRpbWVvdXQsXG4gICAgICAvL1xuICAgICAgcXVvdGVLaXQsXG4gICAgICBhbnN3ZXJQdWJsaXNoZXIsXG4gICAgICBicmFuZEluLFxuICAgICAgYnJhbmRPdXQsXG4gICAgICBsYXRlc3RSb3VuZFB1Ymxpc2hlcixcbiAgICAgIHRpbWVyUHJlc2VuY2UsXG4gICAgICAvL1xuICAgICAgdW5pdEFtb3VudEluLFxuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IHVuaXRJbiA9IEFtb3VudE1hdGguZ2V0VmFsdWUoYnJhbmRJbiwgdW5pdEFtb3VudEluKTtcblxuICAgICAgY29uc3Qgcm91bmRzID0gbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdyb3VuZHMnLCB7IGR1cmFibGU6IHRydWUgfSk7XG5cbiAgICAgIGNvbnN0IGRldGFpbHMgPSBtYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ2RldGFpbHMnLCB7IGR1cmFibGU6IHRydWUgfSk7XG5cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCBpbW11dGFibGUgPSB7XG4gICAgICAgIC8vXG4gICAgICAgIG1heFN1Ym1pc3Npb25Db3VudCxcbiAgICAgICAgbWluU3VibWlzc2lvbkNvdW50LFxuICAgICAgICByZXN0YXJ0RGVsYXksXG4gICAgICAgIG1pblN1Ym1pc3Npb25WYWx1ZSxcbiAgICAgICAgbWF4U3VibWlzc2lvblZhbHVlLFxuICAgICAgICB0aW1lb3V0LFxuICAgICAgICAvL1xuICAgICAgICBxdW90ZUtpdCxcbiAgICAgICAgYW5zd2VyUHVibGlzaGVyLFxuICAgICAgICBicmFuZEluLFxuICAgICAgICBicmFuZE91dCxcbiAgICAgICAgbGF0ZXN0Um91bmRQdWJsaXNoZXIsXG4gICAgICAgIHRpbWVyUHJlc2VuY2UsXG4gICAgICAgIC8vXG4gICAgICAgIGRldGFpbHMsXG4gICAgICAgIHJvdW5kcyxcbiAgICAgICAgdW5pdEluLFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgcm91bmRJZCA9IDBuO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5pbW11dGFibGUsXG4gICAgICAgIGxhc3RWYWx1ZU91dEZvclVuaXRJbjogbnVsbCxcbiAgICAgICAgcmVwb3J0aW5nUm91bmRJZDogcm91bmRJZCxcbiAgICAgIH07XG4gICAgfSxcbiAgICB7XG4gICAgICBoZWxwZXI6IHtcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgIGFjY2VwdGluZ1N1Ym1pc3Npb25zKHJvdW5kSWQpIHtcbiAgICAgICAgICBjb25zdCB7IGRldGFpbHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGRldGFpbHMuaGFzKHJvdW5kSWQpICYmIGRldGFpbHMuZ2V0KHJvdW5kSWQpLm1heFN1Ym1pc3Npb25zICE9PSAwXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKlxuXG5cbiAgICAgICAgICovXG4gICAgICAgIGRlbGF5ZWQoc3RhdHVzLCByb3VuZElkKSB7XG4gICAgICAgICAgY29uc3QgeyByZXN0YXJ0RGVsYXkgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgbGFzdFN0YXJ0ZWQgPSBzdGF0dXMubGFzdFN0YXJ0ZWRSb3VuZDtcbiAgICAgICAgICByZXR1cm4gcm91bmRJZCA+IGFkZChsYXN0U3RhcnRlZCwgcmVzdGFydERlbGF5KSB8fCBsYXN0U3RhcnRlZCA9PT0gMG47XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgIGRlbGV0ZVJvdW5kRGV0YWlscyhyb3VuZElkKSB7XG4gICAgICAgICAgY29uc3QgeyBkZXRhaWxzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IHJvdW5kRGV0YWlscyA9IGRldGFpbHMuZ2V0KHJvdW5kSWQpO1xuICAgICAgICAgIGlmIChyb3VuZERldGFpbHMuc3VibWlzc2lvbnMubGVuZ3RoIDwgcm91bmREZXRhaWxzLm1heFN1Ym1pc3Npb25zKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIGRldGFpbHMuZGVsZXRlKHJvdW5kSWQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICBpc05leHRSb3VuZChyb3VuZElkKSB7XG4gICAgICAgICAgY29uc3QgeyByZXBvcnRpbmdSb3VuZElkIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIHJldHVybiByb3VuZElkID09PSBhZGQocmVwb3J0aW5nUm91bmRJZCwgMSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLypcblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIGluaXRpYWxpemVOZXdSb3VuZChyb3VuZElkLCBibG9ja1RpbWVzdGFtcCwgb3JhY2xlSWQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBkZXRhaWxzLFxuICAgICAgICAgICAgbGF0ZXN0Um91bmRQdWJsaXNoZXIsXG4gICAgICAgICAgICBtaW5TdWJtaXNzaW9uQ291bnQsXG4gICAgICAgICAgICBtYXhTdWJtaXNzaW9uQ291bnQsXG4gICAgICAgICAgICByb3VuZHMsXG4gICAgICAgICAgICB0aW1lb3V0LFxuICAgICAgICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICBoZWxwZXIuaXNOZXh0Um91bmQocm91bmRJZCkgfHwgRmFpbGBSb3VuZCAke3JvdW5kSWR9IGFscmVhZHkgc3RhcnRlZGA7XG5cbiAgICAgICAgICBoZWxwZXIudXBkYXRlVGltZWRPdXRSb3VuZEluZm8oc3VidHJhY3Qocm91bmRJZCwgMSksIGJsb2NrVGltZXN0YW1wKTtcblxuICAgICAgICAgIHRoaXMuc3RhdGUucmVwb3J0aW5nUm91bmRJZCA9IHJvdW5kSWQ7XG5cbiAgICAgICAgICBkZXRhaWxzLmluaXQoXG4gICAgICAgICAgICByb3VuZElkLFxuICAgICAgICAgICAgaGFyZGVuKHtcbiAgICAgICAgICAgICAgc3VibWlzc2lvbnM6IFtdLFxuICAgICAgICAgICAgICBtYXhTdWJtaXNzaW9uczogbWF4U3VibWlzc2lvbkNvdW50LFxuICAgICAgICAgICAgICBtaW5TdWJtaXNzaW9uczogbWluU3VibWlzc2lvbkNvdW50LFxuICAgICAgICAgICAgICByb3VuZFRpbWVvdXQ6IHRpbWVvdXQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3Qgcm91bmQgPSBoYXJkZW4oe1xuICAgICAgICAgICAgYW5zd2VyOiAwbixcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogYmxvY2tUaW1lc3RhbXAsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IDBuLFxuICAgICAgICAgICAgYW5zd2VyZWRJblJvdW5kOiAwbixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByb3VuZHMuaW5pdChyb3VuZElkLCByb3VuZCk7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHZvaWQgbGF0ZXN0Um91bmRQdWJsaXNoZXIud3JpdGUoe1xuICAgICAgICAgICAgcm91bmRJZCxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogcm91bmQuc3RhcnRlZEF0LFxuICAgICAgICAgICAgc3RhcnRlZEJ5OiBvcmFjbGVJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKlxuXG5cbiAgICAgICAgICovXG4gICAgICAgIHByZXZpb3VzQW5kQ3VycmVudFVuYW5zd2VyZWQocm91bmRJZCwgcnJJZCkge1xuICAgICAgICAgIGNvbnN0IHsgcm91bmRzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIHJldHVybiBhZGQocm91bmRJZCwgMSkgPT09IHJySWQgJiYgcm91bmRzLmdldChycklkKS51cGRhdGVkQXQgPT09IDBuO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIHByb3Bvc2VOZXdSb3VuZChyb3VuZElkLCBzdGF0dXMsIGJsb2NrVGltZXN0YW1wKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGlmICghaGVscGVyLmlzTmV4dFJvdW5kKHJvdW5kSWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IHsgcmVzdGFydERlbGF5IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IGxhc3RTdGFydGVkID0gc3RhdHVzLmxhc3RTdGFydGVkUm91bmQ7IC8vXG4gICAgICAgICAgaWYgKHJvdW5kSWQgPD0gYWRkKGxhc3RTdGFydGVkLCByZXN0YXJ0RGVsYXkpICYmIGxhc3RTdGFydGVkICE9PSAwbilcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgaGVscGVyLmluaXRpYWxpemVOZXdSb3VuZChyb3VuZElkLCBibG9ja1RpbWVzdGFtcCwgc3RhdHVzLm9yYWNsZUlkKTtcblxuICAgICAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICAgICAgLi4uc3RhdHVzLFxuICAgICAgICAgICAgbGFzdFN0YXJ0ZWRSb3VuZDogcm91bmRJZCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKlxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICByZWNvcmRTdWJtaXNzaW9uKHN1Ym1pc3Npb24sIHJvdW5kSWQsIHN0YXR1cykge1xuICAgICAgICAgIHRyYWNlKCdyZWNvcmRTdWJtaXNzaW9uJywgc3VibWlzc2lvbiwgcm91bmRJZCwgc3RhdHVzKTtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgY29uc3QgeyBkZXRhaWxzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGhlbHBlci5hY2NlcHRpbmdTdWJtaXNzaW9ucyhyb3VuZElkKSB8fFxuICAgICAgICAgICAgRmFpbGByb3VuZCAke3EoXG4gICAgICAgICAgICAgIE51bWJlcihyb3VuZElkKSxcbiAgICAgICAgICAgICl9IG5vdCBhY2NlcHRpbmcgc3VibWlzc2lvbnMgZnJvbSBvcmFjbGUgJHtxKHN0YXR1cy5vcmFjbGVJZCl9YDtcblxuICAgICAgICAgIGNvbnN0IGxhc3RSb3VuZERldGFpbHMgPSBkZXRhaWxzLmdldChyb3VuZElkKTtcbiAgICAgICAgICBkZXRhaWxzLnNldChyb3VuZElkLCB7XG4gICAgICAgICAgICAuLi5sYXN0Um91bmREZXRhaWxzLFxuICAgICAgICAgICAgc3VibWlzc2lvbnM6IFsuLi5sYXN0Um91bmREZXRhaWxzLnN1Ym1pc3Npb25zLCBzdWJtaXNzaW9uXSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5zdGF0dXMsXG4gICAgICAgICAgICBsYXN0UmVwb3J0ZWRSb3VuZDogcm91bmRJZCxcbiAgICAgICAgICAgIGxhdGVzdFN1Ym1pc3Npb246IHN1Ym1pc3Npb24sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKlxuXG5cbiAgICAgICAgICovXG4gICAgICAgIHN1cGVyc2VkYWJsZShyb3VuZElkLCBibG9ja1RpbWVzdGFtcCkge1xuICAgICAgICAgIGNvbnN0IHsgcm91bmRzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgcm91bmRzLmhhcyhyb3VuZElkKSAmJlxuICAgICAgICAgICAgKFRpbWVNYXRoLmFic1ZhbHVlKHJvdW5kcy5nZXQocm91bmRJZCkudXBkYXRlZEF0KSA+IDBuIHx8XG4gICAgICAgICAgICAgIGhlbHBlci50aW1lZE91dChyb3VuZElkLCBibG9ja1RpbWVzdGFtcCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLypcblxuXG4gICAgICAgICAqL1xuICAgICAgICB0aW1lZE91dChyb3VuZElkLCBibG9ja1RpbWVzdGFtcCkge1xuICAgICAgICAgIGNvbnN0IHsgZGV0YWlscywgcm91bmRzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGlmICghZGV0YWlscy5oYXMocm91bmRJZCkgfHwgIXJvdW5kcy5oYXMocm91bmRJZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzdGFydGVkQXQgPSByb3VuZHMuZ2V0KHJvdW5kSWQpLnN0YXJ0ZWRBdDtcbiAgICAgICAgICBjb25zdCByb3VuZFRpbWVvdXQgPSBkZXRhaWxzLmdldChyb3VuZElkKS5yb3VuZFRpbWVvdXQ7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3Qgcm91bmRUaW1lb3V0RHVyYXRpb24gPSBUaW1lTWF0aC5yZWxWYWx1ZShCaWdJbnQocm91bmRUaW1lb3V0KSk7XG4gICAgICAgICAgY29uc3Qgcm91bmRUaW1lZE91dCA9XG4gICAgICAgICAgICBUaW1lTWF0aC5hYnNWYWx1ZShzdGFydGVkQXQpID4gMG4gJiZcbiAgICAgICAgICAgIFRpbWVNYXRoLnJlbFZhbHVlKHJvdW5kVGltZW91dER1cmF0aW9uKSA+IDBuICYmXG4gICAgICAgICAgICBUaW1lTWF0aC5jb21wYXJlQWJzKFxuICAgICAgICAgICAgICBUaW1lTWF0aC5hZGRBYnNSZWwoc3RhcnRlZEF0LCByb3VuZFRpbWVvdXREdXJhdGlvbiksXG4gICAgICAgICAgICAgIGJsb2NrVGltZXN0YW1wLFxuICAgICAgICAgICAgKSA8IDA7XG5cbiAgICAgICAgICByZXR1cm4gcm91bmRUaW1lZE91dDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKlxuXG5cbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZVJvdW5kQW5zd2VyKHJvdW5kSWQsIGJsb2NrVGltZXN0YW1wKSB7XG4gICAgICAgICAgY29uc3QgeyBhbnN3ZXJQdWJsaXNoZXIsIGRldGFpbHMsIHJvdW5kcyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBjb25zdCByb3VuZERldGFpbHMgPSBkZXRhaWxzLmdldChyb3VuZElkKTtcbiAgICAgICAgICBpZiAocm91bmREZXRhaWxzLnN1Ym1pc3Npb25zLmxlbmd0aCA8IHJvdW5kRGV0YWlscy5taW5TdWJtaXNzaW9ucykge1xuICAgICAgICAgICAgcmV0dXJuIFtmYWxzZSwgMF07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBuZXdBbnN3ZXIgPSBjYWxjdWxhdGVNZWRpYW4oXG4gICAgICAgICAgICByb3VuZERldGFpbHMuc3VibWlzc2lvbnMuZmlsdGVyKFxuICAgICAgICAgICAgICBzYW1wbGUgPT4gaXNOYXQoc2FtcGxlKSAmJiBzYW1wbGUgPiAwbixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB7IGFkZCwgZGl2aWRlOiBmbG9vckRpdmlkZSwgaXNHVEUgfSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgYXNzZXJ0KG5ld0Fuc3dlciwgJ2luc3VmZmljaWVudCBzYW1wbGVzJyk7XG5cbiAgICAgICAgICByb3VuZHMuc2V0KHJvdW5kSWQsIHtcbiAgICAgICAgICAgIC4uLnJvdW5kcy5nZXQocm91bmRJZCksXG4gICAgICAgICAgICBhbnN3ZXI6IG5ld0Fuc3dlcixcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogYmxvY2tUaW1lc3RhbXAsXG4gICAgICAgICAgICBhbnN3ZXJlZEluUm91bmQ6IHJvdW5kSWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB0aGlzLnN0YXRlLmxhc3RWYWx1ZU91dEZvclVuaXRJbiA9IG5ld0Fuc3dlcjtcbiAgICAgICAgICBhbnN3ZXJQdWJsaXNoZXIucHVibGlzaCh1bmRlZmluZWQpO1xuXG4gICAgICAgICAgcmV0dXJuIFt0cnVlLCBuZXdBbnN3ZXJdO1xuICAgICAgICB9LFxuICAgICAgICAvKlxuXG5cbiAgICAgICAgICovXG4gICAgICAgIHVwZGF0ZVRpbWVkT3V0Um91bmRJbmZvKHJvdW5kSWQsIGJsb2NrVGltZXN0YW1wKSB7XG4gICAgICAgICAgY29uc3QgeyBkZXRhaWxzLCByb3VuZHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGlmIChyb3VuZElkID09PSAwbiB8fCByb3VuZElkID09PSAxbikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHJvdW5kVGltZWRPdXQgPSBoZWxwZXIudGltZWRPdXQocm91bmRJZCwgYmxvY2tUaW1lc3RhbXApO1xuICAgICAgICAgIGlmICghcm91bmRUaW1lZE91dCkgcmV0dXJuO1xuXG4gICAgICAgICAgY29uc3QgcHJldlJvdW5kID0gcm91bmRzLmdldChzdWJ0cmFjdChyb3VuZElkLCAxKSk7XG5cbiAgICAgICAgICByb3VuZHMuc2V0KHJvdW5kSWQsIHtcbiAgICAgICAgICAgIC4uLnJvdW5kcy5nZXQocm91bmRJZCksXG4gICAgICAgICAgICBhbnN3ZXI6IHByZXZSb3VuZC5hbnN3ZXIsXG4gICAgICAgICAgICBhbnN3ZXJlZEluUm91bmQ6IHByZXZSb3VuZC5hbnN3ZXJlZEluUm91bmQsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IGJsb2NrVGltZXN0YW1wLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgZGV0YWlscy5kZWxldGUocm91bmRJZCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLypcblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgdmFsaWRhdGVPcmFjbGVSb3VuZChzdGF0dXMsIHJvdW5kSWQsIGJsb2NrVGltZXN0YW1wKSB7XG4gICAgICAgICAgY29uc3QgeyByZXBvcnRpbmdSb3VuZElkIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcblxuICAgICAgICAgIGxldCBjYW5TdXBlcnNlZGUgPSB0cnVlO1xuICAgICAgICAgIGlmIChyb3VuZElkID4gMW4pIHtcbiAgICAgICAgICAgIGNhblN1cGVyc2VkZSA9IGhlbHBlci5zdXBlcnNlZGFibGUoXG4gICAgICAgICAgICAgIHN1YnRyYWN0KHJvdW5kSWQsIDEpLFxuICAgICAgICAgICAgICBibG9ja1RpbWVzdGFtcCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHN0YXR1cy5sYXN0UmVwb3J0ZWRSb3VuZCA+PSByb3VuZElkKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2Nhbm5vdCByZXBvcnQgb24gcHJldmlvdXMgcm91bmRzJztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICByb3VuZElkICE9PSByZXBvcnRpbmdSb3VuZElkICYmXG4gICAgICAgICAgICByb3VuZElkICE9PSBhZGQocmVwb3J0aW5nUm91bmRJZCwgMSkgJiZcbiAgICAgICAgICAgICFoZWxwZXIucHJldmlvdXNBbmRDdXJyZW50VW5hbnN3ZXJlZChyb3VuZElkLCByZXBvcnRpbmdSb3VuZElkKVxuICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiAnaW52YWxpZCByb3VuZCB0byByZXBvcnQnO1xuICAgICAgICAgIGlmIChyb3VuZElkICE9PSAxbiAmJiAhY2FuU3VwZXJzZWRlKVxuICAgICAgICAgICAgcmV0dXJuICdwcmV2aW91cyByb3VuZCBub3Qgc3VwZXJzZWRhYmxlJztcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjb250cmFjdDoge1xuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGF1dGhlbnRpY2F0ZVF1b3RlKHF1b3RlKSB7XG4gICAgICAgICAgY29uc3QgeyBxdW90ZUtpdCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBjb25zdCBxdW90ZUFtb3VudCA9IEFtb3VudE1hdGgubWFrZShxdW90ZUtpdC5icmFuZCwgaGFyZGVuKHF1b3RlKSk7XG4gICAgICAgICAgY29uc3QgcXVvdGVQYXltZW50ID0gYXdhaXQgRShxdW90ZUtpdC5taW50KS5taW50UGF5bWVudChxdW90ZUFtb3VudCk7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHF1b3RlQW1vdW50LCBxdW90ZVBheW1lbnQgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLypcblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIG1ha2VDcmVhdGVRdW90ZSh7IG92ZXJyaWRlVmFsdWVPdXQsIHRpbWVzdGFtcCB9ID0ge30pIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgYnJhbmRJbiwgYnJhbmRPdXQsIHRpbWVyUHJlc2VuY2UgfSA9IHN0YXRlO1xuICAgICAgICAgIGNvbnN0IHsgY29udHJhY3QgfSA9IHRoaXMuZmFjZXRzO1xuXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIHJldHVybiBGYXIoJ2NyZWF0ZVF1b3RlJywgcHJpY2VRdWVyeSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGxhc3RWYWx1ZU91dEZvclVuaXRJbiwgdW5pdEluIH0gPSBzdGF0ZTtcblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlT3V0Rm9yVW5pdEluID1cbiAgICAgICAgICAgICAgb3ZlcnJpZGVWYWx1ZU91dCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgPyBsYXN0VmFsdWVPdXRGb3JVbml0SW4gLy9cbiAgICAgICAgICAgICAgICA6IG92ZXJyaWRlVmFsdWVPdXQ7IC8vXG4gICAgICAgICAgICBpZiAodmFsdWVPdXRGb3JVbml0SW4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBjYWxjQW1vdW50T3V0ID0gYW1vdW50SW4gPT4ge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZUluID0gQW1vdW50TWF0aC5nZXRWYWx1ZShicmFuZEluLCBhbW91bnRJbik7XG4gICAgICAgICAgICAgIHJldHVybiBBbW91bnRNYXRoLm1ha2UoXG4gICAgICAgICAgICAgICAgYnJhbmRPdXQsXG4gICAgICAgICAgICAgICAgZmxvb3JEaXZpZGUobXVsdGlwbHkodmFsdWVJbiwgdmFsdWVPdXRGb3JVbml0SW4pLCB1bml0SW4pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBjYWxjQW1vdW50SW4gPSBhbW91bnRPdXQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZU91dCA9IEFtb3VudE1hdGguZ2V0VmFsdWUoYnJhbmRPdXQsIGFtb3VudE91dCk7XG4gICAgICAgICAgICAgIHJldHVybiBBbW91bnRNYXRoLm1ha2UoXG4gICAgICAgICAgICAgICAgYnJhbmRJbixcbiAgICAgICAgICAgICAgICBjZWlsRGl2aWRlKG11bHRpcGx5KHZhbHVlT3V0LCB1bml0SW4pLCB2YWx1ZU91dEZvclVuaXRJbiksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgY29uc3QgcXVvdGUgPSBwcmljZVF1ZXJ5KGNhbGNBbW91bnRPdXQsIGNhbGNBbW91bnRJbik7XG4gICAgICAgICAgICBpZiAoIXF1b3RlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgICAgYW1vdW50SW4sXG4gICAgICAgICAgICAgIGFtb3VudE91dCxcbiAgICAgICAgICAgICAgdGltZXN0YW1wOiB0aGVpclRpbWVzdGFtcCA9IHRpbWVzdGFtcCxcbiAgICAgICAgICAgIH0gPSBxdW90ZTtcbiAgICAgICAgICAgIEFtb3VudE1hdGguY29lcmNlKGJyYW5kSW4sIGFtb3VudEluKTtcbiAgICAgICAgICAgIEFtb3VudE1hdGguY29lcmNlKGJyYW5kT3V0LCBhbW91bnRPdXQpO1xuICAgICAgICAgICAgaWYgKHRoZWlyVGltZXN0YW1wICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbnRyYWN0LmF1dGhlbnRpY2F0ZVF1b3RlKFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBhbW91bnRJbixcbiAgICAgICAgICAgICAgICAgIGFtb3VudE91dCxcbiAgICAgICAgICAgICAgICAgIHRpbWVyOiB0aW1lclByZXNlbmNlLFxuICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiB0aGVpclRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBFKHRpbWVyUHJlc2VuY2UpXG4gICAgICAgICAgICAgIC5nZXRDdXJyZW50VGltZXN0YW1wKClcbiAgICAgICAgICAgICAgLnRoZW4obm93ID0+XG4gICAgICAgICAgICAgICAgY29udHJhY3QuYXV0aGVudGljYXRlUXVvdGUoW1xuICAgICAgICAgICAgICAgICAgeyBhbW91bnRJbiwgYW1vdW50T3V0LCB0aW1lcjogdGltZXJQcmVzZW5jZSwgdGltZXN0YW1wOiBub3cgfSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKlxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgZWxpZ2libGVGb3JTcGVjaWZpY1JvdW5kKHN0YXR1cywgcXVlcmllZFJvdW5kSWQsIGJsb2NrVGltZXN0YW1wKSB7XG4gICAgICAgICAgY29uc3QgeyByb3VuZHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gaGVscGVyLnZhbGlkYXRlT3JhY2xlUm91bmQoXG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBxdWVyaWVkUm91bmRJZCxcbiAgICAgICAgICAgIGJsb2NrVGltZXN0YW1wLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKFRpbWVNYXRoLmFic1ZhbHVlKHJvdW5kcy5nZXQocXVlcmllZFJvdW5kSWQpLnN0YXJ0ZWRBdCkgPiAwbikge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgaGVscGVyLmFjY2VwdGluZ1N1Ym1pc3Npb25zKHF1ZXJpZWRSb3VuZElkKSAmJiBlcnJvciA9PT0gbnVsbFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5kZWxheWVkKHN0YXR1cywgcXVlcmllZFJvdW5kSWQpICYmIGVycm9yID09PSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICAvKlxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGdldFJvdW5kRGF0YShyb3VuZElkUmF3KSB7XG4gICAgICAgICAgY29uc3Qgcm91bmRJZCA9IE5hdChyb3VuZElkUmF3KTtcbiAgICAgICAgICBjb25zdCB7IHJvdW5kcyB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICAgIHJvdW5kcy5oYXMocm91bmRJZCkgfHwgYXNzZXJ0LmZhaWwoVjNfTk9fREFUQV9FUlJPUik7XG5cbiAgICAgICAgICBjb25zdCByID0gcm91bmRzLmdldChyb3VuZElkKTtcblxuICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgIHIuYW5zd2VyZWRJblJvdW5kID4gMCAmJiB2YWxpZFJvdW5kSWQocm91bmRJZCksXG4gICAgICAgICAgICBWM19OT19EQVRBX0VSUk9SLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm91bmRJZCxcbiAgICAgICAgICAgIGFuc3dlcjogci5hbnN3ZXIsXG4gICAgICAgICAgICBzdGFydGVkQXQ6IHIuc3RhcnRlZEF0LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiByLnVwZGF0ZWRBdCxcbiAgICAgICAgICAgIGFuc3dlcmVkSW5Sb3VuZDogci5hbnN3ZXJlZEluUm91bmQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgZ2V0Um91bmRTdGF0dXMocm91bmRJZCkge1xuICAgICAgICAgIGNvbnN0IHsgZGV0YWlscywgcm91bmRzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIHJvdW5kcy5oYXMocm91bmRJZCkgfHwgRmFpbGBWM19OT19EQVRBX0VSUk9SYDtcbiAgICAgICAgICBjb25zdCBkZXRhaWwgPSBkZXRhaWxzLmdldChyb3VuZElkKTtcbiAgICAgICAgICBjb25zdCByb3VuZCA9IHJvdW5kcy5nZXQocm91bmRJZCk7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IC4uLmRldGFpbCwgLi4ucm91bmQgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIG9yYWNsZVJvdW5kU3RhdGVTdWdnZXN0Um91bmQoc3RhdHVzLCBibG9ja1RpbWVzdGFtcCkge1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICBjb25zdCB7IGRldGFpbHMsIHJlcG9ydGluZ1JvdW5kSWQsIHJvdW5kcyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBjb25zdCBzaG91bGRTdXBlcnNlZGUgPVxuICAgICAgICAgICAgc3RhdHVzLmxhc3RSZXBvcnRlZFJvdW5kID09PSByZXBvcnRpbmdSb3VuZElkIHx8XG4gICAgICAgICAgICAhaGVscGVyLmFjY2VwdGluZ1N1Ym1pc3Npb25zKHJlcG9ydGluZ1JvdW5kSWQpO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IGNhblN1cGVyc2VkZSA9IGhlbHBlci5zdXBlcnNlZGFibGUoXG4gICAgICAgICAgICByZXBvcnRpbmdSb3VuZElkLFxuICAgICAgICAgICAgYmxvY2tUaW1lc3RhbXAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGxldCByb3VuZElkO1xuICAgICAgICAgIGxldCBlbGlnaWJsZVRvU3VibWl0O1xuICAgICAgICAgIGlmIChjYW5TdXBlcnNlZGUgJiYgc2hvdWxkU3VwZXJzZWRlKSB7XG4gICAgICAgICAgICByb3VuZElkID0gYWRkKHJlcG9ydGluZ1JvdW5kSWQsIDEpO1xuICAgICAgICAgICAgZWxpZ2libGVUb1N1Ym1pdCA9IGhlbHBlci5kZWxheWVkKHN0YXR1cywgcm91bmRJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvdW5kSWQgPSByZXBvcnRpbmdSb3VuZElkO1xuICAgICAgICAgICAgZWxpZ2libGVUb1N1Ym1pdCA9IGhlbHBlci5hY2NlcHRpbmdTdWJtaXNzaW9ucyhyb3VuZElkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgcm91bmQ7XG4gICAgICAgICAgbGV0IHN0YXJ0ZWRBdDtcbiAgICAgICAgICBsZXQgcm91bmRUaW1lb3V0O1xuICAgICAgICAgIGlmIChyb3VuZHMuaGFzKHJvdW5kSWQpKSB7XG4gICAgICAgICAgICByb3VuZCA9IHJvdW5kcy5nZXQocm91bmRJZCk7XG4gICAgICAgICAgICBzdGFydGVkQXQgPSByb3VuZC5zdGFydGVkQXQ7XG4gICAgICAgICAgICByb3VuZFRpbWVvdXQgPSBkZXRhaWxzLmdldChyb3VuZElkKS5yb3VuZFRpbWVvdXQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXJ0ZWRBdCA9IDBuO1xuICAgICAgICAgICAgcm91bmRUaW1lb3V0ID0gMDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBlcnJvciA9IGhlbHBlci52YWxpZGF0ZU9yYWNsZVJvdW5kKFxuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgcm91bmRJZCxcbiAgICAgICAgICAgIGJsb2NrVGltZXN0YW1wLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGVycm9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBlbGlnaWJsZVRvU3VibWl0ID0gZmFsc2U7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVsaWdpYmxlRm9yU3BlY2lmaWNSb3VuZDogZWxpZ2libGVUb1N1Ym1pdCxcbiAgICAgICAgICAgIHF1ZXJpZWRSb3VuZElkOiByb3VuZElkLFxuICAgICAgICAgICAgbGF0ZXN0U3VibWlzc2lvbjogc3RhdHVzLmxhdGVzdFN1Ym1pc3Npb24sXG4gICAgICAgICAgICBzdGFydGVkQXQsXG4gICAgICAgICAgICByb3VuZFRpbWVvdXQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvcmFjbGU6IHtcbiAgICAgICAgLypcblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaGFuZGxlUHVzaChcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgeyByb3VuZElkOiByb3VuZElkUmF3ID0gdW5kZWZpbmVkLCB1bml0UHJpY2U6IHZhbHVlUmF3IH0sXG4gICAgICAgICkge1xuICAgICAgICAgIHRyYWNlKCdoYW5kbGVQdXNoJywgc3RhdHVzLCByb3VuZElkUmF3LCB2YWx1ZVJhdyk7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBOYXQodmFsdWVSYXcpO1xuICAgICAgICAgIGNvbnN0IHsgbWluU3VibWlzc2lvblZhbHVlLCBtYXhTdWJtaXNzaW9uVmFsdWUsIHRpbWVyUHJlc2VuY2UgfSA9XG4gICAgICAgICAgICB0aGlzLnN0YXRlO1xuXG4gICAgICAgICAgY29uc3QgeyBjb250cmFjdCwgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICB2YWx1ZSA+PSBtaW5TdWJtaXNzaW9uVmFsdWUgfHxcbiAgICAgICAgICAgIEZhaWxgdmFsdWUgYmVsb3cgbWluU3VibWlzc2lvblZhbHVlICR7cShtaW5TdWJtaXNzaW9uVmFsdWUpfWA7XG4gICAgICAgICAgdmFsdWUgPD0gbWF4U3VibWlzc2lvblZhbHVlIHx8XG4gICAgICAgICAgICBGYWlsYHZhbHVlIGFib3ZlIG1heFN1Ym1pc3Npb25WYWx1ZSAke3EobWF4U3VibWlzc2lvblZhbHVlKX1gO1xuXG4gICAgICAgICAgY29uc3QgYmxvY2tUaW1lc3RhbXAgPSBhd2FpdCBFKHRpbWVyUHJlc2VuY2UpLmdldEN1cnJlbnRUaW1lc3RhbXAoKTtcbiAgICAgICAgICB0cmFjZSgnaGFuZGxlUHVzaCBibG9ja1RpbWVzdGFtcCcsIGJsb2NrVGltZXN0YW1wLmFic1ZhbHVlKTtcblxuICAgICAgICAgIGxldCByb3VuZElkO1xuICAgICAgICAgIGlmIChyb3VuZElkUmF3ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1Z2dlc3RlZFJvdW5kID0gY29udHJhY3Qub3JhY2xlUm91bmRTdGF0ZVN1Z2dlc3RSb3VuZChcbiAgICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgICBibG9ja1RpbWVzdGFtcCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByb3VuZElkID0gc3VnZ2VzdGVkUm91bmQuZWxpZ2libGVGb3JTcGVjaWZpY1JvdW5kXG4gICAgICAgICAgICAgID8gc3VnZ2VzdGVkUm91bmQucXVlcmllZFJvdW5kSWRcbiAgICAgICAgICAgICAgOiBhZGQoc3VnZ2VzdGVkUm91bmQucXVlcmllZFJvdW5kSWQsIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3VuZElkID0gTmF0KHJvdW5kSWRSYXcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gaGVscGVyLnZhbGlkYXRlT3JhY2xlUm91bmQoXG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICByb3VuZElkLFxuICAgICAgICAgICAgYmxvY2tUaW1lc3RhbXAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICghKGVycm9yTXNnID09PSBudWxsKSkge1xuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoZXJyb3JNc2cpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHByb3Bvc2VkU3RhdHVzID0gaGVscGVyLnByb3Bvc2VOZXdSb3VuZChcbiAgICAgICAgICAgIHJvdW5kSWQsXG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBibG9ja1RpbWVzdGFtcCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHNldHRsZWRTdGF0dXMgPSBoZWxwZXIucmVjb3JkU3VibWlzc2lvbihcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgcm91bmRJZCxcbiAgICAgICAgICAgIHByb3Bvc2VkU3RhdHVzIHx8IHN0YXR1cyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaGVscGVyLnVwZGF0ZVJvdW5kQW5zd2VyKHJvdW5kSWQsIGJsb2NrVGltZXN0YW1wKTtcbiAgICAgICAgICBoZWxwZXIuZGVsZXRlUm91bmREZXRhaWxzKHJvdW5kSWQpO1xuXG4gICAgICAgICAgdHJhY2UoJ2hhbmRsZVB1c2ggcmV0dXJuaW5nJywgc2V0dGxlZFN0YXR1cyk7XG5cbiAgICAgICAgICByZXR1cm4gc2V0dGxlZFN0YXR1cztcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmaW5pc2g6ICh7IHN0YXRlIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBkZXRhaWxzLCByb3VuZHMsIHRpbWVyUHJlc2VuY2UgfSA9IHN0YXRlO1xuICAgICAgICAvL1xuICAgICAgICAvL1xuXG4gICAgICAgIGNvbnN0IGZpcnN0Um91bmQgPSAxbjtcbiAgICAgICAgc3RhdGUucmVwb3J0aW5nUm91bmRJZCA9IGZpcnN0Um91bmQ7XG4gICAgICAgIGRldGFpbHMuaW5pdChcbiAgICAgICAgICBmaXJzdFJvdW5kLFxuICAgICAgICAgIGhhcmRlbih7XG4gICAgICAgICAgICBzdWJtaXNzaW9uczogW10sXG4gICAgICAgICAgICBtYXhTdWJtaXNzaW9uczogc3RhdGUubWF4U3VibWlzc2lvbkNvdW50LFxuICAgICAgICAgICAgbWluU3VibWlzc2lvbnM6IHN0YXRlLm1pblN1Ym1pc3Npb25Db3VudCxcbiAgICAgICAgICAgIHJvdW5kVGltZW91dDogc3RhdGUudGltZW91dCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICAvL1xuICAgICAgICB2b2lkIEUud2hlbihcbiAgICAgICAgICBFKHRpbWVyUHJlc2VuY2UpLmdldEN1cnJlbnRUaW1lc3RhbXAoKSxcbiAgICAgICAgICBub3dNYXliZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3cgPVxuICAgICAgICAgICAgICBUaW1lTWF0aC5jb21wYXJlQWJzKG5vd01heWJlLCAxbikgPCAwXG4gICAgICAgICAgICAgICAgPyBUaW1lTWF0aC5jb2VyY2VUaW1lc3RhbXBSZWNvcmQoMW4sIG5vd01heWJlLnRpbWVyQnJhbmQpXG4gICAgICAgICAgICAgICAgOiBub3dNYXliZTtcblxuICAgICAgICAgICAgY29uc3Qgcm91bmQgPSBoYXJkZW4oe1xuICAgICAgICAgICAgICBhbnN3ZXI6IDBuLFxuICAgICAgICAgICAgICBzdGFydGVkQXQ6IG5vdyxcbiAgICAgICAgICAgICAgdXBkYXRlZEF0OiAwbixcbiAgICAgICAgICAgICAgYW5zd2VyZWRJblJvdW5kOiAwbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcm91bmRzLmluaXQoZmlyc3RSb3VuZCwgcm91bmQpO1xuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgdm9pZCBzdGF0ZS5sYXRlc3RSb3VuZFB1Ymxpc2hlci53cml0ZSh7XG4gICAgICAgICAgICAgIHJvdW5kSWQ6IGZpcnN0Um91bmQsXG4gICAgICAgICAgICAgIHN0YXJ0ZWRBdDogcm91bmQuc3RhcnRlZEF0LFxuICAgICAgICAgICAgICBzdGFydGVkQnk6ICd1bmluaXRpYWxpemVkJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVhc29uID0+IEZhaWxgbmVlZCBhIHRpbWVzdGFtcCB0byBzdGFydCByb3VuZHNNYW5hZ2VyICR7cmVhc29ufWAsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7JGjNj19vbmNlLnByZXBhcmVSb3VuZHNNYW5hZ2VyS2l0KHByZXBhcmVSb3VuZHNNYW5hZ2VyS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJPVU5EX01BWCI6WyJST1VORF9NQVgiXSwicHJlcGFyZVJvdW5kc01hbmFnZXJLaXQiOlsicHJlcGFyZVJvdW5kc01hbmFnZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApS7Mv3YWAAB2FgAANQAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvcHJvcG9zYWxzL3V0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlSW5zdGFsbENhY2hlIiwib3JhY2xlQnJhbmRGZWVkTmFtZSIsInByb3ZpZGVSZXRpcmVkSW5zdGFuY2VzIiwicmVzZXJ2ZVRoZW5EZXBvc2l0IiwicmVzZXJ2ZVRoZW5HZXROYW1lUGF0aHMiLCJyZXNlcnZlVGhlbkdldE5hbWVzIiwic2FuaXRpemVQYXRoU2VnbWVudCIsInNjYWxlZFByaWNlRmVlZE5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEUsV2FsbGV0TmFtZSxnZXRDb3B5TWFwRW50cmllcyxtYWtlQ29weU1hcCxhc3NlcnRQYXRoU2VnbWVudCxtYWtlU2NhbGFyQmlnTWFwU3RvcmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIldhbGxldE5hbWVcIixbJGjNj19hID0+IChXYWxsZXROYW1lID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiZ2V0Q29weU1hcEVudHJpZXNcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRozY9fYSldXSxbXCJtYWtlQ29weU1hcFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wiYXNzZXJ0UGF0aFNlZ21lbnRcIixbJGjNj19hID0+IChhc3NlcnRQYXRoU2VnbWVudCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHJlc2VydmVUaGVuR2V0TmFtZVBhdGhzID0gYXN5bmMgKG5hbWVBZG1pbiwgcGF0aHMpID0+IHtcbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBuZXh0UGF0aCA9IGFzeW5jIChuZXh0QWRtaW4sIHBhdGgpID0+IHtcbiAgICBjb25zdCBbbmV4dE5hbWUsIC4uLnJlc3RdID0gcGF0aDtcbiAgICBhc3NlcnQudHlwZW9mKG5leHROYW1lLCAnc3RyaW5nJyk7XG5cbiAgICAvL1xuICAgIGF3YWl0IEUobmV4dEFkbWluKS5yZXNlcnZlKG5leHROYW1lKTtcblxuICAgIGlmIChyZXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy9cbiAgICAgIGNvbnN0IG5hbWVIdWIgPSBFKG5leHRBZG1pbikucmVhZG9ubHkoKTtcbiAgICAgIHJldHVybiBFKG5hbWVIdWIpLmxvb2t1cChuZXh0TmFtZSk7XG4gICAgfVxuXG4gICAgLy9cbiAgICBjb25zdCByZXN0QWRtaW4gPSBhd2FpdCBFKG5leHRBZG1pbikubG9va3VwQWRtaW4obmV4dE5hbWUpO1xuICAgIHJldHVybiBuZXh0UGF0aChyZXN0QWRtaW4sIHJlc3QpO1xuICB9O1xuXG4gIHJldHVybiBQcm9taXNlLmFsbChcbiAgICBwYXRocy5tYXAoYXN5bmMgcGF0aCA9PiB7XG4gICAgICBBcnJheS5pc0FycmF5KHBhdGgpIHx8IEZhaWxgcGF0aCAke3BhdGh9IGlzIG5vdCBhbiBhcnJheWA7XG4gICAgICByZXR1cm4gbmV4dFBhdGgobmFtZUFkbWluLCBwYXRoKTtcbiAgICB9KSxcbiAgKTtcbn07XG5cbi8qXG5cblxuICovJGjNj19vbmNlLnJlc2VydmVUaGVuR2V0TmFtZVBhdGhzKHJlc2VydmVUaGVuR2V0TmFtZVBhdGhzKTtcbiAgICAgICBjb25zdCByZXNlcnZlVGhlbkdldE5hbWVzID0gYXN5bmMgKG5hbWVBZG1pbiwgbmFtZXMpID0+XG4gIHJlc2VydmVUaGVuR2V0TmFtZVBhdGhzKFxuICAgIG5hbWVBZG1pbixcbiAgICBuYW1lcy5tYXAobmFtZSA9PiBbbmFtZV0pLFxuICApO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UucmVzZXJ2ZVRoZW5HZXROYW1lcyhyZXNlcnZlVGhlbkdldE5hbWVzKTtcbiAgICAgICBjb25zdCByZXNlcnZlVGhlbkRlcG9zaXQgPSBhc3luYyAoXG4gIGRlYnVnTmFtZSxcbiAgbmFtZXNCeUFkZHJlc3NBZG1pbixcbiAgYWRkcixcbiAgcGF5bWVudHMsXG4pID0+IHtcbiAgY29uc29sZS5pbmZvKCdhd2FpdGluZyBkZXBvc2l0RmFjZXQgZm9yJywgZGVidWdOYW1lKTtcbiAgY29uc3QgW2RlcG9zaXRGYWNldF0gPSBhd2FpdCByZXNlcnZlVGhlbkdldE5hbWVQYXRocyhuYW1lc0J5QWRkcmVzc0FkbWluLCBbXG4gICAgW2FkZHIsIFdhbGxldE5hbWUuZGVwb3NpdEZhY2V0XSxcbiAgXSk7XG4gIGNvbnNvbGUuaW5mbygnZGVwb3NpdGluZyB0bycsIGRlYnVnTmFtZSk7XG4gIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChcbiAgICBwYXltZW50cy5tYXAoYXN5bmMgKHBheW1lbnRQLCBpKSA9PiB7XG4gICAgICBjb25zdCBwYXltZW50ID0gYXdhaXQgcGF5bWVudFA7XG4gICAgICBhd2FpdCBFKGRlcG9zaXRGYWNldCkucmVjZWl2ZShwYXltZW50KTtcbiAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgYGNvbmZpcm1lZCBkZXBvc2l0ICR7aSArIDF9LyR7cGF5bWVudHMubGVuZ3RofSBmb3JgLFxuICAgICAgICBkZWJ1Z05hbWUsXG4gICAgICApO1xuICAgIH0pLFxuICApO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLnJlc2VydmVUaGVuRGVwb3NpdChyZXNlcnZlVGhlbkRlcG9zaXQpO1xuY29uc3QgcHJvdmlkZVdoZW4gPSBhc3luYyAoc3RvcmUsIGtleSwgbWFrZSkgPT4ge1xuICBjb25zdCBmb3VuZCA9IGF3YWl0IEUoc3RvcmUpLmdldChrZXkpO1xuICBpZiAoZm91bmQpIHtcbiAgICByZXR1cm4gZm91bmQ7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBtYWtlKCk7XG4gIGF3YWl0IEUoc3RvcmUpLnNldChrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VJbnN0YWxsQ2FjaGUgPSBhc3luYyAoXG4gIGhvbWVQLFxuICB7IGluc3RhbGxDYWNoZUtleSA9ICdpbnN0YWxsQ2FjaGUnLCBsb2FkQnVuZGxlIH0sXG4pID0+IHtcbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgaW5pdGlhbCA9IGF3YWl0IHByb3ZpZGVXaGVuKEUuZ2V0KGhvbWVQKS5zY3JhdGNoLCBpbnN0YWxsQ2FjaGVLZXksICgpID0+XG4gICAgbWFrZUNvcHlNYXAoW10pLFxuICApO1xuICAvL1xuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCB3b3JraW5nID0gbmV3IE1hcChnZXRDb3B5TWFwRW50cmllcyhpbml0aWFsKSk7XG5cbiAgY29uc3Qgc2F2ZUNhY2hlID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZpbmFsID0gbWFrZUNvcHlNYXAod29ya2luZyk7XG4gICAgYXNzZXJ0LmVxdWFsKGZpbmFsLnBheWxvYWQua2V5cy5sZW5ndGgsIHdvcmtpbmcuc2l6ZSk7XG4gICAgYXdhaXQgRShFLmdldChob21lUCkuc2NyYXRjaCkuc2V0KGluc3RhbGxDYWNoZUtleSwgZmluYWwpO1xuICAgIGNvbnNvbGUubG9nKHtcbiAgICAgIGluaXRpYWw6IGluaXRpYWwucGF5bG9hZC5rZXlzLmxlbmd0aCxcbiAgICAgIHRvdGFsOiB3b3JraW5nLnNpemUsXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3Qgd3JhcEluc3RhbGwgPSBpbnN0YWxsID0+IGFzeW5jIChtUGF0aCwgYlBhdGgsIG9wdHMpID0+IHtcbiAgICBjb25zdCBidW5kbGUgPSBhd2FpdCBsb2FkQnVuZGxlKGJQYXRoKS50aGVuKG0gPT4gbS5kZWZhdWx0KTtcbiAgICBhc3NlcnQoXG4gICAgICAnZW5kb1ppcEJhc2U2NFNoYTUxMicgaW4gYnVuZGxlLFxuICAgICAgJ2J1bmRsZSBtdXN0IGJlIEVuZG9aaXBCYXNlNjRCdW5kbGUnLFxuICAgICk7XG4gICAgY29uc3QgeyBlbmRvWmlwQmFzZTY0U2hhNTEyOiBzaGE1MTIgfSA9IGJ1bmRsZTtcbiAgICBjb25zdCBkZXRhaWwgPSBhd2FpdCBwcm92aWRlV2hlbih3b3JraW5nLCBzaGE1MTIsICgpID0+XG4gICAgICBpbnN0YWxsKG1QYXRoLCBiUGF0aCwgb3B0cykudGhlbihpbnN0YWxsYXRpb24gPT4gKHtcbiAgICAgICAgaW5zdGFsbGF0aW9uLFxuICAgICAgICBzaGE1MTIsXG4gICAgICAgIHBhdGg6IGJQYXRoLFxuICAgICAgfSkpLFxuICAgICk7XG4gICAgcmV0dXJuIGRldGFpbC5pbnN0YWxsYXRpb247XG4gIH07XG5cbiAgcmV0dXJuIHsgd3JhcEluc3RhbGwsIHNhdmVDYWNoZSB9O1xufTskaM2PX29uY2UubWFrZUluc3RhbGxDYWNoZShtYWtlSW5zdGFsbENhY2hlKTtcblxuICAgICAgIGNvbnN0IG9yYWNsZUJyYW5kRmVlZE5hbWUgPSAoaW5CcmFuZE5hbWUsIG91dEJyYW5kTmFtZSkgPT5cbiAgYCR7aW5CcmFuZE5hbWV9LSR7b3V0QnJhbmROYW1lfSBwcmljZSBmZWVkYDskaM2PX29uY2Uub3JhY2xlQnJhbmRGZWVkTmFtZShvcmFjbGVCcmFuZEZlZWROYW1lKTtcblxuICAgICAgIGNvbnN0IHNjYWxlZFByaWNlRmVlZE5hbWUgPSBpc3N1ZXJOYW1lID0+XG4gIGBzY2FsZWRQcmljZUF1dGhvcml0eS0ke2lzc3Vlck5hbWV9YDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLnNjYWxlZFByaWNlRmVlZE5hbWUoc2NhbGVkUHJpY2VGZWVkTmFtZSk7XG4gICAgICAgY29uc3Qgc2FuaXRpemVQYXRoU2VnbWVudCA9IG5hbWUgPT4ge1xuICBjb25zdCBjYW5kaWRhdGUgPSBuYW1lLnJlcGxhY2UoLyAvZywgJ18nKTtcbiAgYXNzZXJ0UGF0aFNlZ21lbnQoY2FuZGlkYXRlKTtcbiAgcmV0dXJuIGNhbmRpZGF0ZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uuc2FuaXRpemVQYXRoU2VnbWVudChzYW5pdGl6ZVBhdGhTZWdtZW50KTtcbiAgICAgICBjb25zdCBwcm92aWRlUmV0aXJlZEluc3RhbmNlcyA9IGFzeW5jIChjb25zdW1lLCBwcm9kdWNlKSA9PiB7XG4gIC8vXG4gIC8vXG4gIHByb2R1Y2UucmVzb2x2ZShcbiAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ3JldGlyZWRDb250cmFjdEluc3RhbmNlcycsIHtcbiAgICAgIGR1cmFibGU6IHRydWUsXG4gICAgfSksXG4gICk7XG4gIHJldHVybiBjb25zdW1lO1xufTskaM2PX29uY2UucHJvdmlkZVJldGlyZWRJbnN0YW5jZXMocHJvdmlkZVJldGlyZWRJbnN0YW5jZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVzZXJ2ZVRoZW5HZXROYW1lUGF0aHMiOlsicmVzZXJ2ZVRoZW5HZXROYW1lUGF0aHMiXSwicmVzZXJ2ZVRoZW5HZXROYW1lcyI6WyJyZXNlcnZlVGhlbkdldE5hbWVzIl0sInJlc2VydmVUaGVuRGVwb3NpdCI6WyJyZXNlcnZlVGhlbkRlcG9zaXQiXSwibWFrZUluc3RhbGxDYWNoZSI6WyJtYWtlSW5zdGFsbENhY2hlIl0sIm9yYWNsZUJyYW5kRmVlZE5hbWUiOlsib3JhY2xlQnJhbmRGZWVkTmFtZSJdLCJzY2FsZWRQcmljZUZlZWROYW1lIjpbInNjYWxlZFByaWNlRmVlZE5hbWUiXSwic2FuaXRpemVQYXRoU2VnbWVudCI6WyJzYW5pdGl6ZVBhdGhTZWdtZW50Il0sInByb3ZpZGVSZXRpcmVkSW5zdGFuY2VzIjpbInByb3ZpZGVSZXRpcmVkSW5zdGFuY2VzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFMtyVavHQAArx0AACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2FsbGJhY2suanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiY2FsbEUiLCJjYWxsU3luYyIsImlzQ2FsbGJhY2siLCJtYWtlRnVuY3Rpb25DYWxsYmFjayIsIm1ha2VNZXRob2RDYWxsYmFjayIsIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayIsIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siLCJwcmVwYXJlQXR0ZW51YXRvciIsInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbWFrZUVycm9yLHEsRSxpc1ByaW1pdGl2ZSxpc1Bhc3NhYmxlU3ltYm9sLGdldEludGVyZmFjZU1ldGhvZEtleXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChpc1Bhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldEludGVyZmFjZU1ldGhvZEtleXNcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VNZXRob2RLZXlzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuY29uc3QgeyBvd25LZXlzOiByYXdPd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3Qgb3duS2V5cyA9XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICByYXdPd25LZXlzXG4gICk7XG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpc1Byb3BlcnR5S2V5ID0ga2V5ID0+IHtcbiAgc3dpdGNoICh0eXBlb2Yga2V5KSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2FsbFN5bmMgPSAoY2FsbGJhY2ssIC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kIH0gPSBjYWxsYmFjaztcbiAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0YXJnZXQoLi4uYm91bmQsIC4uLmFyZ3MpO1xuICB9XG4gIHJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oLi4uYm91bmQsIC4uLmFyZ3MpO1xufTskaM2PX29uY2UuY2FsbFN5bmMoY2FsbFN5bmMpO1xuaGFyZGVuKGNhbGxTeW5jKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNhbGxFID0gKGNhbGxiYWNrLCAuLi5hcmdzKSA9PiB7XG4gIGNvbnN0IHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCB9ID0gY2FsbGJhY2s7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gRSh0YXJnZXQpKC4uLmJvdW5kLCAuLi5hcmdzKTtcbiAgfVxuICByZXR1cm4gRSh0YXJnZXQpW21ldGhvZE5hbWVdKC4uLmJvdW5kLCAuLi5hcmdzKTtcbn07JGjNj19vbmNlLmNhbGxFKGNhbGxFKTtcbmhhcmRlbihjYWxsRSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrID0gKHRhcmdldCwgLi4uYm91bmQpID0+IHtcbiAgdHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIEZhaWxgc3luYyBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uOiAke3RhcmdldH1gO1xuICAvKiAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBib3VuZCwgaXNTeW5jOiB0cnVlIH0pO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICovIChjYik7XG59OyRozY9fb25jZS5tYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sobWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VGdW5jdGlvbkNhbGxiYWNrID0gKHRhcmdldCwgLi4uYm91bmQpID0+IHtcbiAgIWlzUHJpbWl0aXZlKHRhcmdldCkgfHxcbiAgICBGYWlsYGZ1bmN0aW9uIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGEgZnVuY3Rpb24gcHJlc2VuY2U6ICR7dGFyZ2V0fWA7XG4gIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY2IgPSBoYXJkZW4oeyB0YXJnZXQsIGJvdW5kIH0pO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgKi8gKGNiKTtcbn07JGjNj19vbmNlLm1ha2VGdW5jdGlvbkNhbGxiYWNrKG1ha2VGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3luY01ldGhvZENhbGxiYWNrID0gKHRhcmdldCwgbWV0aG9kTmFtZSwgLi4uYm91bmQpID0+IHtcbiAgIWlzUHJpbWl0aXZlKHRhcmdldCkgfHxcbiAgICBGYWlsYHN5bmMgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbiAgdHlwZW9mIG1ldGhvZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKSB8fFxuICAgIEZhaWxgbWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBwYXNzYWJsZSBzeW1ib2w6ICR7bWV0aG9kTmFtZX1gO1xuICAvKiAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCwgaXNTeW5jOiB0cnVlIH0pO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICovIChjYik7XG59OyRozY9fb25jZS5tYWtlU3luY01ldGhvZENhbGxiYWNrKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZU1ldGhvZENhbGxiYWNrID0gKHRhcmdldCwgbWV0aG9kTmFtZSwgLi4uYm91bmQpID0+IHtcbiAgIWlzUHJpbWl0aXZlKHRhcmdldCkgfHxcbiAgICBGYWlsYG1ldGhvZCBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3Q6ICR7dGFyZ2V0fWA7XG4gIHR5cGVvZiBtZXRob2ROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgIGlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkgfHxcbiAgICBGYWlsYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbiAgLyogICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAqLyAoY2IpO1xufTskaM2PX29uY2UubWFrZU1ldGhvZENhbGxiYWNrKG1ha2VNZXRob2RDYWxsYmFjayk7XG5oYXJkZW4obWFrZU1ldGhvZENhbGxiYWNrKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0NhbGxiYWNrID0gY2FsbGJhY2sgPT4ge1xuICBpZiAoaXNQcmltaXRpdmUoY2FsbGJhY2spKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCB9ID0gY2FsbGJhY2s7XG4gIHJldHVybiAoXG4gICAgIWlzUHJpbWl0aXZlKHRhcmdldCkgJiZcbiAgICAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICB0eXBlb2YgbWV0aG9kTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIGlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkpICYmXG4gICAgQXJyYXkuaXNBcnJheShib3VuZClcbiAgKTtcbn07JGjNj19vbmNlLmlzQ2FsbGJhY2soaXNDYWxsYmFjayk7XG5oYXJkZW4oaXNDYWxsYmFjayk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlQXR0ZW51YXRvciA9IChcbiAgem9uZSxcbiAgbWV0aG9kTmFtZXMsXG4gIHsgaW50ZXJmYWNlR3VhcmQsIHRhZyA9ICdBdHRlbnVhdG9yJyB9ID0ge30sXG4pID0+IHtcbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtZXRob2RzID0gLyogICAgICAgICAgICAgICAgICAqLyAoXG4gICAgZnJvbUVudHJpZXMoXG4gICAgICBtZXRob2ROYW1lcy5tYXAoa2V5ID0+IHtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKCFpc1Byb3BlcnR5S2V5KGtleSkpIHtcbiAgICAgICAgICB0aHJvdyBGYWlsYGtleSAke3Eoa2V5KX0gaXMgbm90IGEgUHJvcGVydHlLZXlgO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbSA9IC8qICAgICAgICAgICAgICAgICAgKi8gKHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgW2tleV0oLi4uYXJncykge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIGNvbnN0IGNiID0gdGhpcy5zdGF0ZS5jYnNba2V5XTtcbiAgICAgICAgICAgIGlmICghY2IpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyID0gbWFrZUVycm9yKGB1bmltcGxlbWVudGVkICR7cSh0YWcpfSBtZXRob2QgJHtxKGtleSl9YCk7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmlzU3luYykge1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjYi5pc1N5bmMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNhbGxTeW5jKGNiLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjYWxsRShjYiwgLi4uYXJncyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlba2V5XTtcbiAgICAgICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICovIChba2V5LCBtXSk7XG4gICAgICB9KSxcbiAgICApXG4gICk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYWtlQXR0ZW51YXRvciA9IHpvbmUuZXhvQ2xhc3MoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIC8qXG5cblxuXG5cbiAgICAgKi9cbiAgICAoe1xuICAgICAgdGFyZ2V0ID0gbnVsbCxcbiAgICAgIGlzU3luYyA9IGZhbHNlLFxuICAgICAgb3ZlcnJpZGVzID0gLyogICAgICAgICAgICAgICAgICAgICovICh7fSksXG4gICAgfSkgPT4ge1xuICAgICAgY29uc3QgY2JzID0gLyogICAgICAgICAgICAgICAgICAgICovICh7fSk7XG5cbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IG5ldyBTZXQobWV0aG9kTmFtZXMpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Ygb3duS2V5cyhvdmVycmlkZXMpKSB7XG4gICAgICAgIHJlbWFpbmluZy5oYXMoa2V5KSB8fFxuICAgICAgICAgIEZhaWxgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIG5vdCBhbGxvd2VkIGJ5IG1ldGhvZE5hbWVzYDtcblxuICAgICAgICByZW1haW5pbmcuZGVsZXRlKGtleSk7XG4gICAgICAgIGNvbnN0IGNiID0gb3ZlcnJpZGVzW2tleV07XG4gICAgICAgIGNiID09IG51bGwgfHxcbiAgICAgICAgICBpc0NhbGxiYWNrKGNiKSB8fFxuICAgICAgICAgIEZhaWxgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIGlzIG5vdCBhIGNhbGxiYWNrOyBnb3QgJHtjYn1gO1xuICAgICAgICBjYnNba2V5XSA9IGNiO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVtYWluaW5nKSB7XG4gICAgICAgIGlmIChpc1N5bmMpIHtcbiAgICAgICAgICBjYnNba2V5XSA9IG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2sodGFyZ2V0LCBrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNic1trZXldID0gbWFrZU1ldGhvZENhbGxiYWNrKHRhcmdldCwga2V5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGhhcmRlbih7IGNicywgaXNTeW5jIH0pO1xuICAgIH0sXG4gICAgLyogICAgICAgICAgICAgICAgICAqLyAobWV0aG9kcyksXG4gICk7XG4gIHJldHVybiBtYWtlQXR0ZW51YXRvcjtcbn07JGjNj19vbmNlLnByZXBhcmVBdHRlbnVhdG9yKHByZXBhcmVBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlQXR0ZW51YXRvcik7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciA9ICh6b25lLCBpbnRlcmZhY2VHdWFyZCwgb3B0cyA9IHt9KSA9PiB7XG4gIGNvbnN0IG1ldGhvZE5hbWVzID0gZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyhpbnRlcmZhY2VHdWFyZCk7XG4gIGNvbnN0IG1ha2VBdHRlbnVhdG9yID0gcHJlcGFyZUF0dGVudWF0b3Ioem9uZSwgbWV0aG9kTmFtZXMsIHtcbiAgICAuLi5vcHRzLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICB9KTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKG1ha2VBdHRlbnVhdG9yKTtcbn07JGjNj19vbmNlLnByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xuaGFyZGVuKHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYWxsU3luYyI6WyJjYWxsU3luYyJdLCJjYWxsRSI6WyJjYWxsRSJdLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siOlsibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VGdW5jdGlvbkNhbGxiYWNrIjpbIm1ha2VGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siOlsibWFrZVN5bmNNZXRob2RDYWxsYmFjayJdLCJtYWtlTWV0aG9kQ2FsbGJhY2siOlsibWFrZU1ldGhvZENhbGxiYWNrIl0sImlzQ2FsbGJhY2siOlsiaXNDYWxsYmFjayJdLCJwcmVwYXJlQXR0ZW51YXRvciI6WyJwcmVwYXJlQXR0ZW51YXRvciJdLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiOlsicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALc+QRg0AwAANAMAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2xpLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJ0b0NMSU9wdGlvbnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB0b0NMSU9wdGlvbnMgPSByZWNvcmQgPT5cbiAgT2JqZWN0LmVudHJpZXMocmVjb3JkKS5mbGF0TWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICAgIGlmICh2YWx1ZSA9PT0gdHJ1ZSkgcmV0dXJuIFtgLS0ke2tleX1gXTtcbiAgICBpZiAodmFsdWUgPT09IGZhbHNlKSByZXR1cm4gW2AtLW5vLSR7a2V5fWBdO1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiB2YWx1ZS5mbGF0TWFwKHYgPT4gW2AtLSR7a2V5fWAsIHZdKTtcbiAgICB9XG4gICAgcmV0dXJuIFtgLS0ke2tleX1gLCB2YWx1ZV07XG4gIH0pOyRozY9fb25jZS50b0NMSU9wdGlvbnModG9DTElPcHRpb25zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRvQ0xJT3B0aW9ucyI6WyJ0b0NMSU9wdGlvbnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAz7Ja43YGAAB2BgAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQiLCJWQmFua0FjY291bnQiLCJXYWxsZXROYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBCcmlkZ2VJZCA9IC8qICAgICAgICAgICAgICAgICovICh7XG4gIEJBTks6ICdiYW5rJyxcbiAgQ09SRTogJ2NvcmUnLFxuICBESUJDOiAnZGliYycsXG4gIFNUT1JBR0U6ICdzdG9yYWdlJyxcbiAgUFJPVklTSU9OOiAncHJvdmlzaW9uJyxcbiAgUFJPVklTSU9OX1NNQVJUX1dBTExFVDogJ3Byb3Zpc2lvbldhbGxldCcsXG4gIFZMT0NBTENIQUlOOiAndmxvY2FsY2hhaW4nLFxuICBWVFJBTlNGRVI6ICd2dHJhbnNmZXInLFxuICBXQUxMRVQ6ICd3YWxsZXQnLFxufSk7JGjNj19vbmNlLkJyaWRnZUlkKEJyaWRnZUlkKTtcbmhhcmRlbihCcmlkZ2VJZCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQgPSB7XG4gIHZiYW5rUG9ydDogJ2JhbmsnLFxuICB2aWJjUG9ydDogJ2RpYmMnLFxufTskaM2PX29uY2UuQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQoQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQpO1xuaGFyZGVuKENvc21vc0luaXRLZXlUb0JyaWRnZUlkKTtcblxuICAgICAgIGNvbnN0IFdhbGxldE5hbWUgPSAvKiAgICAgICAgICAgICAgICAqLyAoe1xuICBkZXBvc2l0RmFjZXQ6ICdkZXBvc2l0RmFjZXQnLFxufSk7JGjNj19vbmNlLldhbGxldE5hbWUoV2FsbGV0TmFtZSk7XG5oYXJkZW4oV2FsbGV0TmFtZSk7XG5cbi8vXG4gICAgICAgY29uc3QgVkJhbmtBY2NvdW50ID0gLyogICAgICAgICAgICAgICAgKi8gKHtcbiAgcmVzZXJ2ZToge1xuICAgIG1vZHVsZTogJ3ZiYW5rL3Jlc2VydmUnLFxuICAgIGFkZHJlc3M6ICdhZ29yaWMxYWUwbG10emxncmNubGE5eGprcGFhcnE1ZDVkZmV6NjNoM251Y2wnLFxuICB9LFxuICBwcm92aXNpb246IHtcbiAgICBtb2R1bGU6ICd2YmFuay9wcm92aXNpb24nLFxuICAgIGFkZHJlc3M6ICdhZ29yaWMxbWVnenl0ZzY1Y3lyZ3pzNmZ2enhncmNxdnd3bDd1Z3B0NjIzNDYnLFxuICB9LFxufSk7JGjNj19vbmNlLlZCYW5rQWNjb3VudChWQmFua0FjY291bnQpO1xuaGFyZGVuKFZCYW5rQWNjb3VudCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmlkZ2VJZCI6WyJCcmlkZ2VJZCJdLCJDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCI6WyJDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCJdLCJXYWxsZXROYW1lIjpbIldhbGxldE5hbWUiXSwiVkJhbmtBY2NvdW50IjpbIlZCYW5rQWNjb3VudCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC8BYikOwUAADsFAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVHJhY2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG5cbmxldCBkZWJ1Z0luc3RhbmNlID0gMTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlVHJhY2VyID0gKG5hbWUsIGVuYWJsZSA9IHRydWUpID0+IHtcbiAgZGVidWdJbnN0YW5jZSArPSAxO1xuICBsZXQgZGVidWdDb3VudCA9IDE7XG4gIGNvbnN0IGtleSA9IGAtLS0tLSAke25hbWV9LiR7ZGVidWdJbnN0YW5jZX0gYDtcbiAgLy9cbiAgc3dpdGNoIChlbmFibGUpIHtcbiAgICBjYXNlIGZhbHNlOiB7XG4gICAgICBjb25zdCBsb2dEaXNhYmxlZCA9ICguLi5fYXJncykgPT4ge307XG4gICAgICByZXR1cm4gbG9nRGlzYWJsZWQ7XG4gICAgfVxuICAgIGNhc2UgJ3ZlcmJvc2UnOiB7XG4gICAgICBjb25zdCBpbmZvVGljayA9IChvcHRMb2csIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKG9wdExvZy5sb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oa2V5LCAoZGVidWdDb3VudCArPSAxKSwgLi4uYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgKGRlYnVnQ291bnQgKz0gMSksIG9wdExvZywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gaW5mb1RpY2s7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IGRlYnVnVGljayA9IChvcHRMb2csIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKG9wdExvZy5sb2cpIHtcbiAgICAgICAgICBvcHRMb2cubG9nKGtleSwgKGRlYnVnQ291bnQgKz0gMSksIC4uLmFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhrZXksIChkZWJ1Z0NvdW50ICs9IDEpLCBvcHRMb2csIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGRlYnVnVGljaztcbiAgICB9XG4gIH1cbn07JGjNj19vbmNlLm1ha2VUcmFjZXIobWFrZVRyYWNlcik7XG5oYXJkZW4obWFrZVRyYWNlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhY2VyIjpbIm1ha2VUcmFjZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+tsENbECAACxAgAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9lcnJvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiTm9uTnVsbGlzaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgTm9uTnVsbGlzaCA9ICh2YWwsIG9wdERldGFpbHMgPSBgdW5leHBlY3RlZCAke3EodmFsKX1gKSA9PiB7XG4gIGlmICh2YWwgIT0gbnVsbCkge1xuICAgIC8vXG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBhc3NlcnQuZmFpbChvcHREZXRhaWxzKTtcbn07JGjNj19vbmNlLk5vbk51bGxpc2goTm9uTnVsbGlzaCk7XG5oYXJkZW4oTm9uTnVsbGlzaCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJOb25OdWxsaXNoIjpbIk5vbk51bGxpc2giXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlK93k6UEAAClBAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2NsaS11dGlscy5qcyIsIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vZXJyb3JzLmpzIiwiLi9qcy11dGlscy5qcyIsIi4vbWFyc2hhbC5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi9tZXRyaWNzLmpzIiwiLi9uYXR1cmFsLXNvcnQuanMiLCIuL3Nlcy11dGlscy5qcyIsIi4vdG1wRGlyLmpzIiwiLi90eXBlQ2hlY2suanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOltudWxsXSwicmVleHBvcnRzIjpbIi4vY2xpLXV0aWxzLmpzIiwiLi9jb25maWcuanMiLCIuL2RlYnVnLmpzIiwiLi9lcnJvcnMuanMiLCIuL2pzLXV0aWxzLmpzIiwiLi9tZXRob2QtdG9vbHMuanMiLCIuL21ldHJpY3MuanMiLCIuL25hdHVyYWwtc29ydC5qcyIsIi4vc2VzLXV0aWxzLmpzIiwiLi90bXBEaXIuanMiLCIuL3R5cGVDaGVjay5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9jbGktdXRpbHMuanNcIiwgW11dLFtcIi4vY29uZmlnLmpzXCIsIFtdXSxbXCIuL2RlYnVnLmpzXCIsIFtdXSxbXCIuL2Vycm9ycy5qc1wiLCBbXV0sW1wiLi9qcy11dGlscy5qc1wiLCBbXV0sW1wiLi9tYXJzaGFsLmpzXCIsIFtdXSxbXCIuL21ldGhvZC10b29scy5qc1wiLCBbXV0sW1wiLi9tZXRyaWNzLmpzXCIsIFtdXSxbXCIuL25hdHVyYWwtc29ydC5qc1wiLCBbXV0sW1wiLi9zZXMtdXRpbHMuanNcIiwgW11dLFtcIi4vdG1wRGlyLmpzXCIsIFtdXSxbXCIuL3R5cGVDaGVjay5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9tYXJzaGFsLmpzIjpbWyJwdXJlRGF0YU1hcnNoYWxsZXIiLCJwdXJlRGF0YU1hcnNoYWxsZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALSGcrAjEwAAIxMAACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvanMtdXRpbHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlRSVUUiLCJkZWVwQ29weUpzb25hYmxlIiwiZGVlcE1hcE9iamVjdCIsImRlZmluZU5hbWUiLCJmcm9tVHlwZWRFbnRyaWVzIiwibG9nTGV2ZWxzIiwibWFrZU1lYXN1cmVTZWNvbmRzIiwib2JqZWN0TWFwTXV0YWJsZSIsInByb3ZpZGVMYXp5TWFwIiwidHlwZWRFbnRyaWVzIiwidHlwZWRNYXAiLCJ1bnByZWZpeGVkUHJvcGVydGllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuLy9cbi8qXG5cblxuICovXG5cbmNvbnN0IHsgZGVmaW5lUHJvcGVydHkgfSA9IE9iamVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IFRSVUUgPSAvKiAgICAgICAgICAgICAgICAqLyAodHJ1ZSk7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuVFJVRShUUlVFKTtcbiAgICAgICBjb25zdCB0eXBlZEVudHJpZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgKi8gKE9iamVjdC5lbnRyaWVzKTtcblxuLypcblxuXG5cblxuXG4gKi8kaM2PX29uY2UudHlwZWRFbnRyaWVzKHR5cGVkRW50cmllcyk7XG4gICAgICAgY29uc3QgZnJvbVR5cGVkRW50cmllcyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICBPYmplY3QuZnJvbUVudHJpZXNcbik7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5mcm9tVHlwZWRFbnRyaWVzKGZyb21UeXBlZEVudHJpZXMpO1xuICAgICAgIGNvbnN0IHR5cGVkTWFwID0gLyogICAgICAgICAgICAgICAgICAgKi8gKFxuICBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbC5iaW5kKEFycmF5LnByb3RvdHlwZS5tYXApXG4pOyRozY9fb25jZS50eXBlZE1hcCh0eXBlZE1hcCk7XG5cbiAgICAgICBjb25zdCBsb2dMZXZlbHMgPSAvKiAgICAgICAgICAgICAgICAqLyAoW1xuICAnZGVidWcnLFxuICAnbG9nJyxcbiAgJ2luZm8nLFxuICAnd2FybicsXG4gICdlcnJvcicsXG5dKTskaM2PX29uY2UubG9nTGV2ZWxzKGxvZ0xldmVscyk7XG5PYmplY3QuZnJlZXplKGxvZ0xldmVscyk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBDb3B5SnNvbmFibGUgPSB2YWx1ZSA9PiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlZXBDb3B5SnNvbmFibGUoZGVlcENvcHlKc29uYWJsZSk7XG5jb25zdCBkZWVwTWFwT2JqZWN0SW50ZXJuYWwgPSAodmFsdWUsIG5hbWUsIGNvbnRhaW5lciwgbWFwcGVyKSA9PiB7XG4gIGlmIChjb250YWluZXIgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgbWFwcGVkID0gbWFwcGVyKHZhbHVlLCBuYW1lLCBjb250YWluZXIpO1xuICAgIGlmIChtYXBwZWQgIT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gbWFwcGVkO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8ICF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGxldCB3YXNNYXBwZWQgPSBmYWxzZTtcbiAgY29uc3QgdmFsdWVPYmogPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAodmFsdWUpO1xuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgbWFwRW50cnkgPSAoW2lubmVyTmFtZSwgaW5uZXJWYWx1ZV0pID0+IHtcbiAgICBjb25zdCBtYXBwZWRJbm5lclZhbHVlID0gZGVlcE1hcE9iamVjdEludGVybmFsKFxuICAgICAgaW5uZXJWYWx1ZSxcbiAgICAgIGlubmVyTmFtZSxcbiAgICAgIHZhbHVlT2JqLFxuICAgICAgbWFwcGVyLFxuICAgICk7XG4gICAgd2FzTWFwcGVkIHx8PSBtYXBwZWRJbm5lclZhbHVlICE9PSBpbm5lclZhbHVlO1xuICAgIHJldHVybiBbaW5uZXJOYW1lLCAvKiAgICAgICAgICAgICAgKi8gKG1hcHBlZElubmVyVmFsdWUpXTtcbiAgfTtcbiAgY29uc3QgbWFwcGVkRW50cmllcyA9IHR5cGVkRW50cmllcyh2YWx1ZU9iaikubWFwKG1hcEVudHJ5KTtcblxuICBpZiAoIXdhc01hcHBlZCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IG1hcHBlZE9iaiA9IGZyb21UeXBlZEVudHJpZXMobWFwcGVkRW50cmllcyk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgKi8gKG1hcHBlZE9iaik7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBNYXBPYmplY3QgPSAob2JqLCBtYXBwZXIpID0+XG4gIC8qICAgICAgICAgICAgICAqLyAoZGVlcE1hcE9iamVjdEludGVybmFsKG9iaiwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIG1hcHBlcikpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlZXBNYXBPYmplY3QoZGVlcE1hcE9iamVjdCk7XG4gICAgICAgY29uc3QgZGVmaW5lTmFtZSA9IChuYW1lLCBmbikgPT5cbiAgZGVmaW5lUHJvcGVydHkoZm4sICduYW1lJywgeyB2YWx1ZTogbmFtZSB9KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVmaW5lTmFtZShkZWZpbmVOYW1lKTtcbiAgICAgICBjb25zdCBvYmplY3RNYXBNdXRhYmxlID0gKG9iaiwgbWFwcGVyKSA9PiB7XG4gIGNvbnN0IG9sZEVudHJpZXMgPSB0eXBlZEVudHJpZXMob2JqKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWFwRW50cnkgPSAoW2ssIHZdKSA9PiBbaywgbWFwcGVyKHYsIGspXTtcbiAgY29uc3QgbmV3RW50cmllcyA9IHR5cGVkTWFwKG9sZEVudHJpZXMsIG1hcEVudHJ5KTtcbiAgY29uc3QgbmV3T2JqID0gZnJvbVR5cGVkRW50cmllcyhuZXdFbnRyaWVzKTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAqLyAobmV3T2JqKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5vYmplY3RNYXBNdXRhYmxlKG9iamVjdE1hcE11dGFibGUpO1xuICAgICAgIGNvbnN0IHByb3ZpZGVMYXp5TWFwID0gKG1hcCwga2V5LCBtYWtlVmFsdWUpID0+IHtcbiAgY29uc3QgZm91bmQgPSBtYXAuZ2V0KGtleSk7XG4gIGlmIChmb3VuZCAhPT0gdW5kZWZpbmVkIHx8IG1hcC5oYXMoa2V5KSkge1xuICAgIHJldHVybiAvKiAgICAgICAgICAgICovIChmb3VuZCk7XG4gIH1cbiAgY29uc3QgdmFsdWUgPSBtYWtlVmFsdWUoa2V5KTtcbiAgbWFwLnNldChrZXksIHZhbHVlKTtcbiAgcmV0dXJuIHZhbHVlO1xufTtcblxuLypcblxuXG5cblxuXG4gKi8kaM2PX29uY2UucHJvdmlkZUxhenlNYXAocHJvdmlkZUxhenlNYXApO1xuICAgICAgIGNvbnN0IG1ha2VNZWFzdXJlU2Vjb25kcyA9IGN1cnJlbnRUaW1lTWlsbGlzZWMgPT4ge1xuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgbWVhc3VyZVNlY29uZHMgPSBhc3luYyBmbiA9PiB7XG4gICAgY29uc3QgdDAgPSBjdXJyZW50VGltZU1pbGxpc2VjKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oKTtcbiAgICBjb25zdCBkdXJhdGlvbk1pbGxpc2VjID0gY3VycmVudFRpbWVNaWxsaXNlYygpIC0gdDA7XG4gICAgcmV0dXJuIHsgcmVzdWx0LCBkdXJhdGlvbjogZHVyYXRpb25NaWxsaXNlYyAvIDEwMDAgfTtcbiAgfTtcbiAgcmV0dXJuIG1lYXN1cmVTZWNvbmRzO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlTWVhc3VyZVNlY29uZHMobWFrZU1lYXN1cmVTZWNvbmRzKTtcbiAgICAgICBjb25zdCB1bnByZWZpeGVkUHJvcGVydGllcyA9IChvYmosIHByZWZpeCkgPT5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICBmcm9tVHlwZWRFbnRyaWVzKFxuICAgICAgdHlwZWRFbnRyaWVzKG9iailcbiAgICAgICAgLmZpbHRlcigoW2tleV0pID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleS5zbGljZShwcmVmaXgubGVuZ3RoKSwgdmFsdWVdKSxcbiAgICApXG4gICk7JGjNj19vbmNlLnVucHJlZml4ZWRQcm9wZXJ0aWVzKHVucHJlZml4ZWRQcm9wZXJ0aWVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRSVUUiOlsiVFJVRSJdLCJ0eXBlZEVudHJpZXMiOlsidHlwZWRFbnRyaWVzIl0sImZyb21UeXBlZEVudHJpZXMiOlsiZnJvbVR5cGVkRW50cmllcyJdLCJ0eXBlZE1hcCI6WyJ0eXBlZE1hcCJdLCJsb2dMZXZlbHMiOlsibG9nTGV2ZWxzIl0sImRlZXBDb3B5SnNvbmFibGUiOlsiZGVlcENvcHlKc29uYWJsZSJdLCJkZWVwTWFwT2JqZWN0IjpbImRlZXBNYXBPYmplY3QiXSwiZGVmaW5lTmFtZSI6WyJkZWZpbmVOYW1lIl0sIm9iamVjdE1hcE11dGFibGUiOlsib2JqZWN0TWFwTXV0YWJsZSJdLCJwcm92aWRlTGF6eU1hcCI6WyJwcm92aWRlTGF6eU1hcCJdLCJtYWtlTWVhc3VyZVNlY29uZHMiOlsibWFrZU1lYXN1cmVTZWNvbmRzIl0sInVucHJlZml4ZWRQcm9wZXJ0aWVzIjpbInVucHJlZml4ZWRQcm9wZXJ0aWVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEKFbaLpFwAA6RcAAC8AAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbGliLWNoYWluU3RvcmFnZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wYXR0ZXJucyIsIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanMiLCIuL2NhbGxiYWNrLmpzIl0sImV4cG9ydHMiOlsiU3RyZWFtQ2VsbFNoYXBlIiwiYXNzZXJ0UGF0aFNlZ21lbnQiLCJpc1N0cmVhbUNlbGwiLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCIsIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCIsInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxFLEZhcixNLG1ha2VIZWFwWm9uZSxjYjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanNcIiwgW1tcIm1ha2VIZWFwWm9uZVwiLFskaM2PX2EgPT4gKG1ha2VIZWFwWm9uZSA9ICRozY9fYSldXV1dLFtcIi4vY2FsbGJhY2suanNcIiwgW1tcIipcIixbJGjNj19hID0+IChjYiA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VDaGFpblN0b3JhZ2VSb290LCduYW1lJyx7dmFsdWU6XCJtYWtlQ2hhaW5TdG9yYWdlUm9vdFwifSk7JGjNj19vbmNlLm1ha2VDaGFpblN0b3JhZ2VSb290KG1ha2VDaGFpblN0b3JhZ2VSb290KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVN0b3JhZ2VOb2RlQ2hpbGQsJ25hbWUnLHt2YWx1ZTpcIm1ha2VTdG9yYWdlTm9kZUNoaWxkXCJ9KTskaM2PX29uY2UubWFrZVN0b3JhZ2VOb2RlQ2hpbGQobWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IFN0cmVhbUNlbGxTaGFwZSA9IGhhcmRlbih7XG4gIGJsb2NrSGVpZ2h0OiBNLnN0cmluZygpLFxuICB2YWx1ZXM6IE0uYXJyYXkoKSxcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlN0cmVhbUNlbGxTaGFwZShTdHJlYW1DZWxsU2hhcGUpO1xuXG5jb25zdCBDaGFpblN0b3JhZ2VOb2RlSSA9IE0uaW50ZXJmYWNlKCdTdG9yYWdlTm9kZScsIHtcbiAgc2V0VmFsdWU6IE0uY2FsbFdoZW4oTS5zdHJpbmcoKSkucmV0dXJucygpLFxuICBnZXRQYXRoOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICBnZXRTdG9yZUtleTogTS5jYWxsV2hlbigpLnJldHVybnMoTS5yZWNvcmQoKSksXG4gIG1ha2VDaGlsZE5vZGU6IE0uY2FsbChNLnN0cmluZygpKVxuICAgIC5vcHRpb25hbChNLnNwbGl0UmVjb3JkKHt9LCB7IHNlcXVlbmNlOiBNLmJvb2xlYW4oKSB9LCB7fSkpXG4gICAgLnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJykpLFxufSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1N0cmVhbUNlbGwgPSBjZWxsID0+XG4gIGNlbGwgJiZcbiAgdHlwZW9mIGNlbGwgPT09ICdvYmplY3QnICYmXG4gIEFycmF5LmlzQXJyYXkoY2VsbC52YWx1ZXMpICYmXG4gIHR5cGVvZiBjZWxsLmJsb2NrSGVpZ2h0ID09PSAnc3RyaW5nJyAmJlxuICAvXjAkfF5bMS05XVswLTldKiQvLnRlc3QoY2VsbC5ibG9ja0hlaWdodCk7JGjNj19vbmNlLmlzU3RyZWFtQ2VsbChpc1N0cmVhbUNlbGwpO1xuaGFyZGVuKGlzU3RyZWFtQ2VsbCk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBwYXRoU2VnbWVudFBhdHRlcm4gPSAvXlthLXpBLVowLTlfLV17MSwxMDB9JC87XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBhc3NlcnRQYXRoU2VnbWVudCA9IG5hbWUgPT4ge1xuICBwYXRoU2VnbWVudFBhdHRlcm4udGVzdChuYW1lKSB8fFxuICAgIEZhaWxgUGF0aCBzZWdtZW50IG5hbWVzIG11c3QgY29uc2lzdCBvZiAxIHRvIDEwMCBjaGFyYWN0ZXJzIGxpbWl0ZWQgdG8gQVNDSUkgYWxwaGFudW1lcmljcywgdW5kZXJzY29yZXMsIGFuZC9vciBkYXNoZXM6ICR7bmFtZX1gO1xufTskaM2PX29uY2UuYXNzZXJ0UGF0aFNlZ21lbnQoYXNzZXJ0UGF0aFNlZ21lbnQpO1xuaGFyZGVuKGFzc2VydFBhdGhTZWdtZW50KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUNoYWluU3RvcmFnZU5vZGUgPSB6b25lID0+IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYWtlQ2hhaW5TdG9yYWdlTm9kZSA9IHpvbmUuZXhvQ2xhc3MoXG4gICAgJ0NoYWluU3RvcmFnZU5vZGUnLFxuICAgIENoYWluU3RvcmFnZU5vZGVJLFxuICAgIC8qXG5cblxuXG5cblxuXG4gICAgICovXG4gICAgKG1lc3NlbmdlciwgcGF0aCwgeyBzZXF1ZW5jZSA9IGZhbHNlIH0gPSB7fSkgPT4ge1xuICAgICAgYXNzZXJ0LnR5cGVvZihwYXRoLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQudHlwZW9mKHNlcXVlbmNlLCAnYm9vbGVhbicpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IHBhdGgsIG1lc3Nlbmdlciwgc2VxdWVuY2UgfSk7XG4gICAgfSxcbiAgICB7XG4gICAgICBnZXRQYXRoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5wYXRoO1xuICAgICAgfSxcbiAgICAgIC8qXG5cblxuICAgICAgICovXG4gICAgICBhc3luYyBnZXRTdG9yZUtleSgpIHtcbiAgICAgICAgY29uc3QgeyBwYXRoLCBtZXNzZW5nZXIgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIHJldHVybiBjYi5jYWxsRShtZXNzZW5nZXIsIHtcbiAgICAgICAgICBtZXRob2Q6ICdnZXRTdG9yZUtleScsXG4gICAgICAgICAgYXJnczogW3BhdGhdLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvKlxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIG1ha2VDaGlsZE5vZGUobmFtZSwgY2hpbGROb2RlT3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGNvbnN0IHsgc2VxdWVuY2UsIHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgYXNzZXJ0UGF0aFNlZ21lbnQobmFtZSk7XG4gICAgICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IHNlcXVlbmNlLCAuLi5jaGlsZE5vZGVPcHRpb25zIH07XG4gICAgICAgIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZShcbiAgICAgICAgICBtZXNzZW5nZXIsXG4gICAgICAgICAgYCR7cGF0aH0uJHtuYW1lfWAsXG4gICAgICAgICAgbWVyZ2VkT3B0aW9ucyxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgYXN5bmMgc2V0VmFsdWUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBzZXF1ZW5jZSwgcGF0aCwgbWVzc2VuZ2VyIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBhc3NlcnQudHlwZW9mKHZhbHVlLCAnc3RyaW5nJyk7XG4gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICBsZXQgZW50cnk7XG4gICAgICAgIGlmICghc2VxdWVuY2UgJiYgIXZhbHVlKSB7XG4gICAgICAgICAgZW50cnkgPSBbcGF0aF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZW50cnkgPSBbcGF0aCwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNiLmNhbGxFKG1lc3Nlbmdlciwge1xuICAgICAgICAgIG1ldGhvZDogc2VxdWVuY2UgPyAnYXBwZW5kJyA6ICdzZXQnLFxuICAgICAgICAgIGFyZ3M6IFtlbnRyeV0sXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICB9LFxuICApO1xuICByZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGU7XG59OyRozY9fb25jZS5wcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZShwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSk7XG5cbmNvbnN0IG1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZSA9IHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKG1ha2VIZWFwWm9uZSgpKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbiAgaGFuZGxlU3RvcmFnZU1lc3NhZ2UsXG4gIHJvb3RQYXRoLFxuICByb290T3B0aW9ucyA9IHt9LFxuKSB7XG4gIGNvbnN0IG1lc3NlbmdlciA9IGNiLm1ha2VGdW5jdGlvbkNhbGxiYWNrKGhhbmRsZVN0b3JhZ2VNZXNzYWdlKTtcblxuICAvL1xuICBjb25zdCByb290Tm9kZSA9IG1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZShtZXNzZW5nZXIsIHJvb3RQYXRoLCByb290T3B0aW9ucyk7XG4gIHJldHVybiByb290Tm9kZTtcbn1cblxuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VOdWxsU3RvcmFnZU5vZGUgPSAoKSA9PiB7XG4gIC8vXG4gIHJldHVybiBtYWtlQ2hhaW5TdG9yYWdlUm9vdChcbiAgICBGYXIoJ051bGxNZXNzZW5nZXInLCAoKSA9PiBudWxsKSxcbiAgICAnbnVsbCcsXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBtYWtlU3RvcmFnZU5vZGVDaGlsZChzdG9yYWdlTm9kZVJlZiwgY2hpbGROYW1lKSB7XG4gIGNvbnN0IGV4aXN0aW5nU3RvcmFnZU5vZGUgPSBhd2FpdCBzdG9yYWdlTm9kZVJlZjtcbiAgY29uc3Qgc3RvcmFnZU5vZGUgPSBleGlzdGluZ1N0b3JhZ2VOb2RlIHx8IG1ha2VOdWxsU3RvcmFnZU5vZGUoKTtcbiAgcmV0dXJuIEUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGROYW1lKTtcbn1cbmhhcmRlbihtYWtlU3RvcmFnZU5vZGVDaGlsZCk7XG5cbi8vXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICByZXR1cm4gYXN5bmMgdmFsdWUgPT4ge1xuICAgIGNvbnN0IG1hcnNoYWxsZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KG1hcnNoYWxsZWQpO1xuICAgIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkKTtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTdHJlYW1DZWxsU2hhcGUiOlsiU3RyZWFtQ2VsbFNoYXBlIl0sImlzU3RyZWFtQ2VsbCI6WyJpc1N0cmVhbUNlbGwiXSwiYXNzZXJ0UGF0aFNlZ21lbnQiOlsiYXNzZXJ0UGF0aFNlZ21lbnQiXSwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiOlsicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwibWFrZUNoYWluU3RvcmFnZVJvb3QiOlsibWFrZUNoYWluU3RvcmFnZVJvb3QiXSwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiOlsibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiXSwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSI6WyJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABAvHn7vEgAA7xIAACYAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiLCIuL2xpYi1jaGFpblN0b3JhZ2UuanMiXSwiZXhwb3J0cyI6WyJDYXBEYXRhU2hhcGUiLCJhc3NlcnRDYXBEYXRhIiwiYm9hcmRTbG90dGluZ01hcnNoYWxsZXIiLCJtYWtlQm9hcmRSZW1vdGUiLCJtYWtlSGlzdG9yeVJldml2ZXIiLCJwdXJlRGF0YU1hcnNoYWxsZXIiLCJzbG90VG9Cb2FyZFJlbW90ZSIsInVubWFyc2hhbEZyb21Wc3RvcmFnZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRmFyLG1ha2VNYXJzaGFsLE0saXNTdHJlYW1DZWxsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIi4vbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wiaXNTdHJlYW1DZWxsXCIsWyRozY9fYSA9PiAoaXNTdHJlYW1DZWxsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VCb2FyZFJlbW90ZSA9ICh7IGJvYXJkSWQsIGlmYWNlIH0pID0+IHtcbiAgY29uc3Qgbm9uYWxsZWdlZCA9IGlmYWNlID8gaWZhY2UucmVwbGFjZSgvXkFsbGVnZWQ6IC8sICcnKSA6ICcnO1xuICByZXR1cm4gRmFyKGBCb2FyZFJlbW90ZSR7bm9uYWxsZWdlZH1gLCB7IGdldEJvYXJkSWQ6ICgpID0+IGJvYXJkSWQgfSk7XG59O1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5tYWtlQm9hcmRSZW1vdGUobWFrZUJvYXJkUmVtb3RlKTtcbiAgICAgICBjb25zdCBzbG90VG9Cb2FyZFJlbW90ZSA9IChib2FyZElkLCBpZmFjZSkgPT5cbiAgbWFrZUJvYXJkUmVtb3RlKHsgYm9hcmRJZCwgaWZhY2UgfSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2Uuc2xvdFRvQm9hcmRSZW1vdGUoc2xvdFRvQm9hcmRSZW1vdGUpO1xuY29uc3QgYm9hcmRWYWxUb1Nsb3QgPSB2YWwgPT4ge1xuICBpZiAoJ2dldEJvYXJkSWQnIGluIHZhbCkge1xuICAgIHJldHVybiB2YWwuZ2V0Qm9hcmRJZCgpO1xuICB9XG4gIHRocm93IEZhaWxgdW5rbm93biBvYmogaW4gYm9hcmRTbG90dGluZ01hcnNoYWxsZXIudmFsVG9TbG90ICR7dmFsfWA7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYm9hcmRTbG90dGluZ01hcnNoYWxsZXIgPSAoc2xvdFRvVmFsID0gdW5kZWZpbmVkKSA9PiB7XG4gIHJldHVybiBtYWtlTWFyc2hhbChib2FyZFZhbFRvU2xvdCwgc2xvdFRvVmFsLCB7XG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG4gIH0pO1xufTtcblxuLy9cbi8qXG5cbiAqLyRozY9fb25jZS5ib2FyZFNsb3R0aW5nTWFyc2hhbGxlcihib2FyZFNsb3R0aW5nTWFyc2hhbGxlcik7XG4gICAgICAgY29uc3QgQ2FwRGF0YVNoYXBlID0geyBib2R5OiBNLnN0cmluZygpLCBzbG90czogTS5hcnJheSgpIH07JGjNj19vbmNlLkNhcERhdGFTaGFwZShDYXBEYXRhU2hhcGUpO1xuaGFyZGVuKENhcERhdGFTaGFwZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENhcERhdGEgPSBkYXRhID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihkYXRhLCAnb2JqZWN0Jyk7XG4gIGFzc2VydChkYXRhKTtcbiAgdHlwZW9mIGRhdGEuYm9keSA9PT0gJ3N0cmluZycgfHwgRmFpbGBkYXRhIGhhcyBub24tc3RyaW5nIC5ib2R5ICR7ZGF0YS5ib2R5fWA7XG4gIEFycmF5LmlzQXJyYXkoZGF0YS5zbG90cykgfHwgRmFpbGBkYXRhIGhhcyBub24tQXJyYXkgc2xvdHMgJHtkYXRhLnNsb3RzfWA7XG59OyRozY9fb25jZS5hc3NlcnRDYXBEYXRhKGFzc2VydENhcERhdGEpO1xuaGFyZGVuKGFzc2VydENhcERhdGEpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB1bm1hcnNoYWxGcm9tVnN0b3JhZ2UgPSAoZGF0YSwga2V5LCBmcm9tQ2FwRGF0YSwgaW5kZXgpID0+IHtcbiAgY29uc3Qgc2VyaWFsaXplZCA9IGRhdGEuZ2V0KGtleSkgfHwgRmFpbGBubyBkYXRhIGZvciAke2tleX1gO1xuICBhc3NlcnQudHlwZW9mKHNlcmlhbGl6ZWQsICdzdHJpbmcnKTtcbiAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuXG4gIGNvbnN0IHN0cmVhbUNlbGwgPSBKU09OLnBhcnNlKHNlcmlhbGl6ZWQpO1xuICBpZiAoIWlzU3RyZWFtQ2VsbChzdHJlYW1DZWxsKSkge1xuICAgIHRocm93IEZhaWxgbm90IGEgU3RyZWFtQ2VsbDogJHtzdHJlYW1DZWxsfWA7XG4gIH1cblxuICBjb25zdCB7IHZhbHVlcyB9ID0gc3RyZWFtQ2VsbDtcbiAgdmFsdWVzLmxlbmd0aCA+IDAgfHwgRmFpbGBubyBTdHJlYW1DZWxsIHZhbHVlczogJHtzdHJlYW1DZWxsfWA7XG5cbiAgY29uc3QgbWFyc2hhbGxlZCA9IHZhbHVlcy5hdChpbmRleCk7XG4gIGFzc2VydC50eXBlb2YobWFyc2hhbGxlZCwgJ3N0cmluZycpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjYXBEYXRhID0gaGFyZGVuKEpTT04ucGFyc2UobWFyc2hhbGxlZCkpO1xuICBhc3NlcnRDYXBEYXRhKGNhcERhdGEpO1xuXG4gIGNvbnN0IHVubWFyc2hhbGxlZCA9IGZyb21DYXBEYXRhKGNhcERhdGEpO1xuICByZXR1cm4gdW5tYXJzaGFsbGVkO1xufTskaM2PX29uY2UudW5tYXJzaGFsRnJvbVZzdG9yYWdlKHVubWFyc2hhbEZyb21Wc3RvcmFnZSk7XG5oYXJkZW4odW5tYXJzaGFsRnJvbVZzdG9yYWdlKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUhpc3RvcnlSZXZpdmVyID0gKGVudHJpZXMsIHNsb3RUb1ZhbCA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBib2FyZCA9IGJvYXJkU2xvdHRpbmdNYXJzaGFsbGVyKHNsb3RUb1ZhbCk7XG4gIGNvbnN0IHZzTWFwID0gbmV3IE1hcChlbnRyaWVzKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGZyb21DYXBEYXRhID0gKC4uLmFyZ3MpID0+XG4gICAgUmVmbGVjdC5hcHBseShib2FyZC5mcm9tQ2FwRGF0YSwgYm9hcmQsIGFyZ3MpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGdldEl0ZW0gPSBrZXkgPT4gdW5tYXJzaGFsRnJvbVZzdG9yYWdlKHZzTWFwLCBrZXksIGZyb21DYXBEYXRhLCAtMSk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY2hpbGRyZW4gPSBwcmVmaXggPT4ge1xuICAgIHByZWZpeC5lbmRzV2l0aCgnLicpIHx8IEZhaWxgcHJlZml4IG11c3QgZW5kIHdpdGggJy4nYDtcbiAgICByZXR1cm4gaGFyZGVuKFtcbiAgICAgIC4uLm5ldyBTZXQoXG4gICAgICAgIGVudHJpZXNcbiAgICAgICAgICAubWFwKChbaywgX10pID0+IGspXG4gICAgICAgICAgLmZpbHRlcihrID0+IGsuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgICAgICAgIC5tYXAoayA9PiBrLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KCcuJylbMF0pLFxuICAgICAgKSxcbiAgICBdKTtcbiAgfTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaGFzID0gayA9PiB2c01hcC5nZXQoaykgIT09IHVuZGVmaW5lZDtcblxuICByZXR1cm4gaGFyZGVuKHsgZ2V0SXRlbSwgY2hpbGRyZW4sIGhhcyB9KTtcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5tYWtlSGlzdG9yeVJldml2ZXIobWFrZUhpc3RvcnlSZXZpdmVyKTtcbmNvbnN0IHJlamVjdE9DYXAgPSBjYXAgPT4gRmFpbGAke2NhcH0gaXMgbm90IHB1cmUgZGF0YWA7XG4gICAgICAgY29uc3QgcHVyZURhdGFNYXJzaGFsbGVyID0gbWFrZU1hcnNoYWwocmVqZWN0T0NhcCwgcmVqZWN0T0NhcCwge1xuICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnc21hbGxjYXBzJyxcbn0pOyRozY9fb25jZS5wdXJlRGF0YU1hcnNoYWxsZXIocHVyZURhdGFNYXJzaGFsbGVyKTtcbmhhcmRlbihwdXJlRGF0YU1hcnNoYWxsZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUJvYXJkUmVtb3RlIjpbIm1ha2VCb2FyZFJlbW90ZSJdLCJzbG90VG9Cb2FyZFJlbW90ZSI6WyJzbG90VG9Cb2FyZFJlbW90ZSJdLCJib2FyZFNsb3R0aW5nTWFyc2hhbGxlciI6WyJib2FyZFNsb3R0aW5nTWFyc2hhbGxlciJdLCJDYXBEYXRhU2hhcGUiOlsiQ2FwRGF0YVNoYXBlIl0sImFzc2VydENhcERhdGEiOlsiYXNzZXJ0Q2FwRGF0YSJdLCJ1bm1hcnNoYWxGcm9tVnN0b3JhZ2UiOlsidW5tYXJzaGFsRnJvbVZzdG9yYWdlIl0sIm1ha2VIaXN0b3J5UmV2aXZlciI6WyJtYWtlSGlzdG9yeVJldml2ZXIiXSwicHVyZURhdGFNYXJzaGFsbGVyIjpbInB1cmVEYXRhTWFyc2hhbGxlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABueDuMbQYAAG0GAAArAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldGhvZC10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIl0sImV4cG9ydHMiOlsiYmluZEFsbE1ldGhvZHMiLCJnZXRNZXRob2ROYW1lcyIsImdldFN0cmluZ01ldGhvZE5hbWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcmVhbEdldE1ldGhvZE5hbWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChyZWFsR2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IHsgY3JlYXRlLCBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldE1ldGhvZE5hbWVzID0gdmFsID0+XG4gIC8qICAgICAgICAgICAgICAqLyAocmVhbEdldE1ldGhvZE5hbWVzKHZhbCkpOyRozY9fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7XG5oYXJkZW4oZ2V0TWV0aG9kTmFtZXMpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldFN0cmluZ01ldGhvZE5hbWVzID0gdmFsID0+XG4gIC8qICAgICAgICAgICAgICAgICAgICovIChcbiAgICByZWFsR2V0TWV0aG9kTmFtZXModmFsKS5maWx0ZXIobmFtZSA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpXG4gICk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZ2V0U3RyaW5nTWV0aG9kTmFtZXMoZ2V0U3RyaW5nTWV0aG9kTmFtZXMpO1xuICAgICAgIGNvbnN0IGJpbmRBbGxNZXRob2RzID0gb2JqID0+XG4gIGhhcmRlbihcbiAgICBjcmVhdGUoXG4gICAgICBvYmosXG4gICAgICBmcm9tRW50cmllcyhcbiAgICAgICAgcmVhbEdldE1ldGhvZE5hbWVzKG9iaikubWFwKG5hbWUgPT4gW1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAge1xuICAgICAgICAgICAgdmFsdWU6ICgvKiAgICAgICAgICAgICAgICAgICAgKi8gLi4uYXJncykgPT5cbiAgICAgICAgICAgICAgYXBwbHkob2JqW25hbWVdLCBvYmosIGFyZ3MpLFxuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgKSxcbiAgKTskaM2PX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuaGFyZGVuKGJpbmRBbGxNZXRob2RzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImdldFN0cmluZ01ldGhvZE5hbWVzIjpbImdldFN0cmluZ01ldGhvZE5hbWVzIl0sImJpbmRBbGxNZXRob2RzIjpbImJpbmRBbGxNZXRob2RzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALJ9qtDJNgAAyTYAACYAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0cmljcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJCTE9DS19ISVNUT0dSQU1fTUVUUklDUyIsIkhJU1RPR1JBTV9NRVRSSUNTIiwiS0VSTkVMX1NUQVRTX01FVFJJQ1MiLCJLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MiLCJLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MiLCJRdWV1ZU1ldHJpY0FzcGVjdCIsIm1ha2VRdWV1ZU1ldHJpY3MiLCJtYWtlUXVldWVNZXRyaWNzTWV0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsaXNOYXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJpc05hdFwiLFskaM2PX2EgPT4gKGlzTmF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTID0gW1xuICA1LFxuICAxMCxcbiAgMjUsXG4gIDUwLFxuICAxMDAsXG4gIDI1MCxcbiAgNTAwLFxuICAxMDAwLFxuICAyNTAwLFxuICA1MDAwLFxuICAxMDAwMCxcbiAgSW5maW5pdHksXG5dO1xuY29uc3QgSElTVE9HUkFNX1NFQ09ORFNfTEFURU5DWV9CT1VOREFSSUVTID1cbiAgSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUy5tYXAobXMgPT4gbXMgLyAxMDAwKTtcblxuLy9cbi8vXG4gICAgICAgY29uc3QgSElTVE9HUkFNX01FVFJJQ1MgPSAvKiAgICAgICAgICAgICAgICAqLyAoe1xuICBzd2luZ3NldF9jcmFua19wcm9jZXNzaW5nX3RpbWU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Byb2Nlc3NpbmcgdGltZSBwZXIgY3JhbmsgKG1zKScsXG4gICAgdW5pdDogJ21zJyxcbiAgICBib3VuZGFyaWVzOiBBcnJheS5vZigxLCAxMSwgMjEsIDMxLCA0MSwgNTEsIDYxLCA3MSwgODEsIDkxLCBJbmZpbml0eSksXG4gIH0sXG4gIHN3aW5nc2V0X2Jsb2NrX3Byb2Nlc3Npbmdfc2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUHJvY2Vzc2luZyB0aW1lIHBlciBibG9jaycsXG4gICAgdW5pdDogJ3MnLFxuICAgIGJvdW5kYXJpZXM6IEhJU1RPR1JBTV9TRUNPTkRTX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbiAgc3dpbmdzZXRfdmF0X3N0YXJ0dXA6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ZhdCBzdGFydHVwIHRpbWUgKG1zKScsXG4gICAgdW5pdDogJ21zJyxcbiAgICBib3VuZGFyaWVzOiBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTLFxuICB9LFxuICBzd2luZ3NldF92YXRfZGVsaXZlcnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ZhdCBkZWxpdmVyeSB0aW1lIChtcyknLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbiAgc3dpbmdzZXRfbWV0ZXJfdXNhZ2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ZhdCBtZXRlciB1c2FnZScsXG4gICAgdW5pdDogJ21zJyxcbiAgICBib3VuZGFyaWVzOiBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTLFxuICB9LFxufSk7JGjNj19vbmNlLkhJU1RPR1JBTV9NRVRSSUNTKEhJU1RPR1JBTV9NRVRSSUNTKTtcblxuY29uc3QgYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjID0ge1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICB1bml0OiAncycsXG4gIGFkdmljZToge1xuICAgIGV4cGxpY2l0QnVja2V0Qm91bmRhcmllczogW1xuICAgICAgMC4xLCAwLjIsIDAuMywgMC40LCAwLjUsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDEwLCAxNSwgMzAsXG4gICAgXSxcbiAgfSxcbn07XG4gICAgICAgY29uc3QgQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MgPSAvKiAgICAgICAgICAgICAgICAqLyAoe1xuICBzd2luZ3NldFJ1blNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Blci1ibG9jayB0aW1lIHNwZW50IGV4ZWN1dGluZyBTd2luZ1NldCcsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBzd2luZ3NldENoYWluU2F2ZVNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Blci1ibG9jayB0aW1lIHNwZW50IHByb3BhZ2F0aW5nIFN3aW5nU2V0IHN0YXRlIGludG8gY29zbW9zJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIHN3aW5nc2V0Q29tbWl0U2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1Blci1ibG9jayB0aW1lIHNwZW50IGNvbW1pdHRpbmcgU3dpbmdTZXQgc3RhdGUgdG8gaG9zdCBzdG9yYWdlJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGNvc21vc0NvbW1pdFNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Blci1ibG9jayB0aW1lIHNwZW50IGNvbW1pdHRpbmcgY29zbW9zIHN0YXRlJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGZ1bGxDb21taXRTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnUGVyLWJsb2NrIHRpbWUgc3BlbnQgY29tbWl0dGluZyBzdGF0ZSwgaW5jbHVzaXZlIG9mIENPTU1JVF9CTE9DSyBwcm9jZXNzaW5nIHBsdXMgdGltZSBzcGVudCBbb3V0c2lkZSBvZiBjb3NtaWMtc3dpbmdzZXRdIGJlZm9yZSBhbmQgYWZ0ZXIgaXQnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgaW50ZXJCbG9ja1NlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1RpbWUgc3BlbnQgaWRsZSBiZXR3ZWVuIGJsb2NrcycsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBhZnRlckNvbW1pdEhhbmdvdmVyU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1Blci1ibG9jayB0aW1lIHNwZW50IHdhaXRpbmcgZm9yIHByZXZpb3VzLWJsb2NrIGFmdGVyQ29tbWl0IHdvcmsnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgYmxvY2tMYWdTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaGUgZGVsYXkgb2YgZWFjaCBibG9jayBmcm9tIGl0cyBleHBlY3RlZCBiZWdpbiB0aW1lJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gICAgLy9cbiAgICBhZHZpY2U6IHtcbiAgICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYy5hZHZpY2UsXG4gICAgICBleHBsaWNpdEJ1Y2tldEJvdW5kYXJpZXM6IC8qICAgICAgICAgICAgICAgICAgICovIChbXG4gICAgICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYy5hZHZpY2UuZXhwbGljaXRCdWNrZXRCb3VuZGFyaWVzLFxuICAgICAgICAuLi5bNjAsIDEyMCwgMTgwLCAyNDAsIDMwMCwgNjAwLCAzNjAwXSxcbiAgICAgIF0pLFxuICAgIH0sXG4gIH0sXG59KTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5CTE9DS19ISVNUT0dSQU1fTUVUUklDUyhCTE9DS19ISVNUT0dSQU1fTUVUUklDUyk7XG4gICAgICAgY29uc3QgUXVldWVNZXRyaWNBc3BlY3QgPSAvKiAgICAgICAgICAgICAgICAqLyAoe1xuICBMZW5ndGg6ICdsZW5ndGgnLFxuICBJbmNyZW1lbnRDb3VudDogJ2luY3JlbWVudHMnLFxuICBEZWNyZW1lbnRDb3VudDogJ2RlY3JlbWVudHMnLFxufSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlF1ZXVlTWV0cmljQXNwZWN0KFF1ZXVlTWV0cmljQXNwZWN0KTtcbiAgICAgICBjb25zdCBtYWtlUXVldWVNZXRyaWNzTWV0YSA9IChuYW1lUHJlZml4LCBkZXNjUHJlZml4KSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWV0cmljc01ldGEgPSBbXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0Lkxlbmd0aCwgJ2xlbmd0aCcsICdsZW5ndGgnXSxcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuSW5jcmVtZW50Q291bnQsICdhZGQnLCAnaW5jcmVtZW50cyddLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5EZWNyZW1lbnRDb3VudCwgJ3JlbW92ZScsICdkZWNyZW1lbnRzJ10sXG4gIF07XG4gIGNvbnN0IGVudHJpZXMgPSBtZXRyaWNzTWV0YS5tYXAoKFthc3BlY3QsIG5hbWVTdWZmaXgsIGRlc2NTdWZmaXhdKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IGAke25hbWVQcmVmaXh9XyR7bmFtZVN1ZmZpeH1gO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYCR7ZGVzY1ByZWZpeH0gJHtkZXNjU3VmZml4fWA7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiBbYXNwZWN0LCB7IG5hbWUsIG9wdGlvbnM6IHsgZGVzY3JpcHRpb24gfSB9XTtcbiAgfSk7XG4gIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoZW50cmllcyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlUXVldWVNZXRyaWNzTWV0YShtYWtlUXVldWVNZXRyaWNzTWV0YSk7XG4gICAgICAgY29uc3QgbWFrZVF1ZXVlTWV0cmljcyA9ICh7XG4gIG90ZWxNZXRlcixcbiAgbmFtZVByZWZpeCxcbiAgZGVzY1ByZWZpeCxcbiAgY29uc29sZSxcbn0pID0+IHtcbiAgY29uc3Qge1xuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5MZW5ndGhdOiBsZW5ndGhNZXRhLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5JbmNyZW1lbnRDb3VudF06IHVwTWV0YSxcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuRGVjcmVtZW50Q291bnRdOiBkb3duTWV0YSxcbiAgfSA9IG1ha2VRdWV1ZU1ldHJpY3NNZXRhKG5hbWVQcmVmaXgsIGRlc2NQcmVmaXgpO1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBsZW5ndGhDb3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZVVwRG93bkNvdW50ZXIoXG4gICAgbGVuZ3RoTWV0YS5uYW1lLFxuICAgIGxlbmd0aE1ldGEub3B0aW9ucyxcbiAgKTtcbiAgLy9cbiAgLy9cbiAgY29uc3QgdXBDb3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZU9ic2VydmFibGVDb3VudGVyKFxuICAgIHVwTWV0YS5uYW1lLFxuICAgIHVwTWV0YS5vcHRpb25zLFxuICApO1xuICBjb25zdCBkb3duQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVPYnNlcnZhYmxlQ291bnRlcihcbiAgICBkb3duTWV0YS5uYW1lLFxuICAgIGRvd25NZXRhLm9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGluY3JlbWVudHMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKG5ldyBNYXAoKSk7XG4gIGNvbnN0IGRlY3JlbWVudHMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKG5ldyBNYXAoKSk7XG4gIHVwQ291bnRlci5hZGRDYWxsYmFjayhvYnNlcnZlciA9PiB7XG4gICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCB2YWx1ZV0gb2YgaW5jcmVtZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUodmFsdWUsIHsgcXVldWU6IHF1ZXVlTmFtZSB9KTtcbiAgICB9XG4gIH0pO1xuICBkb3duQ291bnRlci5hZGRDYWxsYmFjayhvYnNlcnZlciA9PiB7XG4gICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCB2YWx1ZV0gb2YgZGVjcmVtZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgIG9ic2VydmVyLm9ic2VydmUodmFsdWUsIHsgcXVldWU6IHF1ZXVlTmFtZSB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIGxldCByZWFkeSA9IGZhbHNlO1xuICBjb25zdCBsZW5ndGhzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChuZXcgTWFwKCkpO1xuICBjb25zdCBudWRnZSA9IChxdWV1ZU5hbWUsIGRlbHRhLCBpbml0ID0gZmFsc2UpID0+IHtcbiAgICBpZiAoIWxlbmd0aHMuaGFzKHF1ZXVlTmFtZSkpIHtcbiAgICAgIGlmICghaW5pdCkgY29uc29sZT8ud2FybignVW5rbm93biBxdWV1ZScsIHF1ZXVlTmFtZSk7XG4gICAgICBsZW5ndGhzLnNldChxdWV1ZU5hbWUsIDApO1xuICAgICAgaW5jcmVtZW50cy5zZXQocXVldWVOYW1lLCAwKTtcbiAgICAgIGRlY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgMCk7XG4gICAgfVxuICAgIGNvbnN0IG9sZExlbmd0aCA9IGxlbmd0aHMuZ2V0KHF1ZXVlTmFtZSk7XG4gICAgbGVuZ3Rocy5zZXQocXVldWVOYW1lLCBvbGRMZW5ndGggKyBkZWx0YSk7XG4gICAgY29uc3QgZGltZW5zaW9ucyA9IHsgcXVldWU6IHF1ZXVlTmFtZSB9O1xuICAgIGxlbmd0aENvdW50ZXIuYWRkKGRlbHRhLCBkaW1lbnNpb25zKTtcbiAgICBpZiAoaW5pdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoZGVsdGEgPiAwKSB7XG4gICAgICAvL1xuICAgICAgaW5jcmVtZW50cy5zZXQocXVldWVOYW1lLCAoaW5jcmVtZW50cy5nZXQocXVldWVOYW1lKSB8fCAwKSArIGRlbHRhKTtcbiAgICB9IGVsc2UgaWYgKGRlbHRhIDwgMCkge1xuICAgICAgLy9cbiAgICAgIGRlY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgKGRlY3JlbWVudHMuZ2V0KHF1ZXVlTmFtZSkgfHwgMCkgLSBkZWx0YSk7XG4gICAgfVxuICAgIHJlYWR5ID0gdHJ1ZTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBpbml0TGVuZ3RoczogaW5pdGlhbExlbmd0aHMgPT4ge1xuICAgICAgIXJlYWR5IHx8XG4gICAgICAgIGNvbnNvbGU/Lndhcm4oXG4gICAgICAgICAgYFVuZXhwZWN0ZWQgcmVwZWF0IHF1ZXVlIGxlbmd0aCBpbml0aWFsaXphdGlvbiBmcm9tICR7cShsZW5ndGhzKX0gdG8gJHtxKGluaXRpYWxMZW5ndGhzKX1gXG4gICAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IFtxdWV1ZU5hbWUsIG5ld0xlbmd0aF0gb2YgT2JqZWN0LmVudHJpZXMoaW5pdGlhbExlbmd0aHMpKSB7XG4gICAgICAgIGlmICghaXNOYXQobmV3TGVuZ3RoKSkge1xuICAgICAgICAgIGNvbnNvbGU/Lndhcm4oYEludmFsaWQgbGVuZ3RoIGZvciBxdWV1ZSAke3EocXVldWVOYW1lKX06YCwgbmV3TGVuZ3RoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBudWRnZShxdWV1ZU5hbWUsIG5ld0xlbmd0aCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGVMZW5ndGhzOiBuZXdMZW5ndGhzID0+IHtcbiAgICAgIHJlYWR5IHx8IGNvbnNvbGU/Lndhcm4oJ01pc3NpbmcgaW5pdGlhbCBxdWV1ZSBsZW5ndGhzJyk7XG4gICAgICBmb3IgKGNvbnN0IFtxdWV1ZU5hbWUsIG5ld0xlbmd0aF0gb2YgT2JqZWN0LmVudHJpZXMobmV3TGVuZ3RocykpIHtcbiAgICAgICAgaWYgKCFpc05hdChuZXdMZW5ndGgpKSB7XG4gICAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBsZW5ndGggZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBuZXdMZW5ndGgpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgbmV3TGVuZ3RoIC0gKGxlbmd0aHMuZ2V0KHF1ZXVlTmFtZSkgfHwgMCkpO1xuICAgICAgfVxuICAgIH0sXG4gICAgaW5jTGVuZ3RoOiAocXVldWVOYW1lLCBkZWx0YSA9IDEpID0+IHtcbiAgICAgIGlmICghaXNOYXQoZGVsdGEpKSB7XG4gICAgICAgIGNvbnNvbGU/Lndhcm4oYEludmFsaWQgaW5jcmVtZW50IGZvciBxdWV1ZSAke3EocXVldWVOYW1lKX06YCwgZGVsdGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBudWRnZShxdWV1ZU5hbWUsIGRlbHRhKTtcbiAgICB9LFxuICAgIGRlY0xlbmd0aDogKHF1ZXVlTmFtZSwgZGVsdGEgPSAxKSA9PiB7XG4gICAgICBpZiAoIWlzTmF0KGRlbHRhKSkge1xuICAgICAgICBjb25zb2xlPy53YXJuKGBJbnZhbGlkIGRlY3JlbWVudCBmb3IgcXVldWUgJHtxKHF1ZXVlTmFtZSl9OmAsIGRlbHRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbnVkZ2UocXVldWVOYW1lLCAtZGVsdGEpO1xuICAgIH0sXG4gIH0pO1xufTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UubWFrZVF1ZXVlTWV0cmljcyhtYWtlUXVldWVNZXRyaWNzKTtcbmNvbnN0IE1ldHJpY1R5cGUgPSAvKiAgICAgICAgICAgICAgICAqLyAoe1xuICBDb3VudGVyOiAnY291bnRlcicsXG4gIEdhdWdlOiAnZ2F1Z2UnLFxufSk7XG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTID0gW1xuICB7XG4gICAga2V5OiAnc3lzY2FsbHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9hbGxfc3lzY2FsbF90b3RhbCcsXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxTZW5kJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3NlbmQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgbWVzc2FnZSBzZW5kIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsQ2FsbE5vdycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdjYWxsTm93JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHN5bmNocm9ub3VzIGRldmljZSBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFN1YnNjcmliZScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdzdWJzY3JpYmUnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgcHJvbWlzZSBzdWJzY3JpcHRpb24ga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxSZXNvbHZlJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3Jlc29sdmUnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgcHJvbWlzZSByZXNvbHV0aW9uIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsRXhpdCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdleGl0JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBleGl0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVHZXQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVHZXQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgZ2V0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVTZXQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVTZXQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgc2V0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVHZXROZXh0S2V5JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3ZhdHN0b3JlR2V0TmV4dCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXRzdG9yZSBnZXROZXh0S2V5IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsVmF0c3RvcmVEZWxldGUnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVEZWxldGUnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgZGVsZXRlIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsRHJvcEltcG9ydHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnZHJvcEltcG9ydHMnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgZHJvcCBpbXBvcnRzIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkaXNwYXRjaGVzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZGlzcGF0Y2hfdG90YWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkaXNwYXRjaERlbGl2ZXInLFxuICAgIG5hbWU6ICdzd2luZ3NldF9kaXNwYXRjaF9kZWxpdmVyX3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgbWVzc2FnZSBkZWxpdmVyaWVzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2Rpc3BhdGNoTm90aWZ5JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZGlzcGF0Y2hfbm90aWZ5X3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgcHJvbWlzZSBub3RpZmljYXRpb25zJyxcbiAgfSxcbl07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyhLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MpO1xuICAgICAgIGNvbnN0IEtFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyA9IFtcbiAge1xuICAgIGtleTogJ2tlcm5lbE9iamVjdHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9rZXJuZWxfb2JqZWN0cycsXG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmUga2VybmVsIG9iamVjdHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna2VybmVsRGV2aWNlcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2tlcm5lbF9kZXZpY2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBrZXJuZWwgZGV2aWNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrZXJuZWxQcm9taXNlcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmUga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2twVW5yZXNvbHZlZCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3VucmVzb2x2ZWRfa2VybmVsX3Byb21pc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ1VucmVzb2x2ZWQga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2twRnVsZmlsbGVkJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZnVsZmlsbGVkX2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdGdWxmaWxsZWQga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2twUmVqZWN0ZWQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9yZWplY3RlZF9rZXJuZWxfcHJvbWlzZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnUmVqZWN0ZWQga2VybmVsIHByb21pc2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3J1blF1ZXVlTGVuZ3RoJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfcnVuX3F1ZXVlX2xlbmd0aCcsXG4gICAgY29uc2Vuc3VzOiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOiAnTGVuZ3RoIG9mIHRoZSBrZXJuZWwgcnVuIHF1ZXVlJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2FjY2VwdGFuY2VRdWV1ZUxlbmd0aCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2FjY2VwdGFuY2VfcXVldWVfbGVuZ3RoJyxcbiAgICBjb25zZW5zdXM6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdMZW5ndGggb2YgdGhlIGtlcm5lbCBhY2NlcHRhbmNlIHF1ZXVlJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3Byb21pc2VRdWV1ZXNMZW5ndGgnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9wcm9taXNlX3F1ZXVlc19sZW5ndGgnLFxuICAgIGNvbnNlbnN1czogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ0NvbWJpbmVkIGxlbmd0aCBvZiBhbGwga2VybmVsIHByb21pc2UgcXVldWVzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2NsaXN0RW50cmllcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2NsaXN0X2VudHJpZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGtlcm5lbCBjLWxpc3QnLFxuICB9LFxuICB7XG4gICAga2V5OiAndmF0cycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3ZhdHMnLFxuICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIGFjdGl2ZSB2YXRzJyxcbiAgfSxcbl07JGjNj19vbmNlLktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyhLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MpO1xuXG5jb25zdCB7IENvdW50ZXIsIEdhdWdlIH0gPSBNZXRyaWNUeXBlO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgS0VSTkVMX1NUQVRTX01FVFJJQ1MgPSBoYXJkZW4oW1xuICAuLi5LRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MubWFwKG0gPT4gKHsgLi4ubSwgbWV0cmljVHlwZTogQ291bnRlciB9KSksXG4gIC4uLktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUy5tYXAobSA9PiAoeyAuLi5tLCBtZXRyaWNUeXBlOiBHYXVnZSB9KSksXG5dKTtcblxuLy9cbiRozY9fb25jZS5LRVJORUxfU1RBVFNfTUVUUklDUyhLRVJORUxfU1RBVFNfTUVUUklDUyk7Y29uc3Qga2VybmVsU3RhdHNLZXlzPW5ldyBNYXAoKTtcbmZvciAoY29uc3QgeyBrZXkgfSBvZiBLRVJORUxfU1RBVFNfTUVUUklDUykge1xuICBrZXJuZWxTdGF0c0tleXMuc2V0KGtleSwgKGtlcm5lbFN0YXRzS2V5cy5nZXQoa2V5KSB8fCAwKSArIDEpO1xufVxuY29uc3QgZHVwbGljYXRlS2VybmVsU3RhdHNLZXlzID0gWy4uLmtlcm5lbFN0YXRzS2V5cy5lbnRyaWVzKCldLmZsYXRNYXAoXG4gIChba2V5LCB2YWx1ZV0pID0+ICh2YWx1ZSA+IDEgPyBba2V5XSA6IFtdKSxcbik7XG5pZiAoZHVwbGljYXRlS2VybmVsU3RhdHNLZXlzLmxlbmd0aCA+IDApIHtcbiAgY29uc3QgbXNnID0gYER1cGxpY2F0ZSBrZXJuZWwgc3RhdHMga2V5cyAke0pTT04uc3RyaW5naWZ5KGR1cGxpY2F0ZUtlcm5lbFN0YXRzS2V5cyl9YDtcbiAgdGhyb3cgRXJyb3IobXNnKTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhJU1RPR1JBTV9NRVRSSUNTIjpbIkhJU1RPR1JBTV9NRVRSSUNTIl0sIkJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTIjpbIkJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTIl0sIlF1ZXVlTWV0cmljQXNwZWN0IjpbIlF1ZXVlTWV0cmljQXNwZWN0Il0sIm1ha2VRdWV1ZU1ldHJpY3NNZXRhIjpbIm1ha2VRdWV1ZU1ldHJpY3NNZXRhIl0sIm1ha2VRdWV1ZU1ldHJpY3MiOlsibWFrZVF1ZXVlTWV0cmljcyJdLCJLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MiOlsiS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTIl0sIktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyI6WyJLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MiXSwiS0VSTkVMX1NUQVRTX01FVFJJQ1MiOlsiS0VSTkVMX1NUQVRTX01FVFJJQ1MiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5kesHwQFAAAEBQAAKwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9uYXR1cmFsLXNvcnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm5hdHVyYWxDb21wYXJlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG4gKi9cbmNvbnN0IGNvbXBhcmVOYXRzID0gKGEsIGIpID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgZGlmZiA9ICthIC0gK2I7XG4gIGNvbnN0IGZpbml0ZURpZmYgPVxuICAgIChOdW1iZXIuaXNGaW5pdGUoZGlmZikgJiYgZGlmZikgfHxcbiAgICAoYSA9PT0gYiA/IDAgOiBOdW1iZXIoQmlnSW50KGEpIC0gQmlnSW50KGIpKSB8fCBhLmxlbmd0aCAtIGIubGVuZ3RoKTtcblxuICAvL1xuICByZXR1cm4gTWF0aC5zaWduKGZpbml0ZURpZmYpO1xufTtcblxuLy9cbi8vXG4vL1xuY29uc3QgY29tcGFyZVN0cmluZ3MgPSAoYSwgYikgPT4gKGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwKTtcblxuY29uc3QgclByZWZpeGVkRGlnaXRzID0gL14oXFxEKikoXFxkKykoXFxELip8KS9zO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbmF0dXJhbENvbXBhcmUgPSAoYSwgYikgPT4ge1xuICBjb25zdCBbX2EsIGFQcmVmaXgsIGFEaWdpdHMsIGFTdWZmaXhdID0gclByZWZpeGVkRGlnaXRzLmV4ZWMoYSkgfHwgW107XG4gIGlmIChhUHJlZml4ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBbX2IsIGJQcmVmaXgsIGJEaWdpdHMsIGJTdWZmaXhdID0gclByZWZpeGVkRGlnaXRzLmV4ZWMoYikgfHwgW107XG4gICAgaWYgKGJQcmVmaXggPT09IGFQcmVmaXgpIHtcbiAgICAgIHJldHVybiBjb21wYXJlTmF0cyhhRGlnaXRzLCBiRGlnaXRzKSB8fCBjb21wYXJlU3RyaW5ncyhhU3VmZml4LCBiU3VmZml4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKGEsIGIpO1xufTskaM2PX29uY2UubmF0dXJhbENvbXBhcmUobmF0dXJhbENvbXBhcmUpO1xuaGFyZGVuKG5hdHVyYWxDb21wYXJlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdHVyYWxDb21wYXJlIjpbIm5hdHVyYWxDb21wYXJlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANF4EkzgLAAA4CwAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvc2VzLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyIsIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vc3RyZWFtIiwiamVzc2llLmpzIiwiLi9qcy11dGlscy5qcyJdLCJleHBvcnRzIjpbIlByb21pc2VBbGxPckVycm9ycyIsImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiLCJhbGxWYWx1ZXMiLCJhc3NlcnRBbGxEZWZpbmVkIiwiYXR0ZW51YXRlIiwiZGVlcGx5RnVsZmlsbGVkT2JqZWN0IiwiZm9yZXZlciIsImZyb21VbmlxdWVFbnRyaWVzIiwibWFrZUxpbWl0ZWRDb25zb2xlIiwib2JqZWN0TWFwIiwib2JqZWN0TWV0YU1hcCIsInN5bmNocm9uaXplZFRlZSIsInVudGlsVHJ1ZSIsIndoaWxlVHJ1ZSIsIndpdGhEZWZlcnJlZENsZWFudXAiLCJ6aXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsb2JqZWN0TWV0YU1hcCxmcm9tVW5pcXVlRW50cmllcyxxLEZhaWwsbWFrZUVycm9yLGFubm90YXRlRXJyb3IsWCxkZWVwbHlGdWxmaWxsZWQsaXNQcmltaXRpdmUsbWFrZVByb21pc2VLaXQsbWFrZVF1ZXVlLGFzeW5jR2VuZXJhdGUsbG9nTGV2ZWxzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSksJGjNj19saXZlW1wib2JqZWN0TWFwXCJdXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1ldGEtbWFwLmpzXCIsIFtbXCJvYmplY3RNZXRhTWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWV0YU1hcCA9ICRozY9fYSksJGjNj19saXZlW1wib2JqZWN0TWV0YU1hcFwiXV1dXV0sW1wiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanNcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpLCRozY9fbGl2ZVtcImZyb21VbmlxdWVFbnRyaWVzXCJdXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLFskaM2PX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRozY9fYSldXSxbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9zdHJlYW1cIiwgW1tcIm1ha2VRdWV1ZVwiLFskaM2PX2EgPT4gKG1ha2VRdWV1ZSA9ICRozY9fYSldXV1dLFtcImplc3NpZS5qc1wiLCBbW1wiYXN5bmNHZW5lcmF0ZVwiLFskaM2PX2EgPT4gKGFzeW5jR2VuZXJhdGUgPSAkaM2PX2EpXV1dXSxbXCIuL2pzLXV0aWxzLmpzXCIsIFtbXCJsb2dMZXZlbHNcIixbJGjNj19hID0+IChsb2dMZXZlbHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgZnJvbUVudHJpZXMsIGtleXMsIHZhbHVlcyB9ID0gT2JqZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IG1ha2VMaW1pdGVkQ29uc29sZSA9IG1ha2VMb2dnZXIgPT4ge1xuICBjb25zdCBsaW1pdGVkQ29uc29sZSA9IC8qICAgICAgICAgICAgICAqLyAoXG4gICAgZnJvbUVudHJpZXMobG9nTGV2ZWxzLm1hcChsZXZlbCA9PiBbbGV2ZWwsIG1ha2VMb2dnZXIobGV2ZWwpXSkpXG4gICk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoaGFyZGVuKGxpbWl0ZWRDb25zb2xlKSk7XG59OyRozY9fb25jZS5tYWtlTGltaXRlZENvbnNvbGUobWFrZUxpbWl0ZWRDb25zb2xlKTtcbmhhcmRlbihtYWtlTGltaXRlZENvbnNvbGUpO1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGVlcGx5RnVsZmlsbGVkT2JqZWN0ID0gYXN5bmMgb2JqID0+IHtcbiAgIWlzUHJpbWl0aXZlKG9iaikgfHwgRmFpbGBwYXJhbSBtdXN0IGJlIGFuIG9iamVjdGA7XG4gIHJldHVybiBkZWVwbHlGdWxmaWxsZWQob2JqKTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCBtYWtlQWdncmVnYXRlRXJyb3IgPVxuICB0eXBlb2YgQWdncmVnYXRlRXJyb3IgPT09ICdmdW5jdGlvbidcbiAgICA/IChlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpID0+IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSwgb3B0aW9ucylcbiAgICA6IChlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIG1ha2VFcnJvcihtZXNzYWdlID8/ICdtdWx0aXBsZSBlcnJvcnMnLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIGVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgUHJvbWlzZUFsbE9yRXJyb3JzID0gYXN5bmMgaXRlbXMgPT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGl0ZW1zKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgIGNvbnN0IGVycm9ycyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgIHJlc3VsdHMuZmlsdGVyKCh7IHN0YXR1cyB9KSA9PiBzdGF0dXMgPT09ICdyZWplY3RlZCcpXG4gICAgKS5tYXAocmVzdWx0ID0+IHJlc3VsdC5yZWFzb24pO1xuICAgIGlmICghZXJyb3JzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocmVzdWx0cykubWFwKFxuICAgICAgICByZXN1bHQgPT4gcmVzdWx0LnZhbHVlLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGVycm9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRocm93IGVycm9yc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbWFrZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5Qcm9taXNlQWxsT3JFcnJvcnMoUHJvbWlzZUFsbE9yRXJyb3JzKTtcbiAgICAgICBjb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5ID0gYXN5bmMgKHRyaWVyLCBmaW5hbGl6ZXIpID0+XG4gIHRyaWVyKCkudGhlbihcbiAgICBhc3luYyByZXN1bHQgPT4gZmluYWxpemVyKCkudGhlbigoKSA9PiByZXN1bHQpLFxuICAgIGFzeW5jIHRyeUVycm9yID0+XG4gICAgICBmaW5hbGl6ZXIodHJ5RXJyb3IpXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgICgpID0+IHRyeUVycm9yLFxuICAgICAgICAgIGZpbmFsaXplRXJyb3IgPT4gbWFrZUFnZ3JlZ2F0ZUVycm9yKFt0cnlFcnJvciwgZmluYWxpemVFcnJvcl0pLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSksXG4gICk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hZ2dyZWdhdGVUcnlGaW5hbGx5KGFnZ3JlZ2F0ZVRyeUZpbmFsbHkpO1xuICAgICAgIGNvbnN0IHdpdGhEZWZlcnJlZENsZWFudXAgPSBhc3luYyBmbiA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjbGVhbnVwc0xJRk8gPSBbXTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGFkZENsZWFudXAgPSBjbGVhbnVwID0+IHtcbiAgICBjbGVhbnVwc0xJRk8udW5zaGlmdChjbGVhbnVwKTtcbiAgfTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZmluYWxpemVyID0gYXN5bmMgZXJyID0+IHtcbiAgICAvL1xuICAgIGNvbnN0IGNsZWFudXBSZXN1bHRzID0gY2xlYW51cHNMSUZPLm1hcChhc3luYyBjbGVhbnVwID0+IHtcbiAgICAgIGF3YWl0IG51bGw7XG4gICAgICByZXR1cm4gY2xlYW51cChlcnIpO1xuICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2VBbGxPckVycm9ycyhjbGVhbnVwUmVzdWx0cyk7XG4gIH07XG4gIHJldHVybiBhZ2dyZWdhdGVUcnlGaW5hbGx5KCgpID0+IGZuKGFkZENsZWFudXApLCBmaW5hbGl6ZXIpO1xufTtcblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLndpdGhEZWZlcnJlZENsZWFudXAod2l0aERlZmVycmVkQ2xlYW51cCk7XG4gICAgICAgY29uc3QgYXNzZXJ0QWxsRGVmaW5lZCA9IG9iaiA9PiB7XG4gIGNvbnN0IG1pc3NpbmcgPSBbXTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG1pc3NpbmcucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgRmFpbGBtaXNzaW5nICR7cShtaXNzaW5nKX1gO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmFzc2VydEFsbERlZmluZWQoYXNzZXJ0QWxsRGVmaW5lZCk7XG4gICAgICAgY29uc3QgYXR0ZW51YXRlID0gKHNwZWNpbWVuLCBwZXJtaXQsIHRyYW5zZm9ybSA9IHggPT4geCkgPT4ge1xuICAvL1xuICBpZiAocGVybWl0ID09PSB0cnVlIHx8IHR5cGVvZiBwZXJtaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgfVxuXG4gIC8qICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHBhdGggPSBbXTtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IGV4dHJhY3QgPSAoc3ViU3BlY2ltZW4sIHN1YlBlcm1pdCkgPT4ge1xuICAgIGlmIChzdWJQZXJtaXQgPT09IG51bGwgfHwgdHlwZW9mIHN1YlBlcm1pdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IHBhdGgubGVuZ3RoID09PSAwXG4gICAgICAgID8gRmFpbGBpbnZhbGlkIHBlcm1pdDogJHtxKHBlcm1pdCl9YFxuICAgICAgICA6IEZhaWxgaW52YWxpZCBwZXJtaXQgYXQgcGF0aCAke3EocGF0aCl9OiAke3Eoc3ViUGVybWl0KX1gO1xuICAgIH0gZWxzZSBpZiAoc3ViU3BlY2ltZW4gPT09IG51bGwgfHwgdHlwZW9mIHN1YlNwZWNpbWVuICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgcGF0aC5sZW5ndGggPT09IDBcbiAgICAgICAgPyBGYWlsYHNwZWNpbWVuIG11c3QgYmUgYW4gb2JqZWN0IGZvciBwZXJtaXQgJHtxKHBlcm1pdCl9YFxuICAgICAgICA6IEZhaWxgc3BlY2ltZW4gYXQgcGF0aCAke3EocGF0aCl9IG11c3QgYmUgYW4gb2JqZWN0IGZvciBwZXJtaXQgJHtxKHN1YlBlcm1pdCl9YDtcbiAgICB9XG4gICAgY29uc3QgcGlja3MgPSBPYmplY3QuZW50cmllcyhzdWJQZXJtaXQpLm1hcCgoW3N1YktleSwgZGVlcFBlcm1pdF0pID0+IHtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihzdWJTcGVjaW1lbiwgc3ViS2V5KSkge1xuICAgICAgICB0aHJvdyBGYWlsYHNwZWNpbWVuIGlzIG1pc3NpbmcgcGF0aCAke3EocGF0aC5jb25jYXQoc3ViS2V5KSl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlZXBTcGVjaW1lbiA9IFJlZmxlY3QuZ2V0KHN1YlNwZWNpbWVuLCBzdWJLZXkpO1xuICAgICAgaWYgKGRlZXBQZXJtaXQgPT09IHRydWUgfHwgdHlwZW9mIGRlZXBQZXJtaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBbc3ViS2V5LCBkZWVwU3BlY2ltZW5dO1xuICAgICAgfVxuICAgICAgcGF0aC5wdXNoKHN1YktleSk7XG4gICAgICBjb25zdCBleHRyYWN0ZWQgPSBleHRyYWN0KC8qICAgICAgICAgICAgICAqLyAoZGVlcFNwZWNpbWVuKSwgZGVlcFBlcm1pdCk7XG4gICAgICBjb25zdCBlbnRyeSA9IFtzdWJLZXksIGV4dHJhY3RlZF07XG4gICAgICBwYXRoLnBvcCgpO1xuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xuICAgIHJldHVybiB0cmFuc2Zvcm0oT2JqZWN0LmZyb21FbnRyaWVzKHBpY2tzKSwgc3ViUGVybWl0KTtcbiAgfTtcblxuICAvL1xuICByZXR1cm4gZXh0cmFjdChzcGVjaW1lbiwgcGVybWl0KTtcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLmF0dGVudWF0ZShhdHRlbnVhdGUpO1xuY29uc3Qgbm90RG9uZSA9IGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGFsd2F5c0RvbmUgPSBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuXG4gICAgICAgY29uc3QgZm9yZXZlciA9IGFzeW5jR2VuZXJhdGUoKCkgPT4gbm90RG9uZSk7XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLmZvcmV2ZXIoZm9yZXZlcik7XG4gICAgICAgY29uc3Qgd2hpbGVUcnVlID0gcHJvZHVjZSA9PlxuICBhc3luY0dlbmVyYXRlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHByb2R1Y2UoKTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gYWx3YXlzRG9uZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuICB9KTtcblxuLypcblxuXG5cblxuXG4gKi8kaM2PX29uY2Uud2hpbGVUcnVlKHdoaWxlVHJ1ZSk7XG4gICAgICAgY29uc3QgdW50aWxUcnVlID0gcHJvZHVjZSA9PlxuICBhc3luY0dlbmVyYXRlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHByb2R1Y2UoKTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBkb25lOiB0cnVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG4gIH0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UudW50aWxUcnVlKHVudGlsVHJ1ZSk7XG4gICAgICAgY29uc3QgemlwID0gKHhzLCB5cykgPT4gaGFyZGVuKHhzLm1hcCgoeCwgaSkgPT4gW3gsIHlzWytpXV0pKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS56aXAoemlwKTtcbiAgICAgICBjb25zdCBhbGxWYWx1ZXMgPSBhc3luYyBvYmogPT4ge1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IFByb21pc2UuYWxsKHZhbHVlcyhvYmopKTtcbiAgLy9cbiAgcmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyh6aXAoa2V5cyhvYmopLCByZXNvbHZlZCkpKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hbGxWYWx1ZXMoYWxsVmFsdWVzKTtcbiAgICAgICBjb25zdCBzeW5jaHJvbml6ZWRUZWUgPSAoc291cmNlU3RyZWFtLCByZWFkZXJDb3VudCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgZG9uZVJlc3VsdDtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBxdWV1ZXMgPSBbXTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHB1bGxOZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHF1ZXVlcy5tYXAocXVldWUgPT4gcXVldWUuZ2V0KCkpKTtcbiAgICBjb25zdCByZWplY3Rpb25zID0gW107XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcmVzb2x2ZXJzID0gW107XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHNldHRsZWRSZXN1bHQgb2YgcmVxdWVzdHMpIHtcbiAgICAgIGlmIChzZXR0bGVkUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICByZWplY3Rpb25zLnB1c2goc2V0dGxlZFJlc3VsdC5yZWFzb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZSB8fD0gISFzZXR0bGVkUmVzdWx0LnZhbHVlLmRvbmU7XG4gICAgICAgIHJlc29sdmVycy5wdXNoKHNldHRsZWRSZXN1bHQudmFsdWUudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKGRvbmVSZXN1bHQpIHtcbiAgICAgIHJlc3VsdCA9IFByb21pc2UucmVzb2x2ZShkb25lUmVzdWx0KTtcbiAgICB9IGVsc2UgaWYgKHJlamVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG1ha2VFcnJvcihYYFRlZWQgc3RyZWFtIHRocmV3YCk7XG4gICAgICBhbm5vdGF0ZUVycm9yKGVycm9yLCBYYFRlZWQgcmVqZWN0aW9uczogJHtyZWplY3Rpb25zfWApO1xuICAgICAgcmVzdWx0ID1cbiAgICAgICAgc291cmNlU3RyZWFtLnRocm93Py4oZXJyb3IpIHx8XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShzb3VyY2VTdHJlYW0ucmV0dXJuPy4oKSkudGhlbigoKSA9PlxuICAgICAgICAgIFByb21pc2UucmVqZWN0KGVycm9yKSxcbiAgICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGRvbmUpIHtcbiAgICAgIHJlc3VsdCA9XG4gICAgICAgIHNvdXJjZVN0cmVhbS5yZXR1cm4/LigpIHx8XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHNvdXJjZVN0cmVhbS5uZXh0KCk7XG4gICAgfVxuICAgIHJlc3VsdC50aGVuKFxuICAgICAgciA9PiB7XG4gICAgICAgIGlmIChyLmRvbmUpIHtcbiAgICAgICAgICBkb25lUmVzdWx0ID0gcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgZG9uZVJlc3VsdCA9IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgfSxcbiAgICApO1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZSBvZiByZXNvbHZlcnMpIHtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHB1bGxOZXh0KCk7XG4gIH07XG5cbiAgY29uc3QgcmVhZGVycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHJlYWRlckNvdW50IH0pLm1hcCgoKSA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBxdWV1ZSA9IG1ha2VRdWV1ZSgpO1xuICAgIHF1ZXVlcy5wdXNoKHF1ZXVlKTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcmVhZGVyID0gaGFyZGVuKHtcbiAgICAgIGFzeW5jIG5leHQoKSB7XG4gICAgICAgIC8qXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gICAgICAgIHF1ZXVlLnB1dCh7IHZhbHVlOiByZXNvbHZlLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgcmV0dXJuKCkge1xuICAgICAgICAvKlxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgICBxdWV1ZS5wdXQoeyB2YWx1ZTogcmVzb2x2ZSwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgdGhyb3cocmVhc29uKSB7XG4gICAgICAgIGNvbnN0IHJlamVjdGlvbiA9IFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIHF1ZXVlLnB1dChyZWplY3Rpb24pO1xuICAgICAgICByZXR1cm4gcmVqZWN0aW9uO1xuICAgICAgfSxcbiAgICAgIC8vXG4gICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gcmVhZGVyO1xuICAgICAgfSxcbiAgICAgIC8vXG4gICAgICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG4gICAgICAgIGF3YWl0IHJlYWRlci5yZXR1cm4oKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlYWRlcjtcbiAgfSk7XG5cbiAgdm9pZCBwdWxsTmV4dCgpO1xuICByZXR1cm4gcmVhZGVycztcbn07JGjNj19vbmNlLnN5bmNocm9uaXplZFRlZShzeW5jaHJvbml6ZWRUZWUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsib2JqZWN0TWFwIjpbIm9iamVjdE1hcCIsZmFsc2VdLCJvYmplY3RNZXRhTWFwIjpbIm9iamVjdE1ldGFNYXAiLGZhbHNlXSwiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGltaXRlZENvbnNvbGUiOlsibWFrZUxpbWl0ZWRDb25zb2xlIl0sImRlZXBseUZ1bGZpbGxlZE9iamVjdCI6WyJkZWVwbHlGdWxmaWxsZWRPYmplY3QiXSwiUHJvbWlzZUFsbE9yRXJyb3JzIjpbIlByb21pc2VBbGxPckVycm9ycyJdLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IjpbImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiXSwid2l0aERlZmVycmVkQ2xlYW51cCI6WyJ3aXRoRGVmZXJyZWRDbGVhbnVwIl0sImFzc2VydEFsbERlZmluZWQiOlsiYXNzZXJ0QWxsRGVmaW5lZCJdLCJhdHRlbnVhdGUiOlsiYXR0ZW51YXRlIl0sImZvcmV2ZXIiOlsiZm9yZXZlciJdLCJ3aGlsZVRydWUiOlsid2hpbGVUcnVlIl0sInVudGlsVHJ1ZSI6WyJ1bnRpbFRydWUiXSwiemlwIjpbInppcCJdLCJhbGxWYWx1ZXMiOlsiYWxsVmFsdWVzIl0sInN5bmNocm9uaXplZFRlZSI6WyJzeW5jaHJvbml6ZWRUZWUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoxoUscIGAADCBgAALAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90ZXN0aW5nLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJldmVudExvb3BJdGVyYXRpb24iLCJpbnNwZWN0TWFwU3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cbi8qXG5cblxuICovXG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGV2ZW50TG9vcEl0ZXJhdGlvbiA9IGFzeW5jICgpID0+XG4gIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0SW1tZWRpYXRlKHJlc29sdmUpKTskaM2PX29uY2UuZXZlbnRMb29wSXRlcmF0aW9uKGV2ZW50TG9vcEl0ZXJhdGlvbik7XG5oYXJkZW4oZXZlbnRMb29wSXRlcmF0aW9uKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgc3RyaW5nT3JUYWcgPSB2YWx1ZSA9PiB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ107XG4gIH1cbiAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59O1xuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBpbnNwZWN0TWFwU3RvcmUgPSBzdG9yZSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG9iaiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBzdG9yZS5rZXlzKCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHN0b3JlLmdldChrZXkpO1xuICAgIGNvbnN0IGhhc0tleXMgPSB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICdrZXlzJyBpbiB2YWx1ZTtcbiAgICBjb25zdCBpbmRleCA9IHN0cmluZ09yVGFnKGtleSk7XG4gICAgaWYgKGhhc0tleXMgJiYgJ2dldCcgaW4gdmFsdWUpIHtcbiAgICAgIG9ialtpbmRleF0gPSBpbnNwZWN0TWFwU3RvcmUodmFsdWUpO1xuICAgIH0gZWxzZSBpZiAoaGFzS2V5cykge1xuICAgICAgb2JqW2luZGV4XSA9IEFycmF5LmZyb20odmFsdWUua2V5cygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb2JqW2luZGV4XSA9XG4gICAgICAgIHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0ICYmIFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZVxuICAgICAgICAgID8gdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXVxuICAgICAgICAgIDogdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBvYmo7XG59OyRozY9fb25jZS5pbnNwZWN0TWFwU3RvcmUoaW5zcGVjdE1hcFN0b3JlKTtcbmhhcmRlbihpbnNwZWN0TWFwU3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZXZlbnRMb29wSXRlcmF0aW9uIjpbImV2ZW50TG9vcEl0ZXJhdGlvbiJdLCJpbnNwZWN0TWFwU3RvcmUiOlsiaW5zcGVjdE1hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACAjyqQXAwAAFwMAACUAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdG1wRGlyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVGVtcERpckZhY3RvcnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVRlbXBEaXJGYWN0b3J5ID0gdG1wID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgdG1wRGlyID0gcHJlZml4ID0+IHtcbiAgICBjb25zdCB7IG5hbWUsIHJlbW92ZUNhbGxiYWNrIH0gPSB0bXAuZGlyU3luYyh7XG4gICAgICBwcmVmaXgsXG4gICAgICB1bnNhZmVDbGVhbnVwOiB0cnVlLFxuICAgIH0pO1xuICAgIHJldHVybiBbbmFtZSwgcmVtb3ZlQ2FsbGJhY2tdO1xuICB9O1xuICByZXR1cm4gdG1wRGlyO1xufTskaM2PX29uY2UubWFrZVRlbXBEaXJGYWN0b3J5KG1ha2VUZW1wRGlyRmFjdG9yeSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGVtcERpckZhY3RvcnkiOlsibWFrZVRlbXBEaXJGYWN0b3J5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALKyi/UbAwAAGwMAACgAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUNoZWNrLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiY2FzdCIsIm11c3RNYXRjaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHR5cGVsZXNzTXVzdE1hdGNoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKHR5cGVsZXNzTXVzdE1hdGNoID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKlxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgbXVzdE1hdGNoID0gdHlwZWxlc3NNdXN0TWF0Y2g7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5tdXN0TWF0Y2gobXVzdE1hdGNoKTtcbiAgICAgICBjb25zdCBjYXN0ID0gKHNwZWNpbWVuLCBwYXR0KSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIG11c3RNYXRjaChzcGVjaW1lbiwgcGF0dCk7XG4gIHJldHVybiBzcGVjaW1lbjtcbn07JGjNj19vbmNlLmNhc3QoY2FzdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl0sImNhc3QiOlsiY2FzdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAPzMLEOgQAADoEAAApAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJCcmlkZ2VCaWdJbnRTaGFwZSIsIlN0b3JhZ2VOb2RlU2hhcGUiLCJVbmd1YXJkZWRIZWxwZXJJIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbiAgICAgICBjb25zdCBTdG9yYWdlTm9kZVNoYXBlID0gTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJyk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5TdG9yYWdlTm9kZVNoYXBlKFN0b3JhZ2VOb2RlU2hhcGUpO1xuICAgICAgIGNvbnN0IFVuZ3VhcmRlZEhlbHBlckkgPSBNLmludGVyZmFjZShcbiAgJ2hlbHBlcicsXG4gIHt9LFxuICAvL1xuICB7IHNsb3BweTogdHJ1ZSB9LFxuKTtcblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG4gKi8kaM2PX29uY2UuVW5ndWFyZGVkSGVscGVySShVbmd1YXJkZWRIZWxwZXJJKTtcbiAgICAgICBjb25zdCBCcmlkZ2VCaWdJbnRTaGFwZSA9IE0ub3IoTS5udW1iZXIoKSwgTS5zdHJpbmcoKSk7JGjNj19vbmNlLkJyaWRnZUJpZ0ludFNoYXBlKEJyaWRnZUJpZ0ludFNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlN0b3JhZ2VOb2RlU2hhcGUiOlsiU3RvcmFnZU5vZGVTaGFwZSJdLCJVbmd1YXJkZWRIZWxwZXJJIjpbIlVuZ3VhcmRlZEhlbHBlckkiXSwiQnJpZGdlQmlnSW50U2hhcGUiOlsiQnJpZGdlQmlnSW50U2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACSdr37aQcAAGkHAAAqAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3VwZ3JhZGUtYXBpLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSIsImlzQWJhbmRvbmVkRXJyb3IiLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIiwibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSxtYXRjaGVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBpc0Zyb3plbiB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4gICAgICAgY29uc3QgVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSA9IGhhcmRlbih7XG4gIG5hbWU6ICd2YXRVcGdyYWRlZCcsXG4gIHVwZ3JhZGVNZXNzYWdlOiBNLnN0cmluZygpLFxuICBpbmNhcm5hdGlvbk51bWJlcjogTS5udW1iZXIoKSxcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUoVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSk7XG4gICAgICAgY29uc3QgbWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uID0gKHVwZ3JhZGVNZXNzYWdlLCB0b0luY2FybmF0aW9uTnVtYmVyKSA9PlxuICBoYXJkZW4oe1xuICAgIG5hbWU6ICd2YXRVcGdyYWRlZCcsXG4gICAgdXBncmFkZU1lc3NhZ2UsXG4gICAgaW5jYXJuYXRpb25OdW1iZXI6IHRvSW5jYXJuYXRpb25OdW1iZXIsXG4gIH0pOyRozY9fb25jZS5tYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcbmhhcmRlbihtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1VwZ3JhZGVEaXNjb25uZWN0aW9uID0gcmVhc29uID0+XG4gIHJlYXNvbiAhPSBudWxsICYmIC8vXG4gIGlzRnJvemVuKHJlYXNvbikgJiZcbiAgbWF0Y2hlcyhyZWFzb24sIFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpOyRozY9fb25jZS5pc1VwZ3JhZGVEaXNjb25uZWN0aW9uKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuaGFyZGVuKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzQWJhbmRvbmVkRXJyb3IgPSByZWFzb24gPT5cbiAgcmVhc29uICE9IG51bGwgJiYgLy9cbiAgaXNGcm96ZW4ocmVhc29uKSAmJlxuICBtYXRjaGVzKHJlYXNvbiwgTS5lcnJvcigpKSAmJlxuICAvL1xuICAvL1xuICByZWFzb24ubWVzc2FnZSA9PT0gJ3ZhdCB0ZXJtaW5hdGVkJzskaM2PX29uY2UuaXNBYmFuZG9uZWRFcnJvcihpc0FiYW5kb25lZEVycm9yKTtcbmhhcmRlbihpc0FiYW5kb25lZEVycm9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiOlsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSJdLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIl0sImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc0FiYW5kb25lZEVycm9yIjpbImlzQWJhbmRvbmVkRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0JZKLe8IAADvCAAAMwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N1YnNjcmliZS5qcyJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsc3Vic2NyaWJlTGF0ZXN0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVMYXRlc3RcIixbJGjNj19hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyID0gc3Vic2NyaWJlTGF0ZXN0O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKTtcbiAgICAgICBjb25zdCBvYnNlcnZlSXRlcmF0b3IgPSAoYXN5bmNJdGVyYXRvclAsIGl0ZXJhdGlvbk9ic2VydmVyKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgoYWNrLCBvYnNlcnZlckVycm9yKSA9PiB7XG4gICAgY29uc3QgcmVjdXIgPSAoKSA9PiB7XG4gICAgICBFLndoZW4oXG4gICAgICAgIEUoYXN5bmNJdGVyYXRvclApLm5leHQoKSxcbiAgICAgICAgKHsgdmFsdWUsIGRvbmUgfSkgPT4ge1xuICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICBpdGVyYXRpb25PYnNlcnZlci5maW5pc2ggJiYgaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGFjayh1bmRlZmluZWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSAmJlxuICAgICAgICAgICAgICBpdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICByZWN1cigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uID0+IHtcbiAgICAgICAgICBpdGVyYXRpb25PYnNlcnZlci5mYWlsICYmIGl0ZXJhdGlvbk9ic2VydmVyLmZhaWwocmVhc29uKTtcbiAgICAgICAgICBhY2sodW5kZWZpbmVkKTtcbiAgICAgICAgfSxcbiAgICAgICkuY2F0Y2gob2JzZXJ2ZXJFcnJvcik7XG4gICAgfTtcbiAgICByZWN1cigpO1xuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uub2JzZXJ2ZUl0ZXJhdG9yKG9ic2VydmVJdGVyYXRvcik7XG4gICAgICAgY29uc3Qgb2JzZXJ2ZUl0ZXJhdGlvbiA9IChhc3luY0l0ZXJhYmxlUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpID0+IHtcbiAgY29uc3QgaXRlcmF0b3JQID0gRShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG4gIHJldHVybiBvYnNlcnZlSXRlcmF0b3IoaXRlcmF0b3JQLCBpdGVyYXRpb25PYnNlcnZlcik7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm9ic2VydmVJdGVyYXRpb24ob2JzZXJ2ZUl0ZXJhdGlvbik7XG4gICAgICAgY29uc3Qgb2JzZXJ2ZU5vdGlmaWVyID0gKG5vdGlmaWVyUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpID0+XG4gIG9ic2VydmVJdGVyYXRpb24oc3Vic2NyaWJlTGF0ZXN0KG5vdGlmaWVyUCksIGl0ZXJhdGlvbk9ic2VydmVyKTskaM2PX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdLCJvYnNlcnZlSXRlcmF0b3IiOlsib2JzZXJ2ZUl0ZXJhdG9yIl0sIm9ic2VydmVJdGVyYXRpb24iOlsib2JzZXJ2ZUl0ZXJhdGlvbiJdLCJvYnNlcnZlTm90aWZpZXIiOlsib2JzZXJ2ZU5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMI+7bjrBwAA6wcAACQAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi9ub3RpZmllci5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIi4vdG9waWMuanMiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllcktpdCIsIm1ha2VOb3RpZmllcktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Iiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZUl0ZXJhdG9yIiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Iiwic3Vic2NyaWJlTGF0ZXN0Iiwic3Vic2NyaWJlTGF0ZXN0IixudWxsXSwicmVleHBvcnRzIjpbIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW11dLFtcIi4vbm90aWZpZXIuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbXV0sW1wiLi90b3BpYy5qc1wiLCBbXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbXV0sW1wiLi9zdG9yZXN1Yi5qc1wiLCBbXV0sW1wiLi9zdG9yZWQtbm90aWZpZXIuanNcIiwgW11dLFtcIi4vdHlwZXMtaW5kZXguanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3B1Ymxpc2gta2l0LmpzIjpbWyJtYWtlUHVibGlzaEtpdCIsIm1ha2VQdWJsaXNoS2l0Il0sWyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSxbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIl0sWyJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUVhY2hUb3BpY0kiXSxbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIiwiSXRlcmFibGVMYXRlc3RUb3BpY0kiXSxbIlN1YnNjcmliZXJTaGFwZSIsIlN1YnNjcmliZXJTaGFwZSJdXSwiLi9zdWJzY3JpYmUuanMiOltbInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVFYWNoIl0sWyJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiXV0sIi4vbm90aWZpZXIuanMiOltbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllciJdLFsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0Il0sWyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl0sWyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl1dLCIuL3N1YnNjcmliZXIuanMiOltbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uIl0sWyJtYWtlU3Vic2NyaXB0aW9uS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCJdXSwiLi90b3BpYy5qcyI6W1sibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyIsIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXV0sIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOltbIm9ic2VydmVOb3RpZmllciIsIm9ic2VydmVOb3RpZmllciJdLFsib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZUl0ZXJhdG9yIl0sWyJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdGlvbiJdLFsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIb7LBCYTAAAmEwAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9ub3RpZmllci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0LEUsRmFyLG1ha2VQdWJsaXNoS2l0LHN1YnNjcmliZUxhdGVzdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXIgPSBzaGFyYWJsZUludGVybmFsc1AgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBub3RpZmllciA9IEZhcignbm90aWZpZXInLCB7XG4gICAgLi4uc3Vic2NyaWJlTGF0ZXN0KHNoYXJhYmxlSW50ZXJuYWxzUCksXG4gICAgZ2V0VXBkYXRlU2luY2U6IGFzeW5jIHVwZGF0ZUNvdW50ID0+XG4gICAgICBFKHNoYXJhYmxlSW50ZXJuYWxzUCkuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuXG4gICAgLypcblxuXG5cblxuICAgICAqL1xuICAgIGdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHM6IGFzeW5jICgpID0+IHNoYXJhYmxlSW50ZXJuYWxzUCxcbiAgICAvKlxuXG5cblxuICAgICAqL1xuICAgIGdldFN0b3JlS2V5OiAoKSA9PiBoYXJkZW4oeyBub3RpZmllciB9KSxcbiAgfSk7XG4gIHJldHVybiBub3RpZmllcjtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZU5vdGlmaWVyKG1ha2VOb3RpZmllcik7XG4gICAgICAgY29uc3QgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIgPSBzdWJzY3JpYmVyID0+IHtcbiAgLypcblxuICAgKi9cbiAgY29uc3QgYmFzZU5vdGlmaWVyID0gaGFyZGVuKHtcbiAgICBnZXRVcGRhdGVTaW5jZTogKHVwZGF0ZUNvdW50ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgRShzdWJzY3JpYmVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG5vdGlmaWVyID0gRmFyKCdub3RpZmllcicsIHtcbiAgICAuLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbiAgICAuLi5iYXNlTm90aWZpZXIsXG4gIH0pO1xuICByZXR1cm4gbm90aWZpZXI7XG59OyRozY9fb25jZS5tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZU5vdGlmaWVyS2l0ID0gKC4uLmluaXRpYWxTdGF0ZUFycikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuXG4gIGNvbnN0IG5vdGlmaWVyID0gbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIoc3Vic2NyaWJlcik7XG5cbiAgY29uc3QgdXBkYXRlciA9IEZhcigndXBkYXRlcicsIHtcbiAgICB1cGRhdGVTdGF0ZTogc3RhdGUgPT4gcHVibGlzaGVyLnB1Ymxpc2goc3RhdGUpLFxuICAgIGZpbmlzaDogY29tcGxldGlvbiA9PiBwdWJsaXNoZXIuZmluaXNoKGNvbXBsZXRpb24pLFxuICAgIGZhaWw6IHJlYXNvbiA9PiBwdWJsaXNoZXIuZmFpbChyZWFzb24pLFxuICB9KTtcblxuICBhc3NlcnQoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aCA8PSAxLCAndG9vIG1hbnkgYXJndW1lbnRzJyk7XG4gIGlmIChpbml0aWFsU3RhdGVBcnIubGVuZ3RoID09PSAxKSB7XG4gICAgdXBkYXRlci51cGRhdGVTdGF0ZShpbml0aWFsU3RhdGVBcnJbMF0pO1xuICB9XG5cbiAgLy9cbiAgLy9cbiAgcmV0dXJuIGhhcmRlbih7IG5vdGlmaWVyLCB1cGRhdGVyIH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VOb3RpZmllcktpdChtYWtlTm90aWZpZXJLaXQpO1xuICAgICAgIGNvbnN0IG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlID0gYXN5bmNJdGVyYWJsZVAgPT4ge1xuICBjb25zdCBpdGVyYXRvclAgPSBFKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBvcHROZXh0UHJvbWlzZTtcbiAgbGV0IGN1cnJlbnRVcGRhdGVDb3VudCA9IDBuO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBjdXJyZW50UmVzcG9uc2U7XG4gIGxldCBmaW5hbCA9IGZhbHNlO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGJhc2VOb3RpZmllciA9IEZhcignYmFzZU5vdGlmaWVyJywge1xuICAgIGdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50ID0gLTFuKSB7XG4gICAgICBpZiAodXBkYXRlQ291bnQgPCBjdXJyZW50VXBkYXRlQ291bnQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRSZXNwb25zZSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh1cGRhdGVDb3VudCAhPT0gY3VycmVudFVwZGF0ZUNvdW50KSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICdnZXRVcGRhdGVTaW5jZSBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgdXBkYXRlQ291bnQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIGlmIChmaW5hbCkge1xuICAgICAgICBhc3NlcnQoY3VycmVudFJlc3BvbnNlICE9PSB1bmRlZmluZWQpO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gICAgICB9XG4gICAgICBpZiAoIW9wdE5leHRQcm9taXNlKSB7XG4gICAgICAgIGNvbnN0IG5leHRJdGVyUmVzdWx0UCA9IEUoaXRlcmF0b3JQKS5uZXh0KCk7XG4gICAgICAgIG9wdE5leHRQcm9taXNlID0gRS53aGVuKFxuICAgICAgICAgIG5leHRJdGVyUmVzdWx0UCxcbiAgICAgICAgICAoeyBkb25lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgICBhc3NlcnQoIWZpbmFsKTtcbiAgICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICAgIGZpbmFsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnRVcGRhdGVDb3VudCArPSAxbjtcbiAgICAgICAgICAgIGN1cnJlbnRSZXNwb25zZSA9IGhhcmRlbih7XG4gICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICB1cGRhdGVDb3VudDogZG9uZSA/IHVuZGVmaW5lZCA6IGN1cnJlbnRVcGRhdGVDb3VudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb3B0TmV4dFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgX3JlYXNvbiA9PiB7XG4gICAgICAgICAgICBmaW5hbCA9IHRydWU7XG4gICAgICAgICAgICBjdXJyZW50UmVzcG9uc2UgPVxuICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgKG5leHRJdGVyUmVzdWx0UCk7XG4gICAgICAgICAgICBvcHROZXh0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvcHROZXh0UHJvbWlzZTtcbiAgICB9LFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBub3RpZmllciA9IEZhcignbm90aWZpZXInLCB7XG4gICAgLy9cbiAgICAvL1xuICAgIC4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuICAgIC4uLmJhc2VOb3RpZmllcixcbiAgfSk7XG4gIHJldHVybiBub3RpZmllcjtcbn07JGjNj19vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTm90aWZpZXIiOlsibWFrZU5vdGlmaWVyIl0sIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIjpbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl0sIm1ha2VOb3RpZmllcktpdCI6WyJtYWtlTm90aWZpZXJLaXQiXSwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiOlsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAB6zyet4yAADeMgAAKgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9wdWJsaXNoLWtpdC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3BhdHRlcm5zIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIlVwZGF0ZUNvdW50U2hhcGUiLCJtYWtlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInB1Ymxpc2hLaXRJS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEUsRmFyLG1ha2VQcm9taXNlS2l0LE0sZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkLGNhbkJlRHVyYWJsZSxwcmVwYXJlRXhvQ2xhc3NLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIixbJGjNj19hID0+IChjYW5CZUR1cmFibGUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuY29uc3Qgc2luayA9ICgpID0+IHt9O1xuY29uc3QgbWFrZVF1aWV0UmVqZWN0aW9uID0gcmVhc29uID0+IHtcbiAgY29uc3QgcmVqZWN0aW9uID0gaGFyZGVuKFByb21pc2UucmVqZWN0KHJlYXNvbikpO1xuICB2b2lkIEUud2hlbihyZWplY3Rpb24sIHNpbmssIHNpbmspO1xuICByZXR1cm4gcmVqZWN0aW9uO1xufTtcbmNvbnN0IHRvb0ZhclJlamVjdGlvbiA9IG1ha2VRdWlldFJlamVjdGlvbihcbiAgaGFyZGVuKEVycm9yKCdDYW5ub3QgcmVhZCBwYXN0IGVuZCBvZiBpdGVyYXRpb24uJykpLFxuKTtcblxuICAgICAgIGNvbnN0IFB1Ymxpc2hlckkgPSBNLmludGVyZmFjZSgnUHVibGlzaGVyJywge1xuICBwdWJsaXNoOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBmaW5pc2g6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gIGZhaWw6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG59KTtcblxuLy9cbiRozY9fb25jZS5QdWJsaXNoZXJJKFB1Ymxpc2hlckkpO2NvbnN0IFVwZGF0ZUNvdW50U2hhcGU9TS5vcihNLmJpZ2ludCgpLE0ubnVtYmVyKCkpOyRozY9fb25jZS5VcGRhdGVDb3VudFNoYXBlKFVwZGF0ZUNvdW50U2hhcGUpO1xuICAgICAgIGNvbnN0IFN1YnNjcmliZXJJID0gTS5pbnRlcmZhY2UoJ1N1YnNjcmliZXInLCB7XG4gIHN1YnNjcmliZUFmdGVyOiBNLmNhbGwoKS5vcHRpb25hbChNLmJpZ2ludCgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0VXBkYXRlU2luY2U6IE0uY2FsbCgpLm9wdGlvbmFsKFVwZGF0ZUNvdW50U2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxufSk7JGjNj19vbmNlLlN1YnNjcmliZXJJKFN1YnNjcmliZXJJKTtcbiAgICAgICBjb25zdCBwdWJsaXNoS2l0SUtpdCA9IGhhcmRlbih7XG4gIHB1Ymxpc2hlcjogUHVibGlzaGVySSxcbiAgc3Vic2NyaWJlcjogU3Vic2NyaWJlckksXG59KTskaM2PX29uY2UucHVibGlzaEtpdElLaXQocHVibGlzaEtpdElLaXQpO1xuXG4gICAgICAgY29uc3QgRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSA9IE0uaW50ZXJmYWNlKFxuICAnRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InLFxuICB7XG4gICAgZm9yazogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiBNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLCAvL1xuICAgIG5leHQ6IE0uY2FsbFdoZW4oKS5yZXR1cm5zKE0uYW55KCkpLFxuICB9LFxuKTskaM2PX29uY2UuRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZShGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlKTtcblxuICAgICAgIGNvbnN0IEl0ZXJhYmxlRWFjaFRvcGljSSA9IE0uaW50ZXJmYWNlKCdJdGVyYWJsZUVhY2hUb3BpYycsIHtcbiAgc3Vic2NyaWJlQWZ0ZXI6XG4gICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFN1YnNjcmliZXJJKS5tZXRob2RHdWFyZHMuc3Vic2NyaWJlQWZ0ZXIsXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06IE0uY2FsbCgpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyksXG4gICksXG59KTskaM2PX29uY2UuSXRlcmFibGVFYWNoVG9waWNJKEl0ZXJhYmxlRWFjaFRvcGljSSk7XG5cbiAgICAgICBjb25zdCBJdGVyYWJsZUxhdGVzdFRvcGljSSA9IE0uaW50ZXJmYWNlKCdJdGVyYWJsZUxhdGVzdFRvcGljJywge1xuICBnZXRVcGRhdGVTaW5jZTpcbiAgICBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoU3Vic2NyaWJlckkpLm1ldGhvZEd1YXJkcy5nZXRVcGRhdGVTaW5jZSxcbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogTS5jYWxsKCkucmV0dXJucyhcbiAgICBNLnJlbW90YWJsZSgnRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InKSxcbiAgKSxcbn0pO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuSXRlcmFibGVMYXRlc3RUb3BpY0koSXRlcmFibGVMYXRlc3RUb3BpY0kpO1xuY29uc3Qgd2Vha01lbW9pemVVbmFyeSA9IGZuID0+IHtcbiAgY29uc3QgY2FjaGUgPSBuZXcgV2Vha01hcCgpO1xuICByZXR1cm4gYXJnID0+IHtcbiAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBvYXJnID0gYXJnO1xuICAgIGlmIChjYWNoZS5oYXMob2FyZykpIHtcbiAgICAgIHJldHVybiBjYWNoZS5nZXQob2FyZyk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGZuKGFyZyk7XG4gICAgY2FjaGUuc2V0KG9hcmcsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQgPSByZWNvcmQgPT4ge1xuICBjb25zdCB7XG4gICAgaGVhZDogeyB2YWx1ZSwgZG9uZSB9LFxuICAgIHB1Ymxpc2hDb3VudCxcbiAgfSA9IHJlY29yZDtcbiAgaWYgKGRvbmUpIHtcbiAgICAvL1xuICAgIHJldHVybiBoYXJkZW4oeyB2YWx1ZSwgdXBkYXRlQ291bnQ6IHVuZGVmaW5lZCB9KTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKHsgdmFsdWUsIHVwZGF0ZUNvdW50OiBwdWJsaXNoQ291bnQgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVB1Ymxpc2hLaXQgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCB0YWlsUDtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCB0YWlsUjtcbiAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcblxuICBsZXQgY3VycmVudFB1Ymxpc2hDb3VudCA9IDBuO1xuICBsZXQgY3VycmVudFAgPSB0YWlsUDtcbiAgY29uc3QgYWR2YW5jZUN1cnJlbnQgPSAoZG9uZSwgdmFsdWUsIHJlamVjdGlvbikgPT4ge1xuICAgIGlmICh0YWlsUiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiAgICB9XG5cbiAgICBjdXJyZW50UHVibGlzaENvdW50ICs9IDFuO1xuICAgIGN1cnJlbnRQID0gdGFpbFA7XG4gICAgY29uc3QgcmVzb2x2ZUN1cnJlbnQgPSB0YWlsUjtcblxuICAgIGlmIChkb25lKSB7XG4gICAgICB0YWlsUCA9IHRvb0ZhclJlamVjdGlvbjtcbiAgICAgIHRhaWxSID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAoeyBwcm9taXNlOiB0YWlsUCwgcmVzb2x2ZTogdGFpbFIgfSA9IG1ha2VQcm9taXNlS2l0KCkpO1xuICAgIH1cblxuICAgIGlmIChyZWplY3Rpb24pIHtcbiAgICAgIHJlc29sdmVDdXJyZW50KHJlamVjdGlvbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc29sdmVDdXJyZW50KFxuICAgICAgICBoYXJkZW4oe1xuICAgICAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmUgfSxcbiAgICAgICAgICBwdWJsaXNoQ291bnQ6IGN1cnJlbnRQdWJsaXNoQ291bnQsXG4gICAgICAgICAgdGFpbDogdGFpbFAsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkID0gd2Vha01lbW9pemVVbmFyeShcbiAgICBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkLFxuICApO1xuXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3Qgc3Vic2NyaWJlciA9IEZhcignU3Vic2NyaWJlcicsIHtcbiAgICBzdWJzY3JpYmVBZnRlcjogKHB1Ymxpc2hDb3VudCA9IC0xbikgPT4ge1xuICAgICAgYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsICdiaWdpbnQnKTtcbiAgICAgIGlmIChwdWJsaXNoQ291bnQgPT09IGN1cnJlbnRQdWJsaXNoQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIHRhaWxQO1xuICAgICAgfSBlbHNlIGlmIChwdWJsaXNoQ291bnQgPCBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgIHJldHVybiBjdXJyZW50UDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICdzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgICBnZXRVcGRhdGVTaW5jZTogdXBkYXRlQ291bnQgPT4ge1xuICAgICAgaWYgKHVwZGF0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gICAgICB9XG4gICAgICB1cGRhdGVDb3VudCA9IEJpZ0ludCh1cGRhdGVDb3VudCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzdWJzY3JpYmVyXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAudGhlbigoKSA9PiBzdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKCkpXG4gICAgICApO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwdWJsaXNoZXIgPSBGYXIoJ1B1Ymxpc2hlcicsIHtcbiAgICBwdWJsaXNoOiB2YWx1ZSA9PiB7XG4gICAgICBhZHZhbmNlQ3VycmVudChmYWxzZSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZmluaXNoOiBmaW5hbFZhbHVlID0+IHtcbiAgICAgIGFkdmFuY2VDdXJyZW50KHRydWUsIGZpbmFsVmFsdWUpO1xuICAgIH0sXG4gICAgZmFpbDogcmVhc29uID0+IHtcbiAgICAgIGFkdmFuY2VDdXJyZW50KHRydWUsIHVuZGVmaW5lZCwgbWFrZVF1aWV0UmVqZWN0aW9uKHJlYXNvbikpO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaGFyZGVuKHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0pO1xufTskaM2PX29uY2UubWFrZVB1Ymxpc2hLaXQobWFrZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VQdWJsaXNoS2l0KTtcblxuY29uc3QgRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlID0gaGFyZGVuKHtcbiAgdmFsdWVEdXJhYmlsaXR5OiBNLmFueSgpLFxuICBwdWJsaXNoQ291bnQ6IE0uYW55KCksXG4gIHN0YXR1czogTS5hbnkoKSxcbiAgaGFzVmFsdWU6IE0uYW55KCksXG4gIHZhbHVlOiBNLmFueSgpLFxufSk7XG5cbi8vXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7IHZhbHVlRHVyYWJpbGl0eSA9ICdtYW5kYXRvcnknIH0gPSBvcHRpb25zO1xuICBhc3NlcnQuZXF1YWwodmFsdWVEdXJhYmlsaXR5LCAnbWFuZGF0b3J5Jyk7XG4gIHJldHVybiB7XG4gICAgLy9cbiAgICB2YWx1ZUR1cmFiaWxpdHksXG5cbiAgICAvL1xuICAgIHB1Ymxpc2hDb3VudDogMG4sXG4gICAgc3RhdHVzOiAnbGl2ZScsIC8vXG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBoYXNWYWx1ZTogZmFsc2UsXG4gICAgdmFsdWU6IHVuZGVmaW5lZCxcbiAgfTtcbn07XG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKlxuXG5cbiAqL1xuY29uc3QgZ2V0RXBoZW1lcmFsS2V5ID0gZmFjZXRzID0+IGZhY2V0cy5wdWJsaXNoZXI7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhID0gbmV3IFdlYWtNYXAoKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByb3ZpZGVDdXJyZW50UCA9IChzdGF0ZSwgZmFjZXRzLCB0YWlsKSA9PiB7XG4gIGNvbnN0IGVwaGVtZXJhbEtleSA9IGdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuICBjb25zdCBmb3VuZERhdGEgPSBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG4gIGNvbnN0IGN1cnJlbnRQID0gZm91bmREYXRhICYmIGZvdW5kRGF0YS5jdXJyZW50UDtcbiAgaWYgKGN1cnJlbnRQKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRQO1xuICB9XG5cbiAgY29uc3QgeyBwdWJsaXNoQ291bnQsIHN0YXR1cywgaGFzVmFsdWUsIHZhbHVlIH0gPSBzdGF0ZTtcbiAgaWYgKCFoYXNWYWx1ZSkge1xuICAgIGFzc2VydChzdGF0dXMgPT09ICdsaXZlJyk7XG4gICAgcmV0dXJuIHRhaWw7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gJ2xpdmUnIHx8IHN0YXR1cyA9PT0gJ2ZpbmlzaGVkJykge1xuICAgIGNvbnN0IGNlbGwgPSBoYXJkZW4oe1xuICAgICAgaGVhZDogeyB2YWx1ZSwgZG9uZTogc3RhdHVzICE9PSAnbGl2ZScgfSxcbiAgICAgIHB1Ymxpc2hDb3VudCxcbiAgICAgIHRhaWwsXG4gICAgfSk7XG4gICAgcmV0dXJuIEUucmVzb2x2ZShjZWxsKTtcbiAgfSBlbHNlIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgcmV0dXJuIG1ha2VRdWlldFJlamVjdGlvbih2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YSA9IChzdGF0ZSwgZmFjZXRzKSA9PiB7XG4gIGNvbnN0IGVwaGVtZXJhbEtleSA9IGdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuICBjb25zdCBmb3VuZERhdGEgPSBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG4gIGlmIChmb3VuZERhdGEpIHtcbiAgICByZXR1cm4gZm91bmREYXRhO1xuICB9XG5cbiAgY29uc3QgeyBzdGF0dXMgfSA9IHN0YXRlO1xuICBsZXQgdGFpbFA7XG4gIGxldCB0YWlsUjtcbiAgaWYgKHN0YXR1cyA9PT0gJ2xpdmUnKSB7XG4gICAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcbiAgICB2b2lkIEUud2hlbih0YWlsUCwgc2luaywgc2luayk7XG4gIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnZmluaXNoZWQnIHx8IHN0YXR1cyA9PT0gJ2ZhaWxlZCcpIHtcbiAgICB0YWlsUCA9IHRvb0ZhclJlamVjdGlvbjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBGYWlsYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gIH1cbiAgLy9cbiAgY29uc3Qgb2JqID0gaGFyZGVuKHsgY3VycmVudFA6IHVuZGVmaW5lZCwgdGFpbFAsIHRhaWxSIH0pO1xuICBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KGVwaGVtZXJhbEtleSwgb2JqKTtcbiAgcmV0dXJuIG9iajtcbn07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQgPSAoY29udGV4dCwgdmFsdWUsIHRhcmdldFN0YXR1cyA9ICdsaXZlJykgPT4ge1xuICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IHsgdmFsdWVEdXJhYmlsaXR5LCBzdGF0dXMgfSA9IHN0YXRlO1xuICBpZiAoc3RhdHVzICE9PSAnbGl2ZScpIHtcbiAgICB0aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiAgfVxuICBjb25zdCBkb25lID0gdGFyZ2V0U3RhdHVzICE9PSAnbGl2ZSc7XG4gIGlmIChkb25lIHx8IHZhbHVlRHVyYWJpbGl0eSA9PT0gJ21hbmRhdG9yeScpIHtcbiAgICBjYW5CZUR1cmFibGUodmFsdWUpIHx8IEZhaWxgQ2Fubm90IGFjY2VwdCBub24tZHVyYWJsZSB2YWx1ZTogJHt2YWx1ZX1gO1xuICB9XG4gIGNvbnN0IHsgdGFpbFA6IG9sZFRhaWxQLCB0YWlsUjogcmVzb2x2ZU9sZFRhaWwgfSA9XG4gICAgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShzdGF0ZSwgZmFjZXRzKTtcbiAgYXNzZXJ0LnR5cGVvZihyZXNvbHZlT2xkVGFpbCwgJ2Z1bmN0aW9uJyk7XG5cbiAgY29uc3QgcHVibGlzaENvdW50ID0gc3RhdGUucHVibGlzaENvdW50ICsgMW47XG4gIHN0YXRlLnB1Ymxpc2hDb3VudCA9IHB1Ymxpc2hDb3VudDtcblxuICBsZXQgdGFpbFA7XG4gIGxldCB0YWlsUjtcbiAgaWYgKGRvbmUpIHtcbiAgICBzdGF0ZS5zdGF0dXMgPSB0YXJnZXRTdGF0dXM7XG4gICAgdGFpbFAgPSB0b29GYXJSZWplY3Rpb247XG4gICAgdGFpbFIgPSB1bmRlZmluZWQ7XG4gIH0gZWxzZSB7XG4gICAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcbiAgICB2b2lkIEUud2hlbih0YWlsUCwgc2luaywgc2luayk7XG4gIH1cblxuICBsZXQgY3VycmVudFA7XG4gIGlmICh0YXJnZXRTdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgc3RhdGUuaGFzVmFsdWUgPSB0cnVlO1xuICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgY29uc3QgcmVqZWN0aW9uID0gbWFrZVF1aWV0UmVqZWN0aW9uKHZhbHVlKTtcbiAgICByZXNvbHZlT2xkVGFpbChyZWplY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoZG9uZSB8fCAodmFsdWVEdXJhYmlsaXR5ICE9PSAnaWdub3JlZCcgJiYgY2FuQmVEdXJhYmxlKHZhbHVlKSkpIHtcbiAgICAgIHN0YXRlLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICAgIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlLmhhc1ZhbHVlID0gZmFsc2U7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgIC8vXG4gICAgICBjdXJyZW50UCA9IG9sZFRhaWxQO1xuICAgIH1cblxuICAgIHJlc29sdmVPbGRUYWlsKFxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgaGVhZDogeyB2YWx1ZSwgZG9uZSB9LFxuICAgICAgICBwdWJsaXNoQ291bnQsXG4gICAgICAgIHRhaWw6IHRhaWxQLFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoXG4gICAgZ2V0RXBoZW1lcmFsS2V5KGZhY2V0cyksXG4gICAgaGFyZGVuKHsgY3VycmVudFAsIHRhaWxQLCB0YWlsUiB9KSxcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQgPSAoYmFnZ2FnZSwga2luZE5hbWUpID0+IHtcbiAgLy9cbiAgLy9cbiAgY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkID0gbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZDtcblxuICByZXR1cm4gcHJlcGFyZUV4b0NsYXNzS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgcHVibGlzaEtpdElLaXQsXG4gICAgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGUsXG4gICAge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBwdWJsaXNoZXI6IHtcbiAgICAgICAgcHVibGlzaCh2YWx1ZSkge1xuICAgICAgICAgIGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZpbmlzaChmaW5hbFZhbHVlKSB7XG4gICAgICAgICAgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsIGZpbmFsVmFsdWUsICdmaW5pc2hlZCcpO1xuICAgICAgICB9LFxuICAgICAgICBmYWlsKHJlYXNvbikge1xuICAgICAgICAgIGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLCByZWFzb24sICdmYWlsZWQnKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgc3Vic2NyaWJlcjoge1xuICAgICAgICBzdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQgPSAtMW4pIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdWJsaXNoQ291bnQ6IGN1cnJlbnRQdWJsaXNoQ291bnQgfSA9IHN0YXRlO1xuICAgICAgICAgIGNvbnN0IHsgY3VycmVudFAsIHRhaWxQIH0gPSBwcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKFxuICAgICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgICBmYWNldHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocHVibGlzaENvdW50ID09PSBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdGFpbFA7XG4gICAgICAgICAgfSBlbHNlIGlmIChwdWJsaXNoQ291bnQgPCBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFAgfHwgcHJvdmlkZUN1cnJlbnRQKHN0YXRlLCBmYWNldHMsIHRhaWxQKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICAgICdzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmYWNldHM6IHsgc3Vic2NyaWJlciB9LFxuICAgICAgICAgIH0gPSB0aGlzO1xuICAgICAgICAgIGlmICh1cGRhdGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLnRoZW4obWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdXBkYXRlQ291bnQgPSBCaWdJbnQodXBkYXRlQ291bnQpO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBzdWJzY3JpYmVyXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmVBZnRlcih1cGRhdGVDb3VudClcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gc3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpKVxuICAgICAgICAgICk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAge1xuICAgICAgc3RhdGVTaGFwZTogRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlLFxuICAgIH0sXG4gICk7XG59OyRozY9fb25jZS5wcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcbmhhcmRlbihwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuXG4gICAgICAgY29uc3QgU3Vic2NyaWJlclNoYXBlID0gTS5yZW1vdGFibGUoJ1N1YnNjcmliZXInKTskaM2PX29uY2UuU3Vic2NyaWJlclNoYXBlKFN1YnNjcmliZXJTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQdWJsaXNoZXJJIjpbIlB1Ymxpc2hlckkiXSwiVXBkYXRlQ291bnRTaGFwZSI6WyJVcGRhdGVDb3VudFNoYXBlIl0sIlN1YnNjcmliZXJJIjpbIlN1YnNjcmliZXJJIl0sInB1Ymxpc2hLaXRJS2l0IjpbInB1Ymxpc2hLaXRJS2l0Il0sIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiOlsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSJdLCJJdGVyYWJsZUVhY2hUb3BpY0kiOlsiSXRlcmFibGVFYWNoVG9waWNJIl0sIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIjpbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIl0sIm1ha2VQdWJsaXNoS2l0IjpbIm1ha2VQdWJsaXNoS2l0Il0sInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCI6WyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSwiU3Vic2NyaWJlclNoYXBlIjpbIlN1YnNjcmliZXJTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADWHCXvlQgAAJUIAAAuAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBlbmRvL2ZhciIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiXSwiZXhwb3J0cyI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UsRSxGYXIsb2JzZXJ2ZU5vdGlmaWVyOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLFskaM2PX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsWyRozY9fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZU5vdGlmaWVyXCIsWyRozY9fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3RvcmVkTm90aWZpZXIgPSAobm90aWZpZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGFzc2VydEFsbERlZmluZWQoeyBub3RpZmllciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIgfSk7XG5cbiAgY29uc3QgbWFyc2hhbGxUb1N0b3JhZ2UgPSBtYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKTtcblxuICBvYnNlcnZlTm90aWZpZXIobm90aWZpZXIsIHtcbiAgICB1cGRhdGVTdGF0ZSh2YWx1ZSkge1xuICAgICAgbWFyc2hhbGxUb1N0b3JhZ2UodmFsdWUpLmNhdGNoKHJlYXNvbiA9PlxuICAgICAgICBjb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBmYWlsZWQgdG8gdXBkYXRlU3RhdGUnLCByZWFzb24pLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGZhaWwocmVhc29uKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBmYWlsZWQgdG8gaXRlcmF0ZScsIHJlYXNvbik7XG4gICAgfSxcbiAgfSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBoYWx0ZWQgaXRlcmF0aW9uJywgcmVhc29uKTtcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHVuc2VyaWFsaXplciA9IEZhcigndW5zZXJpYWxpemVyJywge1xuICAgIGZyb21DYXBEYXRhOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gICAgdW5zZXJpYWxpemU6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3RvcmVkTm90aWZpZXIgPSBGYXIoJ1N0b3JlZE5vdGlmaWVyJywge1xuICAgIGdldFVwZGF0ZVNpbmNlOiB1cGRhdGVDb3VudCA9PiBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG4gICAgZ2V0UGF0aDogKCkgPT4gRShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuICAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gdW5zZXJpYWxpemVyLFxuICB9KTtcbiAgcmV0dXJuIHN0b3JlZE5vdGlmaWVyO1xufTskaM2PX29uY2UubWFrZVN0b3JlZE5vdGlmaWVyKG1ha2VTdG9yZWROb3RpZmllcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RvcmVkTm90aWZpZXIiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEiVgML+FwAA/hcAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVzdWIuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZXIuanMiLCIuL3N1YnNjcmliZS5qcyJdLCJleHBvcnRzIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCIsIm1ha2VTdG9yZWRQdWJsaXNoS2l0IiwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCIsIm1ha2VTdG9yZWRTdWJzY3JpYmVyIiwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsRmFyLG1ha2VNYXJzaGFsLGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxvYnNlcnZlSXRlcmF0aW9uLG1ha2VQdWJsaXNoS2l0LG1ha2VTdWJzY3JpcHRpb25LaXQsc3Vic2NyaWJlRWFjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIixbJGjNj19hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLFskaM2PX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlSXRlcmF0aW9uXCIsWyRozY9fYSA9PiAob2JzZXJ2ZUl0ZXJhdGlvbiA9ICRozY9fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25LaXRcIixbJGjNj19hID0+IChtYWtlU3Vic2NyaXB0aW9uS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIixbJGjNj19hID0+IChzdWJzY3JpYmVFYWNoID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQgPSBhc3luYyAoc3Vic2NyaWJlciwgY29uc3VtZVZhbHVlKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IGl0ZXJhdG9yID0gc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVyKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgYXdhaXQgbnVsbDtcbiAgd2hpbGUgKCFmaW5pc2hlZCkge1xuICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbiAgICBhd2FpdCBjb25zdW1lVmFsdWUodmFsdWUpO1xuICAgIGZpbmlzaGVkID0gISFkb25lO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKGZvckVhY2hQdWJsaWNhdGlvblJlY29yZCk7XG4gICAgICAgY29uc3QgbWFrZVN0b3JlZFN1YnNjcmliZXIgPSAoc3Vic2NyaWJlciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpID0+IHtcbiAgYXNzZXJ0QWxsRGVmaW5lZCh7IHN1YnNjcmliZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyIH0pO1xuXG4gIGNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlID0gbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcik7XG5cbiAgLy9cbiAgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKHN1YnNjcmliZXIsIG1hcnNoYWxsVG9TdG9yYWdlKS5jYXRjaChlcnIgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zb2xlLmVycm9yKCdTdG9yZWRTdWJzY3JpYmVyIGZhaWxlZCB0byBpdGVyYXRlJywgZXJyKTtcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHVuc2VyaWFsaXplciA9IEZhcigndW5zZXJpYWxpemVyJywge1xuICAgIGZyb21DYXBEYXRhOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gICAgdW5zZXJpYWxpemU6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdG9yZXN1YiA9IEZhcignU3RvcmVkU3Vic2NyaWJlcicsIHtcbiAgICBzdWJzY3JpYmVBZnRlcjogcHVibGlzaENvdW50ID0+IHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcbiAgICBnZXRVcGRhdGVTaW5jZTogdXBkYXRlQ291bnQgPT4gc3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG4gICAgZ2V0UGF0aDogKCkgPT4gRShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuICAgIGdldFN0b3JlS2V5OiAoKSA9PiBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpLFxuICAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gdW5zZXJpYWxpemVyLFxuICB9KTtcbiAgcmV0dXJuIHN0b3Jlc3ViO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZVN0b3JlZFN1YnNjcmliZXIobWFrZVN0b3JlZFN1YnNjcmliZXIpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRTdWJzY3JpcHRpb24gPSAoXG4gIHN1YnNjcmlwdGlvbixcbiAgc3RvcmFnZU5vZGUsXG4gIG1hcnNoYWxsZXIgPSBtYWtlTWFyc2hhbCh1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuICAgIG1hcnNoYWxTYXZlRXJyb3I6ICgpID0+IHt9LFxuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnLFxuICB9KSxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgdW5zZXJpYWxpemVyID0gRmFyKCd1bnNlcmlhbGl6ZXInLCB7XG4gICAgZnJvbUNhcERhdGE6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgICB1bnNlcmlhbGl6ZTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICB9KTtcblxuICAvL1xuICBsZXQgcHVibGlzaEZhaWxlZCA9IGZhbHNlO1xuICBsZXQgcHVibGlzaEV4Y2VwdGlvbjtcblxuICBjb25zdCBmYWlsID0gZXJyID0+IHtcbiAgICBwdWJsaXNoRmFpbGVkID0gdHJ1ZTtcbiAgICBwdWJsaXNoRXhjZXB0aW9uID0gZXJyO1xuICB9O1xuXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHB1Ymxpc2hWYWx1ZSA9IG9iaiA9PiB7XG4gICAgYXNzZXJ0KHN0b3JhZ2VOb2RlKTtcbiAgICBpZiAocHVibGlzaEZhaWxlZCkge1xuICAgICAgLy9cbiAgICAgIHRocm93IHB1Ymxpc2hFeGNlcHRpb247XG4gICAgfVxuXG4gICAgLy9cbiAgICBFKG1hcnNoYWxsZXIpXG4gICAgICAudG9DYXBEYXRhKG9iailcbiAgICAgIC50aGVuKHNlcmlhbGl6ZWQgPT4ge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gSlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCk7XG4gICAgICAgIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShlbmNvZGVkKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZmFpbCk7XG4gIH07XG5cbiAgaWYgKHN0b3JhZ2VOb2RlKSB7XG4gICAgLy9cbiAgICBvYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmlwdGlvbiwge1xuICAgICAgdXBkYXRlU3RhdGU6IHB1Ymxpc2hWYWx1ZSxcbiAgICAgIGZpbmlzaDogcHVibGlzaFZhbHVlLFxuICAgIH0pLmNhdGNoKGZhaWwpO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0b3Jlc3ViID0gRmFyKCdTdG9yZWRTdWJzY3JpcHRpb24nLCB7XG4gICAgLy9cbiAgICBnZXRTdG9yZUtleTogYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCFzdG9yYWdlTm9kZSkge1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgc3Vic2NyaXB0aW9uIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RvcmVLZXkgPSBhd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IC4uLnN0b3JlS2V5LCBzdWJzY3JpcHRpb24gfSk7XG4gICAgfSxcbiAgICBnZXRVbnNlcmlhbGl6ZXI6ICgpID0+IHVuc2VyaWFsaXplcixcbiAgICBnZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczogKCkgPT5cbiAgICAgIHN1YnNjcmlwdGlvbi5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFscygpLFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHN1YnNjcmlwdGlvbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSxcbiAgICBzdWJzY3JpYmVBZnRlcjogcHVibGlzaENvdW50ID0+IHN1YnNjcmlwdGlvbi5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuICB9KTtcbiAgcmV0dXJuIHN0b3Jlc3ViO1xufTskaM2PX29uY2UubWFrZVN0b3JlZFN1YnNjcmlwdGlvbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVN0b3JlZFB1Ymxpc2hlcktpdCA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciwgY2hpbGRQYXRoKSA9PiB7XG4gIGNvbnN0IHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9ID0gbWFrZVN1YnNjcmlwdGlvbktpdCgpO1xuXG4gIGlmIChzdG9yYWdlTm9kZSAmJiBjaGlsZFBhdGgpIHtcbiAgICBzdG9yYWdlTm9kZSA9IEUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGRQYXRoKTtcbiAgfVxuXG4gIC8vXG4gIGNvbnN0IHN1YnNjcmliZXIgPSBtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKFxuICAgIHN1YnNjcmlwdGlvbixcbiAgICBzdG9yYWdlTm9kZSxcbiAgICBtYXJzaGFsbGVyLFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgcHVibGlzaGVyOiBwdWJsaWNhdGlvbixcbiAgICBzdWJzY3JpYmVyLFxuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlU3RvcmVkUHVibGlzaGVyS2l0KG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRQdWJsaXNoS2l0ID0gKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuXG4gIHJldHVybiB7XG4gICAgcHVibGlzaGVyLFxuICAgIC8vXG4gICAgc3Vic2NyaWJlcjogbWFrZVN0b3JlZFN1YnNjcmliZXIoc3Vic2NyaWJlciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpLFxuICB9O1xufTskaM2PX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hLaXQobWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCI6WyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiXSwibWFrZVN0b3JlZFN1YnNjcmliZXIiOlsibWFrZVN0b3JlZFN1YnNjcmliZXIiXSwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiI6WyJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCJdLCJtYWtlU3RvcmVkUHVibGlzaEtpdCI6WyJtYWtlU3RvcmVkUHVibGlzaEtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA5aH3YUhYAAFIWAAAoAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiXSwiZXhwb3J0cyI6WyJzdWJzY3JpYmUiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxGYWlsLGFubm90YXRlRXJyb3IsRSxGYXIsaXNQcmltaXRpdmUsaXNVcGdyYWRlRGlzY29ubmVjdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qc1wiLCBbW1wiaXNVcGdyYWRlRGlzY29ubmVjdGlvblwiLFskaM2PX2EgPT4gKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCBzaW5rID0gKCkgPT4ge307XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmVjb25uZWN0QXNOZWVkZWQgPSBhc3luYyAoZ2V0dGVyLCBzZWVkID0gW10pID0+IHtcbiAgbGV0IGRpc2Nvbm5lY3Rpb247XG4gIGxldCBsYXN0VmVyc2lvbiA9IC1JbmZpbml0eTtcbiAgLy9cbiAgYXdhaXQgbnVsbDtcbiAgZm9yIChsZXQgaSA9IDA7IDsgaSArPSAxKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdFAgPSBpIDwgc2VlZC5sZW5ndGggPyBzZWVkW2ldIDogZ2V0dGVyKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXN1bHRQO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKGVycikpIHtcbiAgICAgICAgaWYgKCFkaXNjb25uZWN0aW9uKSB7XG4gICAgICAgICAgZGlzY29ubmVjdGlvbiA9IGVycjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGluY2FybmF0aW9uTnVtYmVyOiB2ZXJzaW9uIH0gPSBlcnI7XG4gICAgICAgIGlmICh2ZXJzaW9uID4gbGFzdFZlcnNpb24pIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBsYXN0VmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmICghaXNQcmltaXRpdmUoZXJyKSAmJiBkaXNjb25uZWN0aW9uICYmIGRpc2Nvbm5lY3Rpb24gIT09IGVycikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGFubm90YXRlRXJyb3IoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBYYEF0dGVtcHRpbmcgdG8gcmVjb3ZlciBmcm9tIGRpc2Nvbm5lY3Rpb246ICR7ZGlzY29ubmVjdGlvbn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAvL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBzdWJzY3JpYmUgPSBpdFAgPT5cbiAgRmFyKCdBc3luY0l0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGl0ID0gRShpdFApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgICAgY29uc3Qgc2VsZiA9IEZhcignQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJywge1xuICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgICAgICBuZXh0OiBhc3luYyAoKSA9PiBFKGl0KS5uZXh0KCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG4gIH0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLnN1YnNjcmliZShzdWJzY3JpYmUpO1xuY29uc3QgbWFrZUVhY2hJdGVyYXRvciA9ICh0b3BpYywgbmV4dENlbGxQKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IHNlbGYgPSBGYXIoJ0VhY2hJdGVyYXRvcicsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgIG5leHQ6ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaGVhZDogcmVzdWx0UCxcbiAgICAgICAgcHVibGlzaENvdW50OiBwdWJsaXNoQ291bnRQLFxuICAgICAgICB0YWlsOiB0YWlsUCxcbiAgICAgIH0gPSBFLmdldChuZXh0Q2VsbFApO1xuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGdldFN1Y2Nlc3NvciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHVibGlzaENvdW50ID0gYXdhaXQgcHVibGlzaENvdW50UDtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsICdiaWdpbnQnKTtcbiAgICAgICAgY29uc3Qgc3VjY2Vzc29yID0gYXdhaXQgRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbiAgICAgICAgY29uc3QgbmV3UHVibGlzaENvdW50ID0gc3VjY2Vzc29yLnB1Ymxpc2hDb3VudDtcbiAgICAgICAgaWYgKG5ld1B1Ymxpc2hDb3VudCAhPT0gcHVibGlzaENvdW50ICsgMW4pIHtcbiAgICAgICAgICBGYWlsYGVhY2hJdGVyYXRvciBicm9rZW4gYnkgZ2FwIGZyb20gcHVibGlzaENvdW50ICR7cHVibGlzaENvdW50fSB0byAke25ld1B1Ymxpc2hDb3VudH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZXNzb3I7XG4gICAgICB9O1xuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIG5leHRDZWxsUCA9IHJlY29ubmVjdEFzTmVlZGVkKGdldFN1Y2Nlc3NvciwgW3RhaWxQXSk7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICB2b2lkIEUud2hlbihwdWJsaXNoQ291bnRQLCBzaW5rLCBzaW5rKTtcbiAgICAgIHZvaWQgRS53aGVuKG5leHRDZWxsUCwgc2luaywgc2luayk7XG4gICAgICByZXR1cm4gcmVzdWx0UDtcbiAgICB9LFxuICAgIGZvcms6ICgpID0+IG1ha2VFYWNoSXRlcmF0b3IodG9waWMsIG5leHRDZWxsUCksXG4gIH0pO1xuICByZXR1cm4gc2VsZjtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3Qgc3Vic2NyaWJlRWFjaCA9IHRvcGljID0+IHtcbiAgY29uc3QgaXRlcmFibGUgPSBGYXIoJ0VhY2hJdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdENlbGxQID0gcmVjb25uZWN0QXNOZWVkZWQoKCkgPT4gRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIoKSk7XG4gICAgICByZXR1cm4gbWFrZUVhY2hJdGVyYXRvcih0b3BpYywgZmlyc3RDZWxsUCk7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZTtcbn07JGjNj19vbmNlLnN1YnNjcmliZUVhY2goc3Vic2NyaWJlRWFjaCk7XG5oYXJkZW4oc3Vic2NyaWJlRWFjaCk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjbG9uZUxhdGVzdEl0ZXJhdG9yID0gKHRvcGljLCBsb2NhbFVwZGF0ZUNvdW50LCB0ZXJtaW5hbFJlc3VsdCkgPT4ge1xuICBsZXQgbXV0ZXggPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYXliZVJlcXVlc3ROZXh0UmVzdWx0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICh0ZXJtaW5hbFJlc3VsdCkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHsgdmFsdWUsIHVwZGF0ZUNvdW50IH0gPSBhd2FpdCByZWNvbm5lY3RBc05lZWRlZCgoKSA9PlxuICAgICAgRSh0b3BpYykuZ2V0VXBkYXRlU2luY2UobG9jYWxVcGRhdGVDb3VudCksXG4gICAgKTtcbiAgICAvL1xuICAgIGxvY2FsVXBkYXRlQ291bnQgPSB1cGRhdGVDb3VudDtcblxuICAgIC8vXG4gICAgaWYgKHVwZGF0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlcm1pbmFsUmVzdWx0ID0gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWUgfSk7XG4gICAgICByZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gIH07XG5cbiAgY29uc3Qgc2VsZiA9IEZhcignTGF0ZXN0SXRlcmF0b3InLCB7XG4gICAgZm9yazogKCkgPT4gY2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYywgbG9jYWxVcGRhdGVDb3VudCwgdGVybWluYWxSZXN1bHQpLFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHNlbGYsXG4gICAgbmV4dDogYXN5bmMgKCkgPT4ge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuXG4gICAgICBpZiAodGVybWluYWxSZXN1bHQpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgbmV4dFJlc3VsdCA9IG11dGV4LnRoZW4obWF5YmVSZXF1ZXN0TmV4dFJlc3VsdCk7XG4gICAgICBtdXRleCA9IG5leHRSZXN1bHQudGhlbihzaW5rLCBzaW5rKTtcbiAgICAgIC8vXG5cbiAgICAgIHJldHVybiBuZXh0UmVzdWx0O1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc2VsZjtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VMYXRlc3RJdGVyYXRvciA9IHRvcGljID0+IGNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHN1YnNjcmliZUxhdGVzdCA9IHRvcGljID0+IHtcbiAgY29uc3QgaXRlcmFibGUgPSBGYXIoJ0xhdGVzdEl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IG1ha2VMYXRlc3RJdGVyYXRvcih0b3BpYyksXG4gIH0pO1xuICByZXR1cm4gaXRlcmFibGU7XG59OyRozY9fb25jZS5zdWJzY3JpYmVMYXRlc3Qoc3Vic2NyaWJlTGF0ZXN0KTtcbmhhcmRlbihzdWJzY3JpYmVMYXRlc3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3Vic2NyaWJlIjpbInN1YnNjcmliZSJdLCJzdWJzY3JpYmVFYWNoIjpbInN1YnNjcmliZUVhY2giXSwic3Vic2NyaWJlTGF0ZXN0IjpbInN1YnNjcmliZUxhdGVzdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAjmX64OQgAADkIAAApAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiLi9zdWJzY3JpYmUuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi90b3BpYy5qcyJdLCJleHBvcnRzIjpbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYXIsc3Vic2NyaWJlRWFjaCxtYWtlUHVibGlzaEtpdCxtYWtlUGlubmVkSGlzdG9yeVRvcGljOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi90b3BpYy5qc1wiLCBbW1wibWFrZVBpbm5lZEhpc3RvcnlUb3BpY1wiLFskaM2PX2EgPT4gKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuLypcblxuICovXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb24gPSB0b3BpYyA9PiB7XG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IEZhcignU3Vic2NyaXB0aW9uJywge1xuICAgIC4uLnN1YnNjcmliZUVhY2godG9waWMpLFxuICAgIHN1YnNjcmliZUFmdGVyOiBhc3luYyBwdWJsaXNoQ291bnQgPT4gRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcblxuICAgIC8qXG5cblxuXG5cbiAgICAgKi9cbiAgICBnZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczogYXN5bmMgKCkgPT4gdG9waWMsXG5cbiAgICBnZXRTdG9yZUtleTogKCkgPT4gaGFyZGVuKHsgc3Vic2NyaXB0aW9uIH0pLFxuICB9KTtcbiAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbn07JGjNj19vbmNlLm1ha2VTdWJzY3JpcHRpb24obWFrZVN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbik7XG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0ID0gKCkgPT4ge1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICAvL1xuICAvL1xuXG4gIGNvbnN0IHBpbm5lZEhpc3RvcnlUb3BpYyA9IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG1ha2VTdWJzY3JpcHRpb24ocGlubmVkSGlzdG9yeVRvcGljKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwdWJsaWNhdGlvbiA9IEZhcigncHVibGljYXRpb24nLCB7XG4gICAgdXBkYXRlU3RhdGU6IG5vbkZpbmFsVmFsdWUgPT4gcHVibGlzaGVyLnB1Ymxpc2gobm9uRmluYWxWYWx1ZSksXG4gICAgZmluaXNoOiBjb21wbGV0aW9uID0+IHB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG4gICAgZmFpbDogcmVhc29uID0+IHB1Ymxpc2hlci5mYWlsKHJlYXNvbiksXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH0pO1xufTskaM2PX29uY2UubWFrZVN1YnNjcmlwdGlvbktpdChtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdWJzY3JpcHRpb24iOlsibWFrZVN1YnNjcmlwdGlvbiJdLCJtYWtlU3Vic2NyaXB0aW9uS2l0IjpbIm1ha2VTdWJzY3JpcHRpb25LaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWzsF4kwEAABMBAAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90b3BpYy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMgPSB0b3BpYyA9PiB7XG4gIC8vXG5cbiAgLy9cbiAgY29uc3QgcGlubmVkUHViTGlzdCA9IHRvcGljLnN1YnNjcmliZUFmdGVyKCk7XG5cbiAgcmV0dXJuIEZhcignUGlubmVkSGlzdG9yeVRvcGljJywge1xuICAgIHN1YnNjcmliZUFmdGVyOiBhc3luYyAocHVibGlzaENvdW50ID0gLTFuKSA9PiB7XG4gICAgICBpZiAocHVibGlzaENvdW50ID09PSAtMW4pIHtcbiAgICAgICAgcmV0dXJuIHBpbm5lZFB1Ykxpc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gdG9waWMuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbiAgICB9LFxuICAgIGdldFVwZGF0ZVNpbmNlOiBhc3luYyAodXBkYXRlQ291bnQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdG9waWMuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhtYWtlUGlubmVkSGlzdG9yeVRvcGljKTtcbmhhcmRlbihtYWtlUGlubmVkSGlzdG9yeVRvcGljKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQaW5uZWRIaXN0b3J5VG9waWMiOlsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKOSJg0UBwAAFAcAAC0AAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi90b29scy90ZXN0U3VwcG9ydHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlRmFrZU1hcnNoYWxsZXIiLCJtYWtlRmFrZVN0b3JhZ2UiLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhcixtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qc1wiLCBbXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VGYWtlU3RvcmFnZSA9IChwYXRoLCBwdWJsaWNhdGlvbikgPT4ge1xuICBsZXQgc2V0VmFsdWVDYWxscyA9IDA7XG4gIGNvbnN0IGZ1bGxQYXRoID0gYHB1Ymxpc2guJHtwYXRofWA7XG4gIGNvbnN0IHN0b3JlS2V5ID0gaGFyZGVuKHtcbiAgICBzdG9yZU5hbWU6ICdzd2luZ3NldCcsXG4gICAgc3RvcmVTdWJrZXk6IGBzd2luZ3NldC9kYXRhOiR7ZnVsbFBhdGh9YCxcbiAgICBkYXRhUHJlZml4Qnl0ZXM6ICcnLFxuICB9KTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdG9yYWdlID0gRmFyKCdTdG9yYWdlTm9kZScsIHtcbiAgICBnZXRQYXRoOiAoKSA9PiBwYXRoLFxuICAgIGdldFN0b3JlS2V5OiBhc3luYyAoKSA9PiBzdG9yZUtleSxcbiAgICBzZXRWYWx1ZTogYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgc2V0VmFsdWVDYWxscyArPSAxO1xuICAgICAgYXNzZXJ0LnR5cGVvZih2YWx1ZSwgJ3N0cmluZycpO1xuICAgICAgaWYgKHB1YmxpY2F0aW9uKSB7XG4gICAgICAgIHB1YmxpY2F0aW9uLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1ha2VDaGlsZE5vZGU6ICgpID0+IHN0b3JhZ2UsXG4gICAgY291bnRTZXRWYWx1ZUNhbGxzOiAoKSA9PiBzZXRWYWx1ZUNhbGxzLFxuICB9KTtcbiAgcmV0dXJuIHN0b3JhZ2U7XG59OyRozY9fb25jZS5tYWtlRmFrZVN0b3JhZ2UobWFrZUZha2VTdG9yYWdlKTtcbmhhcmRlbihtYWtlRmFrZVN0b3JhZ2UpO1xuXG4gICAgICAgY29uc3QgbWFrZUZha2VNYXJzaGFsbGVyID0gKCkgPT5cbiAgbWFrZU1hcnNoYWwodW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcbiAgICBtYXJzaGFsU2F2ZUVycm9yOiAoKSA9PiB7fSxcbiAgfSk7JGjNj19vbmNlLm1ha2VGYWtlTWFyc2hhbGxlcihtYWtlRmFrZU1hcnNoYWxsZXIpO1xuaGFyZGVuKG1ha2VGYWtlTWFyc2hhbGxlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjpbWyJldmVudExvb3BJdGVyYXRpb24iLCJldmVudExvb3BJdGVyYXRpb24iXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUZha2VTdG9yYWdlIjpbIm1ha2VGYWtlU3RvcmFnZSJdLCJtYWtlRmFrZU1hcnNoYWxsZXIiOlsibWFrZUZha2VNYXJzaGFsbGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGw0phvmDQAA5g0AACEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLCJAZW5kby9leG8iLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiLCJtdXN0TWF0Y2giLCJwcm92aWRlTGF6eSIsInByb3ZpZGVMYXp5IixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAodHlwZWxlc3NNdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qc1wiLCBbXV0sW1wiQGVuZG8vZXhvXCIsIFtdXSxbXCIuL2xlZ2FjeS9sZWdhY3lNYXAuanNcIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW11dLFtcIi4vdHlwZXMuanNcIiwgW11dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgbXVzdE1hdGNoID0gdHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOltbIm1ha2VBdG9taWNQcm92aWRlciIsIm1ha2VBdG9taWNQcm92aWRlciJdLFsicHJvdmlkZUxhenkiLCJwcm92aWRlTGF6eSJdXSwiQGVuZG8vcGF0dGVybnMiOltbImlzS2V5IiwiaXNLZXkiXSxbImFzc2VydEtleSIsImFzc2VydEtleSJdLFsiYXNzZXJ0U2NhbGFyS2V5IiwiYXNzZXJ0U2NhbGFyS2V5Il0sWyJtYWtlQ29weVNldCIsIm1ha2VDb3B5U2V0Il0sWyJnZXRDb3B5U2V0S2V5cyIsImdldENvcHlTZXRLZXlzIl0sWyJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnIl0sWyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sWyJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlCYWdFbnRyaWVzIl0sWyJtYWtlQ29weU1hcCIsIm1ha2VDb3B5TWFwIl0sWyJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIl0sWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdLFsiY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIl0sWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdLFsiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldENvbXBhcmUiLCJzZXRDb21wYXJlIl0sWyJzZXRVbmlvbiIsInNldFVuaW9uIl0sWyJzZXREaXNqb2ludFVuaW9uIiwic2V0RGlzam9pbnRVbmlvbiJdLFsic2V0SW50ZXJzZWN0aW9uIiwic2V0SW50ZXJzZWN0aW9uIl0sWyJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRTdWJ0cmFjdCJdLFsiYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il0sWyJNIiwiTSJdLFsiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIl0sWyJpc1BhdHRlcm4iLCJpc1BhdHRlcm4iXSxbImFzc2VydFBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIl0sWyJtYXRjaGVzIiwibWF0Y2hlcyJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il0sWyJpc0NvcHlNYXAiLCJpc0NvcHlNYXAiXV0sIkBlbmRvL2V4byI6W1siaW5pdEVtcHR5IiwiaW5pdEVtcHR5Il0sWyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIl0sWyJkZWZpbmVFeG9DbGFzc0tpdCIsImRlZmluZUV4b0NsYXNzS2l0Il0sWyJtYWtlRXhvIiwibWFrZUV4byJdXSwiLi9sZWdhY3kvbGVnYWN5TWFwLmpzIjpbWyJtYWtlTGVnYWN5TWFwIiwibWFrZUxlZ2FjeU1hcCJdXSwiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6W1sibWFrZUxlZ2FjeVdlYWtNYXAiLCJtYWtlTGVnYWN5V2Vha01hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMMzhvT6BQAA+gUAACwAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VMZWdhY3lNYXAgPSAodGFnID0gJ2tleScpID0+IHtcbiAgY29uc3QgbSA9IG5ldyBNYXAoKTtcbiAgY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0ID0ga2V5ID0+XG4gICAgIW0uaGFzKGtleSkgfHwgRmFpbGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuICBjb25zdCBhc3NlcnRLZXlFeGlzdHMgPSBrZXkgPT5cbiAgICBtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIG0uaGFzKGtleSk7XG4gICAgfSxcbiAgICBpbml0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG4gICAgICBtLnNldChrZXksIHZhbHVlKTtcbiAgICB9LFxuICAgIGdldDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgcmV0dXJuIG0uZ2V0KGtleSk7XG4gICAgfSxcbiAgICBzZXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIG0uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBtLmRlbGV0ZShrZXkpO1xuICAgIH0sXG4gICAga2V5czogKCkgPT4gbS5rZXlzKCksXG4gICAgdmFsdWVzOiAoKSA9PiBtLnZhbHVlcygpLFxuICAgIGVudHJpZXM6ICgpID0+IG0uZW50cmllcygpLFxuICAgIGdldFNpemU6ICgpID0+IG0uc2l6ZSxcbiAgICBjbGVhcjogKCkgPT4gbS5jbGVhcigpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VMZWdhY3lNYXAobWFrZUxlZ2FjeU1hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeU1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5TWFwIjpbIm1ha2VMZWdhY3lNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAxezG6IFAACiBQAAMAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5V2Vha01hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUxlZ2FjeVdlYWtNYXAgPSAodGFnID0gJ2tleScpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB3bSA9IG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdCA9IGtleSA9PlxuICAgICF3bS5oYXMoa2V5KSB8fCBGYWlsYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIHdtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIHdtLmhhcyhrZXkpO1xuICAgIH0sXG4gICAgaW5pdDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuICAgICAgd20uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZ2V0OiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIC8qICAgICAgICAgICAgKi8gKHdtLmdldChrZXkpKTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgd20uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICB3bS5kZWxldGUoa2V5KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5V2Vha01hcCI6WyJtYWtlTGVnYWN5V2Vha01hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACGpoxiARMAAAETAAAxAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFyLGFzc2VydFBhc3NhYmxlLGZpbHRlckl0ZXJhYmxlLG1hcEl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weU1hcCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLFskaM2PX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjNj19hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsWyRozY9fYSA9PiAobWFwSXRlcmFibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLFskaM2PX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRozY9fYSldXSxbXCJtYWtlQ29weU1hcFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXV1dLFtcIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kc1wiLFskaM2PX2EgPT4gKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gJGjNj19hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsWyRozY9fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZU1hcFN0b3JlTWV0aG9kcyA9IChcbiAganNtYXAsXG4gIGFzc2VydEtWT2tUb0FkZCxcbiAgYXNzZXJ0S1ZPa1RvU2V0LFxuICBhc3NlcnRLZXlPa1RvRGVsZXRlID0gdW5kZWZpbmVkLFxuICB0YWcgPSAna2V5JyxcbikgPT4ge1xuICBjb25zdCB7IGFzc2VydFVwZGF0ZU9uQWRkLCBhc3NlcnRVcGRhdGVPbkRlbGV0ZSwgaXRlcmFibGVLZXlzIH0gPVxuICAgIG1ha2VDdXJyZW50S2V5c0tpdChcbiAgICAgICgpID0+IGpzbWFwLmtleXMoKSxcbiAgICAgIGsgPT4ganNtYXAuaGFzKGspLFxuICAgICAgY29tcGFyZVJhbmssXG4gICAgICBhc3NlcnRLVk9rVG9BZGQsXG4gICAgICBhc3NlcnRLZXlPa1RvRGVsZXRlLFxuICAgICAgdGFnLFxuICAgICk7XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IGtleXMgPSAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKGtleVBhdHQgPT09IHVuZGVmaW5lZCAmJiB2YWx1ZVBhdHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGl0ZXJhYmxlS2V5cztcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyID0gayA9PiB7XG4gICAgICBpZiAoa2V5UGF0dCAhPT0gdW5kZWZpbmVkICYmICFtYXRjaGVzKGssIGtleVBhdHQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBpZiAodmFsdWVQYXR0ICE9PSB1bmRlZmluZWQgJiYgIW1hdGNoZXMoanNtYXAuZ2V0KGspLCB2YWx1ZVBhdHQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgcmV0dXJuIGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cywgZmlsdGVyKTtcbiAgfTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgdmFsdWVzID0gKGtleVBhdHQgPSB1bmRlZmluZWQsIHZhbHVlUGF0dCA9IHVuZGVmaW5lZCkgPT5cbiAgICBtYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsIHZhbHVlUGF0dCksIGsgPT4gLyogICAgICAgICAgICAqLyAoanNtYXAuZ2V0KGspKSk7XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IGVudHJpZXMgPSAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgIG1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSwgayA9PiBbXG4gICAgICBrLFxuICAgICAgLyogICAgICAgICAgICAqLyAoanNtYXAuZ2V0KGspKSxcbiAgICBdKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICAuLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzbWFwLFxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKGFzc2VydFVwZGF0ZU9uQWRkKSxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIGFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuICAgICAgdGFnLFxuICAgICksXG4gICAga2V5cyxcbiAgICB2YWx1ZXMsXG4gICAgZW50cmllcyxcblxuICAgIHNuYXBzaG90OiAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LCB2YWx1ZVBhdHQpKSxcblxuICAgIGdldFNpemU6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgICBrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBqc21hcC5zaXplXG4gICAgICAgIDogWy4uLmtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG4gICAgY2xlYXI6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAganNtYXAuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSkge1xuICAgICAgICBqc21hcC5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZU1hcFN0b3JlTWV0aG9kcyhtYWtlTWFwU3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyTWFwU3RvcmUgPSAoXG4gIHRhZyA9ICdrZXknLFxuICB7IGtleVNoYXBlID0gdW5kZWZpbmVkLCB2YWx1ZVNoYXBlID0gdW5kZWZpbmVkIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCBqc21hcCA9IG5ldyBNYXAoKTtcbiAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiAgfVxuICBpZiAodmFsdWVTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiAgfVxuXG4gIGNvbnN0IGFzc2VydEtWT2tUb1NldCA9IChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBoYXJkZW4odmFsdWUpO1xuXG4gICAgYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuICAgIGlmICh2YWx1ZVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSwgJ21hcFN0b3JlIHZhbHVlJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFzc2VydEtWT2tUb0FkZCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbihrZXkpO1xuXG4gICAgYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG4gICAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChrZXksIGtleVNoYXBlLCAnbWFwU3RvcmUga2V5Jyk7XG4gICAgfVxuICAgIGFzc2VydEtWT2tUb1NldChrZXksIHZhbHVlKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKGBzY2FsYXIgTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VNYXBTdG9yZU1ldGhvZHMoXG4gICAgICBqc21hcCxcbiAgICAgIGFzc2VydEtWT2tUb0FkZCxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRhZyxcbiAgICApLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJNYXBTdG9yZShtYWtlU2NhbGFyTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC6QDqcDQ0AAA0NAAAxAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIixbJGjNj19hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsWyRozY9fYSA9PiAobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIixbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXRTdG9yZU1ldGhvZHMgPSAoXG4gIGpzc2V0LFxuICBhc3NlcnRLZXlPa1RvQWRkLFxuICBhc3NlcnRLZXlPa1RvRGVsZXRlID0gdW5kZWZpbmVkLFxuICBrZXlOYW1lID0gJ2tleScsXG4pID0+IHtcbiAgY29uc3QgeyBhc3NlcnRVcGRhdGVPbkFkZCwgYXNzZXJ0VXBkYXRlT25EZWxldGUsIGl0ZXJhYmxlS2V5cyB9ID1cbiAgICBtYWtlQ3VycmVudEtleXNLaXQoXG4gICAgICAoKSA9PiBqc3NldC5rZXlzKCksXG4gICAgICBrID0+IGpzc2V0LmhhcyhrKSxcbiAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgYXNzZXJ0S2V5T2tUb0FkZCxcbiAgICAgIGFzc2VydEtleU9rVG9EZWxldGUsXG4gICAgICBrZXlOYW1lLFxuICAgICk7XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBrZXlzID0gKGtleVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAga2V5UGF0dCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IGl0ZXJhYmxlS2V5c1xuICAgICAgOiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsIGsgPT4gbWF0Y2hlcyhrLCBrZXlQYXR0KSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgLi4ubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMoXG4gICAgICBqc3NldCxcbiAgICAgIGFzc2VydFVwZGF0ZU9uQWRkLFxuICAgICAgYXNzZXJ0VXBkYXRlT25EZWxldGUsXG4gICAgICBrZXlOYW1lLFxuICAgICksXG5cbiAgICBrZXlzLFxuXG4gICAgdmFsdWVzOiBrZXlzLFxuXG4gICAgc25hcHNob3Q6IChrZXlQYXR0ID0gdW5kZWZpbmVkKSA9PiBtYWtlQ29weVNldChrZXlzKGtleVBhdHQpKSxcblxuICAgIGdldFNpemU6IChrZXlQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAga2V5UGF0dCA9PT0gdW5kZWZpbmVkID8ganNzZXQuc2l6ZSA6IFsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbiAgICBjbGVhcjogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAganNzZXQuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpIHtcbiAgICAgICAganNzZXQuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlU2V0U3RvcmVNZXRob2RzKG1ha2VTZXRTdG9yZU1ldGhvZHMpO1xuICAgICAgIGNvbnN0IG1ha2VTY2FsYXJTZXRTdG9yZSA9IChcbiAgdGFnID0gJ2tleScsXG4gIHsga2V5U2hhcGUgPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGpzc2V0ID0gbmV3IFNldCgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S2V5T2tUb0FkZCA9IGtleSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbihrZXkpO1xuXG4gICAgYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG4gICAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChrZXksIGtleVNoYXBlLCAnc2V0U3RvcmUga2V5Jyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBTZXRTdG9yZSBvZiAke3EodGFnKX1gLCB7XG4gICAgLi4ubWFrZVNldFN0b3JlTWV0aG9kcyhqc3NldCwgYXNzZXJ0S2V5T2tUb0FkZCwgdW5kZWZpbmVkLCB0YWcpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABZuWC6xA8AAMQPAAA1AAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLEZhcixhc3NlcnRQYXNzYWJsZSxwYXNzU3R5bGVPZixnZXRDb3B5TWFwRW50cmllcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlNYXA7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5TWFwRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyaWVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXSxbXCJpc0NvcHlNYXBcIixbJGjNj19hID0+IChpc0NvcHlNYXAgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyA9IChcbiAganNtYXAsXG4gIGFzc2VydEtWT2tUb0FkZCxcbiAgYXNzZXJ0S1ZPa1RvU2V0LFxuICBhc3NlcnRLZXlPa1RvRGVsZXRlID0gdW5kZWZpbmVkLFxuICBrZXlOYW1lID0gJ2tleScsXG4pID0+IHtcbiAgY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0ID0ga2V5ID0+XG4gICAgIWpzbWFwLmhhcyhrZXkpIHx8IEZhaWxgJHtxKGtleU5hbWUpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5cbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0ga2V5ID0+XG4gICAganNtYXAuaGFzKGtleSkgfHwgRmFpbGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IGtleSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4ganNtYXAuaGFzKGtleSk7XG4gICAgfSxcbiAgICBnZXQ6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gLyogICAgICAgICAgICAqLyAoanNtYXAuZ2V0KGtleSkpO1xuICAgIH0sXG5cbiAgICBpbml0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG4gICAgICBhc3NlcnRLVk9rVG9BZGQoa2V5LCB2YWx1ZSk7XG4gICAgICBqc21hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIGFzc2VydEtWT2tUb1NldChrZXksIHZhbHVlKTtcbiAgICAgIGpzbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9LFxuICAgIGRlbGV0ZToga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgaWYgKGFzc2VydEtleU9rVG9EZWxldGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICBqc21hcC5kZWxldGUoa2V5KTtcbiAgICB9LFxuXG4gICAgYWRkQWxsOiBlbnRyaWVzID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZW50cmllc1tTeW1ib2wuaXRlcmF0b3JdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4oZW50cmllcykgJiYgaXNDb3B5TWFwKGVudHJpZXMpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBlbnRyaWVzID0gZ2V0Q29weU1hcEVudHJpZXMoZW50cmllcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRmFpbGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7ZW50cmllc31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChlbnRyaWVzKSkge1xuICAgICAgICAvL1xuICAgICAgICBhc3NlcnRLVk9rVG9BZGQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIGpzbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyk7XG4gICAgICAgY29uc3QgbWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9IChcbiAgdGFnID0gJ2tleScsXG4gIHsgbG9uZ0xpdmVkID0gdHJ1ZSwga2V5U2hhcGUgPSB1bmRlZmluZWQsIHZhbHVlU2hhcGUgPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGpzbWFwID0gbmV3IChsb25nTGl2ZWQgPyBXZWFrTWFwIDogTWFwKSgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG4gIGlmICh2YWx1ZVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvU2V0ID0gKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbih2YWx1ZSk7XG5cbiAgICBhc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKHZhbHVlLCB2YWx1ZVNoYXBlLCAnd2Vha01hcFN0b3JlIHZhbHVlJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFzc2VydEtWT2tUb0FkZCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbihrZXkpO1xuICAgIHBhc3NTdHlsZU9mKGtleSkgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgICBGYWlsYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha01hcFN0b3JlczogJHtrZXl9YDtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICd3ZWFrTWFwU3RvcmUga2V5Jyk7XG4gICAgfVxuICAgIGFzc2VydEtWT2tUb1NldChrZXksIHZhbHVlKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKGBzY2FsYXIgV2Vha01hcFN0b3JlIG9mICR7cSh0YWcpfWAsIHtcbiAgICAuLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzbWFwLFxuICAgICAgYXNzZXJ0S1ZPa1RvQWRkLFxuICAgICAgYXNzZXJ0S1ZPa1RvU2V0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGFnLFxuICAgICksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhcldlYWtNYXBTdG9yZShtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABA7FDWywsAAMsLAAA1AAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLEZhcixwYXNzU3R5bGVPZixnZXRDb3B5U2V0S2V5cyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlTZXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiZ2V0Q29weVNldEtleXNcIixbJGjNj19hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV0sW1wiaXNDb3B5U2V0XCIsWyRozY9fYSA9PiAoaXNDb3B5U2V0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMgPSAoXG4gIGpzc2V0LFxuICBhc3NlcnRLZXlPa1RvQWRkLFxuICBhc3NlcnRLZXlPa1RvRGVsZXRlID0gdW5kZWZpbmVkLFxuICBrZXlOYW1lID0gJ2tleScsXG4pID0+IHtcbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0ga2V5ID0+XG4gICAganNzZXQuaGFzKGtleSkgfHwgRmFpbGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IGtleSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4ganNzZXQuaGFzKGtleSk7XG4gICAgfSxcblxuICAgIGFkZDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleU9rVG9BZGQoa2V5KTtcbiAgICAgIGpzc2V0LmFkZChrZXkpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBpZiAoYXNzZXJ0S2V5T2tUb0RlbGV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIGpzc2V0LmRlbGV0ZShrZXkpO1xuICAgIH0sXG5cbiAgICBhZGRBbGw6IGtleXMgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBrZXlzW1N5bWJvbC5pdGVyYXRvcl0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihrZXlzKSAmJiBpc0NvcHlTZXQoa2V5cykpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIGtleXMgPSBnZXRDb3B5U2V0S2V5cyhrZXlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBGYWlsYHByb3ZpZGVkIGRhdGEgc291cmNlIGlzIG5vdCBpdGVyYWJsZTogJHtrZXlzfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIC8qICAgICAgICAgICAgICAgICAgICAgICovIChrZXlzKSkge1xuICAgICAgICBhc3NlcnRLZXlPa1RvQWRkKGtleSk7XG4gICAgICAgIGpzc2V0LmFkZChrZXkpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyk7XG4gICAgICAgY29uc3QgbWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9IChcbiAgdGFnID0gJ2tleScsXG4gIHsgbG9uZ0xpdmVkID0gdHJ1ZSwga2V5U2hhcGUgPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGpzc2V0ID0gbmV3IChsb25nTGl2ZWQgPyBXZWFrU2V0IDogU2V0KSgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S2V5T2tUb0FkZCA9IGtleSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbihrZXkpO1xuICAgIHBhc3NTdHlsZU9mKGtleSkgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgICBGYWlsYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha1N0b3JlczogJHtrZXl9YDtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICd3ZWFrU2V0U3RvcmUga2V5Jyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBXZWFrU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKGpzc2V0LCBhc3NlcnRLZXlPa1RvQWRkLCB1bmRlZmluZWQsIHRhZyksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhcldlYWtTZXRTdG9yZShtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFxkU9ohAAAKIQAAAuAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJhcHBlbmRUb1N0b3JlZEFycmF5IiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRmFyLGlzQ29weU1hcCxpc0NvcHlTZXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImlzQ29weU1hcFwiLFskaM2PX2EgPT4gKGlzQ29weU1hcCA9ICRozY9fYSksJGjNj19saXZlW1wiaXNDb3B5TWFwXCJdXV0sW1wiaXNDb3B5U2V0XCIsWyRozY9fYSA9PiAoaXNDb3B5U2V0ID0gJGjNj19hKSwkaM2PX2xpdmVbXCJpc0NvcHlTZXRcIl1dXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ3VycmVudEtleXNLaXQgPSAoXG4gIGdldFJhd0tleXMsXG4gIGNoZWNrSGFzLFxuICBjb21wYXJlLFxuICBhc3NlcnRPa1RvQWRkLFxuICBhc3NlcnRPa1RvRGVsZXRlID0gdW5kZWZpbmVkLFxuICBrZXlOYW1lID0gJ2tleScsXG4pID0+IHtcbiAgbGV0IHVwZGF0ZUNvdW50ID0gMDtcbiAgbGV0IHNvcnRlZEtleXNNZW1vO1xuXG4gIGNvbnN0IGFzc2VydFVwZGF0ZU9uQWRkID0gKGssIHYgPSB1bmRlZmluZWQpID0+IHtcbiAgICBhc3NlcnRPa1RvQWRkKGssIHYpO1xuICAgIHVwZGF0ZUNvdW50ICs9IDE7XG4gICAgc29ydGVkS2V5c01lbW8gPSB1bmRlZmluZWQ7XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0VXBkYXRlT25EZWxldGUgPSBrID0+IGFzc2VydE9rVG9EZWxldGUgJiYgYXNzZXJ0T2tUb0RlbGV0ZShrKTtcblxuICBjb25zdCBnZXRTb3J0ZWRLZXlzID0gKCkgPT4ge1xuICAgIGlmIChzb3J0ZWRLZXlzTWVtbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzb3J0ZWRLZXlzTWVtbyA9IGhhcmRlbihbLi4uZ2V0UmF3S2V5cygpXS5zb3J0KGNvbXBhcmUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvcnRlZEtleXNNZW1vO1xuICB9O1xuXG4gIGNvbnN0IGl0ZXJhYmxlS2V5cyA9IEZhcignSXRlcmFibGUgb2Yga2V5cycsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9IHVwZGF0ZUNvdW50O1xuICAgICAgZ2V0U29ydGVkS2V5cygpO1xuICAgICAgY29uc3QgbGVuID0gc29ydGVkS2V5c01lbW8ubGVuZ3RoO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgcmV0dXJuIEZhcignSXRlcmF0b3Igb2Yga2V5cycsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGdlbmVyYXRpb24gPT09IHVwZGF0ZUNvdW50IHx8IEZhaWxgU3RvcmUgJHtxKGtleU5hbWUpfSBjdXJzb3Igc3RhbGVgO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNvcnRlZEtleXNNZW1vW2ldO1xuICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgIGlmIChjaGVja0hhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBhc3NlcnRVcGRhdGVPbkFkZCxcbiAgICBhc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbiAgICBpdGVyYWJsZUtleXMsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUN1cnJlbnRLZXlzS2l0KG1ha2VDdXJyZW50S2V5c0tpdCk7XG5oYXJkZW4obWFrZUN1cnJlbnRLZXlzS2l0KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJvdmlkZUxhenkgPSAobWFwU3RvcmUsIGtleSwgbWFrZVZhbHVlKSA9PiB7XG4gIGlmICghbWFwU3RvcmUuaGFzKGtleSkpIHtcbiAgICBtYXBTdG9yZS5pbml0KGtleSwgbWFrZVZhbHVlKGtleSkpO1xuICB9XG4gIHJldHVybiBtYXBTdG9yZS5nZXQoa2V5KTtcbn07JGjNj19vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VBdG9taWNQcm92aWRlciA9IHN0b3JlID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHBlbmRpbmcgPSBuZXcgTWFwKCk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcm92aWRlQXN5bmMgPSAoa2V5LCBtYWtlVmFsdWUsIGZpbmlzaFZhbHVlKSA9PiB7XG4gICAgaWYgKHN0b3JlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0b3JlLmdldChrZXkpKTtcbiAgICB9XG4gICAgaWYgKCFwZW5kaW5nLmhhcyhrZXkpKSB7XG4gICAgICBjb25zdCB2YWxQID0gbWFrZVZhbHVlKGtleSlcbiAgICAgICAgLnRoZW4odiA9PiB7XG4gICAgICAgICAgc3RvcmUuaW5pdChrZXksIHYpO1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9KVxuICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICBpZiAoZmluaXNoVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5pc2hWYWx1ZShrZXksIHYpLnRoZW4oKCkgPT4gdik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgcGVuZGluZy5kZWxldGUoa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICBwZW5kaW5nLnNldChrZXksIHZhbFApO1xuICAgIH1cbiAgICBjb25zdCB2YWxQID0gcGVuZGluZy5nZXQoa2V5KTtcbiAgICBhc3NlcnQodmFsUCk7XG4gICAgcmV0dXJuIHZhbFA7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IHByb3ZpZGVBc3luYyB9KTtcbn07JGjNj19vbmNlLm1ha2VBdG9taWNQcm92aWRlcihtYWtlQXRvbWljUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VBdG9taWNQcm92aWRlcik7XG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXBwZW5kVG9TdG9yZWRBcnJheSA9IChtYXBTdG9yZSwga2V5LCBpdGVtKSA9PiB7XG4gIGlmIChtYXBTdG9yZS5oYXMoa2V5KSkge1xuICAgIGNvbnN0IGV4dGFudCA9IG1hcFN0b3JlLmdldChrZXkpO1xuICAgIG1hcFN0b3JlLnNldChrZXksIGhhcmRlbihbLi4uZXh0YW50LCBpdGVtXSkpO1xuICB9IGVsc2Uge1xuICAgIG1hcFN0b3JlLmluaXQoa2V5LCBoYXJkZW4oW2l0ZW1dKSk7XG4gIH1cbn07JGjNj19vbmNlLmFwcGVuZFRvU3RvcmVkQXJyYXkoYXBwZW5kVG9TdG9yZWRBcnJheSk7XG5oYXJkZW4oYXBwZW5kVG9TdG9yZWRBcnJheSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIixmYWxzZV0sImlzQ29weVNldCI6WyJpc0NvcHlTZXQiLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQ3VycmVudEtleXNLaXQiOlsibWFrZUN1cnJlbnRLZXlzS2l0Il0sInByb3ZpZGVMYXp5IjpbInByb3ZpZGVMYXp5Il0sIm1ha2VBdG9taWNQcm92aWRlciI6WyJtYWtlQXRvbWljUHJvdmlkZXIiXSwiYXBwZW5kVG9TdG9yZWRBcnJheSI6WyJhcHBlbmRUb1N0b3JlZEFycmF5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7fWYmzACAAAwAgAAHAAAAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy90aW1lTWF0aC5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy90aW1lTWF0aC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMtaW5kZXguanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATMXEWc0VAADNFQAAIwAAAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3RpbWVNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJUaW1lTWF0aCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE5hdCxGYWlsLHEsbXVzdE1hdGNoLFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLFRpbWVzdGFtcFJlY29yZFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlID0gJGjNj19hKV1dLFtcIlRpbWVzdGFtcFJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGFncmVlZFRpbWVyQnJhbmQgPSAobGVmdEJyYW5kLCByaWdodEJyYW5kKSA9PiB7XG4gIGlmIChsZWZ0QnJhbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChyaWdodEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByaWdodEJyYW5kO1xuICAgIH1cbiAgfSBlbHNlIGlmIChyaWdodEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbGVmdEJyYW5kO1xuICB9IGVsc2Uge1xuICAgIGxlZnRCcmFuZCA9PT0gcmlnaHRCcmFuZCB8fFxuICAgICAgRmFpbGBUaW1lckJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdEJyYW5kKX0gdnMgJHtxKHJpZ2h0QnJhbmQpfWA7XG4gICAgcmV0dXJuIGxlZnRCcmFuZDtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc2hhcmVkVGltZXJCcmFuZCA9IChsZWZ0LCByaWdodCkgPT4ge1xuICBjb25zdCBsZWZ0QnJhbmQgPSB0eXBlb2YgbGVmdCA9PT0gJ2JpZ2ludCcgPyB1bmRlZmluZWQgOiBsZWZ0LnRpbWVyQnJhbmQ7XG4gIGNvbnN0IHJpZ2h0QnJhbmQgPSB0eXBlb2YgcmlnaHQgPT09ICdiaWdpbnQnID8gdW5kZWZpbmVkIDogcmlnaHQudGltZXJCcmFuZDtcbiAgcmV0dXJuIGFncmVlZFRpbWVyQnJhbmQobGVmdEJyYW5kLCByaWdodEJyYW5kKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBhYnNMaWtlID0gKGxlZnQsIHJpZ2h0LCBhYnNWYWx1ZSkgPT4ge1xuICBOYXQoYWJzVmFsdWUpO1xuICBjb25zdCB0aW1lckJyYW5kID0gc2hhcmVkVGltZXJCcmFuZChsZWZ0LCByaWdodCk7XG4gIGlmICh0aW1lckJyYW5kKSB7XG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICB0aW1lckJyYW5kLFxuICAgICAgYWJzVmFsdWUsXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGFic1ZhbHVlO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmVsTGlrZSA9IChsZWZ0LCByaWdodCwgcmVsVmFsdWUpID0+IHtcbiAgTmF0KHJlbFZhbHVlKTtcbiAgY29uc3QgdGltZXJCcmFuZCA9IHNoYXJlZFRpbWVyQnJhbmQobGVmdCwgcmlnaHQpO1xuICBpZiAodGltZXJCcmFuZCkge1xuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgdGltZXJCcmFuZCxcbiAgICAgIHJlbFZhbHVlLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZWxWYWx1ZTtcbiAgfVxufTtcblxuLy9cbi8vXG4vL1xuXG5jb25zdCBhYnNWYWx1ZSA9IGFicyA9PiB7XG4gIGlmICh0eXBlb2YgYWJzID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBOYXQoYWJzKTtcbiAgfVxuICBtdXN0TWF0Y2goYWJzLCBUaW1lc3RhbXBSZWNvcmRTaGFwZSwgJ3RpbWVzdGFtcCcpO1xuICByZXR1cm4gTmF0KGFicy5hYnNWYWx1ZSk7XG59O1xuXG5jb25zdCByZWxWYWx1ZSA9IHJlbCA9PiB7XG4gIGlmICh0eXBlb2YgcmVsID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBOYXQocmVsKTtcbiAgfVxuICBtdXN0TWF0Y2gocmVsLCBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSwgJ3JlbGF0aXZlJyk7XG4gIHJldHVybiBOYXQocmVsLnJlbFZhbHVlKTtcbn07XG5cbmNvbnN0IG1ha2VUaW1lc3RhbXBSZWNvcmQgPSAoYWJzLCB0aW1lckJyYW5kKSA9PlxuICBoYXJkZW4oeyBhYnNWYWx1ZTogYWJzLCB0aW1lckJyYW5kIH0pO1xuY29uc3QgbWFrZVJlbGF0aXZlVGltZVJlY29yZCA9IChyZWwsIHRpbWVyQnJhbmQpID0+XG4gIGhhcmRlbih7IHJlbFZhbHVlOiByZWwsIHRpbWVyQnJhbmQgfSk7XG5cbmNvbnN0IGNvZXJjZVRpbWVzdGFtcFJlY29yZCA9ICh0cywgYnJhbmQpID0+IHtcbiAgYnJhbmQgfHwgRmFpbGBtdXN0IGhhdmUgYSBicmFuZGA7XG4gIGlmICh0eXBlb2YgdHMgPT09ICdudW1iZXInKSB7XG4gICAgdHMgPSBOYXQodHMpO1xuICB9XG4gIGlmICh0eXBlb2YgdHMgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIG1ha2VUaW1lc3RhbXBSZWNvcmQodHMsIGJyYW5kKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHRpbWVyQnJhbmQgfSA9IHRzO1xuICAgIG11c3RNYXRjaCh0cywgVGltZXN0YW1wUmVjb3JkU2hhcGUsICd0aW1lc3RhbXAnKTtcbiAgICBhZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsIGJyYW5kKTtcbiAgICByZXR1cm4gdHM7XG4gIH1cbn07XG5cbmNvbnN0IGNvZXJjZVJlbGF0aXZlVGltZVJlY29yZCA9IChydCwgYnJhbmQpID0+IHtcbiAgYnJhbmQgfHwgRmFpbGBtdXN0IGhhdmUgYSBicmFuZGA7XG4gIGlmICh0eXBlb2YgcnQgPT09ICdudW1iZXInKSB7XG4gICAgcnQgPSBOYXQocnQpO1xuICB9XG4gIGlmICh0eXBlb2YgcnQgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIG1ha2VSZWxhdGl2ZVRpbWVSZWNvcmQocnQsIGJyYW5kKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHRpbWVyQnJhbmQgfSA9IHJ0O1xuICAgIG11c3RNYXRjaChydCwgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsICdyZWxhdGl2ZVRpbWUnKTtcbiAgICBhZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsIGJyYW5kKTtcbiAgICByZXR1cm4gcnQ7XG4gIH1cbn07XG5cbmNvbnN0IGFkZEFic1JlbCA9IChhYnMsIHJlbCkgPT5cbiAgYWJzTGlrZShhYnMsIHJlbCwgYWJzVmFsdWUoYWJzKSArIHJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBhZGRSZWxSZWwgPSAocmVsMSwgcmVsMikgPT5cbiAgcmVsTGlrZShyZWwxLCByZWwyLCByZWxWYWx1ZShyZWwxKSArIHJlbFZhbHVlKHJlbDIpKTtcblxuY29uc3Qgc3VidHJhY3RBYnNBYnMgPSAoYWJzMSwgYWJzMikgPT5cbiAgcmVsTGlrZShhYnMxLCBhYnMyLCBhYnNWYWx1ZShhYnMxKSAtIGFic1ZhbHVlKGFiczIpKTtcblxuY29uc3QgY2xhbXBlZFN1YnRyYWN0QWJzQWJzID0gKGFiczEsIGFiczIpID0+IHtcbiAgY29uc3QgdmFsMSA9IGFic1ZhbHVlKGFiczEpO1xuICBjb25zdCB2YWwyID0gYWJzVmFsdWUoYWJzMik7XG4gIHJldHVybiByZWxMaWtlKGFiczEsIGFiczIsIHZhbDEgPiB2YWwyID8gdmFsMSAtIHZhbDIgOiAwbik7XG59O1xuXG5jb25zdCBzdWJ0cmFjdEFic1JlbCA9IChhYnMsIHJlbCkgPT5cbiAgYWJzTGlrZShhYnMsIHJlbCwgYWJzVmFsdWUoYWJzKSAtIHJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBzdWJ0cmFjdFJlbFJlbCA9IChyZWwxLCByZWwyKSA9PlxuICByZWxMaWtlKHJlbDEsIHJlbDIsIHJlbFZhbHVlKHJlbDEpIC0gcmVsVmFsdWUocmVsMikpO1xuXG5jb25zdCBpc1JlbFplcm8gPSByZWwgPT4gcmVsVmFsdWUocmVsKSA9PT0gMG47XG5cbmNvbnN0IG11bHRpcGx5UmVsTmF0ID0gKHJlbCwgbmF0KSA9PiByZWxMaWtlKHJlbCwgbmF0LCByZWxWYWx1ZShyZWwpICogbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsTmF0ID0gKHJlbCwgbmF0KSA9PiByZWxMaWtlKHJlbCwgbmF0LCByZWxWYWx1ZShyZWwpIC8gbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsUmVsID0gKHJlbDEsIHJlbDIpID0+IHtcbiAgc2hhcmVkVGltZXJCcmFuZChyZWwxLCByZWwyKTsgLy9cbiAgcmV0dXJuIHJlbFZhbHVlKHJlbDEpIC8gcmVsVmFsdWUocmVsMik7XG59O1xuXG5jb25zdCBtb2RBYnNSZWwgPSAoYWJzLCBzdGVwKSA9PlxuICByZWxMaWtlKGFicywgc3RlcCwgYWJzVmFsdWUoYWJzKSAlIHJlbFZhbHVlKHN0ZXApKTtcblxuY29uc3QgbW9kUmVsUmVsID0gKHJlbCwgc3RlcCkgPT5cbiAgcmVsTGlrZShyZWwsIHN0ZXAsIHJlbFZhbHVlKHJlbCkgJSByZWxWYWx1ZShzdGVwKSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjb21wYXJlVmFsdWVzID0gKGxlZnQsIHJpZ2h0LCB2MSwgdjIpID0+IHtcbiAgc2hhcmVkVGltZXJCcmFuZChsZWZ0LCByaWdodCk7XG4gIGlmICh2MSA8IHYyKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2UgaWYgKHYxID09PSB2Mikge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIGFzc2VydCh2MSA+IHYyKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBUaW1lTWF0aCA9IGhhcmRlbih7XG4gIGFic1ZhbHVlLFxuICByZWxWYWx1ZSxcbiAgY29lcmNlVGltZXN0YW1wUmVjb3JkLFxuICBjb2VyY2VSZWxhdGl2ZVRpbWVSZWNvcmQsXG4gIC8vXG4gIGFkZEFic1JlbCxcbiAgLy9cbiAgYWRkUmVsUmVsLFxuICBzdWJ0cmFjdEFic0FicyxcbiAgY2xhbXBlZFN1YnRyYWN0QWJzQWJzLFxuICBzdWJ0cmFjdEFic1JlbCxcbiAgc3VidHJhY3RSZWxSZWwsXG4gIGlzUmVsWmVybyxcbiAgbXVsdGlwbHlSZWxOYXQsXG4gIGRpdmlkZVJlbE5hdCxcbiAgZGl2aWRlUmVsUmVsLFxuICBtb2RBYnNSZWwsXG4gIG1vZFJlbFJlbCxcbiAgY29tcGFyZUFiczogKGFiczEsIGFiczIpID0+XG4gICAgY29tcGFyZVZhbHVlcyhhYnMxLCBhYnMyLCBhYnNWYWx1ZShhYnMxKSwgYWJzVmFsdWUoYWJzMikpLFxuICBjb21wYXJlUmVsOiAocmVsMSwgcmVsMikgPT5cbiAgICBjb21wYXJlVmFsdWVzKHJlbDEsIHJlbDIsIHJlbFZhbHVlKHJlbDEpLCByZWxWYWx1ZShyZWwyKSksXG59KTskaM2PX29uY2UuVGltZU1hdGgoVGltZU1hdGgpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGltZU1hdGgiOlsiVGltZU1hdGgiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOOUBfz0JAAA9CQAAJQAAAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSIsIlJlbGF0aXZlVGltZVNoYXBlIiwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSIsIlRpbWVyQnJhbmRTaGFwZSIsIlRpbWVyU2VydmljZVNoYXBlIiwiVGltZXN0YW1wUmVjb3JkU2hhcGUiLCJUaW1lc3RhbXBTaGFwZSIsIlRpbWVzdGFtcFZhbHVlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG4gKi9cblxuICAgICAgIGNvbnN0IFRpbWVyQnJhbmRTaGFwZSA9IE0ucmVtb3RhYmxlKCdUaW1lckJyYW5kJyk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLlRpbWVyQnJhbmRTaGFwZShUaW1lckJyYW5kU2hhcGUpO1xuICAgICAgIGNvbnN0IFRpbWVzdGFtcFZhbHVlU2hhcGUgPSBNLm5hdCgpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5UaW1lc3RhbXBWYWx1ZVNoYXBlKFRpbWVzdGFtcFZhbHVlU2hhcGUpO1xuICAgICAgIGNvbnN0IFJlbGF0aXZlVGltZVZhbHVlU2hhcGUgPSBNLm5hdCgpOyAvL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5SZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKFJlbGF0aXZlVGltZVZhbHVlU2hhcGUpO1xuICAgICAgIGNvbnN0IFRpbWVzdGFtcFJlY29yZFNoYXBlID0ge1xuICB0aW1lckJyYW5kOiBUaW1lckJyYW5kU2hhcGUsXG4gIGFic1ZhbHVlOiBUaW1lc3RhbXBWYWx1ZVNoYXBlLFxufTskaM2PX29uY2UuVGltZXN0YW1wUmVjb3JkU2hhcGUoVGltZXN0YW1wUmVjb3JkU2hhcGUpO1xuaGFyZGVuKFRpbWVzdGFtcFJlY29yZFNoYXBlKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSA9IHtcbiAgdGltZXJCcmFuZDogVGltZXJCcmFuZFNoYXBlLFxuICByZWxWYWx1ZTogUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSxcbn07JGjNj19vbmNlLlJlbGF0aXZlVGltZVJlY29yZFNoYXBlKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlKTtcbmhhcmRlbihSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBUaW1lc3RhbXBTaGFwZSA9IE0ub3IoVGltZXN0YW1wUmVjb3JkU2hhcGUsIFRpbWVzdGFtcFZhbHVlU2hhcGUpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLlRpbWVzdGFtcFNoYXBlKFRpbWVzdGFtcFNoYXBlKTtcbiAgICAgICBjb25zdCBSZWxhdGl2ZVRpbWVTaGFwZSA9IE0ub3IoXG4gIFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLFxuICBSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlLFxuKTskaM2PX29uY2UuUmVsYXRpdmVUaW1lU2hhcGUoUmVsYXRpdmVUaW1lU2hhcGUpO1xuXG4gICAgICAgY29uc3QgVGltZXJTZXJ2aWNlU2hhcGUgPSBNLnJlbW90YWJsZSgnVGltZXJTZXJ2aWNlJyk7JGjNj19vbmNlLlRpbWVyU2VydmljZVNoYXBlKFRpbWVyU2VydmljZVNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRpbWVyQnJhbmRTaGFwZSI6WyJUaW1lckJyYW5kU2hhcGUiXSwiVGltZXN0YW1wVmFsdWVTaGFwZSI6WyJUaW1lc3RhbXBWYWx1ZVNoYXBlIl0sIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiOlsiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSJdLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSI6WyJUaW1lc3RhbXBSZWNvcmRTaGFwZSJdLCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSJdLCJUaW1lc3RhbXBTaGFwZSI6WyJUaW1lc3RhbXBTaGFwZSJdLCJSZWxhdGl2ZVRpbWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVTaGFwZSJdLCJUaW1lclNlcnZpY2VTaGFwZSI6WyJUaW1lclNlcnZpY2VTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwwxcir8ZAAC/GQAAKAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9leG8tdXRpbHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJpZ25vcmVDb250ZXh0IiwibWFrZUV4b1V0aWxzIiwicHJlcGFyZUV4byIsInByZXBhcmVFeG9DbGFzcyIsInByZXBhcmVFeG9DbGFzc0tpdCIsInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmRNdWx0aSIsInByZXBhcmVTaW5nbGV0b24iLCJwcm92aWRlS2luZEhhbmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGluaXRFbXB0eSxwcm92aWRlLGdsb2JhbFZhdERhdGE7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIixbJGjNj19hID0+IChpbml0RW1wdHkgPSAkaM2PX2EpXV1dXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJwcm92aWRlXCIsWyRozY9fYSA9PiAocHJvdmlkZSA9ICRozY9fYSldXSxbXCJWYXREYXRhXCIsWyRozY9fYSA9PiAoZ2xvYmFsVmF0RGF0YSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLypcblxuICovXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaWdub3JlQ29udGV4dCA9XG4gIGZuID0+XG4gIChfY29udGV4dCwgLi4uYXJncykgPT5cbiAgICBmbiguLi5hcmdzKTskaM2PX29uY2UuaWdub3JlQ29udGV4dChpZ25vcmVDb250ZXh0KTtcbmhhcmRlbihpZ25vcmVDb250ZXh0KTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgbWFrZUV4b1V0aWxzID0gVmF0RGF0YSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWZpbmVLaW5kLFxuICAgIGRlZmluZUtpbmRNdWx0aSxcbiAgICBkZWZpbmVEdXJhYmxlS2luZCxcbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpLFxuICAgIG1ha2VLaW5kSGFuZGxlLFxuICB9ID0gVmF0RGF0YTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcm92aWRlS2luZEhhbmRsZSA9IChiYWdnYWdlLCBraW5kTmFtZSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwgKCkgPT4gbWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTtcbiAgaGFyZGVuKHByb3ZpZGVLaW5kSGFuZGxlKTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IHByZXBhcmVLaW5kID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW5pdCxcbiAgICBiZWhhdmlvcixcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUtpbmQoXG4gICAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgICBpbml0LFxuICAgICAgYmVoYXZpb3IsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIGhhcmRlbihwcmVwYXJlS2luZCk7XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBwcmVwYXJlS2luZE11bHRpID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW5pdCxcbiAgICBiZWhhdmlvcixcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShcbiAgICAgIHByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2UsIGtpbmROYW1lKSxcbiAgICAgIGluaXQsXG4gICAgICBiZWhhdmlvcixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgaGFyZGVuKHByZXBhcmVLaW5kTXVsdGkpO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MgPSAodGFnLCBpbnRlcmZhY2VHdWFyZCwgaW5pdCwgbWV0aG9kcywgb3B0aW9ucykgPT5cbiAgICAvL1xuICAgIGRlZmluZUtpbmQodGFnLCBpbml0LCBtZXRob2RzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCA9IChcbiAgICB0YWcsXG4gICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgaW5pdCxcbiAgICBmYWNldHMsXG4gICAgb3B0aW9ucyxcbiAgKSA9PlxuICAgIC8vXG4gICAgZGVmaW5lS2luZE11bHRpKHRhZywgaW5pdCwgZmFjZXRzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzcyA9IChcbiAgICBraW5kSGFuZGxlLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIGluaXQsXG4gICAgbWV0aG9kcyxcbiAgICBvcHRpb25zLFxuICApID0+XG4gICAgLy9cbiAgICBkZWZpbmVEdXJhYmxlS2luZChraW5kSGFuZGxlLCBpbml0LCBtZXRob2RzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCA9IChcbiAgICBraW5kSGFuZGxlLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIGluaXQsXG4gICAgZmFjZXRzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvL1xuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSwgaW5pdCwgZmFjZXRzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJlcGFyZUV4b0NsYXNzID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdCxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4gICkgPT5cbiAgICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3MoXG4gICAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICAgIGluaXQsXG4gICAgICBtZXRob2RzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUV4b0NsYXNzKTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcmVwYXJlRXhvQ2xhc3NLaXQgPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICBpbml0LFxuICAgIGZhY2V0cyxcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgICBpbml0LFxuICAgICAgZmFjZXRzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUV4b0NsYXNzS2l0KTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcmVwYXJlRXhvID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgbWV0aG9kcyxcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+IHtcbiAgICBjb25zdCBtYWtlU2luZ2xldG9uID0gcHJlcGFyZUV4b0NsYXNzKFxuICAgICAgYmFnZ2FnZSxcbiAgICAgIGtpbmROYW1lLFxuICAgICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgICBpbml0RW1wdHksXG4gICAgICBtZXRob2RzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHByb3ZpZGUoYmFnZ2FnZSwgYCR7a2luZE5hbWV9X3NpbmdsZXRvbmAsICgpID0+IG1ha2VTaW5nbGV0b24oKSk7XG4gIH07XG4gIGhhcmRlbihwcmVwYXJlRXhvKTtcblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcmVwYXJlU2luZ2xldG9uID0gKGJhZ2dhZ2UsIGtpbmROYW1lLCBtZXRob2RzLCBvcHRpb25zID0gdW5kZWZpbmVkKSA9PlxuICAgIHByZXBhcmVFeG8oYmFnZ2FnZSwga2luZE5hbWUsIHVuZGVmaW5lZCwgbWV0aG9kcywgb3B0aW9ucyk7XG4gIGhhcmRlbihwcmVwYXJlU2luZ2xldG9uKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG4gICAgZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0LFxuICAgIGRlZmluZUR1cmFibGVFeG9DbGFzcyxcbiAgICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG4gICAgcHJlcGFyZUV4b0NsYXNzLFxuICAgIHByZXBhcmVFeG9DbGFzc0tpdCxcbiAgICBwcmVwYXJlRXhvLFxuXG4gICAgcHJlcGFyZVNpbmdsZXRvbixcbiAgICBwcm92aWRlS2luZEhhbmRsZSxcbiAgICBwcmVwYXJlS2luZCxcbiAgICBwcmVwYXJlS2luZE11bHRpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VFeG9VdGlscyhtYWtlRXhvVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxFeG9VdGlscyA9IG1ha2VFeG9VdGlscyhnbG9iYWxWYXREYXRhKTtcblxuICAgICAgIGNvbnN0IHtcbiAgZGVmaW5lVmlydHVhbEV4b0NsYXNzLFxuICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG4gIGRlZmluZUR1cmFibGVFeG9DbGFzcyxcbiAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0LFxuICBwcmVwYXJlRXhvQ2xhc3MsXG4gIHByZXBhcmVFeG9DbGFzc0tpdCxcbiAgcHJlcGFyZUV4byxcbiAgcHJlcGFyZVNpbmdsZXRvbixcbn0gPSBnbG9iYWxFeG9VdGlscztcblxuLypcblxuICovJGjNj19vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzcyhkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpOyRozY9fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQoZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpOyRozY9fb25jZS5wcmVwYXJlRXhvQ2xhc3MocHJlcGFyZUV4b0NsYXNzKTskaM2PX29uY2UucHJlcGFyZUV4b0NsYXNzS2l0KHByZXBhcmVFeG9DbGFzc0tpdCk7JGjNj19vbmNlLnByZXBhcmVFeG8ocHJlcGFyZUV4byk7JGjNj19vbmNlLnByZXBhcmVTaW5nbGV0b24ocHJlcGFyZVNpbmdsZXRvbik7XG4gICAgICAgY29uc3QgeyBwcm92aWRlS2luZEhhbmRsZSwgcHJlcGFyZUtpbmQsIHByZXBhcmVLaW5kTXVsdGkgfSA9XG4gIGdsb2JhbEV4b1V0aWxzOyRozY9fb25jZS5wcm92aWRlS2luZEhhbmRsZShwcm92aWRlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByZXBhcmVLaW5kKHByZXBhcmVLaW5kKTskaM2PX29uY2UucHJlcGFyZUtpbmRNdWx0aShwcmVwYXJlS2luZE11bHRpKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCJdLCJtYWtlRXhvVXRpbHMiOlsibWFrZUV4b1V0aWxzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4b0NsYXNzIjpbInByZXBhcmVFeG9DbGFzcyJdLCJwcmVwYXJlRXhvQ2xhc3NLaXQiOlsicHJlcGFyZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG8iOlsicHJlcGFyZUV4byJdLCJwcmVwYXJlU2luZ2xldG9uIjpbInByZXBhcmVTaW5nbGV0b24iXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwicHJlcGFyZUtpbmQiOlsicHJlcGFyZUtpbmQiXSwicHJlcGFyZUtpbmRNdWx0aSI6WyJwcmVwYXJlS2luZE11bHRpIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM+c6+m2CAAAtggAACQAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCIuL2V4by11dGlscy5qcyJdLCJleHBvcnRzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtdXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtdXSxbXCIuL2V4by11dGlscy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvc3RvcmUiOltbIk0iLCJNIl0sWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjpbWyJtYWtlS2luZEhhbmRsZSIsIm1ha2VLaW5kSGFuZGxlIl0sWyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSxbIndhdGNoUHJvbWlzZSIsIndhdGNoUHJvbWlzZSJdLFsibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLFsiY2FuQmVEdXJhYmxlIiwiY2FuQmVEdXJhYmxlIl0sWyJwaWNrRmFjZXQiLCJwaWNrRmFjZXQiXSxbInBhcnRpYWxBc3NpZ24iLCJwYXJ0aWFsQXNzaWduIl0sWyJwcm92aWRlIiwicHJvdmlkZSJdLFsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl0sWyJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZCJdLFsiZGVmaW5lS2luZE11bHRpIiwiZGVmaW5lS2luZE11bHRpIl0sWyJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kIl0sWyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdXSwiLi9leG8tdXRpbHMuanMiOltbImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLFsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSxbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLFsicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzIl0sWyJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvIl0sWyJwcmVwYXJlU2luZ2xldG9uIiwicHJlcGFyZVNpbmdsZXRvbiJdLFsiaWdub3JlQ29udGV4dCIsImlnbm9yZUNvbnRleHQiXSxbInByb3ZpZGVLaW5kSGFuZGxlIiwicHJvdmlkZUtpbmRIYW5kbGUiXSxbInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmQiXSxbInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlS2luZE11bHRpIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAvYSCWLhgAAC4YAAAwAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJWYXREYXRhIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmVVdGlscyIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxwcm92aWRlTGF6eTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLFskaM2PX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qICAgICAgICAgICAgICAgICAgKi9cbmxldCBWYXREYXRhR2xvYmFsO1xuaWYgKCdWYXREYXRhJyBpbiBnbG9iYWxUaGlzKSB7XG4gIGdsb2JhbFRoaXMuVmF0RGF0YSB8fCBGYWlsYFZhdERhdGEgZGVmaW5lZCBpbiBnbG9iYWwgYXMgbnVsbCBvciB1bmRlZmluZWRgO1xuICAvL1xuICBWYXREYXRhR2xvYmFsID0gLyogICAgICAgICAgICAgICovIChnbG9iYWxUaGlzLlZhdERhdGEpO1xufSBlbHNlIHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgdW5hdmFpbGFibGUgPSAoKSA9PiBGYWlsYFZhdERhdGEgdW5hdmFpbGFibGVgO1xuICBWYXREYXRhR2xvYmFsID0ge1xuICAgIGRlZmluZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUtpbmRNdWx0aTogdW5hdmFpbGFibGUsXG4gICAgZGVmaW5lRHVyYWJsZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGk6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VLaW5kSGFuZGxlOiB1bmF2YWlsYWJsZSxcbiAgICBwcm92aWRlUHJvbWlzZVdhdGNoZXI6IHVuYXZhaWxhYmxlLFxuICAgIHdhdGNoUHJvbWlzZTogdW5hdmFpbGFibGUsXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIGNhbkJlRHVyYWJsZTogdW5hdmFpbGFibGUsXG4gIH07XG59XG5cbmNvbnN0IFZhdERhdGFFeHBvcnQgPSBWYXREYXRhR2xvYmFsOyRozY9fb25jZS5WYXREYXRhRXhwb3J0KFZhdERhdGFFeHBvcnQpO1xuXG5cbi8qXG5cbiAqL1xuICAgICAgIGNvbnN0IHtcbiAgZGVmaW5lS2luZCxcbiAgZGVmaW5lS2luZE11bHRpLFxuICBkZWZpbmVEdXJhYmxlS2luZCxcbiAgZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxcbn0gPSBWYXREYXRhR2xvYmFsOyRozY9fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRozY9fb25jZS5kZWZpbmVLaW5kTXVsdGkoZGVmaW5lS2luZE11bHRpKTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUtpbmQoZGVmaW5lRHVyYWJsZUtpbmQpOyRozY9fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG4gICAgICAgY29uc3Qge1xuICBtYWtlS2luZEhhbmRsZSxcbiAgcHJvdmlkZVByb21pc2VXYXRjaGVyLFxuICB3YXRjaFByb21pc2UsXG4gIG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbiAgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxcbiAgbWFrZVNjYWxhckJpZ1NldFN0b3JlLFxuICBtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuICBjYW5CZUR1cmFibGUsXG59ID0gVmF0RGF0YUdsb2JhbDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VLaW5kSGFuZGxlKG1ha2VLaW5kSGFuZGxlKTskaM2PX29uY2UucHJvdmlkZVByb21pc2VXYXRjaGVyKHByb3ZpZGVQcm9taXNlV2F0Y2hlcik7JGjNj19vbmNlLndhdGNoUHJvbWlzZSh3YXRjaFByb21pc2UpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobWFrZVNjYWxhckJpZ01hcFN0b3JlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ1NldFN0b3JlKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUobWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSk7JGjNj19vbmNlLmNhbkJlRHVyYWJsZShjYW5CZUR1cmFibGUpO1xuICAgICAgIGNvbnN0IHBpY2tGYWNldCA9XG4gIChtYWtlciwgZmFjZXROYW1lKSA9PlxuICAoLi4uYXJncykgPT5cbiAgICBtYWtlciguLi5hcmdzKVtmYWNldE5hbWVdOyRozY9fb25jZS5waWNrRmFjZXQocGlja0ZhY2V0KTtcbmhhcmRlbihwaWNrRmFjZXQpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFydGlhbEFzc2lnbiA9ICh0YXJnZXQsIHNvdXJjZSkgPT4ge1xuICBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKTtcbn07JGjNj19vbmNlLnBhcnRpYWxBc3NpZ24ocGFydGlhbEFzc2lnbik7XG5oYXJkZW4ocGFydGlhbEFzc2lnbik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4gICAgICAgY29uc3QgcHJvdmlkZSA9XG4gIC8vXG4gIC8qXG5cblxuXG5cblxuICAgKi8gKHByb3ZpZGVMYXp5KTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucHJvdmlkZShwcm92aWRlKTtcbiAgICAgICBjb25zdCBtYWtlU3RvcmVVdGlscyA9IFZhdERhdGEgPT4ge1xuICBjb25zdCB7XG4gICAgLy9cbiAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4gICAgLy9cbiAgICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxuICAgIC8vXG4gICAgbWFrZVNjYWxhckJpZ1NldFN0b3JlLFxuICAgIC8vXG4gICAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSxcbiAgfSA9IFZhdERhdGE7XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUgPSAoYmFnZ2FnZSwgbmFtZSwgb3B0aW9ucyA9IHt9KSA9PlxuICAgIHByb3ZpZGUoYmFnZ2FnZSwgbmFtZSwgKCkgPT5cbiAgICAgIG1ha2VTY2FsYXJCaWdNYXBTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUpO1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVTZXRTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1NldFN0b3JlKG5hbWUsIHsgZHVyYWJsZTogdHJ1ZSwgLi4ub3B0aW9ucyB9KSxcbiAgICApO1xuICBoYXJkZW4ocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlID0gKGJhZ2dhZ2UsIG5hbWUsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+XG4gICAgICBtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG5hbWUsIHsgZHVyYWJsZTogdHJ1ZSwgLi4ub3B0aW9ucyB9KSxcbiAgICApO1xuICBoYXJkZW4ocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUpO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsXG4gICAgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG4gICAgcHJvdmlkZUR1cmFibGVTZXRTdG9yZSxcbiAgICBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlU3RvcmVVdGlscyhtYWtlU3RvcmVVdGlscyk7XG5cbmNvbnN0IGdsb2JhbFN0b3JlVXRpbHMgPSBtYWtlU3RvcmVVdGlscyhWYXREYXRhR2xvYmFsKTtcbiAgICAgICBjb25zdCB7XG4gIHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsXG4gIHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLFxuICBwcm92aWRlRHVyYWJsZVNldFN0b3JlLFxuICBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSxcbn0gPSBnbG9iYWxTdG9yZVV0aWxzOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZU1hcFN0b3JlKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlZhdERhdGEiOlsiVmF0RGF0YUV4cG9ydCJdLCJkZWZpbmVLaW5kIjpbImRlZmluZUtpbmQiXSwiZGVmaW5lS2luZE11bHRpIjpbImRlZmluZUtpbmRNdWx0aSJdLCJkZWZpbmVEdXJhYmxlS2luZCI6WyJkZWZpbmVEdXJhYmxlS2luZCJdLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIjpbImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXSwibWFrZUtpbmRIYW5kbGUiOlsibWFrZUtpbmRIYW5kbGUiXSwicHJvdmlkZVByb21pc2VXYXRjaGVyIjpbInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJ3YXRjaFByb21pc2UiOlsid2F0Y2hQcm9taXNlIl0sIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIl0sImNhbkJlRHVyYWJsZSI6WyJjYW5CZUR1cmFibGUiXSwicGlja0ZhY2V0IjpbInBpY2tGYWNldCJdLCJwYXJ0aWFsQXNzaWduIjpbInBhcnRpYWxBc3NpZ24iXSwicHJvdmlkZSI6WyJwcm92aWRlIl0sIm1ha2VTdG9yZVV0aWxzIjpbIm1ha2VTdG9yZVV0aWxzIl0sInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAndV/psgUAADIFAAAKAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NsZWFuUHJvcG9zYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiTUFYX0tFWVdPUkRfTEVOR1RIIiwiYXNzZXJ0S2V5d29yZE5hbWUiLCJjbGVhbktleXdvcmRzIiwiY2xlYW5Qcm9wb3NhbCIsImNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQiLCJjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydCxxLEZhaWwsQW1vdW50TWF0aCxnZXRBc3NldEtpbmQsb2JqZWN0TWFwLGFzc2VydFJlY29yZCxhc3NlcnRLZXksYXNzZXJ0UGF0dGVybixtdXN0TWF0Y2gsaXNLZXksRnVsbFByb3Bvc2FsU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV0sW1wiZ2V0QXNzZXRLaW5kXCIsWyRozY9fYSA9PiAoZ2V0QXNzZXRLaW5kID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmVjb3JkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJpc0tleVwiLFskaM2PX2EgPT4gKGlzS2V5ID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJGdWxsUHJvcG9zYWxTaGFwZVwiLFskaM2PX2EgPT4gKEZ1bGxQcm9wb3NhbFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuICAgICAgIGNvbnN0IE1BWF9LRVlXT1JEX0xFTkdUSCA9IDEwMDtcblxuLypcblxuICovJGjNj19vbmNlLk1BWF9LRVlXT1JEX0xFTkdUSChNQVhfS0VZV09SRF9MRU5HVEgpO1xuXG5jb25zdCBmaXJzdENhcEFTQ0lJID0gL15bQS1aXVthLXpBLVowLTlfJF0qJC87XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbiAgICAgICBjb25zdCBhc3NlcnRLZXl3b3JkTmFtZSA9IGtleXdvcmQgPT4ge1xuICBhc3NlcnQudHlwZW9mKGtleXdvcmQsICdzdHJpbmcnKTtcbiAga2V5d29yZC5sZW5ndGggPD0gTUFYX0tFWVdPUkRfTEVOR1RIIHx8XG4gICAgRmFpbGBrZXl3b3JkICR7cShrZXl3b3JkKX0gZXhjZWVkZWQgbWF4aW11bSBsZW5ndGggJHtxKFxuICAgICAgTUFYX0tFWVdPUkRfTEVOR1RILFxuICAgICl9IGNoYXJhY3RlcnM7IGdvdCAke2tleXdvcmQubGVuZ3RofWA7XG4gIGZpcnN0Q2FwQVNDSUkudGVzdChrZXl3b3JkKSB8fFxuICAgIEZhaWxga2V5d29yZCAke3EoXG4gICAgICBrZXl3b3JkLFxuICAgICl9IG11c3QgYmUgYW4gYXNjaWkgaWRlbnRpZmllciBzdGFydGluZyB3aXRoIHVwcGVyIGNhc2UuYDtcbiAgKGtleXdvcmQgIT09ICdOYU4nICYmIGtleXdvcmQgIT09ICdJbmZpbml0eScpIHx8XG4gICAgRmFpbGBrZXl3b3JkICR7cShrZXl3b3JkKX0gbXVzdCBub3QgYmUgYSBudW1iZXIncyBuYW1lYDtcbn07XG5cbi8qXG5cblxuICovJGjNj19vbmNlLmFzc2VydEtleXdvcmROYW1lKGFzc2VydEtleXdvcmROYW1lKTtcbiAgICAgICBjb25zdCBjbGVhbktleXdvcmRzID0gdW5jbGVhbktleXdvcmRSZWNvcmQgPT4ge1xuICBoYXJkZW4odW5jbGVhbktleXdvcmRSZWNvcmQpO1xuICBhc3NlcnRSZWNvcmQodW5jbGVhbktleXdvcmRSZWNvcmQsICdrZXl3b3JkUmVjb3JkJyk7XG4gIGNvbnN0IGtleXdvcmRzID0gb3duS2V5cyh1bmNsZWFuS2V5d29yZFJlY29yZCk7XG5cbiAgLy9cbiAgLy9cbiAgZm9yIChjb25zdCBrZXl3b3JkIG9mIGtleXdvcmRzKSB7XG4gICAgYXNzZXJ0S2V5d29yZE5hbWUoa2V5d29yZCk7XG4gIH1cblxuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgKi8gKGtleXdvcmRzKTtcbn07JGjNj19vbmNlLmNsZWFuS2V5d29yZHMoY2xlYW5LZXl3b3Jkcyk7XG5cbiAgICAgICBjb25zdCBjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCA9IChcbiAgYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG4gIGdldEFzc2V0S2luZEJ5QnJhbmQsXG4pID0+IHtcbiAgY2xlYW5LZXl3b3JkcyhhbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCk7XG4gIC8vXG4gIHJldHVybiBvYmplY3RNYXAoYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsIGFtb3VudCA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGlmIChpc0tleShhbW91bnQpKSB7XG4gICAgICBjb25zdCBicmFuZEFzc2V0S2luZCA9IGdldEFzc2V0S2luZEJ5QnJhbmQoYW1vdW50LmJyYW5kKTtcbiAgICAgIGNvbnN0IGFzc2V0S2luZCA9IGdldEFzc2V0S2luZChhbW91bnQpO1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBhc3NldEtpbmQgPT09IGJyYW5kQXNzZXRLaW5kIHx8XG4gICAgICAgIEZhaWxgVGhlIGFtb3VudCAke2Ftb3VudH0gZGlkIG5vdCBoYXZlIHRoZSBhc3NldEtpbmQgb2YgdGhlIGJyYW5kICR7YnJhbmRBc3NldEtpbmR9YDtcbiAgICAgIHJldHVybiBBbW91bnRNYXRoLmNvZXJjZShhbW91bnQuYnJhbmQsIGFtb3VudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydFBhdHRlcm4oYW1vdW50KTtcbiAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5jb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZChjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCk7XG4gICAgICAgY29uc3QgY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCA9IChcbiAgYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG4gIGdldEFzc2V0S2luZEJ5QnJhbmQsXG4pID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQoXG4gICAgYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG4gICAgZ2V0QXNzZXRLaW5kQnlCcmFuZCxcbiAgKTtcbiAgYXNzZXJ0S2V5KHJlc3VsdCk7XG4gIC8vXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5jb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKGNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQpO1xuY29uc3QgYXNzZXJ0RXhpdCA9IGV4aXQgPT5cbiAgb3duS2V5cyhleGl0KS5sZW5ndGggPT09IDEgfHwgRmFpbGBleGl0ICR7ZXhpdH0gc2hvdWxkIG9ubHkgaGF2ZSBvbmUga2V5YDtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBhc3NlcnRLZXl3b3JkTm90SW5Cb3RoID0gKHdhbnQsIGdpdmUpID0+IHtcbiAgY29uc3Qgd2FudEtleXdvcmRTZXQgPSBuZXcgU2V0KG93bktleXMod2FudCkpO1xuICBjb25zdCBnaXZlS2V5d29yZHMgPSBvd25LZXlzKGdpdmUpO1xuXG4gIGZvciAoY29uc3Qga2V5d29yZCBvZiBnaXZlS2V5d29yZHMpIHtcbiAgICAhd2FudEtleXdvcmRTZXQuaGFzKGtleXdvcmQpIHx8XG4gICAgICBGYWlsYGEga2V5d29yZCBjYW5ub3QgYmUgaW4gYm90aCAnd2FudCcgYW5kICdnaXZlJ2A7XG4gIH1cbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2xlYW5Qcm9wb3NhbCA9IChwcm9wb3NhbCwgZ2V0QXNzZXRLaW5kQnlCcmFuZCkgPT4ge1xuICBhc3NlcnRSZWNvcmQocHJvcG9zYWwsICdwcm9wb3NhbCcpO1xuICAvL1xuICBjb25zdCB7XG4gICAgd2FudCA9IGhhcmRlbih7fSksXG4gICAgZ2l2ZSA9IGhhcmRlbih7fSksXG4gICAgZXhpdCA9IGhhcmRlbih7IG9uRGVtYW5kOiBudWxsIH0pLFxuICAgIC4uLnJlc3RcbiAgfSA9IHByb3Bvc2FsO1xuICBvd25LZXlzKHJlc3QpLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgJHtwcm9wb3NhbH0gLSBNdXN0IG9ubHkgaGF2ZSB3YW50OiwgZ2l2ZTosIGV4aXQ6IHByb3BlcnRpZXM6ICR7cmVzdH1gO1xuXG4gIGNvbnN0IGNsZWFuZWRXYW50ID0gY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQoXG4gICAgd2FudCxcbiAgICBnZXRBc3NldEtpbmRCeUJyYW5kLFxuICApO1xuICBjb25zdCBjbGVhbmVkR2l2ZSA9IGNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQoZ2l2ZSwgZ2V0QXNzZXRLaW5kQnlCcmFuZCk7XG5cbiAgY29uc3QgY2xlYW5lZFByb3Bvc2FsID0gaGFyZGVuKHtcbiAgICB3YW50OiBjbGVhbmVkV2FudCxcbiAgICBnaXZlOiBjbGVhbmVkR2l2ZSxcbiAgICBleGl0LFxuICB9KTtcbiAgbXVzdE1hdGNoKGNsZWFuZWRQcm9wb3NhbCwgRnVsbFByb3Bvc2FsU2hhcGUsICdwcm9wb3NhbCcpO1xuICBhc3NlcnRFeGl0KGV4aXQpO1xuICBhc3NlcnRLZXl3b3JkTm90SW5Cb3RoKGNsZWFuZWRXYW50LCBjbGVhbmVkR2l2ZSk7XG4gIHJldHVybiBjbGVhbmVkUHJvcG9zYWw7XG59OyRozY9fb25jZS5jbGVhblByb3Bvc2FsKGNsZWFuUHJvcG9zYWwpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiTUFYX0tFWVdPUkRfTEVOR1RIIjpbIk1BWF9LRVlXT1JEX0xFTkdUSCJdLCJhc3NlcnRLZXl3b3JkTmFtZSI6WyJhc3NlcnRLZXl3b3JkTmFtZSJdLCJjbGVhbktleXdvcmRzIjpbImNsZWFuS2V5d29yZHMiXSwiY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQiOlsiY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQiXSwiY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCI6WyJjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkIl0sImNsZWFuUHJvcG9zYWwiOlsiY2xlYW5Qcm9wb3NhbCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAALAOvTYwYAAGMGAAA0AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiXSwiZXhwb3J0cyI6WyJpc09mZmVyU2FmZSIsInNhdGlzZmllc1dhbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRNYXRoOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzT2ZmZXJTYWZlLCduYW1lJyx7dmFsdWU6XCJpc09mZmVyU2FmZVwifSk7JGjNj19vbmNlLmlzT2ZmZXJTYWZlKGlzT2ZmZXJTYWZlKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHNhdGlzZmllc0ludGVybmFsID0gKGdpdmVPcldhbnQgPSB7fSwgYWxsb2NhdGlvbikgPT4ge1xuICBjb25zdCBpc0dURUJ5S2V5d29yZCA9IChba2V5d29yZCwgcmVxdWlyZWRBbW91bnRdKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGlmIChhbGxvY2F0aW9uW2tleXdvcmRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBhbGxvY2F0aW9uQW1vdW50ID0gYWxsb2NhdGlvbltrZXl3b3JkXTtcbiAgICByZXR1cm4gQW1vdW50TWF0aC5pc0dURShhbGxvY2F0aW9uQW1vdW50LCByZXF1aXJlZEFtb3VudCkgPyAxIDogMDtcbiAgfTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGdpdmVPcldhbnQpLmV2ZXJ5KGlzR1RFQnlLZXl3b3JkKSA/IDEgOiAwO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc2F0aXNmaWVzV2FudCA9IChwcm9wb3NhbCwgYWxsb2NhdGlvbikgPT5cbiAgc2F0aXNmaWVzSW50ZXJuYWwocHJvcG9zYWwud2FudCwgYWxsb2NhdGlvbik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5zYXRpc2ZpZXNXYW50KHNhdGlzZmllc1dhbnQpO1xuY29uc3Qgc2F0aXNmaWVzR2l2ZSA9IChwcm9wb3NhbCwgYWxsb2NhdGlvbikgPT5cbiAgc2F0aXNmaWVzSW50ZXJuYWwocHJvcG9zYWwuZ2l2ZSwgYWxsb2NhdGlvbik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIGlzT2ZmZXJTYWZlKHByb3Bvc2FsLCBhbGxvY2F0aW9uKSB7XG4gIHJldHVybiAoXG4gICAgc2F0aXNmaWVzR2l2ZShwcm9wb3NhbCwgYWxsb2NhdGlvbikgPiAwIHx8XG4gICAgc2F0aXNmaWVzV2FudChwcm9wb3NhbCwgYWxsb2NhdGlvbikgPiAwXG4gICk7XG59XG5cbmhhcmRlbihpc09mZmVyU2FmZSk7XG5oYXJkZW4oc2F0aXNmaWVzV2FudCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzYXRpc2ZpZXNXYW50IjpbInNhdGlzZmllc1dhbnQiXSwiaXNPZmZlclNhZmUiOlsiaXNPZmZlclNhZmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANKZakIsHAACLBwAAOQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiLi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIlRyYW5zZmVyUGFydFNoYXBlIiwiYXRvbWljUmVhcnJhbmdlIiwiYXRvbWljVHJhbnNmZXIiLCJmcm9tT25seSIsInRvT25seSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFNlYXRTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiLi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlID0gJGjNj19hKV1dLFtcIlNlYXRTaGFwZVwiLFskaM2PX2EgPT4gKFNlYXRTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuLypcblxuICovXG5cbiAgICAgICBjb25zdCBUcmFuc2ZlclBhcnRTaGFwZSA9IE0uc3BsaXRBcnJheShcbiAgaGFyZGVuKFtNLm9wdChTZWF0U2hhcGUpLCBNLm9wdChTZWF0U2hhcGUpLCBNLm9wdChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpXSksXG4gIGhhcmRlbihbTS5vcHQoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKV0pLFxuKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlRyYW5zZmVyUGFydFNoYXBlKFRyYW5zZmVyUGFydFNoYXBlKTtcbiAgICAgICBjb25zdCBhdG9taWNSZWFycmFuZ2UgPSAoemNmLCB0cmFuc2ZlcnMpID0+IHtcbiAgemNmLmF0b21pY1JlYXJyYW5nZSh0cmFuc2ZlcnMpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmF0b21pY1JlYXJyYW5nZShhdG9taWNSZWFycmFuZ2UpO1xuICAgICAgIGNvbnN0IGZyb21Pbmx5ID0gKGZyb21TZWF0LCBmcm9tQW1vdW50cykgPT5cbiAgaGFyZGVuKFtmcm9tU2VhdCwgdW5kZWZpbmVkLCBmcm9tQW1vdW50c10pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZnJvbU9ubHkoZnJvbU9ubHkpO1xuICAgICAgIGNvbnN0IHRvT25seSA9ICh0b1NlYXQsIHRvQW1vdW50cykgPT5cbiAgaGFyZGVuKFt1bmRlZmluZWQsIHRvU2VhdCwgdW5kZWZpbmVkLCB0b0Ftb3VudHNdKTtcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLnRvT25seSh0b09ubHkpO1xuICAgICAgIGNvbnN0IGF0b21pY1RyYW5zZmVyID0gKFxuICB6Y2YsXG4gIGZyb21TZWF0ID0gdW5kZWZpbmVkLFxuICB0b1NlYXQgPSB1bmRlZmluZWQsXG4gIGZyb21BbW91bnRzID0gdW5kZWZpbmVkLFxuICB0b0Ftb3VudHMgPSB1bmRlZmluZWQsXG4pID0+IHpjZi5hdG9taWNSZWFycmFuZ2UoaGFyZGVuKFtbZnJvbVNlYXQsIHRvU2VhdCwgZnJvbUFtb3VudHMsIHRvQW1vdW50c11dKSk7JGjNj19vbmNlLmF0b21pY1RyYW5zZmVyKGF0b21pY1RyYW5zZmVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRyYW5zZmVyUGFydFNoYXBlIjpbIlRyYW5zZmVyUGFydFNoYXBlIl0sImF0b21pY1JlYXJyYW5nZSI6WyJhdG9taWNSZWFycmFuZ2UiXSwiZnJvbU9ubHkiOlsiZnJvbU9ubHkiXSwidG9Pbmx5IjpbInRvT25seSJdLCJhdG9taWNUcmFuc2ZlciI6WyJhdG9taWNUcmFuc2ZlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACCIxKS5hAAAOYQAAA4AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9lcnRwL3NyYy9zYWZlTWF0aC5qcyJdLCJleHBvcnRzIjpbImNhbGNMaXFWYWx1ZVRvTWludCIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsImNhbGNWYWx1ZVRvUmVtb3ZlIiwiZ2V0SW5wdXRQcmljZSIsImdldE91dHB1dFByaWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTmF0LEZhaWwsbmF0U2FmZU1hdGg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHAvc3JjL3NhZmVNYXRoLmpzXCIsIFtbXCJuYXRTYWZlTWF0aFwiLFskaM2PX2EgPT4gKG5hdFNhZmVNYXRoID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5jb25zdCB7IHN1YnRyYWN0LCBhZGQsIG11bHRpcGx5LCBmbG9vckRpdmlkZSB9ID0gbmF0U2FmZU1hdGg7XG5cbmNvbnN0IEJBU0lTX1BPSU5UUyA9IDEwMDAwbjsgLy9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRJbnB1dFByaWNlID0gKFxuICBpbnB1dFZhbHVlLFxuICBpbnB1dFJlc2VydmUsXG4gIG91dHB1dFJlc2VydmUsXG4gIGZlZUJhc2lzUG9pbnRzID0gMzBuLFxuKSA9PiB7XG4gIGlucHV0VmFsdWUgPSBOYXQoaW5wdXRWYWx1ZSk7XG4gIGlucHV0UmVzZXJ2ZSA9IE5hdChpbnB1dFJlc2VydmUpO1xuICBvdXRwdXRSZXNlcnZlID0gTmF0KG91dHB1dFJlc2VydmUpO1xuICBpbnB1dFZhbHVlID4gMG4gfHwgRmFpbGBpbnB1dFZhbHVlICR7aW5wdXRWYWx1ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG4gIGlucHV0UmVzZXJ2ZSA+IDBuIHx8IEZhaWxgaW5wdXRSZXNlcnZlICR7aW5wdXRSZXNlcnZlfSBtdXN0IGJlIHBvc2l0aXZlYDtcbiAgb3V0cHV0UmVzZXJ2ZSA+IDBuIHx8IEZhaWxgb3V0cHV0UmVzZXJ2ZSAke291dHB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgO1xuXG4gIGNvbnN0IG9uZU1pbnVzRmVlU2NhbGVkID0gc3VidHJhY3QoQkFTSVNfUE9JTlRTLCBmZWVCYXNpc1BvaW50cyk7XG4gIGNvbnN0IGlucHV0V2l0aEZlZSA9IG11bHRpcGx5KGlucHV0VmFsdWUsIG9uZU1pbnVzRmVlU2NhbGVkKTtcbiAgY29uc3QgbnVtZXJhdG9yID0gbXVsdGlwbHkoaW5wdXRXaXRoRmVlLCBvdXRwdXRSZXNlcnZlKTtcbiAgY29uc3QgZGVub21pbmF0b3IgPSBhZGQobXVsdGlwbHkoaW5wdXRSZXNlcnZlLCBCQVNJU19QT0lOVFMpLCBpbnB1dFdpdGhGZWUpO1xuICByZXR1cm4gZmxvb3JEaXZpZGUobnVtZXJhdG9yLCBkZW5vbWluYXRvcik7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5nZXRJbnB1dFByaWNlKGdldElucHV0UHJpY2UpO1xuICAgICAgIGNvbnN0IGdldE91dHB1dFByaWNlID0gKFxuICBvdXRwdXRWYWx1ZSxcbiAgaW5wdXRSZXNlcnZlLFxuICBvdXRwdXRSZXNlcnZlLFxuICBmZWVCYXNpc1BvaW50cyA9IDMwbixcbikgPT4ge1xuICBvdXRwdXRWYWx1ZSA9IE5hdChvdXRwdXRWYWx1ZSk7XG4gIGlucHV0UmVzZXJ2ZSA9IE5hdChpbnB1dFJlc2VydmUpO1xuICBvdXRwdXRSZXNlcnZlID0gTmF0KG91dHB1dFJlc2VydmUpO1xuXG4gIGlucHV0UmVzZXJ2ZSA+IDBuIHx8IEZhaWxgaW5wdXRSZXNlcnZlICR7aW5wdXRSZXNlcnZlfSBtdXN0IGJlIHBvc2l0aXZlYDtcbiAgb3V0cHV0UmVzZXJ2ZSA+IDBuIHx8IEZhaWxgb3V0cHV0UmVzZXJ2ZSAke291dHB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgO1xuICBvdXRwdXRSZXNlcnZlID4gb3V0cHV0VmFsdWUgfHxcbiAgICBGYWlsYG91dHB1dFJlc2VydmUgJHtvdXRwdXRSZXNlcnZlfSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvdXRwdXRWYWx1ZSAke291dHB1dFZhbHVlfWA7XG5cbiAgY29uc3Qgb25lTWludXNGZWVTY2FsZWQgPSBzdWJ0cmFjdChCQVNJU19QT0lOVFMsIGZlZUJhc2lzUG9pbnRzKTtcbiAgY29uc3QgbnVtZXJhdG9yID0gbXVsdGlwbHkobXVsdGlwbHkob3V0cHV0VmFsdWUsIGlucHV0UmVzZXJ2ZSksIEJBU0lTX1BPSU5UUyk7XG4gIGNvbnN0IGRlbm9taW5hdG9yID0gbXVsdGlwbHkoXG4gICAgc3VidHJhY3Qob3V0cHV0UmVzZXJ2ZSwgb3V0cHV0VmFsdWUpLFxuICAgIG9uZU1pbnVzRmVlU2NhbGVkLFxuICApO1xuICByZXR1cm4gYWRkKGZsb29yRGl2aWRlKG51bWVyYXRvciwgZGVub21pbmF0b3IpLCAxbik7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZ2V0T3V0cHV0UHJpY2UoZ2V0T3V0cHV0UHJpY2UpO1xuICAgICAgIGNvbnN0IGNhbGNMaXFWYWx1ZVRvTWludCA9IChcbiAgbGlxVG9rZW5TdXBwbHksXG4gIGlucHV0VmFsdWUsXG4gIGlucHV0UmVzZXJ2ZSxcbikgPT4ge1xuICBsaXFUb2tlblN1cHBseSA9IE5hdChsaXFUb2tlblN1cHBseSk7XG4gIGlucHV0VmFsdWUgPSBOYXQoaW5wdXRWYWx1ZSk7XG4gIGlucHV0UmVzZXJ2ZSA9IE5hdChpbnB1dFJlc2VydmUpO1xuXG4gIGlmIChsaXFUb2tlblN1cHBseSA9PT0gMG4pIHtcbiAgICByZXR1cm4gaW5wdXRWYWx1ZTtcbiAgfVxuICByZXR1cm4gZmxvb3JEaXZpZGUobXVsdGlwbHkoaW5wdXRWYWx1ZSwgbGlxVG9rZW5TdXBwbHkpLCBpbnB1dFJlc2VydmUpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmNhbGNMaXFWYWx1ZVRvTWludChjYWxjTGlxVmFsdWVUb01pbnQpO1xuICAgICAgIGNvbnN0IGNhbGNTZWNvbmRhcnlSZXF1aXJlZCA9IChcbiAgY2VudHJhbEluLFxuICBjZW50cmFsUG9vbCxcbiAgc2Vjb25kYXJ5UG9vbCxcbiAgc2Vjb25kYXJ5SW4sXG4pID0+IHtcbiAgY2VudHJhbEluID0gTmF0KGNlbnRyYWxJbik7XG4gIGNlbnRyYWxQb29sID0gTmF0KGNlbnRyYWxQb29sKTtcbiAgc2Vjb25kYXJ5UG9vbCA9IE5hdChzZWNvbmRhcnlQb29sKTtcbiAgc2Vjb25kYXJ5SW4gPSBOYXQoc2Vjb25kYXJ5SW4pO1xuXG4gIGlmIChjZW50cmFsUG9vbCA9PT0gMG4gfHwgc2Vjb25kYXJ5UG9vbCA9PT0gMG4pIHtcbiAgICByZXR1cm4gc2Vjb25kYXJ5SW47XG4gIH1cblxuICBjb25zdCBzY2FsZWRTZWNvbmRhcnkgPSBmbG9vckRpdmlkZShcbiAgICBtdWx0aXBseShjZW50cmFsSW4sIHNlY29uZGFyeVBvb2wpLFxuICAgIGNlbnRyYWxQb29sLFxuICApO1xuICBjb25zdCBleGFjdCA9XG4gICAgbXVsdGlwbHkoY2VudHJhbEluLCBzZWNvbmRhcnlQb29sKSA9PT1cbiAgICBtdWx0aXBseShzY2FsZWRTZWNvbmRhcnksIGNlbnRyYWxQb29sKTtcblxuICAvL1xuICAvL1xuICByZXR1cm4gZXhhY3QgPyBzY2FsZWRTZWNvbmRhcnkgOiAxbiArIHNjYWxlZFNlY29uZGFyeTtcbn07XG5cbi8vXG4vL1xuJGjNj19vbmNlLmNhbGNTZWNvbmRhcnlSZXF1aXJlZChjYWxjU2Vjb25kYXJ5UmVxdWlyZWQpO2NvbnN0IGNhbGNWYWx1ZVRvUmVtb3ZlPShcbiAgbGlxVG9rZW5TdXBwbHksXG4gIHBvb2xWYWx1ZSxcbiAgbGlxdWlkaXR5VmFsdWVJbixcbikgPT4ge1xuICBsaXFUb2tlblN1cHBseSA9IE5hdChsaXFUb2tlblN1cHBseSk7XG4gIGxpcXVpZGl0eVZhbHVlSW4gPSBOYXQobGlxdWlkaXR5VmFsdWVJbik7XG4gIHBvb2xWYWx1ZSA9IE5hdChwb29sVmFsdWUpO1xuXG4gIHJldHVybiBmbG9vckRpdmlkZShtdWx0aXBseShsaXF1aWRpdHlWYWx1ZUluLCBwb29sVmFsdWUpLCBsaXFUb2tlblN1cHBseSk7XG59OyRozY9fb25jZS5jYWxjVmFsdWVUb1JlbW92ZShjYWxjVmFsdWVUb1JlbW92ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRJbnB1dFByaWNlIjpbImdldElucHV0UHJpY2UiXSwiZ2V0T3V0cHV0UHJpY2UiOlsiZ2V0T3V0cHV0UHJpY2UiXSwiY2FsY0xpcVZhbHVlVG9NaW50IjpbImNhbGNMaXFWYWx1ZVRvTWludCJdLCJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiOlsiY2FsY1NlY29uZGFyeVJlcXVpcmVkIl0sImNhbGNWYWx1ZVRvUmVtb3ZlIjpbImNhbGNWYWx1ZVRvUmVtb3ZlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHUs6K6lCgAApQoAADUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJtYWtlRXBoZW1lcmFQcm92aWRlciIsInByb3ZpZGVBbGwiLCJwcm92aWRlRW1wdHlTZWF0IiwicHJvdmlkZVNpbmdsZXRvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFsbFZhbHVlcyxvYmplY3RNYXAscHJvdmlkZSxFOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYWxsVmFsdWVzXCIsWyRozY9fYSA9PiAoYWxsVmFsdWVzID0gJGjNj19hKV1dLFtcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByb3ZpZGVcIixbJGjNj19hID0+IChwcm92aWRlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFcGhlbWVyYVByb3ZpZGVyID0gaW5pdCA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZXh0YW50ID0gbmV3IFdlYWtNYXAoKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgcmV0dXJuIGtleSA9PiB7XG4gICAgaWYgKGV4dGFudC5oYXMoa2V5KSkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBleHRhbnQuZ2V0KGtleSk7XG4gICAgfVxuICAgIGNvbnN0IG5ld0VwaCA9IGluaXQoa2V5KTtcbiAgICBleHRhbnQuc2V0KGtleSwgbmV3RXBoKTtcbiAgICByZXR1cm4gbmV3RXBoO1xuICB9O1xufTskaM2PX29uY2UubWFrZUVwaGVtZXJhUHJvdmlkZXIobWFrZUVwaGVtZXJhUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VFcGhlbWVyYVByb3ZpZGVyKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHByb3ZpZGVFbXB0eVNlYXQgPSAoemNmLCBiYWdnYWdlLCBuYW1lKSA9PiB7XG4gIHJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+IHpjZi5tYWtlRW1wdHlTZWF0S2l0KCkuemNmU2VhdCk7XG59OyRozY9fb25jZS5wcm92aWRlRW1wdHlTZWF0KHByb3ZpZGVFbXB0eVNlYXQpO1xuaGFyZGVuKHByb3ZpZGVFbXB0eVNlYXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwcm92aWRlQWxsID0gKGJhZ2dhZ2UsIHRodW5rcykgPT4ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGh1bmtzKTtcbiAgLy9cbiAgY29uc3QgaW5CYWdnYWdlID0gYmFnZ2FnZS5oYXMoa2V5c1swXSk7XG4gIGlmIChpbkJhZ2dhZ2UpIHtcbiAgICBjb25zdCBvYmogPSBvYmplY3RNYXAoXG4gICAgICB0aHVua3MsXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgKF8sIGspID0+IGJhZ2dhZ2UuZ2V0KGspLFxuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShoYXJkZW4ob2JqKSk7XG4gIH1cblxuICBjb25zdCBrZXllZFByb21pc2VzID0gb2JqZWN0TWFwKHRodW5rcywgZm4gPT4gZm4oKSk7XG5cbiAgcmV0dXJuIGFsbFZhbHVlcyhrZXllZFByb21pc2VzKS50aGVuKGtleWVkVmFscyA9PiB7XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoa2V5ZWRWYWxzKSkge1xuICAgICAgYmFnZ2FnZS5pbml0KGssIHYpO1xuICAgIH1cbiAgICByZXR1cm4ga2V5ZWRWYWxzO1xuICB9KTtcbn07JGjNj19vbmNlLnByb3ZpZGVBbGwocHJvdmlkZUFsbCk7XG5oYXJkZW4ocHJvdmlkZUFsbCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJvdmlkZVNpbmdsZXRvbiA9IChtYXBTdG9yZSwga2V5LCBtYWtlVmFsdWUsIHdpdGhWYWx1ZSkgPT4ge1xuICBjb25zdCBzdG9yZWQgPSBtYXBTdG9yZS5oYXMoa2V5KVxuICAgID8gdW5kZWZpbmVkXG4gICAgOiBFLndoZW4obWFrZVZhbHVlKCksIHYgPT4gbWFwU3RvcmUuaW5pdChrZXksIGhhcmRlbih2KSkpO1xuXG4gIHJldHVybiBFLndoZW4oc3RvcmVkLCAoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBtYXBTdG9yZS5nZXQoa2V5KTtcbiAgICBpZiAod2l0aFZhbHVlKSB7XG4gICAgICB3aXRoVmFsdWUodmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH0pO1xufTskaM2PX29uY2UucHJvdmlkZVNpbmdsZXRvbihwcm92aWRlU2luZ2xldG9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFcGhlbWVyYVByb3ZpZGVyIjpbIm1ha2VFcGhlbWVyYVByb3ZpZGVyIl0sInByb3ZpZGVFbXB0eVNlYXQiOlsicHJvdmlkZUVtcHR5U2VhdCJdLCJwcm92aWRlQWxsIjpbInByb3ZpZGVBbGwiXSwicHJvdmlkZVNpbmdsZXRvbiI6WyJwcm92aWRlU2luZ2xldG9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB/z7dJ8CAAAfAgAADAAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanN7ImltcG9ydHMiOlsiLi9ib25kaW5nQ3VydmVzLmpzIiwiQGFnb3JpYy9lcnRwL3NyYy9zYWZlTWF0aC5qcyIsIi4vc3RhdGVNYWNoaW5lLmpzIiwiLi9hdG9taWNUcmFuc2Zlci5qcyIsIi4vem9lSGVscGVycy5qcyIsIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanMiLCIuL2R1cmFiaWxpdHkuanMiLCIuL3ByZXBhcmUtb3duYWJsZS5qcyIsIi4vcHJpY2VBdXRob3JpdHkuanMiLCIuL3ByaWNlUXVvdGUuanMiLCIuL3N0YXRpc3RpY3MuanMiLCIuL3JlY29yZGVyLmpzIiwiLi90b3BpY3MuanMiXSwiZXhwb3J0cyI6WyJhdG9taWNUcmFuc2ZlciIsImF0b21pY1RyYW5zZmVyIiwiZ2V0T3V0cHV0UHJpY2UiLCJnZXRPdXRwdXRQcmljZSIsInN3YXAiLCJzd2FwIixudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9kdXJhYmlsaXR5LmpzIiwiLi9wcmVwYXJlLW93bmFibGUuanMiLCIuL3ByaWNlQXV0aG9yaXR5LmpzIiwiLi9wcmljZVF1b3RlLmpzIiwiLi9yZWNvcmRlci5qcyIsIi4vc3RhdGlzdGljcy5qcyIsIi4vdG9waWNzLmpzIiwiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2JvbmRpbmdDdXJ2ZXMuanNcIiwgW11dLFtcIkBhZ29yaWMvZXJ0cC9zcmMvc2FmZU1hdGguanNcIiwgW11dLFtcIi4vc3RhdGVNYWNoaW5lLmpzXCIsIFtdXSxbXCIuL2F0b21pY1RyYW5zZmVyLmpzXCIsIFtdXSxbXCIuL3pvZUhlbHBlcnMuanNcIiwgW11dLFtcIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanNcIiwgW11dLFtcIi4vZHVyYWJpbGl0eS5qc1wiLCBbXV0sW1wiLi9wcmVwYXJlLW93bmFibGUuanNcIiwgW11dLFtcIi4vcHJpY2VBdXRob3JpdHkuanNcIiwgW11dLFtcIi4vcHJpY2VRdW90ZS5qc1wiLCBbXV0sW1wiLi9zdGF0aXN0aWNzLmpzXCIsIFtdXSxbXCIuL3JlY29yZGVyLmpzXCIsIFtdXSxbXCIuL3RvcGljcy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vYm9uZGluZ0N1cnZlcy5qcyI6W1siZ2V0SW5wdXRQcmljZSIsImdldElucHV0UHJpY2UiXSxbImdldE91dHB1dFByaWNlIiwiZ2V0T3V0cHV0UHJpY2UiXSxbImNhbGNMaXFWYWx1ZVRvTWludCIsImNhbGNMaXFWYWx1ZVRvTWludCJdLFsiY2FsY1ZhbHVlVG9SZW1vdmUiLCJjYWxjVmFsdWVUb1JlbW92ZSJdLFsiY2FsY1NlY29uZGFyeVJlcXVpcmVkIiwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIl1dLCJAYWdvcmljL2VydHAvc3JjL3NhZmVNYXRoLmpzIjpbWyJuYXRTYWZlTWF0aCIsIm5hdFNhZmVNYXRoIl1dLCIuL3N0YXRlTWFjaGluZS5qcyI6W1sibWFrZVN0YXRlTWFjaGluZSIsIm1ha2VTdGF0ZU1hY2hpbmUiXV0sIi4vYXRvbWljVHJhbnNmZXIuanMiOltbImF0b21pY1JlYXJyYW5nZSIsImF0b21pY1JlYXJyYW5nZSJdLFsiYXRvbWljVHJhbnNmZXIiLCJhdG9taWNUcmFuc2ZlciJdLFsiZnJvbU9ubHkiLCJmcm9tT25seSJdLFsidG9Pbmx5IiwidG9Pbmx5Il1dLCIuL3pvZUhlbHBlcnMuanMiOltbImRlZmF1bHRBY2NlcHRhbmNlTXNnIiwiZGVmYXVsdEFjY2VwdGFuY2VNc2ciXSxbInN3YXAiLCJzd2FwIl0sWyJmaXRQcm9wb3NhbFNoYXBlIiwiZml0UHJvcG9zYWxTaGFwZSJdLFsiYXNzZXJ0UHJvcG9zYWxTaGFwZSIsImFzc2VydFByb3Bvc2FsU2hhcGUiXSxbImFzc2VydElzc3VlcktleXdvcmRzIiwiYXNzZXJ0SXNzdWVyS2V5d29yZHMiXSxbInNhdGlzZmllcyIsInNhdGlzZmllcyJdLFsiYXNzZXJ0TmF0QXNzZXRLaW5kIiwiYXNzZXJ0TmF0QXNzZXRLaW5kIl0sWyJzd2FwRXhhY3QiLCJzd2FwRXhhY3QiXSxbImRlcG9zaXRUb1NlYXQiLCJkZXBvc2l0VG9TZWF0Il0sWyJ3aXRoZHJhd0Zyb21TZWF0Iiwid2l0aGRyYXdGcm9tU2VhdCJdLFsic2F2ZUFsbElzc3VlcnMiLCJzYXZlQWxsSXNzdWVycyJdLFsib2ZmZXJUbyIsIm9mZmVyVG8iXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEeE1QiuCQAArgkAADoAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJlcGFyZS1vd25hYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIiwiQGFnb3JpYy9iYXNlLXpvbmUvem9uZS1oZWxwZXJzLmpzIiwiLi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbInByZXBhcmVPd25hYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSxwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQsT2ZmZXJIYW5kbGVySTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lL3pvbmUtaGVscGVycy5qc1wiLCBbW1wicHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0ID0gJGjNj19hKV1dXV0sW1wiLi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiT2ZmZXJIYW5kbGVySVwiLFskaM2PX2EgPT4gKE9mZmVySGFuZGxlckkgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuY29uc3QgVHJhbnNmZXJQcm9wb3NhbFNoYXBlID0gTS5zcGxpdFJlY29yZCh7XG4gIGdpdmU6IHt9LFxuICB3YW50OiB7fSxcbiAgZXhpdDoge1xuICAgIG9uRGVtYW5kOiBudWxsLFxuICB9LFxufSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZU93bmFibGUgPSAoXG4gIHpvbmUsXG4gIG1ha2VJbnZpdGF0aW9uLFxuICB1S2luZE5hbWUsXG4gIHVNZXRob2ROYW1lcyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHsgdUludGVyZmFjZU5hbWUgPSB1S2luZE5hbWUgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHsgcmV2b2tlLCBtYWtlUmV2b2NhYmxlIH0gPSBwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQoXG4gICAgem9uZSxcbiAgICB1S2luZE5hbWUsXG4gICAgdU1ldGhvZE5hbWVzLFxuICAgIHtcbiAgICAgIHVJbnRlcmZhY2VOYW1lLFxuICAgICAgZXh0cmFNZXRob2RHdWFyZHM6IHtcbiAgICAgICAgbWFrZVRyYW5zZmVySW52aXRhdGlvbjogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICB9LFxuICAgICAgZXh0cmFNZXRob2RzOiB7XG4gICAgICAgIG1ha2VUcmFuc2Zlckludml0YXRpb24oKSB7XG4gICAgICAgICAgY29uc3QgeyB1bmRlcmx5aW5nIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IHsgcmV2b2NhYmxlIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICBjb25zdCBjdXN0b21EZXRhaWxzID0gdW5kZXJseWluZy5nZXRJbnZpdGF0aW9uQ3VzdG9tRGV0YWlscygpO1xuICAgICAgICAgIGNvbnN0IHRyYW5zZmVySGFuZGxlciA9IG1ha2VUcmFuc2ZlckhhbmRsZXIodW5kZXJseWluZyk7XG5cbiAgICAgICAgICBjb25zdCBpbnZpdGF0aW9uID0gbWFrZUludml0YXRpb24oXG4gICAgICAgICAgICB0cmFuc2ZlckhhbmRsZXIsXG4gICAgICAgICAgICAndHJhbnNmZXInLFxuICAgICAgICAgICAgY3VzdG9tRGV0YWlscyxcbiAgICAgICAgICAgIFRyYW5zZmVyUHJvcG9zYWxTaGFwZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldm9rZShyZXZvY2FibGUpO1xuICAgICAgICAgIHJldHVybiBpbnZpdGF0aW9uO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIGNvbnN0IG1ha2VUcmFuc2ZlckhhbmRsZXIgPSB6b25lLmV4b0NsYXNzKFxuICAgICdUcmFuc2ZlckhhbmRsZXInLFxuICAgIE9mZmVySGFuZGxlckksXG4gICAgdW5kZXJseWluZyA9PiAoe1xuICAgICAgdW5kZXJseWluZyxcbiAgICB9KSxcbiAgICB7XG4gICAgICBoYW5kbGUoc2VhdCkge1xuICAgICAgICBjb25zdCB7IHVuZGVybHlpbmcgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGNvbnN0IHJldm9jYWJsZSA9IG1ha2VSZXZvY2FibGUodW5kZXJseWluZyk7XG4gICAgICAgIHNlYXQuZXhpdCgpO1xuICAgICAgICByZXR1cm4gcmV2b2NhYmxlO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIGNvbnN0IG1ha2VPd25hYmxlID0gdW5kZXJseWluZyA9PiBtYWtlUmV2b2NhYmxlKHVuZGVybHlpbmcpO1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICByZXR1cm4gaGFyZGVuKG1ha2VPd25hYmxlKTtcbn07JGjNj19vbmNlLnByZXBhcmVPd25hYmxlKHByZXBhcmVPd25hYmxlKTtcbmhhcmRlbihwcmVwYXJlT3duYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlT3duYWJsZSI6WyJwcmVwYXJlT3duYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADlJxlI+isAAPorAAA5AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvdGltZSIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJQcmljZUF1dGhvcml0eUkiLCJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsRSxGYXIsbWFrZVByb21pc2VLaXQsQW1vdW50TWF0aCxBbW91bnRTaGFwZSxCcmFuZFNoYXBlLG1ha2VOb3RpZmllcixtYWtlVHJhY2VyLFRpbWVzdGFtcFNoYXBlLE07JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV0sW1wiQW1vdW50U2hhcGVcIixbJGjNj19hID0+IChBbW91bnRTaGFwZSA9ICRozY9fYSldXSxbXCJCcmFuZFNoYXBlXCIsWyRozY9fYSA9PiAoQnJhbmRTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllclwiLFskaM2PX2EgPT4gKG1ha2VOb3RpZmllciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdQQScsIGZhbHNlKTtcblxuLypcblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlzTFQgPSAoYW1vdW50LCBhbW91bnRMaW1pdCkgPT4gIUFtb3VudE1hdGguaXNHVEUoYW1vdW50LCBhbW91bnRMaW1pdCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlzTFRFID0gKGFtb3VudCwgYW1vdW50TGltaXQpID0+IEFtb3VudE1hdGguaXNHVEUoYW1vdW50TGltaXQsIGFtb3VudCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlzR1RFID0gKGFtb3VudCwgYW1vdW50TGltaXQpID0+IEFtb3VudE1hdGguaXNHVEUoYW1vdW50LCBhbW91bnRMaW1pdCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlzR1QgPSAoYW1vdW50LCBhbW91bnRMaW1pdCkgPT4gIUFtb3VudE1hdGguaXNHVEUoYW1vdW50TGltaXQsIGFtb3VudCk7XG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgR3VhcmRDYWxsQW1vdW50VHVwbGUgPSBNLmNhbGwoQW1vdW50U2hhcGUsIEFtb3VudFNoYXBlKS5yZXR1cm5zKFxuICBNLnByb21pc2UoKSxcbik7XG4gICAgICAgY29uc3QgUHJpY2VBdXRob3JpdHlJID0gTS5pbnRlcmZhY2UoJ1ByaWNlQXV0aG9yaXR5Jywge1xuICBnZXRRdW90ZUlzc3VlcjogTS5jYWxsKEJyYW5kU2hhcGUsIEJyYW5kU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRUaW1lclNlcnZpY2U6IE0uY2FsbChCcmFuZFNoYXBlLCBCcmFuZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgcXVvdGVHaXZlbjogTS5jYWxsKEFtb3VudFNoYXBlLCBCcmFuZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgcXVvdGVXYW50ZWQ6IE0uY2FsbChCcmFuZFNoYXBlLCBBbW91bnRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIG1ha2VRdW90ZU5vdGlmaWVyOiBNLmNhbGwoQW1vdW50U2hhcGUsIEJyYW5kU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBxdW90ZUF0VGltZTogTS5jYWxsKFRpbWVzdGFtcFNoYXBlLCBBbW91bnRTaGFwZSwgQnJhbmRTaGFwZSkucmV0dXJucyhcbiAgICBNLnByb21pc2UoKSxcbiAgKSxcbiAgcXVvdGVXaGVuTFQ6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBxdW90ZVdoZW5MVEU6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBxdW90ZVdoZW5HVEU6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBxdW90ZVdoZW5HVDogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIG11dGFibGVRdW90ZVdoZW5MVDogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIG11dGFibGVRdW90ZVdoZW5MVEU6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBtdXRhYmxlUXVvdGVXaGVuR1RFOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgbXV0YWJsZVF1b3RlV2hlbkdUOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5QcmljZUF1dGhvcml0eUkoUHJpY2VBdXRob3JpdHlJKTtcbiAgICAgICBjb25zdCBtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQgPSBvcHRzID0+IHtcbiAgY29uc3Qge1xuICAgIHRpbWVyLFxuICAgIGNyZWF0ZVF1b3RlLFxuICAgIGFjdHVhbEJyYW5kSW4sXG4gICAgYWN0dWFsQnJhbmRPdXQsXG4gICAgcXVvdGVJc3N1ZXIsXG4gICAgbm90aWZpZXIsXG4gIH0gPSBvcHRzO1xuXG4gIGxldCBoYXZlRmlyc3RRdW90ZSA9IGZhbHNlO1xuXG4gIHZvaWQgRShub3RpZmllcilcbiAgICAuZ2V0VXBkYXRlU2luY2UoKVxuICAgIC50aGVuKF8gPT4gKGhhdmVGaXJzdFF1b3RlID0gdHJ1ZSkpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB0cmlnZ2VycyA9IG5ldyBTZXQoKTtcbiAgY29uc3QgbXV0YWJsZVRyaWdnZXJzID0gbmV3IE1hcCgpO1xuXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgZmlyZVRyaWdnZXJzID0gYXN5bmMgdHJpZ2dlckNyZWF0ZVF1b3RlID0+IHtcbiAgICBpZiAoIWhhdmVGaXJzdFF1b3RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLnRyaWdnZXJzLCAuLi5BcnJheS5mcm9tKG11dGFibGVUcmlnZ2Vycy52YWx1ZXMoKSldLm1hcCh0cmlnZ2VyID0+XG4gICAgICAgIHRyaWdnZXIodHJpZ2dlckNyZWF0ZVF1b3RlKSxcbiAgICAgICksXG4gICAgKTtcbiAgfTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgbWFrZVF1b3RlV2hlbk91dCA9XG4gICAgY29tcGFyZUFtb3VudHNGbiA9PlxuICAgIC8qXG5cblxuXG5cblxuICAgICAqL1xuICAgIGFzeW5jIChhbW91bnRJbiwgYW1vdW50T3V0TGltaXQpID0+IHtcbiAgICAgIGFtb3VudEluID0gQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgYW1vdW50SW4pO1xuICAgICAgYW1vdW50T3V0TGltaXQgPSBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCwgYW1vdW50T3V0TGltaXQpO1xuXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCB0cmlnZ2VyUEsgPSBtYWtlUHJvbWlzZUtpdCgpO1xuXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgdHJpZ2dlciA9IGFzeW5jIGNyZWF0ZUluc3RhbnRRdW90ZSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcXVvdGVQID0gY3JlYXRlSW5zdGFudFF1b3RlKGNhbGNBbW91bnRPdXQgPT4ge1xuICAgICAgICAgICAgaWYgKCF0cmlnZ2Vycy5oYXModHJpZ2dlcikpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFtb3VudE91dCA9IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pO1xuXG4gICAgICAgICAgICBpZiAoIWNvbXBhcmVBbW91bnRzRm4oYW1vdW50T3V0LCBhbW91bnRPdXRMaW1pdCkpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHJldHVybiB7IGFtb3VudEluLCBhbW91bnRPdXQgfTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmICghcXVvdGVQKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyaWdnZXJzLmRlbGV0ZSh0cmlnZ2VyKTtcbiAgICAgICAgICB0cmlnZ2VyUEsucmVzb2x2ZShxdW90ZVApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICB0cmlnZ2VyUEsucmVqZWN0KGUpO1xuICAgICAgICAgIHRyaWdnZXJzLmRlbGV0ZSh0cmlnZ2VyKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgdHJpZ2dlcnMuYWRkKHRyaWdnZXIpO1xuXG4gICAgICAvL1xuICAgICAgYXdhaXQgdHJpZ2dlcihjcmVhdGVRdW90ZSk7XG5cbiAgICAgIHJldHVybiB0cmlnZ2VyUEsucHJvbWlzZTtcbiAgICB9O1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBtYWtlTXV0YWJsZVF1b3RlID1cbiAgICBjb21wYXJlQW1vdW50c0ZuID0+XG4gICAgLypcblxuXG4gICAgICovXG4gICAgYXN5bmMgKGFtb3VudEluLCBhbW91bnRPdXRMaW1pdCkgPT4ge1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgYW1vdW50SW4pO1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRPdXQsIGFtb3VudE91dExpbWl0KTtcblxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgdHJpZ2dlclBLID0gbWFrZVByb21pc2VLaXQoKTtcblxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCBtdXRhYmxlUXVvdGUgPSBGYXIoJ011dGFibGVRdW90ZScsIHtcbiAgICAgICAgY2FuY2VsOiBlID0+IHRyaWdnZXJQSy5yZWplY3QoZSksXG4gICAgICAgIHVwZGF0ZUxldmVsOiAobmV3QW1vdW50SW4sIG5ld0Ftb3VudE91dExpbWl0KSA9PiB7XG4gICAgICAgICAgY29uc3QgY29lcmNlZEFtb3VudEluID0gQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgbmV3QW1vdW50SW4pO1xuICAgICAgICAgIGNvbnN0IGNvZXJjZWRBbW91bnRPdXRMaW1pdCA9IEFtb3VudE1hdGguY29lcmNlKFxuICAgICAgICAgICAgYWN0dWFsQnJhbmRPdXQsXG4gICAgICAgICAgICBuZXdBbW91bnRPdXRMaW1pdCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGFtb3VudEluID0gY29lcmNlZEFtb3VudEluO1xuICAgICAgICAgIGFtb3VudE91dExpbWl0ID0gY29lcmNlZEFtb3VudE91dExpbWl0O1xuICAgICAgICAgIHZvaWQgZmlyZVRyaWdnZXJzKGNyZWF0ZVF1b3RlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0UHJvbWlzZTogKCkgPT4gdHJpZ2dlclBLLnByb21pc2UsXG4gICAgICB9KTtcblxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IG11dGFibGVUcmlnZ2VyID0gYXN5bmMgY3JlYXRlSW5zdGFudFF1b3RlID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBxdW90ZVAgPSBjcmVhdGVJbnN0YW50UXVvdGUoY2FsY0Ftb3VudE91dCA9PiB7XG4gICAgICAgICAgICBpZiAoIW11dGFibGVUcmlnZ2Vycy5oYXMobXV0YWJsZVF1b3RlKSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYW1vdW50T3V0ID0gY2FsY0Ftb3VudE91dChhbW91bnRJbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcGFyZUFtb3VudHNGbihhbW91bnRPdXQsIGFtb3VudE91dExpbWl0KSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIHsgYW1vdW50SW4sIGFtb3VudE91dCB9O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFxdW90ZVApIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbXV0YWJsZVRyaWdnZXJzLmRlbGV0ZShtdXRhYmxlUXVvdGUpO1xuICAgICAgICAgIHRyaWdnZXJQSy5yZXNvbHZlKHF1b3RlUCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIHRyaWdnZXJQSy5yZWplY3QoZSk7XG4gICAgICAgICAgbXV0YWJsZVRyaWdnZXJzLmRlbGV0ZShtdXRhYmxlUXVvdGUpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBtdXRhYmxlVHJpZ2dlcnMuc2V0KG11dGFibGVRdW90ZSwgbXV0YWJsZVRyaWdnZXIpO1xuXG4gICAgICAvL1xuICAgICAgYXdhaXQgbXV0YWJsZVRyaWdnZXIoY3JlYXRlUXVvdGUpO1xuXG4gICAgICByZXR1cm4gbXV0YWJsZVF1b3RlO1xuICAgIH07XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgYXNzZXJ0QnJhbmRzID0gKGJyYW5kSW4sIGJyYW5kT3V0KSA9PiB7XG4gICAgYnJhbmRJbiA9PT0gYWN0dWFsQnJhbmRJbiB8fFxuICAgICAgRmFpbGBEZXNpcmVkIGJyYW5kSW4gJHtxKGJyYW5kSW4pfSBtdXN0IG1hdGNoICR7cShhY3R1YWxCcmFuZEluKX1gO1xuICAgIGJyYW5kT3V0ID09PSBhY3R1YWxCcmFuZE91dCB8fFxuICAgICAgRmFpbGBEZXNpcmVkIGJyYW5kT3V0ICR7cShicmFuZE91dCl9IG11c3QgbWF0Y2ggJHtxKGFjdHVhbEJyYW5kT3V0KX1gO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHByaWNlQXV0aG9yaXR5ID0gRmFyKCdQcmljZUF1dGhvcml0eScsIHtcbiAgICBnZXRRdW90ZUlzc3VlcihicmFuZEluLCBicmFuZE91dCkge1xuICAgICAgYXNzZXJ0QnJhbmRzKGJyYW5kSW4sIGJyYW5kT3V0KTtcbiAgICAgIHJldHVybiBxdW90ZUlzc3VlcjtcbiAgICB9LFxuICAgIGdldFRpbWVyU2VydmljZShicmFuZEluLCBicmFuZE91dCkge1xuICAgICAgYXNzZXJ0QnJhbmRzKGJyYW5kSW4sIGJyYW5kT3V0KTtcbiAgICAgIHJldHVybiB0aW1lcjtcbiAgICB9LFxuICAgIG1ha2VRdW90ZU5vdGlmaWVyKGFtb3VudEluLCBicmFuZE91dCkge1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgYW1vdW50SW4pO1xuICAgICAgYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLCBicmFuZE91dCk7XG5cbiAgICAgIC8vXG4gICAgICBjb25zdCBzcGVjaWZpY0Jhc2VOb3RpZmllciA9IGhhcmRlbih7XG4gICAgICAgIGFzeW5jIGdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50ID0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG5cbiAgICAgICAgICAvL1xuICAgICAgICAgIGxldCBxdW90ZTtcbiAgICAgICAgICAvL1xuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHF1b3RlID0gY3JlYXRlUXVvdGUoY2FsY0Ftb3VudE91dCA9PiAoe1xuICAgICAgICAgICAgICBhbW91bnRJbixcbiAgICAgICAgICAgICAgYW1vdW50T3V0OiBjYWxjQW1vdW50T3V0KGFtb3VudEluKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghcXVvdGUpIHtcbiAgICAgICAgICAgIHRocm93IEZhaWxgY3JlYXRlUXVvdGUgcmV0dXJuZWQgbm90aGluZ2A7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCBxdW90ZTtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgdXBkYXRlQ291bnQ6IHJlY29yZC51cGRhdGVDb3VudCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3Qgc3BlY2lmaWNOb3RpZmllciA9IEZhcignUXVvdGVOb3RpZmllcicsIHtcbiAgICAgICAgLi4ubWFrZU5vdGlmaWVyKHNwZWNpZmljQmFzZU5vdGlmaWVyKSxcbiAgICAgICAgLy9cbiAgICAgICAgLi4uc3BlY2lmaWNCYXNlTm90aWZpZXIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzcGVjaWZpY05vdGlmaWVyO1xuICAgIH0sXG4gICAgYXN5bmMgcXVvdGVHaXZlbihhbW91bnRJbiwgYnJhbmRPdXQpIHtcbiAgICAgIHRyYWNlKCdxdW90ZUdpdmVuJywgYW1vdW50SW4sIGJyYW5kT3V0KTtcbiAgICAgIEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sIGFtb3VudEluKTtcbiAgICAgIGFzc2VydEJyYW5kcyhhbW91bnRJbi5icmFuZCwgYnJhbmRPdXQpO1xuXG4gICAgICBhd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSgpO1xuICAgICAgY29uc3QgcXVvdGUgPSBjcmVhdGVRdW90ZShjYWxjQW1vdW50T3V0ID0+ICh7XG4gICAgICAgIGFtb3VudEluLFxuICAgICAgICBhbW91bnRPdXQ6IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pLFxuICAgICAgfSkpO1xuICAgICAgYXNzZXJ0KHF1b3RlKTtcbiAgICAgIHJldHVybiBxdW90ZTtcbiAgICB9LFxuICAgIGFzeW5jIHF1b3RlV2FudGVkKGJyYW5kSW4sIGFtb3VudE91dCkge1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRPdXQsIGFtb3VudE91dCk7XG4gICAgICBhc3NlcnRCcmFuZHMoYnJhbmRJbiwgYW1vdW50T3V0LmJyYW5kKTtcblxuICAgICAgYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbiAgICAgIGNvbnN0IHF1b3RlID0gY3JlYXRlUXVvdGUoKGNhbGNBbW91bnRPdXQsIGNhbGNBbW91bnRJbikgPT4ge1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBhbW91bnRJbiA9IGNhbGNBbW91bnRJbihhbW91bnRPdXQpO1xuICAgICAgICBjb25zdCBhY3R1YWxBbW91bnRPdXQgPSBjYWxjQW1vdW50T3V0KGFtb3VudEluKTtcbiAgICAgICAgQW1vdW50TWF0aC5pc0dURShhY3R1YWxBbW91bnRPdXQsIGFtb3VudE91dCkgfHxcbiAgICAgICAgICBGYWlsYENhbGN1bGF0aW9uIG9mICR7YWN0dWFsQW1vdW50T3V0fSBkaWRuJ3QgY292ZXIgZXhwZWN0ZWQgJHthbW91bnRPdXR9YDtcbiAgICAgICAgcmV0dXJuIHsgYW1vdW50SW4sIGFtb3VudE91dCB9O1xuICAgICAgfSk7XG4gICAgICBhc3NlcnQocXVvdGUpO1xuICAgICAgcmV0dXJuIHF1b3RlO1xuICAgIH0sXG4gICAgYXN5bmMgcXVvdGVBdFRpbWUoZGVhZGxpbmUsIGFtb3VudEluLCBicmFuZE91dCkge1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgYW1vdW50SW4pO1xuICAgICAgYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLCBicmFuZE91dCk7XG5cbiAgICAgIGF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKCk7XG4gICAgICBjb25zdCBxdW90ZVBLID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgIGF3YWl0IEUodGltZXIpLnNldFdha2V1cChcbiAgICAgICAgZGVhZGxpbmUsXG4gICAgICAgIEZhcignd2FrZU9iaicsIHtcbiAgICAgICAgICBhc3luYyB3YWtlKHRpbWVzdGFtcCkge1xuICAgICAgICAgICAgYXdhaXQgbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHF1b3RlUCA9IGNyZWF0ZVF1b3RlKGNhbGNBbW91bnRPdXQgPT4gKHtcbiAgICAgICAgICAgICAgICBhbW91bnRJbixcbiAgICAgICAgICAgICAgICBhbW91bnRPdXQ6IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pLFxuICAgICAgICAgICAgICAgIHRpbWVzdGFtcCxcbiAgICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIHF1b3RlUEsucmVzb2x2ZShxdW90ZVApO1xuICAgICAgICAgICAgICBhd2FpdCBxdW90ZVBLLnByb21pc2U7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHF1b3RlUEsucmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy9cbiAgICAgIHJldHVybiBxdW90ZVBLLnByb21pc2U7XG4gICAgfSxcbiAgICBxdW90ZVdoZW5MVDogbWFrZVF1b3RlV2hlbk91dChpc0xUKSxcbiAgICBxdW90ZVdoZW5MVEU6IG1ha2VRdW90ZVdoZW5PdXQoaXNMVEUpLFxuICAgIHF1b3RlV2hlbkdURTogbWFrZVF1b3RlV2hlbk91dChpc0dURSksXG4gICAgcXVvdGVXaGVuR1Q6IG1ha2VRdW90ZVdoZW5PdXQoaXNHVCksXG4gICAgbXV0YWJsZVF1b3RlV2hlbkxUOiBtYWtlTXV0YWJsZVF1b3RlKGlzTFQpLFxuICAgIG11dGFibGVRdW90ZVdoZW5MVEU6IG1ha2VNdXRhYmxlUXVvdGUoaXNMVEUpLFxuICAgIG11dGFibGVRdW90ZVdoZW5HVDogbWFrZU11dGFibGVRdW90ZShpc0dUKSxcbiAgICBtdXRhYmxlUXVvdGVXaGVuR1RFOiBtYWtlTXV0YWJsZVF1b3RlKGlzR1RFKSxcbiAgfSk7XG5cbiAgcmV0dXJuIHsgcHJpY2VBdXRob3JpdHksIGFkbWluRmFjZXQ6IHsgZmlyZVRyaWdnZXJzIH0gfTtcbn07JGjNj19vbmNlLm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdChtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHJpY2VBdXRob3JpdHlJIjpbIlByaWNlQXV0aG9yaXR5SSJdLCJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQiOlsibWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOfHwgFxCQAAcQkAADUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGFnb3JpYy9lcnRwIl0sImV4cG9ydHMiOlsiZ2V0QW1vdW50SW4iLCJnZXRBbW91bnRPdXQiLCJnZXRQcmljZURlc2NyaXB0aW9uIiwiZ2V0VGltZXN0YW1wIiwibWFrZVByaWNlUXVvdGVJc3N1ZXIiLCJ1bml0QW1vdW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxOYXQsRSxBbW91bnRNYXRoLEFzc2V0S2luZCxtYWtlSXNzdWVyS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dLFtcIkFzc2V0S2luZFwiLFskaM2PX2EgPT4gKEFzc2V0S2luZCA9ICRozY9fYSldXSxbXCJtYWtlSXNzdWVyS2l0XCIsWyRozY9fYSA9PiAobWFrZUlzc3VlcktpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuLy9cbi8vXG4vL1xuLy9cblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRQcmljZURlc2NyaXB0aW9uID0gcXVvdGUgPT4ge1xuICBxdW90ZS5xdW90ZUFtb3VudC52YWx1ZS5sZW5ndGggPT09IDEgfHxcbiAgICBGYWlsYHF1b3RlQW1vdW50IHNldCBtdXN0IGhhdmUgb25lIG1lbWJlcmA7XG4gIHJldHVybiBxdW90ZS5xdW90ZUFtb3VudC52YWx1ZVswXTtcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLmdldFByaWNlRGVzY3JpcHRpb24oZ2V0UHJpY2VEZXNjcmlwdGlvbik7XG4gICAgICAgY29uc3QgZ2V0QW1vdW50SW4gPSBxdW90ZSA9PiBnZXRQcmljZURlc2NyaXB0aW9uKHF1b3RlKS5hbW91bnRJbjtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLmdldEFtb3VudEluKGdldEFtb3VudEluKTtcbiAgICAgICBjb25zdCBnZXRBbW91bnRPdXQgPSBxdW90ZSA9PiBnZXRQcmljZURlc2NyaXB0aW9uKHF1b3RlKS5hbW91bnRPdXQ7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLmdldEFtb3VudE91dChnZXRBbW91bnRPdXQpO1xuICAgICAgIGNvbnN0IGdldFRpbWVzdGFtcCA9IHF1b3RlID0+IGdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLnRpbWVzdGFtcDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5nZXRUaW1lc3RhbXAoZ2V0VGltZXN0YW1wKTtcbiAgICAgICBjb25zdCB1bml0QW1vdW50ID0gYXN5bmMgYnJhbmQgPT4ge1xuICAvL1xuICBjb25zdCBkaXNwbGF5SW5mbyA9IGF3YWl0IEUoYnJhbmQpLmdldERpc3BsYXlJbmZvKCk7XG4gIGNvbnN0IGRlY2ltYWxQbGFjZXMgPSBkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzID8/IDA7XG4gIHJldHVybiBBbW91bnRNYXRoLm1ha2UoYnJhbmQsIDEwbiAqKiBOYXQoZGVjaW1hbFBsYWNlcykpO1xufTskaM2PX29uY2UudW5pdEFtb3VudCh1bml0QW1vdW50KTtcbmhhcmRlbih1bml0QW1vdW50KTtcblxuICAgICAgIGNvbnN0IG1ha2VQcmljZVF1b3RlSXNzdWVyID0gKCkgPT5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgbWFrZUlzc3VlcktpdCgncXVvdGUnLCBBc3NldEtpbmQuU0VUKVxuICApOyRozY9fb25jZS5tYWtlUHJpY2VRdW90ZUlzc3VlcihtYWtlUHJpY2VRdW90ZUlzc3Vlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRQcmljZURlc2NyaXB0aW9uIjpbImdldFByaWNlRGVzY3JpcHRpb24iXSwiZ2V0QW1vdW50SW4iOlsiZ2V0QW1vdW50SW4iXSwiZ2V0QW1vdW50T3V0IjpbImdldEFtb3VudE91dCJdLCJnZXRUaW1lc3RhbXAiOlsiZ2V0VGltZXN0YW1wIl0sInVuaXRBbW91bnQiOlsidW5pdEFtb3VudCJdLCJtYWtlUHJpY2VRdW90ZUlzc3VlciI6WyJtYWtlUHJpY2VRdW90ZUlzc3VlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD+oXTVWBwAAFgcAAAzAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJSZWNvcmRlcktpdFNoYXBlIiwiZGVmaW5lRVJlY29yZGVyS2l0IiwiZGVmaW5lUmVjb3JkZXJLaXQiLCJwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzIiwicHJlcGFyZVJlY29yZGVyIiwicHJlcGFyZVJlY29yZGVyS2l0IiwicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxTdG9yYWdlTm9kZVNoYXBlLHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCxtYWtlRmFrZU1hcnNoYWxsZXIsbWFrZUZha2VTdG9yYWdlLG11c3RNYXRjaCxNLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxwcmVwYXJlRXhvQ2xhc3MsRTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJTdG9yYWdlTm9kZVNoYXBlXCIsWyRozY9fYSA9PiAoU3RvcmFnZU5vZGVTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzXCIsIFtbXCJtYWtlRmFrZU1hcnNoYWxsZXJcIixbJGjNj19hID0+IChtYWtlRmFrZU1hcnNoYWxsZXIgPSAkaM2PX2EpXV0sW1wibWFrZUZha2VTdG9yYWdlXCIsWyRozY9fYSA9PiAobWFrZUZha2VTdG9yYWdlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVJlY29yZGVyID0gKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpID0+IHtcbiAgY29uc3QgbWFrZVJlY29yZGVyID0gcHJlcGFyZUV4b0NsYXNzKFxuICAgIGJhZ2dhZ2UsXG4gICAgJ1JlY29yZGVyJyxcbiAgICBNLmludGVyZmFjZSgnUmVjb3JkZXInLCB7XG4gICAgICBnZXRTdG9yYWdlTm9kZTogTS5jYWxsKCkucmV0dXJucyhTdG9yYWdlTm9kZVNoYXBlKSxcbiAgICAgIGdldFN0b3JhZ2VQYXRoOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgvKiAgICAgICAgKi8pKSxcbiAgICAgIHdyaXRlOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICB3cml0ZUZpbmFsOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgfSksXG4gICAgLypcblxuXG5cblxuICAgICAqL1xuICAgIChcbiAgICAgIHB1Ymxpc2hlcixcbiAgICAgIHN0b3JhZ2VOb2RlLFxuICAgICAgdmFsdWVTaGFwZSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChNLmFueSgpKSxcbiAgICApID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgICAgIHB1Ymxpc2hlcixcbiAgICAgICAgc3RvcmFnZU5vZGUsXG4gICAgICAgIHN0b3JhZ2VQYXRoOiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHVuZGVmaW5lZCksXG4gICAgICAgIHZhbHVlU2hhcGUsXG4gICAgICB9O1xuICAgIH0sXG4gICAge1xuICAgICAgZ2V0U3RvcmFnZU5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnN0b3JhZ2VOb2RlO1xuICAgICAgfSxcbiAgICAgIC8qXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIGdldFN0b3JhZ2VQYXRoKCkge1xuICAgICAgICBjb25zdCB7IHN0b3JhZ2VQYXRoOiBoZWxkUGF0aCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgLy9cbiAgICAgICAgYXdhaXQgbnVsbDtcbiAgICAgICAgaWYgKGhlbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGVsZFBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IEUodGhpcy5zdGF0ZS5zdG9yYWdlTm9kZSkuZ2V0UGF0aCgpO1xuICAgICAgICB0aGlzLnN0YXRlLnN0b3JhZ2VQYXRoID0gcGF0aDtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9LFxuICAgICAgLypcblxuXG5cblxuICAgICAgICovXG4gICAgICBhc3luYyB3cml0ZSh2YWx1ZSkge1xuICAgICAgICBjb25zdCB7IGNsb3NlZCwgcHVibGlzaGVyLCBzdG9yYWdlTm9kZSwgdmFsdWVTaGFwZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgIWNsb3NlZCB8fCBGYWlsYGNhbm5vdCB3cml0ZSB0byBjbG9zZWQgcmVjb3JkZXJgO1xuICAgICAgICBtdXN0TWF0Y2godmFsdWUsIHZhbHVlU2hhcGUpO1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gYXdhaXQgRShtYXJzaGFsbGVyKS50b0NhcERhdGEodmFsdWUpO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICAgIGF3YWl0IEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKHNlcmlhbGl6ZWQpO1xuXG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBwdWJsaXNoZXIucHVibGlzaCh2YWx1ZSk7XG4gICAgICB9LFxuICAgICAgLypcblxuXG5cblxuICAgICAgICovXG4gICAgICBhc3luYyB3cml0ZUZpbmFsKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgY2xvc2VkLCBwdWJsaXNoZXIsIHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAhY2xvc2VkIHx8IEZhaWxgY2Fubm90IHdyaXRlIHRvIGNsb3NlZCByZWNvcmRlcmA7XG4gICAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSk7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgICAgYXdhaXQgRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgdGhpcy5zdGF0ZS5jbG9zZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcHVibGlzaGVyLmZpbmlzaCh2YWx1ZSk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIG1ha2VSZWNvcmRlcjtcbn07JGjNj19vbmNlLnByZXBhcmVSZWNvcmRlcihwcmVwYXJlUmVjb3JkZXIpO1xuaGFyZGVuKHByZXBhcmVSZWNvcmRlcik7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGRlZmluZVJlY29yZGVyS2l0ID0gKHsgbWFrZVJlY29yZGVyLCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQgfSkgPT4ge1xuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYWtlUmVjb3JkZXJLaXQgPSAoc3RvcmFnZU5vZGUsIHZhbHVlU2hhcGUpID0+IHtcbiAgICBjb25zdCB7IHN1YnNjcmliZXIsIHB1Ymxpc2hlciB9ID0gbWFrZUR1cmFibGVQdWJsaXNoS2l0KCk7XG4gICAgY29uc3QgcmVjb3JkZXIgPSBtYWtlUmVjb3JkZXIoXG4gICAgICBwdWJsaXNoZXIsXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICAgIHN0b3JhZ2VOb2RlXG4gICAgICApLFxuICAgICAgdmFsdWVTaGFwZSxcbiAgICApO1xuICAgIHJldHVybiBoYXJkZW4oeyBzdWJzY3JpYmVyLCByZWNvcmRlciB9KTtcbiAgfTtcbiAgcmV0dXJuIG1ha2VSZWNvcmRlcktpdDtcbn07XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlZmluZVJlY29yZGVyS2l0KGRlZmluZVJlY29yZGVyS2l0KTtcbiAgICAgICBjb25zdCBkZWZpbmVFUmVjb3JkZXJLaXQgPSAoeyBtYWtlUmVjb3JkZXIsIG1ha2VEdXJhYmxlUHVibGlzaEtpdCB9KSA9PiB7XG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VFUmVjb3JkZXJLaXQgPSAoc3RvcmFnZU5vZGVQLCB2YWx1ZVNoYXBlKSA9PiB7XG4gICAgY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VEdXJhYmxlUHVibGlzaEtpdCgpO1xuICAgIGNvbnN0IHJlY29yZGVyUCA9IEUud2hlbihzdG9yYWdlTm9kZVAsIHN0b3JhZ2VOb2RlID0+XG4gICAgICBtYWtlUmVjb3JkZXIoXG4gICAgICAgIHB1Ymxpc2hlcixcbiAgICAgICAgLy9cbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHN0b3JhZ2VOb2RlKSxcbiAgICAgICAgdmFsdWVTaGFwZSxcbiAgICAgICksXG4gICAgKTtcbiAgICByZXR1cm4geyBzdWJzY3JpYmVyLCByZWNvcmRlclAgfTtcbiAgfTtcbiAgcmV0dXJuIG1ha2VFUmVjb3JkZXJLaXQ7XG59OyRozY9fb25jZS5kZWZpbmVFUmVjb3JkZXJLaXQoZGVmaW5lRVJlY29yZGVyS2l0KTtcbmhhcmRlbihkZWZpbmVFUmVjb3JkZXJLaXQpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVSZWNvcmRlcktpdCA9IChiYWdnYWdlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGNvbnN0IG1ha2VEdXJhYmxlUHVibGlzaEtpdCA9IHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChcbiAgICBiYWdnYWdlLFxuICAgICdEdXJhYmxlIFB1Ymxpc2ggS2l0JyxcbiAgKTtcbiAgY29uc3QgbWFrZVJlY29yZGVyID0gcHJlcGFyZVJlY29yZGVyKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpO1xuICByZXR1cm4gZGVmaW5lUmVjb3JkZXJLaXQoeyBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQsIG1ha2VSZWNvcmRlciB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UucHJlcGFyZVJlY29yZGVyS2l0KHByZXBhcmVSZWNvcmRlcktpdCk7XG4gICAgICAgY29uc3QgcHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzID0gKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpID0+IHtcbiAgY29uc3QgbWFrZUR1cmFibGVQdWJsaXNoS2l0ID0gcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ0R1cmFibGUgUHVibGlzaCBLaXQnLFxuICApO1xuICBjb25zdCBtYWtlUmVjb3JkZXIgPSBwcmVwYXJlUmVjb3JkZXIoYmFnZ2FnZSwgbWFyc2hhbGxlcik7XG5cbiAgY29uc3QgbWFrZVJlY29yZGVyS2l0ID0gZGVmaW5lUmVjb3JkZXJLaXQoe1xuICAgIG1ha2VSZWNvcmRlcixcbiAgICBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQsXG4gIH0pO1xuICBjb25zdCBtYWtlRVJlY29yZGVyS2l0ID0gZGVmaW5lRVJlY29yZGVyS2l0KHtcbiAgICBtYWtlUmVjb3JkZXIsXG4gICAgbWFrZUR1cmFibGVQdWJsaXNoS2l0LFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG1ha2VEdXJhYmxlUHVibGlzaEtpdCxcbiAgICBtYWtlUmVjb3JkZXIsXG4gICAgbWFrZVJlY29yZGVyS2l0LFxuICAgIG1ha2VFUmVjb3JkZXJLaXQsXG4gIH07XG59O1xuXG4vKlxuXG4gKi8kaM2PX29uY2UucHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKHByZXBhcmVSZWNvcmRlcktpdE1ha2Vycyk7XG4gICAgICAgY29uc3QgcHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyA9ICgpID0+IHtcbiAgY29uc3QgYmFnZ2FnZSA9IG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnbW9jayByZWNvcmRlciBiYWdnYWdlJyk7XG4gIGNvbnN0IG1hcnNoYWxsZXIgPSBtYWtlRmFrZU1hcnNoYWxsZXIoKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5wcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMoYmFnZ2FnZSwgbWFyc2hhbGxlciksXG4gICAgc3RvcmFnZU5vZGU6IG1ha2VGYWtlU3RvcmFnZSgnbW9jayByZWNvcmRlciBzdG9yYWdlJyksXG4gIH07XG59OyRozY9fb25jZS5wcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzKHByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMpO1xuXG4gICAgICAgY29uc3QgUmVjb3JkZXJLaXRTaGFwZSA9IHtcbiAgcmVjb3JkZXI6IE0ucmVtb3RhYmxlKCksXG4gIHN1YnNjcmliZXI6IE0ucmVtb3RhYmxlKCksXG59OyRozY9fb25jZS5SZWNvcmRlcktpdFNoYXBlKFJlY29yZGVyS2l0U2hhcGUpO1xuaGFyZGVuKFJlY29yZGVyS2l0U2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVJlY29yZGVyIjpbInByZXBhcmVSZWNvcmRlciJdLCJkZWZpbmVSZWNvcmRlcktpdCI6WyJkZWZpbmVSZWNvcmRlcktpdCJdLCJkZWZpbmVFUmVjb3JkZXJLaXQiOlsiZGVmaW5lRVJlY29yZGVyS2l0Il0sInByZXBhcmVSZWNvcmRlcktpdCI6WyJwcmVwYXJlUmVjb3JkZXJLaXQiXSwicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIjpbInByZXBhcmVSZWNvcmRlcktpdE1ha2VycyJdLCJwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzIjpbInByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMiXSwiUmVjb3JkZXJLaXRTaGFwZSI6WyJSZWNvcmRlcktpdFNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANW85poJBAAACQQAADcAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VTdGF0ZU1hY2hpbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuXG5cblxuXG4qL1xuY29uc3QgbWFrZVN0YXRlTWFjaGluZSA9IChpbml0aWFsU3RhdGUsIGFsbG93ZWRUcmFuc2l0aW9uc0FycmF5KSA9PiB7XG4gIGxldCBzdGF0ZSA9IGluaXRpYWxTdGF0ZTtcbiAgY29uc3QgYWxsb3dlZFRyYW5zaXRpb25zID0gbmV3IE1hcChhbGxvd2VkVHJhbnNpdGlvbnNBcnJheSk7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGNhblRyYW5zaXRpb25UbzogbmV4dFN0YXRlID0+XG4gICAgICBhbGxvd2VkVHJhbnNpdGlvbnMuZ2V0KHN0YXRlKS5pbmNsdWRlcyhuZXh0U3RhdGUpLFxuICAgIHRyYW5zaXRpb25UbzogbmV4dFN0YXRlID0+IHtcbiAgICAgIGFzc2VydChhbGxvd2VkVHJhbnNpdGlvbnMuZ2V0KHN0YXRlKS5pbmNsdWRlcyhuZXh0U3RhdGUpKTtcbiAgICAgIHN0YXRlID0gbmV4dFN0YXRlO1xuICAgIH0sXG4gICAgZ2V0U3RhdHVzOiBfID0+IHN0YXRlLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTdGF0ZU1hY2hpbmUobWFrZVN0YXRlTWFjaGluZSk7XG5oYXJkZW4obWFrZVN0YXRlTWFjaGluZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RhdGVNYWNoaW5lIjpbIm1ha2VTdGF0ZU1hY2hpbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASb1uYQMEAAADBAAANQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0aXN0aWNzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJjYWxjdWxhdGVNZWRpYW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNhbGN1bGF0ZU1lZGlhbiA9IChzYW1wbGVzLCBtYXRoKSA9PiB7XG4gIGNvbnN0IHNvcnRlZCA9IHNhbXBsZXMuc29ydCgoYSwgYikgPT4ge1xuICAgIGlmICghbWF0aC5pc0dURShhLCBiKSkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gZWxzZSBpZiAoIW1hdGguaXNHVEUoYiwgYSkpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfSk7XG5cbiAgaWYgKHNvcnRlZC5sZW5ndGggPT09IDApIHtcbiAgICAvL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoc29ydGVkLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAvL1xuICAgIHJldHVybiBzb3J0ZWRbKHNvcnRlZC5sZW5ndGggLSAxKSAvIDJdO1xuICB9XG5cbiAgLy9cbiAgY29uc3Qgc2Vjb25kSW5kZXggPSBzb3J0ZWQubGVuZ3RoIC8gMjtcbiAgY29uc3Qgc3VtID0gbWF0aC5hZGQoc29ydGVkW3NlY29uZEluZGV4IC0gMV0sIHNvcnRlZFtzZWNvbmRJbmRleF0pO1xuICByZXR1cm4gbWF0aC5kaXZpZGUoc3VtLCAybik7XG59OyRozY9fb25jZS5jYWxjdWxhdGVNZWRpYW4oY2FsY3VsYXRlTWVkaWFuKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGN1bGF0ZU1lZGlhbiI6WyJjYWxjdWxhdGVNZWRpYW4iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAUrvu/6MGAACjBgAAMQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC90b3BpY3MuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJQdWJsaWNUb3BpY1NoYXBlIiwiU3Vic2NyaWJlclNoYXBlIiwiVG9waWNzUmVjb3JkU2hhcGUiLCJtYWtlUmVjb3JkZXJUb3BpYyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFN1YnNjcmliZXJTaGFwZSxNLEU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIixbJGjNj19hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaM2PX2EpLCRozY9fbGl2ZVtcIlN1YnNjcmliZXJTaGFwZVwiXV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cbiAgICAgICBjb25zdCBQdWJsaWNUb3BpY1NoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIHN1YnNjcmliZXI6IFN1YnNjcmliZXJTaGFwZSxcbiAgICBzdG9yYWdlUGF0aDogTS5vcihNLnByb21pc2UoLyogICAgICAgICovKSwgTS5zdHJpbmcoKSksXG4gIH0sXG4gIHsgZGVzY3JpcHRpb246IE0uc3RyaW5nKCkgfSxcbik7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlB1YmxpY1RvcGljU2hhcGUoUHVibGljVG9waWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBUb3BpY3NSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoTS5zdHJpbmcoKSwgUHVibGljVG9waWNTaGFwZSk7XG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuVG9waWNzUmVjb3JkU2hhcGUoVG9waWNzUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IG1ha2VSZWNvcmRlclRvcGljID0gKGRlc2NyaXB0aW9uLCByZWNvcmRlcktpdCkgPT4ge1xuICBjb25zdCByZWNQID1cbiAgICAncmVjb3JkZXInIGluIHJlY29yZGVyS2l0ID8gcmVjb3JkZXJLaXQucmVjb3JkZXIgOiByZWNvcmRlcktpdC5yZWNvcmRlclA7XG4gIHJldHVybiB7XG4gICAgZGVzY3JpcHRpb24sXG4gICAgc3Vic2NyaWJlcjogcmVjb3JkZXJLaXQuc3Vic2NyaWJlcixcbiAgICBzdG9yYWdlUGF0aDogRShyZWNQKS5nZXRTdG9yYWdlUGF0aCgpLFxuICB9O1xufTskaM2PX29uY2UubWFrZVJlY29yZGVyVG9waWMobWFrZVJlY29yZGVyVG9waWMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiU3Vic2NyaWJlclNoYXBlIjpbIlN1YnNjcmliZXJTaGFwZSIsZmFsc2VdfSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlB1YmxpY1RvcGljU2hhcGUiOlsiUHVibGljVG9waWNTaGFwZSJdLCJUb3BpY3NSZWNvcmRTaGFwZSI6WyJUb3BpY3NSZWNvcmRTaGFwZSJdLCJtYWtlUmVjb3JkZXJUb3BpYyI6WyJtYWtlUmVjb3JkZXJUb3BpYyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACZUHHTiSUAAIklAAA1AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCIuLi9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIiwiLi9hdG9taWNUcmFuc2Zlci5qcyJdLCJleHBvcnRzIjpbImFzc2VydElzc3VlcktleXdvcmRzIiwiYXNzZXJ0TmF0QXNzZXRLaW5kIiwiYXNzZXJ0UHJvcG9zYWxTaGFwZSIsImRlZmF1bHRBY2NlcHRhbmNlTXNnIiwiZGVwb3NpdFRvU2VhdCIsImRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnIiwiZml0UHJvcG9zYWxTaGFwZSIsIm1hcEtleXdvcmRzIiwib2ZmZXJUbyIsInNhdGlzZmllcyIsInNhdmVBbGxJc3N1ZXJzIiwic3dhcCIsInN3YXBFeGFjdCIsIndpdGhkcmF3RnJvbVNlYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEUsbWFrZVByb21pc2VLaXQsbXVzdE1hdGNoLGtleUVRLEFzc2V0S2luZCxmcm9tVW5pcXVlRW50cmllcyxzYXRpc2ZpZXNXYW50LGF0b21pY1RyYW5zZmVyLGZyb21Pbmx5LHRvT25seTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFzc2V0S2luZFwiLFskaM2PX2EgPT4gKEFzc2V0S2luZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCIuLi9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzXCIsIFtbXCJzYXRpc2ZpZXNXYW50XCIsWyRozY9fYSA9PiAoc2F0aXNmaWVzV2FudCA9ICRozY9fYSldXV1dLFtcIi4vYXRvbWljVHJhbnNmZXIuanNcIiwgW1tcImF0b21pY1RyYW5zZmVyXCIsWyRozY9fYSA9PiAoYXRvbWljVHJhbnNmZXIgPSAkaM2PX2EpXV0sW1wiZnJvbU9ubHlcIixbJGjNj19hID0+IChmcm9tT25seSA9ICRozY9fYSldXSxbXCJ0b09ubHlcIixbJGjNj19hID0+ICh0b09ubHkgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbiAgICAgICBjb25zdCBkZWZhdWx0QWNjZXB0YW5jZU1zZyA9IGBUaGUgb2ZmZXIgaGFzIGJlZW4gYWNjZXB0ZWQuIE9uY2UgdGhlIGNvbnRyYWN0IGhhcyBiZWVuIGNvbXBsZXRlZCwgcGxlYXNlIGNoZWNrIHlvdXIgcGF5b3V0YDskaM2PX29uY2UuZGVmYXVsdEFjY2VwdGFuY2VNc2coZGVmYXVsdEFjY2VwdGFuY2VNc2cpO1xuXG5jb25zdCBnZXRLZXlzU29ydGVkID0gb2JqID0+IGhhcmRlbihSZWZsZWN0Lm93bktleXMob2JqIHx8IHt9KS5zb3J0KCkpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0SXNzdWVyS2V5d29yZHMgPSAoemNmLCBleHBlY3RlZCkgPT4ge1xuICBjb25zdCB7IGlzc3VlcnMgfSA9IHpjZi5nZXRUZXJtcygpO1xuICBjb25zdCBhY3R1YWwgPSBnZXRLZXlzU29ydGVkKGlzc3VlcnMpO1xuICBleHBlY3RlZCA9IFsuLi5leHBlY3RlZF07IC8vXG4gIGV4cGVjdGVkLnNvcnQoKTtcbiAga2V5RVEoYWN0dWFsLCBoYXJkZW4oZXhwZWN0ZWQpKSB8fFxuICAgIEZhaWxga2V5d29yZHM6ICR7YWN0dWFsfSB3ZXJlIG5vdCBhcyBleHBlY3RlZDogJHtleHBlY3RlZH1gO1xufTtcblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0SXNzdWVyS2V5d29yZHMoYXNzZXJ0SXNzdWVyS2V5d29yZHMpO1xuICAgICAgIGNvbnN0IHNhdGlzZmllcyA9IChfaWdub3JlZCwgc2VhdCwgdXBkYXRlKSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRBbGxvY2F0aW9uID0gc2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpO1xuICBjb25zdCBuZXdBbGxvY2F0aW9uID0geyAuLi5jdXJyZW50QWxsb2NhdGlvbiwgLi4udXBkYXRlIH07XG4gIGNvbnN0IHByb3Bvc2FsID0gc2VhdC5nZXRQcm9wb3NhbCgpO1xuICByZXR1cm4gc2F0aXNmaWVzV2FudChwcm9wb3NhbCwgbmV3QWxsb2NhdGlvbik7XG59O1xuXG4vKiAgICAgICAgICAgICAgICovJGjNj19vbmNlLnNhdGlzZmllcyhzYXRpc2ZpZXMpO1xuICAgICAgIGNvbnN0IHN3YXAgPSAoemNmLCBsZWZ0U2VhdCwgcmlnaHRTZWF0KSA9PiB7XG4gIHRyeSB7XG4gICAgemNmLmF0b21pY1JlYXJyYW5nZShcbiAgICAgIGhhcmRlbihbXG4gICAgICAgIFtyaWdodFNlYXQsIGxlZnRTZWF0LCBsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnRdLFxuICAgICAgICBbbGVmdFNlYXQsIHJpZ2h0U2VhdCwgcmlnaHRTZWF0LmdldFByb3Bvc2FsKCkud2FudF0sXG4gICAgICBdKSxcbiAgICApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsZWZ0U2VhdC5mYWlsKGVycik7XG4gICAgcmlnaHRTZWF0LmZhaWwoZXJyKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBsZWZ0U2VhdC5leGl0KCk7XG4gIHJpZ2h0U2VhdC5leGl0KCk7XG4gIHJldHVybiBkZWZhdWx0QWNjZXB0YW5jZU1zZztcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5zd2FwKHN3YXApO1xuICAgICAgIGNvbnN0IHN3YXBFeGFjdCA9ICh6Y2YsIGxlZnRTZWF0LCByaWdodFNlYXQpID0+IHtcbiAgdHJ5IHtcbiAgICB6Y2YuYXRvbWljUmVhcnJhbmdlKFxuICAgICAgaGFyZGVuKFtcbiAgICAgICAgZnJvbU9ubHkocmlnaHRTZWF0LCByaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS5naXZlKSxcbiAgICAgICAgZnJvbU9ubHkobGVmdFNlYXQsIGxlZnRTZWF0LmdldFByb3Bvc2FsKCkuZ2l2ZSksXG5cbiAgICAgICAgdG9Pbmx5KGxlZnRTZWF0LCBsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnQpLFxuICAgICAgICB0b09ubHkocmlnaHRTZWF0LCByaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KSxcbiAgICAgIF0pLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxlZnRTZWF0LmZhaWwoZXJyKTtcbiAgICByaWdodFNlYXQuZmFpbChlcnIpO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGxlZnRTZWF0LmV4aXQoKTtcbiAgcmlnaHRTZWF0LmV4aXQoKTtcbiAgcmV0dXJuIGRlZmF1bHRBY2NlcHRhbmNlTXNnO1xufTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uuc3dhcEV4YWN0KHN3YXBFeGFjdCk7XG4gICAgICAgY29uc3QgZml0UHJvcG9zYWxTaGFwZSA9IChzZWF0LCBwcm9wb3NhbFNoYXBlKSA9PlxuICAvL1xuICBtdXN0TWF0Y2goc2VhdC5nZXRQcm9wb3NhbCgpLCBoYXJkZW4ocHJvcG9zYWxTaGFwZSksICdwcm9wb3NhbCcpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmZpdFByb3Bvc2FsU2hhcGUoZml0UHJvcG9zYWxTaGFwZSk7XG4gICAgICAgY29uc3QgYXNzZXJ0UHJvcG9zYWxTaGFwZSA9IChzZWF0LCBleHBlY3RlZCkgPT4ge1xuICBhc3NlcnQudHlwZW9mKGV4cGVjdGVkLCAnb2JqZWN0Jyk7XG4gICFBcnJheS5pc0FycmF5KGV4cGVjdGVkKSB8fCBGYWlsYEV4cGVjdGVkIG11c3QgYmUgYW4gbm9uLWFycmF5IG9iamVjdGA7XG4gIGNvbnN0IGFzc2VydFZhbHVlc051bGwgPSBlID0+IHtcbiAgICBpZiAoZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIE9iamVjdC52YWx1ZXMoZSkpIHtcbiAgICAgICAgdmFsdWUgPT09IG51bGwgfHxcbiAgICAgICAgICBGYWlsYFRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgcmVjb3JkIG11c3QgYmUgbnVsbCBidXQgd2FzICR7dmFsdWV9YDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy9cbiAgLy9cbiAgYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC5naXZlKTtcbiAgYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC53YW50KTtcbiAgYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC5leGl0KTtcblxuICBjb25zdCBhY3R1YWwgPSBzZWF0LmdldFByb3Bvc2FsKCk7XG4gIGNvbnN0IGFzc2VydEtleXMgPSAoYSwgZSkgPT4ge1xuICAgIGlmIChlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGtleUVRKGdldEtleXNTb3J0ZWQoYSksIGdldEtleXNTb3J0ZWQoZSkpIHx8XG4gICAgICAgIEZhaWxgYWN0dWFsICR7YX0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCAke2V9YDtcbiAgICB9XG4gIH07XG4gIGFzc2VydEtleXMoYWN0dWFsLmdpdmUsIGV4cGVjdGVkLmdpdmUpO1xuICBhc3NlcnRLZXlzKGFjdHVhbC53YW50LCBleHBlY3RlZC53YW50KTtcbiAgYXNzZXJ0S2V5cyhhY3R1YWwuZXhpdCwgZXhwZWN0ZWQuZXhpdCk7XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5hc3NlcnRQcm9wb3NhbFNoYXBlKGFzc2VydFByb3Bvc2FsU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydE5hdEFzc2V0S2luZCA9ICh6Y2YsIGJyYW5kKSA9PiB7XG4gIHpjZi5nZXRBc3NldEtpbmQoYnJhbmQpID09PSBBc3NldEtpbmQuTkFUIHx8XG4gICAgRmFpbGBicmFuZCBtdXN0IGJlIEFzc2V0S2luZC5OQVRgO1xufTskaM2PX29uY2UuYXNzZXJ0TmF0QXNzZXRLaW5kKGFzc2VydE5hdEFzc2V0S2luZCk7XG5cbiAgICAgICBjb25zdCBkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyA9IGBEZXBvc2l0IGFuZCByZWFsbG9jYXRpb24gc3VjY2Vzc2Z1bC5gO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKTtcbiAgICAgICBjb25zdCBkZXBvc2l0VG9TZWF0ID0gYXN5bmMgKHpjZiwgcmVjaXBpZW50U2VhdCwgYW1vdW50cywgcGF5bWVudHMpID0+IHtcbiAgIXJlY2lwaWVudFNlYXQuaGFzRXhpdGVkKCkgfHwgRmFpbGBUaGUgcmVjaXBpZW50U2VhdCBjYW5ub3QgaGF2ZSBleGl0ZWQuYDtcblxuICAvL1xuICAvL1xuICBjb25zdCByZWFsbG9jYXRlQWZ0ZXJEZXBvc2l0ID0gdGVtcFNlYXQgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgYXRvbWljVHJhbnNmZXIoemNmLCB0ZW1wU2VhdCwgcmVjaXBpZW50U2VhdCwgYW1vdW50cyk7XG4gICAgdGVtcFNlYXQuZXhpdCgpO1xuICAgIHJldHVybiBkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZztcbiAgfTtcbiAgY29uc3QgaW52aXRhdGlvbiA9IHpjZi5tYWtlSW52aXRhdGlvbihcbiAgICByZWFsbG9jYXRlQWZ0ZXJEZXBvc2l0LFxuICAgICd0ZW1wb3Jhcnkgc2VhdCBmb3IgZGVwb3NpdCcsXG4gICk7XG4gIGNvbnN0IHByb3Bvc2FsID0gaGFyZGVuKHsgZ2l2ZTogYW1vdW50cyB9KTtcbiAgaGFyZGVuKHBheW1lbnRzKTtcbiAgLy9cbiAgLy9cbiAgY29uc3Qgem9lID0gemNmLmdldFpvZVNlcnZpY2UoKTtcbiAgY29uc3QgdGVtcFVzZXJTZWF0ID0gRSh6b2UpLm9mZmVyKGludml0YXRpb24sIHByb3Bvc2FsLCBwYXltZW50cyk7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIHJldHVybiBFKHRlbXBVc2VyU2VhdCkuZ2V0T2ZmZXJSZXN1bHQoKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlcG9zaXRUb1NlYXQoZGVwb3NpdFRvU2VhdCk7XG4gICAgICAgY29uc3Qgd2l0aGRyYXdGcm9tU2VhdCA9IGFzeW5jICh6Y2YsIHNlYXQsIGFtb3VudHMpID0+IHtcbiAgIXNlYXQuaGFzRXhpdGVkKCkgfHwgRmFpbGBUaGUgc2VhdCBjYW5ub3QgaGF2ZSBleGl0ZWQuYDtcbiAgY29uc3QgeyB6Y2ZTZWF0OiB0ZW1wU2VhdCwgdXNlclNlYXQ6IHRlbXBVc2VyU2VhdFAgfSA9IHpjZi5tYWtlRW1wdHlTZWF0S2l0KCk7XG4gIGF0b21pY1RyYW5zZmVyKHpjZiwgc2VhdCwgdGVtcFNlYXQsIGFtb3VudHMpO1xuICB0ZW1wU2VhdC5leGl0KCk7XG4gIHJldHVybiBFKHRlbXBVc2VyU2VhdFApLmdldFBheW91dHMoKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS53aXRoZHJhd0Zyb21TZWF0KHdpdGhkcmF3RnJvbVNlYXQpO1xuICAgICAgIGNvbnN0IHNhdmVBbGxJc3N1ZXJzID0gYXN5bmMgKHpjZiwgaXNzdWVyS2V5d29yZFJlY29yZCA9IGhhcmRlbih7fSkpID0+IHtcbiAgY29uc3QgeyBpc3N1ZXJzIH0gPSB6Y2YuZ2V0VGVybXMoKTtcbiAgY29uc3QgaXNzdWVyc1BTYXZlZCA9IE9iamVjdC5lbnRyaWVzKGlzc3VlcktleXdvcmRSZWNvcmQpLm1hcChcbiAgICAoW2tleXdvcmQsIGlzc3Vlcl0pID0+IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKGlzc3VlcnNba2V5d29yZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gemNmLnNhdmVJc3N1ZXIoaXNzdWVyLCBrZXl3b3JkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGlzc3VlcnNQU2F2ZWQpO1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2Uuc2F2ZUFsbElzc3VlcnMoc2F2ZUFsbElzc3VlcnMpO1xuICAgICAgIGNvbnN0IG1hcEtleXdvcmRzID0gKGtleXdvcmRSZWNvcmQgPSB7fSwga2V5d29yZE1hcHBpbmcpID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBmcm9tVW5pcXVlRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGtleXdvcmRSZWNvcmQpLm1hcCgoW2tleXdvcmQsIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoa2V5d29yZE1hcHBpbmdba2V5d29yZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBba2V5d29yZCwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBba2V5d29yZE1hcHBpbmdba2V5d29yZF0sIHZhbHVlXTtcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG59O1xuLyogICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5tYXBLZXl3b3JkcyhtYXBLZXl3b3Jkcyk7XG5jb25zdCByZXZlcnNlID0gKGtleXdvcmRSZWNvcmQgPSB7fSkgPT4ge1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGZyb21VbmlxdWVFbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoa2V5d29yZFJlY29yZCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFt2YWx1ZSwga2V5XSksXG4gICAgKSxcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG9mZmVyVG8gPSBhc3luYyAoXG4gIHpjZixcbiAgaW52aXRhdGlvbixcbiAga2V5d29yZE1hcHBpbmcsXG4gIHByb3Bvc2FsLFxuICBmcm9tU2VhdCxcbiAgdG9TZWF0LFxuICBvZmZlckFyZ3MsXG4pID0+IHtcbiAgaWYgKGtleXdvcmRNYXBwaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICBrZXl3b3JkTWFwcGluZyA9IGhhcmRlbih7fSk7XG4gIH1cblxuICBjb25zdCBkZWZpbmVkVG9TZWF0ID0gdG9TZWF0ICE9PSB1bmRlZmluZWQgPyB0b1NlYXQgOiBmcm9tU2VhdDtcblxuICBjb25zdCB6b2UgPSB6Y2YuZ2V0Wm9lU2VydmljZSgpO1xuICBjb25zdCBtYXBwaW5nUmV2ZXJzZWQgPSByZXZlcnNlKGtleXdvcmRNYXBwaW5nKTtcblxuICBjb25zdCBuZXdLZXl3b3JkcyA9XG4gICAgcHJvcG9zYWwgIT09IHVuZGVmaW5lZFxuICAgICAgPyBtYXBLZXl3b3Jkcyhwcm9wb3NhbC5naXZlLCBtYXBwaW5nUmV2ZXJzZWQpXG4gICAgICA6IGhhcmRlbih7fSk7XG5cbiAgLy9cbiAgLy9cbiAgY29uc3QgcGF5bWVudHMgPSBhd2FpdCB3aXRoZHJhd0Zyb21TZWF0KHpjZiwgZnJvbVNlYXQsIG5ld0tleXdvcmRzKTtcblxuICAvL1xuICBjb25zdCBwYXltZW50c0Zvck90aGVyQ29udHJhY3QgPSBtYXBLZXl3b3JkcyhwYXltZW50cywga2V5d29yZE1hcHBpbmcpO1xuXG4gIGNvbnN0IHVzZXJTZWF0UHJvbWlzZSA9IEUoem9lKS5vZmZlcihcbiAgICBpbnZpdGF0aW9uLFxuICAgIHByb3Bvc2FsLFxuICAgIHBheW1lbnRzRm9yT3RoZXJDb250cmFjdCxcbiAgICBvZmZlckFyZ3MsXG4gICk7XG5cbiAgY29uc3QgZGVwb3NpdGVkUHJvbWlzZUtpdCA9IG1ha2VQcm9taXNlS2l0KCk7XG5cbiAgY29uc3QgZG9EZXBvc2l0ID0gYXN5bmMgcGF5b3V0UGF5bWVudHMgPT4ge1xuICAgIC8vXG4gICAgY29uc3QgYW1vdW50cyA9IGF3YWl0IEUodXNlclNlYXRQcm9taXNlKS5nZXRGaW5hbEFsbG9jYXRpb24oKTtcblxuICAgIC8vXG4gICAgY29uc3QgbWFwcGVkQW1vdW50cyA9IG1hcEtleXdvcmRzKGFtb3VudHMsIG1hcHBpbmdSZXZlcnNlZCk7XG4gICAgY29uc3QgbWFwcGVkUGF5bWVudHMgPSBtYXBLZXl3b3JkcyhwYXlvdXRQYXltZW50cywgbWFwcGluZ1JldmVyc2VkKTtcbiAgICBhd2FpdCBkZXBvc2l0VG9TZWF0KHpjZiwgZGVmaW5lZFRvU2VhdCwgbWFwcGVkQW1vdW50cywgbWFwcGVkUGF5bWVudHMpO1xuICAgIGRlcG9zaXRlZFByb21pc2VLaXQucmVzb2x2ZShtYXBwZWRBbW91bnRzKTtcbiAgfTtcblxuICB2b2lkIEUodXNlclNlYXRQcm9taXNlKS5nZXRQYXlvdXRzKCkudGhlbihkb0RlcG9zaXQpO1xuXG4gIC8vXG4gIHJldHVybiBoYXJkZW4oeyB1c2VyU2VhdFByb21pc2UsIGRlcG9zaXRlZDogZGVwb3NpdGVkUHJvbWlzZUtpdC5wcm9taXNlIH0pO1xufTskaM2PX29uY2Uub2ZmZXJUbyhvZmZlclRvKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRBY2NlcHRhbmNlTXNnIjpbImRlZmF1bHRBY2NlcHRhbmNlTXNnIl0sImFzc2VydElzc3VlcktleXdvcmRzIjpbImFzc2VydElzc3VlcktleXdvcmRzIl0sInNhdGlzZmllcyI6WyJzYXRpc2ZpZXMiXSwic3dhcCI6WyJzd2FwIl0sInN3YXBFeGFjdCI6WyJzd2FwRXhhY3QiXSwiZml0UHJvcG9zYWxTaGFwZSI6WyJmaXRQcm9wb3NhbFNoYXBlIl0sImFzc2VydFByb3Bvc2FsU2hhcGUiOlsiYXNzZXJ0UHJvcG9zYWxTaGFwZSJdLCJhc3NlcnROYXRBc3NldEtpbmQiOlsiYXNzZXJ0TmF0QXNzZXRLaW5kIl0sImRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnIjpbImRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnIl0sImRlcG9zaXRUb1NlYXQiOlsiZGVwb3NpdFRvU2VhdCJdLCJ3aXRoZHJhd0Zyb21TZWF0IjpbIndpdGhkcmF3RnJvbVNlYXQiXSwic2F2ZUFsbElzc3VlcnMiOlsic2F2ZUFsbElzc3VlcnMiXSwibWFwS2V5d29yZHMiOlsibWFwS2V5d29yZHMiXSwib2ZmZXJUbyI6WyJvZmZlclRvIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIlMHKeRBgAAkQYAACUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9tYWtlSGFuZGxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUhhbmRsZSIsIm1ha2VIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLGluaXRFbXB0eSxtYWtlRXhvLHByZXBhcmVFeG9DbGFzcyxIYW5kbGVJOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLFskaM2PX2EgPT4gKGluaXRFbXB0eSA9ICRozY9fYSldXSxbXCJtYWtlRXhvXCIsWyRozY9fYSA9PiAobWFrZUV4byA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByZXBhcmVFeG9DbGFzc1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiSGFuZGxlSVwiLFskaM2PX2EgPT4gKEhhbmRsZUkgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGVmaW5lRHVyYWJsZUhhbmRsZSA9IChiYWdnYWdlLCBoYW5kbGVUeXBlKSA9PiB7XG4gIHR5cGVvZiBoYW5kbGVUeXBlID09PSAnc3RyaW5nJyB8fCBGYWlsYGhhbmRsZVR5cGUgbXVzdCBiZSBhIHN0cmluZ2A7XG4gIGNvbnN0IG1ha2VIYW5kbGUgPSBwcmVwYXJlRXhvQ2xhc3MoXG4gICAgYmFnZ2FnZSxcbiAgICBgJHtoYW5kbGVUeXBlfUhhbmRsZWAsXG4gICAgSGFuZGxlSSxcbiAgICBpbml0RW1wdHksXG4gICAge30sXG4gICk7XG4gIC8vXG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKG1ha2VIYW5kbGUpO1xufTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUhhbmRsZShkZWZpbmVEdXJhYmxlSGFuZGxlKTtcbmhhcmRlbihkZWZpbmVEdXJhYmxlSGFuZGxlKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlSGFuZGxlID0gaGFuZGxlVHlwZSA9PiB7XG4gIHR5cGVvZiBoYW5kbGVUeXBlID09PSAnc3RyaW5nJyB8fCBGYWlsYGhhbmRsZVR5cGUgbXVzdCBiZSBhIHN0cmluZ2A7XG4gIC8vXG4gIC8vXG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgKi8gKG1ha2VFeG8oYCR7aGFuZGxlVHlwZX1IYW5kbGVgLCBIYW5kbGVJLCB7fSkpO1xufTskaM2PX29uY2UubWFrZUhhbmRsZShtYWtlSGFuZGxlKTtcbmhhcmRlbihtYWtlSGFuZGxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmluZUR1cmFibGVIYW5kbGUiOlsiZGVmaW5lRHVyYWJsZUhhbmRsZSJdLCJtYWtlSGFuZGxlIjpbIm1ha2VIYW5kbGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWJao56dIAACnSAAAJQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3RpbWUiXSwiZXhwb3J0cyI6WyJBZG1pbkZhY2V0SSIsIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSIsIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiLCJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSIsIkJ1bmRsZUNhcFNoYXBlIiwiQnVuZGxlU2hhcGUiLCJFbXB0eVByb3Bvc2FsU2hhcGUiLCJFeGl0T2JqZWN0SSIsIkV4aXRPYmplY3RTaGFwZSIsIkZlZU1pbnRBY2Nlc3NTaGFwZSIsIkZ1bGxQcm9wb3NhbFNoYXBlIiwiSGFuZGxlSSIsIkhhbmRsZU9mZmVySSIsIkluc3RhbGxhdGlvblNoYXBlIiwiSW5zdGFuY2VBZG1pbkkiLCJJbnN0YW5jZUFkbWluU2hhcGUiLCJJbnN0YW5jZUhhbmRsZVNoYXBlIiwiSW5zdGFuY2VSZWNvcmRTaGFwZSIsIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0IiwiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSIsIkludml0YXRpb25IYW5kbGVTaGFwZSIsIkludml0YXRpb25TaGFwZSIsIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSIsIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJSZWNvcmRTaGFwZSIsIktleXdvcmRTaGFwZSIsIk9mZmVySGFuZGxlckkiLCJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSIsIlByaWNlUXVvdGVTaGFwZSIsIlByb3Bvc2FsU2hhcGUiLCJTZWF0RGF0YVNoYXBlIiwiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiLCJTZWF0U2hhcGUiLCJUZXJtc1NoYXBlIiwiVGltZXJTaGFwZSIsIlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlIiwiWm9lTWludEkiLCJab2VNaW50U2hhcGUiLCJab2VTZXJ2aWNlSSIsIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCIsImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIiwiaXNPbkRlbWFuZEV4aXRSdWxlIiwiaXNXYWl2ZWRFeGl0UnVsZSIsIm1ha2VIYW5kbGVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEFtb3VudFNoYXBlLEFzc2V0S2luZFNoYXBlLEJyYW5kU2hhcGUsRGlzcGxheUluZm9TaGFwZSxJc3N1ZXJLaXRTaGFwZSxJc3N1ZXJTaGFwZSxQYXltZW50U2hhcGUsU3Vic2NyaWJlclNoYXBlLE0sVGltZXN0YW1wU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudFNoYXBlXCIsWyRozY9fYSA9PiAoQW1vdW50U2hhcGUgPSAkaM2PX2EpXV0sW1wiQXNzZXRLaW5kU2hhcGVcIixbJGjNj19hID0+IChBc3NldEtpbmRTaGFwZSA9ICRozY9fYSldXSxbXCJCcmFuZFNoYXBlXCIsWyRozY9fYSA9PiAoQnJhbmRTaGFwZSA9ICRozY9fYSldXSxbXCJEaXNwbGF5SW5mb1NoYXBlXCIsWyRozY9fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRozY9fYSldXSxbXCJJc3N1ZXJLaXRTaGFwZVwiLFskaM2PX2EgPT4gKElzc3VlcktpdFNoYXBlID0gJGjNj19hKV1dLFtcIklzc3VlclNoYXBlXCIsWyRozY9fYSA9PiAoSXNzdWVyU2hhcGUgPSAkaM2PX2EpXV0sW1wiUGF5bWVudFNoYXBlXCIsWyRozY9fYSA9PiAoUGF5bWVudFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsWyRozY9fYSA9PiAoU3Vic2NyaWJlclNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8vXG4gICAgICAgY29uc3QgS2V5d29yZFNoYXBlID0gTS5zdHJpbmcoKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLktleXdvcmRTaGFwZShLZXl3b3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IEludml0YXRpb25IYW5kbGVTaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uSGFuZGxlJyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuSW52aXRhdGlvbkhhbmRsZVNoYXBlKEludml0YXRpb25IYW5kbGVTaGFwZSk7XG4gICAgICAgY29uc3QgSW52aXRhdGlvblNoYXBlID0gTS5yZW1vdGFibGUoJ0ludml0YXRpb24nKTskaM2PX29uY2UuSW52aXRhdGlvblNoYXBlKEludml0YXRpb25TaGFwZSk7XG4gICAgICAgY29uc3QgSW5zdGFuY2VIYW5kbGVTaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnN0YW5jZUhhbmRsZScpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuSW5zdGFuY2VIYW5kbGVTaGFwZShJbnN0YW5jZUhhbmRsZVNoYXBlKTtcbiAgICAgICBjb25zdCBJbnN0YWxsYXRpb25TaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKTskaM2PX29uY2UuSW5zdGFsbGF0aW9uU2hhcGUoSW5zdGFsbGF0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IFNlYXRTaGFwZSA9IE0ucmVtb3RhYmxlKCdTZWF0Jyk7JGjNj19vbmNlLlNlYXRTaGFwZShTZWF0U2hhcGUpO1xuXG4gICAgICAgY29uc3QgQW1vdW50S2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsIEFtb3VudFNoYXBlKTskaM2PX29uY2UuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoXG4gIEtleXdvcmRTaGFwZSxcbiAgTS5wYXR0ZXJuKCksXG4pOyRozY9fb25jZS5BbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihcbiAgS2V5d29yZFNoYXBlLFxuICBNLmVyZWYoUGF5bWVudFNoYXBlKSxcbik7JGjNj19vbmNlLlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKEtleXdvcmRTaGFwZSwgSXNzdWVyU2hhcGUpOyRozY9fb25jZS5Jc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihcbiAgS2V5d29yZFNoYXBlLFxuICBNLmVyZWYoSXNzdWVyU2hhcGUpLFxuKTskaM2PX29uY2UuSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZShJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLCBCcmFuZFNoYXBlKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IElzc3VlclJlY29yZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGJyYW5kOiBCcmFuZFNoYXBlLFxuICAgIGlzc3VlcjogSXNzdWVyU2hhcGUsXG4gICAgYXNzZXRLaW5kOiBBc3NldEtpbmRTaGFwZSxcbiAgfSxcbiAgeyBkaXNwbGF5SW5mbzogRGlzcGxheUluZm9TaGFwZSB9LFxuKTskaM2PX29uY2UuSXNzdWVyUmVjb3JkU2hhcGUoSXNzdWVyUmVjb3JkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgVGVybXNTaGFwZSA9IHtcbiAgaXNzdWVyczogSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlLFxuICBicmFuZHM6IEJyYW5kS2V5d29yZFJlY29yZFNoYXBlLFxufTskaM2PX29uY2UuVGVybXNTaGFwZShUZXJtc1NoYXBlKTtcbmhhcmRlbihUZXJtc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IEluc3RhbmNlUmVjb3JkU2hhcGUgPSB7XG4gIGluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uU2hhcGUsXG4gIGluc3RhbmNlOiBJbnN0YW5jZUhhbmRsZVNoYXBlLFxuICB0ZXJtczogTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSxcbn07JGjNj19vbmNlLkluc3RhbmNlUmVjb3JkU2hhcGUoSW5zdGFuY2VSZWNvcmRTaGFwZSk7XG5oYXJkZW4oSW5zdGFuY2VSZWNvcmRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBIYW5kbGVJID0gTS5pbnRlcmZhY2UoJ0hhbmRsZScsIHt9KTskaM2PX29uY2UuSGFuZGxlSShIYW5kbGVJKTtcblxuICAgICAgIGNvbnN0IG1ha2VIYW5kbGVTaGFwZSA9IG5hbWUgPT4gTS5yZW1vdGFibGUoYCR7bmFtZX1IYW5kbGVgKTskaM2PX29uY2UubWFrZUhhbmRsZVNoYXBlKG1ha2VIYW5kbGVTaGFwZSk7XG4gICAgICAgY29uc3QgVGltZXJTaGFwZSA9IG1ha2VIYW5kbGVTaGFwZSgndGltZXInKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5UaW1lclNoYXBlKFRpbWVyU2hhcGUpO1xuICAgICAgIGNvbnN0IEZ1bGxQcm9wb3NhbFNoYXBlID0ge1xuICB3YW50OiBBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlLFxuICBnaXZlOiBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGV4aXQ6IE0uc3BsaXRSZWNvcmQoXG4gICAge30sXG4gICAge1xuICAgICAgb25EZW1hbmQ6IG51bGwsXG4gICAgICB3YWl2ZWQ6IG51bGwsXG4gICAgICBhZnRlckRlYWRsaW5lOiB7XG4gICAgICAgIHRpbWVyOiBNLmVyZWYoVGltZXJTaGFwZSksXG4gICAgICAgIGRlYWRsaW5lOiBUaW1lc3RhbXBTaGFwZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7fSxcbiAgKSxcbn07JGjNj19vbmNlLkZ1bGxQcm9wb3NhbFNoYXBlKEZ1bGxQcm9wb3NhbFNoYXBlKTtcbmhhcmRlbihGdWxsUHJvcG9zYWxTaGFwZSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IFByb3Bvc2FsU2hhcGUgPSBNLnNwbGl0UmVjb3JkKHt9LCBGdWxsUHJvcG9zYWxTaGFwZSwge30pOyRozY9fb25jZS5Qcm9wb3NhbFNoYXBlKFByb3Bvc2FsU2hhcGUpO1xuXG4gICAgICAgY29uc3QgRW1wdHlQcm9wb3NhbFNoYXBlID0gTS5zcGxpdFJlY29yZCh7XG4gIGdpdmU6IHt9LFxuICB3YW50OiB7fSxcbiAgZXhpdDogeyBvbkRlbWFuZDogbnVsbCB9LFxufSk7JGjNj19vbmNlLkVtcHR5UHJvcG9zYWxTaGFwZShFbXB0eVByb3Bvc2FsU2hhcGUpO1xuXG4gICAgICAgY29uc3QgaXNPbkRlbWFuZEV4aXRSdWxlID0gZXhpdCA9PiB7XG4gIGNvbnN0IFtleGl0S2V5XSA9IE9iamVjdC5rZXlzKGV4aXQpO1xuICByZXR1cm4gZXhpdEtleSA9PT0gJ29uRGVtYW5kJztcbn07JGjNj19vbmNlLmlzT25EZW1hbmRFeGl0UnVsZShpc09uRGVtYW5kRXhpdFJ1bGUpO1xuaGFyZGVuKGlzT25EZW1hbmRFeGl0UnVsZSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgaXNXYWl2ZWRFeGl0UnVsZSA9IGV4aXQgPT4ge1xuICBjb25zdCBbZXhpdEtleV0gPSBPYmplY3Qua2V5cyhleGl0KTtcbiAgcmV0dXJuIGV4aXRLZXkgPT09ICd3YWl2ZWQnO1xufTskaM2PX29uY2UuaXNXYWl2ZWRFeGl0UnVsZShpc1dhaXZlZEV4aXRSdWxlKTtcbmhhcmRlbihpc1dhaXZlZEV4aXRSdWxlKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSA9IGV4aXQgPT4ge1xuICBjb25zdCBbZXhpdEtleV0gPSBPYmplY3Qua2V5cyhleGl0KTtcbiAgcmV0dXJuIGV4aXRLZXkgPT09ICdhZnRlckRlYWRsaW5lJztcbn07JGjNj19vbmNlLmlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKTtcbmhhcmRlbihpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBJbnZpdGF0aW9uRWxlbWVudFNoYXBlID0gTS5zcGxpdFJlY29yZCh7XG4gIGRlc2NyaXB0aW9uOiBNLnN0cmluZygpLFxuICBoYW5kbGU6IEludml0YXRpb25IYW5kbGVTaGFwZSxcbiAgaW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG4gIGluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uU2hhcGUsXG59KTskaM2PX29uY2UuSW52aXRhdGlvbkVsZW1lbnRTaGFwZShJbnZpdGF0aW9uRWxlbWVudFNoYXBlKTtcblxuICAgICAgIGNvbnN0IE9mZmVySGFuZGxlckkgPSBNLmludGVyZmFjZSgnT2ZmZXJIYW5kbGVyJywge1xuICBoYW5kbGU6IE0uY2FsbChTZWF0U2hhcGUpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5hbnkoKSksXG59KTskaM2PX29uY2UuT2ZmZXJIYW5kbGVySShPZmZlckhhbmRsZXJJKTtcblxuICAgICAgIGNvbnN0IFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlID0gTS5hcnJheU9mKHtcbiAgc2VhdEhhbmRsZTogU2VhdFNoYXBlLFxuICBhbGxvY2F0aW9uOiBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG59KTskaM2PX29uY2UuU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpO1xuXG4gICAgICAgY29uc3QgWm9lTWludFNoYXBlID0gTS5yZW1vdGFibGUoJ1pvZU1pbnQnKTskaM2PX29uY2UuWm9lTWludFNoYXBlKFpvZU1pbnRTaGFwZSk7XG4gICAgICAgY29uc3QgWm9lTWludEkgPSBNLmludGVyZmFjZSgnWm9lTWludCcsIHtcbiAgZ2V0SXNzdWVyUmVjb3JkOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclJlY29yZFNoYXBlKSxcbiAgbWludEFuZEVzY3JvdzogTS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCksXG4gIHdpdGhkcmF3QW5kQnVybjogTS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCksXG59KTskaM2PX29uY2UuWm9lTWludEkoWm9lTWludEkpO1xuXG4gICAgICAgY29uc3QgRmVlTWludEFjY2Vzc1NoYXBlID0gTS5yZW1vdGFibGUoJ0ZlZU1pbnRBY2Nlc3MnKTskaM2PX29uY2UuRmVlTWludEFjY2Vzc1NoYXBlKEZlZU1pbnRBY2Nlc3NTaGFwZSk7XG5cbiAgICAgICBjb25zdCBFeGl0T2JqZWN0SSA9IE0uaW50ZXJmYWNlKCdFeGl0IE9iamVjdCcsIHtcbiAgZXhpdDogTS5jYWxsKCkucmV0dXJucygpLFxufSk7JGjNj19vbmNlLkV4aXRPYmplY3RJKEV4aXRPYmplY3RJKTtcblxuICAgICAgIGNvbnN0IEV4aXRPYmplY3RTaGFwZSA9IE0ucmVtb3RhYmxlKCdFeGl0T2JqJyk7JGjNj19vbmNlLkV4aXRPYmplY3RTaGFwZShFeGl0T2JqZWN0U2hhcGUpO1xuICAgICAgIGNvbnN0IEluc3RhbmNlQWRtaW5TaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnN0YW5jZUFkbWluJyk7JGjNj19vbmNlLkluc3RhbmNlQWRtaW5TaGFwZShJbnN0YW5jZUFkbWluU2hhcGUpO1xuICAgICAgIGNvbnN0IEluc3RhbmNlQWRtaW5JID0gTS5pbnRlcmZhY2UoJ0luc3RhbmNlQWRtaW4nLCB7XG4gIG1ha2VJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLCBNLnN0cmluZygpKVxuICAgIC5vcHRpb25hbChNLnJlY29yZCgpLCBNLnBhdHRlcm4oKSlcbiAgICAucmV0dXJucyhJbnZpdGF0aW9uU2hhcGUpLFxuICBzYXZlSXNzdWVyOiBNLmNhbGxXaGVuKE0uYXdhaXQoSXNzdWVyU2hhcGUpLCBLZXl3b3JkU2hhcGUpLnJldHVybnMoXG4gICAgSXNzdWVyUmVjb3JkU2hhcGUsXG4gICksXG4gIG1ha2VOb0VzY3Jvd1NlYXQ6IE0uY2FsbChcbiAgICBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICAgUHJvcG9zYWxTaGFwZSxcbiAgICBFeGl0T2JqZWN0U2hhcGUsXG4gICAgU2VhdFNoYXBlLFxuICApLnJldHVybnMoU2VhdFNoYXBlKSxcbiAgZXhpdEFsbFNlYXRzOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBmYWlsQWxsU2VhdHM6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gIGV4aXRTZWF0OiBNLmNhbGwoU2VhdFNoYXBlLCBNLmFueSgpKS5yZXR1cm5zKCksXG4gIGZhaWxTZWF0OiBNLmNhbGwoU2VhdFNoYXBlLCBNLmFueSgpKS5yZXR1cm5zKCksXG4gIG1ha2Vab2VNaW50OiBNLmNhbGwoS2V5d29yZFNoYXBlKVxuICAgIC5vcHRpb25hbChcbiAgICAgIEFzc2V0S2luZFNoYXBlLFxuICAgICAgRGlzcGxheUluZm9TaGFwZSxcbiAgICAgIE0uc3BsaXRSZWNvcmQoe30sIHsgZWxlbWVudFNoYXBlOiBNLnBhdHRlcm4oKSB9KSxcbiAgICApXG4gICAgLnJldHVybnMoTS5yZW1vdGFibGUoJ3pvZU1pbnQnKSksXG4gIHJlZ2lzdGVyRmVlTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSwgRmVlTWludEFjY2Vzc1NoYXBlKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdmZWVNaW50JyksXG4gICksXG4gIHJlcGxhY2VBbGxvY2F0aW9uczogTS5jYWxsKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKS5yZXR1cm5zKCksXG4gIHN0b3BBY2NlcHRpbmdPZmZlcnM6IE0uY2FsbCgpLnJldHVybnMoKSxcbiAgc2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbChNLmFycmF5T2YoTS5zdHJpbmcoKSkpLnJldHVybnMoKSxcbiAgZ2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbiAgZ2V0RXhpdFN1YnNjcmliZXI6IE0uY2FsbChTZWF0U2hhcGUpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbiAgaXNCbG9ja2VkOiBNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gIHJlcGFpckNvbnRyYWN0Q29tcGxldGlvbldhdGNoZXI6IE0uY2FsbCgpLnJldHVybnMoKSxcbn0pOyRozY9fb25jZS5JbnN0YW5jZUFkbWluSShJbnN0YW5jZUFkbWluSSk7XG5cbiAgICAgICBjb25zdCBJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCA9IHtcbiAgaW5zdGFuY2VTdG9yYWdlTWFuYWdlcjogTS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXInLCB7XG4gICAgZ2V0VGVybXM6IE0uY2FsbCgpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG4gICAgZ2V0SXNzdWVyczogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuICAgIGdldEJyYW5kczogTS5jYWxsKCkucmV0dXJucyhCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgZ2V0SW5zdGFsbGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbGxhdGlvblNoYXBlKSxcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuICAgIHNhdmVJc3N1ZXI6IE0uY2FsbChJc3N1ZXJTaGFwZSwgS2V5d29yZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBtYWtlWm9lTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSlcbiAgICAgIC5vcHRpb25hbChcbiAgICAgICAgQXNzZXRLaW5kU2hhcGUsXG4gICAgICAgIERpc3BsYXlJbmZvU2hhcGUsXG4gICAgICAgIE0uc3BsaXRSZWNvcmQoe30sIHsgZWxlbWVudFNoYXBlOiBNLnBhdHRlcm4oKSB9KSxcbiAgICAgIClcbiAgICAgIC5yZXR1cm5zKE0uZXJlZihab2VNaW50U2hhcGUpKSxcbiAgICByZWdpc3RlckZlZU1pbnQ6IE0uY2FsbChLZXl3b3JkU2hhcGUsIEZlZU1pbnRBY2Nlc3NTaGFwZSkucmV0dXJucyhcbiAgICAgIE0ucmVtb3RhYmxlKCdmZWVNaW50JyksXG4gICAgKSxcbiAgICBnZXRJbnN0YW5jZVJlY29yZDogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZVJlY29yZFNoYXBlKSxcbiAgICBnZXRJc3N1ZXJSZWNvcmRzOiBNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihJc3N1ZXJSZWNvcmRTaGFwZSkpLFxuICAgIGdldFdpdGhkcmF3RmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ1dpdGhkcmF3RmFjZXQnKSksXG4gICAgaW5pdEluc3RhbmNlQWRtaW46IE0uY2FsbChcbiAgICAgIEluc3RhbmNlSGFuZGxlU2hhcGUsXG4gICAgICBNLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpLFxuICAgICkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgZGVsZXRlSW5zdGFuY2VBZG1pbjogTS5jYWxsKEluc3RhbmNlQWRtaW5TaGFwZSkucmV0dXJucygpLFxuICAgIG1ha2VJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLCBNLnN0cmluZygpKVxuICAgICAgLm9wdGlvbmFsKE0ucmVjb3JkKCksIE0ucGF0dGVybigpKVxuICAgICAgLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbiAgICBnZXRSb290OiBNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuICAgIGdldEFkbWluTm9kZTogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnYWRtaW5Ob2RlJykpLFxuICB9KSxcbiAgd2l0aGRyYXdGYWNldDogTS5pbnRlcmZhY2UoJ1dpdGhkcmF3RmFjZXQnLCB7XG4gICAgd2l0aGRyYXdQYXltZW50czogTS5jYWxsKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcbiAgICAgIFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlLFxuICAgICksXG4gIH0pLFxuICBoZWxwZXJzOiBNLmludGVyZmFjZSgnSW5zdGFuY2VTdG9yYWdlTWFuYWdlciBoZWxwZXInLCB7XG4gICAgd3JhcElzc3VlcktpdFdpdGhab2VNaW50OiBNLmNhbGwoXG4gICAgICBLZXl3b3JkU2hhcGUsXG4gICAgICBJc3N1ZXJLaXRTaGFwZSxcbiAgICAgIE0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKSxcbiAgICApLnJldHVybnMoWm9lTWludFNoYXBlKSxcbiAgfSksXG59OyRozY9fb25jZS5JbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdChJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5oYXJkZW4oSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuXG4gICAgICAgY29uc3QgQnVuZGxlQ2FwU2hhcGUgPSBNLnJlbW90YWJsZSgnYnVuZGxlQ2FwJyk7JGjNj19vbmNlLkJ1bmRsZUNhcFNoYXBlKEJ1bmRsZUNhcFNoYXBlKTtcbiAgICAgICBjb25zdCBCdW5kbGVTaGFwZSA9IE0uYW5kKFxuICBNLnNwbGl0UmVjb3JkKHsgbW9kdWxlRm9ybWF0OiBNLmFueSgpIH0pLFxuICBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0uc3RyaW5nKHsgc3RyaW5nTGVuZ3RoTGltaXQ6IEluZmluaXR5IH0pKSxcbik7JGjNj19vbmNlLkJ1bmRsZVNoYXBlKEJ1bmRsZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAgeyBpbnN0YWxsYXRpb246IEluc3RhbGxhdGlvblNoYXBlIH0sXG4gIHtcbiAgICBidW5kbGU6IE0ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5zdHJpbmcoeyBzdHJpbmdMZW5ndGhMaW1pdDogSW5maW5pdHkgfSkpLFxuICAgIGJ1bmRsZUNhcDogQnVuZGxlQ2FwU2hhcGUsXG4gICAgYnVuZGxlSUQ6IE0uc3RyaW5nKCksXG4gIH0sXG4gIHt9LFxuKTskaM2PX29uY2UuVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUoVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgWm9lU3RvcmFnZU1hbmFnZXJJS2l0ID0ge1xuICB6b2VTZXJ2aWNlRGF0YUFjY2VzczogTS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UgZGF0YUFjY2VzcycsIHtcbiAgICBnZXRUZXJtczogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG4gICAgZ2V0SXNzdWVyczogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbiAgICBnZXRCcmFuZHM6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbiAgICBnZXRJbnN0YWxsYXRpb246IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSksXG4gICAgKSxcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuICAgIGdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjogTS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5lcmVmKE0uc3RyaW5nKCkpLFxuICAgICksXG4gICAgaW5zdGFsbEJ1bmRsZTogTS5jYWxsKEJ1bmRsZVNoYXBlKVxuICAgICAgLm9wdGlvbmFsKE0uc3RyaW5nKCkpXG4gICAgICAucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgaW5zdGFsbEJ1bmRsZUlEOiBNLmNhbGwoTS5zdHJpbmcoKSlcbiAgICAgIC5vcHRpb25hbChNLnN0cmluZygpKVxuICAgICAgLnJldHVybnMoTS5wcm9taXNlKCkpLFxuXG4gICAgZ2V0UHVibGljRmFjZXQ6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5lcmVmKE0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpKSxcbiAgICApLFxuICAgIGdldE9mZmVyRmlsdGVyOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuICAgIGdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5vcHQoTS5wYXR0ZXJuKCkpLFxuICAgICksXG4gIH0pLFxuICBtYWtlT2ZmZXJBY2Nlc3M6IE0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIG1ha2VPZmZlciBhY2Nlc3MnLCB7XG4gICAgZ2V0QXNzZXRLaW5kQnlCcmFuZDogTS5jYWxsKEJyYW5kU2hhcGUpLnJldHVybnMoQXNzZXRLaW5kU2hhcGUpLFxuICAgIGdldEluc3RhbmNlQWRtaW46IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKSxcbiAgICApLFxuICAgIGdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5vcHQoTS5wYXR0ZXJuKCkpLFxuICAgICksXG4gICAgZ2V0SW52aXRhdGlvbklzc3VlcjogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG4gICAgZGVwb3NpdFBheW1lbnRzOiBNLmNhbGwoUHJvcG9zYWxTaGFwZSwgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG4gICAgICBNLnByb21pc2UoKSxcbiAgICApLFxuICB9KSxcbiAgc3RhcnRJbnN0YW5jZUFjY2VzczogTS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2Ugc3RhcnRJbnN0YW5jZSBhY2Nlc3MnLCB7XG4gICAgbWFrZVpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXI6IE0uY2FsbChcbiAgICAgIEluc3RhbGxhdGlvblNoYXBlLFxuICAgICAgTS5hbnkoKSxcbiAgICAgIElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICAgICBJbnN0YW5jZUhhbmRsZVNoYXBlLFxuICAgICAgTS5vcihCdW5kbGVDYXBTaGFwZSwgQnVuZGxlU2hhcGUpLFxuICAgICAgTS5zdHJpbmcoKSxcbiAgICApLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIHVud3JhcEluc3RhbGxhdGlvbjogTS5jYWxsV2hlbihNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKFxuICAgICAgVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUsXG4gICAgKSxcbiAgfSksXG4gIGludml0YXRpb25Jc3N1ZXJBY2Nlc3M6IE0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIGludml0YXRpb25Jc3N1ZXInLCB7XG4gICAgZ2V0SW52aXRhdGlvbklzc3VlcjogTS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG4gIH0pLFxufTskaM2PX29uY2UuWm9lU3RvcmFnZU1hbmFnZXJJS2l0KFpvZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5oYXJkZW4oWm9lU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuICAgICAgIGNvbnN0IFpvZVNlcnZpY2VJID0gTS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UnLCB7XG4gIGluc3RhbGw6IE0uY2FsbChNLmFueSgpKS5vcHRpb25hbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgaW5zdGFsbEJ1bmRsZUlEOiBNLmNhbGwoTS5zdHJpbmcoKSkub3B0aW9uYWwoTS5zdHJpbmcoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHN0YXJ0SW5zdGFuY2U6IE0uY2FsbChNLmVyZWYoSW5zdGFsbGF0aW9uU2hhcGUpKVxuICAgIC5vcHRpb25hbChJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLCBNLnJlY29yZCgpLCBNLnJlY29yZCgpLCBNLnN0cmluZygpKVxuICAgIC5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgb2ZmZXI6IE0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSlcbiAgICAub3B0aW9uYWwoUHJvcG9zYWxTaGFwZSwgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUsIE0uYW55KCkpXG4gICAgLnJldHVybnMoTS5wcm9taXNlKCkpLFxuXG4gIGdldE9mZmVyRmlsdGVyOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgTS5hcnJheU9mKE0uc3RyaW5nKCkpLFxuICApLFxuICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0RmVlSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0QnJhbmRzOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICksXG4gIGdldElzc3VlcnM6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICksXG4gIGdldFB1YmxpY0ZhY2V0OiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JyksXG4gICksXG4gIGdldFRlcm1zOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG4gIGdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG4gICAgTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSksXG4gICksXG4gIGdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbjogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbGxhdGlvblNoYXBlKSkucmV0dXJucyhcbiAgICBNLmVyZWYoTS5zdHJpbmcoKSksXG4gICksXG5cbiAgZ2V0SW5zdGFsbGF0aW9uOiBNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRJbnN0YW5jZTogTS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0Q29uZmlndXJhdGlvbjogTS5jYWxsKCkucmV0dXJucyh7XG4gICAgZmVlSXNzdWVyQ29uZmlnOiB7XG4gICAgICBuYW1lOiBNLnN0cmluZygpLFxuICAgICAgYXNzZXRLaW5kOiAnbmF0JyxcbiAgICAgIGRpc3BsYXlJbmZvOiBEaXNwbGF5SW5mb1NoYXBlLFxuICAgIH0sXG4gIH0pLFxuICBnZXRJbnZpdGF0aW9uRGV0YWlsczogTS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuICBnZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbiAgICBNLm9wdChNLnBhdHRlcm4oKSksXG4gICksXG59KTskaM2PX29uY2UuWm9lU2VydmljZUkoWm9lU2VydmljZUkpO1xuXG4gICAgICAgY29uc3QgQWRtaW5GYWNldEkgPSBNLmludGVyZmFjZSgnWmNmQWRtaW5GYWNldCcsIHtcbiAgZ2V0VmF0U2h1dGRvd25Qcm9taXNlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgcmVzdGFydENvbnRyYWN0OiBNLmNhbGwoKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgdXBncmFkZUNvbnRyYWN0OiBNLmNhbGwoTS5zdHJpbmcoKSkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHRlcm1pbmF0ZUNvbnRyYWN0OiBNLmNhbGwoTS5lcnJvcigpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn0pOyRozY9fb25jZS5BZG1pbkZhY2V0SShBZG1pbkZhY2V0SSk7XG5cbiAgICAgICBjb25zdCBTZWF0RGF0YVNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIHByb3Bvc2FsOiBQcm9wb3NhbFNoYXBlLFxuICAgIGluaXRpYWxBbGxvY2F0aW9uOiBBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICAgc2VhdEhhbmRsZTogU2VhdFNoYXBlLFxuICB9LFxuICB7XG4gICAgb2ZmZXJBcmdzOiBNLmFueSgpLFxuICB9LFxuKTskaM2PX29uY2UuU2VhdERhdGFTaGFwZShTZWF0RGF0YVNoYXBlKTtcblxuICAgICAgIGNvbnN0IEhhbmRsZU9mZmVySSA9IE0uaW50ZXJmYWNlKCdIYW5kbGVPZmZlcicsIHtcbiAgaGFuZGxlT2ZmZXI6IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsIFNlYXREYXRhU2hhcGUpLnJldHVybnMoe1xuICAgIG9mZmVyUmVzdWx0UHJvbWlzZTogTS5wcm9taXNlKCksXG4gICAgZXhpdE9iajogRXhpdE9iamVjdFNoYXBlLFxuICB9KSxcbn0pOyRozY9fb25jZS5IYW5kbGVPZmZlckkoSGFuZGxlT2ZmZXJJKTtcblxuICAgICAgIGNvbnN0IFByaWNlUXVvdGVTaGFwZSA9IHtcbiAgcXVvdGVBbW91bnQ6IEFtb3VudFNoYXBlLFxuICBxdW90ZVBheW1lbnQ6IE0uZXJlZihQYXltZW50U2hhcGUpLFxufTskaM2PX29uY2UuUHJpY2VRdW90ZVNoYXBlKFByaWNlUXVvdGVTaGFwZSk7XG5oYXJkZW4oUHJpY2VRdW90ZVNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IktleXdvcmRTaGFwZSI6WyJLZXl3b3JkU2hhcGUiXSwiSW52aXRhdGlvbkhhbmRsZVNoYXBlIjpbIkludml0YXRpb25IYW5kbGVTaGFwZSJdLCJJbnZpdGF0aW9uU2hhcGUiOlsiSW52aXRhdGlvblNoYXBlIl0sIkluc3RhbmNlSGFuZGxlU2hhcGUiOlsiSW5zdGFuY2VIYW5kbGVTaGFwZSJdLCJJbnN0YWxsYXRpb25TaGFwZSI6WyJJbnN0YWxsYXRpb25TaGFwZSJdLCJTZWF0U2hhcGUiOlsiU2VhdFNoYXBlIl0sIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSI6WyJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiXSwiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSI6WyJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIl0sIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIjpbIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSI6WyJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIl0sIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIjpbIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclJlY29yZFNoYXBlIjpbIklzc3VlclJlY29yZFNoYXBlIl0sIlRlcm1zU2hhcGUiOlsiVGVybXNTaGFwZSJdLCJJbnN0YW5jZVJlY29yZFNoYXBlIjpbIkluc3RhbmNlUmVjb3JkU2hhcGUiXSwiSGFuZGxlSSI6WyJIYW5kbGVJIl0sIm1ha2VIYW5kbGVTaGFwZSI6WyJtYWtlSGFuZGxlU2hhcGUiXSwiVGltZXJTaGFwZSI6WyJUaW1lclNoYXBlIl0sIkZ1bGxQcm9wb3NhbFNoYXBlIjpbIkZ1bGxQcm9wb3NhbFNoYXBlIl0sIlByb3Bvc2FsU2hhcGUiOlsiUHJvcG9zYWxTaGFwZSJdLCJFbXB0eVByb3Bvc2FsU2hhcGUiOlsiRW1wdHlQcm9wb3NhbFNoYXBlIl0sImlzT25EZW1hbmRFeGl0UnVsZSI6WyJpc09uRGVtYW5kRXhpdFJ1bGUiXSwiaXNXYWl2ZWRFeGl0UnVsZSI6WyJpc1dhaXZlZEV4aXRSdWxlIl0sImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIjpbImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIl0sIkludml0YXRpb25FbGVtZW50U2hhcGUiOlsiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSJdLCJPZmZlckhhbmRsZXJJIjpbIk9mZmVySGFuZGxlckkiXSwiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiOlsiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiXSwiWm9lTWludFNoYXBlIjpbIlpvZU1pbnRTaGFwZSJdLCJab2VNaW50SSI6WyJab2VNaW50SSJdLCJGZWVNaW50QWNjZXNzU2hhcGUiOlsiRmVlTWludEFjY2Vzc1NoYXBlIl0sIkV4aXRPYmplY3RJIjpbIkV4aXRPYmplY3RJIl0sIkV4aXRPYmplY3RTaGFwZSI6WyJFeGl0T2JqZWN0U2hhcGUiXSwiSW5zdGFuY2VBZG1pblNoYXBlIjpbIkluc3RhbmNlQWRtaW5TaGFwZSJdLCJJbnN0YW5jZUFkbWluSSI6WyJJbnN0YW5jZUFkbWluSSJdLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJCdW5kbGVDYXBTaGFwZSI6WyJCdW5kbGVDYXBTaGFwZSJdLCJCdW5kbGVTaGFwZSI6WyJCdW5kbGVTaGFwZSJdLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSI6WyJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSJdLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiWm9lU3RvcmFnZU1hbmFnZXJJS2l0Il0sIlpvZVNlcnZpY2VJIjpbIlpvZVNlcnZpY2VJIl0sIkFkbWluRmFjZXRJIjpbIkFkbWluRmFjZXRJIl0sIlNlYXREYXRhU2hhcGUiOlsiU2VhdERhdGFTaGFwZSJdLCJIYW5kbGVPZmZlckkiOlsiSGFuZGxlT2ZmZXJJIl0sIlByaWNlUXVvdGVTaGFwZSI6WyJQcmljZVF1b3RlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2fSTtJYBAACWAQAAHgAAAEBhZ29yaWMvem9uZS12MC4yLjIvZHVyYWJsZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9kdXJhYmxlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZHVyYWJsZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9kdXJhYmxlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACJbYPjnEQAA5xEAACIAAABAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9kdXJhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9iYXNlLXpvbmUiXSwiZXhwb3J0cyI6WyJtYWtlRHVyYWJsZVpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEZhcixpc1Bhc3NhYmxlLGNhbkJlRHVyYWJsZSxtYWtlU2NhbGFyTWFwU3RvcmUscHJlcGFyZUV4byxwcmVwYXJlRXhvQ2xhc3MscHJlcGFyZUV4b0NsYXNzS2l0LHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUscHJvdmlkZUR1cmFibGVTZXRTdG9yZSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSx3YXRjaFByb21pc2Usa2V5cyxtYWtlT25jZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiaXNQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGlzUGFzc2FibGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIixbJGjNj19hID0+IChjYW5CZUR1cmFibGUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9cIixbJGjNj19hID0+IChwcmVwYXJlRXhvID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVNYXBTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVTZXRTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlID0gJGjNj19hKV1dLFtcIndhdGNoUHJvbWlzZVwiLFskaM2PX2EgPT4gKHdhdGNoUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvYmFzZS16b25lXCIsIFtbXCJhZ29yaWNWYXREYXRhS2V5c1wiLFskaM2PX2EgPT4gKGtleXMgPSAkaM2PX2EpXV0sW1wibWFrZU9uY2VLaXRcIixbJGjNj19hID0+IChtYWtlT25jZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgaXNTdG9yYWJsZSA9IHNwZWNpbWVuID0+IGlzUGFzc2FibGUoc3BlY2ltZW4pICYmIGNhbkJlRHVyYWJsZShzcGVjaW1lbik7XG5oYXJkZW4oaXNTdG9yYWJsZSk7XG5cbi8qXG5cbiAqL1xuY29uc3QgYXR0YWNoRHVyYWJsZVN0b3JlcyA9IGdldEJhZ2dhZ2UgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hcFN0b3JlID0gKGxhYmVsLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgYmFnZ2FnZSA9IGdldEJhZ2dhZ2UoKTtcbiAgICBjb25zdCByZXQgPSBwcm92aWRlRHVyYWJsZU1hcFN0b3JlKGJhZ2dhZ2UsIGxhYmVsLCBvcHRpb25zKTtcbiAgICByZXR1cm4gcmV0O1xuICB9O1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHNldFN0b3JlID0gKGxhYmVsLCBvcHRpb25zKSA9PlxuICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUoZ2V0QmFnZ2FnZSgpLCBsYWJlbCwgb3B0aW9ucyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHdlYWtTZXRTdG9yZSA9IChsYWJlbCwgb3B0aW9ucykgPT5cbiAgICBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZShnZXRCYWdnYWdlKCksIGxhYmVsLCBvcHRpb25zKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgd2Vha01hcFN0b3JlID0gKGxhYmVsLCBvcHRpb25zKSA9PlxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKGdldEJhZ2dhZ2UoKSwgbGFiZWwsIG9wdGlvbnMpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICByZXR1cm4gRmFyKCdkdXJhYmxlU3RvcmVzJywge1xuICAgIGRldGFjaGVkOiAoKSA9PiBkZXRhY2hlZER1cmFibGVTdG9yZXMsXG4gICAgaXNTdG9yYWJsZSxcbiAgICBtYXBTdG9yZSxcbiAgICBzZXRTdG9yZSxcbiAgICB3ZWFrTWFwU3RvcmUsXG4gICAgd2Vha1NldFN0b3JlLFxuICB9KTtcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGV0YWNoZWREdXJhYmxlU3RvcmVzID0gYXR0YWNoRHVyYWJsZVN0b3JlcygoKSA9PlxuICBtYWtlU2NhbGFyTWFwU3RvcmUoJ2RldGFjaGVkJyksXG4pO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEdXJhYmxlWm9uZSA9IChiYWdnYWdlLCBiYXNlTGFiZWwgPSAnZHVyYWJsZVpvbmUnKSA9PiB7XG4gIGJhZ2dhZ2UgfHwgRmFpbGBiYWdnYWdlIHJlcXVpcmVkYDtcblxuICBjb25zdCBhdHRhY2hlZFN0b3JlcyA9IGF0dGFjaER1cmFibGVTdG9yZXMoKCkgPT4gYmFnZ2FnZSk7XG5cbiAgY29uc3QgeyBtYWtlT25jZSwgd3JhcFByb3ZpZGVyIH0gPSBtYWtlT25jZUtpdChcbiAgICBiYXNlTGFiZWwsXG4gICAgYXR0YWNoZWRTdG9yZXMsXG4gICAgYmFnZ2FnZSxcbiAgKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGV4b0NsYXNzID0gKC4uLmFyZ3MpID0+IHByZXBhcmVFeG9DbGFzcyhiYWdnYWdlLCAuLi5hcmdzKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvL1xuICAvL1xuICBjb25zdCBleG9DbGFzc0tpdCA9ICguLi5hcmdzKSA9PiBwcmVwYXJlRXhvQ2xhc3NLaXQoYmFnZ2FnZSwgLi4uYXJncyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGV4byA9ICguLi5hcmdzKSA9PiBwcmVwYXJlRXhvKGJhZ2dhZ2UsIC4uLmFyZ3MpO1xuXG4gIGNvbnN0IHN1YlpvbmVTdG9yZSA9IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5tYXBTdG9yZSwga2V5cy56b25lKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3ViWm9uZSA9IChsYWJlbCwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBzdWJCYWdnYWdlID0gc3ViWm9uZVN0b3JlKGxhYmVsLCBvcHRpb25zKTtcbiAgICByZXR1cm4gbWFrZUR1cmFibGVab25lKHN1YkJhZ2dhZ2UsIGAke2Jhc2VMYWJlbH0uJHtsYWJlbH1gKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKCdkdXJhYmxlWm9uZScsIHtcbiAgICBleG86IHdyYXBQcm92aWRlcihleG8sIGtleXMuZXhvKSxcbiAgICBleG9DbGFzczogd3JhcFByb3ZpZGVyKGV4b0NsYXNzLCBrZXlzLmV4b0NsYXNzKSxcbiAgICBleG9DbGFzc0tpdDogd3JhcFByb3ZpZGVyKGV4b0NsYXNzS2l0LCBrZXlzLmV4b0NsYXNzS2l0KSxcbiAgICBzdWJab25lLFxuXG4gICAgbWFrZU9uY2UsXG4gICAgd2F0Y2hQcm9taXNlLFxuICAgIGRldGFjaGVkOiBhdHRhY2hlZFN0b3Jlcy5kZXRhY2hlZCxcbiAgICBpc1N0b3JhYmxlOiBhdHRhY2hlZFN0b3Jlcy5pc1N0b3JhYmxlLFxuXG4gICAgbWFwU3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5tYXBTdG9yZSwga2V5cy5zdG9yZSksXG4gICAgc2V0U3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5zZXRTdG9yZSwga2V5cy5zdG9yZSksXG4gICAgd2Vha01hcFN0b3JlOiB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMud2Vha01hcFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgICB3ZWFrU2V0U3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy53ZWFrU2V0U3RvcmUsIGtleXMuc3RvcmUpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VEdXJhYmxlWm9uZShtYWtlRHVyYWJsZVpvbmUpO1xuaGFyZGVuKG1ha2VEdXJhYmxlWm9uZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRHVyYWJsZVpvbmUiOlsibWFrZUR1cmFibGVab25lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOjHgXswBQAAMAUAACwAAABAZW5kby9jb21tb24tdjEuMi4xMy9hcHBseS1sYWJlbGluZy1lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Rocm93LWxhYmVsZWQuanMiXSwiZXhwb3J0cyI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLGlzUHJvbWlzZSx0aHJvd0xhYmVsZWQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3Rocm93LWxhYmVsZWQuanNcIiwgW1tcInRocm93TGFiZWxlZFwiLFskaM2PX2EgPT4gKHRocm93TGFiZWxlZCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhcHBseUxhYmVsaW5nRXJyb3IgPSAoZnVuYywgYXJncywgbGFiZWwgPSB1bmRlZmluZWQpID0+IHtcbiAgaWYgKGxhYmVsID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZnVuYyguLi5hcmdzKTtcbiAgfVxuICBsZXQgcmVzdWx0O1xuICB0cnkge1xuICAgIHJlc3VsdCA9IGZ1bmMoLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93TGFiZWxlZChlcnIsIGxhYmVsKTtcbiAgfVxuICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gRS53aGVuKHJlc3VsdCwgdW5kZWZpbmVkLCByZWFzb24gPT4gdGhyb3dMYWJlbGVkKHJlYXNvbiwgbGFiZWwpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59OyRozY9fb25jZS5hcHBseUxhYmVsaW5nRXJyb3IoYXBwbHlMYWJlbGluZ0Vycm9yKTtcbmhhcmRlbihhcHBseUxhYmVsaW5nRXJyb3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABZyIR/pQQAAKUEAAArAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvZnJvbS11bmlxdWUtZW50cmllcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGZyb21VbmlxdWVFbnRyaWVzID0gYWxsRW50cmllcyA9PiB7XG4gIGNvbnN0IGVudHJpZXNBcnJheSA9IFsuLi5hbGxFbnRyaWVzXTtcbiAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuICBpZiAob3duS2V5cyhyZXN1bHQpLmxlbmd0aCA9PT0gZW50cmllc0FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KCk7XG4gIGZvciAoY29uc3QgW25hbWUsIF9dIG9mIGVudHJpZXNBcnJheSkge1xuICAgIGlmIChuYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgIEZhaWxgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiAgICB9XG4gICAgbmFtZXMuYWRkKG5hbWUpO1xuICB9XG4gIHRocm93IEZhaWxgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xufTskaM2PX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImZyb21VbmlxdWVFbnRyaWVzIjpbImZyb21VbmlxdWVFbnRyaWVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANRN/zdKAgAASgIAACUAAABAZW5kby9jb21tb24tdjEuMi4xMy9pZGVudC1jaGVja2VyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpZGVudENoZWNrZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cbi8vXG4vL1xuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlkZW50Q2hlY2tlciA9IChjb25kLCBfZGV0YWlscykgPT4gY29uZDskaM2PX29uY2UuaWRlbnRDaGVja2VyKGlkZW50Q2hlY2tlcik7XG5oYXJkZW4oaWRlbnRDaGVja2VyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlkZW50Q2hlY2tlciI6WyJpZGVudENoZWNrZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiteXQ5ACAACQAgAAJwAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL2xpc3QtZGlmZmVyZW5jZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibGlzdERpZmZlcmVuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGxpc3REaWZmZXJlbmNlID0gKGxlZnRMaXN0LCByaWdodExpc3QpID0+IHtcbiAgY29uc3QgcmlnaHRTZXQgPSBuZXcgU2V0KHJpZ2h0TGlzdCk7XG4gIHJldHVybiBsZWZ0TGlzdC5maWx0ZXIoZWxlbWVudCA9PiAhcmlnaHRTZXQuaGFzKGVsZW1lbnQpKTtcbn07JGjNj19vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJsaXN0RGlmZmVyZW5jZSI6WyJsaXN0RGlmZmVyZW5jZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAulJoOtAMAALQDAAArAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvbWFrZS1hcnJheS1pdGVyYXRvci5qc3siaW1wb3J0cyI6WyIuL21ha2UtaXRlcmF0b3IuanMiXSwiZXhwb3J0cyI6WyJtYWtlQXJyYXlJdGVyYXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VJdGVyYXRvcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFrZS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUl0ZXJhdG9yXCIsWyRozY9fYSA9PiAobWFrZUl0ZXJhdG9yID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQXJyYXlJdGVyYXRvciA9IGFyciA9PiB7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBhcnI7XG4gIGxldCBpID0gMDtcbiAgcmV0dXJuIG1ha2VJdGVyYXRvcigoKSA9PiB7XG4gICAgLyogICAgICAgICAgICAqL1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgdmFsdWUgPSBhcnJbaV07XG4gICAgICBpICs9IDE7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pO1xuICAgIH1cbiAgICAvL1xuICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZSB9KTtcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQXJyYXlJdGVyYXRvcihtYWtlQXJyYXlJdGVyYXRvcik7XG5oYXJkZW4obWFrZUFycmF5SXRlcmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFycmF5SXRlcmF0b3IiOlsibWFrZUFycmF5SXRlcmF0b3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABavNqFwCAABcAgAAJQAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtaXRlcmF0b3IuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VJdGVyYXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VJdGVyYXRvciA9IG5leHQgPT4ge1xuICBjb25zdCBpdGVyID0gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gaXRlcixcbiAgICBuZXh0LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXI7XG59OyRozY9fb25jZS5tYWtlSXRlcmF0b3IobWFrZUl0ZXJhdG9yKTtcbmhhcmRlbihtYWtlSXRlcmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUl0ZXJhdG9yIjpbIm1ha2VJdGVyYXRvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB/VRSzNAMAADQDAAAiAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1hcC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsib2JqZWN0TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO2NvbnN0IHsgZW50cmllcywgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3Qgb2JqZWN0TWFwID0gKG9yaWdpbmFsLCBtYXBGbikgPT4ge1xuICBjb25zdCBlbnRzID0gZW50cmllcyhvcmlnaW5hbCk7XG4gIGNvbnN0IG1hcEVudHMgPSBlbnRzLm1hcChcbiAgICAoW2ssIHZdKSA9PiAvKiAgICAgICAgICAgICAgICAgICAgICAgKi8gKFtrLCBtYXBGbih2LCBrKV0pLFxuICApO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChoYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cykpKTtcbn07JGjNj19vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH9WL1IyBAAAMgQAACcAAABAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWV0YS1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1ldGFNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Y29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBjcmVhdGUsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3Qgb2JqZWN0TWV0YU1hcCA9IChcbiAgb3JpZ2luYWwsXG4gIG1ldGFNYXBGbixcbiAgcHJvdG8gPSBPYmplY3QucHJvdG90eXBlLFxuKSA9PiB7XG4gIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvcmlnaW5hbCk7XG4gIGNvbnN0IGtleXMgPSBvd25LZXlzKG9yaWdpbmFsKTtcblxuICBjb25zdCBkZXNjRW50cmllcyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIGtleXNcbiAgICAgIC5tYXAoa2V5ID0+IFtrZXksIG1ldGFNYXBGbihkZXNjc1trZXldLCBrZXkpXSlcbiAgICAgIC5maWx0ZXIoKFtfa2V5LCBvcHREZXNjXSkgPT4gb3B0RGVzYyAhPT0gdW5kZWZpbmVkKVxuICApO1xuICByZXR1cm4gaGFyZGVuKGNyZWF0ZShwcm90bywgZnJvbUVudHJpZXMoZGVzY0VudHJpZXMpKSk7XG59OyRozY9fb25jZS5vYmplY3RNZXRhTWFwKG9iamVjdE1ldGFNYXApO1xuaGFyZGVuKG9iamVjdE1ldGFNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsib2JqZWN0TWV0YU1hcCI6WyJvYmplY3RNZXRhTWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPKqY7MeBAAAHgQAACUAAABAZW5kby9jb21tb24tdjEuMi4xMy90aHJvdy1sYWJlbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbInRocm93TGFiZWxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsbWFrZUVycm9yLGFubm90YXRlRXJyb3I7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB0aHJvd0xhYmVsZWQgPSAoXG4gIGlubmVyRXJyLFxuICBsYWJlbCxcbiAgZXJyQ29uc3RydWN0b3IgPSB1bmRlZmluZWQsXG4gIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKHR5cGVvZiBsYWJlbCA9PT0gJ251bWJlcicpIHtcbiAgICBsYWJlbCA9IGBbJHtsYWJlbH1dYDtcbiAgfVxuICBjb25zdCBvdXRlckVyciA9IG1ha2VFcnJvcihcbiAgICBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLFxuICAgIGVyckNvbnN0cnVjdG9yLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIGFubm90YXRlRXJyb3Iob3V0ZXJFcnIsIFhgQ2F1c2VkIGJ5ICR7aW5uZXJFcnJ9YCk7XG4gIHRocm93IG91dGVyRXJyO1xufTskaM2PX29uY2UudGhyb3dMYWJlbGVkKHRocm93TGFiZWxlZCk7XG5oYXJkZW4odGhyb3dMYWJlbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANKKhqaIBAACiAQAAIgAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAXGNzxVBAAAFQQAAAsAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9zcmMvZW52LW9wdGlvbnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiLCJnZXRFbnZpcm9ubWVudE9wdGlvbiIsImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiLCJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG5cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG5cbi8vXG5jb25zdCBsb2NhbFRoaXMgPSBnbG9iYWxUaGlzO1xuXG5jb25zdCB7IE9iamVjdCwgUmVmbGVjdCwgQXJyYXksIFN0cmluZywgSlNPTiwgRXJyb3IgfSA9IGxvY2FsVGhpcztcbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vL1xuLy9cbmNvbnN0IHVuY3VycnlUaGlzID1cbiAgZm4gPT5cbiAgKHJlY2VpdmVyLCAuLi5hcmdzKSA9PlxuICAgIGFwcGx5KGZuLCByZWNlaXZlciwgYXJncyk7XG5jb25zdCBhcnJheVB1c2ggPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUucHVzaCk7XG5jb25zdCBhcnJheUluY2x1ZGVzID0gdW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKTtcbmNvbnN0IHN0cmluZ1NwbGl0ID0gdW5jdXJyeVRoaXMoU3RyaW5nLnByb3RvdHlwZS5zcGxpdCk7XG5cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuY29uc3QgRmFpbCA9IChsaXRlcmFscywgLi4uYXJncykgPT4ge1xuICBsZXQgbXNnID0gbGl0ZXJhbHNbMF07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIG1zZyA9IGAke21zZ30ke2FyZ3NbaV19JHtsaXRlcmFsc1tpICsgMV19YDtcbiAgfVxuICB0aHJvdyBFcnJvcihtc2cpO1xufTtcblxuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbnZpcm9ubWVudENhcHRvciA9IChhR2xvYmFsLCBkcm9wTmFtZXMgPSBmYWxzZSkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMgPSBbXTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uID0gKFxuICAgIG9wdGlvbk5hbWUsXG4gICAgZGVmYXVsdFNldHRpbmcsXG4gICAgb3B0T3RoZXJWYWx1ZXMgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgIHR5cGVvZiBvcHRpb25OYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZSAke3Eob3B0aW9uTmFtZSl9IG11c3QgYmUgYSBzdHJpbmcuYDtcbiAgICB0eXBlb2YgZGVmYXVsdFNldHRpbmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBkZWZhdWx0IHNldHRpbmcgJHtxKFxuICAgICAgICBkZWZhdWx0U2V0dGluZyxcbiAgICAgICl9IG11c3QgYmUgYSBzdHJpbmcuYDtcblxuICAgIC8qICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBzZXR0aW5nID0gZGVmYXVsdFNldHRpbmc7XG4gICAgY29uc3QgZ2xvYmFsUHJvY2VzcyA9IGFHbG9iYWwucHJvY2VzcyB8fCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZ2xvYmFsRW52ID1cbiAgICAgICh0eXBlb2YgZ2xvYmFsUHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgZ2xvYmFsUHJvY2Vzcy5lbnYpIHx8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGdsb2JhbEVudiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChvcHRpb25OYW1lIGluIGdsb2JhbEVudikge1xuICAgICAgICBpZiAoIWRyb3BOYW1lcykge1xuICAgICAgICAgIGFycmF5UHVzaChjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsIG9wdGlvbk5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gZ2xvYmFsRW52W29wdGlvbk5hbWVdO1xuICAgICAgICAvL1xuICAgICAgICB0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZWQgJHtxKFxuICAgICAgICAgICAgb3B0aW9uTmFtZSxcbiAgICAgICAgICApfSwgaWYgcHJlc2VudCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUsIGdvdCAke3EoXG4gICAgICAgICAgICBvcHRpb25WYWx1ZSxcbiAgICAgICAgICApfWA7XG4gICAgICAgIHNldHRpbmcgPSBvcHRpb25WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgb3B0T3RoZXJWYWx1ZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgc2V0dGluZyA9PT0gZGVmYXVsdFNldHRpbmcgfHxcbiAgICAgIGFycmF5SW5jbHVkZXMob3B0T3RoZXJWYWx1ZXMsIHNldHRpbmcpIHx8XG4gICAgICBGYWlsYFVucmVjb2duaXplZCAke3Eob3B0aW9uTmFtZSl9IHZhbHVlICR7cShcbiAgICAgICAgc2V0dGluZyxcbiAgICAgICl9LiBFeHBlY3RlZCBvbmUgb2YgJHtxKFtkZWZhdWx0U2V0dGluZywgLi4ub3B0T3RoZXJWYWx1ZXNdKX1gO1xuICAgIHJldHVybiBzZXR0aW5nO1xuICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0ID0gb3B0aW9uTmFtZSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJycpO1xuICAgIHJldHVybiBmcmVlemUob3B0aW9uID09PSAnJyA/IFtdIDogc3RyaW5nU3BsaXQob3B0aW9uLCAnLCcpKTtcbiAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpO1xuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAob3B0aW9uTmFtZSwgZWxlbWVudCkgPT5cbiAgICBhcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksIGVsZW1lbnQpO1xuXG4gIGNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9ICgpID0+IHtcbiAgICByZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiAgfTtcbiAgZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxuICAgIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHtcbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG59ID0gbWFrZUVudmlyb25tZW50Q2FwdG9yKGxvY2FsVGhpcywgdHJ1ZSk7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uKGdldEVudmlyb25tZW50T3B0aW9uKTskaM2PX29uY2UuZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdChnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTskaM2PX29uY2UuZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyhlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbnZpcm9ubWVudENhcHRvciI6WyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwiZ2V0RW52aXJvbm1lbnRPcHRpb24iOlsiZ2V0RW52aXJvbm1lbnRPcHRpb24iXSwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCI6WyJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0Il0sImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABJNfbpVAgAAFQIAAAdAAAAQGVuZG8vZXJyb3JzLXYxLjIuMTMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkZhaWwiLCJYIiwiYW5ub3RhdGVFcnJvciIsImFzc2VydCIsImIiLCJiYXJlIiwibWFrZUVycm9yIiwibm90ZSIsInEiLCJxdW90ZSIsInJlZGFjdGVkIiwidGhyb3dSZWRhY3RlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiAgICAgICAgICAgICAgICAgICAqL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuXG5jb25zdCBnbG9iYWxBc3NlcnQgPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuaWYgKGdsb2JhbEFzc2VydCA9PT0gdW5kZWZpbmVkKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BlbmRvL2Vycm9ycydgLFxuICApO1xufVxuXG5jb25zdCBtaXNzaW5nID0gLyogICAgICAgICAgICAgICAgKi8gKFtcbiAgJ3R5cGVvZicsXG4gICdlcnJvcicsXG4gICdmYWlsJyxcbiAgJ2VxdWFsJyxcbiAgJ3N0cmluZycsXG4gICdub3RlJyxcbiAgJ2RldGFpbHMnLFxuICAnRmFpbCcsXG4gICdxdW90ZScsXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gICdtYWtlQXNzZXJ0Jyxcbl0pLmZpbHRlcihuYW1lID0+IGdsb2JhbEFzc2VydFtuYW1lXSA9PT0gdW5kZWZpbmVkKTtcbmlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgdGhyb3cgRXJyb3IoXG4gICAgYENhbm5vdCBpbml0aWFsaXplIEBlbmRvL2Vycm9ycywgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCBtZXRob2RzICR7bWlzc2luZy5qb2luKFxuICAgICAgJywgJyxcbiAgICApfWAsXG4gICk7XG59XG5cbi8vXG4vL1xuLy9cbmNvbnN0IHtcbiAgYmFyZSxcbiAgZGV0YWlsczogcmVkYWN0ZWQsXG4gIGVycm9yOiBtYWtlRXJyb3IsXG4gIEZhaWw6IHRocm93UmVkYWN0ZWQsXG4gIG1ha2VBc3NlcnQ6IF9vbWl0dGVkTWFrZUFzc2VydCxcbiAgbm90ZSxcbiAgcXVvdGUsXG4gIC4uLmFzc2VydGlvbnNcbn0gPSBnbG9iYWxBc3NlcnQ7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8vXG4kaM2PX29uY2UucmVkYWN0ZWQocmVkYWN0ZWQpOyRozY9fb25jZS5tYWtlRXJyb3IobWFrZUVycm9yKTskaM2PX29uY2UudGhyb3dSZWRhY3RlZCh0aHJvd1JlZGFjdGVkKTskaM2PX29uY2Uubm90ZShub3RlKTskaM2PX29uY2UucXVvdGUocXVvdGUpO2NvbnN0IGFzc2VydD0odmFsdWUsb3B0RGV0YWlscyxlcnJDb250cnVjdG9yLG9wdGlvbnMpPT5cbiAgZ2xvYmFsQXNzZXJ0KHZhbHVlLCBvcHREZXRhaWxzLCBlcnJDb250cnVjdG9yLCBvcHRpb25zKTskaM2PX29uY2UuYXNzZXJ0KGFzc2VydCk7XG5PYmplY3QuYXNzaWduKGFzc2VydCwgYXNzZXJ0aW9ucyk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IGJhcmVPclF1b3RlID0gYmFyZSB8fCBxdW90ZTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5iYXJlT3JRdW90ZShiYXJlT3JRdW90ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWRhY3RlZCI6WyJyZWRhY3RlZCJdLCJYIjpbInJlZGFjdGVkIl0sIm1ha2VFcnJvciI6WyJtYWtlRXJyb3IiXSwidGhyb3dSZWRhY3RlZCI6WyJ0aHJvd1JlZGFjdGVkIl0sIkZhaWwiOlsidGhyb3dSZWRhY3RlZCJdLCJub3RlIjpbIm5vdGUiXSwiYW5ub3RhdGVFcnJvciI6WyJub3RlIl0sInF1b3RlIjpbInF1b3RlIl0sInEiOlsicXVvdGUiXSwiYXNzZXJ0IjpbImFzc2VydCJdLCJiYXJlIjpbImJhcmVPclF1b3RlIl0sImIiOlsiYmFyZU9yUXVvdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAybGDGRsWAAAbFgAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9FLmpzeyJpbXBvcnRzIjpbIi4vdHJhY2stdHVybnMuanMiLCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHJhY2tUdXJucyxtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsWyRozY9fYSA9PiAodHJhY2tUdXJucyA9ICRozY9fYSldXV1dLFtcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsWyRozY9fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsLCBlcnJvcjogbWFrZUVycm9yIH0gPSBhc3NlcnQ7XG5jb25zdCB7IGFzc2lnbiwgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qXG5cbiAqL1xuXG5jb25zdCBvblNlbmQgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fU0VORF9CUkVBS1BPSU5UUycpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlciA9IHtcbiAgc2V0KF90YXJnZXQsIF9wcm9wLCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGlzRXh0ZW5zaWJsZShfdGFyZ2V0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBzZXRQcm90b3R5cGVPZihfdGFyZ2V0LCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KF90YXJnZXQsIF9wcm9wKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxufTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRVByb3h5SGFuZGxlciA9IChyZWNpcGllbnQsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcGVydHlLZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKFxuICAgICAgICB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzICE9PSByZWNlaXZlcikge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UucmVqZWN0KFxuICAgICAgICAgICAgICAgIG1ha2VFcnJvcihcbiAgICAgICAgICAgICAgICAgIFhgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocHJvcGVydHlLZXkpfVwiIG1ldGhvZCBvZiBFKCR7cShcbiAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICAgICAgKX0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGRlYnVnZ2VyOyAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kKHJlY2lwaWVudCwgcHJvcGVydHlLZXksIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdBcnJheSA9IFtdKSA9PiB7XG4gICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvL1xuICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgIH1cbiAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHJlY2lwaWVudCwgYXJnQXJyYXkpO1xuICAgIH0sXG4gICAgaGFzOiAoX3RhcmdldCwgX3ApID0+IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUVTZW5kT25seVByb3h5SGFuZGxlciA9IChyZWNpcGllbnQsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcGVydHlLZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKFxuICAgICAgICB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIFtwcm9wZXJ0eUtleV0oLi4uYXJncykge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHRoaXMgPT09IHJlY2VpdmVyIHx8XG4gICAgICAgICAgICAgIEZhaWxgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EoXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgICAgICl9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKHJlY2lwaWVudCl9KWA7XG4gICAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGRlYnVnZ2VyOyAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2RTZW5kT25seShyZWNpcGllbnQsIHByb3BlcnR5S2V5LCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vXG4gICAgICAgIH1bcHJvcGVydHlLZXldLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIGFyZ3NBcnJheSA9IFtdKSA9PiB7XG4gICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvL1xuICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgIH1cbiAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seShyZWNpcGllbnQsIGFyZ3NBcnJheSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgaGFzOiAoX3RhcmdldCwgX3ApID0+IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUVHZXRQcm94eUhhbmRsZXIgPSAoeCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBoYXM6IChfdGFyZ2V0LCBfcHJvcCkgPT4gdHJ1ZSxcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiBIYW5kbGVkUHJvbWlzZS5nZXQoeCwgcHJvcCksXG4gIH0pO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGZ1bmNUYXJnZXQgPSBmcmVlemUoKCkgPT4ge30pO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3Qgb2JqVGFyZ2V0ID0gZnJlZXplKHsgX19wcm90b19fOiBudWxsIH0pO1xuXG4vKlxuXG4gKi9cbmNvbnN0IG1ha2VFID0gSGFuZGxlZFByb21pc2UgPT4ge1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGFzc2lnbihcbiAgICAgIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIC8vXG4gICAgICB4ID0+IG5ldyBQcm94eShmdW5jVGFyZ2V0LCBtYWtlRVByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuICAgICAge1xuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgLy9cbiAgICAgICAgZ2V0OiB4ID0+IG5ldyBQcm94eShvYmpUYXJnZXQsIG1ha2VFR2V0UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgcmVzb2x2ZTogSGFuZGxlZFByb21pc2UucmVzb2x2ZSxcblxuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICBzZW5kT25seTogeCA9PlxuICAgICAgICAgIC8vXG4gICAgICAgICAgbmV3IFByb3h5KGZ1bmNUYXJnZXQsIG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcblxuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICB3aGVuOiAoeCwgb25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpID0+XG4gICAgICAgICAgSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKFxuICAgICAgICAgICAgLi4udHJhY2tUdXJucyhbb25mdWxmaWxsZWQsIG9ucmVqZWN0ZWRdKSxcbiAgICAgICAgICApLFxuICAgICAgfSxcbiAgICApLFxuICApO1xufTtcblxuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0Om1ha2VFfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGRANevSDgAA0g4AACcAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbG9jYWwuanN7ImltcG9ydHMiOlsiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZ2V0TWV0aG9kTmFtZXMiLCJsb2NhbEFwcGx5RnVuY3Rpb24iLCJsb2NhbEFwcGx5TWV0aG9kIiwibG9jYWxHZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBnZXRQcm90b3R5cGVPZiwgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5LCBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG5jb25zdCBudHlwZW9mID0gc3BlY2ltZW4gPT4gKHNwZWNpbWVuID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHNwZWNpbWVuKTtcblxuY29uc3Qgb25EZWxpdmVyeSA9IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcignRU5ET19ERUxJVkVSWV9CUkVBS1BPSU5UUycpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgaXNQcmltaXRpdmUgPSB2YWwgPT5cbiAgIXZhbCB8fCAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJyk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQgPSAoYSwgYikgPT4ge1xuICBpZiAodHlwZW9mIGEgPT09IHR5cGVvZiBiKSB7XG4gICAgY29uc3QgbGVmdCA9IFN0cmluZyhhKTtcbiAgICBjb25zdCByaWdodCA9IFN0cmluZyhiKTtcbiAgICAvL1xuICAgIHJldHVybiBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPiByaWdodCA/IDEgOiAwO1xuICB9XG4gIGlmICh0eXBlb2YgYSA9PT0gJ3N5bWJvbCcpIHtcbiAgICBhc3NlcnQodHlwZW9mIGIgPT09ICdzdHJpbmcnKTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgYXNzZXJ0KHR5cGVvZiBhID09PSAnc3RyaW5nJyk7XG4gIGFzc2VydCh0eXBlb2YgYiA9PT0gJ3N5bWJvbCcpO1xuICByZXR1cm4gMTtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0TWV0aG9kTmFtZXMgPSB2YWwgPT4ge1xuICBsZXQgbGF5ZXIgPSB2YWw7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpOyAvL1xuICB3aGlsZSAobGF5ZXIgIT09IG51bGwgJiYgbGF5ZXIgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAvL1xuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG93bktleXMoZGVzY3MpKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmICh0eXBlb2YgdmFsW25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG5hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzUHJpbWl0aXZlKHZhbCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsYXllciA9IGdldFByb3RvdHlwZU9mKGxheWVyKTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFsuLi5uYW1lc10uc29ydChjb21wYXJlU3RyaW5naWZpZWQpKTtcbn07XG4vL1xuLy9cbiRozY9fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7ZnJlZXplKGdldE1ldGhvZE5hbWVzKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlGdW5jdGlvbiA9IChyZWNpcGllbnQsIGFyZ3MpID0+IHtcbiAgdHlwZW9mIHJlY2lwaWVudCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGBDYW5ub3QgaW52b2tlIHRhcmdldCBhcyBhIGZ1bmN0aW9uOyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAvL1xuICAgIGRlYnVnZ2VyOyAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gYXBwbHkocmVjaXBpZW50LCB1bmRlZmluZWQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseUZ1bmN0aW9uKGxvY2FsQXBwbHlGdW5jdGlvbik7XG5cbiAgICAgICBjb25zdCBsb2NhbEFwcGx5TWV0aG9kID0gKHJlY2lwaWVudCwgbWV0aG9kTmFtZSwgYXJncykgPT4ge1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAvL1xuICAgIHJldHVybiBsb2NhbEFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LCBhcmdzKTtcbiAgfVxuICBpZiAocmVjaXBpZW50ID09PSB1bmRlZmluZWQgfHwgcmVjaXBpZW50ID09PSBudWxsKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBkZWxpdmVyICR7cShtZXRob2ROYW1lKX0gdG8gdGFyZ2V0OyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZm4gPSByZWNpcGllbnRbbWV0aG9kTmFtZV07XG4gIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYHRhcmdldCBoYXMgbm8gbWV0aG9kICR7cShtZXRob2ROYW1lKX0sIGhhcyAke3EoXG4gICAgICAgIGdldE1ldGhvZE5hbWVzKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmdHlwZSA9IG50eXBlb2YoZm4pO1xuICB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgfHxcbiAgICBGYWlsYGludm9rZWQgbWV0aG9kICR7cShtZXRob2ROYW1lKX0gaXMgbm90IGEgZnVuY3Rpb247IGl0IGlzIGEgJHtxKFxuICAgICAgZnR5cGUsXG4gICAgKX1gO1xuICBpZiAob25EZWxpdmVyeSAmJiBvbkRlbGl2ZXJ5LnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBtZXRob2ROYW1lKSkge1xuICAgIC8vXG4gICAgZGVidWdnZXI7IC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShmbiwgcmVjaXBpZW50LCBhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmxvY2FsQXBwbHlNZXRob2QobG9jYWxBcHBseU1ldGhvZCk7XG5cbiAgICAgICBjb25zdCBsb2NhbEdldCA9ICh0LCBrZXkpID0+IHRba2V5XTskaM2PX29uY2UubG9jYWxHZXQobG9jYWxHZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwibG9jYWxBcHBseUZ1bmN0aW9uIjpbImxvY2FsQXBwbHlGdW5jdGlvbiJdLCJsb2NhbEFwcGx5TWV0aG9kIjpbImxvY2FsQXBwbHlNZXRob2QiXSwibG9jYWxHZXQiOlsibG9jYWxHZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAeTPsuDwPAAA8DwAANQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBoYXNPd24sIGZyZWV6ZSwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4vKlxuXG5cblxuXG5cbiAqL1xuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5jb25zdCBpc0pTT05SZWNvcmQgPSB2YWwgPT5cbiAgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHNpbXBsaWZ5VGFnID0gdGFnID0+IHtcbiAgZm9yIChjb25zdCBwcmVmaXggb2YgWydBbGxlZ2VkOiAnLCAnRGVidWdOYW1lOiAnXSkge1xuICAgIGlmICh0YWcuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICByZXR1cm4gdGFnLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFnO1xufTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSBvcHRpb25OYW1lID0+IHtcbiAgbGV0IGJyZWFrcG9pbnRzID0gSlNPTi5wYXJzZShnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCAnbnVsbCcpKTtcblxuICBpZiAoYnJlYWtwb2ludHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBicmVha3BvaW50c1RhYmxlO1xuXG4gIGNvbnN0IGdldEJyZWFrcG9pbnRzID0gKCkgPT4gYnJlYWtwb2ludHM7XG4gIGZyZWV6ZShnZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2V0QnJlYWtwb2ludHMgPSAobmV3QnJlYWtwb2ludHMgPSBicmVha3BvaW50cykgPT4ge1xuICAgIGlzSlNPTlJlY29yZChuZXdCcmVha3BvaW50cykgfHxcbiAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24gdG8gYmUgYSBKU09OIGJyZWFrcG9pbnRzIHJlY29yZGA7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAvL1xuICAgIGNvbnN0IG5ld0JyZWFrcG9pbnRzVGFibGUgPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuXG4gICAgZm9yIChjb25zdCBbdGFnLCBtZXRob2RCUHNdIG9mIGVudHJpZXMobmV3QnJlYWtwb2ludHMpKSB7XG4gICAgICB0YWcgPT09IHNpbXBsaWZ5VGFnKHRhZykgfHxcbiAgICAgICAgRmFpbGBKdXN0IHVzZSBzaW1wbGUgdGFnICR7cShzaW1wbGlmeVRhZyh0YWcpKX0gcmF0aGVyIHRoYW4gJHtxKHRhZyl9YDtcbiAgICAgIGlzSlNPTlJlY29yZChtZXRob2RCUHMpIHx8XG4gICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EoXG4gICAgICAgICAgdGFnLFxuICAgICAgICApfSB0byBiZSBhIEpTT04gbWV0aG9kcyBicmVha3BvaW50cyByZWNvcmRgO1xuICAgICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgY291bnRdIG9mIGVudHJpZXMobWV0aG9kQlBzKSkge1xuICAgICAgICBjb3VudCA9PT0gJyonIHx8XG4gICAgICAgICAgKHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50KSAmJlxuICAgICAgICAgICAgY291bnQgPj0gMCkgfHxcbiAgICAgICAgICBGYWlsYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKHRhZyl9LiR7cShcbiAgICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKX0gdG8gYmUgXCIqXCIgb3IgYSBub24tbmVnYXRpdmUgaW50ZWdlcmA7XG5cbiAgICAgICAgY29uc3QgY2xhc3NCUHMgPSBoYXNPd24obmV3QnJlYWtwb2ludHNUYWJsZSwgbWV0aG9kTmFtZSlcbiAgICAgICAgICA/IG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV1cbiAgICAgICAgICA6IChuZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdID0ge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50O1xuICAgICAgfVxuICAgIH1cbiAgICBicmVha3BvaW50cyA9IG5ld0JyZWFrcG9pbnRzO1xuICAgIGJyZWFrcG9pbnRzVGFibGUgPSBuZXdCcmVha3BvaW50c1RhYmxlO1xuICB9O1xuICBmcmVlemUoc2V0QnJlYWtwb2ludHMpO1xuXG4gIGNvbnN0IHNob3VsZEJyZWFrcG9pbnQgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lKSA9PiB7XG4gICAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fCBtZXRob2ROYW1lID09PSBudWxsKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc0JQcyA9IGJyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gfHwgYnJlYWtwb2ludHNUYWJsZVsnKiddO1xuICAgIGlmIChjbGFzc0JQcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCB0YWcgPSBzaW1wbGlmeVRhZyhyZWNpcGllbnRbU3ltYm9sLnRvU3RyaW5nVGFnXSk7XG4gICAgbGV0IGNvdW50ID0gY2xhc3NCUHNbdGFnXTtcbiAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFnID0gJyonO1xuICAgICAgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY291bnQgPT09ICcqJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFzc2VydCh0eXBlb2YgY291bnQgPT09ICdudW1iZXInICYmIGNvdW50ID49IDEpO1xuICAgIGNsYXNzQlBzW3RhZ10gPSBjb3VudCAtIDE7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBmcmVlemUoc2hvdWxkQnJlYWtwb2ludCk7XG5cbiAgY29uc3QgYnJlYWtwb2ludFRlc3RlciA9IGZyZWV6ZSh7XG4gICAgZ2V0QnJlYWtwb2ludHMsXG4gICAgc2V0QnJlYWtwb2ludHMsXG4gICAgc2hvdWxkQnJlYWtwb2ludCxcbiAgfSk7XG4gIGJyZWFrcG9pbnRUZXN0ZXIuc2V0QnJlYWtwb2ludHMoKTtcbiAgcmV0dXJuIGJyZWFrcG9pbnRUZXN0ZXI7XG59OyRozY9fb25jZS5tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbmZyZWV6ZShtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC4dpSdXwMAAF8DAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlRTskaM2PX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKG1ha2VFID0gJGjNj19hKV1dXV0sW1wiLi9leHBvcnRzLmpzXCIsIFtdXV0pO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgaHAgPSBIYW5kbGVkUHJvbWlzZTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaHAoaHApO1xuICAgICAgIGNvbnN0IEUgPSBtYWtlRShocCk7JGjNj19vbmNlLkUoRSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAyOwHRckKAADJCgAALQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbixlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV0sW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLFskaM2PX2EgPT4gKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuID0gMDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQgPSAwO1xuXG4vL1xuY29uc3QgVkVSQk9TRSA9IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywgJ3RyYWNrLXR1cm5zJyk7XG5cbi8vXG4vL1xuY29uc3QgRU5BQkxFRCA9XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgKGdldEVudmlyb25tZW50T3B0aW9uKCdUUkFDS19UVVJOUycsICdkaXNhYmxlZCcsIFsnZW5hYmxlZCddKSkgPT09ICdlbmFibGVkJztcblxuLy9cbi8vXG4vL1xuLy9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZSA9IGRldGFpbHNOb3RlID0+IHJlYXNvbiA9PiB7XG4gIGlmIChyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGdsb2JhbFRoaXMuYXNzZXJ0Lm5vdGUocmVhc29uLCBkZXRhaWxzTm90ZSk7XG4gIH1cbiAgaWYgKFZFUkJPU0UpIHtcbiAgICBjb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLCByZWFzb24pO1xuICB9XG59O1xuXG5jb25zdCB3cmFwRnVuY3Rpb24gPVxuICAoZnVuYywgc2VuZGluZ0Vycm9yLCBYKSA9PlxuICAoLi4uYXJncykgPT4ge1xuICAgIGhpZGRlblByaW9yRXJyb3IgPSBzZW5kaW5nRXJyb3I7XG4gICAgaGlkZGVuQ3VycmVudFR1cm4gKz0gMTtcbiAgICBoaWRkZW5DdXJyZW50RXZlbnQgPSAwO1xuICAgIHRyeSB7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZnVuYyguLi5hcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgWGBUaHJvd24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFZFUkJPU0UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgY29uc3QgZGV0YWlsc05vdGUgPSBYYFJlamVjdGlvbiBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWA7XG4gICAgICBQcm9taXNlLnJlc29sdmUocmVzdWx0KS5jYXRjaChhZGRSZWplY3Rpb25Ob3RlKGRldGFpbHNOb3RlKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBoaWRkZW5QcmlvckVycm9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdHJhY2tUdXJucyA9IGZ1bmNzID0+IHtcbiAgaWYgKCFFTkFCTEVEIHx8IHR5cGVvZiBnbG9iYWxUaGlzID09PSAndW5kZWZpbmVkJyB8fCAhZ2xvYmFsVGhpcy5hc3NlcnQpIHtcbiAgICByZXR1cm4gZnVuY3M7XG4gIH1cbiAgY29uc3QgeyBkZXRhaWxzOiBYLCBub3RlOiBhbm5vdGF0ZUVycm9yIH0gPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuICBoaWRkZW5DdXJyZW50RXZlbnQgKz0gMTtcbiAgY29uc3Qgc2VuZGluZ0Vycm9yID0gRXJyb3IoXG4gICAgYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gLFxuICApO1xuICBpZiAoaGlkZGVuUHJpb3JFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYW5ub3RhdGVFcnJvcihzZW5kaW5nRXJyb3IsIFhgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gIH1cblxuICByZXR1cm4gLyogICAgICAgICAgICAqLyAoXG4gICAgZnVuY3MubWFwKGZ1bmMgPT4gZnVuYyAmJiB3cmFwRnVuY3Rpb24oZnVuYywgc2VuZGluZ0Vycm9yLCBYKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS50cmFja1R1cm5zKHRyYWNrVHVybnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC91dGlscy5qc3siaW1wb3J0cyI6WyIuL3NyYy9sb2NhbC5qcyIsIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2xvY2FsLmpzXCIsIFtdXSxbXCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvbG9jYWwuanMiOltbImdldE1ldGhvZE5hbWVzIiwiZ2V0TWV0aG9kTmFtZXMiXV0sIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOltbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciIsIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3EXZo2ACAABgAgAAGgAAAEBlbmRvL2V4by12MS41LjEyL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2V4by1tYWtlcnMuanMiLCIuL3NyYy90eXBlcy5qcyIsIi4vc3JjL2dldC1pbnRlcmZhY2UuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZXhvLW1ha2Vycy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2V4by1tYWtlcnMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyI6W1siR0VUX0lOVEVSRkFDRV9HVUFSRCIsIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOAg28LPFwAAzxcAACMAAABAZW5kby9leG8tdjEuNS4xMi9zcmMvZXhvLW1ha2Vycy5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIiwiLi9leG8tdG9vbHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzS2l0IiwiaW5pdEVtcHR5IiwibWFrZUV4byJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG9iamVjdE1hcCxlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLEZhaWwscSxkZWZlbmRQcm90b3R5cGUsZGVmZW5kUHJvdG90eXBlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL2V4by10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsWyRozY9fYSA9PiAoZGVmZW5kUHJvdG90eXBlID0gJGjNj19hKV1dLFtcImRlZmVuZFByb3RvdHlwZUtpdFwiLFskaM2PX2EgPT4gKGRlZmVuZFByb3RvdHlwZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLypcblxuICovXG5cbmNvbnN0IHsgY3JlYXRlLCBzZWFsLCBmcmVlemUsIGRlZmluZVByb3BlcnR5LCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLy9cbmNvbnN0IExBQkVMX0lOU1RBTkNFUyA9IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywgJ2xhYmVsLWluc3RhbmNlcycpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VTZWxmID0gKHByb3RvLCBpbnN0YW5jZUNvdW50KSA9PiB7XG4gIGNvbnN0IHNlbGYgPSBjcmVhdGUocHJvdG8pO1xuICBpZiAoTEFCRUxfSU5TVEFOQ0VTKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoc2VsZiwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICB2YWx1ZTogYCR7cHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXX0jJHtpbnN0YW5jZUNvdW50fWAsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbihzZWxmKTtcbn07XG5cbmNvbnN0IGVtcHR5UmVjb3JkID0gaGFyZGVuKHt9KTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaW5pdEVtcHR5ID0gKCkgPT4gZW1wdHlSZWNvcmQ7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmluaXRFbXB0eShpbml0RW1wdHkpO1xuICAgICAgIGNvbnN0IGRlZmluZUV4b0NsYXNzID0gKFxuICB0YWcsXG4gIGludGVyZmFjZUd1YXJkLFxuICBpbml0LFxuICBtZXRob2RzLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgaGFyZGVuKG1ldGhvZHMpO1xuICBjb25zdCB7XG4gICAgZmluaXNoID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVBbXBsaWZpZXIgPSB1bmRlZmluZWQsXG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyID0gdW5kZWZpbmVkLFxuICB9ID0gb3B0aW9ucztcbiAgcmVjZWl2ZUFtcGxpZmllciA9PT0gdW5kZWZpbmVkIHx8XG4gICAgRmFpbGBPbmx5IGZhY2V0cyBvZiBhbiBleG8gY2xhc3Mga2l0IGNhbiBiZSBhbXBsaWZpZWQgJHtxKHRhZyl9YDtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY29udGV4dE1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IHByb3RvID0gZGVmZW5kUHJvdG90eXBlKFxuICAgIHRhZyxcbiAgICBzZWxmID0+IC8qICAgICAgICAgICAgICAqLyAoY29udGV4dE1hcC5nZXQoc2VsZikpLFxuICAgIG1ldGhvZHMsXG4gICAgdHJ1ZSxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgKTtcbiAgbGV0IGluc3RhbmNlQ291bnQgPSAwO1xuICAvKlxuXG4gICAqL1xuICBjb25zdCBtYWtlSW5zdGFuY2UgPSAoLi4uYXJncykgPT4ge1xuICAgIC8vXG4gICAgY29uc3Qgc3RhdGUgPSBzZWFsKGluaXQoLi4uYXJncykpO1xuICAgIGluc3RhbmNlQ291bnQgKz0gMTtcbiAgICBjb25zdCBzZWxmID0gbWFrZVNlbGYocHJvdG8sIGluc3RhbmNlQ291bnQpO1xuXG4gICAgLy9cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGNvbnRleHQgPSBmcmVlemUoeyBzdGF0ZSwgc2VsZiB9KTtcbiAgICBjb250ZXh0TWFwLnNldChzZWxmLCBjb250ZXh0KTtcbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICBmaW5pc2goY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIGlmIChyZWNlaXZlSW5zdGFuY2VUZXN0ZXIpIHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaXNJbnN0YW5jZSA9IChleG8sIGZhY2V0TmFtZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgZmFjZXROYW1lID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBmYWNldE5hbWUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGFuIGV4byBjbGFzcyBraXQ6ICR7cShcbiAgICAgICAgICB0YWcsXG4gICAgICAgICl9IGhhcyBubyBmYWNldCAke3EoZmFjZXROYW1lKX1gO1xuICAgICAgcmV0dXJuIGNvbnRleHRNYXAuaGFzKGV4byk7XG4gICAgfTtcbiAgICBoYXJkZW4oaXNJbnN0YW5jZSk7XG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyKGlzSW5zdGFuY2UpO1xuICB9XG5cbiAgcmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2UpO1xufTskaM2PX29uY2UuZGVmaW5lRXhvQ2xhc3MoZGVmaW5lRXhvQ2xhc3MpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZWZpbmVFeG9DbGFzc0tpdCA9IChcbiAgdGFnLFxuICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgaW5pdCxcbiAgbWV0aG9kc0tpdCxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGhhcmRlbihtZXRob2RzS2l0KTtcbiAgY29uc3Qge1xuICAgIGZpbmlzaCA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlQW1wbGlmaWVyID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3RlciA9IHVuZGVmaW5lZCxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNvbnRleHRNYXBLaXQgPSBvYmplY3RNYXAobWV0aG9kc0tpdCwgKCkgPT4gbmV3IFdlYWtNYXAoKSk7XG4gIGNvbnN0IGdldENvbnRleHRLaXQgPSBvYmplY3RNYXAoXG4gICAgY29udGV4dE1hcEtpdCxcbiAgICBjb250ZXh0TWFwID0+IGZhY2V0ID0+IGNvbnRleHRNYXAuZ2V0KGZhY2V0KSxcbiAgKTtcbiAgY29uc3QgcHJvdG90eXBlS2l0ID0gZGVmZW5kUHJvdG90eXBlS2l0KFxuICAgIHRhZyxcbiAgICBnZXRDb250ZXh0S2l0LFxuICAgIG1ldGhvZHNLaXQsXG4gICAgdHJ1ZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgKTtcbiAgbGV0IGluc3RhbmNlQ291bnQgPSAwO1xuICAvKlxuXG4gICAqL1xuICBjb25zdCBtYWtlSW5zdGFuY2VLaXQgPSAoLi4uYXJncykgPT4ge1xuICAgIC8vXG4gICAgY29uc3Qgc3RhdGUgPSBzZWFsKGluaXQoLi4uYXJncykpO1xuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGNvbnRleHQgPSB7IHN0YXRlLCBmYWNldHM6IG51bGwgfTtcbiAgICBpbnN0YW5jZUNvdW50ICs9IDE7XG4gICAgY29uc3QgZmFjZXRzID0gb2JqZWN0TWFwKHByb3RvdHlwZUtpdCwgKHByb3RvLCBmYWNldE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHNlbGYgPSBtYWtlU2VsZihwcm90bywgaW5zdGFuY2VDb3VudCk7XG4gICAgICBjb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV0uc2V0KHNlbGYsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSk7XG4gICAgY29udGV4dC5mYWNldHMgPSBmYWNldHM7XG4gICAgLy9cbiAgICBmcmVlemUoY29udGV4dCk7XG4gICAgaWYgKGZpbmlzaCkge1xuICAgICAgZmluaXNoKGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAqLyAoY29udGV4dC5mYWNldHMpO1xuICB9O1xuXG4gIGlmIChyZWNlaXZlQW1wbGlmaWVyKSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGFtcGxpZnkgPSBleG9GYWNldCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbnRleHRNYXAgb2YgdmFsdWVzKGNvbnRleHRNYXBLaXQpKSB7XG4gICAgICAgIGlmIChjb250ZXh0TWFwLmhhcyhleG9GYWNldCkpIHtcbiAgICAgICAgICBjb25zdCB7IGZhY2V0cyB9ID0gY29udGV4dE1hcC5nZXQoZXhvRmFjZXQpO1xuICAgICAgICAgIHJldHVybiBmYWNldHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IEZhaWxgTXVzdCBiZSBhIGZhY2V0IG9mICR7cSh0YWcpfTogJHtleG9GYWNldH1gO1xuICAgIH07XG4gICAgaGFyZGVuKGFtcGxpZnkpO1xuICAgIHJlY2VpdmVBbXBsaWZpZXIoYW1wbGlmeSk7XG4gIH1cblxuICBpZiAocmVjZWl2ZUluc3RhbmNlVGVzdGVyKSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGlzSW5zdGFuY2UgPSAoZXhvRmFjZXQsIGZhY2V0TmFtZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGZhY2V0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXMoY29udGV4dE1hcEtpdCkuc29tZShjb250ZXh0TWFwID0+XG4gICAgICAgICAgY29udGV4dE1hcC5oYXMoZXhvRmFjZXQpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXNzZXJ0LnR5cGVvZihmYWNldE5hbWUsICdzdHJpbmcnKTtcbiAgICAgIGNvbnN0IGNvbnRleHRNYXAgPSBjb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV07XG4gICAgICBjb250ZXh0TWFwICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBleG8gY2xhc3Mga2l0ICR7cSh0YWcpfSBoYXMgbm8gZmFjZXQgbmFtZWQgJHtxKGZhY2V0TmFtZSl9YDtcbiAgICAgIHJldHVybiBjb250ZXh0TWFwLmhhcyhleG9GYWNldCk7XG4gICAgfTtcbiAgICBoYXJkZW4oaXNJbnN0YW5jZSk7XG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyKGlzSW5zdGFuY2UpO1xuICB9XG5cbiAgcmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2VLaXQpO1xufTskaM2PX29uY2UuZGVmaW5lRXhvQ2xhc3NLaXQoZGVmaW5lRXhvQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzS2l0KTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRXhvID0gKHRhZywgaW50ZXJmYWNlR3VhcmQsIG1ldGhvZHMsIG9wdGlvbnMgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgbWFrZUluc3RhbmNlID0gZGVmaW5lRXhvQ2xhc3MoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIGluaXRFbXB0eSxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIHJldHVybiBtYWtlSW5zdGFuY2UoKTtcbn07JGjNj19vbmNlLm1ha2VFeG8obWFrZUV4byk7XG5oYXJkZW4obWFrZUV4byk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbml0RW1wdHkiOlsiaW5pdEVtcHR5Il0sImRlZmluZUV4b0NsYXNzIjpbImRlZmluZUV4b0NsYXNzIl0sImRlZmluZUV4b0NsYXNzS2l0IjpbImRlZmluZUV4b0NsYXNzS2l0Il0sIm1ha2VFeG8iOlsibWFrZUV4byJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABCjUHrWjcAAFo3AAAiAAAAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9nZXQtaW50ZXJmYWNlLmpzIl0sImV4cG9ydHMiOlsiZGVmZW5kUHJvdG90eXBlIiwiZGVmZW5kUHJvdG90eXBlS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxnZXRSZW1vdGFibGVNZXRob2ROYW1lcyx0b1Rocm93YWJsZSxGYXIsbXVzdE1hdGNoLE0saXNBd2FpdEFyZ0d1YXJkLGlzUmF3R3VhcmQsZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQsZ2V0TWV0aG9kR3VhcmRQYXlsb2FkLGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCxnZXRDb3B5TWFwRW50cmllcyxsaXN0RGlmZmVyZW5jZSxvYmplY3RNYXAscSxGYWlsLEdFVF9JTlRFUkZBQ0VfR1VBUkQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFJlbW90YWJsZU1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMgPSAkaM2PX2EpXV0sW1widG9UaHJvd2FibGVcIixbJGjNj19hID0+ICh0b1Rocm93YWJsZSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImlzQXdhaXRBcmdHdWFyZFwiLFskaM2PX2EgPT4gKGlzQXdhaXRBcmdHdWFyZCA9ICRozY9fYSldXSxbXCJpc1Jhd0d1YXJkXCIsWyRozY9fYSA9PiAoaXNSYXdHdWFyZCA9ICRozY9fYSldXSxbXCJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dLFtcImdldE1ldGhvZEd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldE1ldGhvZEd1YXJkUGF5bG9hZCA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJpZXNcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanNcIiwgW1tcImxpc3REaWZmZXJlbmNlXCIsWyRozY9fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vZ2V0LWludGVyZmFjZS5qc1wiLCBbW1wiR0VUX0lOVEVSRkFDRV9HVUFSRFwiLFskaM2PX2EgPT4gKEdFVF9JTlRFUkZBQ0VfR1VBUkQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuY29uc3QgeyBhcHBseSwgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZGVmaW5lUHJvcGVydGllcywgZnJvbUVudHJpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgUmF3TWV0aG9kR3VhcmQgPSBNLmNhbGwoKS5yZXN0KE0ucmF3KCkpLnJldHVybnMoTS5yYXcoKSk7XG5cbmNvbnN0IFJFREFDVEVEX1JBV19BUkcgPSAnPHJlZGFjdGVkIHJhdyBhcmc+JztcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IFBhc3NhYmxlTWV0aG9kR3VhcmQgPSBNLmNhbGwoKS5yZXN0KE0uYW55KCkpLnJldHVybnMoTS5hbnkoKSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVmZW5kU3luY0FyZ3MgPSAoc3luY0FyZ3MsIG1hdGNoQ29uZmlnLCBsYWJlbCA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjbGFyZWRMZW4sXG4gICAgaGFzUmVzdEFyZ0d1YXJkLFxuICAgIHJlc3RBcmdHdWFyZElzUmF3LFxuICAgIHBhcmFtc1BhdHRlcm4sXG4gICAgcmVkYWN0ZWRJbmRpY2VzLFxuICB9ID0gbWF0Y2hDb25maWc7XG5cbiAgLy9cbiAgLy9cbiAgbGV0IG1hdGNoYWJsZUFyZ3MgPSBzeW5jQXJncztcbiAgaWYgKHJlc3RBcmdHdWFyZElzUmF3ICYmIHN5bmNBcmdzLmxlbmd0aCA+IGRlY2xhcmVkTGVuKSB7XG4gICAgY29uc3QgcmVzdExlbiA9IHN5bmNBcmdzLmxlbmd0aCAtIGRlY2xhcmVkTGVuO1xuICAgIGNvbnN0IHJlZGFjdGVkUmVzdCA9IEFycmF5KHJlc3RMZW4pLmZpbGwoUkVEQUNURURfUkFXX0FSRyk7XG4gICAgbWF0Y2hhYmxlQXJncyA9IFsuLi5zeW5jQXJncy5zbGljZSgwLCBkZWNsYXJlZExlbiksIC4uLnJlZGFjdGVkUmVzdF07XG4gIH0gZWxzZSBpZiAoXG4gICAgcmVkYWN0ZWRJbmRpY2VzLmxlbmd0aCA+IDAgJiZcbiAgICByZWRhY3RlZEluZGljZXNbMF0gPCBzeW5jQXJncy5sZW5ndGhcbiAgKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIG1hdGNoYWJsZUFyZ3MgPSBbLi4uc3luY0FyZ3NdO1xuICB9XG5cbiAgZm9yIChjb25zdCBpIG9mIHJlZGFjdGVkSW5kaWNlcykge1xuICAgIGlmIChpID49IG1hdGNoYWJsZUFyZ3MubGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbWF0Y2hhYmxlQXJnc1tpXSA9IFJFREFDVEVEX1JBV19BUkc7XG4gIH1cblxuICBtdXN0TWF0Y2goaGFyZGVuKG1hdGNoYWJsZUFyZ3MpLCBwYXJhbXNQYXR0ZXJuLCBsYWJlbCk7XG5cbiAgaWYgKGhhc1Jlc3RBcmdHdWFyZCkge1xuICAgIHJldHVybiBzeW5jQXJncztcbiAgfVxuICBzeW5jQXJncy5sZW5ndGggPD0gZGVjbGFyZWRMZW4gfHxcbiAgICBGYWlsYCR7cShsYWJlbCl9IGFjY2VwdHMgYXQgbW9zdCAke3EoZGVjbGFyZWRMZW4pfSBhcmd1bWVudHMsIG5vdCAke3EoXG4gICAgICBzeW5jQXJncy5sZW5ndGgsXG4gICAgKX06ICR7c3luY0FyZ3N9YDtcbiAgcmV0dXJuIHN5bmNBcmdzO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBidWlsZE1hdGNoQ29uZmlnID0gbWV0aG9kR3VhcmRQYXlsb2FkID0+IHtcbiAgY29uc3Qge1xuICAgIGFyZ0d1YXJkcyxcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgIHJlc3RBcmdHdWFyZCxcbiAgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcblxuICBjb25zdCBtYXRjaGFibGVBcmdHdWFyZHMgPSBbLi4uYXJnR3VhcmRzLCAuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbiAgY29uc3QgcmVkYWN0ZWRJbmRpY2VzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2hhYmxlQXJnR3VhcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGlzUmF3R3VhcmQobWF0Y2hhYmxlQXJnR3VhcmRzW2ldKSkge1xuICAgICAgbWF0Y2hhYmxlQXJnR3VhcmRzW2ldID0gUkVEQUNURURfUkFXX0FSRztcbiAgICAgIHJlZGFjdGVkSW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vXG4gIGxldCBtYXRjaGFibGVSZXN0QXJnR3VhcmQgPSByZXN0QXJnR3VhcmQ7XG4gIGlmIChpc1Jhd0d1YXJkKG1hdGNoYWJsZVJlc3RBcmdHdWFyZCkpIHtcbiAgICBtYXRjaGFibGVSZXN0QXJnR3VhcmQgPSBNLmFycmF5T2YoUkVEQUNURURfUkFXX0FSRyk7XG4gIH1cbiAgY29uc3QgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkID0gaGFyZGVuKHtcbiAgICAuLi5tZXRob2RHdWFyZFBheWxvYWQsXG4gICAgYXJnR3VhcmRzOiBtYXRjaGFibGVBcmdHdWFyZHMuc2xpY2UoMCwgYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgb3B0aW9uYWxBcmdHdWFyZHM6IG1hdGNoYWJsZUFyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICByZXN0QXJnR3VhcmQ6IG1hdGNoYWJsZVJlc3RBcmdHdWFyZCxcbiAgfSk7XG5cbiAgY29uc3QgcGFyYW1zUGF0dGVybiA9IE0uc3BsaXRBcnJheShcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQuYXJnR3VhcmRzLFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZC5vcHRpb25hbEFyZ0d1YXJkcyxcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQucmVzdEFyZ0d1YXJkLFxuICApO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGRlY2xhcmVkTGVuOiBtYXRjaGFibGVBcmdHdWFyZHMubGVuZ3RoLFxuICAgIGhhc1Jlc3RBcmdHdWFyZDogcmVzdEFyZ0d1YXJkICE9PSB1bmRlZmluZWQsXG4gICAgcmVzdEFyZ0d1YXJkSXNSYXc6IHJlc3RBcmdHdWFyZCAhPT0gbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkLFxuICAgIHBhcmFtc1BhdHRlcm4sXG4gICAgcmVkYWN0ZWRJbmRpY2VzLFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgZGVmZW5kU3luY01ldGhvZCA9IChcbiAgZ2V0Q29udGV4dCxcbiAgYmVoYXZpb3JNZXRob2QsXG4gIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgbGFiZWwsXG4pID0+IHtcbiAgY29uc3QgeyByZXR1cm5HdWFyZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBjb25zdCBpc1Jhd1JldHVybiA9IGlzUmF3R3VhcmQocmV0dXJuR3VhcmQpO1xuICBjb25zdCBtYXRjaENvbmZpZyA9IGJ1aWxkTWF0Y2hDb25maWcobWV0aG9kR3VhcmRQYXlsb2FkKTtcbiAgY29uc3QgeyBzeW5jTWV0aG9kIH0gPSB7XG4gICAgLy9cbiAgICBzeW5jTWV0aG9kKC4uLnN5bmNBcmdzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dCh0aGlzKTtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgcmVhbEFyZ3MgPSBkZWZlbmRTeW5jQXJncyhzeW5jQXJncywgbWF0Y2hDb25maWcsIGxhYmVsKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXBwbHkoYmVoYXZpb3JNZXRob2QsIGNvbnRleHQsIHJlYWxBcmdzKTtcbiAgICAgICAgaWYgKCFpc1Jhd1JldHVybikge1xuICAgICAgICAgIG11c3RNYXRjaChoYXJkZW4ocmVzdWx0KSwgcmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0gY2F0Y2ggKHRocm93blRoaW5nKSB7XG4gICAgICAgIHRocm93IHRvVGhyb3dhYmxlKHRocm93blRoaW5nKTtcbiAgICAgIH1cbiAgICB9LFxuICB9O1xuICByZXR1cm4gc3luY01ldGhvZDtcbn07XG5cbi8qXG5cbiAqL1xuY29uc3QgZGVzeW5jID0gbWV0aG9kR3VhcmRQYXlsb2FkID0+IHtcbiAgY29uc3Qge1xuICAgIGFyZ0d1YXJkcyxcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgIHJlc3RBcmdHdWFyZCxcbiAgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgIWlzQXdhaXRBcmdHdWFyZChyZXN0QXJnR3VhcmQpIHx8XG4gICAgRmFpbGBSZXN0IGFyZ3MgbWF5IG5vdCBiZSBhd2FpdGVkOiAke3Jlc3RBcmdHdWFyZH1gO1xuICBjb25zdCByYXdBcmdHdWFyZHMgPSBbLi4uYXJnR3VhcmRzLCAuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbiAgY29uc3QgYXdhaXRJbmRleGVzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3QXJnR3VhcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgYXJnR3VhcmQgPSByYXdBcmdHdWFyZHNbaV07XG4gICAgaWYgKGlzQXdhaXRBcmdHdWFyZChhcmdHdWFyZCkpIHtcbiAgICAgIHJhd0FyZ0d1YXJkc1tpXSA9IGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKGFyZ0d1YXJkKS5hcmdHdWFyZDtcbiAgICAgIGF3YWl0SW5kZXhlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGF3YWl0SW5kZXhlcyxcbiAgICByYXdNZXRob2RHdWFyZFBheWxvYWQ6IHtcbiAgICAgIC4uLm1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGFyZ0d1YXJkczogcmF3QXJnR3VhcmRzLnNsaWNlKDAsIGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgICAgb3B0aW9uYWxBcmdHdWFyZHM6IHJhd0FyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICB9LFxuICB9O1xufTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZCA9IChcbiAgZ2V0Q29udGV4dCxcbiAgYmVoYXZpb3JNZXRob2QsXG4gIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgbGFiZWwsXG4pID0+IHtcbiAgY29uc3QgeyByZXR1cm5HdWFyZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBjb25zdCBpc1Jhd1JldHVybiA9IGlzUmF3R3VhcmQocmV0dXJuR3VhcmQpO1xuXG4gIGNvbnN0IHsgYXdhaXRJbmRleGVzLCByYXdNZXRob2RHdWFyZFBheWxvYWQgfSA9IGRlc3luYyhtZXRob2RHdWFyZFBheWxvYWQpO1xuICBjb25zdCBtYXRjaENvbmZpZyA9IGJ1aWxkTWF0Y2hDb25maWcocmF3TWV0aG9kR3VhcmRQYXlsb2FkKTtcblxuICBjb25zdCB7IGFzeW5jTWV0aG9kIH0gPSB7XG4gICAgLy9cbiAgICBhc3luY01ldGhvZCguLi5hcmdzKSB7XG4gICAgICBjb25zdCBhd2FpdExpc3QgPSBbXTtcbiAgICAgIGZvciAoY29uc3QgaSBvZiBhd2FpdEluZGV4ZXMpIHtcbiAgICAgICAgaWYgKGkgPj0gYXJncy5sZW5ndGgpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBhd2FpdExpc3QucHVzaChhcmdzW2ldKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHAgPSBQcm9taXNlLmFsbChhd2FpdExpc3QpO1xuICAgICAgY29uc3Qgc3luY0FyZ3MgPSBbLi4uYXJnc107XG4gICAgICBjb25zdCByZXN1bHRQID0gRS53aGVuKFxuICAgICAgICBwLFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gYXdhaXRlZEFyZ3MgPT4ge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXdhaXRlZEFyZ3MubGVuZ3RoOyBqICs9IDEpIHtcbiAgICAgICAgICAgIHN5bmNBcmdzW2F3YWl0SW5kZXhlc1tqXV0gPSBhd2FpdGVkQXJnc1tqXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSBnZXRDb250ZXh0KHRoaXMpO1xuICAgICAgICAgIGNvbnN0IHJlYWxBcmdzID0gZGVmZW5kU3luY0FyZ3Moc3luY0FyZ3MsIG1hdGNoQ29uZmlnLCBsYWJlbCk7XG4gICAgICAgICAgcmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLCBjb250ZXh0LCByZWFsQXJncyk7XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIEUud2hlbihyZXN1bHRQLCBmdWxmaWxsbWVudCA9PiB7XG4gICAgICAgIGlmICghaXNSYXdSZXR1cm4pIHtcbiAgICAgICAgICBtdXN0TWF0Y2goaGFyZGVuKGZ1bGZpbGxtZW50KSwgcmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZ1bGZpbGxtZW50O1xuICAgICAgfSkuY2F0Y2gocmVhc29uID0+XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIFByb21pc2UucmVqZWN0KHRvVGhyb3dhYmxlKHJlYXNvbikpLFxuICAgICAgKTtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gYXN5bmNNZXRob2Q7XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgZGVmZW5kTWV0aG9kID0gKGdldENvbnRleHQsIGJlaGF2aW9yTWV0aG9kLCBtZXRob2RHdWFyZCwgbGFiZWwpID0+IHtcbiAgY29uc3QgbWV0aG9kR3VhcmRQYXlsb2FkID0gZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKG1ldGhvZEd1YXJkKTtcbiAgY29uc3QgeyBjYWxsS2luZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBpZiAoY2FsbEtpbmQgPT09ICdzeW5jJykge1xuICAgIHJldHVybiBkZWZlbmRTeW5jTWV0aG9kKFxuICAgICAgZ2V0Q29udGV4dCxcbiAgICAgIGJlaGF2aW9yTWV0aG9kLFxuICAgICAgbWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgICAgbGFiZWwsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoY2FsbEtpbmQgPT09ICdhc3luYycpO1xuICAgIHJldHVybiBkZWZlbmRBc3luY01ldGhvZChcbiAgICAgIGdldENvbnRleHQsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGxhYmVsLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgYmluZE1ldGhvZCA9IChcbiAgbWV0aG9kVGFnLFxuICBjb250ZXh0UHJvdmlkZXIsXG4gIGJlaGF2aW9yTWV0aG9kLFxuICBtZXRob2RHdWFyZCxcbikgPT4ge1xuICBhc3NlcnQudHlwZW9mKGJlaGF2aW9yTWV0aG9kLCAnZnVuY3Rpb24nKTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IGdldENvbnRleHQgPSByZXByZXNlbnRhdGl2ZSA9PiB7XG4gICAgcmVwcmVzZW50YXRpdmUgfHxcbiAgICAgIC8vXG4gICAgICBGYWlsYE1ldGhvZCAke21ldGhvZFRhZ30gY2FsbGVkIHdpdGhvdXQgJ3RoaXMnIG9iamVjdGA7XG4gICAgY29uc3QgY29udGV4dCA9IGNvbnRleHRQcm92aWRlcihyZXByZXNlbnRhdGl2ZSk7XG4gICAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRmFpbGAke3EoXG4gICAgICAgIG1ldGhvZFRhZyxcbiAgICAgICl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtyZXByZXNlbnRhdGl2ZX1gO1xuICAgIH1cbiAgICByZXR1cm4gY29udGV4dDtcbiAgfTtcblxuICBjb25zdCBtZXRob2QgPSBkZWZlbmRNZXRob2QoXG4gICAgZ2V0Q29udGV4dCxcbiAgICBiZWhhdmlvck1ldGhvZCxcbiAgICBtZXRob2RHdWFyZCxcbiAgICBtZXRob2RUYWcsXG4gICk7XG5cbiAgZGVmaW5lUHJvcGVydGllcyhtZXRob2QsIHtcbiAgICBuYW1lOiB7IHZhbHVlOiBtZXRob2RUYWcgfSxcbiAgICBsZW5ndGg6IHsgdmFsdWU6IGJlaGF2aW9yTWV0aG9kLmxlbmd0aCB9LFxuICB9KTtcbiAgcmV0dXJuIG1ldGhvZDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZWZlbmRQcm90b3R5cGUgPSAoXG4gIHRhZyxcbiAgY29udGV4dFByb3ZpZGVyLFxuICBiZWhhdmlvck1ldGhvZHMsXG4gIHRoaXNmdWxNZXRob2RzID0gZmFsc2UsXG4gIGludGVyZmFjZUd1YXJkID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGNvbnN0IHByb3RvdHlwZSA9IHt9O1xuICBjb25zdCBtZXRob2ROYW1lcyA9IGdldFJlbW90YWJsZU1ldGhvZE5hbWVzKGJlaGF2aW9yTWV0aG9kcykuZmlsdGVyKFxuICAgIC8vXG4gICAgLy9cbiAgICBrZXkgPT4ge1xuICAgICAgaWYgKGtleSAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gYmVoYXZpb3JNZXRob2RzLmNvbnN0cnVjdG9yO1xuICAgICAgcmV0dXJuICEoXG4gICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSAmJlxuICAgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPT09IGNvbnN0cnVjdG9yXG4gICAgICApO1xuICAgIH0sXG4gICk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IG1ldGhvZEd1YXJkcztcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgZGVmYXVsdEd1YXJkcztcbiAgaWYgKGludGVyZmFjZUd1YXJkKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW50ZXJmYWNlTmFtZSxcbiAgICAgIG1ldGhvZEd1YXJkczogbWcsXG4gICAgICBzeW1ib2xNZXRob2RHdWFyZHMsXG4gICAgICBzbG9wcHksXG4gICAgICBkZWZhdWx0R3VhcmRzOiBkZyA9IHNsb3BweSA/ICdwYXNzYWJsZScgOiBkZWZhdWx0R3VhcmRzLFxuICAgIH0gPSBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoaW50ZXJmYWNlR3VhcmQpO1xuICAgIG1ldGhvZEd1YXJkcyA9IGhhcmRlbih7XG4gICAgICAuLi5tZyxcbiAgICAgIC4uLihzeW1ib2xNZXRob2RHdWFyZHMgJiZcbiAgICAgICAgZnJvbUVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMoc3ltYm9sTWV0aG9kR3VhcmRzKSkpLFxuICAgIH0pO1xuICAgIGRlZmF1bHRHdWFyZHMgPSBkZztcbiAgICB7XG4gICAgICBjb25zdCBtZXRob2RHdWFyZE5hbWVzID0gb3duS2V5cyhtZXRob2RHdWFyZHMpO1xuICAgICAgY29uc3QgdW5pbXBsZW1lbnRlZCA9IGxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsIG1ldGhvZE5hbWVzKTtcbiAgICAgIHVuaW1wbGVtZW50ZWQubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIEZhaWxgbWV0aG9kcyAke3EodW5pbXBsZW1lbnRlZCl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuICAgICAgaWYgKGRlZmF1bHRHdWFyZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB1bmd1YXJkZWQgPSBsaXN0RGlmZmVyZW5jZShtZXRob2ROYW1lcywgbWV0aG9kR3VhcmROYW1lcyk7XG4gICAgICAgIHVuZ3VhcmRlZC5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICBGYWlsYG1ldGhvZHMgJHtxKHVuZ3VhcmRlZCl9IG5vdCBndWFyZGVkIGJ5ICR7cShpbnRlcmZhY2VOYW1lKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcykge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gYmVoYXZpb3JNZXRob2RzW3Byb3BdO1xuICAgIGNvbnN0IHsgc2hpZnRlZE1ldGhvZCB9ID0ge1xuICAgICAgc2hpZnRlZE1ldGhvZCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBiZWhhdmlvck1ldGhvZCA9IHRoaXNmdWxNZXRob2RzID8gb3JpZ2luYWxNZXRob2QgOiBzaGlmdGVkTWV0aG9kO1xuICAgIC8vXG4gICAgLy9cbiAgICBsZXQgbWV0aG9kR3VhcmQgPSBtZXRob2RHdWFyZHMgJiYgbWV0aG9kR3VhcmRzW3Byb3BdO1xuICAgIGlmICghbWV0aG9kR3VhcmQpIHtcbiAgICAgIHN3aXRjaCAoZGVmYXVsdEd1YXJkcykge1xuICAgICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICAgIGlmICh0aGlzZnVsTWV0aG9kcykge1xuICAgICAgICAgICAgbWV0aG9kR3VhcmQgPSBQYXNzYWJsZU1ldGhvZEd1YXJkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXRob2RHdWFyZCA9IFJhd01ldGhvZEd1YXJkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdwYXNzYWJsZSc6IHtcbiAgICAgICAgICBtZXRob2RHdWFyZCA9IFBhc3NhYmxlTWV0aG9kR3VhcmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncmF3Jzoge1xuICAgICAgICAgIG1ldGhvZEd1YXJkID0gUmF3TWV0aG9kR3VhcmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIGRlZmF1bHRHdWFyZHMgJHtxKGRlZmF1bHRHdWFyZHMpfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJvdG90eXBlW3Byb3BdID0gYmluZE1ldGhvZChcbiAgICAgIGBJbiAke3EocHJvcCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG4gICAgICBjb250ZXh0UHJvdmlkZXIsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkLFxuICAgICk7XG4gIH1cblxuICBpZiAoIWhhc093bihwcm90b3R5cGUsIEdFVF9JTlRFUkZBQ0VfR1VBUkQpKSB7XG4gICAgY29uc3QgZ2V0SW50ZXJmYWNlR3VhcmRNZXRob2QgPSB7XG4gICAgICBbR0VUX0lOVEVSRkFDRV9HVUFSRF0oKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBpbnRlcmZhY2VHdWFyZDtcbiAgICAgIH0sXG4gICAgfVtHRVRfSU5URVJGQUNFX0dVQVJEXTtcbiAgICBwcm90b3R5cGVbR0VUX0lOVEVSRkFDRV9HVUFSRF0gPSBiaW5kTWV0aG9kKFxuICAgICAgYEluICR7cShHRVRfSU5URVJGQUNFX0dVQVJEKX0gbWV0aG9kIG9mICgke3RhZ30pYCxcbiAgICAgIGNvbnRleHRQcm92aWRlcixcbiAgICAgIGdldEludGVyZmFjZUd1YXJkTWV0aG9kLFxuICAgICAgUGFzc2FibGVNZXRob2RHdWFyZCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIEZhcih0YWcsIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocHJvdG90eXBlKSk7XG59OyRozY9fb25jZS5kZWZlbmRQcm90b3R5cGUoZGVmZW5kUHJvdG90eXBlKTtcbmhhcmRlbihkZWZlbmRQcm90b3R5cGUpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGVmZW5kUHJvdG90eXBlS2l0ID0gKFxuICB0YWcsXG4gIGNvbnRleHRQcm92aWRlcktpdCxcbiAgYmVoYXZpb3JNZXRob2RzS2l0LFxuICB0aGlzZnVsTWV0aG9kcyA9IGZhbHNlLFxuICBpbnRlcmZhY2VHdWFyZEtpdCA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBmYWNldE5hbWVzID0gb3duS2V5cyhiZWhhdmlvck1ldGhvZHNLaXQpLnNvcnQoKTtcbiAgZmFjZXROYW1lcy5sZW5ndGggPiAxIHx8IEZhaWxgQSBtdWx0aS1mYWNldCBvYmplY3QgbXVzdCBoYXZlIG11bHRpcGxlIGZhY2V0c2A7XG4gIGlmIChpbnRlcmZhY2VHdWFyZEtpdCkge1xuICAgIGNvbnN0IGludGVyZmFjZU5hbWVzID0gb3duS2V5cyhpbnRlcmZhY2VHdWFyZEtpdCk7XG4gICAgY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcyA9IGxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsIGludGVyZmFjZU5hbWVzKTtcbiAgICBleHRyYUludGVyZmFjZU5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gICAgY29uc3QgZXh0cmFGYWNldE5hbWVzID0gbGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsIGZhY2V0TmFtZXMpO1xuICAgIGV4dHJhRmFjZXROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbm90IGd1YXJkZWQgYnkgaW50ZXJmYWNlc2A7XG4gIH1cbiAgY29uc3QgY29udGV4dE1hcE5hbWVzID0gb3duS2V5cyhjb250ZXh0UHJvdmlkZXJLaXQpO1xuICBjb25zdCBleHRyYUNvbnRleHROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsIGNvbnRleHRNYXBOYW1lcyk7XG4gIGV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gIGNvbnN0IGV4dHJhRmFjZXROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGNvbnRleHRNYXBOYW1lcywgZmFjZXROYW1lcyk7XG4gIGV4dHJhRmFjZXROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG1pc3NpbmcgY29udGV4dHNgO1xuICBjb25zdCBwcm90b0tpdCA9IG9iamVjdE1hcChiZWhhdmlvck1ldGhvZHNLaXQsIChiZWhhdmlvck1ldGhvZHMsIGZhY2V0TmFtZSkgPT5cbiAgICBkZWZlbmRQcm90b3R5cGUoXG4gICAgICBgJHt0YWd9ICR7U3RyaW5nKGZhY2V0TmFtZSl9YCxcbiAgICAgIGNvbnRleHRQcm92aWRlcktpdFtmYWNldE5hbWVdLFxuICAgICAgYmVoYXZpb3JNZXRob2RzLFxuICAgICAgdGhpc2Z1bE1ldGhvZHMsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCAmJiBpbnRlcmZhY2VHdWFyZEtpdFtmYWNldE5hbWVdLFxuICAgICksXG4gICk7XG4gIHJldHVybiBwcm90b0tpdDtcbn07JGjNj19vbmNlLmRlZmVuZFByb3RvdHlwZUtpdChkZWZlbmRQcm90b3R5cGVLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADYtGZpPAgAATwIAACYAAABAZW5kby9leG8tdjEuNS4xMi9zcmMvZ2V0LWludGVyZmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiR0VUX0lOVEVSRkFDRV9HVUFSRCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IEdFVF9JTlRFUkZBQ0VfR1VBUkQgPSAnX19nZXRJbnRlcmZhY2VHdWFyZF9fJztcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLkdFVF9JTlRFUkZBQ0VfR1VBUkQoR0VUX0lOVEVSRkFDRV9HVUFSRCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJHRVRfSU5URVJGQUNFX0dVQVJEIjpbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAHgAAAEBlbmRvL2V4by12MS41LjEyL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAgAAAAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqSbWUJgCAACYAgAAHgAAAEBlbmRvL2Zhci12MS4xLjE0L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZXhwb3J0cy5qcyJdLCJleHBvcnRzIjpbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dLFtcIi4vZXhwb3J0cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBlbmRvL2V2ZW50dWFsLXNlbmQiOltbIkUiLCJFIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJGYXIiLCJGYXIiXSxbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXSxbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVGf9kHCAAABwgAAB0AAABAZW5kby9tYXJzaGFsLXYxLjguMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVCeUNvZGVQb2ludHMiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIiwicGFzc2FibGVBc0p1c3RpbiIsInBhc3NhYmxlQXNKdXN0aW4iLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXSxbInBhc3NhYmxlQXNKdXN0aW4iLCJwYXNzYWJsZUFzSnVzdGluIl0sWyJxcCIsInFwIl1dLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6W1sibWFrZVBhc3NhYmxlS2l0IiwibWFrZVBhc3NhYmxlS2l0Il0sWyJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiXSxbIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSJdLFsiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNFbmNvZGVkUmVtb3RhYmxlIl0sWyJ6ZXJvUGFkIiwiemVyb1BhZCJdLFsicmVjb3JkTmFtZXMiLCJyZWNvcmROYW1lcyJdLFsicmVjb3JkVmFsdWVzIiwicmVjb3JkVmFsdWVzIl1dLCIuL3NyYy9yYW5rT3JkZXIuanMiOltbImNvbXBhcmVOdW1lcmljcyIsImNvbXBhcmVOdW1lcmljcyJdLFsiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVCeUNvZGVQb2ludHMiXSxbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIl0sWyJjb21wYXJlUmFuayIsImNvbXBhcmVSYW5rIl0sWyJpc1JhbmtTb3J0ZWQiLCJpc1JhbmtTb3J0ZWQiXSxbInNvcnRCeVJhbmsiLCJzb3J0QnlSYW5rIl0sWyJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQW50aVJhbmsiXSxbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXSxbImdldFBhc3NTdHlsZUNvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiXSxbImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sWyJ1bmlvblJhbmtDb3ZlcnMiLCJ1bmlvblJhbmtDb3ZlcnMiXV0sIkBlbmRvL3Bhc3Mtc3R5bGUiOltbImRlZXBseUZ1bGZpbGxlZCIsImRlZXBseUZ1bGZpbGxlZCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/V3tcLZQAAC2UAAAKgAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVQYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZVBhc3NhYmxlS2l0IiwicGFzc1N0eWxlUHJlZml4ZXMiLCJyZWNvcmROYW1lcyIsInJlY29yZFZhbHVlcyIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixhc3NlcnRSZWNvcmQsaXNFcnJvckxpa2UsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxiLHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcImJcIixbJGjNj19hID0+IChiID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgZnJvbUVudHJpZXMsIGlzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8vXG5jb25zdCByQzAgPSAvW1xceDAwLVxceDFGXS87XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZ2V0U3VmZml4ID0gKHN0ciwgaW5kZXgpID0+IChpbmRleCA9PT0gMCA/IHN0ciA6IHN0ci5zdWJzdHJpbmcoaW5kZXgpKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcmVjb3JkTmFtZXMgPSByZWNvcmQgPT5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaGFyZGVuKC8qICAgICAgICAgICAgICAgICAgICovIChvd25LZXlzKHJlY29yZCkpLnNvcnQoKS5yZXZlcnNlKCkpOyRozY9fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCByZWNvcmRWYWx1ZXMgPSAocmVjb3JkLCBuYW1lcykgPT5cbiAgaGFyZGVuKG5hbWVzLm1hcChuYW1lID0+IHJlY29yZFtuYW1lXSkpOyRozY9fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG5jb25zdCB6ZXJvZXMgPSBBcnJheSgxNilcbiAgLmZpbGwodW5kZWZpbmVkKVxuICAubWFwKChfLCBpKSA9PiAnMCcucmVwZWF0KGkpKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHplcm9QYWQgPSAobiwgc2l6ZSkgPT4ge1xuICBjb25zdCBuU3RyID0gYCR7bn1gO1xuICBjb25zdCBmaWxsTGVuID0gc2l6ZSAtIG5TdHIubGVuZ3RoO1xuICBpZiAoZmlsbExlbiA9PT0gMCkgcmV0dXJuIG5TdHI7XG4gIGFzc2VydChmaWxsTGVuID4gMCAmJiBmaWxsTGVuIDwgemVyb2VzLmxlbmd0aCk7XG4gIHJldHVybiBgJHt6ZXJvZXNbZmlsbExlbl19JHtuU3RyfWA7XG59OyRozY9fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IGFzTnVtYmVyID0gbmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cyA9IG5ldyBCaWdVaW50NjRBcnJheShhc051bWJlci5idWZmZXIpO1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzID0gJ2ZmZjgwMDAwMDAwMDAwMDAnO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgZW5jb2RlQmluYXJ5NjQgPSBuID0+IHtcbiAgLy9cbiAgaWYgKGlzKG4sIC0wKSkge1xuICAgIG4gPSAwO1xuICB9IGVsc2UgaWYgKGlzKG4sIE5hTikpIHtcbiAgICByZXR1cm4gYGYke0Nhbm9uaWNhbE5hTkJpdHN9YDtcbiAgfVxuICBhc051bWJlclswXSA9IG47XG4gIGxldCBiaXRzID0gYXNCaXRzWzBdO1xuICBpZiAobiA8IDApIHtcbiAgICBiaXRzIF49IDB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gIH0gZWxzZSB7XG4gICAgYml0cyBePSAweDgwMDAwMDAwMDAwMDAwMDBuO1xuICB9XG4gIHJldHVybiBgZiR7emVyb1BhZChiaXRzLnRvU3RyaW5nKDE2KSwgMTYpfWA7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBkZWNvZGVCaW5hcnk2NCA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICBlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJ2YnIHx8IEZhaWxgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgYml0cyA9IEJpZ0ludChgMHgke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSl9YCk7XG4gIGlmIChlbmNvZGVkLmNoYXJBdChza2lwICsgMSkgPCAnOCcpIHtcbiAgICBiaXRzIF49IDB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gIH0gZWxzZSB7XG4gICAgYml0cyBePSAweDgwMDAwMDAwMDAwMDAwMDBuO1xuICB9XG4gIGFzQml0c1swXSA9IGJpdHM7XG4gIGNvbnN0IHJlc3VsdCA9IGFzTnVtYmVyWzBdO1xuICAhaXMocmVzdWx0LCAtMCkgfHxcbiAgICBGYWlsYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUJpZ0ludCA9IG4gPT4ge1xuICBjb25zdCBhYnMgPSBuIDwgMG4gPyAtbiA6IG47XG4gIGNvbnN0IG5EaWdpdHMgPSBhYnMudG9TdHJpbmcoKS5sZW5ndGg7XG4gIGNvbnN0IGxEaWdpdHMgPSBuRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuICBpZiAobiA8IDBuKSB7XG4gICAgcmV0dXJuIGBuJHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgJyMnLnJlcGVhdChsRGlnaXRzIC0gMSlcbiAgICB9JHtcbiAgICAgIC8vXG4gICAgICAoMTAgKiogbERpZ2l0cyAtIG5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywgJzAnKVxuICAgIH06JHtcbiAgICAgIC8vXG4gICAgICAoMTBuICoqIEJpZ0ludChuRGlnaXRzKSArIG4pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywgJzAnKVxuICAgIH1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgcCR7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgICd+Jy5yZXBlYXQobERpZ2l0cyAtIDEpXG4gICAgfSR7XG4gICAgICAvL1xuICAgICAgbkRpZ2l0c1xuICAgIH06JHtcbiAgICAgIC8vXG4gICAgICBuXG4gICAgfWA7XG4gIH1cbn07XG5cbmNvbnN0IHJCaWdJbnRQYXlsb2FkID0gLyhbMC05XSspKDooWzAtOV0rJHwpfCkvcztcblxuLypcblxuXG4gKi9cbmNvbnN0IGRlY29kZUJpZ0ludCA9IGVuY29kZWQgPT4ge1xuICBjb25zdCB0eXBlUHJlZml4ID0gZW5jb2RlZC5jaGFyQXQoMCk7IC8vXG4gIHR5cGVQcmVmaXggPT09ICdwJyB8fFxuICAgIHR5cGVQcmVmaXggPT09ICduJyB8fFxuICAgIEZhaWxgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG4gIGNvbnN0IHtcbiAgICBpbmRleDogbERpZ2l0cyxcbiAgICAxOiBzbkRpZ2l0cyxcbiAgICAyOiB0YWlsLFxuICAgIDM6IGRpZ2l0cyxcbiAgfSA9IGVuY29kZWQubWF0Y2gockJpZ0ludFBheWxvYWQpIHx8IEZhaWxgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG4gIHNuRGlnaXRzLmxlbmd0aCA9PT0gbERpZ2l0cyB8fFxuICAgIEZhaWxgVW5hcnktcHJlZml4ZWQgZGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBuRGlnaXRzID0gcGFyc2VJbnQoc25EaWdpdHMsIDEwKTtcbiAgaWYgKHR5cGVQcmVmaXggPT09ICduJykge1xuICAgIC8vXG4gICAgLy9cbiAgICBuRGlnaXRzID0gMTAgKiogLyogICAgICAgICAgICAgICAgICovIChsRGlnaXRzKSAtIG5EaWdpdHM7XG4gIH1cblxuICB0YWlsLmNoYXJBdCgwKSA9PT0gJzonIHx8IEZhaWxgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgZGlnaXRzLmxlbmd0aCA9PT0gbkRpZ2l0cyB8fFxuICAgIEZhaWxgRml4ZWQtbGVuZ3RoIGRpZ2l0IHNlcXVlbmNlIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IG4gPSBCaWdJbnQoZGlnaXRzKTtcbiAgaWYgKHR5cGVQcmVmaXggPT09ICduJykge1xuICAgIC8vXG4gICAgLy9cbiAgICBuID0gLSgxMG4gKiogQmlnSW50KG5EaWdpdHMpIC0gbik7XG4gIH1cblxuICByZXR1cm4gbjtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc3RyaW5nRXNjYXBlcyA9IEFycmF5KDB4MjIpXG4gIC5maWxsKHVuZGVmaW5lZClcbiAgLm1hcCgoXywgY3ApID0+IHtcbiAgICBzd2l0Y2ggKFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApKSB7XG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgcmV0dXJuICchXyc7XG4gICAgICBjYXNlICchJzpcbiAgICAgICAgcmV0dXJuICchfCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCEke1N0cmluZy5mcm9tQ2hhckNvZGUoY3AgKyAweDIxKX1gO1xuICAgIH1cbiAgfSk7XG5zdHJpbmdFc2NhcGVzWydeJy5jaGFyQ29kZUF0KDApXSA9ICdfQCc7XG5zdHJpbmdFc2NhcGVzWydfJy5jaGFyQ29kZUF0KDApXSA9ICdfXyc7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXggPSBzdHIgPT5cbiAgc3RyLnJlcGxhY2UoL1tcXDAtIV5fXS9nLCBjaCA9PiBzdHJpbmdFc2NhcGVzW2NoLmNoYXJDb2RlQXQoMCldKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCA9IGVuY29kZWQgPT4ge1xuICByZXR1cm4gZW5jb2RlZC5yZXBsYWNlKC8oW1xcMC0hX10pKC58XFxuKT8vZywgKGVzYywgcHJlZml4LCBzdWZmaXgpID0+IHtcbiAgICBzd2l0Y2ggKGVzYykge1xuICAgICAgY2FzZSAnIV8nOlxuICAgICAgICByZXR1cm4gJyAnO1xuICAgICAgY2FzZSAnIXwnOlxuICAgICAgICByZXR1cm4gJyEnO1xuICAgICAgY2FzZSAnX0AnOlxuICAgICAgICByZXR1cm4gJ14nO1xuICAgICAgY2FzZSAnX18nOlxuICAgICAgICByZXR1cm4gJ18nO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBjaCA9IC8qICAgICAgICAgICAgICAgICAqLyAoc3VmZml4KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgKHByZWZpeCA9PT0gJyEnICYmIHN1ZmZpeCAhPT0gdW5kZWZpbmVkICYmIGNoID49ICchJyAmJiBjaCA8PSAnQCcpIHx8XG4gICAgICAgICAgRmFpbGBpbnZhbGlkIHN0cmluZyBlc2NhcGU6ICR7cShlc2MpfWA7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoLmNoYXJDb2RlQXQoMCkgLSAweDIxKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4ID0gc3RyID0+IHN0cjtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5U3RyaW5nU3VmZml4ID0gZW5jb2RlZCA9PiBlbmNvZGVkO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RBcnJheSA9IChhcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgY2hhcnMgPSBbJ14nXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFycmF5KSB7XG4gICAgY29uc3QgZW5jID0gZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG4gICAgY2hhcnMucHVzaChlbmMsICcgJyk7XG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xufTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWNvZGVDb21wYWN0QXJyYXkgPSAoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gW107XG4gIGxldCBkZXB0aCA9IDA7XG4gIC8vXG4gIC8vXG4gIGxldCBuZXh0SW5kZXggPSBza2lwICsgMTtcbiAgbGV0IGN1cnJlbnRFbGVtZW50U3RhcnQgPSBza2lwICsgMTtcbiAgZm9yIChjb25zdCB7IDA6IGNoLCBpbmRleDogaSB9IG9mIGVuY29kZWQubWF0Y2hBbGwoL1tcXF4gXS9nKSkge1xuICAgIGNvbnN0IGluZGV4ID0gLyogICAgICAgICAgICAgICAgICovIChpKTtcbiAgICBpZiAoaW5kZXggPD0gc2tpcCkge1xuICAgICAgaWYgKGluZGV4ID09PSBza2lwKSB7XG4gICAgICAgIGNoID09PSAnXicgfHwgRmFpbGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2ggPT09ICdeJykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBkZXB0aCArPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgaWYgKGluZGV4ID09PSBuZXh0SW5kZXgpIHtcbiAgICAgICAgLy9cbiAgICAgICAgZGVwdGggLT0gMTtcbiAgICAgICAgZGVwdGggPj0gMCB8fFxuICAgICAgICAgIC8vXG4gICAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGFycmF5IGVsZW1lbnQgdGVybWluYXRvcjogJHtlbmNvZGVkLnNsaWNlKHNraXAsIGluZGV4ICsgMil9YDtcbiAgICAgIH1cbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAvL1xuICAgICAgICBlbGVtZW50cy5wdXNoKFxuICAgICAgICAgIGRlY29kZVBhc3NhYmxlKGVuY29kZWQuc2xpY2UoY3VycmVudEVsZW1lbnRTdGFydCwgaW5kZXgpKSxcbiAgICAgICAgKTtcbiAgICAgICAgY3VycmVudEVsZW1lbnRTdGFydCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy9cbiAgICBuZXh0SW5kZXggPSBpbmRleCArIDE7XG4gIH1cbiAgZGVwdGggPT09IDAgfHwgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIG5leHRJbmRleCA9PT0gZW5jb2RlZC5sZW5ndGggfHxcbiAgICBGYWlsYHVudGVybWluYXRlZCBhcnJheSBlbGVtZW50OiAke2dldFN1ZmZpeChcbiAgICAgIGVuY29kZWQsXG4gICAgICBjdXJyZW50RWxlbWVudFN0YXJ0LFxuICAgICl9YDtcbiAgcmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lBcnJheSA9IChhcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgY2hhcnMgPSBbJ1snXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFycmF5KSB7XG4gICAgY29uc3QgZW5jID0gZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG4gICAgZm9yIChjb25zdCBjIG9mIGVuYykge1xuICAgICAgaWYgKGMgPT09ICdcXHUwMDAwJyB8fCBjID09PSAnXFx1MDAwMScpIHtcbiAgICAgICAgY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuICAgICAgfVxuICAgICAgY2hhcnMucHVzaChjKTtcbiAgICB9XG4gICAgY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5QXJyYXkgPSAoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gW107XG4gIGNvbnN0IGVsZW1DaGFycyA9IFtdO1xuICAvL1xuICAvL1xuICBsZXQgc3RpbGxUb1NraXAgPSBza2lwICsgMTtcbiAgbGV0IGluRXNjYXBlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgYyBvZiBlbmNvZGVkKSB7XG4gICAgaWYgKHN0aWxsVG9Ta2lwID4gMCkge1xuICAgICAgc3RpbGxUb1NraXAgLT0gMTtcbiAgICAgIGlmIChzdGlsbFRvU2tpcCA9PT0gMCkge1xuICAgICAgICBjID09PSAnWycgfHwgRmFpbGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5Fc2NhcGUpIHtcbiAgICAgIGMgPT09ICdcXHUwMDAwJyB8fFxuICAgICAgICBjID09PSAnXFx1MDAwMScgfHxcbiAgICAgICAgRmFpbGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciB1MDAwMSBlc2NhcGU6ICR7Y31gO1xuICAgICAgZWxlbUNoYXJzLnB1c2goYyk7XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFx1MDAwMCcpIHtcbiAgICAgIGNvbnN0IGVuY29kZWRFbGVtZW50ID0gZWxlbUNoYXJzLmpvaW4oJycpO1xuICAgICAgZWxlbUNoYXJzLmxlbmd0aCA9IDA7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZGVjb2RlUGFzc2FibGUoZW5jb2RlZEVsZW1lbnQpO1xuICAgICAgZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKGMgPT09ICdcXHUwMDAxJykge1xuICAgICAgaW5Fc2NhcGUgPSB0cnVlO1xuICAgICAgLy9cbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtQ2hhcnMucHVzaChjKTtcbiAgICB9XG4gICAgaW5Fc2NhcGUgPSBmYWxzZTtcbiAgfVxuICAhaW5Fc2NhcGUgfHwgRmFpbGB1bmV4cGVjdGVkIGVuZCBvZiBlbmNvZGluZyAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBlbGVtQ2hhcnMubGVuZ3RoID09PSAwIHx8XG4gICAgRmFpbGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUJ5dGVBcnJheSA9IChieXRlQXJyYXksIF9lbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAvL1xuICBGYWlsYGVuY29kZVBhc3NhYmxlKGJ5dGVBcnJheSkgbm90IHlldCBpbXBsZW1lbnRlZDogJHtieXRlQXJyYXl9YDtcbiAgcmV0dXJuICcnOyAvL1xufTtcblxuY29uc3QgZW5jb2RlUmVjb3JkID0gKHJlY29yZCwgZW5jb2RlQXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IG5hbWVzID0gcmVjb3JkTmFtZXMocmVjb3JkKTtcbiAgY29uc3QgdmFsdWVzID0gcmVjb3JkVmFsdWVzKHJlY29yZCwgbmFtZXMpO1xuICByZXR1cm4gYCgke2VuY29kZUFycmF5KGhhcmRlbihbbmFtZXMsIHZhbHVlc10pLCBlbmNvZGVQYXNzYWJsZSl9YDtcbn07XG5cbmNvbnN0IGRlY29kZVJlY29yZCA9IChlbmNvZGVkLCBkZWNvZGVBcnJheSwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJygnKTtcbiAgLy9cbiAgLy9cbiAgY29uc3QgdW56aXBwZWRFbnRyaWVzID0gZGVjb2RlQXJyYXkoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgKyAxKTtcbiAgdW56aXBwZWRFbnRyaWVzLmxlbmd0aCA9PT0gMiB8fFxuICAgIEZhaWxgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgW2tleXMsIHZhbHNdID0gdW56aXBwZWRFbnRyaWVzO1xuXG4gIChwYXNzU3R5bGVPZihrZXlzKSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICBwYXNzU3R5bGVPZih2YWxzKSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICBrZXlzLmxlbmd0aCA9PT0gdmFscy5sZW5ndGggJiZcbiAgICBrZXlzLmV2ZXJ5KGtleSA9PiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykpIHx8XG4gICAgRmFpbGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IG1hcEVudHJpZXMgPSBrZXlzLm1hcCgoa2V5LCBpKSA9PiBba2V5LCB2YWxzW2ldXSk7XG4gIGNvbnN0IHJlY29yZCA9IGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG4gIGFzc2VydFJlY29yZChyZWNvcmQsICdkZWNvZGVkIHJlY29yZCcpO1xuICByZXR1cm4gcmVjb3JkO1xufTtcblxuY29uc3QgZW5jb2RlVGFnZ2VkID0gKHRhZ2dlZCwgZW5jb2RlQXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PlxuICBgOiR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtnZXRUYWcodGFnZ2VkKSwgdGFnZ2VkLnBheWxvYWRdKSwgZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZCA9IChlbmNvZGVkLCBkZWNvZGVBcnJheSwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJzonKTtcbiAgLy9cbiAgLy9cbiAgY29uc3QgdGFnZ2VkUGF5bG9hZCA9IGRlY29kZUFycmF5KGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwICsgMSk7XG4gIHRhZ2dlZFBheWxvYWQubGVuZ3RoID09PSAyIHx8XG4gICAgRmFpbGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBbdGFnLCBwYXlsb2FkXSA9IHRhZ2dlZFBheWxvYWQ7XG4gIHBhc3NTdHlsZU9mKHRhZykgPT09ICdzdHJpbmcnIHx8XG4gICAgRmFpbGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZCk7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlUmVtb3RhYmxlID0gKHVuc2FmZUVuY29kZVJlbW90YWJsZSwgdmVyaWZ5RW5jb2RpbmcpID0+IHtcbiAgY29uc3QgZW5jb2RlUmVtb3RhYmxlID0gKHIsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVSZW1vdGFibGUociwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJ3InKSB8fFxuICAgICAgRmFpbGBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdSZW1vdGFibGUnKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVSZW1vdGFibGU7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlUHJvbWlzZSA9ICh1bnNhZmVFbmNvZGVQcm9taXNlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVQcm9taXNlID0gKHAsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVQcm9taXNlKHAsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICc/JykgfHxcbiAgICAgIEZhaWxgUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ1Byb21pc2UnKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVQcm9taXNlO1xufTtcblxuY29uc3QgbWFrZUVuY29kZUVycm9yID0gKHVuc2FmZUVuY29kZUVycm9yLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVFcnJvciA9IChlcnIsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVFcnJvcihlcnIsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICchJykgfHxcbiAgICAgIEZhaWxgRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdFcnJvcicpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZUVycm9yO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBtYWtlSW5uZXJFbmNvZGUgPSAoZW5jb2RlU3RyaW5nU3VmZml4LCBlbmNvZGVBcnJheSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlOiB1bnNhZmVFbmNvZGVSZW1vdGFibGUsXG4gICAgZW5jb2RlUHJvbWlzZTogdW5zYWZlRW5jb2RlUHJvbWlzZSxcbiAgICBlbmNvZGVFcnJvcjogdW5zYWZlRW5jb2RlRXJyb3IsXG4gICAgdmVyaWZ5RW5jb2RpbmcgPSAoKSA9PiB7fSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGVuY29kZVJlbW90YWJsZSA9IG1ha2VFbmNvZGVSZW1vdGFibGUoXG4gICAgdW5zYWZlRW5jb2RlUmVtb3RhYmxlLFxuICAgIHZlcmlmeUVuY29kaW5nLFxuICApO1xuICBjb25zdCBlbmNvZGVQcm9taXNlID0gbWFrZUVuY29kZVByb21pc2UodW5zYWZlRW5jb2RlUHJvbWlzZSwgdmVyaWZ5RW5jb2RpbmcpO1xuICBjb25zdCBlbmNvZGVFcnJvciA9IG1ha2VFbmNvZGVFcnJvcih1bnNhZmVFbmNvZGVFcnJvciwgdmVyaWZ5RW5jb2RpbmcpO1xuXG4gIGNvbnN0IGlubmVyRW5jb2RlID0gcGFzc2FibGUgPT4ge1xuICAgIGlmIChpc0Vycm9yTGlrZShwYXNzYWJsZSkpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICB9XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGFzc2FibGUpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdudWxsJzoge1xuICAgICAgICByZXR1cm4gJ3YnO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4gJ3onO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICByZXR1cm4gYHMke2VuY29kZVN0cmluZ1N1ZmZpeChwYXNzYWJsZSl9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOiB7XG4gICAgICAgIHJldHVybiBgYiR7cGFzc2FibGV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVSZW1vdGFibGUocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVQcm9taXNlKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgcmV0dXJuIGB5JHtlbmNvZGVTdHJpbmdTdWZmaXgobmFtZSl9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCeXRlQXJyYXkocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBpbm5lckVuY29kZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBsaWJlcmFsRGVjb2RlcnMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gIC8qICAgICAgICAgICAgICAgICAgKi8gKHtcbiAgICBkZWNvZGVSZW1vdGFibGU6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZVByb21pc2U6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZUVycm9yOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgfSlcbik7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUlubmVyRGVjb2RlID0gKGRlY29kZVN0cmluZ1N1ZmZpeCwgZGVjb2RlQXJyYXksIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH0gPSBvcHRpb25zO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbm5lckRlY29kZSA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICAgIHN3aXRjaCAoZW5jb2RlZC5jaGFyQXQoc2tpcCkpIHtcbiAgICAgIGNhc2UgJ3YnOiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY2FzZSAneic6IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2YnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3MnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdiJzoge1xuICAgICAgICBjb25zdCBzdWJzdHJpbmcgPSBnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpO1xuICAgICAgICBpZiAoc3Vic3RyaW5nID09PSAndHJ1ZScpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzdHJpbmcgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBleHBlY3RlZCBlbmNvZGVkIGJvb2xlYW4gdG8gYmUgXCJidHJ1ZVwiIG9yIFwiYmZhbHNlXCI6ICR7c3Vic3RyaW5nfWA7XG4gICAgICB9XG4gICAgICBjYXNlICduJzpcbiAgICAgIGNhc2UgJ3AnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaWdJbnQoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3InOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVSZW1vdGFibGUoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICc/Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUHJvbWlzZShnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVFcnJvcihnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3knOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdbJzpcbiAgICAgIGNhc2UgJ14nOiB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICcoJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICc6Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW5uZXJEZWNvZGU7XG59O1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVBhc3NhYmxlS2l0ID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlID0gKHIsIF8pID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cn1gLFxuICAgIGVuY29kZVByb21pc2UgPSAocCwgXykgPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cH1gLFxuICAgIGVuY29kZUVycm9yID0gKGVyciwgXykgPT4gRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gLFxuICAgIGZvcm1hdCA9ICdsZWdhY3lPcmRlcmVkJyxcblxuICAgIGRlY29kZVJlbW90YWJsZSA9IChlbmNvZGluZywgXykgPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICAgIGRlY29kZVByb21pc2UgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gICAgZGVjb2RlRXJyb3IgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICB9ID0gb3B0aW9ucztcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgZW5jb2RlUGFzc2FibGU7XG4gIGNvbnN0IGVuY29kZU9wdGlvbnMgPSB7IGVuY29kZVJlbW90YWJsZSwgZW5jb2RlUHJvbWlzZSwgZW5jb2RlRXJyb3IsIGZvcm1hdCB9O1xuICBpZiAoZm9ybWF0ID09PSAnY29tcGFjdE9yZGVyZWQnKSB7XG4gICAgY29uc3QgbGliZXJhbERlY29kZSA9IG1ha2VJbm5lckRlY29kZShcbiAgICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgICBsaWJlcmFsRGVjb2RlcnMsXG4gICAgKTtcbiAgICAvKlxuXG5cblxuICAgICAqL1xuICAgIGNvbnN0IHZlcmlmeUVuY29kaW5nID0gKGVuY29kaW5nLCBsYWJlbCkgPT4ge1xuICAgICAgIWVuY29kaW5nLm1hdGNoKHJDMCkgfHxcbiAgICAgICAgRmFpbGAke2IoXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICl9IGVuY29kaW5nIG11c3Qgbm90IGNvbnRhaW4gYSBDMCBjb250cm9sIGNoYXJhY3RlcjogJHtlbmNvZGluZ31gO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUNvbXBhY3RBcnJheShgXnYgJHtlbmNvZGluZ30gdiBgLCBsaWJlcmFsRGVjb2RlKTtcbiAgICAgIChpc0FycmF5KGRlY29kZWQpICYmXG4gICAgICAgIGRlY29kZWQubGVuZ3RoID09PSAzICYmXG4gICAgICAgIGRlY29kZWRbMF0gPT09IG51bGwgJiZcbiAgICAgICAgZGVjb2RlZFsyXSA9PT0gbnVsbCkgfHxcbiAgICAgICAgRmFpbGAke2IobGFiZWwpfSBlbmNvZGluZyBtdXN0IGJlIGVtYmVkZGFibGU6ICR7ZW5jb2Rpbmd9YDtcbiAgICB9O1xuICAgIGNvbnN0IGVuY29kZUNvbXBhY3QgPSBtYWtlSW5uZXJFbmNvZGUoXG4gICAgICBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlQ29tcGFjdEFycmF5LFxuICAgICAgeyAuLi5lbmNvZGVPcHRpb25zLCB2ZXJpZnlFbmNvZGluZyB9LFxuICAgICk7XG4gICAgZW5jb2RlUGFzc2FibGUgPSBwYXNzYWJsZSA9PiBgfiR7ZW5jb2RlQ29tcGFjdChwYXNzYWJsZSl9YDtcbiAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdsZWdhY3lPcmRlcmVkJykge1xuICAgIGVuY29kZVBhc3NhYmxlID0gbWFrZUlubmVyRW5jb2RlKFxuICAgICAgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlTGVnYWN5QXJyYXksXG4gICAgICBlbmNvZGVPcHRpb25zLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgZm9ybWF0OiAke3EoZm9ybWF0KX1gO1xuICB9XG5cbiAgY29uc3QgZGVjb2RlT3B0aW9ucyA9IHsgZGVjb2RlUmVtb3RhYmxlLCBkZWNvZGVQcm9taXNlLCBkZWNvZGVFcnJvciB9O1xuICBjb25zdCBkZWNvZGVDb21wYWN0ID0gbWFrZUlubmVyRGVjb2RlKFxuICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlQ29tcGFjdEFycmF5LFxuICAgIGRlY29kZU9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRlY29kZUxlZ2FjeSA9IG1ha2VJbm5lckRlY29kZShcbiAgICBkZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlTGVnYWN5QXJyYXksXG4gICAgZGVjb2RlT3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZGVjb2RlUGFzc2FibGUgPSBlbmNvZGVkID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoZW5jb2RlZC5jaGFyQXQoMCkgPT09ICd+Jykge1xuICAgICAgcmV0dXJuIGRlY29kZUNvbXBhY3QoZW5jb2RlZCwgMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVMZWdhY3koZW5jb2RlZCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IGVuY29kZVBhc3NhYmxlLCBkZWNvZGVQYXNzYWJsZSB9KTtcbn07JGjNj19vbmNlLm1ha2VQYXNzYWJsZUtpdChtYWtlUGFzc2FibGVLaXQpO1xuaGFyZGVuKG1ha2VQYXNzYWJsZUtpdCk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVBhc3NhYmxlID0gZW5jb2RlT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgZW5jb2RlUGFzc2FibGUgfSA9IG1ha2VQYXNzYWJsZUtpdChlbmNvZGVPcHRpb25zKTtcbiAgcmV0dXJuIGVuY29kZVBhc3NhYmxlO1xufTskaM2PX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlUGFzc2FibGUgPSBkZWNvZGVPcHRpb25zID0+IHtcbiAgY29uc3QgeyBkZWNvZGVQYXNzYWJsZSB9ID0gbWFrZVBhc3NhYmxlS2l0KGRlY29kZU9wdGlvbnMpO1xuICByZXR1cm4gZGVjb2RlUGFzc2FibGU7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG4gICAgICAgY29uc3QgaXNFbmNvZGVkUmVtb3RhYmxlID0gZW5jb2RlZCA9PiBlbmNvZGVkLmNoYXJBdCgwKSA9PT0gJ3InOyRozY9fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFzc1N0eWxlUHJlZml4ZXMgPSB7XG4gIGVycm9yOiAnIScsXG4gIGNvcHlSZWNvcmQ6ICcoJyxcbiAgdGFnZ2VkOiAnOicsXG4gIHByb21pc2U6ICc/JyxcbiAgY29weUFycmF5OiAnW14nLFxuICBieXRlQXJyYXk6ICdhJyxcbiAgYm9vbGVhbjogJ2InLFxuICBudW1iZXI6ICdmJyxcbiAgYmlnaW50OiAnbnAnLFxuICByZW1vdGFibGU6ICdyJyxcbiAgc3RyaW5nOiAncycsXG4gIG51bGw6ICd2JyxcbiAgc3ltYm9sOiAneScsXG4gIC8vXG4gIC8vXG4gIC8vXG4gIHVuZGVmaW5lZDogJ3onLFxufTskaM2PX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xuT2JqZWN0LnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVByZWZpeGVzLCBudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVQcmVmaXhlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWNvcmROYW1lcyI6WyJyZWNvcmROYW1lcyJdLCJyZWNvcmRWYWx1ZXMiOlsicmVjb3JkVmFsdWVzIl0sInplcm9QYWQiOlsiemVyb1BhZCJdLCJtYWtlUGFzc2FibGVLaXQiOlsibWFrZVBhc3NhYmxlS2l0Il0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADSIMmUFLAAABSwAACsAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJRQ0xBU1MiLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiLCJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxpc1ByaW1pdGl2ZSxnZXRUYWcsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxYLEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG4gIGRlZmluZVByb3BlcnRpZXMsXG4gIGlzLFxuICBlbnRyaWVzLFxuICBmcm9tRW50cmllcyxcbiAgZnJlZXplLFxuICBoYXNPd24sXG59ID0gT2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgUUNMQVNTID0gJ0BxY2xhc3MnOyRozY9fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKlxuXG5cbiAqL1xuY29uc3QgaGFzUUNsYXNzID0gZW5jb2RlZCA9PiBoYXNPd24oZW5jb2RlZCwgUUNMQVNTKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcyA9IChlbmNvZGVkLCBxY2xhc3MpID0+XG4gICFpc1ByaW1pdGl2ZShlbmNvZGVkKSAmJlxuICAhaXNBcnJheShlbmNvZGVkKSAmJlxuICBoYXNRQ2xhc3MoZW5jb2RlZCkgJiZcbiAgZW5jb2RlZFtRQ0xBU1NdID09PSBxY2xhc3M7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gcmVtID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gcHJvbSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YSA9IGVyciA9PiBGYWlsYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbmNvZGVUb0NhcERhdGEgPSAoZW5jb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuICAgIGVuY29kZVByb21pc2VUb0NhcERhdGEgPSBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbiAgICBlbmNvZGVFcnJvclRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YSxcbiAgfSA9IGVuY29kZU9wdGlvbnM7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ3VuZGVmaW5lZCcgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihwYXNzYWJsZSkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ05hTicgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ0luZmluaXR5JyB9O1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJy1JbmZpbml0eScgfTtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gaXMocGFzc2FibGUsIC0wKSA/IDAgOiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ2JpZ2ludCcsXG4gICAgICAgICAgZGlnaXRzOiBTdHJpbmcocGFzc2FibGUpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAvKiAgICAgICAgICAgICAgICAgKi8gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAnc3ltYm9sJyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgaWYgKGhhc093bihwYXNzYWJsZSwgUUNMQVNTKSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgeyBbUUNMQVNTXTogcWNsYXNzVmFsdWUsIC4uLnJlc3QgfSA9IHBhc3NhYmxlO1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgW1FDTEFTU106ICdoaWxiZXJ0JyxcbiAgICAgICAgICAgIG9yaWdpbmFsOiBlbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAob3duS2V5cyhyZXN0KS5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmVzdWx0LnJlc3QgPSBlbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoXG4gICAgICAgICAgbmFtZXMubWFwKG5hbWUgPT4gW25hbWUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBtYXJzYWwgb2YgYnl0ZUFycmF5IG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7cGFzc2FibGV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ3RhZ2dlZCcsXG4gICAgICAgICAgdGFnOiBnZXRUYWcocGFzc2FibGUpLFxuICAgICAgICAgIHBheWxvYWQ6IGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhKFxuICAgICAgICAgIHBhc3NhYmxlLFxuICAgICAgICAgIGVuY29kZVRvQ2FwRGF0YVJlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnc2xvdCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgKX0gJHtxKCdzbG90Jyl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVQcm9taXNlVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdzbG90JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgICAnc2xvdCcsXG4gICAgICAgICl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ2Vycm9yJykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICBRQ0xBU1MsXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICBYYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG4gICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgZW5jb2RlVG9DYXBEYXRhID0gcGFzc2FibGUgPT4ge1xuICAgIGlmIChpc0Vycm9yTGlrZShwYXNzYWJsZSkpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gaGFyZGVuKGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cikpO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb0NhcERhdGEobWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5oYXJkZW4obWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEgPSBzbG90RW5jb2RpbmcgPT5cbiAgRmFpbGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGEgPSBlcnJvckVuY29kaW5nID0+XG4gIEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJvckVuY29kaW5nfWA7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZUZyb21DYXBEYXRhID0gKGRlY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgPSBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhID0gZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgIGRlY29kZUVycm9yRnJvbUNhcERhdGEgPSBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSxcbiAgfSA9IGRlY29kZU9wdGlvbnM7XG5cbiAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgPT09IGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSB8fFxuICAgIEZhaWxgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbiAgICAgIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhLFxuICAgICl9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWNvZGVGcm9tQ2FwRGF0YSA9IGpzb25FbmNvZGVkID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUoanNvbkVuY29kZWQpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGpzb25FbmNvZGVkO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShqc29uRW5jb2RlZCkpIHtcbiAgICAgIHJldHVybiBqc29uRW5jb2RlZC5tYXAoZW5jb2RlZFZhbCA9PiBkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gICAgfSBlbHNlIGlmIChoYXNRQ2xhc3MoanNvbkVuY29kZWQpKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSBqc29uRW5jb2RlZFtRQ0xBU1NdO1xuICAgICAgdHlwZW9mIHFjbGFzcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgRmFpbGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG4gICAgICBzd2l0Y2ggKHFjbGFzcykge1xuICAgICAgICAvL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdOYU4nOiB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdJbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICB0eXBlb2YgZGlnaXRzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG4gICAgICAgICAgICBqc29uRW5jb2RlZCxcbiAgICAgICAgICAgIGRlY29kZUZyb21DYXBEYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbiAgICAgICAgICAgIGpzb25FbmNvZGVkLFxuICAgICAgICAgICAgZGVjb2RlRnJvbUNhcERhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlT2YoZGVjb2RlZCkgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICBoYXNPd24oanNvbkVuY29kZWQsICdvcmlnaW5hbCcpIHx8XG4gICAgICAgICAgICBGYWlsYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IFtRQ0xBU1NdOiBkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCkgfTtcbiAgICAgICAgICBpZiAoaGFzT3duKGpzb25FbmNvZGVkLCAncmVzdCcpKSB7XG4gICAgICAgICAgICBjb25zdCBpc05vbkVtcHR5T2JqZWN0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIHJlc3QgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgIHJlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPj0gMTtcbiAgICAgICAgICAgIGlmICghaXNOb25FbXB0eU9iamVjdCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdE9iaiA9IGRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgIWhhc093bihyZXN0T2JqLCBRQ0xBU1MpIHx8XG4gICAgICAgICAgICAgIEZhaWxgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIGNhc2UgJ2liaWQnOiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbiAgICAgICAgICAgIHFjbGFzcyxcbiAgICAgICAgICApfWA7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG4gICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkID09PSAnb2JqZWN0JyAmJiBqc29uRW5jb2RlZCAhPT0gbnVsbCk7XG4gICAgICBjb25zdCBkZWNvZGVFbnRyeSA9IChbbmFtZSwgZW5jb2RlZFZhbF0pID0+IHtcbiAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICByZXR1cm4gW25hbWUsIGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkZWNvZGVkRW50cmllcyA9IGVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG4gICAgICByZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAUj8p+lQsAABULAAALQAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFgsRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBpcywgZW50cmllcywgZnJvbUVudHJpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuXG5jb25zdCBCQU5HID0gJyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIID0gJy0nLmNoYXJDb2RlQXQoMCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWwgPSBlbmNvZGVkU3RyID0+IHtcbiAgaWYgKGVuY29kZWRTdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vXG4gIGNvbnN0IGNvZGUgPSBlbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4gIC8vXG4gIHJldHVybiBCQU5HIDw9IGNvZGUgJiYgY29kZSA8PSBEQVNIO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IHJlbSA9PlxuICBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gcHJvbSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzID0gZXJyID0+XG4gIEZhaWxgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7cShlcnIpfWA7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVRvU21hbGxjYXBzID0gKGVuY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG4gICAgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbiAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzID0gZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHMsXG4gIH0gPSBlbmNvZGVPcHRpb25zO1xuXG4gIGNvbnN0IGFzc2VydEVuY29kZWRFcnJvciA9IGVuY29kaW5nID0+IHtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnb2JqZWN0JyAmJiBoYXNPd24oZW5jb2RpbmcsICcjZXJyb3InKSkgfHxcbiAgICAgIEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG4gICAgICAgIGVuY29kaW5nLFxuICAgICAgKX1gO1xuICAgIC8vXG4gICAgY29uc3QgbWVzc2FnZSA9IGVuY29kaW5nWycjZXJyb3InXTtcbiAgICAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAoIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSkgfHwgbWVzc2FnZS5jaGFyQXQoMCkgPT09ICchJykpIHx8XG4gICAgICBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzoge1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIGlmIChzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4gJyN1bmRlZmluZWQnO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSkge1xuICAgICAgICAgIHJldHVybiAnI05hTic7XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuICcjSW5maW5pdHknO1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gJyMtSW5maW5pdHknO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBpcyhwYXNzYWJsZSwgLTApID8gMCA6IHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcocGFzc2FibGUpO1xuICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICovIChwYXNzYWJsZSkgPCAwbiA/IHN0ciA6IGArJHtzdHJ9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyogICAgICAgICAgICAgICAgICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIGAlJHtuYW1lfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKFxuICAgICAgICAgIG5hbWVzLm1hcChuYW1lID0+IFtcbiAgICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG4gICAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBtYXJzYWwgb2YgYnl0ZUFycmF5IG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7cGFzc2FibGV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAnI3RhZyc6IGVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnICYmIHJlc3VsdC5jaGFyQXQoMCkgPT09ICckJykge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PT0gJyYnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgICAgYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb1NtYWxsY2FwcyA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSxcbiAgICAgICk7XG4gICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2FwcyxcbiAgfSA9IGRlY29kZU9wdGlvbnM7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT4ge1xuICAgIHN3aXRjaCAodHlwZW9mIGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBpZiAoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGMgPSBlbmNvZGluZy5jaGFyQXQoMCk7XG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICclJzoge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyMnOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICAgIGNhc2UgJyN1bmRlZmluZWQnOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjTmFOJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnI0luZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjLUluZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICAgICAgWGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsXG4gICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICBjYXNlICctJzoge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyQnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKHJlc3VsdCkgIT09ICdyZW1vdGFibGUnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJic6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocGFzc1N0eWxlT2YocmVzdWx0KSAhPT0gJ3Byb21pc2UnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYFNwZWNpYWwgY2hhciAke3EoXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICApfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICBpZiAoZW5jb2RpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShlbmNvZGluZykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RpbmcubWFwKHZhbCA9PiBkZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093bihlbmNvZGluZywgJyN0YWcnKSkge1xuICAgICAgICAgIGNvbnN0IHsgJyN0YWcnOiB0YWcsIHBheWxvYWQsIC4uLnJlc3QgfSA9IGVuY29kaW5nO1xuICAgICAgICAgIHR5cGVvZiB0YWcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgIEZhaWxgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbiAgICAgICAgICByZXR1cm4gbWFrZVRhZ2dlZChcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHModGFnKSxcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMocGF5bG9hZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd24oZW5jb2RpbmcsICcjZXJyb3InKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbiAgICAgICAgICAgIGVuY29kaW5nLFxuICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhc3NTdHlsZU9mKHJlc3VsdCkgPT09ICdlcnJvcicgfHxcbiAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlY29kZUVudHJ5ID0gKFtlbmNvZGVkTmFtZSwgZW5jb2RlZFZhbF0pID0+IHtcbiAgICAgICAgICB0eXBlb2YgZW5jb2RlZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYFByb3BlcnR5IG5hbWUgJHtxKFxuICAgICAgICAgICAgICBlbmNvZGVkTmFtZSxcbiAgICAgICAgICAgICl9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgIGVuY29kZWROYW1lLmNoYXJBdCgwKSAhPT0gJyMnIHx8XG4gICAgICAgICAgICBGYWlsYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbiAgICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICByZXR1cm4gW25hbWUsIGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBkZWNvZGVkRW50cmllcyA9IGVudHJpZXMoZW5jb2RpbmcpLm1hcChkZWNvZGVFbnRyeSk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG4gICAgICAgICAgICB0eXBlb2YgZW5jb2RpbmcsXG4gICAgICAgICAgKX06ICR7ZW5jb2Rpbmd9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFyZGVuKGRlY29kZUZyb21TbWFsbGNhcHMpO1xufTskaM2PX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVuY29kZVRvU21hbGxjYXBzIjpbIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACyNkcF+jIAAPoyAAAqAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtanVzdGluLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbImRlY29kZVRvSnVzdGluIiwicGFzc2FibGVBc0p1c3RpbiIsInFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxYLEZhaWwsTmF0LGdldEVycm9yQ29uc3RydWN0b3IsaXNQcmltaXRpdmUsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxRQ0xBU1MsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dXV0sW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgc3RyaW5naWZ5OiBxdW90ZSB9ID0gSlNPTjtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlWWVzSW5kZW50ZXIgPSAoKSA9PiB7XG4gIGNvbnN0IHN0cmluZ3MgPSBbXTtcbiAgbGV0IGxldmVsID0gMDtcbiAgbGV0IG5lZWRTcGFjZSA9IGZhbHNlO1xuICBjb25zdCBsaW5lID0gKCkgPT4ge1xuICAgIG5lZWRTcGFjZSA9IGZhbHNlO1xuICAgIHJldHVybiBzdHJpbmdzLnB1c2goJ1xcbicsICcgICcucmVwZWF0KGxldmVsKSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHtcbiAgICAgIGxldmVsICs9IDE7XG4gICAgICBpZiAobmVlZFNwYWNlKSB7XG4gICAgICAgIHN0cmluZ3MucHVzaCgnICcpO1xuICAgICAgfVxuICAgICAgbmVlZFNwYWNlID0gZmFsc2U7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KTtcbiAgICB9LFxuICAgIGxpbmUsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKG5lZWRTcGFjZSAmJiB0b2tlbiAhPT0gJywnICYmIHRva2VuICE9PSAnKScpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSB0cnVlO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gICAgfSxcbiAgICBjbG9zZTogY2xvc2VCcmFja2V0ID0+IHtcbiAgICAgIGFzc2VydChsZXZlbCA+PSAxKTtcbiAgICAgIGxldmVsIC09IDE7XG4gICAgICBsaW5lKCk7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gICAgfSxcbiAgICBkb25lOiAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwobGV2ZWwsIDApO1xuICAgICAgcmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm4gPSAvXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyID0gKCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdHJpbmdzID0gW107XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG4gICAgbGluZTogKCkgPT4gc3RyaW5ncy5sZW5ndGgsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGxhc3QubGVuZ3RoID49IDEgJiYgdG9rZW4ubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICBjb25zdCBwYWlyID0gYCR7bGFzdFtsYXN0Lmxlbmd0aCAtIDFdfSR7dG9rZW5bMF19YDtcbiAgICAgICAgICBpZiAoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSkge1xuICAgICAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiAgICB9LFxuICAgIGNsb3NlOiBjbG9zZUJyYWNrZXQgPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEgJiYgc3RyaW5nc1tzdHJpbmdzLmxlbmd0aCAtIDFdID09PSAnLCcpIHtcbiAgICAgICAgc3RyaW5ncy5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiAgICB9LFxuICAgIGRvbmU6ICgpID0+IHN0cmluZ3Muam9pbignJyksXG4gIH0pO1xufTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuID0gL15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm4gPSAvXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWNvZGVUb0p1c3RpbiA9IChlbmNvZGluZywgc2hvdWxkSW5kZW50ID0gZmFsc2UsIHNsb3RzID0gW10pID0+IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJlcGFyZSA9IHJhd1RyZWUgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShyYXdUcmVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvL1xuICAgIGFzc2VydC50eXBlb2YocmF3VHJlZSwgJ29iamVjdCcpO1xuICAgIGFzc2VydChyYXdUcmVlICE9PSBudWxsKTtcbiAgICBpZiAoUUNMQVNTIGluIHJhd1RyZWUpIHtcbiAgICAgIGNvbnN0IHFjbGFzcyA9IHJhd1RyZWVbUUNMQVNTXTtcbiAgICAgIHR5cGVvZiBxY2xhc3MgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIEZhaWxgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgdHlwZW9mIGRpZ2l0cyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgIGFzc2VydC50eXBlb2Yoc3ltLCAnc3ltYm9sJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHRhZywgJ3N0cmluZycpO1xuICAgICAgICAgIHByZXBhcmUocGF5bG9hZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Nsb3QnOiB7XG4gICAgICAgICAgY29uc3QgeyBpbmRleCwgaWZhY2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuICAgICAgICAgIE5hdChpbmRleCk7XG4gICAgICAgICAgaWYgKGlmYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YoaWZhY2UsICdzdHJpbmcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICAnb3JpZ2luYWwnIGluIHJhd1RyZWUgfHxcbiAgICAgICAgICAgIEZhaWxgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xuICAgICAgICAgIHByZXBhcmUob3JpZ2luYWwpO1xuICAgICAgICAgIGlmICgncmVzdCcgaW4gcmF3VHJlZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FycmF5KHJlc3QpKSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChRQ0xBU1MgaW4gcmVzdCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgZW5jb2RpbmcgJHtyZXN0fSBtdXN0IG5vdCBjb250YWluICR7cShRQ0xBU1MpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmVzdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgRmFpbGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICAgICAgcHJlcGFyZShyZXN0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbiAgICAgICAgICB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGFzc2VydC5mYWlsKFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJhd1RyZWUpKSB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcmF3VHJlZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgcHJlcGFyZShyYXdUcmVlW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJhd1RyZWUpO1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBGYWlsYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICB9XG4gICAgICAgIHByZXBhcmUocmF3VHJlZVtuYW1lXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VJbmRlbnRlciA9IHNob3VsZEluZGVudCA/IG1ha2VZZXNJbmRlbnRlciA6IG1ha2VOb0luZGVudGVyO1xuICBsZXQgb3V0ID0gbWFrZUluZGVudGVyKCk7XG5cbiAgLypcblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlY29kZSA9IHJhd1RyZWUgPT4ge1xuICAgIC8vXG4gICAgcmV0dXJuIHJlY3VyKHJhd1RyZWUpO1xuICB9O1xuXG4gIGNvbnN0IGRlY29kZVByb3BlcnR5ID0gKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgb3V0LmxpbmUoKTtcbiAgICBpZiAobmFtZSA9PT0gJ19fcHJvdG9fXycpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBvdXQubmV4dChgW1wiX19wcm90b19fXCJdOmApO1xuICAgIH0gZWxzZSBpZiAoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIG91dC5uZXh0KGAke25hbWV9OmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubmV4dChgJHtxdW90ZShuYW1lKX06YCk7XG4gICAgfVxuICAgIGRlY29kZSh2YWx1ZSk7XG4gICAgb3V0Lm5leHQoJywnKTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCByZWN1ciA9IHJhd1RyZWUgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShyYXdUcmVlKSkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBvdXQubmV4dChxdW90ZShyYXdUcmVlKSk7XG4gICAgfVxuICAgIC8vXG4gICAgYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCAnb2JqZWN0Jyk7XG4gICAgYXNzZXJ0KHJhd1RyZWUgIT09IG51bGwpO1xuICAgIGlmIChRQ0xBU1MgaW4gcmF3VHJlZSkge1xuICAgICAgY29uc3QgcWNsYXNzID0gcmF3VHJlZVtRQ0xBU1NdO1xuICAgICAgYXNzZXJ0LnR5cGVvZihxY2xhc3MsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBzd2l0Y2ggKHJhd1RyZWVbJ0BxY2xhc3MnXSkge1xuICAgICAgICAvL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdOYU4nOlxuICAgICAgICBjYXNlICdJbmZpbml0eSc6XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICBjb25zdCB7IGRpZ2l0cyB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKGRpZ2l0cywgJ3N0cmluZycpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgJHtCaWdJbnQoZGlnaXRzKX1uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgIGFzc2VydC50eXBlb2Yoc3ltLCAnc3ltYm9sJyk7XG4gICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZE5hbWUgPSBuYW1lRm9yUGFzc2FibGVTeW1ib2woc3ltKTtcbiAgICAgICAgICBpZiAocmVnaXN0ZXJlZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBBdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuICAgICAgICAgICAgYXNzZXJ0KG1hdGNoICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgYXNzZXJ0KFN5bWJvbFtzdWZmaXhdID09PSBzeW0pO1xuICAgICAgICAgICAgYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgcGFzc2FibGVTeW1ib2xGb3JOYW1lKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgb3V0Lm5leHQoYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfWApO1xuICAgICAgICAgIG91dC5uZXh0KCcsJyk7XG4gICAgICAgICAgZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dCgnKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICBjb25zdCB7IGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKE5hdChyYXdUcmVlLmluZGV4KSk7XG4gICAgICAgICAgY29uc3QgbmVzdGVkUmVuZGVyID0gYXJnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9sZE91dCA9IG91dDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIG91dCA9IG1ha2VOb0luZGVudGVyKCk7XG4gICAgICAgICAgICAgIGRlY29kZShhcmcpO1xuICAgICAgICAgICAgICByZXR1cm4gb3V0LmRvbmUoKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIG91dCA9IG9sZE91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpbmRleCA8IHNsb3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRTbG90ID0gbmVzdGVkUmVuZGVyKHNsb3RzW2luZGV4XSk7XG4gICAgICAgICAgICByZXR1cm4gaWZhY2UgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IG91dC5uZXh0KGBzbG90VG9WYWwoJHtyZW5kZXJlZFNsb3R9KWApXG4gICAgICAgICAgICAgIDogb3V0Lm5leHQoYHNsb3RUb1ZhbCgke3JlbmRlcmVkU2xvdH0sJHtuZXN0ZWRSZW5kZXIoaWZhY2UpfSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGlmYWNlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0pYClcbiAgICAgICAgICAgIDogb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0sJHtuZXN0ZWRSZW5kZXIoaWZhY2UpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBvdXQub3BlbigneycpO1xuICAgICAgICAgIGRlY29kZVByb3BlcnR5KFFDTEFTUywgb3JpZ2luYWwpO1xuICAgICAgICAgIGlmICgncmVzdCcgaW4gcmF3VHJlZSkge1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihyZXN0LCAnb2JqZWN0Jyk7XG4gICAgICAgICAgICBhc3NlcnQocmVzdCAhPT0gbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmVzdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IEZhaWxgUHJvcGVydHkgbmFtZSAke3EoXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICl9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVjb2RlUHJvcGVydHkobmFtZSwgcmVzdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgY2F1c2UgPSB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcnMgPSB1bmRlZmluZWQsXG4gICAgICAgICAgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgY2F1c2UgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgRmFpbGBlcnJvciBjYXVzZSBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICBuYW1lICE9PSBgQWdncmVnYXRlRXJyb3JgIHx8XG4gICAgICAgICAgICBGYWlsYEFnZ3JlZ2F0ZUVycm9yIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIGVycm9ycyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYGVycm9yIGVycm9ycyBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICBYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcbiAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJhd1RyZWUpKSB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcmF3VHJlZTtcbiAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dC5uZXh0KCdbXScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0Lm9wZW4oJ1snKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIG91dC5saW5lKCk7XG4gICAgICAgICAgZGVjb2RlKHJhd1RyZWVbaV0pO1xuICAgICAgICAgIG91dC5uZXh0KCcsJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnXScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IG5hbWVzID0gLyogICAgICAgICAgICAgICAgICAgKi8gKG93bktleXMocmF3VHJlZSkpO1xuICAgICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ3t9Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQub3BlbigneycpO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShuYW1lLCByYXdUcmVlW25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBwcmVwYXJlKGVuY29kaW5nKTtcbiAgZGVjb2RlKGVuY29kaW5nKTtcbiAgcmV0dXJuIG91dC5kb25lKCk7XG59OyRozY9fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xuXG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwYXNzYWJsZUFzSnVzdGluID0gKHBhc3NhYmxlLCBzaG91bGRJbmRlbnQgPSB0cnVlKSA9PiB7XG4gIGxldCBzbG90Q291bnQgPSAwO1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBjb252ZXJ0VmFsVG9TbG90ID0gdmFsID0+IGBzJHtzbG90Q291bnQrK31gO1xuICBjb25zdCB7IHRvQ2FwRGF0YSB9ID0gbWFrZU1hcnNoYWwoY29udmVydFZhbFRvU2xvdCk7XG4gIGNvbnN0IHsgYm9keSwgc2xvdHMgfSA9IHRvQ2FwRGF0YShwYXNzYWJsZSk7XG4gIGNvbnN0IGVuY29kZWQgPSBKU09OLnBhcnNlKGJvZHkpO1xuICByZXR1cm4gZGVjb2RlVG9KdXN0aW4oZW5jb2RlZCwgc2hvdWxkSW5kZW50LCBzbG90cyk7XG59OyRozY9fb25jZS5wYXNzYWJsZUFzSnVzdGluKHBhc3NhYmxlQXNKdXN0aW4pO1xuaGFyZGVuKHBhc3NhYmxlQXNKdXN0aW4pO1xuXG4vL1xuLy9cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHFwID0gcGF5bG9hZCA9PiBgXFxgJHtwYXNzYWJsZUFzSnVzdGluKGhhcmRlbihwYXlsb2FkKSwgdHJ1ZSl9XFxgYDskaM2PX29uY2UucXAocXApO1xuaGFyZGVuKHFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl0sInBhc3NhYmxlQXNKdXN0aW4iOlsicGFzc2FibGVBc0p1c3RpbiJdLCJxcCI6WyJxcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC+IqcbSgcAAEoHAAAtAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbInBhcnNlIiwic3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90ID0gdmFsID0+XG4gIEZhaWxgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWwgPSAoc2xvdCwgX2lmYWNlKSA9PlxuICBGYWlsYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXIgPSBoYXJkZW4oe1xuICBnZXQ6IChfdGFyZ2V0LCBuYW1lLCBfcmVjZWl2ZXIpID0+IHtcbiAgICBpZiAobmFtZSA9PT0gJ2xlbmd0aCcpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvL1xuICAgIHRocm93IEZhaWxgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gIH0sXG59KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBhcnJheVRhcmdldCA9IGZyZWV6ZSgvKiAgICAgICAgICAgICAgICAqLyAoW10pKTtcbmNvbnN0IGJhZEFycmF5ID0gbmV3IFByb3h5KGFycmF5VGFyZ2V0LCBiYWRBcnJheUhhbmRsZXIpO1xuXG5jb25zdCB7IHNlcmlhbGl6ZSwgdW5zZXJpYWxpemUgfSA9IG1ha2VNYXJzaGFsKFxuICBkb05vdENvbnZlcnRWYWxUb1Nsb3QsXG4gIGRvTm90Q29udmVydFNsb3RUb1ZhbCxcbiAge1xuICAgIGVycm9yVGFnZ2luZzogJ29mZicsXG4gICAgLy9cbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnY2FwZGF0YScsXG4gIH0sXG4pO1xuXG4vKlxuXG5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gdmFsID0+IHNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjNj19vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qXG5cblxuICovXG5jb25zdCBwYXJzZSA9IHN0ciA9PlxuICB1bnNlcmlhbGl6ZShcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmcmVlemUoe1xuICAgICAgYm9keTogc3RyLFxuICAgICAgc2xvdHM6IGJhZEFycmF5LFxuICAgIH0pLFxuICApOyRozY9fb25jZS5wYXJzZShwYXJzZSk7XG5oYXJkZW4ocGFyc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAKW6nyDS8AAA0vAAAjAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2VuY29kZVRvU21hbGxjYXBzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsYXNzZXJ0UGFzc2FibGUsZ2V0SW50ZXJmYWNlT2YsZ2V0RXJyb3JDb25zdHJ1Y3Rvcix0b1Bhc3NhYmxlRXJyb3IsWCxGYWlsLHEsbWFrZUVycm9yLGFubm90YXRlRXJyb3Isb2JqZWN0TWFwLFFDTEFTUyxtYWtlRW5jb2RlVG9DYXBEYXRhLG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyxtYWtlRW5jb2RlVG9TbWFsbGNhcHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRozY9fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJ0b1Bhc3NhYmxlRXJyb3JcIixbJGjNj19hID0+ICh0b1Bhc3NhYmxlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dLFtcIm1ha2VFbmNvZGVUb0NhcERhdGFcIixbJGjNj19hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjNj19hKV1dLFtcIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YVwiLFskaM2PX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9TbWFsbGNhcHMuanNcIiwgW1tcIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzXCIsWyRozY9fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaM2PX2EpXV0sW1wibWFrZUVuY29kZVRvU21hbGxjYXBzXCIsWyRozY9fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG5jb25zdCB7IGRlZmluZVByb3BlcnRpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm4gPSB4ID0+IHg7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbiA9ICh4LCBfKSA9PiB4O1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWFyc2hhbCA9IChcbiAgY29udmVydFZhbFRvU2xvdCA9IGRlZmF1bHRWYWxUb1Nsb3RGbixcbiAgY29udmVydFNsb3RUb1ZhbCA9IGRlZmF1bHRTbG90VG9WYWxGbixcbiAge1xuICAgIGVycm9yVGFnZ2luZyA9ICdvbicsXG4gICAgbWFyc2hhbE5hbWUgPSAnYW5vbi1tYXJzaGFsJyxcbiAgICAvL1xuICAgIC8vXG4gICAgZXJyb3JJZE51bSA9IDEwMDAwLFxuICAgIC8vXG4gICAgLy9cbiAgICBtYXJzaGFsU2F2ZUVycm9yID0gZXJyID0+XG4gICAgICBjb25zb2xlLmxvZygnVGVtcG9yYXJ5IGxvZ2dpbmcgb2Ygc2VudCBlcnJvcicsIGVyciksXG4gICAgLy9cbiAgICAvL1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQgPSAnY2FwZGF0YScsXG4gIH0gPSB7fSxcbikgPT4ge1xuICBhc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCAnc3RyaW5nJyk7XG4gIGVycm9yVGFnZ2luZyA9PT0gJ29uJyB8fFxuICAgIGVycm9yVGFnZ2luZyA9PT0gJ29mZicgfHxcbiAgICBGYWlsYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG4gIGNvbnN0IG5leHRFcnJvcklkID0gKCkgPT4ge1xuICAgIGVycm9ySWROdW0gKz0gMTtcbiAgICByZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IHRvQ2FwRGF0YSA9IHJvb3QgPT4ge1xuICAgIGNvbnN0IHNsb3RzID0gW107XG4gICAgLy9cbiAgICBjb25zdCBzbG90TWFwID0gbmV3IE1hcCgpO1xuXG4gICAgLypcblxuXG4gICAgICovXG4gICAgY29uc3QgZW5jb2RlU2xvdENvbW1vbiA9IHBhc3NhYmxlID0+IHtcbiAgICAgIGxldCBpbmRleCA9IHNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGluZGV4LCByZXBlYXQ6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIGluZGV4ID0gc2xvdHMubGVuZ3RoO1xuICAgICAgY29uc3Qgc2xvdCA9IGNvbnZlcnRWYWxUb1Nsb3QocGFzc2FibGUpO1xuICAgICAgc2xvdHMucHVzaChzbG90KTtcbiAgICAgIHNsb3RNYXAuc2V0KHBhc3NhYmxlLCBpbmRleCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgaW5kZXgsIHJlcGVhdDogZmFsc2UgfSk7XG4gICAgfTtcblxuICAgIC8qXG5cblxuXG5cblxuXG5cblxuICAgICAqL1xuICAgIGNvbnN0IGVuY29kZUVycm9yQ29tbW9uID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmNvZGVSZWN1cihgJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGFzc2VydC50eXBlb2YobWVzc2FnZSwgJ3N0cmluZycpO1xuICAgICAgY29uc3QgbmFtZSA9IGVuY29kZVJlY3VyKGAke2Vyci5uYW1lfWApO1xuICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAoZXJyb3JUYWdnaW5nID09PSAnb24nKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGVycm9ySWQgPSBlbmNvZGVSZWN1cihuZXh0RXJyb3JJZCgpKTtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihlcnJvcklkLCAnc3RyaW5nJyk7XG4gICAgICAgIGFubm90YXRlRXJyb3IoZXJyLCBYYFNlbnQgYXMgJHtlcnJvcklkfWApO1xuICAgICAgICBtYXJzaGFsU2F2ZUVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBlcnJvcklkLCBtZXNzYWdlLCBuYW1lIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IG1lc3NhZ2UsIG5hbWUgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChzZXJpYWxpemVCb2R5Rm9ybWF0ID09PSAnY2FwZGF0YScpIHtcbiAgICAgIC8qXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGVuY29kZVNsb3RUb0NhcERhdGEgPSAocGFzc2FibGUsIGlmYWNlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIHJlcGVhdCB9ID0gZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbiAgICAgICAgaWYgKHJlcGVhdCA9PT0gdHJ1ZSB8fCBpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnc2xvdCcsIGluZGV4IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ3Nsb3QnLCBpZmFjZSwgaW5kZXggfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gKHZhbCwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9DYXBEYXRhKHZhbCwgZ2V0SW50ZXJmYWNlT2YodmFsKSk7XG5cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IGVuY29kZVByb21pc2VUb0NhcERhdGEgPSAocHJvbWlzZSwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9DYXBEYXRhKHByb21pc2UpO1xuXG4gICAgICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGEgPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgICBjb25zdCBlcnJEYXRhID0gZW5jb2RlRXJyb3JDb21tb24oZXJyLCBlbmNvZGVSZWN1cik7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ2Vycm9yJywgLi4uZXJyRGF0YSB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVRvQ2FwRGF0YSA9IG1ha2VFbmNvZGVUb0NhcERhdGEoe1xuICAgICAgICBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG4gICAgICAgIGVuY29kZVByb21pc2VUb0NhcERhdGEsXG4gICAgICAgIGVuY29kZUVycm9yVG9DYXBEYXRhLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUb0NhcERhdGEocm9vdCk7XG4gICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgc2xvdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHNlcmlhbGl6ZUJvZHlGb3JtYXQgPT09ICdzbWFsbGNhcHMnKSB7XG4gICAgICAvKlxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGVuY29kZVNsb3RUb1NtYWxsY2FwcyA9IChwcmVmaXgsIHBhc3NhYmxlLCBpZmFjZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCByZXBlYXQgfSA9IGVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChyZXBlYXQgPT09IHRydWUgfHwgaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSAocmVtb3RhYmxlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcsIHJlbW90YWJsZSwgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IChwcm9taXNlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb1NtYWxsY2FwcygnJicsIHByb21pc2UpO1xuXG4gICAgICBjb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgICAgY29uc3QgZXJyRGF0YSA9IGVuY29kZUVycm9yQ29tbW9uKGVyciwgZW5jb2RlUmVjdXIpO1xuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLnJlc3QgfSA9IGVyckRhdGE7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyAnI2Vycm9yJzogbWVzc2FnZSwgLi4ucmVzdCB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzID0gbWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbiAgICAgICAgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG4gICAgICAgIGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbiAgICAgICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbiAgICAgICAgc2xvdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlRnVsbFJldml2ZSA9IHNsb3RzID0+IHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IHZhbE1hcCA9IG5ldyBNYXAoKTtcblxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGNvbnN0IGRlY29kZVNsb3RDb21tb24gPSBzbG90RGF0YSA9PiB7XG4gICAgICBjb25zdCB7IGlmYWNlID0gdW5kZWZpbmVkLCBpbmRleCwgLi4ucmVzdCB9ID0gc2xvdERhdGE7XG4gICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBGYWlsYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG4gICAgICBjb25zdCBleHRhbnQgPSB2YWxNYXAuZ2V0KGluZGV4KTtcbiAgICAgIGlmIChleHRhbnQpIHtcbiAgICAgICAgcmV0dXJuIGV4dGFudDtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzW051bWJlcihOYXQoaW5kZXgpKV07XG4gICAgICBjb25zdCB2YWwgPSBjb252ZXJ0U2xvdFRvVmFsKHNsb3QsIGlmYWNlKTtcbiAgICAgIHZhbE1hcC5zZXQoaW5kZXgsIHZhbCk7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH07XG5cbiAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuICAgICAqL1xuICAgIGNvbnN0IGRlY29kZUVycm9yQ29tbW9uID0gKGVyckRhdGEsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGVycm9ySWQgPSB1bmRlZmluZWQsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNhdXNlID0gdW5kZWZpbmVkLFxuICAgICAgICBlcnJvcnMgPSB1bmRlZmluZWQsXG4gICAgICAgIC4uLnJlc3RcbiAgICAgIH0gPSBlcnJEYXRhO1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGROYW1lID0gZGVjb2RlUmVjdXIobmFtZSk7XG4gICAgICBjb25zdCBkTWVzc2FnZSA9IGRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGRFcnJvcklkID0gLyogICAgICAgICAgICAgICAgICovIChlcnJvcklkICYmIGRlY29kZVJlY3VyKGVycm9ySWQpKTtcbiAgICAgIGlmICh0eXBlb2YgZE5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkTWVzc2FnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgZE1lc3NhZ2UpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJDb25zdHJ1Y3RvciA9IGdldEVycm9yQ29uc3RydWN0b3IoZE5hbWUpIHx8IEVycm9yO1xuICAgICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgICAgZEVycm9ySWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gYFJlbW90ZSR7ZXJyQ29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgOiBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfSgke2RFcnJvcklkfSlgO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgZXJyb3JOYW1lLFxuICAgICAgICBzYW5pdGl6ZTogZmFsc2UsXG4gICAgICB9O1xuICAgICAgaWYgKGNhdXNlKSB7XG4gICAgICAgIG9wdGlvbnMuY2F1c2UgPSBkZWNvZGVSZWN1cihjYXVzZSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgIG9wdGlvbnMuZXJyb3JzID0gZGVjb2RlUmVjdXIoZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhd0Vycm9yID0gbWFrZUVycm9yKGRNZXNzYWdlLCBlcnJDb25zdHJ1Y3Rvciwgb3B0aW9ucyk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgZGVzY3MgPSBvYmplY3RNYXAocmVzdCwgZGF0YSA9PiAoe1xuICAgICAgICB2YWx1ZTogZGVjb2RlUmVjdXIoZGF0YSksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB9KSk7XG4gICAgICBkZWZpbmVQcm9wZXJ0aWVzKHJhd0Vycm9yLCBkZXNjcyk7XG4gICAgICBoYXJkZW4ocmF3RXJyb3IpO1xuICAgICAgcmV0dXJuIHRvUGFzc2FibGVFcnJvcihyYXdFcnJvcik7XG4gICAgfTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSA9IChyYXdUcmVlLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgW1FDTEFTU106IF8sIC4uLnNsb3REYXRhIH0gPSByYXdUcmVlO1xuICAgICAgcmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuICAgIH07XG5cbiAgICBjb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhID0gKHJhd1RyZWUsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7IFtRQ0xBU1NdOiBfLCAuLi5lcnJEYXRhIH0gPSByYXdUcmVlO1xuICAgICAgcmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbUNhcERhdGEgPSBtYWtlRGVjb2RlRnJvbUNhcERhdGEoe1xuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE6IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgICAgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOiBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICAgIGRlY29kZUVycm9yRnJvbUNhcERhdGEsXG4gICAgfSk7XG5cbiAgICBjb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMgPSBwcmVmaXggPT4ge1xuICAgICAgLypcblxuXG5cbiAgICAgICAqL1xuICAgICAgcmV0dXJuIChzdHJpbmdFbmNvZGluZywgX2RlY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGFzc2VydChzdHJpbmdFbmNvZGluZy5jaGFyQXQoMCkgPT09IHByZWZpeCk7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGkgPSBzdHJpbmdFbmNvZGluZy5pbmRleE9mKCcuJyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsIGkgPCAwID8gdW5kZWZpbmVkIDogaSkpO1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBpZmFjZSA9IGkgPCAwID8gdW5kZWZpbmVkIDogc3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSArIDEpO1xuICAgICAgICByZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7IGlmYWNlLCBpbmRleCB9KTtcbiAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG4gICAgY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuICAgIGNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyA9IChlbmNvZGluZywgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgJyNlcnJvcic6IG1lc3NhZ2UsIC4uLnJlc3RFcnJEYXRhIH0gPSBlbmNvZGluZztcbiAgICAgICFoYXNPd24ocmVzdEVyckRhdGEsICdtZXNzYWdlJykgfHxcbiAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbiAgICAgIHJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7IG1lc3NhZ2UsIC4uLnJlc3RFcnJEYXRhIH0sIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbiAgICAgIC8vXG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuICAgICAgLy9cbiAgICAgIGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhhcmRlbih7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0pO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGZyb21DYXBEYXRhID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyBib2R5LCBzbG90cyB9ID0gZGF0YTtcbiAgICB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuICAgIGlzQXJyYXkoZGF0YS5zbG90cykgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbiAgICBjb25zdCB7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0gPSBtYWtlRnVsbFJldml2ZShzbG90cyk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICAvL1xuICAgIGlmIChib2R5LmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gYm9keS5zbGljZSgxKTtcbiAgICAgIGNvbnN0IGVuY29kaW5nID0gaGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xuICAgICAgcmVzdWx0ID0gaGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmF3VHJlZSA9IGhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbiAgICAgIHJlc3VsdCA9IGhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gICAgfVxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICovIChyZXN1bHQpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHRvQ2FwRGF0YSxcbiAgICBmcm9tQ2FwRGF0YSxcblxuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBzZXJpYWxpemU6IHRvQ2FwRGF0YSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgdW5zZXJpYWxpemU6IGZyb21DYXBEYXRhLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM7YpjP6OgAA+joAACUAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZW5jb2RlUGFzc2FibGUuanMiXSwiZXhwb3J0cyI6WyJGdWxsUmFua0NvdmVyIiwiYXNzZXJ0UmFua1NvcnRlZCIsImNvbXBhcmF0b3JNaXJyb3JJbWFnZSIsImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVCeUNvZGVQb2ludHMiLCJjb21wYXJlTnVtZXJpY3MiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0ZW52LEZhaWwscSxnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldGVudiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJwYXNzU3R5bGVQcmVmaXhlc1wiLFskaM2PX2EgPT4gKHBhc3NTdHlsZVByZWZpeGVzID0gJGjNj19hKV1dLFtcInJlY29yZE5hbWVzXCIsWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsWyRozY9fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCB7IGlzTmFOOiBOdW1iZXJJc05hTiB9ID0gTnVtYmVyO1xuY29uc3QgeyBlbnRyaWVzLCBmcm9tRW50cmllcywgc2V0UHJvdG90eXBlT2YsIGlzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IEVORE9fUkFOS19TVFJJTkdTID0gZ2V0ZW52KCdFTkRPX1JBTktfU1RSSU5HUycsICd1dGYxNi1jb2RlLXVuaXQtb3JkZXInLCBbXG4gICd1bmljb2RlLWNvZGUtcG9pbnQtb3JkZXInLFxuICAnZXJyb3ItaWYtb3JkZXItY2hvaWNlLW1hdHRlcnMnLFxuXSk7XG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHNhbWVWYWx1ZVplcm8gPSAoeCwgeSkgPT4geCA9PT0geSB8fCBpcyh4LCB5KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgdHJpdmlhbENvbXBhcmF0b3IgPSAobGVmdCwgcmlnaHQpID0+XG4gIC8vXG4gIGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA9PT0gcmlnaHQgPyAwIDogMTtcbmhhcmRlbih0cml2aWFsQ29tcGFyYXRvcik7XG5cbi8vXG4vL1xuLy9cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjb21wYXJlQnlDb2RlUG9pbnRzID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIGNvbnN0IGxlZnRJdGVyID0gbGVmdFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIGNvbnN0IHJpZ2h0SXRlciA9IHJpZ2h0W1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IHsgdmFsdWU6IGxlZnRDaGFyIH0gPSBsZWZ0SXRlci5uZXh0KCk7XG4gICAgY29uc3QgeyB2YWx1ZTogcmlnaHRDaGFyIH0gPSByaWdodEl0ZXIubmV4dCgpO1xuICAgIGlmIChsZWZ0Q2hhciA9PT0gdW5kZWZpbmVkICYmIHJpZ2h0Q2hhciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9IGVsc2UgaWYgKGxlZnRDaGFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChyaWdodENoYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0Q29kZXBvaW50ID0gLyogICAgICAgICAgICAgICAgICovIChsZWZ0Q2hhci5jb2RlUG9pbnRBdCgwKSk7XG4gICAgY29uc3QgcmlnaHRDb2RlcG9pbnQgPSAvKiAgICAgICAgICAgICAgICAgKi8gKHJpZ2h0Q2hhci5jb2RlUG9pbnRBdCgwKSk7XG4gICAgaWYgKGxlZnRDb2RlcG9pbnQgPCByaWdodENvZGVwb2ludCkgcmV0dXJuIC0xO1xuICAgIGlmIChsZWZ0Q29kZXBvaW50ID4gcmlnaHRDb2RlcG9pbnQpIHJldHVybiAxO1xuICB9XG59OyRozY9fb25jZS5jb21wYXJlQnlDb2RlUG9pbnRzKGNvbXBhcmVCeUNvZGVQb2ludHMpO1xuaGFyZGVuKGNvbXBhcmVCeUNvZGVQb2ludHMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNvbXBhcmVOdW1lcmljcyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICAvL1xuICBpZiAobGVmdCA8IHJpZ2h0KSByZXR1cm4gLTE7XG4gIC8vXG4gIGlmIChsZWZ0ID4gcmlnaHQpIHJldHVybiAxO1xuICBpZiAoTnVtYmVySXNOYU4obGVmdCkgPT09IE51bWJlcklzTmFOKHJpZ2h0KSkgcmV0dXJuIDA7XG4gIGlmIChOdW1iZXJJc05hTihyaWdodCkpIHJldHVybiAtMTtcbiAgYXNzZXJ0KE51bWJlcklzTmFOKGxlZnQpKTtcbiAgcmV0dXJuIDE7XG59O1xuXG4vKlxuXG4gKi8kaM2PX29uY2UuY29tcGFyZU51bWVyaWNzKGNvbXBhcmVOdW1lcmljcyk7XG5cbmNvbnN0IHBhc3NTdHlsZVJhbmtzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICBmcm9tRW50cmllcyhcbiAgICBlbnRyaWVzKHBhc3NTdHlsZVByZWZpeGVzKVxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAuc29ydCgoW19sZWZ0U3R5bGUsIGxlZnRQcmVmaXhlc10sIFtfcmlnaHRTdHlsZSwgcmlnaHRQcmVmaXhlc10pID0+IHtcbiAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcywgcmlnaHRQcmVmaXhlcyk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoW3Bhc3NTdHlsZSwgcHJlZml4ZXNdLCBpbmRleCkgPT4ge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBwcmVmaXhlcyA9PT0gcHJlZml4ZXMuc3BsaXQoJycpLnNvcnQoKS5qb2luKCcnKSB8fFxuICAgICAgICAgIEZhaWxgdW5zb3J0ZWQgcHJlZml4ZXMgZm9yIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7cShwcmVmaXhlcyl9YDtcbiAgICAgICAgY29uc3QgY292ZXIgPSBbXG4gICAgICAgICAgcHJlZml4ZXMuY2hhckF0KDApLFxuICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUocHJlZml4ZXMuY2hhckNvZGVBdChwcmVmaXhlcy5sZW5ndGggLSAxKSArIDEpLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gW3Bhc3NTdHlsZSwgeyBpbmRleCwgY292ZXIgfV07XG4gICAgICB9KSxcbiAgKVxuKTtcbnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVJhbmtzLCBudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRQYXNzU3R5bGVDb3ZlciA9IHBhc3NTdHlsZSA9PiBwYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRozY9fb25jZS5nZXRQYXNzU3R5bGVDb3ZlcihnZXRQYXNzU3R5bGVDb3Zlcik7XG5oYXJkZW4oZ2V0UGFzc1N0eWxlQ292ZXIpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZCA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb21wYXJhdG9yS2l0ID0gKGNvbXBhcmVSZW1vdGFibGVzID0gKF94LCBfeSkgPT4gTmFOKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNvbXBhcmF0b3IgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgICBpZiAoc2FtZVZhbHVlWmVybyhsZWZ0LCByaWdodCkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0U3R5bGUgPSBwYXNzU3R5bGVPZihsZWZ0KTtcbiAgICBjb25zdCByaWdodFN0eWxlID0gcGFzc1N0eWxlT2YocmlnaHQpO1xuICAgIGlmIChsZWZ0U3R5bGUgIT09IHJpZ2h0U3R5bGUpIHtcbiAgICAgIHJldHVybiBjb21wYXJlTnVtZXJpY3MoXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW3JpZ2h0U3R5bGVdLmluZGV4LFxuICAgICAgKTtcbiAgICB9XG4gICAgLypcblxuICAgICAqL1xuICAgIHN3aXRjaCAobGVmdFN0eWxlKSB7XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBzd2l0Y2ggKEVORE9fUkFOS19TVFJJTkdTKSB7XG4gICAgICAgICAgY2FzZSAndXRmMTYtY29kZS11bml0LW9yZGVyJzoge1xuICAgICAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAndW5pY29kZS1jb2RlLXBvaW50LW9yZGVyJzoge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVCeUNvZGVQb2ludHMobGVmdCwgcmlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdlcnJvci1pZi1vcmRlci1jaG9pY2UtbWF0dGVycyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDEgPSB0cml2aWFsQ29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQyID0gY29tcGFyZUJ5Q29kZVBvaW50cyhsZWZ0LCByaWdodCk7XG4gICAgICAgICAgICByZXN1bHQxID09PSByZXN1bHQyIHx8XG4gICAgICAgICAgICAgIEZhaWxgQ29tcGFyaXNvbnMgZGlmZmVyZWQ6ICR7bGVmdH0gdnMgJHtyaWdodH0sICR7cShyZXN1bHQxKX0gdnMgJHtxKHJlc3VsdDIpfWA7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0MTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBVbmV4cGVjdGVkIEVORE9fUkFOS19TVFJJTkdTICR7cShFTkRPX1JBTktfU1RSSU5HUyl9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IoXG4gICAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sKGxlZnQpLFxuICAgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJlTnVtZXJpY3MobGVmdCwgcmlnaHQpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cblxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBsZWZ0TmFtZXMgPSByZWNvcmROYW1lcyhsZWZ0KTtcbiAgICAgICAgY29uc3QgcmlnaHROYW1lcyA9IHJlY29yZE5hbWVzKHJpZ2h0KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJhdG9yKGxlZnROYW1lcywgcmlnaHROYW1lcyk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlZnRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMobGVmdCwgbGVmdE5hbWVzKTtcbiAgICAgICAgY29uc3QgcmlnaHRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMocmlnaHQsIHJpZ2h0TmFtZXMpO1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0VmFsdWVzLCByaWdodFZhbHVlcyk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0W2ldLCByaWdodFtpXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICB9XG4gICAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHsgYnl0ZUxlbmd0aDogbGVmdExlbiB9ID0gbGVmdDtcbiAgICAgICAgY29uc3QgeyBieXRlTGVuZ3RoOiByaWdodExlbiB9ID0gcmlnaHQ7XG4gICAgICAgIGlmIChsZWZ0TGVuIDwgcmlnaHRMZW4pIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxlZnRMZW4gPiByaWdodExlbikge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbGVmdEFycmF5ID1cbiAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YobGVmdCkgPT09IEFycmF5QnVmZmVyLnByb3RvdHlwZVxuICAgICAgICAgICAgPyBuZXcgVWludDhBcnJheShsZWZ0KVxuICAgICAgICAgICAgOiBuZXcgVWludDhBcnJheShsZWZ0LnNsaWNlKDApKTtcbiAgICAgICAgY29uc3QgcmlnaHRBcnJheSA9XG4gICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKHJpZ2h0KSA9PT0gQXJyYXlCdWZmZXIucHJvdG90eXBlXG4gICAgICAgICAgICA/IG5ldyBVaW50OEFycmF5KHJpZ2h0KVxuICAgICAgICAgICAgOiBuZXcgVWludDhBcnJheShyaWdodC5zbGljZSgwKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVmdExlbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgbGVmdEJ5dGUgPSBsZWZ0QXJyYXlbaV07XG4gICAgICAgICAgY29uc3QgcmlnaHRCeXRlID0gcmlnaHRBcnJheVtpXTtcbiAgICAgICAgICBpZiAobGVmdEJ5dGUgPCByaWdodEJ5dGUpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGxlZnRCeXRlID4gcmlnaHRCeXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGxhYmVsQ29tcCA9IGNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLCBnZXRUYWcocmlnaHQpKTtcbiAgICAgICAgaWYgKGxhYmVsQ29tcCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiBsYWJlbENvbXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IobGVmdC5wYXlsb2FkLCByaWdodC5wYXlsb2FkKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiAgICAgICAgICAgICAgICovXG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgb3V0ZXJDb21wYXJhdG9yID0gKHgsIHkpID0+XG4gICAgLy9cbiAgICAvL1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKGNvbXBhcmF0b3IoeCwgeSkgfHwgMCk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYW50aUNvbXBhcmF0b3IgPSAoeCwgeSkgPT4gb3V0ZXJDb21wYXJhdG9yKHksIHgpO1xuXG4gIG1lbW9PZlNvcnRlZC5zZXQob3V0ZXJDb21wYXJhdG9yLCBuZXcgV2Vha1NldCgpKTtcbiAgbWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvciwgbmV3IFdlYWtTZXQoKSk7XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KG91dGVyQ29tcGFyYXRvciwgYW50aUNvbXBhcmF0b3IpO1xuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvciwgb3V0ZXJDb21wYXJhdG9yKTtcblxuICByZXR1cm4gaGFyZGVuKHsgY29tcGFyYXRvcjogb3V0ZXJDb21wYXJhdG9yLCBhbnRpQ29tcGFyYXRvciB9KTtcbn07XG4vKlxuXG5cbiAqLyRozY9fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG4gICAgICAgY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlID0gY29tcGFyYXRvciA9PlxuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLmdldChjb21wYXJhdG9yKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbiAgICAgICBjb25zdCBpc1JhbmtTb3J0ZWQgPSAocGFzc2FibGVzLCBjb21wYXJlKSA9PiB7XG4gIGNvbnN0IHN1Yk1lbW9PZlNvcnRlZCA9IG1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG4gIGFzc2VydChzdWJNZW1vT2ZTb3J0ZWQgIT09IHVuZGVmaW5lZCk7XG4gIGlmIChzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBhc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKSA9PT0gJ2NvcHlBcnJheScpO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IHBhc3NhYmxlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChjb21wYXJlKHBhc3NhYmxlc1tpIC0gMV0sIHBhc3NhYmxlc1tpXSkgPj0gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRSYW5rU29ydGVkID0gKHNvcnRlZCwgY29tcGFyZSkgPT5cbiAgaXNSYW5rU29ydGVkKHNvcnRlZCwgY29tcGFyZSkgfHxcbiAgLy9cbiAgLy9cbiAgRmFpbGBNdXN0IGJlIHJhbmsgc29ydGVkOiAke3NvcnRlZH0gdnMgJHtzb3J0QnlSYW5rKHNvcnRlZCwgY29tcGFyZSl9YDskaM2PX29uY2UuYXNzZXJ0UmFua1NvcnRlZChhc3NlcnRSYW5rU29ydGVkKTtcbmhhcmRlbihhc3NlcnRSYW5rU29ydGVkKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3Qgc29ydEJ5UmFuayA9IChwYXNzYWJsZXMsIGNvbXBhcmUpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCB1bnNvcnRlZDtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSkge1xuICAgIGhhcmRlbihwYXNzYWJsZXMpO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGlmIChpc1JhbmtTb3J0ZWQocGFzc2FibGVzLCBjb21wYXJlKSkge1xuICAgICAgcmV0dXJuIHBhc3NhYmxlcztcbiAgICB9XG4gICAgdW5zb3J0ZWQgPSBbLi4ucGFzc2FibGVzXTtcbiAgfSBlbHNlIHtcbiAgICB1bnNvcnRlZCA9IEFycmF5LmZyb20ocGFzc2FibGVzLCBoYXJkZW4pO1xuICB9XG4gIGNvbnN0IHNvcnRlZCA9IHVuc29ydGVkLnNvcnQoY29tcGFyZSk7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjb21wYXJlKHRydWUsIHVuZGVmaW5lZCkgPiAwKSB7XG4gICAgbGV0IGkgPSBzb3J0ZWQubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoaSA+PSAwICYmIHNvcnRlZFtpXSA9PT0gdW5kZWZpbmVkKSBpIC09IDE7XG4gICAgY29uc3QgbiA9IHNvcnRlZC5sZW5ndGggLSBpIC0gMTtcbiAgICBpZiAobiA+IDAgJiYgbiA8IHNvcnRlZC5sZW5ndGgpIHtcbiAgICAgIHNvcnRlZC5jb3B5V2l0aGluKG4sIDApO1xuICAgICAgc29ydGVkLmZpbGwoLyogICAgICAgICAgICAqLyAodW5kZWZpbmVkKSwgMCwgbik7XG4gICAgfVxuICB9XG4gIGhhcmRlbihzb3J0ZWQpO1xuICBjb25zdCBzdWJNZW1vT2ZTb3J0ZWQgPSBtZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuICBhc3NlcnQoc3ViTWVtb09mU29ydGVkICE9PSB1bmRlZmluZWQpO1xuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG4gIHJldHVybiBzb3J0ZWQ7XG59OyRozY9fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmFua1NlYXJjaCA9IChzb3J0ZWQsIGNvbXBhcmUsIGtleSwgYmlhcyA9ICdsZWZ0TW9zdCcpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpO1xuICBsZXQgbGVmdCA9IDA7XG4gIGxldCByaWdodCA9IHNvcnRlZC5sZW5ndGg7XG4gIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlKHNvcnRlZFttXSwga2V5KTtcbiAgICBpZiAoY29tcCA8PSAtMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAncmlnaHRNb3N0JykpIHtcbiAgICAgIGxlZnQgPSBtICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGNvbXAgPj0gMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAnbGVmdE1vc3QnKSk7XG4gICAgICByaWdodCA9IG07XG4gICAgfVxuICB9XG4gIHJldHVybiBiaWFzID09PSAnbGVmdE1vc3QnID8gbGVmdCA6IHJpZ2h0IC0gMTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldEluZGV4Q292ZXIgPSAoc29ydGVkLCBjb21wYXJlLCBbbGVmdEtleSwgcmlnaHRLZXldKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgY29uc3QgbGVmdEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIGxlZnRLZXksICdsZWZ0TW9zdCcpO1xuICBjb25zdCByaWdodEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIHJpZ2h0S2V5LCAncmlnaHRNb3N0Jyk7XG4gIHJldHVybiBbbGVmdEluZGV4LCByaWdodEluZGV4XTtcbn07JGjNj19vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IEZ1bGxSYW5rQ292ZXIgPSBoYXJkZW4oWycnLCAneyddKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuICAgICAgIGNvbnN0IGNvdmVyZWRFbnRyaWVzID0gKHNvcnRlZCwgW2xlZnRJbmRleCwgcmlnaHRJbmRleF0pID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpdGVyYWJsZSA9IGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gbGVmdEluZGV4O1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAoaSA8PSByaWdodEluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc29ydGVkW2ldO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlOiBbaSwgZWxlbWVudF0sIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1heFJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPj0gMCA/IGEgOiBiKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1pblJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPD0gMCA/IGEgOiBiKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHVuaW9uUmFua0NvdmVycyA9IChjb21wYXJlLCBjb3ZlcnMpID0+IHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IHVuaW9uUmFua0NvdmVyUGFpciA9IChbbGVmdEEsIHJpZ2h0QV0sIFtsZWZ0QiwgcmlnaHRCXSkgPT4gW1xuICAgIG1pblJhbmsoY29tcGFyZSwgbGVmdEEsIGxlZnRCKSxcbiAgICBtYXhSYW5rKGNvbXBhcmUsIHJpZ2h0QSwgcmlnaHRCKSxcbiAgXTtcbiAgcmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLCBbJ3snLCAnJ10pO1xufTskaM2PX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGludGVyc2VjdFJhbmtDb3ZlcnMgPSAoY29tcGFyZSwgY292ZXJzKSA9PiB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyID0gKFtsZWZ0QSwgcmlnaHRBXSwgW2xlZnRCLCByaWdodEJdKSA9PiBbXG4gICAgbWF4UmFuayhjb21wYXJlLCBsZWZ0QSwgbGVmdEIpLFxuICAgIG1pblJhbmsoY29tcGFyZSwgcmlnaHRBLCByaWdodEIpLFxuICBdO1xuICByZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLCBbJycsICd7J10pO1xufTskaM2PX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuICAgICAgIGNvbnN0IHsgY29tcGFyYXRvcjogY29tcGFyZVJhbmssIGFudGlDb21wYXJhdG9yOiBjb21wYXJlQW50aVJhbmsgfSA9XG4gIG1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRozY9fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbiAgICAgICBjb25zdCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9IChsb25nTGl2ZWQgPSBmYWxzZSkgPT4ge1xuICBsZXQgbnVtU2VlbiA9IDA7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IE1hcENvbnN0cnVjdG9yID0gbG9uZ0xpdmVkID8gV2Vha01hcCA6IE1hcDtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuICBjb25zdCB0YWcgPSByID0+IHtcbiAgICBpZiAoc2Vlbi5oYXMocikpIHtcbiAgICAgIHJldHVybiBzZWVuLmdldChyKTtcbiAgICB9XG4gICAgbnVtU2VlbiArPSAxO1xuICAgIHNlZW4uc2V0KHIsIG51bVNlZW4pO1xuICAgIHJldHVybiBudW1TZWVuO1xuICB9O1xuICBjb25zdCBjb21wYXJlUmVtb3RhYmxlcyA9ICh4LCB5KSA9PiBjb21wYXJlUmFuayh0YWcoeCksIHRhZyh5KSk7XG4gIHJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG59OyRozY9fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29tcGFyZUJ5Q29kZVBvaW50cyI6WyJjb21wYXJlQnlDb2RlUG9pbnRzIl0sImNvbXBhcmVOdW1lcmljcyI6WyJjb21wYXJlTnVtZXJpY3MiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXpyzyswFAADMBQAAHQAAAEBlbmRvL25hdC12NS4xLjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsJ25hbWUnLHt2YWx1ZTpcImlzTmF0XCJ9KTskaM2PX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsJ25hbWUnLHt2YWx1ZTpcIk5hdFwifSk7JGjNj19vbmNlLk5hdChOYXQpOy8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKSB7XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gYWxsZWdlZE51bSA+PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkgJiYgYWxsZWdlZE51bSA+PSAwO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pIHtcbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnYmlnaW50Jykge1xuICAgIGlmIChhbGxlZ2VkTnVtIDwgMG4pIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbGVnZWROdW07XG4gIH1cblxuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSkge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtcbiAgICB9XG4gICAgaWYgKGFsbGVnZWROdW0gPCAwKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gICAgfVxuICAgIHJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gIH1cblxuICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmAsXG4gICk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG5u3nM2CwAANgsAACAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvc3RyaW5nLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyIsImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIiwiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSIsImlzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZSIsImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIixudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2l0ZXItaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL2Vycm9yLmpzXCIsIFtdXSxbXCIuL3NyYy9yZW1vdGFibGUuanNcIiwgW11dLFtcIi4vc3JjL3N5bWJvbC5qc1wiLCBbXV0sW1wiLi9zcmMvc3RyaW5nLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOltbIm1hcEl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSxbImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiXV0sIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjpbWyJQQVNTX1NUWUxFIiwiUEFTU19TVFlMRSJdLFsiaXNPYmplY3QiLCJpc09iamVjdCJdLFsiaXNQcmltaXRpdmUiLCJpc1ByaW1pdGl2ZSJdLFsiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENoZWNrZXIiXSxbImdldFRhZyIsImdldFRhZyJdLFsiaGFzT3duUHJvcGVydHlPZiIsImhhc093blByb3BlcnR5T2YiXV0sIi4vc3JjL2Vycm9yLmpzIjpbWyJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLFsiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSJdXSwiLi9zcmMvcmVtb3RhYmxlLmpzIjpbWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl0sWyJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyIsImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIl1dLCIuL3NyYy9zeW1ib2wuanMiOltbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSxbImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIl0sWyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSxbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLFsidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJ1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdXSwiLi9zcmMvc3RyaW5nLmpzIjpbWyJpc1dlbGxGb3JtZWRTdHJpbmciLCJpc1dlbGxGb3JtZWRTdHJpbmciXSxbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRQYXNzYWJsZVN0cmluZyIsImFzc2VydFBhc3NhYmxlU3RyaW5nIl1dLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6W1sicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdLFsiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiXSxbImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGUiXSxbInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciJdLFsidG9UaHJvd2FibGUiLCJ0b1Rocm93YWJsZSJdXSwiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6W1sibWFrZVRhZ2dlZCIsIm1ha2VUYWdnZWQiXV0sIi4vc3JjL21ha2UtZmFyLmpzIjpbWyJSZW1vdGFibGUiLCJSZW1vdGFibGUiXSxbIkZhciIsIkZhciJdLFsiVG9GYXJGdW5jdGlvbiIsIlRvRmFyRnVuY3Rpb24iXSxbIkdFVF9NRVRIT0RfTkFNRVMiLCJHRVRfTUVUSE9EX05BTUVTIl1dLCIuL3NyYy90eXBlR3VhcmRzLmpzIjpbWyJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZWNvcmQiXSxbImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSJdLFsiYXNzZXJ0UmVtb3RhYmxlIiwiYXNzZXJ0UmVtb3RhYmxlIl0sWyJpc1JlbW90YWJsZSIsImlzUmVtb3RhYmxlIl0sWyJpc1JlY29yZCIsImlzUmVjb3JkIl0sWyJpc0NvcHlBcnJheSIsImlzQ29weUFycmF5Il0sWyJpc0F0b20iLCJpc0F0b20iXSxbImFzc2VydEF0b20iLCJhc3NlcnRBdG9tIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABCkKsYxggAAMYIAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2J5dGVBcnJheS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJCeXRlQXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuICovXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvciB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzLCBhcHBseSB9ID0gUmVmbGVjdDtcblxuLy9cbi8vXG4vL1xuY29uc3QgYWRhcHRJbW11dGFibGVBcnJheUJ1ZmZlciA9ICgpID0+IHtcbiAgY29uc3QgYW5BcnJheUJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBpZiAoYW5BcnJheUJ1ZmZlci5zbGljZVRvSW1tdXRhYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGU6IG51bGwsXG4gICAgICBpbW11dGFibGVHZXR0ZXI6ICgpID0+IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvL1xuICAvL1xuICBjb25zdCBhbkltbXV0YWJsZUFycmF5QnVmZmVyID0gYW5BcnJheUJ1ZmZlci5zbGljZVRvSW1tdXRhYmxlKCk7XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbkltbXV0YWJsZUFycmF5QnVmZmVyKTtcblxuICBjb25zdCBpbW11dGFibGVHZXR0ZXIgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIC8vXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlLCAnaW1tdXRhYmxlJykuZ2V0XG4gICk7XG5cbiAgcmV0dXJuIHsgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUsIGltbXV0YWJsZUdldHRlciB9O1xufTtcblxuY29uc3QgeyBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSwgaW1tdXRhYmxlR2V0dGVyIH0gPVxuICBhZGFwdEltbXV0YWJsZUFycmF5QnVmZmVyKCk7XG5cbi8qXG5cbiAqL1xuICAgICAgIGNvbnN0IEJ5dGVBcnJheUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2J5dGVBcnJheScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gICAgKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyICYmXG4gICAgICAvL1xuICAgICAgY2FuZGlkYXRlLmltbXV0YWJsZSkgfHxcbiAgICAoISFjaGVjayAmJiBjaGVjayhmYWxzZSwgWGBJbW11dGFibGUgQXJyYXlCdWZmZXIgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIF9wYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUgfHxcbiAgICAgIGFzc2VydC5mYWlsKFhgTWFsZm9ybWVkIEJ5dGVBcnJheSAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICAgIGFwcGx5KGltbXV0YWJsZUdldHRlciwgY2FuZGlkYXRlLCBbXSkgfHxcbiAgICAgIEZhaWxgTXVzdCBiZSBhbiBpbW11dGFibGUgQXJyYXlCdWZmZXI6ICR7Y2FuZGlkYXRlfWA7XG4gICAgb3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgIFhgQnl0ZUFycmF5cyBtdXN0IG5vdCBoYXZlIG93biBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gLFxuICAgICAgICBUeXBlRXJyb3IsXG4gICAgICApO1xuICB9LFxufSk7JGjNj19vbmNlLkJ5dGVBcnJheUhlbHBlcihCeXRlQXJyYXlIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnl0ZUFycmF5SGVscGVyIjpbIkJ5dGVBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADD7/ZFvAYAALwGAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxhc3NlcnRDaGVja2VyLGdldE93bkRhdGFEZXNjcmlwdG9yOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGdldFByb3RvdHlwZU9mIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXksIHByb3RvdHlwZTogYXJyYXlQcm90b3R5cGUgfSA9IEFycmF5O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IENvcHlBcnJheUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2NvcHlBcnJheScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gICAgaXNBcnJheShjYW5kaWRhdGUpIHx8XG4gICAgKCEhY2hlY2sgJiYgY2hlY2soZmFsc2UsIFhgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBhcnJheVByb3RvdHlwZSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBNYWxmb3JtZWQgYXJyYXk6ICR7Y2FuZGlkYXRlfWAsIFR5cGVFcnJvcik7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGxlbiA9IC8qICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsICdsZW5ndGgnLCBmYWxzZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWVcbiAgICApO1xuICAgIC8vXG4gICAgLy9cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICBwYXNzU3R5bGVPZlJlY3VyKFxuICAgICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsIGksIHRydWUsIGFzc2VydENoZWNrZXIpLnZhbHVlLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy9cbiAgICBvd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoID09PSBsZW4gKyAxIHx8XG4gICAgICBhc3NlcnQuZmFpbChYYEFycmF5cyBtdXN0IG5vdCBoYXZlIG5vbi1pbmRleGVzOiAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICB9LFxufSk7JGjNj19vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADWqGmfHwkAAB8JAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiQ29weVJlY29yZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydENoZWNrZXIsZ2V0T3duRGF0YURlc2NyaXB0b3IsQ1gsY2FuQmVNZXRob2Q7JGjNj19pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiY2FuQmVNZXRob2RcIixbJGjNj19hID0+IChjYW5CZU1ldGhvZCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCBjaGVja09iamVjdFByb3RvdHlwZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIHJldHVybiAoXG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkID0gKGNhbmRpZGF0ZSwga2V5LCB2YWx1ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIChcbiAgICAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKCFjYW5CZU1ldGhvZCh2YWx1ZSkgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIC8vXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFJlY29yZHMgY2Fubm90IGNvbnRhaW4gbm9uLWZhciBmdW5jdGlvbnMgYmVjYXVzZSB0aGV5IG1heSBiZSBtZXRob2RzIG9mIGFuIGltcGxpY2l0IFJlbW90YWJsZTogJHtjYW5kaWRhdGV9YCkpXG4gICk7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IENvcHlSZWNvcmRIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdjb3B5UmVjb3JkJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBjaGVja09iamVjdFByb3RvdHlwZShjYW5kaWRhdGUsIGNoZWNrKSAmJlxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBvd25LZXlzKGNhbmRpZGF0ZSkuZXZlcnkoa2V5ID0+XG4gICAgICAgIGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkKGNhbmRpZGF0ZSwga2V5LCBjYW5kaWRhdGVba2V5XSwgY2hlY2spLFxuICAgICAgKVxuICAgICk7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSkge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gZ2V0T3duRGF0YURlc2NyaXB0b3IoXG4gICAgICAgIGNhbmRpZGF0ZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgYXNzZXJ0Q2hlY2tlcixcbiAgICAgICk7XG4gICAgICBwYXNzU3R5bGVPZlJlY3VyKHZhbHVlKTtcbiAgICB9XG4gIH0sXG59KTskaM2PX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAjXccFhwwAAIcMAAAuAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgscSxFLGlzUHJvbWlzZSxnZXRUYWcscGFzc1N0eWxlT2YsbWFrZVRhZ2dlZCxpc0F0b207JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcImlzQXRvbVwiLFskaM2PX2EgPT4gKGlzQXRvbSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBseUZ1bGZpbGxlZCA9IGFzeW5jIHZhbCA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgLy9cbiAgLy9cbiAgaWYgKGlzQXRvbSh2YWwpKSB7XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHZhbCk7XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaWYgKGlzUHJvbWlzZSh2YWwpKSB7XG4gICAgcmV0dXJuIEUud2hlbih2YWwsIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgfVxuICAvL1xuICAvL1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICBjb25zdCByZWMgPSAvKiAgICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgY29uc3QgbmFtZXMgPSAvKiAgICAgICAgICAgICAgICAgICAqLyAob3duS2V5cyhyZWMpKTtcbiAgICAgIGNvbnN0IHZhbFBzID0gbmFtZXMubWFwKG5hbWUgPT4gZGVlcGx5RnVsZmlsbGVkKHJlY1tuYW1lXSkpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCB2YWxzID0+XG4gICAgICAgIGhhcmRlbihmcm9tRW50cmllcyh2YWxzLm1hcCgoYywgaSkgPT4gW25hbWVzW2ldLCBjXSkpKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgIGNvbnN0IGFyciA9IC8qICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgICAgIGNvbnN0IHZhbFBzID0gYXJyLm1hcChwID0+IGRlZXBseUZ1bGZpbGxlZChwKSk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksIHZhbHMgPT4gaGFyZGVuKHZhbHMpKTtcbiAgICB9XG4gICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgY29uc3QgYnl0ZUFycmF5ID0gLyogICAgICAgICAgICAgICAgICAgICovICgvKiAgICAgICAgICAgICAgICAgICovICh2YWwpKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gYnl0ZUFycmF5O1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICBjb25zdCB0Z2QgPSAvKiAgICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHRnZCk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodGdkLnBheWxvYWQpLCBwYXlsb2FkID0+XG4gICAgICAgIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIGNvbnN0IHJlbSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gcmVtO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgIGNvbnN0IGVyciA9IC8qICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICBjb25zdCBwcm9tID0gLyogICAgICAgICAgICAgICAgICAqLyAoLyogICAgICAgICAgICAgICAgICAqLyAodmFsKSk7XG4gICAgICByZXR1cm4gRS53aGVuKHByb20sIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLCBUeXBlRXJyb3IpO1xuICAgIH1cbiAgfVxufTskaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAF1cCItMUAADTFAAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGhhc093biwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vL1xuLy9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzID0gbmV3IE1hcChcbiAgLy9cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIChbXG4gICAgWydFcnJvcicsIEVycm9yXSxcbiAgICBbJ0V2YWxFcnJvcicsIEV2YWxFcnJvcl0sXG4gICAgWydSYW5nZUVycm9yJywgUmFuZ2VFcnJvcl0sXG4gICAgWydSZWZlcmVuY2VFcnJvcicsIFJlZmVyZW5jZUVycm9yXSxcbiAgICBbJ1N5bnRheEVycm9yJywgU3ludGF4RXJyb3JdLFxuICAgIFsnVHlwZUVycm9yJywgVHlwZUVycm9yXSxcbiAgICBbJ1VSSUVycm9yJywgVVJJRXJyb3JdXG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICBdKSxcbik7XG5cbmlmICh0eXBlb2YgQWdncmVnYXRlRXJyb3IgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vXG4gIGVycm9yQ29uc3RydWN0b3JzLnNldCgnQWdncmVnYXRlRXJyb3InLCBBZ2dyZWdhdGVFcnJvcik7XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0RXJyb3JDb25zdHJ1Y3RvciA9IG5hbWUgPT4gZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRozY9fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8vXG4gIHJldHVybiAoXG4gICAgY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICAoISFjaGVjayAmJiBDWChjaGVjaylgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzRXJyb3JMaWtlID0gY2FuZGlkYXRlID0+IGNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjNj19vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAoXG4gIHByb3BOYW1lLFxuICBkZXNjLFxuICBwYXNzU3R5bGVPZlJlY3VyLFxuICBjaGVjayA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAoZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgKX0gb3duIHByb3BlcnR5IG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7ZGVzY31gXG4gICAgKTtcbiAgfVxuICBpZiAoIWhhc093bihkZXNjLCAndmFsdWUnKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eTogJHtkZXNjfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHsgdmFsdWUgfSA9IGRlc2M7XG4gIHN3aXRjaCAocHJvcE5hbWUpIHtcbiAgICBjYXNlICdtZXNzYWdlJzpcbiAgICBjYXNlICdzdGFjayc6IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dmFsdWV9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ2NhdXNlJzoge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcih2YWx1ZSwgcGFzc1N0eWxlT2ZSZWN1ciwgY2hlY2spO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcnMnOiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpICE9PSAnY29weUFycmF5Jykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7dmFsdWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLmV2ZXJ5KGVyciA9PlxuICAgICAgICAvL1xuICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIsIHBhc3NTdHlsZU9mUmVjdXIsIGNoZWNrKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgICEhY2hlY2sgJiZcbiAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnR5ICR7cShwcm9wTmFtZSl9YFxuICApO1xufTskaM2PX29uY2UuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuaGFyZGVuKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAoXG4gIGNhbmRpZGF0ZSxcbiAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgY2hlY2sgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKCFjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUsIGNoZWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG4gIGNvbnN0IHsgbmFtZSB9ID0gcHJvdG87XG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbiAgaWYgKGVyckNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQgfHwgZXJyQ29uc3RydWN0b3IucHJvdG90eXBlICE9PSBwcm90bykge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2ssXG4gICAgICApYFBhc3NhYmxlIEVycm9yIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICBpZiAoISgnbWVzc2FnZScgaW4gZGVzY3MpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKFxuICAgICAgICBjaGVjayxcbiAgICAgIClgUGFzc2FibGUgRXJyb3IgbXVzdCBoYXZlIGFuIG93biBcIm1lc3NhZ2VcIiBzdHJpbmcgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXMoZGVzY3MpLmV2ZXJ5KChbcHJvcE5hbWUsIGRlc2NdKSA9PlxuICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKFxuICAgICAgcHJvcE5hbWUsXG4gICAgICBkZXNjLFxuICAgICAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgICAgIGNoZWNrLFxuICAgICksXG4gICk7XG59OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCBFcnJvckhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2Vycm9yJyxcblxuICBjYW5CZVZhbGlkOiBjaGVja0Vycm9yTGlrZSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+XG4gICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyLCBhc3NlcnRDaGVja2VyKSxcbn0pOyRozY9fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA06KQfKQGAACkBgAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFwSXRlcmFibGUgPSAoYmFzZUl0ZXJhYmxlLCBmdW5jKSA9PlxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBGYXIoJ21hcHBlZCBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZUl0ZXJhdG9yID0gYmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIHJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IGJhc2VWYWx1ZSwgZG9uZSB9ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRvbmUgPyBiYXNlVmFsdWUgOiBmdW5jKGJhc2VWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCBkb25lIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7JGjNj19vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBmaWx0ZXJJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIHByZWQpID0+XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIEZhcignZmlsdGVyZWQgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VJdGVyYXRvciA9IGJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICByZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2VJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZG9uZSB8fCBwcmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pOyRozY9fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYnh4idkSAADZEgAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiR0VUX01FVEhPRF9OQU1FUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRNZXRob2ROYW1lcyxxLEZhaWwsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIixbJGjNj19hID0+IChhc3NlcnRJZmFjZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLFskaM2PX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgc2V0UHJvdG90eXBlT2YsXG4gIGNyZWF0ZSxcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxufSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG8gPSAocmVtb3RhYmxlLCBpZmFjZSkgPT4ge1xuICBsZXQgb2xkUHJvdG8gPSBnZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuICBpZiAodHlwZW9mIHJlbW90YWJsZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAob2xkUHJvdG8gPT09IG51bGwpIHtcbiAgICAgIG9sZFByb3RvID0gb2JqZWN0UHJvdG90eXBlO1xuICAgIH1cbiAgICBvbGRQcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgICBGYWlsYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByZW1vdGFibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvbGRQcm90byAhPT0gbnVsbCB8fFxuICAgICAgRmFpbGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbiAgICBvbGRQcm90byA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIGdldFByb3RvdHlwZU9mKG9sZFByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIEZhaWxgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFxuICAgIGNyZWF0ZShvbGRQcm90bywge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAncmVtb3RhYmxlJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgfSksXG4gICk7XG59O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZSA9IGNhbmRpZGF0ZSA9PlxuICBSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlID0gKFxuICAvL1xuICBpZmFjZSA9ICdSZW1vdGFibGUnLFxuICBwcm9wcyA9IHVuZGVmaW5lZCxcbiAgcmVtb3RhYmxlID0gLyogICAgICAgICAgICAqLyAoe30pLFxuKSA9PiB7XG4gIGFzc2VydElmYWNlKGlmYWNlKTtcbiAgYXNzZXJ0KGlmYWNlKTtcbiAgLy9cbiAgLy9cbiAgcHJvcHMgPT09IHVuZGVmaW5lZCB8fCBGYWlsYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuICAvL1xuICBhc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4gIC8vXG4gICEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpIHx8XG4gICAgRmFpbGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxuICAgICAgcmVtb3RhYmxlW1BBU1NfU1RZTEVdLFxuICAgICl9YDtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaGFyZGVuLmlzRmFrZSB8fFxuICAgIC8vXG4gICAgIWlzRnJvemVuKHJlbW90YWJsZSkgfHxcbiAgICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuICBjb25zdCByZW1vdGFibGVQcm90byA9IG1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsIGlmYWNlKTtcblxuICAvL1xuICAvL1xuICBjb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjayA9IHRhcmdldCA9PiB7XG4gICAgLy9cbiAgICBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHJlbW90YWJsZVByb3RvKTtcbiAgICBoYXJkZW4odGFyZ2V0KTtcbiAgICBhc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuICB9O1xuXG4gIC8vXG4gIG11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuICAvL1xuICBtdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4gIC8vXG4gIC8vXG4gIGFzc2VydChpZmFjZSAhPT0gdW5kZWZpbmVkKTsgLy9cbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAqLyAocmVtb3RhYmxlKTtcbn07JGjNj19vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBHRVRfTUVUSE9EX05BTUVTID0gJ19fZ2V0TWV0aG9kTmFtZXNfXyc7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5HRVRfTUVUSE9EX05BTUVTKEdFVF9NRVRIT0RfTkFNRVMpO1xuY29uc3QgZ2V0TWV0aG9kTmFtZXNNZXRob2QgPSBoYXJkZW4oe1xuICBbR0VUX01FVEhPRF9OQU1FU10oKSB7XG4gICAgcmV0dXJuIGdldE1ldGhvZE5hbWVzKHRoaXMpO1xuICB9LFxufSlbR0VUX01FVEhPRF9OQU1FU107XG5cbmNvbnN0IGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvciA9IGhhcmRlbih7XG4gIHZhbHVlOiBnZXRNZXRob2ROYW1lc01ldGhvZCxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgRmFyID0gKGZhck5hbWUsIHJlbW90YWJsZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCByID0gcmVtb3RhYmxlID09PSB1bmRlZmluZWQgPyAvKiAgICAgICAgICAgICovICh7fSkgOiByZW1vdGFibGU7XG4gIGlmICh0eXBlb2YgciA9PT0gJ29iamVjdCcgJiYgIShHRVRfTUVUSE9EX05BTUVTIGluIHIpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgR0VUX01FVEhPRF9OQU1FUywgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yKTtcbiAgfVxuICByZXR1cm4gUmVtb3RhYmxlKGBBbGxlZ2VkOiAke2Zhck5hbWV9YCwgdW5kZWZpbmVkLCByKTtcbn07JGjNj19vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBUb0ZhckZ1bmN0aW9uID0gKGZhck5hbWUsIGZ1bmMpID0+IHtcbiAgaWYgKGdldEludGVyZmFjZU9mKGZ1bmMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAvL1xuICAgIHJldHVybiBmdW5jO1xuICB9XG4gIC8vXG4gIHJldHVybiBGYXIoZmFyTmFtZSwgKC4uLmFyZ3MpID0+IGZ1bmMoLi4uYXJncykpO1xufTskaM2PX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiR0VUX01FVEhPRF9OQU1FUyI6WyJHRVRfTUVUSE9EX05BTUVTIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE3BiNPcBAAA3AQAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVRhZ2dlZCA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG4gIGFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG4gIHJldHVybiBoYXJkZW4oXG4gICAgY3JlYXRlKG9iamVjdFByb3RvdHlwZSwge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAndGFnZ2VkJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IHRhZyB9LFxuICAgICAgcGF5bG9hZDogeyB2YWx1ZTogcGF5bG9hZCwgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIH0pLFxuICApO1xufTskaM2PX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABq8B9AkxcAAJMXAAAwAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIkNYIiwiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldE93bkRhdGFEZXNjcmlwdG9yIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNQcmltaXRpdmUiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qXG5cbiAqL1xuXG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBwcm90b3R5cGU6IGZ1bmN0aW9uUHJvdG90eXBlIH0gPSBGdW5jdGlvbjtcbmNvbnN0IHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBnZXRQcm90b3R5cGVPZixcbiAgaGFzT3duLFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG59ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgdG9TdHJpbmdUYWc6IHRvU3RyaW5nVGFnU3ltYm9sIH0gPSBTeW1ib2w7XG5cbmNvbnN0IHR5cGVkQXJyYXlQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICB0eXBlZEFycmF5UHJvdG90eXBlLFxuICB0b1N0cmluZ1RhZ1N5bWJvbCxcbik7XG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcgPSB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnID09PSAnZnVuY3Rpb24nKTtcblxuLypcblxuICovXG4gICAgICAgY29uc3QgaGFzT3duUHJvcGVydHlPZiA9IGhhc093bjtcblxuLypcblxuICovJGjNj19vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG4gICAgICAgY29uc3QgaXNQcmltaXRpdmUgPSB2YWwgPT5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgIXZhbCB8fCAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJyk7JGjNj19vbmNlLmlzUHJpbWl0aXZlKGlzUHJpbWl0aXZlKTtcbmhhcmRlbihpc1ByaW1pdGl2ZSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgaXNPYmplY3QgPSB2YWwgPT5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgISF2YWwgJiYgKHR5cGVvZiB2YWwgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbicpOyRozY9fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNUeXBlZEFycmF5ID0gb2JqZWN0ID0+IHtcbiAgLy9cbiAgY29uc3QgdGFnID0gYXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLCBvYmplY3QsIFtdKTtcbiAgcmV0dXJuIHRhZyAhPT0gdW5kZWZpbmVkO1xufTskaM2PX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuICAgICAgIGNvbnN0IFBBU1NfU1RZTEUgPSBTeW1ib2wuZm9yKCdwYXNzU3R5bGUnKTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuICAgICAgIGNvbnN0IGFzc2VydENoZWNrZXIgPSAoY29uZCwgZGV0YWlscykgPT4ge1xuICBhc3NlcnQoY29uZCwgZGV0YWlscyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgQ1ggPSBjaGVjayA9PiB7XG4gIGNvbnN0IHJlamVjdCA9IChULCAuLi5zdWJzKSA9PiBjaGVjayhmYWxzZSwgWChULCAuLi5zdWJzKSk7XG4gIHJldHVybiByZWplY3Q7XG59OyRozY9fb25jZS5DWChDWCk7XG5oYXJkZW4oQ1gpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldE93bkRhdGFEZXNjcmlwdG9yID0gKFxuICBjYW5kaWRhdGUsXG4gIHByb3BOYW1lLFxuICBzaG91bGRCZUVudW1lcmFibGUsXG4gIGNoZWNrLFxuKSA9PiB7XG4gIGNvbnN0IGRlc2MgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUsIHByb3BOYW1lKVxuICApO1xuICByZXR1cm4gKGRlc2MgIT09IHVuZGVmaW5lZCB8fFxuICAgICghIWNoZWNrICYmIENYKGNoZWNrKWAke3EocHJvcE5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKGhhc093bihkZXNjLCAndmFsdWUnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gYWNjZXNzb3IgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgIChzaG91bGRCZUVudW1lcmFibGVcbiAgICAgID8gZGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YClcbiAgICAgIDogIWRlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IG5vdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSlcbiAgICA/IGRlc2NcbiAgICA6IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoLyogICAgICAgICAgICAgICAgICAqLyAodW5kZWZpbmVkKSk7XG59OyRozY9fb25jZS5nZXRPd25EYXRhRGVzY3JpcHRvcihnZXRPd25EYXRhRGVzY3JpcHRvcik7XG5oYXJkZW4oZ2V0T3duRGF0YURlc2NyaXB0b3IpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0VGFnID0gdGFnUmVjb3JkID0+IHRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRozY9fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG4gICAgICAgY29uc3QgY2hlY2tQYXNzU3R5bGUgPSAob2JqLCBwYXNzU3R5bGUsIGV4cGVjdGVkUGFzc1N0eWxlLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIHBhc3NTdHlsZSA9PT0gZXhwZWN0ZWRQYXNzU3R5bGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKHBhc3NTdHlsZSl9OiAke29ian1gKVxuICApO1xufTskaM2PX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkID0gY2hlY2tQcm90byA9PiB7XG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGNoZWNrVGFnUmVjb3JkID0gKHRhZ1JlY29yZCwgZXhwZWN0ZWRQYXNzU3R5bGUsIGNoZWNrKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgICghaXNQcmltaXRpdmUodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIChpc0Zyb3plbih0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICAoIWlzQXJyYXkodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJiBDWChjaGVjaylgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIGNoZWNrUGFzc1N0eWxlKFxuICAgICAgICB0YWdSZWNvcmQsXG4gICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKHRhZ1JlY29yZCwgUEFTU19TVFlMRSwgZmFsc2UsIGNoZWNrKS52YWx1ZSxcbiAgICAgICAgZXhwZWN0ZWRQYXNzU3R5bGUsXG4gICAgICAgIGNoZWNrLFxuICAgICAgKSAmJlxuICAgICAgKHR5cGVvZiBnZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsIFN5bWJvbC50b1N0cmluZ1RhZywgZmFsc2UsIGNoZWNrKVxuICAgICAgICAudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICBjaGVja1Byb3RvKHRhZ1JlY29yZCwgZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSwgY2hlY2spXG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG59O1xuXG4gICAgICAgY29uc3QgY2hlY2tUYWdSZWNvcmQgPSBtYWtlQ2hlY2tUYWdSZWNvcmQoXG4gICh2YWwsIHByb3RvLCBjaGVjaykgPT5cbiAgICBwcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKSxcbik7JGjNj19vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbiAgICAgICBjb25zdCBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gICAgcHJvdG8gPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgKHByb3RvICE9PSBudWxsICYmIGdldFByb3RvdHlwZU9mKHByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUpIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWAsXG4gICAgICApKSxcbik7JGjNj19vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNQcmltaXRpdmUiOlsiaXNQcmltaXRpdmUiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sIkNYIjpbIkNYIl0sImdldE93bkRhdGFEZXNjcmlwdG9yIjpbImdldE93bkRhdGFEZXNjcmlwdG9yIl0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIdLSJIoLAAAKCwAACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2J5dGVBcnJheS5qcyIsIi4vY29weVJlY29yZC5qcyIsIi4vdGFnZ2VkLmpzIiwiLi9lcnJvci5qcyIsIi4vcmVtb3RhYmxlLmpzIiwiLi9zeW1ib2wuanMiLCIuL3NhZmUtcHJvbWlzZS5qcyIsIi4vc3RyaW5nLmpzIl0sImV4cG9ydHMiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZSIsImlzUGFzc2FibGUiLCJwYXNzU3R5bGVPZiIsInRvUGFzc2FibGVFcnJvciIsInRvVGhyb3dhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaXNQcm9taXNlLFgsRmFpbCxxLGFubm90YXRlRXJyb3IsbWFrZUVycm9yLGlzUHJpbWl0aXZlLGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLGFzc2VydENoZWNrZXIsQ29weUFycmF5SGVscGVyLEJ5dGVBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyxjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcixnZXRFcnJvckNvbnN0cnVjdG9yLGlzRXJyb3JMaWtlLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZSxhc3NlcnRQYXNzYWJsZVN0cmluZzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsWyRozY9fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vYnl0ZUFycmF5LmpzXCIsIFtbXCJCeXRlQXJyYXlIZWxwZXJcIixbJGjNj19hID0+IChCeXRlQXJyYXlIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIixbJGjNj19hID0+IChDb3B5UmVjb3JkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLFskaM2PX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsWyRozY9fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2NcIixbJGjNj19hID0+IChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9ICRozY9fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclwiLFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsWyRozY9fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIixbJGjNj19hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vc3RyaW5nLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN0cmluZ1wiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3RyaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzRnJvemVuLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZUhlbHBlclRhYmxlID0gcGFzc1N0eWxlSGVscGVycyA9PiB7XG4gIGNvbnN0IEhlbHBlclRhYmxlID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBjb3B5QXJyYXk6IHVuZGVmaW5lZCxcbiAgICBieXRlQXJyYXk6IHVuZGVmaW5lZCxcbiAgICBjb3B5UmVjb3JkOiB1bmRlZmluZWQsXG4gICAgdGFnZ2VkOiB1bmRlZmluZWQsXG4gICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICByZW1vdGFibGU6IHVuZGVmaW5lZCxcbiAgfTtcbiAgZm9yIChjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycykge1xuICAgIGNvbnN0IHsgc3R5bGVOYW1lIH0gPSBoZWxwZXI7XG4gICAgc3R5bGVOYW1lIGluIEhlbHBlclRhYmxlIHx8IEZhaWxgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgIEZhaWxgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdID0gaGVscGVyO1xuICB9XG4gIGZvciAoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKSB7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBGYWlsYG1pc3NpbmcgaGVscGVyIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuICB9XG5cbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIC8qICAgICAgICAgICAgICAgICAgKi8gKGhhcmRlbihIZWxwZXJUYWJsZSkpXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0VmFsaWQgPSAoaGVscGVyLCBjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgaGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKTtcbiAgaGVscGVyLmFzc2VydFJlc3RWYWxpZChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZiA9IHBhc3NTdHlsZUhlbHBlcnMgPT4ge1xuICBjb25zdCBIZWxwZXJUYWJsZSA9IG1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbiAgY29uc3QgcmVtb3RhYmxlSGVscGVyID0gSGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcGFzc1N0eWxlTWVtbyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLypcblxuICAgKi9cbiAgLy9cbiAgY29uc3QgcGFzc1N0eWxlT2YgPSBwYXNzYWJsZSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgaW5Qcm9ncmVzcyA9IG5ldyBTZXQoKTtcblxuICAgIGNvbnN0IHBhc3NTdHlsZU9mUmVjdXIgPSBpbm5lciA9PiB7XG4gICAgICBjb25zdCBpbm5lcklzT2JqZWN0ID0gIWlzUHJpbWl0aXZlKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGlubmVyU3R5bGUgPSBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gICAgICAgIGlmIChpbm5lclN0eWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGlubmVyU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgIWluUHJvZ3Jlc3MuaGFzKGlubmVyKSB8fFxuICAgICAgICAgIEZhaWxgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG4gICAgICAgIGluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIHBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLCBwYXNzU3R5bGUpO1xuICAgICAgICBpblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFzc1N0eWxlO1xuICAgIH07XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZkludGVybmFsID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgdHlwZXN0ciA9IHR5cGVvZiBpbm5lcjtcbiAgICAgIHN3aXRjaCAodHlwZXN0cikge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIHJldHVybiB0eXBlc3RyO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN0cmluZyhpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgICAgICBpZiAoaW5uZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNGcm96ZW4oaW5uZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgaXNUeXBlZEFycmF5KGlubmVyKVxuICAgICAgICAgICAgICAgID8gWGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmBcbiAgICAgICAgICAgICAgICA6IFhgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQcm9taXNlKGlubmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xuICAgICAgICAgICAgcmV0dXJuICdwcm9taXNlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdHlwZW9mIGlubmVyLnRoZW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbiAgICAgICAgICBjb25zdCBwYXNzU3R5bGVUYWcgPSBpbm5lcltQQVNTX1NUWUxFXTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlVGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCAnc3RyaW5nJyk7XG4gICAgICAgICAgICBjb25zdCBoZWxwZXIgPSBIZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuICAgICAgICAgICAgaGVscGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgRmFpbGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWQoaGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVUYWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKSB7XG4gICAgICAgICAgICBpZiAoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKSB7XG4gICAgICAgICAgICAgIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgICAgICByZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzZXJ0VmFsaWQocmVtb3RhYmxlSGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgcmV0dXJuICdyZW1vdGFibGUnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoge1xuICAgICAgICAgIGlzRnJvemVuKGlubmVyKSB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbiAgICAgICAgICB0eXBlb2YgaW5uZXIudGhlbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuICAgICAgICAgIGFzc2VydFZhbGlkKHJlbW90YWJsZUhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgIHJldHVybiAncmVtb3RhYmxlJztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG59O1xuXG4gICAgICAgY29uc3QgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wgPSBTeW1ib2wuZm9yKCdAZW5kbyBwYXNzU3R5bGVPZicpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2woUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wpO1xuICAgICAgIGNvbnN0IHBhc3NTdHlsZU9mID1cbiAgKGdsb2JhbFRoaXMgJiYgZ2xvYmFsVGhpc1tQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbF0pIHx8XG4gIG1ha2VQYXNzU3R5bGVPZihbXG4gICAgQ29weUFycmF5SGVscGVyLFxuICAgIEJ5dGVBcnJheUhlbHBlcixcbiAgICBDb3B5UmVjb3JkSGVscGVyLFxuICAgIFRhZ2dlZEhlbHBlcixcbiAgICBFcnJvckhlbHBlcixcbiAgICBSZW1vdGFibGVIZWxwZXIsXG4gIF0pOyRozY9fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cbiAgICAgICBjb25zdCBhc3NlcnRQYXNzYWJsZSA9IHZhbCA9PiB7XG4gIHBhc3NTdHlsZU9mKHZhbCk7IC8vXG59OyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZShhc3NlcnRQYXNzYWJsZSk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGUgPSBzcGVjaW1lbiA9PiB7XG4gIHRyeSB7XG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiBwYXNzU3R5bGVPZihzcGVjaW1lbikgIT09IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTskaM2PX29uY2UuaXNQYXNzYWJsZShpc1Bhc3NhYmxlKTtcbmhhcmRlbihpc1Bhc3NhYmxlKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gKG5hbWUsIGRlc2MpID0+XG4gIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKG5hbWUsIGRlc2MsIHBhc3NTdHlsZU9mKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB0b1Bhc3NhYmxlRXJyb3IgPSBlcnIgPT4ge1xuICBoYXJkZW4oZXJyKTtcbiAgaWYgKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVyciwgcGFzc1N0eWxlT2YpKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuICBjb25zdCB7IG5hbWUsIG1lc3NhZ2UgfSA9IGVycjtcbiAgY29uc3QgeyBjYXVzZTogY2F1c2VEZXNjLCBlcnJvcnM6IGVycm9yc0Rlc2MgfSA9XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhlcnIpO1xuICBsZXQgY2F1c2U7XG4gIGxldCBlcnJvcnM7XG4gIGlmIChjYXVzZURlc2MgJiYgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKCdjYXVzZScsIGNhdXNlRGVzYykpIHtcbiAgICBjYXVzZSA9IGNhdXNlRGVzYy52YWx1ZTtcbiAgfVxuICBpZiAoZXJyb3JzRGVzYyAmJiBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2Vycm9ycycsIGVycm9yc0Rlc2MpKSB7XG4gICAgZXJyb3JzID0gZXJyb3JzRGVzYy52YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihgJHtuYW1lfWApIHx8IEVycm9yO1xuICBjb25zdCBuZXdFcnJvciA9IG1ha2VFcnJvcihgJHttZXNzYWdlfWAsIGVyckNvbnN0cnVjdG9yLCB7XG4gICAgLy9cbiAgICBjYXVzZSxcbiAgICBlcnJvcnMsXG4gIH0pO1xuICAvL1xuICBoYXJkZW4obmV3RXJyb3IpO1xuICAvL1xuICAvL1xuICAvL1xuICBhbm5vdGF0ZUVycm9yKG5ld0Vycm9yLCBYYGNvcGllZCBmcm9tIGVycm9yICR7ZXJyfWApO1xuICBwYXNzU3R5bGVPZihuZXdFcnJvcikgPT09ICdlcnJvcicgfHxcbiAgICBGYWlsYEV4cGVjdGVkICR7bmV3RXJyb3J9IHRvIGJlIGEgcGFzc2FibGUgZXJyb3JgO1xuICByZXR1cm4gbmV3RXJyb3I7XG59OyRozY9fb25jZS50b1Bhc3NhYmxlRXJyb3IodG9QYXNzYWJsZUVycm9yKTtcbmhhcmRlbih0b1Bhc3NhYmxlRXJyb3IpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdG9UaHJvd2FibGUgPSBzcGVjaW1lbiA9PiB7XG4gIGhhcmRlbihzcGVjaW1lbik7XG4gIGlmIChpc0Vycm9yTGlrZShzcGVjaW1lbikpIHtcbiAgICByZXR1cm4gdG9QYXNzYWJsZUVycm9yKC8qICAgICAgICAgICAgICAgICovIChzcGVjaW1lbikpO1xuICB9XG4gIGlmICghaXNQcmltaXRpdmUoc3BlY2ltZW4pKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgcGFzc1N0eWxlID0gLyogICAgICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVPZihzcGVjaW1lbikpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gLyogICAgICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICAgIGVsZW1lbnQgPT09IHRvVGhyb3dhYmxlKGVsZW1lbnQpIHx8XG4gICAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VsZW1lbnR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIGNvbnN0IHJlYyA9IC8qICAgICAgICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKHJlYykpIHtcbiAgICAgICAgICB2YWwgPT09IHRvVGhyb3dhYmxlKHZhbCkgfHxcbiAgICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7dmFsfWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIGNvbnN0IHRnID0gLyogICAgICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBjb25zdCB7IHBheWxvYWQgfSA9IHRnO1xuICAgICAgICBwYXlsb2FkID09PSB0b1Rocm93YWJsZShwYXlsb2FkKSB8fFxuICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7cGF5bG9hZH1gO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCBlciA9IC8qICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG4gICAgICAgIGVyID09PSB0b1Rocm93YWJsZShlcikgfHxcbiAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VyfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYEEgJHtxKHBhc3NTdHlsZSl9IGlzIG5vdCB0aHJvd2FibGU6ICR7c3BlY2ltZW59YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pO1xufTskaM2PX29uY2UudG9UaHJvd2FibGUodG9UaHJvd2FibGUpO1xuaGFyZGVuKHRvVGhyb3dhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIl0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl0sImlzUGFzc2FibGUiOlsiaXNQYXNzYWJsZSJdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIl0sInRvVGhyb3dhYmxlIjpbInRvVGhyb3dhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHOHXHB0HwAAdB8AACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJjYW5CZU1ldGhvZCIsImdldEludGVyZmFjZU9mIiwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsZ2V0TWV0aG9kTmFtZXMsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNQcmltaXRpdmUsZ2V0VGFnLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjYW5CZU1ldGhvZCA9IGZ1bmMgPT5cbiAgdHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicgJiYgIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRozY9fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vL1xuLy9cblxuLypcblxuXG4gKi9cbmNvbnN0IGNhbkJlTWV0aG9kTmFtZSA9IGtleSA9PlxuICAvL1xuICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Yga2V5ID09PSAnc3ltYm9sJyB8fCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJztcbmhhcmRlbihjYW5CZU1ldGhvZE5hbWUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMgPSBiZWhhdmlvck1ldGhvZHMgPT5cbiAgZ2V0TWV0aG9kTmFtZXMoYmVoYXZpb3JNZXRob2RzKTskaM2PX29uY2UuZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMoZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMpO1xuaGFyZGVuKGdldFJlbW90YWJsZU1ldGhvZE5hbWVzKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHtcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgaGFzT3duLFxufSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2UgPSAoaWZhY2UsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgLy9cbiAgICAodHlwZW9mIGlmYWNlID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkgJiZcbiAgICAoaWZhY2UgPT09ICdSZW1vdGFibGUnIHx8XG4gICAgICBpZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKSB8fFxuICAgICAgaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goY2hlY2spYEZvciBub3csIGlmYWNlICR7cShcbiAgICAgICAgICBpZmFjZSxcbiAgICAgICAgKX0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCI7IHVuaW1wbGVtZW50ZWRgKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0SWZhY2UgPSBpZmFjZSA9PiBjaGVja0lmYWNlKGlmYWNlLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mID0gKG9yaWdpbmFsLCBjaGVjaykgPT4ge1xuICAhaXNQcmltaXRpdmUob3JpZ2luYWwpIHx8XG4gICAgRmFpbGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbiAgaWYgKFxuICAgIHByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICBwcm90byA9PT0gbnVsbCB8fFxuICAgIHByb3RvID09PSBGdW5jdGlvbi5wcm90b3R5cGVcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBSZW1vdGFibGVzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZDogJHtxKG9yaWdpbmFsKX1gXG4gICAgKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3JpZ2luYWwgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgcHJvdG9Qcm90byA9IGdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICBpZiAocHJvdG9Qcm90byAhPT0gb2JqZWN0UHJvdG90eXBlICYmIHByb3RvUHJvdG8gIT09IG51bGwpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sIGNoZWNrKTtcbiAgICB9XG4gICAgaWYgKCFjaGVja1RhZ1JlY29yZChwcm90bywgJ3JlbW90YWJsZScsIGNoZWNrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygb3JpZ2luYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoIWNoZWNrRnVuY3Rpb25UYWdSZWNvcmQocHJvdG8sICdyZW1vdGFibGUnLCBjaGVjaykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvL1xuICBjb25zdCBwYXNzU3R5bGVLZXkgPSAvKiAgICAgICAgICAgICAgICAgICovIChQQVNTX1NUWUxFKTtcbiAgY29uc3QgdGFnS2V5ID0gLyogICAgICAgICAgICAgICAgICAqLyAoU3ltYm9sLnRvU3RyaW5nVGFnKTtcbiAgY29uc3Qge1xuICAgIC8vXG4gICAgWy8qICAgICAgICAgICAgICAgICAqLyAocGFzc1N0eWxlS2V5KV06IF9wYXNzU3R5bGVEZXNjLFxuICAgIFsvKiAgICAgICAgICAgICAgICAgKi8gKHRhZ0tleSldOiB7IHZhbHVlOiBpZmFjZSB9LFxuICAgIC4uLnJlc3REZXNjc1xuICB9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbiAgcmV0dXJuIChcbiAgICAob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkgJiZcbiAgICBjaGVja0lmYWNlKGlmYWNlLCBjaGVjaylcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlID0gKHZhbCwgY2hlY2spID0+IHtcbiAgaWYgKGNvbmZpcm1lZFJlbW90YWJsZXMuaGFzKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzRnJvemVuKHZhbCkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJiBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gXG4gICAgKTtcbiAgfVxuICAvL1xuICBpZiAoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCwgY2hlY2spKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrUmVtb3RhYmxlUHJvdG9PZih2YWwsIGNoZWNrKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvbmZpcm1lZFJlbW90YWJsZXMuYWRkKHZhbCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldEludGVyZmFjZU9mID0gdmFsID0+IHtcbiAgaWYgKFxuICAgIGlzUHJpbWl0aXZlKHZhbCkgfHxcbiAgICB2YWxbUEFTU19TVFlMRV0gIT09ICdyZW1vdGFibGUnIHx8XG4gICAgIWNoZWNrUmVtb3RhYmxlKHZhbClcbiAgKSB7XG4gICAgLy9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8vXG4gIHJldHVybiBnZXRUYWcodmFsKTtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAncmVtb3RhYmxlJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IHZhbGlkVHlwZSA9XG4gICAgICAoIWlzUHJpbWl0aXZlKGNhbmRpZGF0ZSkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAoIWlzQXJyYXkoY2FuZGlkYXRlKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIGFycmF5cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuICAgIGlmICghdmFsaWRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG4gICAgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBvd25LZXlzKGRlc2NzKS5ldmVyeShrZXkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8vXG4gICAgICAgICAgKGhhc093bihkZXNjc1svKiAgICAgICAgICAgICAgICAgKi8gKGtleSldLCAndmFsdWUnKSB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICBTdHJpbmcoa2V5KSxcbiAgICAgICAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgKChrZXkgPT09IFN5bWJvbC50b1N0cmluZ1RhZyAmJiBjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLCBjaGVjaykpIHx8XG4gICAgICAgICAgICAoKGNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKSB8fFxuICAgICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICAgICAgICAgICl9IGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICAgICAoa2V5ICE9PSBQQVNTX1NUWUxFIHx8XG4gICAgICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgICAgIENYKGNoZWNrKWBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qge1xuICAgICAgICBuYW1lOiBuYW1lRGVzYyxcbiAgICAgICAgbGVuZ3RoOiBsZW5ndGhEZXNjLFxuICAgICAgICAvL1xuICAgICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogdG9TdHJpbmdUYWdEZXNjLFxuICAgICAgICAuLi5yZXN0RGVzY3NcbiAgICAgIH0gPSBkZXNjcztcbiAgICAgIGNvbnN0IHJlc3RLZXlzID0gb3duS2V5cyhyZXN0RGVzY3MpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKChuYW1lRGVzYyAmJiB0eXBlb2YgbmFtZURlc2MudmFsdWUgPT09ICdzdHJpbmcnKSB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChjaGVjaylgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICgobGVuZ3RoRGVzYyAmJiB0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZSA9PT0gJ251bWJlcicpIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgKHRvU3RyaW5nVGFnRGVzYyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKCh0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgICBjaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSwgY2hlY2spKSkgJiZcbiAgICAgICAgKHJlc3RLZXlzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICApYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAhIWNoZWNrICYmIENYKGNoZWNrKWB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWA7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiBjYW5kaWRhdGUgPT4gY2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKSxcblxuICBldmVyeTogKF9wYXNzYWJsZSwgX2ZuKSA9PiB0cnVlLFxufSk7JGjNj19vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiOlsiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiXSwiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD0QYgRHg4AAB4OAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpc1Byb21pc2UscSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBpc0Zyb3plbiwgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvciwgaGFzT3duIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IHRvU3RyaW5nVGFnIH0gPSBTeW1ib2w7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXMgPSAocHIsIGNoZWNrKSA9PiB7XG4gIGNvbnN0IGtleXMgPSBvd25LZXlzKHByKTtcblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHVua25vd25LZXlzID0ga2V5cy5maWx0ZXIoXG4gICAga2V5ID0+IHR5cGVvZiBrZXkgIT09ICdzeW1ib2wnIHx8ICFoYXNPd24oUHJvbWlzZS5wcm90b3R5cGUsIGtleSksXG4gICk7XG5cbiAgaWYgKHVua25vd25LZXlzLmxlbmd0aCAhPT0gMCkge1xuICAgIHJldHVybiBDWChcbiAgICAgIGNoZWNrLFxuICAgIClgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gO1xuICB9XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tTYWZlT3duS2V5ID0ga2V5ID0+IHtcbiAgICBpZiAoa2V5ID09PSB0b1N0cmluZ1RhZykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCB0YWdEZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByLCB0b1N0cmluZ1RhZyk7XG4gICAgICBhc3NlcnQodGFnRGVzYyAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChoYXNPd24odGFnRGVzYywgJ3ZhbHVlJykgfHxcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIGRhdGEgcHJvcGVydHksIG5vdCBhbiBhY2Nlc3NvcjogJHtxKHRhZ0Rlc2MpfWApICYmXG4gICAgICAgICh0eXBlb2YgdGFnRGVzYy52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgT3duIEBAdG9TdHJpbmdUYWcgdmFsdWUgbXVzdCBiZSBhIHN0cmluZzogJHtxKHRhZ0Rlc2MudmFsdWUpfWApICYmXG4gICAgICAgICghdGFnRGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICAgQ1goY2hlY2spYE93biBAQHRvU3RyaW5nVGFnIG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7cSh0YWdEZXNjKX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsID0gcHJba2V5XTtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJlxuICAgICAgdmFsICE9PSBudWxsICYmXG4gICAgICBpc0Zyb3plbih2YWwpICYmXG4gICAgICBnZXRQcm90b3R5cGVPZih2YWwpID09PSBPYmplY3QucHJvdG90eXBlXG4gICAgKSB7XG4gICAgICBjb25zdCBzdWJLZXlzID0gb3duS2V5cyh2YWwpO1xuICAgICAgaWYgKHN1YktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHN1YktleXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIHN1YktleXNbMF0gPT09ICdkZXN0cm95ZWQnICYmXG4gICAgICAgIHZhbC5kZXN0cm95ZWQgPT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBDWChcbiAgICAgIGNoZWNrLFxuICAgIClgVW5leHBlY3RlZCBOb2RlIGFzeW5jX2hvb2tzIGFkZGl0aW9ucyB0byBwcm9taXNlOiAke3ByfS4ke3EoXG4gICAgICBTdHJpbmcoa2V5KSxcbiAgICApfSBpcyAke3ZhbH1gO1xuICB9O1xuXG4gIHJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZU93bktleSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZSA9IChwciwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICAoaXNGcm96ZW4ocHIpIHx8IENYKGNoZWNrKWAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkgJiZcbiAgICAoaXNQcm9taXNlKHByKSB8fCBDWChjaGVjaylgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApICYmXG4gICAgKGdldFByb3RvdHlwZU9mKHByKSA9PT0gUHJvbWlzZS5wcm90b3R5cGUgfHxcbiAgICAgIENYKGNoZWNrKWAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG4gICAgICAgIGdldFByb3RvdHlwZU9mKHByKSxcbiAgICAgICl9YCkgJiZcbiAgICBjaGVja1Byb21pc2VPd25LZXlzKC8qICAgICAgICAgICAgICAgICAgKi8gKHByKSwgY2hlY2spXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1NhZmVQcm9taXNlID0gcHIgPT4gY2hlY2tTYWZlUHJvbWlzZShwciwgeCA9PiB4KTskaM2PX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFNhZmVQcm9taXNlID0gcHIgPT4gY2hlY2tTYWZlUHJvbWlzZShwciwgYXNzZXJ0Q2hlY2tlcik7JGjNj19vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC6Ps2heQgAAHkIAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3N0cmluZy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImlzV2VsbEZvcm1lZFN0cmluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8vXG5jb25zdCBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kID0gISFTdHJpbmcucHJvdG90eXBlLmlzV2VsbEZvcm1lZDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1dlbGxGb3JtZWRTdHJpbmcgPSBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kXG4gID8gc3RyID0+IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnICYmIHN0ci5pc1dlbGxGb3JtZWQoKVxuICA6IHN0ciA9PiB7XG4gICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaCBvZiBzdHIpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgY3AgPSAvKiAgICAgICAgICAgICAgICAgKi8gKGNoLmNvZGVQb2ludEF0KDApKTtcbiAgICAgICAgaWYgKGNwID49IDB4ZDgwMCAmJiBjcCA8PSAweGRmZmYpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07JGjNj19vbmNlLmlzV2VsbEZvcm1lZFN0cmluZyhpc1dlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyA9IHN0ciA9PiB7XG4gIGlzV2VsbEZvcm1lZFN0cmluZyhzdHIpIHx8IEZhaWxgRXhwZWN0ZWQgd2VsbC1mb3JtZWQgdW5pY29kZSBzdHJpbmc6ICR7c3RyfWA7XG59OyRozY9fb25jZS5hc3NlcnRXZWxsRm9ybWVkU3RyaW5nKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuXG5jb25zdCBPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUgPVxuICBnZXRFbnZpcm9ubWVudE9wdGlvbignT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFJywgJ2Rpc2FibGVkJywgW1xuICAgICdlbmFibGVkJyxcbiAgXSkgPT09ICdlbmFibGVkJztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3RyaW5nID0gc3RyID0+IHtcbiAgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgfHwgRmFpbGBFeHBlY3RlZCBzdHJpbmcgJHtzdHJ9YDtcbiAgIU9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRSB8fCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKHN0cik7XG59OyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZVN0cmluZyhhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTdHJpbmcpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNXZWxsRm9ybWVkU3RyaW5nIjpbImlzV2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIjpbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciXSwiYXNzZXJ0UGFzc2FibGVTdHJpbmciOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAswoQLNwLAADcCwAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zeW1ib2wuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKlxuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzID0gbmV3IE1hcChcbiAgb3duS2V5cyhTeW1ib2wpXG4gICAgLmZpbHRlcihcbiAgICAgIG5hbWUgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBTeW1ib2xbbmFtZV0gPT09ICdzeW1ib2wnLFxuICAgIClcbiAgICAuZmlsdGVyKG5hbWUgPT4ge1xuICAgICAgLy9cbiAgICAgICFuYW1lLnN0YXJ0c1dpdGgoJ0BAJykgfHxcbiAgICAgICAgRmFpbGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgKX1gO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSlcbiAgICAvL1xuICAgIC5tYXAobmFtZSA9PiBbU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pLFxuKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGVTeW1ib2wgPSBzeW0gPT5cbiAgdHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcgJiZcbiAgKHR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSkgPT09ICdzdHJpbmcnIHx8IHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaM2PX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3ltYm9sID0gc3ltID0+XG4gIGlzUGFzc2FibGVTeW1ib2woc3ltKSB8fFxuICBGYWlsYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBTeW1ib2wua2V5Rm9yKHN5bSk7XG4gIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gIH1cbiAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgIHJldHVybiBgQEAke25hbWV9YDtcbiAgfVxuICByZXR1cm4gbmFtZTtcbn07JGjNj19vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuID0gL15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFzc2FibGVTeW1ib2xGb3JOYW1lID0gbmFtZSA9PiB7XG4gIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgIEZhaWxgJHtxKG5hbWUpfSBtdXN0IGJlIGEgc3RyaW5nLCBub3QgJHtxKHR5cGVvZiBuYW1lKX1gO1xuICBjb25zdCBtYXRjaCA9IEF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG4gIGlmIChtYXRjaCkge1xuICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgIGlmIChzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgICAgcmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3ltID0gU3ltYm9sW3N1ZmZpeF07XG4gICAgICBpZiAodHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuIHN5bTtcbiAgICAgIH1cbiAgICAgIEZhaWxgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xufTskaM2PX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCB1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9IG5hbWUgPT4gU3ltYm9sKG5hbWUpOyRozY9fb25jZS51bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSh1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlU3ltYm9sIjpbImlzUGFzc2FibGVTeW1ib2wiXSwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPLl8lDJBwAAyQcAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdGFnZ2VkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJUYWdnZWRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxnZXRPd25EYXRhRGVzY3JpcHRvcixjaGVja1Bhc3NTdHlsZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV0sW1wiY2hlY2tQYXNzU3R5bGVcIixbJGjNj19hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBUYWdnZWRIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICd0YWdnZWQnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIGNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwgY2FuZGlkYXRlW1BBU1NfU1RZTEVdLCAndGFnZ2VkJywgY2hlY2spLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIGNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwgJ3RhZ2dlZCcsIGFzc2VydENoZWNrZXIpO1xuXG4gICAgLy9cbiAgICBjb25zdCBwYXNzU3R5bGVLZXkgPSAvKiAgICAgICAgICAgICAgICAgICovIChQQVNTX1NUWUxFKTtcbiAgICBjb25zdCB0YWdLZXkgPSAvKiAgICAgICAgICAgICAgICAgICovIChTeW1ib2wudG9TdHJpbmdUYWcpO1xuICAgIGNvbnN0IHtcbiAgICAgIC8vXG4gICAgICBbLyogICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVLZXkpXTogX3Bhc3NTdHlsZURlc2MsXG4gICAgICBbLyogICAgICAgICAgICAgICAgICovICh0YWdLZXkpXTogX2xhYmVsRGVzYyxcbiAgICAgIHBheWxvYWQ6IF9wYXlsb2FkRGVzYywgLy9cbiAgICAgIC4uLnJlc3REZXNjc1xuICAgIH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG4gICAgb3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gdGFnZ2VkIHJlY29yZCAke293bktleXMocmVzdERlc2NzKX1gO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIHBhc3NTdHlsZU9mUmVjdXIoXG4gICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsICdwYXlsb2FkJywgdHJ1ZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWUsXG4gICAgKTtcbiAgfSxcbn0pOyRozY9fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAUcLOra4QAACuEAAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRBdG9tIiwiYXNzZXJ0Qnl0ZUFycmF5IiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNBdG9tIiwiaXNCeXRlQXJyYXkiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsWCxpZGVudENoZWNrZXIscGFzc1N0eWxlT2YsYXNzZXJ0Q2hlY2tlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsWyRozY9fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNDb3B5QXJyYXkgPSBhcnIgPT4gcGFzc1N0eWxlT2YoYXJyKSA9PT0gJ2NvcHlBcnJheSc7JGjNj19vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNCeXRlQXJyYXkgPSBhcnIgPT4gcGFzc1N0eWxlT2YoYXJyKSA9PT0gJ2J5dGVBcnJheSc7JGjNj19vbmNlLmlzQnl0ZUFycmF5KGlzQnl0ZUFycmF5KTtcbmhhcmRlbihpc0J5dGVBcnJheSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNSZWNvcmQgPSByZWNvcmQgPT4gcGFzc1N0eWxlT2YocmVjb3JkKSA9PT0gJ2NvcHlSZWNvcmQnOyRozY9fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1JlbW90YWJsZSA9IHJlbW90YWJsZSA9PiBwYXNzU3R5bGVPZihyZW1vdGFibGUpID09PSAncmVtb3RhYmxlJzskaM2PX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlBcnJheSA9IChhcnIsIG9wdE5hbWVPZkFycmF5ID0gJ0FsbGVnZWQgYXJyYXknKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKGFycik7XG4gIHBhc3NTdHlsZSA9PT0gJ2NvcHlBcnJheScgfHxcbiAgICBGYWlsYCR7cShvcHROYW1lT2ZBcnJheSl9ICR7YXJyfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxuICAgICAgcGFzc1N0eWxlLFxuICAgICl9YDtcbn07JGjNj19vbmNlLmFzc2VydENvcHlBcnJheShhc3NlcnRDb3B5QXJyYXkpO1xuaGFyZGVuKGFzc2VydENvcHlBcnJheSk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRCeXRlQXJyYXkgPSAoYXJyLCBvcHROYW1lT2ZBcnJheSA9ICdBbGxlZ2VkIGJ5dGVBcnJheScpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YoYXJyKTtcbiAgcGFzc1N0eWxlID09PSAnYnl0ZUFycmF5JyB8fFxuICAgIEZhaWxgJHtxKFxuICAgICAgb3B0TmFtZU9mQXJyYXksXG4gICAgKX0gJHthcnJ9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYmluYXJ5IGRhdGEsIG5vdCAke3EocGFzc1N0eWxlKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0Qnl0ZUFycmF5KGFzc2VydEJ5dGVBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Qnl0ZUFycmF5KTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UmVjb3JkID0gKHJlY29yZCwgb3B0TmFtZU9mUmVjb3JkID0gJ0FsbGVnZWQgcmVjb3JkJykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZWNvcmQpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5UmVjb3JkJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UmVtb3RhYmxlID0gKFxuICByZW1vdGFibGUsXG4gIG9wdE5hbWVPZlJlbW90YWJsZSA9ICdBbGxlZ2VkIHJlbW90YWJsZScsXG4pID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmVtb3RhYmxlKTtcbiAgcGFzc1N0eWxlID09PSAncmVtb3RhYmxlJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxuICAgICAgcGFzc1N0eWxlLFxuICAgICl9YDtcbn07JGjNj19vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrQXRvbSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGxldCBwYXNzU3R5bGU7XG4gIHRyeSB7XG4gICAgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoZWNrICE9PSBpZGVudENoZWNrZXIgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYE5vdCBldmVuIFBhc3NhYmxlOiAke3EoZXJyKX06ICR7dmFsfWApXG4gICAgKTtcbiAgfVxuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgY2FzZSAnbnVsbCc6XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdiaWdpbnQnOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnYnl0ZUFycmF5JzpcbiAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICAgIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhbiBhdG9tOiAke3ZhbH1gKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgaXNBdG9tID0gdmFsID0+IGNoZWNrQXRvbSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQXRvbShpc0F0b20pO1xuaGFyZGVuKGlzQXRvbSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0QXRvbSA9IHZhbCA9PiB7XG4gIGNoZWNrQXRvbSh2YWwsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0QXRvbShhc3NlcnRBdG9tKTtcbmhhcmRlbihhc3NlcnRBdG9tKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzQnl0ZUFycmF5IjpbImlzQnl0ZUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0Qnl0ZUFycmF5IjpbImFzc2VydEJ5dGVBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXSwiaXNBdG9tIjpbImlzQXRvbSJdLCJhc3NlcnRBdG9tIjpbImFzc2VydEF0b20iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1TZLc7w4AAO8OAAAeAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiLCIuL3NyYy9rZXlzL2NvcHlTZXQuanMiLCIuL3NyYy9rZXlzL2NvcHlCYWcuanMiLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiYmFnVW5pb24iLCJiYWdVbmlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciIsInNldENvbXBhcmUiLCJzZXRDb21wYXJlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2tleXMvY2hlY2tLZXkuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weVNldC5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5QmFnLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjpbWyJpc0tleSIsImlzS2V5Il0sWyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiXSxbImFzc2VydFNjYWxhcktleSIsImFzc2VydFNjYWxhcktleSJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il0sWyJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0Q29weVNldCJdLFsibWFrZUNvcHlTZXQiLCJtYWtlQ29weVNldCJdLFsiZ2V0Q29weVNldEtleXMiLCJnZXRDb3B5U2V0S2V5cyJdLFsiaXNDb3B5QmFnIiwiaXNDb3B5QmFnIl0sWyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weUJhZyJdLFsibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZyJdLFsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLFsiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5QmFnRW50cmllcyJdLFsiaXNDb3B5TWFwIiwiaXNDb3B5TWFwIl0sWyJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weU1hcCJdLFsibWFrZUNvcHlNYXAiLCJtYWtlQ29weU1hcCJdLFsiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjpbWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdXSwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjpbWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXV0sIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOltbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSJdLFsiY29tcGFyZUtleXMiLCJjb21wYXJlS2V5cyJdLFsia2V5TFQiLCJrZXlMVCJdLFsia2V5TFRFIiwia2V5TFRFIl0sWyJrZXlFUSIsImtleUVRIl0sWyJrZXlHVEUiLCJrZXlHVEUiXSxbImtleUdUIiwia2V5R1QiXV0sIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6W1siZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOltbImJhZ0lzU3VwZXJiYWciLCJiYWdJc1N1cGVyYmFnIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOltbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJtdXN0TWF0Y2giLCJtdXN0TWF0Y2giXSxbImlzQXdhaXRBcmdHdWFyZCIsImlzQXdhaXRBcmdHdWFyZCJdLFsiYXNzZXJ0QXdhaXRBcmdHdWFyZCIsImFzc2VydEF3YWl0QXJnR3VhcmQiXSxbImlzUmF3R3VhcmQiLCJpc1Jhd0d1YXJkIl0sWyJhc3NlcnRSYXdHdWFyZCIsImFzc2VydFJhd0d1YXJkIl0sWyJhc3NlcnRNZXRob2RHdWFyZCIsImFzc2VydE1ldGhvZEd1YXJkIl0sWyJhc3NlcnRJbnRlcmZhY2VHdWFyZCIsImFzc2VydEludGVyZmFjZUd1YXJkIl0sWyJraW5kT2YiLCJraW5kT2YiXSxbImNvbnRhaW5lckhhc1NwbGl0IiwiY29udGFpbmVySGFzU3BsaXQiXV0sIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiOltbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIiwiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSxbImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLFsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sWyJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIiwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdXSwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6W1sibGlzdERpZmZlcmVuY2UiLCJsaXN0RGlmZmVyZW5jZSJdXSwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOltbIm9iamVjdE1hcCIsIm9iamVjdE1hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAujIwgSQ0AAAkNAAAKgAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jaGVja0tleS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiLi9jb3B5U2V0LmpzIiwiLi9jb3B5QmFnLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUJhZyIsImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0S2V5IiwiYXNzZXJ0U2NhbGFyS2V5IiwiY2hlY2tDb3B5QmFnIiwiY2hlY2tDb3B5TWFwIiwiY2hlY2tDb3B5U2V0IiwiY2hlY2tLZXkiLCJjaGVja1NjYWxhcktleSIsImNvcHlNYXBLZXlTZXQiLCJldmVyeUNvcHlCYWdFbnRyeSIsImV2ZXJ5Q29weU1hcEtleSIsImV2ZXJ5Q29weU1hcFZhbHVlIiwiZXZlcnlDb3B5U2V0S2V5IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyeUFycmF5IiwiZ2V0Q29weU1hcEtleXMiLCJnZXRDb3B5TWFwVmFsdWVzIiwiZ2V0Q29weVNldEtleXMiLCJpc0NvcHlCYWciLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJpc0tleSIsImlzU2NhbGFyS2V5IiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHEsRmFpbCxpZGVudENoZWNrZXIsYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaXNBdG9tLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGNoZWNrRWxlbWVudHMsbWFrZVNldE9mRWxlbWVudHMsY2hlY2tCYWdFbnRyaWVzLG1ha2VCYWdPZkVudHJpZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0F0b21cIixbJGjNj19hID0+IChpc0F0b20gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiY2hlY2tFbGVtZW50c1wiLFskaM2PX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaM2PX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIixbJGjNj19hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRozY9fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiY2hlY2tCYWdFbnRyaWVzXCIsWyRozY9fYSA9PiAoY2hlY2tCYWdFbnRyaWVzID0gJGjNj19hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIixbJGjNj19hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuICovXG5cbi8vXG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjaGVja1NjYWxhcktleSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChpc0F0b20odmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIGlmIChwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIHNjYWxhciBrZXk6ICR7dmFsfWApO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuY2hlY2tTY2FsYXJLZXkoY2hlY2tTY2FsYXJLZXkpO1xuICAgICAgIGNvbnN0IGlzU2NhbGFyS2V5ID0gdmFsID0+IGNoZWNrU2NhbGFyS2V5KHZhbCwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNTY2FsYXJLZXkoaXNTY2FsYXJLZXkpO1xuaGFyZGVuKGlzU2NhbGFyS2V5KTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRTY2FsYXJLZXkgPSB2YWwgPT4ge1xuICBjaGVja1NjYWxhcktleSh2YWwsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0U2NhbGFyS2V5KGFzc2VydFNjYWxhcktleSk7XG5oYXJkZW4oYXNzZXJ0U2NhbGFyS2V5KTtcblxuLy9cblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbmNvbnN0IGtleU1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tLZXkgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoaXNBdG9tKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvL1xuICBpZiAoa2V5TWVtby5oYXModmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vXG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrS2V5SW50ZXJuYWwodmFsLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBrZXlNZW1vLmFkZCh2YWwpO1xuICB9XG4gIC8vXG4gIC8vXG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0tleShjaGVja0tleSk7XG5oYXJkZW4oY2hlY2tLZXkpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0tleSA9IHZhbCA9PiBjaGVja0tleSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzS2V5KGlzS2V5KTtcbmhhcmRlbihpc0tleSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0S2V5ID0gdmFsID0+IHtcbiAgY2hlY2tLZXkodmFsLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEtleShhc3NlcnRLZXkpO1xuaGFyZGVuKGFzc2VydEtleSk7XG5cbi8vXG5cbi8vXG4vL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb3B5U2V0TWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjaGVja0NvcHlTZXQgPSAocywgY2hlY2spID0+IHtcbiAgaWYgKGNvcHlTZXRNZW1vLmhhcyhzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgKChwYXNzU3R5bGVPZihzKSA9PT0gJ3RhZ2dlZCcgJiYgZ2V0VGFnKHMpID09PSAnY29weVNldCcpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBOb3QgYSBjb3B5U2V0OiAke3N9YCkpICYmXG4gICAgY2hlY2tFbGVtZW50cyhzLnBheWxvYWQsIGNoZWNrKSAmJlxuICAgIGNoZWNrS2V5KHMucGF5bG9hZCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weVNldE1lbW8uYWRkKHMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlTZXQoY2hlY2tDb3B5U2V0KTtcbmhhcmRlbihjaGVja0NvcHlTZXQpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weVNldCA9IHMgPT4gY2hlY2tDb3B5U2V0KHMsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlTZXQgPSBzID0+IHtcbiAgY2hlY2tDb3B5U2V0KHMsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weVNldChhc3NlcnRDb3B5U2V0KTtcbmhhcmRlbihhc3NlcnRDb3B5U2V0KTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlTZXRLZXlzID0gcyA9PiB7XG4gIGFzc2VydENvcHlTZXQocyk7XG4gIHJldHVybiBzLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRDb3B5U2V0S2V5cyhnZXRDb3B5U2V0S2V5cyk7XG5oYXJkZW4oZ2V0Q29weVNldEtleXMpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlTZXRLZXkgPSAocywgZm4pID0+XG4gIGdldENvcHlTZXRLZXlzKHMpLmV2ZXJ5KChrZXksIGluZGV4KSA9PiBmbihrZXksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weVNldEtleShldmVyeUNvcHlTZXRLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weVNldEtleSk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weVNldCA9IGVsZW1lbnRJdGVyID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gbWFrZVNldE9mRWxlbWVudHMoZWxlbWVudEl0ZXIpO1xuICBhc3NlcnRDb3B5U2V0KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5tYWtlQ29weVNldChtYWtlQ29weVNldCk7XG5oYXJkZW4obWFrZUNvcHlTZXQpO1xuXG4vL1xuXG4vL1xuLy9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY29weUJhZ01lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tDb3B5QmFnID0gKGIsIGNoZWNrKSA9PiB7XG4gIGlmIChjb3B5QmFnTWVtby5oYXMoYikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCByZXN1bHQgPVxuICAgICgocGFzc1N0eWxlT2YoYikgPT09ICd0YWdnZWQnICYmIGdldFRhZyhiKSA9PT0gJ2NvcHlCYWcnKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgTm90IGEgY29weUJhZzogJHtifWApKSAmJlxuICAgIGNoZWNrQmFnRW50cmllcyhiLnBheWxvYWQsIGNoZWNrKSAmJlxuICAgIGNoZWNrS2V5KGIucGF5bG9hZCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weUJhZ01lbW8uYWRkKGIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlCYWcoY2hlY2tDb3B5QmFnKTtcbmhhcmRlbihjaGVja0NvcHlCYWcpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weUJhZyA9IGIgPT4gY2hlY2tDb3B5QmFnKGIsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weUJhZyhpc0NvcHlCYWcpO1xuaGFyZGVuKGlzQ29weUJhZyk7XG5cbi8qXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlCYWcgPSBiID0+IHtcbiAgY2hlY2tDb3B5QmFnKGIsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weUJhZyhhc3NlcnRDb3B5QmFnKTtcbmhhcmRlbihhc3NlcnRDb3B5QmFnKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlCYWdFbnRyaWVzID0gYiA9PiB7XG4gIGFzc2VydENvcHlCYWcoYik7XG4gIHJldHVybiBiLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRDb3B5QmFnRW50cmllcyhnZXRDb3B5QmFnRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weUJhZ0VudHJpZXMpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlCYWdFbnRyeSA9IChiLCBmbikgPT5cbiAgZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LCBpbmRleCkgPT4gZm4oZW50cnksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weUJhZyA9IGJhZ0VudHJ5SXRlciA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VCYWdPZkVudHJpZXMoYmFnRW50cnlJdGVyKTtcbiAgYXNzZXJ0Q29weUJhZyhyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubWFrZUNvcHlCYWcobWFrZUNvcHlCYWcpO1xuaGFyZGVuKG1ha2VDb3B5QmFnKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzID0gZWxlbWVudEl0ZXIgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG4gIGNvbnN0IHNvcnRlZCA9IHNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsIGZ1bGxDb21wYXJlKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyApIHtcbiAgICBjb25zdCBrID0gc29ydGVkW2ldO1xuICAgIGxldCBqID0gaSArIDE7XG4gICAgd2hpbGUgKGogPCBzb3J0ZWQubGVuZ3RoICYmIGZ1bGxDb21wYXJlKGssIHNvcnRlZFtqXSkgPT09IDApIHtcbiAgICAgIGogKz0gMTtcbiAgICB9XG4gICAgZW50cmllcy5wdXNoKFtrLCBCaWdJbnQoaiAtIGkpXSk7XG4gICAgaSA9IGo7XG4gIH1cbiAgcmV0dXJuIG1ha2VDb3B5QmFnKGVudHJpZXMpO1xufTskaM2PX29uY2UubWFrZUNvcHlCYWdGcm9tRWxlbWVudHMobWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcblxuLy9cblxuLy9cbi8vXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNvcHlNYXBNZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrQ29weU1hcCA9IChtLCBjaGVjaykgPT4ge1xuICBpZiAoY29weU1hcE1lbW8uaGFzKG0pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCEocGFzc1N0eWxlT2YobSkgPT09ICd0YWdnZWQnICYmIGdldFRhZyhtKSA9PT0gJ2NvcHlNYXAnKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBOb3QgYSBjb3B5TWFwOiAke219YCk7XG4gIH1cbiAgY29uc3QgeyBwYXlsb2FkIH0gPSBtO1xuICBpZiAocGFzc1N0eWxlT2YocGF5bG9hZCkgIT09ICdjb3B5UmVjb3JkJykge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3QgYmUgYSByZWNvcmQ6ICR7bX1gKTtcbiAgfVxuICBjb25zdCB7IGtleXMsIHZhbHVlcywgLi4ucmVzdCB9ID0gcGF5bG9hZDtcbiAgY29uc3QgcmVzdWx0ID1cbiAgICAob3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3Qgb25seSBoYXZlIC5rZXlzIGFuZCAudmFsdWVzOiAke219YCxcbiAgICAgICkpICYmXG4gICAgY2hlY2tFbGVtZW50cyhrZXlzLCBjaGVjaykgJiZcbiAgICBjaGVja0tleShrZXlzLCBjaGVjaykgJiZcbiAgICAocGFzc1N0eWxlT2YodmFsdWVzKSA9PT0gJ2NvcHlBcnJheScgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgY29weU1hcCdzIC52YWx1ZXMgbXVzdCBiZSBhIGNvcHlBcnJheTogJHttfWApKSAmJlxuICAgIChrZXlzLmxlbmd0aCA9PT0gdmFsdWVzLmxlbmd0aCB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEEgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXMgYW5kIHZhbHVlczogJHttfWAsXG4gICAgICApKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvcHlNYXBNZW1vLmFkZChtKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tDb3B5TWFwKGNoZWNrQ29weU1hcCk7XG5oYXJkZW4oY2hlY2tDb3B5TWFwKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlNYXAgPSBtID0+IGNoZWNrQ29weU1hcChtLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmhhcmRlbihpc0NvcHlNYXApO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlNYXAgPSBtID0+IHtcbiAgY2hlY2tDb3B5TWFwKG0sIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weU1hcChhc3NlcnRDb3B5TWFwKTtcbmhhcmRlbihhc3NlcnRDb3B5TWFwKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcEtleXMgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgcmV0dXJuIG0ucGF5bG9hZC5rZXlzO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcEtleXMoZ2V0Q29weU1hcEtleXMpO1xuaGFyZGVuKGdldENvcHlNYXBLZXlzKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcFZhbHVlcyA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICByZXR1cm4gbS5wYXlsb2FkLnZhbHVlcztcbn07JGjNj19vbmNlLmdldENvcHlNYXBWYWx1ZXMoZ2V0Q29weU1hcFZhbHVlcyk7XG5oYXJkZW4oZ2V0Q29weU1hcFZhbHVlcyk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5TWFwRW50cnlBcnJheSA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICBjb25zdCB7XG4gICAgcGF5bG9hZDogeyBrZXlzLCB2YWx1ZXMgfSxcbiAgfSA9IG07XG4gIHJldHVybiBoYXJkZW4oa2V5cy5tYXAoKGtleSwgaSkgPT4gW2tleSwgdmFsdWVzW2ldXSkpO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcEVudHJ5QXJyYXkoZ2V0Q29weU1hcEVudHJ5QXJyYXkpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyeUFycmF5KTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcEVudHJpZXMgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgY29uc3Qge1xuICAgIHBheWxvYWQ6IHsga2V5cywgdmFsdWVzIH0sXG4gIH0gPSBtO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gLyogICAgICAgICAgICAgICAgKi8gKGtleXMpO1xuICByZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBba2V5c1tpXSwgdmFsdWVzW2ldXSB9KTtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLmdldENvcHlNYXBFbnRyaWVzKGdldENvcHlNYXBFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwRW50cmllcyk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZXZlcnlDb3B5TWFwS2V5ID0gKG0sIGZuKSA9PlxuICBnZXRDb3B5TWFwS2V5cyhtKS5ldmVyeSgoa2V5LCBpbmRleCkgPT4gZm4oa2V5LCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlNYXBLZXkoZXZlcnlDb3B5TWFwS2V5KTtcbmhhcmRlbihldmVyeUNvcHlNYXBLZXkpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGV2ZXJ5Q29weU1hcFZhbHVlID0gKG0sIGZuKSA9PlxuICBnZXRDb3B5TWFwVmFsdWVzKG0pLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IGZuKHZhbHVlLCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlNYXBWYWx1ZShldmVyeUNvcHlNYXBWYWx1ZSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwVmFsdWUpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjb3B5TWFwS2V5U2V0ID0gbSA9PlxuICAvL1xuICBtYWtlVGFnZ2VkKCdjb3B5U2V0JywgbS5wYXlsb2FkLmtleXMpOyRozY9fb25jZS5jb3B5TWFwS2V5U2V0KGNvcHlNYXBLZXlTZXQpO1xuaGFyZGVuKGNvcHlNYXBLZXlTZXQpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weU1hcCA9IGVudHJpZXMgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gc29ydEJ5UmFuayhlbnRyaWVzLCBjb21wYXJlQW50aVJhbmspO1xuICBjb25zdCBrZXlzID0gc29ydGVkRW50cmllcy5tYXAoKFtrLCBfdl0pID0+IGspO1xuICBjb25zdCB2YWx1ZXMgPSBzb3J0ZWRFbnRyaWVzLm1hcCgoW19rLCB2XSkgPT4gdik7XG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCB7IGtleXMsIHZhbHVlcyB9KTtcbiAgYXNzZXJ0Q29weU1hcChyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubWFrZUNvcHlNYXAobWFrZUNvcHlNYXApO1xuaGFyZGVuKG1ha2VDb3B5TWFwKTtcblxuLy9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrS2V5SW50ZXJuYWwgPSAodmFsLCBjaGVjaykgPT4ge1xuICBjb25zdCBjaGVja0l0ID0gY2hpbGQgPT4gY2hlY2tLZXkoY2hpbGQsIGNoZWNrKTtcblxuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWwpLmV2ZXJ5KGNoZWNrSXQpO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHZhbC5ldmVyeShjaGVja0l0KTtcbiAgICB9XG4gICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHZhbCk7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgIHJldHVybiBjaGVja0NvcHlTZXQodmFsLCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tDb3B5QmFnKHZhbCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNoZWNrQ29weU1hcCh2YWwsIGNoZWNrKSAmJlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgZXZlcnlDb3B5TWFwVmFsdWUodmFsLCBjaGVja0l0KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICAgICAgICBjaGVjayhmYWxzZSwgWGBBIHBhc3NhYmxlIHRhZ2dlZCAke3EodGFnKX0gaXMgbm90IGEga2V5OiAke3ZhbH1gKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY2FzZSAnZXJyb3InOlxuICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEga2V5YCk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgdGhyb3cgRmFpbGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7dmFsfWA7XG4gICAgfVxuICB9XG59O1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2hlY2tTY2FsYXJLZXkiOlsiY2hlY2tTY2FsYXJLZXkiXSwiaXNTY2FsYXJLZXkiOlsiaXNTY2FsYXJLZXkiXSwiYXNzZXJ0U2NhbGFyS2V5IjpbImFzc2VydFNjYWxhcktleSJdLCJjaGVja0tleSI6WyJjaGVja0tleSJdLCJpc0tleSI6WyJpc0tleSJdLCJhc3NlcnRLZXkiOlsiYXNzZXJ0S2V5Il0sImNoZWNrQ29weVNldCI6WyJjaGVja0NvcHlTZXQiXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCJdLCJhc3NlcnRDb3B5U2V0IjpbImFzc2VydENvcHlTZXQiXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiXSwiZXZlcnlDb3B5U2V0S2V5IjpbImV2ZXJ5Q29weVNldEtleSJdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCJdLCJjaGVja0NvcHlCYWciOlsiY2hlY2tDb3B5QmFnIl0sImlzQ29weUJhZyI6WyJpc0NvcHlCYWciXSwiYXNzZXJ0Q29weUJhZyI6WyJhc3NlcnRDb3B5QmFnIl0sImdldENvcHlCYWdFbnRyaWVzIjpbImdldENvcHlCYWdFbnRyaWVzIl0sImV2ZXJ5Q29weUJhZ0VudHJ5IjpbImV2ZXJ5Q29weUJhZ0VudHJ5Il0sIm1ha2VDb3B5QmFnIjpbIm1ha2VDb3B5QmFnIl0sIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIjpbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sImNoZWNrQ29weU1hcCI6WyJjaGVja0NvcHlNYXAiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJhc3NlcnRDb3B5TWFwIjpbImFzc2VydENvcHlNYXAiXSwiZ2V0Q29weU1hcEtleXMiOlsiZ2V0Q29weU1hcEtleXMiXSwiZ2V0Q29weU1hcFZhbHVlcyI6WyJnZXRDb3B5TWFwVmFsdWVzIl0sImdldENvcHlNYXBFbnRyeUFycmF5IjpbImdldENvcHlNYXBFbnRyeUFycmF5Il0sImdldENvcHlNYXBFbnRyaWVzIjpbImdldENvcHlNYXBFbnRyaWVzIl0sImV2ZXJ5Q29weU1hcEtleSI6WyJldmVyeUNvcHlNYXBLZXkiXSwiZXZlcnlDb3B5TWFwVmFsdWUiOlsiZXZlcnlDb3B5TWFwVmFsdWUiXSwiY29weU1hcEtleVNldCI6WyJjb3B5TWFwS2V5U2V0Il0sIm1ha2VDb3B5TWFwIjpbIm1ha2VDb3B5TWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADVF0ku/GQAAvxkAAC0AAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29tcGFyZUtleXMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyIsIi4vY2hlY2tLZXkuanMiLCIuL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIl0sImV4cG9ydHMiOlsiYmFnQ29tcGFyZSIsImNvbXBhcmVLZXlzIiwia2V5RVEiLCJrZXlHVCIsImtleUdURSIsImtleUxUIiwia2V5TFRFIiwic2V0Q29tcGFyZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGdldFRhZyxjb21wYXJlTnVtZXJpY3MsY29tcGFyZVJhbmsscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLHEsRmFpbCxhc3NlcnRLZXksZ2V0Q29weUJhZ0VudHJpZXMsZ2V0Q29weU1hcEVudHJ5QXJyYXksZ2V0Q29weVNldEtleXMsbWFrZUNvbXBhcmVDb2xsZWN0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiY29tcGFyZU51bWVyaWNzXCIsWyRozY9fYSA9PiAoY29tcGFyZU51bWVyaWNzID0gJGjNj19hKV1dLFtcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJ5QXJyYXlcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cnlBcnJheSA9ICRozY9fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dXV0sW1wiLi9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc1wiLCBbW1wibWFrZUNvbXBhcmVDb2xsZWN0aW9uXCIsWyRozY9fYSA9PiAobWFrZUNvbXBhcmVDb2xsZWN0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHNldENvbXBhcmUgPSBtYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICBzID0+IGhhcmRlbihnZXRDb3B5U2V0S2V5cyhzKS5tYXAoa2V5ID0+IFtrZXksIDFdKSlcbiAgKSxcbiAgMCxcbiAgY29tcGFyZU51bWVyaWNzLFxuKTskaM2PX29uY2Uuc2V0Q29tcGFyZShzZXRDb21wYXJlKTtcbmhhcmRlbihzZXRDb21wYXJlKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGJhZ0NvbXBhcmUgPSBtYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG4gIGdldENvcHlCYWdFbnRyaWVzLFxuICAwbixcbiAgY29tcGFyZU51bWVyaWNzLFxuKTskaM2PX29uY2UuYmFnQ29tcGFyZShiYWdDb21wYXJlKTtcbmhhcmRlbihiYWdDb21wYXJlKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgQUJTRU5UID0gU3ltYm9sKCdhYnNlbnQnKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuLy9cbmNvbnN0IF9tYXBDb21wYXJlID0gbWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuICBnZXRDb3B5TWFwRW50cnlBcnJheSxcbiAgQUJTRU5ULFxuICAobGVmdFZhbHVlLCByaWdodFZhbHVlKSA9PiB7XG4gICAgaWYgKGxlZnRWYWx1ZSA9PT0gQUJTRU5UICYmIHJpZ2h0VmFsdWUgPT09IEFCU0VOVCkge1xuICAgICAgdGhyb3cgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBhYnNlbnQgZW50cnkgcGFpcmA7XG4gICAgfSBlbHNlIGlmIChsZWZ0VmFsdWUgPT09IEFCU0VOVCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gZWxzZSBpZiAocmlnaHRWYWx1ZSA9PT0gQUJTRU5UKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjb21wYXJlS2V5cyhsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpO1xuICAgIH1cbiAgfSxcbik7XG5oYXJkZW4oX21hcENvbXBhcmUpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgY29tcGFyZUtleXMgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgYXNzZXJ0S2V5KGxlZnQpO1xuICBhc3NlcnRLZXkocmlnaHQpO1xuICBjb25zdCBsZWZ0U3R5bGUgPSBwYXNzU3R5bGVPZihsZWZ0KTtcbiAgY29uc3QgcmlnaHRTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0KTtcbiAgaWYgKGxlZnRTdHlsZSAhPT0gcmlnaHRTdHlsZSkge1xuICAgIC8vXG4gICAgcmV0dXJuIE5hTjtcbiAgfVxuICBzd2l0Y2ggKGxlZnRTdHlsZSkge1xuICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgY2FzZSAnbnVsbCc6XG4gICAgY2FzZSAnYm9vbGVhbic6XG4gICAgY2FzZSAnYmlnaW50JzpcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgIGNhc2UgJ2J5dGVBcnJheSc6XG4gICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjb21wYXJlUmFuayhsZWZ0LCByaWdodCk7XG4gICAgfVxuICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgIGNvbnN0IHJhbmtDb21wID0gY29tcGFyZVJhbmsobGVmdCwgcmlnaHQpO1xuICAgICAgaWYgKHJhbmtDb21wID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKE51bWJlci5pc05hTihsZWZ0KSB8fCBOdW1iZXIuaXNOYU4ocmlnaHQpKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGFzc2VydCghTnVtYmVyLmlzTmFOKGxlZnQpIHx8ICFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIHJhbmtDb21wO1xuICAgIH1cbiAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICBpZiAobGVmdCA9PT0gcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmVLZXlzKGxlZnRbaV0sIHJpZ2h0W2ldKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjb21wYXJlUmFuayhsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICB9XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgbGVmdE5hbWVzID0gcmVjb3JkTmFtZXMobGVmdCk7XG4gICAgICAvL1xuICAgICAgY29uc3QgcmlnaHROYW1lcyA9IHJlY29yZE5hbWVzKHJpZ2h0KTtcblxuICAgICAgLy9cbiAgICAgIGlmICgha2V5RVEobGVmdE5hbWVzLCByaWdodE5hbWVzKSkge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGNvbnN0IGxlZnRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMobGVmdCwgbGVmdE5hbWVzKTtcbiAgICAgIC8vXG4gICAgICBjb25zdCByaWdodFZhbHVlcyA9IHJlY29yZFZhbHVlcyhyaWdodCwgcmlnaHROYW1lcyk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWZ0VmFsdWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlS2V5cyhsZWZ0VmFsdWVzW2ldLCByaWdodFZhbHVlc1tpXSk7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4oY29tcCkpIHtcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQgIT09IGNvbXAgJiYgY29tcCAhPT0gMCkge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbXA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgKHJlc3VsdCA9PT0gLTEgJiYgY29tcCA9PT0gMSkgfHwgKHJlc3VsdCA9PT0gMSAmJiBjb21wID09PSAtMSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAvL1xuICAgICAgY29uc3QgbGVmdFRhZyA9IGdldFRhZyhsZWZ0KTtcbiAgICAgIC8vXG4gICAgICBjb25zdCByaWdodFRhZyA9IGdldFRhZyhyaWdodCk7XG4gICAgICBpZiAobGVmdFRhZyAhPT0gcmlnaHRUYWcpIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAobGVmdFRhZykge1xuICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIHNldENvbXBhcmUobGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gYmFnQ29tcGFyZShsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgdGhyb3cgRmFpbGBNYXAgY29tcGFyaXNvbiBub3QgeWV0IGltcGxlbWVudGVkOiAke2xlZnR9IHZzICR7cmlnaHR9YDtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBGYWlsYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShsZWZ0U3R5bGUpfTogJHtsZWZ0fWA7XG4gICAgfVxuICB9XG59OyRozY9fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG4gICAgICAgY29uc3Qga2V5TFQgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA8IDA7JGjNj19vbmNlLmtleUxUKGtleUxUKTtcbmhhcmRlbihrZXlMVCk7XG5cbiAgICAgICBjb25zdCBrZXlMVEUgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA8PSAwOyRozY9fb25jZS5rZXlMVEUoa2V5TFRFKTtcbmhhcmRlbihrZXlMVEUpO1xuXG4gICAgICAgY29uc3Qga2V5RVEgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA9PT0gMDskaM2PX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuICAgICAgIGNvbnN0IGtleUdURSA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID49IDA7JGjNj19vbmNlLmtleUdURShrZXlHVEUpO1xuaGFyZGVuKGtleUdURSk7XG5cbiAgICAgICBjb25zdCBrZXlHVCA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID4gMDskaM2PX29uY2Uua2V5R1Qoa2V5R1QpO1xuaGFyZGVuKGtleUdUKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNldENvbXBhcmUiOlsic2V0Q29tcGFyZSJdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiXSwiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiXSwia2V5TFQiOlsia2V5TFQiXSwia2V5TFRFIjpbImtleUxURSJdLCJrZXlFUSI6WyJrZXlFUSJdLCJrZXlHVEUiOlsia2V5R1RFIl0sImtleUdUIjpbImtleUdUIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFzRtojrDgAA6w4AACkAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29weUJhZy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0QmFnRW50cmllcyIsImFzc2VydE5vRHVwbGljYXRlS2V5cyIsImNoZWNrQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyIsIm1ha2VCYWdPZkVudHJpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLFg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIixbJGjNj19hID0+IChpc1JhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVLZXlzID0gKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlLCBjaGVjaykgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBmdWxsQ29tcGFyZSA9IGZ1bGxDb21wYXJlIHx8IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgYmFnRW50cmllcyA9IHNvcnRCeVJhbmsoYmFnRW50cmllcywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gYmFnRW50cmllcztcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGswID0gYmFnRW50cmllc1tpIC0gMV1bMF07XG4gICAgY29uc3QgazEgPSBiYWdFbnRyaWVzW2ldWzBdO1xuICAgIGlmIChmdWxsQ29tcGFyZShrMCwgazEpID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydE5vRHVwbGljYXRlS2V5cyA9IChiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSwgYXNzZXJ0Q2hlY2tlcik7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmFzc2VydE5vRHVwbGljYXRlS2V5cyhhc3NlcnROb0R1cGxpY2F0ZUtleXMpO1xuICAgICAgIGNvbnN0IGNoZWNrQmFnRW50cmllcyA9IChiYWdFbnRyaWVzLCBjaGVjaykgPT4ge1xuICBpZiAocGFzc1N0eWxlT2YoYmFnRW50cmllcykgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCxcbiAgICApO1xuICB9XG4gIGlmICghaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsIGNvbXBhcmVBbnRpUmFuaykpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtiYWdFbnRyaWVzfWAsXG4gICAgKTtcbiAgfVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGJhZ0VudHJpZXMpIHtcbiAgICBpZiAoXG4gICAgICBwYXNzU3R5bGVPZihlbnRyeSkgIT09ICdjb3B5QXJyYXknIHx8XG4gICAgICBlbnRyeS5sZW5ndGggIT09IDIgfHxcbiAgICAgIHR5cGVvZiBlbnRyeVsxXSAhPT0gJ2JpZ2ludCdcbiAgICApIHtcbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGVudHJ5WzFdIDwgMSkge1xuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLy9cbiAgcmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsIHVuZGVmaW5lZCwgY2hlY2spO1xufTskaM2PX29uY2UuY2hlY2tCYWdFbnRyaWVzKGNoZWNrQmFnRW50cmllcyk7XG5oYXJkZW4oY2hlY2tCYWdFbnRyaWVzKTtcblxuLy9cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0QmFnRW50cmllcyA9IGJhZ0VudHJpZXMgPT4ge1xuICBjaGVja0JhZ0VudHJpZXMoYmFnRW50cmllcywgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRCYWdFbnRyaWVzKGFzc2VydEJhZ0VudHJpZXMpO1xuaGFyZGVuKGFzc2VydEJhZ0VudHJpZXMpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNvZXJjZVRvQmFnRW50cmllcyA9IGJhZ0VudHJpZXNMaXN0ID0+IHtcbiAgY29uc3QgYmFnRW50cmllcyA9IHNvcnRCeVJhbmsoYmFnRW50cmllc0xpc3QsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGFzc2VydEJhZ0VudHJpZXMoYmFnRW50cmllcyk7XG4gIHJldHVybiBiYWdFbnRyaWVzO1xufTskaM2PX29uY2UuY29lcmNlVG9CYWdFbnRyaWVzKGNvZXJjZVRvQmFnRW50cmllcyk7XG5oYXJkZW4oY29lcmNlVG9CYWdFbnRyaWVzKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VCYWdPZkVudHJpZXMgPSBiYWdFbnRyeUl0ZXIgPT5cbiAgbWFrZVRhZ2dlZCgnY29weUJhZycsIGNvZXJjZVRvQmFnRW50cmllcyhiYWdFbnRyeUl0ZXIpKTskaM2PX29uY2UubWFrZUJhZ09mRW50cmllcyhtYWtlQmFnT2ZFbnRyaWVzKTtcbmhhcmRlbihtYWtlQmFnT2ZFbnRyaWVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABxyd+3sMAAB7DAAAKQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb3B5U2V0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVtZW50cyIsImFzc2VydE5vRHVwbGljYXRlcyIsImNoZWNrRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIiwibWFrZVNldE9mRWxlbWVudHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLFg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIixbJGjNj19hID0+IChpc1JhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVzID0gKGVsZW1lbnRzLCBmdWxsQ29tcGFyZSwgY2hlY2spID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgZnVsbENvbXBhcmUgPSBmdWxsQ29tcGFyZSB8fCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIGVsZW1lbnRzID0gc29ydEJ5UmFuayhlbGVtZW50cywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gZWxlbWVudHM7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBrMCA9IGVsZW1lbnRzW2kgLSAxXTtcbiAgICBjb25zdCBrMSA9IGVsZW1lbnRzW2ldO1xuICAgIGlmIChmdWxsQ29tcGFyZShrMCwgazEpID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydE5vRHVwbGljYXRlcyA9IChlbGVtZW50cywgZnVsbENvbXBhcmUgPSB1bmRlZmluZWQpID0+IHtcbiAgY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsIGZ1bGxDb21wYXJlLCBhc3NlcnRDaGVja2VyKTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVzKGFzc2VydE5vRHVwbGljYXRlcyk7XG4gICAgICAgY29uc3QgY2hlY2tFbGVtZW50cyA9IChlbGVtZW50cywgY2hlY2spID0+IHtcbiAgaWYgKHBhc3NTdHlsZU9mKGVsZW1lbnRzKSAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtlbGVtZW50c31gLFxuICAgICk7XG4gIH1cbiAgaWYgKCFpc1JhbmtTb3J0ZWQoZWxlbWVudHMsIGNvbXBhcmVBbnRpUmFuaykpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsIHVuZGVmaW5lZCwgY2hlY2spO1xufTskaM2PX29uY2UuY2hlY2tFbGVtZW50cyhjaGVja0VsZW1lbnRzKTtcbmhhcmRlbihjaGVja0VsZW1lbnRzKTtcblxuICAgICAgIGNvbnN0IGFzc2VydEVsZW1lbnRzID0gZWxlbWVudHMgPT4ge1xuICBjaGVja0VsZW1lbnRzKGVsZW1lbnRzLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEVsZW1lbnRzKGFzc2VydEVsZW1lbnRzKTtcbmhhcmRlbihhc3NlcnRFbGVtZW50cyk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgY29lcmNlVG9FbGVtZW50cyA9IGVsZW1lbnRzTGlzdCA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gc29ydEJ5UmFuayhlbGVtZW50c0xpc3QsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGFzc2VydEVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgcmV0dXJuIGVsZW1lbnRzO1xufTskaM2PX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXRPZkVsZW1lbnRzID0gZWxlbWVudEl0ZXIgPT5cbiAgbWFrZVRhZ2dlZCgnY29weVNldCcsIGNvZXJjZVRvRWxlbWVudHMoZWxlbWVudEl0ZXIpKTskaM2PX29uY2UubWFrZVNldE9mRWxlbWVudHMobWFrZVNldE9mRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VTZXRPZkVsZW1lbnRzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAPyB9jdhYAAHYWAAA5AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyIsIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMiLCJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLG1ha2VJdGVyYXRvcixtYWtlQXJyYXlJdGVyYXRvcixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzXCIsIFtbXCJtYWtlSXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlSXRlcmF0b3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbWFrZS1hcnJheS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUFycmF5SXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlQXJyYXlJdGVyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzID0gKGVudHJpZXMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICAvL1xuICBhc3NlcnRSYW5rU29ydGVkKGVudHJpZXMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGVudHJpZXM7XG4gIGxldCBpID0gMDtcbiAgbGV0IHNhbWVSYW5rSXRlcmF0b3I7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4ge1xuICAgIGlmIChzYW1lUmFua0l0ZXJhdG9yKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzYW1lUmFua0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHNhbWVSYW5rSXRlcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV07XG4gICAgICAvL1xuICAgICAgbGV0IGogPSBpICsgMTtcbiAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICYmIHJhbmtDb21wYXJlKGVudHJ5WzBdLCBlbnRyaWVzW2pdWzBdKSA9PT0gMCkge1xuICAgICAgICBqICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgLy9cbiAgICAgICAgaSA9IGo7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWU6IGVudHJ5IH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdGllcyA9IGVudHJpZXMuc2xpY2UoaSwgaik7XG4gICAgICBpID0gajtcblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qgc29ydGVkVGllcyA9IHNvcnRCeVJhbmsodGllcywgZnVsbENvbXBhcmUpO1xuICAgICAgZm9yIChsZXQgayA9IDE7IGsgPCBzb3J0ZWRUaWVzLmxlbmd0aDsgayArPSAxKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IFtrZXkwXSA9IHNvcnRlZFRpZXNbayAtIDFdO1xuICAgICAgICBjb25zdCBba2V5MV0gPSBzb3J0ZWRUaWVzW2tdO1xuICAgICAgICBNYXRoLnNpZ24oZnVsbENvbXBhcmUoa2V5MCwga2V5MSkpIHx8XG4gICAgICAgICAgRmFpbGBEdXBsaWNhdGUgZW50cnkga2V5OiAke2tleTB9YDtcbiAgICAgIH1cbiAgICAgIHNhbWVSYW5rSXRlcmF0b3IgPSBtYWtlQXJyYXlJdGVyYXRvcihzb3J0ZWRUaWVzKTtcbiAgICAgIHJldHVybiBzYW1lUmFua0l0ZXJhdG9yLm5leHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gIH0pO1xufTtcbmhhcmRlbihnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzID0gKFxuICBjMSxcbiAgYzIsXG4gIGdldEVudHJpZXMsXG4gIGFic2VudFZhbHVlLFxuKSA9PiB7XG4gIGNvbnN0IGUxID0gZ2V0RW50cmllcyhjMSk7XG4gIGNvbnN0IGUyID0gZ2V0RW50cmllcyhjMik7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuICBjb25zdCB4ID0gZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyhlMSwgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHkgPSBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKGUyLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcblxuICAvL1xuICAvL1xuICBsZXQgeERvbmU7XG4gIGxldCB4S2V5O1xuICBsZXQgeFZhbHVlO1xuICBsZXQgeURvbmU7XG4gIGxldCB5S2V5O1xuICBsZXQgeVZhbHVlO1xuICBjb25zdCBub25FbnRyeSA9IFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG4gIGNvbnN0IG5leHRYID0gKCkgPT4ge1xuICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICBjb25zdCByZXN1bHQgPSB4VmFsdWU7XG4gICAgKHsgZG9uZTogeERvbmUsIHZhbHVlOiBbeEtleSwgeFZhbHVlXSA9IG5vbkVudHJ5IH0gPSB4Lm5leHQoKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbmV4dFgoKTtcbiAgY29uc3QgbmV4dFkgPSAoKSA9PiB7XG4gICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIG11c3Qgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgIGNvbnN0IHJlc3VsdCA9IHlWYWx1ZTtcbiAgICAoeyBkb25lOiB5RG9uZSwgdmFsdWU6IFt5S2V5LCB5VmFsdWVdID0gbm9uRW50cnkgfSA9IHkubmV4dCgpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBuZXh0WSgpO1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoeERvbmUgJiYgeURvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgdmFsdWUgPSBbdW5kZWZpbmVkLCBhYnNlbnRWYWx1ZSwgYWJzZW50VmFsdWVdO1xuICAgIH0gZWxzZSBpZiAoeERvbmUpIHtcbiAgICAgIHZhbHVlID0gW3lLZXksIGFic2VudFZhbHVlLCBuZXh0WSgpXTtcbiAgICB9IGVsc2UgaWYgKHlEb25lKSB7XG4gICAgICB2YWx1ZSA9IFt4S2V5LCBuZXh0WCgpLCBhYnNlbnRWYWx1ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgY29tcCA9IGZ1bGxDb21wYXJlKHhLZXksIHlLZXkpO1xuICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgdmFsdWUgPSBbeEtleSwgbmV4dFgoKSwgbmV4dFkoKV07XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgIHZhbHVlID0gW3hLZXksIG5leHRYKCksIGFic2VudFZhbHVlXTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA+IDApIHtcbiAgICAgICAgdmFsdWUgPSBbeUtleSwgYWJzZW50VmFsdWUsIG5leHRZKCldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRmFpbGBVbmV4cGVjdGVkIGtleSBjb21wYXJpc29uICR7cShjb21wKX0gZm9yICR7eEtleX0gdnMgJHt5S2V5fWA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oeyBkb25lLCB2YWx1ZSB9KTtcbiAgfSk7XG59OyRozY9fb25jZS5nZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyk7XG5oYXJkZW4oZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb21wYXJlQ29sbGVjdGlvbiA9IChnZXRFbnRyaWVzLCBhYnNlbnRWYWx1ZSwgY29tcGFyZVZhbHVlcykgPT5cbiAgaGFyZGVuKChsZWZ0LCByaWdodCkgPT4ge1xuICAgIGNvbnN0IG1lcmdlZCA9IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKFxuICAgICAgbGVmdCxcbiAgICAgIHJpZ2h0LFxuICAgICAgZ2V0RW50cmllcyxcbiAgICAgIGFic2VudFZhbHVlLFxuICAgICk7XG4gICAgbGV0IGxlZnRJc0JpZ2dlciA9IGZhbHNlO1xuICAgIGxldCByaWdodElzQmlnZ2VyID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBbX2tleSwgbGVmdFZhbHVlLCByaWdodFZhbHVlXSBvZiBtZXJnZWQpIHtcbiAgICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlVmFsdWVzKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7XG4gICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICAvL1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmlnaHRJc0JpZ2dlciA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPiAwKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGxlZnRJc0JpZ2dlciA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBOdW1iZXIuaXNOYU4oY29tcCkgfHxcbiAgICAgICAgICAvL1xuICAgICAgICAgIEZhaWxgVW5leHBlY3RlZCB2YWx1ZSBjb21wYXJpc29uICR7cShjb21wKX0gZm9yICR7bGVmdFZhbHVlfSB2cyAke3JpZ2h0VmFsdWV9YDtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIGlmIChsZWZ0SXNCaWdnZXIgJiYgcmlnaHRJc0JpZ2dlcikge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgIH1cbiAgICAvL1xuICAgIHJldHVybiBsZWZ0SXNCaWdnZXIgPyAxIDogcmlnaHRJc0JpZ2dlciA/IC0xIDogMDtcbiAgfSk7JGjNj19vbmNlLm1ha2VDb21wYXJlQ29sbGVjdGlvbihtYWtlQ29tcGFyZUNvbGxlY3Rpb24pO1xuaGFyZGVuKG1ha2VDb21wYXJlQ29sbGVjdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyI6WyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyJdLCJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iOlsibWFrZUNvbXBhcmVDb2xsZWN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANICYgGRHAAAkRwAADUAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIiwiLi9jb3B5QmFnLmpzIl0sImV4cG9ydHMiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzRGlzam9pbnQiLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLHEsRmFpbCxhc3NlcnROb0R1cGxpY2F0ZUtleXMsbWFrZUJhZ09mRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIixbJGjNj19hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzXCIsWyRozY9fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gJGjNj19hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIixbJGjNj19hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vL1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYmFnV2luZG93UmVzb3J0ID0gKGJhZ0VudHJpZXMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKGJhZ0VudHJpZXMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGJhZ0VudHJpZXM7XG4gIGxldCBpID0gMDtcbiAgbGV0IG9wdElubmVySXRlcmF0b3I7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PlxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChvcHRJbm5lckl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYmFnRW50cmllc1tpXTtcbiAgICAgICAgICAgIGxldCBqID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgIGogPCBsZW5ndGggJiZcbiAgICAgICAgICAgICAgcmFua0NvbXBhcmUoZW50cnlbMF0sIGJhZ0VudHJpZXNbal1bMF0pID09PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaiArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPT09IGkgKyAxKSB7XG4gICAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBlbnRyeSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNpbWlsYXJSdW4gPSBiYWdFbnRyaWVzLnNsaWNlKGksIGopO1xuICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICBjb25zdCByZXNvcnRlZCA9IHNvcnRCeVJhbmsoc2ltaWxhclJ1biwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKHJlc29ydGVkLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIG9wdElubmVySXRlcmF0b3IgPSByZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgICAgICByZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogW251bGwsIDBuXSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWVyZ2UgPSAoeGJhZ0VudHJpZXMsIHliYWdFbnRyaWVzKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IGZ1bGxDb21wYXJlID0gbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuICBjb25zdCB4cyA9IGJhZ1dpbmRvd1Jlc29ydCh4YmFnRW50cmllcywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHlzID0gYmFnV2luZG93UmVzb3J0KHliYWdFbnRyaWVzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8qICAgICAgICAgICAgKi9cbiAgICAgIGxldCB4O1xuICAgICAgbGV0IHhjO1xuICAgICAgbGV0IHhEb25lO1xuICAgICAgLyogICAgICAgICAgICAqL1xuICAgICAgbGV0IHk7XG4gICAgICBsZXQgeWM7XG4gICAgICBsZXQgeURvbmU7XG5cbiAgICAgIGNvbnN0IHhpID0geHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoe1xuICAgICAgICAgIGRvbmU6IHhEb25lLFxuICAgICAgICAgIHZhbHVlOiBbeCwgeGNdLFxuICAgICAgICB9ID0geGkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WCgpO1xuXG4gICAgICBjb25zdCB5aSA9IHlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IG5leHRZID0gKCkgPT4ge1xuICAgICAgICAheURvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICAgICAgKHtcbiAgICAgICAgICBkb25lOiB5RG9uZSxcbiAgICAgICAgICB2YWx1ZTogW3ksIHljXSxcbiAgICAgICAgfSA9IHlpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFkoKTtcblxuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICBpZiAoeERvbmUgJiYgeURvbmUpIHtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHZhbHVlID0gW251bGwsIDBuLCAwbl07XG4gICAgICAgICAgfSBlbHNlIGlmICh4RG9uZSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCB5Y107XG4gICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeURvbmUpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB2YWx1ZSA9IFt4LCB4YywgMG5dO1xuICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29tcCA9IGZ1bGxDb21wYXJlKHgsIHkpO1xuICAgICAgICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIHljXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIDBuXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGNvbXAgPiAwIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbiAgICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIHljXTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmUsIHZhbHVlIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59O1xuaGFyZGVuKG1lcmdlKTtcblxuLy9cbi8vXG4vKlxuXG5cblxuICovXG5jb25zdCBiYWdJdGVySXNTdXBlcmJhZyA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA8IHljKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vXG4vL1xuLypcblxuXG5cbiAqL1xuY29uc3QgYmFnSXRlcklzRGlzam9pbnQgPSB4eWkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMW4gJiYgeWMgPj0gMW4pIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYmFnSXRlclVuaW9uID0geHlpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIHJlc3VsdC5wdXNoKFttLCB4YyArIHljXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGJhZ0l0ZXJJbnRlcnNlY3Rpb24gPSB4eWkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgY29uc3QgbWMgPSB4YyA8PSB5YyA/IHhjIDogeWM7XG4gICAgcmVzdWx0LnB1c2goW20sIG1jXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0ID0geHlpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGNvbnN0IG1jID0geGMgLSB5YztcbiAgICBtYyA+PSAwbiB8fCBGYWlsYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuICAgIGlmIChtYyA+PSAxbikge1xuICAgICAgLy9cbiAgICAgIHJlc3VsdC5wdXNoKFttLCBtY10pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgbWVyZ2VpZnkgPSBiYWdJdGVyT3AgPT4gKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykgPT5cbiAgYmFnSXRlck9wKG1lcmdlKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykpO1xuXG5jb25zdCBiYWdFbnRyaWVzSXNTdXBlcmJhZyA9IG1lcmdlaWZ5KGJhZ0l0ZXJJc1N1cGVyYmFnKTtcbmNvbnN0IGJhZ0VudHJpZXNJc0Rpc2pvaW50ID0gbWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uID0gbWVyZ2VpZnkoYmFnSXRlclVuaW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24gPSBtZXJnZWlmeShiYWdJdGVySW50ZXJzZWN0aW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0ID0gbWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnkgPSBiYWdFbnRyaWVzT3AgPT4gKHhiYWcsIHliYWcpID0+XG4gIGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQsIHliYWcucGF5bG9hZCk7XG5cbmNvbnN0IGJhZ2lmeSA9IGJhZ0VudHJpZXNPcCA9PiAoeGJhZywgeWJhZykgPT5cbiAgbWFrZUJhZ09mRW50cmllcyhiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLCB5YmFnLnBheWxvYWQpKTtcblxuICAgICAgIGNvbnN0IGJhZ0lzU3VwZXJiYWcgPSByYXdCYWdpZnkoYmFnRW50cmllc0lzU3VwZXJiYWcpOyRozY9fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuICAgICAgIGNvbnN0IGJhZ0lzRGlzam9pbnQgPSByYXdCYWdpZnkoYmFnRW50cmllc0lzRGlzam9pbnQpOyRozY9fb25jZS5iYWdJc0Rpc2pvaW50KGJhZ0lzRGlzam9pbnQpO1xuICAgICAgIGNvbnN0IGJhZ1VuaW9uID0gYmFnaWZ5KGJhZ0VudHJpZXNVbmlvbik7JGjNj19vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbiAgICAgICBjb25zdCBiYWdJbnRlcnNlY3Rpb24gPSBiYWdpZnkoYmFnRW50cmllc0ludGVyc2VjdGlvbik7JGjNj19vbmNlLmJhZ0ludGVyc2VjdGlvbihiYWdJbnRlcnNlY3Rpb24pO1xuICAgICAgIGNvbnN0IGJhZ0Rpc2pvaW50U3VidHJhY3QgPSBiYWdpZnkoYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QpOyRozY9fb25jZS5iYWdEaXNqb2ludFN1YnRyYWN0KGJhZ0Rpc2pvaW50U3VidHJhY3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIl0sImJhZ0lzRGlzam9pbnQiOlsiYmFnSXNEaXNqb2ludCJdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiJdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIl0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD5UY4TSSMAAEkjAAA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyIsIi4vY29weVNldC5qcyJdLCJleHBvcnRzIjpbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFVuaW9uIiwic2V0SW50ZXJzZWN0aW9uIiwic2V0SXNEaXNqb2ludCIsInNldElzU3VwZXJzZXQiLCJzZXRVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmsscSxGYWlsLGFzc2VydE5vRHVwbGljYXRlcyxtYWtlU2V0T2ZFbGVtZW50czskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIixbJGjNj19hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVzXCIsWyRozY9fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVzID0gJGjNj19hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsWyRozY9fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgd2luZG93UmVzb3J0ID0gKGVsZW1lbnRzLCByYW5rQ29tcGFyZSwgZnVsbENvbXBhcmUpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChlbGVtZW50cywgcmFua0NvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gZWxlbWVudHM7XG4gIGxldCBpID0gMDtcbiAgbGV0IG9wdElubmVySXRlcmF0b3I7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PlxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChvcHRJbm5lckl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudHNbaV07XG4gICAgICAgICAgICBsZXQgaiA9IGkgKyAxO1xuICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggJiYgcmFua0NvbXBhcmUodmFsdWUsIGVsZW1lbnRzW2pdKSA9PT0gMCkge1xuICAgICAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaW1pbGFyUnVuID0gZWxlbWVudHMuc2xpY2UoaSwgaik7XG4gICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgIGNvbnN0IHJlc29ydGVkID0gc29ydEJ5UmFuayhzaW1pbGFyUnVuLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXMocmVzb3J0ZWQsIGZ1bGxDb21wYXJlKTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgICAgICAgIHJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtZXJnZSA9ICh4ZWxlbWVudHMsIHllbGVtZW50cykgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgY29uc3QgeHMgPSB3aW5kb3dSZXNvcnQoeGVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeXMgPSB3aW5kb3dSZXNvcnQoeWVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8qICAgICAgICAgICAgKi9cbiAgICAgIGxldCB4O1xuICAgICAgbGV0IHhEb25lO1xuICAgICAgLyogICAgICAgICAgICAqL1xuICAgICAgbGV0IHk7XG4gICAgICBsZXQgeURvbmU7XG5cbiAgICAgIGNvbnN0IHhpID0geHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoeyBkb25lOiB4RG9uZSwgdmFsdWU6IHggfSA9IHhpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFgoKTtcblxuICAgICAgY29uc3QgeWkgPSB5c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBuZXh0WSA9ICgpID0+IHtcbiAgICAgICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgICAgICh7IGRvbmU6IHlEb25lLCB2YWx1ZTogeSB9ID0geWkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WSgpO1xuXG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgIGlmICh4RG9uZSAmJiB5RG9uZSkge1xuICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgdmFsdWUgPSBbbnVsbCwgMG4sIDBuXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHhEb25lKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIDFuXTtcbiAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh5RG9uZSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHZhbHVlID0gW3gsIDFuLCAwbl07XG4gICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21wID0gZnVsbENvbXBhcmUoeCwgeSk7XG4gICAgICAgICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMW5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMG5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgY29tcCA+IDAgfHwgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt5LCAwbiwgMW5dO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZSwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07XG5oYXJkZW4obWVyZ2UpO1xuXG5jb25zdCBpdGVySXNTdXBlcnNldCA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgX3ljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPT09IDBuKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGl0ZXJJc0Rpc2pvaW50ID0geHlpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDFuICYmIHljID49IDFuKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGl0ZXJDb21wYXJlID0geHlpID0+IHtcbiAgbGV0IGxvbmVZID0gZmFsc2U7XG4gIGxldCBsb25lWCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPT09IDBuKSB7XG4gICAgICAvL1xuICAgICAgbG9uZVkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoeWMgPT09IDBuKSB7XG4gICAgICAvL1xuICAgICAgbG9uZVggPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobG9uZVggJiYgbG9uZVkpIHtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICB9XG4gIGlmIChsb25lWCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2UgaWYgKGxvbmVZKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2Uge1xuICAgICghbG9uZVggJiYgIWxvbmVZKSB8fFxuICAgICAgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCwgbG9uZVldKX1gO1xuICAgIHJldHVybiAwO1xuICB9XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVyVW5pb24gPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMG4pIHtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB5YyA+PSAwbiB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVyRGlzam9pbnRVbmlvbiA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIHhjID09PSAwbiB8fCB5YyA9PT0gMG4gfHwgRmFpbGBTZXRzIG11c3Qgbm90IGhhdmUgY29tbW9uIGVsZW1lbnRzOiAke219YDtcbiAgICBpZiAoeGMgPj0gMW4pIHtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB5YyA+PSAxbiB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXRlckludGVyc2VjdGlvbiA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA+PSAxbiAmJiB5YyA+PSAxbikge1xuICAgICAgLy9cbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50U3VidHJhY3QgPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICB4YyA+PSAxbiB8fCBGYWlsYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuICAgIGlmICh5YyA9PT0gMG4pIHtcbiAgICAgIC8vXG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IG1lcmdlaWZ5ID0gaXRlck9wID0+ICh4ZWxlbWVudHMsIHllbGVtZW50cykgPT5cbiAgaXRlck9wKG1lcmdlKHhlbGVtZW50cywgeWVsZW1lbnRzKSk7XG5cbiAgICAgICBjb25zdCBlbGVtZW50c0lzU3VwZXJzZXQgPSBtZXJnZWlmeShpdGVySXNTdXBlcnNldCk7JGjNj19vbmNlLmVsZW1lbnRzSXNTdXBlcnNldChlbGVtZW50c0lzU3VwZXJzZXQpO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzSXNEaXNqb2ludCA9IG1lcmdlaWZ5KGl0ZXJJc0Rpc2pvaW50KTskaM2PX29uY2UuZWxlbWVudHNJc0Rpc2pvaW50KGVsZW1lbnRzSXNEaXNqb2ludCk7XG4gICAgICAgY29uc3QgZWxlbWVudHNDb21wYXJlID0gbWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRozY9fb25jZS5lbGVtZW50c0NvbXBhcmUoZWxlbWVudHNDb21wYXJlKTtcbiAgICAgICBjb25zdCBlbGVtZW50c1VuaW9uID0gbWVyZ2VpZnkoaXRlclVuaW9uKTskaM2PX29uY2UuZWxlbWVudHNVbmlvbihlbGVtZW50c1VuaW9uKTtcbiAgICAgICBjb25zdCBlbGVtZW50c0Rpc2pvaW50VW5pb24gPSBtZXJnZWlmeShpdGVyRGlzam9pbnRVbmlvbik7JGjNj19vbmNlLmVsZW1lbnRzRGlzam9pbnRVbmlvbihlbGVtZW50c0Rpc2pvaW50VW5pb24pO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzSW50ZXJzZWN0aW9uID0gbWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjNj19vbmNlLmVsZW1lbnRzSW50ZXJzZWN0aW9uKGVsZW1lbnRzSW50ZXJzZWN0aW9uKTtcbiAgICAgICBjb25zdCBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QgPSBtZXJnZWlmeShpdGVyRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdTZXRpZnkgPSBlbGVtZW50c09wID0+ICh4c2V0LCB5c2V0KSA9PlxuICBlbGVtZW50c09wKHhzZXQucGF5bG9hZCwgeXNldC5wYXlsb2FkKTtcblxuY29uc3Qgc2V0aWZ5ID0gZWxlbWVudHNPcCA9PiAoeHNldCwgeXNldCkgPT5cbiAgbWFrZVNldE9mRWxlbWVudHMoZWxlbWVudHNPcCh4c2V0LnBheWxvYWQsIHlzZXQucGF5bG9hZCkpO1xuXG4gICAgICAgY29uc3Qgc2V0SXNTdXBlcnNldCA9IHJhd1NldGlmeShlbGVtZW50c0lzU3VwZXJzZXQpOyRozY9fb25jZS5zZXRJc1N1cGVyc2V0KHNldElzU3VwZXJzZXQpO1xuICAgICAgIGNvbnN0IHNldElzRGlzam9pbnQgPSByYXdTZXRpZnkoZWxlbWVudHNJc0Rpc2pvaW50KTskaM2PX29uY2Uuc2V0SXNEaXNqb2ludChzZXRJc0Rpc2pvaW50KTtcbiAgICAgICBjb25zdCBzZXRVbmlvbiA9IHNldGlmeShlbGVtZW50c1VuaW9uKTskaM2PX29uY2Uuc2V0VW5pb24oc2V0VW5pb24pO1xuICAgICAgIGNvbnN0IHNldERpc2pvaW50VW5pb24gPSBzZXRpZnkoZWxlbWVudHNEaXNqb2ludFVuaW9uKTskaM2PX29uY2Uuc2V0RGlzam9pbnRVbmlvbihzZXREaXNqb2ludFVuaW9uKTtcbiAgICAgICBjb25zdCBzZXRJbnRlcnNlY3Rpb24gPSBzZXRpZnkoZWxlbWVudHNJbnRlcnNlY3Rpb24pOyRozY9fb25jZS5zZXRJbnRlcnNlY3Rpb24oc2V0SW50ZXJzZWN0aW9uKTtcbiAgICAgICBjb25zdCBzZXREaXNqb2ludFN1YnRyYWN0ID0gc2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLnNldERpc2pvaW50U3VidHJhY3Qoc2V0RGlzam9pbnRTdWJ0cmFjdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJlbGVtZW50c0lzU3VwZXJzZXQiOlsiZWxlbWVudHNJc1N1cGVyc2V0Il0sImVsZW1lbnRzSXNEaXNqb2ludCI6WyJlbGVtZW50c0lzRGlzam9pbnQiXSwiZWxlbWVudHNDb21wYXJlIjpbImVsZW1lbnRzQ29tcGFyZSJdLCJlbGVtZW50c1VuaW9uIjpbImVsZW1lbnRzVW5pb24iXSwiZWxlbWVudHNEaXNqb2ludFVuaW9uIjpbImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLCJlbGVtZW50c0ludGVyc2VjdGlvbiI6WyJlbGVtZW50c0ludGVyc2VjdGlvbiJdLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiOlsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sInNldElzU3VwZXJzZXQiOlsic2V0SXNTdXBlcnNldCJdLCJzZXRJc0Rpc2pvaW50IjpbInNldElzRGlzam9pbnQiXSwic2V0VW5pb24iOlsic2V0VW5pb24iXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIl0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMKOGL8uGwAALhsAADYAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCIuL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4uL2tleXMvY2hlY2tLZXkuanMiXSwiZXhwb3J0cyI6WyJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZU1ldGhvZEtleXMiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsQXJnR3VhcmRMaXN0U2hhcGUsQXdhaXRBcmdHdWFyZFNoYXBlLEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlLEludGVyZmFjZUd1YXJkU2hhcGUsTSxNZXRob2RHdWFyZFBheWxvYWRTaGFwZSxNZXRob2RHdWFyZFNoYXBlLFJhd0d1YXJkU2hhcGUsU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsU3luY1ZhbHVlR3VhcmRTaGFwZSxhc3NlcnRBd2FpdEFyZ0d1YXJkLG1hdGNoZXMsbXVzdE1hdGNoLGdldENvcHlNYXBLZXlzLG1ha2VDb3B5TWFwOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJBcmdHdWFyZExpc3RTaGFwZVwiLFskaM2PX2EgPT4gKEFyZ0d1YXJkTGlzdFNoYXBlID0gJGjNj19hKV1dLFtcIkF3YWl0QXJnR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKEF3YWl0QXJnR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZVwiLFskaM2PX2EgPT4gKEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gJGjNj19hKV1dLFtcIkludGVyZmFjZUd1YXJkU2hhcGVcIixbJGjNj19hID0+IChJbnRlcmZhY2VHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlXCIsWyRozY9fYSA9PiAoTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSAkaM2PX2EpXV0sW1wiTWV0aG9kR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKE1ldGhvZEd1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiUmF3R3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKFJhd0d1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGVcIixbJGjNj19hID0+IChTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSA9ICRozY9fYSldXSxbXCJTeW5jVmFsdWVHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoU3luY1ZhbHVlR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJhc3NlcnRBd2FpdEFyZ0d1YXJkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QXdhaXRBcmdHdWFyZCA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJnZXRDb3B5TWFwS2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBLZXlzID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSA9IGhhcmRlbih7XG4gIGtsYXNzOiAnYXdhaXRBcmcnLFxuICBhcmdHdWFyZDogTS5wYXR0ZXJuKCksXG59KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkID0gYXdhaXRBcmdHdWFyZCA9PiB7XG4gIGlmIChtYXRjaGVzKGF3YWl0QXJnR3VhcmQsIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSkpIHtcbiAgICAvL1xuICAgIGNvbnN0IHsga2xhc3M6IF8sIC4uLnBheWxvYWQgfSA9IGF3YWl0QXJnR3VhcmQ7XG4gICAgLy9cbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuICBhc3NlcnRBd2FpdEFyZ0d1YXJkKGF3YWl0QXJnR3VhcmQpO1xuICByZXR1cm4gYXdhaXRBcmdHdWFyZC5wYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKTtcblxuLy9cbi8vXG4vL1xuY29uc3QgTGVnYWN5U3luY01ldGhvZEd1YXJkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAga2xhc3M6ICdtZXRob2RHdWFyZCcsXG4gICAgY2FsbEtpbmQ6ICdzeW5jJyxcbiAgICBhcmdHdWFyZHM6IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFxuICAgIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuICB7XG4gICAgb3B0aW9uYWxBcmdHdWFyZHM6IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFxuICAgIHJlc3RBcmdHdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbik7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeUFyZ0d1YXJkU2hhcGUgPSBNLm9yKFxuICBSYXdHdWFyZFNoYXBlLFxuICBBd2FpdEFyZ0d1YXJkU2hhcGUsXG4gIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSxcbiAgTS5wYXR0ZXJuKCksXG4pO1xuLy9cbi8vXG4vL1xuY29uc3QgTGVnYWN5QXJnR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoTGVnYWN5QXJnR3VhcmRTaGFwZSk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeUFzeW5jTWV0aG9kR3VhcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBrbGFzczogJ21ldGhvZEd1YXJkJyxcbiAgICBjYWxsS2luZDogJ2FzeW5jJyxcbiAgICBhcmdHdWFyZHM6IExlZ2FjeUFyZ0d1YXJkTGlzdFNoYXBlLFxuICAgIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuICB7XG4gICAgb3B0aW9uYWxBcmdHdWFyZHM6IEFyZ0d1YXJkTGlzdFNoYXBlLFxuICAgIHJlc3RBcmdHdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbik7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUgPSBNLm9yKFxuICBMZWdhY3lTeW5jTWV0aG9kR3VhcmRTaGFwZSxcbiAgTGVnYWN5QXN5bmNNZXRob2RHdWFyZFNoYXBlLFxuKTtcblxuY29uc3QgYWRhcHRMZWdhY3lBcmdHdWFyZCA9IGFyZ0d1YXJkID0+XG4gIG1hdGNoZXMoYXJnR3VhcmQsIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSlcbiAgICA/IE0uYXdhaXQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoYXJnR3VhcmQpLmFyZ0d1YXJkKVxuICAgIDogYXJnR3VhcmQ7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0TWV0aG9kR3VhcmRQYXlsb2FkID0gbWV0aG9kR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhtZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRTaGFwZSkpIHtcbiAgICByZXR1cm4gbWV0aG9kR3VhcmQucGF5bG9hZDtcbiAgfVxuICBtdXN0TWF0Y2gobWV0aG9kR3VhcmQsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUsICdsZWdhY3lNZXRob2RHdWFyZCcpO1xuICBjb25zdCB7XG4gICAgLy9cbiAgICBrbGFzczogXyxcbiAgICAvL1xuICAgIGNhbGxLaW5kLFxuICAgIC8vXG4gICAgcmV0dXJuR3VhcmQsXG4gICAgLy9cbiAgICByZXN0QXJnR3VhcmQsXG4gIH0gPSBtZXRob2RHdWFyZDtcbiAgbGV0IHtcbiAgICAvL1xuICAgIGFyZ0d1YXJkcyxcbiAgICAvL1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICB9ID0gbWV0aG9kR3VhcmQ7XG4gIGlmIChjYWxsS2luZCA9PT0gJ2FzeW5jJykge1xuICAgIGFyZ0d1YXJkcyA9IGFyZ0d1YXJkcy5tYXAoYWRhcHRMZWdhY3lBcmdHdWFyZCk7XG4gICAgb3B0aW9uYWxBcmdHdWFyZHMgPVxuICAgICAgb3B0aW9uYWxBcmdHdWFyZHMgJiYgb3B0aW9uYWxBcmdHdWFyZHMubWFwKGFkYXB0TGVnYWN5QXJnR3VhcmQpO1xuICB9XG4gIGNvbnN0IHBheWxvYWQgPSBoYXJkZW4oe1xuICAgIGNhbGxLaW5kLFxuICAgIGFyZ0d1YXJkcyxcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyxcbiAgICByZXN0QXJnR3VhcmQsXG4gICAgcmV0dXJuR3VhcmQsXG4gIH0pO1xuICAvL1xuICBtdXN0TWF0Y2gocGF5bG9hZCwgTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsICdpbnRlcm5hbE1ldGhvZEd1YXJkQWRhcHRvcicpO1xuICByZXR1cm4gcGF5bG9hZDtcbn07JGjNj19vbmNlLmdldE1ldGhvZEd1YXJkUGF5bG9hZChnZXRNZXRob2RHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldE1ldGhvZEd1YXJkUGF5bG9hZCk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAga2xhc3M6ICdJbnRlcmZhY2UnLFxuICAgIGludGVyZmFjZU5hbWU6IE0uc3RyaW5nKCksXG4gICAgbWV0aG9kR3VhcmRzOiBNLnJlY29yZE9mKFxuICAgICAgTS5zdHJpbmcoKSxcbiAgICAgIE0ub3IoTWV0aG9kR3VhcmRTaGFwZSwgTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSksXG4gICAgKSxcbiAgfSxcbiAge1xuICAgIGRlZmF1bHRHdWFyZHM6IE0ub3IoTS51bmRlZmluZWQoKSwgJ3Bhc3NhYmxlJywgJ3JhdycpLFxuICAgIHNsb3BweTogTS5ib29sZWFuKCksXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgc3ltYm9sTWV0aG9kR3VhcmRzOiBNLm1hcE9mKE0uc3ltYm9sKCksIE1ldGhvZEd1YXJkU2hhcGUpLFxuICB9LFxuKTtcblxuY29uc3QgYWRhcHRNZXRob2RHdWFyZCA9IG1ldGhvZEd1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMobWV0aG9kR3VhcmQsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUpKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2FsbEtpbmQsXG4gICAgICBhcmdHdWFyZHMsXG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgICAgcmVzdEFyZ0d1YXJkID0gTS5hbnkoKSxcbiAgICAgIHJldHVybkd1YXJkLFxuICAgIH0gPSBnZXRNZXRob2RHdWFyZFBheWxvYWQobWV0aG9kR3VhcmQpO1xuICAgIGNvbnN0IG1DYWxsID0gY2FsbEtpbmQgPT09ICdzeW5jJyA/IE0uY2FsbCA6IE0uY2FsbFdoZW47XG4gICAgcmV0dXJuIG1DYWxsKC4uLmFyZ0d1YXJkcylcbiAgICAgIC5vcHRpb25hbCguLi5vcHRpb25hbEFyZ0d1YXJkcylcbiAgICAgIC5yZXN0KHJlc3RBcmdHdWFyZClcbiAgICAgIC5yZXR1cm5zKHJldHVybkd1YXJkKTtcbiAgfVxuICByZXR1cm4gbWV0aG9kR3VhcmQ7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gaW50ZXJmYWNlR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhpbnRlcmZhY2VHdWFyZCwgSW50ZXJmYWNlR3VhcmRTaGFwZSkpIHtcbiAgICByZXR1cm4gaW50ZXJmYWNlR3VhcmQucGF5bG9hZDtcbiAgfVxuICBtdXN0TWF0Y2goaW50ZXJmYWNlR3VhcmQsIExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGUsICdsZWdhY3lJbnRlcmZhY2VHdWFyZCcpO1xuICAvL1xuICAvL1xuICBsZXQgeyBrbGFzczogXywgaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCAuLi5yZXN0IH0gPSBpbnRlcmZhY2VHdWFyZDtcbiAgbWV0aG9kR3VhcmRzID0gb2JqZWN0TWFwKG1ldGhvZEd1YXJkcywgYWRhcHRNZXRob2RHdWFyZCk7XG4gIGNvbnN0IHBheWxvYWQgPSBoYXJkZW4oe1xuICAgIGludGVyZmFjZU5hbWUsXG4gICAgbWV0aG9kR3VhcmRzLFxuICAgIC4uLnJlc3QsXG4gIH0pO1xuICBtdXN0TWF0Y2goXG4gICAgcGF5bG9hZCxcbiAgICBJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSxcbiAgICAnaW50ZXJuYWxJbnRlcmZhY2VHdWFyZEFkYXB0b3InLFxuICApO1xuICByZXR1cm4gcGF5bG9hZDtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZUd1YXJkUGF5bG9hZChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCk7XG5cbmNvbnN0IGVtcHR5Q29weU1hcCA9IG1ha2VDb3B5TWFwKFtdKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRJbnRlcmZhY2VNZXRob2RLZXlzID0gaW50ZXJmYWNlR3VhcmQgPT4ge1xuICBjb25zdCB7IG1ldGhvZEd1YXJkcywgc3ltYm9sTWV0aG9kR3VhcmRzID0gZW1wdHlDb3B5TWFwIH0gPVxuICAgIGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChpbnRlcmZhY2VHdWFyZCk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgLy9cbiAgLy9cbiAgcmV0dXJuIGhhcmRlbihbXG4gICAgLi4uUmVmbGVjdC5vd25LZXlzKG1ldGhvZEd1YXJkcyksXG4gICAgLi4uZ2V0Q29weU1hcEtleXMoc3ltYm9sTWV0aG9kR3VhcmRzKSxcbiAgXSk7XG59OyRozY9fb25jZS5nZXRJbnRlcmZhY2VNZXRob2RLZXlzKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xuaGFyZGVuKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiOlsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIjpbImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiOlsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sImdldEludGVyZmFjZU1ldGhvZEtleXMiOlsiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAlnn3NYPEAAGDxAAA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiLCJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiLCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyIsIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIi4uL2tleXMvY29tcGFyZUtleXMuanMiLCIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4va2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyJdLCJleHBvcnRzIjpbIkFyZ0d1YXJkTGlzdFNoYXBlIiwiQXdhaXRBcmdHdWFyZFNoYXBlIiwiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUiLCJJbnRlcmZhY2VHdWFyZFNoYXBlIiwiTSIsIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlIiwiTWV0aG9kR3VhcmRTaGFwZSIsIlJhd0d1YXJkU2hhcGUiLCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSIsIlN5bmNWYWx1ZUd1YXJkU2hhcGUiLCJhc3NlcnRBd2FpdEFyZ0d1YXJkIiwiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiLCJhc3NlcnRNZXRob2RHdWFyZCIsImFzc2VydFBhdHRlcm4iLCJhc3NlcnRSYXdHdWFyZCIsImNoZWNrTWF0Y2hlcyIsImNvbnRhaW5lckhhc1NwbGl0IiwiZGVmYXVsdExpbWl0cyIsImdldFJhbmtDb3ZlciIsImlzQXdhaXRBcmdHdWFyZCIsImlzUGF0dGVybiIsImlzUmF3R3VhcmQiLCJraW5kT2YiLCJtYXRjaGVzIiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxiLFgsRmFpbCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixpZGVudENoZWNrZXIsYXBwbHlMYWJlbGluZ0Vycm9yLGZyb21VbmlxdWVFbnRyaWVzLGxpc3REaWZmZXJlbmNlLGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxjb21wYXJlUmFuayxnZXRQYXNzU3R5bGVDb3ZlcixpbnRlcnNlY3RSYW5rQ292ZXJzLHVuaW9uUmFua0NvdmVycyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMscXAsa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZyxnZXRDb3B5TWFwRW50cnlBcnJheSxtYWtlQ29weU1hcCxtYWtlQ29weVNldCxtYWtlQ29weUJhZyxnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYlwiLFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qc1wiLCBbW1wiYXBwbHlMYWJlbGluZ0Vycm9yXCIsWyRozY9fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanNcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzXCIsIFtbXCJsaXN0RGlmZmVyZW5jZVwiLFskaM2PX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV0sW1wiZ2V0UGFzc1N0eWxlQ292ZXJcIixbJGjNj19hID0+IChnZXRQYXNzU3R5bGVDb3ZlciA9ICRozY9fYSldXSxbXCJpbnRlcnNlY3RSYW5rQ292ZXJzXCIsWyRozY9fYSA9PiAoaW50ZXJzZWN0UmFua0NvdmVycyA9ICRozY9fYSldXSxbXCJ1bmlvblJhbmtDb3ZlcnNcIixbJGjNj19hID0+ICh1bmlvblJhbmtDb3ZlcnMgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV0sW1wicXBcIixbJGjNj19hID0+IChxcCA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMvY29tcGFyZUtleXMuanNcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wia2V5R1RcIixbJGjNj19hID0+IChrZXlHVCA9ICRozY9fYSldXSxbXCJrZXlHVEVcIixbJGjNj19hID0+IChrZXlHVEUgPSAkaM2PX2EpXV0sW1wia2V5TFRcIixbJGjNj19hID0+IChrZXlMVCA9ICRozY9fYSldXSxbXCJrZXlMVEVcIixbJGjNj19hID0+IChrZXlMVEUgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiY2hlY2tLZXlcIixbJGjNj19hID0+IChjaGVja0tleSA9ICRozY9fYSldXSxbXCJpc0tleVwiLFskaM2PX2EgPT4gKGlzS2V5ID0gJGjNj19hKV1dLFtcImNoZWNrU2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoY2hlY2tTY2FsYXJLZXkgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5U2V0XCIsWyRozY9fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjNj19hKV1dLFtcImNoZWNrQ29weU1hcFwiLFskaM2PX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRozY9fYSldXSxbXCJjb3B5TWFwS2V5U2V0XCIsWyRozY9fYSA9PiAoY29weU1hcEtleVNldCA9ICRozY9fYSldXSxbXCJjaGVja0NvcHlCYWdcIixbJGjNj19hID0+IChjaGVja0NvcHlCYWcgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJ5QXJyYXlcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cnlBcnJheSA9ICRozY9fYSldXSxbXCJtYWtlQ29weU1hcFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlCYWdcIixbJGjNj19hID0+IChtYWtlQ29weUJhZyA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNcIiwgW1tcImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgeyBlbnRyaWVzLCB2YWx1ZXMsIGhhc093biB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwYXR0ZXJuTWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8vXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IE1NO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGRlZmF1bHRMaW1pdHMgPSBoYXJkZW4oe1xuICBkZWNpbWFsRGlnaXRzTGltaXQ6IDEwMCxcbiAgc3RyaW5nTGVuZ3RoTGltaXQ6IDEwMF8wMDAsXG4gIHN5bWJvbE5hbWVMZW5ndGhMaW1pdDogMTAwLFxuICBudW1Qcm9wZXJ0aWVzTGltaXQ6IDgwLFxuICBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdDogMTAwLFxuICBhcnJheUxlbmd0aExpbWl0OiAxMF8wMDAsXG4gIGJ5dGVMZW5ndGhMaW1pdDogMTAwXzAwMCxcbiAgbnVtU2V0RWxlbWVudHNMaW1pdDogMTBfMDAwLFxuICBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0OiAxMF8wMDAsXG4gIG51bU1hcEVudHJpZXNMaW1pdDogNTAwMCxcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlZmF1bHRMaW1pdHMoZGVmYXVsdExpbWl0cyk7XG5jb25zdCBsaW1pdCA9IChsaW1pdHMgPSB7fSkgPT5cbiAgLyogICAgICAgICAgICAgICAgICAgICovIChoYXJkZW4oeyBfX3Byb3RvX186IGRlZmF1bHRMaW1pdHMsIC4uLmxpbWl0cyB9KSk7XG5cbmNvbnN0IGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0ID0gKFxuICBwYXlsb2FkLFxuICBtYWluUGF5bG9hZFNoYXBlLFxuICBjaGVjayxcbiAgbGFiZWwsXG4pID0+IHtcbiAgYXNzZXJ0KEFycmF5LmlzQXJyYXkobWFpblBheWxvYWRTaGFwZSkpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHtcbiAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgJHtxKGxhYmVsKX0gcGF5bG9hZCBtdXN0IGJlIGFuIGFycmF5OiAke3BheWxvYWR9YCk7XG4gIH1cblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuXG4gIGNvbnN0IG1haW5MZW5ndGggPSBtYWluUGF5bG9hZFNoYXBlLmxlbmd0aDtcbiAgaWYgKCEocGF5bG9hZC5sZW5ndGggPT09IG1haW5MZW5ndGggfHwgcGF5bG9hZC5sZW5ndGggPT09IG1haW5MZW5ndGggKyAxKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuICB9XG4gIGNvbnN0IGxpbWl0cyA9IHBheWxvYWRbbWFpbkxlbmd0aF07XG4gIHBheWxvYWQgPSBoYXJkZW4ocGF5bG9hZC5zbGljZSgwLCBtYWluTGVuZ3RoKSk7XG4gIC8vXG4gIGlmICghY2hlY2tNYXRjaGVzKHBheWxvYWQsIG1haW5QYXlsb2FkU2hhcGUsIGNoZWNrLCBsYWJlbCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGxpbWl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIChcbiAgICAocGFzc1N0eWxlT2YobGltaXRzKSA9PT0gJ2NvcHlSZWNvcmQnIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpICYmXG4gICAgZW50cmllcyhsaW1pdHMpLmV2ZXJ5KFxuICAgICAgKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgcGFzc1N0eWxlT2YodmFsdWUpID09PSAnbnVtYmVyJyB8fFxuICAgICAgICBjaGVjayhmYWxzZSwgWGBWYWx1ZSBvZiBsaW1pdCAke3Eoa2V5KX0gYnV0IGJlIGEgbnVtYmVyOiAke3EodmFsdWUpfWApLFxuICAgIClcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0ID0gKHNwZWNpbWVuLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrKSA9PiB7XG4gIGlmIChcbiAgICBNYXRoLmZsb29yKE1hdGgubG9nMTAoTWF0aC5hYnMoTnVtYmVyKHNwZWNpbWVuKSkpKSArIDEgPD1cbiAgICBkZWNpbWFsRGlnaXRzTGltaXRcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoZWNrKFxuICAgIGZhbHNlLFxuICAgIFhgYmlnaW50ICR7c3BlY2ltZW59IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7ZGVjaW1hbERpZ2l0c0xpbWl0fSBkaWdpdHNgLFxuICApO1xufTtcblxuLypcblxuICovXG5jb25zdCBtYWtlUGF0dGVybktpdCA9ICgpID0+IHtcbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYXliZU1hdGNoSGVscGVyID0gdGFnID0+XG4gICAgLy9cbiAgICBIZWxwZXJzQnlNYXRjaFRhZ1t0YWddO1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYXliZVBheWxvYWRTaGFwZSA9IHRhZyA9PlxuICAgIC8vXG4gICAgR3VhcmRQYXlsb2FkU2hhcGVzW3RhZ107XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHNpbmdsZXRvbktpbmRzID0gbmV3IE1hcChbXG4gICAgWydudWxsJywgbnVsbF0sXG4gICAgWyd1bmRlZmluZWQnLCB1bmRlZmluZWRdLFxuICBdKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgdGFnTWVtbyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tUYWdnZWQgPSAodGFnZ2VkLCB0YWcsIGNoZWNrKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hIZWxwZXIgPSBtYXliZU1hdGNoSGVscGVyKHRhZyk7XG4gICAgaWYgKG1hdGNoSGVscGVyKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBtYXRjaEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCh0YWdnZWQucGF5bG9hZCwgY2hlY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYXlsb2FkU2hhcGUgPSBtYXliZVBheWxvYWRTaGFwZSh0YWcpO1xuICAgICAgaWYgKHBheWxvYWRTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBjaGVja01hdGNoZXModGFnZ2VkLnBheWxvYWQsIHBheWxvYWRTaGFwZSwgY2hlY2ssIHRhZyk7XG4gICAgICB9XG4gICAgfVxuICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICByZXR1cm4gY2hlY2tDb3B5U2V0KHRhZ2dlZCwgY2hlY2spO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29weUJhZyh0YWdnZWQsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgIHJldHVybiBjaGVja0NvcHlNYXAodGFnZ2VkLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfTogJHt0YWdnZWR9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3Qga2luZE9mID0gKHNwZWNpbWVuLCBjaGVjayA9IGlkZW50Q2hlY2tlcikgPT4ge1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbiAgICBpZiAocGFzc1N0eWxlICE9PSAndGFnZ2VkJykge1xuICAgICAgcmV0dXJuIHBhc3NTdHlsZTtcbiAgICB9XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKHRhZ01lbW8uaGFzKHNwZWNpbWVuKSkge1xuICAgICAgcmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiAgICB9XG4gICAgY29uc3QgdGFnID0gZ2V0VGFnKHNwZWNpbWVuKTtcbiAgICBpZiAoY2hlY2tUYWdnZWQoc3BlY2ltZW4sIHRhZywgY2hlY2spKSB7XG4gICAgICB0YWdNZW1vLnNldChzcGVjaW1lbiwgdGFnKTtcbiAgICAgIHJldHVybiB0YWc7XG4gICAgfVxuICAgIGlmIChjaGVjayAhPT0gaWRlbnRDaGVja2VyKSB7XG4gICAgICBjaGVjayhmYWxzZSwgWGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcbiAgaGFyZGVuKGtpbmRPZik7XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tLaW5kID0gKHNwZWNpbWVuLCBraW5kLCBjaGVjaykgPT4ge1xuICAgIC8vXG4gICAgaWYgKHNpbmdsZXRvbktpbmRzLmhhcyhraW5kKSkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgc2luZ2xldG9uS2luZHMuZ2V0KGtpbmQpLCBjaGVjayk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVhbEtpbmQgPSBraW5kT2Yoc3BlY2ltZW4sIGNoZWNrKTtcbiAgICBpZiAoa2luZCA9PT0gcmVhbEtpbmQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoY2hlY2sgIT09IGlkZW50Q2hlY2tlcikge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjaGVjayhmYWxzZSwgWGAke2IocmVhbEtpbmQpfSAke3NwZWNpbWVufSAtIE11c3QgYmUgYSAke2Ioa2luZCl9YCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgaXNLaW5kID0gKHNwZWNpbWVuLCBraW5kKSA9PiBjaGVja0tpbmQoc3BlY2ltZW4sIGtpbmQsIGlkZW50Q2hlY2tlcik7XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgaXNVbmRlZmluZWRQYXR0ID0gcGF0dCA9PlxuICAgIHBhdHQgPT09IHVuZGVmaW5lZCB8fFxuICAgIChpc0tpbmQocGF0dCwgJ21hdGNoOmtpbmQnKSAmJiBwYXR0LnBheWxvYWQgPT09ICd1bmRlZmluZWQnKTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjaGVja0FzS2V5UGF0dCA9IChzcGVjaW1lbiwga2V5QXNQYXR0ZXJuLCBjaGVjaykgPT4ge1xuICAgIGlmIChpc0tleShzcGVjaW1lbikgJiYga2V5RVEoc3BlY2ltZW4sIGtleUFzUGF0dGVybikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgY2hlY2sgIT09IGlkZW50Q2hlY2tlciAmJlxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmU6ICR7a2V5QXNQYXR0ZXJufWApXG4gICAgKTtcbiAgfTtcblxuICAvL1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjaGVja1BhdHRlcm4gPSAocGF0dCwgY2hlY2spID0+IHtcbiAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vXG4gICAgY29uc3QgcmVzdWx0ID0gY2hlY2tQYXR0ZXJuSW50ZXJuYWwocGF0dCwgY2hlY2spO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbCA9IChwYXR0LCBjaGVjaykgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGNoZWNrSXQgPSBjaGlsZCA9PiBjaGVja1BhdHRlcm4oY2hpbGQsIGNoZWNrKTtcblxuICAgIGNvbnN0IGtpbmQgPSBraW5kT2YocGF0dCwgY2hlY2spO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6IHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHZhbHVlcyhwYXR0KS5ldmVyeShjaGVja0l0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHBhdHQuZXZlcnkoY2hlY2tJdCk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gY2hlY2tQYXR0ZXJuKHBhdHQudmFsdWVzLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IGlzUGF0dGVybiA9IHBhdHQgPT4gY2hlY2tQYXR0ZXJuKHBhdHQsIGlkZW50Q2hlY2tlcik7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXNzZXJ0UGF0dGVybiA9IHBhdHQgPT4ge1xuICAgIGNoZWNrUGF0dGVybihwYXR0LCBhc3NlcnRDaGVja2VyKTtcbiAgfTtcblxuICAvL1xuXG4gIC8qXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tNYXRjaGVzID0gKHNwZWNpbWVuLCBwYXR0ZXJuLCBjaGVjaywgbGFiZWwgPSB1bmRlZmluZWQpID0+XG4gICAgLy9cbiAgICBhcHBseUxhYmVsaW5nRXJyb3IoY2hlY2tNYXRjaGVzSW50ZXJuYWwsIFtzcGVjaW1lbiwgcGF0dGVybiwgY2hlY2tdLCBsYWJlbCk7XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tNYXRjaGVzSW50ZXJuYWwgPSAoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgLy9cbiAgICBjb25zdCBwYXR0ZXJuS2luZCA9IGtpbmRPZihwYXR0LCBjaGVjayk7XG4gICAgY29uc3Qgc3BlY2ltZW5LaW5kID0ga2luZE9mKHNwZWNpbWVuKTsgLy9cbiAgICBzd2l0Y2ggKHBhdHRlcm5LaW5kKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICByZXR1cm4gRmFpbGBwYXR0ZXJuIGV4cGVjdGVkOiAke3BhdHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIHJldHVybiBGYWlsYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgcmV0dXJuIEZhaWxgZXJyb3JzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdiaWdpbnQnOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICBjYXNlICdieXRlQXJyYXknOlxuICAgICAgY2FzZSAnY29weVNldCc6XG4gICAgICBjYXNlICdjb3B5QmFnJzpcbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BlY2ltZW5LaW5kICE9PSAnY29weUFycmF5Jykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5QXJyYXkgdG8gbWF0Y2ggYSBjb3B5QXJyYXkgcGF0dGVybjogJHtxcChcbiAgICAgICAgICAgICAgcGF0dCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBwYXR0O1xuICAgICAgICBpZiAoc3BlY2ltZW4ubGVuZ3RoICE9PSBsZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgQXJyYXkgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGFzIGxvbmcgYXMgY29weUFycmF5IHBhdHRlcm46ICR7cXAoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0dC5ldmVyeSgocCwgaSkgPT4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuW2ldLCBwLCBjaGVjaywgaSkpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5UmVjb3JkJykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5UmVjb3JkIHRvIG1hdGNoIGEgY29weVJlY29yZCBwYXR0ZXJuOiAke3FwKFxuICAgICAgICAgICAgICBwYXR0LFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3Qgc3BlY2ltZW5OYW1lcyA9IHJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbiAgICAgICAgY29uc3QgcGF0dE5hbWVzID0gcmVjb3JkTmFtZXMocGF0dCk7XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSBsaXN0RGlmZmVyZW5jZShwYXR0TmFtZXMsIHNwZWNpbWVuTmFtZXMpO1xuICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bmV4cGVjdGVkID0gbGlzdERpZmZlcmVuY2Uoc3BlY2ltZW5OYW1lcywgcGF0dE5hbWVzKTtcbiAgICAgICAgaWYgKHVuZXhwZWN0ZWQubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IG5vdCBoYXZlIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKFxuICAgICAgICAgICAgICB1bmV4cGVjdGVkLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BlY2ltZW5WYWx1ZXMgPSByZWNvcmRWYWx1ZXMoc3BlY2ltZW4sIHNwZWNpbWVuTmFtZXMpO1xuICAgICAgICBjb25zdCBwYXR0VmFsdWVzID0gcmVjb3JkVmFsdWVzKHBhdHQsIHBhdHROYW1lcyk7XG4gICAgICAgIHJldHVybiBwYXR0TmFtZXMuZXZlcnkoKGxhYmVsLCBpKSA9PlxuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlc1tpXSwgcGF0dFZhbHVlc1tpXSwgY2hlY2ssIGxhYmVsKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BlY2ltZW5LaW5kICE9PSAnY29weU1hcCcpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtxcChcbiAgICAgICAgICAgICAgcGF0dCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHBhdHRLZXlTZXQgPSBjb3B5TWFwS2V5U2V0KHBhdHQpO1xuICAgICAgICBjb25zdCBzcGVjaW1lbktleVNldCA9IGNvcHlNYXBLZXlTZXQoc3BlY2ltZW4pO1xuICAgICAgICBpZiAoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCwgcGF0dEtleVNldCwgY2hlY2spKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHBhdHRWYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3Qgc3BlY2ltZW5WYWx1ZXMgPSBbXTtcbiAgICAgICAgY29uc3QgZW50cnlQYWlycyA9IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKFxuICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgc3BlY2ltZW4sXG4gICAgICAgICAgZ2V0Q29weU1hcEVudHJ5QXJyYXksXG4gICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IFtfa2V5LCBwYXR0VmFsdWUsIHNwZWNpbWVuVmFsdWVdIG9mIGVudHJ5UGFpcnMpIHtcbiAgICAgICAgICBwYXR0VmFsdWVzLnB1c2gocGF0dFZhbHVlKTtcbiAgICAgICAgICBzcGVjaW1lblZhbHVlcy5wdXNoKHNwZWNpbWVuVmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGVja01hdGNoZXMoaGFyZGVuKHNwZWNpbWVuVmFsdWVzKSwgaGFyZGVuKHBhdHRWYWx1ZXMpLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IG1hdGNoSGVscGVyID0gbWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG4gICAgICAgIGlmIChtYXRjaEhlbHBlcikge1xuICAgICAgICAgIHJldHVybiBtYXRjaEhlbHBlci5jaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQucGF5bG9hZCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IG1hdGNoZXMgPSAoc3BlY2ltZW4sIHBhdHQpID0+XG4gICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBpZGVudENoZWNrZXIpO1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtdXN0TWF0Y2ggPSAoc3BlY2ltZW4sIHBhdHQsIGxhYmVsID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgbGV0IGlubmVyRXJyb3I7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGlkZW50Q2hlY2tlciwgdW5kZWZpbmVkKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgIGlubmVyRXJyb3IgPSBlcjtcbiAgICB9XG4gICAgLy9cbiAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGFzc2VydENoZWNrZXIsIGxhYmVsKTtcbiAgICBjb25zdCBvdXRlckVycm9yID0gbWFrZUVycm9yKFxuICAgICAgWGBpbnRlcm5hbDogJHtsYWJlbH06IGluY29uc2lzdGVudCBwYXR0ZXJuIG1hdGNoOiAke3FwKHBhdHQpfWAsXG4gICAgKTtcbiAgICBpZiAoaW5uZXJFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbm5vdGF0ZUVycm9yKG91dGVyRXJyb3IsIFhgY2F1c2VkIGJ5ICR7aW5uZXJFcnJvcn1gKTtcbiAgICB9XG4gICAgdGhyb3cgb3V0ZXJFcnJvcjtcbiAgfTtcblxuICAvL1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBnZXRSYW5rQ292ZXIgPSAocGF0dCwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVQYXNzYWJsZShwYXR0KTtcbiAgICAgIGlmIChlbmNvZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtlbmNvZGVkLCBgJHtlbmNvZGVkfX5gXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGF0dCk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHBhdHQpO1xuICAgICAgICBjb25zdCBtYXRjaEhlbHBlciA9IG1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbiAgICAgICAgaWYgKG1hdGNoSGVscGVyKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLCBlbmNvZGVQYXNzYWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYnJlYWs7IC8vXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAvL1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBicmVhazsgLy9cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuID0gKGFycmF5LCBwYXR0LCBjaGVjaywgbGFiZWxQcmVmaXggPSAnJykgPT4ge1xuICAgIGlmIChpc0tpbmQocGF0dCwgJ21hdGNoOmFueScpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhcnJheS5ldmVyeSgoZWwsIGkpID0+XG4gICAgICBjaGVja01hdGNoZXMoZWwsIHBhdHQsIGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSxcbiAgICApO1xuICB9O1xuXG4gIC8vXG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hBbnlIZWxwZXIgPSBGYXIoJ21hdGNoOmFueSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoX3NwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIF9jaGVjaykgPT4gdHJ1ZSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAobWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgbWF0Y2hlclBheWxvYWQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgbWF0Y2g6YW55IHBheWxvYWQ6ICR7bWF0Y2hlclBheWxvYWR9IC0gTXVzdCBiZSB1bmRlZmluZWRgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWycnLCAneyddLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaEFuZEhlbHBlciA9IEZhcignbWF0Y2g6YW5kIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcGF0dHMsIGNoZWNrKSA9PiB7XG4gICAgICByZXR1cm4gcGF0dHMuZXZlcnkocGF0dCA9PiBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZFBhdHRzLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgY2hlY2tJdCA9IHBhdHQgPT4gY2hlY2tQYXR0ZXJuKHBhdHQsIGNoZWNrKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpID09PSAnY29weUFycmF5JyB8fFxuICAgICAgICAgIGNoZWNrKGZhbHNlLCBYYE5lZWRzIGFycmF5IG9mIHN1Yi1wYXR0ZXJuczogJHtxcChhbGxlZ2VkUGF0dHMpfWApKSAmJlxuICAgICAgICBhbGxlZ2VkUGF0dHMuZXZlcnkoY2hlY2tJdClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGdldFJhbmtDb3ZlcjogKHBhdHRzLCBlbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGludGVyc2VjdFJhbmtDb3ZlcnMoXG4gICAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgICBwYXR0cy5tYXAocCA9PiBnZXRSYW5rQ292ZXIocCwgZW5jb2RlUGFzc2FibGUpKSxcbiAgICAgICksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoT3JIZWxwZXIgPSBGYXIoJ21hdGNoOm9yIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcGF0dHMsIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcGF0dHM7XG4gICAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gbm8gcGF0dGVybiBkaXNqdW5jdHMgdG8gbWF0Y2g6ICR7cXAocGF0dHMpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGJpbmFyeVVuZGVmUGF0dElkeCA9XG4gICAgICAgIHBhdHRzLmxlbmd0aCA9PT0gMlxuICAgICAgICAgID8gcGF0dHMuZmluZEluZGV4KHBhdHQgPT4gaXNVbmRlZmluZWRQYXR0KHBhdHQpKVxuICAgICAgICAgIDogLTE7XG4gICAgICBpZiAoYmluYXJ5VW5kZWZQYXR0SWR4ICE9PSAtMSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIHNwZWNpbWVuID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHRzWzEgLSBiaW5hcnlVbmRlZlBhdHRJZHhdLCBjaGVjaylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChwYXR0cy5zb21lKHBhdHQgPT4gbWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBtYXRjaCBvbmUgb2YgJHtxcChwYXR0cyl9YCk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBtYXRjaEFuZEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuICAgIGdldFJhbmtDb3ZlcjogKHBhdHRzLCBlbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIHVuaW9uUmFua0NvdmVycyhcbiAgICAgICAgY29tcGFyZVJhbmssXG4gICAgICAgIHBhdHRzLm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpLFxuICAgICAgKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hOb3RIZWxwZXIgPSBGYXIoJ21hdGNoOm5vdCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgICBpZiAobWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCkpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3FwKHBhdHQpfWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrUGF0dGVybixcblxuICAgIGdldFJhbmtDb3ZlcjogKF9wYXR0LCBfZW5jb2RlUGFzc2FibGUpID0+IFsnJywgJ3snXSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXIgPSBGYXIoJ21hdGNoOnNjYWxhciBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja1NjYWxhcktleShzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hLZXlIZWxwZXIgPSBGYXIoJ21hdGNoOmtleSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0tleShzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyID0gRmFyKCdtYXRjaDpwYXR0ZXJuIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgX21hdGNoZXJQYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrUGF0dGVybihzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hLaW5kSGVscGVyID0gRmFyKCdtYXRjaDpraW5kIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IGNoZWNrS2luZCxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZEtleUtpbmQsIGNoZWNrKSA9PlxuICAgICAgdHlwZW9mIGFsbGVnZWRLZXlLaW5kID09PSAnc3RyaW5nJyB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2AsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoa2luZCwgX2VuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgICBsZXQgc3R5bGU7XG4gICAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSAnY29weVNldCc6XG4gICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgc3R5bGUgPSAndGFnZ2VkJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgc3R5bGUgPSBraW5kO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIoc3R5bGUpO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoVGFnZ2VkSGVscGVyID0gRmFyKCdtYXRjaDp0YWdnZWQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbdGFnUGF0dCwgcGF5bG9hZFBhdHRdLCBjaGVjaykgPT4ge1xuICAgICAgaWYgKHBhc3NTdHlsZU9mKHNwZWNpbWVuKSAhPT0gJ3RhZ2dlZCcpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgRXhwZWN0ZWQgdGFnZ2VkIG9iamVjdCwgbm90ICR7cShcbiAgICAgICAgICAgIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSxcbiAgICAgICAgICApfTogJHtzcGVjaW1lbn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tNYXRjaGVzKGdldFRhZyhzcGVjaW1lbiksIHRhZ1BhdHQsIGNoZWNrLCAndGFnJykgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLnBheWxvYWQsIHBheWxvYWRQYXR0LCBjaGVjaywgJ3BheWxvYWQnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnRhZ2dlZCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfa2luZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoQmlnaW50SGVscGVyID0gRmFyKCdtYXRjaDpiaWdpbnQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnYmlnaW50JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmJpZ2ludCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoTmF0SGVscGVyID0gRmFyKCdtYXRjaDpuYXQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnYmlnaW50JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pID49IDBuLFxuICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIG5vbi1uZWdhdGl2ZWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2spXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6bmF0IHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIC8vXG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoU3RyaW5nSGVscGVyID0gRmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgc3RyaW5nTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnc3RyaW5nJywgY2hlY2spICYmXG4gICAgICAgICAgLy9cbiAgICAgICAgICAoLyogICAgICAgICAgICAgICAgICovIChzcGVjaW1lbikubGVuZ3RoIDw9IHN0cmluZ0xlbmd0aExpbWl0IHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgc3RyaW5nICR7c3BlY2ltZW59IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3RyaW5nTGVuZ3RoTGltaXR9YCxcbiAgICAgICAgICApKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnN0cmluZyBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3Zlcignc3RyaW5nJyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoU3ltYm9sSGVscGVyID0gRmFyKCdtYXRjaDpzeW1ib2wgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgc3ltYm9sTmFtZUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgaWYgKCFjaGVja0tpbmQoc3BlY2ltZW4sICdzeW1ib2wnLCBjaGVjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3ltYm9sTmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChzcGVjaW1lbik7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3ltYm9sTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUGFzc2FibGUgc3ltYm9sICR7c3BlY2ltZW59IG11c3QgaGF2ZSBhIHBhc3NhYmxlIG5hbWVgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBzeW1ib2xOYW1lLmxlbmd0aCA8PSBzeW1ib2xOYW1lTGVuZ3RoTGltaXQsXG4gICAgICAgIFhgU3ltYm9sIG5hbWUgJHtxKFxuICAgICAgICAgIHN5bWJvbE5hbWUsXG4gICAgICAgICl9IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3ltYm9sTmFtZUxlbmd0aExpbWl0fWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6c3ltYm9sIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdzeW1ib2wnKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hSZW1vdGFibGVIZWxwZXIgPSBGYXIoJ21hdGNoOnJlbW90YWJsZSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJlbW90YWJsZURlc2MsIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoaXNLaW5kKHNwZWNpbWVuLCAncmVtb3RhYmxlJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2sgPT09IGlkZW50Q2hlY2tlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGxhYmVsIH0gPSByZW1vdGFibGVEZXNjO1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuICAgICAgY29uc3Qga2luZERldGFpbHMgPVxuICAgICAgICBwYXNzU3R5bGUgIT09ICd0YWdnZWQnXG4gICAgICAgICAgPyAvL1xuICAgICAgICAgICAgYihwYXNzU3R5bGUpXG4gICAgICAgICAgOiAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHEoZ2V0VGFnKHNwZWNpbWVuKSk7XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIHJlbW90YWJsZSAke2IobGFiZWwpfSwgbm90ICR7a2luZERldGFpbHN9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZFJlbW90YWJsZURlc2MsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICBhbGxlZ2VkUmVtb3RhYmxlRGVzYyxcbiAgICAgICAgaGFyZGVuKHsgbGFiZWw6IE1NLnN0cmluZygpIH0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnJlbW90YWJsZSBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfcmVtb3RhYmxlRGVzYywgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ3JlbW90YWJsZScpLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaExURUhlbHBlciA9IEZhcignbWF0Y2g6bHRlIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUxURShzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDw9ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocmlnaHRPcGVyYW5kLCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxldCBbbGVmdEJvdW5kLCByaWdodEJvdW5kXSA9IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gICAgICBjb25zdCBuZXdSaWdodEJvdW5kID0gYCR7ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKX1+YDtcbiAgICAgIGlmIChuZXdSaWdodEJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmlnaHRCb3VuZCA9IG5ld1JpZ2h0Qm91bmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF07XG4gICAgfSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hMVEhlbHBlciA9IEZhcignbWF0Y2g6bHQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5TFQoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiBtYXRjaExURUhlbHBlci5nZXRSYW5rQ292ZXIsXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoR1RFSGVscGVyID0gRmFyKCdtYXRjaDpndGUgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5R1RFKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPj0gJHtyaWdodE9wZXJhbmR9YCksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tLZXksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChyaWdodE9wZXJhbmQsIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgbGV0IFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdID0gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbiAgICAgIGNvbnN0IG5ld0xlZnRCb3VuZCA9IGVuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCk7XG4gICAgICBpZiAobmV3TGVmdEJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGVmdEJvdW5kID0gbmV3TGVmdEJvdW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoR1RIZWxwZXIgPSBGYXIoJ21hdGNoOmd0IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUdUKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPiAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogbWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaFJlY29yZE9mSGVscGVyID0gRmFyKCdtYXRjaDpyZWNvcmRPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtrZXlQYXR0LCB2YWx1ZVBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtUHJvcGVydGllc0xpbWl0LCBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlSZWNvcmQnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgb3duS2V5cyhzcGVjaW1lbikubGVuZ3RoIDw9IG51bVByb3BlcnRpZXNMaW1pdCxcbiAgICAgICAgICBYYE11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbiAgICAgICAgICAgIG51bVByb3BlcnRpZXNMaW1pdCxcbiAgICAgICAgICApfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4gICAgICAgICAgKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcihcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBrZXkubGVuZ3RoIDw9IHByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuICAgICAgICAgICAgICAgIFhgUHJvcGVydHkgbmFtZSBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAke3EoXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCxcbiAgICAgICAgICAgICAgICApfWAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgICAgICAgaGFyZGVuKFtrZXksIHZhbHVlXSksXG4gICAgICAgICAgICAgIGhhcmRlbihba2V5UGF0dCwgdmFsdWVQYXR0XSksXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IF9lbnRyeVBhdHQgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hBcnJheU9mSGVscGVyID0gRmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW3N1YlBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGFycmF5TGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUFycmF5JywgY2hlY2spICYmXG4gICAgICAgICgvKiAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pLmxlbmd0aCA8PSBhcnJheUxlbmd0aExpbWl0IHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgQXJyYXkgbGVuZ3RoICR7c3BlY2ltZW4ubGVuZ3RofSBtdXN0IGJlIDw9IGxpbWl0ICR7YXJyYXlMZW5ndGhMaW1pdH1gLFxuICAgICAgICAgICkpICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4sIHN1YlBhdHQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5JyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoQnl0ZUFycmF5SGVscGVyID0gRmFyKCdtYXRjaDpieXRlQXJyYXkgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgYnl0ZUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2J5dGVBcnJheScsIGNoZWNrKSAmJlxuICAgICAgICAoLyogICAgICAgICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKS5ieXRlTGVuZ3RoIDw9IGJ5dGVMZW5ndGhMaW1pdCB8fFxuICAgICAgICAgIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYGJ5dGVBcnJheSAke3NwZWNpbWVufSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke2J5dGVMZW5ndGhMaW1pdH1gLFxuICAgICAgICAgICkpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6Ynl0ZUFycmF5IHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdieXRlQXJyYXknKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hTZXRPZkhlbHBlciA9IEZhcignbWF0Y2g6c2V0T2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBba2V5UGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtU2V0RWxlbWVudHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlTZXQnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuLnBheWxvYWQpLmxlbmd0aCA8IG51bVNldEVsZW1lbnRzTGltaXQsXG4gICAgICAgICAgWGBTZXQgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKG51bVNldEVsZW1lbnRzTGltaXQpfSBlbGVtZW50czogJHtcbiAgICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQubGVuZ3RoXG4gICAgICAgICAgfWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLCBrZXlQYXR0LCBjaGVjaywgJ3NldCBlbGVtZW50cycpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6c2V0T2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoQmFnT2ZIZWxwZXIgPSBGYXIoJ21hdGNoOmJhZ09mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW2tleVBhdHQsIGNvdW50UGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LCBkZWNpbWFsRGlnaXRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5QmFnJywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICovIChzcGVjaW1lbi5wYXlsb2FkKS5sZW5ndGggPD1cbiAgICAgICAgICAgIG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsXG4gICAgICAgICAgWGBCYWcgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxuICAgICAgICAgICAgbnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxcbiAgICAgICAgICApfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKSAmJlxuICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuICAgICAgICAgIChba2V5LCBjb3VudF0sIGkpID0+XG4gICAgICAgICAgICBjaGVja01hdGNoZXMoa2V5LCBrZXlQYXR0LCBjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkgJiZcbiAgICAgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcihcbiAgICAgICAgICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG4gICAgICAgICAgICAgIFtjb3VudCwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVja10sXG4gICAgICAgICAgICAgIGBiYWcgY291bnRzWyR7aX1dYCxcbiAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgIGNoZWNrTWF0Y2hlcyhjb3VudCwgY291bnRQYXR0LCBjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6YmFnT2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVsZW1lbnRzSGFzU3BsaXQgPSAoXG4gICAgZWxlbWVudHMsXG4gICAgZWxlbWVudFBhdHQsXG4gICAgYm91bmQsXG4gICAgaW5SZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIG91dFJlc3VsdHMgPSB1bmRlZmluZWQsXG4gICAgY2hlY2sgPSBpZGVudENoZWNrZXIsXG4gICkgPT4ge1xuICAgIGxldCBjb3VudCA9IDBuO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChsZXQgaSA9IGVsZW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoY291bnQgPCBib3VuZCkge1xuICAgICAgICBpZiAobWF0Y2hlcyhlbGVtZW50LCBlbGVtZW50UGF0dCkpIHtcbiAgICAgICAgICBjb3VudCArPSAxbjtcbiAgICAgICAgICBpZiAoaW5SZXN1bHRzKSBpblJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzKSB7XG4gICAgICAgICAgb3V0UmVzdWx0cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG91dFJlc3VsdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgY291bnQgPj0gYm91bmQsXG4gICAgICBYYEhhcyBvbmx5ICR7cShjb3VudCl9IG1hdGNoZXMsIGJ1dCBuZWVkcyAke3EoYm91bmQpfWAsXG4gICAgKTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwYWlyc0hhc1NwbGl0ID0gKFxuICAgIHBhaXJzLFxuICAgIGVsZW1lbnRQYXR0LFxuICAgIGJvdW5kLFxuICAgIGluUmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBvdXRSZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIGNoZWNrID0gaWRlbnRDaGVja2VyLFxuICApID0+IHtcbiAgICBsZXQgY291bnQgPSAwbjtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGZvciAobGV0IGkgPSBwYWlycy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgY29uc3QgW2VsZW1lbnQsIG51bV0gPSBwYWlyc1tpXTtcbiAgICAgIGNvbnN0IG51bVJlc3QgPSBib3VuZCAtIGNvdW50O1xuICAgICAgaWYgKG51bVJlc3QgPj0gMW4pIHtcbiAgICAgICAgaWYgKG1hdGNoZXMoZWxlbWVudCwgZWxlbWVudFBhdHQpKSB7XG4gICAgICAgICAgaWYgKG51bSA8PSBudW1SZXN0KSB7XG4gICAgICAgICAgICBjb3VudCArPSBudW07XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHRzKSBpblJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG51bUluID0gbnVtUmVzdDtcbiAgICAgICAgICAgIGNvdW50ICs9IG51bUluO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0cykgaW5SZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bVJlc3RdKTtcbiAgICAgICAgICAgIGlmIChvdXRSZXN1bHRzKSBvdXRSZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bSAtIG51bVJlc3RdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3V0UmVzdWx0cykge1xuICAgICAgICAgIG91dFJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob3V0UmVzdWx0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0UmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW1dKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgY291bnQgPj0gYm91bmQsXG4gICAgICBYYEhhcyBvbmx5ICR7cShjb3VudCl9IG1hdGNoZXMsIGJ1dCBuZWVkcyAke3EoYm91bmQpfWAsXG4gICAgKTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGNvbnRhaW5lckhhc1NwbGl0ID0gKFxuICAgIHNwZWNpbWVuLFxuICAgIGVsZW1lbnRQYXR0LFxuICAgIGJvdW5kLFxuICAgIG5lZWRJblJlc3VsdHMgPSBmYWxzZSxcbiAgICBuZWVkT3V0UmVzdWx0cyA9IGZhbHNlLFxuICAgIGNoZWNrID0gaWRlbnRDaGVja2VyLFxuICApID0+IHtcbiAgICBjb25zdCBpblJlc3VsdHMgPSBuZWVkSW5SZXN1bHRzID8gW10gOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qgb3V0UmVzdWx0cyA9IG5lZWRPdXRSZXN1bHRzID8gW10gOiB1bmRlZmluZWQ7XG4gICAgY29uc3Qga2luZCA9IGtpbmRPZihzcGVjaW1lbik7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhZWxlbWVudHNIYXNTcGxpdChcbiAgICAgICAgICAgIHNwZWNpbWVuLFxuICAgICAgICAgICAgZWxlbWVudFBhdHQsXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGluUmVzdWx0cyxcbiAgICAgICAgICAgIG91dFJlc3VsdHMsXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbaW5SZXN1bHRzLCBvdXRSZXN1bHRzXTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhZWxlbWVudHNIYXNTcGxpdChcbiAgICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQsXG4gICAgICAgICAgICBlbGVtZW50UGF0dCxcbiAgICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgICAgaW5SZXN1bHRzLFxuICAgICAgICAgICAgb3V0UmVzdWx0cyxcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgaW5SZXN1bHRzICYmIG1ha2VDb3B5U2V0KGluUmVzdWx0cyksXG4gICAgICAgICAgb3V0UmVzdWx0cyAmJiBtYWtlQ29weVNldChvdXRSZXN1bHRzKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhcGFpcnNIYXNTcGxpdChcbiAgICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQsXG4gICAgICAgICAgICBlbGVtZW50UGF0dCxcbiAgICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgICAgaW5SZXN1bHRzLFxuICAgICAgICAgICAgb3V0UmVzdWx0cyxcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgaW5SZXN1bHRzICYmIG1ha2VDb3B5QmFnKGluUmVzdWx0cyksXG4gICAgICAgICAgb3V0UmVzdWx0cyAmJiBtYWtlQ29weUJhZyhvdXRSZXN1bHRzKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYHVuZXhwZWN0ZWQgJHtxKGtpbmQpfWApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaENvbnRhaW5lckhhc0hlbHBlciA9IEZhcignTS5jb250YWluZXJIYXMgaGVscGVyJywge1xuICAgIC8qXG5cblxuXG4gICAgICovXG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtlbGVtZW50UGF0dCwgYm91bmQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGtpbmQgPSBraW5kT2Yoc3BlY2ltZW4sIGNoZWNrKTtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgaWYgKFxuICAgICAgICAhYXBwbHlMYWJlbGluZ0Vycm9yKFxuICAgICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuICAgICAgICAgIFtib3VuZCwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVja10sXG4gICAgICAgICAgYCR7a2luZH0gbWF0Y2hlc2AsXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gISFjb250YWluZXJIYXNTcGxpdChcbiAgICAgICAgc3BlY2ltZW4sXG4gICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICBib3VuZCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBjaGVjayxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLmd0ZSgxbildKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdNLmNvbnRhaW5lckhhcyBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6ICgpID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hNYXBPZkhlbHBlciA9IEZhcignbWF0Y2g6bWFwT2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IG51bU1hcEVudHJpZXNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlNYXAnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuLnBheWxvYWQua2V5cykubGVuZ3RoIDw9XG4gICAgICAgICAgICBudW1NYXBFbnRyaWVzTGltaXQsXG4gICAgICAgICAgWGBDb3B5TWFwIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gJHtxKFxuICAgICAgICAgICAgbnVtTWFwRW50cmllc0xpbWl0LFxuICAgICAgICAgICl9IGVudHJpZXM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKSAmJlxuICAgICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQua2V5cyxcbiAgICAgICAgICBrZXlQYXR0LFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICdtYXAga2V5cycsXG4gICAgICAgICkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbiAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLnZhbHVlcyxcbiAgICAgICAgICB2YWx1ZVBhdHQsXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgJ21hcCB2YWx1ZXMnLFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDptYXBPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IF9lbnRyeVBhdHQgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHNwbGl0QXJyYXlQYXJ0cyA9IChzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpID0+IHtcbiAgICBjb25zdCBudW1SZXF1aXJlZCA9IHJlcXVpcmVkUGF0dC5sZW5ndGg7XG4gICAgY29uc3QgbnVtT3B0aW9uYWwgPSBvcHRpb25hbFBhdHQubGVuZ3RoO1xuICAgIGNvbnN0IHJlcXVpcmVkU3BlY2ltZW4gPSBzcGVjaW1lbi5zbGljZSgwLCBudW1SZXF1aXJlZCk7XG4gICAgY29uc3Qgb3B0aW9uYWxTcGVjaW1lbiA9IHNwZWNpbWVuLnNsaWNlKFxuICAgICAgbnVtUmVxdWlyZWQsXG4gICAgICBudW1SZXF1aXJlZCArIG51bU9wdGlvbmFsLFxuICAgICk7XG4gICAgY29uc3QgcmVzdFNwZWNpbWVuID0gc3BlY2ltZW4uc2xpY2UobnVtUmVxdWlyZWQgKyBudW1PcHRpb25hbCk7XG4gICAgcmV0dXJuIGhhcmRlbih7IHJlcXVpcmVkU3BlY2ltZW4sIG9wdGlvbmFsU3BlY2ltZW4sIHJlc3RTcGVjaW1lbiB9KTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBhZGFwdEFycmF5UGF0dGVybiA9IChvcHRpb25hbFBhdHQsIGxlbmd0aCkgPT5cbiAgICBoYXJkZW4ob3B0aW9uYWxQYXR0LnNsaWNlKDAsIGxlbmd0aCkubWFwKHBhdHQgPT4gTU0ub3B0KHBhdHQpKSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hTcGxpdEFycmF5SGVscGVyID0gRmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0gW10sIHJlc3RQYXR0ID0gTU0uYW55KCldLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBpZiAoIWNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlBcnJheScsIGNoZWNrKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHJlcXVpcmVkU3BlY2ltZW4sIG9wdGlvbmFsU3BlY2ltZW4sIHJlc3RTcGVjaW1lbiB9ID1cbiAgICAgICAgc3BsaXRBcnJheVBhcnRzKHNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCk7XG4gICAgICBjb25zdCBwYXJ0aWFsUGF0dCA9IGFkYXB0QXJyYXlQYXR0ZXJuKFxuICAgICAgICBvcHRpb25hbFBhdHQsXG4gICAgICAgIG9wdGlvbmFsU3BlY2ltZW4ubGVuZ3RoLFxuICAgICAgKTtcbiAgICAgIGxldCBhcmdOdW0gPSAwO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHJlcXVpcmVkU3BlY2ltZW4ubGVuZ3RoID09PSByZXF1aXJlZFBhdHQubGVuZ3RoIHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgRXhwZWN0ZWQgYXQgbGVhc3QgJHtxKFxuICAgICAgICAgICAgICByZXF1aXJlZFBhdHQubGVuZ3RoLFxuICAgICAgICAgICAgKX0gYXJndW1lbnRzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICAgKSkgJiZcbiAgICAgICAgcmVxdWlyZWRQYXR0LmV2ZXJ5KChwLCBpKSA9PlxuICAgICAgICAgIC8vXG4gICAgICAgICAgY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0sIHAsIGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9YCksXG4gICAgICAgICkgJiZcbiAgICAgICAgcGFydGlhbFBhdHQuZXZlcnkoKHAsIGkpID0+XG4gICAgICAgICAgLy9cbiAgICAgICAgICBjaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSwgcCwgY2hlY2ssIGBhcmcgJHthcmdOdW0rK30/YCksXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbiwgcmVzdFBhdHQsIGNoZWNrLCAnLi4ucmVzdCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHNwbGl0QXJyYXksIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAoc3BsaXRBcnJheS5sZW5ndGggPj0gMSB8fCBzcGxpdEFycmF5Lmxlbmd0aCA8PSAzKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCwgcmVzdFBhdHQgPSB1bmRlZmluZWRdID1cbiAgICAgICAgICBzcGxpdEFycmF5O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkgJiZcbiAgICAgICAgICBwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAgIChvcHRpb25hbFBhdHQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKGlzUGF0dGVybihvcHRpb25hbFBhdHQpICYmXG4gICAgICAgICAgICAgIHBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCkgPT09ICdjb3B5QXJyYXknKSkgJiZcbiAgICAgICAgICAocmVzdFBhdHQgPT09IHVuZGVmaW5lZCB8fCBpc1BhdHRlcm4ocmVzdFBhdHQpKVxuICAgICAgICApIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IGFycmF5LCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgYXJyYXksIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuICAgICAgICAgIHNwbGl0QXJyYXksXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGdldFJhbmtDb3ZlcjogKFtcbiAgICAgIF9yZXF1aXJlZFBhdHQsXG4gICAgICBfb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLFxuICAgICAgX3Jlc3RQYXR0ID0gdW5kZWZpbmVkLFxuICAgIF0pID0+IGdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKSxcbiAgfSk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBzcGxpdFJlY29yZFBhcnRzID0gKHNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCkgPT4ge1xuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCByZXF1aXJlZEVudHJpZXMgPSBbXTtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IG9wdGlvbmFsRW50cmllcyA9IFtdO1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcmVzdEVudHJpZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgZW50cmllcyhzcGVjaW1lbikpIHtcbiAgICAgIGlmIChoYXNPd24ocmVxdWlyZWRQYXR0LCBuYW1lKSkge1xuICAgICAgICByZXF1aXJlZEVudHJpZXMucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFzT3duKG9wdGlvbmFsUGF0dCwgbmFtZSkpIHtcbiAgICAgICAgb3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0RW50cmllcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHJlcXVpcmVkU3BlY2ltZW46IGZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG4gICAgICBvcHRpb25hbFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhvcHRpb25hbEVudHJpZXMpLFxuICAgICAgcmVzdFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhyZXN0RW50cmllcyksXG4gICAgfSk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgYWRhcHRSZWNvcmRQYXR0ZXJuID0gKG9wdGlvbmFsUGF0dCwgbmFtZXMpID0+XG4gICAgZnJvbVVuaXF1ZUVudHJpZXMobmFtZXMubWFwKG5hbWUgPT4gW25hbWUsIE1NLm9wdChvcHRpb25hbFBhdHRbbmFtZV0pXSkpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXIgPSBGYXIoJ21hdGNoOnNwbGl0UmVjb3JkIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0ge30sIHJlc3RQYXR0ID0gTU0uYW55KCldLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBpZiAoIWNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlSZWNvcmQnLCBjaGVjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyByZXF1aXJlZFNwZWNpbWVuLCBvcHRpb25hbFNwZWNpbWVuLCByZXN0U3BlY2ltZW4gfSA9XG4gICAgICAgIHNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KTtcblxuICAgICAgY29uc3QgcGFydGlhbE5hbWVzID0gLyogICAgICAgICAgICAgICAgICAgKi8gKG93bktleXMob3B0aW9uYWxTcGVjaW1lbikpO1xuICAgICAgY29uc3QgcGFydGlhbFBhdHQgPSBhZGFwdFJlY29yZFBhdHRlcm4ob3B0aW9uYWxQYXR0LCBwYXJ0aWFsTmFtZXMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgY2hlY2spICYmXG4gICAgICAgIHBhcnRpYWxOYW1lcy5ldmVyeShuYW1lID0+XG4gICAgICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICAgICAgb3B0aW9uYWxTcGVjaW1lbltuYW1lXSxcbiAgICAgICAgICAgIHBhcnRpYWxQYXR0W25hbWVdLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICBgJHtuYW1lfT9gLFxuICAgICAgICAgICksXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbiwgcmVzdFBhdHQsIGNoZWNrLCAnLi4ucmVzdCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHNwbGl0QXJyYXksIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAoc3BsaXRBcnJheS5sZW5ndGggPj0gMSB8fCBzcGxpdEFycmF5Lmxlbmd0aCA8PSAzKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCwgcmVzdFBhdHQgPSB1bmRlZmluZWRdID1cbiAgICAgICAgICBzcGxpdEFycmF5O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkgJiZcbiAgICAgICAgICBwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpID09PSAnY29weVJlY29yZCcgJiZcbiAgICAgICAgICAob3B0aW9uYWxQYXR0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChpc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSAmJlxuICAgICAgICAgICAgICBwYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpID09PSAnY29weVJlY29yZCcpKSAmJlxuICAgICAgICAgIChyZXN0UGF0dCA9PT0gdW5kZWZpbmVkIHx8IGlzUGF0dGVybihyZXN0UGF0dCkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgcmVjb3JkLCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgcmVjb3JkLCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbiAgICAgICAgICBzcGxpdEFycmF5LFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChbXG4gICAgICByZXF1aXJlZFBhdHQsXG4gICAgICBfb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLFxuICAgICAgX3Jlc3RQYXR0ID0gdW5kZWZpbmVkLFxuICAgIF0pID0+IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkpLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgSGVscGVyc0J5TWF0Y2hUYWcgPSBoYXJkZW4oe1xuICAgICdtYXRjaDphbnknOiBtYXRjaEFueUhlbHBlcixcbiAgICAnbWF0Y2g6YW5kJzogbWF0Y2hBbmRIZWxwZXIsXG4gICAgJ21hdGNoOm9yJzogbWF0Y2hPckhlbHBlcixcbiAgICAnbWF0Y2g6bm90JzogbWF0Y2hOb3RIZWxwZXIsXG5cbiAgICAnbWF0Y2g6c2NhbGFyJzogbWF0Y2hTY2FsYXJIZWxwZXIsXG4gICAgJ21hdGNoOmtleSc6IG1hdGNoS2V5SGVscGVyLFxuICAgICdtYXRjaDpwYXR0ZXJuJzogbWF0Y2hQYXR0ZXJuSGVscGVyLFxuICAgICdtYXRjaDpraW5kJzogbWF0Y2hLaW5kSGVscGVyLFxuICAgICdtYXRjaDp0YWdnZWQnOiBtYXRjaFRhZ2dlZEhlbHBlcixcbiAgICAnbWF0Y2g6YmlnaW50JzogbWF0Y2hCaWdpbnRIZWxwZXIsXG4gICAgJ21hdGNoOm5hdCc6IG1hdGNoTmF0SGVscGVyLFxuICAgICdtYXRjaDpzdHJpbmcnOiBtYXRjaFN0cmluZ0hlbHBlcixcbiAgICAnbWF0Y2g6c3ltYm9sJzogbWF0Y2hTeW1ib2xIZWxwZXIsXG4gICAgJ21hdGNoOnJlbW90YWJsZSc6IG1hdGNoUmVtb3RhYmxlSGVscGVyLFxuXG4gICAgJ21hdGNoOmx0JzogbWF0Y2hMVEhlbHBlcixcbiAgICAnbWF0Y2g6bHRlJzogbWF0Y2hMVEVIZWxwZXIsXG4gICAgJ21hdGNoOmd0ZSc6IG1hdGNoR1RFSGVscGVyLFxuICAgICdtYXRjaDpndCc6IG1hdGNoR1RIZWxwZXIsXG5cbiAgICAnbWF0Y2g6YXJyYXlPZic6IG1hdGNoQXJyYXlPZkhlbHBlcixcbiAgICAnbWF0Y2g6Ynl0ZUFycmF5JzogbWF0Y2hCeXRlQXJyYXlIZWxwZXIsXG4gICAgJ21hdGNoOnJlY29yZE9mJzogbWF0Y2hSZWNvcmRPZkhlbHBlcixcbiAgICAnbWF0Y2g6c2V0T2YnOiBtYXRjaFNldE9mSGVscGVyLFxuICAgICdtYXRjaDpiYWdPZic6IG1hdGNoQmFnT2ZIZWxwZXIsXG4gICAgJ21hdGNoOmNvbnRhaW5lckhhcyc6IG1hdGNoQ29udGFpbmVySGFzSGVscGVyLFxuICAgICdtYXRjaDptYXBPZic6IG1hdGNoTWFwT2ZIZWxwZXIsXG4gICAgJ21hdGNoOnNwbGl0QXJyYXknOiBtYXRjaFNwbGl0QXJyYXlIZWxwZXIsXG4gICAgJ21hdGNoOnNwbGl0UmVjb3JkJzogbWF0Y2hTcGxpdFJlY29yZEhlbHBlcixcbiAgfSk7XG5cbiAgY29uc3QgbWFrZU1hdGNoZXIgPSAodGFnLCBwYXlsb2FkKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlciA9IG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKTtcbiAgICBhc3NlcnRQYXR0ZXJuKG1hdGNoZXIpO1xuICAgIHJldHVybiBtYXRjaGVyO1xuICB9O1xuXG4gIGNvbnN0IG1ha2VLaW5kTWF0Y2hlciA9IGtpbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmtpbmQnLCBraW5kKTtcblxuICBjb25zdCBBbnlTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDphbnknLCB1bmRlZmluZWQpO1xuICBjb25zdCBTY2FsYXJTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDpzY2FsYXInLCB1bmRlZmluZWQpO1xuICBjb25zdCBLZXlTaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDprZXknLCB1bmRlZmluZWQpO1xuICBjb25zdCBQYXR0ZXJuU2hhcGUgPSBtYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IEJvb2xlYW5TaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcignYm9vbGVhbicpO1xuICBjb25zdCBOdW1iZXJTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG4gIGNvbnN0IEJpZ0ludFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6YmlnaW50JywgW10pO1xuICBjb25zdCBOYXRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsIFtdKTtcbiAgY29uc3QgU3RyaW5nU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpzdHJpbmcnLCBbXSk7XG4gIGNvbnN0IFN5bWJvbFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6c3ltYm9sJywgW10pO1xuICBjb25zdCBSZWNvcmRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJywgW0FueVNoYXBlLCBBbnlTaGFwZV0pO1xuICBjb25zdCBBcnJheVNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsIFtBbnlTaGFwZV0pO1xuICBjb25zdCBCeXRlQXJyYXlTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmJ5dGVBcnJheScsIFtdKTtcbiAgY29uc3QgU2V0U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsIFtBbnlTaGFwZV0pO1xuICBjb25zdCBCYWdTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOmJhZ09mJywgW0FueVNoYXBlLCBBbnlTaGFwZV0pO1xuICBjb25zdCBNYXBTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOm1hcE9mJywgW0FueVNoYXBlLCBBbnlTaGFwZV0pO1xuICBjb25zdCBSZW1vdGFibGVTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcigncmVtb3RhYmxlJyk7XG4gIGNvbnN0IEVycm9yU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG4gIGNvbnN0IFByb21pc2VTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcigncHJvbWlzZScpO1xuICBjb25zdCBVbmRlZmluZWRTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcigndW5kZWZpbmVkJyk7XG5cbiAgLypcblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VMaW1pdHNNYXRjaGVyID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICAgIGlmIChwYXlsb2FkW3BheWxvYWQubGVuZ3RoIC0gMV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGF5bG9hZCA9IGhhcmRlbihwYXlsb2FkLnNsaWNlKDAsIHBheWxvYWQubGVuZ3RoIC0gMSkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZU1hdGNoZXIodGFnLCBwYXlsb2FkKTtcbiAgfTtcblxuICBjb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlciA9IChsYWJlbCA9IHVuZGVmaW5lZCkgPT5cbiAgICBsYWJlbCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IFJlbW90YWJsZVNoYXBlXG4gICAgICA6IG1ha2VNYXRjaGVyKCdtYXRjaDpyZW1vdGFibGUnLCBoYXJkZW4oeyBsYWJlbCB9KSk7XG5cbiAgLypcblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VTcGxpdFBheWxvYWQgPSAoXG4gICAgZW1wdHksXG4gICAgYmFzZSxcbiAgICBvcHRpb25hbCA9IHVuZGVmaW5lZCxcbiAgICByZXN0ID0gdW5kZWZpbmVkLFxuICApID0+IHtcbiAgICBpZiAocmVzdCkge1xuICAgICAgcmV0dXJuIFtiYXNlLCBvcHRpb25hbCB8fCBlbXB0eSwgcmVzdF07XG4gICAgfVxuICAgIGlmIChvcHRpb25hbCkge1xuICAgICAgcmV0dXJuIFtiYXNlLCBvcHRpb25hbF07XG4gICAgfVxuICAgIHJldHVybiBbYmFzZV07XG4gIH07XG5cbiAgLy9cblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IE0gPSBoYXJkZW4oe1xuICAgIGFueTogKCkgPT4gQW55U2hhcGUsXG4gICAgYW5kOiAoLi4ucGF0dHMpID0+IG1ha2VNYXRjaGVyKCdtYXRjaDphbmQnLCBwYXR0cyksXG4gICAgb3I6ICguLi5wYXR0cykgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOm9yJywgcGF0dHMpLFxuICAgIG5vdDogc3ViUGF0dCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6bm90Jywgc3ViUGF0dCksXG5cbiAgICBzY2FsYXI6ICgpID0+IFNjYWxhclNoYXBlLFxuICAgIGtleTogKCkgPT4gS2V5U2hhcGUsXG4gICAgcGF0dGVybjogKCkgPT4gUGF0dGVyblNoYXBlLFxuICAgIGtpbmQ6IG1ha2VLaW5kTWF0Y2hlcixcbiAgICB0YWdnZWQ6ICh0YWdQYXR0ID0gTS5zdHJpbmcoKSwgcGF5bG9hZFBhdHQgPSBNLmFueSgpKSA9PlxuICAgICAgbWFrZU1hdGNoZXIoJ21hdGNoOnRhZ2dlZCcsIGhhcmRlbihbdGFnUGF0dCwgcGF5bG9hZFBhdHRdKSksXG4gICAgYm9vbGVhbjogKCkgPT4gQm9vbGVhblNoYXBlLFxuICAgIG51bWJlcjogKCkgPT4gTnVtYmVyU2hhcGUsXG4gICAgYmlnaW50OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJpZ2ludCcsIFtsaW1pdHNdKSA6IEJpZ0ludFNoYXBlLFxuICAgIG5hdDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpuYXQnLCBbbGltaXRzXSkgOiBOYXRTaGFwZSxcbiAgICBzdHJpbmc6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3RyaW5nJywgW2xpbWl0c10pIDogU3RyaW5nU2hhcGUsXG4gICAgc3ltYm9sOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN5bWJvbCcsIFtsaW1pdHNdKSA6IFN5bWJvbFNoYXBlLFxuICAgIHJlY29yZDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IE0ucmVjb3JkT2YoTS5hbnkoKSwgTS5hbnkoKSwgbGltaXRzKSA6IFJlY29yZFNoYXBlLFxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgYXJyYXk6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLmFycmF5T2YoTS5hbnkoKSwgbGltaXRzKSA6IEFycmF5U2hhcGUsXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgYnl0ZUFycmF5OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJ5dGVBcnJheScsIFtsaW1pdHNdKSA6IEJ5dGVBcnJheVNoYXBlLFxuICAgIHNldDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT4gKGxpbWl0cyA/IE0uc2V0T2YoTS5hbnkoKSwgbGltaXRzKSA6IFNldFNoYXBlKSxcbiAgICBiYWc6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLmJhZ09mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBCYWdTaGFwZSxcbiAgICBtYXA6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLm1hcE9mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBNYXBTaGFwZSxcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHJlbW90YWJsZTogbWFrZVJlbW90YWJsZU1hdGNoZXIsXG4gICAgZXJyb3I6ICgpID0+IEVycm9yU2hhcGUsXG4gICAgcHJvbWlzZTogKCkgPT4gUHJvbWlzZVNoYXBlLFxuICAgIHVuZGVmaW5lZDogKCkgPT4gVW5kZWZpbmVkU2hhcGUsXG4gICAgbnVsbDogKCkgPT4gbnVsbCxcblxuICAgIGx0OiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmx0JywgcmlnaHRPcGVyYW5kKSxcbiAgICBsdGU6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6bHRlJywgcmlnaHRPcGVyYW5kKSxcbiAgICBlcToga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleShrZXkpO1xuICAgICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gTS51bmRlZmluZWQoKSA6IGtleTtcbiAgICB9LFxuICAgIG5lcToga2V5ID0+IE0ubm90KE0uZXEoa2V5KSksXG4gICAgZ3RlOiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmd0ZScsIHJpZ2h0T3BlcmFuZCksXG4gICAgZ3Q6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6Z3QnLCByaWdodE9wZXJhbmQpLFxuXG4gICAgcmVjb3JkT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgdmFsdWVQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnJlY29yZE9mJywgW2tleVBhdHQsIHZhbHVlUGF0dCwgbGltaXRzXSksXG4gICAgYXJyYXlPZjogKHN1YlBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YXJyYXlPZicsIFtzdWJQYXR0LCBsaW1pdHNdKSxcbiAgICBzZXRPZjogKGtleVBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c2V0T2YnLCBba2V5UGF0dCwgbGltaXRzXSksXG4gICAgYmFnT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgY291bnRQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJhZ09mJywgW2tleVBhdHQsIGNvdW50UGF0dCwgbGltaXRzXSksXG4gICAgY29udGFpbmVySGFzOiAoZWxlbWVudFBhdHQgPSBNLmFueSgpLCBjb3VudFBhdHQgPSAxbiwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmNvbnRhaW5lckhhcycsIFtlbGVtZW50UGF0dCwgY291bnRQYXR0LCBsaW1pdHNdKSxcbiAgICBtYXBPZjogKGtleVBhdHQgPSBNLmFueSgpLCB2YWx1ZVBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bWFwT2YnLCBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHNdKSxcbiAgICBzcGxpdEFycmF5OiAoYmFzZSwgb3B0aW9uYWwgPSB1bmRlZmluZWQsIHJlc3QgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTWF0Y2hlcihcbiAgICAgICAgJ21hdGNoOnNwbGl0QXJyYXknLFxuICAgICAgICBtYWtlU3BsaXRQYXlsb2FkKFtdLCBiYXNlLCBvcHRpb25hbCwgcmVzdCksXG4gICAgICApLFxuICAgIHNwbGl0UmVjb3JkOiAoYmFzZSwgb3B0aW9uYWwgPSB1bmRlZmluZWQsIHJlc3QgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTWF0Y2hlcihcbiAgICAgICAgJ21hdGNoOnNwbGl0UmVjb3JkJyxcbiAgICAgICAgbWFrZVNwbGl0UGF5bG9hZCh7fSwgYmFzZSwgb3B0aW9uYWwsIHJlc3QpLFxuICAgICAgKSxcbiAgICBzcGxpdDogKGJhc2UsIHJlc3QgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpID09PSAnY29weUFycmF5Jykge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gTS5zcGxpdEFycmF5KGJhc2UsIHJlc3QgJiYgW10sIHJlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE0uc3BsaXRSZWNvcmQoYmFzZSwgcmVzdCAmJiB7fSwgcmVzdCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBwYXJ0aWFsOiAoYmFzZSwgcmVzdCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSkgPT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBNLnNwbGl0QXJyYXkoW10sIGJhc2UsIHJlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sIGJhc2UsIHJlc3QpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBlcmVmOiB0ID0+IE0ub3IodCwgTS5wcm9taXNlKCkpLFxuICAgIG9wdDogdCA9PiBNLm9yKE0udW5kZWZpbmVkKCksIHQpLFxuXG4gICAgaW50ZXJmYWNlOiAoaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCBvcHRpb25zKSA9PlxuICAgICAgLy9cbiAgICAgIG1ha2VJbnRlcmZhY2VHdWFyZChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMpLFxuICAgIGNhbGw6ICguLi5hcmdQYXR0ZXJucykgPT5cbiAgICAgIC8vXG4gICAgICBtYWtlTWV0aG9kR3VhcmRNYWtlcignc3luYycsIGFyZ1BhdHRlcm5zKSxcbiAgICBjYWxsV2hlbjogKC4uLmFyZ0d1YXJkcykgPT5cbiAgICAgIC8vXG4gICAgICBtYWtlTWV0aG9kR3VhcmRNYWtlcignYXN5bmMnLCBhcmdHdWFyZHMpLFxuXG4gICAgYXdhaXQ6IGFyZ1BhdHRlcm4gPT5cbiAgICAgIC8vXG4gICAgICBtYWtlQXdhaXRBcmdHdWFyZChhcmdQYXR0ZXJuKSxcbiAgICByYXc6ICgpID0+XG4gICAgICAvL1xuICAgICAgbWFrZVJhd0d1YXJkKCksXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGNoZWNrTWF0Y2hlcyxcbiAgICBtYXRjaGVzLFxuICAgIG11c3RNYXRjaCxcbiAgICBhc3NlcnRQYXR0ZXJuLFxuICAgIGlzUGF0dGVybixcbiAgICBnZXRSYW5rQ292ZXIsXG4gICAgTSxcbiAgICBraW5kT2YsXG4gICAgY29udGFpbmVySGFzU3BsaXQsXG4gIH0pO1xufTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuICAgICAgIGNvbnN0IHtcbiAgY2hlY2tNYXRjaGVzLFxuICBtYXRjaGVzLFxuICBtdXN0TWF0Y2gsXG4gIGFzc2VydFBhdHRlcm4sXG4gIGlzUGF0dGVybixcbiAgZ2V0UmFua0NvdmVyLFxuICBNLFxuICBraW5kT2YsXG4gIGNvbnRhaW5lckhhc1NwbGl0LFxufSA9IG1ha2VQYXR0ZXJuS2l0KCk7JGjNj19vbmNlLmNoZWNrTWF0Y2hlcyhjaGVja01hdGNoZXMpOyRozY9fb25jZS5tYXRjaGVzKG1hdGNoZXMpOyRozY9fb25jZS5tdXN0TWF0Y2gobXVzdE1hdGNoKTskaM2PX29uY2UuYXNzZXJ0UGF0dGVybihhc3NlcnRQYXR0ZXJuKTskaM2PX29uY2UuaXNQYXR0ZXJuKGlzUGF0dGVybik7JGjNj19vbmNlLmdldFJhbmtDb3ZlcihnZXRSYW5rQ292ZXIpOyRozY9fb25jZS5NKE0pOyRozY9fb25jZS5raW5kT2Yoa2luZE9mKTskaM2PX29uY2UuY29udGFpbmVySGFzU3BsaXQoY29udGFpbmVySGFzU3BsaXQpO1xuXG5NTSA9IE07XG5cbi8vXG5cbi8vXG5jb25zdCBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgYXJnR3VhcmQ6IE0ucGF0dGVybigpLFxufSk7XG5cbiAgICAgICBjb25zdCBBd2FpdEFyZ0d1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOmF3YWl0QXJnR3VhcmQnKTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuQXdhaXRBcmdHdWFyZFNoYXBlKEF3YWl0QXJnR3VhcmRTaGFwZSk7XG4gICAgICAgY29uc3QgaXNBd2FpdEFyZ0d1YXJkID0gc3BlY2ltZW4gPT5cbiAgbWF0Y2hlcyhzcGVjaW1lbiwgQXdhaXRBcmdHdWFyZFNoYXBlKTskaM2PX29uY2UuaXNBd2FpdEFyZ0d1YXJkKGlzQXdhaXRBcmdHdWFyZCk7XG5oYXJkZW4oaXNBd2FpdEFyZ0d1YXJkKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRBd2FpdEFyZ0d1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIEF3YWl0QXJnR3VhcmRTaGFwZSwgJ2F3YWl0QXJnR3VhcmQnKTtcbn07JGjNj19vbmNlLmFzc2VydEF3YWl0QXJnR3VhcmQoYXNzZXJ0QXdhaXRBcmdHdWFyZCk7XG5oYXJkZW4oYXNzZXJ0QXdhaXRBcmdHdWFyZCk7XG5cbi8qXG5cblxuICovXG5jb25zdCBtYWtlQXdhaXRBcmdHdWFyZCA9IGFyZ1BhdHRlcm4gPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOmF3YWl0QXJnR3VhcmQnLCB7XG4gICAgYXJnR3VhcmQ6IGFyZ1BhdHRlcm4sXG4gIH0pO1xuICBhc3NlcnRBd2FpdEFyZ0d1YXJkKHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vL1xuXG5jb25zdCBSYXdHdWFyZFBheWxvYWRTaGFwZSA9IE0ucmVjb3JkKCk7XG5cbiAgICAgICBjb25zdCBSYXdHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDpyYXdHdWFyZCcpOyRozY9fb25jZS5SYXdHdWFyZFNoYXBlKFJhd0d1YXJkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgaXNSYXdHdWFyZCA9IHNwZWNpbWVuID0+IG1hdGNoZXMoc3BlY2ltZW4sIFJhd0d1YXJkU2hhcGUpOyRozY9fb25jZS5pc1Jhd0d1YXJkKGlzUmF3R3VhcmQpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0UmF3R3VhcmQgPSBzcGVjaW1lbiA9PlxuICBtdXN0TWF0Y2goc3BlY2ltZW4sIFJhd0d1YXJkU2hhcGUsICdyYXdHdWFyZCcpO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0UmF3R3VhcmQoYXNzZXJ0UmF3R3VhcmQpO1xuY29uc3QgbWFrZVJhd0d1YXJkID0gKCkgPT4gbWFrZVRhZ2dlZCgnZ3VhcmQ6cmF3R3VhcmQnLCB7fSk7XG5cbi8vXG4vL1xuXG4gICAgICAgY29uc3QgU3luY1ZhbHVlR3VhcmRTaGFwZSA9IE0ub3IoUmF3R3VhcmRTaGFwZSwgTS5wYXR0ZXJuKCkpOyRozY9fb25jZS5TeW5jVmFsdWVHdWFyZFNoYXBlKFN5bmNWYWx1ZUd1YXJkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoU3luY1ZhbHVlR3VhcmRTaGFwZSk7JGjNj19vbmNlLlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKTtcblxuY29uc3QgQXJnR3VhcmRTaGFwZSA9IE0ub3IoUmF3R3VhcmRTaGFwZSwgQXdhaXRBcmdHdWFyZFNoYXBlLCBNLnBhdHRlcm4oKSk7XG4gICAgICAgY29uc3QgQXJnR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoQXJnR3VhcmRTaGFwZSk7JGjNj19vbmNlLkFyZ0d1YXJkTGlzdFNoYXBlKEFyZ0d1YXJkTGlzdFNoYXBlKTtcblxuY29uc3QgU3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgY2FsbEtpbmQ6ICdzeW5jJyxcbiAgYXJnR3VhcmRzOiBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxcbiAgb3B0aW9uYWxBcmdHdWFyZHM6IE0ub3B0KFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKSxcbiAgcmVzdEFyZ0d1YXJkOiBNLm9wdChTeW5jVmFsdWVHdWFyZFNoYXBlKSxcbiAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG59KTtcblxuY29uc3QgQXN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9IGhhcmRlbih7XG4gIGNhbGxLaW5kOiAnYXN5bmMnLFxuICBhcmdHdWFyZHM6IEFyZ0d1YXJkTGlzdFNoYXBlLFxuICBvcHRpb25hbEFyZ0d1YXJkczogTS5vcHQoQXJnR3VhcmRMaXN0U2hhcGUpLFxuICByZXN0QXJnR3VhcmQ6IE0ub3B0KFN5bmNWYWx1ZUd1YXJkU2hhcGUpLFxuICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbn0pO1xuXG4gICAgICAgY29uc3QgTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSBNLm9yKFxuICBTeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4gIEFzeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4pOyRozY9fb25jZS5NZXRob2RHdWFyZFBheWxvYWRTaGFwZShNZXRob2RHdWFyZFBheWxvYWRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBNZXRob2RHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDptZXRob2RHdWFyZCcpO1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5NZXRob2RHdWFyZFNoYXBlKE1ldGhvZEd1YXJkU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydE1ldGhvZEd1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIE1ldGhvZEd1YXJkU2hhcGUsICdtZXRob2RHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0TWV0aG9kR3VhcmQoYXNzZXJ0TWV0aG9kR3VhcmQpO1xuaGFyZGVuKGFzc2VydE1ldGhvZEd1YXJkKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VNZXRob2RHdWFyZE1ha2VyID0gKFxuICBjYWxsS2luZCxcbiAgYXJnR3VhcmRzLFxuICBvcHRpb25hbEFyZ0d1YXJkcyA9IHVuZGVmaW5lZCxcbiAgcmVzdEFyZ0d1YXJkID0gdW5kZWZpbmVkLFxuKSA9PlxuICBoYXJkZW4oe1xuICAgIG9wdGlvbmFsOiAoLi4ub3B0QXJnR3VhcmRzKSA9PiB7XG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG4gICAgICByZXN0QXJnR3VhcmQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYG9wdGlvbmFsIGFyZyBndWFyZHMgbXVzdCBjb21lIGJlZm9yZSByZXN0IGFyZ2A7XG4gICAgICByZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoY2FsbEtpbmQsIGFyZ0d1YXJkcywgb3B0QXJnR3VhcmRzKTtcbiAgICB9LFxuICAgIHJlc3Q6IHJBcmdHdWFyZCA9PiB7XG4gICAgICByZXN0QXJnR3VhcmQgPT09IHVuZGVmaW5lZCB8fCBGYWlsYENhbiBvbmx5IGhhdmUgb25lIHJlc3QgYXJnYDtcbiAgICAgIHJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihcbiAgICAgICAgY2FsbEtpbmQsXG4gICAgICAgIGFyZ0d1YXJkcyxcbiAgICAgICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgICAgIHJBcmdHdWFyZCxcbiAgICAgICk7XG4gICAgfSxcbiAgICByZXR1cm5zOiAocmV0dXJuR3VhcmQgPSBNLnVuZGVmaW5lZCgpKSA9PiB7XG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnZ3VhcmQ6bWV0aG9kR3VhcmQnLCB7XG4gICAgICAgIGNhbGxLaW5kLFxuICAgICAgICBhcmdHdWFyZHMsXG4gICAgICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICAgICAgICByZXN0QXJnR3VhcmQsXG4gICAgICAgIHJldHVybkd1YXJkLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnRNZXRob2RHdWFyZChyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9KTtcblxuICAgICAgIGNvbnN0IEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGludGVyZmFjZU5hbWU6IE0uc3RyaW5nKCksXG4gICAgbWV0aG9kR3VhcmRzOiBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE1ldGhvZEd1YXJkU2hhcGUpLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdEd1YXJkczogTS5vcihNLnVuZGVmaW5lZCgpLCAncGFzc2FibGUnLCAncmF3JyksXG4gICAgc2xvcHB5OiBNLmJvb2xlYW4oKSxcbiAgICBzeW1ib2xNZXRob2RHdWFyZHM6IE0ubWFwT2YoTS5zeW1ib2woKSwgTWV0aG9kR3VhcmRTaGFwZSksXG4gIH0sXG4pOyRozY9fb25jZS5JbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZShJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBJbnRlcmZhY2VHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDppbnRlcmZhY2VHdWFyZCcpO1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5JbnRlcmZhY2VHdWFyZFNoYXBlKEludGVyZmFjZUd1YXJkU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydEludGVyZmFjZUd1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIEludGVyZmFjZUd1YXJkU2hhcGUsICdpbnRlcmZhY2VHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0SW50ZXJmYWNlR3VhcmQoYXNzZXJ0SW50ZXJmYWNlR3VhcmQpO1xuaGFyZGVuKGFzc2VydEludGVyZmFjZUd1YXJkKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VJbnRlcmZhY2VHdWFyZCA9IChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7IHNsb3BweSA9IGZhbHNlLCBkZWZhdWx0R3VhcmRzID0gc2xvcHB5ID8gJ3Bhc3NhYmxlJyA6IHVuZGVmaW5lZCB9ID1cbiAgICBvcHRpb25zO1xuICAvL1xuICAvL1xuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3RyaW5nTWV0aG9kR3VhcmRzID0ge307XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcyA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBvd25LZXlzKG1ldGhvZEd1YXJkcykpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1ldGhvZEd1YXJkc1svKiAgICAgICAgICAgICAgICAgKi8gKGtleSldO1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3ltYm9sJykge1xuICAgICAgc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmluZ01ldGhvZEd1YXJkc1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOmludGVyZmFjZUd1YXJkJywge1xuICAgIGludGVyZmFjZU5hbWUsXG4gICAgbWV0aG9kR3VhcmRzOiBzdHJpbmdNZXRob2RHdWFyZHMsXG4gICAgLi4uKHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMubGVuZ3RoXG4gICAgICA/IHsgc3ltYm9sTWV0aG9kR3VhcmRzOiBtYWtlQ29weU1hcChzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzKSB9XG4gICAgICA6IHt9KSxcbiAgICBkZWZhdWx0R3VhcmRzLFxuICB9KTtcbiAgYXNzZXJ0SW50ZXJmYWNlR3VhcmQocmVzdWx0KTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChyZXN1bHQpO1xufTtcblxuY29uc3QgR3VhcmRQYXlsb2FkU2hhcGVzID0gaGFyZGVuKHtcbiAgJ2d1YXJkOmF3YWl0QXJnR3VhcmQnOiBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlLFxuICAnZ3VhcmQ6cmF3R3VhcmQnOiBSYXdHdWFyZFBheWxvYWRTaGFwZSxcbiAgJ2d1YXJkOm1ldGhvZEd1YXJkJzogTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4gICdndWFyZDppbnRlcmZhY2VHdWFyZCc6IEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlLFxufSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0TGltaXRzIjpbImRlZmF1bHRMaW1pdHMiXSwiY2hlY2tNYXRjaGVzIjpbImNoZWNrTWF0Y2hlcyJdLCJtYXRjaGVzIjpbIm1hdGNoZXMiXSwibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiJdLCJnZXRSYW5rQ292ZXIiOlsiZ2V0UmFua0NvdmVyIl0sIk0iOlsiTSJdLCJraW5kT2YiOlsia2luZE9mIl0sImNvbnRhaW5lckhhc1NwbGl0IjpbImNvbnRhaW5lckhhc1NwbGl0Il0sIkF3YWl0QXJnR3VhcmRTaGFwZSI6WyJBd2FpdEFyZ0d1YXJkU2hhcGUiXSwiaXNBd2FpdEFyZ0d1YXJkIjpbImlzQXdhaXRBcmdHdWFyZCJdLCJhc3NlcnRBd2FpdEFyZ0d1YXJkIjpbImFzc2VydEF3YWl0QXJnR3VhcmQiXSwiUmF3R3VhcmRTaGFwZSI6WyJSYXdHdWFyZFNoYXBlIl0sImlzUmF3R3VhcmQiOlsiaXNSYXdHdWFyZCJdLCJhc3NlcnRSYXdHdWFyZCI6WyJhc3NlcnRSYXdHdWFyZCJdLCJTeW5jVmFsdWVHdWFyZFNoYXBlIjpbIlN5bmNWYWx1ZUd1YXJkU2hhcGUiXSwiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiOlsiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiXSwiQXJnR3VhcmRMaXN0U2hhcGUiOlsiQXJnR3VhcmRMaXN0U2hhcGUiXSwiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiOlsiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiXSwiTWV0aG9kR3VhcmRTaGFwZSI6WyJNZXRob2RHdWFyZFNoYXBlIl0sImFzc2VydE1ldGhvZEd1YXJkIjpbImFzc2VydE1ldGhvZEd1YXJkIl0sIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIjpbIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIl0sIkludGVyZmFjZUd1YXJkU2hhcGUiOlsiSW50ZXJmYWNlR3VhcmRTaGFwZSJdLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCI6WyJhc3NlcnRJbnRlcmZhY2VHdWFyZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAiAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA/RdPfYgYAAGIGAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQsbWVtb1JhY2U7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLFskaM2PX2EgPT4gKG1lbW9SYWNlID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCduYW1lJyx7dmFsdWU6XCJtYWtlUHJvbWlzZUtpdFwifSk7JGjNj19vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCduYW1lJyx7dmFsdWU6XCJyYWNlUHJvbWlzZXNcIn0pOyRozY9fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTtcblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2UgPSBnbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlIHx8IFByb21pc2U7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlUHJvbWlzZUtpdCgpIHtcbiAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0gPSBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuICBjb25zdCBwcm9taXNlID0gbmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfSk7XG59XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiByYWNlUHJvbWlzZXModmFsdWVzKSB7XG4gIHJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLCB2YWx1ZXMpKTtcbn1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1iEF+ZAIAAGQCAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsJ25hbWUnLHt2YWx1ZTpcImlzUHJvbWlzZVwifSk7JGjNj19vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOy8qXG5cblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIGlzUHJvbWlzZShtYXliZVByb21pc2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpID09PSBtYXliZVByb21pc2U7XG59XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2pkZOaUJAAClCQAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBpc1ByaW1pdGl2ZSA9IHZhbCA9PlxuICAhdmFsIHx8ICh0eXBlb2YgdmFsICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsICE9PSAnZnVuY3Rpb24nKTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGtub3duUHJvbWlzZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFya1NldHRsZWQgPSByZWNvcmQgPT4ge1xuICBpZiAoIXJlY29yZCB8fCByZWNvcmQuc2V0dGxlZCkge1xuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cblxuICBjb25zdCB7IGRlZmVycmVkcyB9ID0gcmVjb3JkO1xuICBPYmplY3QuYXNzaWduKHJlY29yZCwge1xuICAgIGRlZmVycmVkczogdW5kZWZpbmVkLFxuICAgIHNldHRsZWQ6IHRydWUsXG4gIH0pO1xuICBPYmplY3QuZnJlZXplKHJlY29yZCk7XG4gIHJldHVybiBkZWZlcnJlZHM7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkID0gdmFsdWUgPT4ge1xuICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgc2V0dGxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIGxldCByZWNvcmQgPSBrbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZWNvcmQgPSB7IGRlZmVycmVkczogbmV3IFNldCgpLCBzZXR0bGVkOiBmYWxzZSB9O1xuICAgIGtub3duUHJvbWlzZXMuc2V0KHZhbHVlLCByZWNvcmQpO1xuICAgIC8vXG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuICAgICAgdmFsID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlc29sdmUgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlamVjdCB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCB7IHJhY2UgfSA9IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICByYWNlKHZhbHVlcykge1xuICAgIGxldCBkZWZlcnJlZDtcbiAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICAvL1xuICAgIGNvbnN0IGNhY2hlZFZhbHVlcyA9IFtdO1xuICAgIGNvbnN0IEMgPSB0aGlzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBDKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRlZmVycmVkID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgY29uc3QgeyBzZXR0bGVkLCBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoc2V0dGxlZCkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBDLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiByZXN1bHQuZmluYWxseSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcykge1xuICAgICAgICBjb25zdCB7IGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChkZWZlcnJlZHMpIHtcbiAgICAgICAgICBkZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTskaM2PX29uY2UucmFjZShyYWNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjBsiNR8GAAAfBgAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgaW50ZXJuYWxSZXNvbHZlO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbnRlcm5hbFJlamVjdDtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCByZXNvbHZlID0gdmFsdWUgPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlc29sdmUpIHtcbiAgICAgIGludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG4gICAgICBpbnRlcm5hbFJlc29sdmUgPSBudWxsO1xuICAgICAgaW50ZXJuYWxSZWplY3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlamVjdCA9IHJlYXNvbiA9PiB7XG4gICAgaWYgKGludGVybmFsUmVqZWN0KSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChyZWFzb24pO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVqZWN0ID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZXhlY3V0b3IgPSAocmVzLCByZWopID0+IHtcbiAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSB1bmRlZmluZWQgJiYgaW50ZXJuYWxSZWplY3QgPT09IHVuZGVmaW5lZCk7XG4gICAgaW50ZXJuYWxSZXNvbHZlID0gcmVzO1xuICAgIGludGVybmFsUmVqZWN0ID0gcmVqO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0pO1xufTskaM2PX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEnYVh64FAAAuBQAAB0AAABAZW5kby9zdHJlYW0tdjEuMi4xMy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJtYWtlUGlwZSIsIm1ha2VRdWV1ZSIsIm1ha2VTdHJlYW0iLCJtYXBSZWFkZXIiLCJtYXBXcml0ZXIiLCJwcmltZSIsInB1bXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLG1ha2VQcm9taXNlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vL1xuLy9cbi8vXG5jb25zdCBmcmVlemUgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChPYmplY3QuZnJlZXplKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlUXVldWUgPSAoKSA9PiB7XG4gIGxldCB7IHByb21pc2U6IHRhaWxQcm9taXNlLCByZXNvbHZlOiB0YWlsUmVzb2x2ZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgcmV0dXJuIHtcbiAgICBwdXQodmFsdWUpIHtcbiAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcHJvbWlzZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgIHRhaWxSZXNvbHZlKGZyZWV6ZSh7IHZhbHVlLCBwcm9taXNlIH0pKTtcbiAgICAgIHRhaWxSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB9LFxuICAgIGdldCgpIHtcbiAgICAgIGNvbnN0IHByb21pc2UgPSB0YWlsUHJvbWlzZS50aGVuKG5leHQgPT4gbmV4dC52YWx1ZSk7XG4gICAgICB0YWlsUHJvbWlzZSA9IHRhaWxQcm9taXNlLnRoZW4obmV4dCA9PiBuZXh0LnByb21pc2UpO1xuICAgICAgcmV0dXJuIGhhcmRlbihwcm9taXNlKTtcbiAgICB9LFxuICB9O1xufTskaM2PX29uY2UubWFrZVF1ZXVlKG1ha2VRdWV1ZSk7XG5oYXJkZW4obWFrZVF1ZXVlKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTdHJlYW0gPSAoYWNrcywgZGF0YSkgPT4ge1xuICBjb25zdCBzdHJlYW0gPSBoYXJkZW4oe1xuICAgIC8qXG5cbiAgICAgKi9cbiAgICBuZXh0KHZhbHVlKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGRhdGEucHV0KGZyZWV6ZSh7IHZhbHVlLCBkb25lOiBmYWxzZSB9KSk7XG4gICAgICByZXR1cm4gYWNrcy5nZXQoKTtcbiAgICB9LFxuICAgIC8qXG5cbiAgICAgKi9cbiAgICByZXR1cm4odmFsdWUpIHtcbiAgICAgIGRhdGEucHV0KGZyZWV6ZSh7IHZhbHVlLCBkb25lOiB0cnVlIH0pKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgLypcblxuICAgICAqL1xuICAgIHRocm93KGVycm9yKSB7XG4gICAgICBkYXRhLnB1dChoYXJkZW4oUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG4gICAgICByZXR1cm4gYWNrcy5nZXQoKTtcbiAgICB9LFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufTskaM2PX29uY2UubWFrZVN0cmVhbShtYWtlU3RyZWFtKTtcbmhhcmRlbihtYWtlU3RyZWFtKTtcblxuLy9cbi8vXG4vL1xuICAgICAgIGNvbnN0IG1ha2VQaXBlID0gKCkgPT4ge1xuICBjb25zdCBkYXRhID0gbWFrZVF1ZXVlKCk7XG4gIGNvbnN0IGFja3MgPSBtYWtlUXVldWUoKTtcbiAgY29uc3QgcmVhZGVyID0gbWFrZVN0cmVhbShhY2tzLCBkYXRhKTtcbiAgY29uc3Qgd3JpdGVyID0gbWFrZVN0cmVhbShkYXRhLCBhY2tzKTtcbiAgcmV0dXJuIGhhcmRlbihbd3JpdGVyLCByZWFkZXJdKTtcbn07JGjNj19vbmNlLm1ha2VQaXBlKG1ha2VQaXBlKTtcbmhhcmRlbihtYWtlUGlwZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHB1bXAgPSBhc3luYyAod3JpdGVyLCByZWFkZXIsIHByaW1lcikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHRpY2sgPSBwcm9taXNlID0+XG4gICAgRS53aGVuKFxuICAgICAgcHJvbWlzZSxcbiAgICAgIHJlc3VsdCA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHJldHVybiB3cml0ZXIucmV0dXJuKHJlc3VsdC52YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiB0b2NrKHdyaXRlci5uZXh0KHJlc3VsdC52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKC8qICAgICAgICAgICAgICAgICovIGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuICAgICAgfSxcbiAgICApO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgdG9jayA9IHByb21pc2UgPT5cbiAgICBFLndoZW4oXG4gICAgICBwcm9taXNlLFxuICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHJlYWRlci5yZXR1cm4ocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGljayhyZWFkZXIubmV4dChyZXN1bHQudmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgvKiAgICAgICAgICAgICAgICAqLyBlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gcmVhZGVyLnRocm93KGVycm9yKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgYXdhaXQgdGljayhyZWFkZXIubmV4dChwcmltZXIpKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07JGjNj19vbmNlLnB1bXAocHVtcCk7XG5oYXJkZW4ocHVtcCk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJpbWUgPSAoZ2VuZXJhdG9yLCBwcmltZXIpID0+IHtcbiAgLy9cbiAgY29uc3QgZmlyc3QgPSBnZW5lcmF0b3IubmV4dChwcmltZXIpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCByZXN1bHQ7XG4gIGNvbnN0IHByaW1lZCA9IGhhcmRlbih7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGFzeW5jIG5leHQodmFsdWUpIHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvL1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBmaXJzdDtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdlbmVyYXRvci5uZXh0KHZhbHVlKTtcbiAgICB9LFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgYXN5bmMgcmV0dXJuKHZhbHVlKSB7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmlyc3Q7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBnZW5lcmF0b3IucmV0dXJuKHZhbHVlKTtcbiAgICB9LFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGFzeW5jIHRocm93KGVycm9yKSB7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgZmlyc3Q7XG4gICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLnRocm93KGVycm9yKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHByaW1lZDtcbn07JGjNj19vbmNlLnByaW1lKHByaW1lKTtcbmhhcmRlbihwcmltZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFwUmVhZGVyID0gKHJlYWRlciwgdHJhbnNmb3JtKSA9PiB7XG4gIGFzeW5jIGZ1bmN0aW9uKiB0cmFuc2Zvcm1HZW5lcmF0b3IoKSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiByZWFkZXIpIHtcbiAgICAgIHlpZWxkIHRyYW5zZm9ybSh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaGFyZGVuKHRyYW5zZm9ybUdlbmVyYXRvcik7XG4gIHJldHVybiBoYXJkZW4odHJhbnNmb3JtR2VuZXJhdG9yKCkpO1xufTskaM2PX29uY2UubWFwUmVhZGVyKG1hcFJlYWRlcik7XG5oYXJkZW4obWFwUmVhZGVyKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYXBXcml0ZXIgPSAod3JpdGVyLCB0cmFuc2Zvcm0pID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtZWRXcml0ZXIgPSBoYXJkZW4oe1xuICAgIC8qXG5cbiAgICAgKi9cbiAgICBhc3luYyBuZXh0KHZhbHVlKSB7XG4gICAgICByZXR1cm4gd3JpdGVyLm5leHQodHJhbnNmb3JtKHZhbHVlKSk7XG4gICAgfSxcbiAgICAvKlxuXG4gICAgICovXG4gICAgYXN5bmMgdGhyb3coZXJyb3IpIHtcbiAgICAgIHJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuICAgIH0sXG4gICAgLypcblxuICAgICAqL1xuICAgIGFzeW5jIHJldHVybih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHdyaXRlci5yZXR1cm4odmFsdWUpO1xuICAgIH0sXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHRyYW5zZm9ybWVkV3JpdGVyO1xufTskaM2PX29uY2UubWFwV3JpdGVyKG1hcFdyaXRlcik7XG5oYXJkZW4obWFwV3JpdGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VRdWV1ZSI6WyJtYWtlUXVldWUiXSwibWFrZVN0cmVhbSI6WyJtYWtlU3RyZWFtIl0sIm1ha2VQaXBlIjpbIm1ha2VQaXBlIl0sInB1bXAiOlsicHVtcCJdLCJwcmltZSI6WyJwcmltZSJdLCJtYXBSZWFkZXIiOlsibWFwUmVhZGVyIl0sIm1hcFdyaXRlciI6WyJtYXBXcml0ZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7lv2v9EBAADRAQAAHAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL21haW4uanN7ImltcG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vcmluZzAvbWFpbi5qc1wiLCBbXV0sW1wiLi9yaW5nMS9tYWluLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPZgJeSBAQAAgQEAAB8AAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9FLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIkBlbmRvL2ZhciJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAT1r1vaYCAACmAgAALAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhc3luY0dlbmVyYXRlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3luY0dlbmVyYXRlID0gbmV4dCA9PiB7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiBhc3luYyAoKSA9PiBoYXJkZW4obmV4dCgpKSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UuYXN5bmNHZW5lcmF0ZShhc3luY0dlbmVyYXRlKTtcbmhhcmRlbihhc3luY0dlbmVyYXRlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jR2VuZXJhdGUiOlsiYXN5bmNHZW5lcmF0ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD+evn99AEAAPQBAAAiAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFpbi5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL21ha2Vycy5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL0UuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIiwiLi9tYWtlcnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtdXSxbXCIuL21ha2Vycy5qc1wiLCBbXV0sW1wiLi9hc3luYy1nZW5lcmF0ZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABJaCFQ5AcAAOQHAAAkAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFrZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlTWFwIiwibWFrZVByb21pc2UiLCJtYWtlU2V0IiwibWFrZVdlYWtNYXAiLCJtYWtlV2Vha1NldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQcm9taXNlID0gZXhlY3V0b3IgPT4gaGFyZGVuKG5ldyBQcm9taXNlKGV4ZWN1dG9yKSk7JGjNj19vbmNlLm1ha2VQcm9taXNlKG1ha2VQcm9taXNlKTtcbmhhcmRlbihtYWtlUHJvbWlzZSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBtYWtlTWFwID0gZW50cmllc09ySXRlcmFibGUgPT4gaGFyZGVuKG5ldyBNYXAoZW50cmllc09ySXRlcmFibGUpKTskaM2PX29uY2UubWFrZU1hcChtYWtlTWFwKTtcbmhhcmRlbihtYWtlTWFwKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBtYWtlU2V0ID0gdmFsdWVzID0+IGhhcmRlbihuZXcgU2V0KHZhbHVlcykpOyRozY9fb25jZS5tYWtlU2V0KG1ha2VTZXQpO1xuaGFyZGVuKG1ha2VTZXQpO1xuXG4vKlxuXG5cblxuICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtNYXAgPSBlbnRyaWVzID0+IGhhcmRlbihuZXcgV2Vha01hcChlbnRyaWVzKSk7JGjNj19vbmNlLm1ha2VXZWFrTWFwKG1ha2VXZWFrTWFwKTtcbmhhcmRlbihtYWtlV2Vha01hcCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrU2V0ID0gdmFsdWVzID0+IGhhcmRlbihuZXcgV2Vha1NldCh2YWx1ZXMpKTskaM2PX29uY2UubWFrZVdlYWtTZXQobWFrZVdlYWtTZXQpO1xuaGFyZGVuKG1ha2VXZWFrU2V0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlIjpbIm1ha2VQcm9taXNlIl0sIm1ha2VNYXAiOlsibWFrZU1hcCJdLCJtYWtlU2V0IjpbIm1ha2VTZXQiXSwibWFrZVdlYWtNYXAiOlsibWFrZVdlYWtNYXAiXSwibWFrZVdlYWtTZXQiOlsibWFrZVdlYWtTZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAafVS/6wDAACsAwAAKQAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzeyJpbXBvcnRzIjpbIi4uL3JpbmcwL21haW4uanMiXSwiZXhwb3J0cyI6WyJhc3luY0RvV2hpbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlUHJvbWlzZTskaM2PX2ltcG9ydHMoW1tcIi4uL3JpbmcwL21haW4uanNcIiwgW1tcIm1ha2VQcm9taXNlXCIsWyRozY9fYSA9PiAobWFrZVByb21pc2UgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3luY0RvV2hpbGUgPSBib2R5ID0+IHtcbiAgcmV0dXJuIG1ha2VQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBsb29wID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZG9Db250aW51ZSA9IGF3YWl0IGJvZHkoKTtcbiAgICAgIGlmICghZG9Db250aW51ZSkge1xuICAgICAgICAvL1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBsb29wKCkuY2F0Y2gocmVqZWN0KTtcbiAgICB9O1xuXG4gICAgbG9vcCgpLmNhdGNoKHJlamVjdCk7XG4gIH0pO1xufTskaM2PX29uY2UuYXN5bmNEb1doaWxlKGFzeW5jRG9XaGlsZSk7XG5oYXJkZW4oYXN5bmNEb1doaWxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jRG9XaGlsZSI6WyJhc3luY0RvV2hpbGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAG2g3A5YBAACWAQAAIgAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL21haW4uanN7ImltcG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9hc3luYy10b29scy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAADPflk9DKAEAQygBABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAADGASPiNAQAAjQEAACAAAAAAAAAAAAAAAKSBdSgBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9oZWFwLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAAAAAAAAAAAAAKSBQCoBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAAAE88KdzwoAAM8KAAAkAAAAAAAAAAAAAACkgd0rAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2hlYXAuanNQSwECHgMKAAAAAAAAAAAAFW6x+nkCAAB5AgAAJQAAAAAAAAAAAAAApIHuNgEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAA5fdIMdAIAAHQCAAArAAAAAAAAAAAAAACkgao5AQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2lzLXBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAMuP7MWYAwAAmAMAACQAAAAAAAAAAAAAAKSBZzwBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMva2V5cy5qc1BLAQIeAwoAAAAAAAAAAAAa7pnbpQcAAKUHAAApAAAAAAAAAAAAAACkgUFAAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL21ha2Utb25jZS5qc1BLAQIeAwoAAAAAAAAAAAAEhfZHUQwAAFEMAAAyAAAAAAAAAAAAAACkgS1IAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3ByZXBhcmUtYXR0ZW51YXRvci5qc1BLAQIeAwoAAAAAAAAAAACJVBCFgQoAAIEKAAAxAAAAAAAAAAAAAACkgc5UAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAJVLZf3bCQAA2wkAAC0AAAAAAAAAAAAAAKSBnl8BAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvd2F0Y2gtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAABsJLBqFgIAABYCAAAoAAAAAAAAAAAAAACkgcRpAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvem9uZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAENwWSWjHwAAox8AACYAAAAAAAAAAAAAAKSBIGwBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzUEsBAh4DCgAAAAAAAAAAABMaWlIxBAAAMQQAACcAAAAAAAAAAAAAAKSBB4wBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAC4O4ykBwYAAAcGAAAnAAAAAAAAAAAAAACkgX2QAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanNQSwECHgMKAAAAAAAAAAAA819NA00CAABNAgAAIQAAAAAAAAAAAAAApIHJlgEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAJ1k6WEdGAAAHRgAACUAAAAAAAAAAAAAAKSBVZkBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pc3N1ZXJLaXQuanNQSwECHgMKAAAAAAAAAAAANOlQFBIGAAASBgAAOgAAAAAAAAAAAAAApIG1sQEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAChmPGE0AUAANAFAAA6AAAAAAAAAAAAAACkgR+4AQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAPNq9Tq7BAAAuwQAADYAAAAAAAAAAAAAAKSBR74BAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAACB+ofGmAYAAJgGAAA2AAAAAAAAAAAAAACkgVbDAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAnnszQckDAADJAwAAIwAAAAAAAAAAAAAApIFCygEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanNQSwECHgMKAAAAAAAAAAAAslt9GjAlAAAwJQAAKQAAAAAAAAAAAAAApIFMzgEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanNQSwECHgMKAAAAAAAAAAAACc2lSAcVAAAHFQAAIQAAAAAAAAAAAAAApIHD8wEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3B1cnNlLmpzUEsBAh4DCgAAAAAAAAAAAIkTInFgLQAAYC0AACEAAAAAAAAAAAAAAKSBCQkCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9yYXRpby5qc1BLAQIeAwoAAAAAAAAAAAA1u1HamAUAAJgFAAAkAAAAAAAAAAAAAACkgag2AgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvc2FmZU1hdGguanNQSwECHgMKAAAAAAAAAAAATZTGQzIGAAAyBgAALQAAAAAAAAAAAAAApIGCPAIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAHAbIY50GgAAdBoAACYAAAAAAAAAAAAAAKSB/0ICAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAAAAAAAAAAAAAKSBt10CAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAClEeiKogMAAKIDAAArAAAAAAAAAAAAAACkgVRfAgBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29uc3RhbnRzLmpzUEsBAh4DCgAAAAAAAAAAAEykTUgIDAAACAwAAD8AAAAAAAAAAAAAAKSBP2MCAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvYXNzZXJ0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAACrF38QGRAAABkQAAA+AAAAAAAAAAAAAACkgaRvAgBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qc1BLAQIeAwoAAAAAAAAAAAB0+y/c8A0AAPANAABBAAAAAAAAAAAAAACkgRmAAgBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc1BLAQIeAwoAAAAAAAAAAADPojHNOhQAADoUAABAAAAAAAAAAAAAAACkgWiOAgBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzUEsBAh4DCgAAAAAAAAAAAMjVj9+JNwAAiTcAAEEAAAAAAAAAAAAAAKSBAKMCAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzUEsBAh4DCgAAAAAAAAAAABojdIbiDgAA4g4AAEYAAAAAAAAAAAAAAKSB6NoCAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanNQSwECHgMKAAAAAAAAAAAAJz4lYVkTAABZEwAAMgAAAAAAAAAAAAAApIEu6gIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJub3IuanNQSwECHgMKAAAAAAAAAAAABxFuvmQqAABkKgAANQAAAAAAAAAAAAAApIHX/QIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanNQSwECHgMKAAAAAAAAAAAA9/KRvTMiAAAzIgAAMAAAAAAAAAAAAAAApIGOKAMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0SGVscGVyLmpzUEsBAh4DCgAAAAAAAAAAAOxRY/A9CQAAPQkAACcAAAAAAAAAAAAAAKSBD0sDAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADBiP6tnwwAAJ8MAAAqAAAAAAAAAAAAAACkgZFUAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvcXVlc3Rpb24uanNQSwECHgMKAAAAAAAAAAAA5nP7Lr0+AAC9PgAALAAAAAAAAAAAAAAApIF4YQMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAAZ03JdUJAADVCQAALAAAAAAAAAAAAAAApIF/oAMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3ZhbGlkYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAqAlI0jsUAAA7FAAAQgAAAAAAAAAAAAAApIGeqgMAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9wcmljZS9mbHV4QWdncmVnYXRvckNvbnRyYWN0LmpzUEsBAh4DCgAAAAAAAAAAAP3Vz2xrJwAAaycAAD0AAAAAAAAAAAAAAKSBOb8DAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvcHJpY2UvZmx1eEFnZ3JlZ2F0b3JLaXQuanNQSwECHgMKAAAAAAAAAAAAh+l7NxIOAAASDgAAOgAAAAAAAAAAAAAApIH/5gMAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9wcmljZS9wcmljZU9yYWNsZUtpdC5qc1BLAQIeAwoAAAAAAAAAAAA1GyG9pFcAAKRXAAA5AAAAAAAAAAAAAACkgWn1AwBAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ByaWNlL3JvdW5kc01hbmFnZXIuanNQSwECHgMKAAAAAAAAAAAApS7Mv3YWAAB2FgAANQAAAAAAAAAAAAAApIFkTQQAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9wcm9wb3NhbHMvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAUy3JVq8dAACvHQAAJwAAAAAAAAAAAAAApIEtZAQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NhbGxiYWNrLmpzUEsBAh4DCgAAAAAAAAAAALc+QRg0AwAANAMAACgAAAAAAAAAAAAAAKSBIYIEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jbGktdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAz7Ja43YGAAB2BgAAJQAAAAAAAAAAAAAApIGbhQQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NvbmZpZy5qc1BLAQIeAwoAAAAAAAAAAAC8BYikOwUAADsFAAAkAAAAAAAAAAAAAACkgVSMBABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvZGVidWcuanNQSwECHgMKAAAAAAAAAAAA+tsENbECAACxAgAAJQAAAAAAAAAAAAAApIHRkQQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2Vycm9ycy5qc1BLAQIeAwoAAAAAAAAAAACUr3eTpQQAAKUEAAAkAAAAAAAAAAAAAACkgcWUBABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAtIZysCMTAAAjEwAAJwAAAAAAAAAAAAAApIGsmQQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2pzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAEKFbaLpFwAA6RcAAC8AAAAAAAAAAAAAAKSBFK0EAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAABAvHn7vEgAA7xIAACYAAAAAAAAAAAAAAKSBSsUEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAG54O4xtBgAAbQYAACsAAAAAAAAAAAAAAKSBfdgEAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRob2QtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAsn2q0Mk2AADJNgAAJgAAAAAAAAAAAAAApIEz3wQAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldHJpY3MuanNQSwECHgMKAAAAAAAAAAAA5kesHwQFAAAEBQAAKwAAAAAAAAAAAAAApIFAFgUAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL25hdHVyYWwtc29ydC5qc1BLAQIeAwoAAAAAAAAAAADReBJM4CwAAOAsAAAoAAAAAAAAAAAAAACkgY0bBQBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvc2VzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAKMaFLHCBgAAwgYAACwAAAAAAAAAAAAAAKSBs0gFAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90ZXN0aW5nLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAACAjyqQXAwAAFwMAACUAAAAAAAAAAAAAAKSBv08FAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90bXBEaXIuanNQSwECHgMKAAAAAAAAAAAAsrKL9RsDAAAbAwAAKAAAAAAAAAAAAAAApIEZUwUAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVDaGVjay5qc1BLAQIeAwoAAAAAAAAAAAAPzMLEOgQAADoEAAApAAAAAAAAAAAAAACkgXpWBQBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAAAAAAAAAAACkgftaBQBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAAkna9+2kHAABpBwAAKgAAAAAAAAAAAAAApIGbXAUAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3VwZ3JhZGUtYXBpLmpzUEsBAh4DCgAAAAAAAAAAANCWSi3vCAAA7wgAADMAAAAAAAAAAAAAAKSBTGQFAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAADCPu246wcAAOsHAAAkAAAAAAAAAAAAAACkgYxtBQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAIb7LBCYTAAAmEwAAJwAAAAAAAAAAAAAApIG5dQUAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAAes8nreMgAA3jIAACoAAAAAAAAAAAAAAKSBJIkFAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAADWHCXvlQgAAJUIAAAuAAAAAAAAAAAAAACkgUq8BQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAEiVgML+FwAA/hcAACcAAAAAAAAAAAAAAKSBK8UFAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc1BLAQIeAwoAAAAAAAAAAAA5aH3YUhYAAFIWAAAoAAAAAAAAAAAAAACkgW7dBQBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlLmpzUEsBAh4DCgAAAAAAAAAAACOZfrg5CAAAOQgAACkAAAAAAAAAAAAAAKSBBvQFAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmVyLmpzUEsBAh4DCgAAAAAAAAAAAFs7BeJMBAAATAQAACQAAAAAAAAAAAAAAKSBhvwFAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90b3BpYy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAqAAAAAAAAAAAAAACkgRQBBgBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAAo5ImDRQHAAAUBwAALQAAAAAAAAAAAAAApIG0AgYAQGFnb3JpYy9ub3RpZmllci12MC42LjIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAGw0phvmDQAA5g0AACEAAAAAAAAAAAAAAKSBEwoGAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADDM4b0+gUAAPoFAAAsAAAAAAAAAAAAAACkgTgYBgBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc1BLAQIeAwoAAAAAAAAAAAADF7MbogUAAKIFAAAwAAAAAAAAAAAAAACkgXweBgBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNQSwECHgMKAAAAAAAAAAAAhqaMYgETAAABEwAAMQAAAAAAAAAAAAAApIFsJAYAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAC6QDqcDQ0AAA0NAAAxAAAAAAAAAAAAAACkgbw3BgBAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAFm5YLrEDwAAxA8AADUAAAAAAAAAAAAAAKSBGEUGAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAEDsUNbLCwAAywsAADUAAAAAAAAAAAAAAKSBL1UGAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAEXGRT2iEAAAohAAAC4AAAAAAAAAAAAAAKSBTWEGAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIQAAAAAAAAAAAAAApIE7cgYAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAO31mJswAgAAMAIAABwAAAAAAAAAAAAAAKSB0nMGAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAATMXEWc0VAADNFQAAIwAAAAAAAAAAAAAApIE8dgYAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdGltZU1hdGguanNQSwECHgMKAAAAAAAAAAAAOOUBfz0JAAA9CQAAJQAAAAAAAAAAAAAApIFKjAYAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAAAAAAAAAAACkgcqVBgBAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADDDFyKvxkAAL8ZAAAoAAAAAAAAAAAAAACkgWaXBgBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAM+c6+m2CAAAtggAACQAAAAAAAAAAAAAAKSBa7EGAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAvYSCWLhgAAC4YAAAwAAAAAAAAAAAAAACkgWO6BgBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAAndV/psgUAADIFAAAKAAAAAAAAAAAAAAApIHf0gYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY2xlYW5Qcm9wb3NhbC5qc1BLAQIeAwoAAAAAAAAAAAALAOvTYwYAAGMGAAA0AAAAAAAAAAAAAACkge3nBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzUEsBAh4DCgAAAAAAAAAAADSmWpCLBwAAiwcAADkAAAAAAAAAAAAAAKSBou4GAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qc1BLAQIeAwoAAAAAAAAAAACCIxKS5hAAAOYQAAA4AAAAAAAAAAAAAACkgYT2BgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qc1BLAQIeAwoAAAAAAAAAAAB1LOiupQoAAKUKAAA1AAAAAAAAAAAAAACkgcAHBwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qc1BLAQIeAwoAAAAAAAAAAAAf8+3SfAgAAHwIAAAwAAAAAAAAAAAAAACkgbgSBwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAR4TVCK4JAACuCQAAOgAAAAAAAAAAAAAApIGCGwcAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByZXBhcmUtb3duYWJsZS5qc1BLAQIeAwoAAAAAAAAAAADlJxlI+isAAPorAAA5AAAAAAAAAAAAAACkgYglBwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanNQSwECHgMKAAAAAAAAAAAA58fCAXEJAABxCQAANQAAAAAAAAAAAAAApIHZUQcAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanNQSwECHgMKAAAAAAAAAAAA/qF01VgcAABYHAAAMwAAAAAAAAAAAAAApIGdWwcAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzUEsBAh4DCgAAAAAAAAAAANW85poJBAAACQQAADcAAAAAAAAAAAAAAKSBRngHAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanNQSwECHgMKAAAAAAAAAAAASb1uYQMEAAADBAAANQAAAAAAAAAAAAAApIGkfAcAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanNQSwECHgMKAAAAAAAAAAAAUrvu/6MGAACjBgAAMQAAAAAAAAAAAAAApIH6gAcAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3RvcGljcy5qc1BLAQIeAwoAAAAAAAAAAACZUHHTiSUAAIklAAA1AAAAAAAAAAAAAACkgeyHBwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAACJTBynkQYAAJEGAAAlAAAAAAAAAAAAAACkgcitBwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9tYWtlSGFuZGxlLmpzUEsBAh4DCgAAAAAAAAAAAFiWqOenSAAAp0gAACUAAAAAAAAAAAAAAKSBnLQHAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAA2fSTtJYBAACWAQAAHgAAAAAAAAAAAAAApIGG/QcAQGFnb3JpYy96b25lLXYwLjIuMi9kdXJhYmxlLmpzUEsBAh4DCgAAAAAAAAAAACJbYPjnEQAA5xEAACIAAAAAAAAAAAAAAKSBWP8HAEBhZ29yaWMvem9uZS12MC4yLjIvc3JjL2R1cmFibGUuanNQSwECHgMKAAAAAAAAAAAA6MeBezAFAAAwBQAALAAAAAAAAAAAAAAApIF/EQgAQGVuZG8vY29tbW9uLXYxLjIuMTMvYXBwbHktbGFiZWxpbmctZXJyb3IuanNQSwECHgMKAAAAAAAAAAAAWciEf6UEAAClBAAAKwAAAAAAAAAAAAAApIH5FggAQGVuZG8vY29tbW9uLXYxLjIuMTMvZnJvbS11bmlxdWUtZW50cmllcy5qc1BLAQIeAwoAAAAAAAAAAADUTf83SgIAAEoCAAAlAAAAAAAAAAAAAACkgecbCABAZW5kby9jb21tb24tdjEuMi4xMy9pZGVudC1jaGVja2VyLmpzUEsBAh4DCgAAAAAAAAAAAIrXl0OQAgAAkAIAACcAAAAAAAAAAAAAAKSBdB4IAEBlbmRvL2NvbW1vbi12MS4yLjEzL2xpc3QtZGlmZmVyZW5jZS5qc1BLAQIeAwoAAAAAAAAAAAAulJoOtAMAALQDAAArAAAAAAAAAAAAAACkgUkhCABAZW5kby9jb21tb24tdjEuMi4xMy9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzUEsBAh4DCgAAAAAAAAAAAAWrzahcAgAAXAIAACUAAAAAAAAAAAAAAKSBRiUIAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtaXRlcmF0b3IuanNQSwECHgMKAAAAAAAAAAAAf1UUszQDAAA0AwAAIgAAAAAAAAAAAAAApIHlJwgAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1hcC5qc1BLAQIeAwoAAAAAAAAAAAB/Vi9SMgQAADIEAAAnAAAAAAAAAAAAAACkgVkrCABAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWV0YS1tYXAuanNQSwECHgMKAAAAAAAAAAAA8qpjsx4EAAAeBAAAJQAAAAAAAAAAAAAApIHQLwgAQGVuZG8vY29tbW9uLXYxLjIuMTMvdGhyb3ctbGFiZWxlZC5qc1BLAQIeAwoAAAAAAAAAAAA0oqGpogEAAKIBAAAiAAAAAAAAAAAAAACkgTE0CABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAABcY3PFUEAAAVBAAACwAAAAAAAAAAAAAAKSBEzYIAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvc3JjL2Vudi1vcHRpb25zLmpzUEsBAh4DCgAAAAAAAAAAAEk19ulUCAAAVAgAAB0AAAAAAAAAAAAAAKSBsUYIAEBlbmRvL2Vycm9ycy12MS4yLjEzL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAMmxgxkbFgAAGxYAACMAAAAAAAAAAAAAAKSBQE8IAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACkAAAAAAAAAAAAAAKSBnGUIAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAGRANevSDgAA0g4AACcAAAAAAAAAAAAAAKSBO2cIAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9sb2NhbC5qc1BLAQIeAwoAAAAAAAAAAAB5M+y4PA8AADwPAAA1AAAAAAAAAAAAAACkgVJ2CABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1BLAQIeAwoAAAAAAAAAAAC4dpSdXwMAAF8DAAApAAAAAAAAAAAAAACkgeGFCABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAADI7AdFyQoAAMkKAAAtAAAAAAAAAAAAAACkgYeJCABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAe6GgR2QCAABkAgAAIwAAAAAAAAAAAAAApIGblAgAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAA3EXZo2ACAABgAgAAGgAAAAAAAAAAAAAApIFAlwgAQGVuZG8vZXhvLXYxLjUuMTIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA4CDbws8XAADPFwAAIwAAAAAAAAAAAAAApIHYmQgAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by1tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAQo1B61o3AABaNwAAIgAAAAAAAAAAAAAApIHosQgAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by10b29scy5qc1BLAQIeAwoAAAAAAAAAAAA2LRmaTwIAAE8CAAAmAAAAAAAAAAAAAACkgYLpCABAZW5kby9leG8tdjEuNS4xMi9zcmMvZ2V0LWludGVyZmFjZS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAeAAAAAAAAAAAAAACkgRXsCABAZW5kby9leG8tdjEuNS4xMi9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIAAAAAAAAAAAAAAApIGp7QgAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAqSbWUJgCAACYAgAAHgAAAAAAAAAAAAAApIE/7wgAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHVGf9kHCAAABwgAAB0AAAAAAAAAAAAAAKSBE/IIAEBlbmRvL21hcnNoYWwtdjEuOC4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAP1d7XC2UAAAtlAAACoAAAAAAAAAAAAAAKSBVfoIAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAAA0iDJlBSwAAAUsAAArAAAAAAAAAAAAAACkgVNLCQBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzUEsBAh4DCgAAAAAAAAAAAFI/KfpULAAAVCwAAC0AAAAAAAAAAAAAAKSBoXcJAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc1BLAQIeAwoAAAAAAAAAAACyNkcF+jIAAPoyAAAqAAAAAAAAAAAAAACkgUCkCQBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1qdXN0aW4uanNQSwECHgMKAAAAAAAAAAAAviKnG0oHAABKBwAALQAAAAAAAAAAAAAApIGC1wkAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAAApbqfINLwAADS8AACMAAAAAAAAAAAAAAKSBF98JAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAM7YpjP6OgAA+joAACUAAAAAAAAAAAAAAKSBZQ4KAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIQAAAAAAAAAAAAAApIGiSQoAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAF6cs8rMBQAAzAUAAB0AAAAAAAAAAAAAAKSBOUsKAEBlbmRvL25hdC12NS4xLjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAG5u3nM2CwAANgsAACAAAAAAAAAAAAAAAKSBQFEKAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAEKQqxjGCAAAxggAACgAAAAAAAAAAAAAAKSBtFwKAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9ieXRlQXJyYXkuanNQSwECHgMKAAAAAAAAAAAAw+/2RbwGAAC8BgAAKAAAAAAAAAAAAAAApIHAZQoAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAADWqGmfHwkAAB8JAAApAAAAAAAAAAAAAACkgcJsCgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAAAjXccFhwwAAIcMAAAuAAAAAAAAAAAAAACkgSh2CgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAABdXAiLTFAAA0xQAACQAAAAAAAAAAAAAAKSB+4IKAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9lcnJvci5qc1BLAQIeAwoAAAAAAAAAAADTopB8pAYAAKQGAAArAAAAAAAAAAAAAACkgRCYCgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvaXRlci1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAGJ4eInZEgAA2RIAACcAAAAAAAAAAAAAAKSB/Z4KAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlLWZhci5qc1BLAQIeAwoAAAAAAAAAAABNwYjT3AQAANwEAAApAAAAAAAAAAAAAACkgRuyCgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZVRhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAABq8B9AkxcAAJMXAAAwAAAAAAAAAAAAAACkgT63CgBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAh0tIkigsAAAoLAAAKgAAAAAAAAAAAAAApIEfzwoAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAAHOHXHB0HwAAdB8AACgAAAAAAAAAAAAAAKSBj/sKAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAA9EGIER4OAAAeDgAAKwAAAAAAAAAAAAAApIFJGwsAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3NhZmUtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAC6Ps2heQgAAHkIAAAlAAAAAAAAAAAAAACkgbApCwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc3RyaW5nLmpzUEsBAh4DCgAAAAAAAAAAALMKECzcCwAA3AsAACUAAAAAAAAAAAAAAKSBbDILAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAA8uXyUMkHAADJBwAAJQAAAAAAAAAAAAAApIGLPgsAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAABRws6trhAAAK4QAAApAAAAAAAAAAAAAACkgZdGCwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAkAAAAAAAAAAAAAACkgYxXCwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAdU2S3O8OAADvDgAAHgAAAAAAAAAAAAAApIEmWQsAQGVuZG8vcGF0dGVybnMtdjEuNy4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALoyMIEkNAAAJDQAACoAAAAAAAAAAAAAAKSBUWgLAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAAA1RdJLvxkAAL8ZAAAtAAAAAAAAAAAAAACkgb2cCwBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29tcGFyZUtleXMuanNQSwECHgMKAAAAAAAAAAAAXNG2iOsOAADrDgAAKQAAAAAAAAAAAAAApIHHtgsAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlCYWcuanNQSwECHgMKAAAAAAAAAAAABxyd+3sMAAB7DAAAKQAAAAAAAAAAAAAApIH5xQsAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAAD8gfY3YWAAB2FgAAOQAAAAAAAAAAAAAApIG70gsAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAANICYgGRHAAAkRwAADUAAAAAAAAAAAAAAKSBiOkLAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAPlRjhNJIwAASSMAADUAAAAAAAAAAAAAAKSBbAYMAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAMKOGL8uGwAALhsAADYAAAAAAAAAAAAAAKSBCCoMAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc1BLAQIeAwoAAAAAAAAAAAAlnn3NYPEAAGDxAAA1AAAAAAAAAAAAAACkgYpFDABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAiAAAAAAAAAAAAAACkgT03DQBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAD9F099iBgAAYgYAACIAAAAAAAAAAAAAAKSB1TgNAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAdYhBfmQCAABkAgAAKwAAAAAAAAAAAAAApIF3Pw0AQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAADamRk5pQkAAKUJAAAqAAAAAAAAAAAAAACkgSRCDQBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9tZW1vLXJhY2UuanNQSwECHgMKAAAAAAAAAAAAjBsiNR8GAAAfBgAANQAAAAAAAAAAAAAApIERTA0AQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAAAAAAAAAAAApIGDUg0AQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAASdhWHrgUAAC4FAAAHQAAAAAAAAAAAAAApIEfVA0AQGVuZG8vc3RyZWFtLXYxLjIuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA7lv2v9EBAADRAQAAHAAAAAAAAAAAAAAApIESaQ0AamVzc2llLmpzLXYwLjMuNC9zcmMvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAAD2YCXkgQEAAIEBAAAfAAAAAAAAAAAAAACkgR1rDQBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9FLmpzUEsBAh4DCgAAAAAAAAAAAE9a9b2mAgAApgIAACwAAAAAAAAAAAAAAKSB22wNAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzUEsBAh4DCgAAAAAAAAAAAP56+f30AQAA9AEAACIAAAAAAAAAAAAAAKSBy28NAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21haW4uanNQSwECHgMKAAAAAAAAAAAASWghUOQHAADkBwAAJAAAAAAAAAAAAAAApIH/cQ0AamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAAGn1Uv+sAwAArAMAACkAAAAAAAAAAAAAAKSBJXoNAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAABtoNwOWAQAAlgEAACIAAAAAAAAAAAAAAKSBGH4NAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL21haW4uanNQSwUGAAAAAL4AvgCTQQAA7n8NAAAA","endoZipBase64Sha512":"c7552cd6622892166021633be858885e9a915373b1afa9083303afa793b5c7e76e20644ef7e8e877f274e3708f42d579d0d8c54ee2d73c79371592a4d511f30e"};