@agoric/spawner 0.6.9-u22.1 → 0.6.9-u22.2

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.
@@ -1 +1 @@
1
- export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAABh0S26BXQAAAV0AAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjIuMSIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi45LXUyMi4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjIuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi45LXUyMi4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtc3Bhd25lZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LXNwYXduZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YWJhMTIzYzA4MzcwZWEzZjI2ZDQ1NzU2MzY4NDY0ODE4NGY0NWIwN2RiNWJiN2YzODAwNGQ0M2Q3ZjdiZjM5ZDBmMDQyOWY3NTNhYjkzZjI0YTg4ZWFmMjc0MzIxYWM4N2I3OWU0ZDMyYTRlNGZiM2U2ZjRlZmQ0ZTRhYzNiNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vYmFzZTY0LXYxLjAuMTIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Jhc2U2NCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9iYXNlNjQtdjEuMC4xMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9iYXNlNjQtdjEuMC4xMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJhMTkwZWQ3ZDJhYzc1Njc4NGZlMGExMDM5MzAzZmZkOWJmMDM3YzQ0MGJiZDIyZmViYTBmNDZkYzAzZGM1YjYyMTYwZmJlZTlkNDA0ZGE4Y2JmOTJkMDE0ZDlkYTY5NWFmOWZlZTkwODU3NDM0Y2UyZGI4MDU3ZDE4ZjVhNWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2NjNjA4NTZhZDdkYjkwMDBlNzcyN2RhNjE0OTc4YjUwOGQ2MWZkYmQ0ZGM4MmI4MWQ0ZTM0M2UxZTEzOTJlY2JhODM5ZDQ2ZDA0OTJiMzQ1ZWE4YmFhNmZmODI2MTJiNThjZWMyYTc3ZjQ5OTc3YTY5MTc2NWQ2ZmMxNDU1MjQiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTRmYTc3NmNmM2NiZDE2ZGQ4MmQ1YzMzYzgxYzIzODMwYjYyODEwMDZhZGM3ODE4MDUxNmZiMmI4MWJlNjM0NThhZGNhNTQyZTU0YWY4MDdmMmRjNzdjM2ViZjA5YWVkZGFjOGRiZTlmZDk2NDQwNmY4NGE1YjY4YjEzNTZlNmQiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjk0Yjg2YWNlMDJkZGMyMjYxOTgxNTIxMWYyN2I5ZTczMmU5ZGRiZDZiMGZlYWM1MmU0Mjg1NjA1ZTk1ZTQxMWIzN2I3NTM5ZDFlNzZiMWM3Zjk4ZDJmYWRlNzlmZTcwNzFmZjgxZTc3YjQ5ZTQwYzJiOGU4ZWQyMTBlMzNkNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMxMzU4ODE5NjIzNTcwNzQ3ZDA1NjJhMjhjZjdjMmRhYTdjZjcxOGZiMDk5M2Y1ODc1N2FkZDQ5OWMwMzFkMTI4ZWU5MDEyNjBiODE5NTNjNGU5MDMyY2RhMzM4NjNiYzM4OTBjMTZjNGM1YjY5NDI4ZjRkY2RiZDg2NTM4OTZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjI2MGZlM2U4NzUyNGY5OGQ2MWQ3NjNhMzE2ZmNhMTZiMDc0OGMzMzQ3MWY3NTM1MTY4YTFmMGJkMGJiNjQ4Y2NkZTI5ZGFhMjkwNTIzMmUwNjczOTY4NzM1NjkzZmRhZDYxNjVjNmU3MmRlYjJjZjQ1ZWE3ZTFkZWE4OGRjYmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYzFlNmRiYWEyMDQwZWU5ZmIwNjViYzY2MjEzMjgyYzg1ODJhNzg2NDg0ZDBjYmE2ZDg1MzI4OWY1YjJlMTNmOWRkYzU2OTMxZTViOWMxZDExODUxYTMzN2JhNWQ0MjA2NGRhZTAwODVjZTRiMGQxMjE3NDQwOTM4MDI3MGZhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkxYmUyMjlkZGQwYTFhYmYyOTRmOGRiNmEyNjM1MjU4YjRhZWMzMmNjNzJmMzNkZTI4N2EwMTc1NWYyZjFhNDdiZjA3ZTc2MmFlZDhiMGMxM2JkMGUxZTc1NjhhOWI2YTQxNDI5ODJjMTkxYmRjN2I3MTI2YmMzYTFmZDQ3NjM5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi4xMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tbW9uIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpZGVudC1jaGVja2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTk3ZjE4OTMwNWZmMGU0ODc2ZmU1ZjRhOGRjZjg0ZTM4MzU2YjhhMzk1ZTllYWNkNzNiODk1N2NiMTkxMjE0NWI4NTc3OGFjYjcwNWYxMDAwYTI4MjhjZmFiNzcwNWY5NWNmNGQxOGQ0OGI2MGVlODQxMTE3MDNiNmNhMzdhOWIiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm9iamVjdC1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjNlZjFiMGI5NGI3MGQ1NTJhNDNiYmRhMWFjNDZmYmFhZDU2OGVlMDI0ODEzZThlNWQ4MjAyNWMxMTZkNGExNzkzMzcxM2NiMzQwMjc1ODU5ZmIzYmUzZjVhMzk3NGFlNjU2ZWYxYmViMDFhYTBlZmEwNWU4MGJlNWMwOGQwNiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby90cmFtcG9saW5lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3RyYW1wb2xpbmUtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjZhN2QzMjkzZjQzODJhZWI1YmE2Y2EzNDE2ODc1ZDQwZGZiMGQ2NDI0ZTg5YzA4MDk3NDFjYTQ3NDVlOWM2NmIyNjhlYWY1MjI5ZWY2YmNkNjIzZTg5ODc2Njg2ODI4MDViMjJiNzJhOWI3YjQwZTY1MDk4NWQyMGNhZjU4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wYXJ0bWVudC1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE1OTU5MWE4ZTM2YWQxNmM0NmZlNmVjYzM0MDExZmJiZDhkNGZkMDkxNjA0ZDM5MTM1N2E0YjA4NzBiMTJlNjgxMTViM2FkYjg2MDFkNmZlYTlhYjhjMWJlMjFlMDczYWE4ZGU4OWM5NDNiYzMzMWE4NjQ5NjgwNWY0NzAwNTEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4dGVuc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXh0ZW5zaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzRkYjAxM2JhMzVhYWM3YjJlNDNmNTk1NzBlNTcxYWUyZmQ4M2RjOGRmOTA2YWM5NzY3YjM5N2I2MTAxMmY0NmQzMjU0NmE1OWViNzg2YjRiNzliZmVkYTczZDNhMzljMTBjYTkwMGEyNjBjMjQxN2Y0YjVlZTgxZjAxYTA2OWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA1ZTkyMzhmYzZhMmFhNzFkM2NmNzE3NjBlNGRhNTBhYjQ4NGVhZGY5MWM3MDlmZjE0ZTUzZjk4N2UwNzI4Njk2OTNjMWNlYjJkNTM5YTIxNDY2ZjE5NGQ0ZjE2NWFhMzc1ZjhiYjY1OGJmMDM2M2Q5NmE4N2ZmMTYwNmQzNDVkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Yjk5MDdmMjg0MmQzMzMwZThhMTE4ODNjMDg4OGRjZTk0ZTUwODdlNTAxNDBkNmM0Y2EwM2U0YzE3ZmUzZGI4YWRjZmExMjY0YWNhOWEzMjhjODBmZTQ5NmRkZWRjMGZhNTc0M2VhYjBiYWQyYjhkMjlhNmRlZmZiMWQwMTY4ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZmFhZTM2NTAzYmU1OTczOGY2OTE5MTdmMjU3OGEzYWRiNWE5ZTU4NGFkOWMzYjdhMTVmNDE0MjMyZjMwNTA3NmY3ZWM3YjJiMmU5ZGMxY2RjYTAzMzcxYzYyNjFmZWNiMDc2ZTU5ZmExYjhlMGJlOWRlNzljODBjMTg0YTE0YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtaG9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWhvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YTYxNDZjYzljOTYzZTYzMTMxZjAyYTU4ZGVmMTc2ZDU3YjU0ZmY4OGFjMTg3ODVkZmU3NGU1MjI3NzFlNjhmOWJlMTY1ODVhZGUwNWM1YWQxYWQwYzdmNDQ1NWUyNDU0OGJiZGU0MmE5MDI4NmFiYWQ0ZDgwMjUzMWNiYmVmMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTExMWExNGQzNmYzZTJkYzlmOGU2MjI4MmE4ZGYzNzQ4Y2Q1MWUxYjQ3NzRiNGZmYmIwNGUxNDhhZDA5ODhlNjVhYTZkODgyMGM5OGViODliOTFhMTUzZDM1MmRlYmM2YjM1MjVkNjY4NTA2NjJlYTViOGZhMDY3NzZkMTgzYzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhiMWMzNDQ0OTg2MzcxMzI3YTJlMTIzOWVhOTdjOTczNGRkNTgzMGU5MmFhMTNkMDliZDg0NzZiMWE2M2YzYzJjYWY3Y2Y0YTBlYzkxM2I5Y2VmNTc0MTgyMDhiMGU2OTdkOTY0M2M3ZjdlMjcwYTdmYTZlYTIyYmY1YWM0MTc2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcC1wYXJzZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcC1wYXJzZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYTY3ZmIzYjdkZmQwOWU3OWJmMzc5YzEzYjVhYzllMzU3MDg0ZDNlNGU0M2MxMmMzMjdiZTJiNGRkNDgzZTExZmYzZTdkODQ4MWEzYWJkMzgxY2FlNzVjZGZmYjNiNTcxMjlmNGNhZGViM2E4Y2MyMTkwYWZiMjU4MzQwNDUwYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0NGE4M2QzNjczNTY5MWYxOGIxMmE3ZDdkNTlkMDY5ZTkxMmZmMWY5M2U5NmIyMWUxY2U0YzU3MWE5NzljOTczYzk0MzU3ZWZmMWY1MzQzMTQ1MTUyOTM1YjhkODUwNTUyOWFkYzA2NDIzZjY3YTMwNTM3ODVlOTQyNGFmYzVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWJ5dGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1ieXRlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMxZWUxZDYwYmU5ZjdmMTMxMzliMzY3YjQ3MTFjMWNmY2M3OGNiY2FmNzgxODIzMGQ4NDZlMmNhMGJmMTZhOTU2YzI1NjM4NWNmZjk5NDhmMzQ2YTg0YzZlNjYyZDI0NDQyM2YxNDRlN2YzNjYwNjEwMTdiOGE4MTk0MWVjMzgwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MTU5MzUzNjI2NzcxNjhkMzE3YzgzYjkzNjdmZTdhZmE2NmQzOTc4NjUwZjMxZjM2YzFlMWZmMDM5NDc3YmI5OTA1NTAyZjk4MjdkMDk2MTVjMmU3YzM4ZjkyZjE3ZDRlOTRiMTI0NTkxZjI0MGNkYjVlMjhiMTA5ZjA5ZWI3MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTM3ZTdiZWExOGY3Y2EwYWIxNTQwMzc0M2JiN2ZmZGI5MzNkMGI5YTNkZmFmMzE4ZTI4NzY2MWUwNmZkYTlhMDdjNDRjNGY4NjY0M2NlMDJlNzFkMzhiOGE1M2RjMWEyZDhjNjRhN2UzMTY5MTJjMWM0NDY3ZDhjNjY5MWMzNjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLWNqcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLWNqcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3OTZiNjZlYmQzOTAwNDU5YmJjZjg2NTMyMTk0Yjg2NTU0OTM1ZTZlOTU3OGQxM2YxOWNlNzQ1YmUzOTFlOTZjMTEyNzlmZDFkODE4MmQxZDIyNDBiYWUzNGUzYjlkMTBjM2FlMzUyOTk2YjM5ZDUyODU4ZjcwZWRiMzQ5ZWE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXByZS1tanMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXByZS1tanMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MDFhODc4M2YyZjU3NTQzNTQ2YjA2MWU5NjEyNjhkMDJiMDMzYzEyYzEwNmE5YTI1NzQ1M2Y3YTU4NzQ2ZGVlYzk1OWZiNWQ4MDAwMGU2MTBlNTJiNzc1MmZiNzlhNzQ0MWQzNDE4YWE2ZWFmMjE3OTYzM2NlZjU5N2NiY2JmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS10ZXh0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS10ZXh0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTQ3NDlkMzZjMzdmYTRiMDQwZjM1NGE3Nzk2ZGYyODk5MGMyYzNkN2NhYTRkZjFmY2U5YjZlMGNkN2UzMWM3YmEzZDhiNGY0NDJjMWNkNWE1YjdmNzEwODE1OTA4YTcxYzQ1YjRlMzc3YTRlOTg3ZGE4OWY0ODRlNTI0MDQ0MTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LWZvcm1hdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LWZvcm1hdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQzOGY4NWU3NjI2MTJlYzVkZjY1MDIyMTNmZjg5YzgzOWE2OGU4NDY0N2IwZWY5NDUyMzk3ZTc4Nzg1OTg5MDQwMmFhZWMzMDk1N2ZmNmRiNWY1ZWY0YWE1NTFjYzNiMTNhNzJiOTM3YjRhOWIyNjcyZTQ1ZDQ1ZmJjOGRmNGYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BvbGljeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzAwZDljMjY5MDliM2M4NzU1MjY0NjA1Y2Y4ZjM3OGEzZmIzMzIwNTU2N2Q0ZDdjZjFkNWEzZmQ5YWEzMGY4YTQwNjZiMjNkMjA3ZjQ2MWQ1NGZiMjQ1NmZiMTk1MDQyZDgxYTNjMmZkYzI4OTkwZTk5NDRkNmIzMDcyMDgxZjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG93ZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb3dlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZWJhM2I2ZTU3MTA0Y2QyZTZlZGY4ZGQyM2M3NjM3NDhmY2YwNzYwY2U2MzQxMzc1NjcxYzY3ZWM2NzI2NjEyZTRlYzNhOWVjNDgxOWUzYmU4YjE1N2QzNmEyODEyMDlmOTY2ZWNmNjMxZjJiZTAyY2QyYTQ1NWM0YzBjMGE4MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1leHRlcm5hbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtZXh0ZXJuYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZW52LW9wdGlvbnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjYTc2ZWQ3YzZiNjU2NzFmNzBiMjY0NmY2ODk0MzU3MjRkOGI5OTMwYTVmZjI5ZDFmYjMyN2VkOTZmZDQxNDQ2OTUyNTg5NjJkYWZiOTgyODYyYTJlZmMxYjAzZDBhZDk2YjMzYzJjYWU1YmViZmEzNzI2ODg2YTA2ZjY2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMGZiNTNmMmVmZTcxM2M3MjU1MjIyMTlkMzA4MzcwZjcwNzVhMTBjYzlmYmVhZjE3OTI0M2U3MDNmNjExNGQ2YzE0YjNkZmMzNDE3YWRkODgyMzJiODBjMGVkNWE4YmJiNGI2OGZlNzUzZGUwZTQzNjhiMTVhZmI0YjNkNjBiNSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vycm9ycyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJhYzkyYmMwYjkyMDc3ZmNhMDU3ZDA2MmNkNGY1OWJiODliZWI5MzBlODM1OTg2MzQ2YjYxYmUwMTA4MjI4MGUyODRmNWIxNDU2YmE4OGQwOTZmMjg2YjEwMWRhZDhhMmJkM2IyOGQ3MTlkNzdiOWIyZmQ2Y2ZkZmU1ZmQ5NjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MTU1YWEzZDQxN2QyODdjOTljOTgxZDIzN2IyZGFjNDczZTE3ZmZlYmFlMmYzZGFhMzI5OTFiZDYxMjc1YWYwZmFmZjA3OTA3YjMwOWQ4M2Q1MGI2MzUyM2ZkOTI3MDlhN2JmZTkxZTg4OWJjYmMyNzFhZTVkOGUyY2NiZTFmZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbG9jYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xvY2FsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjBlZmU5MjhlZTUwMzllN2Q0MDk1OTRjZTA5ODIxYmZmNWVkNTFhYmUwYzI0ZWE5NTgwZjk2NDg3NjU3NTRhM2Q0NmRkNTk1NzhiZTZkMzQzNmFlM2QxNWM4MzJhNjM1MjQzOGRlNzFhM2VjODE5ODNiNjM3YTQwZTM4MmMwMzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJjZjI1Y2ZlYTFjNDM3YjMzYTEzNDI3MzJjYzg2YzE4ZjAzNjBhOWFkZjk2OWI1YmM0YzE4MmZiN2YzOTc0OWY5OTRjNTUxMzllOWU1NjU1YmViYTk3YjU0MmRjMzUzMzc1MWRhMDU4NjllMjFlYTFlMWQwN2E4MTAwNzFlYmE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjYzNhZDcwMGQwNjU0ZTZhNGZmMjc3YWVjMjYxMTUxYzk3YjkzMDAzZmQ1MDIzYzhiM2EzNmU1MWQ4YjhjNTllY2UyZTk1ZTI0NTQwYTQ0NTkzYmI2NDRmNmIxM2ZhZDBmYTY0ZjRiNjJkNjA2YmM5OTAyMmQ0ZmMxMzI4OWIyOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNGQyN2I2NTJiZGE5YjEwY2NmMjk4NjdiYThlN2U5MGE4NDI1OWY0OThmNzE3MzgyYjUzYmNjYTI5OTgwNjllYTFmMTRlZjJiM2YyODcyODRkMjU4OTBjNjAyODY5ZGY3Y2Y2NGQ4ZWQ4MWM3Y2QwYzczZmRlZmU1ZGVkY2IxNyIKICAgICAgICB9LAogICAgICAgICIuL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDYwNzEyMzhiMjVkMzA3NjZmNDQ3M2IzNjA3NWRiMDUwMDRhMzA5NWI3YmE2YWRkMDQ0ZDk4NjY1YzdlMGMzYzMwOWQwNGQ0MzU4YWFkOGIwNWRkOGZjZjAwZjdkZjI5NjE1NWM1ZjgyOWIyZjhiZjM4ZGRiZWZiMTBkNTgzNDkiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNS4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9pbXBvcnQtYnVuZGxlIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4xMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC1hcmNoaXZlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC1hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcGFydG1lbnQtd3JhcHBlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyMzQyNDBkMWY3NzUxNmNlMDE1NDdmYTJjNDJkNzRiMDc3NTk1NWM4ZWU1NTc2NGI0MTNhMDBmNTQ1ODJiNmJlZDYyNWQ4NGQ0NTI2MTk0YzkwNjU3MGQ5NDQ5Njc3MDRjNzk5MzljOTIxMmI2ODliYzExYjg4NmNiZTEyYjMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM1ZTMwZjg5NDQ3MGM0ZTM3N2NmNGExYTVlNGQ1NWRkOGZkMWY3MmQ0OWM5NjAzMDQ3MzQ3YzBkNzdlMWUxYWMzODY5NTJjYWU2NDhiOTc3NDRlNmU2ZTFiOTk3Mjk4MTY5ZjJkNWE2Yzg2YWEzODg1OWU0ZjcwNWMyZTQyNzFmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9tYXJzaGFsLXYxLjguMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbWFyc2hhbCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4ODQzMGZjYjc4NmI1NjFjZjAzZWNmNjU5ZGE4ODBmYzhjNGE2YmUyMWVjNmEyNTZmZDg4NDNjOTJiYzY2YzFmMTBmOTgzNzFjYzg1YzM2NzBlYTdjY2Y3NDQwMGFiMTEyZTRkMTBiY2MzOWI2NWNlMDViNDg3NTJhMjhkMmNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyOGYzMjVhNDU0Y2FkMjMxOTFmYzhkNTFmMGJjZTkyNjkwYjc4YzkzODRlY2U1YTYyNjNkY2YxYmQ0MmFmM2Q5YmIxNWJiNzZhZDQxNTZkMDA5MDYzNTNkNWZjZGVkNmVjYTY4YWVhMzg3MmI2ZGVjZTcxNGMzMDlkYmJlYzk5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjU1NmFmMjhlYmFmNjhkNGZmMGZlMjk0NTI0YzkxMjMzODkzMmI4ZTI5MWUwNjhhZDYwNDBjNjMxMjA3NDhjNTY3ZGIxZDVhNGI2MjMxN2UzN2MzMzRhNzczY2IwYjJiZTkzMmI4ZTMyNmE3M2QxM2U1ZGEzYzM1MDAzZDYwNDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTBlODBhNTAxZjU3MDE0NDcxZjNkY2I2MzEzMzEwZmVjYjhhOTljNWY2NzkxOTRjNTEyOTIyYjk4NzJjYjhmMWRiNTEyNjM2YWVlYjA2Mzk1OWY0ODYyYjZkOGI0NTE0OWRkMGRhYjQ4MDZlYzZhYjE1OGM2OTdlMGFjNDlmNzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjI0NTNiMTlmNTdiYjljOWZlMjRjZDkyMTY3NmZiYzA4NTJmNDdhYjlhNjZlY2ZhNzUxMzZhZmM2NTI4NTU1NTRkZDg5MmNiMzk0ZjhiYjcyMjNhNTE4MmY2MWEzMzNiMDgzZDYyYmJkYTA3ZGQ2MzFlZWE1ZmM1NTY5ZTMyYTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWQ0YjVlY2NiYjlhZmJiNmJiMmU1ZmU2MTMyYzY4ZDAzNDQ0Y2IwOTQ5NDRkYjc5NTc1NmU4ZjQyNmZiMDI0OTVhYmFjYzllZjIxZDZhODFhNDc3MDBkY2NkMDM1YjYxNDQxMWYwOTUzZTM2YjU3NDc1OTJiNTI1NTJkMjM3OGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFjODNlZTZlN2E1NjRiZWE3ZjdhMmY3MDcyYjViNzE4NWVhZjgyNWU0MzUxMWNiNWZmZjU4NDNjYWE2YzZjMWJiMmJmZTY1NDM4NTVhZmZhZTcwNWRiN2Y0OWEyNGY5MzNjNjAxMTk5NTU0MTA1ZWI2ZWI4YjhhM2Y2NjQ2ZGE0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWNjN2NjMzAyMWRlMThlMTFmMTIxOWUyMWUyOGI5ODA0ZjQxMzUxZjMwNGQyZjFlNmI2OGEzYjY0NTY1Njk4MjdmY2FmNmVlZWIwMzg0NmQzNjAxOTIxNjU4YWE1ODNhYjhjYzYzZjhiNjBiYWU0NTg2NGQ3YmQ5MjJiNTZkOGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NS4xLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL25hdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTczMWM4MjRiMWQ5YjQxNzdmYjNmZWI1YTFlYjA3YTFjNWRmM2NhMWVhNDc2YTFlNTU4NmUxMGNiM2Y5M2MxNGQzZDQzNmY5MTQ4OTYxOTMyOTIxZWVlZjIzZWJlMzBmYjZiYjIzMzA0NGZiZWViNzZjNmY4ZTMzNTRiOWU2ZTUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIjogewogICAgICAibmFtZSI6ICJAZW5kby9wYXNzLXN0eWxlIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pZGVudC1jaGVja2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllMjQ0ZDk0MDhjZWRiNWYwOGQwMmIxMWViYzNkOTIwNTM0NTIwNmRhOGEyZTA4ZDZlMWI2YWY1MGVjOThmYTA0ZDAyYTdjMDg1MWM5ZWUwNTJjMWU3ZjJkYzA4NmY0OWQ1OGY4MGNmY2M0YmQ5NmEyOTM4ZDgxZDRkOTJhYzIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J5dGVBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnl0ZUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTY4ODIxNTMxZDlmMWZjYTEyODU2MDk0ZDMyNWQ3YzY1NmEyNzc5NjRkMjMwYmQ2NGMyMzViZmRjN2RhNDFhZGQzYWRkODYwYTJlNzdlN2NiNjcwZTFhYjVlMzExMTQ0ZGNmMDI1ZjRlOTM2YTNjOWMyZjAwZWNmNDBlYTk0ZWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMzZjMjM4YzMwYTlmZjg2NjNmZDI2YjU3OGJiOTNlYzIwZGQ2NWFhYTdlY2RhNGNjMjgzNTY3OTQ5MTQ2NDU4OTFkZjhmNzllMWIyMzIyNmE4NDlhMDdkNGE5ZjVkZGUzNTM5OTUzNDI2YTllYTQxZjYzOGJlNjhmMjE0N2RhMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjU2MDlmN2YwOTQwZGYzOWJiYWE1ODBhMDU2ZmYwM2Q1NGU3YWUyNWU1OWEwNTRlNzU0Mjg3YzNjN2Y4MDhlY2UxMjlhMWEwNGFhMDZiYjE5NTYyZWNjMjkwMmRkNzI5ZjgzMDMzOTI3YzM5NzMxMWE2ZWY1NTVkOGVlZmI3MzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYWVkN2NhNDk2YzFmMGM3OWE1MjhkN2IzZmY2MDAyYmQ5NTdlNzIxYmI4ODUwZDJjNThmNmUzZjhhNWQ2ODU5MmE4NGI4NjMzZjJkZDJhZDc3Y2I4Y2ViZmFlZmFhMmYyYWRjOWM1MTg3MDRkNzEwN2RkYzA4MDhjN2RiYzcwOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1YmFlMmYxZjQyNjAwYmI5NzI4ZWMxZDFlN2FjZTdlNTNhNGY2OWQzNmRlNWE4ZmNmYmM4NTBmYzRmZGE4YmViNDYzN2JhNjBhNWVhMGM2Y2ZhMGVmNWNiOWExZDgyMTYxYTc3M2RkNDdlNGQ0ZTc2NmNjYTY1NTg4ODgzZTkyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJhZWZkOWUyMzcwOWZkMWNlYzhkNmRkMWVkMGFjMTI1MjU5YWUzYThiY2FhMmI5MThiYjM3M2E2OWU3ZWY3OWEzOWNkNmQ5Y2Y2Njc0MzY2NzY3NDk0ZTM5MzgzMzJkMjcwMzcxMDQyZjgyMzI0YzgzNDZiZTU4NTcxOGQ3YmNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJlODc1NGMyOTg5M2JkZjg4YWVkMjljMjZmYWMwNzNiNTBhMmYwMTJlYTljNmM0MGE1MjQxNDBjZmZjZWFlYTRiOWUyYmU0ZDQ2NGUyNzNiZmE4NGNjZDI3ZGMzNDk3N2RjNzY3MmE0M2VmYTMzYjJhMjI4ODQ1MWExYTAyMTk0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZDVmMmM5ZDhjNDFmMWI4YmE5ODdlYjg3NGMyNjM1MDliMjJkOTBhZmEzYTNmM2JiODgxZGI5ZjBlODBiYTZhM2IzOTNhOTMwZWJiMjkxZTZmNDczZWU1NjA1MzBmY2NlZWYzZjMxZmQzNjBmZTMxMjU5MTI1YWVmYTQ4NzhmOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZGM2ZTdiYjhjZGNlZmVjZTk2MDA4NmNjZjliNmQ5NDNmNDBmN2RkZTg2OGViMTI1MTQ3MzNlYmQzZWUzNzVkOTRlOThmNTYxMjZhOGNjYzQ4NWEzNWY3ZmJhNzA2YTg5ODE3YWY0Nzk4ZjdkZTgyMzhlODFjMjI2MGVkYTJiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlT2YuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYTI2ZTA0ZGE1YzYyOTIzZTFmNDQ3YTBiNjI4ZjE3ZDk0OWUzMWUwODg1MTZhZjBjZDY4ODdlODUwYzkxNWUwZGRlY2Q0MmE0ZTA4YTViMzgxYzA3NjNmNDM1ZjEyYmY0Y2QzOTQ2YTE1NTA2ZTg0NDU3YmVlZTA1ODJhNGU2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZW1vdGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU0NzliZmJjMWFjNjVmZjQ0MzM3NWVmMjgyMGU1ZjU4ZWYxZjUzZGQwZTAzZWFkNWNhYjgxNTQzM2FiMWQwNjVhODFkOTQ3ZDBmYTY2MGY1MWI2N2MwYzY4OTRkMWNiYzQ4NTYwZmNlOWZmMmYxZTUwN2Q1MzJmMDE0N2RlZjdkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZS1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmUyNzcwN2VhODY5MWQ2ZjIxNzBmMmUxMjdiYjgzYjQ0ZDI2ODZmOWY5M2VlZjM3YWYwZGJmZjcwY2M0OWZhZGM5YzU4NGFkZmZkZTllMmE2ZDlmNjFiMTg2NWZjYWExOGRkZDk2ODFkNTc1NTQ1MzFlYzcyZDUxMmI0MmY2MDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RyaW5nLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdHJpbmcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZTUzMTVhNjRiZmQzMThhZjliMzUwZTQzYWFkZGVmNjE4YjllMDUyMzIyN2RkYjQxZGYzYjM2YmE3MDg3NjAwNDViNGM0ZTEyZjhiYjBjN2U1NGFjMjRiYWRkMjEzZTBjZjlkNWMwNDM2ZmRkMzhkYmE3MGI0ODcxNjJhMjkyNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zeW1ib2wuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N5bWJvbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk1OWRhZDMyMjEyMzAyZGI5OTNmYzc2ZmY0YjAyYzBlMDYwNjk5ZWM0NDJlMjI3NDdmNDQ0YWFiY2FmMmUzZjRmNzE5MWViMjY3N2E1OTM0YmYyOGY3ODlhMTc2MmFkNTcwNjBiYWNiODdiMWQ1NWI5YTAyYmYzZjliZTQ4MTU2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTkyN2YxMWVhZWE2MTRjMTkxZjk4YzhkNTdmYzcxNDllZjg4MzgwMzM3YmZmNDljYWQ5MzRjN2IzZmYxZmFiM2EwOGJlNzRmNjZmZmVhOTVhYWEyYjljNDQzYjNmZTA1Y2Q3ZjkwMTc1ZjgzNjdmZWI4NzQ1YmJjMjQxODcyNzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFkNWE3M2I0YzkxNjcyYzU3NTY5Mzc2NzkxOTM3ZjliMDM5NjI3MzhlN2MyYTQ0OGRjMGU2ZjhjNWZjOTBmMTNjNTk3YzBkNDJlYjgwYTg1OTA3MmZlOThhYjU2MmFlMzQxZTVmODUzODk2ZTY0YmNiZDg3ZWI0MmU4ODk4MTc5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJmNDY1MzMwN2Y4MDZmMTNiMmFkYjU5NmJiNmUyNGNhZmU4ZjA4MzQ0MmY4YjUwYjMyYTBlY2FiMWFmOGRlZTUyYjZhOWI4M2U2NGJjMmQ2NmJkNWRkNDIzZGRmMDZhMTIxNDFmOWFiOGU2NGNiMjYxNDA2NGVlNjUyZDA0MDA0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZDNhMjU2MzZlNTQyNzhiMzNmNmMzNjIxNDc4ODllNmZmMTBiZWRhODBjMDdlNmExNmQxOTA0N2I3YjNjNmEzNGQ3MzBlOWIzY2ZjOWY4NTExYjZlMjdiNmE2OTc3NjRmOTY4M2Q3MGRmNzA4NmUwODVmOTNkN2Y5NWZjNGZmYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRmYTZkMTJkNDdiYmExODZhNTJmMWY2ODY4NjAyZTA1YTk5ODJjYjNjYzcyODY4MjY4YzViMDc5OGNmYzk5OTM1NTA0MjQzOTU4MWY4MmE4NTUxNGNiMzIyZjQxZGFkYWQ2OWI5MTE5NjgyNzcwZmE0NTdjZWZkNTI3YWE1OThhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjODRkMDc2ZTBhNDE5ZmM4NjM3YWIzOGYyNDQzMzhjNDc2YzUwMTMyY2ZlMDkwMDJkZGRjYmJmY2QzNjViZjZjZjNkMzJiMDlkYTMyNTI1Zjc1YjYwZjVmYzY2MGRkYzBlMDhmMzZhNjA3YmEwNzdmNTk5YmM1NWYyOWVjYjM2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby90cmFtcG9saW5lLXYxLjAuNSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vdHJhbXBvbGluZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby90cmFtcG9saW5lLXYxLjAuNSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby90cmFtcG9saW5lLXYxLjAuNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTRlYWI5YWZmNzllMzJkNzRmY2U5ZmJiZDU4YmY4ZGNlZmQwNTY0ZGJiNGRiY2VkYTllYmFhYzU1ZjYxZTFlMzFkZWI1MTVhY2ZhNmNjNDM2Yzc2MTg2YmVjYTY4MzQ4ODFjZmEzZjUyYTdiOGJkNzZhNjliM2NkOTE2MmEyMjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhbXBvbGluZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhbXBvbGluZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZiYWUzYTZlYWFhOTM2ZTRiYWNiNzRhOWRkMzhlYzU4ZTg5NTdhMTJhNDA4OTc0ZTIzMzgyMmJmNjE3MTJmZjgzNjAwZjk4ZGU5MjdhNGQzYzQ0ZjQ4M2UxNmI2MDRmODE3NDQyZTAyN2QxN2RhOTViZjM2NjhlMDAzNDk2NDk2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby96aXAtdjEuMC4xMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vemlwIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3ppcC12MS4wLjExIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3ppcC12MS4wLjExIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZGZkYjdhZDg0M2E3MTg4OGI1NmFlNmZkYzMxZDQyMmUyNTEzMThkNjg5YTgxYmE2NmZiM2Q1MzQxZDAxODMzODljNWFlODhkNmViMDY4YzE0MDQ4ZDU3NDM0OTE3NzlkNTM0OTA3NDFhYWQyOTFiOWRmY2EwYmZiYmE2ODI4MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9idWZmZXItcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9idWZmZXItcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWVmOTU0ZWFjMjBjNWUxOWMyZjZkMTgzM2MyYjUzYmQzYzNmYzEwMDQwMDg3ZTdiYzdkNjRhMmIzZmM1OTMzNWM2MmRlYzFkZDhjMGNjZGIwMjVlZmRiYWM5MWIzNDdlNDNmMmIzMjRlM2Q5MTU2ZTY3YmFlZDE3YTE0M2RmMzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFlNzk2OGFjNmViODVhNWYwNWM4YzZlNGQ2MmZmNjRhNjhhYzk0NDUyOTI3ZDNjYWRlYmRhMTdkMDNhOTUxZmYxOTM3YTJmNTc0M2IxNWU2OWE0NTU0Mzk4MmUxN2M5YTgxYmYzNGMzY2FlMjYzNTNjYzFjYmJmNDMxMjU3NzJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXByZXNzaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb21wcmVzc2lvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRmNmUyMzllNjRhZTZkOTYzYjIwOGM4OWVmNzllY2NhYzhjNWE2NjMzNDg3Y2JmNjU4M2Q2ZjY0N2ZhOWYzZWE0NWU1OWFmNGQ4NGNmZThlYWU3OWJkN2QxMjJjYmMyYzI3MDhlNjI5MDI2NzkxMjZiZjIyMWViNmRlZGZlZTc0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NyYzMyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jcmMzMi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc5Yjc0MTdkYThkZTZhNjMxODIwMmFlNjNkZWNkMjllNjAyM2M5ZjVmZmUxN2QxZjJmZTFhMDYwZmVkOWZjMTg4ZWIwOWNhN2Y1ZGUwOTU4YTczMWY0YTQyYzg2OTYzZmE4OTFlMmE2YTZhNDJkMmU3MDYxZGUyODQ2YzVkZGJjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Zvcm1hdC1yZWFkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Zvcm1hdC1yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTUxZDU5ZmE3YWQ5NGMyNGFmOWMxMGRkNGQzNjEzM2I2NTM1Y2FjMjJiMjdjYjliYmIyNjE3YWE5ZTAyZTllN2ZmOGExOTI4NzEyZWE4Mzc5YzMyOGQyNzk5YmQ5MDRlMmMwZGY5YzljNWEyZjUyOWRmOTY4ZDU1NWNkOGIzNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtd3JpdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTM3NDgzYzA4ODE2OWRlOWFjZGRkOWFmMTBmNWJjNGJlMGIzNThiNGNkODQzZWM3MTc5YWJjMzAwMmFkMGEyZDg5NDY4ZmVmOWI1M2EzODdiMDdlMTVmNWJkODQzMDEyZGJkZjgzZjA5Y2M5Y2RjYTA1OWRhNWMwOTI1NTNhZjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOGIyMzdhZDFjYmJiNWY5MDI0OWM2ZDk0OWM1ZjRkYjBmZTAyZmU5MWZhY2U3YjY3ZmFkOWNlN2YyZjZlN2M0ODE2Y2MwZGE4NGNlNmJhNTg5ZGRjNTFhMTBkNTkzYjk1MGJmNzIzZTgwZTVkZWE3NmEyYWJiMjExNzAxZWI5MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zaWduYXR1cmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NpZ25hdHVyZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJkYWVkMGY0YWIxYjE1Yzk4MTY0YjE0ZmRhMzVhMmY5NzA2NDdmNzUzZTAxOWY3MTBiZjVkZGU5NWZlNDQ5M2IzZmYxMTE5Y2YxZGY0NDUzN2RjMTU0M2RkN2I0MmU2NzBiNGEwNWEzNWFiMGY1MjhkYzY2MDRjMWYxZDNiODg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQxMDkyOWZlYWRkNjBhNmFiMjI1NTFlZDQ5YjA3ZWVmM2Y2MDc0OGU4NjIxMGUwMDU1NTUxZGI0OWFhZTI3NWI4MjcyNzQxNTFmOWI4ZDg2MWJlNjk0NmZiY2QyNzllYmEwNWViMjBlZDIzYzE2OGNhNjZkZjk5NWViMGVkM2UiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAAAfWxQ12QQAANkEAAAvAAAAQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjIuMS9zcmMvdmF0LXNwYXduZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vaW1wb3J0LWJ1bmRsZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJidWlsZFJvb3RPYmplY3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpbXBvcnRCdW5kbGUsRmFyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vaW1wb3J0LWJ1bmRsZVwiLCBbW1wiaW1wb3J0QnVuZGxlXCIsWyRozY9fYSA9PiAoaW1wb3J0QnVuZGxlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVpbGRSb290T2JqZWN0LCduYW1lJyx7dmFsdWU6XCJidWlsZFJvb3RPYmplY3RcIn0pOyRozY9fb25jZS5idWlsZFJvb3RPYmplY3QoYnVpbGRSb290T2JqZWN0KTtcblxuXG5cblxuY29uc3QgZW5kb3dtZW50cyA9IHtcbiAgVmF0RGF0YSxcbiAgY29uc29sZSxcbiAgLy9cbiAgYXNzZXJ0OiBnbG9iYWxUaGlzLmFzc2VydCxcbiAgQmFzZTY0OiBnbG9iYWxUaGlzLkJhc2U2NCwgLy9cbiAgVVJMOiBnbG9iYWxUaGlzLlVSTCAgLy9cbn07XG5cbiAgICAgICBmdW5jdGlvbiBidWlsZFJvb3RPYmplY3QoKSB7XG4gIHJldHVybiBGYXIoJ3Jvb3QnLCB7XG4gICAgYXN5bmMgbG9hZEJ1bmRsZShidW5kbGUpIHtcbiAgICAgIGNvbnN0IG5zID0gYXdhaXQgaW1wb3J0QnVuZGxlKGJ1bmRsZSwgeyBlbmRvd21lbnRzIH0pO1xuICAgICAgY29uc3Qgc3RhcnRGbiA9IG5zLmRlZmF1bHQ7XG4gICAgICByZXR1cm4gRmFyKCdzcGF3bmVkIGJ1bmRsZScsIHtcbiAgICAgICAgYXN5bmMgc3RhcnQoYXJnc1ApIHtcbiAgICAgICAgICBjb25zdCBhcmdzID0gYXdhaXQgYXJnc1A7XG4gICAgICAgICAgcmV0dXJuIHN0YXJ0Rm4oYXJncyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJ1aWxkUm9vdE9iamVjdCI6WyJidWlsZFJvb3RPYmplY3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAONScZ3UCAAB1AgAAHAAAAEBlbmRvL2Jhc2U2NC12MS4wLjEyL2F0b2IuanN7ImltcG9ydHMiOlsiLi9kZWNvZGUuanMiXSwiZXhwb3J0cyI6WyJhdG9iIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZGVjb2RlQmFzZTY0OyRozY9faW1wb3J0cyhbW1wiLi9kZWNvZGUuanNcIiwgW1tcImRlY29kZUJhc2U2NFwiLFskaM2PX2EgPT4gKGRlY29kZUJhc2U2NCA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXRvYiA9IGVuY29kZWREYXRhID0+IHtcbiAgY29uc3QgYnVmID0gZGVjb2RlQmFzZTY0KGVuY29kZWREYXRhKTtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnVmKTtcbn07JGjNj19vbmNlLmF0b2IoYXRvYik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhdG9iIjpbImF0b2IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAksKTjzQDAAA0AwAAHAAAAEBlbmRvL2Jhc2U2NC12MS4wLjEyL2J0b2EuanN7ImltcG9ydHMiOlsiLi9lbmNvZGUuanMiXSwiZXhwb3J0cyI6WyJidG9hIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZW5jb2RlQmFzZTY0OyRozY9faW1wb3J0cyhbW1wiLi9lbmNvZGUuanNcIiwgW1tcImVuY29kZUJhc2U2NFwiLFskaM2PX2EgPT4gKGVuY29kZUJhc2U2NCA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYnRvYSA9IHN0cmluZ1RvRW5jb2RlID0+IHtcbiAgY29uc3QgYnl0ZXMgPSBzdHJpbmdUb0VuY29kZS5zcGxpdCgnJykubWFwKGNoYXIgPT4ge1xuICAgIGNvbnN0IGIgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKGIgPiAweGZmKSB7XG4gICAgICB0aHJvdyBFcnJvcihgYnRvYTogY2hhcmFjdGVyIG91dCBvZiByYW5nZTogJHtjaGFyfWApO1xuICAgIH1cbiAgICByZXR1cm4gYjtcbiAgfSk7XG4gIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbiAgcmV0dXJuIGVuY29kZUJhc2U2NChidWYpO1xufTskaM2PX29uY2UuYnRvYShidG9hKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJ0b2EiOlsiYnRvYSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAEe3Z/uQEAALkBAAAeAAAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2RlY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2RlY29kZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2RlY29kZS5qcyI6W1siZGVjb2RlQmFzZTY0IiwiZGVjb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAChVqVIuQEAALkBAAAeAAAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZS5qcyI6W1siZW5jb2RlQmFzZTY0IiwiZW5jb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAa++pXpAIAAKQCAAAdAAAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW5jb2RlLmpzIiwiLi9zcmMvZGVjb2RlLmpzIiwiLi9idG9hLmpzIiwiLi9hdG9iLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZW5jb2RlLmpzXCIsIFtdXSxbXCIuL3NyYy9kZWNvZGUuanNcIiwgW11dLFtcIi4vYnRvYS5qc1wiLCBbXV0sW1wiLi9hdG9iLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZW5jb2RlLmpzIjpbWyJlbmNvZGVCYXNlNjQiLCJlbmNvZGVCYXNlNjQiXV0sIi4vc3JjL2RlY29kZS5qcyI6W1siZGVjb2RlQmFzZTY0IiwiZGVjb2RlQmFzZTY0Il1dLCIuL2J0b2EuanMiOltbImJ0b2EiLCJidG9hIl1dLCIuL2F0b2IuanMiOltbImF0b2IiLCJhdG9iIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACTp2PAaAMAAGgDAAAiAAAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvc3JjL2NvbW1vbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYWxwaGFiZXQ2NCIsIm1vbm9kdTY0IiwicGFkZGluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuXG5jb25zdCB7IGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4gICAgICAgY29uc3QgcGFkZGluZyA9ICc9JzskaM2PX29uY2UucGFkZGluZyhwYWRkaW5nKTtcblxuICAgICAgIGNvbnN0IGFscGhhYmV0NjQgPVxuICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLmFscGhhYmV0NjQoYWxwaGFiZXQ2NCk7XG4gICAgICAgY29uc3QgbW9ub2R1NjQgPSB7fTskaM2PX29uY2UubW9ub2R1NjQobW9ub2R1NjQpO1xuZm9yIChsZXQgaSA9IDA7IGkgPCBhbHBoYWJldDY0Lmxlbmd0aDsgaSArPSAxKSB7XG4gIGNvbnN0IGMgPSBhbHBoYWJldDY0W2ldO1xuICBtb25vZHU2NFtjXSA9IGk7XG59XG5mcmVlemUobW9ub2R1NjQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFkZGluZyI6WyJwYWRkaW5nIl0sImFscGhhYmV0NjQiOlsiYWxwaGFiZXQ2NCJdLCJtb25vZHU2NCI6WyJtb25vZHU2NCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADywE7BkggAAJIIAAAiAAAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvc3JjL2RlY29kZS5qc3siaW1wb3J0cyI6WyIuL2NvbW1vbi5qcyJdLCJleHBvcnRzIjpbImRlY29kZUJhc2U2NCIsImpzRGVjb2RlQmFzZTY0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbW9ub2R1NjQscGFkZGluZzskaM2PX2ltcG9ydHMoW1tcIi4vY29tbW9uLmpzXCIsIFtbXCJtb25vZHU2NFwiLFskaM2PX2EgPT4gKG1vbm9kdTY0ID0gJGjNj19hKV1dLFtcInBhZGRpbmdcIixbJGjNj19hID0+IChwYWRkaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QganNEZWNvZGVCYXNlNjQgPSAoc3RyaW5nLCBuYW1lID0gJzx1bmtub3duPicpID0+IHtcbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KE1hdGguY2VpbCgoc3RyaW5nLmxlbmd0aCAqIDQpIC8gMykpO1xuICBsZXQgcmVnaXN0ZXIgPSAwO1xuICBsZXQgcXVhbnR1bSA9IDA7XG4gIGxldCBpID0gMDsgLy9cbiAgbGV0IGogPSAwOyAvL1xuXG4gIHdoaWxlIChpIDwgc3RyaW5nLmxlbmd0aCAmJiBzdHJpbmdbaV0gIT09IHBhZGRpbmcpIHtcbiAgICBjb25zdCBudW1iZXIgPSBtb25vZHU2NFtzdHJpbmdbaV1dO1xuICAgIGlmIChudW1iZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgYmFzZTY0IGNoYXJhY3RlciAke3N0cmluZ1tpXX0gaW4gc3RyaW5nICR7bmFtZX1gKTtcbiAgICB9XG4gICAgcmVnaXN0ZXIgPSAocmVnaXN0ZXIgPDwgNikgfCBudW1iZXI7XG4gICAgcXVhbnR1bSArPSA2O1xuICAgIGlmIChxdWFudHVtID49IDgpIHtcbiAgICAgIHF1YW50dW0gLT0gODtcbiAgICAgIGRhdGFbal0gPSByZWdpc3RlciA+Pj4gcXVhbnR1bTtcbiAgICAgIGogKz0gMTtcbiAgICAgIHJlZ2lzdGVyICY9ICgxIDw8IHF1YW50dW0pIC0gMTtcbiAgICB9XG4gICAgaSArPSAxO1xuICB9XG5cbiAgd2hpbGUgKHF1YW50dW0gPiAwKSB7XG4gICAgaWYgKGkgPT09IHN0cmluZy5sZW5ndGggfHwgc3RyaW5nW2ldICE9PSBwYWRkaW5nKSB7XG4gICAgICB0aHJvdyBFcnJvcihgTWlzc2luZyBwYWRkaW5nIGF0IG9mZnNldCAke2l9IG9mIHN0cmluZyAke25hbWV9YCk7XG4gICAgfVxuICAgIC8vXG4gICAgLy9cbiAgICBpICs9IDE7XG4gICAgcXVhbnR1bSAtPSAyO1xuICB9XG5cbiAgaWYgKGkgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgQmFzZTY0IHN0cmluZyBoYXMgdHJhaWxpbmcgZ2FyYmFnZSAke3N0cmluZy5zdWJzdHIoXG4gICAgICAgIGksXG4gICAgICApfSBpbiBzdHJpbmcgJHtuYW1lfWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhLnN1YmFycmF5KDAsIGopO1xufTtcblxuLy9cbi8vXG4kaM2PX29uY2UuanNEZWNvZGVCYXNlNjQoanNEZWNvZGVCYXNlNjQpO2NvbnN0IGFkYXB0RGVjb2Rlcj1cbiAgbmF0aXZlRGVjb2RlQmFzZTY0ID0+XG4gICguLi5hcmdzKSA9PiB7XG4gICAgY29uc3QgZGVjb2RlZCA9IG5hdGl2ZURlY29kZUJhc2U2NCguLi5hcmdzKTtcbiAgICBpZiAoZGVjb2RlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjb2RlZCk7XG4gIH07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IGRlY29kZUJhc2U2NCA9XG4gIGdsb2JhbFRoaXMuQmFzZTY0ICE9PSB1bmRlZmluZWRcbiAgICA/IGFkYXB0RGVjb2RlcihnbG9iYWxUaGlzLkJhc2U2NC5kZWNvZGUpXG4gICAgOiBqc0RlY29kZUJhc2U2NDskaM2PX29uY2UuZGVjb2RlQmFzZTY0KGRlY29kZUJhc2U2NCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJqc0RlY29kZUJhc2U2NCI6WyJqc0RlY29kZUJhc2U2NCJdLCJkZWNvZGVCYXNlNjQiOlsiZGVjb2RlQmFzZTY0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI8TQzdrBwAAawcAACIAAABAZW5kby9iYXNlNjQtdjEuMC4xMi9zcmMvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vY29tbW9uLmpzIl0sImV4cG9ydHMiOlsiZW5jb2RlQmFzZTY0IiwianNFbmNvZGVCYXNlNjQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhbHBoYWJldDY0LHBhZGRpbmc7JGjNj19pbXBvcnRzKFtbXCIuL2NvbW1vbi5qc1wiLCBbW1wiYWxwaGFiZXQ2NFwiLFskaM2PX2EgPT4gKGFscGhhYmV0NjQgPSAkaM2PX2EpXV0sW1wicGFkZGluZ1wiLFskaM2PX2EgPT4gKHBhZGRpbmcgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGpzRW5jb2RlQmFzZTY0ID0gZGF0YSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGxldCBzdHJpbmcgPSAnJztcbiAgbGV0IHJlZ2lzdGVyID0gMDtcbiAgbGV0IHF1YW50dW0gPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGIgPSBkYXRhW2ldO1xuICAgIHJlZ2lzdGVyID0gKHJlZ2lzdGVyIDw8IDgpIHwgYjtcbiAgICBxdWFudHVtICs9IDg7XG4gICAgaWYgKHF1YW50dW0gPT09IDI0KSB7XG4gICAgICBzdHJpbmcgKz1cbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDE4KSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDEyKSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDYpICYgMHgzZl0gK1xuICAgICAgICBhbHBoYWJldDY0WyhyZWdpc3RlciA+Pj4gMCkgJiAweDNmXTtcbiAgICAgIHJlZ2lzdGVyID0gMDtcbiAgICAgIHF1YW50dW0gPSAwO1xuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAocXVhbnR1bSkge1xuICAgIGNhc2UgMDpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgODpcbiAgICAgIHN0cmluZyArPVxuICAgICAgICBhbHBoYWJldDY0WyhyZWdpc3RlciA+Pj4gMikgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyIDw8IDQpICYgMHgzZl0gK1xuICAgICAgICBwYWRkaW5nICtcbiAgICAgICAgcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTY6XG4gICAgICBzdHJpbmcgKz1cbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDEwKSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDQpICYgMHgzZl0gK1xuICAgICAgICBhbHBoYWJldDY0WyhyZWdpc3RlciA8PCAyKSAmIDB4M2ZdICtcbiAgICAgICAgcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBFcnJvcihgaW50ZXJuYWw6IGJhZCBxdWFudHVtICR7cXVhbnR1bX1gKTtcbiAgfVxuICByZXR1cm4gc3RyaW5nO1xufTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmpzRW5jb2RlQmFzZTY0KGpzRW5jb2RlQmFzZTY0KTtcbiAgICAgICBjb25zdCBlbmNvZGVCYXNlNjQgPVxuICBnbG9iYWxUaGlzLkJhc2U2NCAhPT0gdW5kZWZpbmVkID8gZ2xvYmFsVGhpcy5CYXNlNjQuZW5jb2RlIDoganNFbmNvZGVCYXNlNjQ7JGjNj19vbmNlLmVuY29kZUJhc2U2NChlbmNvZGVCYXNlNjQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsianNFbmNvZGVCYXNlNjQiOlsianNFbmNvZGVCYXNlNjQiXSwiZW5jb2RlQmFzZTY0IjpbImVuY29kZUJhc2U2NCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADUTf83SgIAAEoCAAAlAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvaWRlbnQtY2hlY2tlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaWRlbnRDaGVja2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vL1xuLy9cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpZGVudENoZWNrZXIgPSAoY29uZCwgX2RldGFpbHMpID0+IGNvbmQ7JGjNj19vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZGVudENoZWNrZXIiOlsiaWRlbnRDaGVja2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH9VFLM0AwAANAMAACIAAABAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWFwLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJvYmplY3RNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Y29uc3QgeyBlbnRyaWVzLCBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBvYmplY3RNYXAgPSAob3JpZ2luYWwsIG1hcEZuKSA9PiB7XG4gIGNvbnN0IGVudHMgPSBlbnRyaWVzKG9yaWdpbmFsKTtcbiAgY29uc3QgbWFwRW50cyA9IGVudHMubWFwKFxuICAgIChbaywgdl0pID0+IC8qICAgICAgICAgICAgICAgICAgICAgICAqLyAoW2ssIG1hcEZuKHYsIGspXSksXG4gICk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSkpO1xufTskaM2PX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im9iamVjdE1hcCI6WyJvYmplY3RNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtwVrcH0CAAB9AgAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvaW1wb3J0LWFyY2hpdmUuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMtZXh0ZXJuYWwuanMiLCIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyJdLCJleHBvcnRzIjpbImxvYWRBcmNoaXZlIiwibG9hZEFyY2hpdmUiXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLWV4dGVybmFsLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLWV4dGVybmFsLmpzXCIsIFtdXSxbXCIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIjpbWyJwYXJzZUFyY2hpdmUiLCJwYXJzZUFyY2hpdmUiXSxbImxvYWRBcmNoaXZlIiwibG9hZEFyY2hpdmUiXSxbImltcG9ydEFyY2hpdmUiLCJpbXBvcnRBcmNoaXZlIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABa1sANICoAACAqAAA2AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvY29tcGFydG1lbnQtbWFwLmpzeyJpbXBvcnRzIjpbIi4vcG9saWN5LWZvcm1hdC5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvbXBhcnRtZW50TWFwIiwic3RyaW5nQ29tcGFyZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydFBhY2thZ2VQb2xpY3k7JGjNj19pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcImFzc2VydFBhY2thZ2VQb2xpY3lcIixbJGjNj19hID0+IChhc3NlcnRQYWNrYWdlUG9saWN5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuICAgICAgIGNvbnN0IHN0cmluZ0NvbXBhcmUgPSAoYSwgYikgPT4gKGEgPT09IGIgPyAwIDogYSA8IGIgPyAtMSA6IDEpO1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5zdHJpbmdDb21wYXJlKHN0cmluZ0NvbXBhcmUpO1xuZnVuY3Rpb24qIGVudW1lcmF0ZShpdGVyYWJsZSkge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG4gICAgeWllbGQgW2luZGV4LCB2YWx1ZV07XG4gICAgaW5kZXggKz0gMTtcbiAgfVxufVxuXG4vKlxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0RW1wdHlPYmplY3QgPSAob2JqZWN0LCBtZXNzYWdlKSA9PiB7XG4gIGFzc2VydChPYmplY3Qua2V5cyhvYmplY3QpLmxlbmd0aCA9PT0gMCwgbWVzc2FnZSk7XG59O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29uZGl0aW9ucyA9IChjb25kaXRpb25zLCB1cmwpID0+IHtcbiAgaWYgKGNvbmRpdGlvbnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICBhc3NlcnQoXG4gICAgQXJyYXkuaXNBcnJheShjb25kaXRpb25zKSxcbiAgICBgY29uZGl0aW9ucyBtdXN0IGJlIGFuIGFycmF5LCBnb3QgJHtjb25kaXRpb25zfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgdmFsdWVdIG9mIGVudW1lcmF0ZShjb25kaXRpb25zKSkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICB2YWx1ZSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYGNvbmRpdGlvbnNbJHtpbmRleH1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydENvbXBhcnRtZW50TW9kdWxlID0gKGFsbGVnZWRNb2R1bGUsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCB7IGNvbXBhcnRtZW50LCBtb2R1bGUsIHJldGFpbmVkLCAuLi5leHRyYSB9ID0gYWxsZWdlZE1vZHVsZTtcbiAgYXNzZXJ0RW1wdHlPYmplY3QoXG4gICAgZXh0cmEsXG4gICAgYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKHtcbiAgICAgIGV4dHJhLFxuICAgICAgY29tcGFydG1lbnQsXG4gICAgfSl9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgY29tcGFydG1lbnQsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0uY29tcGFydG1lbnQgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShjb21wYXJ0bWVudCl9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbW9kdWxlLFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9Lm1vZHVsZSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKG1vZHVsZSl9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGlmIChyZXRhaW5lZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHJldGFpbmVkLFxuICAgICAgJ2Jvb2xlYW4nLFxuICAgICAgYCR7cGF0aH0ucmV0YWluZWQgbXVzdCBiZSBhIGJvb2xlYW4sIGdvdCAke3EocmV0YWluZWQpfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydEZpbGVNb2R1bGUgPSAoYWxsZWdlZE1vZHVsZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHsgbG9jYXRpb24sIHBhcnNlciwgc2hhNTEyLCAuLi5leHRyYSB9ID0gYWxsZWdlZE1vZHVsZTtcbiAgYXNzZXJ0RW1wdHlPYmplY3QoXG4gICAgZXh0cmEsXG4gICAgYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbG9jYXRpb24sXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ubG9jYXRpb24gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShsb2NhdGlvbil9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgcGFyc2VyLFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LnBhcnNlciBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKHBhcnNlcil9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgaWYgKHNoYTUxMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHNoYTUxMixcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYCR7cGF0aH0uc2hhNTEyIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3Eoc2hhNTEyKX0gaW4gJHtxKHVybCl9YCxcbiAgICApO1xuICB9XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRFeGl0TW9kdWxlID0gKGFsbGVnZWRNb2R1bGUsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCB7IGV4aXQsIC4uLmV4dHJhIH0gPSBhbGxlZ2VkTW9kdWxlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBleGl0LFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LmV4aXQgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShleGl0KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydE1vZHVsZSA9IChhbGxlZ2VkTW9kdWxlLCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3QgbW9kdWxlRGVzY3JpcHRvciA9IE9iamVjdChhbGxlZ2VkTW9kdWxlKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRNb2R1bGUgPT09IG1vZHVsZURlc2NyaXB0b3IgJiYgIUFycmF5LmlzQXJyYXkobW9kdWxlRGVzY3JpcHRvciksXG4gICAgYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRNb2R1bGV9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgY29uc3QgeyBjb21wYXJ0bWVudCwgbW9kdWxlLCBsb2NhdGlvbiwgcGFyc2VyLCBleGl0LCBkZWZlcnJlZEVycm9yIH0gPVxuICAgIG1vZHVsZURlc2NyaXB0b3I7XG4gIGlmIChjb21wYXJ0bWVudCAhPT0gdW5kZWZpbmVkIHx8IG1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0Q29tcGFydG1lbnRNb2R1bGUobW9kdWxlRGVzY3JpcHRvciwgcGF0aCwgdXJsKTtcbiAgfSBlbHNlIGlmIChsb2NhdGlvbiAhPT0gdW5kZWZpbmVkIHx8IHBhcnNlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0RmlsZU1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLCBwYXRoLCB1cmwpO1xuICB9IGVsc2UgaWYgKGV4aXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydEV4aXRNb2R1bGUobW9kdWxlRGVzY3JpcHRvciwgcGF0aCwgdXJsKTtcbiAgfSBlbHNlIGlmIChkZWZlcnJlZEVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgZGVmZXJyZWRFcnJvcixcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYCR7cGF0aH0uZGVmZXJyZWRFcnJvciBtdXN0IGJlIGEgc3RyaW5nIGNvbnRhaWluZyBhbiBlcnJvciBtZXNzYWdlYCxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0gaXMgbm90IGEgdmFsaWQgbW9kdWxlIGRlc2NyaXB0b3IsIGdvdCAke3EoYWxsZWdlZE1vZHVsZSl9IGluICR7cShcbiAgICAgICAgdXJsLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydE1vZHVsZXMgPSAoYWxsZWdlZE1vZHVsZXMsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCBtb2R1bGVzID0gT2JqZWN0KGFsbGVnZWRNb2R1bGVzKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRNb2R1bGVzID09PSBtb2R1bGVzIHx8ICFBcnJheS5pc0FycmF5KG1vZHVsZXMpLFxuICAgIGBtb2R1bGVzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRNb2R1bGVzKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobW9kdWxlcykpIHtcbiAgICBhc3NlcnRNb2R1bGUodmFsdWUsIGAke3BhdGh9Lm1vZHVsZXNbJHtxKGtleSl9XWAsIHVybCk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFBhcnNlcnMgPSAoYWxsZWdlZFBhcnNlcnMsIHBhdGgsIHVybCkgPT4ge1xuICBpZiAoYWxsZWdlZFBhcnNlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwYXJzZXJzID0gT2JqZWN0KGFsbGVnZWRQYXJzZXJzKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRQYXJzZXJzID09PSBwYXJzZXJzICYmICFBcnJheS5pc0FycmF5KHBhcnNlcnMpLFxuICAgIGAke3BhdGh9LnBhcnNlcnMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQYXJzZXJzfSBpbiAke3EodXJsKX1gLFxuICApO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlcnMpKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIGtleSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYGFsbCBrZXlzIG9mICR7cGF0aH0ucGFyc2VycyBtdXN0IGJlIHN0cmluZ3MsIGdvdCAke2tleX0gaW4gJHtxKHVybCl9YCxcbiAgICApO1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICB2YWx1ZSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYCR7cGF0aH0ucGFyc2Vyc1ske3Eoa2V5KX1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFNjb3BlID0gKGFsbGVnZWRTY29wZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHNjb3BlID0gT2JqZWN0KGFsbGVnZWRTY29wZSk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkU2NvcGUgPT09IHNjb3BlICYmICFBcnJheS5pc0FycmF5KHNjb3BlKSxcbiAgICBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFNjb3BlfSBpbiAke3EodXJsKX1gLFxuICApO1xuXG4gIGNvbnN0IHsgY29tcGFydG1lbnQsIC4uLmV4dHJhIH0gPSBzY29wZTtcbiAgYXNzZXJ0RW1wdHlPYmplY3QoXG4gICAgZXh0cmEsXG4gICAgYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBjb21wYXJ0bWVudCxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGNvbXBhcnRtZW50KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFNjb3BlcyA9IChhbGxlZ2VkU2NvcGVzLCBwYXRoLCB1cmwpID0+IHtcbiAgaWYgKGFsbGVnZWRTY29wZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzY29wZXMgPSBPYmplY3QoYWxsZWdlZFNjb3Blcyk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkU2NvcGVzID09PSBzY29wZXMgJiYgIUFycmF5LmlzQXJyYXkoc2NvcGVzKSxcbiAgICBgJHtwYXRofS5zY29wZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZFNjb3Blcyl9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NvcGVzKSkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBrZXksXG4gICAgICAnc3RyaW5nJyxcbiAgICAgIGBhbGwga2V5cyBvZiAke3BhdGh9LnNjb3BlcyBtdXN0IGJlIHN0cmluZ3MsIGdvdCAke2tleX0gaW4gJHtxKHVybCl9YCxcbiAgICApO1xuICAgIGFzc2VydFNjb3BlKHZhbHVlLCBgJHtwYXRofS5zY29wZXNbJHtxKGtleSl9XWAsIHVybCk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFR5cGVzID0gKGFsbGVnZWRUeXBlcywgcGF0aCwgdXJsKSA9PiB7XG4gIGlmIChhbGxlZ2VkVHlwZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0eXBlcyA9IE9iamVjdChhbGxlZ2VkVHlwZXMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZFR5cGVzID09PSB0eXBlcyAmJiAhQXJyYXkuaXNBcnJheSh0eXBlcyksXG4gICAgYCR7cGF0aH0udHlwZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRUeXBlc30gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0eXBlcykpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAga2V5LFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgYWxsIGtleXMgb2YgJHtwYXRofS50eXBlcyBtdXN0IGJlIHN0cmluZ3MsIGdvdCAke2tleX0gaW4gJHtxKHVybCl9YCxcbiAgICApO1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICB2YWx1ZSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYCR7cGF0aH0udHlwZXNbJHtxKGtleSl9XSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCxcbiAgICApO1xuICB9XG59O1xuXG4vKlxuXG5cblxuICovXG5cbmNvbnN0IGFzc2VydFBvbGljeSA9IChcbiAgYWxsZWdlZFBvbGljeSxcbiAgcGF0aCxcbiAgdXJsID0gJzx1bmtub3duLWNvbXBhcnRtZW50LW1hcC5qc29uPicsXG4pID0+IHtcbiAgYXNzZXJ0UGFja2FnZVBvbGljeShhbGxlZ2VkUG9saWN5LCBgJHtwYXRofS5wb2xpY3lgLCB1cmwpO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnQgPSAoYWxsZWdlZENvbXBhcnRtZW50LCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3QgY29tcGFydG1lbnQgPSBPYmplY3QoYWxsZWdlZENvbXBhcnRtZW50KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRDb21wYXJ0bWVudCA9PT0gY29tcGFydG1lbnQgJiYgIUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnQpLFxuICAgIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnR9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgY29uc3Qge1xuICAgIGxvY2F0aW9uLFxuICAgIG5hbWUsXG4gICAgbGFiZWwsXG4gICAgcGFyc2VycyxcbiAgICB0eXBlcyxcbiAgICBzY29wZXMsXG4gICAgbW9kdWxlcyxcbiAgICBwb2xpY3ksXG4gICAgLi4uZXh0cmFcbiAgfSA9IGNvbXBhcnRtZW50O1xuXG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuXG4gIGFzc2VydC50eXBlb2YoXG4gICAgbG9jYXRpb24sXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ubG9jYXRpb24gaW4gJHtxKHVybCl9IG11c3QgYmUgc3RyaW5nLCBnb3QgJHtxKGxvY2F0aW9uKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIG5hbWUsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ubmFtZSBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobmFtZSl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBsYWJlbCxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5sYWJlbCBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobGFiZWwpfWAsXG4gICk7XG5cbiAgYXNzZXJ0TW9kdWxlcyhtb2R1bGVzLCBwYXRoLCB1cmwpO1xuICBhc3NlcnRQYXJzZXJzKHBhcnNlcnMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFNjb3BlcyhzY29wZXMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFR5cGVzKHR5cGVzLCBwYXRoLCB1cmwpO1xuICBhc3NlcnRQb2xpY3kocG9saWN5LCBwYXRoLCB1cmwpO1xufTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGFzc2VydENvbXBhcnRtZW50cyA9IChhbGxlZ2VkQ29tcGFydG1lbnRzLCB1cmwpID0+IHtcbiAgY29uc3QgY29tcGFydG1lbnRzID0gT2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudHMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZENvbXBhcnRtZW50cyA9PT0gY29tcGFydG1lbnRzIHx8ICFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50cyksXG4gICAgYGNvbXBhcnRtZW50cyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkQ29tcGFydG1lbnRzKX0gaW4gJHtxKFxuICAgICAgdXJsLFxuICAgICl9YCxcbiAgKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcGFydG1lbnRzKSkge1xuICAgIGFzc2VydENvbXBhcnRtZW50KHZhbHVlLCBgY29tcGFydG1lbnRzWyR7cShrZXkpfV1gLCB1cmwpO1xuICB9XG59O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0RW50cnkgPSAoYWxsZWdlZEVudHJ5LCB1cmwpID0+IHtcbiAgY29uc3QgZW50cnkgPSBPYmplY3QoYWxsZWdlZEVudHJ5KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRFbnRyeSA9PT0gZW50cnkgJiYgIUFycmF5LmlzQXJyYXkoZW50cnkpLFxuICAgIGBcImVudHJ5XCIgbXVzdCBiZSBhbiBvYmplY3QgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHthbGxlZ2VkRW50cnl9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG4gIGNvbnN0IHsgY29tcGFydG1lbnQsIG1vZHVsZSwgLi4uZXh0cmEgfSA9IGVudHJ5O1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgXCJlbnRyeVwiIG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBjb21wYXJ0bWVudCxcbiAgICAnc3RyaW5nJyxcbiAgICBgZW50cnkuY29tcGFydG1lbnQgbXVzdCBiZSBhIHN0cmluZyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke2NvbXBhcnRtZW50fSBpbiAke3EoXG4gICAgICB1cmwsXG4gICAgKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIG1vZHVsZSxcbiAgICAnc3RyaW5nJyxcbiAgICBgZW50cnkubW9kdWxlIG11c3QgYmUgYSBzdHJpbmcgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHttb2R1bGV9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG59O1xuXG4vKlxuXG5cblxuICovXG5cbiAgICAgICBjb25zdCBhc3NlcnRDb21wYXJ0bWVudE1hcCA9IChcbiAgYWxsZWdlZENvbXBhcnRtZW50TWFwLFxuICB1cmwgPSAnPHVua25vd24tY29tcGFydG1lbnQtbWFwLmpzb24+JyxcbikgPT4ge1xuICBjb25zdCBjb21wYXJ0bWVudE1hcCA9IE9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnRNYXApO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZENvbXBhcnRtZW50TWFwID09PSBjb21wYXJ0bWVudE1hcCAmJiAhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudE1hcCksXG4gICAgYENvbXBhcnRtZW50IG1hcCBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZENvbXBhcnRtZW50TWFwfSBpbiAke3EoXG4gICAgICB1cmwsXG4gICAgKX1gLFxuICApO1xuICBjb25zdCB7XG4gICAgLy9cbiAgICAvL1xuICAgIHRhZ3M6IGNvbmRpdGlvbnMsXG4gICAgZW50cnksXG4gICAgY29tcGFydG1lbnRzLFxuICAgIC4uLmV4dHJhXG4gIH0gPSBPYmplY3QoY29tcGFydG1lbnRNYXApO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgQ29tcGFydG1lbnQgbWFwIG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBhc3NlcnRDb25kaXRpb25zKGNvbmRpdGlvbnMsIHVybCk7XG4gIGFzc2VydEVudHJ5KGVudHJ5LCB1cmwpO1xuICBhc3NlcnRDb21wYXJ0bWVudHMoY29tcGFydG1lbnRzLCB1cmwpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29tcGFydG1lbnRNYXAoYXNzZXJ0Q29tcGFydG1lbnRNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5nQ29tcGFyZSI6WyJzdHJpbmdDb21wYXJlIl0sImFzc2VydENvbXBhcnRtZW50TWFwIjpbImFzc2VydENvbXBhcnRtZW50TWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXX7gs6AwAAOgMAADAAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9leHRlbnNpb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInBhcnNlRXh0ZW5zaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBhcnNlRXh0ZW5zaW9uID0gbG9jYXRpb24gPT4ge1xuICBjb25zdCBsYXN0U2xhc2ggPSBsb2NhdGlvbi5sYXN0SW5kZXhPZignLycpO1xuICBpZiAobGFzdFNsYXNoIDwgMCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBiYXNlID0gbG9jYXRpb24uc2xpY2UobGFzdFNsYXNoICsgMSk7XG4gIGNvbnN0IGxhc3REb3QgPSBiYXNlLmxhc3RJbmRleE9mKCcuJyk7XG4gIGlmIChsYXN0RG90IDwgMCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICByZXR1cm4gYmFzZS5zbGljZShsYXN0RG90ICsgMSk7XG59OyRozY9fb25jZS5wYXJzZUV4dGVuc2lvbihwYXJzZUV4dGVuc2lvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUV4dGVuc2lvbiI6WyJwYXJzZUV4dGVuc2lvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACBGJrfsy0AALMtAAA6AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qc3siaW1wb3J0cyI6WyJAZW5kby96aXAiLCIuL2xpbmsuanMiLCIuL2pzb24uanMiLCIuL3Bvd2Vycy5qcyIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9jb21wYXJ0bWVudC1tYXAuanMiLCIuL2ltcG9ydC1ob29rLmpzIiwiLi9wb2xpY3kuanMiXSwiZXhwb3J0cyI6WyJpbXBvcnRBcmNoaXZlIiwibG9hZEFyY2hpdmUiLCJwYXJzZUFyY2hpdmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBaaXBSZWFkZXIsbGluayxwYXJzZUxvY2F0ZWRKc29uLHVucGFja1JlYWRQb3dlcnMsam9pbixhc3NlcnRDb21wYXJ0bWVudE1hcCxleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyLGF0dGVudWF0ZU1vZHVsZUhvb2ssZW5mb3JjZU1vZHVsZVBvbGljeTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3ppcFwiLCBbW1wiWmlwUmVhZGVyXCIsWyRozY9fYSA9PiAoWmlwUmVhZGVyID0gJGjNj19hKV1dXV0sW1wiLi9saW5rLmpzXCIsIFtbXCJsaW5rXCIsWyRozY9fYSA9PiAobGluayA9ICRozY9fYSldXV1dLFtcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLFskaM2PX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaM2PX2EpXV1dXSxbXCIuL3Bvd2Vycy5qc1wiLCBbW1widW5wYWNrUmVhZFBvd2Vyc1wiLFskaM2PX2EgPT4gKHVucGFja1JlYWRQb3dlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wiam9pblwiLFskaM2PX2EgPT4gKGpvaW4gPSAkaM2PX2EpXV1dXSxbXCIuL2NvbXBhcnRtZW50LW1hcC5qc1wiLCBbW1wiYXNzZXJ0Q29tcGFydG1lbnRNYXBcIixbJGjNj19hID0+IChhc3NlcnRDb21wYXJ0bWVudE1hcCA9ICRozY9fYSldXV1dLFtcIi4vaW1wb3J0LWhvb2suanNcIiwgW1tcImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXJcIixbJGjNj19hID0+IChleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyID0gJGjNj19hKV1dXV0sW1wiLi9wb2xpY3kuanNcIiwgW1tcImF0dGVudWF0ZU1vZHVsZUhvb2tcIixbJGjNj19hID0+IChhdHRlbnVhdGVNb2R1bGVIb29rID0gJGjNj19hKV1dLFtcImVuZm9yY2VNb2R1bGVQb2xpY3lcIixbJGjNj19hID0+IChlbmZvcmNlTW9kdWxlUG9saWN5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBGYWlsLCBxdW90ZTogcSB9ID0gYXNzZXJ0O1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG5jb25zdCB7IGFzc2lnbiwgY3JlYXRlLCBmcmVlemUgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IHBvc3Rwb25lRXJyb3JUb0V4ZWN1dGUgPSBlcnJvck1lc3NhZ2UgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuXG4gIGNvbnN0IHJlY29yZCA9IGZyZWV6ZSh7XG4gICAgaW1wb3J0czogW10sXG4gICAgZXhwb3J0czogW10sXG4gICAgZXhlY3V0ZTogKCkgPT4ge1xuICAgICAgdGhyb3cgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gcmVjb3JkO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIgPSAoXG4gIGdldCxcbiAgY29tcGFydG1lbnRzLFxuICBhcmNoaXZlTG9jYXRpb24sXG4gIHBhcnNlckZvckxhbmd1YWdlLFxuICBjb21wdXRlU2hhNTEyID0gdW5kZWZpbmVkLFxuICBjb21wdXRlU291cmNlTG9jYXRpb24gPSB1bmRlZmluZWQsXG4gIGV4aXRNb2R1bGVJbXBvcnRIb29rID0gdW5kZWZpbmVkLFxuICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24gPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1ha2VJbXBvcnRIb29rID0gKHtcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgcGFja2FnZU5hbWUsXG4gICAgYXR0ZW51YXRvcnNcbiAgICAvL1xuICAgIC8vXG4gIH0pID0+IHtcbiAgICAvL1xuICAgIGNvbnN0IGNvbXBhcnRtZW50RGVzY3JpcHRvciA9IGNvbXBhcnRtZW50c1twYWNrYWdlTG9jYXRpb25dO1xuICAgIGNvbnN0IHsgbW9kdWxlcyB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBpbXBvcnRIb29rID0gYXN5bmMgbW9kdWxlU3BlY2lmaWVyID0+IHtcbiAgICAgIGF3YWl0IG51bGw7XG4gICAgICAvL1xuICAgICAgY29uc3QgbW9kdWxlID0gbW9kdWxlc1ttb2R1bGVTcGVjaWZpZXJdO1xuICAgICAgaWYgKG1vZHVsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChleGl0TW9kdWxlSW1wb3J0SG9vaykge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLCBjb21wYXJ0bWVudERlc2NyaXB0b3IsIHtcbiAgICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgICBlcnJvckhpbnQ6IGBCbG9ja2VkIGluIGxvYWRpbmcuICR7cShcbiAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgKX0gd2FzIG5vdCBpbiB0aGUgYXJjaGl2ZSBhbmQgYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBsb2FkIGl0IGFzIGEgYnVpbHRpbmAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgZXhpdE1vZHVsZUltcG9ydEhvb2soXG4gICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVjb3JkKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICByZWNvcmQ6IGF3YWl0IGF0dGVudWF0ZU1vZHVsZUhvb2soXG4gICAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuICAgICAgICAgICAgICAgIGF0dGVudWF0b3JzLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBzcGVjaWZpZXI6IG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHJldHVybiBwb3N0cG9uZUVycm9yVG9FeGVjdXRlKFxuICAgICAgICAgICAgICBgQ2Fubm90IGZpbmQgZXh0ZXJuYWwgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbiAgICAgICAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICAgICl9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgZmluZCBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9IGluIHBhY2thZ2UgJHtxKFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICl9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2R1bGUuZGVmZXJyZWRFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBwb3N0cG9uZUVycm9yVG9FeGVjdXRlKG1vZHVsZS5kZWZlcnJlZEVycm9yKTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2R1bGUucGFyc2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBwYXJzZSBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9IGluIHBhY2thZ2UgJHtxKFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICl9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcnNlciA9IHBhcnNlckZvckxhbmd1YWdlW21vZHVsZS5wYXJzZXJdO1xuICAgICAgaWYgKHBhcnNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgcGFyc2UgJHtxKG1vZHVsZS5wYXJzZXIpfSBtb2R1bGUgJHtxKFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICl9IGluIHBhY2thZ2UgJHtxKHBhY2thZ2VMb2NhdGlvbil9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgcGFyc2UgfSA9IHBhcnNlcjtcbiAgICAgIGNvbnN0IG1vZHVsZUxvY2F0aW9uID0gYCR7cGFja2FnZUxvY2F0aW9ufS8ke21vZHVsZS5sb2NhdGlvbn1gO1xuICAgICAgY29uc3QgbW9kdWxlQnl0ZXMgPSBnZXQobW9kdWxlTG9jYXRpb24pO1xuXG4gICAgICBpZiAoY29tcHV0ZVNoYTUxMiAhPT0gdW5kZWZpbmVkICYmIG1vZHVsZS5zaGE1MTIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBzaGE1MTIgPSBjb21wdXRlU2hhNTEyKG1vZHVsZUJ5dGVzKTtcbiAgICAgICAgaWYgKHNoYTUxMiAhPT0gbW9kdWxlLnNoYTUxMikge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYE1vZHVsZSAke3EobW9kdWxlLmxvY2F0aW9uKX0gb2YgcGFja2FnZSAke3EoXG4gICAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICAgICl9IGluIGFyY2hpdmUgJHtxKFxuICAgICAgICAgICAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgICAgICAgICApfSBmYWlsZWQgYSBTSEEtNTEyIGludGVncml0eSBjaGVja2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc291cmNlTG9jYXRpb24gPSBgZmlsZTovLy8ke21vZHVsZUxvY2F0aW9ufWA7XG4gICAgICBpZiAocGFja2FnZU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBiYXNlID0gcGFja2FnZU5hbWUuc3BsaXQoJy8nKS5zbGljZSgtMSkuam9pbignLycpO1xuICAgICAgICBzb3VyY2VMb2NhdGlvbiA9IGAuLi4vJHtqb2luKGJhc2UsIG1vZHVsZVNwZWNpZmllcil9YDtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wdXRlU291cmNlTG9jYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzb3VyY2VMb2NhdGlvbiA9XG4gICAgICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uKHBhY2thZ2VMb2NhdGlvbiwgbW9kdWxlU3BlY2lmaWVyKSB8fFxuICAgICAgICAgIHNvdXJjZUxvY2F0aW9uO1xuICAgICAgfVxuXG4gICAgICBsZXQgc291cmNlTWFwVXJsO1xuICAgICAgaWYgKFxuICAgICAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBtb2R1bGUuc2hhNTEyICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICBzb3VyY2VNYXBVcmwgPSBjb21wdXRlU291cmNlTWFwTG9jYXRpb24oe1xuICAgICAgICAgIGNvbXBhcnRtZW50OiBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgbW9kdWxlOiBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgbG9jYXRpb246IHNvdXJjZUxvY2F0aW9uLFxuICAgICAgICAgIHNoYTUxMjogbW9kdWxlLnNoYTUxMixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vXG4gICAgICBjb25zdCB7IHJlY29yZCB9ID0gYXdhaXQgcGFyc2UoXG4gICAgICAgIG1vZHVsZUJ5dGVzLFxuICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgIHNvdXJjZUxvY2F0aW9uLFxuICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VNYXBVcmwsXG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IHJlY29yZCwgc3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIgfTtcbiAgICB9O1xuICAgIHJldHVybiBpbXBvcnRIb29rO1xuICB9O1xuICByZXR1cm4gbWFrZUltcG9ydEhvb2s7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwYXJzZUFyY2hpdmUgPSBhc3luYyAoXG4gIGFyY2hpdmVCeXRlcyxcbiAgYXJjaGl2ZUxvY2F0aW9uID0gJzx1bmtub3duPicsXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBhd2FpdCBudWxsO1xuICBjb25zdCB7XG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBleHBlY3RlZFNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBjb21wdXRlU291cmNlTG9jYXRpb24gPSB1bmRlZmluZWQsXG4gICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uID0gdW5kZWZpbmVkLFxuICAgIENvbXBhcnRtZW50OiBDb21wYXJ0bWVudFBhcnNlT3B0aW9uID0gQ29tcGFydG1lbnQsXG4gICAgbW9kdWxlcyA9IHVuZGVmaW5lZCxcbiAgICBpbXBvcnRIb29rOiBleGl0TW9kdWxlSW1wb3J0SG9vayA9IHVuZGVmaW5lZCxcbiAgICBwYXJzZXJGb3JMYW5ndWFnZTogcGFyc2VyRm9yTGFuZ3VhZ2VPcHRpb24gPSB7fSxcbiAgICBfX25hdGl2ZV9fID0gZmFsc2UsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHBhcnNlckZvckxhbmd1YWdlID0gZnJlZXplKFxuICAgIGFzc2lnbihjcmVhdGUobnVsbCksIHBhcnNlckZvckxhbmd1YWdlT3B0aW9uKSxcbiAgKTtcblxuICBjb25zdCBhcmNoaXZlID0gbmV3IFppcFJlYWRlcihhcmNoaXZlQnl0ZXMsIHsgbmFtZTogYXJjaGl2ZUxvY2F0aW9uIH0pO1xuXG4gIC8vXG4gIGNvbnN0IHVuc2VlbiA9IG5ldyBTZXQoYXJjaGl2ZS5maWxlcy5rZXlzKCkpO1xuICB1bnNlZW4uc2l6ZSA+PSAyIHx8XG4gICAgRmFpbGBBcmNoaXZlIGZhaWxlZCBzYW5pdHkgY2hlY2s6IHNob3VsZCBjb250YWluIGF0IGxlYXN0IGEgY29tcGFydG1lbnQgbWFwIGZpbGUgYW5kIG9uZSBtb2R1bGUgZmlsZSBpbiAke3EoXG4gICAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgKX1gO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGdldCA9IHBhdGggPT4ge1xuICAgIHVuc2Vlbi5kZWxldGUocGF0aCk7XG4gICAgcmV0dXJuIGFyY2hpdmUucmVhZChwYXRoKTtcbiAgfTtcblxuICBjb25zdCBjb21wYXJ0bWVudE1hcEJ5dGVzID0gZ2V0KCdjb21wYXJ0bWVudC1tYXAuanNvbicpO1xuXG4gIGxldCBzaGE1MTI7XG4gIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICBzaGE1MTIgPSBjb21wdXRlU2hhNTEyKGNvbXBhcnRtZW50TWFwQnl0ZXMpO1xuICB9XG4gIGlmIChleHBlY3RlZFNoYTUxMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNoYTUxMiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYENhbm5vdCB2ZXJpZnkgZXhwZWN0ZWRTaGE1MTIgd2l0aG91dCBhbHNvIHByb3ZpZGluZyBjb21wdXRlU2hhNTEyLCBmb3IgYXJjaGl2ZSAke2FyY2hpdmVMb2NhdGlvbn1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHNoYTUxMiAhPT0gZXhwZWN0ZWRTaGE1MTIpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgQXJjaGl2ZSBjb21wYXJ0bWVudCBtYXAgZmFpbGVkIGEgU0hBLTUxMiBpbnRlZ3JpdHkgY2hlY2ssIGV4cGVjdGVkICR7ZXhwZWN0ZWRTaGE1MTJ9LCBnb3QgJHtzaGE1MTJ9LCBmb3IgYXJjaGl2ZSAke2FyY2hpdmVMb2NhdGlvbn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY29tcGFydG1lbnRNYXBUZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGNvbXBhcnRtZW50TWFwQnl0ZXMpO1xuICBjb25zdCBjb21wYXJ0bWVudE1hcCA9IHBhcnNlTG9jYXRlZEpzb24oXG4gICAgY29tcGFydG1lbnRNYXBUZXh0LFxuICAgICdjb21wYXJ0bWVudC1tYXAuanNvbicsXG4gICk7XG4gIGFzc2VydENvbXBhcnRtZW50TWFwKGNvbXBhcnRtZW50TWFwLCBhcmNoaXZlTG9jYXRpb24pO1xuXG4gIGNvbnN0IHtcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgZW50cnk6IHsgbW9kdWxlOiBlbnRyeU1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnQ6IGVudHJ5Q29tcGFydG1lbnROYW1lIH0sXG4gIH0gPSBjb21wYXJ0bWVudE1hcDtcblxuICBjb25zdCBjb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rID0gZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcih7XG4gICAgbW9kdWxlcyxcbiAgICBleGl0TW9kdWxlSW1wb3J0SG9vayxcbiAgICBlbnRyeUNvbXBhcnRtZW50TmFtZSxcbiAgfSk7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaWYgKGNvbXB1dGVTaGE1MTIgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG1ha2VJbXBvcnRIb29rID0gbWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIoXG4gICAgICBnZXQsXG4gICAgICBjb21wYXJ0bWVudHMsXG4gICAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIGNvbXB1dGVTaGE1MTIsXG4gICAgICBjb21wdXRlU291cmNlTG9jYXRpb24sXG4gICAgICBjb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rLFxuICAgICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uLFxuICAgICk7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB7IGNvbXBhcnRtZW50LCBwZW5kaW5nSm9ic1Byb21pc2UgfSA9IGxpbmsoY29tcGFydG1lbnRNYXAsIHtcbiAgICAgIG1ha2VJbXBvcnRIb29rLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBtb2R1bGVzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5rZXlzKG1vZHVsZXMgfHwge30pLm1hcChzcGVjaWZpZXIgPT4ge1xuICAgICAgICAgIHJldHVybiBbc3BlY2lmaWVyLCB7IG5hbWVzcGFjZToge30gfV07XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIENvbXBhcnRtZW50OiBDb21wYXJ0bWVudFBhcnNlT3B0aW9uLFxuICAgICAgX19uYXRpdmVfXyxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlbmRpbmdKb2JzUHJvbWlzZTtcblxuICAgIGF3YWl0IGNvbXBhcnRtZW50LmxvYWQoZW50cnlNb2R1bGVTcGVjaWZpZXIpO1xuICAgIHVuc2Vlbi5zaXplID09PSAwIHx8XG4gICAgICBGYWlsYEFyY2hpdmUgY29udGFpbnMgZXh0cmFuZW91cyBmaWxlczogJHtxKFsuLi51bnNlZW5dKX0gaW4gJHtxKFxuICAgICAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgICApfWA7XG4gIH1cblxuICAvKiAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZXhlY3V0ZSA9IGFzeW5jIG9wdGlvbnMgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGdsb2JhbHMsXG4gICAgICBtb2R1bGVzLFxuICAgICAgdHJhbnNmb3JtcyxcbiAgICAgIF9fc2hpbVRyYW5zZm9ybXNfXyxcbiAgICAgIENvbXBhcnRtZW50OiBDb21wYXJ0bWVudE9wdGlvbiA9IENvbXBhcnRtZW50UGFyc2VPcHRpb24sXG4gICAgICBfX25hdGl2ZV9fLFxuICAgICAgaW1wb3J0SG9vazogZXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgfSA9IG9wdGlvbnMgfHwge307XG5cbiAgICBjb25zdCBjb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rID0gZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcih7XG4gICAgICBtb2R1bGVzLFxuICAgICAgZXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgICBlbnRyeUNvbXBhcnRtZW50TmFtZSxcbiAgICB9KTtcbiAgICBjb25zdCBtYWtlSW1wb3J0SG9vayA9IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyKFxuICAgICAgZ2V0LFxuICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgICAgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayxcbiAgICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICApO1xuICAgIGNvbnN0IHsgY29tcGFydG1lbnQsIHBlbmRpbmdKb2JzUHJvbWlzZSB9ID0gbGluayhjb21wYXJ0bWVudE1hcCwge1xuICAgICAgbWFrZUltcG9ydEhvb2ssXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIGdsb2JhbHMsXG4gICAgICBtb2R1bGVzLFxuICAgICAgdHJhbnNmb3JtcyxcbiAgICAgIF9fc2hpbVRyYW5zZm9ybXNfXyxcbiAgICAgIENvbXBhcnRtZW50OiBDb21wYXJ0bWVudE9wdGlvbixcbiAgICAgIF9fbmF0aXZlX18sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbiAgICAvL1xuICAgIHJldHVybiBjb21wYXJ0bWVudFsnaW1wb3J0J10oZW50cnlNb2R1bGVTcGVjaWZpZXIpO1xuICB9O1xuXG4gIHJldHVybiB7IGltcG9ydDogZXhlY3V0ZSwgc2hhNTEyIH07XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UucGFyc2VBcmNoaXZlKHBhcnNlQXJjaGl2ZSk7XG4gICAgICAgY29uc3QgbG9hZEFyY2hpdmUgPSBhc3luYyAoXG4gIHJlYWRQb3dlcnMsXG4gIGFyY2hpdmVMb2NhdGlvbixcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHsgcmVhZCwgY29tcHV0ZVNoYTUxMiB9ID0gdW5wYWNrUmVhZFBvd2VycyhyZWFkUG93ZXJzKTtcbiAgY29uc3Qge1xuICAgIGV4cGVjdGVkU2hhNTEyLFxuICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICBtb2R1bGVzLFxuICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFyY2hpdmVCeXRlcyA9IGF3YWl0IHJlYWQoYXJjaGl2ZUxvY2F0aW9uKTtcbiAgcmV0dXJuIHBhcnNlQXJjaGl2ZShhcmNoaXZlQnl0ZXMsIGFyY2hpdmVMb2NhdGlvbiwge1xuICAgIGNvbXB1dGVTaGE1MTIsXG4gICAgZXhwZWN0ZWRTaGE1MTIsXG4gICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgIG1vZHVsZXMsXG4gICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uLFxuICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5sb2FkQXJjaGl2ZShsb2FkQXJjaGl2ZSk7XG4gICAgICAgY29uc3QgaW1wb3J0QXJjaGl2ZSA9IGFzeW5jIChyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgYXJjaGl2ZSA9IGF3YWl0IGxvYWRBcmNoaXZlKHJlYWRQb3dlcnMsIGFyY2hpdmVMb2NhdGlvbiwgb3B0aW9ucyk7XG4gIHJldHVybiBhcmNoaXZlLmltcG9ydChvcHRpb25zKTtcbn07JGjNj19vbmNlLmltcG9ydEFyY2hpdmUoaW1wb3J0QXJjaGl2ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACq7NjjNgUAADYFAAA9AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qc3siaW1wb3J0cyI6WyIuL3BhcnNlLXByZS1janMuanMiLCIuL3BhcnNlLWpzb24uanMiLCIuL3BhcnNlLXRleHQuanMiLCIuL3BhcnNlLWJ5dGVzLmpzIiwiLi9wYXJzZS1wcmUtbWpzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VyUHJlQ2pzLHBhcnNlckpzb24scGFyc2VyVGV4dCxwYXJzZXJCeXRlcyxwYXJzZXJQcmVNanM7JGjNj19pbXBvcnRzKFtbXCIuL3BhcnNlLXByZS1janMuanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChwYXJzZXJQcmVDanMgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcnNlLWpzb24uanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChwYXJzZXJKc29uID0gJGjNj19hKV1dXV0sW1wiLi9wYXJzZS10ZXh0LmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VyVGV4dCA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtYnl0ZXMuanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChwYXJzZXJCeXRlcyA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtcHJlLW1qcy5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKHBhcnNlclByZU1qcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UgPSBPYmplY3QuZnJlZXplKFxuICAvKiAgICAgICAgICAgICAgICAqLyAoe1xuICAgICdwcmUtY2pzLWpzb24nOiBwYXJzZXJQcmVDanMsXG4gICAgJ3ByZS1tanMtanNvbic6IHBhcnNlclByZU1qcyxcbiAgICBqc29uOiBwYXJzZXJKc29uLFxuICAgIHRleHQ6IHBhcnNlclRleHQsXG4gICAgYnl0ZXM6IHBhcnNlckJ5dGVzLFxuICB9KSxcbik7JGjNj19vbmNlLmRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZShkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlIjpbImRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADLW9tx4AgAAOAIAAA1AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvaW1wb3J0LWFyY2hpdmUuanN7ImltcG9ydHMiOlsiLi9pbXBvcnQtYXJjaGl2ZS1wYXJzZXJzLmpzIiwiLi9pbXBvcnQtYXJjaGl2ZS1saXRlLmpzIl0sImV4cG9ydHMiOlsiaW1wb3J0QXJjaGl2ZSIsImxvYWRBcmNoaXZlIiwicGFyc2VBcmNoaXZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlLHBhcnNlQXJjaGl2ZUxpdGUsbG9hZEFyY2hpdmVMaXRlLGltcG9ydEFyY2hpdmVMaXRlOyRozY9faW1wb3J0cyhbW1wiLi9pbXBvcnQtYXJjaGl2ZS1wYXJzZXJzLmpzXCIsIFtbXCJkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2VcIixbJGjNj19hID0+IChkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UgPSAkaM2PX2EpXV1dXSxbXCIuL2ltcG9ydC1hcmNoaXZlLWxpdGUuanNcIiwgW1tcInBhcnNlQXJjaGl2ZVwiLFskaM2PX2EgPT4gKHBhcnNlQXJjaGl2ZUxpdGUgPSAkaM2PX2EpXV0sW1wibG9hZEFyY2hpdmVcIixbJGjNj19hID0+IChsb2FkQXJjaGl2ZUxpdGUgPSAkaM2PX2EpXV0sW1wiaW1wb3J0QXJjaGl2ZVwiLFskaM2PX2EgPT4gKGltcG9ydEFyY2hpdmVMaXRlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGFzc2lnbiwgY3JlYXRlLCBmcmVlemUgfSA9IE9iamVjdDtcblxuLy9cbi8vXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2UgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHsgcGFyc2VyRm9yTGFuZ3VhZ2U6IHBhcnNlckZvckxhbmd1YWdlT3B0aW9uLCAuLi5yZXN0IH0gPSBvcHRpb25zO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwYXJzZXJGb3JMYW5ndWFnZSA9IGZyZWV6ZShcbiAgICBhc3NpZ24oY3JlYXRlKG51bGwpLCBkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UsIHBhcnNlckZvckxhbmd1YWdlT3B0aW9uKSxcbiAgKTtcbiAgcmV0dXJuIHsgLi4ucmVzdCwgcGFyc2VyRm9yTGFuZ3VhZ2UgfTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBhcnNlQXJjaGl2ZSA9IGFzeW5jIChcbiAgYXJjaGl2ZUJ5dGVzLFxuICBhcmNoaXZlTG9jYXRpb24gPSAnPHVua25vd24+JyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PlxuICBwYXJzZUFyY2hpdmVMaXRlKFxuICAgIGFyY2hpdmVCeXRlcyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5wYXJzZUFyY2hpdmUocGFyc2VBcmNoaXZlKTtcbiAgICAgICBjb25zdCBsb2FkQXJjaGl2ZSA9IGFzeW5jIChyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpID0+XG4gIGxvYWRBcmNoaXZlTGl0ZShcbiAgICByZWFkUG93ZXJzLFxuICAgIGFyY2hpdmVMb2NhdGlvbixcbiAgICBhc3NpZ25QYXJzZXJGb3JMYW5ndWFnZShvcHRpb25zKSxcbiAgKTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmxvYWRBcmNoaXZlKGxvYWRBcmNoaXZlKTtcbiAgICAgICBjb25zdCBpbXBvcnRBcmNoaXZlID0gYXN5bmMgKHJlYWRQb3dlcnMsIGFyY2hpdmVMb2NhdGlvbiwgb3B0aW9ucykgPT5cbiAgaW1wb3J0QXJjaGl2ZUxpdGUoXG4gICAgcmVhZFBvd2VycyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7JGjNj19vbmNlLmltcG9ydEFyY2hpdmUoaW1wb3J0QXJjaGl2ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD7Lrj+nFQAAJxUAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvaW1wb3J0LWhvb2suanN7ImltcG9ydHMiOlsiQGVuZG8vdHJhbXBvbGluZSIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9wb2xpY3kuanMiLCIuL3Bvd2Vycy5qcyJdLCJleHBvcnRzIjpbImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiLCJtYWtlSW1wb3J0SG9va01ha2VyIiwibWFrZUltcG9ydE5vd0hvb2tNYWtlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzeW5jVHJhbXBvbGluZSxzeW5jVHJhbXBvbGluZSxyZXNvbHZlLGF0dGVudWF0ZU1vZHVsZUhvb2ssQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQsZW5mb3JjZU1vZHVsZVBvbGljeSx1bnBhY2tSZWFkUG93ZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vdHJhbXBvbGluZVwiLCBbW1wiYXN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoYXN5bmNUcmFtcG9saW5lID0gJGjNj19hKV1dLFtcInN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoc3luY1RyYW1wb2xpbmUgPSAkaM2PX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wicmVzb2x2ZVwiLFskaM2PX2EgPT4gKHJlc29sdmUgPSAkaM2PX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaM2PX2EpXV0sW1wiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRcIixbJGjNj19hID0+IChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICRozY9fYSldXSxbXCJlbmZvcmNlTW9kdWxlUG9saWN5XCIsWyRozY9fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRozY9fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsWyRozY9fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VJbXBvcnROb3dIb29rTWFrZXIsJ25hbWUnLHt2YWx1ZTpcIm1ha2VJbXBvcnROb3dIb29rTWFrZXJcIn0pOyRozY9fb25jZS5tYWtlSW1wb3J0Tm93SG9va01ha2VyKG1ha2VJbXBvcnROb3dIb29rTWFrZXIpO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZnJlZXplID0gT2JqZWN0LmZyZWV6ZTtcblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzLCBhc3NpZ24sIGNyZWF0ZSB9ID0gT2JqZWN0O1xuXG5jb25zdCB7IGhhc093blByb3BlcnR5IH0gPSBPYmplY3QucHJvdG90eXBlO1xuLypcblxuXG4gKi9cbmNvbnN0IGhhcyA9IChoYXlzdGFjaywgbmVlZGxlKSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgaGF5c3RhY2ssIFtuZWVkbGVdKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgcmVzb2x2ZUxvY2F0aW9uID0gKHJlbCwgYWJzKSA9PiBuZXcgVVJMKHJlbCwgYWJzKS50b1N0cmluZygpO1xuXG4vL1xuZnVuY3Rpb24gZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSB7XG4gIHJldHVybiAoaGFzKHJlY29yZCwgJ3JlY29yZCcpID8gcmVjb3JkLnJlY29yZC5pbXBvcnRzIDogcmVjb3JkLmltcG9ydHMpIHx8IFtdO1xufVxuXG4vL1xuLy9cbmNvbnN0IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyA9IFtcbiAgLy9cbiAgJy5qcycsXG4gICcuanNvbicsXG4gICcubm9kZScsXG4gIC8vXG4gICcvaW5kZXguanMnLFxuICAnL2luZGV4Lmpzb24nLFxuICAnL2luZGV4Lm5vZGUnLFxuXTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc0xvY2F0aW9uV2l0aGluQ29tcGFydG1lbnQgPSAoXG4gIGFic29sdXRlTW9kdWRlU3BlY2lmaWVyLFxuICBjb21wYXJ0bWVudExvY2F0aW9uLFxuKSA9PiBhYnNvbHV0ZU1vZHVkZVNwZWNpZmllci5zdGFydHNXaXRoKGNvbXBhcnRtZW50TG9jYXRpb24pO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmVsYXRpdmVTcGVjaWZpZXIgPSAoYWJzb2x1dGVNb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50TG9jYXRpb24pID0+IHtcbiAgYXNzZXJ0KFxuICAgIGlzTG9jYXRpb25XaXRoaW5Db21wYXJ0bWVudChhYnNvbHV0ZU1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnRMb2NhdGlvbiksXG4gICAgYE1vZHVsZSBzcGVjaWZpZXIgbG9jYXRpb24gXCIke2Fic29sdXRlTW9kdWxlU3BlY2lmaWVyfVwiIGRvZXMgbm90IHN0YXJ0IHdpdGggY29tcGFydG1lbnQgbG9jYXRpb24gXCIke2NvbXBhcnRtZW50TG9jYXRpb259XCJgLFxuICApO1xuICByZXR1cm4gYC4vJHthYnNvbHV0ZU1vZHVsZVNwZWNpZmllci5zdWJzdHJpbmcoY29tcGFydG1lbnRMb2NhdGlvbi5sZW5ndGgpfWA7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBmaW5kUmVkaXJlY3QgPSAoe1xuICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gIGNvbXBhcnRtZW50cyxcbiAgYWJzb2x1dGVNb2R1bGVTcGVjaWZpZXIsXG59KSA9PiB7XG4gIGNvbnN0IG1vZHVsZVNwZWNpZmllckxvY2F0aW9uID0gbmV3IFVSTChhYnNvbHV0ZU1vZHVsZVNwZWNpZmllciwgJ2ZpbGU6JylcbiAgICAuaHJlZjtcblxuICAvL1xuICBsZXQgc29tZUxvY2F0aW9uID0gbmV3IFVSTCgnLi8nLCBtb2R1bGVTcGVjaWZpZXJMb2NhdGlvbikuaHJlZjtcblxuICAvL1xuICAvL1xuXG4gIC8vXG4gIGZvciAoOzspIHtcbiAgICBpZiAoXG4gICAgICBzb21lTG9jYXRpb24gIT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UICYmXG4gICAgICBzb21lTG9jYXRpb24gaW4gY29tcGFydG1lbnRzXG4gICAgKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IHNvbWVMb2NhdGlvbjtcbiAgICAgIGNvbnN0IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW2xvY2F0aW9uXTtcbiAgICAgIGlmIChjb21wYXJ0bWVudERlc2NyaXB0b3IgPT09IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAoY29tcGFydG1lbnREZXNjcmlwdG9yLmNvbXBhcnRtZW50cy5oYXMobG9jYXRpb24pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BlY2lmaWVyOiByZWxhdGl2ZVNwZWNpZmllcihtb2R1bGVTcGVjaWZpZXJMb2NhdGlvbiwgbG9jYXRpb24pLFxuICAgICAgICAgIGNvbXBhcnRtZW50OiBjb21wYXJ0bWVudHNbbG9jYXRpb25dLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAoXG4gICAgICAgIHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IuY29tcGFydG1lbnRzLmhhcyhcbiAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IubG9jYXRpb24sXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBlbmZvcmNlTW9kdWxlUG9saWN5KFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5uYW1lLFxuICAgICAgICAgIHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBpbXBvcnQgaG9vay4gJHtxKGFic29sdXRlTW9kdWxlU3BlY2lmaWVyKX0gaXMgcGFydCBvZiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCByZXNvbHZlcyB0byAke2xvY2F0aW9ufWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcGVjaWZpZXI6IHJlbGF0aXZlU3BlY2lmaWVyKG1vZHVsZVNwZWNpZmllckxvY2F0aW9uLCBsb2NhdGlvbiksXG4gICAgICAgICAgY29tcGFydG1lbnQ6IGNvbXBhcnRtZW50c1tsb2NhdGlvbl0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGltcG9ydCBtb2R1bGU6ICR7cShhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcil9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICBjb25zdCBwYXJlbnRMb2NhdGlvbiA9IG5ldyBVUkwoJy4uLycsIHNvbWVMb2NhdGlvbikuaHJlZjtcblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAocGFyZW50TG9jYXRpb24gPT09IHNvbWVMb2NhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBpbXBvcnQgdW5rbm93biBtb2R1bGU6ICR7cShhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcil9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgc29tZUxvY2F0aW9uID0gcGFyZW50TG9jYXRpb247XG4gICAgfVxuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIgPSAoe1xuICBtb2R1bGVzID0gdW5kZWZpbmVkLFxuICBleGl0TW9kdWxlSW1wb3J0SG9vayA9IHVuZGVmaW5lZCxcbiAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG59KSA9PiB7XG4gIGlmICghbW9kdWxlcyAmJiAhZXhpdE1vZHVsZUltcG9ydEhvb2spIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBhc3luYyBzcGVjaWZpZXIgPT4ge1xuICAgIGlmIChtb2R1bGVzICYmIGhhcyhtb2R1bGVzLCBzcGVjaWZpZXIpKSB7XG4gICAgICBjb25zdCBucyA9IG1vZHVsZXNbc3BlY2lmaWVyXTtcbiAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICBpbXBvcnRzOiBbXSxcbiAgICAgICAgZXhwb3J0czogbnMgPyBrZXlzKG5zKSA6IFtdLFxuICAgICAgICBleGVjdXRlOiBtb2R1bGVFeHBvcnRzID0+IHtcbiAgICAgICAgICBtb2R1bGVFeHBvcnRzLmRlZmF1bHQgPSBucztcbiAgICAgICAgICBhc3NpZ24obW9kdWxlRXhwb3J0cywgbnMpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChleGl0TW9kdWxlSW1wb3J0SG9vaykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIGV4aXRNb2R1bGVJbXBvcnRIb29rKHNwZWNpZmllciwgZW50cnlDb21wYXJ0bWVudE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcihleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyKTtcbmNvbnN0IG5vbWluYXRlQ2FuZGlkYXRlcyA9IChtb2R1bGVTcGVjaWZpZXIsIHNlYXJjaFN1ZmZpeGVzKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbbW9kdWxlU3BlY2lmaWVyXTtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGVTdWZmaXggb2Ygc2VhcmNoU3VmZml4ZXMpIHtcbiAgICBjYW5kaWRhdGVzLnB1c2goYCR7bW9kdWxlU3BlY2lmaWVyfSR7Y2FuZGlkYXRlU3VmZml4fWApO1xuICB9XG4gIHJldHVybiBjYW5kaWRhdGVzO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uKiBjaG9vc2VNb2R1bGVEZXNjcmlwdG9yKFxuICB7XG4gICAgY2FuZGlkYXRlcyxcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgY29tcHV0ZVNoYTUxMixcbiAgICBtb2R1bGVEZXNjcmlwdG9ycyxcbiAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIHBhY2thZ2VTb3VyY2VzLFxuICAgIHJlYWRQb3dlcnMsXG4gICAgYXJjaGl2ZU9ubHksXG4gICAgc291cmNlTWFwSG9vayxcbiAgICBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQsXG4gIH0sXG4gIHsgbWF5YmVSZWFkLCBwYXJzZSwgc2hvdWxkRGVmZXJFcnJvciA9ICgpID0+IGZhbHNlIH0sXG4pIHtcbiAgY29uc3QgeyBzb3VyY2VEaXJuYW1lIH0gPSBjb21wYXJ0bWVudERlc2NyaXB0b3I7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlU3BlY2lmaWVyIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBjb25zdCBjYW5kaWRhdGVNb2R1bGVEZXNjcmlwdG9yID0gbW9kdWxlRGVzY3JpcHRvcnNbY2FuZGlkYXRlU3BlY2lmaWVyXTtcbiAgICBpZiAoY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYW5kaWRhdGVNb2R1bGVEZXNjcmlwdG9yLnJldGFpbmVkID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHsgY29tcGFydG1lbnQ6IGNhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZSA9IHBhY2thZ2VMb2NhdGlvbiB9ID1cbiAgICAgICAgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvcjtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZUNvbXBhcnRtZW50ID0gY29tcGFydG1lbnRzW2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZV07XG4gICAgICBpZiAoY2FuZGlkYXRlQ29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgY29tcGFydG1lbnQgbWlzc2luZyBmb3IgY2FuZGlkYXRlICR7Y2FuZGlkYXRlU3BlY2lmaWVyfSBpbiAke2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZUNvbXBhcnRtZW50RGVzY3JpcHRvciA9XG4gICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnNbY2FuZGlkYXRlQ29tcGFydG1lbnROYW1lXTtcbiAgICAgIGlmIChjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgY29tcGFydG1lbnREZXNjcmlwdG9yIG1pc3NpbmcgZm9yIGNhbmRpZGF0ZSAke2NhbmRpZGF0ZVNwZWNpZmllcn0gaW4gJHtjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWV9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhbmRpZGF0ZUNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzW21vZHVsZVNwZWNpZmllcl0gPVxuICAgICAgICBjYW5kaWRhdGVNb2R1bGVEZXNjcmlwdG9yO1xuICAgICAgLy9cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCByZWNvcmQgPSB7XG4gICAgICAgIHNwZWNpZmllcjogY2FuZGlkYXRlU3BlY2lmaWVyLFxuICAgICAgICBjb21wYXJ0bWVudDogY2FuZGlkYXRlQ29tcGFydG1lbnQsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IG1vZHVsZUxvY2F0aW9uID0gcmVzb2x2ZUxvY2F0aW9uKGNhbmRpZGF0ZVNwZWNpZmllciwgcGFja2FnZUxvY2F0aW9uKTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHsgZmlsZVVSTFRvUGF0aCB9ID0gdW5wYWNrUmVhZFBvd2VycyhyZWFkUG93ZXJzKTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZmlsZVVSTFRvUGF0aCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgIWlzTG9jYXRpb25XaXRoaW5Db21wYXJ0bWVudChtb2R1bGVMb2NhdGlvbiwgcGFja2FnZUxvY2F0aW9uKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3BlY2lmaWVyOiBmaWxlVVJMVG9QYXRoKG1vZHVsZUxvY2F0aW9uKSxcbiAgICAgICAgY29tcGFydG1lbnQ6IGNvbXBhcnRtZW50c1twYWNrYWdlTG9jYXRpb25dLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgbW9kdWxlQnl0ZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICB5aWVsZCBtYXliZVJlYWQobW9kdWxlTG9jYXRpb24pXG4gICAgKTtcblxuICAgIGlmIChtb2R1bGVCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGxldCBzb3VyY2VNYXA7XG4gICAgICAvL1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSAvKiAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICAgIHlpZWxkIHBhcnNlKFxuICAgICAgICAgIG1vZHVsZUJ5dGVzLFxuICAgICAgICAgIGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICAgIGFyY2hpdmVPbmx5LFxuICAgICAgICAgICAgc291cmNlTWFwSG9vazpcbiAgICAgICAgICAgICAgc291cmNlTWFwSG9vayAmJlxuICAgICAgICAgICAgICAobmV4dFNvdXJjZU1hcE9iamVjdCA9PiB7XG4gICAgICAgICAgICAgICAgc291cmNlTWFwID0gSlNPTi5zdHJpbmdpZnkobmV4dFNvdXJjZU1hcE9iamVjdCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBhcnNlcixcbiAgICAgICAgYnl0ZXM6IHRyYW5zZm9ybWVkQnl0ZXMsXG4gICAgICAgIHJlY29yZDogY29uY3JldGVSZWNvcmQsXG4gICAgICB9ID0gZW52ZWxvcGU7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKGNhbmRpZGF0ZVNwZWNpZmllciAhPT0gbW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgICAgIG1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl0gPSB7XG4gICAgICAgICAgcmV0YWluZWQ6IHRydWUsXG4gICAgICAgICAgbW9kdWxlOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgICAgY29tcGFydG1lbnQ6IHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgICAgcmVjb3JkOiBjb25jcmV0ZVJlY29yZCxcbiAgICAgICAgc3BlY2lmaWVyOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgIGltcG9ydE1ldGE6IHsgdXJsOiBtb2R1bGVMb2NhdGlvbiB9LFxuICAgICAgfTtcblxuICAgICAgbGV0IHNoYTUxMjtcbiAgICAgIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2hhNTEyID0gY29tcHV0ZVNoYTUxMih0cmFuc2Zvcm1lZEJ5dGVzKTtcblxuICAgICAgICBpZiAoc291cmNlTWFwSG9vayAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZU1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc291cmNlTWFwSG9vayhzb3VyY2VNYXAsIHtcbiAgICAgICAgICAgIGNvbXBhcnRtZW50OiBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICBtb2R1bGU6IGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICAgIGxvY2F0aW9uOiBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICAgIHNoYTUxMixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbiA9IG1vZHVsZUxvY2F0aW9uLnNsaWNlKFxuICAgICAgICBwYWNrYWdlTG9jYXRpb24ubGVuZ3RoLFxuICAgICAgKTtcbiAgICAgIHBhY2thZ2VTb3VyY2VzW2NhbmRpZGF0ZVNwZWNpZmllcl0gPSB7XG4gICAgICAgIGxvY2F0aW9uOiBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbixcbiAgICAgICAgc291cmNlTG9jYXRpb246IG1vZHVsZUxvY2F0aW9uLFxuICAgICAgICBzb3VyY2VEaXJuYW1lLFxuICAgICAgICBwYXJzZXIsXG4gICAgICAgIGJ5dGVzOiB0cmFuc2Zvcm1lZEJ5dGVzLFxuICAgICAgICByZWNvcmQ6IGNvbmNyZXRlUmVjb3JkLFxuICAgICAgICBzaGE1MTIsXG4gICAgICB9O1xuICAgICAgaWYgKCFzaG91bGREZWZlckVycm9yKHBhcnNlcikpIHtcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRTcGVjaWZpZXIgb2YgZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSkge1xuICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmFkZChcbiAgICAgICAgICAgIHJlc29sdmUoaW1wb3J0U3BlY2lmaWVyLCBtb2R1bGVTcGVjaWZpZXIpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRGVmZXJFcnJvciA9IChcbiAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICBwYWNrYWdlTG9jYXRpb24sXG4gIHBhY2thZ2VTb3VyY2VzLFxuKSA9PiB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWZlckVycm9yID0gKHNwZWNpZmllciwgZXJyb3IpID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmhhcyhzcGVjaWZpZXIpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCByZWNvcmQgPSBmcmVlemUoe1xuICAgICAgaW1wb3J0czogW10sXG4gICAgICBleHBvcnRzOiBbXSxcbiAgICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHBhY2thZ2VTb3VyY2VzW3NwZWNpZmllcl0gPSB7XG4gICAgICBkZWZlcnJlZEVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9O1xuICByZXR1cm4gZGVmZXJFcnJvcjtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VJbXBvcnRIb29rTWFrZXIgPSAoXG4gIHJlYWRQb3dlcnMsXG4gIGJhc2VMb2NhdGlvbixcbiAge1xuICAgIHNvdXJjZXMgPSBjcmVhdGUobnVsbCksXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyA9IGNyZWF0ZShudWxsKSxcbiAgICBhcmNoaXZlT25seSA9IGZhbHNlLFxuICAgIGNvbXB1dGVTaGE1MTIgPSB1bmRlZmluZWQsXG4gICAgc2VhcmNoU3VmZml4ZXMgPSBub2RlanNDb252ZW50aW9uU2VhcmNoU3VmZml4ZXMsXG4gICAgc291cmNlTWFwSG9vayA9IHVuZGVmaW5lZCxcbiAgICBlbnRyeUNvbXBhcnRtZW50TmFtZSxcbiAgICBlbnRyeU1vZHVsZVNwZWNpZmllcixcbiAgICBpbXBvcnRIb29rOiBleGl0TW9kdWxlSW1wb3J0SG9vayA9IHVuZGVmaW5lZCxcbiAgfSxcbikgPT4ge1xuICAvL1xuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkID0gbmV3IE1hcChbXG4gICAgW2VudHJ5Q29tcGFydG1lbnROYW1lLCBuZXcgU2V0KFtlbnRyeU1vZHVsZVNwZWNpZmllcl0pXSxcbiAgXSk7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3Qgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50ID0gY29tcGFydG1lbnROYW1lID0+IHtcbiAgICBsZXQgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkID0gc3RyaWN0bHlSZXF1aXJlZC5nZXQoY29tcGFydG1lbnROYW1lKTtcbiAgICBpZiAoY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQ7XG4gICAgfVxuICAgIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZCA9IG5ldyBTZXQoKTtcbiAgICBzdHJpY3RseVJlcXVpcmVkLnNldChjb21wYXJ0bWVudE5hbWUsIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZCk7XG4gICAgcmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiAgfTtcblxuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWFrZUltcG9ydEhvb2sgPSAoe1xuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBwYWNrYWdlTmFtZTogX3BhY2thZ2VOYW1lLFxuICAgIGF0dGVudWF0b3JzLFxuICAgIHBhcnNlLFxuICAgIHNob3VsZERlZmVyRXJyb3IsXG4gICAgY29tcGFydG1lbnRzLFxuICB9KSA9PiB7XG4gICAgLy9cbiAgICBwYWNrYWdlTG9jYXRpb24gPSByZXNvbHZlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLCBiYXNlTG9jYXRpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VTb3VyY2VzID0gc291cmNlc1twYWNrYWdlTG9jYXRpb25dIHx8IGNyZWF0ZShudWxsKTtcbiAgICBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gPSBwYWNrYWdlU291cmNlcztcbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW3BhY2thZ2VMb2NhdGlvbl0gfHwge307XG4gICAgY29uc3QgeyBtb2R1bGVzOiBtb2R1bGVEZXNjcmlwdG9ycyA9IGNyZWF0ZShudWxsKSB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzID0gbW9kdWxlRGVzY3JpcHRvcnM7XG5cbiAgICBjb25zdCBkZWZlckVycm9yID0gbWFrZURlZmVyRXJyb3IoXG4gICAgICBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQsXG4gICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICBwYWNrYWdlU291cmNlcyxcbiAgICApO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGltcG9ydEhvb2sgPSBhc3luYyBtb2R1bGVTcGVjaWZpZXIgPT4ge1xuICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnJldGFpbmVkID0gdHJ1ZTtcblxuICAgICAgLy9cbiAgICAgIGF3YWl0IG51bGw7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy9cblxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBpZiAobW9kdWxlU3BlY2lmaWVyICE9PSAnLicgJiYgIW1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgICAgICAgaWYgKGV4aXRNb2R1bGVJbXBvcnRIb29rKSB7XG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBleGl0TW9kdWxlSW1wb3J0SG9vayhcbiAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBlbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnREZXNjcmlwdG9yLCB7XG4gICAgICAgICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlcnJvckhpbnQ6IGBCbG9ja2VkIGluIGxvYWRpbmcuICR7cShcbiAgICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICAgICApfSB3YXMgbm90IGluIHRoZSBjb21wYXJ0bWVudCBtYXAgYW5kIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbG9hZCBpdCBhcyBhIGJ1aWx0aW5gLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKGFyY2hpdmVPbmx5KSB7XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIHJldHVybiBmcmVlemUoeyBpbXBvcnRzOiBbXSwgZXhwb3J0czogW10sIGV4ZWN1dGUoKSB7fSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBjb25zdCBhdHRlbnVhdGVkUmVjb3JkID0gYXdhaXQgYXR0ZW51YXRlTW9kdWxlSG9vayhcbiAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5wb2xpY3ksXG4gICAgICAgICAgICAgICAgYXR0ZW51YXRvcnMsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiBhdHRlbnVhdGVkUmVjb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgZmluZCBleHRlcm5hbCBtb2R1bGUgJHtxKFxuICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICApfSBpbiBwYWNrYWdlICR7cGFja2FnZUxvY2F0aW9ufWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgbWF5YmVSZWFkIH0gPSB1bnBhY2tSZWFkUG93ZXJzKHJlYWRQb3dlcnMpO1xuXG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBub21pbmF0ZUNhbmRpZGF0ZXMobW9kdWxlU3BlY2lmaWVyLCBzZWFyY2hTdWZmaXhlcyk7XG5cbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgYXN5bmNUcmFtcG9saW5lKFxuICAgICAgICAgIGNob29zZU1vZHVsZURlc2NyaXB0b3IsXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2FuZGlkYXRlcyxcbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgICAgICAgICBjb21wYXJ0bWVudHMsXG4gICAgICAgICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgICAgICAgbW9kdWxlRGVzY3JpcHRvcnMsXG4gICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICBwYWNrYWdlU291cmNlcyxcbiAgICAgICAgICAgIHJlYWRQb3dlcnMsXG4gICAgICAgICAgICBhcmNoaXZlT25seSxcbiAgICAgICAgICAgIHNvdXJjZU1hcEhvb2ssXG4gICAgICAgICAgICBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG1heWJlUmVhZCwgcGFyc2UsIHNob3VsZERlZmVyRXJyb3IgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVjb3JkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgZmluZCBmaWxlIGZvciBpbnRlcm5hbCBtb2R1bGUgJHtxKFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICl9ICh3aXRoIGNhbmRpZGF0ZXMgJHtjYW5kaWRhdGVzXG4gICAgICAgICAgICAubWFwKHggPT4gcSh4KSlcbiAgICAgICAgICAgIC5qb2luKCcsICcpfSkgaW4gcGFja2FnZSAke3BhY2thZ2VMb2NhdGlvbn1gLFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmVyRXJyb3IobW9kdWxlU3BlY2lmaWVyLCBlcnJvcik7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gaW1wb3J0SG9vaztcbiAgfTtcbiAgcmV0dXJuIG1ha2VJbXBvcnRIb29rO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlSW1wb3J0SG9va01ha2VyKG1ha2VJbXBvcnRIb29rTWFrZXIpO1xuICAgICAgIGZ1bmN0aW9uIG1ha2VJbXBvcnROb3dIb29rTWFrZXIoXG4gIHJlYWRQb3dlcnMsXG4gIGJhc2VMb2NhdGlvbixcbiAge1xuICAgIHNvdXJjZXMgPSBjcmVhdGUobnVsbCksXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyA9IGNyZWF0ZShudWxsKSxcbiAgICBjb21wdXRlU2hhNTEyID0gdW5kZWZpbmVkLFxuICAgIHNlYXJjaFN1ZmZpeGVzID0gbm9kZWpzQ29udmVudGlvblNlYXJjaFN1ZmZpeGVzLFxuICAgIGFyY2hpdmVPbmx5ID0gZmFsc2UsXG4gICAgc291cmNlTWFwSG9vayA9IHVuZGVmaW5lZCxcbiAgICBpbXBvcnROb3dIb29rOiBleGl0TW9kdWxlSW1wb3J0Tm93SG9vayA9IHVuZGVmaW5lZCxcbiAgfSxcbikge1xuICAvL1xuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkID0gbmV3IE1hcCgpO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50TmFtZSA9PiB7XG4gICAgbGV0IGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZCA9IHN0cmljdGx5UmVxdWlyZWQuZ2V0KGNvbXBhcnRtZW50TmFtZSk7XG4gICAgaWYgKGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuICAgIH1cbiAgICBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgPSBuZXcgU2V0KCk7XG4gICAgc3RyaWN0bHlSZXF1aXJlZC5zZXQoY29tcGFydG1lbnROYW1lLCBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQpO1xuICAgIHJldHVybiBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQ7XG4gIH07XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgbWFrZUltcG9ydE5vd0hvb2sgPSAoe1xuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBwYWNrYWdlTmFtZTogX3BhY2thZ2VOYW1lLFxuICAgIHBhcnNlLFxuICAgIGNvbXBhcnRtZW50cyxcbiAgICBzaG91bGREZWZlckVycm9yLFxuICB9KSA9PiB7XG4gICAgY29uc3QgZGVmZXJFcnJvciA9IG1ha2VEZWZlckVycm9yKFxuICAgICAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgc291cmNlcyxcbiAgICApO1xuXG4gICAgLypcblxuXG5cblxuXG5cbiAgICAgKi9cbiAgICBjb25zdCBpbXBvcnRFeGl0TW9kdWxlT3JGYWlsID0gKG1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnREZXNjcmlwdG9yKSA9PiB7XG4gICAgICBpZiAoZXhpdE1vZHVsZUltcG9ydE5vd0hvb2spIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgZXhpdFJlY29yZCA9IGV4aXRNb2R1bGVJbXBvcnROb3dIb29rKFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0UmVjb3JkKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLCBjb21wYXJ0bWVudERlc2NyaXB0b3IsIHtcbiAgICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgICBlcnJvckhpbnQ6IGBCbG9ja2VkIGluIGxvYWRpbmcuICR7cShcbiAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgKX0gd2FzIG5vdCBpbiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGxvYWQgaXQgYXMgYSBidWlsdGluYCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gZXhpdFJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgZXh0ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSBpbiBwYWNrYWdlIGF0ICR7cGFja2FnZUxvY2F0aW9ufWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgZXh0ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSBmcm9tIHBhY2thZ2UgYXQgJHtwYWNrYWdlTG9jYXRpb259OyB0cnkgcHJvdmlkaW5nIGFuIGltcG9ydE5vd0hvb2tgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoISgnaXNTeW5jUGFyc2VyJyBpbiBwYXJzZSkpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbXBvc3NpYmxlVHJhbnNmb3JtSW1wb3J0Tm93SG9vaygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdEeW5hbWljIHJlcXVpcmVzIGFyZSBvbmx5IHBvc3NpYmxlIHdpdGggc3luY2hyb25vdXMgcGFyc2VycyBhbmQgbm8gYXN5bmNocm9ub3VzIG1vZHVsZSB0cmFuc2Zvcm1zIGluIG9wdGlvbnMnLFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW3BhY2thZ2VMb2NhdGlvbl0gfHwge307XG5cbiAgICBwYWNrYWdlTG9jYXRpb24gPSByZXNvbHZlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLCBiYXNlTG9jYXRpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VTb3VyY2VzID0gc291cmNlc1twYWNrYWdlTG9jYXRpb25dIHx8IGNyZWF0ZShudWxsKTtcbiAgICBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gPSBwYWNrYWdlU291cmNlcztcbiAgICBjb25zdCB7XG4gICAgICBtb2R1bGVzOlxuICAgICAgICBtb2R1bGVEZXNjcmlwdG9ycyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgICAgICBjcmVhdGUobnVsbClcbiAgICAgICAgKSxcbiAgICB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzID0gbW9kdWxlRGVzY3JpcHRvcnM7XG5cbiAgICBsZXQgeyBwb2xpY3kgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICBwb2xpY3kgPSBwb2xpY3kgfHwgY3JlYXRlKG51bGwpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKCdwYWNrYWdlcycgaW4gcG9saWN5ICYmIHR5cGVvZiBwb2xpY3kucGFja2FnZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwYWNrYWdlTmFtZSwgcGFja2FnZVBvbGljeUl0ZW1dIG9mIGVudHJpZXMocG9saWN5LnBhY2thZ2VzKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIShwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlcykgJiZcbiAgICAgICAgICBwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3Iuc2NvcGVzICYmXG4gICAgICAgICAgcGFja2FnZVBvbGljeUl0ZW1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXNbcGFja2FnZU5hbWVdID1cbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5zY29wZXNbcGFja2FnZU5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBtYXliZVJlYWROb3csIGlzQWJzb2x1dGUgfSA9IHJlYWRQb3dlcnM7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaW1wb3J0Tm93SG9vayA9IG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoaXNBYnNvbHV0ZShtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgICAgY29uc3QgcmVjb3JkID0gZmluZFJlZGlyZWN0KHtcbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgICAgICAgICBjb21wYXJ0bWVudHMsXG4gICAgICAgICAgICBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcjogbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZWNvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNMb2NhdGlvbldpdGhpbkNvbXBhcnRtZW50KFxuICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5sb2NhdGlvbixcbiAgICAgICAgICAgIClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllciA9IHJlbGF0aXZlU3BlY2lmaWVyKFxuICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5sb2NhdGlvbixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllciAhPT0gJy4nICYmXG4gICAgICAgICAgIW1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpICYmXG4gICAgICAgICAgIW1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCcuLi8nKVxuICAgICAgICApIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBpbXBvcnRFeGl0TW9kdWxlT3JGYWlsKG1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnREZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBub21pbmF0ZUNhbmRpZGF0ZXMobW9kdWxlU3BlY2lmaWVyLCBzZWFyY2hTdWZmaXhlcyk7XG5cbiAgICAgICAgY29uc3QgcmVjb3JkID0gc3luY1RyYW1wb2xpbmUoXG4gICAgICAgICAgY2hvb3NlTW9kdWxlRGVzY3JpcHRvcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjYW5kaWRhdGVzLFxuICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbiAgICAgICAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgICAgICAgIGNvbXB1dGVTaGE1MTIsXG4gICAgICAgICAgICBtb2R1bGVEZXNjcmlwdG9ycyxcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICAgIHBhY2thZ2VTb3VyY2VzLFxuICAgICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICAgIGFyY2hpdmVPbmx5LFxuICAgICAgICAgICAgc291cmNlTWFwSG9vayxcbiAgICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1heWJlUmVhZDogbWF5YmVSZWFkTm93LFxuICAgICAgICAgICAgcGFyc2UsXG4gICAgICAgICAgICBzaG91bGREZWZlckVycm9yLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH1cblxuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gaW1wb3J0RXhpdE1vZHVsZU9yRmFpbChtb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50RGVzY3JpcHRvcik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGRlZmVyRXJyb3IobW9kdWxlU3BlY2lmaWVyLCBlcnIpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGltcG9ydE5vd0hvb2s7XG4gIH07XG4gIHJldHVybiBtYWtlSW1wb3J0Tm93SG9vaztcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiOlsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciJdLCJtYWtlSW1wb3J0SG9va01ha2VyIjpbIm1ha2VJbXBvcnRIb29rTWFrZXIiXSwibWFrZUltcG9ydE5vd0hvb2tNYWtlciI6WyJtYWtlSW1wb3J0Tm93SG9va01ha2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOroDm3yAgAA8gIAACsAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9qc29uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJwYXJzZUxvY2F0ZWRKc29uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwYXJzZUxvY2F0ZWRKc29uID0gKHNvdXJjZSwgbG9jYXRpb24pID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzb3VyY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICB0aHJvdyBTeW50YXhFcnJvcihgQ2Fubm90IHBhcnNlIEpTT04gZnJvbSAke2xvY2F0aW9ufSwgJHtlcnJvcn1gKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07JGjNj19vbmNlLnBhcnNlTG9jYXRlZEpzb24ocGFyc2VMb2NhdGVkSnNvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUxvY2F0ZWRKc29uIjpbInBhcnNlTG9jYXRlZEpzb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArwp0SKwlAACsJQAAKwAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL2xpbmsuanN7ImltcG9ydHMiOlsiLi9tYXAtcGFyc2VyLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImFzc2VtYmxlIiwibGluayJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VNYXBQYXJzZXJzLHJlc29sdmVGYWxsYmFjayxBVFRFTlVBVE9SU19DT01QQVJUTUVOVCxhdHRlbnVhdGVHbG9iYWxzLGVuZm9yY2VNb2R1bGVQb2xpY3ksbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFwLXBhcnNlci5qc1wiLCBbW1wibWFrZU1hcFBhcnNlcnNcIixbJGjNj19hID0+IChtYWtlTWFwUGFyc2VycyA9ICRozY9fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJyZXNvbHZlXCIsWyRozY9fYSA9PiAocmVzb2x2ZUZhbGxiYWNrID0gJGjNj19hKV1dXV0sW1wiLi9wb2xpY3kuanNcIiwgW1tcIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXCIsWyRozY9fYSA9PiAoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQgPSAkaM2PX2EpXV0sW1wiYXR0ZW51YXRlR2xvYmFsc1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZUdsb2JhbHMgPSAkaM2PX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLFskaM2PX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaM2PX2EpXV0sW1wibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlclwiLFskaM2PX2EgPT4gKG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGFzc2lnbiwgY3JlYXRlLCBlbnRyaWVzLCBmcmVlemUgfSA9IE9iamVjdDtcbmNvbnN0IHsgaGFzT3duUHJvcGVydHkgfSA9IE9iamVjdC5wcm90b3R5cGU7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuY29uc3QgeyBhbGxTZXR0bGVkIH0gPSBQcm9taXNlO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgcHJvbWlzZUFsbFNldHRsZWQgPSBhbGxTZXR0bGVkLmJpbmQoUHJvbWlzZSk7XG5cbmNvbnN0IGRlZmF1bHRDb21wYXJ0bWVudCA9IENvbXBhcnRtZW50O1xuXG4vL1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IGFwcGx5KGhhc093blByb3BlcnR5LCBvYmplY3QsIFtrZXldKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHRyaW1Nb2R1bGVTcGVjaWZpZXJQcmVmaXggPSAobW9kdWxlU3BlY2lmaWVyLCBwcmVmaXgpID0+IHtcbiAgaWYgKG1vZHVsZVNwZWNpZmllciA9PT0gcHJlZml4KSB7XG4gICAgcmV0dXJuICcuJztcbiAgfVxuICBpZiAobW9kdWxlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoYCR7cHJlZml4fS9gKSkge1xuICAgIHJldHVybiBgLi8ke21vZHVsZVNwZWNpZmllci5zbGljZShwcmVmaXgubGVuZ3RoICsgMSl9YDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZU1vZHVsZU1hcEhvb2sgPSAoXG4gIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgY29tcGFydG1lbnRzLFxuICBjb21wYXJ0bWVudE5hbWUsXG4gIG1vZHVsZURlc2NyaXB0b3JzLFxuICBzY29wZURlc2NyaXB0b3JzLFxuKSA9PiB7XG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgbW9kdWxlTWFwSG9vayA9IG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnJldGFpbmVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IG1vZHVsZURlc2NyaXB0b3IgPSBtb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdO1xuICAgIGlmIChtb2R1bGVEZXNjcmlwdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZHVsZURlc2NyaXB0b3IucmV0YWluZWQgPSB0cnVlO1xuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY29tcGFydG1lbnQ6IGZvcmVpZ25Db21wYXJ0bWVudE5hbWUgPSBjb21wYXJ0bWVudE5hbWUsXG4gICAgICAgIG1vZHVsZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgZXhpdCxcbiAgICAgIH0gPSBtb2R1bGVEZXNjcmlwdG9yO1xuICAgICAgaWYgKGV4aXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvL1xuICAgICAgfVxuICAgICAgaWYgKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoIW1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLCBjb21wYXJ0bWVudERlc2NyaXB0b3IsIHtcbiAgICAgICAgICAgIGV4aXQ6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3JIaW50OlxuICAgICAgICAgICAgICAnVGhpcyBjaGVjayBzaG91bGQgbm90IGJlIHJlYWNoYWJsZS4gSWYgeW91IHNlZSB0aGlzIGVycm9yLCBwbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9yZWlnbkNvbXBhcnRtZW50ID0gY29tcGFydG1lbnRzW2ZvcmVpZ25Db21wYXJ0bWVudE5hbWVdO1xuICAgICAgICBpZiAoZm9yZWlnbkNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgaW1wb3J0IGZyb20gbWlzc2luZyBjb21wYXJ0bWVudCAke3EoXG4gICAgICAgICAgICAgIGZvcmVpZ25Db21wYXJ0bWVudE5hbWUsXG4gICAgICAgICAgICApfX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50LFxuICAgICAgICAgIG5hbWVzcGFjZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChjb25zdCBbc2NvcGVQcmVmaXgsIHNjb3BlRGVzY3JpcHRvcl0gb2YgZW50cmllcyhzY29wZURlc2NyaXB0b3JzKSkge1xuICAgICAgY29uc3QgZm9yZWlnbk1vZHVsZVNwZWNpZmllciA9IHRyaW1Nb2R1bGVTcGVjaWZpZXJQcmVmaXgoXG4gICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgc2NvcGVQcmVmaXgsXG4gICAgICApO1xuXG4gICAgICBpZiAoZm9yZWlnbk1vZHVsZVNwZWNpZmllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHsgY29tcGFydG1lbnQ6IGZvcmVpZ25Db21wYXJ0bWVudE5hbWUgfSA9IHNjb3BlRGVzY3JpcHRvcjtcbiAgICAgICAgaWYgKGZvcmVpZ25Db21wYXJ0bWVudE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBpbXBvcnQgZnJvbSBzY29wZSAke3Njb3BlUHJlZml4fSBkdWUgdG8gbWlzc2luZyBcImNvbXBhcnRtZW50XCIgcHJvcGVydHlgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9yZWlnbkNvbXBhcnRtZW50ID0gY29tcGFydG1lbnRzW2ZvcmVpZ25Db21wYXJ0bWVudE5hbWVdO1xuICAgICAgICBpZiAoZm9yZWlnbkNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgaW1wb3J0IGZyb20gbWlzc2luZyBjb21wYXJ0bWVudCAke3EoXG4gICAgICAgICAgICAgIGZvcmVpZ25Db21wYXJ0bWVudE5hbWUsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVuZm9yY2VNb2R1bGVQb2xpY3koc2NvcGVQcmVmaXgsIGNvbXBhcnRtZW50RGVzY3JpcHRvciwge1xuICAgICAgICAgIGV4aXQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9ySGludDogYEJsb2NrZWQgaW4gbGlua2luZy4gJHtxKFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICl9IGlzIHBhcnQgb2YgdGhlIGNvbXBhcnRtZW50IG1hcCBhbmQgcmVzb2x2ZXMgdG8gJHtxKFxuICAgICAgICAgICAgZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICApfS5gLFxuICAgICAgICB9KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgbW9kdWxlRGVzY3JpcHRvcnNbbW9kdWxlU3BlY2lmaWVyXSA9IHtcbiAgICAgICAgICByZXRhaW5lZDogdHJ1ZSxcbiAgICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICBtb2R1bGU6IGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29tcGFydG1lbnQ6IGZvcmVpZ25Db21wYXJ0bWVudCxcbiAgICAgICAgICBuYW1lc3BhY2U6IGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcmV0dXJuIG1vZHVsZU1hcEhvb2s7XG59O1xuXG4vKlxuXG4gKi9cbmNvbnN0IGltcG9zc2libGVJbXBvcnROb3dIb29rTWFrZXIgPSAoKSA9PiB7XG4gIHJldHVybiBmdW5jdGlvbiBpbXBvc3NpYmxlSW1wb3J0Tm93SG9vaygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb3ZpZGVkIHJlYWQgcG93ZXJzIGRvIG5vdCBzdXBwb3J0IGR5bmFtaWMgcmVxdWlyZXMnKTtcbiAgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGxpbmsgPSAoXG4gIHsgZW50cnksIGNvbXBhcnRtZW50czogY29tcGFydG1lbnREZXNjcmlwdG9ycyB9LFxuICBvcHRpb25zLFxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICByZXNvbHZlID0gcmVzb2x2ZUZhbGxiYWNrLFxuICAgIG1ha2VJbXBvcnRIb29rLFxuICAgIG1ha2VJbXBvcnROb3dIb29rID0gaW1wb3NzaWJsZUltcG9ydE5vd0hvb2tNYWtlcixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZTogcGFyc2VyRm9yTGFuZ3VhZ2VPcHRpb24gPSB7fSxcbiAgICBnbG9iYWxzID0ge30sXG4gICAgdHJhbnNmb3JtcyA9IFtdLFxuICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgc3luY01vZHVsZVRyYW5zZm9ybXMsXG4gICAgX19zaGltVHJhbnNmb3Jtc19fID0gW10sXG4gICAgX19uYXRpdmVfXyA9IGZhbHNlLFxuICAgIGFyY2hpdmVPbmx5ID0gZmFsc2UsXG4gICAgQ29tcGFydG1lbnQgPSBkZWZhdWx0Q29tcGFydG1lbnQsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHsgY29tcGFydG1lbnQ6IGVudHJ5Q29tcGFydG1lbnROYW1lIH0gPSBlbnRyeTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY29tcGFydG1lbnRzID0gY3JlYXRlKG51bGwpO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGF0dGVudWF0b3JzID0gbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcihcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbiAgKTtcblxuICBjb25zdCBwZW5kaW5nSm9icyA9IFtdO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHBhcnNlckZvckxhbmd1YWdlID0gZnJlZXplKFxuICAgIGFzc2lnbihjcmVhdGUobnVsbCksIHBhcnNlckZvckxhbmd1YWdlT3B0aW9uKSxcbiAgKTtcblxuICBjb25zdCBtYXBQYXJzZXJzID0gbWFrZU1hcFBhcnNlcnMoe1xuICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgc3luY01vZHVsZVRyYW5zZm9ybXMsXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgW2NvbXBhcnRtZW50TmFtZSwgY29tcGFydG1lbnREZXNjcmlwdG9yXSBvZiBlbnRyaWVzKFxuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICkpIHtcbiAgICBjb25zdCB7XG4gICAgICBsb2NhdGlvbixcbiAgICAgIG5hbWUsXG4gICAgICBwYXJzZXJzOiBsYW5ndWFnZUZvckV4dGVuc2lvbiA9IHt9LFxuICAgICAgdHlwZXM6IGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyID0ge30sXG4gICAgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcblxuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB7IHNjb3BlczogX3Njb3BlcywgbW9kdWxlczogX21vZHVsZXMgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICBjb25zdCBtb2R1bGVzID0gX21vZHVsZXMgfHwgY3JlYXRlKG51bGwpO1xuICAgIGNvbnN0IHNjb3BlcyA9IF9zY29wZXMgfHwgY3JlYXRlKG51bGwpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzID0gbW9kdWxlcztcblxuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBwYXJzZSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgIG1hcFBhcnNlcnMobGFuZ3VhZ2VGb3JFeHRlbnNpb24sIGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyKVxuICAgICk7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3Qgc2hvdWxkRGVmZXJFcnJvciA9IGxhbmd1YWdlID0+IHtcbiAgICAgIGlmIChsYW5ndWFnZSAmJiBoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsIGxhbmd1YWdlKSkge1xuICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHBhcnNlckZvckxhbmd1YWdlW2xhbmd1YWdlXSlcbiAgICAgICAgICAuaGV1cmlzdGljSW1wb3J0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHJlc29sdmVIb29rID0gcmVzb2x2ZTtcbiAgICBjb25zdCBpbXBvcnRIb29rID0gbWFrZUltcG9ydEhvb2soe1xuICAgICAgcGFja2FnZUxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgIHBhY2thZ2VOYW1lOiBuYW1lLFxuICAgICAgYXR0ZW51YXRvcnMsXG4gICAgICBwYXJzZSxcbiAgICAgIHNob3VsZERlZmVyRXJyb3IsXG4gICAgICBjb21wYXJ0bWVudHMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbXBvcnROb3dIb29rID0gbWFrZUltcG9ydE5vd0hvb2soe1xuICAgICAgcGFja2FnZUxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgIHBhY2thZ2VOYW1lOiBuYW1lLFxuICAgICAgcGFyc2UsXG4gICAgICBjb21wYXJ0bWVudHMsXG4gICAgICBzaG91bGREZWZlckVycm9yLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbW9kdWxlTWFwSG9vayA9IG1ha2VNb2R1bGVNYXBIb29rKFxuICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgY29tcGFydG1lbnROYW1lLFxuICAgICAgbW9kdWxlcyxcbiAgICAgIHNjb3BlcyxcbiAgICApO1xuXG4gICAgY29uc3QgY29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoe1xuICAgICAgbmFtZTogbG9jYXRpb24sXG4gICAgICByZXNvbHZlSG9vayxcbiAgICAgIGltcG9ydEhvb2ssXG4gICAgICBpbXBvcnROb3dIb29rLFxuICAgICAgbW9kdWxlTWFwSG9vayxcbiAgICAgIHRyYW5zZm9ybXMsXG4gICAgICBfX3NoaW1UcmFuc2Zvcm1zX18sXG4gICAgICBfX29wdGlvbnNfXzogdHJ1ZSxcbiAgICAgIF9fbmF0aXZlX18sXG4gICAgfSk7XG5cbiAgICBpZiAoIWFyY2hpdmVPbmx5KSB7XG4gICAgICBhdHRlbnVhdGVHbG9iYWxzKFxuICAgICAgICBjb21wYXJ0bWVudC5nbG9iYWxUaGlzLFxuICAgICAgICBnbG9iYWxzLFxuICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuICAgICAgICBhdHRlbnVhdG9ycyxcbiAgICAgICAgcGVuZGluZ0pvYnMsXG4gICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5uYW1lLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb21wYXJ0bWVudHNbY29tcGFydG1lbnROYW1lXSA9IGNvbXBhcnRtZW50O1xuICB9XG5cbiAgY29uc3QgY29tcGFydG1lbnQgPSBjb21wYXJ0bWVudHNbZW50cnlDb21wYXJ0bWVudE5hbWVdO1xuICBpZiAoY29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYENhbm5vdCBhc3NlbWJsZSBjb21wYXJ0bWVudCBncmFwaCBiZWNhdXNlIHRoZSByb290IGNvbXBhcnRtZW50IG5hbWVkICR7cShcbiAgICAgICAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG4gICAgICApfSBpcyBtaXNzaW5nIGZyb20gdGhlIGNvbXBhcnRtZW50IG1hcGAsXG4gICAgKTtcbiAgfVxuICBjb25zdCBhdHRlbnVhdG9yc0NvbXBhcnRtZW50ID0gY29tcGFydG1lbnRzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXTtcblxuICByZXR1cm4ge1xuICAgIGNvbXBhcnRtZW50LFxuICAgIGNvbXBhcnRtZW50cyxcbiAgICBhdHRlbnVhdG9yc0NvbXBhcnRtZW50LFxuICAgIHBlbmRpbmdKb2JzUHJvbWlzZTogcHJvbWlzZUFsbFNldHRsZWQocGVuZGluZ0pvYnMpLnRoZW4oXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIHJlc3VsdHMgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSByZXN1bHRzXG4gICAgICAgICAgLmZpbHRlcihyZXN1bHQgPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJylcbiAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gcmVzdWx0ID0+XG4gICAgICAgICAgICAgIHJlc3VsdC5yZWFzb24sXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgR2xvYmFscyBhdHRlbnVhdGlvbiBlcnJvcnM6ICR7ZXJyb3JzXG4gICAgICAgICAgICAgIC5tYXAoZXJyb3IgPT4gZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICksXG4gIH07XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmxpbmsobGluayk7XG4gICAgICAgY29uc3QgYXNzZW1ibGUgPSAoY29tcGFydG1lbnRNYXAsIG9wdGlvbnMpID0+XG4gIGxpbmsoY29tcGFydG1lbnRNYXAsIG9wdGlvbnMpLmNvbXBhcnRtZW50OyRozY9fb25jZS5hc3NlbWJsZShhc3NlbWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJsaW5rIjpbImxpbmsiXSwiYXNzZW1ibGUiOlsiYXNzZW1ibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkg0ZOwUYAAAFGAAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL21hcC1wYXJzZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vdHJhbXBvbGluZSIsIi4vZXh0ZW5zaW9uLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcFBhcnNlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBzeW5jVHJhbXBvbGluZSxhc3luY1RyYW1wb2xpbmUscGFyc2VFeHRlbnNpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby90cmFtcG9saW5lXCIsIFtbXCJzeW5jVHJhbXBvbGluZVwiLFskaM2PX2EgPT4gKHN5bmNUcmFtcG9saW5lID0gJGjNj19hKV1dLFtcImFzeW5jVHJhbXBvbGluZVwiLFskaM2PX2EgPT4gKGFzeW5jVHJhbXBvbGluZSA9ICRozY9fYSldXV1dLFtcIi4vZXh0ZW5zaW9uLmpzXCIsIFtbXCJwYXJzZUV4dGVuc2lvblwiLFskaM2PX2EgPT4gKHBhcnNlRXh0ZW5zaW9uID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzLCBrZXlzLCBoYXNPd25Qcm9wZXJ0eSwgdmFsdWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuLy9cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBba2V5XSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlID0gZXh0ZW5zaW9uID0+IGV4dGVuc2lvbiAhPT0gJ2pzJztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRXh0ZW5zaW9uUGFyc2VyID0gKFxuICBwcmVmZXJTeW5jaHJvbm91cyxcbiAgbGFuZ3VhZ2VGb3JFeHRlbnNpb24sXG4gIGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxuICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgc3luY01vZHVsZVRyYW5zZm9ybXMsXG4pID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IHRyYW5zZm9ybXM7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGZ1bmN0aW9uKiBnZXRQYXJzZXJHZW5lcmF0b3IoXG4gICAgYnl0ZXMsXG4gICAgc3BlY2lmaWVyLFxuICAgIGxvY2F0aW9uLFxuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBvcHRpb25zLFxuICApIHtcbiAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICBsZXQgbGFuZ3VhZ2U7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gcGFyc2VFeHRlbnNpb24obG9jYXRpb24pO1xuXG4gICAgaWYgKFxuICAgICAgIWV4dGVuc2lvbkltcGxpZXNMYW5ndWFnZShleHRlbnNpb24pICYmXG4gICAgICBoYXMobGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsIHNwZWNpZmllcilcbiAgICApIHtcbiAgICAgIGxhbmd1YWdlID0gbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXJbc3BlY2lmaWVyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBsYW5ndWFnZSA9IGxhbmd1YWdlRm9yRXh0ZW5zaW9uW2V4dGVuc2lvbl0gfHwgZXh0ZW5zaW9uO1xuICAgIH1cblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBsZXQgc291cmNlTWFwO1xuXG4gICAgaWYgKGhhcyh0cmFuc2Zvcm1zLCBsYW5ndWFnZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgICh7XG4gICAgICAgICAgYnl0ZXMsXG4gICAgICAgICAgcGFyc2VyOiBsYW5ndWFnZSxcbiAgICAgICAgICBzb3VyY2VNYXAsXG4gICAgICAgIH0gPSB5aWVsZCB0cmFuc2Zvcm1zW2xhbmd1YWdlXShcbiAgICAgICAgICBieXRlcyxcbiAgICAgICAgICBzcGVjaWZpZXIsXG4gICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHNvdXJjZU1hcCxcbiAgICAgICAgICB9LFxuICAgICAgICApKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgRXJyb3IgdHJhbnNmb3JtaW5nICR7cShsYW5ndWFnZSl9IHNvdXJjZSBpbiAke3EobG9jYXRpb24pfTogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgIHsgY2F1c2U6IGVyciB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhcyhwYXJzZXJGb3JMYW5ndWFnZSwgbGFuZ3VhZ2UpKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBwYXJzZSBtb2R1bGUgJHtzcGVjaWZpZXJ9IGF0ICR7bG9jYXRpb259LCBubyBwYXJzZXIgY29uZmlndXJlZCBmb3IgdGhlIGxhbmd1YWdlICR7bGFuZ3VhZ2V9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHsgcGFyc2UgfSA9IHBhcnNlckZvckxhbmd1YWdlW2xhbmd1YWdlXTtcbiAgICByZXR1cm4gcGFyc2UoYnl0ZXMsIHNwZWNpZmllciwgbG9jYXRpb24sIHBhY2thZ2VMb2NhdGlvbiwge1xuICAgICAgc291cmNlTWFwLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IHN5bmNQYXJzZXIgPSAoYnl0ZXMsIHNwZWNpZmllciwgbG9jYXRpb24sIHBhY2thZ2VMb2NhdGlvbiwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHN5bmNUcmFtcG9saW5lKFxuICAgICAgZ2V0UGFyc2VyR2VuZXJhdG9yLFxuICAgICAgYnl0ZXMsXG4gICAgICBzcGVjaWZpZXIsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgICBpZiAoJ3RoZW4nIGluIHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdTeW5jIHBhcnNlciBjYW5ub3QgcmV0dXJuIGEgVGhlbmFibGU7IGVuc3VyZSBwYXJzZXIgaXMgYWN0dWFsbHkgc3luY2hyb25vdXMnLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgc3luY1BhcnNlci5pc1N5bmNQYXJzZXIgPSB0cnVlO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGFzeW5jUGFyc2VyID0gYXN5bmMgKFxuICAgIGJ5dGVzLFxuICAgIHNwZWNpZmllcixcbiAgICBsb2NhdGlvbixcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgb3B0aW9ucyxcbiAgKSA9PiB7XG4gICAgcmV0dXJuIGFzeW5jVHJhbXBvbGluZShcbiAgICAgIGdldFBhcnNlckdlbmVyYXRvcixcbiAgICAgIGJ5dGVzLFxuICAgICAgc3BlY2lmaWVyLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIH07XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaWYgKHByZWZlclN5bmNocm9ub3VzKSB7XG4gICAgdHJhbnNmb3JtcyA9IHN5bmNNb2R1bGVUcmFuc2Zvcm1zO1xuICAgIHJldHVybiBzeW5jUGFyc2VyO1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgLy9cbiAgICB0cmFuc2Zvcm1zID0ge1xuICAgICAgLi4uc3luY01vZHVsZVRyYW5zZm9ybXMsXG4gICAgICAuLi5tb2R1bGVUcmFuc2Zvcm1zLFxuICAgIH07XG5cbiAgICByZXR1cm4gYXN5bmNQYXJzZXI7XG4gIH1cbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiBtYXBQYXJzZXJzKFxuICBsYW5ndWFnZUZvckV4dGVuc2lvbixcbiAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gIHBhcnNlckZvckxhbmd1YWdlLFxuICBtb2R1bGVUcmFuc2Zvcm1zLFxuICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgcHJlZmVyU3luY2hyb25vdXMsXG4pIHtcbiAgbW9kdWxlVHJhbnNmb3JtcyA9IG1vZHVsZVRyYW5zZm9ybXMgfHwge307XG4gIHN5bmNNb2R1bGVUcmFuc2Zvcm1zID0gc3luY01vZHVsZVRyYW5zZm9ybXMgfHwge307XG4gIGNvbnN0IGxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcyA9IFtdO1xuICBjb25zdCBwcm9ibGVtcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtleHRlbnNpb24sIGxhbmd1YWdlXSBvZiBlbnRyaWVzKGxhbmd1YWdlRm9yRXh0ZW5zaW9uKSkge1xuICAgIGlmIChoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsIGxhbmd1YWdlKSkge1xuICAgICAgbGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzLnB1c2goW2V4dGVuc2lvbiwgbGFuZ3VhZ2VdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvYmxlbXMucHVzaChgJHtxKGxhbmd1YWdlKX0gZm9yIGV4dGVuc2lvbiAke3EoZXh0ZW5zaW9uKX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb2JsZW1zLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBFcnJvcihgTm8gcGFyc2VyIGF2YWlsYWJsZSBmb3IgbGFuZ3VhZ2U6ICR7cHJvYmxlbXMuam9pbignLCAnKX1gKTtcbiAgfVxuICByZXR1cm4gbWFrZUV4dGVuc2lvblBhcnNlcihcbiAgICAvKiAgICAgICAgICAgICAgKi8gKHByZWZlclN5bmNocm9ub3VzKSxcbiAgICBmcm9tRW50cmllcyhsYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXMpLFxuICAgIGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxuICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgc3luY01vZHVsZVRyYW5zZm9ybXMsXG4gICk7XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWFwUGFyc2VycyA9ICh7XG4gIHBhcnNlckZvckxhbmd1YWdlLFxuICBtb2R1bGVUcmFuc2Zvcm1zLFxuICBzeW5jTW9kdWxlVHJhbnNmb3Jtcyxcbn0pID0+IHtcbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgYXN5bmNQYXJzZUZuID0gKGxhbmd1YWdlRm9yRXh0ZW5zaW9uLCBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcikgPT5cbiAgICBtYXBQYXJzZXJzKFxuICAgICAgbGFuZ3VhZ2VGb3JFeHRlbnNpb24sXG4gICAgICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIHN5bmNNb2R1bGVUcmFuc2Zvcm1zLFxuICAgICk7XG5cbiAgaWYgKG1vZHVsZVRyYW5zZm9ybXMgJiYga2V5cyhtb2R1bGVUcmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGFzeW5jUGFyc2VGbjtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIGlmICh2YWx1ZXMocGFyc2VyRm9yTGFuZ3VhZ2UpLnNvbWUoKHsgc3luY2hyb25vdXMgfSkgPT4gIXN5bmNocm9ub3VzKSkge1xuICAgIHJldHVybiBhc3luY1BhcnNlRm47XG4gIH1cblxuICAvKlxuXG5cblxuXG4gICAqL1xuICByZXR1cm4gKGxhbmd1YWdlRm9yRXh0ZW5zaW9uLCBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcikgPT5cbiAgICBtYXBQYXJzZXJzKFxuICAgICAgbGFuZ3VhZ2VGb3JFeHRlbnNpb24sXG4gICAgICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIHN5bmNNb2R1bGVUcmFuc2Zvcm1zLFxuICAgICAgdHJ1ZSxcbiAgICApO1xufTskaM2PX29uY2UubWFrZU1hcFBhcnNlcnMobWFrZU1hcFBhcnNlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcFBhcnNlcnMiOlsibWFrZU1hcFBhcnNlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0X/n8tMLAADTCwAAPAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiam9pbiIsInJlbGF0aXZpemUiLCJyZXNvbHZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuICovXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzb2x2ZSA9IChzb2x1dGlvbiwgcHJvYmxlbSkgPT4ge1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcHJvYmxlbSkge1xuICAgIGlmIChwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJycpIHtcbiAgICAgIC8vXG4gICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICBpZiAoc29sdXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNvbHV0aW9uLnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb2x1dGlvbi5wdXNoKHBhcnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHJlc29sdmUgPSAoc3BlYywgcmVmZXJyZXIpID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcbiAgcmVmZXJyZXIgPSBTdHJpbmcocmVmZXJyZXIgfHwgJycpO1xuXG4gIGlmIChzcGVjLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBub3QgYmVnaW4gd2l0aCBcIi9cImApO1xuICB9XG4gIGlmICghcmVmZXJyZXIuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgcmVmZXJyZXIgJHtxKHJlZmVycmVyKX0gbXVzdCBiZWdpbiB3aXRoIFwiLi9cImApO1xuICB9XG5cbiAgY29uc3Qgc3BlY1BhcnRzID0gc3BlYy5zcGxpdCgnLycpO1xuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBjb25zdCBwcm9ibGVtID0gW107XG4gIGlmIChzcGVjUGFydHNbMF0gPT09ICcuJyB8fCBzcGVjUGFydHNbMF0gPT09ICcuLicpIHtcbiAgICBjb25zdCByZWZlcnJlclBhcnRzID0gcmVmZXJyZXIuc3BsaXQoJy8nKTtcbiAgICBwcm9ibGVtLnB1c2goLi4ucmVmZXJyZXJQYXJ0cyk7XG4gICAgcHJvYmxlbS5wb3AoKTtcbiAgICBzb2x1dGlvbi5wdXNoKCcuJyk7XG4gIH1cbiAgcHJvYmxlbS5wdXNoKC4uLnNwZWNQYXJ0cyk7XG5cbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgcHJvYmxlbSkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gdmlhIHJlZmVycmVyICR7cShcbiAgICAgICAgcmVmZXJyZXIsXG4gICAgICApfSBtdXN0IG5vdCB0cmF2ZXJzZSBiZWhpbmQgYW4gZW1wdHkgcGF0aGAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzb2x1dGlvbi5qb2luKCcvJyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5yZXNvbHZlKHJlc29sdmUpO1xuICAgICAgIGNvbnN0IGpvaW4gPSAoYmFzZSwgc3BlYykgPT4ge1xuICBzcGVjID0gU3RyaW5nKHNwZWMgfHwgJycpO1xuICBiYXNlID0gU3RyaW5nKGJhc2UgfHwgJycpO1xuXG4gIGNvbnN0IHNwZWNQYXJ0cyA9IHNwZWMuc3BsaXQoJy8nKTtcbiAgY29uc3QgYmFzZVBhcnRzID0gYmFzZS5zcGxpdCgnLycpO1xuXG4gIGlmIChzcGVjUGFydHMubGVuZ3RoID4gMSAmJiBzcGVjUGFydHNbMF0gPT09ICcnKSB7XG4gICAgdGhyb3cgRXJyb3IoYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBzdGFydCB3aXRoIFwiL1wiYCk7XG4gIH1cbiAgaWYgKGJhc2VQYXJ0c1swXSA9PT0gJy4nIHx8IGJhc2VQYXJ0c1swXSA9PT0gJy4uJykge1xuICAgIHRocm93IEVycm9yKGBFeHRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShiYXNlKX0gbXVzdCBiZSBhYnNvbHV0ZWApO1xuICB9XG4gIGlmIChzcGVjUGFydHNbMF0gIT09ICcuJykge1xuICAgIHRocm93IEVycm9yKGBJbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBiZSByZWxhdGl2ZWApO1xuICB9XG5cbiAgY29uc3Qgc29sdXRpb24gPSBbXTtcbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgc3BlY1BhcnRzKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSB2aWEgYmFzZSAke3EoXG4gICAgICAgIGJhc2UsXG4gICAgICApfSBtdXN0IG5vdCByZWZlciB0byBhIG1vZHVsZSBvdXRzaWRlIG9mIHRoZSBiYXNlYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFtiYXNlLCAuLi5zb2x1dGlvbl0uam9pbignLycpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5qb2luKGpvaW4pO1xuICAgICAgIGNvbnN0IHJlbGF0aXZpemUgPSBzcGVjID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcblxuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBpZiAoIXNvbHZlKHNvbHV0aW9uLCBzcGVjLnNwbGl0KCcvJykpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFsnLicsIC4uLnNvbHV0aW9uXS5qb2luKCcvJyk7XG59OyRozY9fb25jZS5yZWxhdGl2aXplKHJlbGF0aXZpemUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVzb2x2ZSI6WyJyZXNvbHZlIl0sImpvaW4iOlsiam9pbiJdLCJyZWxhdGl2aXplIjpbInJlbGF0aXZpemUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgUf1NFIFAABSBQAAMgAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL3BhcnNlLWJ5dGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VCeXRlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZnJlZXplID0gT2JqZWN0LmZyZWV6ZTtcblxuLyogICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IHBhcnNlQnl0ZXMgPSAoYnl0ZXMsIF9zcGVjaWZpZXIsIF9sb2NhdGlvbiwgX3BhY2thZ2VMb2NhdGlvbikgPT4ge1xuICAvL1xuICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZXMubGVuZ3RoKTtcbiAgY29uc3QgYnl0ZXNWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgYnl0ZXNWaWV3LnNldChieXRlcyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbXBvcnRzID0gZnJlZXplKFtdKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gZXhwb3J0cyA9PiB7XG4gICAgZXhwb3J0cy5kZWZhdWx0ID0gYnVmZmVyO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAnYnl0ZXMnLFxuICAgIGJ5dGVzLFxuICAgIHJlY29yZDogZnJlZXplKHtcbiAgICAgIGltcG9ydHMsXG4gICAgICBleHBvcnRzOiBmcmVlemUoWydkZWZhdWx0J10pLFxuICAgICAgZXhlY3V0ZTogZnJlZXplKGV4ZWN1dGUpLFxuICAgIH0pLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VCeXRlcyhwYXJzZUJ5dGVzKTtcbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDp7XG4gIHBhcnNlOiBwYXJzZUJ5dGVzLFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlQnl0ZXMiOlsicGFyc2VCeXRlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACTY5TvVBUAAFQVAABGAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc3siaW1wb3J0cyI6WyIuL3Bvd2Vycy5qcyJdLCJleHBvcnRzIjpbImdldE1vZHVsZVBhdGhzIiwid3JhcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGZpbmRJbnZhbGlkUmVhZE5vd1Bvd2Vyc1Byb3BzLGlzUmVhZE5vd1Bvd2VyczskaM2PX2ltcG9ydHMoW1tcIi4vcG93ZXJzLmpzXCIsIFtbXCJmaW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wc1wiLFskaM2PX2EgPT4gKGZpbmRJbnZhbGlkUmVhZE5vd1Bvd2Vyc1Byb3BzID0gJGjNj19hKV1dLFtcImlzUmVhZE5vd1Bvd2Vyc1wiLFskaM2PX2EgPT4gKGlzUmVhZE5vd1Bvd2VycyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZnJlZXplLCBrZXlzLCBjcmVhdGUsIGhhc093blByb3BlcnR5LCBkZWZpbmVQcm9wZXJ0eSB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IGFwcGx5KGhhc093blByb3BlcnR5LCBvYmplY3QsIFtrZXldKTtcblxuLypcblxuICovXG5jb25zdCBub1RyYWlsaW5nU2xhc2ggPSBwYXRoID0+IHtcbiAgY29uc3QgbCA9IHBhdGgubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIHBhdGhbbF0gPT09ICdcXFxcJyB8fCBwYXRoW2xdID09PSAnLycgPyBwYXRoLnNsaWNlKDAsIC0xKSA6IHBhdGg7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRNb2R1bGVQYXRocyA9IChyZWFkUG93ZXJzLCBsb2NhdGlvbikgPT4ge1xuICBpZiAoXG4gICAgcmVhZFBvd2VycyAmJlxuICAgIHR5cGVvZiByZWFkUG93ZXJzICE9PSAnZnVuY3Rpb24nICYmXG4gICAgcmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoXG4gICkge1xuICAgIGxldCBmaWxlbmFtZSA9IGxvY2F0aW9uO1xuICAgIGxldCBkaXJuYW1lO1xuICAgIHRyeSB7XG4gICAgICBkaXJuYW1lID0gbmV3IFVSTCgnLi8nLCBmaWxlbmFtZSkuaHJlZjtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWxlbmFtZTogbnVsbCxcbiAgICAgICAgZGlybmFtZTogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZmlsZW5hbWUgPSByZWFkUG93ZXJzLmZpbGVVUkxUb1BhdGgoZmlsZW5hbWUpLnRvU3RyaW5nKCk7XG4gICAgZGlybmFtZSA9IG5vVHJhaWxpbmdTbGFzaChyZWFkUG93ZXJzLmZpbGVVUkxUb1BhdGgoZGlybmFtZSkudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlsZW5hbWUsXG4gICAgICBkaXJuYW1lLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lOiBudWxsLFxuICAgICAgZGlybmFtZTogbnVsbCxcbiAgICB9O1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmdldE1vZHVsZVBhdGhzKGdldE1vZHVsZVBhdGhzKTtcbiAgICAgICBjb25zdCB3cmFwID0gKHtcbiAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQsXG4gIGNvbXBhcnRtZW50LFxuICByZXNvbHZlZEltcG9ydHMsXG4gIGxvY2F0aW9uLFxuICByZWFkUG93ZXJzLFxufSkgPT4ge1xuICAvL1xuICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0ID0gY3JlYXRlKFxuICAgIGNvbXBhcnRtZW50Lmdsb2JhbFRoaXMuT2JqZWN0LnByb3RvdHlwZSxcbiAgKTtcblxuICAvL1xuICAvL1xuICBjb25zdCBwcm9tb3RlVG9OYW1lZEV4cG9ydCA9IChwcm9wLCB2YWx1ZSkgPT4ge1xuICAgIC8vXG4gICAgaWYgKHByb3AgIT09ICdkZWZhdWx0Jykge1xuICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF0gPSB2YWx1ZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmVkZWZpbmVkID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0IG9yaWdpbmFsRXhwb3J0cyA9IG5ldyBQcm94eShtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0LCB7XG4gICAgc2V0KF90YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICBwcm9tb3RlVG9OYW1lZEV4cG9ydChwcm9wLCB2YWx1ZSk7XG4gICAgICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwgZGVzY3JpcHRvcikge1xuICAgICAgaWYgKGhhcyhkZXNjcmlwdG9yLCAndmFsdWUnKSkge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBwcm9tb3RlVG9OYW1lZEV4cG9ydChwcm9wLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wLCBkZXNjcmlwdG9yKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmVkZWZpbmVkLmFkZChwcm9wKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IG1vZHVsZSA9IHsgZXhwb3J0czogb3JpZ2luYWxFeHBvcnRzIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcmVxdWlyZSA9IGltcG9ydFNwZWNpZmllciA9PiB7XG4gICAgLy9cblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBuYW1lc3BhY2U7XG5cbiAgICBpZiAoIWhhcyhyZXNvbHZlZEltcG9ydHMsIGltcG9ydFNwZWNpZmllcikpIHtcbiAgICAgIGlmIChpc1JlYWROb3dQb3dlcnMocmVhZFBvd2VycykpIHtcbiAgICAgICAgbmFtZXNwYWNlID0gY29tcGFydG1lbnQuaW1wb3J0Tm93KGltcG9ydFNwZWNpZmllcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbnZhbGlkUHJvcHMgPSBmaW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wcyhyZWFkUG93ZXJzKS5zb3J0KCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU3luY2hyb25vdXMgcmVhZFBvd2VycyByZXF1aXJlZCBmb3IgZHluYW1pYyBpbXBvcnQgb2YgJHthc3NlcnQucXVvdGUoaW1wb3J0U3BlY2lmaWVyKX07IG1pc3Npbmcgb3IgaW52YWxpZCBwcm9wKHMpOiAke2ludmFsaWRQcm9wcy5qb2luKCcsICcpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVzcGFjZSA9IGNvbXBhcnRtZW50LmltcG9ydE5vdyhyZXNvbHZlZEltcG9ydHNbaW1wb3J0U3BlY2lmaWVyXSk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIGlmIChoYXMobmFtZXNwYWNlLCAnZGVmYXVsdCcpKSB7XG4gICAgICByZXR1cm4gbmFtZXNwYWNlLmRlZmF1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuYW1lc3BhY2U7XG4gICAgfVxuICB9O1xuICBpZiAodHlwZW9mIHJlYWRQb3dlcnMgPT09ICdvYmplY3QnICYmIHJlYWRQb3dlcnMucmVxdWlyZVJlc29sdmUpIHtcbiAgICBjb25zdCB7IHJlcXVpcmVSZXNvbHZlIH0gPSByZWFkUG93ZXJzO1xuICAgIHJlcXVpcmUucmVzb2x2ZSA9IGZyZWV6ZSgoc3BlY2lmaWVyLCBvcHRpb25zKSA9PlxuICAgICAgcmVxdWlyZVJlc29sdmUobG9jYXRpb24sIHNwZWNpZmllciwgb3B0aW9ucyksXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXF1aXJlLnJlc29sdmUgPSBmcmVlemUoc3BlY2lmaWVyID0+IHtcbiAgICAgIGNvbnN0IGVycm9yID0gRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgZmluZCBtb2R1bGUgJyR7c3BlY2lmaWVyfSdcXG5BZGQgcmVxdWlyZVJlc29sdmUgdG8gRW5kbyBDb21wYXJ0bWVudCBNYXBwZXIgcmVhZFBvd2Vycy5gLFxuICAgICAgKTtcbiAgICAgIGRlZmluZVByb3BlcnR5KGVycm9yLCAnY29kZScsIHsgdmFsdWU6ICdNT0RVTEVfTk9UX0ZPVU5EJyB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuICB9XG5cbiAgLy9cbiAgY29uc3QgcmVxdWlyZUV4dGVuc2lvbnMgPSBjcmVhdGUobnVsbCk7XG4gIGNvbnN0IGZhaWwgPSBmcmVlemUoXG4gICAgLypcblxuXG5cbiAgICAgKi9cbiAgICAoX21vZHVsZSwgX2ZpbGVuYW1lKSA9PiB7XG4gICAgICB0aHJvdyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfSxcbiAgKTtcbiAgcmVxdWlyZUV4dGVuc2lvbnNbJy5qcyddID0gZmFpbDtcbiAgcmVxdWlyZUV4dGVuc2lvbnNbJy5qc29uJ10gPSBmYWlsO1xuICByZXF1aXJlRXh0ZW5zaW9uc1snLm5vZGUnXSA9IGZhaWw7XG4gIGZyZWV6ZShyZXF1aXJlRXh0ZW5zaW9ucyk7XG4gIHJlcXVpcmUuZXh0ZW5zaW9ucyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIHJlcXVpcmVFeHRlbnNpb25zXG4gICk7XG5cbiAgZnJlZXplKHJlcXVpcmUpO1xuXG4gIGNvbnN0IGFmdGVyRXhlY3V0ZSA9ICgpID0+IHtcbiAgICBjb25zdCBmaW5hbEV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0czsgLy9cbiAgICBjb25zdCBleHBvcnRzSGF2ZUJlZW5PdmVyd3JpdHRlbiA9IGZpbmFsRXhwb3J0cyAhPT0gb3JpZ2luYWxFeHBvcnRzO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGlmIChleHBvcnRzSGF2ZUJlZW5PdmVyd3JpdHRlbikge1xuICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdCA9IGZpbmFsRXhwb3J0cztcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBrZXlzKG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQgfHwge30pKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZFtwcm9wXSA9IG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHRbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHJlZGVmaW5lZCkge1xuICAgICAgICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZFtwcm9wXSA9IG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHRbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbW9kdWxlLFxuICAgIG1vZHVsZUV4cG9ydHM6IG9yaWdpbmFsRXhwb3J0cyxcbiAgICBhZnRlckV4ZWN1dGUsXG4gICAgcmVxdWlyZSxcbiAgfTtcbn07JGjNj19vbmNlLndyYXAod3JhcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNb2R1bGVQYXRocyI6WyJnZXRNb2R1bGVQYXRocyJdLCJ3cmFwIjpbIndyYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfr9W5kQFAABEBQAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL3BhcnNlLWpzb24uanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlSnNvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhcnNlTG9jYXRlZEpzb247JGjNj19pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIixbJGjNj19hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGZyZWV6ZSA9IE9iamVjdC5mcmVlemU7XG5cbmNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbi8qICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBwYXJzZUpzb24gPSAoYnl0ZXMsIF9zcGVjaWZpZXIsIGxvY2F0aW9uLCBfcGFja2FnZUxvY2F0aW9uKSA9PiB7XG4gIGNvbnN0IHNvdXJjZSA9IHRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaW1wb3J0cyA9IGZyZWV6ZShbXSk7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgZXhlY3V0ZSA9IGV4cG9ydHMgPT4ge1xuICAgIGV4cG9ydHMuZGVmYXVsdCA9IHBhcnNlTG9jYXRlZEpzb24oc291cmNlLCBsb2NhdGlvbik7XG4gIH07XG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAnanNvbicsXG4gICAgYnl0ZXMsXG4gICAgcmVjb3JkOiBmcmVlemUoe1xuICAgICAgaW1wb3J0cyxcbiAgICAgIGV4cG9ydHM6IGZyZWV6ZShbJ2RlZmF1bHQnXSksXG4gICAgICBleGVjdXRlOiBmcmVlemUoZXhlY3V0ZSksXG4gICAgfSksXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZUpzb24ocGFyc2VKc29uKTtcbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDp7XG4gIHBhcnNlOiBwYXJzZUpzb24sXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VKc29uIjpbInBhcnNlSnNvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAjk/HXIggAACIIAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvcGFyc2UtcHJlLWNqcy5qc3siaW1wb3J0cyI6WyIuL2pzb24uanMiLCIuL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VQcmVDanMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXJzZUxvY2F0ZWRKc29uLHdyYXAsZ2V0TW9kdWxlUGF0aHM7JGjNj19pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIixbJGjNj19hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjNj19hKV1dXV0sW1wiLi9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzXCIsIFtbXCJ3cmFwXCIsWyRozY9fYSA9PiAod3JhcCA9ICRozY9fYSldXSxbXCJnZXRNb2R1bGVQYXRoc1wiLFskaM2PX2EgPT4gKGdldE1vZHVsZVBhdGhzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VQcmVDanMgPSAoXG4gIGJ5dGVzLFxuICBfc3BlY2lmaWVyLFxuICBsb2NhdGlvbixcbiAgX3BhY2thZ2VMb2NhdGlvbixcbiAgeyByZWFkUG93ZXJzIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbiAgY29uc3QgeyBzb3VyY2UsIGltcG9ydHMsIGV4cG9ydHMsIHJlZXhwb3J0cyB9ID0gcGFyc2VMb2NhdGVkSnNvbihcbiAgICB0ZXh0LFxuICAgIGxvY2F0aW9uLFxuICApO1xuXG4gIGNvbnN0IHsgZmlsZW5hbWUsIGRpcm5hbWUgfSA9IGdldE1vZHVsZVBhdGhzKHJlYWRQb3dlcnMsIGxvY2F0aW9uKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgZXhlY3V0ZSA9IChtb2R1bGVFbnZpcm9ubWVudFJlY29yZCwgY29tcGFydG1lbnQsIHJlc29sdmVkSW1wb3J0cykgPT4ge1xuICAgIGNvbnN0IGZ1bmN0b3IgPSBjb21wYXJ0bWVudC5ldmFsdWF0ZShzb3VyY2UpO1xuXG4gICAgY29uc3QgeyByZXF1aXJlLCBtb2R1bGVFeHBvcnRzLCBtb2R1bGUsIGFmdGVyRXhlY3V0ZSB9ID0gd3JhcCh7XG4gICAgICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZCxcbiAgICAgIGNvbXBhcnRtZW50LFxuICAgICAgcmVzb2x2ZWRJbXBvcnRzLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByZWFkUG93ZXJzLFxuICAgIH0pO1xuXG4gICAgLy9cbiAgICBmdW5jdG9yLmNhbGwoXG4gICAgICBtb2R1bGVFeHBvcnRzLFxuICAgICAgcmVxdWlyZSxcbiAgICAgIG1vZHVsZUV4cG9ydHMsXG4gICAgICBtb2R1bGUsXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIGRpcm5hbWUsXG4gICAgKTtcblxuICAgIGFmdGVyRXhlY3V0ZSgpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAncHJlLWNqcy1qc29uJyxcbiAgICBieXRlcyxcbiAgICByZWNvcmQ6IHtcbiAgICAgIGltcG9ydHMsXG4gICAgICByZWV4cG9ydHMsXG4gICAgICBleHBvcnRzLFxuICAgICAgZXhlY3V0ZSxcbiAgICB9LFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VQcmVDanMocGFyc2VQcmVDanMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlUHJlQ2pzLFxuICBoZXVyaXN0aWNJbXBvcnRzOiB0cnVlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVDanMiOlsicGFyc2VQcmVDanMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATGHaW1UFAABVBQAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL3BhcnNlLXByZS1tanMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlTWpzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VMb2NhdGVkSnNvbjskaM2PX2ltcG9ydHMoW1tcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLFskaM2PX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuLyogICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IHBhcnNlUHJlTWpzID0gKFxuICBieXRlcyxcbiAgX3NwZWNpZmllcixcbiAgbG9jYXRpb24sXG4gIF9wYWNrYWdlTG9jYXRpb24sXG4gIHsgc291cmNlTWFwVXJsIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbiAgY29uc3QgcmVjb3JkID0gcGFyc2VMb2NhdGVkSnNvbih0ZXh0LCBsb2NhdGlvbik7XG4gIGlmIChzb3VyY2VNYXBVcmwpIHtcbiAgICAvL1xuICAgIHJlY29yZC5fX3N5bmNNb2R1bGVQcm9ncmFtX18gKz0gYC8vIyBzb3VyY2VNYXBwaW5nVVJMPSR7c291cmNlTWFwVXJsfVxcbmA7XG4gIH0gZWxzZSB7XG4gICAgLy9cbiAgICByZWNvcmQuX19zeW5jTW9kdWxlUHJvZ3JhbV9fICs9IGAvLyMgc291cmNlVVJMPSR7bG9jYXRpb259XFxuYDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHBhcnNlcjogJ3ByZS1tanMtanNvbicsXG4gICAgYnl0ZXMsXG4gICAgcmVjb3JkLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VQcmVNanMocGFyc2VQcmVNanMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlUHJlTWpzLFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlUHJlTWpzIjpbInBhcnNlUHJlTWpzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFk9swT+BAAA/gQAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wYXJzZS10ZXh0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VUZXh0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGZyZWV6ZSA9IE9iamVjdC5mcmVlemU7XG5cbmNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbi8qICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBwYXJzZVRleHQgPSAoYnl0ZXMsIF9zcGVjaWZpZXIsIF9sb2NhdGlvbiwgX3BhY2thZ2VMb2NhdGlvbikgPT4ge1xuICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGltcG9ydHMgPSBmcmVlemUoW10pO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBleHBvcnRzID0+IHtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSB0ZXh0O1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAndGV4dCcsXG4gICAgYnl0ZXMsXG4gICAgcmVjb3JkOiBmcmVlemUoe1xuICAgICAgaW1wb3J0cyxcbiAgICAgIGV4cG9ydHM6IGZyZWV6ZShbJ2RlZmF1bHQnXSksXG4gICAgICBleGVjdXRlOiBmcmVlemUoZXhlY3V0ZSksXG4gICAgfSksXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZVRleHQocGFyc2VUZXh0KTtcbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDp7XG4gIHBhcnNlOiBwYXJzZVRleHQsXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VUZXh0IjpbInBhcnNlVGV4dCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADZ3AwGYxkAAGMZAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvcG9saWN5LWZvcm1hdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiV0lMRENBUkRfUE9MSUNZX1ZBTFVFIiwiYXNzZXJ0UGFja2FnZVBvbGljeSIsImFzc2VydFBvbGljeSIsImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiIsImlzQWxsb3dpbmdFdmVyeXRoaW5nIiwiaXNBdHRlbnVhdGlvbkRlZmluaXRpb24iLCJwb2xpY3lMb29rdXBIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBBVFRFTlVBVE9SX0tFWSA9ICdhdHRlbnVhdGUnO1xuY29uc3QgQVRURU5VQVRPUl9QQVJBTVNfS0VZID0gJ3BhcmFtcyc7XG4gICAgICAgY29uc3QgV0lMRENBUkRfUE9MSUNZX1ZBTFVFID0gJ2FueSc7JGjNj19vbmNlLldJTERDQVJEX1BPTElDWV9WQUxVRShXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUpO1xuXG5jb25zdCBQT0xJQ1lfRklFTERTX0xPT0tVUCA9IC8qICAgICAgICAgICAgICAgICovIChbXG4gICdidWlsdGlucycsXG4gICdnbG9iYWxzJyxcbiAgJ3BhY2thZ2VzJyxcbl0pO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBvbGljeUxvb2t1cEhlbHBlciA9IChwYWNrYWdlUG9saWN5LCBmaWVsZCwgaXRlbU5hbWUpID0+IHtcbiAgaWYgKCFQT0xJQ1lfRklFTERTX0xPT0tVUC5pbmNsdWRlcyhmaWVsZCkpIHtcbiAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBmaWVsZCAke3EoZmllbGQpfWApO1xuICB9XG4gIGlmIChcbiAgICB0eXBlb2YgcGFja2FnZVBvbGljeSAhPT0gJ29iamVjdCcgfHxcbiAgICBwYWNrYWdlUG9saWN5ID09PSBudWxsIHx8XG4gICAgIXBhY2thZ2VQb2xpY3lbZmllbGRdXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChwYWNrYWdlUG9saWN5W2ZpZWxkXSA9PT0gV0lMRENBUkRfUE9MSUNZX1ZBTFVFKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB2YWx1ZSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgcGFja2FnZVBvbGljeVtmaWVsZF1cbiAgKTtcbiAgaWYgKGl0ZW1OYW1lIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlW2l0ZW1OYW1lXTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UucG9saWN5TG9va3VwSGVscGVyKHBvbGljeUxvb2t1cEhlbHBlcik7XG4gICAgICAgY29uc3QgaXNBbGxvd2luZ0V2ZXJ5dGhpbmcgPSBwb2xpY3lWYWx1ZSA9PlxuICBwb2xpY3lWYWx1ZSA9PT0gV0lMRENBUkRfUE9MSUNZX1ZBTFVFO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmlzQWxsb3dpbmdFdmVyeXRoaW5nKGlzQWxsb3dpbmdFdmVyeXRoaW5nKTtcbiAgICAgICBjb25zdCBpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiA9IGFsbGVnZWREZWZpbml0aW9uID0+IHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgKGFsbGVnZWREZWZpbml0aW9uICYmXG4gICAgICB0eXBlb2YgYWxsZWdlZERlZmluaXRpb24gPT09ICdvYmplY3QnICYmXG4gICAgICB0eXBlb2YgYWxsZWdlZERlZmluaXRpb25bQVRURU5VQVRPUl9LRVldID09PSAnc3RyaW5nJykgfHwgLy9cbiAgICAgIGlzQXJyYXkoYWxsZWdlZERlZmluaXRpb24pICAvL1xuICApO1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5pc0F0dGVudWF0aW9uRGVmaW5pdGlvbihpc0F0dGVudWF0aW9uRGVmaW5pdGlvbik7XG4gICAgICAgY29uc3QgZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uID0gYXR0ZW51YXRpb25EZWZpbml0aW9uID0+IHtcbiAgaWYgKCFpc0F0dGVudWF0aW9uRGVmaW5pdGlvbihhdHRlbnVhdGlvbkRlZmluaXRpb24pKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgSW52YWxpZCBhdHRlbnVhdGlvbiAke3EoXG4gICAgICAgIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgICAgICl9LCBtdXN0IGJlIGFuIGFycmF5IG9mIHBhcmFtcyBmb3IgZGVmYXVsdCBhdHRlbnVhdG9yIG9yIGFuIG9iamVjdCB3aXRoIGFuIGF0dGVudWF0b3Iga2V5YCxcbiAgICApO1xuICB9XG4gIGlmIChpc0FycmF5KGF0dGVudWF0aW9uRGVmaW5pdGlvbikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU5hbWU6ICc8ZGVmYXVsdCBhdHRlbnVhdG9yPicsXG4gICAgICBzcGVjaWZpZXI6IG51bGwsXG4gICAgICBwYXJhbXM6IGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5TmFtZTogYXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfS0VZXSxcbiAgICAgIHNwZWNpZmllcjogYXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfS0VZXSxcbiAgICAgIHBhcmFtczogYXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfUEFSQU1TX0tFWV0sXG4gICAgfTtcbiAgfVxufTtcblxuLy9cbiRozY9fb25jZS5nZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKTtjb25zdCBpc1JlY29yZE9mPShpdGVtLHByZWRpY2F0ZSk9PntcbiAgaWYgKHR5cGVvZiBpdGVtICE9PSAnb2JqZWN0JyB8fCBpdGVtID09PSBudWxsIHx8IGlzQXJyYXkoaXRlbSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGVudHJpZXMoaXRlbSkuZXZlcnkoKFtrZXksIHZhbHVlXSkgPT4gcHJlZGljYXRlKHZhbHVlLCBrZXkpKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGlzQm9vbGVhbiA9IGl0ZW0gPT4gdHlwZW9mIGl0ZW0gPT09ICdib29sZWFuJztcblxuLy9cbmNvbnN0IHByZWRpY2F0ZU9yID1cbiAgKC4uLnByZWRpY2F0ZXMpID0+XG4gIGl0ZW0gPT5cbiAgICBwcmVkaWNhdGVzLnNvbWUocCA9PiBwKGl0ZW0pKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGlzUG9saWN5SXRlbSA9IGl0ZW0gPT5cbiAgaXRlbSA9PT0gdW5kZWZpbmVkIHx8XG4gIGl0ZW0gPT09IFdJTERDQVJEX1BPTElDWV9WQUxVRSB8fFxuICBpc1JlY29yZE9mKGl0ZW0sIGlzQm9vbGVhbik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UGFja2FnZVBvbGljeSA9IChhbGxlZ2VkUGFja2FnZVBvbGljeSwgcGF0aCwgdXJsKSA9PiB7XG4gIGlmIChhbGxlZ2VkUGFja2FnZVBvbGljeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGluVXJsID0gdXJsID8gYCBpbiAke3EodXJsKX1gIDogJyc7XG5cbiAgY29uc3QgcGFja2FnZVBvbGljeSA9IE9iamVjdChhbGxlZ2VkUGFja2FnZVBvbGljeSk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkUGFja2FnZVBvbGljeSA9PT0gcGFja2FnZVBvbGljeSAmJiAhaXNBcnJheShhbGxlZ2VkUGFja2FnZVBvbGljeSksXG4gICAgYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZFBhY2thZ2VQb2xpY3kpfSR7aW5Vcmx9YCxcbiAgKTtcbiAgY29uc3Qge1xuICAgIHBhY2thZ2VzLFxuICAgIGJ1aWx0aW5zLFxuICAgIGdsb2JhbHMsXG4gICAgbm9HbG9iYWxGcmVlemUsXG4gICAgZGVmYXVsdEF0dGVudWF0b3I6IF9pZ25vcmUsIC8vXG4gICAgLy9cbiAgICBvcHRpb25zLCAvL1xuICAgIC4uLmV4dHJhXG4gIH0gPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocGFja2FnZVBvbGljeSk7XG5cbiAgYXNzZXJ0KFxuICAgIGtleXMoZXh0cmEpLmxlbmd0aCA9PT0gMCxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoa2V5cyhleHRyYSkpfSR7aW5Vcmx9YCxcbiAgKTtcblxuICBhc3NlcnQoXG4gICAgbm9HbG9iYWxGcmVlemUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygbm9HbG9iYWxGcmVlemUgPT09ICdib29sZWFuJyxcbiAgICBgJHtwYXRofS5ub0dsb2JhbEZyZWV6ZSBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7cSh7XG4gICAgICBub0dsb2JhbEZyZWV6ZSxcbiAgICB9KX0ke2luVXJsfWAsXG4gICk7XG5cbiAgaXNQb2xpY3lJdGVtKHBhY2thZ2VzKSB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0ucGFja2FnZXMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucywgZ290ICR7cSh7XG4gICAgICAgIHBhY2thZ2VzLFxuICAgICAgfSl9JHtpblVybH1gLFxuICAgICk7XG5cbiAgaXNQb2xpY3lJdGVtKGdsb2JhbHMpIHx8XG4gICAgaXNBdHRlbnVhdGlvbkRlZmluaXRpb24oZ2xvYmFscykgfHxcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIGAke3BhdGh9Lmdsb2JhbHMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhIHNpbmdsZSBhdHRlbnVhdGlvbiwgZ290ICR7cShcbiAgICAgICAge1xuICAgICAgICAgIGdsb2JhbHMsXG4gICAgICAgIH0sXG4gICAgICApfSR7aW5Vcmx9YCxcbiAgICApO1xuXG4gIGlzUG9saWN5SXRlbShidWlsdGlucykgfHxcbiAgICBpc1JlY29yZE9mKGJ1aWx0aW5zLCBwcmVkaWNhdGVPcihpc0Jvb2xlYW4sIGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKSkgfHxcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIGAke3BhdGh9LmJ1aWx0aW5zIG11c3QgYmUgYSByZWNvcmQgb2YgYm9vbGVhbnMgb3IgYXR0ZW51YXRpb25zLCBnb3QgJHtxKHtcbiAgICAgICAgYnVpbHRpbnMsXG4gICAgICB9KX0ke2luVXJsfWAsXG4gICAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0UGFja2FnZVBvbGljeShhc3NlcnRQYWNrYWdlUG9saWN5KTtcbiAgICAgICBjb25zdCBhc3NlcnRQb2xpY3kgPSBhbGxlZ2VkUG9saWN5ID0+IHtcbiAgaWYgKGFsbGVnZWRQb2xpY3kgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwb2xpY3kgPSBPYmplY3QoYWxsZWdlZFBvbGljeSk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkUG9saWN5ID09PSBwb2xpY3kgJiYgIUFycmF5LmlzQXJyYXkocG9saWN5KSxcbiAgICBgcG9saWN5IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkUG9saWN5fWAsXG4gICk7XG5cbiAgY29uc3QgeyByZXNvdXJjZXMsIGVudHJ5LCBkZWZhdWx0QXR0ZW51YXRvciwgLi4uZXh0cmEgfSA9IHBvbGljeTtcbiAgYXNzZXJ0KFxuICAgIGtleXMoZXh0cmEpLmxlbmd0aCA9PT0gMCxcbiAgICBgcG9saWN5IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShrZXlzKGV4dHJhKSl9YCxcbiAgKTtcblxuICBhc3NlcnQoXG4gICAgdHlwZW9mIHJlc291cmNlcyA9PT0gJ29iamVjdCcgJiYgcmVzb3VyY2VzICE9PSBudWxsICYmICFpc0FycmF5KHJlc291cmNlcyksXG4gICAgYHBvbGljeS5yZXNvdXJjZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EocmVzb3VyY2VzKX1gLFxuICApO1xuICBhc3NlcnQoXG4gICAgIWRlZmF1bHRBdHRlbnVhdG9yIHx8IHR5cGVvZiBkZWZhdWx0QXR0ZW51YXRvciA9PT0gJ3N0cmluZycsXG4gICAgYHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvciBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGRlZmF1bHRBdHRlbnVhdG9yKX1gLFxuICApO1xuXG4gIGFzc2VydFBhY2thZ2VQb2xpY3koZW50cnksIGBwb2xpY3kuZW50cnlgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKHJlc291cmNlcykpIHtcbiAgICBhc3NlcnRQYWNrYWdlUG9saWN5KHZhbHVlLCBgcG9saWN5LnJlc291cmNlc1tcIiR7a2V5fVwiXWApO1xuICB9XG59OyRozY9fb25jZS5hc3NlcnRQb2xpY3koYXNzZXJ0UG9saWN5KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IldJTERDQVJEX1BPTElDWV9WQUxVRSI6WyJXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUiXSwicG9saWN5TG9va3VwSGVscGVyIjpbInBvbGljeUxvb2t1cEhlbHBlciJdLCJpc0FsbG93aW5nRXZlcnl0aGluZyI6WyJpc0FsbG93aW5nRXZlcnl0aGluZyJdLCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiI6WyJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiJdLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iOlsiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uIl0sImFzc2VydFBhY2thZ2VQb2xpY3kiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSJdLCJhc3NlcnRQb2xpY3kiOlsiYXNzZXJ0UG9saWN5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAObZbvY8KgAAPCoAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wb2xpY3kuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiLCJhdHRlbnVhdGVHbG9iYWxzIiwiYXR0ZW51YXRlTW9kdWxlSG9vayIsImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiLCJkZXRlY3RBdHRlbnVhdG9ycyIsImVuZm9yY2VNb2R1bGVQb2xpY3kiLCJnZXRQb2xpY3lGb3JQYWNrYWdlIiwibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbixpc0FsbG93aW5nRXZlcnl0aGluZyxpc0F0dGVudWF0aW9uRGVmaW5pdGlvbixwb2xpY3lMb29rdXBIZWxwZXI7JGjNj19pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvblwiLFskaM2PX2EgPT4gKGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiA9ICRozY9fYSldXSxbXCJpc0FsbG93aW5nRXZlcnl0aGluZ1wiLFskaM2PX2EgPT4gKGlzQWxsb3dpbmdFdmVyeXRoaW5nID0gJGjNj19hKV1dLFtcImlzQXR0ZW51YXRpb25EZWZpbml0aW9uXCIsWyRozY9fYSA9PiAoaXNBdHRlbnVhdGlvbkRlZmluaXRpb24gPSAkaM2PX2EpXV0sW1wicG9saWN5TG9va3VwSGVscGVyXCIsWyRozY9fYSA9PiAocG9saWN5TG9va3VwSGVscGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBjcmVhdGUsIGVudHJpZXMsIHZhbHVlcywgYXNzaWduLCBmcmVlemUsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgfSA9XG4gIE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuLypcblxuICovXG4gICAgICAgY29uc3QgQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQgPSAnPEFUVEVOVUFUT1JTPic7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKTtcbmNvbnN0IHNlbGVjdGl2ZUNvcHkgPSAoZnJvbSwgdG8sIGxpc3QpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IHByb3BzO1xuICBpZiAoIWxpc3QpIHtcbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoZnJvbSk7XG4gICAgcHJvcHMgPSBvd25LZXlzKGZyb20pLmZpbHRlcihrZXkgPT4gZGVzY3Nba2V5XS5lbnVtZXJhYmxlKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9wcyA9IGxpc3Q7XG4gIH1cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHByb3BzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGtleSA9IHByb3BzW2luZGV4XTtcbiAgICAvL1xuICAgIC8vXG4gICAgdG9ba2V5XSA9IGZyb21ba2V5XTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29sbGVjdEF0dGVudWF0b3JzID0gKGF0dGVudWF0b3JzLCBwb2xpY3lGcmFnbWVudCkgPT4ge1xuICBpZiAoJ2F0dGVudWF0ZScgaW4gcG9saWN5RnJhZ21lbnQpIHtcbiAgICBhdHRlbnVhdG9ycy5wdXNoKHBvbGljeUZyYWdtZW50LmF0dGVudWF0ZSk7XG4gIH1cbiAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMocG9saWN5RnJhZ21lbnQpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIGNvbGxlY3RBdHRlbnVhdG9ycyhhdHRlbnVhdG9ycywgdmFsdWUpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgYXR0ZW51YXRvcnNDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGV0ZWN0QXR0ZW51YXRvcnMgPSBwb2xpY3kgPT4ge1xuICBpZiAoIXBvbGljeSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoIWF0dGVudWF0b3JzQ2FjaGUuaGFzKHBvbGljeSkpIHtcbiAgICBjb25zdCBhdHRlbnVhdG9ycyA9IFtdO1xuICAgIGlmIChwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IpIHtcbiAgICAgIGF0dGVudWF0b3JzLnB1c2gocG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yKTtcbiAgICB9XG4gICAgY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLCBwb2xpY3kpO1xuICAgIGF0dGVudWF0b3JzQ2FjaGUuc2V0KHBvbGljeSwgYXR0ZW51YXRvcnMpO1xuICB9XG4gIHJldHVybiBhdHRlbnVhdG9yc0NhY2hlLmdldChwb2xpY3kpO1xufTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmRldGVjdEF0dGVudWF0b3JzKGRldGVjdEF0dGVudWF0b3JzKTtcbmNvbnN0IGdlbmVyYXRlQ2Fub25pY2FsTmFtZSA9ICh7IGlzRW50cnkgPSBmYWxzZSwgbmFtZSwgcGF0aCB9KSA9PiB7XG4gIGlmIChpc0VudHJ5KSB7XG4gICAgdGhyb3cgRXJyb3IoJ0VudHJ5IG1vZHVsZSBjYW5ub3QgYmUgaWRlbnRpZmllZCB3aXRoIGEgY2Fub25pY2FsTmFtZScpO1xuICB9XG4gIGlmIChuYW1lID09PSBBVFRFTlVBVE9SU19DT01QQVJUTUVOVCkge1xuICAgIHJldHVybiBBVFRFTlVBVE9SU19DT01QQVJUTUVOVDtcbiAgfVxuICByZXR1cm4gcGF0aC5qb2luKCc+Jyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSA9IChuYW1pbmdLaXQsIHBhY2thZ2VQb2xpY3kpID0+IHtcbiAgaWYgKG5hbWluZ0tpdC5pc0VudHJ5KSB7XG4gICAgLy9cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY2Fub25pY2FsTmFtZSA9IGdlbmVyYXRlQ2Fub25pY2FsTmFtZShuYW1pbmdLaXQpO1xuICByZXR1cm4gISFwb2xpY3lMb29rdXBIZWxwZXIocGFja2FnZVBvbGljeSwgJ3BhY2thZ2VzJywgY2Fub25pY2FsTmFtZSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3koZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSk7XG4gICAgICAgY29uc3QgZ2V0UG9saWN5Rm9yUGFja2FnZSA9IChuYW1pbmdLaXQsIHBvbGljeSkgPT4ge1xuICBpZiAoIXBvbGljeSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKG5hbWluZ0tpdC5pc0VudHJ5KSB7XG4gICAgcmV0dXJuIHBvbGljeS5lbnRyeTtcbiAgfVxuICBjb25zdCBjYW5vbmljYWxOYW1lID0gZ2VuZXJhdGVDYW5vbmljYWxOYW1lKG5hbWluZ0tpdCk7XG4gIGlmIChjYW5vbmljYWxOYW1lID09PSBBVFRFTlVBVE9SU19DT01QQVJUTUVOVCkge1xuICAgIHJldHVybiB7IGRlZmF1bHRBdHRlbnVhdG9yOiBwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IsIHBhY2thZ2VzOiAnYW55JyB9O1xuICB9XG4gIGlmIChwb2xpY3kucmVzb3VyY2VzICYmIHBvbGljeS5yZXNvdXJjZXNbY2Fub25pY2FsTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBwb2xpY3kucmVzb3VyY2VzW2Nhbm9uaWNhbE5hbWVdO1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgcmV0dXJuIGNyZWF0ZShudWxsKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5nZXRQb2xpY3lGb3JQYWNrYWdlKGdldFBvbGljeUZvclBhY2thZ2UpO1xuY29uc3QgZ2V0R2xvYmFsc0xpc3QgPSBwYWNrYWdlUG9saWN5ID0+IHtcbiAgaWYgKCFwYWNrYWdlUG9saWN5IHx8ICFwYWNrYWdlUG9saWN5Lmdsb2JhbHMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIGVudHJpZXMocGFja2FnZVBvbGljeS5nbG9iYWxzKVxuICAgIC5maWx0ZXIoKFtfa2V5LCB2YWx1ZV0pID0+IHZhbHVlKVxuICAgIC5tYXAoKFtrZXksIF92dmFsdWVdKSA9PiBrZXkpO1xufTtcblxuY29uc3QgR0xPQkFMX0FUVEVOVUFUT1IgPSAnYXR0ZW51YXRlR2xvYmFscyc7XG5jb25zdCBNT0RVTEVfQVRURU5VQVRPUiA9ICdhdHRlbnVhdGVNb2R1bGUnO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24gPSBhc3luYyAoXG4gIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgYXR0ZW51YXRvcnNQcm92aWRlcixcbiAgYXR0ZW51YXRvckV4cG9ydE5hbWUsXG4pID0+IHtcbiAgaWYgKCFhdHRlbnVhdG9yc1Byb3ZpZGVyKSB7XG4gICAgdGhyb3cgRXJyb3IoYGF0dGVudWF0b3JzUHJvdmlkZXIgaXMgcmVxdWlyZWQgdG8gaW1wb3J0IGF0dGVudWF0b3JzYCk7XG4gIH1cbiAgY29uc3QgeyBzcGVjaWZpZXIsIHBhcmFtcywgZGlzcGxheU5hbWUgfSA9IGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihcbiAgICBhdHRlbnVhdGlvbkRlZmluaXRpb24sXG4gICk7XG4gIGNvbnN0IGF0dGVudWF0b3IgPSBhd2FpdCBhdHRlbnVhdG9yc1Byb3ZpZGVyLmltcG9ydChzcGVjaWZpZXIpO1xuICBpZiAoIWF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgQXR0ZW51YXRvciAke3EoZGlzcGxheU5hbWUpfSBkb2VzIG5vdCBleHBvcnQgJHtxKGF0dGVudWF0b3JFeHBvcnROYW1lKX1gLFxuICAgICk7XG4gIH1cbiAgLy9cbiAgY29uc3QgYXR0ZW51YXRlID0gYXR0ZW51YXRvclthdHRlbnVhdG9yRXhwb3J0TmFtZV0uYmluZChhdHRlbnVhdG9yLCBwYXJhbXMpO1xuICByZXR1cm4gYXR0ZW51YXRlO1xufTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciA9IChcbiAgY29tcGFydG1lbnRzLFxuICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGltcG9ydEF0dGVudWF0b3I7XG4gIGxldCBkZWZhdWx0QXR0ZW51YXRvcjtcbiAgLy9cbiAgLy9cbiAgaWYgKCFjb21wYXJ0bWVudERlc2NyaXB0b3JzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXSkge1xuICAgIGltcG9ydEF0dGVudWF0b3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICB0aHJvdyBFcnJvcihgTm8gYXR0ZW51YXRvcnMgc3BlY2lmaWVkIGluIHBvbGljeWApO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgZGVmYXVsdEF0dGVudWF0b3IgPVxuICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yc1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0ucG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLypcblxuXG5cbiAgICAgKi9cbiAgICBpbXBvcnRBdHRlbnVhdG9yID0gYXN5bmMgYXR0ZW51YXRvclNwZWNpZmllciA9PiB7XG4gICAgICBpZiAoIWF0dGVudWF0b3JTcGVjaWZpZXIpIHtcbiAgICAgICAgaWYgKCFkZWZhdWx0QXR0ZW51YXRvcikge1xuICAgICAgICAgIHRocm93IEVycm9yKGBObyBkZWZhdWx0IGF0dGVudWF0b3Igc3BlY2lmaWVkIGluIHBvbGljeWApO1xuICAgICAgICB9XG4gICAgICAgIGF0dGVudWF0b3JTcGVjaWZpZXIgPSBkZWZhdWx0QXR0ZW51YXRvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgbmFtZXNwYWNlIH0gPSBhd2FpdCBjb21wYXJ0bWVudHNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdLmltcG9ydChcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICovIChhdHRlbnVhdG9yU3BlY2lmaWVyKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gbmFtZXNwYWNlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBpbXBvcnQ6IGltcG9ydEF0dGVudWF0b3IgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIpO1xuYXN5bmMgZnVuY3Rpb24gYXR0ZW51YXRlR2xvYmFsVGhpcyh7XG4gIGF0dGVudWF0b3JzLFxuICBhdHRlbnVhdGlvbkRlZmluaXRpb24sXG4gIGdsb2JhbFRoaXMsXG4gIGdsb2JhbHMsXG59KSB7XG4gIGNvbnN0IGF0dGVudWF0ZSA9IGF3YWl0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uKFxuICAgIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgICBhdHRlbnVhdG9ycyxcbiAgICBHTE9CQUxfQVRURU5VQVRPUixcbiAgKTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuXG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgLy9cblxuICBjb25zdCByZXN1bHQgPSAvKiAgICAgICAqLyBhdHRlbnVhdGUoZ2xvYmFscywgZ2xvYmFsVGhpcyk7XG4gIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQgIT09IG51bGwpIHtcbiAgICBhc3NpZ24oZ2xvYmFsVGhpcywgcmVzdWx0KTtcbiAgfVxufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXR0ZW51YXRlR2xvYmFscyA9IChcbiAgZ2xvYmFsVGhpcyxcbiAgZ2xvYmFscyxcbiAgcGFja2FnZVBvbGljeSxcbiAgYXR0ZW51YXRvcnMsXG4gIHBlbmRpbmdKb2JzLFxuICBuYW1lID0gJzx1bmtub3duPicsXG4pID0+IHtcbiAgbGV0IGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCA9ICgpID0+IHtcbiAgICBmcmVlemUoZ2xvYmFsVGhpcyk7XG4gIH07XG4gIGlmIChwYWNrYWdlUG9saWN5ICYmIHBhY2thZ2VQb2xpY3kubm9HbG9iYWxGcmVlemUpIHtcbiAgICBmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQgPSAoKSA9PiB7fTtcbiAgfVxuICBpZiAoIXBhY2thZ2VQb2xpY3kgfHwgaXNBbGxvd2luZ0V2ZXJ5dGhpbmcocGFja2FnZVBvbGljeS5nbG9iYWxzKSkge1xuICAgIHNlbGVjdGl2ZUNvcHkoZ2xvYmFscywgZ2xvYmFsVGhpcyk7XG4gICAgZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpc0F0dGVudWF0aW9uRGVmaW5pdGlvbihwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKSB7XG4gICAgY29uc3QgYXR0ZW51YXRpb25EZWZpbml0aW9uID0gcGFja2FnZVBvbGljeS5nbG9iYWxzO1xuICAgIGNvbnN0IHsgZGlzcGxheU5hbWUgfSA9IGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihhdHRlbnVhdGlvbkRlZmluaXRpb24pO1xuICAgIGNvbnN0IGF0dGVudWF0aW9uUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpIC8vXG4gICAgICAudGhlbigoKSA9PlxuICAgICAgICBhdHRlbnVhdGVHbG9iYWxUaGlzKHtcbiAgICAgICAgICBhdHRlbnVhdG9ycyxcbiAgICAgICAgICBhdHRlbnVhdGlvbkRlZmluaXRpb24sXG4gICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICBnbG9iYWxzLFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC50aGVuKGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCwgZXJyb3IgPT4ge1xuICAgICAgICBmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYEVycm9yIHdoaWxlIGF0dGVudWF0aW5nIGdsb2JhbHMgZm9yICR7cShuYW1lKX0gd2l0aCAke3EoXG4gICAgICAgICAgICBkaXNwbGF5TmFtZSxcbiAgICAgICAgICApfTogJHtxKGVycm9yLm1lc3NhZ2UpfWAgIC8vXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICBwZW5kaW5nSm9icy5wdXNoKGF0dGVudWF0aW9uUHJvbWlzZSk7XG5cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGlzdCA9IGdldEdsb2JhbHNMaXN0KHBhY2thZ2VQb2xpY3kpO1xuICBzZWxlY3RpdmVDb3B5KGdsb2JhbHMsIGdsb2JhbFRoaXMsIGxpc3QpO1xuICBmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbn07XG5cbi8qXG5cblxuICovJGjNj19vbmNlLmF0dGVudWF0ZUdsb2JhbHMoYXR0ZW51YXRlR2xvYmFscyk7XG5jb25zdCBkaWFnbm9zZU1vZHVsZVBvbGljeSA9IGVycm9ySGludCA9PiB7XG4gIGlmICghZXJyb3JIaW50KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHJldHVybiBgIChpbmZvOiAke2Vycm9ySGludH0pYDtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAoXG4gIHNwZWNpZmllcixcbiAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICB7IGV4aXQsIGVycm9ySGludCB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgeyBwb2xpY3ksIG1vZHVsZXMsIGxhYmVsIH0gPSBjb21wYXJ0bWVudERlc2NyaXB0b3I7XG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFleGl0KSB7XG4gICAgaWYgKCFtb2R1bGVzW3NwZWNpZmllcl0pIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgSW1wb3J0aW5nICR7cShzcGVjaWZpZXIpfSBpbiAke3EoXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICl9IHdhcyBub3QgYWxsb3dlZCBieSBwYWNrYWdlcyBwb2xpY3kgJHtxKFxuICAgICAgICAgIHBvbGljeS5wYWNrYWdlcyxcbiAgICAgICAgKX0ke2RpYWdub3NlTW9kdWxlUG9saWN5KGVycm9ySGludCl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghcG9saWN5TG9va3VwSGVscGVyKHBvbGljeSwgJ2J1aWx0aW5zJywgc3BlY2lmaWVyKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYEltcG9ydGluZyAke3Eoc3BlY2lmaWVyKX0gd2FzIG5vdCBhbGxvd2VkIGJ5IHBvbGljeSBidWlsdGluczoke3EoXG4gICAgICAgIHBvbGljeS5idWlsdGlucyxcbiAgICAgICl9JHtkaWFnbm9zZU1vZHVsZVBvbGljeShlcnJvckhpbnQpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5lbmZvcmNlTW9kdWxlUG9saWN5KGVuZm9yY2VNb2R1bGVQb2xpY3kpO1xuYXN5bmMgZnVuY3Rpb24gYXR0ZW51YXRlTW9kdWxlKHtcbiAgYXR0ZW51YXRvcnMsXG4gIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgb3JpZ2luYWxNb2R1bGVSZWNvcmQsXG59KSB7XG4gIGNvbnN0IGF0dGVudWF0ZSA9IGF3YWl0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uKFxuICAgIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgICBhdHRlbnVhdG9ycyxcbiAgICBNT0RVTEVfQVRURU5VQVRPUixcbiAgKTtcblxuICAvL1xuICAvL1xuXG4gIHJldHVybiBmcmVlemUoe1xuICAgIGltcG9ydHM6IG9yaWdpbmFsTW9kdWxlUmVjb3JkLmltcG9ydHMsXG4gICAgLy9cbiAgICAvL1xuICAgIGV4cG9ydHM6IG9yaWdpbmFsTW9kdWxlUmVjb3JkLmV4cG9ydHMsXG4gICAgZXhlY3V0ZTogKG1vZHVsZUV4cG9ydHMsIGNvbXBhcnRtZW50LCByZXNvbHZlZEltcG9ydHMpID0+IHtcbiAgICAgIGNvbnN0IG5zID0ge307XG4gICAgICBvcmlnaW5hbE1vZHVsZVJlY29yZC5leGVjdXRlKG5zLCBjb21wYXJ0bWVudCwgcmVzb2x2ZWRJbXBvcnRzKTtcbiAgICAgIGNvbnN0IGF0dGVudWF0ZWQgPSBhdHRlbnVhdGUobnMpO1xuICAgICAgbW9kdWxlRXhwb3J0cy5kZWZhdWx0ID0gYXR0ZW51YXRlZDtcbiAgICAgIGFzc2lnbihtb2R1bGVFeHBvcnRzLCBhdHRlbnVhdGVkKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXR0ZW51YXRlTW9kdWxlSG9vayA9IGFzeW5jIChcbiAgc3BlY2lmaWVyLFxuICBvcmlnaW5hbE1vZHVsZVJlY29yZCxcbiAgcG9saWN5LFxuICBhdHRlbnVhdG9ycyxcbikgPT4ge1xuICBjb25zdCBwb2xpY3lWYWx1ZSA9IHBvbGljeUxvb2t1cEhlbHBlcihwb2xpY3ksICdidWlsdGlucycsIHNwZWNpZmllcik7XG4gIGlmICghcG9saWN5IHx8IHBvbGljeVZhbHVlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIG9yaWdpbmFsTW9kdWxlUmVjb3JkO1xuICB9XG5cbiAgaWYgKCFwb2xpY3lWYWx1ZSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYEF0dGVudWF0aW9uIGZhaWxlZCAnJHtzcGVjaWZpZXJ9JyB3YXMgbm90IGluIHBvbGljeSBidWlsdGluczoke3EoXG4gICAgICAgIHBvbGljeS5idWlsdGlucyxcbiAgICAgICl9YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBhdHRlbnVhdGVNb2R1bGUoe1xuICAgIGF0dGVudWF0b3JzLFxuICAgIGF0dGVudWF0aW9uRGVmaW5pdGlvbjogcG9saWN5VmFsdWUsXG4gICAgb3JpZ2luYWxNb2R1bGVSZWNvcmQsXG4gIH0pO1xufTskaM2PX29uY2UuYXR0ZW51YXRlTW9kdWxlSG9vayhhdHRlbnVhdGVNb2R1bGVIb29rKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UIjpbIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UIl0sImRldGVjdEF0dGVudWF0b3JzIjpbImRldGVjdEF0dGVudWF0b3JzIl0sImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiOlsiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSJdLCJnZXRQb2xpY3lGb3JQYWNrYWdlIjpbImdldFBvbGljeUZvclBhY2thZ2UiXSwibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciI6WyJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIl0sImF0dGVudWF0ZUdsb2JhbHMiOlsiYXR0ZW51YXRlR2xvYmFscyJdLCJlbmZvcmNlTW9kdWxlUG9saWN5IjpbImVuZm9yY2VNb2R1bGVQb2xpY3kiXSwiYXR0ZW51YXRlTW9kdWxlSG9vayI6WyJhdHRlbnVhdGVNb2R1bGVIb29rIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHt1M4rgCAAA4AgAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wb3dlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImZpbmRJbnZhbGlkUmVhZE5vd1Bvd2Vyc1Byb3BzIiwiaXNSZWFkTm93UG93ZXJzIiwidW5wYWNrUmVhZFBvd2VycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCB7IGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY2Fub25pY2FsU2hpbSA9IGFzeW5jIHBhdGggPT4gcGF0aDtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCB1bnBhY2tSZWFkUG93ZXJzID0gcG93ZXJzID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCByZWFkO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgbWF5YmVSZWFkO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgY2Fub25pY2FsO1xuXG4gIGlmICh0eXBlb2YgcG93ZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVhZCA9IHBvd2VycztcbiAgfSBlbHNlIHtcbiAgICAoeyByZWFkLCBtYXliZVJlYWQsIGNhbm9uaWNhbCB9ID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICovIChwb3dlcnMpKTtcbiAgfVxuXG4gIGlmIChjYW5vbmljYWwgPT09IHVuZGVmaW5lZCkge1xuICAgIGNhbm9uaWNhbCA9IGNhbm9uaWNhbFNoaW07XG4gIH1cblxuICBpZiAobWF5YmVSZWFkID09PSB1bmRlZmluZWQpIHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBtYXliZVJlYWQgPSBwYXRoID0+XG4gICAgICAvKiAgICAgICAgICAgICAgICAgKi8gKHJlYWQpKHBhdGgpLmNhdGNoKF9lcnJvciA9PiB1bmRlZmluZWQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5wb3dlcnMsXG4gICAgcmVhZCxcbiAgICBtYXliZVJlYWQsXG4gICAgY2Fub25pY2FsLFxuICB9O1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS51bnBhY2tSZWFkUG93ZXJzKHVucGFja1JlYWRQb3dlcnMpO1xuY29uc3QgcmVxdWlyZWRSZWFkTm93UG93ZXJzUHJvcHMgPSBmcmVlemUoXG4gIC8qICAgICAgICAgICAgICAgICovIChbJ2ZpbGVVUkxUb1BhdGgnLCAnaXNBYnNvbHV0ZScsICdtYXliZVJlYWROb3cnXSksXG4pO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1JlYWROb3dQb3dlcnMgPSB2YWx1ZSA9PlxuICBCb29sZWFuKFxuICAgIHZhbHVlICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICByZXF1aXJlZFJlYWROb3dQb3dlcnNQcm9wcy5ldmVyeShcbiAgICAgICAgcHJvcCA9PiBwcm9wIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZVtwcm9wXSA9PT0gJ2Z1bmN0aW9uJyxcbiAgICAgICksXG4gICk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5pc1JlYWROb3dQb3dlcnMoaXNSZWFkTm93UG93ZXJzKTtcbiAgICAgICBjb25zdCBmaW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wcyA9IHZhbHVlID0+IHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gWy4uLnJlcXVpcmVkUmVhZE5vd1Bvd2Vyc1Byb3BzXTtcbiAgfVxuICByZXR1cm4gcmVxdWlyZWRSZWFkTm93UG93ZXJzUHJvcHMuZmlsdGVyKFxuICAgIHByb3AgPT4gIShwcm9wIGluIHZhbHVlKSB8fCB0eXBlb2YgdmFsdWVbcHJvcF0gIT09ICdmdW5jdGlvbicsXG4gICk7XG59OyRozY9fb25jZS5maW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wcyhmaW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ1bnBhY2tSZWFkUG93ZXJzIjpbInVucGFja1JlYWRQb3dlcnMiXSwiaXNSZWFkTm93UG93ZXJzIjpbImlzUmVhZE5vd1Bvd2VycyJdLCJmaW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wcyI6WyJmaW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAA1AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvdHlwZXMtZXh0ZXJuYWwuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANKKhqaIBAACiAQAAIgAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAXGNzxVBAAAFQQAAAsAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9zcmMvZW52LW9wdGlvbnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiLCJnZXRFbnZpcm9ubWVudE9wdGlvbiIsImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiLCJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG5cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG5cbi8vXG5jb25zdCBsb2NhbFRoaXMgPSBnbG9iYWxUaGlzO1xuXG5jb25zdCB7IE9iamVjdCwgUmVmbGVjdCwgQXJyYXksIFN0cmluZywgSlNPTiwgRXJyb3IgfSA9IGxvY2FsVGhpcztcbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vL1xuLy9cbmNvbnN0IHVuY3VycnlUaGlzID1cbiAgZm4gPT5cbiAgKHJlY2VpdmVyLCAuLi5hcmdzKSA9PlxuICAgIGFwcGx5KGZuLCByZWNlaXZlciwgYXJncyk7XG5jb25zdCBhcnJheVB1c2ggPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUucHVzaCk7XG5jb25zdCBhcnJheUluY2x1ZGVzID0gdW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKTtcbmNvbnN0IHN0cmluZ1NwbGl0ID0gdW5jdXJyeVRoaXMoU3RyaW5nLnByb3RvdHlwZS5zcGxpdCk7XG5cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuY29uc3QgRmFpbCA9IChsaXRlcmFscywgLi4uYXJncykgPT4ge1xuICBsZXQgbXNnID0gbGl0ZXJhbHNbMF07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIG1zZyA9IGAke21zZ30ke2FyZ3NbaV19JHtsaXRlcmFsc1tpICsgMV19YDtcbiAgfVxuICB0aHJvdyBFcnJvcihtc2cpO1xufTtcblxuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbnZpcm9ubWVudENhcHRvciA9IChhR2xvYmFsLCBkcm9wTmFtZXMgPSBmYWxzZSkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMgPSBbXTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uID0gKFxuICAgIG9wdGlvbk5hbWUsXG4gICAgZGVmYXVsdFNldHRpbmcsXG4gICAgb3B0T3RoZXJWYWx1ZXMgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgIHR5cGVvZiBvcHRpb25OYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZSAke3Eob3B0aW9uTmFtZSl9IG11c3QgYmUgYSBzdHJpbmcuYDtcbiAgICB0eXBlb2YgZGVmYXVsdFNldHRpbmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBkZWZhdWx0IHNldHRpbmcgJHtxKFxuICAgICAgICBkZWZhdWx0U2V0dGluZyxcbiAgICAgICl9IG11c3QgYmUgYSBzdHJpbmcuYDtcblxuICAgIC8qICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBzZXR0aW5nID0gZGVmYXVsdFNldHRpbmc7XG4gICAgY29uc3QgZ2xvYmFsUHJvY2VzcyA9IGFHbG9iYWwucHJvY2VzcyB8fCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZ2xvYmFsRW52ID1cbiAgICAgICh0eXBlb2YgZ2xvYmFsUHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgZ2xvYmFsUHJvY2Vzcy5lbnYpIHx8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGdsb2JhbEVudiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChvcHRpb25OYW1lIGluIGdsb2JhbEVudikge1xuICAgICAgICBpZiAoIWRyb3BOYW1lcykge1xuICAgICAgICAgIGFycmF5UHVzaChjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsIG9wdGlvbk5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gZ2xvYmFsRW52W29wdGlvbk5hbWVdO1xuICAgICAgICAvL1xuICAgICAgICB0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZWQgJHtxKFxuICAgICAgICAgICAgb3B0aW9uTmFtZSxcbiAgICAgICAgICApfSwgaWYgcHJlc2VudCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUsIGdvdCAke3EoXG4gICAgICAgICAgICBvcHRpb25WYWx1ZSxcbiAgICAgICAgICApfWA7XG4gICAgICAgIHNldHRpbmcgPSBvcHRpb25WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgb3B0T3RoZXJWYWx1ZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgc2V0dGluZyA9PT0gZGVmYXVsdFNldHRpbmcgfHxcbiAgICAgIGFycmF5SW5jbHVkZXMob3B0T3RoZXJWYWx1ZXMsIHNldHRpbmcpIHx8XG4gICAgICBGYWlsYFVucmVjb2duaXplZCAke3Eob3B0aW9uTmFtZSl9IHZhbHVlICR7cShcbiAgICAgICAgc2V0dGluZyxcbiAgICAgICl9LiBFeHBlY3RlZCBvbmUgb2YgJHtxKFtkZWZhdWx0U2V0dGluZywgLi4ub3B0T3RoZXJWYWx1ZXNdKX1gO1xuICAgIHJldHVybiBzZXR0aW5nO1xuICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0ID0gb3B0aW9uTmFtZSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJycpO1xuICAgIHJldHVybiBmcmVlemUob3B0aW9uID09PSAnJyA/IFtdIDogc3RyaW5nU3BsaXQob3B0aW9uLCAnLCcpKTtcbiAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpO1xuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAob3B0aW9uTmFtZSwgZWxlbWVudCkgPT5cbiAgICBhcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksIGVsZW1lbnQpO1xuXG4gIGNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9ICgpID0+IHtcbiAgICByZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiAgfTtcbiAgZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxuICAgIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHtcbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG59ID0gbWFrZUVudmlyb25tZW50Q2FwdG9yKGxvY2FsVGhpcywgdHJ1ZSk7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uKGdldEVudmlyb25tZW50T3B0aW9uKTskaM2PX29uY2UuZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdChnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTskaM2PX29uY2UuZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyhlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbnZpcm9ubWVudENhcHRvciI6WyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwiZ2V0RW52aXJvbm1lbnRPcHRpb24iOlsiZ2V0RW52aXJvbm1lbnRPcHRpb24iXSwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCI6WyJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0Il0sImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABJNfbpVAgAAFQIAAAdAAAAQGVuZG8vZXJyb3JzLXYxLjIuMTMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkZhaWwiLCJYIiwiYW5ub3RhdGVFcnJvciIsImFzc2VydCIsImIiLCJiYXJlIiwibWFrZUVycm9yIiwibm90ZSIsInEiLCJxdW90ZSIsInJlZGFjdGVkIiwidGhyb3dSZWRhY3RlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiAgICAgICAgICAgICAgICAgICAqL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuXG5jb25zdCBnbG9iYWxBc3NlcnQgPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuaWYgKGdsb2JhbEFzc2VydCA9PT0gdW5kZWZpbmVkKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BlbmRvL2Vycm9ycydgLFxuICApO1xufVxuXG5jb25zdCBtaXNzaW5nID0gLyogICAgICAgICAgICAgICAgKi8gKFtcbiAgJ3R5cGVvZicsXG4gICdlcnJvcicsXG4gICdmYWlsJyxcbiAgJ2VxdWFsJyxcbiAgJ3N0cmluZycsXG4gICdub3RlJyxcbiAgJ2RldGFpbHMnLFxuICAnRmFpbCcsXG4gICdxdW90ZScsXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gICdtYWtlQXNzZXJ0Jyxcbl0pLmZpbHRlcihuYW1lID0+IGdsb2JhbEFzc2VydFtuYW1lXSA9PT0gdW5kZWZpbmVkKTtcbmlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgdGhyb3cgRXJyb3IoXG4gICAgYENhbm5vdCBpbml0aWFsaXplIEBlbmRvL2Vycm9ycywgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCBtZXRob2RzICR7bWlzc2luZy5qb2luKFxuICAgICAgJywgJyxcbiAgICApfWAsXG4gICk7XG59XG5cbi8vXG4vL1xuLy9cbmNvbnN0IHtcbiAgYmFyZSxcbiAgZGV0YWlsczogcmVkYWN0ZWQsXG4gIGVycm9yOiBtYWtlRXJyb3IsXG4gIEZhaWw6IHRocm93UmVkYWN0ZWQsXG4gIG1ha2VBc3NlcnQ6IF9vbWl0dGVkTWFrZUFzc2VydCxcbiAgbm90ZSxcbiAgcXVvdGUsXG4gIC4uLmFzc2VydGlvbnNcbn0gPSBnbG9iYWxBc3NlcnQ7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8vXG4kaM2PX29uY2UucmVkYWN0ZWQocmVkYWN0ZWQpOyRozY9fb25jZS5tYWtlRXJyb3IobWFrZUVycm9yKTskaM2PX29uY2UudGhyb3dSZWRhY3RlZCh0aHJvd1JlZGFjdGVkKTskaM2PX29uY2Uubm90ZShub3RlKTskaM2PX29uY2UucXVvdGUocXVvdGUpO2NvbnN0IGFzc2VydD0odmFsdWUsb3B0RGV0YWlscyxlcnJDb250cnVjdG9yLG9wdGlvbnMpPT5cbiAgZ2xvYmFsQXNzZXJ0KHZhbHVlLCBvcHREZXRhaWxzLCBlcnJDb250cnVjdG9yLCBvcHRpb25zKTskaM2PX29uY2UuYXNzZXJ0KGFzc2VydCk7XG5PYmplY3QuYXNzaWduKGFzc2VydCwgYXNzZXJ0aW9ucyk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IGJhcmVPclF1b3RlID0gYmFyZSB8fCBxdW90ZTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5iYXJlT3JRdW90ZShiYXJlT3JRdW90ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWRhY3RlZCI6WyJyZWRhY3RlZCJdLCJYIjpbInJlZGFjdGVkIl0sIm1ha2VFcnJvciI6WyJtYWtlRXJyb3IiXSwidGhyb3dSZWRhY3RlZCI6WyJ0aHJvd1JlZGFjdGVkIl0sIkZhaWwiOlsidGhyb3dSZWRhY3RlZCJdLCJub3RlIjpbIm5vdGUiXSwiYW5ub3RhdGVFcnJvciI6WyJub3RlIl0sInF1b3RlIjpbInF1b3RlIl0sInEiOlsicXVvdGUiXSwiYXNzZXJ0IjpbImFzc2VydCJdLCJiYXJlIjpbImJhcmVPclF1b3RlIl0sImIiOlsiYmFyZU9yUXVvdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAybGDGRsWAAAbFgAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9FLmpzeyJpbXBvcnRzIjpbIi4vdHJhY2stdHVybnMuanMiLCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHJhY2tUdXJucyxtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsWyRozY9fYSA9PiAodHJhY2tUdXJucyA9ICRozY9fYSldXV1dLFtcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsWyRozY9fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsLCBlcnJvcjogbWFrZUVycm9yIH0gPSBhc3NlcnQ7XG5jb25zdCB7IGFzc2lnbiwgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qXG5cbiAqL1xuXG5jb25zdCBvblNlbmQgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fU0VORF9CUkVBS1BPSU5UUycpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlciA9IHtcbiAgc2V0KF90YXJnZXQsIF9wcm9wLCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGlzRXh0ZW5zaWJsZShfdGFyZ2V0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBzZXRQcm90b3R5cGVPZihfdGFyZ2V0LCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KF90YXJnZXQsIF9wcm9wKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxufTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRVByb3h5SGFuZGxlciA9IChyZWNpcGllbnQsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcGVydHlLZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKFxuICAgICAgICB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzICE9PSByZWNlaXZlcikge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UucmVqZWN0KFxuICAgICAgICAgICAgICAgIG1ha2VFcnJvcihcbiAgICAgICAgICAgICAgICAgIFhgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocHJvcGVydHlLZXkpfVwiIG1ldGhvZCBvZiBFKCR7cShcbiAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICAgICAgKX0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGRlYnVnZ2VyOyAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kKHJlY2lwaWVudCwgcHJvcGVydHlLZXksIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdBcnJheSA9IFtdKSA9PiB7XG4gICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvL1xuICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgIH1cbiAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHJlY2lwaWVudCwgYXJnQXJyYXkpO1xuICAgIH0sXG4gICAgaGFzOiAoX3RhcmdldCwgX3ApID0+IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUVTZW5kT25seVByb3h5SGFuZGxlciA9IChyZWNpcGllbnQsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcGVydHlLZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKFxuICAgICAgICB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIFtwcm9wZXJ0eUtleV0oLi4uYXJncykge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHRoaXMgPT09IHJlY2VpdmVyIHx8XG4gICAgICAgICAgICAgIEZhaWxgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EoXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgICAgICl9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKHJlY2lwaWVudCl9KWA7XG4gICAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGRlYnVnZ2VyOyAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2RTZW5kT25seShyZWNpcGllbnQsIHByb3BlcnR5S2V5LCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vXG4gICAgICAgIH1bcHJvcGVydHlLZXldLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIGFyZ3NBcnJheSA9IFtdKSA9PiB7XG4gICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvL1xuICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgIH1cbiAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seShyZWNpcGllbnQsIGFyZ3NBcnJheSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgaGFzOiAoX3RhcmdldCwgX3ApID0+IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUVHZXRQcm94eUhhbmRsZXIgPSAoeCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBoYXM6IChfdGFyZ2V0LCBfcHJvcCkgPT4gdHJ1ZSxcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiBIYW5kbGVkUHJvbWlzZS5nZXQoeCwgcHJvcCksXG4gIH0pO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGZ1bmNUYXJnZXQgPSBmcmVlemUoKCkgPT4ge30pO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3Qgb2JqVGFyZ2V0ID0gZnJlZXplKHsgX19wcm90b19fOiBudWxsIH0pO1xuXG4vKlxuXG4gKi9cbmNvbnN0IG1ha2VFID0gSGFuZGxlZFByb21pc2UgPT4ge1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGFzc2lnbihcbiAgICAgIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIC8vXG4gICAgICB4ID0+IG5ldyBQcm94eShmdW5jVGFyZ2V0LCBtYWtlRVByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuICAgICAge1xuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgLy9cbiAgICAgICAgZ2V0OiB4ID0+IG5ldyBQcm94eShvYmpUYXJnZXQsIG1ha2VFR2V0UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgcmVzb2x2ZTogSGFuZGxlZFByb21pc2UucmVzb2x2ZSxcblxuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICBzZW5kT25seTogeCA9PlxuICAgICAgICAgIC8vXG4gICAgICAgICAgbmV3IFByb3h5KGZ1bmNUYXJnZXQsIG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcblxuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICB3aGVuOiAoeCwgb25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpID0+XG4gICAgICAgICAgSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKFxuICAgICAgICAgICAgLi4udHJhY2tUdXJucyhbb25mdWxmaWxsZWQsIG9ucmVqZWN0ZWRdKSxcbiAgICAgICAgICApLFxuICAgICAgfSxcbiAgICApLFxuICApO1xufTtcblxuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0Om1ha2VFfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGRANevSDgAA0g4AACcAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbG9jYWwuanN7ImltcG9ydHMiOlsiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZ2V0TWV0aG9kTmFtZXMiLCJsb2NhbEFwcGx5RnVuY3Rpb24iLCJsb2NhbEFwcGx5TWV0aG9kIiwibG9jYWxHZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBnZXRQcm90b3R5cGVPZiwgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5LCBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG5jb25zdCBudHlwZW9mID0gc3BlY2ltZW4gPT4gKHNwZWNpbWVuID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHNwZWNpbWVuKTtcblxuY29uc3Qgb25EZWxpdmVyeSA9IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcignRU5ET19ERUxJVkVSWV9CUkVBS1BPSU5UUycpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgaXNQcmltaXRpdmUgPSB2YWwgPT5cbiAgIXZhbCB8fCAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJyk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQgPSAoYSwgYikgPT4ge1xuICBpZiAodHlwZW9mIGEgPT09IHR5cGVvZiBiKSB7XG4gICAgY29uc3QgbGVmdCA9IFN0cmluZyhhKTtcbiAgICBjb25zdCByaWdodCA9IFN0cmluZyhiKTtcbiAgICAvL1xuICAgIHJldHVybiBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPiByaWdodCA/IDEgOiAwO1xuICB9XG4gIGlmICh0eXBlb2YgYSA9PT0gJ3N5bWJvbCcpIHtcbiAgICBhc3NlcnQodHlwZW9mIGIgPT09ICdzdHJpbmcnKTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgYXNzZXJ0KHR5cGVvZiBhID09PSAnc3RyaW5nJyk7XG4gIGFzc2VydCh0eXBlb2YgYiA9PT0gJ3N5bWJvbCcpO1xuICByZXR1cm4gMTtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0TWV0aG9kTmFtZXMgPSB2YWwgPT4ge1xuICBsZXQgbGF5ZXIgPSB2YWw7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpOyAvL1xuICB3aGlsZSAobGF5ZXIgIT09IG51bGwgJiYgbGF5ZXIgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAvL1xuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG93bktleXMoZGVzY3MpKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmICh0eXBlb2YgdmFsW25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG5hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzUHJpbWl0aXZlKHZhbCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsYXllciA9IGdldFByb3RvdHlwZU9mKGxheWVyKTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFsuLi5uYW1lc10uc29ydChjb21wYXJlU3RyaW5naWZpZWQpKTtcbn07XG4vL1xuLy9cbiRozY9fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7ZnJlZXplKGdldE1ldGhvZE5hbWVzKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlGdW5jdGlvbiA9IChyZWNpcGllbnQsIGFyZ3MpID0+IHtcbiAgdHlwZW9mIHJlY2lwaWVudCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGBDYW5ub3QgaW52b2tlIHRhcmdldCBhcyBhIGZ1bmN0aW9uOyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAvL1xuICAgIGRlYnVnZ2VyOyAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gYXBwbHkocmVjaXBpZW50LCB1bmRlZmluZWQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseUZ1bmN0aW9uKGxvY2FsQXBwbHlGdW5jdGlvbik7XG5cbiAgICAgICBjb25zdCBsb2NhbEFwcGx5TWV0aG9kID0gKHJlY2lwaWVudCwgbWV0aG9kTmFtZSwgYXJncykgPT4ge1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAvL1xuICAgIHJldHVybiBsb2NhbEFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LCBhcmdzKTtcbiAgfVxuICBpZiAocmVjaXBpZW50ID09PSB1bmRlZmluZWQgfHwgcmVjaXBpZW50ID09PSBudWxsKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBkZWxpdmVyICR7cShtZXRob2ROYW1lKX0gdG8gdGFyZ2V0OyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZm4gPSByZWNpcGllbnRbbWV0aG9kTmFtZV07XG4gIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYHRhcmdldCBoYXMgbm8gbWV0aG9kICR7cShtZXRob2ROYW1lKX0sIGhhcyAke3EoXG4gICAgICAgIGdldE1ldGhvZE5hbWVzKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmdHlwZSA9IG50eXBlb2YoZm4pO1xuICB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgfHxcbiAgICBGYWlsYGludm9rZWQgbWV0aG9kICR7cShtZXRob2ROYW1lKX0gaXMgbm90IGEgZnVuY3Rpb247IGl0IGlzIGEgJHtxKFxuICAgICAgZnR5cGUsXG4gICAgKX1gO1xuICBpZiAob25EZWxpdmVyeSAmJiBvbkRlbGl2ZXJ5LnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBtZXRob2ROYW1lKSkge1xuICAgIC8vXG4gICAgZGVidWdnZXI7IC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShmbiwgcmVjaXBpZW50LCBhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmxvY2FsQXBwbHlNZXRob2QobG9jYWxBcHBseU1ldGhvZCk7XG5cbiAgICAgICBjb25zdCBsb2NhbEdldCA9ICh0LCBrZXkpID0+IHRba2V5XTskaM2PX29uY2UubG9jYWxHZXQobG9jYWxHZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwibG9jYWxBcHBseUZ1bmN0aW9uIjpbImxvY2FsQXBwbHlGdW5jdGlvbiJdLCJsb2NhbEFwcGx5TWV0aG9kIjpbImxvY2FsQXBwbHlNZXRob2QiXSwibG9jYWxHZXQiOlsibG9jYWxHZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAeTPsuDwPAAA8DwAANQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBoYXNPd24sIGZyZWV6ZSwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4vKlxuXG5cblxuXG5cbiAqL1xuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5jb25zdCBpc0pTT05SZWNvcmQgPSB2YWwgPT5cbiAgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHNpbXBsaWZ5VGFnID0gdGFnID0+IHtcbiAgZm9yIChjb25zdCBwcmVmaXggb2YgWydBbGxlZ2VkOiAnLCAnRGVidWdOYW1lOiAnXSkge1xuICAgIGlmICh0YWcuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICByZXR1cm4gdGFnLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFnO1xufTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSBvcHRpb25OYW1lID0+IHtcbiAgbGV0IGJyZWFrcG9pbnRzID0gSlNPTi5wYXJzZShnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCAnbnVsbCcpKTtcblxuICBpZiAoYnJlYWtwb2ludHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBicmVha3BvaW50c1RhYmxlO1xuXG4gIGNvbnN0IGdldEJyZWFrcG9pbnRzID0gKCkgPT4gYnJlYWtwb2ludHM7XG4gIGZyZWV6ZShnZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2V0QnJlYWtwb2ludHMgPSAobmV3QnJlYWtwb2ludHMgPSBicmVha3BvaW50cykgPT4ge1xuICAgIGlzSlNPTlJlY29yZChuZXdCcmVha3BvaW50cykgfHxcbiAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24gdG8gYmUgYSBKU09OIGJyZWFrcG9pbnRzIHJlY29yZGA7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAvL1xuICAgIGNvbnN0IG5ld0JyZWFrcG9pbnRzVGFibGUgPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuXG4gICAgZm9yIChjb25zdCBbdGFnLCBtZXRob2RCUHNdIG9mIGVudHJpZXMobmV3QnJlYWtwb2ludHMpKSB7XG4gICAgICB0YWcgPT09IHNpbXBsaWZ5VGFnKHRhZykgfHxcbiAgICAgICAgRmFpbGBKdXN0IHVzZSBzaW1wbGUgdGFnICR7cShzaW1wbGlmeVRhZyh0YWcpKX0gcmF0aGVyIHRoYW4gJHtxKHRhZyl9YDtcbiAgICAgIGlzSlNPTlJlY29yZChtZXRob2RCUHMpIHx8XG4gICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EoXG4gICAgICAgICAgdGFnLFxuICAgICAgICApfSB0byBiZSBhIEpTT04gbWV0aG9kcyBicmVha3BvaW50cyByZWNvcmRgO1xuICAgICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgY291bnRdIG9mIGVudHJpZXMobWV0aG9kQlBzKSkge1xuICAgICAgICBjb3VudCA9PT0gJyonIHx8XG4gICAgICAgICAgKHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50KSAmJlxuICAgICAgICAgICAgY291bnQgPj0gMCkgfHxcbiAgICAgICAgICBGYWlsYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKHRhZyl9LiR7cShcbiAgICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKX0gdG8gYmUgXCIqXCIgb3IgYSBub24tbmVnYXRpdmUgaW50ZWdlcmA7XG5cbiAgICAgICAgY29uc3QgY2xhc3NCUHMgPSBoYXNPd24obmV3QnJlYWtwb2ludHNUYWJsZSwgbWV0aG9kTmFtZSlcbiAgICAgICAgICA/IG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV1cbiAgICAgICAgICA6IChuZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdID0ge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50O1xuICAgICAgfVxuICAgIH1cbiAgICBicmVha3BvaW50cyA9IG5ld0JyZWFrcG9pbnRzO1xuICAgIGJyZWFrcG9pbnRzVGFibGUgPSBuZXdCcmVha3BvaW50c1RhYmxlO1xuICB9O1xuICBmcmVlemUoc2V0QnJlYWtwb2ludHMpO1xuXG4gIGNvbnN0IHNob3VsZEJyZWFrcG9pbnQgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lKSA9PiB7XG4gICAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fCBtZXRob2ROYW1lID09PSBudWxsKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc0JQcyA9IGJyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gfHwgYnJlYWtwb2ludHNUYWJsZVsnKiddO1xuICAgIGlmIChjbGFzc0JQcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCB0YWcgPSBzaW1wbGlmeVRhZyhyZWNpcGllbnRbU3ltYm9sLnRvU3RyaW5nVGFnXSk7XG4gICAgbGV0IGNvdW50ID0gY2xhc3NCUHNbdGFnXTtcbiAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFnID0gJyonO1xuICAgICAgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY291bnQgPT09ICcqJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFzc2VydCh0eXBlb2YgY291bnQgPT09ICdudW1iZXInICYmIGNvdW50ID49IDEpO1xuICAgIGNsYXNzQlBzW3RhZ10gPSBjb3VudCAtIDE7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBmcmVlemUoc2hvdWxkQnJlYWtwb2ludCk7XG5cbiAgY29uc3QgYnJlYWtwb2ludFRlc3RlciA9IGZyZWV6ZSh7XG4gICAgZ2V0QnJlYWtwb2ludHMsXG4gICAgc2V0QnJlYWtwb2ludHMsXG4gICAgc2hvdWxkQnJlYWtwb2ludCxcbiAgfSk7XG4gIGJyZWFrcG9pbnRUZXN0ZXIuc2V0QnJlYWtwb2ludHMoKTtcbiAgcmV0dXJuIGJyZWFrcG9pbnRUZXN0ZXI7XG59OyRozY9fb25jZS5tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbmZyZWV6ZShtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC4dpSdXwMAAF8DAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlRTskaM2PX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKG1ha2VFID0gJGjNj19hKV1dXV0sW1wiLi9leHBvcnRzLmpzXCIsIFtdXV0pO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgaHAgPSBIYW5kbGVkUHJvbWlzZTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaHAoaHApO1xuICAgICAgIGNvbnN0IEUgPSBtYWtlRShocCk7JGjNj19vbmNlLkUoRSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAyOwHRckKAADJCgAALQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbixlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV0sW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLFskaM2PX2EgPT4gKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuID0gMDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQgPSAwO1xuXG4vL1xuY29uc3QgVkVSQk9TRSA9IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywgJ3RyYWNrLXR1cm5zJyk7XG5cbi8vXG4vL1xuY29uc3QgRU5BQkxFRCA9XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgKGdldEVudmlyb25tZW50T3B0aW9uKCdUUkFDS19UVVJOUycsICdkaXNhYmxlZCcsIFsnZW5hYmxlZCddKSkgPT09ICdlbmFibGVkJztcblxuLy9cbi8vXG4vL1xuLy9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZSA9IGRldGFpbHNOb3RlID0+IHJlYXNvbiA9PiB7XG4gIGlmIChyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGdsb2JhbFRoaXMuYXNzZXJ0Lm5vdGUocmVhc29uLCBkZXRhaWxzTm90ZSk7XG4gIH1cbiAgaWYgKFZFUkJPU0UpIHtcbiAgICBjb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLCByZWFzb24pO1xuICB9XG59O1xuXG5jb25zdCB3cmFwRnVuY3Rpb24gPVxuICAoZnVuYywgc2VuZGluZ0Vycm9yLCBYKSA9PlxuICAoLi4uYXJncykgPT4ge1xuICAgIGhpZGRlblByaW9yRXJyb3IgPSBzZW5kaW5nRXJyb3I7XG4gICAgaGlkZGVuQ3VycmVudFR1cm4gKz0gMTtcbiAgICBoaWRkZW5DdXJyZW50RXZlbnQgPSAwO1xuICAgIHRyeSB7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZnVuYyguLi5hcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgWGBUaHJvd24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFZFUkJPU0UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgY29uc3QgZGV0YWlsc05vdGUgPSBYYFJlamVjdGlvbiBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWA7XG4gICAgICBQcm9taXNlLnJlc29sdmUocmVzdWx0KS5jYXRjaChhZGRSZWplY3Rpb25Ob3RlKGRldGFpbHNOb3RlKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBoaWRkZW5QcmlvckVycm9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdHJhY2tUdXJucyA9IGZ1bmNzID0+IHtcbiAgaWYgKCFFTkFCTEVEIHx8IHR5cGVvZiBnbG9iYWxUaGlzID09PSAndW5kZWZpbmVkJyB8fCAhZ2xvYmFsVGhpcy5hc3NlcnQpIHtcbiAgICByZXR1cm4gZnVuY3M7XG4gIH1cbiAgY29uc3QgeyBkZXRhaWxzOiBYLCBub3RlOiBhbm5vdGF0ZUVycm9yIH0gPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuICBoaWRkZW5DdXJyZW50RXZlbnQgKz0gMTtcbiAgY29uc3Qgc2VuZGluZ0Vycm9yID0gRXJyb3IoXG4gICAgYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gLFxuICApO1xuICBpZiAoaGlkZGVuUHJpb3JFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYW5ub3RhdGVFcnJvcihzZW5kaW5nRXJyb3IsIFhgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gIH1cblxuICByZXR1cm4gLyogICAgICAgICAgICAqLyAoXG4gICAgZnVuY3MubWFwKGZ1bmMgPT4gZnVuYyAmJiB3cmFwRnVuY3Rpb24oZnVuYywgc2VuZGluZ0Vycm9yLCBYKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS50cmFja1R1cm5zKHRyYWNrVHVybnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC91dGlscy5qc3siaW1wb3J0cyI6WyIuL3NyYy9sb2NhbC5qcyIsIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2xvY2FsLmpzXCIsIFtdXSxbXCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvbG9jYWwuanMiOltbImdldE1ldGhvZE5hbWVzIiwiZ2V0TWV0aG9kTmFtZXMiXV0sIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOltbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciIsIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1oEqgFkMAABZDAAANQAAAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNS4yL3NyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQsJ25hbWUnLHt2YWx1ZTpcIndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50XCJ9KTskaM2PX29uY2Uud3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQod3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQpOy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IGNvbXBhcnRtZW50T3B0aW9ucyA9ICguLi5hcmdzKSA9PiB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBpZiAoXG4gICAgYXJncy5sZW5ndGggPT09IDEgJiZcbiAgICB0eXBlb2YgYXJnc1swXSA9PT0gJ29iamVjdCcgJiZcbiAgICBhcmdzWzBdICE9PSBudWxsICYmXG4gICAgJ19fb3B0aW9uc19fJyBpbiBhcmdzWzBdXG4gICkge1xuICAgIGNvbnN0IHsgX19vcHRpb25zX18sIC4uLm9wdGlvbnMgfSA9IGFyZ3NbMF07XG4gICAgYXNzZXJ0KFxuICAgICAgX19vcHRpb25zX18gPT09IHRydWUsXG4gICAgICBgQ29tcGFydG1lbnQgY29uc3RydWN0b3Igb25seSBzdXBwb3J0cyB0cnVlIF9fb3B0aW9uc19fIHNpZ2lsLCBnb3QgJHtfX29wdGlvbnNfX31gLFxuICAgICk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW1xuICAgICAgZ2xvYmFscyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHt9KSxcbiAgICAgIG1vZHVsZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoe30pLFxuICAgICAgb3B0aW9ucyA9IHt9LFxuICAgIF0gPSBhcmdzO1xuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIG9wdGlvbnMubW9kdWxlcyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGBDb21wYXJ0bWVudCBjb25zdHJ1Y3RvciBtdXN0IHJlY2VpdmUgZWl0aGVyIGEgbW9kdWxlIG1hcCBhcmd1bWVudCBvciBtb2R1bGVzIG9wdGlvbiwgbm90IGJvdGhgLFxuICAgICk7XG4gICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgb3B0aW9ucy5nbG9iYWxzLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgYENvbXBhcnRtZW50IGNvbnN0cnVjdG9yIG11c3QgcmVjZWl2ZSBlaXRoZXIgZ2xvYmFscyBhcmd1bWVudCBvciBvcHRpb24sIG5vdCBib3RoYCxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZ2xvYmFscyxcbiAgICAgIG1vZHVsZXMsXG4gICAgfTtcbiAgfVxufTtcblxuICAgICAgIGZ1bmN0aW9uIHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KFxuICBPbGRDb21wYXJ0bWVudCxcbiAgaW5lc2NhcGFibGVUcmFuc2Zvcm1zLFxuICBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMsXG4pIHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgTmV3Q29tcGFydG1lbnQgPSBmdW5jdGlvbiBDb21wYXJ0bWVudCguLi5hcmdzKSB7XG4gICAgY29uc3QgeyB0cmFuc2Zvcm1zOiBvbGRUcmFuc2Zvcm1zID0gW10sIC4uLm90aGVyT3B0aW9ucyB9ID1cbiAgICAgIGNvbXBhcnRtZW50T3B0aW9ucyguLi5hcmdzKTtcbiAgICBjb25zdCBuZXdUcmFuc2Zvcm1zID0gWy4uLm9sZFRyYW5zZm9ybXMsIC4uLmluZXNjYXBhYmxlVHJhbnNmb3Jtc107XG4gICAgY29uc3QgbmV3T3B0aW9ucyA9IHtcbiAgICAgIC4uLm90aGVyT3B0aW9ucyxcbiAgICAgIHRyYW5zZm9ybXM6IG5ld1RyYW5zZm9ybXMsXG4gICAgICBfX29wdGlvbnNfXzogdHJ1ZSxcbiAgICB9O1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAobmV3LnRhcmdldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvL1xuICAgICAgdGhyb3cgRXJyb3IoJ0NvbXBhcnRtZW50IG11c3QgYmUgY2FsbGVkIGFzIGEgY29uc3RydWN0b3InKTtcbiAgICB9XG5cbiAgICAvL1xuXG4gICAgY29uc3QgYyA9IFJlZmxlY3QuY29uc3RydWN0KE9sZENvbXBhcnRtZW50LCBbbmV3T3B0aW9uc10sIG5ldy50YXJnZXQpO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudCA9IE5ld0NvbXBhcnRtZW50O1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIFJlZmxlY3Qub3duS2V5cyhpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYy5nbG9iYWxUaGlzLCBwcm9wLCB7XG4gICAgICAgIHZhbHVlOiBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXNbcHJvcF0sXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAvL1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGM7XG4gIH07XG5cbiAgLy9cbiAgTmV3Q29tcGFydG1lbnQucHJvdG90eXBlID0gT2xkQ29tcGFydG1lbnQucHJvdG90eXBlO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgcmV0dXJuIE5ld0NvbXBhcnRtZW50O1xufVxuXG4vL1xuLy9cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50IjpbIndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOfCo0/LFgAAyxYAACcAAABAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjUuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC1hcmNoaXZlLmpzIiwiQGVuZG8vYmFzZTY0IiwiQGVuZG8vZXJyb3JzIiwiLi9jb21wYXJ0bWVudC13cmFwcGVyLmpzIl0sImV4cG9ydHMiOlsiYnVuZGxlVGVzdEV4cG9ydHMiLCJpbXBvcnRCdW5kbGUiLCJ0eXBlZEltcG9ydEJ1bmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhcnNlQXJjaGl2ZSxkZWNvZGVCYXNlNjQsRmFpbCx3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qc1wiLCBbW1wicGFyc2VBcmNoaXZlXCIsWyRozY9fYSA9PiAocGFyc2VBcmNoaXZlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vYmFzZTY0XCIsIFtbXCJkZWNvZGVCYXNlNjRcIixbJGjNj19hID0+IChkZWNvZGVCYXNlNjQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jb21wYXJ0bWVudC13cmFwcGVyLmpzXCIsIFtbXCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwiLFskaM2PX2EgPT4gKHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50ID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaW1wb3J0QnVuZGxlLCduYW1lJyx7dmFsdWU6XCJpbXBvcnRCdW5kbGVcIn0pOyRozY9fb25jZS5pbXBvcnRCdW5kbGUoaW1wb3J0QnVuZGxlKTtcblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG5cbi8vXG4vL1xuICAgICAgIGFzeW5jIGZ1bmN0aW9uIGltcG9ydEJ1bmRsZShidW5kbGUsIG9wdGlvbnMgPSB7fSwgcG93ZXJzID0ge30pIHtcbiAgYXdhaXQgbnVsbDtcbiAgY29uc3Qge1xuICAgIGJ1bmRsZVVybCA9IHVuZGVmaW5lZCxcbiAgICBmaWxlUHJlZml4LFxuICAgIGVuZG93bWVudHM6IG9wdEVuZG93bWVudHMgPSB7fSxcbiAgICAvL1xuICAgIC8vXG4gICAgdHJhbnNmb3JtcyA9IFtdLFxuICAgIGluZXNjYXBhYmxlVHJhbnNmb3JtcyA9IFtdLFxuICAgIGluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcyA9IHt9LFxuICAgIGV4cGVjdGVkU2hhNTEyID0gdW5kZWZpbmVkLFxuICAgIGltcG9ydEhvb2sgPSB1bmRlZmluZWQsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCB7XG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBjb21wdXRlU291cmNlTG9jYXRpb24gPSB1bmRlZmluZWQsXG4gICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uID0gdW5kZWZpbmVkLFxuICB9ID0gcG93ZXJzO1xuICBjb25zdCBlbmRvd21lbnRzID0ge1xuICAgIFRleHRFbmNvZGVyLFxuICAgIFRleHREZWNvZGVyLFxuICAgIFVSTDogZ2xvYmFsVGhpcy5VUkwsIC8vXG4gICAgQmFzZTY0OiBnbG9iYWxUaGlzLkJhc2U2NCwgLy9cbiAgICBhdG9iOiBnbG9iYWxUaGlzLmF0b2IsXG4gICAgYnRvYTogZ2xvYmFsVGhpcy5idG9hLFxuICAgIC4uLm9wdEVuZG93bWVudHMsXG4gIH07XG5cbiAgbGV0IENvbXBhcnRtZW50VG9Vc2UgPSBDb21wYXJ0bWVudDtcbiAgaWYgKFxuICAgIGluZXNjYXBhYmxlVHJhbnNmb3Jtcy5sZW5ndGggfHxcbiAgICBPYmplY3Qua2V5cyhpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpLmxlbmd0aFxuICApIHtcbiAgICAvL1xuICAgIENvbXBhcnRtZW50VG9Vc2UgPSB3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudChcbiAgICAgIENvbXBhcnRtZW50LFxuICAgICAgaW5lc2NhcGFibGVUcmFuc2Zvcm1zLFxuICAgICAgaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzLFxuICAgICk7XG4gIH1cblxuICBsZXQgY29tcGFydG1lbnQ7XG5cbiAgYXNzZXJ0KCdtb2R1bGVGb3JtYXQnIGluIGJ1bmRsZSk7XG4gIGNvbnN0IHsgbW9kdWxlRm9ybWF0IH0gPSBidW5kbGU7XG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICdlbmRvWmlwQmFzZTY0Jykge1xuICAgIGFzc2VydCgnZW5kb1ppcEJhc2U2NCcgaW4gYnVuZGxlKTtcbiAgICBjb25zdCB7IGVuZG9aaXBCYXNlNjQgfSA9IGJ1bmRsZTtcbiAgICBjb25zdCBieXRlcyA9IGRlY29kZUJhc2U2NChlbmRvWmlwQmFzZTY0KTtcbiAgICBjb25zdCBhcmNoaXZlID0gYXdhaXQgcGFyc2VBcmNoaXZlKGJ5dGVzLCBidW5kbGVVcmwsIHtcbiAgICAgIGNvbXB1dGVTaGE1MTIsXG4gICAgICBleHBlY3RlZFNoYTUxMixcbiAgICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICAgIGltcG9ydEhvb2ssXG4gICAgfSk7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHsgbmFtZXNwYWNlIH0gPSBhd2FpdCBhcmNoaXZlWydpbXBvcnQnXSh7XG4gICAgICBnbG9iYWxzOiBlbmRvd21lbnRzLFxuICAgICAgX19zaGltVHJhbnNmb3Jtc19fOiB0cmFuc2Zvcm1zLFxuICAgICAgQ29tcGFydG1lbnQ6IENvbXBhcnRtZW50VG9Vc2UsXG4gICAgICBpbXBvcnRIb29rLFxuICAgIH0pO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICd0ZXN0Jykge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBidW5kbGVbU3ltYm9sLmZvcignZXhwb3J0cycpXTtcbiAgICBpZiAoZXhwb3J0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgaW1wb3J0IGJ1bmRsZSB3aXRoIG1vZHVsZUZvcm1hdCBcInRlc3RcIiB0aGF0IGxhY2tzIGFuIHN5bWJvbC1uYW1lZCBwcm9wZXJ0eSBAZXhwb3J0cyBhbmQgaGFzIGxpa2VseSBiZWVuIHBhcnRpYWxseSB0cmFuc3BvcnRlZCB2aWEgSlNPTiBvciBldmVudHVhbC1zZW5kJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIE9iamVjdC5zZWFsKFxuICAgICAgT2JqZWN0LmNyZWF0ZShcbiAgICAgICAgbnVsbCxcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFtcbiAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhleHBvcnRzKSlcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAuc29ydCgoW2FdLCBbYl0pID0+IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCkpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAoW25hbWUsIGRlc2NyaXB0b3JdKSA9PlxuICAgICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChbbmFtZV0pID0+IFtcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBleHBvcnRzW25hbWVdLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBTeW1ib2wudG9TdHJpbmdUYWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnTW9kdWxlJyxcbiAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnQoJ3NvdXJjZScgaW4gYnVuZGxlKTtcbiAgbGV0IHsgc291cmNlIH0gPSBidW5kbGU7XG4gIGNvbnN0IHNvdXJjZU1hcCA9ICdzb3VyY2VNYXAnIGluIGJ1bmRsZSA/IGJ1bmRsZS5zb3VyY2VNYXAgOiAnJztcbiAgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2dldEV4cG9ydCcpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgc291cmNlID0gYCgke3NvdXJjZX0pXFxuJHtzb3VyY2VNYXB9YDtcbiAgfSBlbHNlIGlmIChtb2R1bGVGb3JtYXQgPT09ICduZXN0ZWRFdmFsdWF0ZScpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGVuZG93bWVudHMubmVzdGVkRXZhbHVhdGUgPSBzcmMgPT4gY29tcGFydG1lbnQuZXZhbHVhdGUoc3JjKTtcbiAgICBzb3VyY2UgPSBgKCR7c291cmNlfSlcXG4ke3NvdXJjZU1hcH1gO1xuICB9IGVsc2UgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2VuZG9TY3JpcHQnKSB7XG4gICAgLy9cbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCBtb2R1bGVGb3JtYXQgJyR7bW9kdWxlRm9ybWF0fSdgO1xuICB9XG5cbiAgY29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnRUb1VzZShlbmRvd21lbnRzLCB7fSwgeyB0cmFuc2Zvcm1zIH0pO1xuICBoYXJkZW4oY29tcGFydG1lbnQuZ2xvYmFsVGhpcyk7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXBhcnRtZW50LmV2YWx1YXRlKHNvdXJjZSk7XG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICdlbmRvU2NyaXB0Jykge1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgY29uc3QgbmFtZXNwYWNlID0gcmVzdWx0KGZpbGVQcmVmaXgpO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdHlwZWRJbXBvcnRCdW5kbGUgPSBpbXBvcnRCdW5kbGU7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UudHlwZWRJbXBvcnRCdW5kbGUodHlwZWRJbXBvcnRCdW5kbGUpO1xuICAgICAgIGNvbnN0IGJ1bmRsZVRlc3RFeHBvcnRzID0gZXhwb3J0cyA9PiB7XG4gIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV4cG9ydHMpLmZpbHRlcihcbiAgICBuYW1lID0+IG5hbWUgIT09IFN5bWJvbC50b1N0cmluZ1RhZyxcbiAgKTtcbiAgc3ltYm9scy5sZW5ndGggPiAwICYmXG4gICAgRmFpbGBleHBvcnRzIG11c3Qgbm90IGhhdmUgc3ltYm9sLW5hbWVkIHByb3BlcnRpZXMsIGdvdDogJHtzeW1ib2xzLm1hcChTdHJpbmcpLmpvaW4oJywgJyl9YDtcbiAgcmV0dXJuIHtcbiAgICBtb2R1bGVGb3JtYXQ6ICd0ZXN0JyxcbiAgICBbU3ltYm9sLmZvcignZXhwb3J0cycpXTogZXhwb3J0cyxcbiAgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4qLyRozY9fb25jZS5idW5kbGVUZXN0RXhwb3J0cyhidW5kbGVUZXN0RXhwb3J0cyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbXBvcnRCdW5kbGUiOlsiaW1wb3J0QnVuZGxlIl0sInR5cGVkSW1wb3J0QnVuZGxlIjpbInR5cGVkSW1wb3J0QnVuZGxlIl0sImJ1bmRsZVRlc3RFeHBvcnRzIjpbImJ1bmRsZVRlc3RFeHBvcnRzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVGf9kHCAAABwgAAB0AAABAZW5kby9tYXJzaGFsLXYxLjguMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVCeUNvZGVQb2ludHMiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIiwicGFzc2FibGVBc0p1c3RpbiIsInBhc3NhYmxlQXNKdXN0aW4iLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXSxbInBhc3NhYmxlQXNKdXN0aW4iLCJwYXNzYWJsZUFzSnVzdGluIl0sWyJxcCIsInFwIl1dLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6W1sibWFrZVBhc3NhYmxlS2l0IiwibWFrZVBhc3NhYmxlS2l0Il0sWyJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiXSxbIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSJdLFsiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNFbmNvZGVkUmVtb3RhYmxlIl0sWyJ6ZXJvUGFkIiwiemVyb1BhZCJdLFsicmVjb3JkTmFtZXMiLCJyZWNvcmROYW1lcyJdLFsicmVjb3JkVmFsdWVzIiwicmVjb3JkVmFsdWVzIl1dLCIuL3NyYy9yYW5rT3JkZXIuanMiOltbImNvbXBhcmVOdW1lcmljcyIsImNvbXBhcmVOdW1lcmljcyJdLFsiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVCeUNvZGVQb2ludHMiXSxbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIl0sWyJjb21wYXJlUmFuayIsImNvbXBhcmVSYW5rIl0sWyJpc1JhbmtTb3J0ZWQiLCJpc1JhbmtTb3J0ZWQiXSxbInNvcnRCeVJhbmsiLCJzb3J0QnlSYW5rIl0sWyJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQW50aVJhbmsiXSxbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXSxbImdldFBhc3NTdHlsZUNvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiXSxbImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sWyJ1bmlvblJhbmtDb3ZlcnMiLCJ1bmlvblJhbmtDb3ZlcnMiXV0sIkBlbmRvL3Bhc3Mtc3R5bGUiOltbImRlZXBseUZ1bGZpbGxlZCIsImRlZXBseUZ1bGZpbGxlZCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/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/8VgBAABYAQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA/RdPfYgYAAGIGAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQsbWVtb1JhY2U7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLFskaM2PX2EgPT4gKG1lbW9SYWNlID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCduYW1lJyx7dmFsdWU6XCJtYWtlUHJvbWlzZUtpdFwifSk7JGjNj19vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCduYW1lJyx7dmFsdWU6XCJyYWNlUHJvbWlzZXNcIn0pOyRozY9fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTtcblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2UgPSBnbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlIHx8IFByb21pc2U7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlUHJvbWlzZUtpdCgpIHtcbiAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0gPSBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuICBjb25zdCBwcm9taXNlID0gbmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfSk7XG59XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiByYWNlUHJvbWlzZXModmFsdWVzKSB7XG4gIHJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLCB2YWx1ZXMpKTtcbn1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1iEF+ZAIAAGQCAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsJ25hbWUnLHt2YWx1ZTpcImlzUHJvbWlzZVwifSk7JGjNj19vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOy8qXG5cblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIGlzUHJvbWlzZShtYXliZVByb21pc2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpID09PSBtYXliZVByb21pc2U7XG59XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2pkZOaUJAAClCQAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBpc1ByaW1pdGl2ZSA9IHZhbCA9PlxuICAhdmFsIHx8ICh0eXBlb2YgdmFsICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsICE9PSAnZnVuY3Rpb24nKTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGtub3duUHJvbWlzZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFya1NldHRsZWQgPSByZWNvcmQgPT4ge1xuICBpZiAoIXJlY29yZCB8fCByZWNvcmQuc2V0dGxlZCkge1xuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cblxuICBjb25zdCB7IGRlZmVycmVkcyB9ID0gcmVjb3JkO1xuICBPYmplY3QuYXNzaWduKHJlY29yZCwge1xuICAgIGRlZmVycmVkczogdW5kZWZpbmVkLFxuICAgIHNldHRsZWQ6IHRydWUsXG4gIH0pO1xuICBPYmplY3QuZnJlZXplKHJlY29yZCk7XG4gIHJldHVybiBkZWZlcnJlZHM7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkID0gdmFsdWUgPT4ge1xuICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgc2V0dGxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIGxldCByZWNvcmQgPSBrbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZWNvcmQgPSB7IGRlZmVycmVkczogbmV3IFNldCgpLCBzZXR0bGVkOiBmYWxzZSB9O1xuICAgIGtub3duUHJvbWlzZXMuc2V0KHZhbHVlLCByZWNvcmQpO1xuICAgIC8vXG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuICAgICAgdmFsID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlc29sdmUgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlamVjdCB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCB7IHJhY2UgfSA9IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICByYWNlKHZhbHVlcykge1xuICAgIGxldCBkZWZlcnJlZDtcbiAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICAvL1xuICAgIGNvbnN0IGNhY2hlZFZhbHVlcyA9IFtdO1xuICAgIGNvbnN0IEMgPSB0aGlzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBDKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRlZmVycmVkID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgY29uc3QgeyBzZXR0bGVkLCBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoc2V0dGxlZCkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBDLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiByZXN1bHQuZmluYWxseSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcykge1xuICAgICAgICBjb25zdCB7IGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChkZWZlcnJlZHMpIHtcbiAgICAgICAgICBkZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTskaM2PX29uY2UucmFjZShyYWNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjBsiNR8GAAAfBgAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgaW50ZXJuYWxSZXNvbHZlO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbnRlcm5hbFJlamVjdDtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCByZXNvbHZlID0gdmFsdWUgPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlc29sdmUpIHtcbiAgICAgIGludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG4gICAgICBpbnRlcm5hbFJlc29sdmUgPSBudWxsO1xuICAgICAgaW50ZXJuYWxSZWplY3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlamVjdCA9IHJlYXNvbiA9PiB7XG4gICAgaWYgKGludGVybmFsUmVqZWN0KSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChyZWFzb24pO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVqZWN0ID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZXhlY3V0b3IgPSAocmVzLCByZWopID0+IHtcbiAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSB1bmRlZmluZWQgJiYgaW50ZXJuYWxSZWplY3QgPT09IHVuZGVmaW5lZCk7XG4gICAgaW50ZXJuYWxSZXNvbHZlID0gcmVzO1xuICAgIGludGVybmFsUmVqZWN0ID0gcmVqO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0pO1xufTskaM2PX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE6Fc2ufAQAAnwEAACAAAABAZW5kby90cmFtcG9saW5lLXYxLjAuNS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90cmFtcG9saW5lLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHJhbXBvbGluZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy90cmFtcG9saW5lLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM14fpGzBwAAswcAACkAAABAZW5kby90cmFtcG9saW5lLXYxLjAuNS9zcmMvdHJhbXBvbGluZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXN5bmNUcmFtcG9saW5lIiwiZ2VuZXJhdG9yUHJvdG90eXBlIiwic3luY1RyYW1wb2xpbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHN5bmNUcmFtcG9saW5lLCduYW1lJyx7dmFsdWU6XCJzeW5jVHJhbXBvbGluZVwifSk7JGjNj19vbmNlLnN5bmNUcmFtcG9saW5lKHN5bmNUcmFtcG9saW5lKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYXN5bmNUcmFtcG9saW5lLCduYW1lJyx7dmFsdWU6XCJhc3luY1RyYW1wb2xpbmVcIn0pOyRozY9fb25jZS5hc3luY1RyYW1wb2xpbmUoYXN5bmNUcmFtcG9saW5lKTsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKlxuXG4gKi9cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YgfSA9IE9iamVjdDtcbmNvbnN0IHsgYmluZCB9ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuY29uc3QgdW5jdXJyeVRoaXMgPSBiaW5kLmJpbmQoYmluZC5jYWxsKTsgLy9cbiAgICAgICBjb25zdCB7IHByb3RvdHlwZTogZ2VuZXJhdG9yUHJvdG90eXBlIH0gPSBnZXRQcm90b3R5cGVPZihcbiAgLy9cbiAgZnVuY3Rpb24qICgpIHt9LFxuKTskaM2PX29uY2UuZ2VuZXJhdG9yUHJvdG90eXBlKGdlbmVyYXRvclByb3RvdHlwZSk7XG5jb25zdCBnZW5lcmF0b3JOZXh0ID0gdW5jdXJyeVRoaXMoZ2VuZXJhdG9yUHJvdG90eXBlLm5leHQpO1xuY29uc3QgZ2VuZXJhdG9yVGhyb3cgPSB1bmN1cnJ5VGhpcyhnZW5lcmF0b3JQcm90b3R5cGUudGhyb3cpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBzeW5jVHJhbXBvbGluZShnZW5lcmF0b3JGbiwgLi4uYXJncykge1xuICBjb25zdCBpdGVyYXRvciA9IGdlbmVyYXRvckZuKC4uLmFyZ3MpO1xuICBsZXQgcmVzdWx0ID0gZ2VuZXJhdG9yTmV4dChpdGVyYXRvcik7XG4gIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yTmV4dChpdGVyYXRvciwgcmVzdWx0LnZhbHVlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJlc3VsdCA9IGdlbmVyYXRvclRocm93KGl0ZXJhdG9yLCBlcnIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0LnZhbHVlO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY1RyYW1wb2xpbmUoZ2VuZXJhdG9yRm4sIC4uLmFyZ3MpIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBnZW5lcmF0b3JGbiguLi5hcmdzKTtcbiAgbGV0IHJlc3VsdCA9IGdlbmVyYXRvck5leHQoaXRlcmF0b3IpO1xuICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vXG4gICAgICBjb25zdCB2YWwgPSBhd2FpdCByZXN1bHQudmFsdWU7XG4gICAgICByZXN1bHQgPSBnZW5lcmF0b3JOZXh0KGl0ZXJhdG9yLCB2YWwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yVGhyb3coaXRlcmF0b3IsIGVycik7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQudmFsdWU7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZW5lcmF0b3JQcm90b3R5cGUiOlsiZ2VuZXJhdG9yUHJvdG90eXBlIl0sInN5bmNUcmFtcG9saW5lIjpbInN5bmNUcmFtcG9saW5lIl0sImFzeW5jVHJhbXBvbGluZSI6WyJhc3luY1RyYW1wb2xpbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvP8BQ5oCAACaAgAAGgAAAEBlbmRvL3ppcC12MS4wLjExL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiLi9zcmMvcmVhZGVyLmpzIiwiLi9zcmMvd3JpdGVyLmpzIl0sImV4cG9ydHMiOlsicmVhZFppcCIsInJlYWRaaXAiLCJ3cml0ZVppcCIsIndyaXRlWmlwIl0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvcmVhZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy93cml0ZXIuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9yZWFkZXIuanMiOltbIlppcFJlYWRlciIsIlppcFJlYWRlciJdLFsicmVhZFppcCIsInJlYWRaaXAiXV0sIi4vc3JjL3dyaXRlci5qcyI6W1siWmlwV3JpdGVyIiwiWmlwV3JpdGVyIl0sWyJ3cml0ZVppcCIsIndyaXRlWmlwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1VqLpwRQAAMEUAAAmAAAAQGVuZG8vemlwLXYxLjAuMTEvc3JjL2J1ZmZlci1yZWFkZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJ1ZmZlclJlYWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHByaXZhdGVGaWVsZHMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwcml2YXRlRmllbGRzR2V0ID0gcHJpdmF0ZUZpZWxkcy5nZXQuYmluZChwcml2YXRlRmllbGRzKTtcblxuICAgICAgIGNsYXNzIEJ1ZmZlclJlYWRlciB7XG4gIC8qXG5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICBjb25zdCBkYXRhID0gbmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlcik7XG4gICAgcHJpdmF0ZUZpZWxkcy5zZXQodGhpcywge1xuICAgICAgYnl0ZXMsXG4gICAgICBkYXRhLFxuICAgICAgbGVuZ3RoOiBieXRlcy5sZW5ndGgsXG4gICAgICBpbmRleDogMCxcbiAgICAgIG9mZnNldDogMCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHByaXZhdGVGaWVsZHNHZXQodGhpcykubGVuZ3RoO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgZ2V0IGluZGV4KCkge1xuICAgIHJldHVybiBwcml2YXRlRmllbGRzR2V0KHRoaXMpLmluZGV4O1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgc2V0IGluZGV4KGluZGV4KSB7XG4gICAgdGhpcy5zZWVrKGluZGV4KTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNldCBvZmZzZXQob2Zmc2V0KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBpZiAob2Zmc2V0ID4gZmllbGRzLmRhdGEuYnl0ZUxlbmd0aCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCBzZXQgb2Zmc2V0IGJleW9uZCBsZW5ndGggb2YgdW5kZXJseWluZyBkYXRhJyk7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2Fubm90IHNldCBuZWdhdGl2ZSBvZmZzZXQnKTtcbiAgICB9XG4gICAgZmllbGRzLm9mZnNldCA9IG9mZnNldDtcbiAgICBmaWVsZHMubGVuZ3RoID0gZmllbGRzLmRhdGEuYnl0ZUxlbmd0aCAtIGZpZWxkcy5vZmZzZXQ7XG4gIH1cblxuICAvKlxuXG5cblxuICAgKi9cbiAgY2FuU2VlayhpbmRleCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgcmV0dXJuIGluZGV4ID49IDAgJiYgZmllbGRzLm9mZnNldCArIGluZGV4IDw9IGZpZWxkcy5sZW5ndGg7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIGFzc2VydENhblNlZWsoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIGlmICghdGhpcy5jYW5TZWVrKGluZGV4KSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBFbmQgb2YgZGF0YSByZWFjaGVkIChkYXRhIGxlbmd0aCA9ICR7ZmllbGRzLmxlbmd0aH0sIGFza2VkIGluZGV4ICR7aW5kZXh9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBzZWVrKGluZGV4KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBjb25zdCByZXN0b3JlID0gZmllbGRzLmluZGV4O1xuICAgIHRoaXMuYXNzZXJ0Q2FuU2VlayhpbmRleCk7XG4gICAgZmllbGRzLmluZGV4ID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3RvcmU7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHBlZWsoc2l6ZSkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgLy9cbiAgICBzaXplID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZmllbGRzLmxlbmd0aCAtIGZpZWxkcy5pbmRleCwgc2l6ZSkpO1xuICAgIGlmIChzaXplID09PSAwKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoXG4gICAgICBmaWVsZHMub2Zmc2V0ICsgZmllbGRzLmluZGV4LFxuICAgICAgZmllbGRzLm9mZnNldCArIGZpZWxkcy5pbmRleCArIHNpemUsXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgY2FuUmVhZChvZmZzZXQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHJldHVybiB0aGlzLmNhblNlZWsoZmllbGRzLmluZGV4ICsgb2Zmc2V0KTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGFzc2VydENhblJlYWQob2Zmc2V0KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICB0aGlzLmFzc2VydENhblNlZWsoZmllbGRzLmluZGV4ICsgb2Zmc2V0KTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIHJlYWQoc2l6ZSkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5hc3NlcnRDYW5SZWFkKHNpemUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGVlayhzaXplKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gc2l6ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgcmVhZFVpbnQ4KCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5hc3NlcnRDYW5SZWFkKDEpO1xuICAgIGNvbnN0IGluZGV4ID0gZmllbGRzLm9mZnNldCArIGZpZWxkcy5pbmRleDtcbiAgICBjb25zdCB2YWx1ZSA9IGZpZWxkcy5kYXRhLmdldFVpbnQ4KGluZGV4KTtcbiAgICBmaWVsZHMuaW5kZXggKz0gMTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHJlYWRVaW50MTYobGl0dGxlRW5kaWFuKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICB0aGlzLmFzc2VydENhblJlYWQoMik7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMub2Zmc2V0ICsgZmllbGRzLmluZGV4O1xuICAgIGNvbnN0IHZhbHVlID0gZmllbGRzLmRhdGEuZ2V0VWludDE2KGluZGV4LCBsaXR0bGVFbmRpYW4pO1xuICAgIGZpZWxkcy5pbmRleCArPSAyO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgcmVhZFVpbnQzMihsaXR0bGVFbmRpYW4pIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHRoaXMuYXNzZXJ0Q2FuUmVhZCg0KTtcbiAgICBjb25zdCBpbmRleCA9IGZpZWxkcy5vZmZzZXQgKyBmaWVsZHMuaW5kZXg7XG4gICAgY29uc3QgdmFsdWUgPSBmaWVsZHMuZGF0YS5nZXRVaW50MzIoaW5kZXgsIGxpdHRsZUVuZGlhbik7XG4gICAgZmllbGRzLmluZGV4ICs9IDQ7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBieXRlQXQoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHJldHVybiBmaWVsZHMuYnl0ZXNbZmllbGRzLm9mZnNldCArIGluZGV4XTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNraXAob2Zmc2V0KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICB0aGlzLnNlZWsoZmllbGRzLmluZGV4ICsgb2Zmc2V0KTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgZXhwZWN0KGV4cGVjdGVkKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBpZiAoIXRoaXMubWF0Y2hBdChmaWVsZHMuaW5kZXgsIGV4cGVjdGVkKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmaWVsZHMuaW5kZXggKz0gZXhwZWN0ZWQubGVuZ3RoO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIG1hdGNoQXQoaW5kZXgsIGV4cGVjdGVkKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBpZiAoaW5kZXggKyBleHBlY3RlZC5sZW5ndGggPiBmaWVsZHMubGVuZ3RoIHx8IGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAoZXhwZWN0ZWRbaV0gIT09IHRoaXMuYnl0ZUF0KGluZGV4ICsgaSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGFzc2VydChleHBlY3RlZCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKCF0aGlzLmV4cGVjdChleHBlY3RlZCkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkKX0gYXQgJHtmaWVsZHMuaW5kZXh9LCBnb3QgJHt0aGlzLnBlZWsoXG4gICAgICAgICAgZXhwZWN0ZWQubGVuZ3RoLFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgZmluZExhc3QoZXhwZWN0ZWQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIGxldCBpbmRleCA9IGZpZWxkcy5sZW5ndGggLSBleHBlY3RlZC5sZW5ndGg7XG4gICAgd2hpbGUgKGluZGV4ID49IDAgJiYgIXRoaXMubWF0Y2hBdChpbmRleCwgZXhwZWN0ZWQpKSB7XG4gICAgICBpbmRleCAtPSAxO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbn0kaM2PX29uY2UuICAgQnVmZmVyUmVhZGVyKEJ1ZmZlclJlYWRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJSZWFkZXIiOlsiQnVmZmVyUmVhZGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPWypri+DwAAvg8AACYAAABAZW5kby96aXAtdjEuMC4xMS9zcmMvYnVmZmVyLXdyaXRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyV3JpdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByaXZhdGVGaWVsZHMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGdldFByaXZhdGVGaWVsZHMgPSBzZWxmID0+IHtcbiAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkcy5nZXQoc2VsZik7XG4gIGlmICghZmllbGRzKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0J1ZmZlcldyaXRlciBmaWVsZHMgYXJlIG5vdCBpbml0aWFsaXplZCcpO1xuICB9XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG5jb25zdCBhc3NlcnROYXROdW1iZXIgPSBuID0+IHtcbiAgaWYgKE51bWJlci5pc1NhZmVJbnRlZ2VyKG4pICYmIC8qICAgICAgICAgICAgICAgICAqLyAobikgPj0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aHJvdyBUeXBlRXJyb3IoYG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290ICR7bn1gKTtcbn07XG5cbiAgICAgICBjbGFzcyBCdWZmZXJXcml0ZXIge1xuICAvKlxuXG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiBnZXRQcml2YXRlRmllbGRzKHRoaXMpLmxlbmd0aDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5pbmRleDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNldCBpbmRleChpbmRleCkge1xuICAgIHRoaXMuc2VlayhpbmRleCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDE2KSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIHByaXZhdGVGaWVsZHMuc2V0KHRoaXMsIHtcbiAgICAgIGJ5dGVzLFxuICAgICAgZGF0YSxcbiAgICAgIGluZGV4OiAwLFxuICAgICAgbGVuZ3RoOiAwLFxuICAgICAgY2FwYWNpdHksXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBlbnN1cmVDYW5TZWVrKHJlcXVpcmVkKSB7XG4gICAgYXNzZXJ0TmF0TnVtYmVyKHJlcXVpcmVkKTtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIGxldCBjYXBhY2l0eSA9IGZpZWxkcy5jYXBhY2l0eTtcbiAgICB3aGlsZSAoY2FwYWNpdHkgPCByZXF1aXJlZCkge1xuICAgICAgY2FwYWNpdHkgKj0gMjtcbiAgICB9XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIGJ5dGVzLnNldChmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCwgZmllbGRzLmxlbmd0aCkpO1xuICAgIGZpZWxkcy5ieXRlcyA9IGJ5dGVzO1xuICAgIGZpZWxkcy5kYXRhID0gZGF0YTtcbiAgICBmaWVsZHMuY2FwYWNpdHkgPSBjYXBhY2l0eTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNlZWsoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuU2VlayhpbmRleCk7XG4gICAgZmllbGRzLmluZGV4ID0gaW5kZXg7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBlbnN1cmVDYW5Xcml0ZShzaXplKSB7XG4gICAgYXNzZXJ0TmF0TnVtYmVyKHNpemUpO1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgdGhpcy5lbnN1cmVDYW5TZWVrKGZpZWxkcy5pbmRleCArIHNpemUpO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgd3JpdGUoYnl0ZXMpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoYnl0ZXMuYnl0ZUxlbmd0aCk7XG4gICAgZmllbGRzLmJ5dGVzLnNldChieXRlcywgZmllbGRzLmluZGV4KTtcbiAgICBmaWVsZHMuaW5kZXggKz0gYnl0ZXMuYnl0ZUxlbmd0aDtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgd3JpdGVDb3B5KHN0YXJ0LCBlbmQpIHtcbiAgICBhc3NlcnROYXROdW1iZXIoc3RhcnQpO1xuICAgIGFzc2VydE5hdE51bWJlcihlbmQpO1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgY29uc3Qgc2l6ZSA9IGVuZCAtIHN0YXJ0O1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoc2l6ZSk7XG4gICAgZmllbGRzLmJ5dGVzLmNvcHlXaXRoaW4oZmllbGRzLmluZGV4LCBzdGFydCwgZW5kKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gc2l6ZTtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHdyaXRlVWludDgodmFsdWUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoMSk7XG4gICAgZmllbGRzLmRhdGEuc2V0VWludDgoZmllbGRzLmluZGV4LCB2YWx1ZSk7XG4gICAgZmllbGRzLmluZGV4ICs9IDE7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHdyaXRlVWludDE2KHZhbHVlLCBsaXR0bGVFbmRpYW4pIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoMik7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMuaW5kZXg7XG4gICAgZmllbGRzLmRhdGEuc2V0VWludDE2KGluZGV4LCB2YWx1ZSwgbGl0dGxlRW5kaWFuKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gMjtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgd3JpdGVVaW50MzIodmFsdWUsIGxpdHRsZUVuZGlhbikge1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgdGhpcy5lbnN1cmVDYW5Xcml0ZSg0KTtcbiAgICBjb25zdCBpbmRleCA9IGZpZWxkcy5pbmRleDtcbiAgICBmaWVsZHMuZGF0YS5zZXRVaW50MzIoaW5kZXgsIHZhbHVlLCBsaXR0bGVFbmRpYW4pO1xuICAgIGZpZWxkcy5pbmRleCArPSA0O1xuICAgIGZpZWxkcy5sZW5ndGggPSBNYXRoLm1heChmaWVsZHMuaW5kZXgsIGZpZWxkcy5sZW5ndGgpO1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIHN1YmFycmF5KGJlZ2luLCBlbmQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHJldHVybiBmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCwgZmllbGRzLmxlbmd0aCkuc3ViYXJyYXkoYmVnaW4sIGVuZCk7XG4gIH1cblxuICAvKlxuXG5cblxuICAgKi9cbiAgc2xpY2UoYmVnaW4sIGVuZCkge1xuICAgIHJldHVybiB0aGlzLnN1YmFycmF5KGJlZ2luLCBlbmQpLnNsaWNlKCk7XG4gIH1cbn0kaM2PX29uY2UuICAgQnVmZmVyV3JpdGVyKEJ1ZmZlcldyaXRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJXcml0ZXIiOlsiQnVmZmVyV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANGQ2vyoAQAAqAEAACQAAABAZW5kby96aXAtdjEuMC4xMS9zcmMvY29tcHJlc3Npb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlNUT1JFIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG5cbi8vXG4gICAgICAgY29uc3QgU1RPUkUgPSAwOyRozY9fb25jZS5TVE9SRShTVE9SRSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTVE9SRSI6WyJTVE9SRSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABe5tGBOAQAADgEAAAeAAAAQGVuZG8vemlwLXYxLjAuMTEvc3JjL2NyYzMyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJjcmMzMiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JjMzIsJ25hbWUnLHt2YWx1ZTpcImNyYzMyXCJ9KTskaM2PX29uY2UuY3JjMzIoY3JjMzIpOy8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuICovXG5cbi8vXG4vKlxuXG4gKi9cbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgbGV0IGM7XG4gIGNvbnN0IHRhYmxlID0gW107XG5cbiAgZm9yIChsZXQgbiA9IDA7IG4gPCAyNTY7IG4gKz0gMSkge1xuICAgIGMgPSBuO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgODsgayArPSAxKSB7XG4gICAgICBjID0gYyAmIDEgPyAweGVkYjg4MzIwIF4gKGMgPj4+IDEpIDogYyA+Pj4gMTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vL1xuY29uc3QgdGFibGUgPSBtYWtlVGFibGUoKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gY3JjMzIoYnl0ZXMsIGxlbmd0aCA9IGJ5dGVzLmxlbmd0aCwgaW5kZXggPSAwLCBjcmMgPSAwKSB7XG4gIGNvbnN0IGVuZCA9IGluZGV4ICsgbGVuZ3RoO1xuXG4gIGNyYyBePSAtMTtcblxuICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPCBlbmQ7IGkgKz0gMSkge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdGFibGVbKGNyYyBeIGJ5dGVzW2ldKSAmIDB4ZmZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAtMSkgPj4+IDA7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjcmMzMiI6WyJjcmMzMiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACZqmSrnioAAJ4qAAAmAAAAQGVuZG8vemlwLXYxLjAuMTEvc3JjL2Zvcm1hdC1yZWFkZXIuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyIsIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRozY9faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIixbJGjNj19hID0+IChjcmMzMiA9ICRozY9fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsWyRozY9fYSA9PiAoc2lnbmF0dXJlID0gJGjNj19hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKGNvbXByZXNzaW9uID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmVhZFppcCwnbmFtZScse3ZhbHVlOlwicmVhZFppcFwifSk7JGjNj19vbmNlLnJlYWRaaXAocmVhZFppcCk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IE1BWF9WQUxVRV8xNkJJVFMgPSA2NTUzNTtcbmNvbnN0IE1BWF9WQUxVRV8zMkJJVFMgPSA0Mjk0OTY3Mjk1O1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gaXNFbmNyeXB0ZWQoYml0RmxhZykge1xuICByZXR1cm4gKGJpdEZsYWcgJiAweDAwMDEpID09PSAweDAwMDE7XG59XG5cbi8qXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZERvc0RhdGVUaW1lKHJlYWRlcikge1xuICBjb25zdCBkb3NUaW1lID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG4gIHJldHVybiBuZXcgRGF0ZShcbiAgICBEYXRlLlVUQyhcbiAgICAgICgoZG9zVGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODAsIC8vXG4gICAgICAoKGRvc1RpbWUgPj4gMjEpICYgMHgwZikgLSAxLCAvL1xuICAgICAgKGRvc1RpbWUgPj4gMTYpICYgMHgxZiwgLy9cbiAgICAgIChkb3NUaW1lID4+IDExKSAmIDB4MWYsIC8vXG4gICAgICAoZG9zVGltZSA+PiA1KSAmIDB4M2YsIC8vXG4gICAgICAoZG9zVGltZSAmIDB4MWYpIDw8IDEgIC8vXG4gICAgKSxcbiAgKTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRIZWFkZXJzKHJlYWRlcikge1xuICByZXR1cm4ge1xuICAgIHZlcnNpb25OZWVkZWQ6IHJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuICAgIGJpdEZsYWc6IHJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiByZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbiAgICBkYXRlOiByZWFkRG9zRGF0ZVRpbWUocmVhZGVyKSxcbiAgICBjcmMzMjogcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG4gICAgY29tcHJlc3NlZExlbmd0aDogcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG4gICAgdW5jb21wcmVzc2VkTGVuZ3RoOiByZWFkZXIucmVhZFVpbnQzMih0cnVlKSxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRDZW50cmFsRmlsZUhlYWRlcihyZWFkZXIpIHtcbiAgY29uc3QgdmVyc2lvbiA9IHJlYWRlci5yZWFkVWludDgoKTtcbiAgY29uc3QgbWFkZUJ5ID0gcmVhZGVyLnJlYWRVaW50OCgpO1xuICBjb25zdCBoZWFkZXJzID0gcmVhZEhlYWRlcnMocmVhZGVyKTtcbiAgY29uc3QgbmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBleHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjb21tZW50TGVuZ3RoID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGRpc2tOdW1iZXJTdGFydCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbiAgY29uc3QgZmlsZVN0YXJ0ID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5cbiAgY29uc3QgbmFtZSA9IHJlYWRlci5yZWFkKG5hbWVMZW5ndGgpO1xuICAvL1xuICByZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5cbiAgaWYgKGhlYWRlcnMudW5jb21wcmVzc2VkTGVuZ3RoID09PSBNQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gIH1cbiAgaWYgKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCA9PT0gTUFYX1ZBTFVFXzMyQklUUykge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG4gIGlmIChmaWxlU3RhcnQgPT09IE1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICB0aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiAgfVxuICBpZiAoZGlza051bWJlclN0YXJ0ID09PSBNQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gIH1cblxuICBjb25zdCBjb21tZW50ID0gcmVhZGVyLnJlYWQoY29tbWVudExlbmd0aCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHZlcnNpb24sXG4gICAgbWFkZUJ5LFxuICAgIC4uLmhlYWRlcnMsXG4gICAgZGlza051bWJlclN0YXJ0LFxuICAgIGludGVybmFsRmlsZUF0dHJpYnV0ZXMsXG4gICAgZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyxcbiAgICBmaWxlU3RhcnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLCBsb2NhdG9yKSB7XG4gIGNvbnN0IHsgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgY2VudHJhbERpcmVjdG9yeVJlY29yZHMgfSA9IGxvY2F0b3I7XG4gIHJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQpO1xuXG4gIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgd2hpbGUgKHJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpKSB7XG4gICAgY29uc3QgZW50cnkgPSByZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKTtcbiAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgaWYgKGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzICE9PSBlbnRyaWVzLmxlbmd0aCkge1xuICAgIC8vXG4gICAgLy9cbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgJHtjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc30gcmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290ICR7ZW50cmllcy5sZW5ndGh9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiByZWFkRmlsZShyZWFkZXIpIHtcbiAgcmVhZGVyLmV4cGVjdChzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuICBjb25zdCBoZWFkZXJzID0gcmVhZEhlYWRlcnMocmVhZGVyKTtcbiAgY29uc3QgbmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBleHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBuYW1lID0gcmVhZGVyLnJlYWQobmFtZUxlbmd0aCk7XG4gIHJlYWRlci5za2lwKGV4dHJhRmllbGRzTGVuZ3RoKTtcbiAgY29uc3QgY29udGVudCA9IHJlYWRlci5yZWFkKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCk7XG4gIHJldHVybiB7IG5hbWUsIC4uLmhlYWRlcnMsIGNvbnRlbnQgfTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZExvY2FsRmlsZXMocmVhZGVyLCByZWNvcmRzKSB7XG4gIGNvbnN0IGZpbGVzID0gW107XG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICByZWFkZXIuc2VlayhyZWNvcmQuZmlsZVN0YXJ0KTtcbiAgICBjb25zdCBmaWxlID0gcmVhZEZpbGUocmVhZGVyKTtcbiAgICBmaWxlcy5wdXNoKGZpbGUpO1xuICB9XG4gIHJldHVybiBmaWxlcztcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpIHtcbiAgaWYgKCFyZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICAnQ29ycnVwdCB6aXAgZmlsZSwgb3IgemlwIGZpbGUgY29udGFpbmluZyBhbiB1bnN1cHBvcnRlZCB2YXJpYWJsZS13aWR0aCBlbmQtb2YtYXJjaGl2ZSBjb21tZW50LCBvciBhbiB1bnN1cHBvcnRlZCB6aXAgZmlsZSB3aXRoIDY0IGJpdCBzaXplcycsXG4gICAgKTtcbiAgfVxuICBjb25zdCBkaXNrTnVtYmVyID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5UmVjb3JkcyA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5U2l6ZSA9IHJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5T2Zmc2V0ID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG4gIGNvbnN0IGNvbW1lbnRMZW5ndGggPSByZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgY29tbWVudCA9IHRleHREZWNvZGVyLmRlY29kZShyZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKSk7XG4gIHJldHVybiB7XG4gICAgZGlza051bWJlcixcbiAgICBkaXNrV2l0aENlbnRyYWxEaXJTdGFydCxcbiAgICBjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2ssXG4gICAgY2VudHJhbERpcmVjdG9yeVJlY29yZHMsXG4gICAgY2VudHJhbERpcmVjdG9yeVNpemUsXG4gICAgY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbiAgICBjb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpIHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgY2VudHJhbERpcmVjdG9yeUVuZCA9IHJlYWRlci5sZW5ndGggLSAyMjtcbiAgaWYgKGNlbnRyYWxEaXJlY3RvcnlFbmQgPCAwKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0NvcnJ1cHRlZCB6aXA6IG5vdCBlbm91Z2ggY29udGVudCcpO1xuICB9XG4gIHJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlFbmQpO1xuICBjb25zdCBsb2NhdG9yID0gcmVhZEJsb2NrRW5kT2ZDZW50cmFsKHJlYWRlcik7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgemlwNjQgPVxuICAgIGxvY2F0b3IuZGlza051bWJlciA9PT0gTUFYX1ZBTFVFXzE2QklUUyB8fFxuICAgIGxvY2F0b3IuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayA9PT0gTUFYX1ZBTFVFXzE2QklUUyB8fFxuICAgIGxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVJlY29yZHMgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlTaXplID09PSBNQVhfVkFMVUVfMzJCSVRTIHx8XG4gICAgbG9jYXRvci5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0ID09PSBNQVhfVkFMVUVfMzJCSVRTO1xuXG4gIGlmICh6aXA2NCkge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsXG4gICAgY2VudHJhbERpcmVjdG9yeVNpemVcbiAgICAvL1xuICB9ID0gbG9jYXRvcjtcblxuICBjb25zdCBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQgPVxuICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgKyBjZW50cmFsRGlyZWN0b3J5U2l6ZTtcbiAgY29uc3QgZXh0cmFCeXRlcyA9IGNlbnRyYWxEaXJlY3RvcnlFbmQgLSBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQ7XG5cbiAgcmVhZGVyLm9mZnNldCA9IGV4dHJhQnl0ZXM7XG5cbiAgcmV0dXJuIGxvY2F0b3I7XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUmVjb3JkcyhjZW50cmFsUmVjb3JkLCBsb2NhbFJlY29yZCwgYXJjaGl2ZU5hbWUpIHtcbiAgY29uc3QgY2VudHJhbE5hbWUgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoY2VudHJhbFJlY29yZC5uYW1lKTtcbiAgY29uc3QgbG9jYWxOYW1lID0gdGV4dERlY29kZXIuZGVjb2RlKGxvY2FsUmVjb3JkLm5hbWUpO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjZW50cmFsTmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJykgIT09IGxvY2FsTmFtZSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYFppcCBpbnRlZ3JpdHkgZXJyb3I6IGNlbnRyYWwgcmVjb3JkIGZpbGUgbmFtZSAke3EoXG4gICAgICAgIGNlbnRyYWxOYW1lLFxuICAgICAgKX0gbXVzdCBtYXRjaCBsb2NhbCBmaWxlIG5hbWUgJHtxKGxvY2FsTmFtZSl9IGluIGFyY2hpdmUgJHtxKFxuICAgICAgICBhcmNoaXZlTmFtZSxcbiAgICAgICl9YCxcbiAgICApO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBmdW5jdGlvbiBjaGVjayh2YWx1ZSwgbWVzc2FnZSkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgWmlwIGludGVncml0eSBlcnJvcjogJHttZXNzYWdlfSBmb3IgZmlsZSAke3EoXG4gICAgICAgICAgbG9jYWxOYW1lLFxuICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTmFtZSl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5iaXRGbGFnID09PSBsb2NhbFJlY29yZC5iaXRGbGFnLFxuICAgIGBDZW50cmFsIHJlY29yZCBiaXQgZmxhZyAke2NlbnRyYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZyhcbiAgICAgIDE2LFxuICAgICl9IG11c3QgbWF0Y2ggbG9jYWwgcmVjb3JkIGJpdCBmbGFnICR7bG9jYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZygxNil9YCxcbiAgKTtcbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCA9PT0gbG9jYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QsXG4gICAgYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG4gICAgICBjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgICl9IG11c3QgbWF0Y2ggbG9jYWwgY29tcHJlc3Npb24gbWV0aG9kICR7cShsb2NhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCl9YCxcbiAgKTtcbiAgLy9cbiAgLy9cbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5jcmMzMiA9PT0gbG9jYWxSZWNvcmQuY3JjMzIsXG4gICAgYENlbnRyYWwgcmVjb3JkIENSQy0zMiBjaGVja3N1bSAke2NlbnRyYWxSZWNvcmQuY3JjMzJ9IG11c3QgbWF0Y2ggbG9jYWwgY2hlY2tzdW0gJHtsb2NhbFJlY29yZC5jcmMzMn1gLFxuICApO1xuICBjaGVjayhcbiAgICBjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGggPT09IGxvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGgsXG4gICAgYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzZWQgc2l6ZSAke2NlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGh9YCxcbiAgKTtcbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGggPT09IGxvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aCxcbiAgICBgQ2VudHJhbCByZWNvcmQgdW5jb21wcmVzc2VkIHNpemUgJHtjZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH1gLFxuICApO1xuXG4gIGNvbnN0IGNoZWNrc3VtID0gY3JjMzIobG9jYWxSZWNvcmQuY29udGVudCk7XG4gIGNoZWNrKFxuICAgIGNoZWNrc3VtID09PSBsb2NhbFJlY29yZC5jcmMzMixcbiAgICBgQ1JDLTMyIGNoZWNrc3VtIG1pc21hdGNoLCB3YW50ZWQgJHtsb2NhbFJlY29yZC5jcmMzMn0gYnV0IGFjdHVhbCBjb250ZW50IGlzICR7Y2hlY2tzdW19YCxcbiAgKTtcbn1cblxuLypcblxuICovXG5mdW5jdGlvbiBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpIHtcbiAgcmV0dXJuIChleHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4ZmZmZjtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkVG9GaWxlKGNlbnRyYWxSZWNvcmQsIGxvY2FsUmVjb3JkKSB7XG4gIGNvbnN0IG1vZGUgPSBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGNlbnRyYWxSZWNvcmQuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY2VudHJhbFJlY29yZC5uYW1lLFxuICAgIG1vZGUsXG4gICAgZGF0ZTogY2VudHJhbFJlY29yZC5kYXRlLFxuICAgIGNyYzMyOiBjZW50cmFsUmVjb3JkLmNyYzMyLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiBjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgIGNvbXByZXNzZWRMZW5ndGg6IGNlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aCxcbiAgICB1bmNvbXByZXNzZWRMZW5ndGg6IGNlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIGNvbnRlbnQ6IGxvY2FsUmVjb3JkLmNvbnRlbnQsXG4gICAgY29tbWVudDogY2VudHJhbFJlY29yZC5jb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gZGVjb21wcmVzc0ZpbGUoZmlsZSkge1xuICBpZiAoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCAhPT0gY29tcHJlc3Npb24uU1RPUkUpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3QgZmluZCBkZWNvbXByZXNzb3IgZm9yIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG4gICAgICAgIGZpbGUuY29tcHJlc3Npb25NZXRob2QsXG4gICAgICApfSBmb3IgZmlsZSAke2ZpbGUubmFtZX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgbW9kZTogZmlsZS5tb2RlLFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudDogZmlsZS5jb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlRmlsZShmaWxlKSB7XG4gIGNvbnN0IG5hbWUgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5uYW1lKTtcbiAgY29uc3QgY29tbWVudCA9IHRleHREZWNvZGVyLmRlY29kZShmaWxlLmNvbW1lbnQpO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogJ2ZpbGUnLFxuICAgIG1vZGU6IGZpbGUubW9kZSAmIDBvNzc3LFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiByZWFkWmlwKHJlYWRlciwgbmFtZSA9ICc8dW5rbm93bj4nKSB7XG4gIGNvbnN0IGxvY2F0b3IgPSByZWFkRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHJlYWRlcik7XG4gIGNvbnN0IGNlbnRyYWxSZWNvcmRzID0gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLCBsb2NhdG9yKTtcbiAgY29uc3QgbG9jYWxSZWNvcmRzID0gcmVhZExvY2FsRmlsZXMocmVhZGVyLCBjZW50cmFsUmVjb3Jkcyk7XG4gIGNvbnN0IGZpbGVzID0gbmV3IE1hcCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2VudHJhbFJlY29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBjZW50cmFsUmVjb3JkID0gY2VudHJhbFJlY29yZHNbaV07XG4gICAgY29uc3QgbG9jYWxSZWNvcmQgPSBsb2NhbFJlY29yZHNbaV07XG5cbiAgICBjaGVja1JlY29yZHMoY2VudHJhbFJlY29yZCwgbG9jYWxSZWNvcmQsIG5hbWUpO1xuXG4gICAgaWYgKGlzRW5jcnlwdGVkKGNlbnRyYWxSZWNvcmQuYml0RmxhZykpIHtcbiAgICAgIHRocm93IEVycm9yKCdFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNEaXIgPSAoY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgwMDEwKSAhPT0gMDtcbiAgICBpZiAoIWlzRGlyKSB7XG4gICAgICBjb25zdCBjb21wcmVzc2VkRmlsZSA9IHJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLCBsb2NhbFJlY29yZCk7XG4gICAgICBjb25zdCBkZWNvbXByZXNzZWRGaWxlID0gZGVjb21wcmVzc0ZpbGUoY29tcHJlc3NlZEZpbGUpO1xuICAgICAgY29uc3QgZGVjb2RlZEZpbGUgPSBkZWNvZGVGaWxlKGRlY29tcHJlc3NlZEZpbGUpO1xuICAgICAgZmlsZXMuc2V0KGRlY29kZWRGaWxlLm5hbWUsIGRlY29kZWRGaWxlKTtcbiAgICB9XG4gICAgLy9cbiAgfVxuICByZXR1cm4gZmlsZXM7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiv8HosEWAADBFgAAJgAAAEBlbmRvL3ppcC12MS4wLjExL3NyYy9mb3JtYXQtd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJ3cml0ZVppcCIsIndyaXRlWmlwUmVjb3JkcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGNyYzMyLHNpZ25hdHVyZSxjb21wcmVzc2lvbjskaM2PX2ltcG9ydHMoW1tcIi4vY3JjMzIuanNcIiwgW1tcImNyYzMyXCIsWyRozY9fYSA9PiAoY3JjMzIgPSAkaM2PX2EpXV1dXSxbXCIuL3NpZ25hdHVyZS5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKHNpZ25hdHVyZSA9ICRozY9fYSldXV1dLFtcIi4vY29tcHJlc3Npb24uanNcIiwgW1tcIipcIixbJGjNj19hID0+IChjb21wcmVzc2lvbiA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwUmVjb3JkcywnbmFtZScse3ZhbHVlOlwid3JpdGVaaXBSZWNvcmRzXCJ9KTskaM2PX29uY2Uud3JpdGVaaXBSZWNvcmRzKHdyaXRlWmlwUmVjb3Jkcyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwLCduYW1lJyx7dmFsdWU6XCJ3cml0ZVppcFwifSk7JGjNj19vbmNlLndyaXRlWmlwKHdyaXRlWmlwKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IFVOSVggPSAzO1xuY29uc3QgVU5JWF9WRVJTSU9OID0gMzA7XG5cbmNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5cbi8qXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gd3JpdGVEb3NEYXRlVGltZSh3cml0ZXIsIGRhdGUpIHtcbiAgY29uc3QgZG9zVGltZSA9XG4gICAgZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGRhdGUgIT09IG51bGxcbiAgICAgID8gKCgoZGF0ZS5nZXRVVENGdWxsWWVhcigpIC0gMTk4MCkgJiAweDdmKSA8PCAyNSkgfCAvL1xuICAgICAgICAoKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpIDw8IDIxKSB8IC8vXG4gICAgICAgIChkYXRlLmdldFVUQ0RhdGUoKSA8PCAxNikgfCAvL1xuICAgICAgICAoZGF0ZS5nZXRVVENIb3VycygpIDw8IDExKSB8IC8vXG4gICAgICAgIChkYXRlLmdldFVUQ01pbnV0ZXMoKSA8PCA1KSB8IC8vXG4gICAgICAgIChkYXRlLmdldFVUQ1NlY29uZHMoKSA+PiAxKSAvL1xuICAgICAgOiAwOyAvL1xuICB3cml0ZXIud3JpdGVVaW50MzIoZG9zVGltZSwgdHJ1ZSk7XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIHdyaXRlRmlsZSh3cml0ZXIsIGZpbGUpIHtcbiAgLy9cbiAgY29uc3QgZmlsZVN0YXJ0ID0gd3JpdGVyLmluZGV4O1xuICB3cml0ZXIud3JpdGUoc2lnbmF0dXJlLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbiAgY29uc3QgaGVhZGVyU3RhcnQgPSB3cml0ZXIuaW5kZXg7XG4gIC8vXG4gIHdyaXRlci53cml0ZVVpbnQxNigxMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLmJpdEZsYWcsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCwgdHJ1ZSk7XG4gIHdyaXRlRG9zRGF0ZVRpbWUod3JpdGVyLCBmaWxlLmRhdGUpO1xuICB3cml0ZXIud3JpdGVVaW50MzIoZmlsZS5jcmMzMiwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLmNvbXByZXNzZWRMZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MzIoZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5uYW1lLmxlbmd0aCwgdHJ1ZSk7XG4gIGNvbnN0IGhlYWRlckVuZCA9IHdyaXRlci5sZW5ndGg7XG5cbiAgLy9cbiAgd3JpdGVyLndyaXRlVWludDE2KDAsIHRydWUpO1xuICB3cml0ZXIud3JpdGUoZmlsZS5uYW1lKTtcbiAgLy9cbiAgd3JpdGVyLndyaXRlKGZpbGUuY29udGVudCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmaWxlU3RhcnQsXG4gICAgaGVhZGVyU3RhcnQsXG4gICAgaGVhZGVyRW5kLFxuICB9O1xufVxuXG4vKlxuXG5cblxuICovXG5mdW5jdGlvbiB3cml0ZUNlbnRyYWxGaWxlSGVhZGVyKHdyaXRlciwgZmlsZSwgbG9jYXRvcikge1xuICB3cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpO1xuICB3cml0ZXIud3JpdGVVaW50OChmaWxlLnZlcnNpb24pO1xuICB3cml0ZXIud3JpdGVVaW50OChmaWxlLm1hZGVCeSk7XG4gIHdyaXRlci53cml0ZUNvcHkobG9jYXRvci5oZWFkZXJTdGFydCwgbG9jYXRvci5oZWFkZXJFbmQpO1xuICAvL1xuICB3cml0ZXIud3JpdGVVaW50MTYoMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLmNvbW1lbnQubGVuZ3RoLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuZGlza051bWJlclN0YXJ0LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuaW50ZXJuYWxGaWxlQXR0cmlidXRlcywgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MzIobG9jYXRvci5maWxlU3RhcnQsIHRydWUpO1xuICB3cml0ZXIud3JpdGUoZmlsZS5jZW50cmFsTmFtZSk7XG4gIC8vXG4gIHdyaXRlci53cml0ZShmaWxlLmNvbW1lbnQpO1xufVxuXG4vKlxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gd3JpdGVFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoXG4gIHdyaXRlcixcbiAgZW50cmllc0NvdW50LFxuICBjZW50cmFsRGlyZWN0b3J5U3RhcnQsXG4gIGNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsXG4gIGNvbW1lbnRCeXRlcyxcbikge1xuICB3cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gIHdyaXRlci53cml0ZVVpbnQxNigwLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KDAsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZW50cmllc0NvdW50LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGVudHJpZXNDb3VudCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihjZW50cmFsRGlyZWN0b3J5TGVuZ3RoLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGNlbnRyYWxEaXJlY3RvcnlTdGFydCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihjb21tZW50Qnl0ZXMubGVuZ3RoLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlKGNvbW1lbnRCeXRlcyk7XG59XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiB3cml0ZVppcFJlY29yZHMod3JpdGVyLCByZWNvcmRzLCBjb21tZW50ID0gJycpIHtcbiAgLy9cbiAgY29uc3QgbG9jYXRvcnMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbG9jYXRvcnMucHVzaCh3cml0ZUZpbGUod3JpdGVyLCByZWNvcmRzW2ldKSk7XG4gIH1cblxuICAvL1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5U3RhcnQgPSB3cml0ZXIuaW5kZXg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYXRvcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB3cml0ZUNlbnRyYWxGaWxlSGVhZGVyKHdyaXRlciwgcmVjb3Jkc1tpXSwgbG9jYXRvcnNbaV0pO1xuICB9XG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlMZW5ndGggPSB3cml0ZXIuaW5kZXggLSBjZW50cmFsRGlyZWN0b3J5U3RhcnQ7XG5cbiAgY29uc3QgY29tbWVudEJ5dGVzID0gdGV4dEVuY29kZXIuZW5jb2RlKGNvbW1lbnQpO1xuXG4gIC8vXG4gIHdyaXRlRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKFxuICAgIHdyaXRlcixcbiAgICByZWNvcmRzLmxlbmd0aCxcbiAgICBjZW50cmFsRGlyZWN0b3J5U3RhcnQsXG4gICAgY2VudHJhbERpcmVjdG9yeUxlbmd0aCxcbiAgICBjb21tZW50Qnl0ZXMsXG4gICk7XG59XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiBlbmNvZGVGaWxlKGZpbGUpIHtcbiAgY29uc3QgbmFtZSA9IHRleHRFbmNvZGVyLmVuY29kZShmaWxlLm5hbWUucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgY29uc3QgY29tbWVudCA9IHRleHRFbmNvZGVyLmVuY29kZShmaWxlLmNvbW1lbnQpO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgbW9kZTogZmlsZS5tb2RlLFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzRmlsZVdpdGhTdG9yZShmaWxlKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogZmlsZS5uYW1lLFxuICAgIG1vZGU6IGZpbGUubW9kZSxcbiAgICBkYXRlOiBmaWxlLmRhdGUsXG4gICAgY3JjMzI6IGNyYzMyKGZpbGUuY29udGVudCksXG4gICAgY29tcHJlc3Npb25NZXRob2Q6IGNvbXByZXNzaW9uLlNUT1JFLFxuICAgIGNvbXByZXNzZWRMZW5ndGg6IGZpbGUuY29udGVudC5sZW5ndGgsXG4gICAgdW5jb21wcmVzc2VkTGVuZ3RoOiBmaWxlLmNvbnRlbnQubGVuZ3RoLFxuICAgIGNvbnRlbnQ6IGZpbGUuY29udGVudCxcbiAgICBjb21tZW50OiBmaWxlLmNvbW1lbnQsXG4gIH07XG59XG5cbi8qXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhtb2RlKSB7XG4gIHJldHVybiAoKG1vZGUgJiAwbzc3NykgfCAwbzEwMDAwMCkgPDwgMTY7XG59XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIG1ha2VGaWxlUmVjb3JkKGZpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgY2VudHJhbE5hbWU6IGZpbGUubmFtZSxcbiAgICBtYWRlQnk6IFVOSVgsXG4gICAgdmVyc2lvbjogVU5JWF9WRVJTSU9OLFxuICAgIHZlcnNpb25OZWVkZWQ6IDAsIC8vXG4gICAgYml0RmxhZzogMCxcbiAgICBjb21wcmVzc2lvbk1ldGhvZDogY29tcHJlc3Npb24uU1RPUkUsXG4gICAgZGF0ZTogZmlsZS5kYXRlLFxuICAgIGNyYzMyOiBmaWxlLmNyYzMyLFxuICAgIGNvbXByZXNzZWRMZW5ndGg6IGZpbGUuY29tcHJlc3NlZExlbmd0aCxcbiAgICB1bmNvbXByZXNzZWRMZW5ndGg6IGZpbGUudW5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIGRpc2tOdW1iZXJTdGFydDogMCxcbiAgICBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzOiAwLFxuICAgIGV4dGVybmFsRmlsZUF0dHJpYnV0ZXM6IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMoZmlsZS5tb2RlKSxcbiAgICBjb21tZW50OiBmaWxlLmNvbW1lbnQsXG4gICAgY29udGVudDogZmlsZS5jb250ZW50LFxuICB9O1xufVxuXG4vKlxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gd3JpdGVaaXAod3JpdGVyLCBmaWxlcywgY29tbWVudCA9ICcnKSB7XG4gIGNvbnN0IGVuY29kZWRGaWxlcyA9IGZpbGVzLm1hcChlbmNvZGVGaWxlKTtcbiAgY29uc3QgY29tcHJlc3NlZEZpbGVzID0gZW5jb2RlZEZpbGVzLm1hcChjb21wcmVzc0ZpbGVXaXRoU3RvcmUpO1xuICAvL1xuICBjb25zdCBmaWxlUmVjb3JkcyA9IGNvbXByZXNzZWRGaWxlcy5tYXAobWFrZUZpbGVSZWNvcmQpO1xuICB3cml0ZVppcFJlY29yZHMod3JpdGVyLCBmaWxlUmVjb3JkcywgY29tbWVudCk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cml0ZVppcFJlY29yZHMiOlsid3JpdGVaaXBSZWNvcmRzIl0sIndyaXRlWmlwIjpbIndyaXRlWmlwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJKQNMyeBgAAngYAAB8AAABAZW5kby96aXAtdjEuMC4xMS9zcmMvcmVhZGVyLmpzeyJpbXBvcnRzIjpbIi4vYnVmZmVyLXJlYWRlci5qcyIsIi4vZm9ybWF0LXJlYWRlci5qcyJdLCJleHBvcnRzIjpbIlppcFJlYWRlciIsInJlYWRaaXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBCdWZmZXJSZWFkZXIscmVhZFppcEZvcm1hdDskaM2PX2ltcG9ydHMoW1tcIi4vYnVmZmVyLXJlYWRlci5qc1wiLCBbW1wiQnVmZmVyUmVhZGVyXCIsWyRozY9fYSA9PiAoQnVmZmVyUmVhZGVyID0gJGjNj19hKV1dXV0sW1wiLi9mb3JtYXQtcmVhZGVyLmpzXCIsIFtbXCJyZWFkWmlwXCIsWyRozY9fYSA9PiAocmVhZFppcEZvcm1hdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbiAgICAgICBjbGFzcyBaaXBSZWFkZXIge1xuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3RydWN0b3IoZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBuYW1lID0gJzx1bmtub3duPicgfSA9IG9wdGlvbnM7XG4gICAgLy9cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgQnVmZmVyUmVhZGVyKGRhdGEpO1xuICAgIHRoaXMuZmlsZXMgPSByZWFkWmlwRm9ybWF0KHJlYWRlcik7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgcmVhZChuYW1lKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuICAgIGlmIChmaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKGBDYW5ub3QgZmluZCBmaWxlICR7bmFtZX0gaW4gWmlwIGZpbGUgJHt0aGlzLm5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBmaWxlLmNvbnRlbnQ7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHN0YXQobmFtZSkge1xuICAgIGNvbnN0IGZpbGUgPSB0aGlzLmZpbGVzLmdldChuYW1lKTtcbiAgICBpZiAoZmlsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgbW9kZTogZmlsZS5tb2RlLFxuICAgICAgZGF0ZTogZmlsZS5kYXRlLFxuICAgICAgY29tbWVudDogZmlsZS5jb21tZW50LFxuICAgIH07XG4gIH1cbn1cblxuLypcblxuXG5cbiAqLyRozY9fb25jZS4gWmlwUmVhZGVyKFppcFJlYWRlcik7XG4gICAgICAgY29uc3QgcmVhZFppcCA9IGFzeW5jIChkYXRhLCBsb2NhdGlvbikgPT4ge1xuICBjb25zdCByZWFkZXIgPSBuZXcgWmlwUmVhZGVyKGRhdGEsIHsgbmFtZTogbG9jYXRpb24gfSk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCByZWFkID0gYXN5bmMgcGF0aCA9PiByZWFkZXIucmVhZChwYXRoKTtcbiAgcmV0dXJuIHsgcmVhZCB9O1xufTskaM2PX29uY2UucmVhZFppcChyZWFkWmlwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlppcFJlYWRlciI6WyJaaXBSZWFkZXIiXSwicmVhZFppcCI6WyJyZWFkWmlwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKtP/O27BgAAuwYAACIAAABAZW5kby96aXAtdjEuMC4xMS9zcmMvc2lnbmF0dXJlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiLCJDRU5UUkFMX0ZJTEVfSEVBREVSIiwiREFUQV9ERVNDUklQVE9SIiwiTE9DQUxfRklMRV9IRUFERVIiLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gdShzdHJpbmcpIHtcbiAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheShzdHJpbmcubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBhcnJheVtpXSA9IHN0cmluZy5jaGFyQ29kZUF0KGkpICYgMHhmZjtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbiAgICAgICBjb25zdCBMT0NBTF9GSUxFX0hFQURFUiA9IHUoJ1BLXFx4MDNcXHgwNCcpOyRozY9fb25jZS5MT0NBTF9GSUxFX0hFQURFUihMT0NBTF9GSUxFX0hFQURFUik7XG4gICAgICAgY29uc3QgQ0VOVFJBTF9GSUxFX0hFQURFUiA9IHUoJ1BLXFx4MDFcXHgwMicpOyRozY9fb25jZS5DRU5UUkFMX0ZJTEVfSEVBREVSKENFTlRSQUxfRklMRV9IRUFERVIpO1xuICAgICAgIGNvbnN0IENFTlRSQUxfRElSRUNUT1JZX0VORCA9IHUoJ1BLXFx4MDVcXHgwNicpOyRozY9fb25jZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQoQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICBjb25zdCBaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SID0gdSgnUEtcXHgwNlxceDA3Jyk7JGjNj19vbmNlLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IoWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUik7XG4gICAgICAgY29uc3QgWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EID0gdSgnUEtcXHgwNlxceDA2Jyk7JGjNj19vbmNlLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORChaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgIGNvbnN0IERBVEFfREVTQ1JJUFRPUiA9IHUoJ1BLXFx4MDdcXHgwOCcpOyRozY9fb25jZS5EQVRBX0RFU0NSSVBUT1IoREFUQV9ERVNDUklQVE9SKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkxPQ0FMX0ZJTEVfSEVBREVSIjpbIkxPQ0FMX0ZJTEVfSEVBREVSIl0sIkNFTlRSQUxfRklMRV9IRUFERVIiOlsiQ0VOVFJBTF9GSUxFX0hFQURFUiJdLCJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiOlsiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIl0sIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiOlsiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiJdLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiOlsiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIl0sIkRBVEFfREVTQ1JJUFRPUiI6WyJEQVRBX0RFU0NSSVBUT1IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAHgAAAEBlbmRvL3ppcC12MS4wLjExL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACj63iQDQcAAA0HAAAfAAAAQGVuZG8vemlwLXYxLjAuMTEvc3JjL3dyaXRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci13cml0ZXIuanMiLCIuL2Zvcm1hdC13cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBXcml0ZXIiLCJ3cml0ZVppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEJ1ZmZlcldyaXRlcix3cml0ZVppcEZvcm1hdDskaM2PX2ltcG9ydHMoW1tcIi4vYnVmZmVyLXdyaXRlci5qc1wiLCBbW1wiQnVmZmVyV3JpdGVyXCIsWyRozY9fYSA9PiAoQnVmZmVyV3JpdGVyID0gJGjNj19hKV1dXV0sW1wiLi9mb3JtYXQtd3JpdGVyLmpzXCIsIFtbXCJ3cml0ZVppcFwiLFskaM2PX2EgPT4gKHdyaXRlWmlwRm9ybWF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuICAgICAgIGNsYXNzIFppcFdyaXRlciB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0geyBkYXRlOiBuZXcgRGF0ZSgpIH0pIHtcbiAgICBjb25zdCB7IGRhdGUgfSA9IG9wdGlvbnM7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICB0aGlzLmZpbGVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZGF0ZSA9IGRhdGU7XG4gIH1cblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICB3cml0ZShuYW1lLCBjb250ZW50LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IG1vZGUgPSAwbzY0NCwgZGF0ZSA9IHVuZGVmaW5lZCwgY29tbWVudCA9ICcnIH0gPSBvcHRpb25zO1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFppcFdyaXRlciB3cml0ZSByZXF1aXJlcyBjb250ZW50IGZvciAke25hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMuZmlsZXMuc2V0KG5hbWUsIHtcbiAgICAgIG5hbWUsXG4gICAgICBtb2RlLFxuICAgICAgZGF0ZSxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBjb21tZW50LFxuICAgIH0pO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgc25hcHNob3QoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ1ZmZlcldyaXRlcigpO1xuICAgIHdyaXRlWmlwRm9ybWF0KHdyaXRlciwgQXJyYXkuZnJvbSh0aGlzLmZpbGVzLnZhbHVlcygpKSk7XG4gICAgcmV0dXJuIHdyaXRlci5zdWJhcnJheSgpO1xuICB9XG59XG5cbi8qXG5cbiAqLyRozY9fb25jZS4gWmlwV3JpdGVyKFppcFdyaXRlcik7XG4gICAgICAgY29uc3Qgd3JpdGVaaXAgPSAoKSA9PiB7XG4gIGNvbnN0IHdyaXRlciA9IG5ldyBaaXBXcml0ZXIoKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB3cml0ZSA9IGFzeW5jIChwYXRoLCBkYXRhKSA9PiB7XG4gICAgd3JpdGVyLndyaXRlKHBhdGgsIGRhdGEpO1xuICB9O1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHNuYXBzaG90ID0gYXN5bmMgKCkgPT4gd3JpdGVyLnNuYXBzaG90KCk7XG4gIHJldHVybiB7IHdyaXRlLCBzbmFwc2hvdCB9O1xufTskaM2PX29uY2Uud3JpdGVaaXAod3JpdGVaaXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwV3JpdGVyIjpbIlppcFdyaXRlciJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAAGHRLboFdAAABXQAABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAB9bFDXZBAAA2QQAAC8AAAAAAAAAAAAAAKSBN3QAAEBhZ29yaWMvc3Bhd25lci12MC42LjktdTIyLjEvc3JjL3ZhdC1zcGF3bmVkLmpzUEsBAh4DCgAAAAAAAAAAADjUnGd1AgAAdQIAABwAAAAAAAAAAAAAAKSBXXkAAEBlbmRvL2Jhc2U2NC12MS4wLjEyL2F0b2IuanNQSwECHgMKAAAAAAAAAAAAksKTjzQDAAA0AwAAHAAAAAAAAAAAAAAApIEMfAAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvYnRvYS5qc1BLAQIeAwoAAAAAAAAAAAAEe3Z/uQEAALkBAAAeAAAAAAAAAAAAAACkgXp/AABAZW5kby9iYXNlNjQtdjEuMC4xMi9kZWNvZGUuanNQSwECHgMKAAAAAAAAAAAAoValSLkBAAC5AQAAHgAAAAAAAAAAAAAApIFvgQAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAABr76lekAgAApAIAAB0AAAAAAAAAAAAAAKSBZIMAAEBlbmRvL2Jhc2U2NC12MS4wLjEyL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAJOnY8BoAwAAaAMAACIAAAAAAAAAAAAAAKSBQ4YAAEBlbmRvL2Jhc2U2NC12MS4wLjEyL3NyYy9jb21tb24uanNQSwECHgMKAAAAAAAAAAAA8sBOwZIIAACSCAAAIgAAAAAAAAAAAAAApIHriQAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvc3JjL2RlY29kZS5qc1BLAQIeAwoAAAAAAAAAAACPE0M3awcAAGsHAAAiAAAAAAAAAAAAAACkgb2SAABAZW5kby9iYXNlNjQtdjEuMC4xMi9zcmMvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAANRN/zdKAgAASgIAACUAAAAAAAAAAAAAAKSBaJoAAEBlbmRvL2NvbW1vbi12MS4yLjEzL2lkZW50LWNoZWNrZXIuanNQSwECHgMKAAAAAAAAAAAAf1UUszQDAAA0AwAAIgAAAAAAAAAAAAAApIH1nAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1hcC5qc1BLAQIeAwoAAAAAAAAAAAC3BWtwfQIAAH0CAAAxAAAAAAAAAAAAAACkgWmgAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL2ltcG9ydC1hcmNoaXZlLmpzUEsBAh4DCgAAAAAAAAAAAFrWwA0gKgAAICoAADYAAAAAAAAAAAAAAKSBNaMAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL2NvbXBhcnRtZW50LW1hcC5qc1BLAQIeAwoAAAAAAAAAAABF1+4LOgMAADoDAAAwAAAAAAAAAAAAAACkganNAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9leHRlbnNpb24uanNQSwECHgMKAAAAAAAAAAAAgRia37MtAACzLQAAOgAAAAAAAAAAAAAApIEx0QAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qc1BLAQIeAwoAAAAAAAAAAACq7NjjNgUAADYFAAA9AAAAAAAAAAAAAACkgTz/AABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9pbXBvcnQtYXJjaGl2ZS1wYXJzZXJzLmpzUEsBAh4DCgAAAAAAAAAAAMtb23HgCAAA4AgAADUAAAAAAAAAAAAAAKSBzQQBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL2ltcG9ydC1hcmNoaXZlLmpzUEsBAh4DCgAAAAAAAAAAAPsuuP6cVAAAnFQAADIAAAAAAAAAAAAAAKSBAA4BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL2ltcG9ydC1ob29rLmpzUEsBAh4DCgAAAAAAAAAAAOroDm3yAgAA8gIAACsAAAAAAAAAAAAAAKSB7GIBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL2pzb24uanNQSwECHgMKAAAAAAAAAAAArwp0SKwlAACsJQAAKwAAAAAAAAAAAAAApIEnZgEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvbGluay5qc1BLAQIeAwoAAAAAAAAAAACSDRk7BRgAAAUYAAAxAAAAAAAAAAAAAACkgRyMAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9tYXAtcGFyc2VyLmpzUEsBAh4DCgAAAAAAAAAAANF/5/LTCwAA0wsAADwAAAAAAAAAAAAAAKSBcKQBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1BLAQIeAwoAAAAAAAAAAACBR/U0UgUAAFIFAAAyAAAAAAAAAAAAAACkgZ2wAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wYXJzZS1ieXRlcy5qc1BLAQIeAwoAAAAAAAAAAACTY5TvVBUAAFQVAABGAAAAAAAAAAAAAACkgT+2AQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzUEsBAh4DCgAAAAAAAAAAAH6/VuZEBQAARAUAADEAAAAAAAAAAAAAAKSB98sBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL3BhcnNlLWpzb24uanNQSwECHgMKAAAAAAAAAAAAI5Px1yIIAAAiCAAANAAAAAAAAAAAAAAApIGK0QEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvcGFyc2UtcHJlLWNqcy5qc1BLAQIeAwoAAAAAAAAAAABMYdpbVQUAAFUFAAA0AAAAAAAAAAAAAACkgf7ZAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wYXJzZS1wcmUtbWpzLmpzUEsBAh4DCgAAAAAAAAAAAFk9swT+BAAA/gQAADEAAAAAAAAAAAAAAKSBpd8BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL3BhcnNlLXRleHQuanNQSwECHgMKAAAAAAAAAAAA2dwMBmMZAABjGQAANAAAAAAAAAAAAAAApIHy5AEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvcG9saWN5LWZvcm1hdC5qc1BLAQIeAwoAAAAAAAAAAADm2W72PCoAADwqAAAtAAAAAAAAAAAAAACkgaf+AQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wb2xpY3kuanNQSwECHgMKAAAAAAAAAAAAe3UziuAIAADgCAAALQAAAAAAAAAAAAAApIEuKQIAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvcG93ZXJzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAADUAAAAAAAAAAAAAAKSBWTICAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL3R5cGVzLWV4dGVybmFsLmpzUEsBAh4DCgAAAAAAAAAAADSioamiAQAAogEAACIAAAAAAAAAAAAAAKSBBDQCAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAFxjc8VQQAABUEAAALAAAAAAAAAAAAAAApIHmNQIAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9zcmMvZW52LW9wdGlvbnMuanNQSwECHgMKAAAAAAAAAAAASTX26VQIAABUCAAAHQAAAAAAAAAAAAAApIGERgIAQGVuZG8vZXJyb3JzLXYxLjIuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAybGDGRsWAAAbFgAAIwAAAAAAAAAAAAAApIETTwIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKQAAAAAAAAAAAAAApIFvZQIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAZEA169IOAADSDgAAJwAAAAAAAAAAAAAApIEOZwIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL2xvY2FsLmpzUEsBAh4DCgAAAAAAAAAAAHkz7Lg8DwAAPA8AADUAAAAAAAAAAAAAAKSBJXYCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzUEsBAh4DCgAAAAAAAAAAALh2lJ1fAwAAXwMAACkAAAAAAAAAAAAAAKSBtIUCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAMjsB0XJCgAAyQoAAC0AAAAAAAAAAAAAAKSBWokCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy90cmFjay10dXJucy5qc1BLAQIeAwoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAAAAAAAAAAACkgW6UAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC91dGlscy5qc1BLAQIeAwoAAAAAAAAAAADWgSqAWQwAAFkMAAA1AAAAAAAAAAAAAACkgROXAgBAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjUuMi9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qc1BLAQIeAwoAAAAAAAAAAADnwqNPyxYAAMsWAAAnAAAAAAAAAAAAAACkgb+jAgBAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjUuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAdUZ/2QcIAAAHCAAAHQAAAAAAAAAAAAAApIHPugIAQGVuZG8vbWFyc2hhbC12MS44LjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA/V3tcLZQAAC2UAAAKgAAAAAAAAAAAAAApIERwwIAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAADSIMmUFLAAABSwAACsAAAAAAAAAAAAAAKSBDxQDAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAUj8p+lQsAABULAAALQAAAAAAAAAAAAAApIFdQAMAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAALI2RwX6MgAA+jIAACoAAAAAAAAAAAAAAKSB/GwDAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAC+IqcbSgcAAEoHAAAtAAAAAAAAAAAAAACkgT6gAwBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAClup8g0vAAANLwAAIwAAAAAAAAAAAAAApIHTpwMAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAztimM/o6AAD6OgAAJQAAAAAAAAAAAAAApIEh1wMAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAhAAAAAAAAAAAAAACkgV4SBABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAXpyzyswFAADMBQAAHQAAAAAAAAAAAAAApIH1EwQAQGVuZG8vbmF0LXY1LjEuMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAbm7eczYLAAA2CwAAIAAAAAAAAAAAAAAApIH8GQQAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAQpCrGMYIAADGCAAAKAAAAAAAAAAAAAAApIFwJQQAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2J5dGVBcnJheS5qc1BLAQIeAwoAAAAAAAAAAADD7/ZFvAYAALwGAAAoAAAAAAAAAAAAAACkgXwuBABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAANaoaZ8fCQAAHwkAACkAAAAAAAAAAAAAAKSBfjUEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAACNdxwWHDAAAhwwAAC4AAAAAAAAAAAAAAKSB5D4EAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAF1cCItMUAADTFAAAJAAAAAAAAAAAAAAApIG3SwQAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAANOikHykBgAApAYAACsAAAAAAAAAAAAAAKSBzGAEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAYnh4idkSAADZEgAAJwAAAAAAAAAAAAAApIG5ZwQAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAE3BiNPcBAAA3AQAACkAAAAAAAAAAAAAAKSB13oEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAGrwH0CTFwAAkxcAADAAAAAAAAAAAAAAAKSB+n8EAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAACHS0iSKCwAACgsAAAqAAAAAAAAAAAAAACkgduXBABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAc4dccHQfAAB0HwAAKAAAAAAAAAAAAAAApIFLxAQAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAAD0QYgRHg4AAB4OAAArAAAAAAAAAAAAAACkgQXkBABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAALo+zaF5CAAAeQgAACUAAAAAAAAAAAAAAKSBbPIEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zdHJpbmcuanNQSwECHgMKAAAAAAAAAAAAswoQLNwLAADcCwAAJQAAAAAAAAAAAAAApIEo+wQAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAADy5fJQyQcAAMkHAAAlAAAAAAAAAAAAAACkgUcHBQBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAFHCzq2uEAAArhAAACkAAAAAAAAAAAAAAKSBUw8FAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAAAAAAAAAAAAAKSBSCAFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAA/RdPfYgYAAGIGAAAiAAAAAAAAAAAAAACkgeIhBQBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHWIQX5kAgAAZAIAACsAAAAAAAAAAAAAAKSBhCgFAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL2lzLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAA2pkZOaUJAAClCQAAKgAAAAAAAAAAAAAApIExKwUAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAIwbIjUfBgAAHwYAADUAAAAAAAAAAAAAAKSBHjUFAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAAAAAAAAAAAAAKSBkDsFAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAE6Fc2ufAQAAnwEAACAAAAAAAAAAAAAAAKSBLD0FAEBlbmRvL3RyYW1wb2xpbmUtdjEuMC41L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAM14fpGzBwAAswcAACkAAAAAAAAAAAAAAKSBCT8FAEBlbmRvL3RyYW1wb2xpbmUtdjEuMC41L3NyYy90cmFtcG9saW5lLmpzUEsBAh4DCgAAAAAAAAAAALz/AUOaAgAAmgIAABoAAAAAAAAAAAAAAKSBA0cFAEBlbmRvL3ppcC12MS4wLjExL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHVWounBFAAAwRQAACYAAAAAAAAAAAAAAKSB1UkFAEBlbmRvL3ppcC12MS4wLjExL3NyYy9idWZmZXItcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAAPWypri+DwAAvg8AACYAAAAAAAAAAAAAAKSB2l4FAEBlbmRvL3ppcC12MS4wLjExL3NyYy9idWZmZXItd3JpdGVyLmpzUEsBAh4DCgAAAAAAAAAAANGQ2vyoAQAAqAEAACQAAAAAAAAAAAAAAKSB3G4FAEBlbmRvL3ppcC12MS4wLjExL3NyYy9jb21wcmVzc2lvbi5qc1BLAQIeAwoAAAAAAAAAAABe5tGBOAQAADgEAAAeAAAAAAAAAAAAAACkgcZwBQBAZW5kby96aXAtdjEuMC4xMS9zcmMvY3JjMzIuanNQSwECHgMKAAAAAAAAAAAAmapkq54qAACeKgAAJgAAAAAAAAAAAAAApIE6dQUAQGVuZG8vemlwLXYxLjAuMTEvc3JjL2Zvcm1hdC1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAiv8HosEWAADBFgAAJgAAAAAAAAAAAAAApIEcoAUAQGVuZG8vemlwLXYxLjAuMTEvc3JjL2Zvcm1hdC13cml0ZXIuanNQSwECHgMKAAAAAAAAAAAAkpA0zJ4GAACeBgAAHwAAAAAAAAAAAAAApIEhtwUAQGVuZG8vemlwLXYxLjAuMTEvc3JjL3JlYWRlci5qc1BLAQIeAwoAAAAAAAAAAACrT/ztuwYAALsGAAAiAAAAAAAAAAAAAACkgfy9BQBAZW5kby96aXAtdjEuMC4xMS9zcmMvc2lnbmF0dXJlLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAAB4AAAAAAAAAAAAAAKSB98QFAEBlbmRvL3ppcC12MS4wLjExL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACj63iQDQcAAA0HAAAfAAAAAAAAAAAAAACkgYvGBQBAZW5kby96aXAtdjEuMC4xMS9zcmMvd3JpdGVyLmpzUEsFBgAAAABbAFsA2B4AANXNBQAAAA==","endoZipBase64Sha512":"f4c0bf2007e01b81a1686d271e133f86efb4bb8c0b167f91dcfe06b3645e885670bb6a6b1f4d5fb34ec89689720aeb10023e24c0c4e733ae0b53abfde4a41f74"};
1
+ export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAACe0VrsBXQAAAV0AAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjIuMiIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi45LXUyMi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjIuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi45LXUyMi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtc3Bhd25lZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LXNwYXduZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YWJhMTIzYzA4MzcwZWEzZjI2ZDQ1NzU2MzY4NDY0ODE4NGY0NWIwN2RiNWJiN2YzODAwNGQ0M2Q3ZjdiZjM5ZDBmMDQyOWY3NTNhYjkzZjI0YTg4ZWFmMjc0MzIxYWM4N2I3OWU0ZDMyYTRlNGZiM2U2ZjRlZmQ0ZTRhYzNiNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vYmFzZTY0LXYxLjAuMTIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Jhc2U2NCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9iYXNlNjQtdjEuMC4xMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9iYXNlNjQtdjEuMC4xMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJhMTkwZWQ3ZDJhYzc1Njc4NGZlMGExMDM5MzAzZmZkOWJmMDM3YzQ0MGJiZDIyZmViYTBmNDZkYzAzZGM1YjYyMTYwZmJlZTlkNDA0ZGE4Y2JmOTJkMDE0ZDlkYTY5NWFmOWZlZTkwODU3NDM0Y2UyZGI4MDU3ZDE4ZjVhNWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2NjNjA4NTZhZDdkYjkwMDBlNzcyN2RhNjE0OTc4YjUwOGQ2MWZkYmQ0ZGM4MmI4MWQ0ZTM0M2UxZTEzOTJlY2JhODM5ZDQ2ZDA0OTJiMzQ1ZWE4YmFhNmZmODI2MTJiNThjZWMyYTc3ZjQ5OTc3YTY5MTc2NWQ2ZmMxNDU1MjQiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTRmYTc3NmNmM2NiZDE2ZGQ4MmQ1YzMzYzgxYzIzODMwYjYyODEwMDZhZGM3ODE4MDUxNmZiMmI4MWJlNjM0NThhZGNhNTQyZTU0YWY4MDdmMmRjNzdjM2ViZjA5YWVkZGFjOGRiZTlmZDk2NDQwNmY4NGE1YjY4YjEzNTZlNmQiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjk0Yjg2YWNlMDJkZGMyMjYxOTgxNTIxMWYyN2I5ZTczMmU5ZGRiZDZiMGZlYWM1MmU0Mjg1NjA1ZTk1ZTQxMWIzN2I3NTM5ZDFlNzZiMWM3Zjk4ZDJmYWRlNzlmZTcwNzFmZjgxZTc3YjQ5ZTQwYzJiOGU4ZWQyMTBlMzNkNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMxMzU4ODE5NjIzNTcwNzQ3ZDA1NjJhMjhjZjdjMmRhYTdjZjcxOGZiMDk5M2Y1ODc1N2FkZDQ5OWMwMzFkMTI4ZWU5MDEyNjBiODE5NTNjNGU5MDMyY2RhMzM4NjNiYzM4OTBjMTZjNGM1YjY5NDI4ZjRkY2RiZDg2NTM4OTZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjI2MGZlM2U4NzUyNGY5OGQ2MWQ3NjNhMzE2ZmNhMTZiMDc0OGMzMzQ3MWY3NTM1MTY4YTFmMGJkMGJiNjQ4Y2NkZTI5ZGFhMjkwNTIzMmUwNjczOTY4NzM1NjkzZmRhZDYxNjVjNmU3MmRlYjJjZjQ1ZWE3ZTFkZWE4OGRjYmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYzFlNmRiYWEyMDQwZWU5ZmIwNjViYzY2MjEzMjgyYzg1ODJhNzg2NDg0ZDBjYmE2ZDg1MzI4OWY1YjJlMTNmOWRkYzU2OTMxZTViOWMxZDExODUxYTMzN2JhNWQ0MjA2NGRhZTAwODVjZTRiMGQxMjE3NDQwOTM4MDI3MGZhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkxYmUyMjlkZGQwYTFhYmYyOTRmOGRiNmEyNjM1MjU4YjRhZWMzMmNjNzJmMzNkZTI4N2EwMTc1NWYyZjFhNDdiZjA3ZTc2MmFlZDhiMGMxM2JkMGUxZTc1NjhhOWI2YTQxNDI5ODJjMTkxYmRjN2I3MTI2YmMzYTFmZDQ3NjM5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi4xMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tbW9uIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpZGVudC1jaGVja2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTk3ZjE4OTMwNWZmMGU0ODc2ZmU1ZjRhOGRjZjg0ZTM4MzU2YjhhMzk1ZTllYWNkNzNiODk1N2NiMTkxMjE0NWI4NTc3OGFjYjcwNWYxMDAwYTI4MjhjZmFiNzcwNWY5NWNmNGQxOGQ0OGI2MGVlODQxMTE3MDNiNmNhMzdhOWIiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm9iamVjdC1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjNlZjFiMGI5NGI3MGQ1NTJhNDNiYmRhMWFjNDZmYmFhZDU2OGVlMDI0ODEzZThlNWQ4MjAyNWMxMTZkNGExNzkzMzcxM2NiMzQwMjc1ODU5ZmIzYmUzZjVhMzk3NGFlNjU2ZWYxYmViMDFhYTBlZmEwNWU4MGJlNWMwOGQwNiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby90cmFtcG9saW5lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3RyYW1wb2xpbmUtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjZhN2QzMjkzZjQzODJhZWI1YmE2Y2EzNDE2ODc1ZDQwZGZiMGQ2NDI0ZTg5YzA4MDk3NDFjYTQ3NDVlOWM2NmIyNjhlYWY1MjI5ZWY2YmNkNjIzZTg5ODc2Njg2ODI4MDViMjJiNzJhOWI3YjQwZTY1MDk4NWQyMGNhZjU4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wYXJ0bWVudC1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE1OTU5MWE4ZTM2YWQxNmM0NmZlNmVjYzM0MDExZmJiZDhkNGZkMDkxNjA0ZDM5MTM1N2E0YjA4NzBiMTJlNjgxMTViM2FkYjg2MDFkNmZlYTlhYjhjMWJlMjFlMDczYWE4ZGU4OWM5NDNiYzMzMWE4NjQ5NjgwNWY0NzAwNTEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4dGVuc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXh0ZW5zaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzRkYjAxM2JhMzVhYWM3YjJlNDNmNTk1NzBlNTcxYWUyZmQ4M2RjOGRmOTA2YWM5NzY3YjM5N2I2MTAxMmY0NmQzMjU0NmE1OWViNzg2YjRiNzliZmVkYTczZDNhMzljMTBjYTkwMGEyNjBjMjQxN2Y0YjVlZTgxZjAxYTA2OWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA1ZTkyMzhmYzZhMmFhNzFkM2NmNzE3NjBlNGRhNTBhYjQ4NGVhZGY5MWM3MDlmZjE0ZTUzZjk4N2UwNzI4Njk2OTNjMWNlYjJkNTM5YTIxNDY2ZjE5NGQ0ZjE2NWFhMzc1ZjhiYjY1OGJmMDM2M2Q5NmE4N2ZmMTYwNmQzNDVkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Yjk5MDdmMjg0MmQzMzMwZThhMTE4ODNjMDg4OGRjZTk0ZTUwODdlNTAxNDBkNmM0Y2EwM2U0YzE3ZmUzZGI4YWRjZmExMjY0YWNhOWEzMjhjODBmZTQ5NmRkZWRjMGZhNTc0M2VhYjBiYWQyYjhkMjlhNmRlZmZiMWQwMTY4ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZmFhZTM2NTAzYmU1OTczOGY2OTE5MTdmMjU3OGEzYWRiNWE5ZTU4NGFkOWMzYjdhMTVmNDE0MjMyZjMwNTA3NmY3ZWM3YjJiMmU5ZGMxY2RjYTAzMzcxYzYyNjFmZWNiMDc2ZTU5ZmExYjhlMGJlOWRlNzljODBjMTg0YTE0YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtaG9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWhvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YTYxNDZjYzljOTYzZTYzMTMxZjAyYTU4ZGVmMTc2ZDU3YjU0ZmY4OGFjMTg3ODVkZmU3NGU1MjI3NzFlNjhmOWJlMTY1ODVhZGUwNWM1YWQxYWQwYzdmNDQ1NWUyNDU0OGJiZGU0MmE5MDI4NmFiYWQ0ZDgwMjUzMWNiYmVmMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTExMWExNGQzNmYzZTJkYzlmOGU2MjI4MmE4ZGYzNzQ4Y2Q1MWUxYjQ3NzRiNGZmYmIwNGUxNDhhZDA5ODhlNjVhYTZkODgyMGM5OGViODliOTFhMTUzZDM1MmRlYmM2YjM1MjVkNjY4NTA2NjJlYTViOGZhMDY3NzZkMTgzYzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhiMWMzNDQ0OTg2MzcxMzI3YTJlMTIzOWVhOTdjOTczNGRkNTgzMGU5MmFhMTNkMDliZDg0NzZiMWE2M2YzYzJjYWY3Y2Y0YTBlYzkxM2I5Y2VmNTc0MTgyMDhiMGU2OTdkOTY0M2M3ZjdlMjcwYTdmYTZlYTIyYmY1YWM0MTc2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcC1wYXJzZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcC1wYXJzZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYTY3ZmIzYjdkZmQwOWU3OWJmMzc5YzEzYjVhYzllMzU3MDg0ZDNlNGU0M2MxMmMzMjdiZTJiNGRkNDgzZTExZmYzZTdkODQ4MWEzYWJkMzgxY2FlNzVjZGZmYjNiNTcxMjlmNGNhZGViM2E4Y2MyMTkwYWZiMjU4MzQwNDUwYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0NGE4M2QzNjczNTY5MWYxOGIxMmE3ZDdkNTlkMDY5ZTkxMmZmMWY5M2U5NmIyMWUxY2U0YzU3MWE5NzljOTczYzk0MzU3ZWZmMWY1MzQzMTQ1MTUyOTM1YjhkODUwNTUyOWFkYzA2NDIzZjY3YTMwNTM3ODVlOTQyNGFmYzVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWJ5dGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1ieXRlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMxZWUxZDYwYmU5ZjdmMTMxMzliMzY3YjQ3MTFjMWNmY2M3OGNiY2FmNzgxODIzMGQ4NDZlMmNhMGJmMTZhOTU2YzI1NjM4NWNmZjk5NDhmMzQ2YTg0YzZlNjYyZDI0NDQyM2YxNDRlN2YzNjYwNjEwMTdiOGE4MTk0MWVjMzgwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MTU5MzUzNjI2NzcxNjhkMzE3YzgzYjkzNjdmZTdhZmE2NmQzOTc4NjUwZjMxZjM2YzFlMWZmMDM5NDc3YmI5OTA1NTAyZjk4MjdkMDk2MTVjMmU3YzM4ZjkyZjE3ZDRlOTRiMTI0NTkxZjI0MGNkYjVlMjhiMTA5ZjA5ZWI3MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTM3ZTdiZWExOGY3Y2EwYWIxNTQwMzc0M2JiN2ZmZGI5MzNkMGI5YTNkZmFmMzE4ZTI4NzY2MWUwNmZkYTlhMDdjNDRjNGY4NjY0M2NlMDJlNzFkMzhiOGE1M2RjMWEyZDhjNjRhN2UzMTY5MTJjMWM0NDY3ZDhjNjY5MWMzNjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLWNqcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLWNqcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3OTZiNjZlYmQzOTAwNDU5YmJjZjg2NTMyMTk0Yjg2NTU0OTM1ZTZlOTU3OGQxM2YxOWNlNzQ1YmUzOTFlOTZjMTEyNzlmZDFkODE4MmQxZDIyNDBiYWUzNGUzYjlkMTBjM2FlMzUyOTk2YjM5ZDUyODU4ZjcwZWRiMzQ5ZWE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXByZS1tanMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXByZS1tanMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MDFhODc4M2YyZjU3NTQzNTQ2YjA2MWU5NjEyNjhkMDJiMDMzYzEyYzEwNmE5YTI1NzQ1M2Y3YTU4NzQ2ZGVlYzk1OWZiNWQ4MDAwMGU2MTBlNTJiNzc1MmZiNzlhNzQ0MWQzNDE4YWE2ZWFmMjE3OTYzM2NlZjU5N2NiY2JmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS10ZXh0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS10ZXh0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTQ3NDlkMzZjMzdmYTRiMDQwZjM1NGE3Nzk2ZGYyODk5MGMyYzNkN2NhYTRkZjFmY2U5YjZlMGNkN2UzMWM3YmEzZDhiNGY0NDJjMWNkNWE1YjdmNzEwODE1OTA4YTcxYzQ1YjRlMzc3YTRlOTg3ZGE4OWY0ODRlNTI0MDQ0MTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LWZvcm1hdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LWZvcm1hdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQzOGY4NWU3NjI2MTJlYzVkZjY1MDIyMTNmZjg5YzgzOWE2OGU4NDY0N2IwZWY5NDUyMzk3ZTc4Nzg1OTg5MDQwMmFhZWMzMDk1N2ZmNmRiNWY1ZWY0YWE1NTFjYzNiMTNhNzJiOTM3YjRhOWIyNjcyZTQ1ZDQ1ZmJjOGRmNGYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BvbGljeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzAwZDljMjY5MDliM2M4NzU1MjY0NjA1Y2Y4ZjM3OGEzZmIzMzIwNTU2N2Q0ZDdjZjFkNWEzZmQ5YWEzMGY4YTQwNjZiMjNkMjA3ZjQ2MWQ1NGZiMjQ1NmZiMTk1MDQyZDgxYTNjMmZkYzI4OTkwZTk5NDRkNmIzMDcyMDgxZjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG93ZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb3dlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZWJhM2I2ZTU3MTA0Y2QyZTZlZGY4ZGQyM2M3NjM3NDhmY2YwNzYwY2U2MzQxMzc1NjcxYzY3ZWM2NzI2NjEyZTRlYzNhOWVjNDgxOWUzYmU4YjE1N2QzNmEyODEyMDlmOTY2ZWNmNjMxZjJiZTAyY2QyYTQ1NWM0YzBjMGE4MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1leHRlcm5hbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtZXh0ZXJuYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZW52LW9wdGlvbnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjYTc2ZWQ3YzZiNjU2NzFmNzBiMjY0NmY2ODk0MzU3MjRkOGI5OTMwYTVmZjI5ZDFmYjMyN2VkOTZmZDQxNDQ2OTUyNTg5NjJkYWZiOTgyODYyYTJlZmMxYjAzZDBhZDk2YjMzYzJjYWU1YmViZmEzNzI2ODg2YTA2ZjY2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMGZiNTNmMmVmZTcxM2M3MjU1MjIyMTlkMzA4MzcwZjcwNzVhMTBjYzlmYmVhZjE3OTI0M2U3MDNmNjExNGQ2YzE0YjNkZmMzNDE3YWRkODgyMzJiODBjMGVkNWE4YmJiNGI2OGZlNzUzZGUwZTQzNjhiMTVhZmI0YjNkNjBiNSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vycm9ycyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJhYzkyYmMwYjkyMDc3ZmNhMDU3ZDA2MmNkNGY1OWJiODliZWI5MzBlODM1OTg2MzQ2YjYxYmUwMTA4MjI4MGUyODRmNWIxNDU2YmE4OGQwOTZmMjg2YjEwMWRhZDhhMmJkM2IyOGQ3MTlkNzdiOWIyZmQ2Y2ZkZmU1ZmQ5NjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MTU1YWEzZDQxN2QyODdjOTljOTgxZDIzN2IyZGFjNDczZTE3ZmZlYmFlMmYzZGFhMzI5OTFiZDYxMjc1YWYwZmFmZjA3OTA3YjMwOWQ4M2Q1MGI2MzUyM2ZkOTI3MDlhN2JmZTkxZTg4OWJjYmMyNzFhZTVkOGUyY2NiZTFmZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbG9jYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xvY2FsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjBlZmU5MjhlZTUwMzllN2Q0MDk1OTRjZTA5ODIxYmZmNWVkNTFhYmUwYzI0ZWE5NTgwZjk2NDg3NjU3NTRhM2Q0NmRkNTk1NzhiZTZkMzQzNmFlM2QxNWM4MzJhNjM1MjQzOGRlNzFhM2VjODE5ODNiNjM3YTQwZTM4MmMwMzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJjZjI1Y2ZlYTFjNDM3YjMzYTEzNDI3MzJjYzg2YzE4ZjAzNjBhOWFkZjk2OWI1YmM0YzE4MmZiN2YzOTc0OWY5OTRjNTUxMzllOWU1NjU1YmViYTk3YjU0MmRjMzUzMzc1MWRhMDU4NjllMjFlYTFlMWQwN2E4MTAwNzFlYmE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjYzNhZDcwMGQwNjU0ZTZhNGZmMjc3YWVjMjYxMTUxYzk3YjkzMDAzZmQ1MDIzYzhiM2EzNmU1MWQ4YjhjNTllY2UyZTk1ZTI0NTQwYTQ0NTkzYmI2NDRmNmIxM2ZhZDBmYTY0ZjRiNjJkNjA2YmM5OTAyMmQ0ZmMxMzI4OWIyOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNGQyN2I2NTJiZGE5YjEwY2NmMjk4NjdiYThlN2U5MGE4NDI1OWY0OThmNzE3MzgyYjUzYmNjYTI5OTgwNjllYTFmMTRlZjJiM2YyODcyODRkMjU4OTBjNjAyODY5ZGY3Y2Y2NGQ4ZWQ4MWM3Y2QwYzczZmRlZmU1ZGVkY2IxNyIKICAgICAgICB9LAogICAgICAgICIuL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDYwNzEyMzhiMjVkMzA3NjZmNDQ3M2IzNjA3NWRiMDUwMDRhMzA5NWI3YmE2YWRkMDQ0ZDk4NjY1YzdlMGMzYzMwOWQwNGQ0MzU4YWFkOGIwNWRkOGZjZjAwZjdkZjI5NjE1NWM1ZjgyOWIyZjhiZjM4ZGRiZWZiMTBkNTgzNDkiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNS4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9pbXBvcnQtYnVuZGxlIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4xMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC1hcmNoaXZlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC1hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcGFydG1lbnQtd3JhcHBlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyMzQyNDBkMWY3NzUxNmNlMDE1NDdmYTJjNDJkNzRiMDc3NTk1NWM4ZWU1NTc2NGI0MTNhMDBmNTQ1ODJiNmJlZDYyNWQ4NGQ0NTI2MTk0YzkwNjU3MGQ5NDQ5Njc3MDRjNzk5MzljOTIxMmI2ODliYzExYjg4NmNiZTEyYjMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM1ZTMwZjg5NDQ3MGM0ZTM3N2NmNGExYTVlNGQ1NWRkOGZkMWY3MmQ0OWM5NjAzMDQ3MzQ3YzBkNzdlMWUxYWMzODY5NTJjYWU2NDhiOTc3NDRlNmU2ZTFiOTk3Mjk4MTY5ZjJkNWE2Yzg2YWEzODg1OWU0ZjcwNWMyZTQyNzFmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9tYXJzaGFsLXYxLjguMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbWFyc2hhbCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4ODQzMGZjYjc4NmI1NjFjZjAzZWNmNjU5ZGE4ODBmYzhjNGE2YmUyMWVjNmEyNTZmZDg4NDNjOTJiYzY2YzFmMTBmOTgzNzFjYzg1YzM2NzBlYTdjY2Y3NDQwMGFiMTEyZTRkMTBiY2MzOWI2NWNlMDViNDg3NTJhMjhkMmNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyOGYzMjVhNDU0Y2FkMjMxOTFmYzhkNTFmMGJjZTkyNjkwYjc4YzkzODRlY2U1YTYyNjNkY2YxYmQ0MmFmM2Q5YmIxNWJiNzZhZDQxNTZkMDA5MDYzNTNkNWZjZGVkNmVjYTY4YWVhMzg3MmI2ZGVjZTcxNGMzMDlkYmJlYzk5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjU1NmFmMjhlYmFmNjhkNGZmMGZlMjk0NTI0YzkxMjMzODkzMmI4ZTI5MWUwNjhhZDYwNDBjNjMxMjA3NDhjNTY3ZGIxZDVhNGI2MjMxN2UzN2MzMzRhNzczY2IwYjJiZTkzMmI4ZTMyNmE3M2QxM2U1ZGEzYzM1MDAzZDYwNDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTBlODBhNTAxZjU3MDE0NDcxZjNkY2I2MzEzMzEwZmVjYjhhOTljNWY2NzkxOTRjNTEyOTIyYjk4NzJjYjhmMWRiNTEyNjM2YWVlYjA2Mzk1OWY0ODYyYjZkOGI0NTE0OWRkMGRhYjQ4MDZlYzZhYjE1OGM2OTdlMGFjNDlmNzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjI0NTNiMTlmNTdiYjljOWZlMjRjZDkyMTY3NmZiYzA4NTJmNDdhYjlhNjZlY2ZhNzUxMzZhZmM2NTI4NTU1NTRkZDg5MmNiMzk0ZjhiYjcyMjNhNTE4MmY2MWEzMzNiMDgzZDYyYmJkYTA3ZGQ2MzFlZWE1ZmM1NTY5ZTMyYTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWQ0YjVlY2NiYjlhZmJiNmJiMmU1ZmU2MTMyYzY4ZDAzNDQ0Y2IwOTQ5NDRkYjc5NTc1NmU4ZjQyNmZiMDI0OTVhYmFjYzllZjIxZDZhODFhNDc3MDBkY2NkMDM1YjYxNDQxMWYwOTUzZTM2YjU3NDc1OTJiNTI1NTJkMjM3OGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFjODNlZTZlN2E1NjRiZWE3ZjdhMmY3MDcyYjViNzE4NWVhZjgyNWU0MzUxMWNiNWZmZjU4NDNjYWE2YzZjMWJiMmJmZTY1NDM4NTVhZmZhZTcwNWRiN2Y0OWEyNGY5MzNjNjAxMTk5NTU0MTA1ZWI2ZWI4YjhhM2Y2NjQ2ZGE0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWNjN2NjMzAyMWRlMThlMTFmMTIxOWUyMWUyOGI5ODA0ZjQxMzUxZjMwNGQyZjFlNmI2OGEzYjY0NTY1Njk4MjdmY2FmNmVlZWIwMzg0NmQzNjAxOTIxNjU4YWE1ODNhYjhjYzYzZjhiNjBiYWU0NTg2NGQ3YmQ5MjJiNTZkOGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NS4xLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL25hdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTczMWM4MjRiMWQ5YjQxNzdmYjNmZWI1YTFlYjA3YTFjNWRmM2NhMWVhNDc2YTFlNTU4NmUxMGNiM2Y5M2MxNGQzZDQzNmY5MTQ4OTYxOTMyOTIxZWVlZjIzZWJlMzBmYjZiYjIzMzA0NGZiZWViNzZjNmY4ZTMzNTRiOWU2ZTUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIjogewogICAgICAibmFtZSI6ICJAZW5kby9wYXNzLXN0eWxlIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pZGVudC1jaGVja2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllMjQ0ZDk0MDhjZWRiNWYwOGQwMmIxMWViYzNkOTIwNTM0NTIwNmRhOGEyZTA4ZDZlMWI2YWY1MGVjOThmYTA0ZDAyYTdjMDg1MWM5ZWUwNTJjMWU3ZjJkYzA4NmY0OWQ1OGY4MGNmY2M0YmQ5NmEyOTM4ZDgxZDRkOTJhYzIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J5dGVBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnl0ZUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTY4ODIxNTMxZDlmMWZjYTEyODU2MDk0ZDMyNWQ3YzY1NmEyNzc5NjRkMjMwYmQ2NGMyMzViZmRjN2RhNDFhZGQzYWRkODYwYTJlNzdlN2NiNjcwZTFhYjVlMzExMTQ0ZGNmMDI1ZjRlOTM2YTNjOWMyZjAwZWNmNDBlYTk0ZWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMzZjMjM4YzMwYTlmZjg2NjNmZDI2YjU3OGJiOTNlYzIwZGQ2NWFhYTdlY2RhNGNjMjgzNTY3OTQ5MTQ2NDU4OTFkZjhmNzllMWIyMzIyNmE4NDlhMDdkNGE5ZjVkZGUzNTM5OTUzNDI2YTllYTQxZjYzOGJlNjhmMjE0N2RhMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjU2MDlmN2YwOTQwZGYzOWJiYWE1ODBhMDU2ZmYwM2Q1NGU3YWUyNWU1OWEwNTRlNzU0Mjg3YzNjN2Y4MDhlY2UxMjlhMWEwNGFhMDZiYjE5NTYyZWNjMjkwMmRkNzI5ZjgzMDMzOTI3YzM5NzMxMWE2ZWY1NTVkOGVlZmI3MzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYWVkN2NhNDk2YzFmMGM3OWE1MjhkN2IzZmY2MDAyYmQ5NTdlNzIxYmI4ODUwZDJjNThmNmUzZjhhNWQ2ODU5MmE4NGI4NjMzZjJkZDJhZDc3Y2I4Y2ViZmFlZmFhMmYyYWRjOWM1MTg3MDRkNzEwN2RkYzA4MDhjN2RiYzcwOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1YmFlMmYxZjQyNjAwYmI5NzI4ZWMxZDFlN2FjZTdlNTNhNGY2OWQzNmRlNWE4ZmNmYmM4NTBmYzRmZGE4YmViNDYzN2JhNjBhNWVhMGM2Y2ZhMGVmNWNiOWExZDgyMTYxYTc3M2RkNDdlNGQ0ZTc2NmNjYTY1NTg4ODgzZTkyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJhZWZkOWUyMzcwOWZkMWNlYzhkNmRkMWVkMGFjMTI1MjU5YWUzYThiY2FhMmI5MThiYjM3M2E2OWU3ZWY3OWEzOWNkNmQ5Y2Y2Njc0MzY2NzY3NDk0ZTM5MzgzMzJkMjcwMzcxMDQyZjgyMzI0YzgzNDZiZTU4NTcxOGQ3YmNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJlODc1NGMyOTg5M2JkZjg4YWVkMjljMjZmYWMwNzNiNTBhMmYwMTJlYTljNmM0MGE1MjQxNDBjZmZjZWFlYTRiOWUyYmU0ZDQ2NGUyNzNiZmE4NGNjZDI3ZGMzNDk3N2RjNzY3MmE0M2VmYTMzYjJhMjI4ODQ1MWExYTAyMTk0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZDVmMmM5ZDhjNDFmMWI4YmE5ODdlYjg3NGMyNjM1MDliMjJkOTBhZmEzYTNmM2JiODgxZGI5ZjBlODBiYTZhM2IzOTNhOTMwZWJiMjkxZTZmNDczZWU1NjA1MzBmY2NlZWYzZjMxZmQzNjBmZTMxMjU5MTI1YWVmYTQ4NzhmOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZGM2ZTdiYjhjZGNlZmVjZTk2MDA4NmNjZjliNmQ5NDNmNDBmN2RkZTg2OGViMTI1MTQ3MzNlYmQzZWUzNzVkOTRlOThmNTYxMjZhOGNjYzQ4NWEzNWY3ZmJhNzA2YTg5ODE3YWY0Nzk4ZjdkZTgyMzhlODFjMjI2MGVkYTJiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlT2YuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYTI2ZTA0ZGE1YzYyOTIzZTFmNDQ3YTBiNjI4ZjE3ZDk0OWUzMWUwODg1MTZhZjBjZDY4ODdlODUwYzkxNWUwZGRlY2Q0MmE0ZTA4YTViMzgxYzA3NjNmNDM1ZjEyYmY0Y2QzOTQ2YTE1NTA2ZTg0NDU3YmVlZTA1ODJhNGU2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZW1vdGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU0NzliZmJjMWFjNjVmZjQ0MzM3NWVmMjgyMGU1ZjU4ZWYxZjUzZGQwZTAzZWFkNWNhYjgxNTQzM2FiMWQwNjVhODFkOTQ3ZDBmYTY2MGY1MWI2N2MwYzY4OTRkMWNiYzQ4NTYwZmNlOWZmMmYxZTUwN2Q1MzJmMDE0N2RlZjdkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZS1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmUyNzcwN2VhODY5MWQ2ZjIxNzBmMmUxMjdiYjgzYjQ0ZDI2ODZmOWY5M2VlZjM3YWYwZGJmZjcwY2M0OWZhZGM5YzU4NGFkZmZkZTllMmE2ZDlmNjFiMTg2NWZjYWExOGRkZDk2ODFkNTc1NTQ1MzFlYzcyZDUxMmI0MmY2MDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RyaW5nLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdHJpbmcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZTUzMTVhNjRiZmQzMThhZjliMzUwZTQzYWFkZGVmNjE4YjllMDUyMzIyN2RkYjQxZGYzYjM2YmE3MDg3NjAwNDViNGM0ZTEyZjhiYjBjN2U1NGFjMjRiYWRkMjEzZTBjZjlkNWMwNDM2ZmRkMzhkYmE3MGI0ODcxNjJhMjkyNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zeW1ib2wuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N5bWJvbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk1OWRhZDMyMjEyMzAyZGI5OTNmYzc2ZmY0YjAyYzBlMDYwNjk5ZWM0NDJlMjI3NDdmNDQ0YWFiY2FmMmUzZjRmNzE5MWViMjY3N2E1OTM0YmYyOGY3ODlhMTc2MmFkNTcwNjBiYWNiODdiMWQ1NWI5YTAyYmYzZjliZTQ4MTU2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTkyN2YxMWVhZWE2MTRjMTkxZjk4YzhkNTdmYzcxNDllZjg4MzgwMzM3YmZmNDljYWQ5MzRjN2IzZmYxZmFiM2EwOGJlNzRmNjZmZmVhOTVhYWEyYjljNDQzYjNmZTA1Y2Q3ZjkwMTc1ZjgzNjdmZWI4NzQ1YmJjMjQxODcyNzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFkNWE3M2I0YzkxNjcyYzU3NTY5Mzc2NzkxOTM3ZjliMDM5NjI3MzhlN2MyYTQ0OGRjMGU2ZjhjNWZjOTBmMTNjNTk3YzBkNDJlYjgwYTg1OTA3MmZlOThhYjU2MmFlMzQxZTVmODUzODk2ZTY0YmNiZDg3ZWI0MmU4ODk4MTc5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJmNDY1MzMwN2Y4MDZmMTNiMmFkYjU5NmJiNmUyNGNhZmU4ZjA4MzQ0MmY4YjUwYjMyYTBlY2FiMWFmOGRlZTUyYjZhOWI4M2U2NGJjMmQ2NmJkNWRkNDIzZGRmMDZhMTIxNDFmOWFiOGU2NGNiMjYxNDA2NGVlNjUyZDA0MDA0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZDNhMjU2MzZlNTQyNzhiMzNmNmMzNjIxNDc4ODllNmZmMTBiZWRhODBjMDdlNmExNmQxOTA0N2I3YjNjNmEzNGQ3MzBlOWIzY2ZjOWY4NTExYjZlMjdiNmE2OTc3NjRmOTY4M2Q3MGRmNzA4NmUwODVmOTNkN2Y5NWZjNGZmYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRmYTZkMTJkNDdiYmExODZhNTJmMWY2ODY4NjAyZTA1YTk5ODJjYjNjYzcyODY4MjY4YzViMDc5OGNmYzk5OTM1NTA0MjQzOTU4MWY4MmE4NTUxNGNiMzIyZjQxZGFkYWQ2OWI5MTE5NjgyNzcwZmE0NTdjZWZkNTI3YWE1OThhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjODRkMDc2ZTBhNDE5ZmM4NjM3YWIzOGYyNDQzMzhjNDc2YzUwMTMyY2ZlMDkwMDJkZGRjYmJmY2QzNjViZjZjZjNkMzJiMDlkYTMyNTI1Zjc1YjYwZjVmYzY2MGRkYzBlMDhmMzZhNjA3YmEwNzdmNTk5YmM1NWYyOWVjYjM2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby90cmFtcG9saW5lLXYxLjAuNSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vdHJhbXBvbGluZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby90cmFtcG9saW5lLXYxLjAuNSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby90cmFtcG9saW5lLXYxLjAuNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTRlYWI5YWZmNzllMzJkNzRmY2U5ZmJiZDU4YmY4ZGNlZmQwNTY0ZGJiNGRiY2VkYTllYmFhYzU1ZjYxZTFlMzFkZWI1MTVhY2ZhNmNjNDM2Yzc2MTg2YmVjYTY4MzQ4ODFjZmEzZjUyYTdiOGJkNzZhNjliM2NkOTE2MmEyMjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhbXBvbGluZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhbXBvbGluZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZiYWUzYTZlYWFhOTM2ZTRiYWNiNzRhOWRkMzhlYzU4ZTg5NTdhMTJhNDA4OTc0ZTIzMzgyMmJmNjE3MTJmZjgzNjAwZjk4ZGU5MjdhNGQzYzQ0ZjQ4M2UxNmI2MDRmODE3NDQyZTAyN2QxN2RhOTViZjM2NjhlMDAzNDk2NDk2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby96aXAtdjEuMC4xMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vemlwIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3ppcC12MS4wLjExIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3ppcC12MS4wLjExIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZGZkYjdhZDg0M2E3MTg4OGI1NmFlNmZkYzMxZDQyMmUyNTEzMThkNjg5YTgxYmE2NmZiM2Q1MzQxZDAxODMzODljNWFlODhkNmViMDY4YzE0MDQ4ZDU3NDM0OTE3NzlkNTM0OTA3NDFhYWQyOTFiOWRmY2EwYmZiYmE2ODI4MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9idWZmZXItcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9idWZmZXItcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWVmOTU0ZWFjMjBjNWUxOWMyZjZkMTgzM2MyYjUzYmQzYzNmYzEwMDQwMDg3ZTdiYzdkNjRhMmIzZmM1OTMzNWM2MmRlYzFkZDhjMGNjZGIwMjVlZmRiYWM5MWIzNDdlNDNmMmIzMjRlM2Q5MTU2ZTY3YmFlZDE3YTE0M2RmMzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFlNzk2OGFjNmViODVhNWYwNWM4YzZlNGQ2MmZmNjRhNjhhYzk0NDUyOTI3ZDNjYWRlYmRhMTdkMDNhOTUxZmYxOTM3YTJmNTc0M2IxNWU2OWE0NTU0Mzk4MmUxN2M5YTgxYmYzNGMzY2FlMjYzNTNjYzFjYmJmNDMxMjU3NzJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXByZXNzaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb21wcmVzc2lvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRmNmUyMzllNjRhZTZkOTYzYjIwOGM4OWVmNzllY2NhYzhjNWE2NjMzNDg3Y2JmNjU4M2Q2ZjY0N2ZhOWYzZWE0NWU1OWFmNGQ4NGNmZThlYWU3OWJkN2QxMjJjYmMyYzI3MDhlNjI5MDI2NzkxMjZiZjIyMWViNmRlZGZlZTc0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NyYzMyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jcmMzMi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc5Yjc0MTdkYThkZTZhNjMxODIwMmFlNjNkZWNkMjllNjAyM2M5ZjVmZmUxN2QxZjJmZTFhMDYwZmVkOWZjMTg4ZWIwOWNhN2Y1ZGUwOTU4YTczMWY0YTQyYzg2OTYzZmE4OTFlMmE2YTZhNDJkMmU3MDYxZGUyODQ2YzVkZGJjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Zvcm1hdC1yZWFkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Zvcm1hdC1yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTUxZDU5ZmE3YWQ5NGMyNGFmOWMxMGRkNGQzNjEzM2I2NTM1Y2FjMjJiMjdjYjliYmIyNjE3YWE5ZTAyZTllN2ZmOGExOTI4NzEyZWE4Mzc5YzMyOGQyNzk5YmQ5MDRlMmMwZGY5YzljNWEyZjUyOWRmOTY4ZDU1NWNkOGIzNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtd3JpdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTM3NDgzYzA4ODE2OWRlOWFjZGRkOWFmMTBmNWJjNGJlMGIzNThiNGNkODQzZWM3MTc5YWJjMzAwMmFkMGEyZDg5NDY4ZmVmOWI1M2EzODdiMDdlMTVmNWJkODQzMDEyZGJkZjgzZjA5Y2M5Y2RjYTA1OWRhNWMwOTI1NTNhZjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOGIyMzdhZDFjYmJiNWY5MDI0OWM2ZDk0OWM1ZjRkYjBmZTAyZmU5MWZhY2U3YjY3ZmFkOWNlN2YyZjZlN2M0ODE2Y2MwZGE4NGNlNmJhNTg5ZGRjNTFhMTBkNTkzYjk1MGJmNzIzZTgwZTVkZWE3NmEyYWJiMjExNzAxZWI5MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zaWduYXR1cmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NpZ25hdHVyZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJkYWVkMGY0YWIxYjE1Yzk4MTY0YjE0ZmRhMzVhMmY5NzA2NDdmNzUzZTAxOWY3MTBiZjVkZGU5NWZlNDQ5M2IzZmYxMTE5Y2YxZGY0NDUzN2RjMTU0M2RkN2I0MmU2NzBiNGEwNWEzNWFiMGY1MjhkYzY2MDRjMWYxZDNiODg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQxMDkyOWZlYWRkNjBhNmFiMjI1NTFlZDQ5YjA3ZWVmM2Y2MDc0OGU4NjIxMGUwMDU1NTUxZGI0OWFhZTI3NWI4MjcyNzQxNTFmOWI4ZDg2MWJlNjk0NmZiY2QyNzllYmEwNWViMjBlZDIzYzE2OGNhNjZkZjk5NWViMGVkM2UiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAAAfWxQ12QQAANkEAAAvAAAAQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjIuMi9zcmMvdmF0LXNwYXduZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vaW1wb3J0LWJ1bmRsZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJidWlsZFJvb3RPYmplY3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpbXBvcnRCdW5kbGUsRmFyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vaW1wb3J0LWJ1bmRsZVwiLCBbW1wiaW1wb3J0QnVuZGxlXCIsWyRozY9fYSA9PiAoaW1wb3J0QnVuZGxlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVpbGRSb290T2JqZWN0LCduYW1lJyx7dmFsdWU6XCJidWlsZFJvb3RPYmplY3RcIn0pOyRozY9fb25jZS5idWlsZFJvb3RPYmplY3QoYnVpbGRSb290T2JqZWN0KTtcblxuXG5cblxuY29uc3QgZW5kb3dtZW50cyA9IHtcbiAgVmF0RGF0YSxcbiAgY29uc29sZSxcbiAgLy9cbiAgYXNzZXJ0OiBnbG9iYWxUaGlzLmFzc2VydCxcbiAgQmFzZTY0OiBnbG9iYWxUaGlzLkJhc2U2NCwgLy9cbiAgVVJMOiBnbG9iYWxUaGlzLlVSTCAgLy9cbn07XG5cbiAgICAgICBmdW5jdGlvbiBidWlsZFJvb3RPYmplY3QoKSB7XG4gIHJldHVybiBGYXIoJ3Jvb3QnLCB7XG4gICAgYXN5bmMgbG9hZEJ1bmRsZShidW5kbGUpIHtcbiAgICAgIGNvbnN0IG5zID0gYXdhaXQgaW1wb3J0QnVuZGxlKGJ1bmRsZSwgeyBlbmRvd21lbnRzIH0pO1xuICAgICAgY29uc3Qgc3RhcnRGbiA9IG5zLmRlZmF1bHQ7XG4gICAgICByZXR1cm4gRmFyKCdzcGF3bmVkIGJ1bmRsZScsIHtcbiAgICAgICAgYXN5bmMgc3RhcnQoYXJnc1ApIHtcbiAgICAgICAgICBjb25zdCBhcmdzID0gYXdhaXQgYXJnc1A7XG4gICAgICAgICAgcmV0dXJuIHN0YXJ0Rm4oYXJncyk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJ1aWxkUm9vdE9iamVjdCI6WyJidWlsZFJvb3RPYmplY3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAONScZ3UCAAB1AgAAHAAAAEBlbmRvL2Jhc2U2NC12MS4wLjEyL2F0b2IuanN7ImltcG9ydHMiOlsiLi9kZWNvZGUuanMiXSwiZXhwb3J0cyI6WyJhdG9iIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZGVjb2RlQmFzZTY0OyRozY9faW1wb3J0cyhbW1wiLi9kZWNvZGUuanNcIiwgW1tcImRlY29kZUJhc2U2NFwiLFskaM2PX2EgPT4gKGRlY29kZUJhc2U2NCA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXRvYiA9IGVuY29kZWREYXRhID0+IHtcbiAgY29uc3QgYnVmID0gZGVjb2RlQmFzZTY0KGVuY29kZWREYXRhKTtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnVmKTtcbn07JGjNj19vbmNlLmF0b2IoYXRvYik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhdG9iIjpbImF0b2IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAksKTjzQDAAA0AwAAHAAAAEBlbmRvL2Jhc2U2NC12MS4wLjEyL2J0b2EuanN7ImltcG9ydHMiOlsiLi9lbmNvZGUuanMiXSwiZXhwb3J0cyI6WyJidG9hIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZW5jb2RlQmFzZTY0OyRozY9faW1wb3J0cyhbW1wiLi9lbmNvZGUuanNcIiwgW1tcImVuY29kZUJhc2U2NFwiLFskaM2PX2EgPT4gKGVuY29kZUJhc2U2NCA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYnRvYSA9IHN0cmluZ1RvRW5jb2RlID0+IHtcbiAgY29uc3QgYnl0ZXMgPSBzdHJpbmdUb0VuY29kZS5zcGxpdCgnJykubWFwKGNoYXIgPT4ge1xuICAgIGNvbnN0IGIgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKGIgPiAweGZmKSB7XG4gICAgICB0aHJvdyBFcnJvcihgYnRvYTogY2hhcmFjdGVyIG91dCBvZiByYW5nZTogJHtjaGFyfWApO1xuICAgIH1cbiAgICByZXR1cm4gYjtcbiAgfSk7XG4gIGNvbnN0IGJ1ZiA9IG5ldyBVaW50OEFycmF5KGJ5dGVzKTtcbiAgcmV0dXJuIGVuY29kZUJhc2U2NChidWYpO1xufTskaM2PX29uY2UuYnRvYShidG9hKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJ0b2EiOlsiYnRvYSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAEe3Z/uQEAALkBAAAeAAAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2RlY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2RlY29kZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2RlY29kZS5qcyI6W1siZGVjb2RlQmFzZTY0IiwiZGVjb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAChVqVIuQEAALkBAAAeAAAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZS5qcyI6W1siZW5jb2RlQmFzZTY0IiwiZW5jb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAa++pXpAIAAKQCAAAdAAAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW5jb2RlLmpzIiwiLi9zcmMvZGVjb2RlLmpzIiwiLi9idG9hLmpzIiwiLi9hdG9iLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZW5jb2RlLmpzXCIsIFtdXSxbXCIuL3NyYy9kZWNvZGUuanNcIiwgW11dLFtcIi4vYnRvYS5qc1wiLCBbXV0sW1wiLi9hdG9iLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZW5jb2RlLmpzIjpbWyJlbmNvZGVCYXNlNjQiLCJlbmNvZGVCYXNlNjQiXV0sIi4vc3JjL2RlY29kZS5qcyI6W1siZGVjb2RlQmFzZTY0IiwiZGVjb2RlQmFzZTY0Il1dLCIuL2J0b2EuanMiOltbImJ0b2EiLCJidG9hIl1dLCIuL2F0b2IuanMiOltbImF0b2IiLCJhdG9iIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACTp2PAaAMAAGgDAAAiAAAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvc3JjL2NvbW1vbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYWxwaGFiZXQ2NCIsIm1vbm9kdTY0IiwicGFkZGluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuXG5jb25zdCB7IGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4gICAgICAgY29uc3QgcGFkZGluZyA9ICc9JzskaM2PX29uY2UucGFkZGluZyhwYWRkaW5nKTtcblxuICAgICAgIGNvbnN0IGFscGhhYmV0NjQgPVxuICAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyc7XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLmFscGhhYmV0NjQoYWxwaGFiZXQ2NCk7XG4gICAgICAgY29uc3QgbW9ub2R1NjQgPSB7fTskaM2PX29uY2UubW9ub2R1NjQobW9ub2R1NjQpO1xuZm9yIChsZXQgaSA9IDA7IGkgPCBhbHBoYWJldDY0Lmxlbmd0aDsgaSArPSAxKSB7XG4gIGNvbnN0IGMgPSBhbHBoYWJldDY0W2ldO1xuICBtb25vZHU2NFtjXSA9IGk7XG59XG5mcmVlemUobW9ub2R1NjQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFkZGluZyI6WyJwYWRkaW5nIl0sImFscGhhYmV0NjQiOlsiYWxwaGFiZXQ2NCJdLCJtb25vZHU2NCI6WyJtb25vZHU2NCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADywE7BkggAAJIIAAAiAAAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvc3JjL2RlY29kZS5qc3siaW1wb3J0cyI6WyIuL2NvbW1vbi5qcyJdLCJleHBvcnRzIjpbImRlY29kZUJhc2U2NCIsImpzRGVjb2RlQmFzZTY0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbW9ub2R1NjQscGFkZGluZzskaM2PX2ltcG9ydHMoW1tcIi4vY29tbW9uLmpzXCIsIFtbXCJtb25vZHU2NFwiLFskaM2PX2EgPT4gKG1vbm9kdTY0ID0gJGjNj19hKV1dLFtcInBhZGRpbmdcIixbJGjNj19hID0+IChwYWRkaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QganNEZWNvZGVCYXNlNjQgPSAoc3RyaW5nLCBuYW1lID0gJzx1bmtub3duPicpID0+IHtcbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KE1hdGguY2VpbCgoc3RyaW5nLmxlbmd0aCAqIDQpIC8gMykpO1xuICBsZXQgcmVnaXN0ZXIgPSAwO1xuICBsZXQgcXVhbnR1bSA9IDA7XG4gIGxldCBpID0gMDsgLy9cbiAgbGV0IGogPSAwOyAvL1xuXG4gIHdoaWxlIChpIDwgc3RyaW5nLmxlbmd0aCAmJiBzdHJpbmdbaV0gIT09IHBhZGRpbmcpIHtcbiAgICBjb25zdCBudW1iZXIgPSBtb25vZHU2NFtzdHJpbmdbaV1dO1xuICAgIGlmIChudW1iZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgYmFzZTY0IGNoYXJhY3RlciAke3N0cmluZ1tpXX0gaW4gc3RyaW5nICR7bmFtZX1gKTtcbiAgICB9XG4gICAgcmVnaXN0ZXIgPSAocmVnaXN0ZXIgPDwgNikgfCBudW1iZXI7XG4gICAgcXVhbnR1bSArPSA2O1xuICAgIGlmIChxdWFudHVtID49IDgpIHtcbiAgICAgIHF1YW50dW0gLT0gODtcbiAgICAgIGRhdGFbal0gPSByZWdpc3RlciA+Pj4gcXVhbnR1bTtcbiAgICAgIGogKz0gMTtcbiAgICAgIHJlZ2lzdGVyICY9ICgxIDw8IHF1YW50dW0pIC0gMTtcbiAgICB9XG4gICAgaSArPSAxO1xuICB9XG5cbiAgd2hpbGUgKHF1YW50dW0gPiAwKSB7XG4gICAgaWYgKGkgPT09IHN0cmluZy5sZW5ndGggfHwgc3RyaW5nW2ldICE9PSBwYWRkaW5nKSB7XG4gICAgICB0aHJvdyBFcnJvcihgTWlzc2luZyBwYWRkaW5nIGF0IG9mZnNldCAke2l9IG9mIHN0cmluZyAke25hbWV9YCk7XG4gICAgfVxuICAgIC8vXG4gICAgLy9cbiAgICBpICs9IDE7XG4gICAgcXVhbnR1bSAtPSAyO1xuICB9XG5cbiAgaWYgKGkgPCBzdHJpbmcubGVuZ3RoKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgQmFzZTY0IHN0cmluZyBoYXMgdHJhaWxpbmcgZ2FyYmFnZSAke3N0cmluZy5zdWJzdHIoXG4gICAgICAgIGksXG4gICAgICApfSBpbiBzdHJpbmcgJHtuYW1lfWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBkYXRhLnN1YmFycmF5KDAsIGopO1xufTtcblxuLy9cbi8vXG4kaM2PX29uY2UuanNEZWNvZGVCYXNlNjQoanNEZWNvZGVCYXNlNjQpO2NvbnN0IGFkYXB0RGVjb2Rlcj1cbiAgbmF0aXZlRGVjb2RlQmFzZTY0ID0+XG4gICguLi5hcmdzKSA9PiB7XG4gICAgY29uc3QgZGVjb2RlZCA9IG5hdGl2ZURlY29kZUJhc2U2NCguLi5hcmdzKTtcbiAgICBpZiAoZGVjb2RlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoZGVjb2RlZCk7XG4gIH07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IGRlY29kZUJhc2U2NCA9XG4gIGdsb2JhbFRoaXMuQmFzZTY0ICE9PSB1bmRlZmluZWRcbiAgICA/IGFkYXB0RGVjb2RlcihnbG9iYWxUaGlzLkJhc2U2NC5kZWNvZGUpXG4gICAgOiBqc0RlY29kZUJhc2U2NDskaM2PX29uY2UuZGVjb2RlQmFzZTY0KGRlY29kZUJhc2U2NCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJqc0RlY29kZUJhc2U2NCI6WyJqc0RlY29kZUJhc2U2NCJdLCJkZWNvZGVCYXNlNjQiOlsiZGVjb2RlQmFzZTY0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI8TQzdrBwAAawcAACIAAABAZW5kby9iYXNlNjQtdjEuMC4xMi9zcmMvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vY29tbW9uLmpzIl0sImV4cG9ydHMiOlsiZW5jb2RlQmFzZTY0IiwianNFbmNvZGVCYXNlNjQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhbHBoYWJldDY0LHBhZGRpbmc7JGjNj19pbXBvcnRzKFtbXCIuL2NvbW1vbi5qc1wiLCBbW1wiYWxwaGFiZXQ2NFwiLFskaM2PX2EgPT4gKGFscGhhYmV0NjQgPSAkaM2PX2EpXV0sW1wicGFkZGluZ1wiLFskaM2PX2EgPT4gKHBhZGRpbmcgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGpzRW5jb2RlQmFzZTY0ID0gZGF0YSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGxldCBzdHJpbmcgPSAnJztcbiAgbGV0IHJlZ2lzdGVyID0gMDtcbiAgbGV0IHF1YW50dW0gPSAwO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGIgPSBkYXRhW2ldO1xuICAgIHJlZ2lzdGVyID0gKHJlZ2lzdGVyIDw8IDgpIHwgYjtcbiAgICBxdWFudHVtICs9IDg7XG4gICAgaWYgKHF1YW50dW0gPT09IDI0KSB7XG4gICAgICBzdHJpbmcgKz1cbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDE4KSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDEyKSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDYpICYgMHgzZl0gK1xuICAgICAgICBhbHBoYWJldDY0WyhyZWdpc3RlciA+Pj4gMCkgJiAweDNmXTtcbiAgICAgIHJlZ2lzdGVyID0gMDtcbiAgICAgIHF1YW50dW0gPSAwO1xuICAgIH1cbiAgfVxuXG4gIHN3aXRjaCAocXVhbnR1bSkge1xuICAgIGNhc2UgMDpcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgODpcbiAgICAgIHN0cmluZyArPVxuICAgICAgICBhbHBoYWJldDY0WyhyZWdpc3RlciA+Pj4gMikgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyIDw8IDQpICYgMHgzZl0gK1xuICAgICAgICBwYWRkaW5nICtcbiAgICAgICAgcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgMTY6XG4gICAgICBzdHJpbmcgKz1cbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDEwKSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDQpICYgMHgzZl0gK1xuICAgICAgICBhbHBoYWJldDY0WyhyZWdpc3RlciA8PCAyKSAmIDB4M2ZdICtcbiAgICAgICAgcGFkZGluZztcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBFcnJvcihgaW50ZXJuYWw6IGJhZCBxdWFudHVtICR7cXVhbnR1bX1gKTtcbiAgfVxuICByZXR1cm4gc3RyaW5nO1xufTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmpzRW5jb2RlQmFzZTY0KGpzRW5jb2RlQmFzZTY0KTtcbiAgICAgICBjb25zdCBlbmNvZGVCYXNlNjQgPVxuICBnbG9iYWxUaGlzLkJhc2U2NCAhPT0gdW5kZWZpbmVkID8gZ2xvYmFsVGhpcy5CYXNlNjQuZW5jb2RlIDoganNFbmNvZGVCYXNlNjQ7JGjNj19vbmNlLmVuY29kZUJhc2U2NChlbmNvZGVCYXNlNjQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsianNFbmNvZGVCYXNlNjQiOlsianNFbmNvZGVCYXNlNjQiXSwiZW5jb2RlQmFzZTY0IjpbImVuY29kZUJhc2U2NCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADUTf83SgIAAEoCAAAlAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvaWRlbnQtY2hlY2tlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaWRlbnRDaGVja2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vL1xuLy9cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpZGVudENoZWNrZXIgPSAoY29uZCwgX2RldGFpbHMpID0+IGNvbmQ7JGjNj19vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZGVudENoZWNrZXIiOlsiaWRlbnRDaGVja2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH9VFLM0AwAANAMAACIAAABAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWFwLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJvYmplY3RNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Y29uc3QgeyBlbnRyaWVzLCBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBvYmplY3RNYXAgPSAob3JpZ2luYWwsIG1hcEZuKSA9PiB7XG4gIGNvbnN0IGVudHMgPSBlbnRyaWVzKG9yaWdpbmFsKTtcbiAgY29uc3QgbWFwRW50cyA9IGVudHMubWFwKFxuICAgIChbaywgdl0pID0+IC8qICAgICAgICAgICAgICAgICAgICAgICAqLyAoW2ssIG1hcEZuKHYsIGspXSksXG4gICk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSkpO1xufTskaM2PX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im9iamVjdE1hcCI6WyJvYmplY3RNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtwVrcH0CAAB9AgAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvaW1wb3J0LWFyY2hpdmUuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMtZXh0ZXJuYWwuanMiLCIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyJdLCJleHBvcnRzIjpbImxvYWRBcmNoaXZlIiwibG9hZEFyY2hpdmUiXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLWV4dGVybmFsLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLWV4dGVybmFsLmpzXCIsIFtdXSxbXCIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIjpbWyJwYXJzZUFyY2hpdmUiLCJwYXJzZUFyY2hpdmUiXSxbImxvYWRBcmNoaXZlIiwibG9hZEFyY2hpdmUiXSxbImltcG9ydEFyY2hpdmUiLCJpbXBvcnRBcmNoaXZlIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABa1sANICoAACAqAAA2AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvY29tcGFydG1lbnQtbWFwLmpzeyJpbXBvcnRzIjpbIi4vcG9saWN5LWZvcm1hdC5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvbXBhcnRtZW50TWFwIiwic3RyaW5nQ29tcGFyZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydFBhY2thZ2VQb2xpY3k7JGjNj19pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcImFzc2VydFBhY2thZ2VQb2xpY3lcIixbJGjNj19hID0+IChhc3NlcnRQYWNrYWdlUG9saWN5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuICAgICAgIGNvbnN0IHN0cmluZ0NvbXBhcmUgPSAoYSwgYikgPT4gKGEgPT09IGIgPyAwIDogYSA8IGIgPyAtMSA6IDEpO1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5zdHJpbmdDb21wYXJlKHN0cmluZ0NvbXBhcmUpO1xuZnVuY3Rpb24qIGVudW1lcmF0ZShpdGVyYWJsZSkge1xuICBsZXQgaW5kZXggPSAwO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIGl0ZXJhYmxlKSB7XG4gICAgeWllbGQgW2luZGV4LCB2YWx1ZV07XG4gICAgaW5kZXggKz0gMTtcbiAgfVxufVxuXG4vKlxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0RW1wdHlPYmplY3QgPSAob2JqZWN0LCBtZXNzYWdlKSA9PiB7XG4gIGFzc2VydChPYmplY3Qua2V5cyhvYmplY3QpLmxlbmd0aCA9PT0gMCwgbWVzc2FnZSk7XG59O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29uZGl0aW9ucyA9IChjb25kaXRpb25zLCB1cmwpID0+IHtcbiAgaWYgKGNvbmRpdGlvbnMgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICBhc3NlcnQoXG4gICAgQXJyYXkuaXNBcnJheShjb25kaXRpb25zKSxcbiAgICBgY29uZGl0aW9ucyBtdXN0IGJlIGFuIGFycmF5LCBnb3QgJHtjb25kaXRpb25zfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBmb3IgKGNvbnN0IFtpbmRleCwgdmFsdWVdIG9mIGVudW1lcmF0ZShjb25kaXRpb25zKSkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICB2YWx1ZSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYGNvbmRpdGlvbnNbJHtpbmRleH1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydENvbXBhcnRtZW50TW9kdWxlID0gKGFsbGVnZWRNb2R1bGUsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCB7IGNvbXBhcnRtZW50LCBtb2R1bGUsIHJldGFpbmVkLCAuLi5leHRyYSB9ID0gYWxsZWdlZE1vZHVsZTtcbiAgYXNzZXJ0RW1wdHlPYmplY3QoXG4gICAgZXh0cmEsXG4gICAgYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKHtcbiAgICAgIGV4dHJhLFxuICAgICAgY29tcGFydG1lbnQsXG4gICAgfSl9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgY29tcGFydG1lbnQsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0uY29tcGFydG1lbnQgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShjb21wYXJ0bWVudCl9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbW9kdWxlLFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9Lm1vZHVsZSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKG1vZHVsZSl9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGlmIChyZXRhaW5lZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHJldGFpbmVkLFxuICAgICAgJ2Jvb2xlYW4nLFxuICAgICAgYCR7cGF0aH0ucmV0YWluZWQgbXVzdCBiZSBhIGJvb2xlYW4sIGdvdCAke3EocmV0YWluZWQpfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydEZpbGVNb2R1bGUgPSAoYWxsZWdlZE1vZHVsZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHsgbG9jYXRpb24sIHBhcnNlciwgc2hhNTEyLCAuLi5leHRyYSB9ID0gYWxsZWdlZE1vZHVsZTtcbiAgYXNzZXJ0RW1wdHlPYmplY3QoXG4gICAgZXh0cmEsXG4gICAgYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbG9jYXRpb24sXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ubG9jYXRpb24gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShsb2NhdGlvbil9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgcGFyc2VyLFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LnBhcnNlciBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKHBhcnNlcil9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgaWYgKHNoYTUxMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHNoYTUxMixcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYCR7cGF0aH0uc2hhNTEyIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3Eoc2hhNTEyKX0gaW4gJHtxKHVybCl9YCxcbiAgICApO1xuICB9XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRFeGl0TW9kdWxlID0gKGFsbGVnZWRNb2R1bGUsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCB7IGV4aXQsIC4uLmV4dHJhIH0gPSBhbGxlZ2VkTW9kdWxlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBleGl0LFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LmV4aXQgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShleGl0KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydE1vZHVsZSA9IChhbGxlZ2VkTW9kdWxlLCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3QgbW9kdWxlRGVzY3JpcHRvciA9IE9iamVjdChhbGxlZ2VkTW9kdWxlKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRNb2R1bGUgPT09IG1vZHVsZURlc2NyaXB0b3IgJiYgIUFycmF5LmlzQXJyYXkobW9kdWxlRGVzY3JpcHRvciksXG4gICAgYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRNb2R1bGV9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgY29uc3QgeyBjb21wYXJ0bWVudCwgbW9kdWxlLCBsb2NhdGlvbiwgcGFyc2VyLCBleGl0LCBkZWZlcnJlZEVycm9yIH0gPVxuICAgIG1vZHVsZURlc2NyaXB0b3I7XG4gIGlmIChjb21wYXJ0bWVudCAhPT0gdW5kZWZpbmVkIHx8IG1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0Q29tcGFydG1lbnRNb2R1bGUobW9kdWxlRGVzY3JpcHRvciwgcGF0aCwgdXJsKTtcbiAgfSBlbHNlIGlmIChsb2NhdGlvbiAhPT0gdW5kZWZpbmVkIHx8IHBhcnNlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0RmlsZU1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLCBwYXRoLCB1cmwpO1xuICB9IGVsc2UgaWYgKGV4aXQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydEV4aXRNb2R1bGUobW9kdWxlRGVzY3JpcHRvciwgcGF0aCwgdXJsKTtcbiAgfSBlbHNlIGlmIChkZWZlcnJlZEVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgZGVmZXJyZWRFcnJvcixcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYCR7cGF0aH0uZGVmZXJyZWRFcnJvciBtdXN0IGJlIGEgc3RyaW5nIGNvbnRhaWluZyBhbiBlcnJvciBtZXNzYWdlYCxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0gaXMgbm90IGEgdmFsaWQgbW9kdWxlIGRlc2NyaXB0b3IsIGdvdCAke3EoYWxsZWdlZE1vZHVsZSl9IGluICR7cShcbiAgICAgICAgdXJsLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydE1vZHVsZXMgPSAoYWxsZWdlZE1vZHVsZXMsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCBtb2R1bGVzID0gT2JqZWN0KGFsbGVnZWRNb2R1bGVzKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRNb2R1bGVzID09PSBtb2R1bGVzIHx8ICFBcnJheS5pc0FycmF5KG1vZHVsZXMpLFxuICAgIGBtb2R1bGVzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRNb2R1bGVzKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobW9kdWxlcykpIHtcbiAgICBhc3NlcnRNb2R1bGUodmFsdWUsIGAke3BhdGh9Lm1vZHVsZXNbJHtxKGtleSl9XWAsIHVybCk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFBhcnNlcnMgPSAoYWxsZWdlZFBhcnNlcnMsIHBhdGgsIHVybCkgPT4ge1xuICBpZiAoYWxsZWdlZFBhcnNlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwYXJzZXJzID0gT2JqZWN0KGFsbGVnZWRQYXJzZXJzKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRQYXJzZXJzID09PSBwYXJzZXJzICYmICFBcnJheS5pc0FycmF5KHBhcnNlcnMpLFxuICAgIGAke3BhdGh9LnBhcnNlcnMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQYXJzZXJzfSBpbiAke3EodXJsKX1gLFxuICApO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHBhcnNlcnMpKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIGtleSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYGFsbCBrZXlzIG9mICR7cGF0aH0ucGFyc2VycyBtdXN0IGJlIHN0cmluZ3MsIGdvdCAke2tleX0gaW4gJHtxKHVybCl9YCxcbiAgICApO1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICB2YWx1ZSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYCR7cGF0aH0ucGFyc2Vyc1ske3Eoa2V5KX1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFNjb3BlID0gKGFsbGVnZWRTY29wZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHNjb3BlID0gT2JqZWN0KGFsbGVnZWRTY29wZSk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkU2NvcGUgPT09IHNjb3BlICYmICFBcnJheS5pc0FycmF5KHNjb3BlKSxcbiAgICBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFNjb3BlfSBpbiAke3EodXJsKX1gLFxuICApO1xuXG4gIGNvbnN0IHsgY29tcGFydG1lbnQsIC4uLmV4dHJhIH0gPSBzY29wZTtcbiAgYXNzZXJ0RW1wdHlPYmplY3QoXG4gICAgZXh0cmEsXG4gICAgYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBjb21wYXJ0bWVudCxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGNvbXBhcnRtZW50KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFNjb3BlcyA9IChhbGxlZ2VkU2NvcGVzLCBwYXRoLCB1cmwpID0+IHtcbiAgaWYgKGFsbGVnZWRTY29wZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBzY29wZXMgPSBPYmplY3QoYWxsZWdlZFNjb3Blcyk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkU2NvcGVzID09PSBzY29wZXMgJiYgIUFycmF5LmlzQXJyYXkoc2NvcGVzKSxcbiAgICBgJHtwYXRofS5zY29wZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZFNjb3Blcyl9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2NvcGVzKSkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBrZXksXG4gICAgICAnc3RyaW5nJyxcbiAgICAgIGBhbGwga2V5cyBvZiAke3BhdGh9LnNjb3BlcyBtdXN0IGJlIHN0cmluZ3MsIGdvdCAke2tleX0gaW4gJHtxKHVybCl9YCxcbiAgICApO1xuICAgIGFzc2VydFNjb3BlKHZhbHVlLCBgJHtwYXRofS5zY29wZXNbJHtxKGtleSl9XWAsIHVybCk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFR5cGVzID0gKGFsbGVnZWRUeXBlcywgcGF0aCwgdXJsKSA9PiB7XG4gIGlmIChhbGxlZ2VkVHlwZXMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCB0eXBlcyA9IE9iamVjdChhbGxlZ2VkVHlwZXMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZFR5cGVzID09PSB0eXBlcyAmJiAhQXJyYXkuaXNBcnJheSh0eXBlcyksXG4gICAgYCR7cGF0aH0udHlwZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRUeXBlc30gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0eXBlcykpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAga2V5LFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgYWxsIGtleXMgb2YgJHtwYXRofS50eXBlcyBtdXN0IGJlIHN0cmluZ3MsIGdvdCAke2tleX0gaW4gJHtxKHVybCl9YCxcbiAgICApO1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICB2YWx1ZSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYCR7cGF0aH0udHlwZXNbJHtxKGtleSl9XSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCxcbiAgICApO1xuICB9XG59O1xuXG4vKlxuXG5cblxuICovXG5cbmNvbnN0IGFzc2VydFBvbGljeSA9IChcbiAgYWxsZWdlZFBvbGljeSxcbiAgcGF0aCxcbiAgdXJsID0gJzx1bmtub3duLWNvbXBhcnRtZW50LW1hcC5qc29uPicsXG4pID0+IHtcbiAgYXNzZXJ0UGFja2FnZVBvbGljeShhbGxlZ2VkUG9saWN5LCBgJHtwYXRofS5wb2xpY3lgLCB1cmwpO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnQgPSAoYWxsZWdlZENvbXBhcnRtZW50LCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3QgY29tcGFydG1lbnQgPSBPYmplY3QoYWxsZWdlZENvbXBhcnRtZW50KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRDb21wYXJ0bWVudCA9PT0gY29tcGFydG1lbnQgJiYgIUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnQpLFxuICAgIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnR9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgY29uc3Qge1xuICAgIGxvY2F0aW9uLFxuICAgIG5hbWUsXG4gICAgbGFiZWwsXG4gICAgcGFyc2VycyxcbiAgICB0eXBlcyxcbiAgICBzY29wZXMsXG4gICAgbW9kdWxlcyxcbiAgICBwb2xpY3ksXG4gICAgLi4uZXh0cmFcbiAgfSA9IGNvbXBhcnRtZW50O1xuXG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuXG4gIGFzc2VydC50eXBlb2YoXG4gICAgbG9jYXRpb24sXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ubG9jYXRpb24gaW4gJHtxKHVybCl9IG11c3QgYmUgc3RyaW5nLCBnb3QgJHtxKGxvY2F0aW9uKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIG5hbWUsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ubmFtZSBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobmFtZSl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBsYWJlbCxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5sYWJlbCBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobGFiZWwpfWAsXG4gICk7XG5cbiAgYXNzZXJ0TW9kdWxlcyhtb2R1bGVzLCBwYXRoLCB1cmwpO1xuICBhc3NlcnRQYXJzZXJzKHBhcnNlcnMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFNjb3BlcyhzY29wZXMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFR5cGVzKHR5cGVzLCBwYXRoLCB1cmwpO1xuICBhc3NlcnRQb2xpY3kocG9saWN5LCBwYXRoLCB1cmwpO1xufTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGFzc2VydENvbXBhcnRtZW50cyA9IChhbGxlZ2VkQ29tcGFydG1lbnRzLCB1cmwpID0+IHtcbiAgY29uc3QgY29tcGFydG1lbnRzID0gT2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudHMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZENvbXBhcnRtZW50cyA9PT0gY29tcGFydG1lbnRzIHx8ICFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50cyksXG4gICAgYGNvbXBhcnRtZW50cyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkQ29tcGFydG1lbnRzKX0gaW4gJHtxKFxuICAgICAgdXJsLFxuICAgICl9YCxcbiAgKTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoY29tcGFydG1lbnRzKSkge1xuICAgIGFzc2VydENvbXBhcnRtZW50KHZhbHVlLCBgY29tcGFydG1lbnRzWyR7cShrZXkpfV1gLCB1cmwpO1xuICB9XG59O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0RW50cnkgPSAoYWxsZWdlZEVudHJ5LCB1cmwpID0+IHtcbiAgY29uc3QgZW50cnkgPSBPYmplY3QoYWxsZWdlZEVudHJ5KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRFbnRyeSA9PT0gZW50cnkgJiYgIUFycmF5LmlzQXJyYXkoZW50cnkpLFxuICAgIGBcImVudHJ5XCIgbXVzdCBiZSBhbiBvYmplY3QgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHthbGxlZ2VkRW50cnl9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG4gIGNvbnN0IHsgY29tcGFydG1lbnQsIG1vZHVsZSwgLi4uZXh0cmEgfSA9IGVudHJ5O1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgXCJlbnRyeVwiIG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBjb21wYXJ0bWVudCxcbiAgICAnc3RyaW5nJyxcbiAgICBgZW50cnkuY29tcGFydG1lbnQgbXVzdCBiZSBhIHN0cmluZyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke2NvbXBhcnRtZW50fSBpbiAke3EoXG4gICAgICB1cmwsXG4gICAgKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIG1vZHVsZSxcbiAgICAnc3RyaW5nJyxcbiAgICBgZW50cnkubW9kdWxlIG11c3QgYmUgYSBzdHJpbmcgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHttb2R1bGV9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG59O1xuXG4vKlxuXG5cblxuICovXG5cbiAgICAgICBjb25zdCBhc3NlcnRDb21wYXJ0bWVudE1hcCA9IChcbiAgYWxsZWdlZENvbXBhcnRtZW50TWFwLFxuICB1cmwgPSAnPHVua25vd24tY29tcGFydG1lbnQtbWFwLmpzb24+JyxcbikgPT4ge1xuICBjb25zdCBjb21wYXJ0bWVudE1hcCA9IE9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnRNYXApO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZENvbXBhcnRtZW50TWFwID09PSBjb21wYXJ0bWVudE1hcCAmJiAhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudE1hcCksXG4gICAgYENvbXBhcnRtZW50IG1hcCBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZENvbXBhcnRtZW50TWFwfSBpbiAke3EoXG4gICAgICB1cmwsXG4gICAgKX1gLFxuICApO1xuICBjb25zdCB7XG4gICAgLy9cbiAgICAvL1xuICAgIHRhZ3M6IGNvbmRpdGlvbnMsXG4gICAgZW50cnksXG4gICAgY29tcGFydG1lbnRzLFxuICAgIC4uLmV4dHJhXG4gIH0gPSBPYmplY3QoY29tcGFydG1lbnRNYXApO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgQ29tcGFydG1lbnQgbWFwIG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBhc3NlcnRDb25kaXRpb25zKGNvbmRpdGlvbnMsIHVybCk7XG4gIGFzc2VydEVudHJ5KGVudHJ5LCB1cmwpO1xuICBhc3NlcnRDb21wYXJ0bWVudHMoY29tcGFydG1lbnRzLCB1cmwpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29tcGFydG1lbnRNYXAoYXNzZXJ0Q29tcGFydG1lbnRNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5nQ29tcGFyZSI6WyJzdHJpbmdDb21wYXJlIl0sImFzc2VydENvbXBhcnRtZW50TWFwIjpbImFzc2VydENvbXBhcnRtZW50TWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXX7gs6AwAAOgMAADAAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9leHRlbnNpb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInBhcnNlRXh0ZW5zaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBhcnNlRXh0ZW5zaW9uID0gbG9jYXRpb24gPT4ge1xuICBjb25zdCBsYXN0U2xhc2ggPSBsb2NhdGlvbi5sYXN0SW5kZXhPZignLycpO1xuICBpZiAobGFzdFNsYXNoIDwgMCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBiYXNlID0gbG9jYXRpb24uc2xpY2UobGFzdFNsYXNoICsgMSk7XG4gIGNvbnN0IGxhc3REb3QgPSBiYXNlLmxhc3RJbmRleE9mKCcuJyk7XG4gIGlmIChsYXN0RG90IDwgMCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICByZXR1cm4gYmFzZS5zbGljZShsYXN0RG90ICsgMSk7XG59OyRozY9fb25jZS5wYXJzZUV4dGVuc2lvbihwYXJzZUV4dGVuc2lvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUV4dGVuc2lvbiI6WyJwYXJzZUV4dGVuc2lvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACBGJrfsy0AALMtAAA6AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qc3siaW1wb3J0cyI6WyJAZW5kby96aXAiLCIuL2xpbmsuanMiLCIuL2pzb24uanMiLCIuL3Bvd2Vycy5qcyIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9jb21wYXJ0bWVudC1tYXAuanMiLCIuL2ltcG9ydC1ob29rLmpzIiwiLi9wb2xpY3kuanMiXSwiZXhwb3J0cyI6WyJpbXBvcnRBcmNoaXZlIiwibG9hZEFyY2hpdmUiLCJwYXJzZUFyY2hpdmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBaaXBSZWFkZXIsbGluayxwYXJzZUxvY2F0ZWRKc29uLHVucGFja1JlYWRQb3dlcnMsam9pbixhc3NlcnRDb21wYXJ0bWVudE1hcCxleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyLGF0dGVudWF0ZU1vZHVsZUhvb2ssZW5mb3JjZU1vZHVsZVBvbGljeTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3ppcFwiLCBbW1wiWmlwUmVhZGVyXCIsWyRozY9fYSA9PiAoWmlwUmVhZGVyID0gJGjNj19hKV1dXV0sW1wiLi9saW5rLmpzXCIsIFtbXCJsaW5rXCIsWyRozY9fYSA9PiAobGluayA9ICRozY9fYSldXV1dLFtcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLFskaM2PX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaM2PX2EpXV1dXSxbXCIuL3Bvd2Vycy5qc1wiLCBbW1widW5wYWNrUmVhZFBvd2Vyc1wiLFskaM2PX2EgPT4gKHVucGFja1JlYWRQb3dlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wiam9pblwiLFskaM2PX2EgPT4gKGpvaW4gPSAkaM2PX2EpXV1dXSxbXCIuL2NvbXBhcnRtZW50LW1hcC5qc1wiLCBbW1wiYXNzZXJ0Q29tcGFydG1lbnRNYXBcIixbJGjNj19hID0+IChhc3NlcnRDb21wYXJ0bWVudE1hcCA9ICRozY9fYSldXV1dLFtcIi4vaW1wb3J0LWhvb2suanNcIiwgW1tcImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXJcIixbJGjNj19hID0+IChleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyID0gJGjNj19hKV1dXV0sW1wiLi9wb2xpY3kuanNcIiwgW1tcImF0dGVudWF0ZU1vZHVsZUhvb2tcIixbJGjNj19hID0+IChhdHRlbnVhdGVNb2R1bGVIb29rID0gJGjNj19hKV1dLFtcImVuZm9yY2VNb2R1bGVQb2xpY3lcIixbJGjNj19hID0+IChlbmZvcmNlTW9kdWxlUG9saWN5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBGYWlsLCBxdW90ZTogcSB9ID0gYXNzZXJ0O1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG5jb25zdCB7IGFzc2lnbiwgY3JlYXRlLCBmcmVlemUgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IHBvc3Rwb25lRXJyb3JUb0V4ZWN1dGUgPSBlcnJvck1lc3NhZ2UgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuXG4gIGNvbnN0IHJlY29yZCA9IGZyZWV6ZSh7XG4gICAgaW1wb3J0czogW10sXG4gICAgZXhwb3J0czogW10sXG4gICAgZXhlY3V0ZTogKCkgPT4ge1xuICAgICAgdGhyb3cgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gcmVjb3JkO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIgPSAoXG4gIGdldCxcbiAgY29tcGFydG1lbnRzLFxuICBhcmNoaXZlTG9jYXRpb24sXG4gIHBhcnNlckZvckxhbmd1YWdlLFxuICBjb21wdXRlU2hhNTEyID0gdW5kZWZpbmVkLFxuICBjb21wdXRlU291cmNlTG9jYXRpb24gPSB1bmRlZmluZWQsXG4gIGV4aXRNb2R1bGVJbXBvcnRIb29rID0gdW5kZWZpbmVkLFxuICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24gPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1ha2VJbXBvcnRIb29rID0gKHtcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgcGFja2FnZU5hbWUsXG4gICAgYXR0ZW51YXRvcnNcbiAgICAvL1xuICAgIC8vXG4gIH0pID0+IHtcbiAgICAvL1xuICAgIGNvbnN0IGNvbXBhcnRtZW50RGVzY3JpcHRvciA9IGNvbXBhcnRtZW50c1twYWNrYWdlTG9jYXRpb25dO1xuICAgIGNvbnN0IHsgbW9kdWxlcyB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBpbXBvcnRIb29rID0gYXN5bmMgbW9kdWxlU3BlY2lmaWVyID0+IHtcbiAgICAgIGF3YWl0IG51bGw7XG4gICAgICAvL1xuICAgICAgY29uc3QgbW9kdWxlID0gbW9kdWxlc1ttb2R1bGVTcGVjaWZpZXJdO1xuICAgICAgaWYgKG1vZHVsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmIChleGl0TW9kdWxlSW1wb3J0SG9vaykge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLCBjb21wYXJ0bWVudERlc2NyaXB0b3IsIHtcbiAgICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgICBlcnJvckhpbnQ6IGBCbG9ja2VkIGluIGxvYWRpbmcuICR7cShcbiAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgKX0gd2FzIG5vdCBpbiB0aGUgYXJjaGl2ZSBhbmQgYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBsb2FkIGl0IGFzIGEgYnVpbHRpbmAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgZXhpdE1vZHVsZUltcG9ydEhvb2soXG4gICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocmVjb3JkKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICByZWNvcmQ6IGF3YWl0IGF0dGVudWF0ZU1vZHVsZUhvb2soXG4gICAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuICAgICAgICAgICAgICAgIGF0dGVudWF0b3JzLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBzcGVjaWZpZXI6IG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHJldHVybiBwb3N0cG9uZUVycm9yVG9FeGVjdXRlKFxuICAgICAgICAgICAgICBgQ2Fubm90IGZpbmQgZXh0ZXJuYWwgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbiAgICAgICAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICAgICl9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgZmluZCBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9IGluIHBhY2thZ2UgJHtxKFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICl9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2R1bGUuZGVmZXJyZWRFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBwb3N0cG9uZUVycm9yVG9FeGVjdXRlKG1vZHVsZS5kZWZlcnJlZEVycm9yKTtcbiAgICAgIH1cbiAgICAgIGlmIChtb2R1bGUucGFyc2VyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBwYXJzZSBtb2R1bGUgJHtxKG1vZHVsZVNwZWNpZmllcil9IGluIHBhY2thZ2UgJHtxKFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICl9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcnNlciA9IHBhcnNlckZvckxhbmd1YWdlW21vZHVsZS5wYXJzZXJdO1xuICAgICAgaWYgKHBhcnNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgcGFyc2UgJHtxKG1vZHVsZS5wYXJzZXIpfSBtb2R1bGUgJHtxKFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICl9IGluIHBhY2thZ2UgJHtxKHBhY2thZ2VMb2NhdGlvbil9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgcGFyc2UgfSA9IHBhcnNlcjtcbiAgICAgIGNvbnN0IG1vZHVsZUxvY2F0aW9uID0gYCR7cGFja2FnZUxvY2F0aW9ufS8ke21vZHVsZS5sb2NhdGlvbn1gO1xuICAgICAgY29uc3QgbW9kdWxlQnl0ZXMgPSBnZXQobW9kdWxlTG9jYXRpb24pO1xuXG4gICAgICBpZiAoY29tcHV0ZVNoYTUxMiAhPT0gdW5kZWZpbmVkICYmIG1vZHVsZS5zaGE1MTIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBzaGE1MTIgPSBjb21wdXRlU2hhNTEyKG1vZHVsZUJ5dGVzKTtcbiAgICAgICAgaWYgKHNoYTUxMiAhPT0gbW9kdWxlLnNoYTUxMikge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYE1vZHVsZSAke3EobW9kdWxlLmxvY2F0aW9uKX0gb2YgcGFja2FnZSAke3EoXG4gICAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICAgICl9IGluIGFyY2hpdmUgJHtxKFxuICAgICAgICAgICAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgICAgICAgICApfSBmYWlsZWQgYSBTSEEtNTEyIGludGVncml0eSBjaGVja2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBsZXQgc291cmNlTG9jYXRpb24gPSBgZmlsZTovLy8ke21vZHVsZUxvY2F0aW9ufWA7XG4gICAgICBpZiAocGFja2FnZU5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBiYXNlID0gcGFja2FnZU5hbWUuc3BsaXQoJy8nKS5zbGljZSgtMSkuam9pbignLycpO1xuICAgICAgICBzb3VyY2VMb2NhdGlvbiA9IGAuLi4vJHtqb2luKGJhc2UsIG1vZHVsZVNwZWNpZmllcil9YDtcbiAgICAgIH1cbiAgICAgIGlmIChjb21wdXRlU291cmNlTG9jYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBzb3VyY2VMb2NhdGlvbiA9XG4gICAgICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uKHBhY2thZ2VMb2NhdGlvbiwgbW9kdWxlU3BlY2lmaWVyKSB8fFxuICAgICAgICAgIHNvdXJjZUxvY2F0aW9uO1xuICAgICAgfVxuXG4gICAgICBsZXQgc291cmNlTWFwVXJsO1xuICAgICAgaWYgKFxuICAgICAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICBtb2R1bGUuc2hhNTEyICE9PSB1bmRlZmluZWRcbiAgICAgICkge1xuICAgICAgICBzb3VyY2VNYXBVcmwgPSBjb21wdXRlU291cmNlTWFwTG9jYXRpb24oe1xuICAgICAgICAgIGNvbXBhcnRtZW50OiBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgbW9kdWxlOiBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgbG9jYXRpb246IHNvdXJjZUxvY2F0aW9uLFxuICAgICAgICAgIHNoYTUxMjogbW9kdWxlLnNoYTUxMixcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vXG4gICAgICBjb25zdCB7IHJlY29yZCB9ID0gYXdhaXQgcGFyc2UoXG4gICAgICAgIG1vZHVsZUJ5dGVzLFxuICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgIHNvdXJjZUxvY2F0aW9uLFxuICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgIHtcbiAgICAgICAgICBzb3VyY2VNYXBVcmwsXG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybiB7IHJlY29yZCwgc3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIgfTtcbiAgICB9O1xuICAgIHJldHVybiBpbXBvcnRIb29rO1xuICB9O1xuICByZXR1cm4gbWFrZUltcG9ydEhvb2s7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwYXJzZUFyY2hpdmUgPSBhc3luYyAoXG4gIGFyY2hpdmVCeXRlcyxcbiAgYXJjaGl2ZUxvY2F0aW9uID0gJzx1bmtub3duPicsXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBhd2FpdCBudWxsO1xuICBjb25zdCB7XG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBleHBlY3RlZFNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBjb21wdXRlU291cmNlTG9jYXRpb24gPSB1bmRlZmluZWQsXG4gICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uID0gdW5kZWZpbmVkLFxuICAgIENvbXBhcnRtZW50OiBDb21wYXJ0bWVudFBhcnNlT3B0aW9uID0gQ29tcGFydG1lbnQsXG4gICAgbW9kdWxlcyA9IHVuZGVmaW5lZCxcbiAgICBpbXBvcnRIb29rOiBleGl0TW9kdWxlSW1wb3J0SG9vayA9IHVuZGVmaW5lZCxcbiAgICBwYXJzZXJGb3JMYW5ndWFnZTogcGFyc2VyRm9yTGFuZ3VhZ2VPcHRpb24gPSB7fSxcbiAgICBfX25hdGl2ZV9fID0gZmFsc2UsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHBhcnNlckZvckxhbmd1YWdlID0gZnJlZXplKFxuICAgIGFzc2lnbihjcmVhdGUobnVsbCksIHBhcnNlckZvckxhbmd1YWdlT3B0aW9uKSxcbiAgKTtcblxuICBjb25zdCBhcmNoaXZlID0gbmV3IFppcFJlYWRlcihhcmNoaXZlQnl0ZXMsIHsgbmFtZTogYXJjaGl2ZUxvY2F0aW9uIH0pO1xuXG4gIC8vXG4gIGNvbnN0IHVuc2VlbiA9IG5ldyBTZXQoYXJjaGl2ZS5maWxlcy5rZXlzKCkpO1xuICB1bnNlZW4uc2l6ZSA+PSAyIHx8XG4gICAgRmFpbGBBcmNoaXZlIGZhaWxlZCBzYW5pdHkgY2hlY2s6IHNob3VsZCBjb250YWluIGF0IGxlYXN0IGEgY29tcGFydG1lbnQgbWFwIGZpbGUgYW5kIG9uZSBtb2R1bGUgZmlsZSBpbiAke3EoXG4gICAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgKX1gO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGdldCA9IHBhdGggPT4ge1xuICAgIHVuc2Vlbi5kZWxldGUocGF0aCk7XG4gICAgcmV0dXJuIGFyY2hpdmUucmVhZChwYXRoKTtcbiAgfTtcblxuICBjb25zdCBjb21wYXJ0bWVudE1hcEJ5dGVzID0gZ2V0KCdjb21wYXJ0bWVudC1tYXAuanNvbicpO1xuXG4gIGxldCBzaGE1MTI7XG4gIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICBzaGE1MTIgPSBjb21wdXRlU2hhNTEyKGNvbXBhcnRtZW50TWFwQnl0ZXMpO1xuICB9XG4gIGlmIChleHBlY3RlZFNoYTUxMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHNoYTUxMiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYENhbm5vdCB2ZXJpZnkgZXhwZWN0ZWRTaGE1MTIgd2l0aG91dCBhbHNvIHByb3ZpZGluZyBjb21wdXRlU2hhNTEyLCBmb3IgYXJjaGl2ZSAke2FyY2hpdmVMb2NhdGlvbn1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHNoYTUxMiAhPT0gZXhwZWN0ZWRTaGE1MTIpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgQXJjaGl2ZSBjb21wYXJ0bWVudCBtYXAgZmFpbGVkIGEgU0hBLTUxMiBpbnRlZ3JpdHkgY2hlY2ssIGV4cGVjdGVkICR7ZXhwZWN0ZWRTaGE1MTJ9LCBnb3QgJHtzaGE1MTJ9LCBmb3IgYXJjaGl2ZSAke2FyY2hpdmVMb2NhdGlvbn1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgY29tcGFydG1lbnRNYXBUZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGNvbXBhcnRtZW50TWFwQnl0ZXMpO1xuICBjb25zdCBjb21wYXJ0bWVudE1hcCA9IHBhcnNlTG9jYXRlZEpzb24oXG4gICAgY29tcGFydG1lbnRNYXBUZXh0LFxuICAgICdjb21wYXJ0bWVudC1tYXAuanNvbicsXG4gICk7XG4gIGFzc2VydENvbXBhcnRtZW50TWFwKGNvbXBhcnRtZW50TWFwLCBhcmNoaXZlTG9jYXRpb24pO1xuXG4gIGNvbnN0IHtcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgZW50cnk6IHsgbW9kdWxlOiBlbnRyeU1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnQ6IGVudHJ5Q29tcGFydG1lbnROYW1lIH0sXG4gIH0gPSBjb21wYXJ0bWVudE1hcDtcblxuICBjb25zdCBjb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rID0gZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcih7XG4gICAgbW9kdWxlcyxcbiAgICBleGl0TW9kdWxlSW1wb3J0SG9vayxcbiAgICBlbnRyeUNvbXBhcnRtZW50TmFtZSxcbiAgfSk7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaWYgKGNvbXB1dGVTaGE1MTIgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG1ha2VJbXBvcnRIb29rID0gbWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIoXG4gICAgICBnZXQsXG4gICAgICBjb21wYXJ0bWVudHMsXG4gICAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIGNvbXB1dGVTaGE1MTIsXG4gICAgICBjb21wdXRlU291cmNlTG9jYXRpb24sXG4gICAgICBjb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rLFxuICAgICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uLFxuICAgICk7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB7IGNvbXBhcnRtZW50LCBwZW5kaW5nSm9ic1Byb21pc2UgfSA9IGxpbmsoY29tcGFydG1lbnRNYXAsIHtcbiAgICAgIG1ha2VJbXBvcnRIb29rLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBtb2R1bGVzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5rZXlzKG1vZHVsZXMgfHwge30pLm1hcChzcGVjaWZpZXIgPT4ge1xuICAgICAgICAgIHJldHVybiBbc3BlY2lmaWVyLCB7IG5hbWVzcGFjZToge30gfV07XG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgICAgIENvbXBhcnRtZW50OiBDb21wYXJ0bWVudFBhcnNlT3B0aW9uLFxuICAgICAgX19uYXRpdmVfXyxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlbmRpbmdKb2JzUHJvbWlzZTtcblxuICAgIGF3YWl0IGNvbXBhcnRtZW50LmxvYWQoZW50cnlNb2R1bGVTcGVjaWZpZXIpO1xuICAgIHVuc2Vlbi5zaXplID09PSAwIHx8XG4gICAgICBGYWlsYEFyY2hpdmUgY29udGFpbnMgZXh0cmFuZW91cyBmaWxlczogJHtxKFsuLi51bnNlZW5dKX0gaW4gJHtxKFxuICAgICAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgICApfWA7XG4gIH1cblxuICAvKiAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZXhlY3V0ZSA9IGFzeW5jIG9wdGlvbnMgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGdsb2JhbHMsXG4gICAgICBtb2R1bGVzLFxuICAgICAgdHJhbnNmb3JtcyxcbiAgICAgIF9fc2hpbVRyYW5zZm9ybXNfXyxcbiAgICAgIENvbXBhcnRtZW50OiBDb21wYXJ0bWVudE9wdGlvbiA9IENvbXBhcnRtZW50UGFyc2VPcHRpb24sXG4gICAgICBfX25hdGl2ZV9fLFxuICAgICAgaW1wb3J0SG9vazogZXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgfSA9IG9wdGlvbnMgfHwge307XG5cbiAgICBjb25zdCBjb21wYXJ0bWVudEV4aXRNb2R1bGVJbXBvcnRIb29rID0gZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcih7XG4gICAgICBtb2R1bGVzLFxuICAgICAgZXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgICBlbnRyeUNvbXBhcnRtZW50TmFtZSxcbiAgICB9KTtcbiAgICBjb25zdCBtYWtlSW1wb3J0SG9vayA9IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyKFxuICAgICAgZ2V0LFxuICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgICAgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayxcbiAgICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICApO1xuICAgIGNvbnN0IHsgY29tcGFydG1lbnQsIHBlbmRpbmdKb2JzUHJvbWlzZSB9ID0gbGluayhjb21wYXJ0bWVudE1hcCwge1xuICAgICAgbWFrZUltcG9ydEhvb2ssXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIGdsb2JhbHMsXG4gICAgICBtb2R1bGVzLFxuICAgICAgdHJhbnNmb3JtcyxcbiAgICAgIF9fc2hpbVRyYW5zZm9ybXNfXyxcbiAgICAgIENvbXBhcnRtZW50OiBDb21wYXJ0bWVudE9wdGlvbixcbiAgICAgIF9fbmF0aXZlX18sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbiAgICAvL1xuICAgIHJldHVybiBjb21wYXJ0bWVudFsnaW1wb3J0J10oZW50cnlNb2R1bGVTcGVjaWZpZXIpO1xuICB9O1xuXG4gIHJldHVybiB7IGltcG9ydDogZXhlY3V0ZSwgc2hhNTEyIH07XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UucGFyc2VBcmNoaXZlKHBhcnNlQXJjaGl2ZSk7XG4gICAgICAgY29uc3QgbG9hZEFyY2hpdmUgPSBhc3luYyAoXG4gIHJlYWRQb3dlcnMsXG4gIGFyY2hpdmVMb2NhdGlvbixcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHsgcmVhZCwgY29tcHV0ZVNoYTUxMiB9ID0gdW5wYWNrUmVhZFBvd2VycyhyZWFkUG93ZXJzKTtcbiAgY29uc3Qge1xuICAgIGV4cGVjdGVkU2hhNTEyLFxuICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICBtb2R1bGVzLFxuICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGFyY2hpdmVCeXRlcyA9IGF3YWl0IHJlYWQoYXJjaGl2ZUxvY2F0aW9uKTtcbiAgcmV0dXJuIHBhcnNlQXJjaGl2ZShhcmNoaXZlQnl0ZXMsIGFyY2hpdmVMb2NhdGlvbiwge1xuICAgIGNvbXB1dGVTaGE1MTIsXG4gICAgZXhwZWN0ZWRTaGE1MTIsXG4gICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgIG1vZHVsZXMsXG4gICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uLFxuICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5sb2FkQXJjaGl2ZShsb2FkQXJjaGl2ZSk7XG4gICAgICAgY29uc3QgaW1wb3J0QXJjaGl2ZSA9IGFzeW5jIChyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgYXJjaGl2ZSA9IGF3YWl0IGxvYWRBcmNoaXZlKHJlYWRQb3dlcnMsIGFyY2hpdmVMb2NhdGlvbiwgb3B0aW9ucyk7XG4gIHJldHVybiBhcmNoaXZlLmltcG9ydChvcHRpb25zKTtcbn07JGjNj19vbmNlLmltcG9ydEFyY2hpdmUoaW1wb3J0QXJjaGl2ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACq7NjjNgUAADYFAAA9AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qc3siaW1wb3J0cyI6WyIuL3BhcnNlLXByZS1janMuanMiLCIuL3BhcnNlLWpzb24uanMiLCIuL3BhcnNlLXRleHQuanMiLCIuL3BhcnNlLWJ5dGVzLmpzIiwiLi9wYXJzZS1wcmUtbWpzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VyUHJlQ2pzLHBhcnNlckpzb24scGFyc2VyVGV4dCxwYXJzZXJCeXRlcyxwYXJzZXJQcmVNanM7JGjNj19pbXBvcnRzKFtbXCIuL3BhcnNlLXByZS1janMuanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChwYXJzZXJQcmVDanMgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcnNlLWpzb24uanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChwYXJzZXJKc29uID0gJGjNj19hKV1dXV0sW1wiLi9wYXJzZS10ZXh0LmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VyVGV4dCA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtYnl0ZXMuanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChwYXJzZXJCeXRlcyA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtcHJlLW1qcy5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKHBhcnNlclByZU1qcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UgPSBPYmplY3QuZnJlZXplKFxuICAvKiAgICAgICAgICAgICAgICAqLyAoe1xuICAgICdwcmUtY2pzLWpzb24nOiBwYXJzZXJQcmVDanMsXG4gICAgJ3ByZS1tanMtanNvbic6IHBhcnNlclByZU1qcyxcbiAgICBqc29uOiBwYXJzZXJKc29uLFxuICAgIHRleHQ6IHBhcnNlclRleHQsXG4gICAgYnl0ZXM6IHBhcnNlckJ5dGVzLFxuICB9KSxcbik7JGjNj19vbmNlLmRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZShkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlIjpbImRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADLW9tx4AgAAOAIAAA1AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvaW1wb3J0LWFyY2hpdmUuanN7ImltcG9ydHMiOlsiLi9pbXBvcnQtYXJjaGl2ZS1wYXJzZXJzLmpzIiwiLi9pbXBvcnQtYXJjaGl2ZS1saXRlLmpzIl0sImV4cG9ydHMiOlsiaW1wb3J0QXJjaGl2ZSIsImxvYWRBcmNoaXZlIiwicGFyc2VBcmNoaXZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlLHBhcnNlQXJjaGl2ZUxpdGUsbG9hZEFyY2hpdmVMaXRlLGltcG9ydEFyY2hpdmVMaXRlOyRozY9faW1wb3J0cyhbW1wiLi9pbXBvcnQtYXJjaGl2ZS1wYXJzZXJzLmpzXCIsIFtbXCJkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2VcIixbJGjNj19hID0+IChkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UgPSAkaM2PX2EpXV1dXSxbXCIuL2ltcG9ydC1hcmNoaXZlLWxpdGUuanNcIiwgW1tcInBhcnNlQXJjaGl2ZVwiLFskaM2PX2EgPT4gKHBhcnNlQXJjaGl2ZUxpdGUgPSAkaM2PX2EpXV0sW1wibG9hZEFyY2hpdmVcIixbJGjNj19hID0+IChsb2FkQXJjaGl2ZUxpdGUgPSAkaM2PX2EpXV0sW1wiaW1wb3J0QXJjaGl2ZVwiLFskaM2PX2EgPT4gKGltcG9ydEFyY2hpdmVMaXRlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGFzc2lnbiwgY3JlYXRlLCBmcmVlemUgfSA9IE9iamVjdDtcblxuLy9cbi8vXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2UgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHsgcGFyc2VyRm9yTGFuZ3VhZ2U6IHBhcnNlckZvckxhbmd1YWdlT3B0aW9uLCAuLi5yZXN0IH0gPSBvcHRpb25zO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwYXJzZXJGb3JMYW5ndWFnZSA9IGZyZWV6ZShcbiAgICBhc3NpZ24oY3JlYXRlKG51bGwpLCBkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UsIHBhcnNlckZvckxhbmd1YWdlT3B0aW9uKSxcbiAgKTtcbiAgcmV0dXJuIHsgLi4ucmVzdCwgcGFyc2VyRm9yTGFuZ3VhZ2UgfTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBhcnNlQXJjaGl2ZSA9IGFzeW5jIChcbiAgYXJjaGl2ZUJ5dGVzLFxuICBhcmNoaXZlTG9jYXRpb24gPSAnPHVua25vd24+JyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PlxuICBwYXJzZUFyY2hpdmVMaXRlKFxuICAgIGFyY2hpdmVCeXRlcyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5wYXJzZUFyY2hpdmUocGFyc2VBcmNoaXZlKTtcbiAgICAgICBjb25zdCBsb2FkQXJjaGl2ZSA9IGFzeW5jIChyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpID0+XG4gIGxvYWRBcmNoaXZlTGl0ZShcbiAgICByZWFkUG93ZXJzLFxuICAgIGFyY2hpdmVMb2NhdGlvbixcbiAgICBhc3NpZ25QYXJzZXJGb3JMYW5ndWFnZShvcHRpb25zKSxcbiAgKTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmxvYWRBcmNoaXZlKGxvYWRBcmNoaXZlKTtcbiAgICAgICBjb25zdCBpbXBvcnRBcmNoaXZlID0gYXN5bmMgKHJlYWRQb3dlcnMsIGFyY2hpdmVMb2NhdGlvbiwgb3B0aW9ucykgPT5cbiAgaW1wb3J0QXJjaGl2ZUxpdGUoXG4gICAgcmVhZFBvd2VycyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7JGjNj19vbmNlLmltcG9ydEFyY2hpdmUoaW1wb3J0QXJjaGl2ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD7Lrj+nFQAAJxUAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvaW1wb3J0LWhvb2suanN7ImltcG9ydHMiOlsiQGVuZG8vdHJhbXBvbGluZSIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9wb2xpY3kuanMiLCIuL3Bvd2Vycy5qcyJdLCJleHBvcnRzIjpbImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiLCJtYWtlSW1wb3J0SG9va01ha2VyIiwibWFrZUltcG9ydE5vd0hvb2tNYWtlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzeW5jVHJhbXBvbGluZSxzeW5jVHJhbXBvbGluZSxyZXNvbHZlLGF0dGVudWF0ZU1vZHVsZUhvb2ssQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQsZW5mb3JjZU1vZHVsZVBvbGljeSx1bnBhY2tSZWFkUG93ZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vdHJhbXBvbGluZVwiLCBbW1wiYXN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoYXN5bmNUcmFtcG9saW5lID0gJGjNj19hKV1dLFtcInN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoc3luY1RyYW1wb2xpbmUgPSAkaM2PX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wicmVzb2x2ZVwiLFskaM2PX2EgPT4gKHJlc29sdmUgPSAkaM2PX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaM2PX2EpXV0sW1wiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRcIixbJGjNj19hID0+IChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICRozY9fYSldXSxbXCJlbmZvcmNlTW9kdWxlUG9saWN5XCIsWyRozY9fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRozY9fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsWyRozY9fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VJbXBvcnROb3dIb29rTWFrZXIsJ25hbWUnLHt2YWx1ZTpcIm1ha2VJbXBvcnROb3dIb29rTWFrZXJcIn0pOyRozY9fb25jZS5tYWtlSW1wb3J0Tm93SG9va01ha2VyKG1ha2VJbXBvcnROb3dIb29rTWFrZXIpO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZnJlZXplID0gT2JqZWN0LmZyZWV6ZTtcblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzLCBhc3NpZ24sIGNyZWF0ZSB9ID0gT2JqZWN0O1xuXG5jb25zdCB7IGhhc093blByb3BlcnR5IH0gPSBPYmplY3QucHJvdG90eXBlO1xuLypcblxuXG4gKi9cbmNvbnN0IGhhcyA9IChoYXlzdGFjaywgbmVlZGxlKSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgaGF5c3RhY2ssIFtuZWVkbGVdKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgcmVzb2x2ZUxvY2F0aW9uID0gKHJlbCwgYWJzKSA9PiBuZXcgVVJMKHJlbCwgYWJzKS50b1N0cmluZygpO1xuXG4vL1xuZnVuY3Rpb24gZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSB7XG4gIHJldHVybiAoaGFzKHJlY29yZCwgJ3JlY29yZCcpID8gcmVjb3JkLnJlY29yZC5pbXBvcnRzIDogcmVjb3JkLmltcG9ydHMpIHx8IFtdO1xufVxuXG4vL1xuLy9cbmNvbnN0IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyA9IFtcbiAgLy9cbiAgJy5qcycsXG4gICcuanNvbicsXG4gICcubm9kZScsXG4gIC8vXG4gICcvaW5kZXguanMnLFxuICAnL2luZGV4Lmpzb24nLFxuICAnL2luZGV4Lm5vZGUnLFxuXTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc0xvY2F0aW9uV2l0aGluQ29tcGFydG1lbnQgPSAoXG4gIGFic29sdXRlTW9kdWRlU3BlY2lmaWVyLFxuICBjb21wYXJ0bWVudExvY2F0aW9uLFxuKSA9PiBhYnNvbHV0ZU1vZHVkZVNwZWNpZmllci5zdGFydHNXaXRoKGNvbXBhcnRtZW50TG9jYXRpb24pO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmVsYXRpdmVTcGVjaWZpZXIgPSAoYWJzb2x1dGVNb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50TG9jYXRpb24pID0+IHtcbiAgYXNzZXJ0KFxuICAgIGlzTG9jYXRpb25XaXRoaW5Db21wYXJ0bWVudChhYnNvbHV0ZU1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnRMb2NhdGlvbiksXG4gICAgYE1vZHVsZSBzcGVjaWZpZXIgbG9jYXRpb24gXCIke2Fic29sdXRlTW9kdWxlU3BlY2lmaWVyfVwiIGRvZXMgbm90IHN0YXJ0IHdpdGggY29tcGFydG1lbnQgbG9jYXRpb24gXCIke2NvbXBhcnRtZW50TG9jYXRpb259XCJgLFxuICApO1xuICByZXR1cm4gYC4vJHthYnNvbHV0ZU1vZHVsZVNwZWNpZmllci5zdWJzdHJpbmcoY29tcGFydG1lbnRMb2NhdGlvbi5sZW5ndGgpfWA7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBmaW5kUmVkaXJlY3QgPSAoe1xuICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gIGNvbXBhcnRtZW50cyxcbiAgYWJzb2x1dGVNb2R1bGVTcGVjaWZpZXIsXG59KSA9PiB7XG4gIGNvbnN0IG1vZHVsZVNwZWNpZmllckxvY2F0aW9uID0gbmV3IFVSTChhYnNvbHV0ZU1vZHVsZVNwZWNpZmllciwgJ2ZpbGU6JylcbiAgICAuaHJlZjtcblxuICAvL1xuICBsZXQgc29tZUxvY2F0aW9uID0gbmV3IFVSTCgnLi8nLCBtb2R1bGVTcGVjaWZpZXJMb2NhdGlvbikuaHJlZjtcblxuICAvL1xuICAvL1xuXG4gIC8vXG4gIGZvciAoOzspIHtcbiAgICBpZiAoXG4gICAgICBzb21lTG9jYXRpb24gIT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UICYmXG4gICAgICBzb21lTG9jYXRpb24gaW4gY29tcGFydG1lbnRzXG4gICAgKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IHNvbWVMb2NhdGlvbjtcbiAgICAgIGNvbnN0IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW2xvY2F0aW9uXTtcbiAgICAgIGlmIChjb21wYXJ0bWVudERlc2NyaXB0b3IgPT09IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAoY29tcGFydG1lbnREZXNjcmlwdG9yLmNvbXBhcnRtZW50cy5oYXMobG9jYXRpb24pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BlY2lmaWVyOiByZWxhdGl2ZVNwZWNpZmllcihtb2R1bGVTcGVjaWZpZXJMb2NhdGlvbiwgbG9jYXRpb24pLFxuICAgICAgICAgIGNvbXBhcnRtZW50OiBjb21wYXJ0bWVudHNbbG9jYXRpb25dLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAoXG4gICAgICAgIHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IuY29tcGFydG1lbnRzLmhhcyhcbiAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IubG9jYXRpb24sXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBlbmZvcmNlTW9kdWxlUG9saWN5KFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5uYW1lLFxuICAgICAgICAgIHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBpbXBvcnQgaG9vay4gJHtxKGFic29sdXRlTW9kdWxlU3BlY2lmaWVyKX0gaXMgcGFydCBvZiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCByZXNvbHZlcyB0byAke2xvY2F0aW9ufWAsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzcGVjaWZpZXI6IHJlbGF0aXZlU3BlY2lmaWVyKG1vZHVsZVNwZWNpZmllckxvY2F0aW9uLCBsb2NhdGlvbiksXG4gICAgICAgICAgY29tcGFydG1lbnQ6IGNvbXBhcnRtZW50c1tsb2NhdGlvbl0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGltcG9ydCBtb2R1bGU6ICR7cShhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcil9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICBjb25zdCBwYXJlbnRMb2NhdGlvbiA9IG5ldyBVUkwoJy4uLycsIHNvbWVMb2NhdGlvbikuaHJlZjtcblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAocGFyZW50TG9jYXRpb24gPT09IHNvbWVMb2NhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBpbXBvcnQgdW5rbm93biBtb2R1bGU6ICR7cShhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcil9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgc29tZUxvY2F0aW9uID0gcGFyZW50TG9jYXRpb247XG4gICAgfVxuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIgPSAoe1xuICBtb2R1bGVzID0gdW5kZWZpbmVkLFxuICBleGl0TW9kdWxlSW1wb3J0SG9vayA9IHVuZGVmaW5lZCxcbiAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG59KSA9PiB7XG4gIGlmICghbW9kdWxlcyAmJiAhZXhpdE1vZHVsZUltcG9ydEhvb2spIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBhc3luYyBzcGVjaWZpZXIgPT4ge1xuICAgIGlmIChtb2R1bGVzICYmIGhhcyhtb2R1bGVzLCBzcGVjaWZpZXIpKSB7XG4gICAgICBjb25zdCBucyA9IG1vZHVsZXNbc3BlY2lmaWVyXTtcbiAgICAgIHJldHVybiBmcmVlemUoe1xuICAgICAgICBpbXBvcnRzOiBbXSxcbiAgICAgICAgZXhwb3J0czogbnMgPyBrZXlzKG5zKSA6IFtdLFxuICAgICAgICBleGVjdXRlOiBtb2R1bGVFeHBvcnRzID0+IHtcbiAgICAgICAgICBtb2R1bGVFeHBvcnRzLmRlZmF1bHQgPSBucztcbiAgICAgICAgICBhc3NpZ24obW9kdWxlRXhwb3J0cywgbnMpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChleGl0TW9kdWxlSW1wb3J0SG9vaykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIGV4aXRNb2R1bGVJbXBvcnRIb29rKHNwZWNpZmllciwgZW50cnlDb21wYXJ0bWVudE5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcihleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyKTtcbmNvbnN0IG5vbWluYXRlQ2FuZGlkYXRlcyA9IChtb2R1bGVTcGVjaWZpZXIsIHNlYXJjaFN1ZmZpeGVzKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IGNhbmRpZGF0ZXMgPSBbbW9kdWxlU3BlY2lmaWVyXTtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGVTdWZmaXggb2Ygc2VhcmNoU3VmZml4ZXMpIHtcbiAgICBjYW5kaWRhdGVzLnB1c2goYCR7bW9kdWxlU3BlY2lmaWVyfSR7Y2FuZGlkYXRlU3VmZml4fWApO1xuICB9XG4gIHJldHVybiBjYW5kaWRhdGVzO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uKiBjaG9vc2VNb2R1bGVEZXNjcmlwdG9yKFxuICB7XG4gICAgY2FuZGlkYXRlcyxcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgY29tcHV0ZVNoYTUxMixcbiAgICBtb2R1bGVEZXNjcmlwdG9ycyxcbiAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIHBhY2thZ2VTb3VyY2VzLFxuICAgIHJlYWRQb3dlcnMsXG4gICAgYXJjaGl2ZU9ubHksXG4gICAgc291cmNlTWFwSG9vayxcbiAgICBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQsXG4gIH0sXG4gIHsgbWF5YmVSZWFkLCBwYXJzZSwgc2hvdWxkRGVmZXJFcnJvciA9ICgpID0+IGZhbHNlIH0sXG4pIHtcbiAgY29uc3QgeyBzb3VyY2VEaXJuYW1lIH0gPSBjb21wYXJ0bWVudERlc2NyaXB0b3I7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlU3BlY2lmaWVyIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICBjb25zdCBjYW5kaWRhdGVNb2R1bGVEZXNjcmlwdG9yID0gbW9kdWxlRGVzY3JpcHRvcnNbY2FuZGlkYXRlU3BlY2lmaWVyXTtcbiAgICBpZiAoY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjYW5kaWRhdGVNb2R1bGVEZXNjcmlwdG9yLnJldGFpbmVkID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHsgY29tcGFydG1lbnQ6IGNhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZSA9IHBhY2thZ2VMb2NhdGlvbiB9ID1cbiAgICAgICAgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvcjtcbiAgICAgIGNvbnN0IGNhbmRpZGF0ZUNvbXBhcnRtZW50ID0gY29tcGFydG1lbnRzW2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZV07XG4gICAgICBpZiAoY2FuZGlkYXRlQ29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgY29tcGFydG1lbnQgbWlzc2luZyBmb3IgY2FuZGlkYXRlICR7Y2FuZGlkYXRlU3BlY2lmaWVyfSBpbiAke2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZUNvbXBhcnRtZW50RGVzY3JpcHRvciA9XG4gICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnNbY2FuZGlkYXRlQ29tcGFydG1lbnROYW1lXTtcbiAgICAgIGlmIChjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgY29tcGFydG1lbnREZXNjcmlwdG9yIG1pc3NpbmcgZm9yIGNhbmRpZGF0ZSAke2NhbmRpZGF0ZVNwZWNpZmllcn0gaW4gJHtjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWV9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhbmRpZGF0ZUNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzW21vZHVsZVNwZWNpZmllcl0gPVxuICAgICAgICBjYW5kaWRhdGVNb2R1bGVEZXNjcmlwdG9yO1xuICAgICAgLy9cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCByZWNvcmQgPSB7XG4gICAgICAgIHNwZWNpZmllcjogY2FuZGlkYXRlU3BlY2lmaWVyLFxuICAgICAgICBjb21wYXJ0bWVudDogY2FuZGlkYXRlQ29tcGFydG1lbnQsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IG1vZHVsZUxvY2F0aW9uID0gcmVzb2x2ZUxvY2F0aW9uKGNhbmRpZGF0ZVNwZWNpZmllciwgcGFja2FnZUxvY2F0aW9uKTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHsgZmlsZVVSTFRvUGF0aCB9ID0gdW5wYWNrUmVhZFBvd2VycyhyZWFkUG93ZXJzKTtcbiAgICBpZiAoXG4gICAgICB0eXBlb2YgZmlsZVVSTFRvUGF0aCA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgIWlzTG9jYXRpb25XaXRoaW5Db21wYXJ0bWVudChtb2R1bGVMb2NhdGlvbiwgcGFja2FnZUxvY2F0aW9uKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3BlY2lmaWVyOiBmaWxlVVJMVG9QYXRoKG1vZHVsZUxvY2F0aW9uKSxcbiAgICAgICAgY29tcGFydG1lbnQ6IGNvbXBhcnRtZW50c1twYWNrYWdlTG9jYXRpb25dLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgbW9kdWxlQnl0ZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICB5aWVsZCBtYXliZVJlYWQobW9kdWxlTG9jYXRpb24pXG4gICAgKTtcblxuICAgIGlmIChtb2R1bGVCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGxldCBzb3VyY2VNYXA7XG4gICAgICAvL1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSAvKiAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICAgIHlpZWxkIHBhcnNlKFxuICAgICAgICAgIG1vZHVsZUJ5dGVzLFxuICAgICAgICAgIGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICAgIGFyY2hpdmVPbmx5LFxuICAgICAgICAgICAgc291cmNlTWFwSG9vazpcbiAgICAgICAgICAgICAgc291cmNlTWFwSG9vayAmJlxuICAgICAgICAgICAgICAobmV4dFNvdXJjZU1hcE9iamVjdCA9PiB7XG4gICAgICAgICAgICAgICAgc291cmNlTWFwID0gSlNPTi5zdHJpbmdpZnkobmV4dFNvdXJjZU1hcE9iamVjdCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBhcnNlcixcbiAgICAgICAgYnl0ZXM6IHRyYW5zZm9ybWVkQnl0ZXMsXG4gICAgICAgIHJlY29yZDogY29uY3JldGVSZWNvcmQsXG4gICAgICB9ID0gZW52ZWxvcGU7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKGNhbmRpZGF0ZVNwZWNpZmllciAhPT0gbW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgICAgIG1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl0gPSB7XG4gICAgICAgICAgcmV0YWluZWQ6IHRydWUsXG4gICAgICAgICAgbW9kdWxlOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgICAgY29tcGFydG1lbnQ6IHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgICAgcmVjb3JkOiBjb25jcmV0ZVJlY29yZCxcbiAgICAgICAgc3BlY2lmaWVyOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgIGltcG9ydE1ldGE6IHsgdXJsOiBtb2R1bGVMb2NhdGlvbiB9LFxuICAgICAgfTtcblxuICAgICAgbGV0IHNoYTUxMjtcbiAgICAgIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2hhNTEyID0gY29tcHV0ZVNoYTUxMih0cmFuc2Zvcm1lZEJ5dGVzKTtcblxuICAgICAgICBpZiAoc291cmNlTWFwSG9vayAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZU1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc291cmNlTWFwSG9vayhzb3VyY2VNYXAsIHtcbiAgICAgICAgICAgIGNvbXBhcnRtZW50OiBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICBtb2R1bGU6IGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICAgIGxvY2F0aW9uOiBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICAgIHNoYTUxMixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbiA9IG1vZHVsZUxvY2F0aW9uLnNsaWNlKFxuICAgICAgICBwYWNrYWdlTG9jYXRpb24ubGVuZ3RoLFxuICAgICAgKTtcbiAgICAgIHBhY2thZ2VTb3VyY2VzW2NhbmRpZGF0ZVNwZWNpZmllcl0gPSB7XG4gICAgICAgIGxvY2F0aW9uOiBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbixcbiAgICAgICAgc291cmNlTG9jYXRpb246IG1vZHVsZUxvY2F0aW9uLFxuICAgICAgICBzb3VyY2VEaXJuYW1lLFxuICAgICAgICBwYXJzZXIsXG4gICAgICAgIGJ5dGVzOiB0cmFuc2Zvcm1lZEJ5dGVzLFxuICAgICAgICByZWNvcmQ6IGNvbmNyZXRlUmVjb3JkLFxuICAgICAgICBzaGE1MTIsXG4gICAgICB9O1xuICAgICAgaWYgKCFzaG91bGREZWZlckVycm9yKHBhcnNlcikpIHtcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRTcGVjaWZpZXIgb2YgZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSkge1xuICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmFkZChcbiAgICAgICAgICAgIHJlc29sdmUoaW1wb3J0U3BlY2lmaWVyLCBtb2R1bGVTcGVjaWZpZXIpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRGVmZXJFcnJvciA9IChcbiAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICBwYWNrYWdlTG9jYXRpb24sXG4gIHBhY2thZ2VTb3VyY2VzLFxuKSA9PiB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWZlckVycm9yID0gKHNwZWNpZmllciwgZXJyb3IpID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmhhcyhzcGVjaWZpZXIpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCByZWNvcmQgPSBmcmVlemUoe1xuICAgICAgaW1wb3J0czogW10sXG4gICAgICBleHBvcnRzOiBbXSxcbiAgICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHBhY2thZ2VTb3VyY2VzW3NwZWNpZmllcl0gPSB7XG4gICAgICBkZWZlcnJlZEVycm9yOiBlcnJvci5tZXNzYWdlLFxuICAgIH07XG5cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9O1xuICByZXR1cm4gZGVmZXJFcnJvcjtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VJbXBvcnRIb29rTWFrZXIgPSAoXG4gIHJlYWRQb3dlcnMsXG4gIGJhc2VMb2NhdGlvbixcbiAge1xuICAgIHNvdXJjZXMgPSBjcmVhdGUobnVsbCksXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyA9IGNyZWF0ZShudWxsKSxcbiAgICBhcmNoaXZlT25seSA9IGZhbHNlLFxuICAgIGNvbXB1dGVTaGE1MTIgPSB1bmRlZmluZWQsXG4gICAgc2VhcmNoU3VmZml4ZXMgPSBub2RlanNDb252ZW50aW9uU2VhcmNoU3VmZml4ZXMsXG4gICAgc291cmNlTWFwSG9vayA9IHVuZGVmaW5lZCxcbiAgICBlbnRyeUNvbXBhcnRtZW50TmFtZSxcbiAgICBlbnRyeU1vZHVsZVNwZWNpZmllcixcbiAgICBpbXBvcnRIb29rOiBleGl0TW9kdWxlSW1wb3J0SG9vayA9IHVuZGVmaW5lZCxcbiAgfSxcbikgPT4ge1xuICAvL1xuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkID0gbmV3IE1hcChbXG4gICAgW2VudHJ5Q29tcGFydG1lbnROYW1lLCBuZXcgU2V0KFtlbnRyeU1vZHVsZVNwZWNpZmllcl0pXSxcbiAgXSk7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3Qgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50ID0gY29tcGFydG1lbnROYW1lID0+IHtcbiAgICBsZXQgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkID0gc3RyaWN0bHlSZXF1aXJlZC5nZXQoY29tcGFydG1lbnROYW1lKTtcbiAgICBpZiAoY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQ7XG4gICAgfVxuICAgIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZCA9IG5ldyBTZXQoKTtcbiAgICBzdHJpY3RseVJlcXVpcmVkLnNldChjb21wYXJ0bWVudE5hbWUsIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZCk7XG4gICAgcmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiAgfTtcblxuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWFrZUltcG9ydEhvb2sgPSAoe1xuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBwYWNrYWdlTmFtZTogX3BhY2thZ2VOYW1lLFxuICAgIGF0dGVudWF0b3JzLFxuICAgIHBhcnNlLFxuICAgIHNob3VsZERlZmVyRXJyb3IsXG4gICAgY29tcGFydG1lbnRzLFxuICB9KSA9PiB7XG4gICAgLy9cbiAgICBwYWNrYWdlTG9jYXRpb24gPSByZXNvbHZlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLCBiYXNlTG9jYXRpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VTb3VyY2VzID0gc291cmNlc1twYWNrYWdlTG9jYXRpb25dIHx8IGNyZWF0ZShudWxsKTtcbiAgICBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gPSBwYWNrYWdlU291cmNlcztcbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW3BhY2thZ2VMb2NhdGlvbl0gfHwge307XG4gICAgY29uc3QgeyBtb2R1bGVzOiBtb2R1bGVEZXNjcmlwdG9ycyA9IGNyZWF0ZShudWxsKSB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzID0gbW9kdWxlRGVzY3JpcHRvcnM7XG5cbiAgICBjb25zdCBkZWZlckVycm9yID0gbWFrZURlZmVyRXJyb3IoXG4gICAgICBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQsXG4gICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICBwYWNrYWdlU291cmNlcyxcbiAgICApO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGltcG9ydEhvb2sgPSBhc3luYyBtb2R1bGVTcGVjaWZpZXIgPT4ge1xuICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnJldGFpbmVkID0gdHJ1ZTtcblxuICAgICAgLy9cbiAgICAgIGF3YWl0IG51bGw7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy9cblxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBpZiAobW9kdWxlU3BlY2lmaWVyICE9PSAnLicgJiYgIW1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgICAgICAgaWYgKGV4aXRNb2R1bGVJbXBvcnRIb29rKSB7XG4gICAgICAgICAgICBjb25zdCByZWNvcmQgPSBhd2FpdCBleGl0TW9kdWxlSW1wb3J0SG9vayhcbiAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBlbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnREZXNjcmlwdG9yLCB7XG4gICAgICAgICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlcnJvckhpbnQ6IGBCbG9ja2VkIGluIGxvYWRpbmcuICR7cShcbiAgICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICAgICApfSB3YXMgbm90IGluIHRoZSBjb21wYXJ0bWVudCBtYXAgYW5kIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbG9hZCBpdCBhcyBhIGJ1aWx0aW5gLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKGFyY2hpdmVPbmx5KSB7XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIHJldHVybiBmcmVlemUoeyBpbXBvcnRzOiBbXSwgZXhwb3J0czogW10sIGV4ZWN1dGUoKSB7fSB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBjb25zdCBhdHRlbnVhdGVkUmVjb3JkID0gYXdhaXQgYXR0ZW51YXRlTW9kdWxlSG9vayhcbiAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5wb2xpY3ksXG4gICAgICAgICAgICAgICAgYXR0ZW51YXRvcnMsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJldHVybiBhdHRlbnVhdGVkUmVjb3JkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgZmluZCBleHRlcm5hbCBtb2R1bGUgJHtxKFxuICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICApfSBpbiBwYWNrYWdlICR7cGFja2FnZUxvY2F0aW9ufWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHsgbWF5YmVSZWFkIH0gPSB1bnBhY2tSZWFkUG93ZXJzKHJlYWRQb3dlcnMpO1xuXG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBub21pbmF0ZUNhbmRpZGF0ZXMobW9kdWxlU3BlY2lmaWVyLCBzZWFyY2hTdWZmaXhlcyk7XG5cbiAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgYXN5bmNUcmFtcG9saW5lKFxuICAgICAgICAgIGNob29zZU1vZHVsZURlc2NyaXB0b3IsXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2FuZGlkYXRlcyxcbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgICAgICAgICBjb21wYXJ0bWVudHMsXG4gICAgICAgICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgICAgICAgbW9kdWxlRGVzY3JpcHRvcnMsXG4gICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICBwYWNrYWdlU291cmNlcyxcbiAgICAgICAgICAgIHJlYWRQb3dlcnMsXG4gICAgICAgICAgICBhcmNoaXZlT25seSxcbiAgICAgICAgICAgIHNvdXJjZU1hcEhvb2ssXG4gICAgICAgICAgICBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IG1heWJlUmVhZCwgcGFyc2UsIHNob3VsZERlZmVyRXJyb3IgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAocmVjb3JkKSB7XG4gICAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgZmluZCBmaWxlIGZvciBpbnRlcm5hbCBtb2R1bGUgJHtxKFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICl9ICh3aXRoIGNhbmRpZGF0ZXMgJHtjYW5kaWRhdGVzXG4gICAgICAgICAgICAubWFwKHggPT4gcSh4KSlcbiAgICAgICAgICAgIC5qb2luKCcsICcpfSkgaW4gcGFja2FnZSAke3BhY2thZ2VMb2NhdGlvbn1gLFxuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGRlZmVyRXJyb3IobW9kdWxlU3BlY2lmaWVyLCBlcnJvcik7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gaW1wb3J0SG9vaztcbiAgfTtcbiAgcmV0dXJuIG1ha2VJbXBvcnRIb29rO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlSW1wb3J0SG9va01ha2VyKG1ha2VJbXBvcnRIb29rTWFrZXIpO1xuICAgICAgIGZ1bmN0aW9uIG1ha2VJbXBvcnROb3dIb29rTWFrZXIoXG4gIHJlYWRQb3dlcnMsXG4gIGJhc2VMb2NhdGlvbixcbiAge1xuICAgIHNvdXJjZXMgPSBjcmVhdGUobnVsbCksXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyA9IGNyZWF0ZShudWxsKSxcbiAgICBjb21wdXRlU2hhNTEyID0gdW5kZWZpbmVkLFxuICAgIHNlYXJjaFN1ZmZpeGVzID0gbm9kZWpzQ29udmVudGlvblNlYXJjaFN1ZmZpeGVzLFxuICAgIGFyY2hpdmVPbmx5ID0gZmFsc2UsXG4gICAgc291cmNlTWFwSG9vayA9IHVuZGVmaW5lZCxcbiAgICBpbXBvcnROb3dIb29rOiBleGl0TW9kdWxlSW1wb3J0Tm93SG9vayA9IHVuZGVmaW5lZCxcbiAgfSxcbikge1xuICAvL1xuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkID0gbmV3IE1hcCgpO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50TmFtZSA9PiB7XG4gICAgbGV0IGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZCA9IHN0cmljdGx5UmVxdWlyZWQuZ2V0KGNvbXBhcnRtZW50TmFtZSk7XG4gICAgaWYgKGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuICAgIH1cbiAgICBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgPSBuZXcgU2V0KCk7XG4gICAgc3RyaWN0bHlSZXF1aXJlZC5zZXQoY29tcGFydG1lbnROYW1lLCBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQpO1xuICAgIHJldHVybiBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQ7XG4gIH07XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgbWFrZUltcG9ydE5vd0hvb2sgPSAoe1xuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBwYWNrYWdlTmFtZTogX3BhY2thZ2VOYW1lLFxuICAgIHBhcnNlLFxuICAgIGNvbXBhcnRtZW50cyxcbiAgICBzaG91bGREZWZlckVycm9yLFxuICB9KSA9PiB7XG4gICAgY29uc3QgZGVmZXJFcnJvciA9IG1ha2VEZWZlckVycm9yKFxuICAgICAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgc291cmNlcyxcbiAgICApO1xuXG4gICAgLypcblxuXG5cblxuXG5cbiAgICAgKi9cbiAgICBjb25zdCBpbXBvcnRFeGl0TW9kdWxlT3JGYWlsID0gKG1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnREZXNjcmlwdG9yKSA9PiB7XG4gICAgICBpZiAoZXhpdE1vZHVsZUltcG9ydE5vd0hvb2spIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgZXhpdFJlY29yZCA9IGV4aXRNb2R1bGVJbXBvcnROb3dIb29rKFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICk7XG4gICAgICAgIGlmIChleGl0UmVjb3JkKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLCBjb21wYXJ0bWVudERlc2NyaXB0b3IsIHtcbiAgICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgICBlcnJvckhpbnQ6IGBCbG9ja2VkIGluIGxvYWRpbmcuICR7cShcbiAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgKX0gd2FzIG5vdCBpbiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGxvYWQgaXQgYXMgYSBidWlsdGluYCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gZXhpdFJlY29yZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgZXh0ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSBpbiBwYWNrYWdlIGF0ICR7cGFja2FnZUxvY2F0aW9ufWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgZXh0ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSBmcm9tIHBhY2thZ2UgYXQgJHtwYWNrYWdlTG9jYXRpb259OyB0cnkgcHJvdmlkaW5nIGFuIGltcG9ydE5vd0hvb2tgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoISgnaXNTeW5jUGFyc2VyJyBpbiBwYXJzZSkpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbXBvc3NpYmxlVHJhbnNmb3JtSW1wb3J0Tm93SG9vaygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdEeW5hbWljIHJlcXVpcmVzIGFyZSBvbmx5IHBvc3NpYmxlIHdpdGggc3luY2hyb25vdXMgcGFyc2VycyBhbmQgbm8gYXN5bmNocm9ub3VzIG1vZHVsZSB0cmFuc2Zvcm1zIGluIG9wdGlvbnMnLFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW3BhY2thZ2VMb2NhdGlvbl0gfHwge307XG5cbiAgICBwYWNrYWdlTG9jYXRpb24gPSByZXNvbHZlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLCBiYXNlTG9jYXRpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VTb3VyY2VzID0gc291cmNlc1twYWNrYWdlTG9jYXRpb25dIHx8IGNyZWF0ZShudWxsKTtcbiAgICBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gPSBwYWNrYWdlU291cmNlcztcbiAgICBjb25zdCB7XG4gICAgICBtb2R1bGVzOlxuICAgICAgICBtb2R1bGVEZXNjcmlwdG9ycyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgICAgICBjcmVhdGUobnVsbClcbiAgICAgICAgKSxcbiAgICB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzID0gbW9kdWxlRGVzY3JpcHRvcnM7XG5cbiAgICBsZXQgeyBwb2xpY3kgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICBwb2xpY3kgPSBwb2xpY3kgfHwgY3JlYXRlKG51bGwpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKCdwYWNrYWdlcycgaW4gcG9saWN5ICYmIHR5cGVvZiBwb2xpY3kucGFja2FnZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwYWNrYWdlTmFtZSwgcGFja2FnZVBvbGljeUl0ZW1dIG9mIGVudHJpZXMocG9saWN5LnBhY2thZ2VzKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIShwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlcykgJiZcbiAgICAgICAgICBwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3Iuc2NvcGVzICYmXG4gICAgICAgICAgcGFja2FnZVBvbGljeUl0ZW1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXNbcGFja2FnZU5hbWVdID1cbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5zY29wZXNbcGFja2FnZU5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBtYXliZVJlYWROb3csIGlzQWJzb2x1dGUgfSA9IHJlYWRQb3dlcnM7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaW1wb3J0Tm93SG9vayA9IG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoaXNBYnNvbHV0ZShtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgICAgY29uc3QgcmVjb3JkID0gZmluZFJlZGlyZWN0KHtcbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgICAgICAgICBjb21wYXJ0bWVudHMsXG4gICAgICAgICAgICBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcjogbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChyZWNvcmQpIHtcbiAgICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNMb2NhdGlvbldpdGhpbkNvbXBhcnRtZW50KFxuICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5sb2NhdGlvbixcbiAgICAgICAgICAgIClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllciA9IHJlbGF0aXZlU3BlY2lmaWVyKFxuICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5sb2NhdGlvbixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllciAhPT0gJy4nICYmXG4gICAgICAgICAgIW1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpICYmXG4gICAgICAgICAgIW1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCcuLi8nKVxuICAgICAgICApIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBpbXBvcnRFeGl0TW9kdWxlT3JGYWlsKG1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnREZXNjcmlwdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBub21pbmF0ZUNhbmRpZGF0ZXMobW9kdWxlU3BlY2lmaWVyLCBzZWFyY2hTdWZmaXhlcyk7XG5cbiAgICAgICAgY29uc3QgcmVjb3JkID0gc3luY1RyYW1wb2xpbmUoXG4gICAgICAgICAgY2hvb3NlTW9kdWxlRGVzY3JpcHRvcixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjYW5kaWRhdGVzLFxuICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbiAgICAgICAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgICAgICAgIGNvbXB1dGVTaGE1MTIsXG4gICAgICAgICAgICBtb2R1bGVEZXNjcmlwdG9ycyxcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICAgIHBhY2thZ2VTb3VyY2VzLFxuICAgICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICAgIGFyY2hpdmVPbmx5LFxuICAgICAgICAgICAgc291cmNlTWFwSG9vayxcbiAgICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1heWJlUmVhZDogbWF5YmVSZWFkTm93LFxuICAgICAgICAgICAgcGFyc2UsXG4gICAgICAgICAgICBzaG91bGREZWZlckVycm9yLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH1cblxuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gaW1wb3J0RXhpdE1vZHVsZU9yRmFpbChtb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50RGVzY3JpcHRvcik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIGRlZmVyRXJyb3IobW9kdWxlU3BlY2lmaWVyLCBlcnIpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGltcG9ydE5vd0hvb2s7XG4gIH07XG4gIHJldHVybiBtYWtlSW1wb3J0Tm93SG9vaztcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiOlsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciJdLCJtYWtlSW1wb3J0SG9va01ha2VyIjpbIm1ha2VJbXBvcnRIb29rTWFrZXIiXSwibWFrZUltcG9ydE5vd0hvb2tNYWtlciI6WyJtYWtlSW1wb3J0Tm93SG9va01ha2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOroDm3yAgAA8gIAACsAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9qc29uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJwYXJzZUxvY2F0ZWRKc29uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwYXJzZUxvY2F0ZWRKc29uID0gKHNvdXJjZSwgbG9jYXRpb24pID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzb3VyY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICB0aHJvdyBTeW50YXhFcnJvcihgQ2Fubm90IHBhcnNlIEpTT04gZnJvbSAke2xvY2F0aW9ufSwgJHtlcnJvcn1gKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07JGjNj19vbmNlLnBhcnNlTG9jYXRlZEpzb24ocGFyc2VMb2NhdGVkSnNvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUxvY2F0ZWRKc29uIjpbInBhcnNlTG9jYXRlZEpzb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArwp0SKwlAACsJQAAKwAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL2xpbmsuanN7ImltcG9ydHMiOlsiLi9tYXAtcGFyc2VyLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImFzc2VtYmxlIiwibGluayJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VNYXBQYXJzZXJzLHJlc29sdmVGYWxsYmFjayxBVFRFTlVBVE9SU19DT01QQVJUTUVOVCxhdHRlbnVhdGVHbG9iYWxzLGVuZm9yY2VNb2R1bGVQb2xpY3ksbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFwLXBhcnNlci5qc1wiLCBbW1wibWFrZU1hcFBhcnNlcnNcIixbJGjNj19hID0+IChtYWtlTWFwUGFyc2VycyA9ICRozY9fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJyZXNvbHZlXCIsWyRozY9fYSA9PiAocmVzb2x2ZUZhbGxiYWNrID0gJGjNj19hKV1dXV0sW1wiLi9wb2xpY3kuanNcIiwgW1tcIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXCIsWyRozY9fYSA9PiAoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQgPSAkaM2PX2EpXV0sW1wiYXR0ZW51YXRlR2xvYmFsc1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZUdsb2JhbHMgPSAkaM2PX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLFskaM2PX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaM2PX2EpXV0sW1wibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlclwiLFskaM2PX2EgPT4gKG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGFzc2lnbiwgY3JlYXRlLCBlbnRyaWVzLCBmcmVlemUgfSA9IE9iamVjdDtcbmNvbnN0IHsgaGFzT3duUHJvcGVydHkgfSA9IE9iamVjdC5wcm90b3R5cGU7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuY29uc3QgeyBhbGxTZXR0bGVkIH0gPSBQcm9taXNlO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgcHJvbWlzZUFsbFNldHRsZWQgPSBhbGxTZXR0bGVkLmJpbmQoUHJvbWlzZSk7XG5cbmNvbnN0IGRlZmF1bHRDb21wYXJ0bWVudCA9IENvbXBhcnRtZW50O1xuXG4vL1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IGFwcGx5KGhhc093blByb3BlcnR5LCBvYmplY3QsIFtrZXldKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHRyaW1Nb2R1bGVTcGVjaWZpZXJQcmVmaXggPSAobW9kdWxlU3BlY2lmaWVyLCBwcmVmaXgpID0+IHtcbiAgaWYgKG1vZHVsZVNwZWNpZmllciA9PT0gcHJlZml4KSB7XG4gICAgcmV0dXJuICcuJztcbiAgfVxuICBpZiAobW9kdWxlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoYCR7cHJlZml4fS9gKSkge1xuICAgIHJldHVybiBgLi8ke21vZHVsZVNwZWNpZmllci5zbGljZShwcmVmaXgubGVuZ3RoICsgMSl9YDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZU1vZHVsZU1hcEhvb2sgPSAoXG4gIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgY29tcGFydG1lbnRzLFxuICBjb21wYXJ0bWVudE5hbWUsXG4gIG1vZHVsZURlc2NyaXB0b3JzLFxuICBzY29wZURlc2NyaXB0b3JzLFxuKSA9PiB7XG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgbW9kdWxlTWFwSG9vayA9IG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnJldGFpbmVkID0gdHJ1ZTtcblxuICAgIGNvbnN0IG1vZHVsZURlc2NyaXB0b3IgPSBtb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdO1xuICAgIGlmIChtb2R1bGVEZXNjcmlwdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG1vZHVsZURlc2NyaXB0b3IucmV0YWluZWQgPSB0cnVlO1xuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY29tcGFydG1lbnQ6IGZvcmVpZ25Db21wYXJ0bWVudE5hbWUgPSBjb21wYXJ0bWVudE5hbWUsXG4gICAgICAgIG1vZHVsZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgZXhpdCxcbiAgICAgIH0gPSBtb2R1bGVEZXNjcmlwdG9yO1xuICAgICAgaWYgKGV4aXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvL1xuICAgICAgfVxuICAgICAgaWYgKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoIW1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLCBjb21wYXJ0bWVudERlc2NyaXB0b3IsIHtcbiAgICAgICAgICAgIGV4aXQ6IGZhbHNlLFxuICAgICAgICAgICAgZXJyb3JIaW50OlxuICAgICAgICAgICAgICAnVGhpcyBjaGVjayBzaG91bGQgbm90IGJlIHJlYWNoYWJsZS4gSWYgeW91IHNlZSB0aGlzIGVycm9yLCBwbGVhc2UgZmlsZSBhbiBpc3N1ZS4nLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9yZWlnbkNvbXBhcnRtZW50ID0gY29tcGFydG1lbnRzW2ZvcmVpZ25Db21wYXJ0bWVudE5hbWVdO1xuICAgICAgICBpZiAoZm9yZWlnbkNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgaW1wb3J0IGZyb20gbWlzc2luZyBjb21wYXJ0bWVudCAke3EoXG4gICAgICAgICAgICAgIGZvcmVpZ25Db21wYXJ0bWVudE5hbWUsXG4gICAgICAgICAgICApfX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50LFxuICAgICAgICAgIG5hbWVzcGFjZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChjb25zdCBbc2NvcGVQcmVmaXgsIHNjb3BlRGVzY3JpcHRvcl0gb2YgZW50cmllcyhzY29wZURlc2NyaXB0b3JzKSkge1xuICAgICAgY29uc3QgZm9yZWlnbk1vZHVsZVNwZWNpZmllciA9IHRyaW1Nb2R1bGVTcGVjaWZpZXJQcmVmaXgoXG4gICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgc2NvcGVQcmVmaXgsXG4gICAgICApO1xuXG4gICAgICBpZiAoZm9yZWlnbk1vZHVsZVNwZWNpZmllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IHsgY29tcGFydG1lbnQ6IGZvcmVpZ25Db21wYXJ0bWVudE5hbWUgfSA9IHNjb3BlRGVzY3JpcHRvcjtcbiAgICAgICAgaWYgKGZvcmVpZ25Db21wYXJ0bWVudE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBpbXBvcnQgZnJvbSBzY29wZSAke3Njb3BlUHJlZml4fSBkdWUgdG8gbWlzc2luZyBcImNvbXBhcnRtZW50XCIgcHJvcGVydHlgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZm9yZWlnbkNvbXBhcnRtZW50ID0gY29tcGFydG1lbnRzW2ZvcmVpZ25Db21wYXJ0bWVudE5hbWVdO1xuICAgICAgICBpZiAoZm9yZWlnbkNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgaW1wb3J0IGZyb20gbWlzc2luZyBjb21wYXJ0bWVudCAke3EoXG4gICAgICAgICAgICAgIGZvcmVpZ25Db21wYXJ0bWVudE5hbWUsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVuZm9yY2VNb2R1bGVQb2xpY3koc2NvcGVQcmVmaXgsIGNvbXBhcnRtZW50RGVzY3JpcHRvciwge1xuICAgICAgICAgIGV4aXQ6IGZhbHNlLFxuICAgICAgICAgIGVycm9ySGludDogYEJsb2NrZWQgaW4gbGlua2luZy4gJHtxKFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICl9IGlzIHBhcnQgb2YgdGhlIGNvbXBhcnRtZW50IG1hcCBhbmQgcmVzb2x2ZXMgdG8gJHtxKFxuICAgICAgICAgICAgZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICApfS5gLFxuICAgICAgICB9KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgbW9kdWxlRGVzY3JpcHRvcnNbbW9kdWxlU3BlY2lmaWVyXSA9IHtcbiAgICAgICAgICByZXRhaW5lZDogdHJ1ZSxcbiAgICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICBtb2R1bGU6IGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgY29tcGFydG1lbnQ6IGZvcmVpZ25Db21wYXJ0bWVudCxcbiAgICAgICAgICBuYW1lc3BhY2U6IGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcmV0dXJuIG1vZHVsZU1hcEhvb2s7XG59O1xuXG4vKlxuXG4gKi9cbmNvbnN0IGltcG9zc2libGVJbXBvcnROb3dIb29rTWFrZXIgPSAoKSA9PiB7XG4gIHJldHVybiBmdW5jdGlvbiBpbXBvc3NpYmxlSW1wb3J0Tm93SG9vaygpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Byb3ZpZGVkIHJlYWQgcG93ZXJzIGRvIG5vdCBzdXBwb3J0IGR5bmFtaWMgcmVxdWlyZXMnKTtcbiAgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGxpbmsgPSAoXG4gIHsgZW50cnksIGNvbXBhcnRtZW50czogY29tcGFydG1lbnREZXNjcmlwdG9ycyB9LFxuICBvcHRpb25zLFxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICByZXNvbHZlID0gcmVzb2x2ZUZhbGxiYWNrLFxuICAgIG1ha2VJbXBvcnRIb29rLFxuICAgIG1ha2VJbXBvcnROb3dIb29rID0gaW1wb3NzaWJsZUltcG9ydE5vd0hvb2tNYWtlcixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZTogcGFyc2VyRm9yTGFuZ3VhZ2VPcHRpb24gPSB7fSxcbiAgICBnbG9iYWxzID0ge30sXG4gICAgdHJhbnNmb3JtcyA9IFtdLFxuICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgc3luY01vZHVsZVRyYW5zZm9ybXMsXG4gICAgX19zaGltVHJhbnNmb3Jtc19fID0gW10sXG4gICAgX19uYXRpdmVfXyA9IGZhbHNlLFxuICAgIGFyY2hpdmVPbmx5ID0gZmFsc2UsXG4gICAgQ29tcGFydG1lbnQgPSBkZWZhdWx0Q29tcGFydG1lbnQsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHsgY29tcGFydG1lbnQ6IGVudHJ5Q29tcGFydG1lbnROYW1lIH0gPSBlbnRyeTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY29tcGFydG1lbnRzID0gY3JlYXRlKG51bGwpO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGF0dGVudWF0b3JzID0gbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcihcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbiAgKTtcblxuICBjb25zdCBwZW5kaW5nSm9icyA9IFtdO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHBhcnNlckZvckxhbmd1YWdlID0gZnJlZXplKFxuICAgIGFzc2lnbihjcmVhdGUobnVsbCksIHBhcnNlckZvckxhbmd1YWdlT3B0aW9uKSxcbiAgKTtcblxuICBjb25zdCBtYXBQYXJzZXJzID0gbWFrZU1hcFBhcnNlcnMoe1xuICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgc3luY01vZHVsZVRyYW5zZm9ybXMsXG4gIH0pO1xuXG4gIGZvciAoY29uc3QgW2NvbXBhcnRtZW50TmFtZSwgY29tcGFydG1lbnREZXNjcmlwdG9yXSBvZiBlbnRyaWVzKFxuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICkpIHtcbiAgICBjb25zdCB7XG4gICAgICBsb2NhdGlvbixcbiAgICAgIG5hbWUsXG4gICAgICBwYXJzZXJzOiBsYW5ndWFnZUZvckV4dGVuc2lvbiA9IHt9LFxuICAgICAgdHlwZXM6IGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyID0ge30sXG4gICAgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcblxuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB7IHNjb3BlczogX3Njb3BlcywgbW9kdWxlczogX21vZHVsZXMgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICBjb25zdCBtb2R1bGVzID0gX21vZHVsZXMgfHwgY3JlYXRlKG51bGwpO1xuICAgIGNvbnN0IHNjb3BlcyA9IF9zY29wZXMgfHwgY3JlYXRlKG51bGwpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzID0gbW9kdWxlcztcblxuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBwYXJzZSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgIG1hcFBhcnNlcnMobGFuZ3VhZ2VGb3JFeHRlbnNpb24sIGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyKVxuICAgICk7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3Qgc2hvdWxkRGVmZXJFcnJvciA9IGxhbmd1YWdlID0+IHtcbiAgICAgIGlmIChsYW5ndWFnZSAmJiBoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsIGxhbmd1YWdlKSkge1xuICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHBhcnNlckZvckxhbmd1YWdlW2xhbmd1YWdlXSlcbiAgICAgICAgICAuaGV1cmlzdGljSW1wb3J0cztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHJlc29sdmVIb29rID0gcmVzb2x2ZTtcbiAgICBjb25zdCBpbXBvcnRIb29rID0gbWFrZUltcG9ydEhvb2soe1xuICAgICAgcGFja2FnZUxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgIHBhY2thZ2VOYW1lOiBuYW1lLFxuICAgICAgYXR0ZW51YXRvcnMsXG4gICAgICBwYXJzZSxcbiAgICAgIHNob3VsZERlZmVyRXJyb3IsXG4gICAgICBjb21wYXJ0bWVudHMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBpbXBvcnROb3dIb29rID0gbWFrZUltcG9ydE5vd0hvb2soe1xuICAgICAgcGFja2FnZUxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgIHBhY2thZ2VOYW1lOiBuYW1lLFxuICAgICAgcGFyc2UsXG4gICAgICBjb21wYXJ0bWVudHMsXG4gICAgICBzaG91bGREZWZlckVycm9yLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbW9kdWxlTWFwSG9vayA9IG1ha2VNb2R1bGVNYXBIb29rKFxuICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgY29tcGFydG1lbnROYW1lLFxuICAgICAgbW9kdWxlcyxcbiAgICAgIHNjb3BlcyxcbiAgICApO1xuXG4gICAgY29uc3QgY29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoe1xuICAgICAgbmFtZTogbG9jYXRpb24sXG4gICAgICByZXNvbHZlSG9vayxcbiAgICAgIGltcG9ydEhvb2ssXG4gICAgICBpbXBvcnROb3dIb29rLFxuICAgICAgbW9kdWxlTWFwSG9vayxcbiAgICAgIHRyYW5zZm9ybXMsXG4gICAgICBfX3NoaW1UcmFuc2Zvcm1zX18sXG4gICAgICBfX29wdGlvbnNfXzogdHJ1ZSxcbiAgICAgIF9fbmF0aXZlX18sXG4gICAgfSk7XG5cbiAgICBpZiAoIWFyY2hpdmVPbmx5KSB7XG4gICAgICBhdHRlbnVhdGVHbG9iYWxzKFxuICAgICAgICBjb21wYXJ0bWVudC5nbG9iYWxUaGlzLFxuICAgICAgICBnbG9iYWxzLFxuICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuICAgICAgICBhdHRlbnVhdG9ycyxcbiAgICAgICAgcGVuZGluZ0pvYnMsXG4gICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5uYW1lLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb21wYXJ0bWVudHNbY29tcGFydG1lbnROYW1lXSA9IGNvbXBhcnRtZW50O1xuICB9XG5cbiAgY29uc3QgY29tcGFydG1lbnQgPSBjb21wYXJ0bWVudHNbZW50cnlDb21wYXJ0bWVudE5hbWVdO1xuICBpZiAoY29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYENhbm5vdCBhc3NlbWJsZSBjb21wYXJ0bWVudCBncmFwaCBiZWNhdXNlIHRoZSByb290IGNvbXBhcnRtZW50IG5hbWVkICR7cShcbiAgICAgICAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG4gICAgICApfSBpcyBtaXNzaW5nIGZyb20gdGhlIGNvbXBhcnRtZW50IG1hcGAsXG4gICAgKTtcbiAgfVxuICBjb25zdCBhdHRlbnVhdG9yc0NvbXBhcnRtZW50ID0gY29tcGFydG1lbnRzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXTtcblxuICByZXR1cm4ge1xuICAgIGNvbXBhcnRtZW50LFxuICAgIGNvbXBhcnRtZW50cyxcbiAgICBhdHRlbnVhdG9yc0NvbXBhcnRtZW50LFxuICAgIHBlbmRpbmdKb2JzUHJvbWlzZTogcHJvbWlzZUFsbFNldHRsZWQocGVuZGluZ0pvYnMpLnRoZW4oXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIHJlc3VsdHMgPT4ge1xuICAgICAgICBjb25zdCBlcnJvcnMgPSByZXN1bHRzXG4gICAgICAgICAgLmZpbHRlcihyZXN1bHQgPT4gcmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJylcbiAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gcmVzdWx0ID0+XG4gICAgICAgICAgICAgIHJlc3VsdC5yZWFzb24sXG4gICAgICAgICAgKTtcbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgR2xvYmFscyBhdHRlbnVhdGlvbiBlcnJvcnM6ICR7ZXJyb3JzXG4gICAgICAgICAgICAgIC5tYXAoZXJyb3IgPT4gZXJyb3IubWVzc2FnZSlcbiAgICAgICAgICAgICAgLmpvaW4oJywgJyl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICksXG4gIH07XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmxpbmsobGluayk7XG4gICAgICAgY29uc3QgYXNzZW1ibGUgPSAoY29tcGFydG1lbnRNYXAsIG9wdGlvbnMpID0+XG4gIGxpbmsoY29tcGFydG1lbnRNYXAsIG9wdGlvbnMpLmNvbXBhcnRtZW50OyRozY9fb25jZS5hc3NlbWJsZShhc3NlbWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJsaW5rIjpbImxpbmsiXSwiYXNzZW1ibGUiOlsiYXNzZW1ibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkg0ZOwUYAAAFGAAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL21hcC1wYXJzZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vdHJhbXBvbGluZSIsIi4vZXh0ZW5zaW9uLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcFBhcnNlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBzeW5jVHJhbXBvbGluZSxhc3luY1RyYW1wb2xpbmUscGFyc2VFeHRlbnNpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby90cmFtcG9saW5lXCIsIFtbXCJzeW5jVHJhbXBvbGluZVwiLFskaM2PX2EgPT4gKHN5bmNUcmFtcG9saW5lID0gJGjNj19hKV1dLFtcImFzeW5jVHJhbXBvbGluZVwiLFskaM2PX2EgPT4gKGFzeW5jVHJhbXBvbGluZSA9ICRozY9fYSldXV1dLFtcIi4vZXh0ZW5zaW9uLmpzXCIsIFtbXCJwYXJzZUV4dGVuc2lvblwiLFskaM2PX2EgPT4gKHBhcnNlRXh0ZW5zaW9uID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzLCBrZXlzLCBoYXNPd25Qcm9wZXJ0eSwgdmFsdWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuLy9cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBba2V5XSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlID0gZXh0ZW5zaW9uID0+IGV4dGVuc2lvbiAhPT0gJ2pzJztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRXh0ZW5zaW9uUGFyc2VyID0gKFxuICBwcmVmZXJTeW5jaHJvbm91cyxcbiAgbGFuZ3VhZ2VGb3JFeHRlbnNpb24sXG4gIGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxuICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgc3luY01vZHVsZVRyYW5zZm9ybXMsXG4pID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IHRyYW5zZm9ybXM7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGZ1bmN0aW9uKiBnZXRQYXJzZXJHZW5lcmF0b3IoXG4gICAgYnl0ZXMsXG4gICAgc3BlY2lmaWVyLFxuICAgIGxvY2F0aW9uLFxuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBvcHRpb25zLFxuICApIHtcbiAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICBsZXQgbGFuZ3VhZ2U7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gcGFyc2VFeHRlbnNpb24obG9jYXRpb24pO1xuXG4gICAgaWYgKFxuICAgICAgIWV4dGVuc2lvbkltcGxpZXNMYW5ndWFnZShleHRlbnNpb24pICYmXG4gICAgICBoYXMobGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsIHNwZWNpZmllcilcbiAgICApIHtcbiAgICAgIGxhbmd1YWdlID0gbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXJbc3BlY2lmaWVyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBsYW5ndWFnZSA9IGxhbmd1YWdlRm9yRXh0ZW5zaW9uW2V4dGVuc2lvbl0gfHwgZXh0ZW5zaW9uO1xuICAgIH1cblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBsZXQgc291cmNlTWFwO1xuXG4gICAgaWYgKGhhcyh0cmFuc2Zvcm1zLCBsYW5ndWFnZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgICh7XG4gICAgICAgICAgYnl0ZXMsXG4gICAgICAgICAgcGFyc2VyOiBsYW5ndWFnZSxcbiAgICAgICAgICBzb3VyY2VNYXAsXG4gICAgICAgIH0gPSB5aWVsZCB0cmFuc2Zvcm1zW2xhbmd1YWdlXShcbiAgICAgICAgICBieXRlcyxcbiAgICAgICAgICBzcGVjaWZpZXIsXG4gICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHNvdXJjZU1hcCxcbiAgICAgICAgICB9LFxuICAgICAgICApKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgRXJyb3IgdHJhbnNmb3JtaW5nICR7cShsYW5ndWFnZSl9IHNvdXJjZSBpbiAke3EobG9jYXRpb24pfTogJHtlcnIubWVzc2FnZX1gLFxuICAgICAgICAgIHsgY2F1c2U6IGVyciB9LFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWhhcyhwYXJzZXJGb3JMYW5ndWFnZSwgbGFuZ3VhZ2UpKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBwYXJzZSBtb2R1bGUgJHtzcGVjaWZpZXJ9IGF0ICR7bG9jYXRpb259LCBubyBwYXJzZXIgY29uZmlndXJlZCBmb3IgdGhlIGxhbmd1YWdlICR7bGFuZ3VhZ2V9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHsgcGFyc2UgfSA9IHBhcnNlckZvckxhbmd1YWdlW2xhbmd1YWdlXTtcbiAgICByZXR1cm4gcGFyc2UoYnl0ZXMsIHNwZWNpZmllciwgbG9jYXRpb24sIHBhY2thZ2VMb2NhdGlvbiwge1xuICAgICAgc291cmNlTWFwLFxuICAgICAgLi4ub3B0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IHN5bmNQYXJzZXIgPSAoYnl0ZXMsIHNwZWNpZmllciwgbG9jYXRpb24sIHBhY2thZ2VMb2NhdGlvbiwgb3B0aW9ucykgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHN5bmNUcmFtcG9saW5lKFxuICAgICAgZ2V0UGFyc2VyR2VuZXJhdG9yLFxuICAgICAgYnl0ZXMsXG4gICAgICBzcGVjaWZpZXIsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgICBpZiAoJ3RoZW4nIGluIHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0LnRoZW4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICdTeW5jIHBhcnNlciBjYW5ub3QgcmV0dXJuIGEgVGhlbmFibGU7IGVuc3VyZSBwYXJzZXIgaXMgYWN0dWFsbHkgc3luY2hyb25vdXMnLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgc3luY1BhcnNlci5pc1N5bmNQYXJzZXIgPSB0cnVlO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGFzeW5jUGFyc2VyID0gYXN5bmMgKFxuICAgIGJ5dGVzLFxuICAgIHNwZWNpZmllcixcbiAgICBsb2NhdGlvbixcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgb3B0aW9ucyxcbiAgKSA9PiB7XG4gICAgcmV0dXJuIGFzeW5jVHJhbXBvbGluZShcbiAgICAgIGdldFBhcnNlckdlbmVyYXRvcixcbiAgICAgIGJ5dGVzLFxuICAgICAgc3BlY2lmaWVyLFxuICAgICAgbG9jYXRpb24sXG4gICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIH07XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaWYgKHByZWZlclN5bmNocm9ub3VzKSB7XG4gICAgdHJhbnNmb3JtcyA9IHN5bmNNb2R1bGVUcmFuc2Zvcm1zO1xuICAgIHJldHVybiBzeW5jUGFyc2VyO1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgLy9cbiAgICB0cmFuc2Zvcm1zID0ge1xuICAgICAgLi4uc3luY01vZHVsZVRyYW5zZm9ybXMsXG4gICAgICAuLi5tb2R1bGVUcmFuc2Zvcm1zLFxuICAgIH07XG5cbiAgICByZXR1cm4gYXN5bmNQYXJzZXI7XG4gIH1cbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiBtYXBQYXJzZXJzKFxuICBsYW5ndWFnZUZvckV4dGVuc2lvbixcbiAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gIHBhcnNlckZvckxhbmd1YWdlLFxuICBtb2R1bGVUcmFuc2Zvcm1zLFxuICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgcHJlZmVyU3luY2hyb25vdXMsXG4pIHtcbiAgbW9kdWxlVHJhbnNmb3JtcyA9IG1vZHVsZVRyYW5zZm9ybXMgfHwge307XG4gIHN5bmNNb2R1bGVUcmFuc2Zvcm1zID0gc3luY01vZHVsZVRyYW5zZm9ybXMgfHwge307XG4gIGNvbnN0IGxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcyA9IFtdO1xuICBjb25zdCBwcm9ibGVtcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtleHRlbnNpb24sIGxhbmd1YWdlXSBvZiBlbnRyaWVzKGxhbmd1YWdlRm9yRXh0ZW5zaW9uKSkge1xuICAgIGlmIChoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsIGxhbmd1YWdlKSkge1xuICAgICAgbGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzLnB1c2goW2V4dGVuc2lvbiwgbGFuZ3VhZ2VdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvYmxlbXMucHVzaChgJHtxKGxhbmd1YWdlKX0gZm9yIGV4dGVuc2lvbiAke3EoZXh0ZW5zaW9uKX1gKTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb2JsZW1zLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBFcnJvcihgTm8gcGFyc2VyIGF2YWlsYWJsZSBmb3IgbGFuZ3VhZ2U6ICR7cHJvYmxlbXMuam9pbignLCAnKX1gKTtcbiAgfVxuICByZXR1cm4gbWFrZUV4dGVuc2lvblBhcnNlcihcbiAgICAvKiAgICAgICAgICAgICAgKi8gKHByZWZlclN5bmNocm9ub3VzKSxcbiAgICBmcm9tRW50cmllcyhsYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXMpLFxuICAgIGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxuICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgc3luY01vZHVsZVRyYW5zZm9ybXMsXG4gICk7XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWFwUGFyc2VycyA9ICh7XG4gIHBhcnNlckZvckxhbmd1YWdlLFxuICBtb2R1bGVUcmFuc2Zvcm1zLFxuICBzeW5jTW9kdWxlVHJhbnNmb3Jtcyxcbn0pID0+IHtcbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgYXN5bmNQYXJzZUZuID0gKGxhbmd1YWdlRm9yRXh0ZW5zaW9uLCBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcikgPT5cbiAgICBtYXBQYXJzZXJzKFxuICAgICAgbGFuZ3VhZ2VGb3JFeHRlbnNpb24sXG4gICAgICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIHN5bmNNb2R1bGVUcmFuc2Zvcm1zLFxuICAgICk7XG5cbiAgaWYgKG1vZHVsZVRyYW5zZm9ybXMgJiYga2V5cyhtb2R1bGVUcmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIGFzeW5jUGFyc2VGbjtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIGlmICh2YWx1ZXMocGFyc2VyRm9yTGFuZ3VhZ2UpLnNvbWUoKHsgc3luY2hyb25vdXMgfSkgPT4gIXN5bmNocm9ub3VzKSkge1xuICAgIHJldHVybiBhc3luY1BhcnNlRm47XG4gIH1cblxuICAvKlxuXG5cblxuXG4gICAqL1xuICByZXR1cm4gKGxhbmd1YWdlRm9yRXh0ZW5zaW9uLCBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcikgPT5cbiAgICBtYXBQYXJzZXJzKFxuICAgICAgbGFuZ3VhZ2VGb3JFeHRlbnNpb24sXG4gICAgICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIHN5bmNNb2R1bGVUcmFuc2Zvcm1zLFxuICAgICAgdHJ1ZSxcbiAgICApO1xufTskaM2PX29uY2UubWFrZU1hcFBhcnNlcnMobWFrZU1hcFBhcnNlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcFBhcnNlcnMiOlsibWFrZU1hcFBhcnNlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0X/n8tMLAADTCwAAPAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiam9pbiIsInJlbGF0aXZpemUiLCJyZXNvbHZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuICovXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzb2x2ZSA9IChzb2x1dGlvbiwgcHJvYmxlbSkgPT4ge1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcHJvYmxlbSkge1xuICAgIGlmIChwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJycpIHtcbiAgICAgIC8vXG4gICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICBpZiAoc29sdXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNvbHV0aW9uLnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb2x1dGlvbi5wdXNoKHBhcnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHJlc29sdmUgPSAoc3BlYywgcmVmZXJyZXIpID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcbiAgcmVmZXJyZXIgPSBTdHJpbmcocmVmZXJyZXIgfHwgJycpO1xuXG4gIGlmIChzcGVjLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBub3QgYmVnaW4gd2l0aCBcIi9cImApO1xuICB9XG4gIGlmICghcmVmZXJyZXIuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgcmVmZXJyZXIgJHtxKHJlZmVycmVyKX0gbXVzdCBiZWdpbiB3aXRoIFwiLi9cImApO1xuICB9XG5cbiAgY29uc3Qgc3BlY1BhcnRzID0gc3BlYy5zcGxpdCgnLycpO1xuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBjb25zdCBwcm9ibGVtID0gW107XG4gIGlmIChzcGVjUGFydHNbMF0gPT09ICcuJyB8fCBzcGVjUGFydHNbMF0gPT09ICcuLicpIHtcbiAgICBjb25zdCByZWZlcnJlclBhcnRzID0gcmVmZXJyZXIuc3BsaXQoJy8nKTtcbiAgICBwcm9ibGVtLnB1c2goLi4ucmVmZXJyZXJQYXJ0cyk7XG4gICAgcHJvYmxlbS5wb3AoKTtcbiAgICBzb2x1dGlvbi5wdXNoKCcuJyk7XG4gIH1cbiAgcHJvYmxlbS5wdXNoKC4uLnNwZWNQYXJ0cyk7XG5cbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgcHJvYmxlbSkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gdmlhIHJlZmVycmVyICR7cShcbiAgICAgICAgcmVmZXJyZXIsXG4gICAgICApfSBtdXN0IG5vdCB0cmF2ZXJzZSBiZWhpbmQgYW4gZW1wdHkgcGF0aGAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzb2x1dGlvbi5qb2luKCcvJyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5yZXNvbHZlKHJlc29sdmUpO1xuICAgICAgIGNvbnN0IGpvaW4gPSAoYmFzZSwgc3BlYykgPT4ge1xuICBzcGVjID0gU3RyaW5nKHNwZWMgfHwgJycpO1xuICBiYXNlID0gU3RyaW5nKGJhc2UgfHwgJycpO1xuXG4gIGNvbnN0IHNwZWNQYXJ0cyA9IHNwZWMuc3BsaXQoJy8nKTtcbiAgY29uc3QgYmFzZVBhcnRzID0gYmFzZS5zcGxpdCgnLycpO1xuXG4gIGlmIChzcGVjUGFydHMubGVuZ3RoID4gMSAmJiBzcGVjUGFydHNbMF0gPT09ICcnKSB7XG4gICAgdGhyb3cgRXJyb3IoYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBzdGFydCB3aXRoIFwiL1wiYCk7XG4gIH1cbiAgaWYgKGJhc2VQYXJ0c1swXSA9PT0gJy4nIHx8IGJhc2VQYXJ0c1swXSA9PT0gJy4uJykge1xuICAgIHRocm93IEVycm9yKGBFeHRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShiYXNlKX0gbXVzdCBiZSBhYnNvbHV0ZWApO1xuICB9XG4gIGlmIChzcGVjUGFydHNbMF0gIT09ICcuJykge1xuICAgIHRocm93IEVycm9yKGBJbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBiZSByZWxhdGl2ZWApO1xuICB9XG5cbiAgY29uc3Qgc29sdXRpb24gPSBbXTtcbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgc3BlY1BhcnRzKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSB2aWEgYmFzZSAke3EoXG4gICAgICAgIGJhc2UsXG4gICAgICApfSBtdXN0IG5vdCByZWZlciB0byBhIG1vZHVsZSBvdXRzaWRlIG9mIHRoZSBiYXNlYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFtiYXNlLCAuLi5zb2x1dGlvbl0uam9pbignLycpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5qb2luKGpvaW4pO1xuICAgICAgIGNvbnN0IHJlbGF0aXZpemUgPSBzcGVjID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcblxuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBpZiAoIXNvbHZlKHNvbHV0aW9uLCBzcGVjLnNwbGl0KCcvJykpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFsnLicsIC4uLnNvbHV0aW9uXS5qb2luKCcvJyk7XG59OyRozY9fb25jZS5yZWxhdGl2aXplKHJlbGF0aXZpemUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVzb2x2ZSI6WyJyZXNvbHZlIl0sImpvaW4iOlsiam9pbiJdLCJyZWxhdGl2aXplIjpbInJlbGF0aXZpemUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgUf1NFIFAABSBQAAMgAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL3BhcnNlLWJ5dGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VCeXRlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZnJlZXplID0gT2JqZWN0LmZyZWV6ZTtcblxuLyogICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IHBhcnNlQnl0ZXMgPSAoYnl0ZXMsIF9zcGVjaWZpZXIsIF9sb2NhdGlvbiwgX3BhY2thZ2VMb2NhdGlvbikgPT4ge1xuICAvL1xuICBjb25zdCBidWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZXMubGVuZ3RoKTtcbiAgY29uc3QgYnl0ZXNWaWV3ID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgYnl0ZXNWaWV3LnNldChieXRlcyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbXBvcnRzID0gZnJlZXplKFtdKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gZXhwb3J0cyA9PiB7XG4gICAgZXhwb3J0cy5kZWZhdWx0ID0gYnVmZmVyO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAnYnl0ZXMnLFxuICAgIGJ5dGVzLFxuICAgIHJlY29yZDogZnJlZXplKHtcbiAgICAgIGltcG9ydHMsXG4gICAgICBleHBvcnRzOiBmcmVlemUoWydkZWZhdWx0J10pLFxuICAgICAgZXhlY3V0ZTogZnJlZXplKGV4ZWN1dGUpLFxuICAgIH0pLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VCeXRlcyhwYXJzZUJ5dGVzKTtcbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDp7XG4gIHBhcnNlOiBwYXJzZUJ5dGVzLFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlQnl0ZXMiOlsicGFyc2VCeXRlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACTY5TvVBUAAFQVAABGAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc3siaW1wb3J0cyI6WyIuL3Bvd2Vycy5qcyJdLCJleHBvcnRzIjpbImdldE1vZHVsZVBhdGhzIiwid3JhcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGZpbmRJbnZhbGlkUmVhZE5vd1Bvd2Vyc1Byb3BzLGlzUmVhZE5vd1Bvd2VyczskaM2PX2ltcG9ydHMoW1tcIi4vcG93ZXJzLmpzXCIsIFtbXCJmaW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wc1wiLFskaM2PX2EgPT4gKGZpbmRJbnZhbGlkUmVhZE5vd1Bvd2Vyc1Byb3BzID0gJGjNj19hKV1dLFtcImlzUmVhZE5vd1Bvd2Vyc1wiLFskaM2PX2EgPT4gKGlzUmVhZE5vd1Bvd2VycyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZnJlZXplLCBrZXlzLCBjcmVhdGUsIGhhc093blByb3BlcnR5LCBkZWZpbmVQcm9wZXJ0eSB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBoYXMgPSAob2JqZWN0LCBrZXkpID0+IGFwcGx5KGhhc093blByb3BlcnR5LCBvYmplY3QsIFtrZXldKTtcblxuLypcblxuICovXG5jb25zdCBub1RyYWlsaW5nU2xhc2ggPSBwYXRoID0+IHtcbiAgY29uc3QgbCA9IHBhdGgubGVuZ3RoIC0gMTtcbiAgcmV0dXJuIHBhdGhbbF0gPT09ICdcXFxcJyB8fCBwYXRoW2xdID09PSAnLycgPyBwYXRoLnNsaWNlKDAsIC0xKSA6IHBhdGg7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRNb2R1bGVQYXRocyA9IChyZWFkUG93ZXJzLCBsb2NhdGlvbikgPT4ge1xuICBpZiAoXG4gICAgcmVhZFBvd2VycyAmJlxuICAgIHR5cGVvZiByZWFkUG93ZXJzICE9PSAnZnVuY3Rpb24nICYmXG4gICAgcmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoXG4gICkge1xuICAgIGxldCBmaWxlbmFtZSA9IGxvY2F0aW9uO1xuICAgIGxldCBkaXJuYW1lO1xuICAgIHRyeSB7XG4gICAgICBkaXJuYW1lID0gbmV3IFVSTCgnLi8nLCBmaWxlbmFtZSkuaHJlZjtcbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmaWxlbmFtZTogbnVsbCxcbiAgICAgICAgZGlybmFtZTogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZmlsZW5hbWUgPSByZWFkUG93ZXJzLmZpbGVVUkxUb1BhdGgoZmlsZW5hbWUpLnRvU3RyaW5nKCk7XG4gICAgZGlybmFtZSA9IG5vVHJhaWxpbmdTbGFzaChyZWFkUG93ZXJzLmZpbGVVUkxUb1BhdGgoZGlybmFtZSkudG9TdHJpbmcoKSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZmlsZW5hbWUsXG4gICAgICBkaXJuYW1lLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lOiBudWxsLFxuICAgICAgZGlybmFtZTogbnVsbCxcbiAgICB9O1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmdldE1vZHVsZVBhdGhzKGdldE1vZHVsZVBhdGhzKTtcbiAgICAgICBjb25zdCB3cmFwID0gKHtcbiAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQsXG4gIGNvbXBhcnRtZW50LFxuICByZXNvbHZlZEltcG9ydHMsXG4gIGxvY2F0aW9uLFxuICByZWFkUG93ZXJzLFxufSkgPT4ge1xuICAvL1xuICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0ID0gY3JlYXRlKFxuICAgIGNvbXBhcnRtZW50Lmdsb2JhbFRoaXMuT2JqZWN0LnByb3RvdHlwZSxcbiAgKTtcblxuICAvL1xuICAvL1xuICBjb25zdCBwcm9tb3RlVG9OYW1lZEV4cG9ydCA9IChwcm9wLCB2YWx1ZSkgPT4ge1xuICAgIC8vXG4gICAgaWYgKHByb3AgIT09ICdkZWZhdWx0Jykge1xuICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF0gPSB2YWx1ZTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgcmVkZWZpbmVkID0gbmV3IFNldCgpO1xuXG4gIGNvbnN0IG9yaWdpbmFsRXhwb3J0cyA9IG5ldyBQcm94eShtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0LCB7XG4gICAgc2V0KF90YXJnZXQsIHByb3AsIHZhbHVlKSB7XG4gICAgICBwcm9tb3RlVG9OYW1lZEV4cG9ydChwcm9wLCB2YWx1ZSk7XG4gICAgICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdID0gdmFsdWU7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwgZGVzY3JpcHRvcikge1xuICAgICAgaWYgKGhhcyhkZXNjcmlwdG9yLCAndmFsdWUnKSkge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBwcm9tb3RlVG9OYW1lZEV4cG9ydChwcm9wLCBkZXNjcmlwdG9yLnZhbHVlKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wLCBkZXNjcmlwdG9yKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmVkZWZpbmVkLmFkZChwcm9wKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IG1vZHVsZSA9IHsgZXhwb3J0czogb3JpZ2luYWxFeHBvcnRzIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcmVxdWlyZSA9IGltcG9ydFNwZWNpZmllciA9PiB7XG4gICAgLy9cblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBuYW1lc3BhY2U7XG5cbiAgICBpZiAoIWhhcyhyZXNvbHZlZEltcG9ydHMsIGltcG9ydFNwZWNpZmllcikpIHtcbiAgICAgIGlmIChpc1JlYWROb3dQb3dlcnMocmVhZFBvd2VycykpIHtcbiAgICAgICAgbmFtZXNwYWNlID0gY29tcGFydG1lbnQuaW1wb3J0Tm93KGltcG9ydFNwZWNpZmllcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBpbnZhbGlkUHJvcHMgPSBmaW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wcyhyZWFkUG93ZXJzKS5zb3J0KCk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU3luY2hyb25vdXMgcmVhZFBvd2VycyByZXF1aXJlZCBmb3IgZHluYW1pYyBpbXBvcnQgb2YgJHthc3NlcnQucXVvdGUoaW1wb3J0U3BlY2lmaWVyKX07IG1pc3Npbmcgb3IgaW52YWxpZCBwcm9wKHMpOiAke2ludmFsaWRQcm9wcy5qb2luKCcsICcpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVzcGFjZSA9IGNvbXBhcnRtZW50LmltcG9ydE5vdyhyZXNvbHZlZEltcG9ydHNbaW1wb3J0U3BlY2lmaWVyXSk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIGlmIChoYXMobmFtZXNwYWNlLCAnZGVmYXVsdCcpKSB7XG4gICAgICByZXR1cm4gbmFtZXNwYWNlLmRlZmF1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuYW1lc3BhY2U7XG4gICAgfVxuICB9O1xuICBpZiAodHlwZW9mIHJlYWRQb3dlcnMgPT09ICdvYmplY3QnICYmIHJlYWRQb3dlcnMucmVxdWlyZVJlc29sdmUpIHtcbiAgICBjb25zdCB7IHJlcXVpcmVSZXNvbHZlIH0gPSByZWFkUG93ZXJzO1xuICAgIHJlcXVpcmUucmVzb2x2ZSA9IGZyZWV6ZSgoc3BlY2lmaWVyLCBvcHRpb25zKSA9PlxuICAgICAgcmVxdWlyZVJlc29sdmUobG9jYXRpb24sIHNwZWNpZmllciwgb3B0aW9ucyksXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICByZXF1aXJlLnJlc29sdmUgPSBmcmVlemUoc3BlY2lmaWVyID0+IHtcbiAgICAgIGNvbnN0IGVycm9yID0gRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgZmluZCBtb2R1bGUgJyR7c3BlY2lmaWVyfSdcXG5BZGQgcmVxdWlyZVJlc29sdmUgdG8gRW5kbyBDb21wYXJ0bWVudCBNYXBwZXIgcmVhZFBvd2Vycy5gLFxuICAgICAgKTtcbiAgICAgIGRlZmluZVByb3BlcnR5KGVycm9yLCAnY29kZScsIHsgdmFsdWU6ICdNT0RVTEVfTk9UX0ZPVU5EJyB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuICB9XG5cbiAgLy9cbiAgY29uc3QgcmVxdWlyZUV4dGVuc2lvbnMgPSBjcmVhdGUobnVsbCk7XG4gIGNvbnN0IGZhaWwgPSBmcmVlemUoXG4gICAgLypcblxuXG5cbiAgICAgKi9cbiAgICAoX21vZHVsZSwgX2ZpbGVuYW1lKSA9PiB7XG4gICAgICB0aHJvdyBFcnJvcignTm90IGltcGxlbWVudGVkJyk7XG4gICAgfSxcbiAgKTtcbiAgcmVxdWlyZUV4dGVuc2lvbnNbJy5qcyddID0gZmFpbDtcbiAgcmVxdWlyZUV4dGVuc2lvbnNbJy5qc29uJ10gPSBmYWlsO1xuICByZXF1aXJlRXh0ZW5zaW9uc1snLm5vZGUnXSA9IGZhaWw7XG4gIGZyZWV6ZShyZXF1aXJlRXh0ZW5zaW9ucyk7XG4gIHJlcXVpcmUuZXh0ZW5zaW9ucyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIHJlcXVpcmVFeHRlbnNpb25zXG4gICk7XG5cbiAgZnJlZXplKHJlcXVpcmUpO1xuXG4gIGNvbnN0IGFmdGVyRXhlY3V0ZSA9ICgpID0+IHtcbiAgICBjb25zdCBmaW5hbEV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0czsgLy9cbiAgICBjb25zdCBleHBvcnRzSGF2ZUJlZW5PdmVyd3JpdHRlbiA9IGZpbmFsRXhwb3J0cyAhPT0gb3JpZ2luYWxFeHBvcnRzO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGlmIChleHBvcnRzSGF2ZUJlZW5PdmVyd3JpdHRlbikge1xuICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdCA9IGZpbmFsRXhwb3J0cztcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBrZXlzKG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQgfHwge30pKSB7XG4gICAgICAgIGlmIChwcm9wICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZFtwcm9wXSA9IG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHRbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBwcm9wIG9mIHJlZGVmaW5lZCkge1xuICAgICAgICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZFtwcm9wXSA9IG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHRbcHJvcF07XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgbW9kdWxlLFxuICAgIG1vZHVsZUV4cG9ydHM6IG9yaWdpbmFsRXhwb3J0cyxcbiAgICBhZnRlckV4ZWN1dGUsXG4gICAgcmVxdWlyZSxcbiAgfTtcbn07JGjNj19vbmNlLndyYXAod3JhcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNb2R1bGVQYXRocyI6WyJnZXRNb2R1bGVQYXRocyJdLCJ3cmFwIjpbIndyYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfr9W5kQFAABEBQAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL3BhcnNlLWpzb24uanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlSnNvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhcnNlTG9jYXRlZEpzb247JGjNj19pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIixbJGjNj19hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGZyZWV6ZSA9IE9iamVjdC5mcmVlemU7XG5cbmNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbi8qICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBwYXJzZUpzb24gPSAoYnl0ZXMsIF9zcGVjaWZpZXIsIGxvY2F0aW9uLCBfcGFja2FnZUxvY2F0aW9uKSA9PiB7XG4gIGNvbnN0IHNvdXJjZSA9IHRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaW1wb3J0cyA9IGZyZWV6ZShbXSk7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgZXhlY3V0ZSA9IGV4cG9ydHMgPT4ge1xuICAgIGV4cG9ydHMuZGVmYXVsdCA9IHBhcnNlTG9jYXRlZEpzb24oc291cmNlLCBsb2NhdGlvbik7XG4gIH07XG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAnanNvbicsXG4gICAgYnl0ZXMsXG4gICAgcmVjb3JkOiBmcmVlemUoe1xuICAgICAgaW1wb3J0cyxcbiAgICAgIGV4cG9ydHM6IGZyZWV6ZShbJ2RlZmF1bHQnXSksXG4gICAgICBleGVjdXRlOiBmcmVlemUoZXhlY3V0ZSksXG4gICAgfSksXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZUpzb24ocGFyc2VKc29uKTtcbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDp7XG4gIHBhcnNlOiBwYXJzZUpzb24sXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VKc29uIjpbInBhcnNlSnNvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAjk/HXIggAACIIAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvcGFyc2UtcHJlLWNqcy5qc3siaW1wb3J0cyI6WyIuL2pzb24uanMiLCIuL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VQcmVDanMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXJzZUxvY2F0ZWRKc29uLHdyYXAsZ2V0TW9kdWxlUGF0aHM7JGjNj19pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIixbJGjNj19hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjNj19hKV1dXV0sW1wiLi9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzXCIsIFtbXCJ3cmFwXCIsWyRozY9fYSA9PiAod3JhcCA9ICRozY9fYSldXSxbXCJnZXRNb2R1bGVQYXRoc1wiLFskaM2PX2EgPT4gKGdldE1vZHVsZVBhdGhzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VQcmVDanMgPSAoXG4gIGJ5dGVzLFxuICBfc3BlY2lmaWVyLFxuICBsb2NhdGlvbixcbiAgX3BhY2thZ2VMb2NhdGlvbixcbiAgeyByZWFkUG93ZXJzIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbiAgY29uc3QgeyBzb3VyY2UsIGltcG9ydHMsIGV4cG9ydHMsIHJlZXhwb3J0cyB9ID0gcGFyc2VMb2NhdGVkSnNvbihcbiAgICB0ZXh0LFxuICAgIGxvY2F0aW9uLFxuICApO1xuXG4gIGNvbnN0IHsgZmlsZW5hbWUsIGRpcm5hbWUgfSA9IGdldE1vZHVsZVBhdGhzKHJlYWRQb3dlcnMsIGxvY2F0aW9uKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgZXhlY3V0ZSA9IChtb2R1bGVFbnZpcm9ubWVudFJlY29yZCwgY29tcGFydG1lbnQsIHJlc29sdmVkSW1wb3J0cykgPT4ge1xuICAgIGNvbnN0IGZ1bmN0b3IgPSBjb21wYXJ0bWVudC5ldmFsdWF0ZShzb3VyY2UpO1xuXG4gICAgY29uc3QgeyByZXF1aXJlLCBtb2R1bGVFeHBvcnRzLCBtb2R1bGUsIGFmdGVyRXhlY3V0ZSB9ID0gd3JhcCh7XG4gICAgICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZCxcbiAgICAgIGNvbXBhcnRtZW50LFxuICAgICAgcmVzb2x2ZWRJbXBvcnRzLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByZWFkUG93ZXJzLFxuICAgIH0pO1xuXG4gICAgLy9cbiAgICBmdW5jdG9yLmNhbGwoXG4gICAgICBtb2R1bGVFeHBvcnRzLFxuICAgICAgcmVxdWlyZSxcbiAgICAgIG1vZHVsZUV4cG9ydHMsXG4gICAgICBtb2R1bGUsXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIGRpcm5hbWUsXG4gICAgKTtcblxuICAgIGFmdGVyRXhlY3V0ZSgpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAncHJlLWNqcy1qc29uJyxcbiAgICBieXRlcyxcbiAgICByZWNvcmQ6IHtcbiAgICAgIGltcG9ydHMsXG4gICAgICByZWV4cG9ydHMsXG4gICAgICBleHBvcnRzLFxuICAgICAgZXhlY3V0ZSxcbiAgICB9LFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VQcmVDanMocGFyc2VQcmVDanMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlUHJlQ2pzLFxuICBoZXVyaXN0aWNJbXBvcnRzOiB0cnVlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVDanMiOlsicGFyc2VQcmVDanMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATGHaW1UFAABVBQAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL3BhcnNlLXByZS1tanMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlTWpzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VMb2NhdGVkSnNvbjskaM2PX2ltcG9ydHMoW1tcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLFskaM2PX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuLyogICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IHBhcnNlUHJlTWpzID0gKFxuICBieXRlcyxcbiAgX3NwZWNpZmllcixcbiAgbG9jYXRpb24sXG4gIF9wYWNrYWdlTG9jYXRpb24sXG4gIHsgc291cmNlTWFwVXJsIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbiAgY29uc3QgcmVjb3JkID0gcGFyc2VMb2NhdGVkSnNvbih0ZXh0LCBsb2NhdGlvbik7XG4gIGlmIChzb3VyY2VNYXBVcmwpIHtcbiAgICAvL1xuICAgIHJlY29yZC5fX3N5bmNNb2R1bGVQcm9ncmFtX18gKz0gYC8vIyBzb3VyY2VNYXBwaW5nVVJMPSR7c291cmNlTWFwVXJsfVxcbmA7XG4gIH0gZWxzZSB7XG4gICAgLy9cbiAgICByZWNvcmQuX19zeW5jTW9kdWxlUHJvZ3JhbV9fICs9IGAvLyMgc291cmNlVVJMPSR7bG9jYXRpb259XFxuYDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHBhcnNlcjogJ3ByZS1tanMtanNvbicsXG4gICAgYnl0ZXMsXG4gICAgcmVjb3JkLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VQcmVNanMocGFyc2VQcmVNanMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlUHJlTWpzLFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlUHJlTWpzIjpbInBhcnNlUHJlTWpzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFk9swT+BAAA/gQAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wYXJzZS10ZXh0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VUZXh0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGZyZWV6ZSA9IE9iamVjdC5mcmVlemU7XG5cbmNvbnN0IHRleHREZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG5cbi8qICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBwYXJzZVRleHQgPSAoYnl0ZXMsIF9zcGVjaWZpZXIsIF9sb2NhdGlvbiwgX3BhY2thZ2VMb2NhdGlvbikgPT4ge1xuICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGltcG9ydHMgPSBmcmVlemUoW10pO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBleHBvcnRzID0+IHtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSB0ZXh0O1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAndGV4dCcsXG4gICAgYnl0ZXMsXG4gICAgcmVjb3JkOiBmcmVlemUoe1xuICAgICAgaW1wb3J0cyxcbiAgICAgIGV4cG9ydHM6IGZyZWV6ZShbJ2RlZmF1bHQnXSksXG4gICAgICBleGVjdXRlOiBmcmVlemUoZXhlY3V0ZSksXG4gICAgfSksXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZVRleHQocGFyc2VUZXh0KTtcbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDp7XG4gIHBhcnNlOiBwYXJzZVRleHQsXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VUZXh0IjpbInBhcnNlVGV4dCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADZ3AwGYxkAAGMZAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvcG9saWN5LWZvcm1hdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiV0lMRENBUkRfUE9MSUNZX1ZBTFVFIiwiYXNzZXJ0UGFja2FnZVBvbGljeSIsImFzc2VydFBvbGljeSIsImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiIsImlzQWxsb3dpbmdFdmVyeXRoaW5nIiwiaXNBdHRlbnVhdGlvbkRlZmluaXRpb24iLCJwb2xpY3lMb29rdXBIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBBVFRFTlVBVE9SX0tFWSA9ICdhdHRlbnVhdGUnO1xuY29uc3QgQVRURU5VQVRPUl9QQVJBTVNfS0VZID0gJ3BhcmFtcyc7XG4gICAgICAgY29uc3QgV0lMRENBUkRfUE9MSUNZX1ZBTFVFID0gJ2FueSc7JGjNj19vbmNlLldJTERDQVJEX1BPTElDWV9WQUxVRShXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUpO1xuXG5jb25zdCBQT0xJQ1lfRklFTERTX0xPT0tVUCA9IC8qICAgICAgICAgICAgICAgICovIChbXG4gICdidWlsdGlucycsXG4gICdnbG9iYWxzJyxcbiAgJ3BhY2thZ2VzJyxcbl0pO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBvbGljeUxvb2t1cEhlbHBlciA9IChwYWNrYWdlUG9saWN5LCBmaWVsZCwgaXRlbU5hbWUpID0+IHtcbiAgaWYgKCFQT0xJQ1lfRklFTERTX0xPT0tVUC5pbmNsdWRlcyhmaWVsZCkpIHtcbiAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBmaWVsZCAke3EoZmllbGQpfWApO1xuICB9XG4gIGlmIChcbiAgICB0eXBlb2YgcGFja2FnZVBvbGljeSAhPT0gJ29iamVjdCcgfHxcbiAgICBwYWNrYWdlUG9saWN5ID09PSBudWxsIHx8XG4gICAgIXBhY2thZ2VQb2xpY3lbZmllbGRdXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChwYWNrYWdlUG9saWN5W2ZpZWxkXSA9PT0gV0lMRENBUkRfUE9MSUNZX1ZBTFVFKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCB2YWx1ZSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgcGFja2FnZVBvbGljeVtmaWVsZF1cbiAgKTtcbiAgaWYgKGl0ZW1OYW1lIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlW2l0ZW1OYW1lXTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UucG9saWN5TG9va3VwSGVscGVyKHBvbGljeUxvb2t1cEhlbHBlcik7XG4gICAgICAgY29uc3QgaXNBbGxvd2luZ0V2ZXJ5dGhpbmcgPSBwb2xpY3lWYWx1ZSA9PlxuICBwb2xpY3lWYWx1ZSA9PT0gV0lMRENBUkRfUE9MSUNZX1ZBTFVFO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmlzQWxsb3dpbmdFdmVyeXRoaW5nKGlzQWxsb3dpbmdFdmVyeXRoaW5nKTtcbiAgICAgICBjb25zdCBpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiA9IGFsbGVnZWREZWZpbml0aW9uID0+IHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgKGFsbGVnZWREZWZpbml0aW9uICYmXG4gICAgICB0eXBlb2YgYWxsZWdlZERlZmluaXRpb24gPT09ICdvYmplY3QnICYmXG4gICAgICB0eXBlb2YgYWxsZWdlZERlZmluaXRpb25bQVRURU5VQVRPUl9LRVldID09PSAnc3RyaW5nJykgfHwgLy9cbiAgICAgIGlzQXJyYXkoYWxsZWdlZERlZmluaXRpb24pICAvL1xuICApO1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5pc0F0dGVudWF0aW9uRGVmaW5pdGlvbihpc0F0dGVudWF0aW9uRGVmaW5pdGlvbik7XG4gICAgICAgY29uc3QgZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uID0gYXR0ZW51YXRpb25EZWZpbml0aW9uID0+IHtcbiAgaWYgKCFpc0F0dGVudWF0aW9uRGVmaW5pdGlvbihhdHRlbnVhdGlvbkRlZmluaXRpb24pKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgSW52YWxpZCBhdHRlbnVhdGlvbiAke3EoXG4gICAgICAgIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgICAgICl9LCBtdXN0IGJlIGFuIGFycmF5IG9mIHBhcmFtcyBmb3IgZGVmYXVsdCBhdHRlbnVhdG9yIG9yIGFuIG9iamVjdCB3aXRoIGFuIGF0dGVudWF0b3Iga2V5YCxcbiAgICApO1xuICB9XG4gIGlmIChpc0FycmF5KGF0dGVudWF0aW9uRGVmaW5pdGlvbikpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZGlzcGxheU5hbWU6ICc8ZGVmYXVsdCBhdHRlbnVhdG9yPicsXG4gICAgICBzcGVjaWZpZXI6IG51bGwsXG4gICAgICBwYXJhbXM6IGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5TmFtZTogYXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfS0VZXSxcbiAgICAgIHNwZWNpZmllcjogYXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfS0VZXSxcbiAgICAgIHBhcmFtczogYXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfUEFSQU1TX0tFWV0sXG4gICAgfTtcbiAgfVxufTtcblxuLy9cbiRozY9fb25jZS5nZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKTtjb25zdCBpc1JlY29yZE9mPShpdGVtLHByZWRpY2F0ZSk9PntcbiAgaWYgKHR5cGVvZiBpdGVtICE9PSAnb2JqZWN0JyB8fCBpdGVtID09PSBudWxsIHx8IGlzQXJyYXkoaXRlbSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGVudHJpZXMoaXRlbSkuZXZlcnkoKFtrZXksIHZhbHVlXSkgPT4gcHJlZGljYXRlKHZhbHVlLCBrZXkpKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGlzQm9vbGVhbiA9IGl0ZW0gPT4gdHlwZW9mIGl0ZW0gPT09ICdib29sZWFuJztcblxuLy9cbmNvbnN0IHByZWRpY2F0ZU9yID1cbiAgKC4uLnByZWRpY2F0ZXMpID0+XG4gIGl0ZW0gPT5cbiAgICBwcmVkaWNhdGVzLnNvbWUocCA9PiBwKGl0ZW0pKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGlzUG9saWN5SXRlbSA9IGl0ZW0gPT5cbiAgaXRlbSA9PT0gdW5kZWZpbmVkIHx8XG4gIGl0ZW0gPT09IFdJTERDQVJEX1BPTElDWV9WQUxVRSB8fFxuICBpc1JlY29yZE9mKGl0ZW0sIGlzQm9vbGVhbik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UGFja2FnZVBvbGljeSA9IChhbGxlZ2VkUGFja2FnZVBvbGljeSwgcGF0aCwgdXJsKSA9PiB7XG4gIGlmIChhbGxlZ2VkUGFja2FnZVBvbGljeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGluVXJsID0gdXJsID8gYCBpbiAke3EodXJsKX1gIDogJyc7XG5cbiAgY29uc3QgcGFja2FnZVBvbGljeSA9IE9iamVjdChhbGxlZ2VkUGFja2FnZVBvbGljeSk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkUGFja2FnZVBvbGljeSA9PT0gcGFja2FnZVBvbGljeSAmJiAhaXNBcnJheShhbGxlZ2VkUGFja2FnZVBvbGljeSksXG4gICAgYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZFBhY2thZ2VQb2xpY3kpfSR7aW5Vcmx9YCxcbiAgKTtcbiAgY29uc3Qge1xuICAgIHBhY2thZ2VzLFxuICAgIGJ1aWx0aW5zLFxuICAgIGdsb2JhbHMsXG4gICAgbm9HbG9iYWxGcmVlemUsXG4gICAgZGVmYXVsdEF0dGVudWF0b3I6IF9pZ25vcmUsIC8vXG4gICAgLy9cbiAgICBvcHRpb25zLCAvL1xuICAgIC4uLmV4dHJhXG4gIH0gPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocGFja2FnZVBvbGljeSk7XG5cbiAgYXNzZXJ0KFxuICAgIGtleXMoZXh0cmEpLmxlbmd0aCA9PT0gMCxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoa2V5cyhleHRyYSkpfSR7aW5Vcmx9YCxcbiAgKTtcblxuICBhc3NlcnQoXG4gICAgbm9HbG9iYWxGcmVlemUgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2Ygbm9HbG9iYWxGcmVlemUgPT09ICdib29sZWFuJyxcbiAgICBgJHtwYXRofS5ub0dsb2JhbEZyZWV6ZSBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7cSh7XG4gICAgICBub0dsb2JhbEZyZWV6ZSxcbiAgICB9KX0ke2luVXJsfWAsXG4gICk7XG5cbiAgaXNQb2xpY3lJdGVtKHBhY2thZ2VzKSB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0ucGFja2FnZXMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucywgZ290ICR7cSh7XG4gICAgICAgIHBhY2thZ2VzLFxuICAgICAgfSl9JHtpblVybH1gLFxuICAgICk7XG5cbiAgaXNQb2xpY3lJdGVtKGdsb2JhbHMpIHx8XG4gICAgaXNBdHRlbnVhdGlvbkRlZmluaXRpb24oZ2xvYmFscykgfHxcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIGAke3BhdGh9Lmdsb2JhbHMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhIHNpbmdsZSBhdHRlbnVhdGlvbiwgZ290ICR7cShcbiAgICAgICAge1xuICAgICAgICAgIGdsb2JhbHMsXG4gICAgICAgIH0sXG4gICAgICApfSR7aW5Vcmx9YCxcbiAgICApO1xuXG4gIGlzUG9saWN5SXRlbShidWlsdGlucykgfHxcbiAgICBpc1JlY29yZE9mKGJ1aWx0aW5zLCBwcmVkaWNhdGVPcihpc0Jvb2xlYW4sIGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKSkgfHxcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIGAke3BhdGh9LmJ1aWx0aW5zIG11c3QgYmUgYSByZWNvcmQgb2YgYm9vbGVhbnMgb3IgYXR0ZW51YXRpb25zLCBnb3QgJHtxKHtcbiAgICAgICAgYnVpbHRpbnMsXG4gICAgICB9KX0ke2luVXJsfWAsXG4gICAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0UGFja2FnZVBvbGljeShhc3NlcnRQYWNrYWdlUG9saWN5KTtcbiAgICAgICBjb25zdCBhc3NlcnRQb2xpY3kgPSBhbGxlZ2VkUG9saWN5ID0+IHtcbiAgaWYgKGFsbGVnZWRQb2xpY3kgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBwb2xpY3kgPSBPYmplY3QoYWxsZWdlZFBvbGljeSk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkUG9saWN5ID09PSBwb2xpY3kgJiYgIUFycmF5LmlzQXJyYXkocG9saWN5KSxcbiAgICBgcG9saWN5IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkUG9saWN5fWAsXG4gICk7XG5cbiAgY29uc3QgeyByZXNvdXJjZXMsIGVudHJ5LCBkZWZhdWx0QXR0ZW51YXRvciwgLi4uZXh0cmEgfSA9IHBvbGljeTtcbiAgYXNzZXJ0KFxuICAgIGtleXMoZXh0cmEpLmxlbmd0aCA9PT0gMCxcbiAgICBgcG9saWN5IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShrZXlzKGV4dHJhKSl9YCxcbiAgKTtcblxuICBhc3NlcnQoXG4gICAgdHlwZW9mIHJlc291cmNlcyA9PT0gJ29iamVjdCcgJiYgcmVzb3VyY2VzICE9PSBudWxsICYmICFpc0FycmF5KHJlc291cmNlcyksXG4gICAgYHBvbGljeS5yZXNvdXJjZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EocmVzb3VyY2VzKX1gLFxuICApO1xuICBhc3NlcnQoXG4gICAgIWRlZmF1bHRBdHRlbnVhdG9yIHx8IHR5cGVvZiBkZWZhdWx0QXR0ZW51YXRvciA9PT0gJ3N0cmluZycsXG4gICAgYHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvciBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGRlZmF1bHRBdHRlbnVhdG9yKX1gLFxuICApO1xuXG4gIGFzc2VydFBhY2thZ2VQb2xpY3koZW50cnksIGBwb2xpY3kuZW50cnlgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBlbnRyaWVzKHJlc291cmNlcykpIHtcbiAgICBhc3NlcnRQYWNrYWdlUG9saWN5KHZhbHVlLCBgcG9saWN5LnJlc291cmNlc1tcIiR7a2V5fVwiXWApO1xuICB9XG59OyRozY9fb25jZS5hc3NlcnRQb2xpY3koYXNzZXJ0UG9saWN5KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IldJTERDQVJEX1BPTElDWV9WQUxVRSI6WyJXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUiXSwicG9saWN5TG9va3VwSGVscGVyIjpbInBvbGljeUxvb2t1cEhlbHBlciJdLCJpc0FsbG93aW5nRXZlcnl0aGluZyI6WyJpc0FsbG93aW5nRXZlcnl0aGluZyJdLCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiI6WyJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiJdLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iOlsiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uIl0sImFzc2VydFBhY2thZ2VQb2xpY3kiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSJdLCJhc3NlcnRQb2xpY3kiOlsiYXNzZXJ0UG9saWN5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAObZbvY8KgAAPCoAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wb2xpY3kuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiLCJhdHRlbnVhdGVHbG9iYWxzIiwiYXR0ZW51YXRlTW9kdWxlSG9vayIsImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiLCJkZXRlY3RBdHRlbnVhdG9ycyIsImVuZm9yY2VNb2R1bGVQb2xpY3kiLCJnZXRQb2xpY3lGb3JQYWNrYWdlIiwibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbixpc0FsbG93aW5nRXZlcnl0aGluZyxpc0F0dGVudWF0aW9uRGVmaW5pdGlvbixwb2xpY3lMb29rdXBIZWxwZXI7JGjNj19pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvblwiLFskaM2PX2EgPT4gKGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiA9ICRozY9fYSldXSxbXCJpc0FsbG93aW5nRXZlcnl0aGluZ1wiLFskaM2PX2EgPT4gKGlzQWxsb3dpbmdFdmVyeXRoaW5nID0gJGjNj19hKV1dLFtcImlzQXR0ZW51YXRpb25EZWZpbml0aW9uXCIsWyRozY9fYSA9PiAoaXNBdHRlbnVhdGlvbkRlZmluaXRpb24gPSAkaM2PX2EpXV0sW1wicG9saWN5TG9va3VwSGVscGVyXCIsWyRozY9fYSA9PiAocG9saWN5TG9va3VwSGVscGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBjcmVhdGUsIGVudHJpZXMsIHZhbHVlcywgYXNzaWduLCBmcmVlemUsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgfSA9XG4gIE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuLypcblxuICovXG4gICAgICAgY29uc3QgQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQgPSAnPEFUVEVOVUFUT1JTPic7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKTtcbmNvbnN0IHNlbGVjdGl2ZUNvcHkgPSAoZnJvbSwgdG8sIGxpc3QpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IHByb3BzO1xuICBpZiAoIWxpc3QpIHtcbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoZnJvbSk7XG4gICAgcHJvcHMgPSBvd25LZXlzKGZyb20pLmZpbHRlcihrZXkgPT4gZGVzY3Nba2V5XS5lbnVtZXJhYmxlKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9wcyA9IGxpc3Q7XG4gIH1cbiAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHByb3BzLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNvbnN0IGtleSA9IHByb3BzW2luZGV4XTtcbiAgICAvL1xuICAgIC8vXG4gICAgdG9ba2V5XSA9IGZyb21ba2V5XTtcbiAgfVxuICByZXR1cm4gdG87XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29sbGVjdEF0dGVudWF0b3JzID0gKGF0dGVudWF0b3JzLCBwb2xpY3lGcmFnbWVudCkgPT4ge1xuICBpZiAoJ2F0dGVudWF0ZScgaW4gcG9saWN5RnJhZ21lbnQpIHtcbiAgICBhdHRlbnVhdG9ycy5wdXNoKHBvbGljeUZyYWdtZW50LmF0dGVudWF0ZSk7XG4gIH1cbiAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMocG9saWN5RnJhZ21lbnQpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwpIHtcbiAgICAgIGNvbGxlY3RBdHRlbnVhdG9ycyhhdHRlbnVhdG9ycywgdmFsdWUpO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgYXR0ZW51YXRvcnNDYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGV0ZWN0QXR0ZW51YXRvcnMgPSBwb2xpY3kgPT4ge1xuICBpZiAoIXBvbGljeSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBpZiAoIWF0dGVudWF0b3JzQ2FjaGUuaGFzKHBvbGljeSkpIHtcbiAgICBjb25zdCBhdHRlbnVhdG9ycyA9IFtdO1xuICAgIGlmIChwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IpIHtcbiAgICAgIGF0dGVudWF0b3JzLnB1c2gocG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yKTtcbiAgICB9XG4gICAgY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLCBwb2xpY3kpO1xuICAgIGF0dGVudWF0b3JzQ2FjaGUuc2V0KHBvbGljeSwgYXR0ZW51YXRvcnMpO1xuICB9XG4gIHJldHVybiBhdHRlbnVhdG9yc0NhY2hlLmdldChwb2xpY3kpO1xufTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmRldGVjdEF0dGVudWF0b3JzKGRldGVjdEF0dGVudWF0b3JzKTtcbmNvbnN0IGdlbmVyYXRlQ2Fub25pY2FsTmFtZSA9ICh7IGlzRW50cnkgPSBmYWxzZSwgbmFtZSwgcGF0aCB9KSA9PiB7XG4gIGlmIChpc0VudHJ5KSB7XG4gICAgdGhyb3cgRXJyb3IoJ0VudHJ5IG1vZHVsZSBjYW5ub3QgYmUgaWRlbnRpZmllZCB3aXRoIGEgY2Fub25pY2FsTmFtZScpO1xuICB9XG4gIGlmIChuYW1lID09PSBBVFRFTlVBVE9SU19DT01QQVJUTUVOVCkge1xuICAgIHJldHVybiBBVFRFTlVBVE9SU19DT01QQVJUTUVOVDtcbiAgfVxuICByZXR1cm4gcGF0aC5qb2luKCc+Jyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSA9IChuYW1pbmdLaXQsIHBhY2thZ2VQb2xpY3kpID0+IHtcbiAgaWYgKG5hbWluZ0tpdC5pc0VudHJ5KSB7XG4gICAgLy9cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgY2Fub25pY2FsTmFtZSA9IGdlbmVyYXRlQ2Fub25pY2FsTmFtZShuYW1pbmdLaXQpO1xuICByZXR1cm4gISFwb2xpY3lMb29rdXBIZWxwZXIocGFja2FnZVBvbGljeSwgJ3BhY2thZ2VzJywgY2Fub25pY2FsTmFtZSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3koZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSk7XG4gICAgICAgY29uc3QgZ2V0UG9saWN5Rm9yUGFja2FnZSA9IChuYW1pbmdLaXQsIHBvbGljeSkgPT4ge1xuICBpZiAoIXBvbGljeSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKG5hbWluZ0tpdC5pc0VudHJ5KSB7XG4gICAgcmV0dXJuIHBvbGljeS5lbnRyeTtcbiAgfVxuICBjb25zdCBjYW5vbmljYWxOYW1lID0gZ2VuZXJhdGVDYW5vbmljYWxOYW1lKG5hbWluZ0tpdCk7XG4gIGlmIChjYW5vbmljYWxOYW1lID09PSBBVFRFTlVBVE9SU19DT01QQVJUTUVOVCkge1xuICAgIHJldHVybiB7IGRlZmF1bHRBdHRlbnVhdG9yOiBwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IsIHBhY2thZ2VzOiAnYW55JyB9O1xuICB9XG4gIGlmIChwb2xpY3kucmVzb3VyY2VzICYmIHBvbGljeS5yZXNvdXJjZXNbY2Fub25pY2FsTmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBwb2xpY3kucmVzb3VyY2VzW2Nhbm9uaWNhbE5hbWVdO1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgcmV0dXJuIGNyZWF0ZShudWxsKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5nZXRQb2xpY3lGb3JQYWNrYWdlKGdldFBvbGljeUZvclBhY2thZ2UpO1xuY29uc3QgZ2V0R2xvYmFsc0xpc3QgPSBwYWNrYWdlUG9saWN5ID0+IHtcbiAgaWYgKCFwYWNrYWdlUG9saWN5IHx8ICFwYWNrYWdlUG9saWN5Lmdsb2JhbHMpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIGVudHJpZXMocGFja2FnZVBvbGljeS5nbG9iYWxzKVxuICAgIC5maWx0ZXIoKFtfa2V5LCB2YWx1ZV0pID0+IHZhbHVlKVxuICAgIC5tYXAoKFtrZXksIF92dmFsdWVdKSA9PiBrZXkpO1xufTtcblxuY29uc3QgR0xPQkFMX0FUVEVOVUFUT1IgPSAnYXR0ZW51YXRlR2xvYmFscyc7XG5jb25zdCBNT0RVTEVfQVRURU5VQVRPUiA9ICdhdHRlbnVhdGVNb2R1bGUnO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24gPSBhc3luYyAoXG4gIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgYXR0ZW51YXRvcnNQcm92aWRlcixcbiAgYXR0ZW51YXRvckV4cG9ydE5hbWUsXG4pID0+IHtcbiAgaWYgKCFhdHRlbnVhdG9yc1Byb3ZpZGVyKSB7XG4gICAgdGhyb3cgRXJyb3IoYGF0dGVudWF0b3JzUHJvdmlkZXIgaXMgcmVxdWlyZWQgdG8gaW1wb3J0IGF0dGVudWF0b3JzYCk7XG4gIH1cbiAgY29uc3QgeyBzcGVjaWZpZXIsIHBhcmFtcywgZGlzcGxheU5hbWUgfSA9IGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihcbiAgICBhdHRlbnVhdGlvbkRlZmluaXRpb24sXG4gICk7XG4gIGNvbnN0IGF0dGVudWF0b3IgPSBhd2FpdCBhdHRlbnVhdG9yc1Byb3ZpZGVyLmltcG9ydChzcGVjaWZpZXIpO1xuICBpZiAoIWF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgQXR0ZW51YXRvciAke3EoZGlzcGxheU5hbWUpfSBkb2VzIG5vdCBleHBvcnQgJHtxKGF0dGVudWF0b3JFeHBvcnROYW1lKX1gLFxuICAgICk7XG4gIH1cbiAgLy9cbiAgY29uc3QgYXR0ZW51YXRlID0gYXR0ZW51YXRvclthdHRlbnVhdG9yRXhwb3J0TmFtZV0uYmluZChhdHRlbnVhdG9yLCBwYXJhbXMpO1xuICByZXR1cm4gYXR0ZW51YXRlO1xufTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciA9IChcbiAgY29tcGFydG1lbnRzLFxuICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGltcG9ydEF0dGVudWF0b3I7XG4gIGxldCBkZWZhdWx0QXR0ZW51YXRvcjtcbiAgLy9cbiAgLy9cbiAgaWYgKCFjb21wYXJ0bWVudERlc2NyaXB0b3JzW0FUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXSkge1xuICAgIGltcG9ydEF0dGVudWF0b3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICB0aHJvdyBFcnJvcihgTm8gYXR0ZW51YXRvcnMgc3BlY2lmaWVkIGluIHBvbGljeWApO1xuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgZGVmYXVsdEF0dGVudWF0b3IgPVxuICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yc1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0ucG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLypcblxuXG5cbiAgICAgKi9cbiAgICBpbXBvcnRBdHRlbnVhdG9yID0gYXN5bmMgYXR0ZW51YXRvclNwZWNpZmllciA9PiB7XG4gICAgICBpZiAoIWF0dGVudWF0b3JTcGVjaWZpZXIpIHtcbiAgICAgICAgaWYgKCFkZWZhdWx0QXR0ZW51YXRvcikge1xuICAgICAgICAgIHRocm93IEVycm9yKGBObyBkZWZhdWx0IGF0dGVudWF0b3Igc3BlY2lmaWVkIGluIHBvbGljeWApO1xuICAgICAgICB9XG4gICAgICAgIGF0dGVudWF0b3JTcGVjaWZpZXIgPSBkZWZhdWx0QXR0ZW51YXRvcjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgbmFtZXNwYWNlIH0gPSBhd2FpdCBjb21wYXJ0bWVudHNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdLmltcG9ydChcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICovIChhdHRlbnVhdG9yU3BlY2lmaWVyKSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gbmFtZXNwYWNlO1xuICAgIH07XG4gIH1cblxuICByZXR1cm4geyBpbXBvcnQ6IGltcG9ydEF0dGVudWF0b3IgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIpO1xuYXN5bmMgZnVuY3Rpb24gYXR0ZW51YXRlR2xvYmFsVGhpcyh7XG4gIGF0dGVudWF0b3JzLFxuICBhdHRlbnVhdGlvbkRlZmluaXRpb24sXG4gIGdsb2JhbFRoaXMsXG4gIGdsb2JhbHMsXG59KSB7XG4gIGNvbnN0IGF0dGVudWF0ZSA9IGF3YWl0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uKFxuICAgIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgICBhdHRlbnVhdG9ycyxcbiAgICBHTE9CQUxfQVRURU5VQVRPUixcbiAgKTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuXG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgLy9cblxuICBjb25zdCByZXN1bHQgPSAvKiAgICAgICAqLyBhdHRlbnVhdGUoZ2xvYmFscywgZ2xvYmFsVGhpcyk7XG4gIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQgIT09IG51bGwpIHtcbiAgICBhc3NpZ24oZ2xvYmFsVGhpcywgcmVzdWx0KTtcbiAgfVxufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXR0ZW51YXRlR2xvYmFscyA9IChcbiAgZ2xvYmFsVGhpcyxcbiAgZ2xvYmFscyxcbiAgcGFja2FnZVBvbGljeSxcbiAgYXR0ZW51YXRvcnMsXG4gIHBlbmRpbmdKb2JzLFxuICBuYW1lID0gJzx1bmtub3duPicsXG4pID0+IHtcbiAgbGV0IGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCA9ICgpID0+IHtcbiAgICBmcmVlemUoZ2xvYmFsVGhpcyk7XG4gIH07XG4gIGlmIChwYWNrYWdlUG9saWN5ICYmIHBhY2thZ2VQb2xpY3kubm9HbG9iYWxGcmVlemUpIHtcbiAgICBmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQgPSAoKSA9PiB7fTtcbiAgfVxuICBpZiAoIXBhY2thZ2VQb2xpY3kgfHwgaXNBbGxvd2luZ0V2ZXJ5dGhpbmcocGFja2FnZVBvbGljeS5nbG9iYWxzKSkge1xuICAgIHNlbGVjdGl2ZUNvcHkoZ2xvYmFscywgZ2xvYmFsVGhpcyk7XG4gICAgZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0KCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChpc0F0dGVudWF0aW9uRGVmaW5pdGlvbihwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKSB7XG4gICAgY29uc3QgYXR0ZW51YXRpb25EZWZpbml0aW9uID0gcGFja2FnZVBvbGljeS5nbG9iYWxzO1xuICAgIGNvbnN0IHsgZGlzcGxheU5hbWUgfSA9IGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihhdHRlbnVhdGlvbkRlZmluaXRpb24pO1xuICAgIGNvbnN0IGF0dGVudWF0aW9uUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpIC8vXG4gICAgICAudGhlbigoKSA9PlxuICAgICAgICBhdHRlbnVhdGVHbG9iYWxUaGlzKHtcbiAgICAgICAgICBhdHRlbnVhdG9ycyxcbiAgICAgICAgICBhdHRlbnVhdGlvbkRlZmluaXRpb24sXG4gICAgICAgICAgZ2xvYmFsVGhpcyxcbiAgICAgICAgICBnbG9iYWxzLFxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC50aGVuKGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCwgZXJyb3IgPT4ge1xuICAgICAgICBmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYEVycm9yIHdoaWxlIGF0dGVudWF0aW5nIGdsb2JhbHMgZm9yICR7cShuYW1lKX0gd2l0aCAke3EoXG4gICAgICAgICAgICBkaXNwbGF5TmFtZSxcbiAgICAgICAgICApfTogJHtxKGVycm9yLm1lc3NhZ2UpfWAgIC8vXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICBwZW5kaW5nSm9icy5wdXNoKGF0dGVudWF0aW9uUHJvbWlzZSk7XG5cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbGlzdCA9IGdldEdsb2JhbHNMaXN0KHBhY2thZ2VQb2xpY3kpO1xuICBzZWxlY3RpdmVDb3B5KGdsb2JhbHMsIGdsb2JhbFRoaXMsIGxpc3QpO1xuICBmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbn07XG5cbi8qXG5cblxuICovJGjNj19vbmNlLmF0dGVudWF0ZUdsb2JhbHMoYXR0ZW51YXRlR2xvYmFscyk7XG5jb25zdCBkaWFnbm9zZU1vZHVsZVBvbGljeSA9IGVycm9ySGludCA9PiB7XG4gIGlmICghZXJyb3JIaW50KSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHJldHVybiBgIChpbmZvOiAke2Vycm9ySGludH0pYDtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAoXG4gIHNwZWNpZmllcixcbiAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICB7IGV4aXQsIGVycm9ySGludCB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgeyBwb2xpY3ksIG1vZHVsZXMsIGxhYmVsIH0gPSBjb21wYXJ0bWVudERlc2NyaXB0b3I7XG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFleGl0KSB7XG4gICAgaWYgKCFtb2R1bGVzW3NwZWNpZmllcl0pIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgSW1wb3J0aW5nICR7cShzcGVjaWZpZXIpfSBpbiAke3EoXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICl9IHdhcyBub3QgYWxsb3dlZCBieSBwYWNrYWdlcyBwb2xpY3kgJHtxKFxuICAgICAgICAgIHBvbGljeS5wYWNrYWdlcyxcbiAgICAgICAgKX0ke2RpYWdub3NlTW9kdWxlUG9saWN5KGVycm9ySGludCl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghcG9saWN5TG9va3VwSGVscGVyKHBvbGljeSwgJ2J1aWx0aW5zJywgc3BlY2lmaWVyKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYEltcG9ydGluZyAke3Eoc3BlY2lmaWVyKX0gd2FzIG5vdCBhbGxvd2VkIGJ5IHBvbGljeSBidWlsdGluczoke3EoXG4gICAgICAgIHBvbGljeS5idWlsdGlucyxcbiAgICAgICl9JHtkaWFnbm9zZU1vZHVsZVBvbGljeShlcnJvckhpbnQpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5lbmZvcmNlTW9kdWxlUG9saWN5KGVuZm9yY2VNb2R1bGVQb2xpY3kpO1xuYXN5bmMgZnVuY3Rpb24gYXR0ZW51YXRlTW9kdWxlKHtcbiAgYXR0ZW51YXRvcnMsXG4gIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgb3JpZ2luYWxNb2R1bGVSZWNvcmQsXG59KSB7XG4gIGNvbnN0IGF0dGVudWF0ZSA9IGF3YWl0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uKFxuICAgIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgICBhdHRlbnVhdG9ycyxcbiAgICBNT0RVTEVfQVRURU5VQVRPUixcbiAgKTtcblxuICAvL1xuICAvL1xuXG4gIHJldHVybiBmcmVlemUoe1xuICAgIGltcG9ydHM6IG9yaWdpbmFsTW9kdWxlUmVjb3JkLmltcG9ydHMsXG4gICAgLy9cbiAgICAvL1xuICAgIGV4cG9ydHM6IG9yaWdpbmFsTW9kdWxlUmVjb3JkLmV4cG9ydHMsXG4gICAgZXhlY3V0ZTogKG1vZHVsZUV4cG9ydHMsIGNvbXBhcnRtZW50LCByZXNvbHZlZEltcG9ydHMpID0+IHtcbiAgICAgIGNvbnN0IG5zID0ge307XG4gICAgICBvcmlnaW5hbE1vZHVsZVJlY29yZC5leGVjdXRlKG5zLCBjb21wYXJ0bWVudCwgcmVzb2x2ZWRJbXBvcnRzKTtcbiAgICAgIGNvbnN0IGF0dGVudWF0ZWQgPSBhdHRlbnVhdGUobnMpO1xuICAgICAgbW9kdWxlRXhwb3J0cy5kZWZhdWx0ID0gYXR0ZW51YXRlZDtcbiAgICAgIGFzc2lnbihtb2R1bGVFeHBvcnRzLCBhdHRlbnVhdGVkKTtcbiAgICB9LFxuICB9KTtcbn1cblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXR0ZW51YXRlTW9kdWxlSG9vayA9IGFzeW5jIChcbiAgc3BlY2lmaWVyLFxuICBvcmlnaW5hbE1vZHVsZVJlY29yZCxcbiAgcG9saWN5LFxuICBhdHRlbnVhdG9ycyxcbikgPT4ge1xuICBjb25zdCBwb2xpY3lWYWx1ZSA9IHBvbGljeUxvb2t1cEhlbHBlcihwb2xpY3ksICdidWlsdGlucycsIHNwZWNpZmllcik7XG4gIGlmICghcG9saWN5IHx8IHBvbGljeVZhbHVlID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIG9yaWdpbmFsTW9kdWxlUmVjb3JkO1xuICB9XG5cbiAgaWYgKCFwb2xpY3lWYWx1ZSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYEF0dGVudWF0aW9uIGZhaWxlZCAnJHtzcGVjaWZpZXJ9JyB3YXMgbm90IGluIHBvbGljeSBidWlsdGluczoke3EoXG4gICAgICAgIHBvbGljeS5idWlsdGlucyxcbiAgICAgICl9YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBhdHRlbnVhdGVNb2R1bGUoe1xuICAgIGF0dGVudWF0b3JzLFxuICAgIGF0dGVudWF0aW9uRGVmaW5pdGlvbjogcG9saWN5VmFsdWUsXG4gICAgb3JpZ2luYWxNb2R1bGVSZWNvcmQsXG4gIH0pO1xufTskaM2PX29uY2UuYXR0ZW51YXRlTW9kdWxlSG9vayhhdHRlbnVhdGVNb2R1bGVIb29rKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UIjpbIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UIl0sImRldGVjdEF0dGVudWF0b3JzIjpbImRldGVjdEF0dGVudWF0b3JzIl0sImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiOlsiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSJdLCJnZXRQb2xpY3lGb3JQYWNrYWdlIjpbImdldFBvbGljeUZvclBhY2thZ2UiXSwibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciI6WyJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIl0sImF0dGVudWF0ZUdsb2JhbHMiOlsiYXR0ZW51YXRlR2xvYmFscyJdLCJlbmZvcmNlTW9kdWxlUG9saWN5IjpbImVuZm9yY2VNb2R1bGVQb2xpY3kiXSwiYXR0ZW51YXRlTW9kdWxlSG9vayI6WyJhdHRlbnVhdGVNb2R1bGVIb29rIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHt1M4rgCAAA4AgAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wb3dlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImZpbmRJbnZhbGlkUmVhZE5vd1Bvd2Vyc1Byb3BzIiwiaXNSZWFkTm93UG93ZXJzIiwidW5wYWNrUmVhZFBvd2VycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCB7IGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY2Fub25pY2FsU2hpbSA9IGFzeW5jIHBhdGggPT4gcGF0aDtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCB1bnBhY2tSZWFkUG93ZXJzID0gcG93ZXJzID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCByZWFkO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgbWF5YmVSZWFkO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgY2Fub25pY2FsO1xuXG4gIGlmICh0eXBlb2YgcG93ZXJzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmVhZCA9IHBvd2VycztcbiAgfSBlbHNlIHtcbiAgICAoeyByZWFkLCBtYXliZVJlYWQsIGNhbm9uaWNhbCB9ID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICovIChwb3dlcnMpKTtcbiAgfVxuXG4gIGlmIChjYW5vbmljYWwgPT09IHVuZGVmaW5lZCkge1xuICAgIGNhbm9uaWNhbCA9IGNhbm9uaWNhbFNoaW07XG4gIH1cblxuICBpZiAobWF5YmVSZWFkID09PSB1bmRlZmluZWQpIHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBtYXliZVJlYWQgPSBwYXRoID0+XG4gICAgICAvKiAgICAgICAgICAgICAgICAgKi8gKHJlYWQpKHBhdGgpLmNhdGNoKF9lcnJvciA9PiB1bmRlZmluZWQpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5wb3dlcnMsXG4gICAgcmVhZCxcbiAgICBtYXliZVJlYWQsXG4gICAgY2Fub25pY2FsLFxuICB9O1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS51bnBhY2tSZWFkUG93ZXJzKHVucGFja1JlYWRQb3dlcnMpO1xuY29uc3QgcmVxdWlyZWRSZWFkTm93UG93ZXJzUHJvcHMgPSBmcmVlemUoXG4gIC8qICAgICAgICAgICAgICAgICovIChbJ2ZpbGVVUkxUb1BhdGgnLCAnaXNBYnNvbHV0ZScsICdtYXliZVJlYWROb3cnXSksXG4pO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1JlYWROb3dQb3dlcnMgPSB2YWx1ZSA9PlxuICBCb29sZWFuKFxuICAgIHZhbHVlICYmXG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICByZXF1aXJlZFJlYWROb3dQb3dlcnNQcm9wcy5ldmVyeShcbiAgICAgICAgcHJvcCA9PiBwcm9wIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZVtwcm9wXSA9PT0gJ2Z1bmN0aW9uJyxcbiAgICAgICksXG4gICk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5pc1JlYWROb3dQb3dlcnMoaXNSZWFkTm93UG93ZXJzKTtcbiAgICAgICBjb25zdCBmaW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wcyA9IHZhbHVlID0+IHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gWy4uLnJlcXVpcmVkUmVhZE5vd1Bvd2Vyc1Byb3BzXTtcbiAgfVxuICByZXR1cm4gcmVxdWlyZWRSZWFkTm93UG93ZXJzUHJvcHMuZmlsdGVyKFxuICAgIHByb3AgPT4gIShwcm9wIGluIHZhbHVlKSB8fCB0eXBlb2YgdmFsdWVbcHJvcF0gIT09ICdmdW5jdGlvbicsXG4gICk7XG59OyRozY9fb25jZS5maW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wcyhmaW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ1bnBhY2tSZWFkUG93ZXJzIjpbInVucGFja1JlYWRQb3dlcnMiXSwiaXNSZWFkTm93UG93ZXJzIjpbImlzUmVhZE5vd1Bvd2VycyJdLCJmaW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wcyI6WyJmaW5kSW52YWxpZFJlYWROb3dQb3dlcnNQcm9wcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAA1AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvdHlwZXMtZXh0ZXJuYWwuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANKKhqaIBAACiAQAAIgAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAXGNzxVBAAAFQQAAAsAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9zcmMvZW52LW9wdGlvbnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiLCJnZXRFbnZpcm9ubWVudE9wdGlvbiIsImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiLCJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG5cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG5cbi8vXG5jb25zdCBsb2NhbFRoaXMgPSBnbG9iYWxUaGlzO1xuXG5jb25zdCB7IE9iamVjdCwgUmVmbGVjdCwgQXJyYXksIFN0cmluZywgSlNPTiwgRXJyb3IgfSA9IGxvY2FsVGhpcztcbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vL1xuLy9cbmNvbnN0IHVuY3VycnlUaGlzID1cbiAgZm4gPT5cbiAgKHJlY2VpdmVyLCAuLi5hcmdzKSA9PlxuICAgIGFwcGx5KGZuLCByZWNlaXZlciwgYXJncyk7XG5jb25zdCBhcnJheVB1c2ggPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUucHVzaCk7XG5jb25zdCBhcnJheUluY2x1ZGVzID0gdW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKTtcbmNvbnN0IHN0cmluZ1NwbGl0ID0gdW5jdXJyeVRoaXMoU3RyaW5nLnByb3RvdHlwZS5zcGxpdCk7XG5cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuY29uc3QgRmFpbCA9IChsaXRlcmFscywgLi4uYXJncykgPT4ge1xuICBsZXQgbXNnID0gbGl0ZXJhbHNbMF07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIG1zZyA9IGAke21zZ30ke2FyZ3NbaV19JHtsaXRlcmFsc1tpICsgMV19YDtcbiAgfVxuICB0aHJvdyBFcnJvcihtc2cpO1xufTtcblxuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbnZpcm9ubWVudENhcHRvciA9IChhR2xvYmFsLCBkcm9wTmFtZXMgPSBmYWxzZSkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMgPSBbXTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uID0gKFxuICAgIG9wdGlvbk5hbWUsXG4gICAgZGVmYXVsdFNldHRpbmcsXG4gICAgb3B0T3RoZXJWYWx1ZXMgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgIHR5cGVvZiBvcHRpb25OYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZSAke3Eob3B0aW9uTmFtZSl9IG11c3QgYmUgYSBzdHJpbmcuYDtcbiAgICB0eXBlb2YgZGVmYXVsdFNldHRpbmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBkZWZhdWx0IHNldHRpbmcgJHtxKFxuICAgICAgICBkZWZhdWx0U2V0dGluZyxcbiAgICAgICl9IG11c3QgYmUgYSBzdHJpbmcuYDtcblxuICAgIC8qICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBzZXR0aW5nID0gZGVmYXVsdFNldHRpbmc7XG4gICAgY29uc3QgZ2xvYmFsUHJvY2VzcyA9IGFHbG9iYWwucHJvY2VzcyB8fCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZ2xvYmFsRW52ID1cbiAgICAgICh0eXBlb2YgZ2xvYmFsUHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgZ2xvYmFsUHJvY2Vzcy5lbnYpIHx8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGdsb2JhbEVudiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChvcHRpb25OYW1lIGluIGdsb2JhbEVudikge1xuICAgICAgICBpZiAoIWRyb3BOYW1lcykge1xuICAgICAgICAgIGFycmF5UHVzaChjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsIG9wdGlvbk5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gZ2xvYmFsRW52W29wdGlvbk5hbWVdO1xuICAgICAgICAvL1xuICAgICAgICB0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZWQgJHtxKFxuICAgICAgICAgICAgb3B0aW9uTmFtZSxcbiAgICAgICAgICApfSwgaWYgcHJlc2VudCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUsIGdvdCAke3EoXG4gICAgICAgICAgICBvcHRpb25WYWx1ZSxcbiAgICAgICAgICApfWA7XG4gICAgICAgIHNldHRpbmcgPSBvcHRpb25WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgb3B0T3RoZXJWYWx1ZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgc2V0dGluZyA9PT0gZGVmYXVsdFNldHRpbmcgfHxcbiAgICAgIGFycmF5SW5jbHVkZXMob3B0T3RoZXJWYWx1ZXMsIHNldHRpbmcpIHx8XG4gICAgICBGYWlsYFVucmVjb2duaXplZCAke3Eob3B0aW9uTmFtZSl9IHZhbHVlICR7cShcbiAgICAgICAgc2V0dGluZyxcbiAgICAgICl9LiBFeHBlY3RlZCBvbmUgb2YgJHtxKFtkZWZhdWx0U2V0dGluZywgLi4ub3B0T3RoZXJWYWx1ZXNdKX1gO1xuICAgIHJldHVybiBzZXR0aW5nO1xuICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0ID0gb3B0aW9uTmFtZSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJycpO1xuICAgIHJldHVybiBmcmVlemUob3B0aW9uID09PSAnJyA/IFtdIDogc3RyaW5nU3BsaXQob3B0aW9uLCAnLCcpKTtcbiAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpO1xuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAob3B0aW9uTmFtZSwgZWxlbWVudCkgPT5cbiAgICBhcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksIGVsZW1lbnQpO1xuXG4gIGNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9ICgpID0+IHtcbiAgICByZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiAgfTtcbiAgZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxuICAgIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHtcbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG59ID0gbWFrZUVudmlyb25tZW50Q2FwdG9yKGxvY2FsVGhpcywgdHJ1ZSk7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uKGdldEVudmlyb25tZW50T3B0aW9uKTskaM2PX29uY2UuZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdChnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTskaM2PX29uY2UuZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyhlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbnZpcm9ubWVudENhcHRvciI6WyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwiZ2V0RW52aXJvbm1lbnRPcHRpb24iOlsiZ2V0RW52aXJvbm1lbnRPcHRpb24iXSwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCI6WyJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0Il0sImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABJNfbpVAgAAFQIAAAdAAAAQGVuZG8vZXJyb3JzLXYxLjIuMTMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkZhaWwiLCJYIiwiYW5ub3RhdGVFcnJvciIsImFzc2VydCIsImIiLCJiYXJlIiwibWFrZUVycm9yIiwibm90ZSIsInEiLCJxdW90ZSIsInJlZGFjdGVkIiwidGhyb3dSZWRhY3RlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiAgICAgICAgICAgICAgICAgICAqL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuXG5jb25zdCBnbG9iYWxBc3NlcnQgPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuaWYgKGdsb2JhbEFzc2VydCA9PT0gdW5kZWZpbmVkKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQsIGltcG9ydCAnc2VzJyBiZWZvcmUgJ0BlbmRvL2Vycm9ycydgLFxuICApO1xufVxuXG5jb25zdCBtaXNzaW5nID0gLyogICAgICAgICAgICAgICAgKi8gKFtcbiAgJ3R5cGVvZicsXG4gICdlcnJvcicsXG4gICdmYWlsJyxcbiAgJ2VxdWFsJyxcbiAgJ3N0cmluZycsXG4gICdub3RlJyxcbiAgJ2RldGFpbHMnLFxuICAnRmFpbCcsXG4gICdxdW90ZScsXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gICdtYWtlQXNzZXJ0Jyxcbl0pLmZpbHRlcihuYW1lID0+IGdsb2JhbEFzc2VydFtuYW1lXSA9PT0gdW5kZWZpbmVkKTtcbmlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgdGhyb3cgRXJyb3IoXG4gICAgYENhbm5vdCBpbml0aWFsaXplIEBlbmRvL2Vycm9ycywgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCBtZXRob2RzICR7bWlzc2luZy5qb2luKFxuICAgICAgJywgJyxcbiAgICApfWAsXG4gICk7XG59XG5cbi8vXG4vL1xuLy9cbmNvbnN0IHtcbiAgYmFyZSxcbiAgZGV0YWlsczogcmVkYWN0ZWQsXG4gIGVycm9yOiBtYWtlRXJyb3IsXG4gIEZhaWw6IHRocm93UmVkYWN0ZWQsXG4gIG1ha2VBc3NlcnQ6IF9vbWl0dGVkTWFrZUFzc2VydCxcbiAgbm90ZSxcbiAgcXVvdGUsXG4gIC4uLmFzc2VydGlvbnNcbn0gPSBnbG9iYWxBc3NlcnQ7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8vXG4kaM2PX29uY2UucmVkYWN0ZWQocmVkYWN0ZWQpOyRozY9fb25jZS5tYWtlRXJyb3IobWFrZUVycm9yKTskaM2PX29uY2UudGhyb3dSZWRhY3RlZCh0aHJvd1JlZGFjdGVkKTskaM2PX29uY2Uubm90ZShub3RlKTskaM2PX29uY2UucXVvdGUocXVvdGUpO2NvbnN0IGFzc2VydD0odmFsdWUsb3B0RGV0YWlscyxlcnJDb250cnVjdG9yLG9wdGlvbnMpPT5cbiAgZ2xvYmFsQXNzZXJ0KHZhbHVlLCBvcHREZXRhaWxzLCBlcnJDb250cnVjdG9yLCBvcHRpb25zKTskaM2PX29uY2UuYXNzZXJ0KGFzc2VydCk7XG5PYmplY3QuYXNzaWduKGFzc2VydCwgYXNzZXJ0aW9ucyk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IGJhcmVPclF1b3RlID0gYmFyZSB8fCBxdW90ZTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5iYXJlT3JRdW90ZShiYXJlT3JRdW90ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWRhY3RlZCI6WyJyZWRhY3RlZCJdLCJYIjpbInJlZGFjdGVkIl0sIm1ha2VFcnJvciI6WyJtYWtlRXJyb3IiXSwidGhyb3dSZWRhY3RlZCI6WyJ0aHJvd1JlZGFjdGVkIl0sIkZhaWwiOlsidGhyb3dSZWRhY3RlZCJdLCJub3RlIjpbIm5vdGUiXSwiYW5ub3RhdGVFcnJvciI6WyJub3RlIl0sInF1b3RlIjpbInF1b3RlIl0sInEiOlsicXVvdGUiXSwiYXNzZXJ0IjpbImFzc2VydCJdLCJiYXJlIjpbImJhcmVPclF1b3RlIl0sImIiOlsiYmFyZU9yUXVvdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAybGDGRsWAAAbFgAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9FLmpzeyJpbXBvcnRzIjpbIi4vdHJhY2stdHVybnMuanMiLCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHJhY2tUdXJucyxtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsWyRozY9fYSA9PiAodHJhY2tUdXJucyA9ICRozY9fYSldXV1dLFtcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsWyRozY9fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsLCBlcnJvcjogbWFrZUVycm9yIH0gPSBhc3NlcnQ7XG5jb25zdCB7IGFzc2lnbiwgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qXG5cbiAqL1xuXG5jb25zdCBvblNlbmQgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fU0VORF9CUkVBS1BPSU5UUycpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlciA9IHtcbiAgc2V0KF90YXJnZXQsIF9wcm9wLCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGlzRXh0ZW5zaWJsZShfdGFyZ2V0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBzZXRQcm90b3R5cGVPZihfdGFyZ2V0LCBfdmFsdWUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIGRlbGV0ZVByb3BlcnR5KF90YXJnZXQsIF9wcm9wKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxufTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRVByb3h5SGFuZGxlciA9IChyZWNpcGllbnQsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcGVydHlLZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKFxuICAgICAgICB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzICE9PSByZWNlaXZlcikge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UucmVqZWN0KFxuICAgICAgICAgICAgICAgIG1ha2VFcnJvcihcbiAgICAgICAgICAgICAgICAgIFhgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocHJvcGVydHlLZXkpfVwiIG1ldGhvZCBvZiBFKCR7cShcbiAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICAgICAgKX0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGRlYnVnZ2VyOyAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kKHJlY2lwaWVudCwgcHJvcGVydHlLZXksIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdBcnJheSA9IFtdKSA9PiB7XG4gICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvL1xuICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgIH1cbiAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHJlY2lwaWVudCwgYXJnQXJyYXkpO1xuICAgIH0sXG4gICAgaGFzOiAoX3RhcmdldCwgX3ApID0+IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUVTZW5kT25seVByb3h5SGFuZGxlciA9IChyZWNpcGllbnQsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcGVydHlLZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKFxuICAgICAgICB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIFtwcm9wZXJ0eUtleV0oLi4uYXJncykge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHRoaXMgPT09IHJlY2VpdmVyIHx8XG4gICAgICAgICAgICAgIEZhaWxgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EoXG4gICAgICAgICAgICAgICAgcHJvcGVydHlLZXksXG4gICAgICAgICAgICAgICl9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKHJlY2lwaWVudCl9KWA7XG4gICAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGRlYnVnZ2VyOyAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2RTZW5kT25seShyZWNpcGllbnQsIHByb3BlcnR5S2V5LCBhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vXG4gICAgICAgIH1bcHJvcGVydHlLZXldLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIGFyZ3NBcnJheSA9IFtdKSA9PiB7XG4gICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvL1xuICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgIH1cbiAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seShyZWNpcGllbnQsIGFyZ3NBcnJheSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0sXG4gICAgaGFzOiAoX3RhcmdldCwgX3ApID0+IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUVHZXRQcm94eUhhbmRsZXIgPSAoeCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBoYXM6IChfdGFyZ2V0LCBfcHJvcCkgPT4gdHJ1ZSxcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wKSA9PiBIYW5kbGVkUHJvbWlzZS5nZXQoeCwgcHJvcCksXG4gIH0pO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGZ1bmNUYXJnZXQgPSBmcmVlemUoKCkgPT4ge30pO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3Qgb2JqVGFyZ2V0ID0gZnJlZXplKHsgX19wcm90b19fOiBudWxsIH0pO1xuXG4vKlxuXG4gKi9cbmNvbnN0IG1ha2VFID0gSGFuZGxlZFByb21pc2UgPT4ge1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGFzc2lnbihcbiAgICAgIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIC8vXG4gICAgICB4ID0+IG5ldyBQcm94eShmdW5jVGFyZ2V0LCBtYWtlRVByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuICAgICAge1xuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgLy9cbiAgICAgICAgZ2V0OiB4ID0+IG5ldyBQcm94eShvYmpUYXJnZXQsIG1ha2VFR2V0UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgcmVzb2x2ZTogSGFuZGxlZFByb21pc2UucmVzb2x2ZSxcblxuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICBzZW5kT25seTogeCA9PlxuICAgICAgICAgIC8vXG4gICAgICAgICAgbmV3IFByb3h5KGZ1bmNUYXJnZXQsIG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcblxuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICB3aGVuOiAoeCwgb25mdWxmaWxsZWQsIG9ucmVqZWN0ZWQpID0+XG4gICAgICAgICAgSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKFxuICAgICAgICAgICAgLi4udHJhY2tUdXJucyhbb25mdWxmaWxsZWQsIG9ucmVqZWN0ZWRdKSxcbiAgICAgICAgICApLFxuICAgICAgfSxcbiAgICApLFxuICApO1xufTtcblxuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0Om1ha2VFfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGRANevSDgAA0g4AACcAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbG9jYWwuanN7ImltcG9ydHMiOlsiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZ2V0TWV0aG9kTmFtZXMiLCJsb2NhbEFwcGx5RnVuY3Rpb24iLCJsb2NhbEFwcGx5TWV0aG9kIiwibG9jYWxHZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXI7JGjNj19pbXBvcnRzKFtbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBnZXRQcm90b3R5cGVPZiwgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5LCBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG5jb25zdCBudHlwZW9mID0gc3BlY2ltZW4gPT4gKHNwZWNpbWVuID09PSBudWxsID8gJ251bGwnIDogdHlwZW9mIHNwZWNpbWVuKTtcblxuY29uc3Qgb25EZWxpdmVyeSA9IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcignRU5ET19ERUxJVkVSWV9CUkVBS1BPSU5UUycpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgaXNQcmltaXRpdmUgPSB2YWwgPT5cbiAgIXZhbCB8fCAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJyk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQgPSAoYSwgYikgPT4ge1xuICBpZiAodHlwZW9mIGEgPT09IHR5cGVvZiBiKSB7XG4gICAgY29uc3QgbGVmdCA9IFN0cmluZyhhKTtcbiAgICBjb25zdCByaWdodCA9IFN0cmluZyhiKTtcbiAgICAvL1xuICAgIHJldHVybiBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPiByaWdodCA/IDEgOiAwO1xuICB9XG4gIGlmICh0eXBlb2YgYSA9PT0gJ3N5bWJvbCcpIHtcbiAgICBhc3NlcnQodHlwZW9mIGIgPT09ICdzdHJpbmcnKTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgYXNzZXJ0KHR5cGVvZiBhID09PSAnc3RyaW5nJyk7XG4gIGFzc2VydCh0eXBlb2YgYiA9PT0gJ3N5bWJvbCcpO1xuICByZXR1cm4gMTtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0TWV0aG9kTmFtZXMgPSB2YWwgPT4ge1xuICBsZXQgbGF5ZXIgPSB2YWw7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpOyAvL1xuICB3aGlsZSAobGF5ZXIgIT09IG51bGwgJiYgbGF5ZXIgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAvL1xuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG93bktleXMoZGVzY3MpKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmICh0eXBlb2YgdmFsW25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG5hbWVzLmFkZChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzUHJpbWl0aXZlKHZhbCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsYXllciA9IGdldFByb3RvdHlwZU9mKGxheWVyKTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFsuLi5uYW1lc10uc29ydChjb21wYXJlU3RyaW5naWZpZWQpKTtcbn07XG4vL1xuLy9cbiRozY9fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7ZnJlZXplKGdldE1ldGhvZE5hbWVzKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlGdW5jdGlvbiA9IChyZWNpcGllbnQsIGFyZ3MpID0+IHtcbiAgdHlwZW9mIHJlY2lwaWVudCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGBDYW5ub3QgaW52b2tlIHRhcmdldCBhcyBhIGZ1bmN0aW9uOyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAvL1xuICAgIGRlYnVnZ2VyOyAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gYXBwbHkocmVjaXBpZW50LCB1bmRlZmluZWQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseUZ1bmN0aW9uKGxvY2FsQXBwbHlGdW5jdGlvbik7XG5cbiAgICAgICBjb25zdCBsb2NhbEFwcGx5TWV0aG9kID0gKHJlY2lwaWVudCwgbWV0aG9kTmFtZSwgYXJncykgPT4ge1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAvL1xuICAgIHJldHVybiBsb2NhbEFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LCBhcmdzKTtcbiAgfVxuICBpZiAocmVjaXBpZW50ID09PSB1bmRlZmluZWQgfHwgcmVjaXBpZW50ID09PSBudWxsKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBkZWxpdmVyICR7cShtZXRob2ROYW1lKX0gdG8gdGFyZ2V0OyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZm4gPSByZWNpcGllbnRbbWV0aG9kTmFtZV07XG4gIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYHRhcmdldCBoYXMgbm8gbWV0aG9kICR7cShtZXRob2ROYW1lKX0sIGhhcyAke3EoXG4gICAgICAgIGdldE1ldGhvZE5hbWVzKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmdHlwZSA9IG50eXBlb2YoZm4pO1xuICB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgfHxcbiAgICBGYWlsYGludm9rZWQgbWV0aG9kICR7cShtZXRob2ROYW1lKX0gaXMgbm90IGEgZnVuY3Rpb247IGl0IGlzIGEgJHtxKFxuICAgICAgZnR5cGUsXG4gICAgKX1gO1xuICBpZiAob25EZWxpdmVyeSAmJiBvbkRlbGl2ZXJ5LnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBtZXRob2ROYW1lKSkge1xuICAgIC8vXG4gICAgZGVidWdnZXI7IC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShmbiwgcmVjaXBpZW50LCBhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmxvY2FsQXBwbHlNZXRob2QobG9jYWxBcHBseU1ldGhvZCk7XG5cbiAgICAgICBjb25zdCBsb2NhbEdldCA9ICh0LCBrZXkpID0+IHRba2V5XTskaM2PX29uY2UubG9jYWxHZXQobG9jYWxHZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwibG9jYWxBcHBseUZ1bmN0aW9uIjpbImxvY2FsQXBwbHlGdW5jdGlvbiJdLCJsb2NhbEFwcGx5TWV0aG9kIjpbImxvY2FsQXBwbHlNZXRob2QiXSwibG9jYWxHZXQiOlsibG9jYWxHZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAeTPsuDwPAAA8DwAANQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBoYXNPd24sIGZyZWV6ZSwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4vKlxuXG5cblxuXG5cbiAqL1xuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5jb25zdCBpc0pTT05SZWNvcmQgPSB2YWwgPT5cbiAgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHNpbXBsaWZ5VGFnID0gdGFnID0+IHtcbiAgZm9yIChjb25zdCBwcmVmaXggb2YgWydBbGxlZ2VkOiAnLCAnRGVidWdOYW1lOiAnXSkge1xuICAgIGlmICh0YWcuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICByZXR1cm4gdGFnLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFnO1xufTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSBvcHRpb25OYW1lID0+IHtcbiAgbGV0IGJyZWFrcG9pbnRzID0gSlNPTi5wYXJzZShnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCAnbnVsbCcpKTtcblxuICBpZiAoYnJlYWtwb2ludHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBicmVha3BvaW50c1RhYmxlO1xuXG4gIGNvbnN0IGdldEJyZWFrcG9pbnRzID0gKCkgPT4gYnJlYWtwb2ludHM7XG4gIGZyZWV6ZShnZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2V0QnJlYWtwb2ludHMgPSAobmV3QnJlYWtwb2ludHMgPSBicmVha3BvaW50cykgPT4ge1xuICAgIGlzSlNPTlJlY29yZChuZXdCcmVha3BvaW50cykgfHxcbiAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24gdG8gYmUgYSBKU09OIGJyZWFrcG9pbnRzIHJlY29yZGA7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAvL1xuICAgIGNvbnN0IG5ld0JyZWFrcG9pbnRzVGFibGUgPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuXG4gICAgZm9yIChjb25zdCBbdGFnLCBtZXRob2RCUHNdIG9mIGVudHJpZXMobmV3QnJlYWtwb2ludHMpKSB7XG4gICAgICB0YWcgPT09IHNpbXBsaWZ5VGFnKHRhZykgfHxcbiAgICAgICAgRmFpbGBKdXN0IHVzZSBzaW1wbGUgdGFnICR7cShzaW1wbGlmeVRhZyh0YWcpKX0gcmF0aGVyIHRoYW4gJHtxKHRhZyl9YDtcbiAgICAgIGlzSlNPTlJlY29yZChtZXRob2RCUHMpIHx8XG4gICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EoXG4gICAgICAgICAgdGFnLFxuICAgICAgICApfSB0byBiZSBhIEpTT04gbWV0aG9kcyBicmVha3BvaW50cyByZWNvcmRgO1xuICAgICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgY291bnRdIG9mIGVudHJpZXMobWV0aG9kQlBzKSkge1xuICAgICAgICBjb3VudCA9PT0gJyonIHx8XG4gICAgICAgICAgKHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50KSAmJlxuICAgICAgICAgICAgY291bnQgPj0gMCkgfHxcbiAgICAgICAgICBGYWlsYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKHRhZyl9LiR7cShcbiAgICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKX0gdG8gYmUgXCIqXCIgb3IgYSBub24tbmVnYXRpdmUgaW50ZWdlcmA7XG5cbiAgICAgICAgY29uc3QgY2xhc3NCUHMgPSBoYXNPd24obmV3QnJlYWtwb2ludHNUYWJsZSwgbWV0aG9kTmFtZSlcbiAgICAgICAgICA/IG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV1cbiAgICAgICAgICA6IChuZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdID0ge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50O1xuICAgICAgfVxuICAgIH1cbiAgICBicmVha3BvaW50cyA9IG5ld0JyZWFrcG9pbnRzO1xuICAgIGJyZWFrcG9pbnRzVGFibGUgPSBuZXdCcmVha3BvaW50c1RhYmxlO1xuICB9O1xuICBmcmVlemUoc2V0QnJlYWtwb2ludHMpO1xuXG4gIGNvbnN0IHNob3VsZEJyZWFrcG9pbnQgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lKSA9PiB7XG4gICAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fCBtZXRob2ROYW1lID09PSBudWxsKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc0JQcyA9IGJyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gfHwgYnJlYWtwb2ludHNUYWJsZVsnKiddO1xuICAgIGlmIChjbGFzc0JQcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCB0YWcgPSBzaW1wbGlmeVRhZyhyZWNpcGllbnRbU3ltYm9sLnRvU3RyaW5nVGFnXSk7XG4gICAgbGV0IGNvdW50ID0gY2xhc3NCUHNbdGFnXTtcbiAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFnID0gJyonO1xuICAgICAgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY291bnQgPT09ICcqJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFzc2VydCh0eXBlb2YgY291bnQgPT09ICdudW1iZXInICYmIGNvdW50ID49IDEpO1xuICAgIGNsYXNzQlBzW3RhZ10gPSBjb3VudCAtIDE7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBmcmVlemUoc2hvdWxkQnJlYWtwb2ludCk7XG5cbiAgY29uc3QgYnJlYWtwb2ludFRlc3RlciA9IGZyZWV6ZSh7XG4gICAgZ2V0QnJlYWtwb2ludHMsXG4gICAgc2V0QnJlYWtwb2ludHMsXG4gICAgc2hvdWxkQnJlYWtwb2ludCxcbiAgfSk7XG4gIGJyZWFrcG9pbnRUZXN0ZXIuc2V0QnJlYWtwb2ludHMoKTtcbiAgcmV0dXJuIGJyZWFrcG9pbnRUZXN0ZXI7XG59OyRozY9fb25jZS5tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbmZyZWV6ZShtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC4dpSdXwMAAF8DAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlRTskaM2PX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKG1ha2VFID0gJGjNj19hKV1dXV0sW1wiLi9leHBvcnRzLmpzXCIsIFtdXV0pO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgaHAgPSBIYW5kbGVkUHJvbWlzZTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaHAoaHApO1xuICAgICAgIGNvbnN0IEUgPSBtYWtlRShocCk7JGjNj19vbmNlLkUoRSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAyOwHRckKAADJCgAALQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbixlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV0sW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLFskaM2PX2EgPT4gKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuID0gMDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQgPSAwO1xuXG4vL1xuY29uc3QgVkVSQk9TRSA9IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywgJ3RyYWNrLXR1cm5zJyk7XG5cbi8vXG4vL1xuY29uc3QgRU5BQkxFRCA9XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgKGdldEVudmlyb25tZW50T3B0aW9uKCdUUkFDS19UVVJOUycsICdkaXNhYmxlZCcsIFsnZW5hYmxlZCddKSkgPT09ICdlbmFibGVkJztcblxuLy9cbi8vXG4vL1xuLy9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZSA9IGRldGFpbHNOb3RlID0+IHJlYXNvbiA9PiB7XG4gIGlmIChyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIGdsb2JhbFRoaXMuYXNzZXJ0Lm5vdGUocmVhc29uLCBkZXRhaWxzTm90ZSk7XG4gIH1cbiAgaWYgKFZFUkJPU0UpIHtcbiAgICBjb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLCByZWFzb24pO1xuICB9XG59O1xuXG5jb25zdCB3cmFwRnVuY3Rpb24gPVxuICAoZnVuYywgc2VuZGluZ0Vycm9yLCBYKSA9PlxuICAoLi4uYXJncykgPT4ge1xuICAgIGhpZGRlblByaW9yRXJyb3IgPSBzZW5kaW5nRXJyb3I7XG4gICAgaGlkZGVuQ3VycmVudFR1cm4gKz0gMTtcbiAgICBoaWRkZW5DdXJyZW50RXZlbnQgPSAwO1xuICAgIHRyeSB7XG4gICAgICBsZXQgcmVzdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzdWx0ID0gZnVuYyguLi5hcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgWGBUaHJvd24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFZFUkJPU0UpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJywgZXJyKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgY29uc3QgZGV0YWlsc05vdGUgPSBYYFJlamVjdGlvbiBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWA7XG4gICAgICBQcm9taXNlLnJlc29sdmUocmVzdWx0KS5jYXRjaChhZGRSZWplY3Rpb25Ob3RlKGRldGFpbHNOb3RlKSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICBoaWRkZW5QcmlvckVycm9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdHJhY2tUdXJucyA9IGZ1bmNzID0+IHtcbiAgaWYgKCFFTkFCTEVEIHx8IHR5cGVvZiBnbG9iYWxUaGlzID09PSAndW5kZWZpbmVkJyB8fCAhZ2xvYmFsVGhpcy5hc3NlcnQpIHtcbiAgICByZXR1cm4gZnVuY3M7XG4gIH1cbiAgY29uc3QgeyBkZXRhaWxzOiBYLCBub3RlOiBhbm5vdGF0ZUVycm9yIH0gPSBnbG9iYWxUaGlzLmFzc2VydDtcblxuICBoaWRkZW5DdXJyZW50RXZlbnQgKz0gMTtcbiAgY29uc3Qgc2VuZGluZ0Vycm9yID0gRXJyb3IoXG4gICAgYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gLFxuICApO1xuICBpZiAoaGlkZGVuUHJpb3JFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYW5ub3RhdGVFcnJvcihzZW5kaW5nRXJyb3IsIFhgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gIH1cblxuICByZXR1cm4gLyogICAgICAgICAgICAqLyAoXG4gICAgZnVuY3MubWFwKGZ1bmMgPT4gZnVuYyAmJiB3cmFwRnVuY3Rpb24oZnVuYywgc2VuZGluZ0Vycm9yLCBYKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS50cmFja1R1cm5zKHRyYWNrVHVybnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC91dGlscy5qc3siaW1wb3J0cyI6WyIuL3NyYy9sb2NhbC5qcyIsIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2xvY2FsLmpzXCIsIFtdXSxbXCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvbG9jYWwuanMiOltbImdldE1ldGhvZE5hbWVzIiwiZ2V0TWV0aG9kTmFtZXMiXV0sIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOltbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciIsIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1oEqgFkMAABZDAAANQAAAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNS4yL3NyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQsJ25hbWUnLHt2YWx1ZTpcIndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50XCJ9KTskaM2PX29uY2Uud3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQod3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQpOy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IGNvbXBhcnRtZW50T3B0aW9ucyA9ICguLi5hcmdzKSA9PiB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBpZiAoXG4gICAgYXJncy5sZW5ndGggPT09IDEgJiZcbiAgICB0eXBlb2YgYXJnc1swXSA9PT0gJ29iamVjdCcgJiZcbiAgICBhcmdzWzBdICE9PSBudWxsICYmXG4gICAgJ19fb3B0aW9uc19fJyBpbiBhcmdzWzBdXG4gICkge1xuICAgIGNvbnN0IHsgX19vcHRpb25zX18sIC4uLm9wdGlvbnMgfSA9IGFyZ3NbMF07XG4gICAgYXNzZXJ0KFxuICAgICAgX19vcHRpb25zX18gPT09IHRydWUsXG4gICAgICBgQ29tcGFydG1lbnQgY29uc3RydWN0b3Igb25seSBzdXBwb3J0cyB0cnVlIF9fb3B0aW9uc19fIHNpZ2lsLCBnb3QgJHtfX29wdGlvbnNfX31gLFxuICAgICk7XG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW1xuICAgICAgZ2xvYmFscyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHt9KSxcbiAgICAgIG1vZHVsZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoe30pLFxuICAgICAgb3B0aW9ucyA9IHt9LFxuICAgIF0gPSBhcmdzO1xuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIG9wdGlvbnMubW9kdWxlcyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGBDb21wYXJ0bWVudCBjb25zdHJ1Y3RvciBtdXN0IHJlY2VpdmUgZWl0aGVyIGEgbW9kdWxlIG1hcCBhcmd1bWVudCBvciBtb2R1bGVzIG9wdGlvbiwgbm90IGJvdGhgLFxuICAgICk7XG4gICAgYXNzZXJ0LmVxdWFsKFxuICAgICAgb3B0aW9ucy5nbG9iYWxzLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgYENvbXBhcnRtZW50IGNvbnN0cnVjdG9yIG11c3QgcmVjZWl2ZSBlaXRoZXIgZ2xvYmFscyBhcmd1bWVudCBvciBvcHRpb24sIG5vdCBib3RoYCxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgZ2xvYmFscyxcbiAgICAgIG1vZHVsZXMsXG4gICAgfTtcbiAgfVxufTtcblxuICAgICAgIGZ1bmN0aW9uIHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KFxuICBPbGRDb21wYXJ0bWVudCxcbiAgaW5lc2NhcGFibGVUcmFuc2Zvcm1zLFxuICBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMsXG4pIHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgTmV3Q29tcGFydG1lbnQgPSBmdW5jdGlvbiBDb21wYXJ0bWVudCguLi5hcmdzKSB7XG4gICAgY29uc3QgeyB0cmFuc2Zvcm1zOiBvbGRUcmFuc2Zvcm1zID0gW10sIC4uLm90aGVyT3B0aW9ucyB9ID1cbiAgICAgIGNvbXBhcnRtZW50T3B0aW9ucyguLi5hcmdzKTtcbiAgICBjb25zdCBuZXdUcmFuc2Zvcm1zID0gWy4uLm9sZFRyYW5zZm9ybXMsIC4uLmluZXNjYXBhYmxlVHJhbnNmb3Jtc107XG4gICAgY29uc3QgbmV3T3B0aW9ucyA9IHtcbiAgICAgIC4uLm90aGVyT3B0aW9ucyxcbiAgICAgIHRyYW5zZm9ybXM6IG5ld1RyYW5zZm9ybXMsXG4gICAgICBfX29wdGlvbnNfXzogdHJ1ZSxcbiAgICB9O1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAobmV3LnRhcmdldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvL1xuICAgICAgdGhyb3cgRXJyb3IoJ0NvbXBhcnRtZW50IG11c3QgYmUgY2FsbGVkIGFzIGEgY29uc3RydWN0b3InKTtcbiAgICB9XG5cbiAgICAvL1xuXG4gICAgY29uc3QgYyA9IFJlZmxlY3QuY29uc3RydWN0KE9sZENvbXBhcnRtZW50LCBbbmV3T3B0aW9uc10sIG5ldy50YXJnZXQpO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudCA9IE5ld0NvbXBhcnRtZW50O1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChjb25zdCBwcm9wIG9mIFJlZmxlY3Qub3duS2V5cyhpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYy5nbG9iYWxUaGlzLCBwcm9wLCB7XG4gICAgICAgIHZhbHVlOiBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXNbcHJvcF0sXG4gICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAvL1xuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGM7XG4gIH07XG5cbiAgLy9cbiAgTmV3Q29tcGFydG1lbnQucHJvdG90eXBlID0gT2xkQ29tcGFydG1lbnQucHJvdG90eXBlO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgcmV0dXJuIE5ld0NvbXBhcnRtZW50O1xufVxuXG4vL1xuLy9cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50IjpbIndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOfCo0/LFgAAyxYAACcAAABAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjUuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC1hcmNoaXZlLmpzIiwiQGVuZG8vYmFzZTY0IiwiQGVuZG8vZXJyb3JzIiwiLi9jb21wYXJ0bWVudC13cmFwcGVyLmpzIl0sImV4cG9ydHMiOlsiYnVuZGxlVGVzdEV4cG9ydHMiLCJpbXBvcnRCdW5kbGUiLCJ0eXBlZEltcG9ydEJ1bmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhcnNlQXJjaGl2ZSxkZWNvZGVCYXNlNjQsRmFpbCx3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qc1wiLCBbW1wicGFyc2VBcmNoaXZlXCIsWyRozY9fYSA9PiAocGFyc2VBcmNoaXZlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vYmFzZTY0XCIsIFtbXCJkZWNvZGVCYXNlNjRcIixbJGjNj19hID0+IChkZWNvZGVCYXNlNjQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jb21wYXJ0bWVudC13cmFwcGVyLmpzXCIsIFtbXCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwiLFskaM2PX2EgPT4gKHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50ID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaW1wb3J0QnVuZGxlLCduYW1lJyx7dmFsdWU6XCJpbXBvcnRCdW5kbGVcIn0pOyRozY9fb25jZS5pbXBvcnRCdW5kbGUoaW1wb3J0QnVuZGxlKTtcblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG5cbi8vXG4vL1xuICAgICAgIGFzeW5jIGZ1bmN0aW9uIGltcG9ydEJ1bmRsZShidW5kbGUsIG9wdGlvbnMgPSB7fSwgcG93ZXJzID0ge30pIHtcbiAgYXdhaXQgbnVsbDtcbiAgY29uc3Qge1xuICAgIGJ1bmRsZVVybCA9IHVuZGVmaW5lZCxcbiAgICBmaWxlUHJlZml4LFxuICAgIGVuZG93bWVudHM6IG9wdEVuZG93bWVudHMgPSB7fSxcbiAgICAvL1xuICAgIC8vXG4gICAgdHJhbnNmb3JtcyA9IFtdLFxuICAgIGluZXNjYXBhYmxlVHJhbnNmb3JtcyA9IFtdLFxuICAgIGluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcyA9IHt9LFxuICAgIGV4cGVjdGVkU2hhNTEyID0gdW5kZWZpbmVkLFxuICAgIGltcG9ydEhvb2sgPSB1bmRlZmluZWQsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCB7XG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBjb21wdXRlU291cmNlTG9jYXRpb24gPSB1bmRlZmluZWQsXG4gICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uID0gdW5kZWZpbmVkLFxuICB9ID0gcG93ZXJzO1xuICBjb25zdCBlbmRvd21lbnRzID0ge1xuICAgIFRleHRFbmNvZGVyLFxuICAgIFRleHREZWNvZGVyLFxuICAgIFVSTDogZ2xvYmFsVGhpcy5VUkwsIC8vXG4gICAgQmFzZTY0OiBnbG9iYWxUaGlzLkJhc2U2NCwgLy9cbiAgICBhdG9iOiBnbG9iYWxUaGlzLmF0b2IsXG4gICAgYnRvYTogZ2xvYmFsVGhpcy5idG9hLFxuICAgIC4uLm9wdEVuZG93bWVudHMsXG4gIH07XG5cbiAgbGV0IENvbXBhcnRtZW50VG9Vc2UgPSBDb21wYXJ0bWVudDtcbiAgaWYgKFxuICAgIGluZXNjYXBhYmxlVHJhbnNmb3Jtcy5sZW5ndGggfHxcbiAgICBPYmplY3Qua2V5cyhpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMpLmxlbmd0aFxuICApIHtcbiAgICAvL1xuICAgIENvbXBhcnRtZW50VG9Vc2UgPSB3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudChcbiAgICAgIENvbXBhcnRtZW50LFxuICAgICAgaW5lc2NhcGFibGVUcmFuc2Zvcm1zLFxuICAgICAgaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzLFxuICAgICk7XG4gIH1cblxuICBsZXQgY29tcGFydG1lbnQ7XG5cbiAgYXNzZXJ0KCdtb2R1bGVGb3JtYXQnIGluIGJ1bmRsZSk7XG4gIGNvbnN0IHsgbW9kdWxlRm9ybWF0IH0gPSBidW5kbGU7XG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICdlbmRvWmlwQmFzZTY0Jykge1xuICAgIGFzc2VydCgnZW5kb1ppcEJhc2U2NCcgaW4gYnVuZGxlKTtcbiAgICBjb25zdCB7IGVuZG9aaXBCYXNlNjQgfSA9IGJ1bmRsZTtcbiAgICBjb25zdCBieXRlcyA9IGRlY29kZUJhc2U2NChlbmRvWmlwQmFzZTY0KTtcbiAgICBjb25zdCBhcmNoaXZlID0gYXdhaXQgcGFyc2VBcmNoaXZlKGJ5dGVzLCBidW5kbGVVcmwsIHtcbiAgICAgIGNvbXB1dGVTaGE1MTIsXG4gICAgICBleHBlY3RlZFNoYTUxMixcbiAgICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICAgIGltcG9ydEhvb2ssXG4gICAgfSk7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHsgbmFtZXNwYWNlIH0gPSBhd2FpdCBhcmNoaXZlWydpbXBvcnQnXSh7XG4gICAgICBnbG9iYWxzOiBlbmRvd21lbnRzLFxuICAgICAgX19zaGltVHJhbnNmb3Jtc19fOiB0cmFuc2Zvcm1zLFxuICAgICAgQ29tcGFydG1lbnQ6IENvbXBhcnRtZW50VG9Vc2UsXG4gICAgICBpbXBvcnRIb29rLFxuICAgIH0pO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICd0ZXN0Jykge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBidW5kbGVbU3ltYm9sLmZvcignZXhwb3J0cycpXTtcbiAgICBpZiAoZXhwb3J0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgaW1wb3J0IGJ1bmRsZSB3aXRoIG1vZHVsZUZvcm1hdCBcInRlc3RcIiB0aGF0IGxhY2tzIGFuIHN5bWJvbC1uYW1lZCBwcm9wZXJ0eSBAZXhwb3J0cyBhbmQgaGFzIGxpa2VseSBiZWVuIHBhcnRpYWxseSB0cmFuc3BvcnRlZCB2aWEgSlNPTiBvciBldmVudHVhbC1zZW5kJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIE9iamVjdC5zZWFsKFxuICAgICAgT2JqZWN0LmNyZWF0ZShcbiAgICAgICAgbnVsbCxcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFtcbiAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhleHBvcnRzKSlcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAuc29ydCgoW2FdLCBbYl0pID0+IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCkpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAoW25hbWUsIGRlc2NyaXB0b3JdKSA9PlxuICAgICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChbbmFtZV0pID0+IFtcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBleHBvcnRzW25hbWVdLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBTeW1ib2wudG9TdHJpbmdUYWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnTW9kdWxlJyxcbiAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnQoJ3NvdXJjZScgaW4gYnVuZGxlKTtcbiAgbGV0IHsgc291cmNlIH0gPSBidW5kbGU7XG4gIGNvbnN0IHNvdXJjZU1hcCA9ICdzb3VyY2VNYXAnIGluIGJ1bmRsZSA/IGJ1bmRsZS5zb3VyY2VNYXAgOiAnJztcbiAgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2dldEV4cG9ydCcpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgc291cmNlID0gYCgke3NvdXJjZX0pXFxuJHtzb3VyY2VNYXB9YDtcbiAgfSBlbHNlIGlmIChtb2R1bGVGb3JtYXQgPT09ICduZXN0ZWRFdmFsdWF0ZScpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGVuZG93bWVudHMubmVzdGVkRXZhbHVhdGUgPSBzcmMgPT4gY29tcGFydG1lbnQuZXZhbHVhdGUoc3JjKTtcbiAgICBzb3VyY2UgPSBgKCR7c291cmNlfSlcXG4ke3NvdXJjZU1hcH1gO1xuICB9IGVsc2UgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2VuZG9TY3JpcHQnKSB7XG4gICAgLy9cbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCBtb2R1bGVGb3JtYXQgJyR7bW9kdWxlRm9ybWF0fSdgO1xuICB9XG5cbiAgY29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnRUb1VzZShlbmRvd21lbnRzLCB7fSwgeyB0cmFuc2Zvcm1zIH0pO1xuICBoYXJkZW4oY29tcGFydG1lbnQuZ2xvYmFsVGhpcyk7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXBhcnRtZW50LmV2YWx1YXRlKHNvdXJjZSk7XG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICdlbmRvU2NyaXB0Jykge1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgY29uc3QgbmFtZXNwYWNlID0gcmVzdWx0KGZpbGVQcmVmaXgpO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdHlwZWRJbXBvcnRCdW5kbGUgPSBpbXBvcnRCdW5kbGU7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UudHlwZWRJbXBvcnRCdW5kbGUodHlwZWRJbXBvcnRCdW5kbGUpO1xuICAgICAgIGNvbnN0IGJ1bmRsZVRlc3RFeHBvcnRzID0gZXhwb3J0cyA9PiB7XG4gIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV4cG9ydHMpLmZpbHRlcihcbiAgICBuYW1lID0+IG5hbWUgIT09IFN5bWJvbC50b1N0cmluZ1RhZyxcbiAgKTtcbiAgc3ltYm9scy5sZW5ndGggPiAwICYmXG4gICAgRmFpbGBleHBvcnRzIG11c3Qgbm90IGhhdmUgc3ltYm9sLW5hbWVkIHByb3BlcnRpZXMsIGdvdDogJHtzeW1ib2xzLm1hcChTdHJpbmcpLmpvaW4oJywgJyl9YDtcbiAgcmV0dXJuIHtcbiAgICBtb2R1bGVGb3JtYXQ6ICd0ZXN0JyxcbiAgICBbU3ltYm9sLmZvcignZXhwb3J0cycpXTogZXhwb3J0cyxcbiAgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4qLyRozY9fb25jZS5idW5kbGVUZXN0RXhwb3J0cyhidW5kbGVUZXN0RXhwb3J0cyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbXBvcnRCdW5kbGUiOlsiaW1wb3J0QnVuZGxlIl0sInR5cGVkSW1wb3J0QnVuZGxlIjpbInR5cGVkSW1wb3J0QnVuZGxlIl0sImJ1bmRsZVRlc3RFeHBvcnRzIjpbImJ1bmRsZVRlc3RFeHBvcnRzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVGf9kHCAAABwgAAB0AAABAZW5kby9tYXJzaGFsLXYxLjguMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVCeUNvZGVQb2ludHMiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIiwicGFzc2FibGVBc0p1c3RpbiIsInBhc3NhYmxlQXNKdXN0aW4iLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXSxbInBhc3NhYmxlQXNKdXN0aW4iLCJwYXNzYWJsZUFzSnVzdGluIl0sWyJxcCIsInFwIl1dLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6W1sibWFrZVBhc3NhYmxlS2l0IiwibWFrZVBhc3NhYmxlS2l0Il0sWyJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiXSxbIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSJdLFsiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNFbmNvZGVkUmVtb3RhYmxlIl0sWyJ6ZXJvUGFkIiwiemVyb1BhZCJdLFsicmVjb3JkTmFtZXMiLCJyZWNvcmROYW1lcyJdLFsicmVjb3JkVmFsdWVzIiwicmVjb3JkVmFsdWVzIl1dLCIuL3NyYy9yYW5rT3JkZXIuanMiOltbImNvbXBhcmVOdW1lcmljcyIsImNvbXBhcmVOdW1lcmljcyJdLFsiY29tcGFyZUJ5Q29kZVBvaW50cyIsImNvbXBhcmVCeUNvZGVQb2ludHMiXSxbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIl0sWyJjb21wYXJlUmFuayIsImNvbXBhcmVSYW5rIl0sWyJpc1JhbmtTb3J0ZWQiLCJpc1JhbmtTb3J0ZWQiXSxbInNvcnRCeVJhbmsiLCJzb3J0QnlSYW5rIl0sWyJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQW50aVJhbmsiXSxbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXSxbImdldFBhc3NTdHlsZUNvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiXSxbImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sWyJ1bmlvblJhbmtDb3ZlcnMiLCJ1bmlvblJhbmtDb3ZlcnMiXV0sIkBlbmRvL3Bhc3Mtc3R5bGUiOltbImRlZXBseUZ1bGZpbGxlZCIsImRlZXBseUZ1bGZpbGxlZCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/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/8VgBAABYAQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA/RdPfYgYAAGIGAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQsbWVtb1JhY2U7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLFskaM2PX2EgPT4gKG1lbW9SYWNlID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCduYW1lJyx7dmFsdWU6XCJtYWtlUHJvbWlzZUtpdFwifSk7JGjNj19vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCduYW1lJyx7dmFsdWU6XCJyYWNlUHJvbWlzZXNcIn0pOyRozY9fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTtcblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2UgPSBnbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlIHx8IFByb21pc2U7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlUHJvbWlzZUtpdCgpIHtcbiAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0gPSBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuICBjb25zdCBwcm9taXNlID0gbmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfSk7XG59XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiByYWNlUHJvbWlzZXModmFsdWVzKSB7XG4gIHJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLCB2YWx1ZXMpKTtcbn1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1iEF+ZAIAAGQCAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsJ25hbWUnLHt2YWx1ZTpcImlzUHJvbWlzZVwifSk7JGjNj19vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOy8qXG5cblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIGlzUHJvbWlzZShtYXliZVByb21pc2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpID09PSBtYXliZVByb21pc2U7XG59XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2pkZOaUJAAClCQAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBpc1ByaW1pdGl2ZSA9IHZhbCA9PlxuICAhdmFsIHx8ICh0eXBlb2YgdmFsICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsICE9PSAnZnVuY3Rpb24nKTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGtub3duUHJvbWlzZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFya1NldHRsZWQgPSByZWNvcmQgPT4ge1xuICBpZiAoIXJlY29yZCB8fCByZWNvcmQuc2V0dGxlZCkge1xuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cblxuICBjb25zdCB7IGRlZmVycmVkcyB9ID0gcmVjb3JkO1xuICBPYmplY3QuYXNzaWduKHJlY29yZCwge1xuICAgIGRlZmVycmVkczogdW5kZWZpbmVkLFxuICAgIHNldHRsZWQ6IHRydWUsXG4gIH0pO1xuICBPYmplY3QuZnJlZXplKHJlY29yZCk7XG4gIHJldHVybiBkZWZlcnJlZHM7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkID0gdmFsdWUgPT4ge1xuICBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgc2V0dGxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIGxldCByZWNvcmQgPSBrbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZWNvcmQgPSB7IGRlZmVycmVkczogbmV3IFNldCgpLCBzZXR0bGVkOiBmYWxzZSB9O1xuICAgIGtub3duUHJvbWlzZXMuc2V0KHZhbHVlLCByZWNvcmQpO1xuICAgIC8vXG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuICAgICAgdmFsID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlc29sdmUgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlamVjdCB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCB7IHJhY2UgfSA9IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICByYWNlKHZhbHVlcykge1xuICAgIGxldCBkZWZlcnJlZDtcbiAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICAvL1xuICAgIGNvbnN0IGNhY2hlZFZhbHVlcyA9IFtdO1xuICAgIGNvbnN0IEMgPSB0aGlzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBDKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRlZmVycmVkID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgY29uc3QgeyBzZXR0bGVkLCBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoc2V0dGxlZCkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBDLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiByZXN1bHQuZmluYWxseSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcykge1xuICAgICAgICBjb25zdCB7IGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChkZWZlcnJlZHMpIHtcbiAgICAgICAgICBkZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTskaM2PX29uY2UucmFjZShyYWNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjBsiNR8GAAAfBgAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgaW50ZXJuYWxSZXNvbHZlO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbnRlcm5hbFJlamVjdDtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCByZXNvbHZlID0gdmFsdWUgPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlc29sdmUpIHtcbiAgICAgIGludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG4gICAgICBpbnRlcm5hbFJlc29sdmUgPSBudWxsO1xuICAgICAgaW50ZXJuYWxSZWplY3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlamVjdCA9IHJlYXNvbiA9PiB7XG4gICAgaWYgKGludGVybmFsUmVqZWN0KSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChyZWFzb24pO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVqZWN0ID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZXhlY3V0b3IgPSAocmVzLCByZWopID0+IHtcbiAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSB1bmRlZmluZWQgJiYgaW50ZXJuYWxSZWplY3QgPT09IHVuZGVmaW5lZCk7XG4gICAgaW50ZXJuYWxSZXNvbHZlID0gcmVzO1xuICAgIGludGVybmFsUmVqZWN0ID0gcmVqO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0pO1xufTskaM2PX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE6Fc2ufAQAAnwEAACAAAABAZW5kby90cmFtcG9saW5lLXYxLjAuNS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90cmFtcG9saW5lLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHJhbXBvbGluZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy90cmFtcG9saW5lLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM14fpGzBwAAswcAACkAAABAZW5kby90cmFtcG9saW5lLXYxLjAuNS9zcmMvdHJhbXBvbGluZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXN5bmNUcmFtcG9saW5lIiwiZ2VuZXJhdG9yUHJvdG90eXBlIiwic3luY1RyYW1wb2xpbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHN5bmNUcmFtcG9saW5lLCduYW1lJyx7dmFsdWU6XCJzeW5jVHJhbXBvbGluZVwifSk7JGjNj19vbmNlLnN5bmNUcmFtcG9saW5lKHN5bmNUcmFtcG9saW5lKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYXN5bmNUcmFtcG9saW5lLCduYW1lJyx7dmFsdWU6XCJhc3luY1RyYW1wb2xpbmVcIn0pOyRozY9fb25jZS5hc3luY1RyYW1wb2xpbmUoYXN5bmNUcmFtcG9saW5lKTsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKlxuXG4gKi9cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YgfSA9IE9iamVjdDtcbmNvbnN0IHsgYmluZCB9ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuY29uc3QgdW5jdXJyeVRoaXMgPSBiaW5kLmJpbmQoYmluZC5jYWxsKTsgLy9cbiAgICAgICBjb25zdCB7IHByb3RvdHlwZTogZ2VuZXJhdG9yUHJvdG90eXBlIH0gPSBnZXRQcm90b3R5cGVPZihcbiAgLy9cbiAgZnVuY3Rpb24qICgpIHt9LFxuKTskaM2PX29uY2UuZ2VuZXJhdG9yUHJvdG90eXBlKGdlbmVyYXRvclByb3RvdHlwZSk7XG5jb25zdCBnZW5lcmF0b3JOZXh0ID0gdW5jdXJyeVRoaXMoZ2VuZXJhdG9yUHJvdG90eXBlLm5leHQpO1xuY29uc3QgZ2VuZXJhdG9yVGhyb3cgPSB1bmN1cnJ5VGhpcyhnZW5lcmF0b3JQcm90b3R5cGUudGhyb3cpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBzeW5jVHJhbXBvbGluZShnZW5lcmF0b3JGbiwgLi4uYXJncykge1xuICBjb25zdCBpdGVyYXRvciA9IGdlbmVyYXRvckZuKC4uLmFyZ3MpO1xuICBsZXQgcmVzdWx0ID0gZ2VuZXJhdG9yTmV4dChpdGVyYXRvcik7XG4gIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yTmV4dChpdGVyYXRvciwgcmVzdWx0LnZhbHVlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJlc3VsdCA9IGdlbmVyYXRvclRocm93KGl0ZXJhdG9yLCBlcnIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0LnZhbHVlO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY1RyYW1wb2xpbmUoZ2VuZXJhdG9yRm4sIC4uLmFyZ3MpIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBnZW5lcmF0b3JGbiguLi5hcmdzKTtcbiAgbGV0IHJlc3VsdCA9IGdlbmVyYXRvck5leHQoaXRlcmF0b3IpO1xuICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vXG4gICAgICBjb25zdCB2YWwgPSBhd2FpdCByZXN1bHQudmFsdWU7XG4gICAgICByZXN1bHQgPSBnZW5lcmF0b3JOZXh0KGl0ZXJhdG9yLCB2YWwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yVGhyb3coaXRlcmF0b3IsIGVycik7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQudmFsdWU7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZW5lcmF0b3JQcm90b3R5cGUiOlsiZ2VuZXJhdG9yUHJvdG90eXBlIl0sInN5bmNUcmFtcG9saW5lIjpbInN5bmNUcmFtcG9saW5lIl0sImFzeW5jVHJhbXBvbGluZSI6WyJhc3luY1RyYW1wb2xpbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvP8BQ5oCAACaAgAAGgAAAEBlbmRvL3ppcC12MS4wLjExL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiLi9zcmMvcmVhZGVyLmpzIiwiLi9zcmMvd3JpdGVyLmpzIl0sImV4cG9ydHMiOlsicmVhZFppcCIsInJlYWRaaXAiLCJ3cml0ZVppcCIsIndyaXRlWmlwIl0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvcmVhZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy93cml0ZXIuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9yZWFkZXIuanMiOltbIlppcFJlYWRlciIsIlppcFJlYWRlciJdLFsicmVhZFppcCIsInJlYWRaaXAiXV0sIi4vc3JjL3dyaXRlci5qcyI6W1siWmlwV3JpdGVyIiwiWmlwV3JpdGVyIl0sWyJ3cml0ZVppcCIsIndyaXRlWmlwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1VqLpwRQAAMEUAAAmAAAAQGVuZG8vemlwLXYxLjAuMTEvc3JjL2J1ZmZlci1yZWFkZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJ1ZmZlclJlYWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHByaXZhdGVGaWVsZHMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwcml2YXRlRmllbGRzR2V0ID0gcHJpdmF0ZUZpZWxkcy5nZXQuYmluZChwcml2YXRlRmllbGRzKTtcblxuICAgICAgIGNsYXNzIEJ1ZmZlclJlYWRlciB7XG4gIC8qXG5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbiAgICBjb25zdCBkYXRhID0gbmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlcik7XG4gICAgcHJpdmF0ZUZpZWxkcy5zZXQodGhpcywge1xuICAgICAgYnl0ZXMsXG4gICAgICBkYXRhLFxuICAgICAgbGVuZ3RoOiBieXRlcy5sZW5ndGgsXG4gICAgICBpbmRleDogMCxcbiAgICAgIG9mZnNldDogMCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGdldCBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHByaXZhdGVGaWVsZHNHZXQodGhpcykubGVuZ3RoO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgZ2V0IGluZGV4KCkge1xuICAgIHJldHVybiBwcml2YXRlRmllbGRzR2V0KHRoaXMpLmluZGV4O1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgc2V0IGluZGV4KGluZGV4KSB7XG4gICAgdGhpcy5zZWVrKGluZGV4KTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNldCBvZmZzZXQob2Zmc2V0KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBpZiAob2Zmc2V0ID4gZmllbGRzLmRhdGEuYnl0ZUxlbmd0aCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCBzZXQgb2Zmc2V0IGJleW9uZCBsZW5ndGggb2YgdW5kZXJseWluZyBkYXRhJyk7XG4gICAgfVxuICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2Fubm90IHNldCBuZWdhdGl2ZSBvZmZzZXQnKTtcbiAgICB9XG4gICAgZmllbGRzLm9mZnNldCA9IG9mZnNldDtcbiAgICBmaWVsZHMubGVuZ3RoID0gZmllbGRzLmRhdGEuYnl0ZUxlbmd0aCAtIGZpZWxkcy5vZmZzZXQ7XG4gIH1cblxuICAvKlxuXG5cblxuICAgKi9cbiAgY2FuU2VlayhpbmRleCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgcmV0dXJuIGluZGV4ID49IDAgJiYgZmllbGRzLm9mZnNldCArIGluZGV4IDw9IGZpZWxkcy5sZW5ndGg7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIGFzc2VydENhblNlZWsoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIGlmICghdGhpcy5jYW5TZWVrKGluZGV4KSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBFbmQgb2YgZGF0YSByZWFjaGVkIChkYXRhIGxlbmd0aCA9ICR7ZmllbGRzLmxlbmd0aH0sIGFza2VkIGluZGV4ICR7aW5kZXh9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBzZWVrKGluZGV4KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBjb25zdCByZXN0b3JlID0gZmllbGRzLmluZGV4O1xuICAgIHRoaXMuYXNzZXJ0Q2FuU2VlayhpbmRleCk7XG4gICAgZmllbGRzLmluZGV4ID0gaW5kZXg7XG4gICAgcmV0dXJuIHJlc3RvcmU7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHBlZWsoc2l6ZSkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgLy9cbiAgICBzaXplID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZmllbGRzLmxlbmd0aCAtIGZpZWxkcy5pbmRleCwgc2l6ZSkpO1xuICAgIGlmIChzaXplID09PSAwKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoXG4gICAgICBmaWVsZHMub2Zmc2V0ICsgZmllbGRzLmluZGV4LFxuICAgICAgZmllbGRzLm9mZnNldCArIGZpZWxkcy5pbmRleCArIHNpemUsXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgY2FuUmVhZChvZmZzZXQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHJldHVybiB0aGlzLmNhblNlZWsoZmllbGRzLmluZGV4ICsgb2Zmc2V0KTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGFzc2VydENhblJlYWQob2Zmc2V0KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICB0aGlzLmFzc2VydENhblNlZWsoZmllbGRzLmluZGV4ICsgb2Zmc2V0KTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIHJlYWQoc2l6ZSkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5hc3NlcnRDYW5SZWFkKHNpemUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMucGVlayhzaXplKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gc2l6ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgcmVhZFVpbnQ4KCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5hc3NlcnRDYW5SZWFkKDEpO1xuICAgIGNvbnN0IGluZGV4ID0gZmllbGRzLm9mZnNldCArIGZpZWxkcy5pbmRleDtcbiAgICBjb25zdCB2YWx1ZSA9IGZpZWxkcy5kYXRhLmdldFVpbnQ4KGluZGV4KTtcbiAgICBmaWVsZHMuaW5kZXggKz0gMTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHJlYWRVaW50MTYobGl0dGxlRW5kaWFuKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICB0aGlzLmFzc2VydENhblJlYWQoMik7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMub2Zmc2V0ICsgZmllbGRzLmluZGV4O1xuICAgIGNvbnN0IHZhbHVlID0gZmllbGRzLmRhdGEuZ2V0VWludDE2KGluZGV4LCBsaXR0bGVFbmRpYW4pO1xuICAgIGZpZWxkcy5pbmRleCArPSAyO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgcmVhZFVpbnQzMihsaXR0bGVFbmRpYW4pIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHRoaXMuYXNzZXJ0Q2FuUmVhZCg0KTtcbiAgICBjb25zdCBpbmRleCA9IGZpZWxkcy5vZmZzZXQgKyBmaWVsZHMuaW5kZXg7XG4gICAgY29uc3QgdmFsdWUgPSBmaWVsZHMuZGF0YS5nZXRVaW50MzIoaW5kZXgsIGxpdHRsZUVuZGlhbik7XG4gICAgZmllbGRzLmluZGV4ICs9IDQ7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBieXRlQXQoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHJldHVybiBmaWVsZHMuYnl0ZXNbZmllbGRzLm9mZnNldCArIGluZGV4XTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNraXAob2Zmc2V0KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICB0aGlzLnNlZWsoZmllbGRzLmluZGV4ICsgb2Zmc2V0KTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgZXhwZWN0KGV4cGVjdGVkKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBpZiAoIXRoaXMubWF0Y2hBdChmaWVsZHMuaW5kZXgsIGV4cGVjdGVkKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmaWVsZHMuaW5kZXggKz0gZXhwZWN0ZWQubGVuZ3RoO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIG1hdGNoQXQoaW5kZXgsIGV4cGVjdGVkKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBpZiAoaW5kZXggKyBleHBlY3RlZC5sZW5ndGggPiBmaWVsZHMubGVuZ3RoIHx8IGluZGV4IDwgMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBpZiAoZXhwZWN0ZWRbaV0gIT09IHRoaXMuYnl0ZUF0KGluZGV4ICsgaSkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGFzc2VydChleHBlY3RlZCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKCF0aGlzLmV4cGVjdChleHBlY3RlZCkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkKX0gYXQgJHtmaWVsZHMuaW5kZXh9LCBnb3QgJHt0aGlzLnBlZWsoXG4gICAgICAgICAgZXhwZWN0ZWQubGVuZ3RoLFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgZmluZExhc3QoZXhwZWN0ZWQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIGxldCBpbmRleCA9IGZpZWxkcy5sZW5ndGggLSBleHBlY3RlZC5sZW5ndGg7XG4gICAgd2hpbGUgKGluZGV4ID49IDAgJiYgIXRoaXMubWF0Y2hBdChpbmRleCwgZXhwZWN0ZWQpKSB7XG4gICAgICBpbmRleCAtPSAxO1xuICAgIH1cbiAgICByZXR1cm4gaW5kZXg7XG4gIH1cbn0kaM2PX29uY2UuICAgQnVmZmVyUmVhZGVyKEJ1ZmZlclJlYWRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJSZWFkZXIiOlsiQnVmZmVyUmVhZGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPWypri+DwAAvg8AACYAAABAZW5kby96aXAtdjEuMC4xMS9zcmMvYnVmZmVyLXdyaXRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyV3JpdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByaXZhdGVGaWVsZHMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGdldFByaXZhdGVGaWVsZHMgPSBzZWxmID0+IHtcbiAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkcy5nZXQoc2VsZik7XG4gIGlmICghZmllbGRzKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0J1ZmZlcldyaXRlciBmaWVsZHMgYXJlIG5vdCBpbml0aWFsaXplZCcpO1xuICB9XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG5jb25zdCBhc3NlcnROYXROdW1iZXIgPSBuID0+IHtcbiAgaWYgKE51bWJlci5pc1NhZmVJbnRlZ2VyKG4pICYmIC8qICAgICAgICAgICAgICAgICAqLyAobikgPj0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aHJvdyBUeXBlRXJyb3IoYG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290ICR7bn1gKTtcbn07XG5cbiAgICAgICBjbGFzcyBCdWZmZXJXcml0ZXIge1xuICAvKlxuXG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiBnZXRQcml2YXRlRmllbGRzKHRoaXMpLmxlbmd0aDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5pbmRleDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNldCBpbmRleChpbmRleCkge1xuICAgIHRoaXMuc2VlayhpbmRleCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDE2KSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIHByaXZhdGVGaWVsZHMuc2V0KHRoaXMsIHtcbiAgICAgIGJ5dGVzLFxuICAgICAgZGF0YSxcbiAgICAgIGluZGV4OiAwLFxuICAgICAgbGVuZ3RoOiAwLFxuICAgICAgY2FwYWNpdHksXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBlbnN1cmVDYW5TZWVrKHJlcXVpcmVkKSB7XG4gICAgYXNzZXJ0TmF0TnVtYmVyKHJlcXVpcmVkKTtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIGxldCBjYXBhY2l0eSA9IGZpZWxkcy5jYXBhY2l0eTtcbiAgICB3aGlsZSAoY2FwYWNpdHkgPCByZXF1aXJlZCkge1xuICAgICAgY2FwYWNpdHkgKj0gMjtcbiAgICB9XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIGJ5dGVzLnNldChmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCwgZmllbGRzLmxlbmd0aCkpO1xuICAgIGZpZWxkcy5ieXRlcyA9IGJ5dGVzO1xuICAgIGZpZWxkcy5kYXRhID0gZGF0YTtcbiAgICBmaWVsZHMuY2FwYWNpdHkgPSBjYXBhY2l0eTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNlZWsoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuU2VlayhpbmRleCk7XG4gICAgZmllbGRzLmluZGV4ID0gaW5kZXg7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBlbnN1cmVDYW5Xcml0ZShzaXplKSB7XG4gICAgYXNzZXJ0TmF0TnVtYmVyKHNpemUpO1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgdGhpcy5lbnN1cmVDYW5TZWVrKGZpZWxkcy5pbmRleCArIHNpemUpO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgd3JpdGUoYnl0ZXMpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoYnl0ZXMuYnl0ZUxlbmd0aCk7XG4gICAgZmllbGRzLmJ5dGVzLnNldChieXRlcywgZmllbGRzLmluZGV4KTtcbiAgICBmaWVsZHMuaW5kZXggKz0gYnl0ZXMuYnl0ZUxlbmd0aDtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgd3JpdGVDb3B5KHN0YXJ0LCBlbmQpIHtcbiAgICBhc3NlcnROYXROdW1iZXIoc3RhcnQpO1xuICAgIGFzc2VydE5hdE51bWJlcihlbmQpO1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgY29uc3Qgc2l6ZSA9IGVuZCAtIHN0YXJ0O1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoc2l6ZSk7XG4gICAgZmllbGRzLmJ5dGVzLmNvcHlXaXRoaW4oZmllbGRzLmluZGV4LCBzdGFydCwgZW5kKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gc2l6ZTtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHdyaXRlVWludDgodmFsdWUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoMSk7XG4gICAgZmllbGRzLmRhdGEuc2V0VWludDgoZmllbGRzLmluZGV4LCB2YWx1ZSk7XG4gICAgZmllbGRzLmluZGV4ICs9IDE7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHdyaXRlVWludDE2KHZhbHVlLCBsaXR0bGVFbmRpYW4pIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoMik7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMuaW5kZXg7XG4gICAgZmllbGRzLmRhdGEuc2V0VWludDE2KGluZGV4LCB2YWx1ZSwgbGl0dGxlRW5kaWFuKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gMjtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgd3JpdGVVaW50MzIodmFsdWUsIGxpdHRsZUVuZGlhbikge1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgdGhpcy5lbnN1cmVDYW5Xcml0ZSg0KTtcbiAgICBjb25zdCBpbmRleCA9IGZpZWxkcy5pbmRleDtcbiAgICBmaWVsZHMuZGF0YS5zZXRVaW50MzIoaW5kZXgsIHZhbHVlLCBsaXR0bGVFbmRpYW4pO1xuICAgIGZpZWxkcy5pbmRleCArPSA0O1xuICAgIGZpZWxkcy5sZW5ndGggPSBNYXRoLm1heChmaWVsZHMuaW5kZXgsIGZpZWxkcy5sZW5ndGgpO1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIHN1YmFycmF5KGJlZ2luLCBlbmQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHJldHVybiBmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCwgZmllbGRzLmxlbmd0aCkuc3ViYXJyYXkoYmVnaW4sIGVuZCk7XG4gIH1cblxuICAvKlxuXG5cblxuICAgKi9cbiAgc2xpY2UoYmVnaW4sIGVuZCkge1xuICAgIHJldHVybiB0aGlzLnN1YmFycmF5KGJlZ2luLCBlbmQpLnNsaWNlKCk7XG4gIH1cbn0kaM2PX29uY2UuICAgQnVmZmVyV3JpdGVyKEJ1ZmZlcldyaXRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJXcml0ZXIiOlsiQnVmZmVyV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANGQ2vyoAQAAqAEAACQAAABAZW5kby96aXAtdjEuMC4xMS9zcmMvY29tcHJlc3Npb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlNUT1JFIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG5cbi8vXG4gICAgICAgY29uc3QgU1RPUkUgPSAwOyRozY9fb25jZS5TVE9SRShTVE9SRSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTVE9SRSI6WyJTVE9SRSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABe5tGBOAQAADgEAAAeAAAAQGVuZG8vemlwLXYxLjAuMTEvc3JjL2NyYzMyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJjcmMzMiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JjMzIsJ25hbWUnLHt2YWx1ZTpcImNyYzMyXCJ9KTskaM2PX29uY2UuY3JjMzIoY3JjMzIpOy8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuICovXG5cbi8vXG4vKlxuXG4gKi9cbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgbGV0IGM7XG4gIGNvbnN0IHRhYmxlID0gW107XG5cbiAgZm9yIChsZXQgbiA9IDA7IG4gPCAyNTY7IG4gKz0gMSkge1xuICAgIGMgPSBuO1xuICAgIGZvciAobGV0IGsgPSAwOyBrIDwgODsgayArPSAxKSB7XG4gICAgICBjID0gYyAmIDEgPyAweGVkYjg4MzIwIF4gKGMgPj4+IDEpIDogYyA+Pj4gMTtcbiAgICB9XG4gICAgdGFibGVbbl0gPSBjO1xuICB9XG5cbiAgcmV0dXJuIHRhYmxlO1xufVxuXG4vL1xuY29uc3QgdGFibGUgPSBtYWtlVGFibGUoKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gY3JjMzIoYnl0ZXMsIGxlbmd0aCA9IGJ5dGVzLmxlbmd0aCwgaW5kZXggPSAwLCBjcmMgPSAwKSB7XG4gIGNvbnN0IGVuZCA9IGluZGV4ICsgbGVuZ3RoO1xuXG4gIGNyYyBePSAtMTtcblxuICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPCBlbmQ7IGkgKz0gMSkge1xuICAgIGNyYyA9IChjcmMgPj4+IDgpIF4gdGFibGVbKGNyYyBeIGJ5dGVzW2ldKSAmIDB4ZmZdO1xuICB9XG5cbiAgcmV0dXJuIChjcmMgXiAtMSkgPj4+IDA7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjcmMzMiI6WyJjcmMzMiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACZqmSrnioAAJ4qAAAmAAAAQGVuZG8vemlwLXYxLjAuMTEvc3JjL2Zvcm1hdC1yZWFkZXIuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyIsIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRozY9faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIixbJGjNj19hID0+IChjcmMzMiA9ICRozY9fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsWyRozY9fYSA9PiAoc2lnbmF0dXJlID0gJGjNj19hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKGNvbXByZXNzaW9uID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmVhZFppcCwnbmFtZScse3ZhbHVlOlwicmVhZFppcFwifSk7JGjNj19vbmNlLnJlYWRaaXAocmVhZFppcCk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IE1BWF9WQUxVRV8xNkJJVFMgPSA2NTUzNTtcbmNvbnN0IE1BWF9WQUxVRV8zMkJJVFMgPSA0Mjk0OTY3Mjk1O1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gaXNFbmNyeXB0ZWQoYml0RmxhZykge1xuICByZXR1cm4gKGJpdEZsYWcgJiAweDAwMDEpID09PSAweDAwMDE7XG59XG5cbi8qXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZERvc0RhdGVUaW1lKHJlYWRlcikge1xuICBjb25zdCBkb3NUaW1lID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG4gIHJldHVybiBuZXcgRGF0ZShcbiAgICBEYXRlLlVUQyhcbiAgICAgICgoZG9zVGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODAsIC8vXG4gICAgICAoKGRvc1RpbWUgPj4gMjEpICYgMHgwZikgLSAxLCAvL1xuICAgICAgKGRvc1RpbWUgPj4gMTYpICYgMHgxZiwgLy9cbiAgICAgIChkb3NUaW1lID4+IDExKSAmIDB4MWYsIC8vXG4gICAgICAoZG9zVGltZSA+PiA1KSAmIDB4M2YsIC8vXG4gICAgICAoZG9zVGltZSAmIDB4MWYpIDw8IDEgIC8vXG4gICAgKSxcbiAgKTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRIZWFkZXJzKHJlYWRlcikge1xuICByZXR1cm4ge1xuICAgIHZlcnNpb25OZWVkZWQ6IHJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuICAgIGJpdEZsYWc6IHJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiByZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbiAgICBkYXRlOiByZWFkRG9zRGF0ZVRpbWUocmVhZGVyKSxcbiAgICBjcmMzMjogcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG4gICAgY29tcHJlc3NlZExlbmd0aDogcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG4gICAgdW5jb21wcmVzc2VkTGVuZ3RoOiByZWFkZXIucmVhZFVpbnQzMih0cnVlKSxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRDZW50cmFsRmlsZUhlYWRlcihyZWFkZXIpIHtcbiAgY29uc3QgdmVyc2lvbiA9IHJlYWRlci5yZWFkVWludDgoKTtcbiAgY29uc3QgbWFkZUJ5ID0gcmVhZGVyLnJlYWRVaW50OCgpO1xuICBjb25zdCBoZWFkZXJzID0gcmVhZEhlYWRlcnMocmVhZGVyKTtcbiAgY29uc3QgbmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBleHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjb21tZW50TGVuZ3RoID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGRpc2tOdW1iZXJTdGFydCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbiAgY29uc3QgZmlsZVN0YXJ0ID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5cbiAgY29uc3QgbmFtZSA9IHJlYWRlci5yZWFkKG5hbWVMZW5ndGgpO1xuICAvL1xuICByZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5cbiAgaWYgKGhlYWRlcnMudW5jb21wcmVzc2VkTGVuZ3RoID09PSBNQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gIH1cbiAgaWYgKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCA9PT0gTUFYX1ZBTFVFXzMyQklUUykge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG4gIGlmIChmaWxlU3RhcnQgPT09IE1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICB0aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiAgfVxuICBpZiAoZGlza051bWJlclN0YXJ0ID09PSBNQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gIH1cblxuICBjb25zdCBjb21tZW50ID0gcmVhZGVyLnJlYWQoY29tbWVudExlbmd0aCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHZlcnNpb24sXG4gICAgbWFkZUJ5LFxuICAgIC4uLmhlYWRlcnMsXG4gICAgZGlza051bWJlclN0YXJ0LFxuICAgIGludGVybmFsRmlsZUF0dHJpYnV0ZXMsXG4gICAgZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyxcbiAgICBmaWxlU3RhcnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLCBsb2NhdG9yKSB7XG4gIGNvbnN0IHsgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgY2VudHJhbERpcmVjdG9yeVJlY29yZHMgfSA9IGxvY2F0b3I7XG4gIHJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQpO1xuXG4gIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgd2hpbGUgKHJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpKSB7XG4gICAgY29uc3QgZW50cnkgPSByZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKTtcbiAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgaWYgKGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzICE9PSBlbnRyaWVzLmxlbmd0aCkge1xuICAgIC8vXG4gICAgLy9cbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgJHtjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc30gcmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290ICR7ZW50cmllcy5sZW5ndGh9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiByZWFkRmlsZShyZWFkZXIpIHtcbiAgcmVhZGVyLmV4cGVjdChzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuICBjb25zdCBoZWFkZXJzID0gcmVhZEhlYWRlcnMocmVhZGVyKTtcbiAgY29uc3QgbmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBleHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBuYW1lID0gcmVhZGVyLnJlYWQobmFtZUxlbmd0aCk7XG4gIHJlYWRlci5za2lwKGV4dHJhRmllbGRzTGVuZ3RoKTtcbiAgY29uc3QgY29udGVudCA9IHJlYWRlci5yZWFkKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCk7XG4gIHJldHVybiB7IG5hbWUsIC4uLmhlYWRlcnMsIGNvbnRlbnQgfTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZExvY2FsRmlsZXMocmVhZGVyLCByZWNvcmRzKSB7XG4gIGNvbnN0IGZpbGVzID0gW107XG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICByZWFkZXIuc2VlayhyZWNvcmQuZmlsZVN0YXJ0KTtcbiAgICBjb25zdCBmaWxlID0gcmVhZEZpbGUocmVhZGVyKTtcbiAgICBmaWxlcy5wdXNoKGZpbGUpO1xuICB9XG4gIHJldHVybiBmaWxlcztcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpIHtcbiAgaWYgKCFyZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICAnQ29ycnVwdCB6aXAgZmlsZSwgb3IgemlwIGZpbGUgY29udGFpbmluZyBhbiB1bnN1cHBvcnRlZCB2YXJpYWJsZS13aWR0aCBlbmQtb2YtYXJjaGl2ZSBjb21tZW50LCBvciBhbiB1bnN1cHBvcnRlZCB6aXAgZmlsZSB3aXRoIDY0IGJpdCBzaXplcycsXG4gICAgKTtcbiAgfVxuICBjb25zdCBkaXNrTnVtYmVyID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5UmVjb3JkcyA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5U2l6ZSA9IHJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5T2Zmc2V0ID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG4gIGNvbnN0IGNvbW1lbnRMZW5ndGggPSByZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgY29tbWVudCA9IHRleHREZWNvZGVyLmRlY29kZShyZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKSk7XG4gIHJldHVybiB7XG4gICAgZGlza051bWJlcixcbiAgICBkaXNrV2l0aENlbnRyYWxEaXJTdGFydCxcbiAgICBjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2ssXG4gICAgY2VudHJhbERpcmVjdG9yeVJlY29yZHMsXG4gICAgY2VudHJhbERpcmVjdG9yeVNpemUsXG4gICAgY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbiAgICBjb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpIHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgY2VudHJhbERpcmVjdG9yeUVuZCA9IHJlYWRlci5sZW5ndGggLSAyMjtcbiAgaWYgKGNlbnRyYWxEaXJlY3RvcnlFbmQgPCAwKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0NvcnJ1cHRlZCB6aXA6IG5vdCBlbm91Z2ggY29udGVudCcpO1xuICB9XG4gIHJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlFbmQpO1xuICBjb25zdCBsb2NhdG9yID0gcmVhZEJsb2NrRW5kT2ZDZW50cmFsKHJlYWRlcik7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgemlwNjQgPVxuICAgIGxvY2F0b3IuZGlza051bWJlciA9PT0gTUFYX1ZBTFVFXzE2QklUUyB8fFxuICAgIGxvY2F0b3IuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayA9PT0gTUFYX1ZBTFVFXzE2QklUUyB8fFxuICAgIGxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVJlY29yZHMgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlTaXplID09PSBNQVhfVkFMVUVfMzJCSVRTIHx8XG4gICAgbG9jYXRvci5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0ID09PSBNQVhfVkFMVUVfMzJCSVRTO1xuXG4gIGlmICh6aXA2NCkge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsXG4gICAgY2VudHJhbERpcmVjdG9yeVNpemVcbiAgICAvL1xuICB9ID0gbG9jYXRvcjtcblxuICBjb25zdCBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQgPVxuICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgKyBjZW50cmFsRGlyZWN0b3J5U2l6ZTtcbiAgY29uc3QgZXh0cmFCeXRlcyA9IGNlbnRyYWxEaXJlY3RvcnlFbmQgLSBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQ7XG5cbiAgcmVhZGVyLm9mZnNldCA9IGV4dHJhQnl0ZXM7XG5cbiAgcmV0dXJuIGxvY2F0b3I7XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUmVjb3JkcyhjZW50cmFsUmVjb3JkLCBsb2NhbFJlY29yZCwgYXJjaGl2ZU5hbWUpIHtcbiAgY29uc3QgY2VudHJhbE5hbWUgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoY2VudHJhbFJlY29yZC5uYW1lKTtcbiAgY29uc3QgbG9jYWxOYW1lID0gdGV4dERlY29kZXIuZGVjb2RlKGxvY2FsUmVjb3JkLm5hbWUpO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjZW50cmFsTmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJykgIT09IGxvY2FsTmFtZSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYFppcCBpbnRlZ3JpdHkgZXJyb3I6IGNlbnRyYWwgcmVjb3JkIGZpbGUgbmFtZSAke3EoXG4gICAgICAgIGNlbnRyYWxOYW1lLFxuICAgICAgKX0gbXVzdCBtYXRjaCBsb2NhbCBmaWxlIG5hbWUgJHtxKGxvY2FsTmFtZSl9IGluIGFyY2hpdmUgJHtxKFxuICAgICAgICBhcmNoaXZlTmFtZSxcbiAgICAgICl9YCxcbiAgICApO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBmdW5jdGlvbiBjaGVjayh2YWx1ZSwgbWVzc2FnZSkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgWmlwIGludGVncml0eSBlcnJvcjogJHttZXNzYWdlfSBmb3IgZmlsZSAke3EoXG4gICAgICAgICAgbG9jYWxOYW1lLFxuICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTmFtZSl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5iaXRGbGFnID09PSBsb2NhbFJlY29yZC5iaXRGbGFnLFxuICAgIGBDZW50cmFsIHJlY29yZCBiaXQgZmxhZyAke2NlbnRyYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZyhcbiAgICAgIDE2LFxuICAgICl9IG11c3QgbWF0Y2ggbG9jYWwgcmVjb3JkIGJpdCBmbGFnICR7bG9jYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZygxNil9YCxcbiAgKTtcbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCA9PT0gbG9jYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QsXG4gICAgYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG4gICAgICBjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgICl9IG11c3QgbWF0Y2ggbG9jYWwgY29tcHJlc3Npb24gbWV0aG9kICR7cShsb2NhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCl9YCxcbiAgKTtcbiAgLy9cbiAgLy9cbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5jcmMzMiA9PT0gbG9jYWxSZWNvcmQuY3JjMzIsXG4gICAgYENlbnRyYWwgcmVjb3JkIENSQy0zMiBjaGVja3N1bSAke2NlbnRyYWxSZWNvcmQuY3JjMzJ9IG11c3QgbWF0Y2ggbG9jYWwgY2hlY2tzdW0gJHtsb2NhbFJlY29yZC5jcmMzMn1gLFxuICApO1xuICBjaGVjayhcbiAgICBjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGggPT09IGxvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGgsXG4gICAgYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzZWQgc2l6ZSAke2NlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGh9YCxcbiAgKTtcbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGggPT09IGxvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aCxcbiAgICBgQ2VudHJhbCByZWNvcmQgdW5jb21wcmVzc2VkIHNpemUgJHtjZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH1gLFxuICApO1xuXG4gIGNvbnN0IGNoZWNrc3VtID0gY3JjMzIobG9jYWxSZWNvcmQuY29udGVudCk7XG4gIGNoZWNrKFxuICAgIGNoZWNrc3VtID09PSBsb2NhbFJlY29yZC5jcmMzMixcbiAgICBgQ1JDLTMyIGNoZWNrc3VtIG1pc21hdGNoLCB3YW50ZWQgJHtsb2NhbFJlY29yZC5jcmMzMn0gYnV0IGFjdHVhbCBjb250ZW50IGlzICR7Y2hlY2tzdW19YCxcbiAgKTtcbn1cblxuLypcblxuICovXG5mdW5jdGlvbiBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpIHtcbiAgcmV0dXJuIChleHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4ZmZmZjtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkVG9GaWxlKGNlbnRyYWxSZWNvcmQsIGxvY2FsUmVjb3JkKSB7XG4gIGNvbnN0IG1vZGUgPSBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGNlbnRyYWxSZWNvcmQuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY2VudHJhbFJlY29yZC5uYW1lLFxuICAgIG1vZGUsXG4gICAgZGF0ZTogY2VudHJhbFJlY29yZC5kYXRlLFxuICAgIGNyYzMyOiBjZW50cmFsUmVjb3JkLmNyYzMyLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiBjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgIGNvbXByZXNzZWRMZW5ndGg6IGNlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aCxcbiAgICB1bmNvbXByZXNzZWRMZW5ndGg6IGNlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIGNvbnRlbnQ6IGxvY2FsUmVjb3JkLmNvbnRlbnQsXG4gICAgY29tbWVudDogY2VudHJhbFJlY29yZC5jb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gZGVjb21wcmVzc0ZpbGUoZmlsZSkge1xuICBpZiAoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCAhPT0gY29tcHJlc3Npb24uU1RPUkUpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3QgZmluZCBkZWNvbXByZXNzb3IgZm9yIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG4gICAgICAgIGZpbGUuY29tcHJlc3Npb25NZXRob2QsXG4gICAgICApfSBmb3IgZmlsZSAke2ZpbGUubmFtZX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgbW9kZTogZmlsZS5tb2RlLFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudDogZmlsZS5jb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlRmlsZShmaWxlKSB7XG4gIGNvbnN0IG5hbWUgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5uYW1lKTtcbiAgY29uc3QgY29tbWVudCA9IHRleHREZWNvZGVyLmRlY29kZShmaWxlLmNvbW1lbnQpO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogJ2ZpbGUnLFxuICAgIG1vZGU6IGZpbGUubW9kZSAmIDBvNzc3LFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiByZWFkWmlwKHJlYWRlciwgbmFtZSA9ICc8dW5rbm93bj4nKSB7XG4gIGNvbnN0IGxvY2F0b3IgPSByZWFkRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHJlYWRlcik7XG4gIGNvbnN0IGNlbnRyYWxSZWNvcmRzID0gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLCBsb2NhdG9yKTtcbiAgY29uc3QgbG9jYWxSZWNvcmRzID0gcmVhZExvY2FsRmlsZXMocmVhZGVyLCBjZW50cmFsUmVjb3Jkcyk7XG4gIGNvbnN0IGZpbGVzID0gbmV3IE1hcCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2VudHJhbFJlY29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBjZW50cmFsUmVjb3JkID0gY2VudHJhbFJlY29yZHNbaV07XG4gICAgY29uc3QgbG9jYWxSZWNvcmQgPSBsb2NhbFJlY29yZHNbaV07XG5cbiAgICBjaGVja1JlY29yZHMoY2VudHJhbFJlY29yZCwgbG9jYWxSZWNvcmQsIG5hbWUpO1xuXG4gICAgaWYgKGlzRW5jcnlwdGVkKGNlbnRyYWxSZWNvcmQuYml0RmxhZykpIHtcbiAgICAgIHRocm93IEVycm9yKCdFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNEaXIgPSAoY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgwMDEwKSAhPT0gMDtcbiAgICBpZiAoIWlzRGlyKSB7XG4gICAgICBjb25zdCBjb21wcmVzc2VkRmlsZSA9IHJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLCBsb2NhbFJlY29yZCk7XG4gICAgICBjb25zdCBkZWNvbXByZXNzZWRGaWxlID0gZGVjb21wcmVzc0ZpbGUoY29tcHJlc3NlZEZpbGUpO1xuICAgICAgY29uc3QgZGVjb2RlZEZpbGUgPSBkZWNvZGVGaWxlKGRlY29tcHJlc3NlZEZpbGUpO1xuICAgICAgZmlsZXMuc2V0KGRlY29kZWRGaWxlLm5hbWUsIGRlY29kZWRGaWxlKTtcbiAgICB9XG4gICAgLy9cbiAgfVxuICByZXR1cm4gZmlsZXM7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiv8HosEWAADBFgAAJgAAAEBlbmRvL3ppcC12MS4wLjExL3NyYy9mb3JtYXQtd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJ3cml0ZVppcCIsIndyaXRlWmlwUmVjb3JkcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGNyYzMyLHNpZ25hdHVyZSxjb21wcmVzc2lvbjskaM2PX2ltcG9ydHMoW1tcIi4vY3JjMzIuanNcIiwgW1tcImNyYzMyXCIsWyRozY9fYSA9PiAoY3JjMzIgPSAkaM2PX2EpXV1dXSxbXCIuL3NpZ25hdHVyZS5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKHNpZ25hdHVyZSA9ICRozY9fYSldXV1dLFtcIi4vY29tcHJlc3Npb24uanNcIiwgW1tcIipcIixbJGjNj19hID0+IChjb21wcmVzc2lvbiA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwUmVjb3JkcywnbmFtZScse3ZhbHVlOlwid3JpdGVaaXBSZWNvcmRzXCJ9KTskaM2PX29uY2Uud3JpdGVaaXBSZWNvcmRzKHdyaXRlWmlwUmVjb3Jkcyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwLCduYW1lJyx7dmFsdWU6XCJ3cml0ZVppcFwifSk7JGjNj19vbmNlLndyaXRlWmlwKHdyaXRlWmlwKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IFVOSVggPSAzO1xuY29uc3QgVU5JWF9WRVJTSU9OID0gMzA7XG5cbmNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5cbi8qXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gd3JpdGVEb3NEYXRlVGltZSh3cml0ZXIsIGRhdGUpIHtcbiAgY29uc3QgZG9zVGltZSA9XG4gICAgZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGRhdGUgIT09IG51bGxcbiAgICAgID8gKCgoZGF0ZS5nZXRVVENGdWxsWWVhcigpIC0gMTk4MCkgJiAweDdmKSA8PCAyNSkgfCAvL1xuICAgICAgICAoKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpIDw8IDIxKSB8IC8vXG4gICAgICAgIChkYXRlLmdldFVUQ0RhdGUoKSA8PCAxNikgfCAvL1xuICAgICAgICAoZGF0ZS5nZXRVVENIb3VycygpIDw8IDExKSB8IC8vXG4gICAgICAgIChkYXRlLmdldFVUQ01pbnV0ZXMoKSA8PCA1KSB8IC8vXG4gICAgICAgIChkYXRlLmdldFVUQ1NlY29uZHMoKSA+PiAxKSAvL1xuICAgICAgOiAwOyAvL1xuICB3cml0ZXIud3JpdGVVaW50MzIoZG9zVGltZSwgdHJ1ZSk7XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIHdyaXRlRmlsZSh3cml0ZXIsIGZpbGUpIHtcbiAgLy9cbiAgY29uc3QgZmlsZVN0YXJ0ID0gd3JpdGVyLmluZGV4O1xuICB3cml0ZXIud3JpdGUoc2lnbmF0dXJlLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbiAgY29uc3QgaGVhZGVyU3RhcnQgPSB3cml0ZXIuaW5kZXg7XG4gIC8vXG4gIHdyaXRlci53cml0ZVVpbnQxNigxMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLmJpdEZsYWcsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCwgdHJ1ZSk7XG4gIHdyaXRlRG9zRGF0ZVRpbWUod3JpdGVyLCBmaWxlLmRhdGUpO1xuICB3cml0ZXIud3JpdGVVaW50MzIoZmlsZS5jcmMzMiwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLmNvbXByZXNzZWRMZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MzIoZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5uYW1lLmxlbmd0aCwgdHJ1ZSk7XG4gIGNvbnN0IGhlYWRlckVuZCA9IHdyaXRlci5sZW5ndGg7XG5cbiAgLy9cbiAgd3JpdGVyLndyaXRlVWludDE2KDAsIHRydWUpO1xuICB3cml0ZXIud3JpdGUoZmlsZS5uYW1lKTtcbiAgLy9cbiAgd3JpdGVyLndyaXRlKGZpbGUuY29udGVudCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmaWxlU3RhcnQsXG4gICAgaGVhZGVyU3RhcnQsXG4gICAgaGVhZGVyRW5kLFxuICB9O1xufVxuXG4vKlxuXG5cblxuICovXG5mdW5jdGlvbiB3cml0ZUNlbnRyYWxGaWxlSGVhZGVyKHdyaXRlciwgZmlsZSwgbG9jYXRvcikge1xuICB3cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpO1xuICB3cml0ZXIud3JpdGVVaW50OChmaWxlLnZlcnNpb24pO1xuICB3cml0ZXIud3JpdGVVaW50OChmaWxlLm1hZGVCeSk7XG4gIHdyaXRlci53cml0ZUNvcHkobG9jYXRvci5oZWFkZXJTdGFydCwgbG9jYXRvci5oZWFkZXJFbmQpO1xuICAvL1xuICB3cml0ZXIud3JpdGVVaW50MTYoMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLmNvbW1lbnQubGVuZ3RoLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuZGlza051bWJlclN0YXJ0LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuaW50ZXJuYWxGaWxlQXR0cmlidXRlcywgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MzIobG9jYXRvci5maWxlU3RhcnQsIHRydWUpO1xuICB3cml0ZXIud3JpdGUoZmlsZS5jZW50cmFsTmFtZSk7XG4gIC8vXG4gIHdyaXRlci53cml0ZShmaWxlLmNvbW1lbnQpO1xufVxuXG4vKlxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gd3JpdGVFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoXG4gIHdyaXRlcixcbiAgZW50cmllc0NvdW50LFxuICBjZW50cmFsRGlyZWN0b3J5U3RhcnQsXG4gIGNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsXG4gIGNvbW1lbnRCeXRlcyxcbikge1xuICB3cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gIHdyaXRlci53cml0ZVVpbnQxNigwLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KDAsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZW50cmllc0NvdW50LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGVudHJpZXNDb3VudCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihjZW50cmFsRGlyZWN0b3J5TGVuZ3RoLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGNlbnRyYWxEaXJlY3RvcnlTdGFydCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihjb21tZW50Qnl0ZXMubGVuZ3RoLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlKGNvbW1lbnRCeXRlcyk7XG59XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiB3cml0ZVppcFJlY29yZHMod3JpdGVyLCByZWNvcmRzLCBjb21tZW50ID0gJycpIHtcbiAgLy9cbiAgY29uc3QgbG9jYXRvcnMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbG9jYXRvcnMucHVzaCh3cml0ZUZpbGUod3JpdGVyLCByZWNvcmRzW2ldKSk7XG4gIH1cblxuICAvL1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5U3RhcnQgPSB3cml0ZXIuaW5kZXg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYXRvcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB3cml0ZUNlbnRyYWxGaWxlSGVhZGVyKHdyaXRlciwgcmVjb3Jkc1tpXSwgbG9jYXRvcnNbaV0pO1xuICB9XG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlMZW5ndGggPSB3cml0ZXIuaW5kZXggLSBjZW50cmFsRGlyZWN0b3J5U3RhcnQ7XG5cbiAgY29uc3QgY29tbWVudEJ5dGVzID0gdGV4dEVuY29kZXIuZW5jb2RlKGNvbW1lbnQpO1xuXG4gIC8vXG4gIHdyaXRlRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKFxuICAgIHdyaXRlcixcbiAgICByZWNvcmRzLmxlbmd0aCxcbiAgICBjZW50cmFsRGlyZWN0b3J5U3RhcnQsXG4gICAgY2VudHJhbERpcmVjdG9yeUxlbmd0aCxcbiAgICBjb21tZW50Qnl0ZXMsXG4gICk7XG59XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiBlbmNvZGVGaWxlKGZpbGUpIHtcbiAgY29uc3QgbmFtZSA9IHRleHRFbmNvZGVyLmVuY29kZShmaWxlLm5hbWUucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgY29uc3QgY29tbWVudCA9IHRleHRFbmNvZGVyLmVuY29kZShmaWxlLmNvbW1lbnQpO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgbW9kZTogZmlsZS5tb2RlLFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzRmlsZVdpdGhTdG9yZShmaWxlKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogZmlsZS5uYW1lLFxuICAgIG1vZGU6IGZpbGUubW9kZSxcbiAgICBkYXRlOiBmaWxlLmRhdGUsXG4gICAgY3JjMzI6IGNyYzMyKGZpbGUuY29udGVudCksXG4gICAgY29tcHJlc3Npb25NZXRob2Q6IGNvbXByZXNzaW9uLlNUT1JFLFxuICAgIGNvbXByZXNzZWRMZW5ndGg6IGZpbGUuY29udGVudC5sZW5ndGgsXG4gICAgdW5jb21wcmVzc2VkTGVuZ3RoOiBmaWxlLmNvbnRlbnQubGVuZ3RoLFxuICAgIGNvbnRlbnQ6IGZpbGUuY29udGVudCxcbiAgICBjb21tZW50OiBmaWxlLmNvbW1lbnQsXG4gIH07XG59XG5cbi8qXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhtb2RlKSB7XG4gIHJldHVybiAoKG1vZGUgJiAwbzc3NykgfCAwbzEwMDAwMCkgPDwgMTY7XG59XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIG1ha2VGaWxlUmVjb3JkKGZpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgY2VudHJhbE5hbWU6IGZpbGUubmFtZSxcbiAgICBtYWRlQnk6IFVOSVgsXG4gICAgdmVyc2lvbjogVU5JWF9WRVJTSU9OLFxuICAgIHZlcnNpb25OZWVkZWQ6IDAsIC8vXG4gICAgYml0RmxhZzogMCxcbiAgICBjb21wcmVzc2lvbk1ldGhvZDogY29tcHJlc3Npb24uU1RPUkUsXG4gICAgZGF0ZTogZmlsZS5kYXRlLFxuICAgIGNyYzMyOiBmaWxlLmNyYzMyLFxuICAgIGNvbXByZXNzZWRMZW5ndGg6IGZpbGUuY29tcHJlc3NlZExlbmd0aCxcbiAgICB1bmNvbXByZXNzZWRMZW5ndGg6IGZpbGUudW5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIGRpc2tOdW1iZXJTdGFydDogMCxcbiAgICBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzOiAwLFxuICAgIGV4dGVybmFsRmlsZUF0dHJpYnV0ZXM6IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMoZmlsZS5tb2RlKSxcbiAgICBjb21tZW50OiBmaWxlLmNvbW1lbnQsXG4gICAgY29udGVudDogZmlsZS5jb250ZW50LFxuICB9O1xufVxuXG4vKlxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gd3JpdGVaaXAod3JpdGVyLCBmaWxlcywgY29tbWVudCA9ICcnKSB7XG4gIGNvbnN0IGVuY29kZWRGaWxlcyA9IGZpbGVzLm1hcChlbmNvZGVGaWxlKTtcbiAgY29uc3QgY29tcHJlc3NlZEZpbGVzID0gZW5jb2RlZEZpbGVzLm1hcChjb21wcmVzc0ZpbGVXaXRoU3RvcmUpO1xuICAvL1xuICBjb25zdCBmaWxlUmVjb3JkcyA9IGNvbXByZXNzZWRGaWxlcy5tYXAobWFrZUZpbGVSZWNvcmQpO1xuICB3cml0ZVppcFJlY29yZHMod3JpdGVyLCBmaWxlUmVjb3JkcywgY29tbWVudCk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cml0ZVppcFJlY29yZHMiOlsid3JpdGVaaXBSZWNvcmRzIl0sIndyaXRlWmlwIjpbIndyaXRlWmlwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJKQNMyeBgAAngYAAB8AAABAZW5kby96aXAtdjEuMC4xMS9zcmMvcmVhZGVyLmpzeyJpbXBvcnRzIjpbIi4vYnVmZmVyLXJlYWRlci5qcyIsIi4vZm9ybWF0LXJlYWRlci5qcyJdLCJleHBvcnRzIjpbIlppcFJlYWRlciIsInJlYWRaaXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBCdWZmZXJSZWFkZXIscmVhZFppcEZvcm1hdDskaM2PX2ltcG9ydHMoW1tcIi4vYnVmZmVyLXJlYWRlci5qc1wiLCBbW1wiQnVmZmVyUmVhZGVyXCIsWyRozY9fYSA9PiAoQnVmZmVyUmVhZGVyID0gJGjNj19hKV1dXV0sW1wiLi9mb3JtYXQtcmVhZGVyLmpzXCIsIFtbXCJyZWFkWmlwXCIsWyRozY9fYSA9PiAocmVhZFppcEZvcm1hdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbiAgICAgICBjbGFzcyBaaXBSZWFkZXIge1xuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3RydWN0b3IoZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgeyBuYW1lID0gJzx1bmtub3duPicgfSA9IG9wdGlvbnM7XG4gICAgLy9cbiAgICBjb25zdCByZWFkZXIgPSBuZXcgQnVmZmVyUmVhZGVyKGRhdGEpO1xuICAgIHRoaXMuZmlsZXMgPSByZWFkWmlwRm9ybWF0KHJlYWRlcik7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgcmVhZChuYW1lKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuICAgIGlmIChmaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKGBDYW5ub3QgZmluZCBmaWxlICR7bmFtZX0gaW4gWmlwIGZpbGUgJHt0aGlzLm5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBmaWxlLmNvbnRlbnQ7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHN0YXQobmFtZSkge1xuICAgIGNvbnN0IGZpbGUgPSB0aGlzLmZpbGVzLmdldChuYW1lKTtcbiAgICBpZiAoZmlsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgbW9kZTogZmlsZS5tb2RlLFxuICAgICAgZGF0ZTogZmlsZS5kYXRlLFxuICAgICAgY29tbWVudDogZmlsZS5jb21tZW50LFxuICAgIH07XG4gIH1cbn1cblxuLypcblxuXG5cbiAqLyRozY9fb25jZS4gWmlwUmVhZGVyKFppcFJlYWRlcik7XG4gICAgICAgY29uc3QgcmVhZFppcCA9IGFzeW5jIChkYXRhLCBsb2NhdGlvbikgPT4ge1xuICBjb25zdCByZWFkZXIgPSBuZXcgWmlwUmVhZGVyKGRhdGEsIHsgbmFtZTogbG9jYXRpb24gfSk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCByZWFkID0gYXN5bmMgcGF0aCA9PiByZWFkZXIucmVhZChwYXRoKTtcbiAgcmV0dXJuIHsgcmVhZCB9O1xufTskaM2PX29uY2UucmVhZFppcChyZWFkWmlwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlppcFJlYWRlciI6WyJaaXBSZWFkZXIiXSwicmVhZFppcCI6WyJyZWFkWmlwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKtP/O27BgAAuwYAACIAAABAZW5kby96aXAtdjEuMC4xMS9zcmMvc2lnbmF0dXJlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiLCJDRU5UUkFMX0ZJTEVfSEVBREVSIiwiREFUQV9ERVNDUklQVE9SIiwiTE9DQUxfRklMRV9IRUFERVIiLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gdShzdHJpbmcpIHtcbiAgY29uc3QgYXJyYXkgPSBuZXcgVWludDhBcnJheShzdHJpbmcubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHJpbmcubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBhcnJheVtpXSA9IHN0cmluZy5jaGFyQ29kZUF0KGkpICYgMHhmZjtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbiAgICAgICBjb25zdCBMT0NBTF9GSUxFX0hFQURFUiA9IHUoJ1BLXFx4MDNcXHgwNCcpOyRozY9fb25jZS5MT0NBTF9GSUxFX0hFQURFUihMT0NBTF9GSUxFX0hFQURFUik7XG4gICAgICAgY29uc3QgQ0VOVFJBTF9GSUxFX0hFQURFUiA9IHUoJ1BLXFx4MDFcXHgwMicpOyRozY9fb25jZS5DRU5UUkFMX0ZJTEVfSEVBREVSKENFTlRSQUxfRklMRV9IRUFERVIpO1xuICAgICAgIGNvbnN0IENFTlRSQUxfRElSRUNUT1JZX0VORCA9IHUoJ1BLXFx4MDVcXHgwNicpOyRozY9fb25jZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQoQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICBjb25zdCBaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SID0gdSgnUEtcXHgwNlxceDA3Jyk7JGjNj19vbmNlLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IoWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUik7XG4gICAgICAgY29uc3QgWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EID0gdSgnUEtcXHgwNlxceDA2Jyk7JGjNj19vbmNlLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORChaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgIGNvbnN0IERBVEFfREVTQ1JJUFRPUiA9IHUoJ1BLXFx4MDdcXHgwOCcpOyRozY9fb25jZS5EQVRBX0RFU0NSSVBUT1IoREFUQV9ERVNDUklQVE9SKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkxPQ0FMX0ZJTEVfSEVBREVSIjpbIkxPQ0FMX0ZJTEVfSEVBREVSIl0sIkNFTlRSQUxfRklMRV9IRUFERVIiOlsiQ0VOVFJBTF9GSUxFX0hFQURFUiJdLCJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiOlsiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIl0sIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiOlsiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiJdLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiOlsiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIl0sIkRBVEFfREVTQ1JJUFRPUiI6WyJEQVRBX0RFU0NSSVBUT1IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAHgAAAEBlbmRvL3ppcC12MS4wLjExL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACj63iQDQcAAA0HAAAfAAAAQGVuZG8vemlwLXYxLjAuMTEvc3JjL3dyaXRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci13cml0ZXIuanMiLCIuL2Zvcm1hdC13cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBXcml0ZXIiLCJ3cml0ZVppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEJ1ZmZlcldyaXRlcix3cml0ZVppcEZvcm1hdDskaM2PX2ltcG9ydHMoW1tcIi4vYnVmZmVyLXdyaXRlci5qc1wiLCBbW1wiQnVmZmVyV3JpdGVyXCIsWyRozY9fYSA9PiAoQnVmZmVyV3JpdGVyID0gJGjNj19hKV1dXV0sW1wiLi9mb3JtYXQtd3JpdGVyLmpzXCIsIFtbXCJ3cml0ZVppcFwiLFskaM2PX2EgPT4gKHdyaXRlWmlwRm9ybWF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuICAgICAgIGNsYXNzIFppcFdyaXRlciB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0geyBkYXRlOiBuZXcgRGF0ZSgpIH0pIHtcbiAgICBjb25zdCB7IGRhdGUgfSA9IG9wdGlvbnM7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICB0aGlzLmZpbGVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZGF0ZSA9IGRhdGU7XG4gIH1cblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICB3cml0ZShuYW1lLCBjb250ZW50LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IG1vZGUgPSAwbzY0NCwgZGF0ZSA9IHVuZGVmaW5lZCwgY29tbWVudCA9ICcnIH0gPSBvcHRpb25zO1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFppcFdyaXRlciB3cml0ZSByZXF1aXJlcyBjb250ZW50IGZvciAke25hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMuZmlsZXMuc2V0KG5hbWUsIHtcbiAgICAgIG5hbWUsXG4gICAgICBtb2RlLFxuICAgICAgZGF0ZSxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBjb21tZW50LFxuICAgIH0pO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgc25hcHNob3QoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ1ZmZlcldyaXRlcigpO1xuICAgIHdyaXRlWmlwRm9ybWF0KHdyaXRlciwgQXJyYXkuZnJvbSh0aGlzLmZpbGVzLnZhbHVlcygpKSk7XG4gICAgcmV0dXJuIHdyaXRlci5zdWJhcnJheSgpO1xuICB9XG59XG5cbi8qXG5cbiAqLyRozY9fb25jZS4gWmlwV3JpdGVyKFppcFdyaXRlcik7XG4gICAgICAgY29uc3Qgd3JpdGVaaXAgPSAoKSA9PiB7XG4gIGNvbnN0IHdyaXRlciA9IG5ldyBaaXBXcml0ZXIoKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB3cml0ZSA9IGFzeW5jIChwYXRoLCBkYXRhKSA9PiB7XG4gICAgd3JpdGVyLndyaXRlKHBhdGgsIGRhdGEpO1xuICB9O1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHNuYXBzaG90ID0gYXN5bmMgKCkgPT4gd3JpdGVyLnNuYXBzaG90KCk7XG4gIHJldHVybiB7IHdyaXRlLCBzbmFwc2hvdCB9O1xufTskaM2PX29uY2Uud3JpdGVaaXAod3JpdGVaaXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwV3JpdGVyIjpbIlppcFdyaXRlciJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAAJ7RWuwFdAAABXQAABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAB9bFDXZBAAA2QQAAC8AAAAAAAAAAAAAAKSBN3QAAEBhZ29yaWMvc3Bhd25lci12MC42LjktdTIyLjIvc3JjL3ZhdC1zcGF3bmVkLmpzUEsBAh4DCgAAAAAAAAAAADjUnGd1AgAAdQIAABwAAAAAAAAAAAAAAKSBXXkAAEBlbmRvL2Jhc2U2NC12MS4wLjEyL2F0b2IuanNQSwECHgMKAAAAAAAAAAAAksKTjzQDAAA0AwAAHAAAAAAAAAAAAAAApIEMfAAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvYnRvYS5qc1BLAQIeAwoAAAAAAAAAAAAEe3Z/uQEAALkBAAAeAAAAAAAAAAAAAACkgXp/AABAZW5kby9iYXNlNjQtdjEuMC4xMi9kZWNvZGUuanNQSwECHgMKAAAAAAAAAAAAoValSLkBAAC5AQAAHgAAAAAAAAAAAAAApIFvgQAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAABr76lekAgAApAIAAB0AAAAAAAAAAAAAAKSBZIMAAEBlbmRvL2Jhc2U2NC12MS4wLjEyL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAJOnY8BoAwAAaAMAACIAAAAAAAAAAAAAAKSBQ4YAAEBlbmRvL2Jhc2U2NC12MS4wLjEyL3NyYy9jb21tb24uanNQSwECHgMKAAAAAAAAAAAA8sBOwZIIAACSCAAAIgAAAAAAAAAAAAAApIHriQAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvc3JjL2RlY29kZS5qc1BLAQIeAwoAAAAAAAAAAACPE0M3awcAAGsHAAAiAAAAAAAAAAAAAACkgb2SAABAZW5kby9iYXNlNjQtdjEuMC4xMi9zcmMvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAANRN/zdKAgAASgIAACUAAAAAAAAAAAAAAKSBaJoAAEBlbmRvL2NvbW1vbi12MS4yLjEzL2lkZW50LWNoZWNrZXIuanNQSwECHgMKAAAAAAAAAAAAf1UUszQDAAA0AwAAIgAAAAAAAAAAAAAApIH1nAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1hcC5qc1BLAQIeAwoAAAAAAAAAAAC3BWtwfQIAAH0CAAAxAAAAAAAAAAAAAACkgWmgAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL2ltcG9ydC1hcmNoaXZlLmpzUEsBAh4DCgAAAAAAAAAAAFrWwA0gKgAAICoAADYAAAAAAAAAAAAAAKSBNaMAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL2NvbXBhcnRtZW50LW1hcC5qc1BLAQIeAwoAAAAAAAAAAABF1+4LOgMAADoDAAAwAAAAAAAAAAAAAACkganNAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9leHRlbnNpb24uanNQSwECHgMKAAAAAAAAAAAAgRia37MtAACzLQAAOgAAAAAAAAAAAAAApIEx0QAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qc1BLAQIeAwoAAAAAAAAAAACq7NjjNgUAADYFAAA9AAAAAAAAAAAAAACkgTz/AABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9pbXBvcnQtYXJjaGl2ZS1wYXJzZXJzLmpzUEsBAh4DCgAAAAAAAAAAAMtb23HgCAAA4AgAADUAAAAAAAAAAAAAAKSBzQQBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL2ltcG9ydC1hcmNoaXZlLmpzUEsBAh4DCgAAAAAAAAAAAPsuuP6cVAAAnFQAADIAAAAAAAAAAAAAAKSBAA4BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL2ltcG9ydC1ob29rLmpzUEsBAh4DCgAAAAAAAAAAAOroDm3yAgAA8gIAACsAAAAAAAAAAAAAAKSB7GIBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL2pzb24uanNQSwECHgMKAAAAAAAAAAAArwp0SKwlAACsJQAAKwAAAAAAAAAAAAAApIEnZgEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvbGluay5qc1BLAQIeAwoAAAAAAAAAAACSDRk7BRgAAAUYAAAxAAAAAAAAAAAAAACkgRyMAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9tYXAtcGFyc2VyLmpzUEsBAh4DCgAAAAAAAAAAANF/5/LTCwAA0wsAADwAAAAAAAAAAAAAAKSBcKQBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1BLAQIeAwoAAAAAAAAAAACBR/U0UgUAAFIFAAAyAAAAAAAAAAAAAACkgZ2wAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wYXJzZS1ieXRlcy5qc1BLAQIeAwoAAAAAAAAAAACTY5TvVBUAAFQVAABGAAAAAAAAAAAAAACkgT+2AQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzUEsBAh4DCgAAAAAAAAAAAH6/VuZEBQAARAUAADEAAAAAAAAAAAAAAKSB98sBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL3BhcnNlLWpzb24uanNQSwECHgMKAAAAAAAAAAAAI5Px1yIIAAAiCAAANAAAAAAAAAAAAAAApIGK0QEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvcGFyc2UtcHJlLWNqcy5qc1BLAQIeAwoAAAAAAAAAAABMYdpbVQUAAFUFAAA0AAAAAAAAAAAAAACkgf7ZAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wYXJzZS1wcmUtbWpzLmpzUEsBAh4DCgAAAAAAAAAAAFk9swT+BAAA/gQAADEAAAAAAAAAAAAAAKSBpd8BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL3BhcnNlLXRleHQuanNQSwECHgMKAAAAAAAAAAAA2dwMBmMZAABjGQAANAAAAAAAAAAAAAAApIHy5AEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvcG9saWN5LWZvcm1hdC5qc1BLAQIeAwoAAAAAAAAAAADm2W72PCoAADwqAAAtAAAAAAAAAAAAAACkgaf+AQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4zL3NyYy9wb2xpY3kuanNQSwECHgMKAAAAAAAAAAAAe3UziuAIAADgCAAALQAAAAAAAAAAAAAApIEuKQIAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMy9zcmMvcG93ZXJzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAADUAAAAAAAAAAAAAAKSBWTICAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMvc3JjL3R5cGVzLWV4dGVybmFsLmpzUEsBAh4DCgAAAAAAAAAAADSioamiAQAAogEAACIAAAAAAAAAAAAAAKSBBDQCAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAFxjc8VQQAABUEAAALAAAAAAAAAAAAAAApIHmNQIAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9zcmMvZW52LW9wdGlvbnMuanNQSwECHgMKAAAAAAAAAAAASTX26VQIAABUCAAAHQAAAAAAAAAAAAAApIGERgIAQGVuZG8vZXJyb3JzLXYxLjIuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAybGDGRsWAAAbFgAAIwAAAAAAAAAAAAAApIETTwIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKQAAAAAAAAAAAAAApIFvZQIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAZEA169IOAADSDgAAJwAAAAAAAAAAAAAApIEOZwIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL2xvY2FsLmpzUEsBAh4DCgAAAAAAAAAAAHkz7Lg8DwAAPA8AADUAAAAAAAAAAAAAAKSBJXYCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzUEsBAh4DCgAAAAAAAAAAALh2lJ1fAwAAXwMAACkAAAAAAAAAAAAAAKSBtIUCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAMjsB0XJCgAAyQoAAC0AAAAAAAAAAAAAAKSBWokCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy90cmFjay10dXJucy5qc1BLAQIeAwoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAAAAAAAAAAACkgW6UAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC91dGlscy5qc1BLAQIeAwoAAAAAAAAAAADWgSqAWQwAAFkMAAA1AAAAAAAAAAAAAACkgROXAgBAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjUuMi9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qc1BLAQIeAwoAAAAAAAAAAADnwqNPyxYAAMsWAAAnAAAAAAAAAAAAAACkgb+jAgBAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjUuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAdUZ/2QcIAAAHCAAAHQAAAAAAAAAAAAAApIHPugIAQGVuZG8vbWFyc2hhbC12MS44LjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA/V3tcLZQAAC2UAAAKgAAAAAAAAAAAAAApIERwwIAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAADSIMmUFLAAABSwAACsAAAAAAAAAAAAAAKSBDxQDAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAUj8p+lQsAABULAAALQAAAAAAAAAAAAAApIFdQAMAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAALI2RwX6MgAA+jIAACoAAAAAAAAAAAAAAKSB/GwDAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAC+IqcbSgcAAEoHAAAtAAAAAAAAAAAAAACkgT6gAwBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAClup8g0vAAANLwAAIwAAAAAAAAAAAAAApIHTpwMAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAztimM/o6AAD6OgAAJQAAAAAAAAAAAAAApIEh1wMAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAhAAAAAAAAAAAAAACkgV4SBABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAXpyzyswFAADMBQAAHQAAAAAAAAAAAAAApIH1EwQAQGVuZG8vbmF0LXY1LjEuMy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAbm7eczYLAAA2CwAAIAAAAAAAAAAAAAAApIH8GQQAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAQpCrGMYIAADGCAAAKAAAAAAAAAAAAAAApIFwJQQAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2J5dGVBcnJheS5qc1BLAQIeAwoAAAAAAAAAAADD7/ZFvAYAALwGAAAoAAAAAAAAAAAAAACkgXwuBABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAANaoaZ8fCQAAHwkAACkAAAAAAAAAAAAAAKSBfjUEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAACNdxwWHDAAAhwwAAC4AAAAAAAAAAAAAAKSB5D4EAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAF1cCItMUAADTFAAAJAAAAAAAAAAAAAAApIG3SwQAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAANOikHykBgAApAYAACsAAAAAAAAAAAAAAKSBzGAEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAYnh4idkSAADZEgAAJwAAAAAAAAAAAAAApIG5ZwQAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAE3BiNPcBAAA3AQAACkAAAAAAAAAAAAAAKSB13oEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAGrwH0CTFwAAkxcAADAAAAAAAAAAAAAAAKSB+n8EAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAACHS0iSKCwAACgsAAAqAAAAAAAAAAAAAACkgduXBABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAc4dccHQfAAB0HwAAKAAAAAAAAAAAAAAApIFLxAQAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAAD0QYgRHg4AAB4OAAArAAAAAAAAAAAAAACkgQXkBABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAALo+zaF5CAAAeQgAACUAAAAAAAAAAAAAAKSBbPIEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zdHJpbmcuanNQSwECHgMKAAAAAAAAAAAAswoQLNwLAADcCwAAJQAAAAAAAAAAAAAApIEo+wQAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAADy5fJQyQcAAMkHAAAlAAAAAAAAAAAAAACkgUcHBQBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAFHCzq2uEAAArhAAACkAAAAAAAAAAAAAAKSBUw8FAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAAAAAAAAAAAAAKSBSCAFAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAA/RdPfYgYAAGIGAAAiAAAAAAAAAAAAAACkgeIhBQBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHWIQX5kAgAAZAIAACsAAAAAAAAAAAAAAKSBhCgFAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL2lzLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAA2pkZOaUJAAClCQAAKgAAAAAAAAAAAAAApIExKwUAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAIwbIjUfBgAAHwYAADUAAAAAAAAAAAAAAKSBHjUFAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAAAAAAAAAAAAAKSBkDsFAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAE6Fc2ufAQAAnwEAACAAAAAAAAAAAAAAAKSBLD0FAEBlbmRvL3RyYW1wb2xpbmUtdjEuMC41L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAM14fpGzBwAAswcAACkAAAAAAAAAAAAAAKSBCT8FAEBlbmRvL3RyYW1wb2xpbmUtdjEuMC41L3NyYy90cmFtcG9saW5lLmpzUEsBAh4DCgAAAAAAAAAAALz/AUOaAgAAmgIAABoAAAAAAAAAAAAAAKSBA0cFAEBlbmRvL3ppcC12MS4wLjExL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHVWounBFAAAwRQAACYAAAAAAAAAAAAAAKSB1UkFAEBlbmRvL3ppcC12MS4wLjExL3NyYy9idWZmZXItcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAAPWypri+DwAAvg8AACYAAAAAAAAAAAAAAKSB2l4FAEBlbmRvL3ppcC12MS4wLjExL3NyYy9idWZmZXItd3JpdGVyLmpzUEsBAh4DCgAAAAAAAAAAANGQ2vyoAQAAqAEAACQAAAAAAAAAAAAAAKSB3G4FAEBlbmRvL3ppcC12MS4wLjExL3NyYy9jb21wcmVzc2lvbi5qc1BLAQIeAwoAAAAAAAAAAABe5tGBOAQAADgEAAAeAAAAAAAAAAAAAACkgcZwBQBAZW5kby96aXAtdjEuMC4xMS9zcmMvY3JjMzIuanNQSwECHgMKAAAAAAAAAAAAmapkq54qAACeKgAAJgAAAAAAAAAAAAAApIE6dQUAQGVuZG8vemlwLXYxLjAuMTEvc3JjL2Zvcm1hdC1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAiv8HosEWAADBFgAAJgAAAAAAAAAAAAAApIEcoAUAQGVuZG8vemlwLXYxLjAuMTEvc3JjL2Zvcm1hdC13cml0ZXIuanNQSwECHgMKAAAAAAAAAAAAkpA0zJ4GAACeBgAAHwAAAAAAAAAAAAAApIEhtwUAQGVuZG8vemlwLXYxLjAuMTEvc3JjL3JlYWRlci5qc1BLAQIeAwoAAAAAAAAAAACrT/ztuwYAALsGAAAiAAAAAAAAAAAAAACkgfy9BQBAZW5kby96aXAtdjEuMC4xMS9zcmMvc2lnbmF0dXJlLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAAB4AAAAAAAAAAAAAAKSB98QFAEBlbmRvL3ppcC12MS4wLjExL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACj63iQDQcAAA0HAAAfAAAAAAAAAAAAAACkgYvGBQBAZW5kby96aXAtdjEuMC4xMS9zcmMvd3JpdGVyLmpzUEsFBgAAAABbAFsA2B4AANXNBQAAAA==","endoZipBase64Sha512":"ff5289459d8fbac9148a2fa83b98e5a95a812aeaf0a5161d46f8b01e5035dc8b97c49f8b190a1b0dd5a5484b2d3d1303c489b2ca46c6cc9c0b7dcc32797f6202"};