@agoric/spawner 0.6.9-u21.0 → 0.6.9-u22.0

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":"UEsDBAoAAAAAAAAAAAAgBFZ0x3AAAMdwAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjEuMCIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi45LXUyMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi45LXUyMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtc3Bhd25lZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LXNwYXduZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YWJhMTIzYzA4MzcwZWEzZjI2ZDQ1NzU2MzY4NDY0ODE4NGY0NWIwN2RiNWJiN2YzODAwNGQ0M2Q3ZjdiZjM5ZDBmMDQyOWY3NTNhYjkzZjI0YTg4ZWFmMjc0MzIxYWM4N2I3OWU0ZDMyYTRlNGZiM2U2ZjRlZmQ0ZTRhYzNiNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vYmFzZTY0LXYxLjAuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vYmFzZTY0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Jhc2U2NC12MS4wLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vYmFzZTY0LXYxLjAuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJhMTkwZWQ3ZDJhYzc1Njc4NGZlMGExMDM5MzAzZmZkOWJmMDM3YzQ0MGJiZDIyZmViYTBmNDZkYzAzZGM1YjYyMTYwZmJlZTlkNDA0ZGE4Y2JmOTJkMDE0ZDlkYTY5NWFmOWZlZTkwODU3NDM0Y2UyZGI4MDU3ZDE4ZjVhNWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2NjNjA4NTZhZDdkYjkwMDBlNzcyN2RhNjE0OTc4YjUwOGQ2MWZkYmQ0ZGM4MmI4MWQ0ZTM0M2UxZTEzOTJlY2JhODM5ZDQ2ZDA0OTJiMzQ1ZWE4YmFhNmZmODI2MTJiNThjZWMyYTc3ZjQ5OTc3YTY5MTc2NWQ2ZmMxNDU1MjQiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTRmYTc3NmNmM2NiZDE2ZGQ4MmQ1YzMzYzgxYzIzODMwYjYyODEwMDZhZGM3ODE4MDUxNmZiMmI4MWJlNjM0NThhZGNhNTQyZTU0YWY4MDdmMmRjNzdjM2ViZjA5YWVkZGFjOGRiZTlmZDk2NDQwNmY4NGE1YjY4YjEzNTZlNmQiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjk0Yjg2YWNlMDJkZGMyMjYxOTgxNTIxMWYyN2I5ZTczMmU5ZGRiZDZiMGZlYWM1MmU0Mjg1NjA1ZTk1ZTQxMWIzN2I3NTM5ZDFlNzZiMWM3Zjk4ZDJmYWRlNzlmZTcwNzFmZjgxZTc3YjQ5ZTQwYzJiOGU4ZWQyMTBlMzNkNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMxMzU4ODE5NjIzNTcwNzQ3ZDA1NjJhMjhjZjdjMmRhYTdjZjcxOGZiMDk5M2Y1ODc1N2FkZDQ5OWMwMzFkMTI4ZWU5MDEyNjBiODE5NTNjNGU5MDMyY2RhMzM4NjNiYzM4OTBjMTZjNGM1YjY5NDI4ZjRkY2RiZDg2NTM4OTZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTIzMjQyM2I5OWY2MDQxYzNhMGY3M2ZhNTQ3Yzg3MjhhYjdhZDkwN2ZmMTk2YTUwNWE3ZjZlNDA4MjFjZTkxNjEyNzY3MTU0ZDY0MzRjNTI4ODllZGRhODJmMTc1ZGIxYmQ2NzFkZDZlMDk5MWE2YTIwMTFjOTM2MjBjZTViYzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYzFlNmRiYWEyMDQwZWU5ZmIwNjViYzY2MjEzMjgyYzg1ODJhNzg2NDg0ZDBjYmE2ZDg1MzI4OWY1YjJlMTNmOWRkYzU2OTMxZTViOWMxZDExODUxYTMzN2JhNWQ0MjA2NGRhZTAwODVjZTRiMGQxMjE3NDQwOTM4MDI3MGZhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkxYmUyMjlkZGQwYTFhYmYyOTRmOGRiNmEyNjM1MjU4YjRhZWMzMmNjNzJmMzNkZTI4N2EwMTc1NWYyZjFhNDdiZjA3ZTc2MmFlZDhiMGMxM2JkMGUxZTc1NjhhOWI2YTQxNDI5ODJjMTkxYmRjN2I3MTI2YmMzYTFmZDQ3NjM5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi4xMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tbW9uIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2IzZWYxYjBiOTRiNzBkNTUyYTQzYmJkYTFhYzQ2ZmJhYWQ1NjhlZTAyNDgxM2U4ZTVkODIwMjVjMTE2ZDRhMTc5MzM3MTNjYjM0MDI3NTg1OWZiM2JlM2Y1YTM5NzRhZTY1NmVmMWJlYjAxYWEwZWZhMDVlODBiZTVjMDhkMDYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vdHJhbXBvbGluZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby90cmFtcG9saW5lLXYxLjAuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MS4wLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjZhN2QzMjkzZjQzODJhZWI1YmE2Y2EzNDE2ODc1ZDQwZGZiMGQ2NDI0ZTg5YzA4MDk3NDFjYTQ3NDVlOWM2NmIyNjhlYWY1MjI5ZWY2YmNkNjIzZTg5ODc2Njg2ODI4MDViMjJiNzJhOWI3YjQwZTY1MDk4NWQyMGNhZjU4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wYXJ0bWVudC1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY0MzQ0NDRiYzhlYzRkZjU0NzRmMjY3NzgwMzA3ZWUxNzY0NTc4MDJkY2I0OTAzMDhmYWU2ZTE2OWM1NGM0MmVlNjIyNjg1NzJkODEzMjkzOTkwYzY4NDhkNWYzNDRkOGU1OTNhNjBlNmZjOWNlMjMxZDY4ZDNlN2FmY2YxNzk5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4dGVuc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXh0ZW5zaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzRkYjAxM2JhMzVhYWM3YjJlNDNmNTk1NzBlNTcxYWUyZmQ4M2RjOGRmOTA2YWM5NzY3YjM5N2I2MTAxMmY0NmQzMjU0NmE1OWViNzg2YjRiNzliZmVkYTczZDNhMzljMTBjYTkwMGEyNjBjMjQxN2Y0YjVlZTgxZjAxYTA2OWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQwNmZjZTcxZTBjNTJiMDMyNDdmOTU5MWY4NzdmM2U4MDY3ODNiNTMyMzVhYTgxNTZkMTg5NzNiN2Q2ZGQyNTdhMWFlYjRhNzMyMjMwNzc1YjUzZDM1OTA2OTViNzhiNThlNjQxNGIyNTQzMjU2NzY4YWNmM2M5ZWY1MDI5NmJmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Yjk5MDdmMjg0MmQzMzMwZThhMTE4ODNjMDg4OGRjZTk0ZTUwODdlNTAxNDBkNmM0Y2EwM2U0YzE3ZmUzZGI4YWRjZmExMjY0YWNhOWEzMjhjODBmZTQ5NmRkZWRjMGZhNTc0M2VhYjBiYWQyYjhkMjlhNmRlZmZiMWQwMTY4ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOGNiM2YxMjAyMjMzNjUxODMwYjhlODBiOWY1ZDE3MzVjZTJlZWNjMjY5NGVhYjNhNGU1MzhhMWQwMmI3MGE0YTFjZDQyYTkzMjdjMGNjYTc4MjhmYjQyYmQzODJiZGYwNTJmOWU2N2M3ZjE4NGQxN2Y5ZDMxNzc3Mzk1MmRhOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtaG9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWhvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhODBhNTU5ZmU5YzE2YzEwNjg2NGVjZjEyNjYwNmE0ZWQ5YWFjNGRkYmExNjEzYThhNDVhMjQ2ZWEzMWE0YzRkMjljNGU2NmM5ZjkxYzYzNDc5NDM3YzVhZWE1ZDgzZjhmN2I5NzViOTM3MzAzZTI0ZmFmNmRjYzg5ZTc4NzJjMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGViODNlMDkxNjMzZTU4NDdkYzc0ZDA2NDBkYTViZGM3YjQxMGRjOTA0NzJkZTA2OWNjZTU5MmFmMWQzM2I3NTY1YTlmNDVmMmMzZWEyZmZiMWUxZDBlODBkODVlNGI3M2I1OGQyOGM2OTQ4MmNiNDg5NWI3MjM3ODJlMGY0YzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMzMjQ3NjNjNjhmOGE4Y2EzNjk3NWQ5ZmRkZDgzNTQ2NzA3MTdhOWZmMWY5ODZlMTFhM2EyNjhlN2ViYzYyZjI0MTQxZDc1ZjY0YzkzMWYzMjY5OTcwYzNhNTdkMWZkOWUzMzEwOWFjMjlhM2M2OTRkMmU0Y2FhMWJlMzhkNjg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcC1wYXJzZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcC1wYXJzZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmOTYzNjQxYjVhODg0YTAwZWZjZTYxNmExOWYzMmM0YTNhMDcwYTI0YjRkMGM3NWMzNDVmNmQyYmYxZjc3MTY1M2FjOTQyMTYyNDRjMDlmODE4ZWY0MzU0ZjE3NGZkNGQ1MzBkZDcyYmVjYjM1MmVjN2JkMTRlYjAxM2NmZWJmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkMDBiNGU0YmI3MTJkNjJhN2MxYmFiZTkxYzQ1MjRmNmFiM2Y0MzBkZWJhODRmYWNlY2ZhYTdlODU1M2RlMDNjMThkNDUwMmI4YTZkNjMzYWViM2U3YzU4ZTgxMWM5YTE2ZTU3MzRlOTQ0YjdkMjBkZWUzMTI2NzJmYTViYzMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWJ5dGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1ieXRlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUzZDcwN2ZiYTg3OGQ3NzlhZjAzMzdjOGFiMjllNzAwODY5NzYzMTkzMzZlNjg3M2M1NjQ5MjMyN2NlOWY4MWVjOTI3NzE1YzA0MTAzN2EyY2QwMjY3YjM5ZDBjZGYyNmUxMmIxN2IwODU4NmY3ZTI1ODU3ZjZjZmFjOWRmNmJkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNWI4YjJhMGZkMzY4MmFmMTczYmZhYzFmNjBiNGJiY2U0OGRjMGE3MjIxZTc5MGIwMWJlNzhiMzMxMTNmODgyMWFhMDQyNDU0NTkwMmM2YmZhNjVhZWI3ODg4ZTFjNjUyZDA3YWFiMzA2OTU4NTYzMWE5YmRjYjRmYTZiYzZjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTM3ZTdiZWExOGY3Y2EwYWIxNTQwMzc0M2JiN2ZmZGI5MzNkMGI5YTNkZmFmMzE4ZTI4NzY2MWUwNmZkYTlhMDdjNDRjNGY4NjY0M2NlMDJlNzFkMzhiOGE1M2RjMWEyZDhjNjRhN2UzMTY5MTJjMWM0NDY3ZDhjNjY5MWMzNjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLWNqcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLWNqcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjZDJjZDgyZTc5OWIyYzQ0OWJlNjRjYzc3YTliOTYwMDRlN2ZhNDJhMmRmMzBhMmY2MzdiYzMzNjRmNDJmZDBjYjIzYzE5OTkwMmEzNjliYWExYmZkN2ZjYmQ4ODUwMzY5MzA1YzA4OWU3Y2U5NGZkNjMyM2JhYTg0NGUzODUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXByZS1tanMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXByZS1tanMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZDA0NzlkZDZkNDAyMTQwNWFhYjEzMjMyZWU5ZDI5ZjE1NTQzZWJlYTU3MmNkOTgwMTJlYWJkY2MwN2M2MDQ3YWY1Nzk3NzJlODJmYzc2MmE0NWY1ZmY2YzY5MWQ1MWRkOWFkNjcxMGE2NDhkMDc3NjIyOTIzNDRhMmE4ZGEwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS10ZXh0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS10ZXh0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGY3ZDJiOGI4YjM0M2E4ZjRiYTdlNzE5NzY3NWNhYzQzZjNkYmE5MDQyMDMzN2U3MDE2MDI2ZDllMjc4ZDNiYzk1M2U5ZTgyOGE5YTczZDZiNGQ4MTQ1YTBmMGE4NmYwYjQ4NWViYjI1MWExYmY3ZWE2N2M5YmFjMzQ1Njg1MGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LWZvcm1hdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LWZvcm1hdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3NjQxMDk0MzY1OTUzNzVhNmQ2NGE1OWY5NWY3MjZlNWFhZTA4Nzg3Y2FmOWFhNTA1YTEwMWVjNmYzOTY5NGNjM2ZlZWIxODcyZDAzMDQwYTQ2ZjlkOWJhOTE2M2E1OTdlOTBiZjRkZDQwZDE5MTRmMTdmYTU1NTRlN2RkMDI3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BvbGljeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjZkYTRkOWYwOWEyNTdiMzIwNzNlODhiMmIzNzAzNmY4ZTIxMmU1OWUyODJiOTk5NDZjMTkzNTdiODI5ZmFiNThlZDgxN2U2ZDQxNDQyNWU3YjZhNDVhNDI5OGE2M2U1NDdhZThhZDllZGU2NzQ2NDM1MTAxZDA4NTVjZjVkMTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG93ZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb3dlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMjEwMjJlNjE0ODFlZDc1YjU1NTM3ODRlODBmNDhjZTJjNWE2OTY2ZmZkMGRhNzNlZGVkOTYyNjQ4OTUzMjc4NWUzN2VhOWE1NGIyNjcwYTliZTM3ZTRkZmMyMTc3YTlhNmIzMGU1NjdlNDMzZmNlZmZiMTUwNjcwZWZjNjJhYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1leHRlcm5hbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtZXh0ZXJuYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IjogewogICAgICAibmFtZSI6ICJAZW5kby9lbnYtb3B0aW9ucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjYTc2ZWQ3YzZiNjU2NzFmNzBiMjY0NmY2ODk0MzU3MjRkOGI5OTMwYTVmZjI5ZDFmYjMyN2VkOTZmZDQxNDQ2OTUyNTg5NjJkYWZiOTgyODYyYTJlZmMxYjAzZDBhZDk2YjMzYzJjYWU1YmViZmEzNzI2ODg2YTA2ZjY2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OWEzMjNjZWExOGYxOWQ3MGYyOWQ5NGU2NjdkMGMyNzU2ZDU2NmExZjg0NjliNWY2N2MxOGRiYzg1NzM0NDkxODVmNWJmNzhmYWIwNzg2ODNiMzQ5MWRhZWNkNmIzOGUwMDkyNmM1MmM3ZjQ1MGExNzAyNmVjOWE3YzliYjY5ZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vycm9ycyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJhYzkyYmMwYjkyMDc3ZmNhMDU3ZDA2MmNkNGY1OWJiODliZWI5MzBlODM1OTg2MzQ2YjYxYmUwMTA4MjI4MGUyODRmNWIxNDU2YmE4OGQwOTZmMjg2YjEwMWRhZDhhMmJkM2IyOGQ3MTlkNzdiOWIyZmQ2Y2ZkZmU1ZmQ5NjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQxNTVhYTNkNDE3ZDI4N2M5OWM5ODFkMjM3YjJkYWM0NzNlMTdmZmViYWUyZjNkYWEzMjk5MWJkNjEyNzVhZjBmYWZmMDc5MDdiMzA5ZDgzZDUwYjYzNTIzZmQ5MjcwOWE3YmZlOTFlODg5YmNiYzI3MWFlNWQ4ZTJjY2JlMWZmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sb2NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbG9jYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNTA3NzhmMWJlZmVjMDEwMmYwZmFjYjg3NTc3NDU5ZjgzYWJkNjZjNWQxZjkxNjA5YmI5YTMxYzM5MzQ4NGE2YTVjYzNhOTVlMTQyZTU2MjY0MWM2YWNjYTMxMjA3NjRiYTNjZmE2NTNiMjc5NmNlMzRlZDEwZjNiZWQ2NDlmZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmNmMjVjZmVhMWM0MzdiMzNhMTM0MjczMmNjODZjMThmMDM2MGE5YWRmOTY5YjViYzRjMTgyZmI3ZjM5NzQ5Zjk5NGM1NTEzOWU5ZTU2NTViZWJhOTdiNTQyZGMzNTMzNzUxZGEwNTg2OWUyMWVhMWUxZDA3YTgxMDA3MWViYTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjM2FkNzAwZDA2NTRlNmE0ZmYyNzdhZWMyNjExNTFjOTdiOTMwMDNmZDUwMjNjOGIzYTM2ZTUxZDhiOGM1OWVjZTJlOTVlMjQ1NDBhNDQ1OTNiYjY0NGY2YjEzZmFkMGZhNjRmNGI2MmQ2MDZiYzk5MDIyZDRmYzEzMjg5YjI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjMDAyZjE3NTczMmQ1NTRhNGYwNzY0YTFkMjUyOThjZmEwOTIzZTQxMWQ4OTI4NDI4OTBkZmM2NGIxOGExMzUyZWE4MmIxZDhlZTc5NmQ5Y2M4ODU1NDlmNDQ3Mzg4YzljYzNhNDlmY2UwNTdhNmIxMDkyNzM2NWM1MDRmMWUxIgogICAgICAgIH0sCiAgICAgICAgIi4vdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NjA3MTIzOGIyNWQzMDc2NmY0NDczYjM2MDc1ZGIwNTAwNGEzMDk1YjdiYTZhZGQwNDRkOTg2NjVjN2UwYzNjMzA5ZDA0ZDQzNThhYWQ4YjA1ZGQ4ZmNmMDBmN2RmMjk2MTU1YzVmODI5YjJmOGJmMzhkZGJlZmIxMGQ1ODM0OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ltcG9ydC1idW5kbGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vYmFzZTY0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMjM0MjQwZDFmNzc1MTZjZTAxNTQ3ZmEyYzQyZDc0YjA3NzU5NTVjOGVlNTU3NjRiNDEzYTAwZjU0NTgyYjZiZWQ2MjVkODRkNDUyNjE5NGM5MDY1NzBkOTQ0OTY3NzA0Yzc5OTM5YzkyMTJiNjg5YmMxMWI4ODZjYmUxMmIzMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZGVjMWMzMjA2Y2U4ODU4YTkxYWQxZWMwZDk4MzA5MTBhYTA2NTljYmJhNjZiZTdjMGZiODdjNTM4NzA3ZTBjZGJiYWMxMzdmYTY3NjIzMzhlMjBhNWYwODc1M2U5NTk4MzE0NDJkNmUwMjU2YWRhMWYwODdjODBkZDUwOTk0MiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MS42LjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NjM1MDMxMmYwZTJkYjZhNTAxMzdlNzJlOTY1ZGI4ZjZlMDI1YWMyYTNlOWMwOTEyYjJiMjcwN2MyZjUzYzAzZjlkN2JkNjM5NzgzMzY5M2QyZWU5MzMwYzUwNjI4ZWM4NDIxYzBjNzlkN2U2ODBjNGNmNWNmNjlhMDYyNDdjNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhN2M4OWU1ODQzZTEwMWVmOThkMDgxOWI1MWFlYzFjNDI0ZTFkMWViNGE0MjBlNDg0NDAyNjllMDc1OGVkMzlhOGM1NTdmNGZjOTM5NGI5MWY2MDU2MTNlNmE0NTk2YzU1MmMxODM4YmUxNGZkMzBiNWJkOGExNjk4ZTg1MTU1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI0ZmJmMWRlOWRiNDExMjRjZDE1NGUzNmY5MjgyNjllNWM2MTA1NjY1NzcyMjZmM2NjNDY2ODlmYTQ3ZGE5Y2I5ODU5MjM4NWZkMjg0YzcyNDZkZjY3OGI0ODFlZTA3OGYzOGEwNjE1MmJjMDQ1ZGNkZmJiMjI1MTJiZGU0MmFiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhiZDc0M2U2MzFmM2Y2ZDdkOGE4Zjc4NWE1MTZhNWMyZWJiZTcwZWJjNGY3OGNkYjJhYTcwOTNhNDYzYmM5N2M4NjZjNTc5NDg2ODE4ODZlMTllZTEwMGFmNjc2NjA1NjBhODE2MGZjMTBjMzJkNTcwNDVkYjQxNmNiMTBlMzZkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5YjIwZTUyMDU1ZmFjZDU3MTU2OTI4OThiODJiYTliZWVjOGU4ZjM3MzM1OTNkNWYxOTcxODlhOGNjYTEyY2M0OGE0ZDdkNGQ3ZTViZGY0NTNmNzM0NDRlNjI2ODRjZjVkMzlmMDVhNDBmMDQ2YjBmMzkwYWFiMTJlMjg0MzU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVkNGI1ZWNjYmI5YWZiYjZiYjJlNWZlNjEzMmM2OGQwMzQ0NGNiMDk0OTQ0ZGI3OTU3NTZlOGY0MjZmYjAyNDk1YWJhY2M5ZWYyMWQ2YTgxYTQ3NzAwZGNjZDAzNWI2MTQ0MTFmMDk1M2UzNmI1NzQ3NTkyYjUyNTUyZDIzNzhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YzQ3ODRhMzhhMzRkNTYxMzMxNmZjYzc2OGJkMzQzNTA5ZGIzODhhZWZhNTg0M2I2ZjA3MGQxMzhjNTI3OThjODBjMjYwZGZkN2E1NTZjOWVkNGNmZjNmNjgwNDUxOTNjM2RjMTM3YjM5YmRmNjYyZDFkMzQ0M2M0NWY1YzZjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3MDUyOTJjZjcxZWE3ZjkxZTY1YzFlOTBjMDA3NDA4YmEwMThlODVlYTBlZjJlNzRlM2Y5OGMyOWJkYTRjNjA5NGI4ZTRlYjM4ODc1MjhjNmE2YzE5ZmZkYzFmNGI4OWZjZDQxMjNlNzMwMzAxYmRmNmE0YjY3OTU1MGNlYjQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjUuMS4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9uYXQtdjUuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU3MzFjODI0YjFkOWI0MTc3ZmIzZmViNWExZWIwN2ExYzVkZjNjYTFlYTQ3NmExZTU1ODZlMTBjYjNmOTNjMTRkM2Q0MzZmOTE0ODk2MTkzMjkyMWVlZWYyM2ViZTMwZmI2YmIyMzMwNDRmYmVlYjc2YzZmOGUzMzU0YjllNmU1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1ODQzMTYzYTc0YjkyZGUxMDZjMjI5ZTAxZTdkYWI3M2VlYzExMTdlMzgxNThkYTg1MzYyYWY5Y2ExMGZkOGVjNmZmODU3ZjlhMzliNGUyYTM3YmE2YTZiMGQ5MmY3NjM1MzA1MmE1MGFlZWQ5YzUwMDZiNDYyZTZkNjRiY2IwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDM2YzIzOGMzMGE5ZmY4NjYzZmQyNmI1NzhiYjkzZWMyMGRkNjVhYWE3ZWNkYTRjYzI4MzU2Nzk0OTE0NjQ1ODkxZGY4Zjc5ZTFiMjMyMjZhODQ5YTA3ZDRhOWY1ZGRlMzUzOTk1MzQyNmE5ZWE0MWY2MzhiZTY4ZjIxNDdkYTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ1YmE5ZWVkMjFhYjYzZWEyZDA5ZmUyZTEyN2E0NjFjYzhhM2ViMTc4YmNmN2NmMTk1YTdmNGJhMjNhMDI1YzU4NjM3MjFjNjE5ZTQ0ZWY5NzU1MTgyM2ZhMzg4ZDI1ZjRjZDEwNTRjYjJhYzhhNjFhMGMxMWZjMzcyMWM2MGY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGI2MTQwYjdjZTkwOTJmODZmNWYyMTE5ZDg3MTcxMjUyNGUyYTRlZGMzMjBlMDk3MjkyZmNiOGExYjViZjc5OWE3ZDJkZjAyOTA3Y2VkZGVhMmEyZmMzMmZjMDBiNGU5MjgzOWNjYmI2NThiNzVlNDQwMzI5MTA1ZjgxYWM5YWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWJhZTJmMWY0MjYwMGJiOTcyOGVjMWQxZTdhY2U3ZTUzYTRmNjlkMzZkZTVhOGZjZmJjODUwZmM0ZmRhOGJlYjQ2MzdiYTYwYTVlYTBjNmNmYTBlZjVjYjlhMWQ4MjE2MWE3NzNkZDQ3ZTRkNGU3NjZjY2E2NTU4ODg4M2U5MjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYWVmZDllMjM3MDlmZDFjZWM4ZDZkZDFlZDBhYzEyNTI1OWFlM2E4YmNhYTJiOTE4YmIzNzNhNjllN2VmNzlhMzljZDZkOWNmNjY3NDM2Njc2NzQ5NGUzOTM4MzMyZDI3MDM3MTA0MmY4MjMyNGM4MzQ2YmU1ODU3MThkN2JjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZTg3NTRjMjk4OTNiZGY4OGFlZDI5YzI2ZmFjMDczYjUwYTJmMDEyZWE5YzZjNDBhNTI0MTQwY2ZmY2VhZWE0YjllMmJlNGQ0NjRlMjczYmZhODRjY2QyN2RjMzQ5NzdkYzc2NzJhNDNlZmEzM2IyYTIyODg0NTFhMWEwMjE5NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWQ1ZjJjOWQ4YzQxZjFiOGJhOTg3ZWI4NzRjMjYzNTA5YjIyZDkwYWZhM2EzZjNiYjg4MWRiOWYwZTgwYmE2YTNiMzkzYTkzMGViYjI5MWU2ZjQ3M2VlNTYwNTMwZmNjZWVmM2YzMWZkMzYwZmUzMTI1OTEyNWFlZmE0ODc4ZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWJmNGFmOGY2OWNmMWQ0OWY3YmFmOWNhNDQyNzM0Y2M3OWI5NzJiOTk3YmRlMWIwZjhjODcwNDlhOWViZDRiZGY0ZjE2MWJmNzRkN2Q3ZGFkMTg4MTBiOWVhZGQxODIwNjhmNjIwMmQzNDZhMGJlNTBmNWM2NDI3YzA5NzA3NDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGZjN2FmMmY2YTgxYWNlYWJmNTk5YjAxYjdiZjU2YWE2NzQ2NzQ5NGU4NTEyNTAxOWU1YjhiNTFkZmMwMWVmMGQ2NTk3OWY5MmY1ZTZiY2MzMGM1YTEyN2ExZWYxNjliOWNhOWU0ODcxODM3YmUxYjQ3MGIyODg2ZjdkYmU1Y2MiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNGZjY2YwNjY3NmEwZjU1NjdkNzE3MzViZGJiZjE5OTk0NjQ4NjRhNGYyNGFhZjVjZTY1ZjE3OWZiOWM3YzcxNjMxNDVlMjE1OTE3ZWIzYjMwMWE2Zjg0YWNjY2UwZDFkMTg2YzlmNjRjOThiNmIzZTdmY2E5ZDY1M2FjOWI4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc2MDk3MWVkZGVjOWU5MzZiMjEyNzQ5MmZiYzZhMmQ1MDAwZTRmNGE1OTAzZTNmMTI4NmFmZjM4ODIzYmU2NTcyNWRiMjJiMDE0OGMzYzM2MjhkZGJhZWI2MzdmM2U0NDk2OWY0M2FjYTM3YjAyZjJkZDVjOGQyM2I4Zjc0YTY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0cmluZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RyaW5nLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU1MzE1YTY0YmZkMzE4YWY5YjM1MGU0M2FhZGRlZjYxOGI5ZTA1MjMyMjdkZGI0MWRmM2IzNmJhNzA4NzYwMDQ1YjRjNGUxMmY4YmIwYzdlNTRhYzI0YmFkZDIxM2UwY2Y5ZDVjMDQzNmZkZDM4ZGJhNzBiNDg3MTYyYTI5MjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTAwMTQyODc0MTBiNzJjZjcwODhkMjY1ODQ2NjAxNzExNjcxM2Y0ZDE0MDdkY2E5NzE5ODkyNjk2NTY1ZDBhYmIxMmFmMTY0NTZlMjRkYTkxYzhhMjYyMGUwNThkMDZiOTBmOGI1MTA1ZTM1YzY5NzZiMDcwNDVmN2U1YzMxOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5MjdmMTFlYWVhNjE0YzE5MWY5OGM4ZDU3ZmM3MTQ5ZWY4ODM4MDMzN2JmZjQ5Y2FkOTM0YzdiM2ZmMWZhYjNhMDhiZTc0ZjY2ZmZlYTk1YWFhMmI5YzQ0M2IzZmUwNWNkN2Y5MDE3NWY4MzY3ZmViODc0NWJiYzI0MTg3MjczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYTZkY2EwM2E2OTRhYjdkYTg5OWNjY2FiMzhkNDdjMDYxODYwYjI2ZjFkNzI5MjlmMzBhZDY4NDE5MWY4MDc0M2Y4NTc3OGY0YWIwYTZjYjQ1ZDA5YzBlZWIzMGM0OThhYWIzOGE0OWM2NGU5NmFiYTRhNTQxODZkZDgyYzA4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZjQ2NTMzMDdmODA2ZjEzYjJhZGI1OTZiYjZlMjRjYWZlOGYwODM0NDJmOGI1MGIzMmEwZWNhYjFhZjhkZWU1MmI2YTliODNlNjRiYzJkNjZiZDVkZDQyM2RkZjA2YTEyMTQxZjlhYjhlNjRjYjI2MTQwNjRlZTY1MmQwNDAwNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2QzYTI1NjM2ZTU0Mjc4YjMzZjZjMzYyMTQ3ODg5ZTZmZjEwYmVkYTgwYzA3ZTZhMTZkMTkwNDdiN2IzYzZhMzRkNzMwZTliM2NmYzlmODUxMWI2ZTI3YjZhNjk3NzY0Zjk2ODNkNzBkZjcwODZlMDg1ZjkzZDdmOTVmYzRmZmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MmViMGMxYTI0OTY2ZDRhYmZmYTJjMThjMmZiMjhkZDUwNGRjYjNiNzIzZDgzMDBjMTBlOTQzOTQ0OTNjNTRlMTgwMjQ1MjdmZGU3MDFkN2VkNTkzYjI2NWU0NTZkMmQ0OGMxNWUwZDUwMTAxMDhlZmQxODcyYjc0YTI1MTRjZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0Yzg0ZDA3NmUwYTQxOWZjODYzN2FiMzhmMjQ0MzM4YzQ3NmM1MDEzMmNmZTA5MDAyZGRkY2JiZmNkMzY1YmY2Y2YzZDMyYjA5ZGEzMjUyNWY3NWI2MGY1ZmM2NjBkZGMwZTA4ZjM2YTYwN2JhMDc3ZjU5OWJjNTVmMjllY2IzNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3RyYW1wb2xpbmUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0ZWFiOWFmZjc5ZTMyZDc0ZmNlOWZiYmQ1OGJmOGRjZWZkMDU2NGRiYjRkYmNlZGE5ZWJhYWM1NWY2MWUxZTMxZGViNTE1YWNmYTZjYzQzNmM3NjE4NmJlY2E2ODM0ODgxY2ZhM2Y1MmE3YjhiZDc2YTY5YjNjZDkxNjJhMjI2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW1wb2xpbmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW1wb2xpbmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYmFlM2E2ZWFhYTkzNmU0YmFjYjc0YTlkZDM4ZWM1OGU4OTU3YTEyYTQwODk3NGUyMzM4MjJiZjYxNzEyZmY4MzYwMGY5OGRlOTI3YTRkM2M0NGY0ODNlMTZiNjA0ZjgxNzQ0MmUwMjdkMTdkYTk1YmYzNjY4ZTAwMzQ5NjQ5NiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vemlwLXYxLjAuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vemlwIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3ppcC12MS4wLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vemlwLXYxLjAuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmRmZGI3YWQ4NDNhNzE4ODhiNTZhZTZmZGMzMWQ0MjJlMjUxMzE4ZDY4OWE4MWJhNjZmYjNkNTM0MWQwMTgzMzg5YzVhZTg4ZDZlYjA2OGMxNDA0OGQ1NzQzNDkxNzc5ZDUzNDkwNzQxYWFkMjkxYjlkZmNhMGJmYmJhNjgyODEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXJlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXJlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllZjk1NGVhYzIwYzVlMTljMmY2ZDE4MzNjMmI1M2JkM2MzZmMxMDA0MDA4N2U3YmM3ZDY0YTJiM2ZjNTkzMzVjNjJkZWMxZGQ4YzBjY2RiMDI1ZWZkYmFjOTFiMzQ3ZTQzZjJiMzI0ZTNkOTE1NmU2N2JhZWQxN2ExNDNkZjMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J1ZmZlci13cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J1ZmZlci13cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZTc5NjhhYzZlYjg1YTVmMDVjOGM2ZTRkNjJmZjY0YTY4YWM5NDQ1MjkyN2QzY2FkZWJkYTE3ZDAzYTk1MWZmMTkzN2EyZjU3NDNiMTVlNjlhNDU1NDM5ODJlMTdjOWE4MWJmMzRjM2NhZTI2MzUzY2MxY2JiZjQzMTI1NzcyYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wcmVzc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcHJlc3Npb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZjZlMjM5ZTY0YWU2ZDk2M2IyMDhjODllZjc5ZWNjYWM4YzVhNjYzMzQ4N2NiZjY1ODNkNmY2NDdmYTlmM2VhNDVlNTlhZjRkODRjZmU4ZWFlNzliZDdkMTIyY2JjMmMyNzA4ZTYyOTAyNjc5MTI2YmYyMjFlYjZkZWRmZWU3NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jcmMzMi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY3JjMzIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3OWI3NDE3ZGE4ZGU2YTYzMTgyMDJhZTYzZGVjZDI5ZTYwMjNjOWY1ZmZlMTdkMWYyZmUxYTA2MGZlZDlmYzE4OGViMDljYTdmNWRlMDk1OGE3MzFmNGE0MmM4Njk2M2ZhODkxZTJhNmE2YTQyZDJlNzA2MWRlMjg0NmM1ZGRiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjU1MWQ1OWZhN2FkOTRjMjRhZjljMTBkZDRkMzYxMzNiNjUzNWNhYzIyYjI3Y2I5YmJiMjYxN2FhOWUwMmU5ZTdmZjhhMTkyODcxMmVhODM3OWMzMjhkMjc5OWJkOTA0ZTJjMGRmOWM5YzVhMmY1MjlkZjk2OGQ1NTVjZDhiMzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZm9ybWF0LXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZm9ybWF0LXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUzNzQ4M2MwODgxNjlkZTlhY2RkZDlhZjEwZjViYzRiZTBiMzU4YjRjZDg0M2VjNzE3OWFiYzMwMDJhZDBhMmQ4OTQ2OGZlZjliNTNhMzg3YjA3ZTE1ZjViZDg0MzAxMmRiZGY4M2YwOWNjOWNkY2EwNTlkYTVjMDkyNTUzYWY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDg3MDM0Yjg3ZjRlYzNlMjkzZTIxMjgzNjAwNGFiNWM5NTkwZTg2YTI1ZGMyZDc2ZWM4MWVjNzI5YzUwYzlkYTUyODQxMDY1ZmNhNDM0MzRjMWJkMDc5MjZkZDQ3NDIwMDNmNWUzODYwYTU3ZDM0NmVlMTdiZmRiZjhkNzdhZWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2lnbmF0dXJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zaWduYXR1cmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZGFlZDBmNGFiMWIxNWM5ODE2NGIxNGZkYTM1YTJmOTcwNjQ3Zjc1M2UwMTlmNzEwYmY1ZGRlOTVmZTQ0OTNiM2ZmMTExOWNmMWRmNDQ1MzdkYzE1NDNkZDdiNDJlNjcwYjRhMDVhMzVhYjBmNTI4ZGM2NjA0YzFmMWQzYjg4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0MTA5MjlmZWFkZDYwYTZhYjIyNTUxZWQ0OWIwN2VlZjNmNjA3NDhlODYyMTBlMDA1NTU1MWRiNDlhYWUyNzViODI3Mjc0MTUxZjliOGQ4NjFiZTY5NDZmYmNkMjc5ZWJhMDVlYjIwZWQyM2MxNjhjYTY2ZGY5OTVlYjBlZDNlIgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAH1sUNdkEAADZBAAALwAAAEBhZ29yaWMvc3Bhd25lci12MC42LjktdTIxLjAvc3JjL3ZhdC1zcGF3bmVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ltcG9ydC1idW5kbGUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYnVpbGRSb290T2JqZWN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaW1wb3J0QnVuZGxlLEZhcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ltcG9ydC1idW5kbGVcIiwgW1tcImltcG9ydEJ1bmRsZVwiLFskaM2PX2EgPT4gKGltcG9ydEJ1bmRsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGJ1aWxkUm9vdE9iamVjdCwnbmFtZScse3ZhbHVlOlwiYnVpbGRSb290T2JqZWN0XCJ9KTskaM2PX29uY2UuYnVpbGRSb290T2JqZWN0KGJ1aWxkUm9vdE9iamVjdCk7XG5cblxuXG5cbmNvbnN0IGVuZG93bWVudHMgPSB7XG4gIFZhdERhdGEsXG4gIGNvbnNvbGUsXG4gIC8vXG4gIGFzc2VydDogZ2xvYmFsVGhpcy5hc3NlcnQsXG4gIEJhc2U2NDogZ2xvYmFsVGhpcy5CYXNlNjQsIC8vXG4gIFVSTDogZ2xvYmFsVGhpcy5VUkwgIC8vXG59O1xuXG4gICAgICAgZnVuY3Rpb24gYnVpbGRSb290T2JqZWN0KCkge1xuICByZXR1cm4gRmFyKCdyb290Jywge1xuICAgIGFzeW5jIGxvYWRCdW5kbGUoYnVuZGxlKSB7XG4gICAgICBjb25zdCBucyA9IGF3YWl0IGltcG9ydEJ1bmRsZShidW5kbGUsIHsgZW5kb3dtZW50cyB9KTtcbiAgICAgIGNvbnN0IHN0YXJ0Rm4gPSBucy5kZWZhdWx0O1xuICAgICAgcmV0dXJuIEZhcignc3Bhd25lZCBidW5kbGUnLCB7XG4gICAgICAgIGFzeW5jIHN0YXJ0KGFyZ3NQKSB7XG4gICAgICAgICAgY29uc3QgYXJncyA9IGF3YWl0IGFyZ3NQO1xuICAgICAgICAgIHJldHVybiBzdGFydEZuKGFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJidWlsZFJvb3RPYmplY3QiOlsiYnVpbGRSb290T2JqZWN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADjUnGd1AgAAdQIAABsAAABAZW5kby9iYXNlNjQtdjEuMC45L2F0b2IuanN7ImltcG9ydHMiOlsiLi9kZWNvZGUuanMiXSwiZXhwb3J0cyI6WyJhdG9iIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZGVjb2RlQmFzZTY0OyRozY9faW1wb3J0cyhbW1wiLi9kZWNvZGUuanNcIiwgW1tcImRlY29kZUJhc2U2NFwiLFskaM2PX2EgPT4gKGRlY29kZUJhc2U2NCA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXRvYiA9IGVuY29kZWREYXRhID0+IHtcbiAgY29uc3QgYnVmID0gZGVjb2RlQmFzZTY0KGVuY29kZWREYXRhKTtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnVmKTtcbn07JGjNj19vbmNlLmF0b2IoYXRvYik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhdG9iIjpbImF0b2IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAksKTjzQDAAA0AwAAGwAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvYnRvYS5qc3siaW1wb3J0cyI6WyIuL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbImJ0b2EiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBlbmNvZGVCYXNlNjQ7JGjNj19pbXBvcnRzKFtbXCIuL2VuY29kZS5qc1wiLCBbW1wiZW5jb2RlQmFzZTY0XCIsWyRozY9fYSA9PiAoZW5jb2RlQmFzZTY0ID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBidG9hID0gc3RyaW5nVG9FbmNvZGUgPT4ge1xuICBjb25zdCBieXRlcyA9IHN0cmluZ1RvRW5jb2RlLnNwbGl0KCcnKS5tYXAoY2hhciA9PiB7XG4gICAgY29uc3QgYiA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICBpZiAoYiA+IDB4ZmYpIHtcbiAgICAgIHRocm93IEVycm9yKGBidG9hOiBjaGFyYWN0ZXIgb3V0IG9mIHJhbmdlOiAke2NoYXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiBiO1xuICB9KTtcbiAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuICByZXR1cm4gZW5jb2RlQmFzZTY0KGJ1Zik7XG59OyRozY9fb25jZS5idG9hKGJ0b2EpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYnRvYSI6WyJidG9hIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAR7dn+5AQAAuQEAAB0AAABAZW5kby9iYXNlNjQtdjEuMC45L2RlY29kZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWNvZGUuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9kZWNvZGUuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9kZWNvZGUuanMiOltbImRlY29kZUJhc2U2NCIsImRlY29kZUJhc2U2NCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoValSLkBAAC5AQAAHQAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZS5qcyI6W1siZW5jb2RlQmFzZTY0IiwiZW5jb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAa++pXpAIAAKQCAAAcAAAAQGVuZG8vYmFzZTY0LXYxLjAuOS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGUuanMiLCIuL3NyYy9kZWNvZGUuanMiLCIuL2J0b2EuanMiLCIuL2F0b2IuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGUuanNcIiwgW11dLFtcIi4vc3JjL2RlY29kZS5qc1wiLCBbXV0sW1wiLi9idG9hLmpzXCIsIFtdXSxbXCIuL2F0b2IuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGUuanMiOltbImVuY29kZUJhc2U2NCIsImVuY29kZUJhc2U2NCJdXSwiLi9zcmMvZGVjb2RlLmpzIjpbWyJkZWNvZGVCYXNlNjQiLCJkZWNvZGVCYXNlNjQiXV0sIi4vYnRvYS5qcyI6W1siYnRvYSIsImJ0b2EiXV0sIi4vYXRvYi5qcyI6W1siYXRvYiIsImF0b2IiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB+XnPU3AwAANwMAACEAAABAZW5kby9iYXNlNjQtdjEuMC45L3NyYy9jb21tb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFscGhhYmV0NjQiLCJtb25vZHU2NCIsInBhZGRpbmciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuICAgICAgIGNvbnN0IHBhZGRpbmcgPSAnPSc7JGjNj19vbmNlLnBhZGRpbmcocGFkZGluZyk7XG5cbiAgICAgICBjb25zdCBhbHBoYWJldDY0ID1cbiAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hbHBoYWJldDY0KGFscGhhYmV0NjQpO1xuICAgICAgIGNvbnN0IG1vbm9kdTY0ID0ge307JGjNj19vbmNlLm1vbm9kdTY0KG1vbm9kdTY0KTtcbmZvciAobGV0IGkgPSAwOyBpIDwgYWxwaGFiZXQ2NC5sZW5ndGg7IGkgKz0gMSkge1xuICBjb25zdCBjID0gYWxwaGFiZXQ2NFtpXTtcbiAgbW9ub2R1NjRbY10gPSBpO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFkZGluZyI6WyJwYWRkaW5nIl0sImFscGhhYmV0NjQiOlsiYWxwaGFiZXQ2NCJdLCJtb25vZHU2NCI6WyJtb25vZHU2NCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADywE7BkggAAJIIAAAhAAAAQGVuZG8vYmFzZTY0LXYxLjAuOS9zcmMvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vY29tbW9uLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlQmFzZTY0IiwianNEZWNvZGVCYXNlNjQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtb25vZHU2NCxwYWRkaW5nOyRozY9faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcIm1vbm9kdTY0XCIsWyRozY9fYSA9PiAobW9ub2R1NjQgPSAkaM2PX2EpXV0sW1wicGFkZGluZ1wiLFskaM2PX2EgPT4gKHBhZGRpbmcgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBqc0RlY29kZUJhc2U2NCA9IChzdHJpbmcsIG5hbWUgPSAnPHVua25vd24+JykgPT4ge1xuICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKChzdHJpbmcubGVuZ3RoICogNCkgLyAzKSk7XG4gIGxldCByZWdpc3RlciA9IDA7XG4gIGxldCBxdWFudHVtID0gMDtcbiAgbGV0IGkgPSAwOyAvL1xuICBsZXQgaiA9IDA7IC8vXG5cbiAgd2hpbGUgKGkgPCBzdHJpbmcubGVuZ3RoICYmIHN0cmluZ1tpXSAhPT0gcGFkZGluZykge1xuICAgIGNvbnN0IG51bWJlciA9IG1vbm9kdTY0W3N0cmluZ1tpXV07XG4gICAgaWYgKG51bWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBiYXNlNjQgY2hhcmFjdGVyICR7c3RyaW5nW2ldfSBpbiBzdHJpbmcgJHtuYW1lfWApO1xuICAgIH1cbiAgICByZWdpc3RlciA9IChyZWdpc3RlciA8PCA2KSB8IG51bWJlcjtcbiAgICBxdWFudHVtICs9IDY7XG4gICAgaWYgKHF1YW50dW0gPj0gOCkge1xuICAgICAgcXVhbnR1bSAtPSA4O1xuICAgICAgZGF0YVtqXSA9IHJlZ2lzdGVyID4+PiBxdWFudHVtO1xuICAgICAgaiArPSAxO1xuICAgICAgcmVnaXN0ZXIgJj0gKDEgPDwgcXVhbnR1bSkgLSAxO1xuICAgIH1cbiAgICBpICs9IDE7XG4gIH1cblxuICB3aGlsZSAocXVhbnR1bSA+IDApIHtcbiAgICBpZiAoaSA9PT0gc3RyaW5nLmxlbmd0aCB8fCBzdHJpbmdbaV0gIT09IHBhZGRpbmcpIHtcbiAgICAgIHRocm93IEVycm9yKGBNaXNzaW5nIHBhZGRpbmcgYXQgb2Zmc2V0ICR7aX0gb2Ygc3RyaW5nICR7bmFtZX1gKTtcbiAgICB9XG4gICAgLy9cbiAgICAvL1xuICAgIGkgKz0gMTtcbiAgICBxdWFudHVtIC09IDI7XG4gIH1cblxuICBpZiAoaSA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBCYXNlNjQgc3RyaW5nIGhhcyB0cmFpbGluZyBnYXJiYWdlICR7c3RyaW5nLnN1YnN0cihcbiAgICAgICAgaSxcbiAgICAgICl9IGluIHN0cmluZyAke25hbWV9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgaik7XG59O1xuXG4vL1xuLy9cbiRozY9fb25jZS5qc0RlY29kZUJhc2U2NChqc0RlY29kZUJhc2U2NCk7Y29uc3QgYWRhcHREZWNvZGVyPVxuICBuYXRpdmVEZWNvZGVCYXNlNjQgPT5cbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBjb25zdCBkZWNvZGVkID0gbmF0aXZlRGVjb2RlQmFzZTY0KC4uLmFyZ3MpO1xuICAgIGlmIChkZWNvZGVkIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWNvZGVkKTtcbiAgfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgZGVjb2RlQmFzZTY0ID1cbiAgZ2xvYmFsVGhpcy5CYXNlNjQgIT09IHVuZGVmaW5lZFxuICAgID8gYWRhcHREZWNvZGVyKGdsb2JhbFRoaXMuQmFzZTY0LmRlY29kZSlcbiAgICA6IGpzRGVjb2RlQmFzZTY0OyRozY9fb25jZS5kZWNvZGVCYXNlNjQoZGVjb2RlQmFzZTY0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImpzRGVjb2RlQmFzZTY0IjpbImpzRGVjb2RlQmFzZTY0Il0sImRlY29kZUJhc2U2NCI6WyJkZWNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjxNDN2sHAABrBwAAIQAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvc3JjL2VuY29kZS5qc3siaW1wb3J0cyI6WyIuL2NvbW1vbi5qcyJdLCJleHBvcnRzIjpbImVuY29kZUJhc2U2NCIsImpzRW5jb2RlQmFzZTY0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYWxwaGFiZXQ2NCxwYWRkaW5nOyRozY9faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcImFscGhhYmV0NjRcIixbJGjNj19hID0+IChhbHBoYWJldDY0ID0gJGjNj19hKV1dLFtcInBhZGRpbmdcIixbJGjNj19hID0+IChwYWRkaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBqc0VuY29kZUJhc2U2NCA9IGRhdGEgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICBsZXQgc3RyaW5nID0gJyc7XG4gIGxldCByZWdpc3RlciA9IDA7XG4gIGxldCBxdWFudHVtID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBiID0gZGF0YVtpXTtcbiAgICByZWdpc3RlciA9IChyZWdpc3RlciA8PCA4KSB8IGI7XG4gICAgcXVhbnR1bSArPSA4O1xuICAgIGlmIChxdWFudHVtID09PSAyNCkge1xuICAgICAgc3RyaW5nICs9XG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxOCkgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxMikgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiA2KSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDApICYgMHgzZl07XG4gICAgICByZWdpc3RlciA9IDA7XG4gICAgICBxdWFudHVtID0gMDtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHF1YW50dW0pIHtcbiAgICBjYXNlIDA6XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6XG4gICAgICBzdHJpbmcgKz1cbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDIpICYgMHgzZl0gK1xuICAgICAgICBhbHBoYWJldDY0WyhyZWdpc3RlciA8PCA0KSAmIDB4M2ZdICtcbiAgICAgICAgcGFkZGluZyArXG4gICAgICAgIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE2OlxuICAgICAgc3RyaW5nICs9XG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxMCkgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiA0KSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPDwgMikgJiAweDNmXSArXG4gICAgICAgIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgRXJyb3IoYGludGVybmFsOiBiYWQgcXVhbnR1bSAke3F1YW50dW19YCk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5qc0VuY29kZUJhc2U2NChqc0VuY29kZUJhc2U2NCk7XG4gICAgICAgY29uc3QgZW5jb2RlQmFzZTY0ID1cbiAgZ2xvYmFsVGhpcy5CYXNlNjQgIT09IHVuZGVmaW5lZCA/IGdsb2JhbFRoaXMuQmFzZTY0LmVuY29kZSA6IGpzRW5jb2RlQmFzZTY0OyRozY9fb25jZS5lbmNvZGVCYXNlNjQoZW5jb2RlQmFzZTY0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImpzRW5jb2RlQmFzZTY0IjpbImpzRW5jb2RlQmFzZTY0Il0sImVuY29kZUJhc2U2NCI6WyJlbmNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAf1UUszQDAAA0AwAAIgAAAEBlbmRvL2NvbW1vbi12MS4yLjEwL29iamVjdC1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtjb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG9iamVjdE1hcCA9IChvcmlnaW5hbCwgbWFwRm4pID0+IHtcbiAgY29uc3QgZW50cyA9IGVudHJpZXMob3JpZ2luYWwpO1xuICBjb25zdCBtYXBFbnRzID0gZW50cy5tYXAoXG4gICAgKFtrLCB2XSkgPT4gLyogICAgICAgICAgICAgICAgICAgICAgICovIChbaywgbWFwRm4odiwgayldKSxcbiAgKTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKSk7XG59OyRozY9fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC3BWtwfQIAAH0CAAAxAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9pbXBvcnQtYXJjaGl2ZS5qc3siaW1wb3J0cyI6WyIuL3NyYy90eXBlcy1leHRlcm5hbC5qcyIsIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIl0sImV4cG9ydHMiOlsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMtZXh0ZXJuYWwuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtZXh0ZXJuYWwuanNcIiwgW11dLFtcIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanMiOltbInBhcnNlQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLFsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLFsiaW1wb3J0QXJjaGl2ZSIsImltcG9ydEFyY2hpdmUiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACjFBe6MLQAAjC0AADYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9jb21wYXJ0bWVudC1tYXAuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiLCJwYXRoQ29tcGFyZSIsInN0cmluZ0NvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRQYWNrYWdlUG9saWN5OyRozY9faW1wb3J0cyhbW1wiLi9wb2xpY3ktZm9ybWF0LmpzXCIsIFtbXCJhc3NlcnRQYWNrYWdlUG9saWN5XCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFja2FnZVBvbGljeSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbiAgICAgICBjb25zdCBzdHJpbmdDb21wYXJlID0gKGEsIGIpID0+IChhID09PSBiID8gMCA6IGEgPCBiID8gLTEgOiAxKTtcblxuLypcblxuXG4gKi8kaM2PX29uY2Uuc3RyaW5nQ29tcGFyZShzdHJpbmdDb21wYXJlKTtcbmNvbnN0IGN1bXVsYXRpdmVMZW5ndGggPSAobGVuZ3RoLCB0ZXJtKSA9PiB7XG4gIHJldHVybiBsZW5ndGggKyB0ZXJtLmxlbmd0aDtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgcGF0aENvbXBhcmUgPSAoYSwgYikgPT4ge1xuICAvL1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIC8vXG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAgfVxuICAvL1xuICBjb25zdCBhU3VtID0gYS5yZWR1Y2UoY3VtdWxhdGl2ZUxlbmd0aCwgMCk7XG4gIGNvbnN0IGJTdW0gPSBiLnJlZHVjZShjdW11bGF0aXZlTGVuZ3RoLCAwKTtcbiAgaWYgKGFTdW0gIT09IGJTdW0pIHtcbiAgICByZXR1cm4gYVN1bSAtIGJTdW07XG4gIH1cbiAgLy9cbiAgYXNzZXJ0KGEubGVuZ3RoID09PSBiLmxlbmd0aCk7IC8vXG4gIC8vXG4gIC8vXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGNvbXBhcmlzb24gPSBzdHJpbmdDb21wYXJlKGFbaV0sIGJbaV0pO1xuICAgIGlmIChjb21wYXJpc29uICE9PSAwKSB7XG4gICAgICByZXR1cm4gY29tcGFyaXNvbjtcbiAgICB9XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgcmV0dXJuIDA7XG59O1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5wYXRoQ29tcGFyZShwYXRoQ29tcGFyZSk7XG5mdW5jdGlvbiogZW51bWVyYXRlKGl0ZXJhYmxlKSB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICB5aWVsZCBbaW5kZXgsIHZhbHVlXTtcbiAgICBpbmRleCArPSAxO1xuICB9XG59XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRFbXB0eU9iamVjdCA9IChvYmplY3QsIG1lc3NhZ2UpID0+IHtcbiAgYXNzZXJ0KE9iamVjdC5rZXlzKG9iamVjdCkubGVuZ3RoID09PSAwLCBtZXNzYWdlKTtcbn07XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMsIHVybCkgPT4ge1xuICBpZiAoY29uZGl0aW9ucyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGFzc2VydChcbiAgICBBcnJheS5pc0FycmF5KGNvbmRpdGlvbnMpLFxuICAgIGBjb25kaXRpb25zIG11c3QgYmUgYW4gYXJyYXksIGdvdCAke2NvbmRpdGlvbnN9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGZvciAoY29uc3QgW2luZGV4LCB2YWx1ZV0gb2YgZW51bWVyYXRlKGNvbmRpdGlvbnMpKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgY29uZGl0aW9uc1ske2luZGV4fV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRNb2R1bGUgPSAoYWxsZWdlZE1vZHVsZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHsgY29tcGFydG1lbnQsIG1vZHVsZSwgcmV0YWluZWQsIC4uLmV4dHJhIH0gPSBhbGxlZ2VkTW9kdWxlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoe1xuICAgICAgZXh0cmEsXG4gICAgICBjb21wYXJ0bWVudCxcbiAgICB9KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBjb21wYXJ0bWVudCxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGNvbXBhcnRtZW50KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBtb2R1bGUsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ubW9kdWxlIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EobW9kdWxlKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgaWYgKHJldGFpbmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgcmV0YWluZWQsXG4gICAgICAnYm9vbGVhbicsXG4gICAgICBgJHtwYXRofS5yZXRhaW5lZCBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7cShyZXRhaW5lZCl9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0RmlsZU1vZHVsZSA9IChhbGxlZ2VkTW9kdWxlLCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3QgeyBsb2NhdGlvbiwgcGFyc2VyLCBzaGE1MTIsIC4uLmV4dHJhIH0gPSBhbGxlZ2VkTW9kdWxlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBsb2NhdGlvbixcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5sb2NhdGlvbiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGxvY2F0aW9uKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBwYXJzZXIsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ucGFyc2VyIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EocGFyc2VyKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBpZiAoc2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgc2hhNTEyLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5zaGE1MTIgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShzaGE1MTIpfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydEV4aXRNb2R1bGUgPSAoYWxsZWdlZE1vZHVsZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHsgZXhpdCwgLi4uZXh0cmEgfSA9IGFsbGVnZWRNb2R1bGU7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGV4aXQsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0uZXhpdCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGV4aXQpfSBpbiAke3EodXJsKX1gLFxuICApO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlID0gKGFsbGVnZWRNb2R1bGUsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCBtb2R1bGVEZXNjcmlwdG9yID0gT2JqZWN0KGFsbGVnZWRNb2R1bGUpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZE1vZHVsZSA9PT0gbW9kdWxlRGVzY3JpcHRvciAmJiAhQXJyYXkuaXNBcnJheShtb2R1bGVEZXNjcmlwdG9yKSxcbiAgICBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZE1vZHVsZX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBjb25zdCB7IGNvbXBhcnRtZW50LCBtb2R1bGUsIGxvY2F0aW9uLCBwYXJzZXIsIGV4aXQsIGRlZmVycmVkRXJyb3IgfSA9XG4gICAgbW9kdWxlRGVzY3JpcHRvcjtcbiAgaWYgKGNvbXBhcnRtZW50ICE9PSB1bmRlZmluZWQgfHwgbW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRDb21wYXJ0bWVudE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLCBwYXRoLCB1cmwpO1xuICB9IGVsc2UgaWYgKGxvY2F0aW9uICE9PSB1bmRlZmluZWQgfHwgcGFyc2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRGaWxlTW9kdWxlKG1vZHVsZURlc2NyaXB0b3IsIHBhdGgsIHVybCk7XG4gIH0gZWxzZSBpZiAoZXhpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0RXhpdE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLCBwYXRoLCB1cmwpO1xuICB9IGVsc2UgaWYgKGRlZmVycmVkRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBkZWZlcnJlZEVycm9yLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5kZWZlcnJlZEVycm9yIG11c3QgYmUgYSBzdHJpbmcgY29udGFpaW5nIGFuIGVycm9yIG1lc3NhZ2VgLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBgJHtwYXRofSBpcyBub3QgYSB2YWxpZCBtb2R1bGUgZGVzY3JpcHRvciwgZ290ICR7cShhbGxlZ2VkTW9kdWxlKX0gaW4gJHtxKFxuICAgICAgICB1cmwsXG4gICAgICApfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlcyA9IChhbGxlZ2VkTW9kdWxlcywgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IG1vZHVsZXMgPSBPYmplY3QoYWxsZWdlZE1vZHVsZXMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZE1vZHVsZXMgPT09IG1vZHVsZXMgfHwgIUFycmF5LmlzQXJyYXkobW9kdWxlcyksXG4gICAgYG1vZHVsZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZE1vZHVsZXMpfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSkge1xuICAgIGFzc2VydE1vZHVsZSh2YWx1ZSwgYCR7cGF0aH0ubW9kdWxlc1ske3Eoa2V5KX1dYCwgdXJsKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0UGFyc2VycyA9IChhbGxlZ2VkUGFyc2VycywgcGF0aCwgdXJsKSA9PiB7XG4gIGlmIChhbGxlZ2VkUGFyc2VycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBhcnNlcnMgPSBPYmplY3QoYWxsZWdlZFBhcnNlcnMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZFBhcnNlcnMgPT09IHBhcnNlcnMgJiYgIUFycmF5LmlzQXJyYXkocGFyc2VycyksXG4gICAgYCR7cGF0aH0ucGFyc2VycyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFBhcnNlcnN9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VycykpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAga2V5LFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgYWxsIGtleXMgb2YgJHtwYXRofS5wYXJzZXJzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5wYXJzZXJzWyR7cShrZXkpfV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGUgPSAoYWxsZWdlZFNjb3BlLCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3Qgc2NvcGUgPSBPYmplY3QoYWxsZWdlZFNjb3BlKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRTY29wZSA9PT0gc2NvcGUgJiYgIUFycmF5LmlzQXJyYXkoc2NvcGUpLFxuICAgIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkU2NvcGV9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgY29uc3QgeyBjb21wYXJ0bWVudCwgLi4uZXh0cmEgfSA9IHNjb3BlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBhc3NlcnQudHlwZW9mKFxuICAgIGNvbXBhcnRtZW50LFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LmNvbXBhcnRtZW50IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoY29tcGFydG1lbnQpfSBpbiAke3EodXJsKX1gLFxuICApO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGVzID0gKGFsbGVnZWRTY29wZXMsIHBhdGgsIHVybCkgPT4ge1xuICBpZiAoYWxsZWdlZFNjb3BlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNjb3BlcyA9IE9iamVjdChhbGxlZ2VkU2NvcGVzKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRTY29wZXMgPT09IHNjb3BlcyAmJiAhQXJyYXkuaXNBcnJheShzY29wZXMpLFxuICAgIGAke3BhdGh9LnNjb3BlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkU2NvcGVzKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY29wZXMpKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIGtleSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYGFsbCBrZXlzIG9mICR7cGF0aH0uc2NvcGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0U2NvcGUodmFsdWUsIGAke3BhdGh9LnNjb3Blc1ske3Eoa2V5KX1dYCwgdXJsKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0VHlwZXMgPSAoYWxsZWdlZFR5cGVzLCBwYXRoLCB1cmwpID0+IHtcbiAgaWYgKGFsbGVnZWRUeXBlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHR5cGVzID0gT2JqZWN0KGFsbGVnZWRUeXBlcyk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkVHlwZXMgPT09IHR5cGVzICYmICFBcnJheS5pc0FycmF5KHR5cGVzKSxcbiAgICBgJHtwYXRofS50eXBlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFR5cGVzfSBpbiAke3EodXJsKX1gLFxuICApO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHR5cGVzKSkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBrZXksXG4gICAgICAnc3RyaW5nJyxcbiAgICAgIGBhbGwga2V5cyBvZiAke3BhdGh9LnR5cGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS50eXBlc1ske3Eoa2V5KX1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgYXNzZXJ0UG9saWN5ID0gKFxuICBhbGxlZ2VkUG9saWN5LFxuICBwYXRoLFxuICB1cmwgPSAnPHVua25vd24tY29tcGFydG1lbnQtbWFwLmpzb24+JyxcbikgPT4ge1xuICBhc3NlcnRQYWNrYWdlUG9saWN5KGFsbGVnZWRQb2xpY3ksIGAke3BhdGh9LnBvbGljeWAsIHVybCk7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudCA9IChhbGxlZ2VkQ29tcGFydG1lbnQsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCBjb21wYXJ0bWVudCA9IE9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnQpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZENvbXBhcnRtZW50ID09PSBjb21wYXJ0bWVudCAmJiAhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudCksXG4gICAgYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRDb21wYXJ0bWVudH0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBjb25zdCB7XG4gICAgbG9jYXRpb24sXG4gICAgbmFtZSxcbiAgICBsYWJlbCxcbiAgICBwYXJzZXJzLFxuICAgIHR5cGVzLFxuICAgIHNjb3BlcyxcbiAgICBtb2R1bGVzLFxuICAgIHBvbGljeSxcbiAgICAuLi5leHRyYVxuICB9ID0gY29tcGFydG1lbnQ7XG5cbiAgYXNzZXJ0RW1wdHlPYmplY3QoXG4gICAgZXh0cmEsXG4gICAgYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBsb2NhdGlvbixcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5sb2NhdGlvbiBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobG9jYXRpb24pfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbmFtZSxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5uYW1lIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShuYW1lKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGxhYmVsLFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LmxhYmVsIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShsYWJlbCl9YCxcbiAgKTtcblxuICBhc3NlcnRNb2R1bGVzKG1vZHVsZXMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFBhcnNlcnMocGFyc2VycywgcGF0aCwgdXJsKTtcbiAgYXNzZXJ0U2NvcGVzKHNjb3BlcywgcGF0aCwgdXJsKTtcbiAgYXNzZXJ0VHlwZXModHlwZXMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFBvbGljeShwb2xpY3ksIHBhdGgsIHVybCk7XG59O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRzID0gKGFsbGVnZWRDb21wYXJ0bWVudHMsIHVybCkgPT4ge1xuICBjb25zdCBjb21wYXJ0bWVudHMgPSBPYmplY3QoYWxsZWdlZENvbXBhcnRtZW50cyk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkQ29tcGFydG1lbnRzID09PSBjb21wYXJ0bWVudHMgfHwgIUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnRzKSxcbiAgICBgY29tcGFydG1lbnRzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRDb21wYXJ0bWVudHMpfSBpbiAke3EoXG4gICAgICB1cmwsXG4gICAgKX1gLFxuICApO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb21wYXJ0bWVudHMpKSB7XG4gICAgYXNzZXJ0Q29tcGFydG1lbnQodmFsdWUsIGBjb21wYXJ0bWVudHNbJHtxKGtleSl9XWAsIHVybCk7XG4gIH1cbn07XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRFbnRyeSA9IChhbGxlZ2VkRW50cnksIHVybCkgPT4ge1xuICBjb25zdCBlbnRyeSA9IE9iamVjdChhbGxlZ2VkRW50cnkpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZEVudHJ5ID09PSBlbnRyeSAmJiAhQXJyYXkuaXNBcnJheShlbnRyeSksXG4gICAgYFwiZW50cnlcIiBtdXN0IGJlIGFuIG9iamVjdCBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke2FsbGVnZWRFbnRyeX0gaW4gJHtxKFxuICAgICAgdXJsLFxuICAgICl9YCxcbiAgKTtcbiAgY29uc3QgeyBjb21wYXJ0bWVudCwgbW9kdWxlLCAuLi5leHRyYSB9ID0gZW50cnk7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGBcImVudHJ5XCIgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGNvbXBhcnRtZW50LFxuICAgICdzdHJpbmcnLFxuICAgIGBlbnRyeS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7Y29tcGFydG1lbnR9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbW9kdWxlLFxuICAgICdzdHJpbmcnLFxuICAgIGBlbnRyeS5tb2R1bGUgbXVzdCBiZSBhIHN0cmluZyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke21vZHVsZX0gaW4gJHtxKFxuICAgICAgdXJsLFxuICAgICl9YCxcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cblxuICAgICAgIGNvbnN0IGFzc2VydENvbXBhcnRtZW50TWFwID0gKFxuICBhbGxlZ2VkQ29tcGFydG1lbnRNYXAsXG4gIHVybCA9ICc8dW5rbm93bi1jb21wYXJ0bWVudC1tYXAuanNvbj4nLFxuKSA9PiB7XG4gIGNvbnN0IGNvbXBhcnRtZW50TWFwID0gT2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudE1hcCk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkQ29tcGFydG1lbnRNYXAgPT09IGNvbXBhcnRtZW50TWFwICYmICFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50TWFwKSxcbiAgICBgQ29tcGFydG1lbnQgbWFwIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnRNYXB9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG4gIGNvbnN0IHtcbiAgICAvL1xuICAgIC8vXG4gICAgdGFnczogY29uZGl0aW9ucyxcbiAgICBlbnRyeSxcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgLi4uZXh0cmFcbiAgfSA9IE9iamVjdChjb21wYXJ0bWVudE1hcCk7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGBDb21wYXJ0bWVudCBtYXAgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGFzc2VydENvbmRpdGlvbnMoY29uZGl0aW9ucywgdXJsKTtcbiAgYXNzZXJ0RW50cnkoZW50cnksIHVybCk7XG4gIGFzc2VydENvbXBhcnRtZW50cyhjb21wYXJ0bWVudHMsIHVybCk7XG59OyRozY9fb25jZS5hc3NlcnRDb21wYXJ0bWVudE1hcChhc3NlcnRDb21wYXJ0bWVudE1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdDb21wYXJlIjpbInN0cmluZ0NvbXBhcmUiXSwicGF0aENvbXBhcmUiOlsicGF0aENvbXBhcmUiXSwiYXNzZXJ0Q29tcGFydG1lbnRNYXAiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARdfuCzoDAAA6AwAAMAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2V4dGVuc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VFeHRlbnNpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFyc2VFeHRlbnNpb24gPSBsb2NhdGlvbiA9PiB7XG4gIGNvbnN0IGxhc3RTbGFzaCA9IGxvY2F0aW9uLmxhc3RJbmRleE9mKCcvJyk7XG4gIGlmIChsYXN0U2xhc2ggPCAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IGJhc2UgPSBsb2NhdGlvbi5zbGljZShsYXN0U2xhc2ggKyAxKTtcbiAgY29uc3QgbGFzdERvdCA9IGJhc2UubGFzdEluZGV4T2YoJy4nKTtcbiAgaWYgKGxhc3REb3QgPCAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHJldHVybiBiYXNlLnNsaWNlKGxhc3REb3QgKyAxKTtcbn07JGjNj19vbmNlLnBhcnNlRXh0ZW5zaW9uKHBhcnNlRXh0ZW5zaW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhcnNlRXh0ZW5zaW9uIjpbInBhcnNlRXh0ZW5zaW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAi9oOyvLQAAry0AADoAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtYXJjaGl2ZS1saXRlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3ppcCIsIi4vbGluay5qcyIsIi4vanNvbi5qcyIsIi4vcG93ZXJzLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL2NvbXBhcnRtZW50LW1hcC5qcyIsIi4vaW1wb3J0LWhvb2suanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFppcFJlYWRlcixsaW5rLHBhcnNlTG9jYXRlZEpzb24sdW5wYWNrUmVhZFBvd2Vycyxqb2luLGFzc2VydENvbXBhcnRtZW50TWFwLGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIsYXR0ZW51YXRlTW9kdWxlSG9vayxlbmZvcmNlTW9kdWxlUG9saWN5OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vemlwXCIsIFtbXCJaaXBSZWFkZXJcIixbJGjNj19hID0+IChaaXBSZWFkZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2xpbmsuanNcIiwgW1tcImxpbmtcIixbJGjNj19hID0+IChsaW5rID0gJGjNj19hKV1dXV0sW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsWyRozY9fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRozY9fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJqb2luXCIsWyRozY9fYSA9PiAoam9pbiA9ICRozY9fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtbWFwLmpzXCIsIFtbXCJhc3NlcnRDb21wYXJ0bWVudE1hcFwiLFskaM2PX2EgPT4gKGFzc2VydENvbXBhcnRtZW50TWFwID0gJGjNj19hKV1dXV0sW1wiLi9pbXBvcnQtaG9vay5qc1wiLCBbW1wiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlclwiLFskaM2PX2EgPT4gKGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaM2PX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLFskaM2PX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgRmFpbCwgcXVvdGU6IHEgfSA9IGFzc2VydDtcblxuY29uc3QgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuY29uc3QgeyBhc3NpZ24sIGNyZWF0ZSwgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCBwb3N0cG9uZUVycm9yVG9FeGVjdXRlID0gZXJyb3JNZXNzYWdlID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cblxuICBjb25zdCByZWNvcmQgPSBmcmVlemUoe1xuICAgIGltcG9ydHM6IFtdLFxuICAgIGV4cG9ydHM6IFtdLFxuICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIHJlY29yZDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyID0gKFxuICBnZXQsXG4gIGNvbXBhcnRtZW50cyxcbiAgYXJjaGl2ZUxvY2F0aW9uLFxuICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uID0gdW5kZWZpbmVkLFxuICBleGl0TW9kdWxlSW1wb3J0SG9vayA9IHVuZGVmaW5lZCxcbiAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYWtlSW1wb3J0SG9vayA9ICh7XG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIHBhY2thZ2VOYW1lLFxuICAgIGF0dGVudWF0b3JzXG4gICAgLy9cbiAgICAvL1xuICB9KSA9PiB7XG4gICAgLy9cbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudHNbcGFja2FnZUxvY2F0aW9uXTtcbiAgICBjb25zdCB7IG1vZHVsZXMgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaW1wb3J0SG9vayA9IGFzeW5jIG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgICBhd2FpdCBudWxsO1xuICAgICAgLy9cbiAgICAgIGNvbnN0IG1vZHVsZSA9IG1vZHVsZXNbbW9kdWxlU3BlY2lmaWVyXTtcbiAgICAgIGlmIChtb2R1bGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZXhpdE1vZHVsZUltcG9ydEhvb2spIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBlbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnREZXNjcmlwdG9yLCB7XG4gICAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG4gICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICl9IHdhcyBub3QgaW4gdGhlIGFyY2hpdmUgYW5kIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbG9hZCBpdCBhcyBhIGJ1aWx0aW5gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGV4aXRNb2R1bGVJbXBvcnRIb29rKFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcmVjb3JkOiBhd2FpdCBhdHRlbnVhdGVNb2R1bGVIb29rKFxuICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbiAgICAgICAgICAgICAgICBhdHRlbnVhdG9ycyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gcG9zdHBvbmVFcnJvclRvRXhlY3V0ZShcbiAgICAgICAgICAgICAgYENhbm5vdCBmaW5kIGV4dGVybmFsIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG4gICAgICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbiAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobW9kdWxlLmRlZmVycmVkRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcG9zdHBvbmVFcnJvclRvRXhlY3V0ZShtb2R1bGUuZGVmZXJyZWRFcnJvcik7XG4gICAgICB9XG4gICAgICBpZiAobW9kdWxlLnBhcnNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgcGFyc2UgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbiAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJzZXIgPSBwYXJzZXJGb3JMYW5ndWFnZVttb2R1bGUucGFyc2VyXTtcbiAgICAgIGlmIChwYXJzZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHBhcnNlICR7cShtb2R1bGUucGFyc2VyKX0gbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSBpbiBwYWNrYWdlICR7cShwYWNrYWdlTG9jYXRpb24pfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHBhcnNlIH0gPSBwYXJzZXI7XG4gICAgICBjb25zdCBtb2R1bGVMb2NhdGlvbiA9IGAke3BhY2thZ2VMb2NhdGlvbn0vJHttb2R1bGUubG9jYXRpb259YDtcbiAgICAgIGNvbnN0IG1vZHVsZUJ5dGVzID0gZ2V0KG1vZHVsZUxvY2F0aW9uKTtcblxuICAgICAgaWYgKGNvbXB1dGVTaGE1MTIgIT09IHVuZGVmaW5lZCAmJiBtb2R1bGUuc2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc2hhNTEyID0gY29tcHV0ZVNoYTUxMihtb2R1bGVCeXRlcyk7XG4gICAgICAgIGlmIChzaGE1MTIgIT09IG1vZHVsZS5zaGE1MTIpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIGBNb2R1bGUgJHtxKG1vZHVsZS5sb2NhdGlvbil9IG9mIHBhY2thZ2UgJHtxKFxuICAgICAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShcbiAgICAgICAgICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgICAgICAgKX0gZmFpbGVkIGEgU0hBLTUxMiBpbnRlZ3JpdHkgY2hlY2tgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNvdXJjZUxvY2F0aW9uID0gYGZpbGU6Ly8vJHttb2R1bGVMb2NhdGlvbn1gO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IHBhY2thZ2VOYW1lLnNwbGl0KCcvJykuc2xpY2UoLTEpLmpvaW4oJy8nKTtcbiAgICAgICAgc291cmNlTG9jYXRpb24gPSBgLi4uLyR7am9pbihiYXNlLCBtb2R1bGVTcGVjaWZpZXIpfWA7XG4gICAgICB9XG4gICAgICBpZiAoY29tcHV0ZVNvdXJjZUxvY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc291cmNlTG9jYXRpb24gPVxuICAgICAgICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sIG1vZHVsZVNwZWNpZmllcikgfHxcbiAgICAgICAgICBzb3VyY2VMb2NhdGlvbjtcbiAgICAgIH1cblxuICAgICAgbGV0IHNvdXJjZU1hcFVybDtcbiAgICAgIGlmIChcbiAgICAgICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgbW9kdWxlLnNoYTUxMiAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgc291cmNlTWFwVXJsID0gY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uKHtcbiAgICAgICAgICBjb21wYXJ0bWVudDogcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgIG1vZHVsZTogbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgIGxvY2F0aW9uOiBzb3VyY2VMb2NhdGlvbixcbiAgICAgICAgICBzaGE1MTI6IG1vZHVsZS5zaGE1MTIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgY29uc3QgeyByZWNvcmQgfSA9IGF3YWl0IHBhcnNlKFxuICAgICAgICBtb2R1bGVCeXRlcyxcbiAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBzb3VyY2VMb2NhdGlvbixcbiAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlTWFwVXJsLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyByZWNvcmQsIHNwZWNpZmllcjogbW9kdWxlU3BlY2lmaWVyIH07XG4gICAgfTtcbiAgICByZXR1cm4gaW1wb3J0SG9vaztcbiAgfTtcbiAgcmV0dXJuIG1ha2VJbXBvcnRIb29rO1xufTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFyc2VBcmNoaXZlID0gYXN5bmMgKFxuICBhcmNoaXZlQnl0ZXMsXG4gIGFyY2hpdmVMb2NhdGlvbiA9ICc8dW5rbm93bj4nLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgYXdhaXQgbnVsbDtcbiAgY29uc3Qge1xuICAgIGNvbXB1dGVTaGE1MTIgPSB1bmRlZmluZWQsXG4gICAgZXhwZWN0ZWRTaGE1MTIgPSB1bmRlZmluZWQsXG4gICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uID0gdW5kZWZpbmVkLFxuICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbiA9IHVuZGVmaW5lZCxcbiAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRQYXJzZU9wdGlvbiA9IENvbXBhcnRtZW50LFxuICAgIG1vZHVsZXMgPSB1bmRlZmluZWQsXG4gICAgaW1wb3J0SG9vazogZXhpdE1vZHVsZUltcG9ydEhvb2sgPSB1bmRlZmluZWQsXG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2U6IHBhcnNlckZvckxhbmd1YWdlT3B0aW9uID0ge30sXG4gICAgX19uYXRpdmVfXyA9IGZhbHNlLFxuICB9ID0gb3B0aW9ucztcblxuICBjb25zdCBwYXJzZXJGb3JMYW5ndWFnZSA9IGZyZWV6ZShcbiAgICBhc3NpZ24oY3JlYXRlKG51bGwpLCBwYXJzZXJGb3JMYW5ndWFnZU9wdGlvbiksXG4gICk7XG5cbiAgY29uc3QgYXJjaGl2ZSA9IG5ldyBaaXBSZWFkZXIoYXJjaGl2ZUJ5dGVzLCB7IG5hbWU6IGFyY2hpdmVMb2NhdGlvbiB9KTtcblxuICAvL1xuICBjb25zdCB1bnNlZW4gPSBuZXcgU2V0KGFyY2hpdmUuZmlsZXMua2V5cygpKTtcbiAgdW5zZWVuLnNpemUgPj0gMiB8fFxuICAgIEZhaWxgQXJjaGl2ZSBmYWlsZWQgc2FuaXR5IGNoZWNrOiBzaG91bGQgY29udGFpbiBhdCBsZWFzdCBhIGNvbXBhcnRtZW50IG1hcCBmaWxlIGFuZCBvbmUgbW9kdWxlIGZpbGUgaW4gJHtxKFxuICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICl9YDtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBnZXQgPSBwYXRoID0+IHtcbiAgICB1bnNlZW4uZGVsZXRlKHBhdGgpO1xuICAgIHJldHVybiBhcmNoaXZlLnJlYWQocGF0aCk7XG4gIH07XG5cbiAgY29uc3QgY29tcGFydG1lbnRNYXBCeXRlcyA9IGdldCgnY29tcGFydG1lbnQtbWFwLmpzb24nKTtcblxuICBsZXQgc2hhNTEyO1xuICBpZiAoY29tcHV0ZVNoYTUxMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2hhNTEyID0gY29tcHV0ZVNoYTUxMihjb21wYXJ0bWVudE1hcEJ5dGVzKTtcbiAgfVxuICBpZiAoZXhwZWN0ZWRTaGE1MTIgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzaGE1MTIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgdmVyaWZ5IGV4cGVjdGVkU2hhNTEyIHdpdGhvdXQgYWxzbyBwcm92aWRpbmcgY29tcHV0ZVNoYTUxMiwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzaGE1MTIgIT09IGV4cGVjdGVkU2hhNTEyKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEFyY2hpdmUgY29tcGFydG1lbnQgbWFwIGZhaWxlZCBhIFNIQS01MTIgaW50ZWdyaXR5IGNoZWNrLCBleHBlY3RlZCAke2V4cGVjdGVkU2hhNTEyfSwgZ290ICR7c2hhNTEyfSwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGNvbXBhcnRtZW50TWFwVGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShjb21wYXJ0bWVudE1hcEJ5dGVzKTtcbiAgY29uc3QgY29tcGFydG1lbnRNYXAgPSBwYXJzZUxvY2F0ZWRKc29uKFxuICAgIGNvbXBhcnRtZW50TWFwVGV4dCxcbiAgICAnY29tcGFydG1lbnQtbWFwLmpzb24nLFxuICApO1xuICBhc3NlcnRDb21wYXJ0bWVudE1hcChjb21wYXJ0bWVudE1hcCwgYXJjaGl2ZUxvY2F0aW9uKTtcblxuICBjb25zdCB7XG4gICAgY29tcGFydG1lbnRzLFxuICAgIGVudHJ5OiB7IG1vZHVsZTogZW50cnlNb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50OiBlbnRyeUNvbXBhcnRtZW50TmFtZSB9LFxuICB9ID0gY29tcGFydG1lbnRNYXA7XG5cbiAgY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayA9IGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xuICAgIG1vZHVsZXMsXG4gICAgZXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG4gIH0pO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtYWtlSW1wb3J0SG9vayA9IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyKFxuICAgICAgZ2V0LFxuICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgICAgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayxcbiAgICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICApO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgeyBjb21wYXJ0bWVudCwgcGVuZGluZ0pvYnNQcm9taXNlIH0gPSBsaW5rKGNvbXBhcnRtZW50TWFwLCB7XG4gICAgICBtYWtlSW1wb3J0SG9vayxcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgbW9kdWxlczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3Qua2V5cyhtb2R1bGVzIHx8IHt9KS5tYXAoc3BlY2lmaWVyID0+IHtcbiAgICAgICAgICByZXR1cm4gW3NwZWNpZmllciwgeyBuYW1lc3BhY2U6IHt9IH1dO1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRQYXJzZU9wdGlvbixcbiAgICAgIF9fbmF0aXZlX18sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbiAgICBhd2FpdCBjb21wYXJ0bWVudC5sb2FkKGVudHJ5TW9kdWxlU3BlY2lmaWVyKTtcbiAgICB1bnNlZW4uc2l6ZSA9PT0gMCB8fFxuICAgICAgRmFpbGBBcmNoaXZlIGNvbnRhaW5zIGV4dHJhbmVvdXMgZmlsZXM6ICR7cShbLi4udW5zZWVuXSl9IGluICR7cShcbiAgICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgKX1gO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBhc3luYyBvcHRpb25zID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBnbG9iYWxzLFxuICAgICAgbW9kdWxlcyxcbiAgICAgIHRyYW5zZm9ybXMsXG4gICAgICBfX3NoaW1UcmFuc2Zvcm1zX18sXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRPcHRpb24gPSBDb21wYXJ0bWVudFBhcnNlT3B0aW9uLFxuICAgICAgX19uYXRpdmVfXyxcbiAgICAgIGltcG9ydEhvb2s6IGV4aXRNb2R1bGVJbXBvcnRIb29rLFxuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayA9IGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xuICAgICAgbW9kdWxlcyxcbiAgICAgIGV4aXRNb2R1bGVJbXBvcnRIb29rLFxuICAgICAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG4gICAgfSk7XG4gICAgY29uc3QgbWFrZUltcG9ydEhvb2sgPSBtYWtlQXJjaGl2ZUltcG9ydEhvb2tNYWtlcihcbiAgICAgIGdldCxcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgIGFyY2hpdmVMb2NhdGlvbixcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICAgIGNvbXBhcnRtZW50RXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24sXG4gICAgKTtcbiAgICBjb25zdCB7IGNvbXBhcnRtZW50LCBwZW5kaW5nSm9ic1Byb21pc2UgfSA9IGxpbmsoY29tcGFydG1lbnRNYXAsIHtcbiAgICAgIG1ha2VJbXBvcnRIb29rLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBnbG9iYWxzLFxuICAgICAgbW9kdWxlcyxcbiAgICAgIHRyYW5zZm9ybXMsXG4gICAgICBfX3NoaW1UcmFuc2Zvcm1zX18sXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRPcHRpb24sXG4gICAgICBfX25hdGl2ZV9fLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgcGVuZGluZ0pvYnNQcm9taXNlO1xuXG4gICAgLy9cbiAgICByZXR1cm4gY29tcGFydG1lbnRbJ2ltcG9ydCddKGVudHJ5TW9kdWxlU3BlY2lmaWVyKTtcbiAgfTtcblxuICByZXR1cm4geyBpbXBvcnQ6IGV4ZWN1dGUsIHNoYTUxMiB9O1xufTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLnBhcnNlQXJjaGl2ZShwYXJzZUFyY2hpdmUpO1xuICAgICAgIGNvbnN0IGxvYWRBcmNoaXZlID0gYXN5bmMgKFxuICByZWFkUG93ZXJzLFxuICBhcmNoaXZlTG9jYXRpb24sXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBjb25zdCB7IHJlYWQsIGNvbXB1dGVTaGE1MTIgfSA9IHVucGFja1JlYWRQb3dlcnMocmVhZFBvd2Vycyk7XG4gIGNvbnN0IHtcbiAgICBleHBlY3RlZFNoYTUxMixcbiAgICBjb21wdXRlU291cmNlTG9jYXRpb24sXG4gICAgbW9kdWxlcyxcbiAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24sXG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBhcmNoaXZlQnl0ZXMgPSBhd2FpdCByZWFkKGFyY2hpdmVMb2NhdGlvbik7XG4gIHJldHVybiBwYXJzZUFyY2hpdmUoYXJjaGl2ZUJ5dGVzLCBhcmNoaXZlTG9jYXRpb24sIHtcbiAgICBjb21wdXRlU2hhNTEyLFxuICAgIGV4cGVjdGVkU2hhNTEyLFxuICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICBtb2R1bGVzLFxuICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UubG9hZEFyY2hpdmUobG9hZEFyY2hpdmUpO1xuICAgICAgIGNvbnN0IGltcG9ydEFyY2hpdmUgPSBhc3luYyAocmVhZFBvd2VycywgYXJjaGl2ZUxvY2F0aW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBsb2FkQXJjaGl2ZShyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpO1xuICByZXR1cm4gYXJjaGl2ZS5pbXBvcnQob3B0aW9ucyk7XG59OyRozY9fb25jZS5pbXBvcnRBcmNoaXZlKGltcG9ydEFyY2hpdmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFyc2VBcmNoaXZlIjpbInBhcnNlQXJjaGl2ZSJdLCJsb2FkQXJjaGl2ZSI6WyJsb2FkQXJjaGl2ZSJdLCJpbXBvcnRBcmNoaXZlIjpbImltcG9ydEFyY2hpdmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAquzY4zYFAAA2BQAAPQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanN7ImltcG9ydHMiOlsiLi9wYXJzZS1wcmUtY2pzLmpzIiwiLi9wYXJzZS1qc29uLmpzIiwiLi9wYXJzZS10ZXh0LmpzIiwiLi9wYXJzZS1ieXRlcy5qcyIsIi4vcGFyc2UtcHJlLW1qcy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhcnNlclByZUNqcyxwYXJzZXJKc29uLHBhcnNlclRleHQscGFyc2VyQnl0ZXMscGFyc2VyUHJlTWpzOyRozY9faW1wb3J0cyhbW1wiLi9wYXJzZS1wcmUtY2pzLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VyUHJlQ2pzID0gJGjNj19hKV1dXV0sW1wiLi9wYXJzZS1qc29uLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VySnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtdGV4dC5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKHBhcnNlclRleHQgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcnNlLWJ5dGVzLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VyQnl0ZXMgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcnNlLXByZS1tanMuanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChwYXJzZXJQcmVNanMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlID0gT2JqZWN0LmZyZWV6ZShcbiAgLyogICAgICAgICAgICAgICAgKi8gKHtcbiAgICAncHJlLWNqcy1qc29uJzogcGFyc2VyUHJlQ2pzLFxuICAgICdwcmUtbWpzLWpzb24nOiBwYXJzZXJQcmVNanMsXG4gICAganNvbjogcGFyc2VySnNvbixcbiAgICB0ZXh0OiBwYXJzZXJUZXh0LFxuICAgIGJ5dGVzOiBwYXJzZXJCeXRlcyxcbiAgfSksXG4pOyRozY9fb25jZS5kZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UoZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSI6WyJkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlxQl1NwIAADcCAAANQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLmpzeyJpbXBvcnRzIjpbIi4vaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qcyIsIi4vaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSxwYXJzZUFyY2hpdmVMaXRlLGxvYWRBcmNoaXZlTGl0ZSxpbXBvcnRBcmNoaXZlTGl0ZTskaM2PX2ltcG9ydHMoW1tcIi4vaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qc1wiLCBbW1wiZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlXCIsWyRozY9fYSA9PiAoZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlID0gJGjNj19hKV1dXV0sW1wiLi9pbXBvcnQtYXJjaGl2ZS1saXRlLmpzXCIsIFtbXCJwYXJzZUFyY2hpdmVcIixbJGjNj19hID0+IChwYXJzZUFyY2hpdmVMaXRlID0gJGjNj19hKV1dLFtcImxvYWRBcmNoaXZlXCIsWyRozY9fYSA9PiAobG9hZEFyY2hpdmVMaXRlID0gJGjNj19hKV1dLFtcImltcG9ydEFyY2hpdmVcIixbJGjNj19hID0+IChpbXBvcnRBcmNoaXZlTGl0ZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGFzc2lnbiwgY3JlYXRlLCBmcmVlemUgfSA9IE9iamVjdDtcblxuLy9cbi8vXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2UgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHsgcGFyc2VyRm9yTGFuZ3VhZ2U6IHBhcnNlckZvckxhbmd1YWdlT3B0aW9uLCAuLi5yZXN0IH0gPSBvcHRpb25zO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwYXJzZXJGb3JMYW5ndWFnZSA9IGZyZWV6ZShcbiAgICBhc3NpZ24oY3JlYXRlKG51bGwpLCBkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UsIHBhcnNlckZvckxhbmd1YWdlT3B0aW9uKSxcbiAgKTtcbiAgcmV0dXJuIHsgLi4ucmVzdCwgcGFyc2VyRm9yTGFuZ3VhZ2UgfTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBhcnNlQXJjaGl2ZSA9IGFzeW5jIChcbiAgYXJjaGl2ZUJ5dGVzLFxuICBhcmNoaXZlTG9jYXRpb24gPSAnPHVua25vd24+JyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PlxuICBwYXJzZUFyY2hpdmVMaXRlKFxuICAgIGFyY2hpdmVCeXRlcyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5wYXJzZUFyY2hpdmUocGFyc2VBcmNoaXZlKTtcbiAgICAgICBjb25zdCBsb2FkQXJjaGl2ZSA9IGFzeW5jIChyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpID0+XG4gIGxvYWRBcmNoaXZlTGl0ZShcbiAgICByZWFkUG93ZXJzLFxuICAgIGFyY2hpdmVMb2NhdGlvbixcbiAgICBhc3NpZ25QYXJzZXJGb3JMYW5ndWFnZShvcHRpb25zKSxcbiAgKTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmxvYWRBcmNoaXZlKGxvYWRBcmNoaXZlKTtcbiAgICAgICBjb25zdCBpbXBvcnRBcmNoaXZlID0gYXN5bmMgKHJlYWRQb3dlcnMsIGFyY2hpdmVMb2NhdGlvbiwgb3B0aW9ucykgPT5cbiAgaW1wb3J0QXJjaGl2ZUxpdGUoXG4gICAgcmVhZFBvd2VycyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7JGjNj19vbmNlLmltcG9ydEFyY2hpdmUoaW1wb3J0QXJjaGl2ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACKAUN4X0kAAF9JAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvaW1wb3J0LWhvb2suanN7ImltcG9ydHMiOlsiQGVuZG8vdHJhbXBvbGluZSIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9wb2xpY3kuanMiLCIuL3Bvd2Vycy5qcyJdLCJleHBvcnRzIjpbImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiLCJtYWtlSW1wb3J0SG9va01ha2VyIiwibWFrZUltcG9ydE5vd0hvb2tNYWtlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzeW5jVHJhbXBvbGluZSxzeW5jVHJhbXBvbGluZSxyZXNvbHZlLGF0dGVudWF0ZU1vZHVsZUhvb2ssQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQsZW5mb3JjZU1vZHVsZVBvbGljeSx1bnBhY2tSZWFkUG93ZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vdHJhbXBvbGluZVwiLCBbW1wiYXN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoYXN5bmNUcmFtcG9saW5lID0gJGjNj19hKV1dLFtcInN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoc3luY1RyYW1wb2xpbmUgPSAkaM2PX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wicmVzb2x2ZVwiLFskaM2PX2EgPT4gKHJlc29sdmUgPSAkaM2PX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaM2PX2EpXV0sW1wiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRcIixbJGjNj19hID0+IChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICRozY9fYSldXSxbXCJlbmZvcmNlTW9kdWxlUG9saWN5XCIsWyRozY9fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRozY9fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsWyRozY9fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VJbXBvcnROb3dIb29rTWFrZXIsJ25hbWUnLHt2YWx1ZTpcIm1ha2VJbXBvcnROb3dIb29rTWFrZXJcIn0pOyRozY9fb25jZS5tYWtlSW1wb3J0Tm93SG9va01ha2VyKG1ha2VJbXBvcnROb3dIb29rTWFrZXIpO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZnJlZXplID0gT2JqZWN0LmZyZWV6ZTtcblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzLCBhc3NpZ24sIGNyZWF0ZSB9ID0gT2JqZWN0O1xuXG5jb25zdCB7IGhhc093blByb3BlcnR5IH0gPSBPYmplY3QucHJvdG90eXBlO1xuLypcblxuXG4gKi9cbmNvbnN0IGhhcyA9IChoYXlzdGFjaywgbmVlZGxlKSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgaGF5c3RhY2ssIFtuZWVkbGVdKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgcmVzb2x2ZUxvY2F0aW9uID0gKHJlbCwgYWJzKSA9PiBuZXcgVVJMKHJlbCwgYWJzKS50b1N0cmluZygpO1xuXG4vL1xuZnVuY3Rpb24gZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSB7XG4gIHJldHVybiAoaGFzKHJlY29yZCwgJ3JlY29yZCcpID8gcmVjb3JkLnJlY29yZC5pbXBvcnRzIDogcmVjb3JkLmltcG9ydHMpIHx8IFtdO1xufVxuXG4vL1xuLy9cbmNvbnN0IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyA9IFtcbiAgLy9cbiAgJy5qcycsXG4gICcuanNvbicsXG4gICcubm9kZScsXG4gIC8vXG4gICcvaW5kZXguanMnLFxuICAnL2luZGV4Lmpzb24nLFxuICAnL2luZGV4Lm5vZGUnLFxuXTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZmluZFJlZGlyZWN0ID0gKHtcbiAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICBjb21wYXJ0bWVudHMsXG4gIGFic29sdXRlTW9kdWxlU3BlY2lmaWVyLFxuICBwYWNrYWdlTG9jYXRpb24sXG59KSA9PiB7XG4gIGNvbnN0IG1vZHVsZVNwZWNpZmllckxvY2F0aW9uID0gbmV3IFVSTChcbiAgICBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICkuaHJlZjtcblxuICAvL1xuICBsZXQgc29tZUxvY2F0aW9uID0gbmV3IFVSTCgnLi8nLCBtb2R1bGVTcGVjaWZpZXJMb2NhdGlvbikuaHJlZjtcblxuICAvL1xuICAvL1xuXG4gIC8vXG4gIGZvciAoOzspIHtcbiAgICBpZiAoXG4gICAgICBzb21lTG9jYXRpb24gIT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UICYmXG4gICAgICBzb21lTG9jYXRpb24gaW4gY29tcGFydG1lbnRzXG4gICAgKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IHNvbWVMb2NhdGlvbjtcbiAgICAgIGNvbnN0IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW2xvY2F0aW9uXTtcbiAgICAgIGlmIChjb21wYXJ0bWVudERlc2NyaXB0b3IgPT09IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAoY29tcGFydG1lbnREZXNjcmlwdG9yLmNvbXBhcnRtZW50cy5oYXMobG9jYXRpb24pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BlY2lmaWVyOiBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBjb21wYXJ0bWVudDogY29tcGFydG1lbnRzW2xvY2F0aW9uXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKFxuICAgICAgICBzb21lQ29tcGFydG1lbnREZXNjcmlwdG9yLmNvbXBhcnRtZW50cy5oYXMoXG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLmxvY2F0aW9uLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShcbiAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSxcbiAgICAgICAgICBzb21lQ29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9ySGludDogYEJsb2NrZWQgaW4gaW1wb3J0IGhvb2suICR7cShhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcil9IGlzIHBhcnQgb2YgdGhlIGNvbXBhcnRtZW50IG1hcCBhbmQgcmVzb2x2ZXMgdG8gJHtsb2NhdGlvbn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BlY2lmaWVyOiBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBjb21wYXJ0bWVudDogY29tcGFydG1lbnRzW2xvY2F0aW9uXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW1wb3J0IG1vZHVsZTogJHtxKGFic29sdXRlTW9kdWxlU3BlY2lmaWVyKX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHBhcmVudExvY2F0aW9uID0gbmV3IFVSTCgnLi4vJywgc29tZUxvY2F0aW9uKS5ocmVmO1xuXG4gICAgICAvL1xuICAgICAgaWYgKHBhcmVudExvY2F0aW9uID09PSBzb21lTG9jYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgaW1wb3J0IHVua25vd24gbW9kdWxlOiAke3EoYWJzb2x1dGVNb2R1bGVTcGVjaWZpZXIpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNvbWVMb2NhdGlvbiA9IHBhcmVudExvY2F0aW9uO1xuICAgIH1cbiAgfVxufTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyID0gKHtcbiAgbW9kdWxlcyA9IHVuZGVmaW5lZCxcbiAgZXhpdE1vZHVsZUltcG9ydEhvb2sgPSB1bmRlZmluZWQsXG4gIGVudHJ5Q29tcGFydG1lbnROYW1lLFxufSkgPT4ge1xuICBpZiAoIW1vZHVsZXMgJiYgIWV4aXRNb2R1bGVJbXBvcnRIb29rKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXN5bmMgc3BlY2lmaWVyID0+IHtcbiAgICBpZiAobW9kdWxlcyAmJiBoYXMobW9kdWxlcywgc3BlY2lmaWVyKSkge1xuICAgICAgY29uc3QgbnMgPSBtb2R1bGVzW3NwZWNpZmllcl07XG4gICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgaW1wb3J0czogW10sXG4gICAgICAgIGV4cG9ydHM6IG5zID8ga2V5cyhucykgOiBbXSxcbiAgICAgICAgZXhlY3V0ZTogbW9kdWxlRXhwb3J0cyA9PiB7XG4gICAgICAgICAgbW9kdWxlRXhwb3J0cy5kZWZhdWx0ID0gbnM7XG4gICAgICAgICAgYXNzaWduKG1vZHVsZUV4cG9ydHMsIG5zKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZXhpdE1vZHVsZUltcG9ydEhvb2spIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBleGl0TW9kdWxlSW1wb3J0SG9vayhzcGVjaWZpZXIsIGVudHJ5Q29tcGFydG1lbnROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcik7XG5jb25zdCBub21pbmF0ZUNhbmRpZGF0ZXMgPSAobW9kdWxlU3BlY2lmaWVyLCBzZWFyY2hTdWZmaXhlcykgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBjYW5kaWRhdGVzID0gW21vZHVsZVNwZWNpZmllcl07XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlU3VmZml4IG9mIHNlYXJjaFN1ZmZpeGVzKSB7XG4gICAgY2FuZGlkYXRlcy5wdXNoKGAke21vZHVsZVNwZWNpZmllcn0ke2NhbmRpZGF0ZVN1ZmZpeH1gKTtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiogY2hvb3NlTW9kdWxlRGVzY3JpcHRvcihcbiAge1xuICAgIGNhbmRpZGF0ZXMsXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgY29tcGFydG1lbnRzLFxuICAgIGNvbXB1dGVTaGE1MTIsXG4gICAgbW9kdWxlRGVzY3JpcHRvcnMsXG4gICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBwYWNrYWdlU291cmNlcyxcbiAgICByZWFkUG93ZXJzLFxuICAgIGFyY2hpdmVPbmx5LFxuICAgIHNvdXJjZU1hcEhvb2ssXG4gICAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICB9LFxuICB7IG1heWJlUmVhZCwgcGFyc2UsIHNob3VsZERlZmVyRXJyb3IgPSAoKSA9PiBmYWxzZSB9LFxuKSB7XG4gIGNvbnN0IHsgc291cmNlRGlybmFtZSB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVNwZWNpZmllciBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvciA9IG1vZHVsZURlc2NyaXB0b3JzW2NhbmRpZGF0ZVNwZWNpZmllcl07XG4gICAgaWYgKGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG4gICAgICBjb25zdCB7IGNvbXBhcnRtZW50OiBjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWUgPSBwYWNrYWdlTG9jYXRpb24gfSA9XG4gICAgICAgIGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3I7XG4gICAgICBjb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50c1tjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWVdO1xuICAgICAgaWYgKGNhbmRpZGF0ZUNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYGNvbXBhcnRtZW50IG1pc3NpbmcgZm9yIGNhbmRpZGF0ZSAke2NhbmRpZGF0ZVNwZWNpZmllcn0gaW4gJHtjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWV9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3IgPVxuICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzW2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZV07XG4gICAgICBpZiAoY2FuZGlkYXRlQ29tcGFydG1lbnREZXNjcmlwdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYGNvbXBhcnRtZW50RGVzY3JpcHRvciBtaXNzaW5nIGZvciBjYW5kaWRhdGUgJHtjYW5kaWRhdGVTcGVjaWZpZXJ9IGluICR7Y2FuZGlkYXRlQ29tcGFydG1lbnROYW1lfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlc1ttb2R1bGVTcGVjaWZpZXJdID1cbiAgICAgICAgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvcjtcbiAgICAgIC8vXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgcmVjb3JkID0ge1xuICAgICAgICBzcGVjaWZpZXI6IGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgY29tcGFydG1lbnQ6IGNhbmRpZGF0ZUNvbXBhcnRtZW50LFxuICAgICAgfTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBtb2R1bGVMb2NhdGlvbiA9IHJlc29sdmVMb2NhdGlvbihjYW5kaWRhdGVTcGVjaWZpZXIsIHBhY2thZ2VMb2NhdGlvbik7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgbW9kdWxlQnl0ZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICB5aWVsZCBtYXliZVJlYWQobW9kdWxlTG9jYXRpb24pXG4gICAgKTtcblxuICAgIGlmIChtb2R1bGVCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGxldCBzb3VyY2VNYXA7XG4gICAgICAvL1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSAvKiAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICAgIHlpZWxkIHBhcnNlKFxuICAgICAgICAgIG1vZHVsZUJ5dGVzLFxuICAgICAgICAgIGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICAgIGFyY2hpdmVPbmx5LFxuICAgICAgICAgICAgc291cmNlTWFwSG9vazpcbiAgICAgICAgICAgICAgc291cmNlTWFwSG9vayAmJlxuICAgICAgICAgICAgICAobmV4dFNvdXJjZU1hcE9iamVjdCA9PiB7XG4gICAgICAgICAgICAgICAgc291cmNlTWFwID0gSlNPTi5zdHJpbmdpZnkobmV4dFNvdXJjZU1hcE9iamVjdCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBhcnNlcixcbiAgICAgICAgYnl0ZXM6IHRyYW5zZm9ybWVkQnl0ZXMsXG4gICAgICAgIHJlY29yZDogY29uY3JldGVSZWNvcmQsXG4gICAgICB9ID0gZW52ZWxvcGU7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKGNhbmRpZGF0ZVNwZWNpZmllciAhPT0gbW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgICAgIG1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl0gPSB7XG4gICAgICAgICAgcmV0YWluZWQ6IHRydWUsXG4gICAgICAgICAgbW9kdWxlOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgICAgY29tcGFydG1lbnQ6IHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgICAgcmVjb3JkOiBjb25jcmV0ZVJlY29yZCxcbiAgICAgICAgc3BlY2lmaWVyOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgIGltcG9ydE1ldGE6IHsgdXJsOiBtb2R1bGVMb2NhdGlvbiB9LFxuICAgICAgfTtcblxuICAgICAgbGV0IHNoYTUxMjtcbiAgICAgIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2hhNTEyID0gY29tcHV0ZVNoYTUxMih0cmFuc2Zvcm1lZEJ5dGVzKTtcblxuICAgICAgICBpZiAoc291cmNlTWFwSG9vayAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZU1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc291cmNlTWFwSG9vayhzb3VyY2VNYXAsIHtcbiAgICAgICAgICAgIGNvbXBhcnRtZW50OiBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICBtb2R1bGU6IGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICAgIGxvY2F0aW9uOiBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICAgIHNoYTUxMixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbiA9IG1vZHVsZUxvY2F0aW9uLnNsaWNlKFxuICAgICAgICBwYWNrYWdlTG9jYXRpb24ubGVuZ3RoLFxuICAgICAgKTtcbiAgICAgIHBhY2thZ2VTb3VyY2VzW2NhbmRpZGF0ZVNwZWNpZmllcl0gPSB7XG4gICAgICAgIGxvY2F0aW9uOiBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbixcbiAgICAgICAgc291cmNlTG9jYXRpb246IG1vZHVsZUxvY2F0aW9uLFxuICAgICAgICBzb3VyY2VEaXJuYW1lLFxuICAgICAgICBwYXJzZXIsXG4gICAgICAgIGJ5dGVzOiB0cmFuc2Zvcm1lZEJ5dGVzLFxuICAgICAgICByZWNvcmQ6IGNvbmNyZXRlUmVjb3JkLFxuICAgICAgICBzaGE1MTIsXG4gICAgICB9O1xuICAgICAgaWYgKCFzaG91bGREZWZlckVycm9yKHBhcnNlcikpIHtcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRTcGVjaWZpZXIgb2YgZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSkge1xuICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmFkZChcbiAgICAgICAgICAgIHJlc29sdmUoaW1wb3J0U3BlY2lmaWVyLCBtb2R1bGVTcGVjaWZpZXIpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUltcG9ydEhvb2tNYWtlciA9IChcbiAgcmVhZFBvd2VycyxcbiAgYmFzZUxvY2F0aW9uLFxuICB7XG4gICAgc291cmNlcyA9IGNyZWF0ZShudWxsKSxcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzID0gY3JlYXRlKG51bGwpLFxuICAgIGFyY2hpdmVPbmx5ID0gZmFsc2UsXG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBzZWFyY2hTdWZmaXhlcyA9IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyxcbiAgICBzb3VyY2VNYXBIb29rID0gdW5kZWZpbmVkLFxuICAgIGVudHJ5Q29tcGFydG1lbnROYW1lLFxuICAgIGVudHJ5TW9kdWxlU3BlY2lmaWVyLFxuICAgIGltcG9ydEhvb2s6IGV4aXRNb2R1bGVJbXBvcnRIb29rID0gdW5kZWZpbmVkLFxuICB9LFxuKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0cmljdGx5UmVxdWlyZWQgPSBuZXcgTWFwKFtcbiAgICBbZW50cnlDb21wYXJ0bWVudE5hbWUsIG5ldyBTZXQoW2VudHJ5TW9kdWxlU3BlY2lmaWVyXSldLFxuICBdKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudE5hbWUgPT4ge1xuICAgIGxldCBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgPSBzdHJpY3RseVJlcXVpcmVkLmdldChjb21wYXJ0bWVudE5hbWUpO1xuICAgIGlmIChjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiAgICB9XG4gICAgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkID0gbmV3IFNldCgpO1xuICAgIHN0cmljdGx5UmVxdWlyZWQuc2V0KGNvbXBhcnRtZW50TmFtZSwgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkKTtcbiAgICByZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuICB9O1xuXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYWtlSW1wb3J0SG9vayA9ICh7XG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIHBhY2thZ2VOYW1lOiBfcGFja2FnZU5hbWUsXG4gICAgYXR0ZW51YXRvcnMsXG4gICAgcGFyc2UsXG4gICAgc2hvdWxkRGVmZXJFcnJvcixcbiAgICBjb21wYXJ0bWVudHMsXG4gIH0pID0+IHtcbiAgICAvL1xuICAgIHBhY2thZ2VMb2NhdGlvbiA9IHJlc29sdmVMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sIGJhc2VMb2NhdGlvbik7XG4gICAgY29uc3QgcGFja2FnZVNvdXJjZXMgPSBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gfHwgY3JlYXRlKG51bGwpO1xuICAgIHNvdXJjZXNbcGFja2FnZUxvY2F0aW9uXSA9IHBhY2thZ2VTb3VyY2VzO1xuICAgIGNvbnN0IGNvbXBhcnRtZW50RGVzY3JpcHRvciA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcnNbcGFja2FnZUxvY2F0aW9uXSB8fCB7fTtcbiAgICBjb25zdCB7IG1vZHVsZXM6IG1vZHVsZURlc2NyaXB0b3JzID0gY3JlYXRlKG51bGwpIH0gPSBjb21wYXJ0bWVudERlc2NyaXB0b3I7XG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXMgPSBtb2R1bGVEZXNjcmlwdG9ycztcblxuICAgIC8qXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgZGVmZXJFcnJvciA9IChzcGVjaWZpZXIsIGVycm9yKSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmIChzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQocGFja2FnZUxvY2F0aW9uKS5oYXMoc3BlY2lmaWVyKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCByZWNvcmQgPSBmcmVlemUoe1xuICAgICAgICBpbXBvcnRzOiBbXSxcbiAgICAgICAgZXhwb3J0czogW10sXG4gICAgICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcGFja2FnZVNvdXJjZXNbc3BlY2lmaWVyXSA9IHtcbiAgICAgICAgZGVmZXJyZWRFcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBpbXBvcnRIb29rID0gYXN5bmMgbW9kdWxlU3BlY2lmaWVyID0+IHtcbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG5cbiAgICAgIC8vXG4gICAgICBhd2FpdCBudWxsO1xuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vXG5cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAhPT0gJy4nICYmICFtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgICAgICAgIGlmIChleGl0TW9kdWxlSW1wb3J0SG9vaykge1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgZXhpdE1vZHVsZUltcG9ydEhvb2soXG4gICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChyZWNvcmQpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50RGVzY3JpcHRvciwge1xuICAgICAgICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG4gICAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICAgICAgKX0gd2FzIG5vdCBpbiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGxvYWQgaXQgYXMgYSBidWlsdGluYCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChhcmNoaXZlT25seSkge1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplKHsgaW1wb3J0czogW10sIGV4cG9ydHM6IFtdLCBleGVjdXRlKCkge30gfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgY29uc3QgYXR0ZW51YXRlZFJlY29yZCA9IGF3YWl0IGF0dGVudWF0ZU1vZHVsZUhvb2soXG4gICAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuICAgICAgICAgICAgICAgIGF0dGVudWF0b3JzLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gYXR0ZW51YXRlZFJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGZpbmQgZXh0ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgKX0gaW4gcGFja2FnZSAke3BhY2thZ2VMb2NhdGlvbn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IG1heWJlUmVhZCB9ID0gdW5wYWNrUmVhZFBvd2VycyhyZWFkUG93ZXJzKTtcblxuICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gbm9taW5hdGVDYW5kaWRhdGVzKG1vZHVsZVNwZWNpZmllciwgc2VhcmNoU3VmZml4ZXMpO1xuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGFzeW5jVHJhbXBvbGluZShcbiAgICAgICAgICBjaG9vc2VNb2R1bGVEZXNjcmlwdG9yLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMsXG4gICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICAgICAgICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgICAgICAgIG1vZHVsZURlc2NyaXB0b3JzLFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgcGFja2FnZVNvdXJjZXMsXG4gICAgICAgICAgICByZWFkUG93ZXJzLFxuICAgICAgICAgICAgYXJjaGl2ZU9ubHksXG4gICAgICAgICAgICBzb3VyY2VNYXBIb29rLFxuICAgICAgICAgICAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBtYXliZVJlYWQsIHBhcnNlLCBzaG91bGREZWZlckVycm9yIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgZmlsZSBmb3IgaW50ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSAod2l0aCBjYW5kaWRhdGVzICR7Y2FuZGlkYXRlc1xuICAgICAgICAgICAgLm1hcCh4ID0+IHEoeCkpXG4gICAgICAgICAgICAuam9pbignLCAnKX0pIGluIHBhY2thZ2UgJHtwYWNrYWdlTG9jYXRpb259YCxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZlckVycm9yKG1vZHVsZVNwZWNpZmllciwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGltcG9ydEhvb2s7XG4gIH07XG4gIHJldHVybiBtYWtlSW1wb3J0SG9vaztcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZUltcG9ydEhvb2tNYWtlcihtYWtlSW1wb3J0SG9va01ha2VyKTtcbiAgICAgICBmdW5jdGlvbiBtYWtlSW1wb3J0Tm93SG9va01ha2VyKFxuICByZWFkUG93ZXJzLFxuICBiYXNlTG9jYXRpb24sXG4gIHtcbiAgICBzb3VyY2VzID0gY3JlYXRlKG51bGwpLFxuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMgPSBjcmVhdGUobnVsbCksXG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBzZWFyY2hTdWZmaXhlcyA9IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyxcbiAgICBhcmNoaXZlT25seSA9IGZhbHNlLFxuICAgIHNvdXJjZU1hcEhvb2sgPSB1bmRlZmluZWQsXG4gICAgaW1wb3J0Tm93SG9vazogZXhpdE1vZHVsZUltcG9ydE5vd0hvb2sgPSB1bmRlZmluZWQsXG4gIH0sXG4pIHtcbiAgLy9cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3RyaWN0bHlSZXF1aXJlZCA9IG5ldyBNYXAoKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudE5hbWUgPT4ge1xuICAgIGxldCBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgPSBzdHJpY3RseVJlcXVpcmVkLmdldChjb21wYXJ0bWVudE5hbWUpO1xuICAgIGlmIChjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiAgICB9XG4gICAgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkID0gbmV3IFNldCgpO1xuICAgIHN0cmljdGx5UmVxdWlyZWQuc2V0KGNvbXBhcnRtZW50TmFtZSwgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkKTtcbiAgICByZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IG1ha2VJbXBvcnROb3dIb29rID0gKHtcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgcGFja2FnZU5hbWU6IF9wYWNrYWdlTmFtZSxcbiAgICBwYXJzZSxcbiAgICBjb21wYXJ0bWVudHMsXG4gIH0pID0+IHtcbiAgICBpZiAoISgnaXNTeW5jUGFyc2VyJyBpbiBwYXJzZSkpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbXBvc3NpYmxlVHJhbnNmb3JtSW1wb3J0Tm93SG9vaygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdEeW5hbWljIHJlcXVpcmVzIGFyZSBvbmx5IHBvc3NpYmxlIHdpdGggc3luY2hyb25vdXMgcGFyc2VycyBhbmQgbm8gYXN5bmNocm9ub3VzIG1vZHVsZSB0cmFuc2Zvcm1zIGluIG9wdGlvbnMnLFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW3BhY2thZ2VMb2NhdGlvbl0gfHwge307XG5cbiAgICBwYWNrYWdlTG9jYXRpb24gPSByZXNvbHZlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLCBiYXNlTG9jYXRpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VTb3VyY2VzID0gc291cmNlc1twYWNrYWdlTG9jYXRpb25dIHx8IGNyZWF0ZShudWxsKTtcbiAgICBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gPSBwYWNrYWdlU291cmNlcztcbiAgICBjb25zdCB7XG4gICAgICBtb2R1bGVzOlxuICAgICAgICBtb2R1bGVEZXNjcmlwdG9ycyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgICAgICBjcmVhdGUobnVsbClcbiAgICAgICAgKSxcbiAgICB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzID0gbW9kdWxlRGVzY3JpcHRvcnM7XG5cbiAgICBsZXQgeyBwb2xpY3kgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICBwb2xpY3kgPSBwb2xpY3kgfHwgY3JlYXRlKG51bGwpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKCdwYWNrYWdlcycgaW4gcG9saWN5ICYmIHR5cGVvZiBwb2xpY3kucGFja2FnZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwYWNrYWdlTmFtZSwgcGFja2FnZVBvbGljeUl0ZW1dIG9mIGVudHJpZXMocG9saWN5LnBhY2thZ2VzKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIShwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlcykgJiZcbiAgICAgICAgICBwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3Iuc2NvcGVzICYmXG4gICAgICAgICAgcGFja2FnZVBvbGljeUl0ZW1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXNbcGFja2FnZU5hbWVdID1cbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5zY29wZXNbcGFja2FnZU5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBtYXliZVJlYWROb3csIGlzQWJzb2x1dGUgfSA9IHJlYWRQb3dlcnM7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaW1wb3J0Tm93SG9vayA9IG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgICBpZiAoaXNBYnNvbHV0ZShtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGZpbmRSZWRpcmVjdCh7XG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgICAgIGFic29sdXRlTW9kdWxlU3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG5vbWluYXRlQ2FuZGlkYXRlcyhtb2R1bGVTcGVjaWZpZXIsIHNlYXJjaFN1ZmZpeGVzKTtcblxuICAgICAgY29uc3QgcmVjb3JkID0gc3luY1RyYW1wb2xpbmUoXG4gICAgICAgIGNob29zZU1vZHVsZURlc2NyaXB0b3IsXG4gICAgICAgIHtcbiAgICAgICAgICBjYW5kaWRhdGVzLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICAgICAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgICAgIG1vZHVsZURlc2NyaXB0b3JzLFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgcGFja2FnZVNvdXJjZXMsXG4gICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICBhcmNoaXZlT25seSxcbiAgICAgICAgICBzb3VyY2VNYXBIb29rLFxuICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1heWJlUmVhZDogbWF5YmVSZWFkTm93LFxuICAgICAgICAgIHBhcnNlLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhpdE1vZHVsZUltcG9ydE5vd0hvb2spIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgZXhpdFJlY29yZCA9IGV4aXRNb2R1bGVJbXBvcnROb3dIb29rKFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFleGl0UmVjb3JkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW1wb3J0IG1vZHVsZTogJHtxKG1vZHVsZVNwZWNpZmllcil9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpdFJlY29yZDtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGltcG9ydCBtb2R1bGU6ICR7cShcbiAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICl9OyB0cnkgcHJvdmlkaW5nIGFuIGltcG9ydE5vd0hvb2tgLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGltcG9ydE5vd0hvb2s7XG4gIH07XG4gIHJldHVybiBtYWtlSW1wb3J0Tm93SG9vaztcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiOlsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciJdLCJtYWtlSW1wb3J0SG9va01ha2VyIjpbIm1ha2VJbXBvcnRIb29rTWFrZXIiXSwibWFrZUltcG9ydE5vd0hvb2tNYWtlciI6WyJtYWtlSW1wb3J0Tm93SG9va01ha2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALJuhOsuAwAALgMAACsAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9qc29uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJwYXJzZUxvY2F0ZWRKc29uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwYXJzZUxvY2F0ZWRKc29uID0gKHNvdXJjZSwgbG9jYXRpb24pID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzb3VyY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICB0aHJvdyBTeW50YXhFcnJvcihgQ2Fubm90IHBhcnNlIEpTT04gZnJvbSAke2xvY2F0aW9ufSwgJHtlcnJvcn1gKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07JGjNj19vbmNlLnBhcnNlTG9jYXRlZEpzb24ocGFyc2VMb2NhdGVkSnNvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUxvY2F0ZWRKc29uIjpbInBhcnNlTG9jYXRlZEpzb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVF1zgY8lAACPJQAAKwAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2xpbmsuanN7ImltcG9ydHMiOlsiLi9tYXAtcGFyc2VyLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImFzc2VtYmxlIiwibGluayJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VNYXBQYXJzZXJzLHJlc29sdmVGYWxsYmFjayxBVFRFTlVBVE9SU19DT01QQVJUTUVOVCxhdHRlbnVhdGVHbG9iYWxzLGVuZm9yY2VNb2R1bGVQb2xpY3ksbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFwLXBhcnNlci5qc1wiLCBbW1wibWFrZU1hcFBhcnNlcnNcIixbJGjNj19hID0+IChtYWtlTWFwUGFyc2VycyA9ICRozY9fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJyZXNvbHZlXCIsWyRozY9fYSA9PiAocmVzb2x2ZUZhbGxiYWNrID0gJGjNj19hKV1dXV0sW1wiLi9wb2xpY3kuanNcIiwgW1tcIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXCIsWyRozY9fYSA9PiAoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQgPSAkaM2PX2EpXV0sW1wiYXR0ZW51YXRlR2xvYmFsc1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZUdsb2JhbHMgPSAkaM2PX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLFskaM2PX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaM2PX2EpXV0sW1wibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlclwiLFskaM2PX2EgPT4gKG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgYXNzaWduLCBjcmVhdGUsIGVudHJpZXMsIGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBoYXNPd25Qcm9wZXJ0eSB9ID0gT2JqZWN0LnByb3RvdHlwZTtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGFsbFNldHRsZWQgfSA9IFByb21pc2U7XG5cbi8qXG5cblxuICovXG5jb25zdCBwcm9taXNlQWxsU2V0dGxlZCA9IGFsbFNldHRsZWQuYmluZChQcm9taXNlKTtcblxuY29uc3QgZGVmYXVsdENvbXBhcnRtZW50ID0gQ29tcGFydG1lbnQ7XG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gYXBwbHkoaGFzT3duUHJvcGVydHksIG9iamVjdCwgW2tleV0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgdHJpbU1vZHVsZVNwZWNpZmllclByZWZpeCA9IChtb2R1bGVTcGVjaWZpZXIsIHByZWZpeCkgPT4ge1xuICBpZiAobW9kdWxlU3BlY2lmaWVyID09PSBwcmVmaXgpIHtcbiAgICByZXR1cm4gJy4nO1xuICB9XG4gIGlmIChtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aChgJHtwcmVmaXh9L2ApKSB7XG4gICAgcmV0dXJuIGAuLyR7bW9kdWxlU3BlY2lmaWVyLnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKX1gO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlTW9kdWxlTWFwSG9vayA9IChcbiAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICBjb21wYXJ0bWVudHMsXG4gIGNvbXBhcnRtZW50TmFtZSxcbiAgbW9kdWxlRGVzY3JpcHRvcnMsXG4gIHNjb3BlRGVzY3JpcHRvcnMsXG4pID0+IHtcbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBtb2R1bGVNYXBIb29rID0gbW9kdWxlU3BlY2lmaWVyID0+IHtcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucmV0YWluZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgbW9kdWxlRGVzY3JpcHRvciA9IG1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl07XG4gICAgaWYgKG1vZHVsZURlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbW9kdWxlRGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qge1xuICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50TmFtZSA9IGNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgbW9kdWxlOiBmb3JlaWduTW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBleGl0LFxuICAgICAgfSA9IG1vZHVsZURlc2NyaXB0b3I7XG4gICAgICBpZiAoZXhpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vXG4gICAgICB9XG4gICAgICBpZiAoZm9yZWlnbk1vZHVsZVNwZWNpZmllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGlmICghbW9kdWxlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4vJykpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50RGVzY3JpcHRvciwge1xuICAgICAgICAgICAgZXhpdDogZmFsc2UsXG4gICAgICAgICAgICBlcnJvckhpbnQ6XG4gICAgICAgICAgICAgICdUaGlzIGNoZWNrIHNob3VsZCBub3QgYmUgcmVhY2hhYmxlLiBJZiB5b3Ugc2VlIHRoaXMgZXJyb3IsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3JlaWduQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG4gICAgICAgIGlmIChmb3JlaWduQ29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbiAgICAgICAgICAgICAgZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICAgICl9fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBhcnRtZW50OiBmb3JlaWduQ29tcGFydG1lbnQsXG4gICAgICAgICAgbmFtZXNwYWNlOiBmb3JlaWduTW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmb3IgKGNvbnN0IFtzY29wZVByZWZpeCwgc2NvcGVEZXNjcmlwdG9yXSBvZiBlbnRyaWVzKHNjb3BlRGVzY3JpcHRvcnMpKSB7XG4gICAgICBjb25zdCBmb3JlaWduTW9kdWxlU3BlY2lmaWVyID0gdHJpbU1vZHVsZVNwZWNpZmllclByZWZpeChcbiAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBzY29wZVByZWZpeCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChmb3JlaWduTW9kdWxlU3BlY2lmaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeyBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50TmFtZSB9ID0gc2NvcGVEZXNjcmlwdG9yO1xuICAgICAgICBpZiAoZm9yZWlnbkNvbXBhcnRtZW50TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGltcG9ydCBmcm9tIHNjb3BlICR7c2NvcGVQcmVmaXh9IGR1ZSB0byBtaXNzaW5nIFwiY29tcGFydG1lbnRcIiBwcm9wZXJ0eWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3JlaWduQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG4gICAgICAgIGlmIChmb3JlaWduQ29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbiAgICAgICAgICAgICAgZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShzY29wZVByZWZpeCwgY29tcGFydG1lbnREZXNjcmlwdG9yLCB7XG4gICAgICAgICAgZXhpdDogZmFsc2UsXG4gICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsaW5raW5nLiAke3EoXG4gICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgKX0gaXMgcGFydCBvZiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCByZXNvbHZlcyB0byAke3EoXG4gICAgICAgICAgICBmb3JlaWduQ29tcGFydG1lbnROYW1lLFxuICAgICAgICAgICl9LmAsXG4gICAgICAgIH0pO1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBtb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdID0ge1xuICAgICAgICAgIHJldGFpbmVkOiB0cnVlLFxuICAgICAgICAgIGNvbXBhcnRtZW50OiBmb3JlaWduQ29tcGFydG1lbnROYW1lLFxuICAgICAgICAgIG1vZHVsZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50LFxuICAgICAgICAgIG5hbWVzcGFjZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICByZXR1cm4gbW9kdWxlTWFwSG9vaztcbn07XG5cbi8qXG5cbiAqL1xuY29uc3QgaW1wb3NzaWJsZUltcG9ydE5vd0hvb2tNYWtlciA9ICgpID0+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGltcG9zc2libGVJbXBvcnROb3dIb29rKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZWQgcmVhZCBwb3dlcnMgZG8gbm90IHN1cHBvcnQgZHluYW1pYyByZXF1aXJlcycpO1xuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgbGluayA9IChcbiAgeyBlbnRyeSwgY29tcGFydG1lbnRzOiBjb21wYXJ0bWVudERlc2NyaXB0b3JzIH0sXG4gIG9wdGlvbnMsXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIHJlc29sdmUgPSByZXNvbHZlRmFsbGJhY2ssXG4gICAgbWFrZUltcG9ydEhvb2ssXG4gICAgbWFrZUltcG9ydE5vd0hvb2sgPSBpbXBvc3NpYmxlSW1wb3J0Tm93SG9va01ha2VyLFxuICAgIHBhcnNlckZvckxhbmd1YWdlOiBwYXJzZXJGb3JMYW5ndWFnZU9wdGlvbiA9IHt9LFxuICAgIGdsb2JhbHMgPSB7fSxcbiAgICB0cmFuc2Zvcm1zID0gW10sXG4gICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICBfX3NoaW1UcmFuc2Zvcm1zX18gPSBbXSxcbiAgICBfX25hdGl2ZV9fID0gZmFsc2UsXG4gICAgYXJjaGl2ZU9ubHkgPSBmYWxzZSxcbiAgICBDb21wYXJ0bWVudCA9IGRlZmF1bHRDb21wYXJ0bWVudCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgeyBjb21wYXJ0bWVudDogZW50cnlDb21wYXJ0bWVudE5hbWUgfSA9IGVudHJ5O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb21wYXJ0bWVudHMgPSBjcmVhdGUobnVsbCk7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXR0ZW51YXRvcnMgPSBtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKFxuICAgIGNvbXBhcnRtZW50cyxcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICApO1xuXG4gIGNvbnN0IHBlbmRpbmdKb2JzID0gW107XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcGFyc2VyRm9yTGFuZ3VhZ2UgPSBmcmVlemUoXG4gICAgYXNzaWduKGNyZWF0ZShudWxsKSwgcGFyc2VyRm9yTGFuZ3VhZ2VPcHRpb24pLFxuICApO1xuXG4gIGNvbnN0IG1hcFBhcnNlcnMgPSBtYWtlTWFwUGFyc2Vycyh7XG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbY29tcGFydG1lbnROYW1lLCBjb21wYXJ0bWVudERlc2NyaXB0b3JdIG9mIGVudHJpZXMoXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbiAgKSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgbmFtZSxcbiAgICAgIHBhcnNlcnM6IGxhbmd1YWdlRm9yRXh0ZW5zaW9uID0ge30sXG4gICAgICB0eXBlczogbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIgPSB7fSxcbiAgICB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHsgc2NvcGVzOiBfc2NvcGVzLCBtb2R1bGVzOiBfbW9kdWxlcyB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbnN0IG1vZHVsZXMgPSBfbW9kdWxlcyB8fCBjcmVhdGUobnVsbCk7XG4gICAgY29uc3Qgc2NvcGVzID0gX3Njb3BlcyB8fCBjcmVhdGUobnVsbCk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXMgPSBtb2R1bGVzO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhcnNlID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgICAgbWFwUGFyc2VycyhsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpXG4gICAgKTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBzaG91bGREZWZlckVycm9yID0gbGFuZ3VhZ2UgPT4ge1xuICAgICAgaWYgKGxhbmd1YWdlICYmIGhhcyhwYXJzZXJGb3JMYW5ndWFnZSwgbGFuZ3VhZ2UpKSB7XG4gICAgICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdKVxuICAgICAgICAgIC5oZXVyaXN0aWNJbXBvcnRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgcmVzb2x2ZUhvb2sgPSByZXNvbHZlO1xuICAgIGNvbnN0IGltcG9ydEhvb2sgPSBtYWtlSW1wb3J0SG9vayh7XG4gICAgICBwYWNrYWdlTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcGFja2FnZU5hbWU6IG5hbWUsXG4gICAgICBhdHRlbnVhdG9ycyxcbiAgICAgIHBhcnNlLFxuICAgICAgc2hvdWxkRGVmZXJFcnJvcixcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGltcG9ydE5vd0hvb2sgPSBtYWtlSW1wb3J0Tm93SG9vayh7XG4gICAgICBwYWNrYWdlTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcGFja2FnZU5hbWU6IG5hbWUsXG4gICAgICBwYXJzZSxcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1vZHVsZU1hcEhvb2sgPSBtYWtlTW9kdWxlTWFwSG9vayhcbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgIGNvbXBhcnRtZW50TmFtZSxcbiAgICAgIG1vZHVsZXMsXG4gICAgICBzY29wZXMsXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KHtcbiAgICAgIG5hbWU6IGxvY2F0aW9uLFxuICAgICAgcmVzb2x2ZUhvb2ssXG4gICAgICBpbXBvcnRIb29rLFxuICAgICAgaW1wb3J0Tm93SG9vayxcbiAgICAgIG1vZHVsZU1hcEhvb2ssXG4gICAgICB0cmFuc2Zvcm1zLFxuICAgICAgX19zaGltVHJhbnNmb3Jtc19fLFxuICAgICAgX19vcHRpb25zX186IHRydWUsXG4gICAgICBfX25hdGl2ZV9fLFxuICAgIH0pO1xuXG4gICAgaWYgKCFhcmNoaXZlT25seSkge1xuICAgICAgYXR0ZW51YXRlR2xvYmFscyhcbiAgICAgICAgY29tcGFydG1lbnQuZ2xvYmFsVGhpcyxcbiAgICAgICAgZ2xvYmFscyxcbiAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbiAgICAgICAgYXR0ZW51YXRvcnMsXG4gICAgICAgIHBlbmRpbmdKb2JzLFxuICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29tcGFydG1lbnRzW2NvbXBhcnRtZW50TmFtZV0gPSBjb21wYXJ0bWVudDtcbiAgfVxuXG4gIGNvbnN0IGNvbXBhcnRtZW50ID0gY29tcGFydG1lbnRzW2VudHJ5Q29tcGFydG1lbnROYW1lXTtcbiAgaWYgKGNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3QgYXNzZW1ibGUgY29tcGFydG1lbnQgZ3JhcGggYmVjYXVzZSB0aGUgcm9vdCBjb21wYXJ0bWVudCBuYW1lZCAke3EoXG4gICAgICAgIGVudHJ5Q29tcGFydG1lbnROYW1lLFxuICAgICAgKX0gaXMgbWlzc2luZyBmcm9tIHRoZSBjb21wYXJ0bWVudCBtYXBgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYXR0ZW51YXRvcnNDb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF07XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wYXJ0bWVudCxcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgYXR0ZW51YXRvcnNDb21wYXJ0bWVudCxcbiAgICBwZW5kaW5nSm9ic1Byb21pc2U6IHByb21pc2VBbGxTZXR0bGVkKHBlbmRpbmdKb2JzKS50aGVuKFxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyByZXN1bHRzID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gcmVzdWx0c1xuICAgICAgICAgIC5maWx0ZXIocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIHJlc3VsdCA9PlxuICAgICAgICAgICAgICByZXN1bHQucmVhc29uLFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYEdsb2JhbHMgYXR0ZW51YXRpb24gZXJyb3JzOiAke2Vycm9yc1xuICAgICAgICAgICAgICAubWFwKGVycm9yID0+IGVycm9yLm1lc3NhZ2UpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApLFxuICB9O1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5saW5rKGxpbmspO1xuICAgICAgIGNvbnN0IGFzc2VtYmxlID0gKGNvbXBhcnRtZW50TWFwLCBvcHRpb25zKSA9PlxuICBsaW5rKGNvbXBhcnRtZW50TWFwLCBvcHRpb25zKS5jb21wYXJ0bWVudDskaM2PX29uY2UuYXNzZW1ibGUoYXNzZW1ibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibGluayI6WyJsaW5rIl0sImFzc2VtYmxlIjpbImFzc2VtYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANuM78w8FwAAPBcAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9tYXAtcGFyc2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3RyYW1wb2xpbmUiLCIuL2V4dGVuc2lvbi5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXBQYXJzZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgc3luY1RyYW1wb2xpbmUsYXN5bmNUcmFtcG9saW5lLHBhcnNlRXh0ZW5zaW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vdHJhbXBvbGluZVwiLCBbW1wic3luY1RyYW1wb2xpbmVcIixbJGjNj19hID0+IChzeW5jVHJhbXBvbGluZSA9ICRozY9fYSldXSxbXCJhc3luY1RyYW1wb2xpbmVcIixbJGjNj19hID0+IChhc3luY1RyYW1wb2xpbmUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4dGVuc2lvbi5qc1wiLCBbW1wicGFyc2VFeHRlbnNpb25cIixbJGjNj19hID0+IChwYXJzZUV4dGVuc2lvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzLCBrZXlzLCBoYXNPd25Qcm9wZXJ0eSwgdmFsdWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuLy9cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBba2V5XSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlID0gZXh0ZW5zaW9uID0+IGV4dGVuc2lvbiAhPT0gJ2pzJztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFeHRlbnNpb25QYXJzZXIgPSAoXG4gIHByZWZlclN5bmNocm9ub3VzLFxuICBsYW5ndWFnZUZvckV4dGVuc2lvbixcbiAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gIHBhcnNlckZvckxhbmd1YWdlLFxuICBtb2R1bGVUcmFuc2Zvcm1zLFxuICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgdHJhbnNmb3JtcztcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgZnVuY3Rpb24qIGdldFBhcnNlckdlbmVyYXRvcihcbiAgICBieXRlcyxcbiAgICBzcGVjaWZpZXIsXG4gICAgbG9jYXRpb24sXG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIG9wdGlvbnMsXG4gICkge1xuICAgIC8qICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBsYW5ndWFnZTtcbiAgICBjb25zdCBleHRlbnNpb24gPSBwYXJzZUV4dGVuc2lvbihsb2NhdGlvbik7XG5cbiAgICBpZiAoXG4gICAgICAhZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlKGV4dGVuc2lvbikgJiZcbiAgICAgIGhhcyhsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllciwgc3BlY2lmaWVyKVxuICAgICkge1xuICAgICAgbGFuZ3VhZ2UgPSBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcltzcGVjaWZpZXJdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxhbmd1YWdlID0gbGFuZ3VhZ2VGb3JFeHRlbnNpb25bZXh0ZW5zaW9uXSB8fCBleHRlbnNpb247XG4gICAgfVxuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBzb3VyY2VNYXA7XG5cbiAgICBpZiAoaGFzKHRyYW5zZm9ybXMsIGxhbmd1YWdlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHtcbiAgICAgICAgICBieXRlcyxcbiAgICAgICAgICBwYXJzZXI6IGxhbmd1YWdlLFxuICAgICAgICAgIHNvdXJjZU1hcCxcbiAgICAgICAgfSA9IHlpZWxkIHRyYW5zZm9ybXNbbGFuZ3VhZ2VdKFxuICAgICAgICAgIGJ5dGVzLFxuICAgICAgICAgIHNwZWNpZmllcixcbiAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgc291cmNlTWFwLFxuICAgICAgICAgIH0sXG4gICAgICAgICkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBFcnJvciB0cmFuc2Zvcm1pbmcgJHtxKGxhbmd1YWdlKX0gc291cmNlIGluICR7cShsb2NhdGlvbil9OiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgeyBjYXVzZTogZXJyIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzKHBhcnNlckZvckxhbmd1YWdlLCBsYW5ndWFnZSkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHBhcnNlIG1vZHVsZSAke3NwZWNpZmllcn0gYXQgJHtsb2NhdGlvbn0sIG5vIHBhcnNlciBjb25maWd1cmVkIGZvciB0aGUgbGFuZ3VhZ2UgJHtsYW5ndWFnZX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgeyBwYXJzZSB9ID0gcGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdO1xuICAgIHJldHVybiBwYXJzZShieXRlcywgc3BlY2lmaWVyLCBsb2NhdGlvbiwgcGFja2FnZUxvY2F0aW9uLCB7XG4gICAgICBzb3VyY2VNYXAsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3Qgc3luY1BhcnNlciA9IChieXRlcywgc3BlY2lmaWVyLCBsb2NhdGlvbiwgcGFja2FnZUxvY2F0aW9uLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gc3luY1RyYW1wb2xpbmUoXG4gICAgICBnZXRQYXJzZXJHZW5lcmF0b3IsXG4gICAgICBieXRlcyxcbiAgICAgIHNwZWNpZmllcixcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICAgIGlmICgndGhlbicgaW4gcmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1N5bmMgcGFyc2VyIGNhbm5vdCByZXR1cm4gYSBUaGVuYWJsZTsgZW5zdXJlIHBhcnNlciBpcyBhY3R1YWxseSBzeW5jaHJvbm91cycsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBzeW5jUGFyc2VyLmlzU3luY1BhcnNlciA9IHRydWU7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXN5bmNQYXJzZXIgPSBhc3luYyAoXG4gICAgYnl0ZXMsXG4gICAgc3BlY2lmaWVyLFxuICAgIGxvY2F0aW9uLFxuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBvcHRpb25zLFxuICApID0+IHtcbiAgICByZXR1cm4gYXN5bmNUcmFtcG9saW5lKFxuICAgICAgZ2V0UGFyc2VyR2VuZXJhdG9yLFxuICAgICAgYnl0ZXMsXG4gICAgICBzcGVjaWZpZXIsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfTtcblxuICAvL1xuICAvL1xuICAvL1xuICBpZiAocHJlZmVyU3luY2hyb25vdXMpIHtcbiAgICB0cmFuc2Zvcm1zID0gc3luY01vZHVsZVRyYW5zZm9ybXM7XG4gICAgcmV0dXJuIHN5bmNQYXJzZXI7XG4gIH0gZWxzZSB7XG4gICAgLy9cbiAgICAvL1xuICAgIHRyYW5zZm9ybXMgPSB7XG4gICAgICAuLi5zeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIC4uLm1vZHVsZVRyYW5zZm9ybXMsXG4gICAgfTtcblxuICAgIHJldHVybiBhc3luY1BhcnNlcjtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIG1hcFBhcnNlcnMoXG4gIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gIG1vZHVsZVRyYW5zZm9ybXMgPSB7fSxcbiAgc3luY01vZHVsZVRyYW5zZm9ybXMgPSB7fSxcbiAgcHJlZmVyU3luY2hyb25vdXMgPSBmYWxzZSxcbikge1xuICBjb25zdCBsYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXMgPSBbXTtcbiAgY29uc3QgcHJvYmxlbXMgPSBbXTtcbiAgZm9yIChjb25zdCBbZXh0ZW5zaW9uLCBsYW5ndWFnZV0gb2YgZW50cmllcyhsYW5ndWFnZUZvckV4dGVuc2lvbikpIHtcbiAgICBpZiAoaGFzKHBhcnNlckZvckxhbmd1YWdlLCBsYW5ndWFnZSkpIHtcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcy5wdXNoKFtleHRlbnNpb24sIGxhbmd1YWdlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2JsZW1zLnB1c2goYCR7cShsYW5ndWFnZSl9IGZvciBleHRlbnNpb24gJHtxKGV4dGVuc2lvbil9YCk7XG4gICAgfVxuICB9XG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgRXJyb3IoYE5vIHBhcnNlciBhdmFpbGFibGUgZm9yIGxhbmd1YWdlOiAke3Byb2JsZW1zLmpvaW4oJywgJyl9YCk7XG4gIH1cbiAgcmV0dXJuIG1ha2VFeHRlbnNpb25QYXJzZXIoXG4gICAgcHJlZmVyU3luY2hyb25vdXMsXG4gICAgZnJvbUVudHJpZXMobGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzKSxcbiAgICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICBtb2R1bGVUcmFuc2Zvcm1zLFxuICAgIHN5bmNNb2R1bGVUcmFuc2Zvcm1zLFxuICApO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZU1hcFBhcnNlcnMgPSAoe1xuICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgc3luY01vZHVsZVRyYW5zZm9ybXMsXG59KSA9PiB7XG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGFzeW5jUGFyc2VGbiA9IChsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpID0+XG4gICAgbWFwUGFyc2VycyhcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICAgICAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICApO1xuXG4gIGlmIChtb2R1bGVUcmFuc2Zvcm1zICYmIGtleXMobW9kdWxlVHJhbnNmb3JtcykubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBhc3luY1BhcnNlRm47XG4gIH1cblxuICAvL1xuICAvL1xuICBpZiAodmFsdWVzKHBhcnNlckZvckxhbmd1YWdlKS5zb21lKCh7IHN5bmNocm9ub3VzIH0pID0+ICFzeW5jaHJvbm91cykpIHtcbiAgICByZXR1cm4gYXN5bmNQYXJzZUZuO1xuICB9XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgcmV0dXJuIChsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpID0+XG4gICAgbWFwUGFyc2VycyhcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICAgICAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIHRydWUsXG4gICAgKTtcbn07JGjNj19vbmNlLm1ha2VNYXBQYXJzZXJzKG1ha2VNYXBQYXJzZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXBQYXJzZXJzIjpbIm1ha2VNYXBQYXJzZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJscmtbPCwAAzwsAADwAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImpvaW4iLCJyZWxhdGl2aXplIiwicmVzb2x2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuICovXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzb2x2ZSA9IChzb2x1dGlvbiwgcHJvYmxlbSkgPT4ge1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcHJvYmxlbSkge1xuICAgIGlmIChwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJycpIHtcbiAgICAgIC8vXG4gICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICBpZiAoc29sdXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNvbHV0aW9uLnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb2x1dGlvbi5wdXNoKHBhcnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHJlc29sdmUgPSAoc3BlYywgcmVmZXJyZXIpID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcbiAgcmVmZXJyZXIgPSBTdHJpbmcocmVmZXJyZXIgfHwgJycpO1xuXG4gIGlmIChzcGVjLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBub3QgYmVnaW4gd2l0aCBcIi9cImApO1xuICB9XG4gIGlmICghcmVmZXJyZXIuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgcmVmZXJyZXIgJHtxKHJlZmVycmVyKX0gbXVzdCBiZWdpbiB3aXRoIFwiLi9cImApO1xuICB9XG5cbiAgY29uc3Qgc3BlY1BhcnRzID0gc3BlYy5zcGxpdCgnLycpO1xuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBjb25zdCBwcm9ibGVtID0gW107XG4gIGlmIChzcGVjUGFydHNbMF0gPT09ICcuJyB8fCBzcGVjUGFydHNbMF0gPT09ICcuLicpIHtcbiAgICBjb25zdCByZWZlcnJlclBhcnRzID0gcmVmZXJyZXIuc3BsaXQoJy8nKTtcbiAgICBwcm9ibGVtLnB1c2goLi4ucmVmZXJyZXJQYXJ0cyk7XG4gICAgcHJvYmxlbS5wb3AoKTtcbiAgICBzb2x1dGlvbi5wdXNoKCcuJyk7XG4gIH1cbiAgcHJvYmxlbS5wdXNoKC4uLnNwZWNQYXJ0cyk7XG5cbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgcHJvYmxlbSkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gdmlhIHJlZmVycmVyICR7cShcbiAgICAgICAgcmVmZXJyZXIsXG4gICAgICApfSBtdXN0IG5vdCB0cmF2ZXJzZSBiZWhpbmQgYW4gZW1wdHkgcGF0aGAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzb2x1dGlvbi5qb2luKCcvJyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5yZXNvbHZlKHJlc29sdmUpO1xuICAgICAgIGNvbnN0IGpvaW4gPSAoYmFzZSwgc3BlYykgPT4ge1xuICBzcGVjID0gU3RyaW5nKHNwZWMgfHwgJycpO1xuICBiYXNlID0gU3RyaW5nKGJhc2UgfHwgJycpO1xuXG4gIGNvbnN0IHNwZWNQYXJ0cyA9IHNwZWMuc3BsaXQoJy8nKTtcbiAgY29uc3QgYmFzZVBhcnRzID0gYmFzZS5zcGxpdCgnLycpO1xuXG4gIGlmIChzcGVjUGFydHMubGVuZ3RoID4gMSAmJiBzcGVjUGFydHNbMF0gPT09ICcnKSB7XG4gICAgdGhyb3cgRXJyb3IoYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBzdGFydCB3aXRoIFwiL1wiYCk7XG4gIH1cbiAgaWYgKGJhc2VQYXJ0c1swXSA9PT0gJy4nIHx8IGJhc2VQYXJ0c1swXSA9PT0gJy4uJykge1xuICAgIHRocm93IEVycm9yKGBFeHRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShiYXNlKX0gbXVzdCBiZSBhYnNvbHV0ZWApO1xuICB9XG4gIGlmIChzcGVjUGFydHNbMF0gIT09ICcuJykge1xuICAgIHRocm93IEVycm9yKGBJbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBiZSByZWxhdGl2ZWApO1xuICB9XG5cbiAgY29uc3Qgc29sdXRpb24gPSBbXTtcbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgc3BlY1BhcnRzKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSB2aWEgYmFzZSAke3EoXG4gICAgICAgIGJhc2UsXG4gICAgICApfSBtdXN0IG5vdCByZWZlciB0byBhIG1vZHVsZSBvdXRzaWRlIG9mIHRoZSBiYXNlYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFtiYXNlLCAuLi5zb2x1dGlvbl0uam9pbignLycpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5qb2luKGpvaW4pO1xuICAgICAgIGNvbnN0IHJlbGF0aXZpemUgPSBzcGVjID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcblxuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBpZiAoIXNvbHZlKHNvbHV0aW9uLCBzcGVjLnNwbGl0KCcvJykpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFsnLicsIC4uLnNvbHV0aW9uXS5qb2luKCcvJyk7XG59OyRozY9fb25jZS5yZWxhdGl2aXplKHJlbGF0aXZpemUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVzb2x2ZSI6WyJyZXNvbHZlIl0sImpvaW4iOlsiam9pbiJdLCJyZWxhdGl2aXplIjpbInJlbGF0aXZpemUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuCqLH04FAABOBQAAMgAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLWJ5dGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VCeXRlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VCeXRlcyA9IChieXRlcywgX3NwZWNpZmllciwgX2xvY2F0aW9uLCBfcGFja2FnZUxvY2F0aW9uKSA9PiB7XG4gIC8vXG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuICBjb25zdCBieXRlc1ZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICBieXRlc1ZpZXcuc2V0KGJ5dGVzKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGltcG9ydHMgPSBmcmVlemUoW10pO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBleHBvcnRzID0+IHtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSBidWZmZXI7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJzZXI6ICdieXRlcycsXG4gICAgYnl0ZXMsXG4gICAgcmVjb3JkOiBmcmVlemUoe1xuICAgICAgaW1wb3J0cyxcbiAgICAgIGV4cG9ydHM6IGZyZWV6ZShbJ2RlZmF1bHQnXSksXG4gICAgICBleGVjdXRlOiBmcmVlemUoZXhlY3V0ZSksXG4gICAgfSksXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZUJ5dGVzKHBhcnNlQnl0ZXMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlQnl0ZXMsXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VCeXRlcyI6WyJwYXJzZUJ5dGVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHU1Ym6pEwAAqRMAAEYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzeyJpbXBvcnRzIjpbIi4vcG93ZXJzLmpzIl0sImV4cG9ydHMiOlsiZ2V0TW9kdWxlUGF0aHMiLCJ3cmFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMsaXNSZWFkTm93UG93ZXJzOyRozY9faW1wb3J0cyhbW1wiLi9wb3dlcnMuanNcIiwgW1tcImZpbmRJbnZhbGlkUmVhZE5vd1Bvd2Vyc1Byb3BzXCIsWyRozY9fYSA9PiAoZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMgPSAkaM2PX2EpXV0sW1wiaXNSZWFkTm93UG93ZXJzXCIsWyRozY9fYSA9PiAoaXNSZWFkTm93UG93ZXJzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGZyZWV6ZSwga2V5cywgY3JlYXRlLCBoYXNPd25Qcm9wZXJ0eSwgZGVmaW5lUHJvcGVydHkgfSA9IE9iamVjdDtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBba2V5XSk7XG5cbi8qXG5cbiAqL1xuY29uc3Qgbm9UcmFpbGluZ1NsYXNoID0gcGF0aCA9PiB7XG4gIGNvbnN0IGwgPSBwYXRoLmxlbmd0aCAtIDE7XG4gIHJldHVybiBwYXRoW2xdID09PSAnXFxcXCcgfHwgcGF0aFtsXSA9PT0gJy8nID8gcGF0aC5zbGljZSgwLCAtMSkgOiBwYXRoO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0TW9kdWxlUGF0aHMgPSAocmVhZFBvd2VycywgbG9jYXRpb24pID0+IHtcbiAgaWYgKFxuICAgIHJlYWRQb3dlcnMgJiZcbiAgICB0eXBlb2YgcmVhZFBvd2VycyAhPT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aFxuICApIHtcbiAgICBsZXQgZmlsZW5hbWUgPSBsb2NhdGlvbjtcbiAgICBsZXQgZGlybmFtZTtcbiAgICB0cnkge1xuICAgICAgZGlybmFtZSA9IG5ldyBVUkwoJy4vJywgZmlsZW5hbWUpLmhyZWY7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZW5hbWU6IG51bGwsXG4gICAgICAgIGRpcm5hbWU6IG51bGwsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZpbGVuYW1lID0gcmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGZpbGVuYW1lKS50b1N0cmluZygpO1xuICAgIGRpcm5hbWUgPSBub1RyYWlsaW5nU2xhc2gocmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGRpcm5hbWUpLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgZGlybmFtZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlbmFtZTogbnVsbCxcbiAgICAgIGRpcm5hbWU6IG51bGwsXG4gICAgfTtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5nZXRNb2R1bGVQYXRocyhnZXRNb2R1bGVQYXRocyk7XG4gICAgICAgY29uc3Qgd3JhcCA9ICh7XG4gIG1vZHVsZUVudmlyb25tZW50UmVjb3JkLFxuICBjb21wYXJ0bWVudCxcbiAgcmVzb2x2ZWRJbXBvcnRzLFxuICBsb2NhdGlvbixcbiAgcmVhZFBvd2Vycyxcbn0pID0+IHtcbiAgLy9cbiAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdCA9IGNyZWF0ZShcbiAgICBjb21wYXJ0bWVudC5nbG9iYWxUaGlzLk9iamVjdC5wcm90b3R5cGUsXG4gICk7XG5cbiAgLy9cbiAgLy9cbiAgY29uc3QgcHJvbW90ZVRvTmFtZWRFeHBvcnQgPSAocHJvcCwgdmFsdWUpID0+IHtcbiAgICAvL1xuICAgIGlmIChwcm9wICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgIG1vZHVsZUVudmlyb25tZW50UmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJlZGVmaW5lZCA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBvcmlnaW5hbEV4cG9ydHMgPSBuZXcgUHJveHkobW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdCwge1xuICAgIHNldChfdGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgcHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCwgdmFsdWUpO1xuICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdFtwcm9wXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3AsIGRlc2NyaXB0b3IpIHtcbiAgICAgIGlmIChoYXMoZGVzY3JpcHRvciwgJ3ZhbHVlJykpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwgZGVzY3JpcHRvcik7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJlZGVmaW5lZC5hZGQocHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBtb2R1bGUgPSB7IGV4cG9ydHM6IG9yaWdpbmFsRXhwb3J0cyB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlcXVpcmUgPSBpbXBvcnRTcGVjaWZpZXIgPT4ge1xuICAgIC8vXG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBsZXQgbmFtZXNwYWNlO1xuXG4gICAgaWYgKCFoYXMocmVzb2x2ZWRJbXBvcnRzLCBpbXBvcnRTcGVjaWZpZXIpKSB7XG4gICAgICBpZiAoaXNSZWFkTm93UG93ZXJzKHJlYWRQb3dlcnMpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IGNvbXBhcnRtZW50LmltcG9ydE5vdyhpbXBvcnRTcGVjaWZpZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFByb3BzID0gZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMocmVhZFBvd2Vycykuc29ydCgpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFN5bmNocm9ub3VzIHJlYWRQb3dlcnMgcmVxdWlyZWQgZm9yIGR5bmFtaWMgaW1wb3J0IG9mICR7YXNzZXJ0LnF1b3RlKGltcG9ydFNwZWNpZmllcil9OyBtaXNzaW5nIG9yIGludmFsaWQgcHJvcChzKTogJHtpbnZhbGlkUHJvcHMuam9pbignLCAnKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lc3BhY2UgPSBjb21wYXJ0bWVudC5pbXBvcnROb3cocmVzb2x2ZWRJbXBvcnRzW2ltcG9ydFNwZWNpZmllcl0pO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoaGFzKG5hbWVzcGFjZSwgJ2RlZmF1bHQnKSkge1xuICAgICAgcmV0dXJuIG5hbWVzcGFjZS5kZWZhdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmFtZXNwYWNlO1xuICAgIH1cbiAgfTtcbiAgaWYgKHR5cGVvZiByZWFkUG93ZXJzID09PSAnb2JqZWN0JyAmJiByZWFkUG93ZXJzLnJlcXVpcmVSZXNvbHZlKSB7XG4gICAgY29uc3QgeyByZXF1aXJlUmVzb2x2ZSB9ID0gcmVhZFBvd2VycztcbiAgICByZXF1aXJlLnJlc29sdmUgPSBmcmVlemUoKHNwZWNpZmllciwgb3B0aW9ucykgPT5cbiAgICAgIHJlcXVpcmVSZXNvbHZlKGxvY2F0aW9uLCBzcGVjaWZpZXIsIG9wdGlvbnMpLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmVxdWlyZS5yZXNvbHZlID0gZnJlZXplKHNwZWNpZmllciA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlICcke3NwZWNpZmllcn0nXFxuQWRkIHJlcXVpcmVSZXNvbHZlIHRvIEVuZG8gQ29tcGFydG1lbnQgTWFwcGVyIHJlYWRQb3dlcnMuYCxcbiAgICAgICk7XG4gICAgICBkZWZpbmVQcm9wZXJ0eShlcnJvciwgJ2NvZGUnLCB7IHZhbHVlOiAnTU9EVUxFX05PVF9GT1VORCcgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgfVxuXG4gIGZyZWV6ZShyZXF1aXJlKTtcblxuICBjb25zdCBhZnRlckV4ZWN1dGUgPSAoKSA9PiB7XG4gICAgY29uc3QgZmluYWxFeHBvcnRzID0gbW9kdWxlLmV4cG9ydHM7IC8vXG4gICAgY29uc3QgZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW4gPSBmaW5hbEV4cG9ydHMgIT09IG9yaWdpbmFsRXhwb3J0cztcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW4pIHtcbiAgICAgIG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQgPSBmaW5hbEV4cG9ydHM7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2Yga2V5cyhtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0IHx8IHt9KSkge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF0gPSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiByZWRlZmluZWQpIHtcbiAgICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF0gPSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG1vZHVsZSxcbiAgICBtb2R1bGVFeHBvcnRzOiBvcmlnaW5hbEV4cG9ydHMsXG4gICAgYWZ0ZXJFeGVjdXRlLFxuICAgIHJlcXVpcmUsXG4gIH07XG59OyRozY9fb25jZS53cmFwKHdyYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TW9kdWxlUGF0aHMiOlsiZ2V0TW9kdWxlUGF0aHMiXSwid3JhcCI6WyJ3cmFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH6/VuZEBQAARAUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1qc29uLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZUpzb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXJzZUxvY2F0ZWRKc29uOyRozY9faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VKc29uID0gKGJ5dGVzLCBfc3BlY2lmaWVyLCBsb2NhdGlvbiwgX3BhY2thZ2VMb2NhdGlvbikgPT4ge1xuICBjb25zdCBzb3VyY2UgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGltcG9ydHMgPSBmcmVlemUoW10pO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBleHBvcnRzID0+IHtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSBwYXJzZUxvY2F0ZWRKc29uKHNvdXJjZSwgbG9jYXRpb24pO1xuICB9O1xuICByZXR1cm4ge1xuICAgIHBhcnNlcjogJ2pzb24nLFxuICAgIGJ5dGVzLFxuICAgIHJlY29yZDogZnJlZXplKHtcbiAgICAgIGltcG9ydHMsXG4gICAgICBleHBvcnRzOiBmcmVlemUoWydkZWZhdWx0J10pLFxuICAgICAgZXhlY3V0ZTogZnJlZXplKGV4ZWN1dGUpLFxuICAgIH0pLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VKc29uKHBhcnNlSnNvbik7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VKc29uLFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlSnNvbiI6WyJwYXJzZUpzb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAk1bSVB4IAAAeCAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1janMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIiwiLi9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlQ2pzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VMb2NhdGVkSnNvbix3cmFwLGdldE1vZHVsZVBhdGhzOyRozY9faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1wiLCBbW1wid3JhcFwiLFskaM2PX2EgPT4gKHdyYXAgPSAkaM2PX2EpXV0sW1wiZ2V0TW9kdWxlUGF0aHNcIixbJGjNj19hID0+IChnZXRNb2R1bGVQYXRocyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VQcmVDanMgPSAoXG4gIGJ5dGVzLFxuICBfc3BlY2lmaWVyLFxuICBsb2NhdGlvbixcbiAgX3BhY2thZ2VMb2NhdGlvbixcbiAgeyByZWFkUG93ZXJzIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbiAgY29uc3QgeyBzb3VyY2UsIGltcG9ydHMsIGV4cG9ydHMsIHJlZXhwb3J0cyB9ID0gcGFyc2VMb2NhdGVkSnNvbihcbiAgICB0ZXh0LFxuICAgIGxvY2F0aW9uLFxuICApO1xuXG4gIGNvbnN0IHsgZmlsZW5hbWUsIGRpcm5hbWUgfSA9IGdldE1vZHVsZVBhdGhzKHJlYWRQb3dlcnMsIGxvY2F0aW9uKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgZXhlY3V0ZSA9IChtb2R1bGVFbnZpcm9ubWVudFJlY29yZCwgY29tcGFydG1lbnQsIHJlc29sdmVkSW1wb3J0cykgPT4ge1xuICAgIGNvbnN0IGZ1bmN0b3IgPSBjb21wYXJ0bWVudC5ldmFsdWF0ZShzb3VyY2UpO1xuXG4gICAgY29uc3QgeyByZXF1aXJlLCBtb2R1bGVFeHBvcnRzLCBtb2R1bGUsIGFmdGVyRXhlY3V0ZSB9ID0gd3JhcCh7XG4gICAgICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZCxcbiAgICAgIGNvbXBhcnRtZW50LFxuICAgICAgcmVzb2x2ZWRJbXBvcnRzLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByZWFkUG93ZXJzLFxuICAgIH0pO1xuXG4gICAgLy9cbiAgICBmdW5jdG9yLmNhbGwoXG4gICAgICBtb2R1bGVFeHBvcnRzLFxuICAgICAgcmVxdWlyZSxcbiAgICAgIG1vZHVsZUV4cG9ydHMsXG4gICAgICBtb2R1bGUsXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIGRpcm5hbWUsXG4gICAgKTtcblxuICAgIGFmdGVyRXhlY3V0ZSgpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAncHJlLWNqcy1qc29uJyxcbiAgICBieXRlcyxcbiAgICByZWNvcmQ6IHtcbiAgICAgIGltcG9ydHMsXG4gICAgICByZWV4cG9ydHMsXG4gICAgICBleHBvcnRzLFxuICAgICAgZXhlY3V0ZSxcbiAgICB9LFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VQcmVDanMocGFyc2VQcmVDanMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlUHJlQ2pzLFxuICBoZXVyaXN0aWNJbXBvcnRzOiB0cnVlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVDanMiOlsicGFyc2VQcmVDanMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7KidoVEFAABRBQAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1tanMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlTWpzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VMb2NhdGVkSnNvbjskaM2PX2ltcG9ydHMoW1tcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLFskaM2PX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VQcmVNanMgPSAoXG4gIGJ5dGVzLFxuICBfc3BlY2lmaWVyLFxuICBsb2NhdGlvbixcbiAgX3BhY2thZ2VMb2NhdGlvbixcbiAgeyBzb3VyY2VNYXBVcmwgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHRleHQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICBjb25zdCByZWNvcmQgPSBwYXJzZUxvY2F0ZWRKc29uKHRleHQsIGxvY2F0aW9uKTtcbiAgaWYgKHNvdXJjZU1hcFVybCkge1xuICAgIC8vXG4gICAgcmVjb3JkLl9fc3luY01vZHVsZVByb2dyYW1fXyArPSBgLy8jIHNvdXJjZU1hcHBpbmdVUkw9JHtzb3VyY2VNYXBVcmx9XFxuYDtcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIHJlY29yZC5fX3N5bmNNb2R1bGVQcm9ncmFtX18gKz0gYC8vIyBzb3VyY2VVUkw9JHtsb2NhdGlvbn1cXG5gO1xuICB9XG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAncHJlLW1qcy1qc29uJyxcbiAgICBieXRlcyxcbiAgICByZWNvcmQsXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZVByZU1qcyhwYXJzZVByZU1qcyk7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VQcmVNanMsXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVNanMiOlsicGFyc2VQcmVNanMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdmA97PoEAAD6BAAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXRleHQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZVRleHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VUZXh0ID0gKGJ5dGVzLCBfc3BlY2lmaWVyLCBfbG9jYXRpb24sIF9wYWNrYWdlTG9jYXRpb24pID0+IHtcbiAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbXBvcnRzID0gZnJlZXplKFtdKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gZXhwb3J0cyA9PiB7XG4gICAgZXhwb3J0cy5kZWZhdWx0ID0gdGV4dDtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHBhcnNlcjogJ3RleHQnLFxuICAgIGJ5dGVzLFxuICAgIHJlY29yZDogZnJlZXplKHtcbiAgICAgIGltcG9ydHMsXG4gICAgICBleHBvcnRzOiBmcmVlemUoWydkZWZhdWx0J10pLFxuICAgICAgZXhlY3V0ZTogZnJlZXplKGV4ZWN1dGUpLFxuICAgIH0pLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VUZXh0KHBhcnNlVGV4dCk7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VUZXh0LFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlVGV4dCI6WyJwYXJzZVRleHQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABuT8atUYAADVGAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BvbGljeS1mb3JtYXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzc2VydFBhY2thZ2VQb2xpY3kiLCJhc3NlcnRQb2xpY3kiLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iLCJpc0FsbG93aW5nRXZlcnl0aGluZyIsImlzQXR0ZW51YXRpb25EZWZpbml0aW9uIiwicG9saWN5TG9va3VwSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBBVFRFTlVBVE9SX0tFWSA9ICdhdHRlbnVhdGUnO1xuY29uc3QgQVRURU5VQVRPUl9QQVJBTVNfS0VZID0gJ3BhcmFtcyc7XG5jb25zdCBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUgPSAnYW55JztcbmNvbnN0IFBPTElDWV9GSUVMRFNfTE9PS1VQID0gLyogICAgICAgICAgICAgICAgKi8gKFtcbiAgJ2J1aWx0aW5zJyxcbiAgJ2dsb2JhbHMnLFxuICAncGFja2FnZXMnLFxuXSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcG9saWN5TG9va3VwSGVscGVyID0gKHBhY2thZ2VQb2xpY3ksIGZpZWxkLCBpdGVtTmFtZSkgPT4ge1xuICBpZiAoIVBPTElDWV9GSUVMRFNfTE9PS1VQLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGZpZWxkICR7cShmaWVsZCl9YCk7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBwYWNrYWdlUG9saWN5ICE9PSAnb2JqZWN0JyB8fFxuICAgIHBhY2thZ2VQb2xpY3kgPT09IG51bGwgfHxcbiAgICAhcGFja2FnZVBvbGljeVtmaWVsZF1cbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHBhY2thZ2VQb2xpY3lbZmllbGRdID09PSBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICBwYWNrYWdlUG9saWN5W2ZpZWxkXVxuICApO1xuICBpZiAoaXRlbU5hbWUgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWVbaXRlbU5hbWVdO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5wb2xpY3lMb29rdXBIZWxwZXIocG9saWN5TG9va3VwSGVscGVyKTtcbiAgICAgICBjb25zdCBpc0FsbG93aW5nRXZlcnl0aGluZyA9IHBvbGljeVZhbHVlID0+XG4gIHBvbGljeVZhbHVlID09PSBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUU7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuaXNBbGxvd2luZ0V2ZXJ5dGhpbmcoaXNBbGxvd2luZ0V2ZXJ5dGhpbmcpO1xuICAgICAgIGNvbnN0IGlzQXR0ZW51YXRpb25EZWZpbml0aW9uID0gYWxsZWdlZERlZmluaXRpb24gPT4ge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICAoYWxsZWdlZERlZmluaXRpb24gJiZcbiAgICAgIHR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbiA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbltBVFRFTlVBVE9SX0tFWV0gPT09ICdzdHJpbmcnKSB8fCAvL1xuICAgICAgaXNBcnJheShhbGxlZ2VkRGVmaW5pdGlvbikgIC8vXG4gICk7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKTtcbiAgICAgICBjb25zdCBnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24gPSBhdHRlbnVhdGlvbkRlZmluaXRpb24gPT4ge1xuICBpZiAoIWlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbikpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGF0dGVudWF0aW9uICR7cShcbiAgICAgICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgICAgKX0sIG11c3QgYmUgYW4gYXJyYXkgb2YgcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3Igb3IgYW4gb2JqZWN0IHdpdGggYW4gYXR0ZW51YXRvciBrZXlgLFxuICAgICk7XG4gIH1cbiAgaWYgKGlzQXJyYXkoYXR0ZW51YXRpb25EZWZpbml0aW9uKSkge1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5TmFtZTogJzxkZWZhdWx0IGF0dGVudWF0b3I+JyxcbiAgICAgIHNwZWNpZmllcjogbnVsbCxcbiAgICAgIHBhcmFtczogYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlOYW1lOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxuICAgICAgc3BlY2lmaWVyOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxuICAgICAgcGFyYW1zOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9QQVJBTVNfS0VZXSxcbiAgICB9O1xuICB9XG59O1xuXG4vL1xuJGjNj19vbmNlLmdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24pO2NvbnN0IGlzUmVjb3JkT2Y9KGl0ZW0scHJlZGljYXRlKT0+e1xuICBpZiAodHlwZW9mIGl0ZW0gIT09ICdvYmplY3QnIHx8IGl0ZW0gPT09IG51bGwgfHwgaXNBcnJheShpdGVtKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZW50cmllcyhpdGVtKS5ldmVyeSgoW2tleSwgdmFsdWVdKSA9PiBwcmVkaWNhdGUodmFsdWUsIGtleSkpO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXNCb29sZWFuID0gaXRlbSA9PiB0eXBlb2YgaXRlbSA9PT0gJ2Jvb2xlYW4nO1xuXG4vL1xuY29uc3QgcHJlZGljYXRlT3IgPVxuICAoLi4ucHJlZGljYXRlcykgPT5cbiAgaXRlbSA9PlxuICAgIHByZWRpY2F0ZXMuc29tZShwID0+IHAoaXRlbSkpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgaXNQb2xpY3lJdGVtID0gaXRlbSA9PlxuICBpdGVtID09PSB1bmRlZmluZWQgfHxcbiAgaXRlbSA9PT0gV0lMRENBUkRfUE9MSUNZX1ZBTFVFIHx8XG4gIGlzUmVjb3JkT2YoaXRlbSwgaXNCb29sZWFuKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRQYWNrYWdlUG9saWN5ID0gKGFsbGVnZWRQYWNrYWdlUG9saWN5LCBwYXRoLCB1cmwpID0+IHtcbiAgaWYgKGFsbGVnZWRQYWNrYWdlUG9saWN5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaW5VcmwgPSB1cmwgPyBgIGluICR7cSh1cmwpfWAgOiAnJztcblxuICBjb25zdCBwYWNrYWdlUG9saWN5ID0gT2JqZWN0KGFsbGVnZWRQYWNrYWdlUG9saWN5KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRQYWNrYWdlUG9saWN5ID09PSBwYWNrYWdlUG9saWN5ICYmICFpc0FycmF5KGFsbGVnZWRQYWNrYWdlUG9saWN5KSxcbiAgICBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkUGFja2FnZVBvbGljeSl9JHtpblVybH1gLFxuICApO1xuICBjb25zdCB7XG4gICAgcGFja2FnZXMsXG4gICAgYnVpbHRpbnMsXG4gICAgZ2xvYmFscyxcbiAgICBub0dsb2JhbEZyZWV6ZSxcbiAgICBkZWZhdWx0QXR0ZW51YXRvcjogX2lnbm9yZSwgLy9cbiAgICAvL1xuICAgIG9wdGlvbnMsIC8vXG4gICAgLi4uZXh0cmFcbiAgfSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChwYWNrYWdlUG9saWN5KTtcblxuICBhc3NlcnQoXG4gICAga2V5cyhleHRyYSkubGVuZ3RoID09PSAwLFxuICAgIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShrZXlzKGV4dHJhKSl9JHtpblVybH1gLFxuICApO1xuXG4gIGFzc2VydChcbiAgICBub0dsb2JhbEZyZWV6ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBub0dsb2JhbEZyZWV6ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgIGAke3BhdGh9Lm5vR2xvYmFsRnJlZXplIG11c3QgYmUgYSBib29sZWFuLCBnb3QgJHtxKHtcbiAgICAgIG5vR2xvYmFsRnJlZXplLFxuICAgIH0pfSR7aW5Vcmx9YCxcbiAgKTtcblxuICBpc1BvbGljeUl0ZW0ocGFja2FnZXMpIHx8XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBgJHtwYXRofS5wYWNrYWdlcyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zLCBnb3QgJHtxKHtcbiAgICAgICAgcGFja2FnZXMsXG4gICAgICB9KX0ke2luVXJsfWAsXG4gICAgKTtcblxuICBpc1BvbGljeUl0ZW0oZ2xvYmFscykgfHxcbiAgICBpc0F0dGVudWF0aW9uRGVmaW5pdGlvbihnbG9iYWxzKSB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0uZ2xvYmFscyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zIG9yIGEgc2luZ2xlIGF0dGVudWF0aW9uLCBnb3QgJHtxKFxuICAgICAgICB7XG4gICAgICAgICAgZ2xvYmFscyxcbiAgICAgICAgfSxcbiAgICAgICl9JHtpblVybH1gLFxuICAgICk7XG5cbiAgaXNQb2xpY3lJdGVtKGJ1aWx0aW5zKSB8fFxuICAgIGlzUmVjb3JkT2YoYnVpbHRpbnMsIHByZWRpY2F0ZU9yKGlzQm9vbGVhbiwgaXNBdHRlbnVhdGlvbkRlZmluaXRpb24pKSB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0uYnVpbHRpbnMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhdHRlbnVhdGlvbnMsIGdvdCAke3Eoe1xuICAgICAgICBidWlsdGlucyxcbiAgICAgIH0pfSR7aW5Vcmx9YCxcbiAgICApO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hc3NlcnRQYWNrYWdlUG9saWN5KGFzc2VydFBhY2thZ2VQb2xpY3kpO1xuICAgICAgIGNvbnN0IGFzc2VydFBvbGljeSA9IGFsbGVnZWRQb2xpY3kgPT4ge1xuICBpZiAoYWxsZWdlZFBvbGljeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBvbGljeSA9IE9iamVjdChhbGxlZ2VkUG9saWN5KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRQb2xpY3kgPT09IHBvbGljeSAmJiAhQXJyYXkuaXNBcnJheShwb2xpY3kpLFxuICAgIGBwb2xpY3kgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQb2xpY3l9YCxcbiAgKTtcblxuICBjb25zdCB7IHJlc291cmNlcywgZW50cnksIGRlZmF1bHRBdHRlbnVhdG9yLCAuLi5leHRyYSB9ID0gcG9saWN5O1xuICBhc3NlcnQoXG4gICAga2V5cyhleHRyYSkubGVuZ3RoID09PSAwLFxuICAgIGBwb2xpY3kgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKGtleXMoZXh0cmEpKX1gLFxuICApO1xuXG4gIGFzc2VydChcbiAgICB0eXBlb2YgcmVzb3VyY2VzID09PSAnb2JqZWN0JyAmJiByZXNvdXJjZXMgIT09IG51bGwgJiYgIWlzQXJyYXkocmVzb3VyY2VzKSxcbiAgICBgcG9saWN5LnJlc291cmNlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShyZXNvdXJjZXMpfWAsXG4gICk7XG4gIGFzc2VydChcbiAgICAhZGVmYXVsdEF0dGVudWF0b3IgfHwgdHlwZW9mIGRlZmF1bHRBdHRlbnVhdG9yID09PSAnc3RyaW5nJyxcbiAgICBgcG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoZGVmYXVsdEF0dGVudWF0b3IpfWAsXG4gICk7XG5cbiAgYXNzZXJ0UGFja2FnZVBvbGljeShlbnRyeSwgYHBvbGljeS5lbnRyeWApO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMocmVzb3VyY2VzKSkge1xuICAgIGFzc2VydFBhY2thZ2VQb2xpY3kodmFsdWUsIGBwb2xpY3kucmVzb3VyY2VzW1wiJHtrZXl9XCJdYCk7XG4gIH1cbn07JGjNj19vbmNlLmFzc2VydFBvbGljeShhc3NlcnRQb2xpY3kpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicG9saWN5TG9va3VwSGVscGVyIjpbInBvbGljeUxvb2t1cEhlbHBlciJdLCJpc0FsbG93aW5nRXZlcnl0aGluZyI6WyJpc0FsbG93aW5nRXZlcnl0aGluZyJdLCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiI6WyJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiJdLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iOlsiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uIl0sImFzc2VydFBhY2thZ2VQb2xpY3kiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSJdLCJhc3NlcnRQb2xpY3kiOlsiYXNzZXJ0UG9saWN5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPE/zSY+KgAAPioAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wb2xpY3kuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiLCJhdHRlbnVhdGVHbG9iYWxzIiwiYXR0ZW51YXRlTW9kdWxlSG9vayIsImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiLCJkZXRlY3RBdHRlbnVhdG9ycyIsImVuZm9yY2VNb2R1bGVQb2xpY3kiLCJnZXRQb2xpY3lGb3JQYWNrYWdlIiwibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbixpc0FsbG93aW5nRXZlcnl0aGluZyxpc0F0dGVudWF0aW9uRGVmaW5pdGlvbixwb2xpY3lMb29rdXBIZWxwZXI7JGjNj19pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvblwiLFskaM2PX2EgPT4gKGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiA9ICRozY9fYSldXSxbXCJpc0FsbG93aW5nRXZlcnl0aGluZ1wiLFskaM2PX2EgPT4gKGlzQWxsb3dpbmdFdmVyeXRoaW5nID0gJGjNj19hKV1dLFtcImlzQXR0ZW51YXRpb25EZWZpbml0aW9uXCIsWyRozY9fYSA9PiAoaXNBdHRlbnVhdGlvbkRlZmluaXRpb24gPSAkaM2PX2EpXV0sW1wicG9saWN5TG9va3VwSGVscGVyXCIsWyRozY9fYSA9PiAocG9saWN5TG9va3VwSGVscGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGNyZWF0ZSwgZW50cmllcywgdmFsdWVzLCBhc3NpZ24sIGZyZWV6ZSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB9ID1cbiAgT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCBBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICc8QVRURU5VQVRPUlM+JztcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpO1xuY29uc3Qgc2VsZWN0aXZlQ29weSA9IChmcm9tLCB0bywgbGlzdCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgcHJvcHM7XG4gIGlmICghbGlzdCkge1xuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhmcm9tKTtcbiAgICBwcm9wcyA9IG93bktleXMoZnJvbSkuZmlsdGVyKGtleSA9PiBkZXNjc1trZXldLmVudW1lcmFibGUpO1xuICB9IGVsc2Uge1xuICAgIHByb3BzID0gbGlzdDtcbiAgfVxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcHJvcHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3Qga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgIC8vXG4gICAgLy9cbiAgICB0b1trZXldID0gZnJvbVtrZXldO1xuICB9XG4gIHJldHVybiB0bztcbn07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb2xsZWN0QXR0ZW51YXRvcnMgPSAoYXR0ZW51YXRvcnMsIHBvbGljeUZyYWdtZW50KSA9PiB7XG4gIGlmICgnYXR0ZW51YXRlJyBpbiBwb2xpY3lGcmFnbWVudCkge1xuICAgIGF0dGVudWF0b3JzLnB1c2gocG9saWN5RnJhZ21lbnQuYXR0ZW51YXRlKTtcbiAgfVxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyhwb2xpY3lGcmFnbWVudCkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBhdHRlbnVhdG9yc0NhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZXRlY3RBdHRlbnVhdG9ycyA9IHBvbGljeSA9PiB7XG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmICghYXR0ZW51YXRvcnNDYWNoZS5oYXMocG9saWN5KSkge1xuICAgIGNvbnN0IGF0dGVudWF0b3JzID0gW107XG4gICAgaWYgKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcikge1xuICAgICAgYXR0ZW51YXRvcnMucHVzaChwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IpO1xuICAgIH1cbiAgICBjb2xsZWN0QXR0ZW51YXRvcnMoYXR0ZW51YXRvcnMsIHBvbGljeSk7XG4gICAgYXR0ZW51YXRvcnNDYWNoZS5zZXQocG9saWN5LCBhdHRlbnVhdG9ycyk7XG4gIH1cbiAgcmV0dXJuIGF0dGVudWF0b3JzQ2FjaGUuZ2V0KHBvbGljeSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGV0ZWN0QXR0ZW51YXRvcnMoZGV0ZWN0QXR0ZW51YXRvcnMpO1xuY29uc3QgZ2VuZXJhdGVDYW5vbmljYWxOYW1lID0gKHsgaXNFbnRyeSA9IGZhbHNlLCBuYW1lLCBwYXRoIH0pID0+IHtcbiAgaWYgKGlzRW50cnkpIHtcbiAgICB0aHJvdyBFcnJvcignRW50cnkgbW9kdWxlIGNhbm5vdCBiZSBpZGVudGlmaWVkIHdpdGggYSBjYW5vbmljYWxOYW1lJyk7XG4gIH1cbiAgaWYgKG5hbWUgPT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKSB7XG4gICAgcmV0dXJuIEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UO1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4oJz4nKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5ID0gKG5hbWluZ0tpdCwgcGFja2FnZVBvbGljeSkgPT4ge1xuICBpZiAobmFtaW5nS2l0LmlzRW50cnkpIHtcbiAgICAvL1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBjYW5vbmljYWxOYW1lID0gZ2VuZXJhdGVDYW5vbmljYWxOYW1lKG5hbWluZ0tpdCk7XG4gIHJldHVybiAhIXBvbGljeUxvb2t1cEhlbHBlcihwYWNrYWdlUG9saWN5LCAncGFja2FnZXMnLCBjYW5vbmljYWxOYW1lKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeShkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5KTtcbiAgICAgICBjb25zdCBnZXRQb2xpY3lGb3JQYWNrYWdlID0gKG5hbWluZ0tpdCwgcG9saWN5KSA9PiB7XG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAobmFtaW5nS2l0LmlzRW50cnkpIHtcbiAgICByZXR1cm4gcG9saWN5LmVudHJ5O1xuICB9XG4gIGNvbnN0IGNhbm9uaWNhbE5hbWUgPSBnZW5lcmF0ZUNhbm9uaWNhbE5hbWUobmFtaW5nS2l0KTtcbiAgaWYgKGNhbm9uaWNhbE5hbWUgPT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlZmF1bHRBdHRlbnVhdG9yOiBwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IsXG4gICAgICBwYWNrYWdlczogJ2FueScsXG4gICAgfTtcbiAgfVxuICBpZiAocG9saWN5LnJlc291cmNlcyAmJiBwb2xpY3kucmVzb3VyY2VzW2Nhbm9uaWNhbE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXTtcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIHJldHVybiBjcmVhdGUobnVsbCk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuZ2V0UG9saWN5Rm9yUGFja2FnZShnZXRQb2xpY3lGb3JQYWNrYWdlKTtcbmNvbnN0IGdldEdsb2JhbHNMaXN0ID0gcGFja2FnZVBvbGljeSA9PiB7XG4gIGlmICghcGFja2FnZVBvbGljeSB8fCAhcGFja2FnZVBvbGljeS5nbG9iYWxzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBlbnRyaWVzKHBhY2thZ2VQb2xpY3kuZ2xvYmFscylcbiAgICAuZmlsdGVyKChbX2tleSwgdmFsdWVdKSA9PiB2YWx1ZSlcbiAgICAubWFwKChba2V5LCBfdnZhbHVlXSkgPT4ga2V5KTtcbn07XG5cbmNvbnN0IEdMT0JBTF9BVFRFTlVBVE9SID0gJ2F0dGVudWF0ZUdsb2JhbHMnO1xuY29uc3QgTU9EVUxFX0FUVEVOVUFUT1IgPSAnYXR0ZW51YXRlTW9kdWxlJztcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uID0gYXN5bmMgKFxuICBhdHRlbnVhdGlvbkRlZmluaXRpb24sXG4gIGF0dGVudWF0b3JzUHJvdmlkZXIsXG4gIGF0dGVudWF0b3JFeHBvcnROYW1lLFxuKSA9PiB7XG4gIGlmICghYXR0ZW51YXRvcnNQcm92aWRlcikge1xuICAgIHRocm93IEVycm9yKGBhdHRlbnVhdG9yc1Byb3ZpZGVyIGlzIHJlcXVpcmVkIHRvIGltcG9ydCBhdHRlbnVhdG9yc2ApO1xuICB9XG4gIGNvbnN0IHsgc3BlY2lmaWVyLCBwYXJhbXMsIGRpc3BsYXlOYW1lIH0gPSBnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICApO1xuICBjb25zdCBhdHRlbnVhdG9yID0gYXdhaXQgYXR0ZW51YXRvcnNQcm92aWRlci5pbXBvcnQoc3BlY2lmaWVyKTtcbiAgaWYgKCFhdHRlbnVhdG9yW2F0dGVudWF0b3JFeHBvcnROYW1lXSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYEF0dGVudWF0b3IgJHtxKGRpc3BsYXlOYW1lKX0gZG9lcyBub3QgZXhwb3J0ICR7cShhdHRlbnVhdG9yRXhwb3J0TmFtZSl9YCxcbiAgICApO1xuICB9XG4gIC8vXG4gIGNvbnN0IGF0dGVudWF0ZSA9IGF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdLmJpbmQoYXR0ZW51YXRvciwgcGFyYW1zKTtcbiAgcmV0dXJuIGF0dGVudWF0ZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIgPSAoXG4gIGNvbXBhcnRtZW50cyxcbiAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbXBvcnRBdHRlbnVhdG9yO1xuICBsZXQgZGVmYXVsdEF0dGVudWF0b3I7XG4gIC8vXG4gIC8vXG4gIGlmICghY29tcGFydG1lbnREZXNjcmlwdG9yc1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0pIHtcbiAgICBpbXBvcnRBdHRlbnVhdG9yID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdGhyb3cgRXJyb3IoYE5vIGF0dGVudWF0b3JzIHNwZWNpZmllZCBpbiBwb2xpY3lgKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGRlZmF1bHRBdHRlbnVhdG9yID1cbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdLnBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcjtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGltcG9ydEF0dGVudWF0b3IgPSBhc3luYyBhdHRlbnVhdG9yU3BlY2lmaWVyID0+IHtcbiAgICAgIGlmICghYXR0ZW51YXRvclNwZWNpZmllcikge1xuICAgICAgICBpZiAoIWRlZmF1bHRBdHRlbnVhdG9yKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIGRlZmF1bHQgYXR0ZW51YXRvciBzcGVjaWZpZWQgaW4gcG9saWN5YCk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW51YXRvclNwZWNpZmllciA9IGRlZmF1bHRBdHRlbnVhdG9yO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IGF3YWl0IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0uaW1wb3J0KFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgKi8gKGF0dGVudWF0b3JTcGVjaWZpZXIpLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBuYW1lc3BhY2U7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW1wb3J0OiBpbXBvcnRBdHRlbnVhdG9yLFxuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIobWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcik7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVHbG9iYWxUaGlzKHtcbiAgYXR0ZW51YXRvcnMsXG4gIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgZ2xvYmFsVGhpcyxcbiAgZ2xvYmFscyxcbn0pIHtcbiAgY29uc3QgYXR0ZW51YXRlID0gYXdhaXQgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIGF0dGVudWF0b3JzLFxuICAgIEdMT0JBTF9BVFRFTlVBVE9SLFxuICApO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgLy9cbiAgLy9cbiAgLy9cblxuICAvL1xuXG4gIGNvbnN0IHJlc3VsdCA9IC8qICAgICAgICovIGF0dGVudWF0ZShnbG9iYWxzLCBnbG9iYWxUaGlzKTtcbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCAhPT0gbnVsbCkge1xuICAgIGFzc2lnbihnbG9iYWxUaGlzLCByZXN1bHQpO1xuICB9XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhdHRlbnVhdGVHbG9iYWxzID0gKFxuICBnbG9iYWxUaGlzLFxuICBnbG9iYWxzLFxuICBwYWNrYWdlUG9saWN5LFxuICBhdHRlbnVhdG9ycyxcbiAgcGVuZGluZ0pvYnMsXG4gIG5hbWUgPSAnPHVua25vd24+JyxcbikgPT4ge1xuICBsZXQgZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0ID0gKCkgPT4ge1xuICAgIGZyZWV6ZShnbG9iYWxUaGlzKTtcbiAgfTtcbiAgaWYgKHBhY2thZ2VQb2xpY3kgJiYgcGFja2FnZVBvbGljeS5ub0dsb2JhbEZyZWV6ZSkge1xuICAgIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCA9ICgpID0+IHt9O1xuICB9XG4gIGlmICghcGFja2FnZVBvbGljeSB8fCBpc0FsbG93aW5nRXZlcnl0aGluZyhwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKSB7XG4gICAgc2VsZWN0aXZlQ29weShnbG9iYWxzLCBnbG9iYWxUaGlzKTtcbiAgICBmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykpIHtcbiAgICBjb25zdCBhdHRlbnVhdGlvbkRlZmluaXRpb24gPSBwYWNrYWdlUG9saWN5Lmdsb2JhbHM7XG4gICAgY29uc3QgeyBkaXNwbGF5TmFtZSB9ID0gZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbik7XG4gICAgY29uc3QgYXR0ZW51YXRpb25Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkgLy9cbiAgICAgIC50aGVuKCgpID0+XG4gICAgICAgIGF0dGVudWF0ZUdsb2JhbFRoaXMoe1xuICAgICAgICAgIGF0dGVudWF0b3JzLFxuICAgICAgICAgIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgIGdsb2JhbHMsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnRoZW4oZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0LCBlcnJvciA9PiB7XG4gICAgICAgIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgRXJyb3Igd2hpbGUgYXR0ZW51YXRpbmcgZ2xvYmFscyBmb3IgJHtxKG5hbWUpfSB3aXRoICR7cShcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgICAgICl9OiAke3EoZXJyb3IubWVzc2FnZSl9YCAgLy9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIHBlbmRpbmdKb2JzLnB1c2goYXR0ZW51YXRpb25Qcm9taXNlKTtcblxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBsaXN0ID0gZ2V0R2xvYmFsc0xpc3QocGFja2FnZVBvbGljeSk7XG4gIHNlbGVjdGl2ZUNvcHkoZ2xvYmFscywgZ2xvYmFsVGhpcywgbGlzdCk7XG4gIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuYXR0ZW51YXRlR2xvYmFscyhhdHRlbnVhdGVHbG9iYWxzKTtcbmNvbnN0IGRpYWdub3NlTW9kdWxlUG9saWN5ID0gZXJyb3JIaW50ID0+IHtcbiAgaWYgKCFlcnJvckhpbnQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIGAgKGluZm86ICR7ZXJyb3JIaW50fSlgO1xufTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZW5mb3JjZU1vZHVsZVBvbGljeSA9IChcbiAgc3BlY2lmaWVyLFxuICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gIHsgZXhpdCwgZXJyb3JIaW50IH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB7IHBvbGljeSwgbW9kdWxlcywgbGFiZWwgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgaWYgKCFwb2xpY3kpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWV4aXQpIHtcbiAgICBpZiAoIW1vZHVsZXNbc3BlY2lmaWVyXSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBJbXBvcnRpbmcgJHtxKHNwZWNpZmllcil9IGluICR7cShcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgKX0gd2FzIG5vdCBhbGxvd2VkIGJ5IHBhY2thZ2VzIHBvbGljeSAke3EoXG4gICAgICAgICAgcG9saWN5LnBhY2thZ2VzLFxuICAgICAgICApfSR7ZGlhZ25vc2VNb2R1bGVQb2xpY3koZXJyb3JIaW50KX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFwb2xpY3lMb29rdXBIZWxwZXIocG9saWN5LCAnYnVpbHRpbnMnLCBzcGVjaWZpZXIpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgSW1wb3J0aW5nICR7cShzcGVjaWZpZXIpfSB3YXMgbm90IGFsbG93ZWQgYnkgcG9saWN5IGJ1aWx0aW5zOiR7cShcbiAgICAgICAgcG9saWN5LmJ1aWx0aW5zLFxuICAgICAgKX0ke2RpYWdub3NlTW9kdWxlUG9saWN5KGVycm9ySGludCl9YCxcbiAgICApO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmVuZm9yY2VNb2R1bGVQb2xpY3koZW5mb3JjZU1vZHVsZVBvbGljeSk7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVNb2R1bGUoe1xuICBhdHRlbnVhdG9ycyxcbiAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICBvcmlnaW5hbE1vZHVsZVJlY29yZCxcbn0pIHtcbiAgY29uc3QgYXR0ZW51YXRlID0gYXdhaXQgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIGF0dGVudWF0b3JzLFxuICAgIE1PRFVMRV9BVFRFTlVBVE9SLFxuICApO1xuXG4gIC8vXG4gIC8vXG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgaW1wb3J0czogb3JpZ2luYWxNb2R1bGVSZWNvcmQuaW1wb3J0cyxcbiAgICAvL1xuICAgIC8vXG4gICAgZXhwb3J0czogb3JpZ2luYWxNb2R1bGVSZWNvcmQuZXhwb3J0cyxcbiAgICBleGVjdXRlOiAobW9kdWxlRXhwb3J0cywgY29tcGFydG1lbnQsIHJlc29sdmVkSW1wb3J0cykgPT4ge1xuICAgICAgY29uc3QgbnMgPSB7fTtcbiAgICAgIG9yaWdpbmFsTW9kdWxlUmVjb3JkLmV4ZWN1dGUobnMsIGNvbXBhcnRtZW50LCByZXNvbHZlZEltcG9ydHMpO1xuICAgICAgY29uc3QgYXR0ZW51YXRlZCA9IGF0dGVudWF0ZShucyk7XG4gICAgICBtb2R1bGVFeHBvcnRzLmRlZmF1bHQgPSBhdHRlbnVhdGVkO1xuICAgICAgYXNzaWduKG1vZHVsZUV4cG9ydHMsIGF0dGVudWF0ZWQpO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhdHRlbnVhdGVNb2R1bGVIb29rID0gYXN5bmMgKFxuICBzcGVjaWZpZXIsXG4gIG9yaWdpbmFsTW9kdWxlUmVjb3JkLFxuICBwb2xpY3ksXG4gIGF0dGVudWF0b3JzLFxuKSA9PiB7XG4gIGNvbnN0IHBvbGljeVZhbHVlID0gcG9saWN5TG9va3VwSGVscGVyKHBvbGljeSwgJ2J1aWx0aW5zJywgc3BlY2lmaWVyKTtcbiAgaWYgKCFwb2xpY3kgfHwgcG9saWN5VmFsdWUgPT09IHRydWUpIHtcbiAgICByZXR1cm4gb3JpZ2luYWxNb2R1bGVSZWNvcmQ7XG4gIH1cblxuICBpZiAoIXBvbGljeVZhbHVlKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgQXR0ZW51YXRpb24gZmFpbGVkICcke3NwZWNpZmllcn0nIHdhcyBub3QgaW4gcG9saWN5IGJ1aWx0aW5zOiR7cShcbiAgICAgICAgcG9saWN5LmJ1aWx0aW5zLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGF0dGVudWF0ZU1vZHVsZSh7XG4gICAgYXR0ZW51YXRvcnMsXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uOiBwb2xpY3lWYWx1ZSxcbiAgICBvcmlnaW5hbE1vZHVsZVJlY29yZCxcbiAgfSk7XG59OyRozY9fb25jZS5hdHRlbnVhdGVNb2R1bGVIb29rKGF0dGVudWF0ZU1vZHVsZUhvb2spO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiXSwiZGV0ZWN0QXR0ZW51YXRvcnMiOlsiZGV0ZWN0QXR0ZW51YXRvcnMiXSwiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSI6WyJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5Il0sImdldFBvbGljeUZvclBhY2thZ2UiOlsiZ2V0UG9saWN5Rm9yUGFja2FnZSJdLCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIjpbIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwiYXR0ZW51YXRlR2xvYmFscyI6WyJhdHRlbnVhdGVHbG9iYWxzIl0sImVuZm9yY2VNb2R1bGVQb2xpY3kiOlsiZW5mb3JjZU1vZHVsZVBvbGljeSJdLCJhdHRlbnVhdGVNb2R1bGVIb29rIjpbImF0dGVudWF0ZU1vZHVsZUhvb2siXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAr2h7pdwIAADcCAAALQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3Bvd2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiLCJpc1JlYWROb3dQb3dlcnMiLCJ1bnBhY2tSZWFkUG93ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNhbm9uaWNhbFNoaW0gPSBhc3luYyBwYXRoID0+IHBhdGg7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgdW5wYWNrUmVhZFBvd2VycyA9IHBvd2VycyA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgcmVhZDtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IG1heWJlUmVhZDtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGNhbm9uaWNhbDtcblxuICBpZiAodHlwZW9mIHBvd2VycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlYWQgPSBwb3dlcnM7XG4gIH0gZWxzZSB7XG4gICAgKHsgcmVhZCwgbWF5YmVSZWFkLCBjYW5vbmljYWwgfSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocG93ZXJzKSk7XG4gIH1cblxuICBpZiAoY2Fub25pY2FsID09PSB1bmRlZmluZWQpIHtcbiAgICBjYW5vbmljYWwgPSBjYW5vbmljYWxTaGltO1xuICB9XG5cbiAgaWYgKG1heWJlUmVhZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgbWF5YmVSZWFkID0gcGF0aCA9PlxuICAgICAgLyogICAgICAgICAgICAgICAgICovIChyZWFkKShwYXRoKS5jYXRjaChfZXJyb3IgPT4gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucG93ZXJzLFxuICAgIHJlYWQsXG4gICAgbWF5YmVSZWFkLFxuICAgIGNhbm9uaWNhbCxcbiAgfTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UudW5wYWNrUmVhZFBvd2Vycyh1bnBhY2tSZWFkUG93ZXJzKTtcbmNvbnN0IHJlcXVpcmVkUmVhZE5vd1Bvd2Vyc1Byb3BzID0gZnJlZXplKFxuICAvKiAgICAgICAgICAgICAgICAqLyAoWydmaWxlVVJMVG9QYXRoJywgJ2lzQWJzb2x1dGUnLCAnbWF5YmVSZWFkTm93J10pLFxuKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNSZWFkTm93UG93ZXJzID0gdmFsdWUgPT5cbiAgQm9vbGVhbihcbiAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgcmVxdWlyZWRSZWFkTm93UG93ZXJzUHJvcHMuZXZlcnkoXG4gICAgICAgIHByb3AgPT4gcHJvcCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbcHJvcF0gPT09ICdmdW5jdGlvbicsXG4gICAgICApLFxuICApO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaXNSZWFkTm93UG93ZXJzKGlzUmVhZE5vd1Bvd2Vycyk7XG4gICAgICAgY29uc3QgZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMgPSB2YWx1ZSA9PiB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIFsuLi5yZXF1aXJlZFJlYWROb3dQb3dlcnNQcm9wc107XG4gIH1cbiAgcmV0dXJuIHJlcXVpcmVkUmVhZE5vd1Bvd2Vyc1Byb3BzLmZpbHRlcihcbiAgICBwcm9wID0+ICEocHJvcCBpbiB2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlW3Byb3BdICE9PSAnZnVuY3Rpb24nLFxuICApO1xufTskaM2PX29uY2UuZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMoZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidW5wYWNrUmVhZFBvd2VycyI6WyJ1bnBhY2tSZWFkUG93ZXJzIl0sImlzUmVhZE5vd1Bvd2VycyI6WyJpc1JlYWROb3dQb3dlcnMiXSwiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiOlsiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAANQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3R5cGVzLWV4dGVybmFsLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADSioamiAQAAogEAACEAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAusIkdug8AALoPAAArAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L3NyYy9lbnYtb3B0aW9ucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyIsImdldEVudmlyb25tZW50T3B0aW9uIiwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCIsIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiAgICAgICAgICAgICAgICAgICAqL1xuLy9cblxuLy9cbi8vXG5cbi8vXG4vL1xuLy9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8vXG4vL1xuY29uc3QgdW5jdXJyeVRoaXMgPVxuICBmbiA9PlxuICAocmVjZWl2ZXIsIC4uLmFyZ3MpID0+XG4gICAgYXBwbHkoZm4sIHJlY2VpdmVyLCBhcmdzKTtcbmNvbnN0IGFycmF5UHVzaCA9IHVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbmNvbnN0IGFycmF5SW5jbHVkZXMgPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpO1xuY29uc3Qgc3RyaW5nU3BsaXQgPSB1bmN1cnJ5VGhpcyhTdHJpbmcucHJvdG90eXBlLnNwbGl0KTtcblxuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBGYWlsID0gKGxpdGVyYWxzLCAuLi5hcmdzKSA9PiB7XG4gIGxldCBtc2cgPSBsaXRlcmFsc1swXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbXNnID0gYCR7bXNnfSR7YXJnc1tpXX0ke2xpdGVyYWxzW2kgKyAxXX1gO1xuICB9XG4gIHRocm93IEVycm9yKG1zZyk7XG59O1xuXG4vL1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVudmlyb25tZW50Q2FwdG9yID0gKGFHbG9iYWwsIGRyb3BOYW1lcyA9IGZhbHNlKSA9PiB7XG4gIGNvbnN0IGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9IFtdO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAoXG4gICAgb3B0aW9uTmFtZSxcbiAgICBkZWZhdWx0U2V0dGluZyxcbiAgICBvcHRPdGhlclZhbHVlcyA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgdHlwZW9mIG9wdGlvbk5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lICR7cShvcHRpb25OYW1lKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuICAgIHR5cGVvZiBkZWZhdWx0U2V0dGluZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgRW52aXJvbm1lbnQgb3B0aW9uIGRlZmF1bHQgc2V0dGluZyAke3EoXG4gICAgICAgIGRlZmF1bHRTZXR0aW5nLFxuICAgICAgKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICovXG4gICAgbGV0IHNldHRpbmcgPSBkZWZhdWx0U2V0dGluZztcbiAgICBjb25zdCBnbG9iYWxQcm9jZXNzID0gYUdsb2JhbC5wcm9jZXNzIHx8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBnbG9iYWxFbnYgPVxuICAgICAgKHR5cGVvZiBnbG9iYWxQcm9jZXNzID09PSAnb2JqZWN0JyAmJiBnbG9iYWxQcm9jZXNzLmVudikgfHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsRW52ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKG9wdGlvbk5hbWUgaW4gZ2xvYmFsRW52KSB7XG4gICAgICAgIGlmICghZHJvcE5hbWVzKSB7XG4gICAgICAgICAgYXJyYXlQdXNoKGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcywgb3B0aW9uTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBnbG9iYWxFbnZbb3B0aW9uTmFtZV07XG4gICAgICAgIC8vXG4gICAgICAgIHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lZCAke3EoXG4gICAgICAgICAgICBvcHRpb25OYW1lLFxuICAgICAgICAgICl9LCBpZiBwcmVzZW50LCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHN0cmluZyB2YWx1ZSwgZ290ICR7cShcbiAgICAgICAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgc2V0dGluZyA9IG9wdGlvblZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBvcHRPdGhlclZhbHVlcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBzZXR0aW5nID09PSBkZWZhdWx0U2V0dGluZyB8fFxuICAgICAgYXJyYXlJbmNsdWRlcyhvcHRPdGhlclZhbHVlcywgc2V0dGluZykgfHxcbiAgICAgIEZhaWxgVW5yZWNvZ25pemVkICR7cShvcHRpb25OYW1lKX0gdmFsdWUgJHtxKFxuICAgICAgICBzZXR0aW5nLFxuICAgICAgKX0uIEV4cGVjdGVkIG9uZSBvZiAke3EoW2RlZmF1bHRTZXR0aW5nLCAuLi5vcHRPdGhlclZhbHVlc10pfWA7XG4gICAgcmV0dXJuIHNldHRpbmc7XG4gIH07XG4gIGZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbik7XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0ID0gb3B0aW9uTmFtZSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJycpO1xuICAgIHJldHVybiBmcmVlemUob3B0aW9uID09PSAnJyA/IFtdIDogc3RyaW5nU3BsaXQob3B0aW9uLCAnLCcpKTtcbiAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAob3B0aW9uTmFtZSwgZWxlbWVudCkgPT5cbiAgICBhcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksIGVsZW1lbnQpO1xuXG4gIGNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9ICgpID0+IHtcbiAgICByZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiAgfTtcbiAgZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxuICAgIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHtcbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG59ID0gbWFrZUVudmlyb25tZW50Q2FwdG9yKGdsb2JhbFRoaXMsIHRydWUpOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbihnZXRFbnZpcm9ubWVudE9wdGlvbik7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7JGjNj19vbmNlLmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sImdldEVudmlyb25tZW50T3B0aW9uIjpbImdldEVudmlyb25tZW50T3B0aW9uIl0sImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiOlsiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCJdLCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASTX26VQIAABUCAAAHQAAAEBlbmRvL2Vycm9ycy12MS4yLjEwL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJGYWlsIiwiWCIsImFubm90YXRlRXJyb3IiLCJhc3NlcnQiLCJiIiwiYmFyZSIsIm1ha2VFcnJvciIsIm5vdGUiLCJxIiwicXVvdGUiLCJyZWRhY3RlZCIsInRocm93UmVkYWN0ZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cblxuY29uc3QgZ2xvYmFsQXNzZXJ0ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbmlmIChnbG9iYWxBc3NlcnQgPT09IHVuZGVmaW5lZCkge1xuICB0aHJvdyBFcnJvcihcbiAgICBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0LCBpbXBvcnQgJ3NlcycgYmVmb3JlICdAZW5kby9lcnJvcnMnYCxcbiAgKTtcbn1cblxuY29uc3QgbWlzc2luZyA9IC8qICAgICAgICAgICAgICAgICovIChbXG4gICd0eXBlb2YnLFxuICAnZXJyb3InLFxuICAnZmFpbCcsXG4gICdlcXVhbCcsXG4gICdzdHJpbmcnLFxuICAnbm90ZScsXG4gICdkZXRhaWxzJyxcbiAgJ0ZhaWwnLFxuICAncXVvdGUnLFxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAnbWFrZUFzc2VydCcsXG5dKS5maWx0ZXIobmFtZSA9PiBnbG9iYWxBc3NlcnRbbmFtZV0gPT09IHVuZGVmaW5lZCk7XG5pZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbiAgICAgICcsICcsXG4gICAgKX1gLFxuICApO1xufVxuXG4vL1xuLy9cbi8vXG5jb25zdCB7XG4gIGJhcmUsXG4gIGRldGFpbHM6IHJlZGFjdGVkLFxuICBlcnJvcjogbWFrZUVycm9yLFxuICBGYWlsOiB0aHJvd1JlZGFjdGVkLFxuICBtYWtlQXNzZXJ0OiBfb21pdHRlZE1ha2VBc3NlcnQsXG4gIG5vdGUsXG4gIHF1b3RlLFxuICAuLi5hc3NlcnRpb25zXG59ID0gZ2xvYmFsQXNzZXJ0O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuJGjNj19vbmNlLnJlZGFjdGVkKHJlZGFjdGVkKTskaM2PX29uY2UubWFrZUVycm9yKG1ha2VFcnJvcik7JGjNj19vbmNlLnRocm93UmVkYWN0ZWQodGhyb3dSZWRhY3RlZCk7JGjNj19vbmNlLm5vdGUobm90ZSk7JGjNj19vbmNlLnF1b3RlKHF1b3RlKTtjb25zdCBhc3NlcnQ9KHZhbHVlLG9wdERldGFpbHMsZXJyQ29udHJ1Y3RvcixvcHRpb25zKT0+XG4gIGdsb2JhbEFzc2VydCh2YWx1ZSwgb3B0RGV0YWlscywgZXJyQ29udHJ1Y3Rvciwgb3B0aW9ucyk7JGjNj19vbmNlLmFzc2VydChhc3NlcnQpO1xuT2JqZWN0LmFzc2lnbihhc3NlcnQsIGFzc2VydGlvbnMpO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBiYXJlT3JRdW90ZSA9IGJhcmUgfHwgcXVvdGU7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuYmFyZU9yUXVvdGUoYmFyZU9yUXVvdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVkYWN0ZWQiOlsicmVkYWN0ZWQiXSwiWCI6WyJyZWRhY3RlZCJdLCJtYWtlRXJyb3IiOlsibWFrZUVycm9yIl0sInRocm93UmVkYWN0ZWQiOlsidGhyb3dSZWRhY3RlZCJdLCJGYWlsIjpbInRocm93UmVkYWN0ZWQiXSwibm90ZSI6WyJub3RlIl0sImFubm90YXRlRXJyb3IiOlsibm90ZSJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sImFzc2VydCI6WyJhc3NlcnQiXSwiYmFyZSI6WyJiYXJlT3JRdW90ZSJdLCJiIjpbImJhcmVPclF1b3RlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMmxgxkbFgAAGxYAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIiwiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHRyYWNrVHVybnMsbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLFskaM2PX2EgPT4gKHRyYWNrVHVybnMgPSAkaM2PX2EpXV1dXSxbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cblxuY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSwgRmFpbCwgZXJyb3I6IG1ha2VFcnJvciB9ID0gYXNzZXJ0O1xuY29uc3QgeyBhc3NpZ24sIGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4vKlxuXG4gKi9cblxuY29uc3Qgb25TZW5kID0gbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX1NFTkRfQlJFQUtQT0lOVFMnKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIgPSB7XG4gIHNldChfdGFyZ2V0LCBfcHJvcCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBpc0V4dGVuc2libGUoX3RhcmdldCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgc2V0UHJvdG90eXBlT2YoX3RhcmdldCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eShfdGFyZ2V0LCBfcHJvcCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbn07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUVQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgW3Byb3BlcnR5S2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAodGhpcyAhPT0gcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgICBtYWtlRXJyb3IoXG4gICAgICAgICAgICAgICAgICBYYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKHByb3BlcnR5S2V5KX1cIiBtZXRob2Qgb2YgRSgke3EoXG4gICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudCxcbiAgICAgICAgICAgICAgICAgICl9KWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZChyZWNpcGllbnQsIHByb3BlcnR5S2V5LCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgfVtwcm9wZXJ0eUtleV0sXG4gICAgICApO1xuICAgIH0sXG4gICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJnQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy9cbiAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICB9XG4gICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ0FycmF5KTtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB0aGlzID09PSByZWNlaXZlciB8fFxuICAgICAgICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgICApfVwiIG1ldGhvZCBvZiBFLnNlbmRPbmx5KCR7cShyZWNpcGllbnQpfSlgO1xuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkocmVjaXBpZW50LCBwcm9wZXJ0eUtleSwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdzQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy9cbiAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICB9XG4gICAgICBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkocmVjaXBpZW50LCBhcmdzQXJyYXkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyID0gKHgsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgaGFzOiAoX3RhcmdldCwgX3Byb3ApID0+IHRydWUsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4gSGFuZGxlZFByb21pc2UuZ2V0KHgsIHByb3ApLFxuICB9KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBmdW5jVGFyZ2V0ID0gZnJlZXplKCgpID0+IHt9KTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG9ialRhcmdldCA9IGZyZWV6ZSh7IF9fcHJvdG9fXzogbnVsbCB9KTtcblxuLypcblxuICovXG5jb25zdCBtYWtlRSA9IEhhbmRsZWRQcm9taXNlID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBhc3NpZ24oXG4gICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG4gICAgICAvL1xuICAgICAgeCA9PiBuZXcgUHJveHkoZnVuY1RhcmdldCwgbWFrZUVQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcbiAgICAgIHtcbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIC8vXG4gICAgICAgIGdldDogeCA9PiBuZXcgUHJveHkob2JqVGFyZ2V0LCBtYWtlRUdldFByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuXG4gICAgICAgIC8qXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIHJlc29sdmU6IEhhbmRsZWRQcm9taXNlLnJlc29sdmUsXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgc2VuZE9ubHk6IHggPT5cbiAgICAgICAgICAvL1xuICAgICAgICAgIG5ldyBQcm94eShmdW5jVGFyZ2V0LCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgd2hlbjogKHgsIG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSA9PlxuICAgICAgICAgIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihcbiAgICAgICAgICAgIC4uLnRyYWNrVHVybnMoW29uZnVsZmlsbGVkLCBvbnJlamVjdGVkXSksXG4gICAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgKSxcbiAgKTtcbn07XG5cbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACk4yujkQ4AAJEOAAAnAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL2xvY2FsLmpzeyJpbXBvcnRzIjpbIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImdldE1ldGhvZE5hbWVzIiwibG9jYWxBcHBseUZ1bmN0aW9uIiwibG9jYWxBcHBseU1ldGhvZCIsImxvY2FsR2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIixbJGjNj19hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsIH0gPSBhc3NlcnQ7XG5cbmNvbnN0IHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgZ2V0UHJvdG90eXBlT2YsIGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSwgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuY29uc3QgbnR5cGVvZiA9IHNwZWNpbWVuID0+IChzcGVjaW1lbiA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBzcGVjaW1lbik7XG5cbmNvbnN0IG9uRGVsaXZlcnkgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fREVMSVZFUllfQlJFQUtQT0lOVFMnKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc09iamVjdCA9IHZhbCA9PiBPYmplY3QodmFsKSA9PT0gdmFsO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkID0gKGEsIGIpID0+IHtcbiAgaWYgKHR5cGVvZiBhID09PSB0eXBlb2YgYikge1xuICAgIGNvbnN0IGxlZnQgPSBTdHJpbmcoYSk7XG4gICAgY29uc3QgcmlnaHQgPSBTdHJpbmcoYik7XG4gICAgLy9cbiAgICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbiAgfVxuICBpZiAodHlwZW9mIGEgPT09ICdzeW1ib2wnKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiID09PSAnc3RyaW5nJyk7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGFzc2VydCh0eXBlb2YgYSA9PT0gJ3N0cmluZycpO1xuICBhc3NlcnQodHlwZW9mIGIgPT09ICdzeW1ib2wnKTtcbiAgcmV0dXJuIDE7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldE1ldGhvZE5hbWVzID0gdmFsID0+IHtcbiAgbGV0IGxheWVyID0gdmFsO1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKTsgLy9cbiAgd2hpbGUgKGxheWVyICE9PSBudWxsICYmIGxheWVyICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgLy9cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAodHlwZW9mIHZhbFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBuYW1lcy5hZGQobmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNPYmplY3QodmFsKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxheWVyID0gZ2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuICB9XG4gIHJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xufTtcbi8vXG4vL1xuJGjNj19vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtmcmVlemUoZ2V0TWV0aG9kTmFtZXMpO1xuXG4gICAgICAgY29uc3QgbG9jYWxBcHBseUZ1bmN0aW9uID0gKHJlY2lwaWVudCwgYXJncykgPT4ge1xuICB0eXBlb2YgcmVjaXBpZW50ID09PSAnZnVuY3Rpb24nIHx8XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBpbnZva2UgdGFyZ2V0IGFzIGEgZnVuY3Rpb247IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgaWYgKG9uRGVsaXZlcnkgJiYgb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgIC8vXG4gICAgZGVidWdnZXI7IC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShyZWNpcGllbnQsIHVuZGVmaW5lZCwgYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5sb2NhbEFwcGx5RnVuY3Rpb24obG9jYWxBcHBseUZ1bmN0aW9uKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlNZXRob2QgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lLCBhcmdzKSA9PiB7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHwgbWV0aG9kTmFtZSA9PT0gbnVsbCkge1xuICAgIC8vXG4gICAgcmV0dXJuIGxvY2FsQXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ3MpO1xuICB9XG4gIGlmIChyZWNpcGllbnQgPT09IHVuZGVmaW5lZCB8fCByZWNpcGllbnQgPT09IG51bGwpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgQ2Fubm90IGRlbGl2ZXIgJHtxKG1ldGhvZE5hbWUpfSB0byB0YXJnZXQ7IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmbiA9IHJlY2lwaWVudFttZXRob2ROYW1lXTtcbiAgaWYgKGZuID09PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgdGFyZ2V0IGhhcyBubyBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSwgaGFzICR7cShcbiAgICAgICAgZ2V0TWV0aG9kTmFtZXMocmVjaXBpZW50KSxcbiAgICAgICl9YCxcbiAgICAgIFR5cGVFcnJvcixcbiAgICApO1xuICB9XG4gIGNvbnN0IGZ0eXBlID0gbnR5cGVvZihmbik7XG4gIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIEZhaWxgaW52b2tlZCBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSBpcyBub3QgYSBmdW5jdGlvbjsgaXQgaXMgYSAke3EoXG4gICAgICBmdHlwZSxcbiAgICApfWA7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIG1ldGhvZE5hbWUpKSB7XG4gICAgLy9cbiAgICBkZWJ1Z2dlcjsgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGFwcGx5KGZuLCByZWNpcGllbnQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseU1ldGhvZChsb2NhbEFwcGx5TWV0aG9kKTtcblxuICAgICAgIGNvbnN0IGxvY2FsR2V0ID0gKHQsIGtleSkgPT4gdFtrZXldOyRozY9fb25jZS5sb2NhbEdldChsb2NhbEdldCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJsb2NhbEFwcGx5RnVuY3Rpb24iOlsibG9jYWxBcHBseUZ1bmN0aW9uIl0sImxvY2FsQXBwbHlNZXRob2QiOlsibG9jYWxBcHBseU1ldGhvZCJdLCJsb2NhbEdldCI6WyJsb2NhbEdldCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB5M+y4PA8AADwPAAA1AAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBxdW90ZTogcSwgRmFpbCB9ID0gYXNzZXJ0O1xuXG5jb25zdCB7IGhhc093biwgZnJlZXplLCBlbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbi8qXG5cblxuXG5cblxuICovXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cbmNvbnN0IGlzSlNPTlJlY29yZCA9IHZhbCA9PlxuICB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc2ltcGxpZnlUYWcgPSB0YWcgPT4ge1xuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ0FsbGVnZWQ6ICcsICdEZWJ1Z05hbWU6ICddKSB7XG4gICAgaWYgKHRhZy5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIHJldHVybiB0YWcuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0YWc7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9IG9wdGlvbk5hbWUgPT4ge1xuICBsZXQgYnJlYWtwb2ludHMgPSBKU09OLnBhcnNlKGdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsICdudWxsJykpO1xuXG4gIGlmIChicmVha3BvaW50cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGJyZWFrcG9pbnRzVGFibGU7XG5cbiAgY29uc3QgZ2V0QnJlYWtwb2ludHMgPSAoKSA9PiBicmVha3BvaW50cztcbiAgZnJlZXplKGdldEJyZWFrcG9pbnRzKTtcblxuICBjb25zdCBzZXRCcmVha3BvaW50cyA9IChuZXdCcmVha3BvaW50cyA9IGJyZWFrcG9pbnRzKSA9PiB7XG4gICAgaXNKU09OUmVjb3JkKG5ld0JyZWFrcG9pbnRzKSB8fFxuICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbiB0byBiZSBhIEpTT04gYnJlYWtwb2ludHMgcmVjb3JkYDtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIC8vXG4gICAgY29uc3QgbmV3QnJlYWtwb2ludHNUYWJsZSA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICBmb3IgKGNvbnN0IFt0YWcsIG1ldGhvZEJQc10gb2YgZW50cmllcyhuZXdCcmVha3BvaW50cykpIHtcbiAgICAgIHRhZyA9PT0gc2ltcGxpZnlUYWcodGFnKSB8fFxuICAgICAgICBGYWlsYEp1c3QgdXNlIHNpbXBsZSB0YWcgJHtxKHNpbXBsaWZ5VGFnKHRhZykpfSByYXRoZXIgdGhhbiAke3EodGFnKX1gO1xuICAgICAgaXNKU09OUmVjb3JkKG1ldGhvZEJQcykgfHxcbiAgICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cShcbiAgICAgICAgICB0YWcsXG4gICAgICAgICl9IHRvIGJlIGEgSlNPTiBtZXRob2RzIGJyZWFrcG9pbnRzIHJlY29yZGA7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBjb3VudF0gb2YgZW50cmllcyhtZXRob2RCUHMpKSB7XG4gICAgICAgIGNvdW50ID09PSAnKicgfHxcbiAgICAgICAgICAodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpICYmXG4gICAgICAgICAgICBjb3VudCA+PSAwKSB8fFxuICAgICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EodGFnKX0uJHtxKFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICApfSB0byBiZSBcIipcIiBvciBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYDtcblxuICAgICAgICBjb25zdCBjbGFzc0JQcyA9IGhhc093bihuZXdCcmVha3BvaW50c1RhYmxlLCBtZXRob2ROYW1lKVxuICAgICAgICAgID8gbmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXVxuICAgICAgICAgIDogKG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gPSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjbGFzc0JQc1t0YWddID0gY291bnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGJyZWFrcG9pbnRzID0gbmV3QnJlYWtwb2ludHM7XG4gICAgYnJlYWtwb2ludHNUYWJsZSA9IG5ld0JyZWFrcG9pbnRzVGFibGU7XG4gIH07XG4gIGZyZWV6ZShzZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2hvdWxkQnJlYWtwb2ludCA9IChyZWNpcGllbnQsIG1ldGhvZE5hbWUpID0+IHtcbiAgICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzQlBzID0gYnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXSB8fCBicmVha3BvaW50c1RhYmxlWycqJ107XG4gICAgaWYgKGNsYXNzQlBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHRhZyA9IHNpbXBsaWZ5VGFnKHJlY2lwaWVudFtTeW1ib2wudG9TdHJpbmdUYWddKTtcbiAgICBsZXQgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YWcgPSAnKic7XG4gICAgICBjb3VudCA9IGNsYXNzQlBzW3RhZ107XG4gICAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXNzZXJ0KHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiYgY291bnQgPj0gMSk7XG4gICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50IC0gMTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIGZyZWV6ZShzaG91bGRCcmVha3BvaW50KTtcblxuICBjb25zdCBicmVha3BvaW50VGVzdGVyID0gZnJlZXplKHtcbiAgICBnZXRCcmVha3BvaW50cyxcbiAgICBzZXRCcmVha3BvaW50cyxcbiAgICBzaG91bGRCcmVha3BvaW50LFxuICB9KTtcbiAgYnJlYWtwb2ludFRlc3Rlci5zZXRCcmVha3BvaW50cygpO1xuICByZXR1cm4gYnJlYWtwb2ludFRlc3Rlcjtcbn07JGjNj19vbmNlLm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcihtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xuZnJlZXplKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALh2lJ1fAwAAXwMAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VFOyRozY9faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAobWFrZUUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCBocCA9IEhhbmRsZWRQcm9taXNlO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5ocChocCk7XG4gICAgICAgY29uc3QgRSA9IG1ha2VFKGhwKTskaM2PX29uY2UuRShFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpgMOzngoAAJ4KAAAtAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXSxbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm4gPSAwO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG5cbi8vXG5jb25zdCBWRVJCT1NFID0gZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcygnREVCVUcnLCAndHJhY2stdHVybnMnKTtcblxuLy9cbi8vXG5jb25zdCBFTkFCTEVEID1cbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24oJ1RSQUNLX1RVUk5TJywgJ2Rpc2FibGVkJywgWydlbmFibGVkJ10pID09PSAnZW5hYmxlZCc7XG5cbi8vXG4vL1xuLy9cbi8vXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGUgPSBkZXRhaWxzTm90ZSA9PiByZWFzb24gPT4ge1xuICBpZiAocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKHJlYXNvbiwgZGV0YWlsc05vdGUpO1xuICB9XG4gIGlmIChWRVJCT1NFKSB7XG4gICAgY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJywgcmVhc29uKTtcbiAgfVxufTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uID1cbiAgKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkgPT5cbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBoaWRkZW5QcmlvckVycm9yID0gc2VuZGluZ0Vycm9yO1xuICAgIGhpZGRlbkN1cnJlbnRUdXJuICs9IDE7XG4gICAgaGlkZGVuQ3VycmVudEV2ZW50ID0gMDtcbiAgICB0cnkge1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMoLi4uYXJncyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5hc3NlcnQubm90ZShcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIFhgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChWRVJCT1NFKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUk9XTiB0byB0b3Agb2YgZXZlbnQgbG9vcCcsIGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGNvbnN0IGRldGFpbHNOb3RlID0gWGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaGlkZGVuUHJpb3JFcnJvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHRyYWNrVHVybnMgPSBmdW5jcyA9PiB7XG4gIGlmICghRU5BQkxFRCB8fCB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWdsb2JhbFRoaXMuYXNzZXJ0KSB7XG4gICAgcmV0dXJuIGZ1bmNzO1xuICB9XG4gIGNvbnN0IHsgZGV0YWlsczogWCwgbm90ZTogYW5ub3RhdGVFcnJvciB9ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbiAgaGlkZGVuQ3VycmVudEV2ZW50ICs9IDE7XG4gIGNvbnN0IHNlbmRpbmdFcnJvciA9IEVycm9yKFxuICAgIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgKTtcbiAgaWYgKGhpZGRlblByaW9yRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFubm90YXRlRXJyb3Ioc2VuZGluZ0Vycm9yLCBYYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuICB9XG5cbiAgcmV0dXJuIC8qICAgICAgICAgICAgKi8gKFxuICAgIGZ1bmNzLm1hcChmdW5jID0+IGZ1bmMgJiYgd3JhcEZ1bmN0aW9uKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkpXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvdXRpbHMuanN7ImltcG9ydHMiOlsiLi9zcmMvbG9jYWwuanMiLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9sb2NhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2xvY2FsLmpzIjpbWyJnZXRNZXRob2ROYW1lcyIsImdldE1ldGhvZE5hbWVzIl1dLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjpbWyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiLCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANaBKoBZDAAAWQwAADUAAABAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjQuMC9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50LCduYW1lJyx7dmFsdWU6XCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwifSk7JGjNj19vbmNlLndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KTsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBjb21wYXJ0bWVudE9wdGlvbnMgPSAoLi4uYXJncykgPT4ge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgaWYgKFxuICAgIGFyZ3MubGVuZ3RoID09PSAxICYmXG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnICYmXG4gICAgYXJnc1swXSAhPT0gbnVsbCAmJlxuICAgICdfX29wdGlvbnNfXycgaW4gYXJnc1swXVxuICApIHtcbiAgICBjb25zdCB7IF9fb3B0aW9uc19fLCAuLi5vcHRpb25zIH0gPSBhcmdzWzBdO1xuICAgIGFzc2VydChcbiAgICAgIF9fb3B0aW9uc19fID09PSB0cnVlLFxuICAgICAgYENvbXBhcnRtZW50IGNvbnN0cnVjdG9yIG9ubHkgc3VwcG9ydHMgdHJ1ZSBfX29wdGlvbnNfXyBzaWdpbCwgZ290ICR7X19vcHRpb25zX199YCxcbiAgICApO1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtcbiAgICAgIGdsb2JhbHMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovICh7fSksXG4gICAgICBtb2R1bGVzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHt9KSxcbiAgICAgIG9wdGlvbnMgPSB7fSxcbiAgICBdID0gYXJncztcbiAgICBhc3NlcnQuZXF1YWwoXG4gICAgICBvcHRpb25zLm1vZHVsZXMsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBgQ29tcGFydG1lbnQgY29uc3RydWN0b3IgbXVzdCByZWNlaXZlIGVpdGhlciBhIG1vZHVsZSBtYXAgYXJndW1lbnQgb3IgbW9kdWxlcyBvcHRpb24sIG5vdCBib3RoYCxcbiAgICApO1xuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIG9wdGlvbnMuZ2xvYmFscyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGBDb21wYXJ0bWVudCBjb25zdHJ1Y3RvciBtdXN0IHJlY2VpdmUgZWl0aGVyIGdsb2JhbHMgYXJndW1lbnQgb3Igb3B0aW9uLCBub3QgYm90aGAsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGdsb2JhbHMsXG4gICAgICBtb2R1bGVzLFxuICAgIH07XG4gIH1cbn07XG5cbiAgICAgICBmdW5jdGlvbiB3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudChcbiAgT2xkQ29tcGFydG1lbnQsXG4gIGluZXNjYXBhYmxlVHJhbnNmb3JtcyxcbiAgaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzLFxuKSB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IE5ld0NvbXBhcnRtZW50ID0gZnVuY3Rpb24gQ29tcGFydG1lbnQoLi4uYXJncykge1xuICAgIGNvbnN0IHsgdHJhbnNmb3Jtczogb2xkVHJhbnNmb3JtcyA9IFtdLCAuLi5vdGhlck9wdGlvbnMgfSA9XG4gICAgICBjb21wYXJ0bWVudE9wdGlvbnMoLi4uYXJncyk7XG4gICAgY29uc3QgbmV3VHJhbnNmb3JtcyA9IFsuLi5vbGRUcmFuc2Zvcm1zLCAuLi5pbmVzY2FwYWJsZVRyYW5zZm9ybXNdO1xuICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7XG4gICAgICAuLi5vdGhlck9wdGlvbnMsXG4gICAgICB0cmFuc2Zvcm1zOiBuZXdUcmFuc2Zvcm1zLFxuICAgICAgX19vcHRpb25zX186IHRydWUsXG4gICAgfTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKG5ldy50YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy9cbiAgICAgIHRocm93IEVycm9yKCdDb21wYXJ0bWVudCBtdXN0IGJlIGNhbGxlZCBhcyBhIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuXG4gICAgLy9cblxuICAgIGNvbnN0IGMgPSBSZWZsZWN0LmNvbnN0cnVjdChPbGRDb21wYXJ0bWVudCwgW25ld09wdGlvbnNdLCBuZXcudGFyZ2V0KTtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQgPSBOZXdDb21wYXJ0bWVudDtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBSZWZsZWN0Lm93bktleXMoaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGMuZ2xvYmFsVGhpcywgcHJvcCwge1xuICAgICAgICB2YWx1ZTogaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzW3Byb3BdLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgLy9cbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjO1xuICB9O1xuXG4gIC8vXG4gIE5ld0NvbXBhcnRtZW50LnByb3RvdHlwZSA9IE9sZENvbXBhcnRtZW50LnByb3RvdHlwZTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuXG4gIHJldHVybiBOZXdDb21wYXJ0bWVudDtcbn1cblxuLy9cbi8vXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCI6WyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACrtsVhihYAAIoWAAAnAAAAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyIsIkBlbmRvL2Jhc2U2NCIsIkBlbmRvL2Vycm9ycyIsIi4vY29tcGFydG1lbnQtd3JhcHBlci5qcyJdLCJleHBvcnRzIjpbImJ1bmRsZVRlc3RFeHBvcnRzIiwiaW1wb3J0QnVuZGxlIiwidHlwZWRJbXBvcnRCdW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXJzZUFyY2hpdmUsZGVjb2RlQmFzZTY0LEZhaWwsd3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanNcIiwgW1tcInBhcnNlQXJjaGl2ZVwiLFskaM2PX2EgPT4gKHBhcnNlQXJjaGl2ZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Jhc2U2NFwiLCBbW1wiZGVjb2RlQmFzZTY0XCIsWyRozY9fYSA9PiAoZGVjb2RlQmFzZTY0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtd3JhcHBlci5qc1wiLCBbW1wid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnRcIixbJGjNj19hID0+ICh3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGltcG9ydEJ1bmRsZSwnbmFtZScse3ZhbHVlOlwiaW1wb3J0QnVuZGxlXCJ9KTskaM2PX29uY2UuaW1wb3J0QnVuZGxlKGltcG9ydEJ1bmRsZSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLy9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBpbXBvcnRCdW5kbGUoYnVuZGxlLCBvcHRpb25zID0ge30sIHBvd2VycyA9IHt9KSB7XG4gIGF3YWl0IG51bGw7XG4gIGNvbnN0IHtcbiAgICBidW5kbGVVcmwgPSB1bmRlZmluZWQsXG4gICAgZmlsZVByZWZpeCxcbiAgICBlbmRvd21lbnRzOiBvcHRFbmRvd21lbnRzID0ge30sXG4gICAgLy9cbiAgICAvL1xuICAgIHRyYW5zZm9ybXMgPSBbXSxcbiAgICBpbmVzY2FwYWJsZVRyYW5zZm9ybXMgPSBbXSxcbiAgICBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMgPSB7fSxcbiAgICBleHBlY3RlZFNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHtcbiAgICBjb21wdXRlU2hhNTEyID0gdW5kZWZpbmVkLFxuICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbiA9IHVuZGVmaW5lZCxcbiAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24gPSB1bmRlZmluZWQsXG4gIH0gPSBwb3dlcnM7XG4gIGNvbnN0IGVuZG93bWVudHMgPSB7XG4gICAgVGV4dEVuY29kZXIsXG4gICAgVGV4dERlY29kZXIsXG4gICAgVVJMOiBnbG9iYWxUaGlzLlVSTCwgLy9cbiAgICBCYXNlNjQ6IGdsb2JhbFRoaXMuQmFzZTY0LCAvL1xuICAgIGF0b2I6IGdsb2JhbFRoaXMuYXRvYixcbiAgICBidG9hOiBnbG9iYWxUaGlzLmJ0b2EsXG4gICAgLi4ub3B0RW5kb3dtZW50cyxcbiAgfTtcblxuICBsZXQgQ29tcGFydG1lbnRUb1VzZSA9IENvbXBhcnRtZW50O1xuICBpZiAoXG4gICAgaW5lc2NhcGFibGVUcmFuc2Zvcm1zLmxlbmd0aCB8fFxuICAgIE9iamVjdC5rZXlzKGluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcykubGVuZ3RoXG4gICkge1xuICAgIC8vXG4gICAgQ29tcGFydG1lbnRUb1VzZSA9IHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KFxuICAgICAgQ29tcGFydG1lbnQsXG4gICAgICBpbmVzY2FwYWJsZVRyYW5zZm9ybXMsXG4gICAgICBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMsXG4gICAgKTtcbiAgfVxuXG4gIGxldCBjb21wYXJ0bWVudDtcblxuICBhc3NlcnQoJ21vZHVsZUZvcm1hdCcgaW4gYnVuZGxlKTtcbiAgY29uc3QgeyBtb2R1bGVGb3JtYXQgfSA9IGJ1bmRsZTtcbiAgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2VuZG9aaXBCYXNlNjQnKSB7XG4gICAgYXNzZXJ0KCdlbmRvWmlwQmFzZTY0JyBpbiBidW5kbGUpO1xuICAgIGNvbnN0IHsgZW5kb1ppcEJhc2U2NCB9ID0gYnVuZGxlO1xuICAgIGNvbnN0IGJ5dGVzID0gZGVjb2RlQmFzZTY0KGVuZG9aaXBCYXNlNjQpO1xuICAgIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBwYXJzZUFyY2hpdmUoYnl0ZXMsIGJ1bmRsZVVybCwge1xuICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgIGV4cGVjdGVkU2hhNTEyLFxuICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uLFxuICAgIH0pO1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB7IG5hbWVzcGFjZSB9ID0gYXdhaXQgYXJjaGl2ZVsnaW1wb3J0J10oe1xuICAgICAgZ2xvYmFsczogZW5kb3dtZW50cyxcbiAgICAgIF9fc2hpbVRyYW5zZm9ybXNfXzogdHJhbnNmb3JtcyxcbiAgICAgIENvbXBhcnRtZW50OiBDb21wYXJ0bWVudFRvVXNlLFxuICAgIH0pO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICd0ZXN0Jykge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBidW5kbGVbU3ltYm9sLmZvcignZXhwb3J0cycpXTtcbiAgICBpZiAoZXhwb3J0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgaW1wb3J0IGJ1bmRsZSB3aXRoIG1vZHVsZUZvcm1hdCBcInRlc3RcIiB0aGF0IGxhY2tzIGFuIHN5bWJvbC1uYW1lZCBwcm9wZXJ0eSBAZXhwb3J0cyBhbmQgaGFzIGxpa2VseSBiZWVuIHBhcnRpYWxseSB0cmFuc3BvcnRlZCB2aWEgSlNPTiBvciBldmVudHVhbC1zZW5kJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIE9iamVjdC5zZWFsKFxuICAgICAgT2JqZWN0LmNyZWF0ZShcbiAgICAgICAgbnVsbCxcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFtcbiAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhleHBvcnRzKSlcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAuc29ydCgoW2FdLCBbYl0pID0+IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCkpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAoW25hbWUsIGRlc2NyaXB0b3JdKSA9PlxuICAgICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChbbmFtZV0pID0+IFtcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBleHBvcnRzW25hbWVdLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBTeW1ib2wudG9TdHJpbmdUYWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnTW9kdWxlJyxcbiAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnQoJ3NvdXJjZScgaW4gYnVuZGxlKTtcbiAgbGV0IHsgc291cmNlIH0gPSBidW5kbGU7XG4gIGNvbnN0IHNvdXJjZU1hcCA9ICdzb3VyY2VNYXAnIGluIGJ1bmRsZSA/IGJ1bmRsZS5zb3VyY2VNYXAgOiAnJztcbiAgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2dldEV4cG9ydCcpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgc291cmNlID0gYCgke3NvdXJjZX0pXFxuJHtzb3VyY2VNYXB9YDtcbiAgfSBlbHNlIGlmIChtb2R1bGVGb3JtYXQgPT09ICduZXN0ZWRFdmFsdWF0ZScpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGVuZG93bWVudHMubmVzdGVkRXZhbHVhdGUgPSBzcmMgPT4gY29tcGFydG1lbnQuZXZhbHVhdGUoc3JjKTtcbiAgICBzb3VyY2UgPSBgKCR7c291cmNlfSlcXG4ke3NvdXJjZU1hcH1gO1xuICB9IGVsc2UgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2VuZG9TY3JpcHQnKSB7XG4gICAgLy9cbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCBtb2R1bGVGb3JtYXQgJyR7bW9kdWxlRm9ybWF0fSdgO1xuICB9XG5cbiAgY29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnRUb1VzZShlbmRvd21lbnRzLCB7fSwgeyB0cmFuc2Zvcm1zIH0pO1xuICBoYXJkZW4oY29tcGFydG1lbnQuZ2xvYmFsVGhpcyk7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXBhcnRtZW50LmV2YWx1YXRlKHNvdXJjZSk7XG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICdlbmRvU2NyaXB0Jykge1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgY29uc3QgbmFtZXNwYWNlID0gcmVzdWx0KGZpbGVQcmVmaXgpO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdHlwZWRJbXBvcnRCdW5kbGUgPSBpbXBvcnRCdW5kbGU7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS50eXBlZEltcG9ydEJ1bmRsZSh0eXBlZEltcG9ydEJ1bmRsZSk7XG4gICAgICAgY29uc3QgYnVuZGxlVGVzdEV4cG9ydHMgPSBleHBvcnRzID0+IHtcbiAgY29uc3Qgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZXhwb3J0cykuZmlsdGVyKFxuICAgIG5hbWUgPT4gbmFtZSAhPT0gU3ltYm9sLnRvU3RyaW5nVGFnLFxuICApO1xuICBzeW1ib2xzLmxlbmd0aCA+IDAgJiZcbiAgICBGYWlsYGV4cG9ydHMgbXVzdCBub3QgaGF2ZSBzeW1ib2wtbmFtZWQgcHJvcGVydGllcywgZ290OiAke3N5bWJvbHMubWFwKFN0cmluZykuam9pbignLCAnKX1gO1xuICByZXR1cm4ge1xuICAgIG1vZHVsZUZvcm1hdDogJ3Rlc3QnLFxuICAgIFtTeW1ib2wuZm9yKCdleHBvcnRzJyldOiBleHBvcnRzLFxuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiovJGjNj19vbmNlLmJ1bmRsZVRlc3RFeHBvcnRzKGJ1bmRsZVRlc3RFeHBvcnRzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImltcG9ydEJ1bmRsZSI6WyJpbXBvcnRCdW5kbGUiXSwidHlwZWRJbXBvcnRCdW5kbGUiOlsidHlwZWRJbXBvcnRCdW5kbGUiXSwiYnVuZGxlVGVzdEV4cG9ydHMiOlsiYnVuZGxlVGVzdEV4cG9ydHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALdVQBoIHAACCBwAAHQAAAEBlbmRvL21hcnNoYWwtdjEuNi40L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL21hcnNoYWwuanMiLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiLCIuL3NyYy9yYW5rT3JkZXIuanMiLCIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhcnNlIiwicGFyc2UiLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvcmFua09yZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6W1siUUNMQVNTIiwiUUNMQVNTIl1dLCIuL3NyYy9tYXJzaGFsLmpzIjpbWyJtYWtlTWFyc2hhbCIsIm1ha2VNYXJzaGFsIl1dLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6W1sic3RyaW5naWZ5Iiwic3RyaW5naWZ5Il0sWyJwYXJzZSIsInBhcnNlIl1dLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6W1siZGVjb2RlVG9KdXN0aW4iLCJkZWNvZGVUb0p1c3RpbiJdXSwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOltbIm1ha2VQYXNzYWJsZUtpdCIsIm1ha2VQYXNzYWJsZUtpdCJdLFsibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIl0sWyJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiXSxbImlzRW5jb2RlZFJlbW90YWJsZSIsImlzRW5jb2RlZFJlbW90YWJsZSJdLFsiemVyb1BhZCIsInplcm9QYWQiXSxbInJlY29yZE5hbWVzIiwicmVjb3JkTmFtZXMiXSxbInJlY29yZFZhbHVlcyIsInJlY29yZFZhbHVlcyJdXSwiLi9zcmMvcmFua09yZGVyLmpzIjpbWyJ0cml2aWFsQ29tcGFyYXRvciIsInRyaXZpYWxDb21wYXJhdG9yIl0sWyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCJdLFsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayJdLFsiaXNSYW5rU29ydGVkIiwiaXNSYW5rU29ydGVkIl0sWyJzb3J0QnlSYW5rIiwic29ydEJ5UmFuayJdLFsiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUFudGlSYW5rIl0sWyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il0sWyJnZXRQYXNzU3R5bGVDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIl0sWyJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaW50ZXJzZWN0UmFua0NvdmVycyJdLFsidW5pb25SYW5rQ292ZXJzIiwidW5pb25SYW5rQ292ZXJzIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJkZWVwbHlGdWxmaWxsZWQiLCJkZWVwbHlGdWxmaWxsZWQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJV8ZZmaTwAAmk8AACoAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VQYXNzYWJsZUtpdCIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLGlzRXJyb3JMaWtlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsYixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJiXCIsWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IGZyb21FbnRyaWVzLCBpcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vL1xuY29uc3QgckMwID0gL1tcXHgwMC1cXHgxRl0vO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGdldFN1ZmZpeCA9IChzdHIsIGluZGV4KSA9PiAoaW5kZXggPT09IDAgPyBzdHIgOiBzdHIuc3Vic3RyaW5nKGluZGV4KSk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHJlY29yZE5hbWVzID0gcmVjb3JkID0+XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGhhcmRlbigvKiAgICAgICAgICAgICAgICAgICAqLyAob3duS2V5cyhyZWNvcmQpKS5zb3J0KCkucmV2ZXJzZSgpKTskaM2PX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuaGFyZGVuKHJlY29yZE5hbWVzKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcmVjb3JkVmFsdWVzID0gKHJlY29yZCwgbmFtZXMpID0+XG4gIGhhcmRlbihuYW1lcy5tYXAobmFtZSA9PiByZWNvcmRbbmFtZV0pKTskaM2PX29uY2UucmVjb3JkVmFsdWVzKHJlY29yZFZhbHVlcyk7XG5oYXJkZW4ocmVjb3JkVmFsdWVzKTtcblxuY29uc3QgemVyb2VzID0gQXJyYXkoMTYpXG4gIC5maWxsKHVuZGVmaW5lZClcbiAgLm1hcCgoXywgaSkgPT4gJzAnLnJlcGVhdChpKSk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB6ZXJvUGFkID0gKG4sIHNpemUpID0+IHtcbiAgY29uc3QgblN0ciA9IGAke259YDtcbiAgY29uc3QgZmlsbExlbiA9IHNpemUgLSBuU3RyLmxlbmd0aDtcbiAgaWYgKGZpbGxMZW4gPT09IDApIHJldHVybiBuU3RyO1xuICBhc3NlcnQoZmlsbExlbiA+IDAgJiYgZmlsbExlbiA8IHplcm9lcy5sZW5ndGgpO1xuICByZXR1cm4gYCR7emVyb2VzW2ZpbGxMZW5dfSR7blN0cn1gO1xufTskaM2PX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBhc051bWJlciA9IG5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHMgPSBuZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cyA9ICdmZmY4MDAwMDAwMDAwMDAwJztcblxuLypcblxuXG4gKi9cbmNvbnN0IGVuY29kZUJpbmFyeTY0ID0gbiA9PiB7XG4gIC8vXG4gIGlmIChpcyhuLCAtMCkpIHtcbiAgICBuID0gMDtcbiAgfSBlbHNlIGlmIChpcyhuLCBOYU4pKSB7XG4gICAgcmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gIH1cbiAgYXNOdW1iZXJbMF0gPSBuO1xuICBsZXQgYml0cyA9IGFzQml0c1swXTtcbiAgaWYgKG4gPCAwKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICByZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksIDE2KX1gO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQmluYXJ5NjQgPSAoZW5jb2RlZCwgc2tpcCA9IDApID0+IHtcbiAgZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICdmJyB8fCBGYWlsYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IGJpdHMgPSBCaWdJbnQoYDB4JHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpfWApO1xuICBpZiAoZW5jb2RlZC5jaGFyQXQoc2tpcCArIDEpIDwgJzgnKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICBhc0JpdHNbMF0gPSBiaXRzO1xuICBjb25zdCByZXN1bHQgPSBhc051bWJlclswXTtcbiAgIWlzKHJlc3VsdCwgLTApIHx8XG4gICAgRmFpbGBVbmV4cGVjdGVkIG5lZ2F0aXZlIHplcm86ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBlbmNvZGVCaWdJbnQgPSBuID0+IHtcbiAgY29uc3QgYWJzID0gbiA8IDBuID8gLW4gOiBuO1xuICBjb25zdCBuRGlnaXRzID0gYWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuICBjb25zdCBsRGlnaXRzID0gbkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbiAgaWYgKG4gPCAwbikge1xuICAgIHJldHVybiBgbiR7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgICcjJy5yZXBlYXQobERpZ2l0cyAtIDEpXG4gICAgfSR7XG4gICAgICAvL1xuICAgICAgKDEwICoqIGxEaWdpdHMgLSBuRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsICcwJylcbiAgICB9OiR7XG4gICAgICAvL1xuICAgICAgKDEwbiAqKiBCaWdJbnQobkRpZ2l0cykgKyBuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsICcwJylcbiAgICB9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYHAke1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAnficucmVwZWF0KGxEaWdpdHMgLSAxKVxuICAgIH0ke1xuICAgICAgLy9cbiAgICAgIG5EaWdpdHNcbiAgICB9OiR7XG4gICAgICAvL1xuICAgICAgblxuICAgIH1gO1xuICB9XG59O1xuXG5jb25zdCByQmlnSW50UGF5bG9hZCA9IC8oWzAtOV0rKSg6KFswLTldKyR8KXwpL3M7XG5cbi8qXG5cblxuICovXG5jb25zdCBkZWNvZGVCaWdJbnQgPSBlbmNvZGVkID0+IHtcbiAgY29uc3QgdHlwZVByZWZpeCA9IGVuY29kZWQuY2hhckF0KDApOyAvL1xuICB0eXBlUHJlZml4ID09PSAncCcgfHxcbiAgICB0eXBlUHJlZml4ID09PSAnbicgfHxcbiAgICBGYWlsYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuICBjb25zdCB7XG4gICAgaW5kZXg6IGxEaWdpdHMsXG4gICAgMTogc25EaWdpdHMsXG4gICAgMjogdGFpbCxcbiAgICAzOiBkaWdpdHMsXG4gIH0gPSBlbmNvZGVkLm1hdGNoKHJCaWdJbnRQYXlsb2FkKSB8fCBGYWlsYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuICBzbkRpZ2l0cy5sZW5ndGggPT09IGxEaWdpdHMgfHxcbiAgICBGYWlsYFVuYXJ5LXByZWZpeGVkIGRlY2ltYWwgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgbkRpZ2l0cyA9IHBhcnNlSW50KHNuRGlnaXRzLCAxMCk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgbkRpZ2l0cyA9IDEwICoqIC8qICAgICAgICAgICAgICAgICAqLyAobERpZ2l0cykgLSBuRGlnaXRzO1xuICB9XG5cbiAgdGFpbC5jaGFyQXQoMCkgPT09ICc6JyB8fCBGYWlsYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGRpZ2l0cy5sZW5ndGggPT09IG5EaWdpdHMgfHxcbiAgICBGYWlsYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBuID0gQmlnSW50KGRpZ2l0cyk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgbiA9IC0oMTBuICoqIEJpZ0ludChuRGlnaXRzKSAtIG4pO1xuICB9XG5cbiAgcmV0dXJuIG47XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHN0cmluZ0VzY2FwZXMgPSBBcnJheSgweDIyKVxuICAuZmlsbCh1bmRlZmluZWQpXG4gIC5tYXAoKF8sIGNwKSA9PiB7XG4gICAgc3dpdGNoIChTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKSkge1xuICAgICAgY2FzZSAnICc6XG4gICAgICAgIHJldHVybiAnIV8nO1xuICAgICAgY2FzZSAnISc6XG4gICAgICAgIHJldHVybiAnIXwnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGAhJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNwICsgMHgyMSl9YDtcbiAgICB9XG4gIH0pO1xuc3RyaW5nRXNjYXBlc1snXicuY2hhckNvZGVBdCgwKV0gPSAnX0AnO1xuc3RyaW5nRXNjYXBlc1snXycuY2hhckNvZGVBdCgwKV0gPSAnX18nO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4ID0gc3RyID0+XG4gIHN0ci5yZXBsYWNlKC9bXFwwLSFeX10vZywgY2ggPT4gc3RyaW5nRXNjYXBlc1tjaC5jaGFyQ29kZUF0KDApXSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXggPSBlbmNvZGVkID0+IHtcbiAgcmV0dXJuIGVuY29kZWQucmVwbGFjZSgvKFtcXDAtIV9dKSgufFxcbik/L2csIChlc2MsIHByZWZpeCwgc3VmZml4KSA9PiB7XG4gICAgc3dpdGNoIChlc2MpIHtcbiAgICAgIGNhc2UgJyFfJzpcbiAgICAgICAgcmV0dXJuICcgJztcbiAgICAgIGNhc2UgJyF8JzpcbiAgICAgICAgcmV0dXJuICchJztcbiAgICAgIGNhc2UgJ19AJzpcbiAgICAgICAgcmV0dXJuICdeJztcbiAgICAgIGNhc2UgJ19fJzpcbiAgICAgICAgcmV0dXJuICdfJztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgY2ggPSAvKiAgICAgICAgICAgICAgICAgKi8gKHN1ZmZpeCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIChwcmVmaXggPT09ICchJyAmJiBzdWZmaXggIT09IHVuZGVmaW5lZCAmJiBjaCA+PSAnIScgJiYgY2ggPD0gJ0AnKSB8fFxuICAgICAgICAgIEZhaWxgaW52YWxpZCBzdHJpbmcgZXNjYXBlOiAke3EoZXNjKX1gO1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaC5jaGFyQ29kZUF0KDApIC0gMHgyMSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCA9IHN0ciA9PiBzdHI7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCA9IGVuY29kZWQgPT4gZW5jb2RlZDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydeJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGNoYXJzLnB1c2goZW5jLCAnICcpO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdEFycmF5ID0gKGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICBsZXQgZGVwdGggPSAwO1xuICAvL1xuICAvL1xuICBsZXQgbmV4dEluZGV4ID0gc2tpcCArIDE7XG4gIGxldCBjdXJyZW50RWxlbWVudFN0YXJ0ID0gc2tpcCArIDE7XG4gIGZvciAoY29uc3QgeyAwOiBjaCwgaW5kZXg6IGkgfSBvZiBlbmNvZGVkLm1hdGNoQWxsKC9bXFxeIF0vZykpIHtcbiAgICBjb25zdCBpbmRleCA9IC8qICAgICAgICAgICAgICAgICAqLyAoaSk7XG4gICAgaWYgKGluZGV4IDw9IHNraXApIHtcbiAgICAgIGlmIChpbmRleCA9PT0gc2tpcCkge1xuICAgICAgICBjaCA9PT0gJ14nIHx8IEZhaWxgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoID09PSAnXicpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgZGVwdGggKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIGlmIChpbmRleCA9PT0gbmV4dEluZGV4KSB7XG4gICAgICAgIC8vXG4gICAgICAgIGRlcHRoIC09IDE7XG4gICAgICAgIGRlcHRoID49IDAgfHxcbiAgICAgICAgICAvL1xuICAgICAgICAgIEZhaWxgdW5leHBlY3RlZCBhcnJheSBlbGVtZW50IHRlcm1pbmF0b3I6ICR7ZW5jb2RlZC5zbGljZShza2lwLCBpbmRleCArIDIpfWA7XG4gICAgICB9XG4gICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgLy9cbiAgICAgICAgZWxlbWVudHMucHVzaChcbiAgICAgICAgICBkZWNvZGVQYXNzYWJsZShlbmNvZGVkLnNsaWNlKGN1cnJlbnRFbGVtZW50U3RhcnQsIGluZGV4KSksXG4gICAgICAgICk7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50U3RhcnQgPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8vXG4gICAgbmV4dEluZGV4ID0gaW5kZXggKyAxO1xuICB9XG4gIGRlcHRoID09PSAwIHx8IEZhaWxgdW50ZXJtaW5hdGVkIGFycmF5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBuZXh0SW5kZXggPT09IGVuY29kZWQubGVuZ3RoIHx8XG4gICAgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXkgZWxlbWVudDogJHtnZXRTdWZmaXgoXG4gICAgICBlbmNvZGVkLFxuICAgICAgY3VycmVudEVsZW1lbnRTdGFydCxcbiAgICApfWA7XG4gIHJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydbJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGZvciAoY29uc3QgYyBvZiBlbmMpIHtcbiAgICAgIGlmIChjID09PSAnXFx1MDAwMCcgfHwgYyA9PT0gJ1xcdTAwMDEnKSB7XG4gICAgICAgIGNoYXJzLnB1c2goJ1xcdTAwMDEnKTtcbiAgICAgIH1cbiAgICAgIGNoYXJzLnB1c2goYyk7XG4gICAgfVxuICAgIGNoYXJzLnB1c2goJ1xcdTAwMDAnKTtcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJyk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeUFycmF5ID0gKGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICBjb25zdCBlbGVtQ2hhcnMgPSBbXTtcbiAgLy9cbiAgLy9cbiAgbGV0IHN0aWxsVG9Ta2lwID0gc2tpcCArIDE7XG4gIGxldCBpbkVzY2FwZSA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGMgb2YgZW5jb2RlZCkge1xuICAgIGlmIChzdGlsbFRvU2tpcCA+IDApIHtcbiAgICAgIHN0aWxsVG9Ta2lwIC09IDE7XG4gICAgICBpZiAoc3RpbGxUb1NraXAgPT09IDApIHtcbiAgICAgICAgYyA9PT0gJ1snIHx8IEZhaWxgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluRXNjYXBlKSB7XG4gICAgICBjID09PSAnXFx1MDAwMCcgfHxcbiAgICAgICAgYyA9PT0gJ1xcdTAwMDEnIHx8XG4gICAgICAgIEZhaWxgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2N9YDtcbiAgICAgIGVsZW1DaGFycy5wdXNoKGMpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICBjb25zdCBlbmNvZGVkRWxlbWVudCA9IGVsZW1DaGFycy5qb2luKCcnKTtcbiAgICAgIGVsZW1DaGFycy5sZW5ndGggPSAwO1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRlY29kZVBhc3NhYmxlKGVuY29kZWRFbGVtZW50KTtcbiAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFx1MDAwMScpIHtcbiAgICAgIGluRXNjYXBlID0gdHJ1ZTtcbiAgICAgIC8vXG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbUNoYXJzLnB1c2goYyk7XG4gICAgfVxuICAgIGluRXNjYXBlID0gZmFsc2U7XG4gIH1cbiAgIWluRXNjYXBlIHx8IEZhaWxgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgZWxlbUNoYXJzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG59O1xuXG5jb25zdCBlbmNvZGVSZWNvcmQgPSAocmVjb3JkLCBlbmNvZGVBcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgbmFtZXMgPSByZWNvcmROYW1lcyhyZWNvcmQpO1xuICBjb25zdCB2YWx1ZXMgPSByZWNvcmRWYWx1ZXMocmVjb3JkLCBuYW1lcyk7XG4gIHJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcywgdmFsdWVzXSksIGVuY29kZVBhc3NhYmxlKX1gO1xufTtcblxuY29uc3QgZGVjb2RlUmVjb3JkID0gKGVuY29kZWQsIGRlY29kZUFycmF5LCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApID09PSAnKCcpO1xuICAvL1xuICAvL1xuICBjb25zdCB1bnppcHBlZEVudHJpZXMgPSBkZWNvZGVBcnJheShlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCArIDEpO1xuICB1bnppcHBlZEVudHJpZXMubGVuZ3RoID09PSAyIHx8XG4gICAgRmFpbGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBba2V5cywgdmFsc10gPSB1bnppcHBlZEVudHJpZXM7XG5cbiAgKHBhc3NTdHlsZU9mKGtleXMpID09PSAnY29weUFycmF5JyAmJlxuICAgIHBhc3NTdHlsZU9mKHZhbHMpID09PSAnY29weUFycmF5JyAmJlxuICAgIGtleXMubGVuZ3RoID09PSB2YWxzLmxlbmd0aCAmJlxuICAgIGtleXMuZXZlcnkoa2V5ID0+IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSkgfHxcbiAgICBGYWlsYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgbWFwRW50cmllcyA9IGtleXMubWFwKChrZXksIGkpID0+IFtrZXksIHZhbHNbaV1dKTtcbiAgY29uc3QgcmVjb3JkID0gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbiAgYXNzZXJ0UmVjb3JkKHJlY29yZCwgJ2RlY29kZWQgcmVjb3JkJyk7XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQgPSAodGFnZ2VkLCBlbmNvZGVBcnJheSwgZW5jb2RlUGFzc2FibGUpID0+XG4gIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLCB0YWdnZWQucGF5bG9hZF0pLCBlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkID0gKGVuY29kZWQsIGRlY29kZUFycmF5LCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApID09PSAnOicpO1xuICAvL1xuICAvL1xuICBjb25zdCB0YWdnZWRQYXlsb2FkID0gZGVjb2RlQXJyYXkoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgKyAxKTtcbiAgdGFnZ2VkUGF5bG9hZC5sZW5ndGggPT09IDIgfHxcbiAgICBGYWlsYGV4cGVjdGVkIHRhZyxwYXlsb2FkIHBhaXI6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IFt0YWcsIHBheWxvYWRdID0gdGFnZ2VkUGF5bG9hZDtcbiAgcGFzc1N0eWxlT2YodGFnKSA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVSZW1vdGFibGUgPSAodW5zYWZlRW5jb2RlUmVtb3RhYmxlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVSZW1vdGFibGUgPSAociwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVJlbW90YWJsZShyLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAncicpIHx8XG4gICAgICBGYWlsYFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ1JlbW90YWJsZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVJlbW90YWJsZTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVQcm9taXNlID0gKHVuc2FmZUVuY29kZVByb21pc2UsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSAocCwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVByb21pc2UocCwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJz8nKSB8fFxuICAgICAgRmFpbGBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtlbmNvZGluZ31gO1xuICAgIHZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCAnUHJvbWlzZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVByb21pc2U7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlRXJyb3IgPSAodW5zYWZlRW5jb2RlRXJyb3IsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gKGVyciwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZUVycm9yKGVyciwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJyEnKSB8fFxuICAgICAgRmFpbGBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ0Vycm9yJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlRXJyb3I7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VJbm5lckVuY29kZSA9IChlbmNvZGVTdHJpbmdTdWZmaXgsIGVuY29kZUFycmF5LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGU6IHVuc2FmZUVuY29kZVJlbW90YWJsZSxcbiAgICBlbmNvZGVQcm9taXNlOiB1bnNhZmVFbmNvZGVQcm9taXNlLFxuICAgIGVuY29kZUVycm9yOiB1bnNhZmVFbmNvZGVFcnJvcixcbiAgICB2ZXJpZnlFbmNvZGluZyA9ICgpID0+IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW5jb2RlUmVtb3RhYmxlID0gbWFrZUVuY29kZVJlbW90YWJsZShcbiAgICB1bnNhZmVFbmNvZGVSZW1vdGFibGUsXG4gICAgdmVyaWZ5RW5jb2RpbmcsXG4gICk7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSBtYWtlRW5jb2RlUHJvbWlzZSh1bnNhZmVFbmNvZGVQcm9taXNlLCB2ZXJpZnlFbmNvZGluZyk7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gbWFrZUVuY29kZUVycm9yKHVuc2FmZUVuY29kZUVycm9yLCB2ZXJpZnlFbmNvZGluZyk7XG5cbiAgY29uc3QgaW5uZXJFbmNvZGUgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgIH1cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOiB7XG4gICAgICAgIHJldHVybiAndic7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiAneic7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIHJldHVybiBgcyR7ZW5jb2RlU3RyaW5nU3VmZml4KHBhc3NhYmxlKX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYm9vbGVhbic6IHtcbiAgICAgICAgcmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVJlbW90YWJsZShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVByb21pc2UocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICByZXR1cm4gYHkke2VuY29kZVN0cmluZ1N1ZmZpeChuYW1lKX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBpbm5lckVuY29kZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBsaWJlcmFsRGVjb2RlcnMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gIC8qICAgICAgICAgICAgICAgICAgKi8gKHtcbiAgICBkZWNvZGVSZW1vdGFibGU6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZVByb21pc2U6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZUVycm9yOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgfSlcbik7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUlubmVyRGVjb2RlID0gKGRlY29kZVN0cmluZ1N1ZmZpeCwgZGVjb2RlQXJyYXksIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH0gPSBvcHRpb25zO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbm5lckRlY29kZSA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICAgIHN3aXRjaCAoZW5jb2RlZC5jaGFyQXQoc2tpcCkpIHtcbiAgICAgIGNhc2UgJ3YnOiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY2FzZSAneic6IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2YnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3MnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdiJzoge1xuICAgICAgICBjb25zdCBzdWJzdHJpbmcgPSBnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpO1xuICAgICAgICBpZiAoc3Vic3RyaW5nID09PSAndHJ1ZScpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzdHJpbmcgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBleHBlY3RlZCBlbmNvZGVkIGJvb2xlYW4gdG8gYmUgXCJidHJ1ZVwiIG9yIFwiYmZhbHNlXCI6ICR7c3Vic3RyaW5nfWA7XG4gICAgICB9XG4gICAgICBjYXNlICduJzpcbiAgICAgIGNhc2UgJ3AnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaWdJbnQoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3InOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVSZW1vdGFibGUoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICc/Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUHJvbWlzZShnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVFcnJvcihnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3knOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdbJzpcbiAgICAgIGNhc2UgJ14nOiB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICcoJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICc6Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW5uZXJEZWNvZGU7XG59O1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVBhc3NhYmxlS2l0ID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlID0gKHIsIF8pID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cn1gLFxuICAgIGVuY29kZVByb21pc2UgPSAocCwgXykgPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cH1gLFxuICAgIGVuY29kZUVycm9yID0gKGVyciwgXykgPT4gRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gLFxuICAgIGZvcm1hdCA9ICdsZWdhY3lPcmRlcmVkJyxcblxuICAgIGRlY29kZVJlbW90YWJsZSA9IChlbmNvZGluZywgXykgPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICAgIGRlY29kZVByb21pc2UgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gICAgZGVjb2RlRXJyb3IgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICB9ID0gb3B0aW9ucztcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgZW5jb2RlUGFzc2FibGU7XG4gIGNvbnN0IGVuY29kZU9wdGlvbnMgPSB7IGVuY29kZVJlbW90YWJsZSwgZW5jb2RlUHJvbWlzZSwgZW5jb2RlRXJyb3IsIGZvcm1hdCB9O1xuICBpZiAoZm9ybWF0ID09PSAnY29tcGFjdE9yZGVyZWQnKSB7XG4gICAgY29uc3QgbGliZXJhbERlY29kZSA9IG1ha2VJbm5lckRlY29kZShcbiAgICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgICBsaWJlcmFsRGVjb2RlcnMsXG4gICAgKTtcbiAgICAvKlxuXG5cblxuICAgICAqL1xuICAgIGNvbnN0IHZlcmlmeUVuY29kaW5nID0gKGVuY29kaW5nLCBsYWJlbCkgPT4ge1xuICAgICAgIWVuY29kaW5nLm1hdGNoKHJDMCkgfHxcbiAgICAgICAgRmFpbGAke2IoXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICl9IGVuY29kaW5nIG11c3Qgbm90IGNvbnRhaW4gYSBDMCBjb250cm9sIGNoYXJhY3RlcjogJHtlbmNvZGluZ31gO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUNvbXBhY3RBcnJheShgXnYgJHtlbmNvZGluZ30gdiBgLCBsaWJlcmFsRGVjb2RlKTtcbiAgICAgIChpc0FycmF5KGRlY29kZWQpICYmXG4gICAgICAgIGRlY29kZWQubGVuZ3RoID09PSAzICYmXG4gICAgICAgIGRlY29kZWRbMF0gPT09IG51bGwgJiZcbiAgICAgICAgZGVjb2RlZFsyXSA9PT0gbnVsbCkgfHxcbiAgICAgICAgRmFpbGAke2IobGFiZWwpfSBlbmNvZGluZyBtdXN0IGJlIGVtYmVkZGFibGU6ICR7ZW5jb2Rpbmd9YDtcbiAgICB9O1xuICAgIGNvbnN0IGVuY29kZUNvbXBhY3QgPSBtYWtlSW5uZXJFbmNvZGUoXG4gICAgICBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlQ29tcGFjdEFycmF5LFxuICAgICAgeyAuLi5lbmNvZGVPcHRpb25zLCB2ZXJpZnlFbmNvZGluZyB9LFxuICAgICk7XG4gICAgZW5jb2RlUGFzc2FibGUgPSBwYXNzYWJsZSA9PiBgfiR7ZW5jb2RlQ29tcGFjdChwYXNzYWJsZSl9YDtcbiAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdsZWdhY3lPcmRlcmVkJykge1xuICAgIGVuY29kZVBhc3NhYmxlID0gbWFrZUlubmVyRW5jb2RlKFxuICAgICAgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlTGVnYWN5QXJyYXksXG4gICAgICBlbmNvZGVPcHRpb25zLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgZm9ybWF0OiAke3EoZm9ybWF0KX1gO1xuICB9XG5cbiAgY29uc3QgZGVjb2RlT3B0aW9ucyA9IHsgZGVjb2RlUmVtb3RhYmxlLCBkZWNvZGVQcm9taXNlLCBkZWNvZGVFcnJvciB9O1xuICBjb25zdCBkZWNvZGVDb21wYWN0ID0gbWFrZUlubmVyRGVjb2RlKFxuICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlQ29tcGFjdEFycmF5LFxuICAgIGRlY29kZU9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRlY29kZUxlZ2FjeSA9IG1ha2VJbm5lckRlY29kZShcbiAgICBkZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlTGVnYWN5QXJyYXksXG4gICAgZGVjb2RlT3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZGVjb2RlUGFzc2FibGUgPSBlbmNvZGVkID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoZW5jb2RlZC5jaGFyQXQoMCkgPT09ICd+Jykge1xuICAgICAgcmV0dXJuIGRlY29kZUNvbXBhY3QoZW5jb2RlZCwgMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVMZWdhY3koZW5jb2RlZCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IGVuY29kZVBhc3NhYmxlLCBkZWNvZGVQYXNzYWJsZSB9KTtcbn07JGjNj19vbmNlLm1ha2VQYXNzYWJsZUtpdChtYWtlUGFzc2FibGVLaXQpO1xuaGFyZGVuKG1ha2VQYXNzYWJsZUtpdCk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVBhc3NhYmxlID0gZW5jb2RlT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgZW5jb2RlUGFzc2FibGUgfSA9IG1ha2VQYXNzYWJsZUtpdChlbmNvZGVPcHRpb25zKTtcbiAgcmV0dXJuIGVuY29kZVBhc3NhYmxlO1xufTskaM2PX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlUGFzc2FibGUgPSBkZWNvZGVPcHRpb25zID0+IHtcbiAgY29uc3QgeyBkZWNvZGVQYXNzYWJsZSB9ID0gbWFrZVBhc3NhYmxlS2l0KGRlY29kZU9wdGlvbnMpO1xuICByZXR1cm4gZGVjb2RlUGFzc2FibGU7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG4gICAgICAgY29uc3QgaXNFbmNvZGVkUmVtb3RhYmxlID0gZW5jb2RlZCA9PiBlbmNvZGVkLmNoYXJBdCgwKSA9PT0gJ3InOyRozY9fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFzc1N0eWxlUHJlZml4ZXMgPSB7XG4gIGVycm9yOiAnIScsXG4gIGNvcHlSZWNvcmQ6ICcoJyxcbiAgdGFnZ2VkOiAnOicsXG4gIHByb21pc2U6ICc/JyxcbiAgY29weUFycmF5OiAnW14nLFxuICBib29sZWFuOiAnYicsXG4gIG51bWJlcjogJ2YnLFxuICBiaWdpbnQ6ICducCcsXG4gIHJlbW90YWJsZTogJ3InLFxuICBzdHJpbmc6ICdzJyxcbiAgbnVsbDogJ3YnLFxuICBzeW1ib2w6ICd5JyxcbiAgLy9cbiAgLy9cbiAgLy9cbiAgdW5kZWZpbmVkOiAneicsXG59OyRozY9fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsIG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVByZWZpeGVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VQYXNzYWJsZUtpdCI6WyJtYWtlUGFzc2FibGVLaXQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAz2KS+PQrAAD0KwAAKwAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG4gIGRlZmluZVByb3BlcnRpZXMsXG4gIGlzLFxuICBlbnRyaWVzLFxuICBmcm9tRW50cmllcyxcbiAgZnJlZXplLFxufSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IFFDTEFTUyA9ICdAcWNsYXNzJzskaM2PX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLypcblxuXG4gKi9cbmNvbnN0IGhhc1FDbGFzcyA9IGVuY29kZWQgPT4gaGFzT3duUHJvcGVydHlPZihlbmNvZGVkLCBRQ0xBU1MpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzID0gKGVuY29kZWQsIHFjbGFzcykgPT5cbiAgaXNPYmplY3QoZW5jb2RlZCkgJiZcbiAgIWlzQXJyYXkoZW5jb2RlZCkgJiZcbiAgaGFzUUNsYXNzKGVuY29kZWQpICYmXG4gIGVuY29kZWRbUUNMQVNTXSA9PT0gcWNsYXNzO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9IHJlbSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IHByb20gPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEgPSBlcnIgPT4gRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlVG9DYXBEYXRhID0gKGVuY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbiAgICBlbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG4gICAgZW5jb2RlRXJyb3JUb0NhcERhdGEgPSBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEsXG4gIH0gPSBlbmNvZGVPcHRpb25zO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyID0gcGFzc2FibGUgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICd1bmRlZmluZWQnIH07XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFzc2FibGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdOYU4nIH07XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdJbmZpbml0eScgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICctSW5maW5pdHknIH07XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGlzKHBhc3NhYmxlLCAtMCkgPyAwIDogcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW1FDTEFTU106ICdiaWdpbnQnLFxuICAgICAgICAgIGRpZ2l0czogU3RyaW5nKHBhc3NhYmxlKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyogICAgICAgICAgICAgICAgICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ3N5bWJvbCcsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLCBRQ0xBU1MpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCB7IFtRQ0xBU1NdOiBxY2xhc3NWYWx1ZSwgLi4ucmVzdCB9ID0gcGFzc2FibGU7XG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBbUUNMQVNTXTogJ2hpbGJlcnQnLFxuICAgICAgICAgICAgb3JpZ2luYWw6IGVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChvd25LZXlzKHJlc3QpLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXN1bHQucmVzdCA9IGVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhcbiAgICAgICAgICBuYW1lcy5tYXAobmFtZSA9PiBbbmFtZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAndGFnZ2VkJyxcbiAgICAgICAgICB0YWc6IGdldFRhZyhwYXNzYWJsZSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9DYXBEYXRhUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdzbG90JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICApfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ3Nsb3QnKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICAgICdzbG90JyxcbiAgICAgICAgKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnZXJyb3InKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICApfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb0NhcERhdGEgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKSk7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xufTskaM2PX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSA9IHNsb3RFbmNvZGluZyA9PlxuICBGYWlsYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IGVycm9yRW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycm9yRW5jb2Rpbmd9YDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgPSBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhLFxuICB9ID0gZGVjb2RlT3B0aW9ucztcblxuICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9PT0gZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIHx8XG4gICAgRmFpbGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEsXG4gICAgKX0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlY29kZUZyb21DYXBEYXRhID0ganNvbkVuY29kZWQgPT4ge1xuICAgIGlmICghaXNPYmplY3QoanNvbkVuY29kZWQpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGpzb25FbmNvZGVkO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShqc29uRW5jb2RlZCkpIHtcbiAgICAgIHJldHVybiBqc29uRW5jb2RlZC5tYXAoZW5jb2RlZFZhbCA9PiBkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gICAgfSBlbHNlIGlmIChoYXNRQ2xhc3MoanNvbkVuY29kZWQpKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSBqc29uRW5jb2RlZFtRQ0xBU1NdO1xuICAgICAgdHlwZW9mIHFjbGFzcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgRmFpbGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG4gICAgICBzd2l0Y2ggKHFjbGFzcykge1xuICAgICAgICAvL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdOYU4nOiB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdJbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICB0eXBlb2YgZGlnaXRzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG4gICAgICAgICAgICBqc29uRW5jb2RlZCxcbiAgICAgICAgICAgIGRlY29kZUZyb21DYXBEYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbiAgICAgICAgICAgIGpzb25FbmNvZGVkLFxuICAgICAgICAgICAgZGVjb2RlRnJvbUNhcERhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlT2YoZGVjb2RlZCkgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCAnb3JpZ2luYWwnKSB8fFxuICAgICAgICAgICAgRmFpbGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0geyBbUUNMQVNTXTogZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpIH07XG4gICAgICAgICAgaWYgKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsICdyZXN0JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzTm9uRW1wdHlPYmplY3QgPVxuICAgICAgICAgICAgICB0eXBlb2YgcmVzdCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgcmVzdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA+PSAxO1xuICAgICAgICAgICAgaWYgKCFpc05vbkVtcHR5T2JqZWN0KSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN0T2JqID0gZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAhaGFzT3duUHJvcGVydHlPZihyZXN0T2JqLCBRQ0xBU1MpIHx8XG4gICAgICAgICAgICAgIEZhaWxgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIGNhc2UgJ2liaWQnOiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbiAgICAgICAgICAgIHFjbGFzcyxcbiAgICAgICAgICApfWA7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG4gICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkID09PSAnb2JqZWN0JyAmJiBqc29uRW5jb2RlZCAhPT0gbnVsbCk7XG4gICAgICBjb25zdCBkZWNvZGVFbnRyeSA9IChbbmFtZSwgZW5jb2RlZFZhbF0pID0+IHtcbiAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICByZXR1cm4gW25hbWUsIGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkZWNvZGVkRW50cmllcyA9IGVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG4gICAgICByZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9hgbT0EsAABBLAAALQAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgaXMsIGVudHJpZXMsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IEJBTkcgPSAnIScuY2hhckNvZGVBdCgwKTtcbmNvbnN0IERBU0ggPSAnLScuY2hhckNvZGVBdCgwKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc3RhcnRzU3BlY2lhbCA9IGVuY29kZWRTdHIgPT4ge1xuICBpZiAoZW5jb2RlZFN0ciA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9cbiAgY29uc3QgY29kZSA9IGVuY29kZWRTdHIuY2hhckNvZGVBdCgwKTtcbiAgLy9cbiAgcmV0dXJuIEJBTkcgPD0gY29kZSAmJiBjb2RlIDw9IERBU0g7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gcmVtID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSBwcm9tID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSBlcnIgPT5cbiAgRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAoZW5jb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbiAgICBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuICAgIGVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2FwcyxcbiAgfSA9IGVuY29kZU9wdGlvbnM7XG5cbiAgY29uc3QgYXNzZXJ0RW5jb2RlZEVycm9yID0gZW5jb2RpbmcgPT4ge1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdvYmplY3QnICYmIGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsICcjZXJyb3InKSkgfHxcbiAgICAgIEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG4gICAgICAgIGVuY29kaW5nLFxuICAgICAgKX1gO1xuICAgIC8vXG4gICAgY29uc3QgbWVzc2FnZSA9IGVuY29kaW5nWycjZXJyb3InXTtcbiAgICAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAoIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSkgfHwgbWVzc2FnZS5jaGFyQXQoMCkgPT09ICchJykpIHx8XG4gICAgICBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzoge1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIGlmIChzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4gJyN1bmRlZmluZWQnO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSkge1xuICAgICAgICAgIHJldHVybiAnI05hTic7XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuICcjSW5maW5pdHknO1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gJyMtSW5maW5pdHknO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBpcyhwYXNzYWJsZSwgLTApID8gMCA6IHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcocGFzc2FibGUpO1xuICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICovIChwYXNzYWJsZSkgPCAwbiA/IHN0ciA6IGArJHtzdHJ9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyogICAgICAgICAgICAgICAgICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIGAlJHtuYW1lfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKFxuICAgICAgICAgIG5hbWVzLm1hcChuYW1lID0+IFtcbiAgICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG4gICAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAnI3RhZyc6IGVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnICYmIHJlc3VsdC5jaGFyQXQoMCkgPT09ICckJykge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PT0gJyYnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgICAgYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb1NtYWxsY2FwcyA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSxcbiAgICAgICk7XG4gICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2FwcyxcbiAgfSA9IGRlY29kZU9wdGlvbnM7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT4ge1xuICAgIHN3aXRjaCAodHlwZW9mIGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBpZiAoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGMgPSBlbmNvZGluZy5jaGFyQXQoMCk7XG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICclJzoge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyMnOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICAgIGNhc2UgJyN1bmRlZmluZWQnOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjTmFOJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnI0luZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjLUluZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICAgICAgWGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsXG4gICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICBjYXNlICctJzoge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyQnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKHJlc3VsdCkgIT09ICdyZW1vdGFibGUnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJic6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocGFzc1N0eWxlT2YocmVzdWx0KSAhPT0gJ3Byb21pc2UnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYFNwZWNpYWwgY2hhciAke3EoXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICApfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICBpZiAoZW5jb2RpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShlbmNvZGluZykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RpbmcubWFwKHZhbCA9PiBkZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsICcjdGFnJykpIHtcbiAgICAgICAgICBjb25zdCB7ICcjdGFnJzogdGFnLCBwYXlsb2FkLCAuLi5yZXN0IH0gPSBlbmNvZGluZztcbiAgICAgICAgICB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBGYWlsYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQoXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywgJyNlcnJvcicpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcGFzc1N0eWxlT2YocmVzdWx0KSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjb2RlRW50cnkgPSAoW2VuY29kZWROYW1lLCBlbmNvZGVkVmFsXSkgPT4ge1xuICAgICAgICAgIHR5cGVvZiBlbmNvZGVkTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgUHJvcGVydHkgbmFtZSAke3EoXG4gICAgICAgICAgICAgIGVuY29kZWROYW1lLFxuICAgICAgICAgICAgKX0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgZW5jb2RlZE5hbWUuY2hhckF0KDApICE9PSAnIycgfHxcbiAgICAgICAgICAgIEZhaWxgVW5yZWNvZ25pemVkIHJlY29yZCB0eXBlICR7cShlbmNvZGVkTmFtZSl9OiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZE5hbWUpO1xuICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBEZWNvZGVkIHByb3BlcnR5IG5hbWUgJHtuYW1lfSBmcm9tICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgIHJldHVybiBbbmFtZSwgZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkVmFsKV07XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRlY29kZWRFbnRyaWVzID0gZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgWGBpbnRlcm5hbDogdW5yZWNvZ25pemVkIEpTT04gdHlwZW9mICR7cShcbiAgICAgICAgICAgIHR5cGVvZiBlbmNvZGluZyxcbiAgICAgICAgICApfTogJHtlbmNvZGluZ31gLFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOaLU7BoLwAAaC8AACoAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxwYXNzYWJsZVN5bWJvbEZvck5hbWUscSxYLEZhaWwsUUNMQVNTOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBzdHJpbmdpZnk6IHF1b3RlIH0gPSBKU09OO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlciA9ICgpID0+IHtcbiAgY29uc3Qgc3RyaW5ncyA9IFtdO1xuICBsZXQgbGV2ZWwgPSAwO1xuICBsZXQgbmVlZFNwYWNlID0gZmFsc2U7XG4gIGNvbnN0IGxpbmUgPSAoKSA9PiB7XG4gICAgbmVlZFNwYWNlID0gZmFsc2U7XG4gICAgcmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywgJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgb3Blbjogb3BlbkJyYWNrZXQgPT4ge1xuICAgICAgbGV2ZWwgKz0gMTtcbiAgICAgIGlmIChuZWVkU3BhY2UpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuICAgIH0sXG4gICAgbGluZSxcbiAgICBuZXh0OiB0b2tlbiA9PiB7XG4gICAgICBpZiAobmVlZFNwYWNlICYmIHRva2VuICE9PSAnLCcpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSB0cnVlO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gICAgfSxcbiAgICBjbG9zZTogY2xvc2VCcmFja2V0ID0+IHtcbiAgICAgIGFzc2VydChsZXZlbCA+PSAxKTtcbiAgICAgIGxldmVsIC09IDE7XG4gICAgICBsaW5lKCk7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gICAgfSxcbiAgICBkb25lOiAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwobGV2ZWwsIDApO1xuICAgICAgcmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm4gPSAvXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyID0gKCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdHJpbmdzID0gW107XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG4gICAgbGluZTogKCkgPT4gc3RyaW5ncy5sZW5ndGgsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGxhc3QubGVuZ3RoID49IDEgJiYgdG9rZW4ubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICBjb25zdCBwYWlyID0gYCR7bGFzdFtsYXN0Lmxlbmd0aCAtIDFdfSR7dG9rZW5bMF19YDtcbiAgICAgICAgICBpZiAoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSkge1xuICAgICAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiAgICB9LFxuICAgIGNsb3NlOiBjbG9zZUJyYWNrZXQgPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEgJiYgc3RyaW5nc1tzdHJpbmdzLmxlbmd0aCAtIDFdID09PSAnLCcpIHtcbiAgICAgICAgc3RyaW5ncy5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiAgICB9LFxuICAgIGRvbmU6ICgpID0+IHN0cmluZ3Muam9pbignJyksXG4gIH0pO1xufTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuID0gL15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm4gPSAvXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWNvZGVUb0p1c3RpbiA9IChlbmNvZGluZywgc2hvdWxkSW5kZW50ID0gZmFsc2UsIHNsb3RzID0gW10pID0+IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJlcGFyZSA9IHJhd1RyZWUgPT4ge1xuICAgIGlmICghaXNPYmplY3QocmF3VHJlZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy9cbiAgICBhc3NlcnQudHlwZW9mKHJhd1RyZWUsICdvYmplY3QnKTtcbiAgICBhc3NlcnQocmF3VHJlZSAhPT0gbnVsbCk7XG4gICAgaWYgKFFDTEFTUyBpbiByYXdUcmVlKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSByYXdUcmVlW1FDTEFTU107XG4gICAgICB0eXBlb2YgcWNsYXNzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBGYWlsYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbiAgICAgIGFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4gICAgICBzd2l0Y2ggKHJhd1RyZWVbJ0BxY2xhc3MnXSkge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdOYU4nOlxuICAgICAgICBjYXNlICdJbmZpbml0eSc6XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgIHR5cGVvZiBkaWdpdHMgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICAgIGNvbnN0IHN5bSA9IHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHN5bSwgJ3N5bWJvbCcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZih0YWcsICdzdHJpbmcnKTtcbiAgICAgICAgICBwcmVwYXJlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzbG90Jzoge1xuICAgICAgICAgIGNvbnN0IHsgaW5kZXgsIGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcbiAgICAgICAgICBOYXQoaW5kZXgpO1xuICAgICAgICAgIGlmIChpZmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKGlmYWNlLCAnc3RyaW5nJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoaWxiZXJ0Jzoge1xuICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgJ29yaWdpbmFsJyBpbiByYXdUcmVlIHx8XG4gICAgICAgICAgICBGYWlsYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbiAgICAgICAgICBwcmVwYXJlKG9yaWdpbmFsKTtcbiAgICAgICAgICBpZiAoJ3Jlc3QnIGluIHJhd1RyZWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNBcnJheShyZXN0KSkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoUUNMQVNTIGluIHJlc3QpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJlc3QpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIEZhaWxgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgIHByZXBhcmUocmVzdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUsIG1lc3NhZ2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgbmFtZSl9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG4gICAgICAgICAgdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBhc3NlcnQuZmFpbChYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCwgVHlwZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShyYXdUcmVlKSkge1xuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHJhd1RyZWU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHByZXBhcmUocmF3VHJlZVtpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyYXdUcmVlKTtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgfVxuICAgICAgICBwcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlSW5kZW50ZXIgPSBzaG91bGRJbmRlbnQgPyBtYWtlWWVzSW5kZW50ZXIgOiBtYWtlTm9JbmRlbnRlcjtcbiAgbGV0IG91dCA9IG1ha2VJbmRlbnRlcigpO1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWNvZGUgPSByYXdUcmVlID0+IHtcbiAgICAvL1xuICAgIHJldHVybiByZWN1cihyYXdUcmVlKTtcbiAgfTtcblxuICBjb25zdCBkZWNvZGVQcm9wZXJ0eSA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgIG91dC5saW5lKCk7XG4gICAgaWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgb3V0Lm5leHQoYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiAgICB9IGVsc2UgaWYgKGlkZW50UGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICBvdXQubmV4dChgJHtuYW1lfTpgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lm5leHQoYCR7cXVvdGUobmFtZSl9OmApO1xuICAgIH1cbiAgICBkZWNvZGUodmFsdWUpO1xuICAgIG91dC5uZXh0KCcsJyk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgcmVjdXIgPSByYXdUcmVlID0+IHtcbiAgICBpZiAoIWlzT2JqZWN0KHJhd1RyZWUpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiAgICB9XG4gICAgLy9cbiAgICBhc3NlcnQudHlwZW9mKHJhd1RyZWUsICdvYmplY3QnKTtcbiAgICBhc3NlcnQocmF3VHJlZSAhPT0gbnVsbCk7XG4gICAgaWYgKFFDTEFTUyBpbiByYXdUcmVlKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSByYXdUcmVlW1FDTEFTU107XG4gICAgICBhc3NlcnQudHlwZW9mKHFjbGFzcywgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YoZGlnaXRzLCAnc3RyaW5nJyk7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgICBjb25zdCBzeW0gPSBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihzeW0sICdzeW1ib2wnKTtcbiAgICAgICAgICBjb25zdCByZWdpc3RlcmVkTmFtZSA9IFN5bWJvbC5rZXlGb3Ioc3ltKTtcbiAgICAgICAgICBpZiAocmVnaXN0ZXJlZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBBdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuICAgICAgICAgICAgYXNzZXJ0KG1hdGNoICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgYXNzZXJ0KFN5bWJvbFtzdWZmaXhdID09PSBzeW0pO1xuICAgICAgICAgICAgYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgU3ltYm9sLmZvcigke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHsgdGFnLCBwYXlsb2FkIH0gPSByYXdUcmVlO1xuICAgICAgICAgIG91dC5uZXh0KGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX0sYCk7XG4gICAgICAgICAgZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dCgnKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICBsZXQgeyBpZmFjZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IE51bWJlcihOYXQocmF3VHJlZS5pbmRleCkpO1xuICAgICAgICAgIGNvbnN0IG5lc3RlZFJlbmRlciA9IGFyZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRPdXQgPSBvdXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBvdXQgPSBtYWtlTm9JbmRlbnRlcigpO1xuICAgICAgICAgICAgICBkZWNvZGUoYXJnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG91dC5kb25lKCk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBvdXQgPSBvbGRPdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoaW5kZXggPCBzbG90cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNsb3QgPSBuZXN0ZWRSZW5kZXIoc2xvdHNbaW5kZXhdKTtcbiAgICAgICAgICAgIGlmIChpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvdXQubmV4dChgc2xvdFRvVmFsKCR7c2xvdH0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZmFjZSA9IG5lc3RlZFJlbmRlcihpZmFjZSk7XG4gICAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYHNsb3RUb1ZhbCgke3Nsb3R9LCR7aWZhY2V9KWApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBzbG90KCR7aW5kZXh9KWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZmFjZSA9IG5lc3RlZFJlbmRlcihpZmFjZSk7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBzbG90KCR7aW5kZXh9LCR7aWZhY2V9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSByYXdUcmVlO1xuICAgICAgICAgIG91dC5vcGVuKCd7Jyk7XG4gICAgICAgICAgZGVjb2RlUHJvcGVydHkoUUNMQVNTLCBvcmlnaW5hbCk7XG4gICAgICAgICAgaWYgKCdyZXN0JyBpbiByYXdUcmVlKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKHJlc3QsICdvYmplY3QnKTtcbiAgICAgICAgICAgIGFzc2VydChyZXN0ICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyZXN0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRmFpbGBQcm9wZXJ0eSBuYW1lICR7cShcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgKX0gb2YgJHtyZXN0fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShuYW1lLCByZXN0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnfScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICBjYXVzZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVycm9ycyA9IHVuZGVmaW5lZCxcbiAgICAgICAgICB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBjYXVzZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYGVycm9yIGNhdXNlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIG5hbWUgIT09IGBBZ2dyZWdhdGVFcnJvcmAgfHxcbiAgICAgICAgICAgIEZhaWxgQWdncmVnYXRlRXJyb3Igbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG4gICAgICAgICAgZXJyb3JzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgZXJyb3IgZXJyb3JzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgIFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuICAgICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmF3VHJlZSkpIHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSByYXdUcmVlO1xuICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQub3BlbignWycpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgb3V0LmxpbmUoKTtcbiAgICAgICAgICBkZWNvZGUocmF3VHJlZVtpXSk7XG4gICAgICAgICAgb3V0Lm5leHQoJywnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgbmFtZXMgPSAvKiAgICAgICAgICAgICAgICAgICAqLyAob3duS2V5cyhyYXdUcmVlKSk7XG4gICAgICBpZiAobmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQubmV4dCgne30nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dC5vcGVuKCd7Jyk7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgIGRlY29kZVByb3BlcnR5KG5hbWUsIHJhd1RyZWVbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHByZXBhcmUoZW5jb2RpbmcpO1xuICBkZWNvZGUoZW5jb2RpbmcpO1xuICByZXR1cm4gb3V0LmRvbmUoKTtcbn07JGjNj19vbmNlLmRlY29kZVRvSnVzdGluKGRlY29kZVRvSnVzdGluKTtcbmhhcmRlbihkZWNvZGVUb0p1c3Rpbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC+IqcbSgcAAEoHAAAtAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbInBhcnNlIiwic3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90ID0gdmFsID0+XG4gIEZhaWxgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWwgPSAoc2xvdCwgX2lmYWNlKSA9PlxuICBGYWlsYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXIgPSBoYXJkZW4oe1xuICBnZXQ6IChfdGFyZ2V0LCBuYW1lLCBfcmVjZWl2ZXIpID0+IHtcbiAgICBpZiAobmFtZSA9PT0gJ2xlbmd0aCcpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvL1xuICAgIHRocm93IEZhaWxgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gIH0sXG59KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBhcnJheVRhcmdldCA9IGZyZWV6ZSgvKiAgICAgICAgICAgICAgICAqLyAoW10pKTtcbmNvbnN0IGJhZEFycmF5ID0gbmV3IFByb3h5KGFycmF5VGFyZ2V0LCBiYWRBcnJheUhhbmRsZXIpO1xuXG5jb25zdCB7IHNlcmlhbGl6ZSwgdW5zZXJpYWxpemUgfSA9IG1ha2VNYXJzaGFsKFxuICBkb05vdENvbnZlcnRWYWxUb1Nsb3QsXG4gIGRvTm90Q29udmVydFNsb3RUb1ZhbCxcbiAge1xuICAgIGVycm9yVGFnZ2luZzogJ29mZicsXG4gICAgLy9cbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnY2FwZGF0YScsXG4gIH0sXG4pO1xuXG4vKlxuXG5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gdmFsID0+IHNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjNj19vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qXG5cblxuICovXG5jb25zdCBwYXJzZSA9IHN0ciA9PlxuICB1bnNlcmlhbGl6ZShcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmcmVlemUoe1xuICAgICAgYm9keTogc3RyLFxuICAgICAgc2xvdHM6IGJhZEFycmF5LFxuICAgIH0pLFxuICApOyRozY9fb25jZS5wYXJzZShwYXJzZSk7XG5oYXJkZW4ocGFyc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAJOiBuYS8AAGEvAAAjAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2VuY29kZVRvU21hbGxjYXBzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsYXNzZXJ0UGFzc2FibGUsZ2V0SW50ZXJmYWNlT2YsZ2V0RXJyb3JDb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eU9mLHRvUGFzc2FibGVFcnJvcixYLEZhaWwscSxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixvYmplY3RNYXAsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcInRvUGFzc2FibGVFcnJvclwiLFskaM2PX2EgPT4gKHRvUGFzc2FibGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIixbJGjNj19hID0+IChRQ0xBU1MgPSAkaM2PX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLFskaM2PX2EgPT4gKG1ha2VFbmNvZGVUb0NhcERhdGEgPSAkaM2PX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsWyRozY9fYSA9PiAobWFrZURlY29kZUZyb21DYXBEYXRhID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIixbJGjNj19hID0+IChtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9ICRozY9fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIixbJGjNj19hID0+IChtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuY29uc3QgeyBkZWZpbmVQcm9wZXJ0aWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbiA9IHggPT4geDtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGVmYXVsdFNsb3RUb1ZhbEZuID0gKHgsIF8pID0+IHg7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNYXJzaGFsID0gKFxuICBjb252ZXJ0VmFsVG9TbG90ID0gZGVmYXVsdFZhbFRvU2xvdEZuLFxuICBjb252ZXJ0U2xvdFRvVmFsID0gZGVmYXVsdFNsb3RUb1ZhbEZuLFxuICB7XG4gICAgZXJyb3JUYWdnaW5nID0gJ29uJyxcbiAgICBtYXJzaGFsTmFtZSA9ICdhbm9uLW1hcnNoYWwnLFxuICAgIC8vXG4gICAgLy9cbiAgICBlcnJvcklkTnVtID0gMTAwMDAsXG4gICAgLy9cbiAgICAvL1xuICAgIG1hcnNoYWxTYXZlRXJyb3IgPSBlcnIgPT5cbiAgICAgIGNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJywgZXJyKSxcbiAgICAvL1xuICAgIC8vXG4gICAgc2VyaWFsaXplQm9keUZvcm1hdCA9ICdjYXBkYXRhJyxcbiAgfSA9IHt9LFxuKSA9PiB7XG4gIGFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsICdzdHJpbmcnKTtcbiAgZXJyb3JUYWdnaW5nID09PSAnb24nIHx8XG4gICAgZXJyb3JUYWdnaW5nID09PSAnb2ZmJyB8fFxuICAgIEZhaWxgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbiAgY29uc3QgbmV4dEVycm9ySWQgPSAoKSA9PiB7XG4gICAgZXJyb3JJZE51bSArPSAxO1xuICAgIHJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gIH07XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgdG9DYXBEYXRhID0gcm9vdCA9PiB7XG4gICAgY29uc3Qgc2xvdHMgPSBbXTtcbiAgICAvL1xuICAgIGNvbnN0IHNsb3RNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBjb25zdCBlbmNvZGVTbG90Q29tbW9uID0gcGFzc2FibGUgPT4ge1xuICAgICAgbGV0IGluZGV4ID0gc2xvdE1hcC5nZXQocGFzc2FibGUpO1xuICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9cbiAgICAgICAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgaW5kZXgsIHJlcGVhdDogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgaW5kZXggPSBzbG90cy5sZW5ndGg7XG4gICAgICBjb25zdCBzbG90ID0gY29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG4gICAgICBzbG90cy5wdXNoKHNsb3QpO1xuICAgICAgc2xvdE1hcC5zZXQocGFzc2FibGUsIGluZGV4KTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBpbmRleCwgcmVwZWF0OiBmYWxzZSB9KTtcbiAgICB9O1xuXG4gICAgLypcblxuXG5cblxuXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgZW5jb2RlRXJyb3JDb21tb24gPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVuY29kZVJlY3VyKGAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCAnc3RyaW5nJyk7XG4gICAgICBjb25zdCBuYW1lID0gZW5jb2RlUmVjdXIoYCR7ZXJyLm5hbWV9YCk7XG4gICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmIChlcnJvclRhZ2dpbmcgPT09ICdvbicpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgZXJyb3JJZCA9IGVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuICAgICAgICBhc3NlcnQudHlwZW9mKGVycm9ySWQsICdzdHJpbmcnKTtcbiAgICAgICAgYW5ub3RhdGVFcnJvcihlcnIsIFhgU2VudCBhcyAke2Vycm9ySWR9YCk7XG4gICAgICAgIG1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGVycm9ySWQsIG1lc3NhZ2UsIG5hbWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgbWVzc2FnZSwgbmFtZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHNlcmlhbGl6ZUJvZHlGb3JtYXQgPT09ICdjYXBkYXRhJykge1xuICAgICAgLypcblxuXG5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YSA9IChwYXNzYWJsZSwgaWZhY2UgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgcmVwZWF0IH0gPSBlbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuICAgICAgICBpZiAocmVwZWF0ID09PSB0cnVlIHx8IGlmYWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdzbG90JywgaW5kZXggfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnc2xvdCcsIGlmYWNlLCBpbmRleCB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSAodmFsLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb0NhcERhdGEodmFsLCBnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IChwcm9taXNlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbiAgICAgIC8qXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG4gICAgICBjb25zdCBlbmNvZGVFcnJvclRvQ2FwRGF0YSA9IChlcnIsIGVuY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckRhdGEgPSBlbmNvZGVFcnJvckNvbW1vbihlcnIsIGVuY29kZVJlY3VyKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnZXJyb3InLCAuLi5lcnJEYXRhIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlVG9DYXBEYXRhID0gbWFrZUVuY29kZVRvQ2FwRGF0YSh7XG4gICAgICAgIGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbiAgICAgICAgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbiAgICAgICAgZW5jb2RlRXJyb3JUb0NhcERhdGEsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVRvQ2FwRGF0YShyb290KTtcbiAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBib2R5LFxuICAgICAgICBzbG90cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplQm9keUZvcm1hdCA9PT0gJ3NtYWxsY2FwcycpIHtcbiAgICAgIC8qXG5cblxuXG5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzID0gKHByZWZpeCwgcGFzc2FibGUsIGlmYWNlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIHJlcGVhdCB9ID0gZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKHJlcGVhdCA9PT0gdHJ1ZSB8fCBpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IChyZW1vdGFibGUsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvU21hbGxjYXBzKCckJywgcmVtb3RhYmxlLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuICAgICAgY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gKHByb21pc2UsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJywgcHJvbWlzZSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgICBjb25zdCBlcnJEYXRhID0gZW5jb2RlRXJyb3JDb21tb24oZXJyLCBlbmNvZGVSZWN1cik7XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4ucmVzdCB9ID0gZXJyRGF0YTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7ICcjZXJyb3InOiBtZXNzYWdlLCAuLi5yZXN0IH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlVG9TbWFsbGNhcHMgPSBtYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuICAgICAgICBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbiAgICAgICAgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbiAgICAgIGNvbnN0IHNtYWxsY2Fwc0JvZHkgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuICAgICAgICBzbG90cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VGdWxsUmV2aXZlID0gc2xvdHMgPT4ge1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgdmFsTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgLypcblxuXG4gICAgICovXG4gICAgY29uc3QgZGVjb2RlU2xvdENvbW1vbiA9IHNsb3REYXRhID0+IHtcbiAgICAgIGNvbnN0IHsgaWZhY2UgPSB1bmRlZmluZWQsIGluZGV4LCAuLi5yZXN0IH0gPSBzbG90RGF0YTtcbiAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIEZhaWxgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbiAgICAgIGNvbnN0IGV4dGFudCA9IHZhbE1hcC5nZXQoaW5kZXgpO1xuICAgICAgaWYgKGV4dGFudCkge1xuICAgICAgICByZXR1cm4gZXh0YW50O1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCBzbG90ID0gc2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbiAgICAgIGNvbnN0IHZhbCA9IGNvbnZlcnRTbG90VG9WYWwoc2xvdCwgaWZhY2UpO1xuICAgICAgdmFsTWFwLnNldChpbmRleCwgdmFsKTtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcblxuICAgIC8qXG5cblxuXG5cblxuXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgZGVjb2RlRXJyb3JDb21tb24gPSAoZXJyRGF0YSwgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZXJyb3JJZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgY2F1c2UgPSB1bmRlZmluZWQsXG4gICAgICAgIGVycm9ycyA9IHVuZGVmaW5lZCxcbiAgICAgICAgLi4ucmVzdFxuICAgICAgfSA9IGVyckRhdGE7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgZE5hbWUgPSBkZWNvZGVSZWN1cihuYW1lKTtcbiAgICAgIGNvbnN0IGRNZXNzYWdlID0gZGVjb2RlUmVjdXIobWVzc2FnZSk7XG4gICAgICAvL1xuICAgICAgY29uc3QgZEVycm9ySWQgPSAvKiAgICAgICAgICAgICAgICAgKi8gKGVycm9ySWQgJiYgZGVjb2RlUmVjdXIoZXJyb3JJZCkpO1xuICAgICAgaWYgKHR5cGVvZiBkTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRNZXNzYWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSkgfHwgRXJyb3I7XG4gICAgICBjb25zdCBlcnJvck5hbWUgPVxuICAgICAgICBkRXJyb3JJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgICA6IGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgIHNhbml0aXplOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBpZiAoY2F1c2UpIHtcbiAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGRlY29kZVJlY3VyKGNhdXNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgb3B0aW9ucy5lcnJvcnMgPSBkZWNvZGVSZWN1cihlcnJvcnMpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3RXJyb3IgPSBtYWtlRXJyb3IoZE1lc3NhZ2UsIGVyckNvbnN0cnVjdG9yLCBvcHRpb25zKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCBkZXNjcyA9IG9iamVjdE1hcChyZXN0LCBkYXRhID0+ICh7XG4gICAgICAgIHZhbHVlOiBkZWNvZGVSZWN1cihkYXRhKSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcbiAgICAgIGRlZmluZVByb3BlcnRpZXMocmF3RXJyb3IsIGRlc2NzKTtcbiAgICAgIGhhcmRlbihyYXdFcnJvcik7XG4gICAgICByZXR1cm4gdG9QYXNzYWJsZUVycm9yKHJhd0Vycm9yKTtcbiAgICB9O1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhID0gKHJhd1RyZWUsIF9kZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyBbUUNMQVNTXTogXywgLi4uc2xvdERhdGEgfSA9IHJhd1RyZWU7XG4gICAgICByZXR1cm4gZGVjb2RlU2xvdENvbW1vbihzbG90RGF0YSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGEgPSAocmF3VHJlZSwgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgW1FDTEFTU106IF8sIC4uLmVyckRhdGEgfSA9IHJhd1RyZWU7XG4gICAgICByZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSwgZGVjb2RlUmVjdXIpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXZpdmVGcm9tQ2FwRGF0YSA9IG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTogZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgICBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGE6IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcyA9IHByZWZpeCA9PiB7XG4gICAgICAvKlxuXG5cblxuICAgICAgICovXG4gICAgICByZXR1cm4gKHN0cmluZ0VuY29kaW5nLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KHN0cmluZ0VuY29kaW5nLmNoYXJBdCgwKSA9PT0gcHJlZml4KTtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgaSA9IHN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoc3RyaW5nRW5jb2Rpbmcuc2xpY2UoMSwgaSA8IDAgPyB1bmRlZmluZWQgOiBpKSk7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGlmYWNlID0gaSA8IDAgPyB1bmRlZmluZWQgOiBzdHJpbmdFbmNvZGluZy5zbGljZShpICsgMSk7XG4gICAgICAgIHJldHVybiBkZWNvZGVTbG90Q29tbW9uKHsgaWZhY2UsIGluZGV4IH0pO1xuICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbiAgICBjb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG4gICAgY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gKGVuY29kaW5nLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyAnI2Vycm9yJzogbWVzc2FnZSwgLi4ucmVzdEVyckRhdGEgfSA9IGVuY29kaW5nO1xuICAgICAgIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsICdtZXNzYWdlJykgfHxcbiAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbiAgICAgIHJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7IG1lc3NhZ2UsIC4uLnJlc3RFcnJEYXRhIH0sIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbiAgICAgIC8vXG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuICAgICAgLy9cbiAgICAgIGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhhcmRlbih7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0pO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGZyb21DYXBEYXRhID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyBib2R5LCBzbG90cyB9ID0gZGF0YTtcbiAgICB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuICAgIGlzQXJyYXkoZGF0YS5zbG90cykgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbiAgICBjb25zdCB7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0gPSBtYWtlRnVsbFJldml2ZShzbG90cyk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICAvL1xuICAgIGlmIChib2R5LmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gYm9keS5zbGljZSgxKTtcbiAgICAgIGNvbnN0IGVuY29kaW5nID0gaGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xuICAgICAgcmVzdWx0ID0gaGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmF3VHJlZSA9IGhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbiAgICAgIHJlc3VsdCA9IGhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gICAgfVxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICovIChyZXN1bHQpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHRvQ2FwRGF0YSxcbiAgICBmcm9tQ2FwRGF0YSxcblxuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBzZXJpYWxpemU6IHRvQ2FwRGF0YSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgdW5zZXJpYWxpemU6IGZyb21DYXBEYXRhLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEqw1V3rLgAA6y4AACUAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCIuL2VuY29kZVBhc3NhYmxlLmpzIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidHJpdmlhbENvbXBhcmF0b3IiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLEZhaWwscSxwYXNzU3R5bGVQcmVmaXhlcyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicGFzc1N0eWxlUHJlZml4ZXNcIixbJGjNj19hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IHsgZW50cmllcywgZnJvbUVudHJpZXMsIHNldFByb3RvdHlwZU9mLCBpcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvID0gKHgsIHkpID0+IHggPT09IHkgfHwgaXMoeCwgeSk7XG5cbiAgICAgICBjb25zdCB0cml2aWFsQ29tcGFyYXRvciA9IChsZWZ0LCByaWdodCkgPT5cbiAgLy9cbiAgbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID09PSByaWdodCA/IDAgOiAxO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UudHJpdmlhbENvbXBhcmF0b3IodHJpdmlhbENvbXBhcmF0b3IpO1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgZnJvbUVudHJpZXMoXG4gICAgZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbiAgICAgIC8vXG4gICAgICAuc29ydCgoW19sZWZ0U3R5bGUsIGxlZnRQcmVmaXhlc10sIFtfcmlnaHRTdHlsZSwgcmlnaHRQcmVmaXhlc10pID0+IHtcbiAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcywgcmlnaHRQcmVmaXhlcyk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoW3Bhc3NTdHlsZSwgcHJlZml4ZXNdLCBpbmRleCkgPT4ge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBwcmVmaXhlcyA9PT0gWy4uLnByZWZpeGVzXS5zb3J0KCkuam9pbignJykgfHxcbiAgICAgICAgICBGYWlsYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG4gICAgICAgIGNvbnN0IGNvdmVyID0gW1xuICAgICAgICAgIHByZWZpeGVzLmNoYXJBdCgwKSxcbiAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoIC0gMSkgKyAxKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIFtwYXNzU3R5bGUsIHsgaW5kZXgsIGNvdmVyIH1dO1xuICAgICAgfSksXG4gIClcbik7XG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcywgbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0UGFzc1N0eWxlQ292ZXIgPSBwYXNzU3R5bGUgPT4gcGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaM2PX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLypcblxuICovXG5jb25zdCBtZW1vT2ZTb3J0ZWQgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29tcGFyYXRvcktpdCA9IChjb21wYXJlUmVtb3RhYmxlcyA9IChfeCwgX3kpID0+IE5hTikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb21wYXJhdG9yID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgaWYgKHNhbWVWYWx1ZVplcm8obGVmdCwgcmlnaHQpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgbGVmdFN0eWxlID0gcGFzc1N0eWxlT2YobGVmdCk7XG4gICAgY29uc3QgcmlnaHRTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0KTtcbiAgICBpZiAobGVmdFN0eWxlICE9PSByaWdodFN0eWxlKSB7XG4gICAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW3JpZ2h0U3R5bGVdLmluZGV4LFxuICAgICAgKTtcbiAgICB9XG4gICAgLypcblxuICAgICAqL1xuICAgIHN3aXRjaCAobGVmdFN0eWxlKSB7XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGxlZnQgPCByaWdodCkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NlcnQobGVmdCA+IHJpZ2h0KTtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihcbiAgICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG4gICAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sKHJpZ2h0KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihsZWZ0KSkge1xuICAgICAgICAgIGFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzTmFOKHJpZ2h0KSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBpZiAobGVmdCA8IHJpZ2h0KSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2VydChsZWZ0ID4gcmlnaHQpO1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGxlZnROYW1lcyA9IHJlY29yZE5hbWVzKGxlZnQpO1xuICAgICAgICBjb25zdCByaWdodE5hbWVzID0gcmVjb3JkTmFtZXMocmlnaHQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdE5hbWVzLCByaWdodE5hbWVzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVmdFZhbHVlcyA9IHJlY29yZFZhbHVlcyhsZWZ0LCBsZWZ0TmFtZXMpO1xuICAgICAgICBjb25zdCByaWdodFZhbHVlcyA9IHJlY29yZFZhbHVlcyhyaWdodCwgcmlnaHROYW1lcyk7XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnRWYWx1ZXMsIHJpZ2h0VmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJhdG9yKGxlZnRbaV0sIHJpZ2h0W2ldKTtcbiAgICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbGFiZWxDb21wID0gY29tcGFyYXRvcihnZXRUYWcobGVmdCksIGdldFRhZyhyaWdodCkpO1xuICAgICAgICBpZiAobGFiZWxDb21wICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGxhYmVsQ29tcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQsIHJpZ2h0LnBheWxvYWQpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gICAgICB9XG4gICAgfVxuICAgIC8qICAgICAgICAgICAgICAgKi9cbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBvdXRlckNvbXBhcmF0b3IgPSAoeCwgeSkgPT5cbiAgICAvL1xuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoY29tcGFyYXRvcih4LCB5KSB8fCAwKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhbnRpQ29tcGFyYXRvciA9ICh4LCB5KSA9PiBvdXRlckNvbXBhcmF0b3IoeSwgeCk7XG5cbiAgbWVtb09mU29ydGVkLnNldChvdXRlckNvbXBhcmF0b3IsIG5ldyBXZWFrU2V0KCkpO1xuICBtZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLCBuZXcgV2Vha1NldCgpKTtcbiAgY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQob3V0ZXJDb21wYXJhdG9yLCBhbnRpQ29tcGFyYXRvcik7XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLCBvdXRlckNvbXBhcmF0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBjb21wYXJhdG9yOiBvdXRlckNvbXBhcmF0b3IsIGFudGlDb21wYXJhdG9yIH0pO1xufTtcbi8qXG5cblxuICovJGjNj19vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbiAgICAgICBjb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2UgPSBjb21wYXJhdG9yID0+XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuICAgICAgIGNvbnN0IGlzUmFua1NvcnRlZCA9IChwYXNzYWJsZXMsIGNvbXBhcmUpID0+IHtcbiAgY29uc3Qgc3ViTWVtb09mU29ydGVkID0gbWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbiAgYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCAhPT0gdW5kZWZpbmVkKTtcbiAgaWYgKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpID09PSAnY29weUFycmF5Jyk7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcGFzc2FibGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGNvbXBhcmUocGFzc2FibGVzW2kgLSAxXSwgcGFzc2FibGVzW2ldKSA+PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbiAgcmV0dXJuIHRydWU7XG59OyRozY9fb25jZS5pc1JhbmtTb3J0ZWQoaXNSYW5rU29ydGVkKTtcbmhhcmRlbihpc1JhbmtTb3J0ZWQpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFJhbmtTb3J0ZWQgPSAoc29ydGVkLCBjb21wYXJlKSA9PlxuICBpc1JhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKSB8fFxuICAvL1xuICAvL1xuICBGYWlsYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLCBjb21wYXJlKX1gOyRozY9fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBzb3J0QnlSYW5rID0gKHBhc3NhYmxlcywgY29tcGFyZSkgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKSB7XG4gICAgaGFyZGVuKHBhc3NhYmxlcyk7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsIGNvbXBhcmUpKSB7XG4gICAgICByZXR1cm4gcGFzc2FibGVzO1xuICAgIH1cbiAgfVxuICBjb25zdCB1bnNvcnRlZCA9IFsuLi5wYXNzYWJsZXNdO1xuICB1bnNvcnRlZC5mb3JFYWNoKGhhcmRlbik7XG4gIGNvbnN0IHNvcnRlZCA9IHVuc29ydGVkLnNvcnQoY29tcGFyZSk7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjb21wYXJlKHRydWUsIHVuZGVmaW5lZCkgPiAwKSB7XG4gICAgbGV0IGkgPSBzb3J0ZWQubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoaSA+PSAwICYmIHNvcnRlZFtpXSA9PT0gdW5kZWZpbmVkKSBpIC09IDE7XG4gICAgY29uc3QgbiA9IHNvcnRlZC5sZW5ndGggLSBpIC0gMTtcbiAgICBpZiAobiA+IDAgJiYgbiA8IHNvcnRlZC5sZW5ndGgpIHtcbiAgICAgIHNvcnRlZC5jb3B5V2l0aGluKG4sIDApO1xuICAgICAgc29ydGVkLmZpbGwoLyogICAgICAgICAgICAqLyAodW5kZWZpbmVkKSwgMCwgbik7XG4gICAgfVxuICB9XG4gIGhhcmRlbihzb3J0ZWQpO1xuICBjb25zdCBzdWJNZW1vT2ZTb3J0ZWQgPSBtZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuICBhc3NlcnQoc3ViTWVtb09mU29ydGVkICE9PSB1bmRlZmluZWQpO1xuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG4gIHJldHVybiBzb3J0ZWQ7XG59OyRozY9fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmFua1NlYXJjaCA9IChzb3J0ZWQsIGNvbXBhcmUsIGtleSwgYmlhcyA9ICdsZWZ0TW9zdCcpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpO1xuICBsZXQgbGVmdCA9IDA7XG4gIGxldCByaWdodCA9IHNvcnRlZC5sZW5ndGg7XG4gIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlKHNvcnRlZFttXSwga2V5KTtcbiAgICBpZiAoY29tcCA8PSAtMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAncmlnaHRNb3N0JykpIHtcbiAgICAgIGxlZnQgPSBtICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGNvbXAgPj0gMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAnbGVmdE1vc3QnKSk7XG4gICAgICByaWdodCA9IG07XG4gICAgfVxuICB9XG4gIHJldHVybiBiaWFzID09PSAnbGVmdE1vc3QnID8gbGVmdCA6IHJpZ2h0IC0gMTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldEluZGV4Q292ZXIgPSAoc29ydGVkLCBjb21wYXJlLCBbbGVmdEtleSwgcmlnaHRLZXldKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgY29uc3QgbGVmdEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIGxlZnRLZXksICdsZWZ0TW9zdCcpO1xuICBjb25zdCByaWdodEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIHJpZ2h0S2V5LCAncmlnaHRNb3N0Jyk7XG4gIHJldHVybiBbbGVmdEluZGV4LCByaWdodEluZGV4XTtcbn07JGjNj19vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IEZ1bGxSYW5rQ292ZXIgPSBoYXJkZW4oWycnLCAneyddKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuICAgICAgIGNvbnN0IGNvdmVyZWRFbnRyaWVzID0gKHNvcnRlZCwgW2xlZnRJbmRleCwgcmlnaHRJbmRleF0pID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpdGVyYWJsZSA9IGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gbGVmdEluZGV4O1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAoaSA8PSByaWdodEluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc29ydGVkW2ldO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlOiBbaSwgZWxlbWVudF0sIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1heFJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPj0gMCA/IGEgOiBiKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1pblJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPD0gMCA/IGEgOiBiKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHVuaW9uUmFua0NvdmVycyA9IChjb21wYXJlLCBjb3ZlcnMpID0+IHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IHVuaW9uUmFua0NvdmVyUGFpciA9IChbbGVmdEEsIHJpZ2h0QV0sIFtsZWZ0QiwgcmlnaHRCXSkgPT4gW1xuICAgIG1pblJhbmsoY29tcGFyZSwgbGVmdEEsIGxlZnRCKSxcbiAgICBtYXhSYW5rKGNvbXBhcmUsIHJpZ2h0QSwgcmlnaHRCKSxcbiAgXTtcbiAgcmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLCBbJ3snLCAnJ10pO1xufTskaM2PX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGludGVyc2VjdFJhbmtDb3ZlcnMgPSAoY29tcGFyZSwgY292ZXJzKSA9PiB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyID0gKFtsZWZ0QSwgcmlnaHRBXSwgW2xlZnRCLCByaWdodEJdKSA9PiBbXG4gICAgbWF4UmFuayhjb21wYXJlLCBsZWZ0QSwgbGVmdEIpLFxuICAgIG1pblJhbmsoY29tcGFyZSwgcmlnaHRBLCByaWdodEIpLFxuICBdO1xuICByZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLCBbJycsICd7J10pO1xufTskaM2PX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuICAgICAgIGNvbnN0IHsgY29tcGFyYXRvcjogY29tcGFyZVJhbmssIGFudGlDb21wYXJhdG9yOiBjb21wYXJlQW50aVJhbmsgfSA9XG4gIG1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRozY9fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbiAgICAgICBjb25zdCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9IChsb25nTGl2ZWQgPSBmYWxzZSkgPT4ge1xuICBsZXQgbnVtU2VlbiA9IDA7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IE1hcENvbnN0cnVjdG9yID0gbG9uZ0xpdmVkID8gV2Vha01hcCA6IE1hcDtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuICBjb25zdCB0YWcgPSByID0+IHtcbiAgICBpZiAoc2Vlbi5oYXMocikpIHtcbiAgICAgIHJldHVybiBzZWVuLmdldChyKTtcbiAgICB9XG4gICAgbnVtU2VlbiArPSAxO1xuICAgIHNlZW4uc2V0KHIsIG51bVNlZW4pO1xuICAgIHJldHVybiBudW1TZWVuO1xuICB9O1xuICBjb25zdCBjb21wYXJlUmVtb3RhYmxlcyA9ICh4LCB5KSA9PiBjb21wYXJlUmFuayh0YWcoeCksIHRhZyh5KSk7XG4gIHJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG59OyRozY9fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJpdmlhbENvbXBhcmF0b3IiOlsidHJpdmlhbENvbXBhcmF0b3IiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXpyzyswFAADMBQAAHQAAAEBlbmRvL25hdC12NS4xLjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsJ25hbWUnLHt2YWx1ZTpcImlzTmF0XCJ9KTskaM2PX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsJ25hbWUnLHt2YWx1ZTpcIk5hdFwifSk7JGjNj19vbmNlLk5hdChOYXQpOy8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKSB7XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gYWxsZWdlZE51bSA+PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkgJiYgYWxsZWdlZE51bSA+PSAwO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pIHtcbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnYmlnaW50Jykge1xuICAgIGlmIChhbGxlZ2VkTnVtIDwgMG4pIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbGVnZWROdW07XG4gIH1cblxuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSkge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtcbiAgICB9XG4gICAgaWYgKGFsbGVnZWROdW0gPCAwKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gICAgfVxuICAgIHJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gIH1cblxuICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmAsXG4gICk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAL0dmpNCgAATQoAACAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvc3RyaW5nLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIiwiaXNPYmplY3QiLCJpc09iamVjdCIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9pdGVyLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9lcnJvci5qc1wiLCBbXV0sW1wiLi9zcmMvcmVtb3RhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9zeW1ib2wuanNcIiwgW11dLFtcIi4vc3JjL3N0cmluZy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlT2YuanNcIiwgW11dLFtcIi4vc3JjL21ha2VUYWdnZWQuanNcIiwgW11dLFtcIi4vc3JjL21ha2UtZmFyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjpbWyJtYXBJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sWyJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIl1dLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6W1siUEFTU19TVFlMRSIsIlBBU1NfU1RZTEUiXSxbImlzT2JqZWN0IiwiaXNPYmplY3QiXSxbImFzc2VydENoZWNrZXIiLCJhc3NlcnRDaGVja2VyIl0sWyJnZXRUYWciLCJnZXRUYWciXSxbImhhc093blByb3BlcnR5T2YiLCJoYXNPd25Qcm9wZXJ0eU9mIl1dLCIuL3NyYy9lcnJvci5qcyI6W1siZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEVycm9yQ29uc3RydWN0b3IiXSxbImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiXV0sIi4vc3JjL3JlbW90YWJsZS5qcyI6W1siZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdXSwiLi9zcmMvc3ltYm9sLmpzIjpbWyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sWyJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCJdLFsibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sWyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXV0sIi4vc3JjL3N0cmluZy5qcyI6W1siaXNXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLFsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRQYXNzYWJsZVN0cmluZyJdXSwiLi9zcmMvcGFzc1N0eWxlT2YuanMiOltbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXSxbImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIl0sWyJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIl0sWyJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSxbInRvVGhyb3dhYmxlIiwidG9UaHJvd2FibGUiXV0sIi4vc3JjL21ha2VUYWdnZWQuanMiOltbIm1ha2VUYWdnZWQiLCJtYWtlVGFnZ2VkIl1dLCIuL3NyYy9tYWtlLWZhci5qcyI6W1siUmVtb3RhYmxlIiwiUmVtb3RhYmxlIl0sWyJGYXIiLCJGYXIiXSxbIlRvRmFyRnVuY3Rpb24iLCJUb0ZhckZ1bmN0aW9uIl0sWyJHRVRfTUVUSE9EX05BTUVTIiwiR0VUX01FVEhPRF9OQU1FUyJdXSwiLi9zcmMvdHlwZUd1YXJkcy5qcyI6W1siYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVjb3JkIl0sWyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiXSxbImFzc2VydFJlbW90YWJsZSIsImFzc2VydFJlbW90YWJsZSJdLFsiaXNSZW1vdGFibGUiLCJpc1JlbW90YWJsZSJdLFsiaXNSZWNvcmQiLCJpc1JlY29yZCJdLFsiaXNDb3B5QXJyYXkiLCJpc0NvcHlBcnJheSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAw+/2RbwGAAC8BgAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsYXNzZXJ0Q2hlY2tlcixnZXRPd25EYXRhRGVzY3JpcHRvcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5LCBwcm90b3R5cGU6IGFycmF5UHJvdG90eXBlIH0gPSBBcnJheTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBDb3B5QXJyYXlIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdjb3B5QXJyYXknLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIGlzQXJyYXkoY2FuZGlkYXRlKSB8fFxuICAgICghIWNoZWNrICYmIGNoZWNrKGZhbHNlLCBYYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSksXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gYXJyYXlQcm90b3R5cGUgfHxcbiAgICAgIGFzc2VydC5mYWlsKFhgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBsZW4gPSAvKiAgICAgICAgICAgICAgICAgKi8gKFxuICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCAnbGVuZ3RoJywgZmFsc2UsIGFzc2VydENoZWNrZXIpLnZhbHVlXG4gICAgKTtcbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgcGFzc1N0eWxlT2ZSZWN1cihcbiAgICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCBpLCB0cnVlLCBhc3NlcnRDaGVja2VyKS52YWx1ZSxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vXG4gICAgb3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aCA9PT0gbGVuICsgMSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCwgVHlwZUVycm9yKTtcbiAgfSxcbn0pOyRozY9fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEIFEwPYIAAD2CAAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxnZXRPd25EYXRhRGVzY3JpcHRvcixDWDskaM2PX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImNhbkJlTWV0aG9kXCIsWyRozY9fYSA9PiAoY2FuQmVNZXRob2QgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNoZWNrT2JqZWN0UHJvdG90eXBlID0gKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIChcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YClcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQgPSAoY2FuZGlkYXRlLCBrZXksIHZhbHVlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICByZXR1cm4gKFxuICAgICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoIWNhbkJlTWV0aG9kKHZhbHVlKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgLy9cbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgQ29weVJlY29yZEhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2NvcHlSZWNvcmQnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoZWNrT2JqZWN0UHJvdG90eXBlKGNhbmRpZGF0ZSwgY2hlY2spICYmXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIG93bktleXMoY2FuZGlkYXRlKS5ldmVyeShrZXkgPT5cbiAgICAgICAgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQoY2FuZGlkYXRlLCBrZXksIGNhbmRpZGF0ZVtrZXldLCBjaGVjayksXG4gICAgICApXG4gICAgKTtcbiAgfSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKSB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBnZXRPd25EYXRhRGVzY3JpcHRvcihcbiAgICAgICAgY2FuZGlkYXRlLFxuICAgICAgICBuYW1lLFxuICAgICAgICB0cnVlLFxuICAgICAgICBhc3NlcnRDaGVja2VyLFxuICAgICAgKTtcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpO1xuICAgIH1cbiAgfSxcbn0pOyRozY9fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMI3yaeeCwAAngsAAC4AAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIl0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxLEUsaXNQcm9taXNlLGdldFRhZyxpc09iamVjdCxwYXNzU3R5bGVPZixtYWtlVGFnZ2VkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLypcblxuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGVlcGx5RnVsZmlsbGVkID0gYXN5bmMgdmFsID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cblxuICBpZiAoIWlzT2JqZWN0KHZhbCkpIHtcbiAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgfVxuICBpZiAoaXNQcm9taXNlKHZhbCkpIHtcbiAgICByZXR1cm4gRS53aGVuKHZhbCwgbm9ucCA9PiBkZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuICB9XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIGNvbnN0IHJlYyA9IC8qICAgICAgICAgICAgICAgICAgICAgKi8gKHZhbCk7XG4gICAgICBjb25zdCBuYW1lcyA9IC8qICAgICAgICAgICAgICAgICAgICovIChvd25LZXlzKHJlYykpO1xuICAgICAgY29uc3QgdmFsUHMgPSBuYW1lcy5tYXAobmFtZSA9PiBkZWVwbHlGdWxmaWxsZWQocmVjW25hbWVdKSk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksIHZhbHMgPT5cbiAgICAgICAgaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLCBpKSA9PiBbbmFtZXNbaV0sIGNdKSkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgY29uc3QgYXJyID0gLyogICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgY29uc3QgdmFsUHMgPSBhcnIubWFwKHAgPT4gZGVlcGx5RnVsZmlsbGVkKHApKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwgdmFscyA9PiBoYXJkZW4odmFscykpO1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICBjb25zdCB0Z2QgPSAvKiAgICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHRnZCk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodGdkLnBheWxvYWQpLCBwYXlsb2FkID0+XG4gICAgICAgIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIGNvbnN0IHJlbSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gcmVtO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgIGNvbnN0IGVyciA9IC8qICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICBjb25zdCBwcm9tID0gLyogICAgICAgICAgICAgICAgICAqLyAoLyogICAgICAgICAgICAgICAgICAqLyAodmFsKSk7XG4gICAgICByZXR1cm4gRS53aGVuKHByb20sIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLCBUeXBlRXJyb3IpO1xuICAgIH1cbiAgfVxufTskaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAF1cCItMUAADTFAAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGhhc093biwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vL1xuLy9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzID0gbmV3IE1hcChcbiAgLy9cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIChbXG4gICAgWydFcnJvcicsIEVycm9yXSxcbiAgICBbJ0V2YWxFcnJvcicsIEV2YWxFcnJvcl0sXG4gICAgWydSYW5nZUVycm9yJywgUmFuZ2VFcnJvcl0sXG4gICAgWydSZWZlcmVuY2VFcnJvcicsIFJlZmVyZW5jZUVycm9yXSxcbiAgICBbJ1N5bnRheEVycm9yJywgU3ludGF4RXJyb3JdLFxuICAgIFsnVHlwZUVycm9yJywgVHlwZUVycm9yXSxcbiAgICBbJ1VSSUVycm9yJywgVVJJRXJyb3JdXG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICBdKSxcbik7XG5cbmlmICh0eXBlb2YgQWdncmVnYXRlRXJyb3IgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vXG4gIGVycm9yQ29uc3RydWN0b3JzLnNldCgnQWdncmVnYXRlRXJyb3InLCBBZ2dyZWdhdGVFcnJvcik7XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0RXJyb3JDb25zdHJ1Y3RvciA9IG5hbWUgPT4gZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRozY9fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8vXG4gIHJldHVybiAoXG4gICAgY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICAoISFjaGVjayAmJiBDWChjaGVjaylgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzRXJyb3JMaWtlID0gY2FuZGlkYXRlID0+IGNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjNj19vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAoXG4gIHByb3BOYW1lLFxuICBkZXNjLFxuICBwYXNzU3R5bGVPZlJlY3VyLFxuICBjaGVjayA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAoZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgKX0gb3duIHByb3BlcnR5IG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7ZGVzY31gXG4gICAgKTtcbiAgfVxuICBpZiAoIWhhc093bihkZXNjLCAndmFsdWUnKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eTogJHtkZXNjfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHsgdmFsdWUgfSA9IGRlc2M7XG4gIHN3aXRjaCAocHJvcE5hbWUpIHtcbiAgICBjYXNlICdtZXNzYWdlJzpcbiAgICBjYXNlICdzdGFjayc6IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dmFsdWV9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ2NhdXNlJzoge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcih2YWx1ZSwgcGFzc1N0eWxlT2ZSZWN1ciwgY2hlY2spO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcnMnOiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpICE9PSAnY29weUFycmF5Jykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7dmFsdWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLmV2ZXJ5KGVyciA9PlxuICAgICAgICAvL1xuICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIsIHBhc3NTdHlsZU9mUmVjdXIsIGNoZWNrKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgICEhY2hlY2sgJiZcbiAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnR5ICR7cShwcm9wTmFtZSl9YFxuICApO1xufTskaM2PX29uY2UuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuaGFyZGVuKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAoXG4gIGNhbmRpZGF0ZSxcbiAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgY2hlY2sgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKCFjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUsIGNoZWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG4gIGNvbnN0IHsgbmFtZSB9ID0gcHJvdG87XG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbiAgaWYgKGVyckNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQgfHwgZXJyQ29uc3RydWN0b3IucHJvdG90eXBlICE9PSBwcm90bykge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2ssXG4gICAgICApYFBhc3NhYmxlIEVycm9yIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICBpZiAoISgnbWVzc2FnZScgaW4gZGVzY3MpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKFxuICAgICAgICBjaGVjayxcbiAgICAgIClgUGFzc2FibGUgRXJyb3IgbXVzdCBoYXZlIGFuIG93biBcIm1lc3NhZ2VcIiBzdHJpbmcgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXMoZGVzY3MpLmV2ZXJ5KChbcHJvcE5hbWUsIGRlc2NdKSA9PlxuICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKFxuICAgICAgcHJvcE5hbWUsXG4gICAgICBkZXNjLFxuICAgICAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgICAgIGNoZWNrLFxuICAgICksXG4gICk7XG59OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCBFcnJvckhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2Vycm9yJyxcblxuICBjYW5CZVZhbGlkOiBjaGVja0Vycm9yTGlrZSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+XG4gICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyLCBhc3NlcnRDaGVja2VyKSxcbn0pOyRozY9fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA06KQfKQGAACkBgAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFwSXRlcmFibGUgPSAoYmFzZUl0ZXJhYmxlLCBmdW5jKSA9PlxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBGYXIoJ21hcHBlZCBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZUl0ZXJhdG9yID0gYmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIHJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IGJhc2VWYWx1ZSwgZG9uZSB9ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRvbmUgPyBiYXNlVmFsdWUgOiBmdW5jKGJhc2VWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCBkb25lIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7JGjNj19vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBmaWx0ZXJJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIHByZWQpID0+XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIEZhcignZmlsdGVyZWQgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VJdGVyYXRvciA9IGJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICByZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2VJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZG9uZSB8fCBwcmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pOyRozY9fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYnh4idkSAADZEgAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiR0VUX01FVEhPRF9OQU1FUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRNZXRob2ROYW1lcyxxLEZhaWwsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIixbJGjNj19hID0+IChhc3NlcnRJZmFjZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLFskaM2PX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgc2V0UHJvdG90eXBlT2YsXG4gIGNyZWF0ZSxcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxufSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG8gPSAocmVtb3RhYmxlLCBpZmFjZSkgPT4ge1xuICBsZXQgb2xkUHJvdG8gPSBnZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuICBpZiAodHlwZW9mIHJlbW90YWJsZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAob2xkUHJvdG8gPT09IG51bGwpIHtcbiAgICAgIG9sZFByb3RvID0gb2JqZWN0UHJvdG90eXBlO1xuICAgIH1cbiAgICBvbGRQcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgICBGYWlsYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByZW1vdGFibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvbGRQcm90byAhPT0gbnVsbCB8fFxuICAgICAgRmFpbGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbiAgICBvbGRQcm90byA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIGdldFByb3RvdHlwZU9mKG9sZFByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIEZhaWxgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFxuICAgIGNyZWF0ZShvbGRQcm90bywge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAncmVtb3RhYmxlJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgfSksXG4gICk7XG59O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZSA9IGNhbmRpZGF0ZSA9PlxuICBSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlID0gKFxuICAvL1xuICBpZmFjZSA9ICdSZW1vdGFibGUnLFxuICBwcm9wcyA9IHVuZGVmaW5lZCxcbiAgcmVtb3RhYmxlID0gLyogICAgICAgICAgICAqLyAoe30pLFxuKSA9PiB7XG4gIGFzc2VydElmYWNlKGlmYWNlKTtcbiAgYXNzZXJ0KGlmYWNlKTtcbiAgLy9cbiAgLy9cbiAgcHJvcHMgPT09IHVuZGVmaW5lZCB8fCBGYWlsYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuICAvL1xuICBhc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4gIC8vXG4gICEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpIHx8XG4gICAgRmFpbGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxuICAgICAgcmVtb3RhYmxlW1BBU1NfU1RZTEVdLFxuICAgICl9YDtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaGFyZGVuLmlzRmFrZSB8fFxuICAgIC8vXG4gICAgIWlzRnJvemVuKHJlbW90YWJsZSkgfHxcbiAgICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuICBjb25zdCByZW1vdGFibGVQcm90byA9IG1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsIGlmYWNlKTtcblxuICAvL1xuICAvL1xuICBjb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjayA9IHRhcmdldCA9PiB7XG4gICAgLy9cbiAgICBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHJlbW90YWJsZVByb3RvKTtcbiAgICBoYXJkZW4odGFyZ2V0KTtcbiAgICBhc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuICB9O1xuXG4gIC8vXG4gIG11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuICAvL1xuICBtdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4gIC8vXG4gIC8vXG4gIGFzc2VydChpZmFjZSAhPT0gdW5kZWZpbmVkKTsgLy9cbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAqLyAocmVtb3RhYmxlKTtcbn07JGjNj19vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBHRVRfTUVUSE9EX05BTUVTID0gJ19fZ2V0TWV0aG9kTmFtZXNfXyc7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5HRVRfTUVUSE9EX05BTUVTKEdFVF9NRVRIT0RfTkFNRVMpO1xuY29uc3QgZ2V0TWV0aG9kTmFtZXNNZXRob2QgPSBoYXJkZW4oe1xuICBbR0VUX01FVEhPRF9OQU1FU10oKSB7XG4gICAgcmV0dXJuIGdldE1ldGhvZE5hbWVzKHRoaXMpO1xuICB9LFxufSlbR0VUX01FVEhPRF9OQU1FU107XG5cbmNvbnN0IGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvciA9IGhhcmRlbih7XG4gIHZhbHVlOiBnZXRNZXRob2ROYW1lc01ldGhvZCxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgRmFyID0gKGZhck5hbWUsIHJlbW90YWJsZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCByID0gcmVtb3RhYmxlID09PSB1bmRlZmluZWQgPyAvKiAgICAgICAgICAgICovICh7fSkgOiByZW1vdGFibGU7XG4gIGlmICh0eXBlb2YgciA9PT0gJ29iamVjdCcgJiYgIShHRVRfTUVUSE9EX05BTUVTIGluIHIpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgR0VUX01FVEhPRF9OQU1FUywgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yKTtcbiAgfVxuICByZXR1cm4gUmVtb3RhYmxlKGBBbGxlZ2VkOiAke2Zhck5hbWV9YCwgdW5kZWZpbmVkLCByKTtcbn07JGjNj19vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBUb0ZhckZ1bmN0aW9uID0gKGZhck5hbWUsIGZ1bmMpID0+IHtcbiAgaWYgKGdldEludGVyZmFjZU9mKGZ1bmMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAvL1xuICAgIHJldHVybiBmdW5jO1xuICB9XG4gIC8vXG4gIHJldHVybiBGYXIoZmFyTmFtZSwgKC4uLmFyZ3MpID0+IGZ1bmMoLi4uYXJncykpO1xufTskaM2PX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiR0VUX01FVEhPRF9OQU1FUyI6WyJHRVRfTUVUSE9EX05BTUVTIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE3BiNPcBAAA3AQAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVRhZ2dlZCA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG4gIGFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG4gIHJldHVybiBoYXJkZW4oXG4gICAgY3JlYXRlKG9iamVjdFByb3RvdHlwZSwge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAndGFnZ2VkJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IHRhZyB9LFxuICAgICAgcGF5bG9hZDogeyB2YWx1ZTogcGF5bG9hZCwgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIH0pLFxuICApO1xufTskaM2PX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABwRFyEohcAAKIXAAAwAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIkNYIiwiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjYW5CZU1ldGhvZCIsImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0T3duRGF0YURlc2NyaXB0b3IiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGdldFByb3RvdHlwZU9mLFxuICBoYXNPd25Qcm9wZXJ0eTogb2JqZWN0SGFzT3duUHJvcGVydHksXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbn0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuY29uc3QgeyB0b1N0cmluZ1RhZzogdG9TdHJpbmdUYWdTeW1ib2wgfSA9IFN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gIHR5cGVkQXJyYXlQcm90b3R5cGUsXG4gIHRvU3RyaW5nVGFnU3ltYm9sLFxuKTtcbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyA9IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcgPT09ICdmdW5jdGlvbicpO1xuXG4gICAgICAgY29uc3QgaGFzT3duUHJvcGVydHlPZiA9IChvYmosIHByb3ApID0+XG4gIGFwcGx5KG9iamVjdEhhc093blByb3BlcnR5LCBvYmosIFtwcm9wXSk7JGjNj19vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG5oYXJkZW4oaGFzT3duUHJvcGVydHlPZik7XG5cbi8vXG4gICAgICAgY29uc3QgaXNPYmplY3QgPSB2YWwgPT4gT2JqZWN0KHZhbCkgPT09IHZhbDskaM2PX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzVHlwZWRBcnJheSA9IG9iamVjdCA9PiB7XG4gIC8vXG4gIGNvbnN0IHRhZyA9IGFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZywgb2JqZWN0LCBbXSk7XG4gIHJldHVybiB0YWcgIT09IHVuZGVmaW5lZDtcbn07JGjNj19vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbiAgICAgICBjb25zdCBQQVNTX1NUWUxFID0gU3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG4gICAgICAgY29uc3QgY2FuQmVNZXRob2QgPSBmdW5jID0+XG4gIHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nICYmICEoUEFTU19TVFlMRSBpbiBmdW5jKTskaM2PX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENoZWNrZXIgPSAoY29uZCwgZGV0YWlscykgPT4ge1xuICBhc3NlcnQoY29uZCwgZGV0YWlscyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgQ1ggPSBjaGVjayA9PiB7XG4gIGNvbnN0IHJlamVjdCA9IChULCAuLi5zdWJzKSA9PiBjaGVjayhmYWxzZSwgWChULCAuLi5zdWJzKSk7XG4gIHJldHVybiByZWplY3Q7XG59OyRozY9fb25jZS5DWChDWCk7XG5oYXJkZW4oQ1gpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldE93bkRhdGFEZXNjcmlwdG9yID0gKFxuICBjYW5kaWRhdGUsXG4gIHByb3BOYW1lLFxuICBzaG91bGRCZUVudW1lcmFibGUsXG4gIGNoZWNrLFxuKSA9PiB7XG4gIGNvbnN0IGRlc2MgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUsIHByb3BOYW1lKVxuICApO1xuICByZXR1cm4gKGRlc2MgIT09IHVuZGVmaW5lZCB8fFxuICAgICghIWNoZWNrICYmIENYKGNoZWNrKWAke3EocHJvcE5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKGhhc093blByb3BlcnR5T2YoZGVzYywgJ3ZhbHVlJykgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoc2hvdWxkQmVFbnVtZXJhYmxlXG4gICAgICA/IGRlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApXG4gICAgICA6ICFkZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpXG4gICAgPyBkZXNjXG4gICAgOiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKC8qICAgICAgICAgICAgICAgICAgKi8gKHVuZGVmaW5lZCkpO1xufTskaM2PX29uY2UuZ2V0T3duRGF0YURlc2NyaXB0b3IoZ2V0T3duRGF0YURlc2NyaXB0b3IpO1xuaGFyZGVuKGdldE93bkRhdGFEZXNjcmlwdG9yKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldFRhZyA9IHRhZ1JlY29yZCA9PiB0YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaM2PX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuICAgICAgIGNvbnN0IGNoZWNrUGFzc1N0eWxlID0gKG9iaiwgcGFzc1N0eWxlLCBleHBlY3RlZFBhc3NTdHlsZSwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICBwYXNzU3R5bGUgPT09IGV4cGVjdGVkUGFzc1N0eWxlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShwYXNzU3R5bGUpfTogJHtvYmp9YClcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZCA9IGNoZWNrUHJvdG8gPT4ge1xuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjaGVja1RhZ1JlY29yZCA9ICh0YWdSZWNvcmQsIGV4cGVjdGVkUGFzc1N0eWxlLCBjaGVjaykgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICAoaXNPYmplY3QodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIChpc0Zyb3plbih0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICAoIWlzQXJyYXkodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJiBDWChjaGVjaylgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIGNoZWNrUGFzc1N0eWxlKFxuICAgICAgICB0YWdSZWNvcmQsXG4gICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKHRhZ1JlY29yZCwgUEFTU19TVFlMRSwgZmFsc2UsIGNoZWNrKS52YWx1ZSxcbiAgICAgICAgZXhwZWN0ZWRQYXNzU3R5bGUsXG4gICAgICAgIGNoZWNrLFxuICAgICAgKSAmJlxuICAgICAgKHR5cGVvZiBnZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsIFN5bWJvbC50b1N0cmluZ1RhZywgZmFsc2UsIGNoZWNrKVxuICAgICAgICAudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICBjaGVja1Byb3RvKHRhZ1JlY29yZCwgZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSwgY2hlY2spXG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG59O1xuXG4gICAgICAgY29uc3QgY2hlY2tUYWdSZWNvcmQgPSBtYWtlQ2hlY2tUYWdSZWNvcmQoXG4gICh2YWwsIHByb3RvLCBjaGVjaykgPT5cbiAgICBwcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKSxcbik7JGjNj19vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbiAgICAgICBjb25zdCBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gICAgcHJvdG8gPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgKHByb3RvICE9PSBudWxsICYmIGdldFByb3RvdHlwZU9mKHByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUpIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWAsXG4gICAgICApKSxcbik7JGjNj19vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sIkNYIjpbIkNYIl0sImdldE93bkRhdGFEZXNjcmlwdG9yIjpbImdldE93bkRhdGFEZXNjcmlwdG9yIl0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAydba3TKwAA0ysAACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL3RhZ2dlZC5qcyIsIi4vZXJyb3IuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc3ltYm9sLmpzIiwiLi9zYWZlLXByb21pc2UuanMiLCIuL3N0cmluZy5qcyJdLCJleHBvcnRzIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIiwiYXNzZXJ0UGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwicGFzc1N0eWxlT2YiLCJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Rocm93YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGlzUHJvbWlzZSxYLEZhaWwscSxhbm5vdGF0ZUVycm9yLG1ha2VFcnJvcixpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxhc3NlcnRDaGVja2VyLENvcHlBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyxjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcixnZXRFcnJvckNvbnN0cnVjdG9yLGlzRXJyb3JMaWtlLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZSxhc3NlcnRQYXNzYWJsZVN0cmluZzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsWyRozY9fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsWyRozY9fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIixbJGjNj19hID0+IChFcnJvckhlbHBlciA9ICRozY9fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzY1wiLFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gJGjNj19hKV1dLFtcImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yXCIsWyRozY9fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAkaM2PX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIixbJGjNj19hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIi4vc2FmZS1wcm9taXNlLmpzXCIsIFtbXCJhc3NlcnRTYWZlUHJvbWlzZVwiLFskaM2PX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi9zdHJpbmcuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3RyaW5nXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzRnJvemVuLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cblxuY29uc3QgbWFrZUhlbHBlclRhYmxlID0gcGFzc1N0eWxlSGVscGVycyA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBIZWxwZXJUYWJsZSA9IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgY29weUFycmF5OiB1bmRlZmluZWQsXG4gICAgY29weVJlY29yZDogdW5kZWZpbmVkLFxuICAgIHRhZ2dlZDogdW5kZWZpbmVkLFxuICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgcmVtb3RhYmxlOiB1bmRlZmluZWQsXG4gIH07XG4gIGZvciAoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpIHtcbiAgICBjb25zdCB7IHN0eWxlTmFtZSB9ID0gaGVscGVyO1xuICAgIHN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZSB8fCBGYWlsYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBGYWlsYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSA9IGhlbHBlcjtcbiAgfVxuICBmb3IgKGNvbnN0IHN0eWxlTmFtZSBvZiBvd25LZXlzKEhlbHBlclRhYmxlKSkge1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgRmFpbGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiAgfVxuXG4gIHJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFZhbGlkID0gKGhlbHBlciwgY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gIGhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlcik7XG4gIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2YgPSBwYXNzU3R5bGVIZWxwZXJzID0+IHtcbiAgY29uc3QgSGVscGVyVGFibGUgPSBtYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG4gIGNvbnN0IHJlbW90YWJsZUhlbHBlciA9IEhlbHBlclRhYmxlLnJlbW90YWJsZTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHBhc3NTdHlsZU1lbW8gPSBuZXcgV2Vha01hcCgpO1xuXG4gIC8qXG5cbiAgICovXG4gIC8vXG4gIGNvbnN0IHBhc3NTdHlsZU9mID0gcGFzc2FibGUgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGluUHJvZ3Jlc3MgPSBuZXcgU2V0KCk7XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZlJlY3VyID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgaW5uZXJJc09iamVjdCA9IGlzT2JqZWN0KGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGlubmVyU3R5bGUgPSBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gICAgICAgIGlmIChpbm5lclN0eWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGlubmVyU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgIWluUHJvZ3Jlc3MuaGFzKGlubmVyKSB8fFxuICAgICAgICAgIEZhaWxgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG4gICAgICAgIGluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIHBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLCBwYXNzU3R5bGUpO1xuICAgICAgICBpblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFzc1N0eWxlO1xuICAgIH07XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZkludGVybmFsID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgdHlwZXN0ciA9IHR5cGVvZiBpbm5lcjtcbiAgICAgIHN3aXRjaCAodHlwZXN0cikge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIHJldHVybiB0eXBlc3RyO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN0cmluZyhpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgICAgICBpZiAoaW5uZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNGcm96ZW4oaW5uZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgaXNUeXBlZEFycmF5KGlubmVyKVxuICAgICAgICAgICAgICAgID8gWGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmBcbiAgICAgICAgICAgICAgICA6IFhgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQcm9taXNlKGlubmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xuICAgICAgICAgICAgcmV0dXJuICdwcm9taXNlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdHlwZW9mIGlubmVyLnRoZW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbiAgICAgICAgICBjb25zdCBwYXNzU3R5bGVUYWcgPSBpbm5lcltQQVNTX1NUWUxFXTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlVGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCAnc3RyaW5nJyk7XG4gICAgICAgICAgICBjb25zdCBoZWxwZXIgPSBIZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuICAgICAgICAgICAgaGVscGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgRmFpbGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWQoaGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVUYWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKSB7XG4gICAgICAgICAgICBpZiAoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKSB7XG4gICAgICAgICAgICAgIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgICAgICByZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzZXJ0VmFsaWQocmVtb3RhYmxlSGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgcmV0dXJuICdyZW1vdGFibGUnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoge1xuICAgICAgICAgIGlzRnJvemVuKGlubmVyKSB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbiAgICAgICAgICB0eXBlb2YgaW5uZXIudGhlbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuICAgICAgICAgIGFzc2VydFZhbGlkKHJlbW90YWJsZUhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgIHJldHVybiAncmVtb3RhYmxlJztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG59O1xuXG4gICAgICAgY29uc3QgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wgPSBTeW1ib2wuZm9yKCdAZW5kbyBwYXNzU3R5bGVPZicpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2woUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wpO1xuICAgICAgIGNvbnN0IHBhc3NTdHlsZU9mID1cbiAgKGdsb2JhbFRoaXMgJiYgZ2xvYmFsVGhpc1tQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbF0pIHx8XG4gIG1ha2VQYXNzU3R5bGVPZihbXG4gICAgQ29weUFycmF5SGVscGVyLFxuICAgIENvcHlSZWNvcmRIZWxwZXIsXG4gICAgVGFnZ2VkSGVscGVyLFxuICAgIEVycm9ySGVscGVyLFxuICAgIFJlbW90YWJsZUhlbHBlcixcbiAgXSk7JGjNj19vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlID0gdmFsID0+IHtcbiAgcGFzc1N0eWxlT2YodmFsKTsgLy9cbn07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNQYXNzYWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgdHJ5IHtcbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSAhPT0gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59OyRozY9fb25jZS5pc1Bhc3NhYmxlKGlzUGFzc2FibGUpO1xuaGFyZGVuKGlzUGFzc2FibGUpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAobmFtZSwgZGVzYykgPT5cbiAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MobmFtZSwgZGVzYywgcGFzc1N0eWxlT2YpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHRvUGFzc2FibGVFcnJvciA9IGVyciA9PiB7XG4gIGhhcmRlbihlcnIpO1xuICBpZiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoZXJyLCBwYXNzU3R5bGVPZikpIHtcbiAgICByZXR1cm4gZXJyO1xuICB9XG4gIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gZXJyO1xuICBjb25zdCB7IGNhdXNlOiBjYXVzZURlc2MsIGVycm9yczogZXJyb3JzRGVzYyB9ID1cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGVycik7XG4gIGxldCBjYXVzZTtcbiAgbGV0IGVycm9ycztcbiAgaWYgKGNhdXNlRGVzYyAmJiBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2NhdXNlJywgY2F1c2VEZXNjKSkge1xuICAgIGNhdXNlID0gY2F1c2VEZXNjLnZhbHVlO1xuICB9XG4gIGlmIChlcnJvcnNEZXNjICYmIGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnZXJyb3JzJywgZXJyb3JzRGVzYykpIHtcbiAgICBlcnJvcnMgPSBlcnJvcnNEZXNjLnZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKGAke25hbWV9YCkgfHwgRXJyb3I7XG4gIGNvbnN0IG5ld0Vycm9yID0gbWFrZUVycm9yKGAke21lc3NhZ2V9YCwgZXJyQ29uc3RydWN0b3IsIHtcbiAgICAvL1xuICAgIGNhdXNlLFxuICAgIGVycm9ycyxcbiAgfSk7XG4gIC8vXG4gIGhhcmRlbihuZXdFcnJvcik7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGFubm90YXRlRXJyb3IobmV3RXJyb3IsIFhgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG4gIHBhc3NTdHlsZU9mKG5ld0Vycm9yKSA9PT0gJ2Vycm9yJyB8fFxuICAgIEZhaWxgRXhwZWN0ZWQgJHtuZXdFcnJvcn0gdG8gYmUgYSBwYXNzYWJsZSBlcnJvcmA7XG4gIHJldHVybiBuZXdFcnJvcjtcbn07JGjNj19vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB0b1Rocm93YWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgaGFyZGVuKHNwZWNpbWVuKTtcbiAgaWYgKGlzRXJyb3JMaWtlKHNwZWNpbWVuKSkge1xuICAgIHJldHVybiB0b1Bhc3NhYmxlRXJyb3IoLyogICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKSk7XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuICBpZiAoaXNPYmplY3Qoc3BlY2ltZW4pKSB7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAvKiAgICAgICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgZWxlbWVudCA9PT0gdG9UaHJvd2FibGUoZWxlbWVudCkgfHxcbiAgICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZWxlbWVudH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgY29uc3QgcmVjID0gLyogICAgICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMocmVjKSkge1xuICAgICAgICAgIHZhbCA9PT0gdG9UaHJvd2FibGUodmFsKSB8fFxuICAgICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHt2YWx9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgY29uc3QgdGcgPSAvKiAgICAgICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG4gICAgICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gdGc7XG4gICAgICAgIHBheWxvYWQgPT09IHRvVGhyb3dhYmxlKHBheWxvYWQpIHx8XG4gICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtwYXlsb2FkfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVyID0gLyogICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZXIgPT09IHRvVGhyb3dhYmxlKGVyKSB8fFxuICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZXJ9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgQSAke3EocGFzc1N0eWxlKX0gaXMgbm90IHRocm93YWJsZTogJHtzcGVjaW1lbn1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG59OyRozY9fb25jZS50b1Rocm93YWJsZSh0b1Rocm93YWJsZSk7XG5oYXJkZW4odG9UaHJvd2FibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiXSwicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXSwiaXNQYXNzYWJsZSI6WyJpc1Bhc3NhYmxlIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXSwidG9UaHJvd2FibGUiOlsidG9UaHJvd2FibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAA4EnR64cAACuHAAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiZ2V0SW50ZXJmYWNlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxoYXNPd25Qcm9wZXJ0eU9mLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc09iamVjdCxnZXRUYWcsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiY2FuQmVNZXRob2RcIixbJGjNj19hID0+IChjYW5CZU1ldGhvZCA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsWyRozY9fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImlzT2JqZWN0XCIsWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxufSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2UgPSAoaWZhY2UsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgLy9cbiAgICAodHlwZW9mIGlmYWNlID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkgJiZcbiAgICAoaWZhY2UgPT09ICdSZW1vdGFibGUnIHx8XG4gICAgICBpZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKSB8fFxuICAgICAgaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goY2hlY2spYEZvciBub3csIGlmYWNlICR7cShcbiAgICAgICAgICBpZmFjZSxcbiAgICAgICAgKX0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCI7IHVuaW1wbGVtZW50ZWRgKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0SWZhY2UgPSBpZmFjZSA9PiBjaGVja0lmYWNlKGlmYWNlLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mID0gKG9yaWdpbmFsLCBjaGVjaykgPT4ge1xuICBpc09iamVjdChvcmlnaW5hbCkgfHxcbiAgICBGYWlsYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuICBpZiAoXG4gICAgcHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgIHByb3RvID09PSBudWxsIHx8XG4gICAgcHJvdG8gPT09IEZ1bmN0aW9uLnByb3RvdHlwZVxuICApIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBwcm90b1Byb3RvID0gZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIGlmIChwcm90b1Byb3RvICE9PSBvYmplY3RQcm90b3R5cGUgJiYgcHJvdG9Qcm90byAhPT0gbnVsbCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja1JlbW90YWJsZShwcm90bywgY2hlY2spO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCAncmVtb3RhYmxlJywgY2hlY2spKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICghY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywgJ3JlbW90YWJsZScsIGNoZWNrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vXG4gIGNvbnN0IHBhc3NTdHlsZUtleSA9IC8qICAgICAgICAgICAgICAgICAgKi8gKFBBU1NfU1RZTEUpO1xuICBjb25zdCB0YWdLZXkgPSAvKiAgICAgICAgICAgICAgICAgICovIChTeW1ib2wudG9TdHJpbmdUYWcpO1xuICBjb25zdCB7XG4gICAgLy9cbiAgICBbLyogICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVLZXkpXTogX3Bhc3NTdHlsZURlc2MsXG4gICAgWy8qICAgICAgICAgICAgICAgICAqLyAodGFnS2V5KV06IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgLi4ucmVzdERlc2NzXG4gIH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHByb3RvKTtcblxuICByZXR1cm4gKFxuICAgIChvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoID09PSAwIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApKSAmJlxuICAgIGNoZWNrSWZhY2UoaWZhY2UsIGNoZWNrKVxuICApO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjb25maXJtZWRSZW1vdGFibGVzID0gbmV3IFdlYWtTZXQoKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGUgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghaXNGcm96ZW4odmFsKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWBcbiAgICApO1xuICB9XG4gIC8vXG4gIGlmICghUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLCBjaGVjaykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0SW50ZXJmYWNlT2YgPSB2YWwgPT4ge1xuICBpZiAoXG4gICAgIWlzT2JqZWN0KHZhbCkgfHxcbiAgICB2YWxbUEFTU19TVFlMRV0gIT09ICdyZW1vdGFibGUnIHx8XG4gICAgIWNoZWNrUmVtb3RhYmxlKHZhbClcbiAgKSB7XG4gICAgLy9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8vXG4gIHJldHVybiBnZXRUYWcodmFsKTtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAncmVtb3RhYmxlJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IHZhbGlkVHlwZSA9XG4gICAgICAoaXNPYmplY3QoY2FuZGlkYXRlKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICghaXNBcnJheShjYW5kaWRhdGUpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG4gICAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIG93bktleXMoZGVzY3MpLmV2ZXJ5KGtleSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgLy9cbiAgICAgICAgICAoaGFzT3duUHJvcGVydHlPZihkZXNjc1svKiAgICAgICAgICAgICAgICAgKi8gKGtleSldLCAndmFsdWUnKSB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICBTdHJpbmcoa2V5KSxcbiAgICAgICAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgKChrZXkgPT09IFN5bWJvbC50b1N0cmluZ1RhZyAmJiBjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLCBjaGVjaykpIHx8XG4gICAgICAgICAgICAoKGNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKSB8fFxuICAgICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICAgICAgICAgICl9IGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICAgICAoa2V5ICE9PSBQQVNTX1NUWUxFIHx8XG4gICAgICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgICAgIENYKGNoZWNrKWBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qge1xuICAgICAgICBuYW1lOiBuYW1lRGVzYyxcbiAgICAgICAgbGVuZ3RoOiBsZW5ndGhEZXNjLFxuICAgICAgICAvL1xuICAgICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogdG9TdHJpbmdUYWdEZXNjLFxuICAgICAgICAuLi5yZXN0RGVzY3NcbiAgICAgIH0gPSBkZXNjcztcbiAgICAgIGNvbnN0IHJlc3RLZXlzID0gb3duS2V5cyhyZXN0RGVzY3MpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKChuYW1lRGVzYyAmJiB0eXBlb2YgbmFtZURlc2MudmFsdWUgPT09ICdzdHJpbmcnKSB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChjaGVjaylgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICgobGVuZ3RoRGVzYyAmJiB0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZSA9PT0gJ251bWJlcicpIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgKHRvU3RyaW5nVGFnRGVzYyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKCh0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgICBjaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSwgY2hlY2spKSkgJiZcbiAgICAgICAgKHJlc3RLZXlzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICApYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAhIWNoZWNrICYmIENYKGNoZWNrKWB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWA7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiBjYW5kaWRhdGUgPT4gY2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKSxcblxuICBldmVyeTogKF9wYXNzYWJsZSwgX2ZuKSA9PiB0cnVlLFxufSk7JGjNj19vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADHjH84eg4AAHoOAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpc1Byb21pc2UscSxhc3NlcnRDaGVja2VyLGhhc093blByb3BlcnR5T2YsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IGlzRnJvemVuLCBnZXRQcm90b3R5cGVPZiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IHRvU3RyaW5nVGFnIH0gPSBTeW1ib2w7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXMgPSAocHIsIGNoZWNrKSA9PiB7XG4gIGNvbnN0IGtleXMgPSBvd25LZXlzKHByKTtcblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHVua25vd25LZXlzID0ga2V5cy5maWx0ZXIoXG4gICAga2V5ID0+IHR5cGVvZiBrZXkgIT09ICdzeW1ib2wnIHx8ICFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLCBrZXkpLFxuICApO1xuXG4gIGlmICh1bmtub3duS2V5cy5sZW5ndGggIT09IDApIHtcbiAgICByZXR1cm4gQ1goXG4gICAgICBjaGVjayxcbiAgICApYCR7cHJ9IC0gTXVzdCBub3QgaGF2ZSBhbnkgb3duIHByb3BlcnRpZXM6ICR7cSh1bmtub3duS2V5cyl9YDtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGNoZWNrU2FmZU93bktleSA9IGtleSA9PiB7XG4gICAgaWYgKGtleSA9PT0gdG9TdHJpbmdUYWcpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgdGFnRGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihwciwgdG9TdHJpbmdUYWcpO1xuICAgICAgYXNzZXJ0KHRhZ0Rlc2MgIT09IHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoaGFzT3duUHJvcGVydHlPZih0YWdEZXNjLCAndmFsdWUnKSB8fFxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eSwgbm90IGFuIGFjY2Vzc29yOiAke3EodGFnRGVzYyl9YCkgJiZcbiAgICAgICAgKHR5cGVvZiB0YWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBPd24gQEB0b1N0cmluZ1RhZyB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nOiAke3EodGFnRGVzYy52YWx1ZSl9YCkgJiZcbiAgICAgICAgKCF0YWdEZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgICBDWChjaGVjaylgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtxKHRhZ0Rlc2MpfWApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBwcltrZXldO1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWwgIT09IG51bGwgJiZcbiAgICAgIGlzRnJvemVuKHZhbCkgJiZcbiAgICAgIGdldFByb3RvdHlwZU9mKHZhbCkgPT09IE9iamVjdC5wcm90b3R5cGVcbiAgICApIHtcbiAgICAgIGNvbnN0IHN1YktleXMgPSBvd25LZXlzKHZhbCk7XG4gICAgICBpZiAoc3ViS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgc3ViS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgc3ViS2V5c1swXSA9PT0gJ2Rlc3Ryb3llZCcgJiZcbiAgICAgICAgdmFsLmRlc3Ryb3llZCA9PT0gZmFsc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIENYKFxuICAgICAgY2hlY2ssXG4gICAgKWBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcbiAgICAgIFN0cmluZyhrZXkpLFxuICAgICl9IGlzICR7dmFsfWA7XG4gIH07XG5cbiAgcmV0dXJuIGtleXMuZXZlcnkoY2hlY2tTYWZlT3duS2V5KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlID0gKHByLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIChpc0Zyb3plbihwcikgfHwgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSAmJlxuICAgIChpc1Byb21pc2UocHIpIHx8IENYKGNoZWNrKWAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkgJiZcbiAgICAoZ2V0UHJvdG90eXBlT2YocHIpID09PSBQcm9taXNlLnByb3RvdHlwZSB8fFxuICAgICAgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbiAgICAgICAgZ2V0UHJvdG90eXBlT2YocHIpLFxuICAgICAgKX1gKSAmJlxuICAgIGNoZWNrUHJvbWlzZU93bktleXMoLyogICAgICAgICAgICAgICAgICAqLyAocHIpLCBjaGVjaylcbiAgKTtcbn07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzU2FmZVByb21pc2UgPSBwciA9PiBjaGVja1NhZmVQcm9taXNlKHByLCB4ID0+IHgpOyRozY9fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0U2FmZVByb21pc2UgPSBwciA9PiBjaGVja1NhZmVQcm9taXNlKHByLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0U2FmZVByb21pc2UoYXNzZXJ0U2FmZVByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALo+zaF5CAAAeQgAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvc3RyaW5nLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb24sRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuLy9cbmNvbnN0IGhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2QgPSAhIVN0cmluZy5wcm90b3R5cGUuaXNXZWxsRm9ybWVkO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzV2VsbEZvcm1lZFN0cmluZyA9IGhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2RcbiAgPyBzdHIgPT4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyLmlzV2VsbEZvcm1lZCgpXG4gIDogc3RyID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNoIG9mIHN0cikge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBjcCA9IC8qICAgICAgICAgICAgICAgICAqLyAoY2guY29kZVBvaW50QXQoMCkpO1xuICAgICAgICBpZiAoY3AgPj0gMHhkODAwICYmIGNwIDw9IDB4ZGZmZikge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTskaM2PX29uY2UuaXNXZWxsRm9ybWVkU3RyaW5nKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oaXNXZWxsRm9ybWVkU3RyaW5nKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nID0gc3RyID0+IHtcbiAgaXNXZWxsRm9ybWVkU3RyaW5nKHN0cikgfHwgRmFpbGBFeHBlY3RlZCB3ZWxsLWZvcm1lZCB1bmljb2RlIHN0cmluZzogJHtzdHJ9YDtcbn07JGjNj19vbmNlLmFzc2VydFdlbGxGb3JtZWRTdHJpbmcoYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5cbmNvbnN0IE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRSA9XG4gIGdldEVudmlyb25tZW50T3B0aW9uKCdPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUnLCAnZGlzYWJsZWQnLCBbXG4gICAgJ2VuYWJsZWQnLFxuICBdKSA9PT0gJ2VuYWJsZWQnO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSBzdHIgPT4ge1xuICB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyB8fCBGYWlsYEV4cGVjdGVkIHN0cmluZyAke3N0cn1gO1xuICAhT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFIHx8IGFzc2VydFdlbGxGb3JtZWRTdHJpbmcoc3RyKTtcbn07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3RyaW5nKGFzc2VydFBhc3NhYmxlU3RyaW5nKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1dlbGxGb3JtZWRTdHJpbmciOlsiaXNXZWxsRm9ybWVkU3RyaW5nIl0sImFzc2VydFdlbGxGb3JtZWRTdHJpbmciOlsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRQYXNzYWJsZVN0cmluZyI6WyJhc3NlcnRQYXNzYWJsZVN0cmluZyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdG1R25QoAAOUKAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3N5bWJvbC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKlxuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzID0gbmV3IE1hcChcbiAgb3duS2V5cyhTeW1ib2wpXG4gICAgLmZpbHRlcihcbiAgICAgIG5hbWUgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBTeW1ib2xbbmFtZV0gPT09ICdzeW1ib2wnLFxuICAgIClcbiAgICAuZmlsdGVyKG5hbWUgPT4ge1xuICAgICAgLy9cbiAgICAgICFuYW1lLnN0YXJ0c1dpdGgoJ0BAJykgfHxcbiAgICAgICAgRmFpbGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgKX1gO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSlcbiAgICAvL1xuICAgIC5tYXAobmFtZSA9PiBbU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pLFxuKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGVTeW1ib2wgPSBzeW0gPT5cbiAgdHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcgJiZcbiAgKHR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSkgPT09ICdzdHJpbmcnIHx8IHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaM2PX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3ltYm9sID0gc3ltID0+XG4gIGlzUGFzc2FibGVTeW1ib2woc3ltKSB8fFxuICBGYWlsYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBTeW1ib2wua2V5Rm9yKHN5bSk7XG4gIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gIH1cbiAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgIHJldHVybiBgQEAke25hbWV9YDtcbiAgfVxuICByZXR1cm4gbmFtZTtcbn07JGjNj19vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuID0gL15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFzc2FibGVTeW1ib2xGb3JOYW1lID0gbmFtZSA9PiB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gQXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gbWF0Y2hbMV07XG4gICAgaWYgKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKSB7XG4gICAgICByZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzeW0gPSBTeW1ib2xbc3VmZml4XTtcbiAgICAgIGlmICh0eXBlb2Ygc3ltID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gc3ltO1xuICAgICAgfVxuICAgICAgRmFpbGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG59OyRozY9fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZVN5bWJvbCI6WyJpc1Bhc3NhYmxlU3ltYm9sIl0sImFzc2VydFBhc3NhYmxlU3ltYm9sIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADy5fJQyQcAAMkHAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsZ2V0T3duRGF0YURlc2NyaXB0b3IsY2hlY2tQYXNzU3R5bGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja1RhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsWyRozY9fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgVGFnZ2VkSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAndGFnZ2VkJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT5cbiAgICBjaGVja1Bhc3NTdHlsZShjYW5kaWRhdGUsIGNhbmRpZGF0ZVtQQVNTX1NUWUxFXSwgJ3RhZ2dlZCcsIGNoZWNrKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBjaGVja1RhZ1JlY29yZChjYW5kaWRhdGUsICd0YWdnZWQnLCBhc3NlcnRDaGVja2VyKTtcblxuICAgIC8vXG4gICAgY29uc3QgcGFzc1N0eWxlS2V5ID0gLyogICAgICAgICAgICAgICAgICAqLyAoUEFTU19TVFlMRSk7XG4gICAgY29uc3QgdGFnS2V5ID0gLyogICAgICAgICAgICAgICAgICAqLyAoU3ltYm9sLnRvU3RyaW5nVGFnKTtcbiAgICBjb25zdCB7XG4gICAgICAvL1xuICAgICAgWy8qICAgICAgICAgICAgICAgICAqLyAocGFzc1N0eWxlS2V5KV06IF9wYXNzU3R5bGVEZXNjLFxuICAgICAgWy8qICAgICAgICAgICAgICAgICAqLyAodGFnS2V5KV06IF9sYWJlbERlc2MsXG4gICAgICBwYXlsb2FkOiBfcGF5bG9hZERlc2MsIC8vXG4gICAgICAuLi5yZXN0RGVzY3NcbiAgICB9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICAgIG93bktleXMocmVzdERlc2NzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuICAgIC8vXG4gICAgLy9cbiAgICBwYXNzU3R5bGVPZlJlY3VyKFxuICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCAncGF5bG9hZCcsIHRydWUsIGFzc2VydENoZWNrZXIpLnZhbHVlLFxuICAgICk7XG4gIH0sXG59KTskaM2PX29uY2UuVGFnZ2VkSGVscGVyKFRhZ2dlZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO7cIrBnCQAAZwkAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLHBhc3NTdHlsZU9mOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBpc0NvcHlBcnJheSA9IGFyciA9PiBwYXNzU3R5bGVPZihhcnIpID09PSAnY29weUFycmF5JzskaM2PX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzUmVjb3JkID0gcmVjb3JkID0+IHBhc3NTdHlsZU9mKHJlY29yZCkgPT09ICdjb3B5UmVjb3JkJzskaM2PX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc1JlbW90YWJsZSA9IHJlbW90YWJsZSA9PiBwYXNzU3R5bGVPZihyZW1vdGFibGUpID09PSAncmVtb3RhYmxlJzskaM2PX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29weUFycmF5ID0gKGFyciwgb3B0TmFtZU9mQXJyYXkgPSAnQWxsZWdlZCBhcnJheScpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YoYXJyKTtcbiAgcGFzc1N0eWxlID09PSAnY29weUFycmF5JyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJ9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0UmVjb3JkID0gKHJlY29yZCwgb3B0TmFtZU9mUmVjb3JkID0gJ0FsbGVnZWQgcmVjb3JkJykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZWNvcmQpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5UmVjb3JkJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGUgPSAoXG4gIHJlbW90YWJsZSxcbiAgb3B0TmFtZU9mUmVtb3RhYmxlID0gJ0FsbGVnZWQgcmVtb3RhYmxlJyxcbikgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZW1vdGFibGUpO1xuICBwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP0XT32IGAABiBgAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRozY9fYSldXV1dLFtcIi4vc3JjL21lbW8tcmFjZS5qc1wiLCBbW1wibWVtb1JhY2VcIixbJGjNj19hID0+IChtZW1vUmFjZSA9ICRozY9fYSldXV1dLFtcIi4vc3JjL2lzLXByb21pc2UuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlUHJvbWlzZUtpdCwnbmFtZScse3ZhbHVlOlwibWFrZVByb21pc2VLaXRcIn0pOyRozY9fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywnbmFtZScse3ZhbHVlOlwicmFjZVByb21pc2VzXCJ9KTskaM2PX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7XG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlID0gZ2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZSB8fCBQcm9taXNlO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gbWFrZVByb21pc2VLaXQoKSB7XG4gIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBleGVjdXRvciB9ID0gbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH0pO1xufVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLy9cbi8vXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gcmFjZVByb21pc2VzKHZhbHVlcykge1xuICByZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSwgdmFsdWVzKSk7XG59XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdYhBfmQCAABkAgAAKwAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCduYW1lJyx7dmFsdWU6XCJpc1Byb21pc2VcIn0pOyRozY9fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsvKlxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBpc1Byb21pc2UobWF5YmVQcm9taXNlKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKSA9PT0gbWF5YmVQcm9taXNlO1xufVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADnhrPBZCQAAWQkAACoAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4qL1xuXG5jb25zdCBpc09iamVjdCA9IHZhbHVlID0+IE9iamVjdCh2YWx1ZSkgPT09IHZhbHVlO1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qga25vd25Qcm9taXNlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuICovXG5jb25zdCBtYXJrU2V0dGxlZCA9IHJlY29yZCA9PiB7XG4gIGlmICghcmVjb3JkIHx8IHJlY29yZC5zZXR0bGVkKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgfVxuXG4gIGNvbnN0IHsgZGVmZXJyZWRzIH0gPSByZWNvcmQ7XG4gIE9iamVjdC5hc3NpZ24ocmVjb3JkLCB7XG4gICAgZGVmZXJyZWRzOiB1bmRlZmluZWQsXG4gICAgc2V0dGxlZDogdHJ1ZSxcbiAgfSk7XG4gIE9iamVjdC5mcmVlemUocmVjb3JkKTtcbiAgcmV0dXJuIGRlZmVycmVkcztcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQgPSB2YWx1ZSA9PiB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgc2V0dGxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIGxldCByZWNvcmQgPSBrbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZWNvcmQgPSB7IGRlZmVycmVkczogbmV3IFNldCgpLCBzZXR0bGVkOiBmYWxzZSB9O1xuICAgIGtub3duUHJvbWlzZXMuc2V0KHZhbHVlLCByZWNvcmQpO1xuICAgIC8vXG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuICAgICAgdmFsID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlc29sdmUgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlamVjdCB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCB7IHJhY2UgfSA9IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICByYWNlKHZhbHVlcykge1xuICAgIGxldCBkZWZlcnJlZDtcbiAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICAvL1xuICAgIGNvbnN0IGNhY2hlZFZhbHVlcyA9IFtdO1xuICAgIGNvbnN0IEMgPSB0aGlzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBDKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRlZmVycmVkID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgY29uc3QgeyBzZXR0bGVkLCBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoc2V0dGxlZCkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBDLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiByZXN1bHQuZmluYWxseSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcykge1xuICAgICAgICBjb25zdCB7IGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChkZWZlcnJlZHMpIHtcbiAgICAgICAgICBkZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTskaM2PX29uY2UucmFjZShyYWNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjBsiNR8GAAAfBgAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgaW50ZXJuYWxSZXNvbHZlO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbnRlcm5hbFJlamVjdDtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCByZXNvbHZlID0gdmFsdWUgPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlc29sdmUpIHtcbiAgICAgIGludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG4gICAgICBpbnRlcm5hbFJlc29sdmUgPSBudWxsO1xuICAgICAgaW50ZXJuYWxSZWplY3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlamVjdCA9IHJlYXNvbiA9PiB7XG4gICAgaWYgKGludGVybmFsUmVqZWN0KSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChyZWFzb24pO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVqZWN0ID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZXhlY3V0b3IgPSAocmVzLCByZWopID0+IHtcbiAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSB1bmRlZmluZWQgJiYgaW50ZXJuYWxSZWplY3QgPT09IHVuZGVmaW5lZCk7XG4gICAgaW50ZXJuYWxSZXNvbHZlID0gcmVzO1xuICAgIGludGVybmFsUmVqZWN0ID0gcmVqO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0pO1xufTskaM2PX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE6Fc2ufAQAAnwEAACAAAABAZW5kby90cmFtcG9saW5lLXYxLjAuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90cmFtcG9saW5lLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHJhbXBvbGluZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy90cmFtcG9saW5lLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM14fpGzBwAAswcAACkAAABAZW5kby90cmFtcG9saW5lLXYxLjAuMy9zcmMvdHJhbXBvbGluZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXN5bmNUcmFtcG9saW5lIiwiZ2VuZXJhdG9yUHJvdG90eXBlIiwic3luY1RyYW1wb2xpbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHN5bmNUcmFtcG9saW5lLCduYW1lJyx7dmFsdWU6XCJzeW5jVHJhbXBvbGluZVwifSk7JGjNj19vbmNlLnN5bmNUcmFtcG9saW5lKHN5bmNUcmFtcG9saW5lKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYXN5bmNUcmFtcG9saW5lLCduYW1lJyx7dmFsdWU6XCJhc3luY1RyYW1wb2xpbmVcIn0pOyRozY9fb25jZS5hc3luY1RyYW1wb2xpbmUoYXN5bmNUcmFtcG9saW5lKTsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKlxuXG4gKi9cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YgfSA9IE9iamVjdDtcbmNvbnN0IHsgYmluZCB9ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuY29uc3QgdW5jdXJyeVRoaXMgPSBiaW5kLmJpbmQoYmluZC5jYWxsKTsgLy9cbiAgICAgICBjb25zdCB7IHByb3RvdHlwZTogZ2VuZXJhdG9yUHJvdG90eXBlIH0gPSBnZXRQcm90b3R5cGVPZihcbiAgLy9cbiAgZnVuY3Rpb24qICgpIHt9LFxuKTskaM2PX29uY2UuZ2VuZXJhdG9yUHJvdG90eXBlKGdlbmVyYXRvclByb3RvdHlwZSk7XG5jb25zdCBnZW5lcmF0b3JOZXh0ID0gdW5jdXJyeVRoaXMoZ2VuZXJhdG9yUHJvdG90eXBlLm5leHQpO1xuY29uc3QgZ2VuZXJhdG9yVGhyb3cgPSB1bmN1cnJ5VGhpcyhnZW5lcmF0b3JQcm90b3R5cGUudGhyb3cpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBzeW5jVHJhbXBvbGluZShnZW5lcmF0b3JGbiwgLi4uYXJncykge1xuICBjb25zdCBpdGVyYXRvciA9IGdlbmVyYXRvckZuKC4uLmFyZ3MpO1xuICBsZXQgcmVzdWx0ID0gZ2VuZXJhdG9yTmV4dChpdGVyYXRvcik7XG4gIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yTmV4dChpdGVyYXRvciwgcmVzdWx0LnZhbHVlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJlc3VsdCA9IGdlbmVyYXRvclRocm93KGl0ZXJhdG9yLCBlcnIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0LnZhbHVlO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY1RyYW1wb2xpbmUoZ2VuZXJhdG9yRm4sIC4uLmFyZ3MpIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBnZW5lcmF0b3JGbiguLi5hcmdzKTtcbiAgbGV0IHJlc3VsdCA9IGdlbmVyYXRvck5leHQoaXRlcmF0b3IpO1xuICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vXG4gICAgICBjb25zdCB2YWwgPSBhd2FpdCByZXN1bHQudmFsdWU7XG4gICAgICByZXN1bHQgPSBnZW5lcmF0b3JOZXh0KGl0ZXJhdG9yLCB2YWwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yVGhyb3coaXRlcmF0b3IsIGVycik7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQudmFsdWU7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZW5lcmF0b3JQcm90b3R5cGUiOlsiZ2VuZXJhdG9yUHJvdG90eXBlIl0sInN5bmNUcmFtcG9saW5lIjpbInN5bmNUcmFtcG9saW5lIl0sImFzeW5jVHJhbXBvbGluZSI6WyJhc3luY1RyYW1wb2xpbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvP8BQ5oCAACaAgAAGQAAAEBlbmRvL3ppcC12MS4wLjkvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy9yZWFkZXIuanMiLCIuL3NyYy93cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIiwicmVhZFppcCIsIndyaXRlWmlwIiwid3JpdGVaaXAiXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9yZWFkZXIuanNcIiwgW11dLFtcIi4vc3JjL3dyaXRlci5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL3JlYWRlci5qcyI6W1siWmlwUmVhZGVyIiwiWmlwUmVhZGVyIl0sWyJyZWFkWmlwIiwicmVhZFppcCJdXSwiLi9zcmMvd3JpdGVyLmpzIjpbWyJaaXBXcml0ZXIiLCJaaXBXcml0ZXIiXSxbIndyaXRlWmlwIiwid3JpdGVaaXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVWounBFAAAwRQAACUAAABAZW5kby96aXAtdjEuMC45L3NyYy9idWZmZXItcmVhZGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCdWZmZXJSZWFkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwcml2YXRlRmllbGRzID0gbmV3IFdlYWtNYXAoKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkc0dldCA9IHByaXZhdGVGaWVsZHMuZ2V0LmJpbmQocHJpdmF0ZUZpZWxkcyk7XG5cbiAgICAgICBjbGFzcyBCdWZmZXJSZWFkZXIge1xuICAvKlxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIHByaXZhdGVGaWVsZHMuc2V0KHRoaXMsIHtcbiAgICAgIGJ5dGVzLFxuICAgICAgZGF0YSxcbiAgICAgIGxlbmd0aDogYnl0ZXMubGVuZ3RoLFxuICAgICAgaW5kZXg6IDAsXG4gICAgICBvZmZzZXQ6IDAsXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiBwcml2YXRlRmllbGRzR2V0KHRoaXMpLmxlbmd0aDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKS5pbmRleDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNldCBpbmRleChpbmRleCkge1xuICAgIHRoaXMuc2VlayhpbmRleCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBzZXQgb2Zmc2V0KG9mZnNldCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKG9mZnNldCA+IGZpZWxkcy5kYXRhLmJ5dGVMZW5ndGgpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW5ub3Qgc2V0IG9mZnNldCBiZXlvbmQgbGVuZ3RoIG9mIHVuZGVybHlpbmcgZGF0YScpO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCBzZXQgbmVnYXRpdmUgb2Zmc2V0Jyk7XG4gICAgfVxuICAgIGZpZWxkcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgZmllbGRzLmxlbmd0aCA9IGZpZWxkcy5kYXRhLmJ5dGVMZW5ndGggLSBmaWVsZHMub2Zmc2V0O1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNhblNlZWsoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHJldHVybiBpbmRleCA+PSAwICYmIGZpZWxkcy5vZmZzZXQgKyBpbmRleCA8PSBmaWVsZHMubGVuZ3RoO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBhc3NlcnRDYW5TZWVrKGluZGV4KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBpZiAoIXRoaXMuY2FuU2VlayhpbmRleCkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgRW5kIG9mIGRhdGEgcmVhY2hlZCAoZGF0YSBsZW5ndGggPSAke2ZpZWxkcy5sZW5ndGh9LCBhc2tlZCBpbmRleCAke2luZGV4fWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgc2VlayhpbmRleCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgY29uc3QgcmVzdG9yZSA9IGZpZWxkcy5pbmRleDtcbiAgICB0aGlzLmFzc2VydENhblNlZWsoaW5kZXgpO1xuICAgIGZpZWxkcy5pbmRleCA9IGluZGV4O1xuICAgIHJldHVybiByZXN0b3JlO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBwZWVrKHNpemUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIC8vXG4gICAgc2l6ZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGZpZWxkcy5sZW5ndGggLSBmaWVsZHMuaW5kZXgsIHNpemUpKTtcbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZmllbGRzLmJ5dGVzLnN1YmFycmF5KFxuICAgICAgZmllbGRzLm9mZnNldCArIGZpZWxkcy5pbmRleCxcbiAgICAgIGZpZWxkcy5vZmZzZXQgKyBmaWVsZHMuaW5kZXggKyBzaXplLFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGNhblJlYWQob2Zmc2V0KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5jYW5TZWVrKGZpZWxkcy5pbmRleCArIG9mZnNldCk7XG4gIH1cblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBhc3NlcnRDYW5SZWFkKG9mZnNldCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5hc3NlcnRDYW5TZWVrKGZpZWxkcy5pbmRleCArIG9mZnNldCk7XG4gIH1cblxuICAvKlxuXG5cblxuXG4gICAqL1xuICByZWFkKHNpemUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHRoaXMuYXNzZXJ0Q2FuUmVhZChzaXplKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBlZWsoc2l6ZSk7XG4gICAgZmllbGRzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHJlYWRVaW50OCgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHRoaXMuYXNzZXJ0Q2FuUmVhZCgxKTtcbiAgICBjb25zdCBpbmRleCA9IGZpZWxkcy5vZmZzZXQgKyBmaWVsZHMuaW5kZXg7XG4gICAgY29uc3QgdmFsdWUgPSBmaWVsZHMuZGF0YS5nZXRVaW50OChpbmRleCk7XG4gICAgZmllbGRzLmluZGV4ICs9IDE7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICByZWFkVWludDE2KGxpdHRsZUVuZGlhbikge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5hc3NlcnRDYW5SZWFkKDIpO1xuICAgIGNvbnN0IGluZGV4ID0gZmllbGRzLm9mZnNldCArIGZpZWxkcy5pbmRleDtcbiAgICBjb25zdCB2YWx1ZSA9IGZpZWxkcy5kYXRhLmdldFVpbnQxNihpbmRleCwgbGl0dGxlRW5kaWFuKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gMjtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHJlYWRVaW50MzIobGl0dGxlRW5kaWFuKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICB0aGlzLmFzc2VydENhblJlYWQoNCk7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMub2Zmc2V0ICsgZmllbGRzLmluZGV4O1xuICAgIGNvbnN0IHZhbHVlID0gZmllbGRzLmRhdGEuZ2V0VWludDMyKGluZGV4LCBsaXR0bGVFbmRpYW4pO1xuICAgIGZpZWxkcy5pbmRleCArPSA0O1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgYnl0ZUF0KGluZGV4KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICByZXR1cm4gZmllbGRzLmJ5dGVzW2ZpZWxkcy5vZmZzZXQgKyBpbmRleF07XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBza2lwKG9mZnNldCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5zZWVrKGZpZWxkcy5pbmRleCArIG9mZnNldCk7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIGV4cGVjdChleHBlY3RlZCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKCF0aGlzLm1hdGNoQXQoZmllbGRzLmluZGV4LCBleHBlY3RlZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZmllbGRzLmluZGV4ICs9IGV4cGVjdGVkLmxlbmd0aDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG4gICAqL1xuICBtYXRjaEF0KGluZGV4LCBleHBlY3RlZCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKGluZGV4ICsgZXhwZWN0ZWQubGVuZ3RoID4gZmllbGRzLmxlbmd0aCB8fCBpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKGV4cGVjdGVkW2ldICE9PSB0aGlzLmJ5dGVBdChpbmRleCArIGkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBhc3NlcnQoZXhwZWN0ZWQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIGlmICghdGhpcy5leHBlY3QoZXhwZWN0ZWQpKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEV4cGVjdGVkICR7cShleHBlY3RlZCl9IGF0ICR7ZmllbGRzLmluZGV4fSwgZ290ICR7dGhpcy5wZWVrKFxuICAgICAgICAgIGV4cGVjdGVkLmxlbmd0aCxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIGZpbmRMYXN0KGV4cGVjdGVkKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBsZXQgaW5kZXggPSBmaWVsZHMubGVuZ3RoIC0gZXhwZWN0ZWQubGVuZ3RoO1xuICAgIHdoaWxlIChpbmRleCA+PSAwICYmICF0aGlzLm1hdGNoQXQoaW5kZXgsIGV4cGVjdGVkKSkge1xuICAgICAgaW5kZXggLT0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59JGjNj19vbmNlLiAgIEJ1ZmZlclJlYWRlcihCdWZmZXJSZWFkZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnVmZmVyUmVhZGVyIjpbIkJ1ZmZlclJlYWRlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD1sqa4vg8AAL4PAAAlAAAAQGVuZG8vemlwLXYxLjAuOS9zcmMvYnVmZmVyLXdyaXRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyV3JpdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByaXZhdGVGaWVsZHMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGdldFByaXZhdGVGaWVsZHMgPSBzZWxmID0+IHtcbiAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkcy5nZXQoc2VsZik7XG4gIGlmICghZmllbGRzKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0J1ZmZlcldyaXRlciBmaWVsZHMgYXJlIG5vdCBpbml0aWFsaXplZCcpO1xuICB9XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG5jb25zdCBhc3NlcnROYXROdW1iZXIgPSBuID0+IHtcbiAgaWYgKE51bWJlci5pc1NhZmVJbnRlZ2VyKG4pICYmIC8qICAgICAgICAgICAgICAgICAqLyAobikgPj0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aHJvdyBUeXBlRXJyb3IoYG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290ICR7bn1gKTtcbn07XG5cbiAgICAgICBjbGFzcyBCdWZmZXJXcml0ZXIge1xuICAvKlxuXG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiBnZXRQcml2YXRlRmllbGRzKHRoaXMpLmxlbmd0aDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5pbmRleDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNldCBpbmRleChpbmRleCkge1xuICAgIHRoaXMuc2VlayhpbmRleCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDE2KSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIHByaXZhdGVGaWVsZHMuc2V0KHRoaXMsIHtcbiAgICAgIGJ5dGVzLFxuICAgICAgZGF0YSxcbiAgICAgIGluZGV4OiAwLFxuICAgICAgbGVuZ3RoOiAwLFxuICAgICAgY2FwYWNpdHksXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBlbnN1cmVDYW5TZWVrKHJlcXVpcmVkKSB7XG4gICAgYXNzZXJ0TmF0TnVtYmVyKHJlcXVpcmVkKTtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIGxldCBjYXBhY2l0eSA9IGZpZWxkcy5jYXBhY2l0eTtcbiAgICB3aGlsZSAoY2FwYWNpdHkgPCByZXF1aXJlZCkge1xuICAgICAgY2FwYWNpdHkgKj0gMjtcbiAgICB9XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIGJ5dGVzLnNldChmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCwgZmllbGRzLmxlbmd0aCkpO1xuICAgIGZpZWxkcy5ieXRlcyA9IGJ5dGVzO1xuICAgIGZpZWxkcy5kYXRhID0gZGF0YTtcbiAgICBmaWVsZHMuY2FwYWNpdHkgPSBjYXBhY2l0eTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNlZWsoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuU2VlayhpbmRleCk7XG4gICAgZmllbGRzLmluZGV4ID0gaW5kZXg7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBlbnN1cmVDYW5Xcml0ZShzaXplKSB7XG4gICAgYXNzZXJ0TmF0TnVtYmVyKHNpemUpO1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgdGhpcy5lbnN1cmVDYW5TZWVrKGZpZWxkcy5pbmRleCArIHNpemUpO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgd3JpdGUoYnl0ZXMpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoYnl0ZXMuYnl0ZUxlbmd0aCk7XG4gICAgZmllbGRzLmJ5dGVzLnNldChieXRlcywgZmllbGRzLmluZGV4KTtcbiAgICBmaWVsZHMuaW5kZXggKz0gYnl0ZXMuYnl0ZUxlbmd0aDtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgd3JpdGVDb3B5KHN0YXJ0LCBlbmQpIHtcbiAgICBhc3NlcnROYXROdW1iZXIoc3RhcnQpO1xuICAgIGFzc2VydE5hdE51bWJlcihlbmQpO1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgY29uc3Qgc2l6ZSA9IGVuZCAtIHN0YXJ0O1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoc2l6ZSk7XG4gICAgZmllbGRzLmJ5dGVzLmNvcHlXaXRoaW4oZmllbGRzLmluZGV4LCBzdGFydCwgZW5kKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gc2l6ZTtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHdyaXRlVWludDgodmFsdWUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoMSk7XG4gICAgZmllbGRzLmRhdGEuc2V0VWludDgoZmllbGRzLmluZGV4LCB2YWx1ZSk7XG4gICAgZmllbGRzLmluZGV4ICs9IDE7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHdyaXRlVWludDE2KHZhbHVlLCBsaXR0bGVFbmRpYW4pIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoMik7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMuaW5kZXg7XG4gICAgZmllbGRzLmRhdGEuc2V0VWludDE2KGluZGV4LCB2YWx1ZSwgbGl0dGxlRW5kaWFuKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gMjtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgd3JpdGVVaW50MzIodmFsdWUsIGxpdHRsZUVuZGlhbikge1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgdGhpcy5lbnN1cmVDYW5Xcml0ZSg0KTtcbiAgICBjb25zdCBpbmRleCA9IGZpZWxkcy5pbmRleDtcbiAgICBmaWVsZHMuZGF0YS5zZXRVaW50MzIoaW5kZXgsIHZhbHVlLCBsaXR0bGVFbmRpYW4pO1xuICAgIGZpZWxkcy5pbmRleCArPSA0O1xuICAgIGZpZWxkcy5sZW5ndGggPSBNYXRoLm1heChmaWVsZHMuaW5kZXgsIGZpZWxkcy5sZW5ndGgpO1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIHN1YmFycmF5KGJlZ2luLCBlbmQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHJldHVybiBmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCwgZmllbGRzLmxlbmd0aCkuc3ViYXJyYXkoYmVnaW4sIGVuZCk7XG4gIH1cblxuICAvKlxuXG5cblxuICAgKi9cbiAgc2xpY2UoYmVnaW4sIGVuZCkge1xuICAgIHJldHVybiB0aGlzLnN1YmFycmF5KGJlZ2luLCBlbmQpLnNsaWNlKCk7XG4gIH1cbn0kaM2PX29uY2UuICAgQnVmZmVyV3JpdGVyKEJ1ZmZlcldyaXRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJXcml0ZXIiOlsiQnVmZmVyV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANGQ2vyoAQAAqAEAACMAAABAZW5kby96aXAtdjEuMC45L3NyYy9jb21wcmVzc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiU1RPUkUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLy9cbiAgICAgICBjb25zdCBTVE9SRSA9IDA7JGjNj19vbmNlLlNUT1JFKFNUT1JFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlNUT1JFIjpbIlNUT1JFIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF7m0YE4BAAAOAQAAB0AAABAZW5kby96aXAtdjEuMC45L3NyYy9jcmMzMi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiY3JjMzIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNyYzMyLCduYW1lJyx7dmFsdWU6XCJjcmMzMlwifSk7JGjNj19vbmNlLmNyYzMyKGNyYzMyKTsvL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLypcblxuICovXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIGxldCBjO1xuICBjb25zdCB0YWJsZSA9IFtdO1xuXG4gIGZvciAobGV0IG4gPSAwOyBuIDwgMjU2OyBuICs9IDEpIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IDg7IGsgKz0gMSkge1xuICAgICAgYyA9IGMgJiAxID8gMHhlZGI4ODMyMCBeIChjID4+PiAxKSA6IGMgPj4+IDE7XG4gICAgfVxuICAgIHRhYmxlW25dID0gYztcbiAgfVxuXG4gIHJldHVybiB0YWJsZTtcbn1cblxuLy9cbmNvbnN0IHRhYmxlID0gbWFrZVRhYmxlKCk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIGNyYzMyKGJ5dGVzLCBsZW5ndGggPSBieXRlcy5sZW5ndGgsIGluZGV4ID0gMCwgY3JjID0gMCkge1xuICBjb25zdCBlbmQgPSBpbmRleCArIGxlbmd0aDtcblxuICBjcmMgXj0gLTE7XG5cbiAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgZW5kOyBpICs9IDEpIHtcbiAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRhYmxlWyhjcmMgXiBieXRlc1tpXSkgJiAweGZmXTtcbiAgfVxuXG4gIHJldHVybiAoY3JjIF4gLTEpID4+PiAwO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY3JjMzIiOlsiY3JjMzIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmapkq54qAACeKgAAJQAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL2Zvcm1hdC1yZWFkZXIuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyIsIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRozY9faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIixbJGjNj19hID0+IChjcmMzMiA9ICRozY9fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsWyRozY9fYSA9PiAoc2lnbmF0dXJlID0gJGjNj19hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKGNvbXByZXNzaW9uID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmVhZFppcCwnbmFtZScse3ZhbHVlOlwicmVhZFppcFwifSk7JGjNj19vbmNlLnJlYWRaaXAocmVhZFppcCk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IE1BWF9WQUxVRV8xNkJJVFMgPSA2NTUzNTtcbmNvbnN0IE1BWF9WQUxVRV8zMkJJVFMgPSA0Mjk0OTY3Mjk1O1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gaXNFbmNyeXB0ZWQoYml0RmxhZykge1xuICByZXR1cm4gKGJpdEZsYWcgJiAweDAwMDEpID09PSAweDAwMDE7XG59XG5cbi8qXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZERvc0RhdGVUaW1lKHJlYWRlcikge1xuICBjb25zdCBkb3NUaW1lID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG4gIHJldHVybiBuZXcgRGF0ZShcbiAgICBEYXRlLlVUQyhcbiAgICAgICgoZG9zVGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODAsIC8vXG4gICAgICAoKGRvc1RpbWUgPj4gMjEpICYgMHgwZikgLSAxLCAvL1xuICAgICAgKGRvc1RpbWUgPj4gMTYpICYgMHgxZiwgLy9cbiAgICAgIChkb3NUaW1lID4+IDExKSAmIDB4MWYsIC8vXG4gICAgICAoZG9zVGltZSA+PiA1KSAmIDB4M2YsIC8vXG4gICAgICAoZG9zVGltZSAmIDB4MWYpIDw8IDEgIC8vXG4gICAgKSxcbiAgKTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRIZWFkZXJzKHJlYWRlcikge1xuICByZXR1cm4ge1xuICAgIHZlcnNpb25OZWVkZWQ6IHJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuICAgIGJpdEZsYWc6IHJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiByZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbiAgICBkYXRlOiByZWFkRG9zRGF0ZVRpbWUocmVhZGVyKSxcbiAgICBjcmMzMjogcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG4gICAgY29tcHJlc3NlZExlbmd0aDogcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG4gICAgdW5jb21wcmVzc2VkTGVuZ3RoOiByZWFkZXIucmVhZFVpbnQzMih0cnVlKSxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRDZW50cmFsRmlsZUhlYWRlcihyZWFkZXIpIHtcbiAgY29uc3QgdmVyc2lvbiA9IHJlYWRlci5yZWFkVWludDgoKTtcbiAgY29uc3QgbWFkZUJ5ID0gcmVhZGVyLnJlYWRVaW50OCgpO1xuICBjb25zdCBoZWFkZXJzID0gcmVhZEhlYWRlcnMocmVhZGVyKTtcbiAgY29uc3QgbmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBleHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjb21tZW50TGVuZ3RoID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGRpc2tOdW1iZXJTdGFydCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbiAgY29uc3QgZmlsZVN0YXJ0ID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5cbiAgY29uc3QgbmFtZSA9IHJlYWRlci5yZWFkKG5hbWVMZW5ndGgpO1xuICAvL1xuICByZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5cbiAgaWYgKGhlYWRlcnMudW5jb21wcmVzc2VkTGVuZ3RoID09PSBNQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gIH1cbiAgaWYgKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCA9PT0gTUFYX1ZBTFVFXzMyQklUUykge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG4gIGlmIChmaWxlU3RhcnQgPT09IE1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICB0aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiAgfVxuICBpZiAoZGlza051bWJlclN0YXJ0ID09PSBNQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gIH1cblxuICBjb25zdCBjb21tZW50ID0gcmVhZGVyLnJlYWQoY29tbWVudExlbmd0aCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHZlcnNpb24sXG4gICAgbWFkZUJ5LFxuICAgIC4uLmhlYWRlcnMsXG4gICAgZGlza051bWJlclN0YXJ0LFxuICAgIGludGVybmFsRmlsZUF0dHJpYnV0ZXMsXG4gICAgZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyxcbiAgICBmaWxlU3RhcnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLCBsb2NhdG9yKSB7XG4gIGNvbnN0IHsgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgY2VudHJhbERpcmVjdG9yeVJlY29yZHMgfSA9IGxvY2F0b3I7XG4gIHJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQpO1xuXG4gIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgd2hpbGUgKHJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpKSB7XG4gICAgY29uc3QgZW50cnkgPSByZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKTtcbiAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgaWYgKGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzICE9PSBlbnRyaWVzLmxlbmd0aCkge1xuICAgIC8vXG4gICAgLy9cbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgJHtjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc30gcmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290ICR7ZW50cmllcy5sZW5ndGh9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiByZWFkRmlsZShyZWFkZXIpIHtcbiAgcmVhZGVyLmV4cGVjdChzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuICBjb25zdCBoZWFkZXJzID0gcmVhZEhlYWRlcnMocmVhZGVyKTtcbiAgY29uc3QgbmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBleHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBuYW1lID0gcmVhZGVyLnJlYWQobmFtZUxlbmd0aCk7XG4gIHJlYWRlci5za2lwKGV4dHJhRmllbGRzTGVuZ3RoKTtcbiAgY29uc3QgY29udGVudCA9IHJlYWRlci5yZWFkKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCk7XG4gIHJldHVybiB7IG5hbWUsIC4uLmhlYWRlcnMsIGNvbnRlbnQgfTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZExvY2FsRmlsZXMocmVhZGVyLCByZWNvcmRzKSB7XG4gIGNvbnN0IGZpbGVzID0gW107XG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICByZWFkZXIuc2VlayhyZWNvcmQuZmlsZVN0YXJ0KTtcbiAgICBjb25zdCBmaWxlID0gcmVhZEZpbGUocmVhZGVyKTtcbiAgICBmaWxlcy5wdXNoKGZpbGUpO1xuICB9XG4gIHJldHVybiBmaWxlcztcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpIHtcbiAgaWYgKCFyZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICAnQ29ycnVwdCB6aXAgZmlsZSwgb3IgemlwIGZpbGUgY29udGFpbmluZyBhbiB1bnN1cHBvcnRlZCB2YXJpYWJsZS13aWR0aCBlbmQtb2YtYXJjaGl2ZSBjb21tZW50LCBvciBhbiB1bnN1cHBvcnRlZCB6aXAgZmlsZSB3aXRoIDY0IGJpdCBzaXplcycsXG4gICAgKTtcbiAgfVxuICBjb25zdCBkaXNrTnVtYmVyID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5UmVjb3JkcyA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5U2l6ZSA9IHJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5T2Zmc2V0ID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG4gIGNvbnN0IGNvbW1lbnRMZW5ndGggPSByZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgY29tbWVudCA9IHRleHREZWNvZGVyLmRlY29kZShyZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKSk7XG4gIHJldHVybiB7XG4gICAgZGlza051bWJlcixcbiAgICBkaXNrV2l0aENlbnRyYWxEaXJTdGFydCxcbiAgICBjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2ssXG4gICAgY2VudHJhbERpcmVjdG9yeVJlY29yZHMsXG4gICAgY2VudHJhbERpcmVjdG9yeVNpemUsXG4gICAgY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbiAgICBjb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpIHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgY2VudHJhbERpcmVjdG9yeUVuZCA9IHJlYWRlci5sZW5ndGggLSAyMjtcbiAgaWYgKGNlbnRyYWxEaXJlY3RvcnlFbmQgPCAwKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0NvcnJ1cHRlZCB6aXA6IG5vdCBlbm91Z2ggY29udGVudCcpO1xuICB9XG4gIHJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlFbmQpO1xuICBjb25zdCBsb2NhdG9yID0gcmVhZEJsb2NrRW5kT2ZDZW50cmFsKHJlYWRlcik7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgemlwNjQgPVxuICAgIGxvY2F0b3IuZGlza051bWJlciA9PT0gTUFYX1ZBTFVFXzE2QklUUyB8fFxuICAgIGxvY2F0b3IuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayA9PT0gTUFYX1ZBTFVFXzE2QklUUyB8fFxuICAgIGxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVJlY29yZHMgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlTaXplID09PSBNQVhfVkFMVUVfMzJCSVRTIHx8XG4gICAgbG9jYXRvci5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0ID09PSBNQVhfVkFMVUVfMzJCSVRTO1xuXG4gIGlmICh6aXA2NCkge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsXG4gICAgY2VudHJhbERpcmVjdG9yeVNpemVcbiAgICAvL1xuICB9ID0gbG9jYXRvcjtcblxuICBjb25zdCBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQgPVxuICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgKyBjZW50cmFsRGlyZWN0b3J5U2l6ZTtcbiAgY29uc3QgZXh0cmFCeXRlcyA9IGNlbnRyYWxEaXJlY3RvcnlFbmQgLSBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQ7XG5cbiAgcmVhZGVyLm9mZnNldCA9IGV4dHJhQnl0ZXM7XG5cbiAgcmV0dXJuIGxvY2F0b3I7XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUmVjb3JkcyhjZW50cmFsUmVjb3JkLCBsb2NhbFJlY29yZCwgYXJjaGl2ZU5hbWUpIHtcbiAgY29uc3QgY2VudHJhbE5hbWUgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoY2VudHJhbFJlY29yZC5uYW1lKTtcbiAgY29uc3QgbG9jYWxOYW1lID0gdGV4dERlY29kZXIuZGVjb2RlKGxvY2FsUmVjb3JkLm5hbWUpO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjZW50cmFsTmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJykgIT09IGxvY2FsTmFtZSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYFppcCBpbnRlZ3JpdHkgZXJyb3I6IGNlbnRyYWwgcmVjb3JkIGZpbGUgbmFtZSAke3EoXG4gICAgICAgIGNlbnRyYWxOYW1lLFxuICAgICAgKX0gbXVzdCBtYXRjaCBsb2NhbCBmaWxlIG5hbWUgJHtxKGxvY2FsTmFtZSl9IGluIGFyY2hpdmUgJHtxKFxuICAgICAgICBhcmNoaXZlTmFtZSxcbiAgICAgICl9YCxcbiAgICApO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBmdW5jdGlvbiBjaGVjayh2YWx1ZSwgbWVzc2FnZSkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgWmlwIGludGVncml0eSBlcnJvcjogJHttZXNzYWdlfSBmb3IgZmlsZSAke3EoXG4gICAgICAgICAgbG9jYWxOYW1lLFxuICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTmFtZSl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5iaXRGbGFnID09PSBsb2NhbFJlY29yZC5iaXRGbGFnLFxuICAgIGBDZW50cmFsIHJlY29yZCBiaXQgZmxhZyAke2NlbnRyYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZyhcbiAgICAgIDE2LFxuICAgICl9IG11c3QgbWF0Y2ggbG9jYWwgcmVjb3JkIGJpdCBmbGFnICR7bG9jYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZygxNil9YCxcbiAgKTtcbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCA9PT0gbG9jYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QsXG4gICAgYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG4gICAgICBjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgICl9IG11c3QgbWF0Y2ggbG9jYWwgY29tcHJlc3Npb24gbWV0aG9kICR7cShsb2NhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCl9YCxcbiAgKTtcbiAgLy9cbiAgLy9cbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5jcmMzMiA9PT0gbG9jYWxSZWNvcmQuY3JjMzIsXG4gICAgYENlbnRyYWwgcmVjb3JkIENSQy0zMiBjaGVja3N1bSAke2NlbnRyYWxSZWNvcmQuY3JjMzJ9IG11c3QgbWF0Y2ggbG9jYWwgY2hlY2tzdW0gJHtsb2NhbFJlY29yZC5jcmMzMn1gLFxuICApO1xuICBjaGVjayhcbiAgICBjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGggPT09IGxvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGgsXG4gICAgYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzZWQgc2l6ZSAke2NlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGh9YCxcbiAgKTtcbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGggPT09IGxvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aCxcbiAgICBgQ2VudHJhbCByZWNvcmQgdW5jb21wcmVzc2VkIHNpemUgJHtjZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH1gLFxuICApO1xuXG4gIGNvbnN0IGNoZWNrc3VtID0gY3JjMzIobG9jYWxSZWNvcmQuY29udGVudCk7XG4gIGNoZWNrKFxuICAgIGNoZWNrc3VtID09PSBsb2NhbFJlY29yZC5jcmMzMixcbiAgICBgQ1JDLTMyIGNoZWNrc3VtIG1pc21hdGNoLCB3YW50ZWQgJHtsb2NhbFJlY29yZC5jcmMzMn0gYnV0IGFjdHVhbCBjb250ZW50IGlzICR7Y2hlY2tzdW19YCxcbiAgKTtcbn1cblxuLypcblxuICovXG5mdW5jdGlvbiBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpIHtcbiAgcmV0dXJuIChleHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4ZmZmZjtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkVG9GaWxlKGNlbnRyYWxSZWNvcmQsIGxvY2FsUmVjb3JkKSB7XG4gIGNvbnN0IG1vZGUgPSBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGNlbnRyYWxSZWNvcmQuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY2VudHJhbFJlY29yZC5uYW1lLFxuICAgIG1vZGUsXG4gICAgZGF0ZTogY2VudHJhbFJlY29yZC5kYXRlLFxuICAgIGNyYzMyOiBjZW50cmFsUmVjb3JkLmNyYzMyLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiBjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgIGNvbXByZXNzZWRMZW5ndGg6IGNlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aCxcbiAgICB1bmNvbXByZXNzZWRMZW5ndGg6IGNlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIGNvbnRlbnQ6IGxvY2FsUmVjb3JkLmNvbnRlbnQsXG4gICAgY29tbWVudDogY2VudHJhbFJlY29yZC5jb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gZGVjb21wcmVzc0ZpbGUoZmlsZSkge1xuICBpZiAoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCAhPT0gY29tcHJlc3Npb24uU1RPUkUpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3QgZmluZCBkZWNvbXByZXNzb3IgZm9yIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG4gICAgICAgIGZpbGUuY29tcHJlc3Npb25NZXRob2QsXG4gICAgICApfSBmb3IgZmlsZSAke2ZpbGUubmFtZX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgbW9kZTogZmlsZS5tb2RlLFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudDogZmlsZS5jb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlRmlsZShmaWxlKSB7XG4gIGNvbnN0IG5hbWUgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5uYW1lKTtcbiAgY29uc3QgY29tbWVudCA9IHRleHREZWNvZGVyLmRlY29kZShmaWxlLmNvbW1lbnQpO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogJ2ZpbGUnLFxuICAgIG1vZGU6IGZpbGUubW9kZSAmIDBvNzc3LFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiByZWFkWmlwKHJlYWRlciwgbmFtZSA9ICc8dW5rbm93bj4nKSB7XG4gIGNvbnN0IGxvY2F0b3IgPSByZWFkRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHJlYWRlcik7XG4gIGNvbnN0IGNlbnRyYWxSZWNvcmRzID0gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLCBsb2NhdG9yKTtcbiAgY29uc3QgbG9jYWxSZWNvcmRzID0gcmVhZExvY2FsRmlsZXMocmVhZGVyLCBjZW50cmFsUmVjb3Jkcyk7XG4gIGNvbnN0IGZpbGVzID0gbmV3IE1hcCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2VudHJhbFJlY29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBjZW50cmFsUmVjb3JkID0gY2VudHJhbFJlY29yZHNbaV07XG4gICAgY29uc3QgbG9jYWxSZWNvcmQgPSBsb2NhbFJlY29yZHNbaV07XG5cbiAgICBjaGVja1JlY29yZHMoY2VudHJhbFJlY29yZCwgbG9jYWxSZWNvcmQsIG5hbWUpO1xuXG4gICAgaWYgKGlzRW5jcnlwdGVkKGNlbnRyYWxSZWNvcmQuYml0RmxhZykpIHtcbiAgICAgIHRocm93IEVycm9yKCdFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNEaXIgPSAoY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgwMDEwKSAhPT0gMDtcbiAgICBpZiAoIWlzRGlyKSB7XG4gICAgICBjb25zdCBjb21wcmVzc2VkRmlsZSA9IHJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLCBsb2NhbFJlY29yZCk7XG4gICAgICBjb25zdCBkZWNvbXByZXNzZWRGaWxlID0gZGVjb21wcmVzc0ZpbGUoY29tcHJlc3NlZEZpbGUpO1xuICAgICAgY29uc3QgZGVjb2RlZEZpbGUgPSBkZWNvZGVGaWxlKGRlY29tcHJlc3NlZEZpbGUpO1xuICAgICAgZmlsZXMuc2V0KGRlY29kZWRGaWxlLm5hbWUsIGRlY29kZWRGaWxlKTtcbiAgICB9XG4gICAgLy9cbiAgfVxuICByZXR1cm4gZmlsZXM7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiv8HosEWAADBFgAAJQAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL2Zvcm1hdC13cml0ZXIuanN7ImltcG9ydHMiOlsiLi9jcmMzMi5qcyIsIi4vc2lnbmF0dXJlLmpzIiwiLi9jb21wcmVzc2lvbi5qcyJdLCJleHBvcnRzIjpbIndyaXRlWmlwIiwid3JpdGVaaXBSZWNvcmRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRozY9faW1wb3J0cyhbW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIixbJGjNj19hID0+IChjcmMzMiA9ICRozY9fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsWyRozY9fYSA9PiAoc2lnbmF0dXJlID0gJGjNj19hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKGNvbXByZXNzaW9uID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JpdGVaaXBSZWNvcmRzLCduYW1lJyx7dmFsdWU6XCJ3cml0ZVppcFJlY29yZHNcIn0pOyRozY9fb25jZS53cml0ZVppcFJlY29yZHMod3JpdGVaaXBSZWNvcmRzKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JpdGVaaXAsJ25hbWUnLHt2YWx1ZTpcIndyaXRlWmlwXCJ9KTskaM2PX29uY2Uud3JpdGVaaXAod3JpdGVaaXApO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgVU5JWCA9IDM7XG5jb25zdCBVTklYX1ZFUlNJT04gPSAzMDtcblxuY29uc3QgdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcblxuLypcblxuXG5cblxuICovXG5mdW5jdGlvbiB3cml0ZURvc0RhdGVUaW1lKHdyaXRlciwgZGF0ZSkge1xuICBjb25zdCBkb3NUaW1lID1cbiAgICBkYXRlICE9PSB1bmRlZmluZWQgJiYgZGF0ZSAhPT0gbnVsbFxuICAgICAgPyAoKChkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgLSAxOTgwKSAmIDB4N2YpIDw8IDI1KSB8IC8vXG4gICAgICAgICgoZGF0ZS5nZXRVVENNb250aCgpICsgMSkgPDwgMjEpIHwgLy9cbiAgICAgICAgKGRhdGUuZ2V0VVRDRGF0ZSgpIDw8IDE2KSB8IC8vXG4gICAgICAgIChkYXRlLmdldFVUQ0hvdXJzKCkgPDwgMTEpIHwgLy9cbiAgICAgICAgKGRhdGUuZ2V0VVRDTWludXRlcygpIDw8IDUpIHwgLy9cbiAgICAgICAgKGRhdGUuZ2V0VVRDU2Vjb25kcygpID4+IDEpIC8vXG4gICAgICA6IDA7IC8vXG4gIHdyaXRlci53cml0ZVVpbnQzMihkb3NUaW1lLCB0cnVlKTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gd3JpdGVGaWxlKHdyaXRlciwgZmlsZSkge1xuICAvL1xuICBjb25zdCBmaWxlU3RhcnQgPSB3cml0ZXIuaW5kZXg7XG4gIHdyaXRlci53cml0ZShzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuICBjb25zdCBoZWFkZXJTdGFydCA9IHdyaXRlci5pbmRleDtcbiAgLy9cbiAgd3JpdGVyLndyaXRlVWludDE2KDEwLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuYml0RmxhZywgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLmNvbXByZXNzaW9uTWV0aG9kLCB0cnVlKTtcbiAgd3JpdGVEb3NEYXRlVGltZSh3cml0ZXIsIGZpbGUuZGF0ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLmNyYzMyLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGZpbGUuY29tcHJlc3NlZExlbmd0aCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLnVuY29tcHJlc3NlZExlbmd0aCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLm5hbWUubGVuZ3RoLCB0cnVlKTtcbiAgY29uc3QgaGVhZGVyRW5kID0gd3JpdGVyLmxlbmd0aDtcblxuICAvL1xuICB3cml0ZXIud3JpdGVVaW50MTYoMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZShmaWxlLm5hbWUpO1xuICAvL1xuICB3cml0ZXIud3JpdGUoZmlsZS5jb250ZW50KTtcblxuICByZXR1cm4ge1xuICAgIGZpbGVTdGFydCxcbiAgICBoZWFkZXJTdGFydCxcbiAgICBoZWFkZXJFbmQsXG4gIH07XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIHdyaXRlQ2VudHJhbEZpbGVIZWFkZXIod3JpdGVyLCBmaWxlLCBsb2NhdG9yKSB7XG4gIHdyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9GSUxFX0hFQURFUik7XG4gIHdyaXRlci53cml0ZVVpbnQ4KGZpbGUudmVyc2lvbik7XG4gIHdyaXRlci53cml0ZVVpbnQ4KGZpbGUubWFkZUJ5KTtcbiAgd3JpdGVyLndyaXRlQ29weShsb2NhdG9yLmhlYWRlclN0YXJ0LCBsb2NhdG9yLmhlYWRlckVuZCk7XG4gIC8vXG4gIHdyaXRlci53cml0ZVVpbnQxNigwLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuY29tbWVudC5sZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5kaXNrTnVtYmVyU3RhcnQsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGZpbGUuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcywgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihsb2NhdG9yLmZpbGVTdGFydCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZShmaWxlLmNlbnRyYWxOYW1lKTtcbiAgLy9cbiAgd3JpdGVyLndyaXRlKGZpbGUuY29tbWVudCk7XG59XG5cbi8qXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiB3cml0ZUVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChcbiAgd3JpdGVyLFxuICBlbnRyaWVzQ291bnQsXG4gIGNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbiAgY2VudHJhbERpcmVjdG9yeUxlbmd0aCxcbiAgY29tbWVudEJ5dGVzLFxuKSB7XG4gIHdyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KDAsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihlbnRyaWVzQ291bnQsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZW50cmllc0NvdW50LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MzIoY2VudHJhbERpcmVjdG9yeVN0YXJ0LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGNvbW1lbnRCeXRlcy5sZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGUoY29tbWVudEJ5dGVzKTtcbn1cblxuLypcblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIHdyaXRlWmlwUmVjb3Jkcyh3cml0ZXIsIHJlY29yZHMsIGNvbW1lbnQgPSAnJykge1xuICAvL1xuICBjb25zdCBsb2NhdG9ycyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBsb2NhdG9ycy5wdXNoKHdyaXRlRmlsZSh3cml0ZXIsIHJlY29yZHNbaV0pKTtcbiAgfVxuXG4gIC8vXG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlTdGFydCA9IHdyaXRlci5pbmRleDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhdG9ycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHdyaXRlQ2VudHJhbEZpbGVIZWFkZXIod3JpdGVyLCByZWNvcmRzW2ldLCBsb2NhdG9yc1tpXSk7XG4gIH1cbiAgY29uc3QgY2VudHJhbERpcmVjdG9yeUxlbmd0aCA9IHdyaXRlci5pbmRleCAtIGNlbnRyYWxEaXJlY3RvcnlTdGFydDtcblxuICBjb25zdCBjb21tZW50Qnl0ZXMgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoY29tbWVudCk7XG5cbiAgLy9cbiAgd3JpdGVFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoXG4gICAgd3JpdGVyLFxuICAgIHJlY29yZHMubGVuZ3RoLFxuICAgIGNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbiAgICBjZW50cmFsRGlyZWN0b3J5TGVuZ3RoLFxuICAgIGNvbW1lbnRCeXRlcyxcbiAgKTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZUZpbGUoZmlsZSkge1xuICBjb25zdCBuYW1lID0gdGV4dEVuY29kZXIuZW5jb2RlKGZpbGUubmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJykpO1xuICBjb25zdCBjb21tZW50ID0gdGV4dEVuY29kZXIuZW5jb2RlKGZpbGUuY29tbWVudCk7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBtb2RlOiBmaWxlLm1vZGUsXG4gICAgZGF0ZTogZmlsZS5kYXRlLFxuICAgIGNvbnRlbnQ6IGZpbGUuY29udGVudCxcbiAgICBjb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NGaWxlV2l0aFN0b3JlKGZpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgbW9kZTogZmlsZS5tb2RlLFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjcmMzMjogY3JjMzIoZmlsZS5jb250ZW50KSxcbiAgICBjb21wcmVzc2lvbk1ldGhvZDogY29tcHJlc3Npb24uU1RPUkUsXG4gICAgY29tcHJlc3NlZExlbmd0aDogZmlsZS5jb250ZW50Lmxlbmd0aCxcbiAgICB1bmNvbXByZXNzZWRMZW5ndGg6IGZpbGUuY29udGVudC5sZW5ndGgsXG4gICAgY29udGVudDogZmlsZS5jb250ZW50LFxuICAgIGNvbW1lbnQ6IGZpbGUuY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG5cblxuICovXG5mdW5jdGlvbiBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzKG1vZGUpIHtcbiAgcmV0dXJuICgobW9kZSAmIDBvNzc3KSB8IDBvMTAwMDAwKSA8PCAxNjtcbn1cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gbWFrZUZpbGVSZWNvcmQoZmlsZSkge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICBjZW50cmFsTmFtZTogZmlsZS5uYW1lLFxuICAgIG1hZGVCeTogVU5JWCxcbiAgICB2ZXJzaW9uOiBVTklYX1ZFUlNJT04sXG4gICAgdmVyc2lvbk5lZWRlZDogMCwgLy9cbiAgICBiaXRGbGFnOiAwLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiBjb21wcmVzc2lvbi5TVE9SRSxcbiAgICBkYXRlOiBmaWxlLmRhdGUsXG4gICAgY3JjMzI6IGZpbGUuY3JjMzIsXG4gICAgY29tcHJlc3NlZExlbmd0aDogZmlsZS5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIHVuY29tcHJlc3NlZExlbmd0aDogZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsXG4gICAgZGlza051bWJlclN0YXJ0OiAwLFxuICAgIGludGVybmFsRmlsZUF0dHJpYnV0ZXM6IDAsXG4gICAgZXh0ZXJuYWxGaWxlQXR0cmlidXRlczogZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhmaWxlLm1vZGUpLFxuICAgIGNvbW1lbnQ6IGZpbGUuY29tbWVudCxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gIH07XG59XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiB3cml0ZVppcCh3cml0ZXIsIGZpbGVzLCBjb21tZW50ID0gJycpIHtcbiAgY29uc3QgZW5jb2RlZEZpbGVzID0gZmlsZXMubWFwKGVuY29kZUZpbGUpO1xuICBjb25zdCBjb21wcmVzc2VkRmlsZXMgPSBlbmNvZGVkRmlsZXMubWFwKGNvbXByZXNzRmlsZVdpdGhTdG9yZSk7XG4gIC8vXG4gIGNvbnN0IGZpbGVSZWNvcmRzID0gY29tcHJlc3NlZEZpbGVzLm1hcChtYWtlRmlsZVJlY29yZCk7XG4gIHdyaXRlWmlwUmVjb3Jkcyh3cml0ZXIsIGZpbGVSZWNvcmRzLCBjb21tZW50KTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndyaXRlWmlwUmVjb3JkcyI6WyJ3cml0ZVppcFJlY29yZHMiXSwid3JpdGVaaXAiOlsid3JpdGVaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZDKALJYGAACWBgAAHgAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL3JlYWRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci1yZWFkZXIuanMiLCIuL2Zvcm1hdC1yZWFkZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBSZWFkZXIiLCJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQnVmZmVyUmVhZGVyLHJlYWRaaXBGb3JtYXQ7JGjNj19pbXBvcnRzKFtbXCIuL2J1ZmZlci1yZWFkZXIuanNcIiwgW1tcIkJ1ZmZlclJlYWRlclwiLFskaM2PX2EgPT4gKEJ1ZmZlclJlYWRlciA9ICRozY9fYSldXV1dLFtcIi4vZm9ybWF0LXJlYWRlci5qc1wiLCBbW1wicmVhZFppcFwiLFskaM2PX2EgPT4gKHJlYWRaaXBGb3JtYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4gICAgICAgY2xhc3MgWmlwUmVhZGVyIHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgbmFtZSA9ICc8dW5rbm93bj4nIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBCdWZmZXJSZWFkZXIoZGF0YSk7XG4gICAgdGhpcy5maWxlcyA9IHJlYWRaaXBGb3JtYXQocmVhZGVyKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICByZWFkKG5hbWUpIHtcbiAgICBjb25zdCBmaWxlID0gdGhpcy5maWxlcy5nZXQobmFtZSk7XG4gICAgaWYgKGZpbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoYENhbm5vdCBmaW5kIGZpbGUgJHtuYW1lfSBpbiBaaXAgZmlsZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGUuY29udGVudDtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgc3RhdChuYW1lKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuICAgIGlmIChmaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICBtb2RlOiBmaWxlLm1vZGUsXG4gICAgICBkYXRlOiBmaWxlLmRhdGUsXG4gICAgICBjb21tZW50OiBmaWxlLmNvbW1lbnQsXG4gICAgfTtcbiAgfVxufVxuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLiBaaXBSZWFkZXIoWmlwUmVhZGVyKTtcbiAgICAgICBjb25zdCByZWFkWmlwID0gYXN5bmMgKGRhdGEsIGxvY2F0aW9uKSA9PiB7XG4gIGNvbnN0IHJlYWRlciA9IG5ldyBaaXBSZWFkZXIoZGF0YSwgeyBuYW1lOiBsb2NhdGlvbiB9KTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlYWQgPSBhc3luYyBwYXRoID0+IHJlYWRlci5yZWFkKHBhdGgpO1xuICByZXR1cm4geyByZWFkIH07XG59OyRozY9fb25jZS5yZWFkWmlwKHJlYWRaaXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwUmVhZGVyIjpbIlppcFJlYWRlciJdLCJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAq0/87bsGAAC7BgAAIQAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL3NpZ25hdHVyZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIiwiQ0VOVFJBTF9GSUxFX0hFQURFUiIsIkRBVEFfREVTQ1JJUFRPUiIsIkxPQ0FMX0ZJTEVfSEVBREVSIiwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIiwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHUoc3RyaW5nKSB7XG4gIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoc3RyaW5nLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgYXJyYXlbaV0gPSBzdHJpbmcuY2hhckNvZGVBdChpKSAmIDB4ZmY7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4gICAgICAgY29uc3QgTE9DQUxfRklMRV9IRUFERVIgPSB1KCdQS1xceDAzXFx4MDQnKTskaM2PX29uY2UuTE9DQUxfRklMRV9IRUFERVIoTE9DQUxfRklMRV9IRUFERVIpO1xuICAgICAgIGNvbnN0IENFTlRSQUxfRklMRV9IRUFERVIgPSB1KCdQS1xceDAxXFx4MDInKTskaM2PX29uY2UuQ0VOVFJBTF9GSUxFX0hFQURFUihDRU5UUkFMX0ZJTEVfSEVBREVSKTtcbiAgICAgICBjb25zdCBDRU5UUkFMX0RJUkVDVE9SWV9FTkQgPSB1KCdQS1xceDA1XFx4MDYnKTskaM2PX29uY2UuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKENFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgY29uc3QgWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiA9IHUoJ1BLXFx4MDZcXHgwNycpOyRozY9fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuICAgICAgIGNvbnN0IFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCA9IHUoJ1BLXFx4MDZcXHgwNicpOyRozY9fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQoWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICBjb25zdCBEQVRBX0RFU0NSSVBUT1IgPSB1KCdQS1xceDA3XFx4MDgnKTskaM2PX29uY2UuREFUQV9ERVNDUklQVE9SKERBVEFfREVTQ1JJUFRPUik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJMT0NBTF9GSUxFX0hFQURFUiI6WyJMT0NBTF9GSUxFX0hFQURFUiJdLCJDRU5UUkFMX0ZJTEVfSEVBREVSIjpbIkNFTlRSQUxfRklMRV9IRUFERVIiXSwiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIkNFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiXSwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJEQVRBX0RFU0NSSVBUT1IiOlsiREFUQV9ERVNDUklQVE9SIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAAB0AAABAZW5kby96aXAtdjEuMC45L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACj63iQDQcAAA0HAAAeAAAAQGVuZG8vemlwLXYxLjAuOS9zcmMvd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vYnVmZmVyLXdyaXRlci5qcyIsIi4vZm9ybWF0LXdyaXRlci5qcyJdLCJleHBvcnRzIjpbIlppcFdyaXRlciIsIndyaXRlWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQnVmZmVyV3JpdGVyLHdyaXRlWmlwRm9ybWF0OyRozY9faW1wb3J0cyhbW1wiLi9idWZmZXItd3JpdGVyLmpzXCIsIFtbXCJCdWZmZXJXcml0ZXJcIixbJGjNj19hID0+IChCdWZmZXJXcml0ZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2Zvcm1hdC13cml0ZXIuanNcIiwgW1tcIndyaXRlWmlwXCIsWyRozY9fYSA9PiAod3JpdGVaaXBGb3JtYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4gICAgICAgY2xhc3MgWmlwV3JpdGVyIHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7IGRhdGU6IG5ldyBEYXRlKCkgfSkge1xuICAgIGNvbnN0IHsgZGF0ZSB9ID0gb3B0aW9ucztcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHRoaXMuZmlsZXMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kYXRlID0gZGF0ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIHdyaXRlKG5hbWUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgbW9kZSA9IDBvNjQ0LCBkYXRlID0gdW5kZWZpbmVkLCBjb21tZW50ID0gJycgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICB0aHJvdyBFcnJvcihgWmlwV3JpdGVyIHdyaXRlIHJlcXVpcmVzIGNvbnRlbnQgZm9yICR7bmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5maWxlcy5zZXQobmFtZSwge1xuICAgICAgbmFtZSxcbiAgICAgIG1vZGUsXG4gICAgICBkYXRlLFxuICAgICAgY29udGVudCxcbiAgICAgIGNvbW1lbnQsXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBzbmFwc2hvdCgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnVmZmVyV3JpdGVyKCk7XG4gICAgd3JpdGVaaXBGb3JtYXQod3JpdGVyLCBBcnJheS5mcm9tKHRoaXMuZmlsZXMudmFsdWVzKCkpKTtcbiAgICByZXR1cm4gd3JpdGVyLnN1YmFycmF5KCk7XG4gIH1cbn1cblxuLypcblxuICovJGjNj19vbmNlLiBaaXBXcml0ZXIoWmlwV3JpdGVyKTtcbiAgICAgICBjb25zdCB3cml0ZVppcCA9ICgpID0+IHtcbiAgY29uc3Qgd3JpdGVyID0gbmV3IFppcFdyaXRlcigpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHdyaXRlID0gYXN5bmMgKHBhdGgsIGRhdGEpID0+IHtcbiAgICB3cml0ZXIud3JpdGUocGF0aCwgZGF0YSk7XG4gIH07XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc25hcHNob3QgPSBhc3luYyAoKSA9PiB3cml0ZXIuc25hcHNob3QoKTtcbiAgcmV0dXJuIHsgd3JpdGUsIHNuYXBzaG90IH07XG59OyRozY9fb25jZS53cml0ZVppcCh3cml0ZVppcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJaaXBXcml0ZXIiOlsiWmlwV3JpdGVyIl0sIndyaXRlWmlwIjpbIndyaXRlWmlwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAAIARWdMdwAADHcAAAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAH1sUNdkEAADZBAAALwAAAAAAAAAAAAAApIH5cAAAQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjEuMC9zcmMvdmF0LXNwYXduZWQuanNQSwECHgMKAAAAAAAAAAAAONScZ3UCAAB1AgAAGwAAAAAAAAAAAAAApIEfdgAAQGVuZG8vYmFzZTY0LXYxLjAuOS9hdG9iLmpzUEsBAh4DCgAAAAAAAAAAAJLCk480AwAANAMAABsAAAAAAAAAAAAAAKSBzXgAAEBlbmRvL2Jhc2U2NC12MS4wLjkvYnRvYS5qc1BLAQIeAwoAAAAAAAAAAAAEe3Z/uQEAALkBAAAdAAAAAAAAAAAAAACkgTp8AABAZW5kby9iYXNlNjQtdjEuMC45L2RlY29kZS5qc1BLAQIeAwoAAAAAAAAAAAChVqVIuQEAALkBAAAdAAAAAAAAAAAAAACkgS5+AABAZW5kby9iYXNlNjQtdjEuMC45L2VuY29kZS5qc1BLAQIeAwoAAAAAAAAAAAAa++pXpAIAAKQCAAAcAAAAAAAAAAAAAACkgSKAAABAZW5kby9iYXNlNjQtdjEuMC45L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAB+XnPU3AwAANwMAACEAAAAAAAAAAAAAAKSBAIMAAEBlbmRvL2Jhc2U2NC12MS4wLjkvc3JjL2NvbW1vbi5qc1BLAQIeAwoAAAAAAAAAAADywE7BkggAAJIIAAAhAAAAAAAAAAAAAACkgXaGAABAZW5kby9iYXNlNjQtdjEuMC45L3NyYy9kZWNvZGUuanNQSwECHgMKAAAAAAAAAAAAjxNDN2sHAABrBwAAIQAAAAAAAAAAAAAApIFHjwAAQGVuZG8vYmFzZTY0LXYxLjAuOS9zcmMvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAAH9VFLM0AwAANAMAACIAAAAAAAAAAAAAAKSB8ZYAAEBlbmRvL2NvbW1vbi12MS4yLjEwL29iamVjdC1tYXAuanNQSwECHgMKAAAAAAAAAAAAtwVrcH0CAAB9AgAAMQAAAAAAAAAAAAAApIFlmgAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAAAoxQXujC0AAIwtAAA2AAAAAAAAAAAAAACkgTGdAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9jb21wYXJ0bWVudC1tYXAuanNQSwECHgMKAAAAAAAAAAAARdfuCzoDAAA6AwAAMAAAAAAAAAAAAAAApIERywAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvZXh0ZW5zaW9uLmpzUEsBAh4DCgAAAAAAAAAAAAi9oOyvLQAAry0AADoAAAAAAAAAAAAAAKSBmc4AAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLWxpdGUuanNQSwECHgMKAAAAAAAAAAAAquzY4zYFAAA2BQAAPQAAAAAAAAAAAAAApIGg/AAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qc1BLAQIeAwoAAAAAAAAAAACXFCXU3AgAANwIAAA1AAAAAAAAAAAAAACkgTECAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAACKAUN4X0kAAF9JAAAyAAAAAAAAAAAAAACkgWALAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtaG9vay5qc1BLAQIeAwoAAAAAAAAAAACyboTrLgMAAC4DAAArAAAAAAAAAAAAAACkgQ9VAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9qc29uLmpzUEsBAh4DCgAAAAAAAAAAAFRdc4GPJQAAjyUAACsAAAAAAAAAAAAAAKSBhlgBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2xpbmsuanNQSwECHgMKAAAAAAAAAAAA24zvzDwXAAA8FwAAMQAAAAAAAAAAAAAApIFefgEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvbWFwLXBhcnNlci5qc1BLAQIeAwoAAAAAAAAAAACbHJrWzwsAAM8LAAA8AAAAAAAAAAAAAACkgemVAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNQSwECHgMKAAAAAAAAAAAAuCqLH04FAABOBQAAMgAAAAAAAAAAAAAApIESogEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtYnl0ZXMuanNQSwECHgMKAAAAAAAAAAAAdTVibqkTAACpEwAARgAAAAAAAAAAAAAApIGwpwEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1BLAQIeAwoAAAAAAAAAAAB+v1bmRAUAAEQFAAAxAAAAAAAAAAAAAACkgb27AQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1qc29uLmpzUEsBAh4DCgAAAAAAAAAAAJNW0lQeCAAAHggAADQAAAAAAAAAAAAAAKSBUMEBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1janMuanNQSwECHgMKAAAAAAAAAAAA7KidoVEFAABRBQAANAAAAAAAAAAAAAAApIHAyQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtcHJlLW1qcy5qc1BLAQIeAwoAAAAAAAAAAAB2YD3s+gQAAPoEAAAxAAAAAAAAAAAAAACkgWPPAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS10ZXh0LmpzUEsBAh4DCgAAAAAAAAAAAAbk/GrVGAAA1RgAADQAAAAAAAAAAAAAAKSBrNQBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BvbGljeS1mb3JtYXQuanNQSwECHgMKAAAAAAAAAAAA8T/NJj4qAAA+KgAALQAAAAAAAAAAAAAApIHT7QEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcG9saWN5LmpzUEsBAh4DCgAAAAAAAAAAAK9oe6XcCAAA3AgAAC0AAAAAAAAAAAAAAKSBXBgCAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3Bvd2Vycy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAA1AAAAAAAAAAAAAACkgYMhAgBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy90eXBlcy1leHRlcm5hbC5qc1BLAQIeAwoAAAAAAAAAAAA0oqGpogEAAKIBAAAhAAAAAAAAAAAAAACkgS4jAgBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvaW5kZXguanNQSwECHgMKAAAAAAAAAAAALrCJHboPAAC6DwAAKwAAAAAAAAAAAAAApIEPJQIAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L3NyYy9lbnYtb3B0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAABJNfbpVAgAAFQIAAAdAAAAAAAAAAAAAACkgRI1AgBAZW5kby9lcnJvcnMtdjEuMi4xMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADJsYMZGxYAABsWAAAjAAAAAAAAAAAAAACkgaE9AgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvRS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAApAAAAAAAAAAAAAACkgf1TAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAACk4yujkQ4AAJEOAAAnAAAAAAAAAAAAAACkgZxVAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvbG9jYWwuanNQSwECHgMKAAAAAAAAAAAAeTPsuDwPAAA8DwAANQAAAAAAAAAAAAAApIFyZAIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanNQSwECHgMKAAAAAAAAAAAAuHaUnV8DAABfAwAAKQAAAAAAAAAAAAAApIEBdAIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL25vLXNoaW0uanNQSwECHgMKAAAAAAAAAAAAqYDDs54KAACeCgAALQAAAAAAAAAAAAAApIGndwIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAAAAAAAAAAAAAKSBkIICAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAANaBKoBZDAAAWQwAADUAAAAAAAAAAAAAAKSBNYUCAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNC4wL3NyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzUEsBAh4DCgAAAAAAAAAAAKu2xWGKFgAAihYAACcAAAAAAAAAAAAAAKSB4ZECAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNC4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAt1VAGggcAAIIHAAAdAAAAAAAAAAAAAACkgbCoAgBAZW5kby9tYXJzaGFsLXYxLjYuNC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACVfGWZmk8AAJpPAAAqAAAAAAAAAAAAAACkgW2wAgBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlUGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAz2KS+PQrAAD0KwAAKwAAAAAAAAAAAAAApIFPAAMAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1BLAQIeAwoAAAAAAAAAAAD2GBtPQSwAAEEsAAAtAAAAAAAAAAAAAACkgYwsAwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanNQSwECHgMKAAAAAAAAAAAA5otTsGgvAABoLwAAKgAAAAAAAAAAAAAApIEYWQMAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwtanVzdGluLmpzUEsBAh4DCgAAAAAAAAAAAL4ipxtKBwAASgcAAC0AAAAAAAAAAAAAAKSByIgDAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1BLAQIeAwoAAAAAAAAAAAAJOiBuYS8AAGEvAAAjAAAAAAAAAAAAAACkgV2QAwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvbWFyc2hhbC5qc1BLAQIeAwoAAAAAAAAAAABKsNVd6y4AAOsuAAAlAAAAAAAAAAAAAACkgf+/AwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAAAAAAAAAAAAAKSBLe8DAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABenLPKzAUAAMwFAAAdAAAAAAAAAAAAAACkgcTwAwBAZW5kby9uYXQtdjUuMS4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAC9HZqTQoAAE0KAAAgAAAAAAAAAAAAAACkgcv2AwBAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADD7/ZFvAYAALwGAAAoAAAAAAAAAAAAAACkgVYBBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAABCBRMD2CAAA9ggAACkAAAAAAAAAAAAAAKSBWAgEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAMI3yaeeCwAAngsAAC4AAAAAAAAAAAAAAKSBlREEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAF1cCItMUAADTFAAAJAAAAAAAAAAAAAAApIF/HQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAANOikHykBgAApAYAACsAAAAAAAAAAAAAAKSBlDIEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAYnh4idkSAADZEgAAJwAAAAAAAAAAAAAApIGBOQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAE3BiNPcBAAA3AQAACkAAAAAAAAAAAAAAKSBn0wEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAHBEXISiFwAAohcAADAAAAAAAAAAAAAAAKSBwlEEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAMnW2t0ysAANMrAAAqAAAAAAAAAAAAAACkgbJpBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAA4EnR64cAACuHAAAKAAAAAAAAAAAAAAApIHNlQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAADHjH84eg4AAHoOAAArAAAAAAAAAAAAAACkgcGyBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAALo+zaF5CAAAeQgAACUAAAAAAAAAAAAAAKSBhMEEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9zdHJpbmcuanNQSwECHgMKAAAAAAAAAAAAHRtUduUKAADlCgAAJQAAAAAAAAAAAAAApIFAygQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAADy5fJQyQcAAMkHAAAlAAAAAAAAAAAAAACkgWjVBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAO7cIrBnCQAAZwkAACkAAAAAAAAAAAAAAKSBdN0EAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAAAAAAAAAAAAAKSBIucEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAA/RdPfYgYAAGIGAAAiAAAAAAAAAAAAAACkgbzoBABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHWIQX5kAgAAZAIAACsAAAAAAAAAAAAAAKSBXu8EAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL2lzLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAOeGs8FkJAABZCQAAKgAAAAAAAAAAAAAApIEL8gQAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMC9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAIwbIjUfBgAAHwYAADUAAAAAAAAAAAAAAKSBrPsEAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAAAAAAAAAAAAAKSBHgIFAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAE6Fc2ufAQAAnwEAACAAAAAAAAAAAAAAAKSBugMFAEBlbmRvL3RyYW1wb2xpbmUtdjEuMC4zL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAM14fpGzBwAAswcAACkAAAAAAAAAAAAAAKSBlwUFAEBlbmRvL3RyYW1wb2xpbmUtdjEuMC4zL3NyYy90cmFtcG9saW5lLmpzUEsBAh4DCgAAAAAAAAAAALz/AUOaAgAAmgIAABkAAAAAAAAAAAAAAKSBkQ0FAEBlbmRvL3ppcC12MS4wLjkvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAdVai6cEUAADBFAAAJQAAAAAAAAAAAAAApIFiEAUAQGVuZG8vemlwLXYxLjAuOS9zcmMvYnVmZmVyLXJlYWRlci5qc1BLAQIeAwoAAAAAAAAAAAD1sqa4vg8AAL4PAAAlAAAAAAAAAAAAAACkgWYlBQBAZW5kby96aXAtdjEuMC45L3NyYy9idWZmZXItd3JpdGVyLmpzUEsBAh4DCgAAAAAAAAAAANGQ2vyoAQAAqAEAACMAAAAAAAAAAAAAAKSBZzUFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2NvbXByZXNzaW9uLmpzUEsBAh4DCgAAAAAAAAAAAF7m0YE4BAAAOAQAAB0AAAAAAAAAAAAAAKSBUDcFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2NyYzMyLmpzUEsBAh4DCgAAAAAAAAAAAJmqZKueKgAAnioAACUAAAAAAAAAAAAAAKSBwzsFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2Zvcm1hdC1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAiv8HosEWAADBFgAAJQAAAAAAAAAAAAAApIGkZgUAQGVuZG8vemlwLXYxLjAuOS9zcmMvZm9ybWF0LXdyaXRlci5qc1BLAQIeAwoAAAAAAAAAAABkMoAslgYAAJYGAAAeAAAAAAAAAAAAAACkgah9BQBAZW5kby96aXAtdjEuMC45L3NyYy9yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAq0/87bsGAAC7BgAAIQAAAAAAAAAAAAAApIF6hAUAQGVuZG8vemlwLXYxLjAuOS9zcmMvc2lnbmF0dXJlLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAAB0AAAAAAAAAAAAAAKSBdIsFAEBlbmRvL3ppcC12MS4wLjkvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAKPreJANBwAADQcAAB4AAAAAAAAAAAAAAKSBB40FAEBlbmRvL3ppcC12MS4wLjkvc3JjL3dyaXRlci5qc1BLBQYAAAAAWQBZABoeAABQlAUAAAA=","endoZipBase64Sha512":"75d5796f25e0a38b9dfc9c279a33d17fafbf29c3d1e4089c972ca10e69349094b0620c0fa20f1ad0c648bff08f1b20e5fde80da83c939c93c46b2b44847c675e"};
1
+ export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAA00QCIBXQAAAV0AAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjIuMCIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi45LXUyMi4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjIuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi45LXUyMi4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtc3Bhd25lZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LXNwYXduZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YWJhMTIzYzA4MzcwZWEzZjI2ZDQ1NzU2MzY4NDY0ODE4NGY0NWIwN2RiNWJiN2YzODAwNGQ0M2Q3ZjdiZjM5ZDBmMDQyOWY3NTNhYjkzZjI0YTg4ZWFmMjc0MzIxYWM4N2I3OWU0ZDMyYTRlNGZiM2U2ZjRlZmQ0ZTRhYzNiNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vYmFzZTY0LXYxLjAuMTIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Jhc2U2NCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9iYXNlNjQtdjEuMC4xMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9iYXNlNjQtdjEuMC4xMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJhMTkwZWQ3ZDJhYzc1Njc4NGZlMGExMDM5MzAzZmZkOWJmMDM3YzQ0MGJiZDIyZmViYTBmNDZkYzAzZGM1YjYyMTYwZmJlZTlkNDA0ZGE4Y2JmOTJkMDE0ZDlkYTY5NWFmOWZlZTkwODU3NDM0Y2UyZGI4MDU3ZDE4ZjVhNWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2NjNjA4NTZhZDdkYjkwMDBlNzcyN2RhNjE0OTc4YjUwOGQ2MWZkYmQ0ZGM4MmI4MWQ0ZTM0M2UxZTEzOTJlY2JhODM5ZDQ2ZDA0OTJiMzQ1ZWE4YmFhNmZmODI2MTJiNThjZWMyYTc3ZjQ5OTc3YTY5MTc2NWQ2ZmMxNDU1MjQiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTRmYTc3NmNmM2NiZDE2ZGQ4MmQ1YzMzYzgxYzIzODMwYjYyODEwMDZhZGM3ODE4MDUxNmZiMmI4MWJlNjM0NThhZGNhNTQyZTU0YWY4MDdmMmRjNzdjM2ViZjA5YWVkZGFjOGRiZTlmZDk2NDQwNmY4NGE1YjY4YjEzNTZlNmQiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjk0Yjg2YWNlMDJkZGMyMjYxOTgxNTIxMWYyN2I5ZTczMmU5ZGRiZDZiMGZlYWM1MmU0Mjg1NjA1ZTk1ZTQxMWIzN2I3NTM5ZDFlNzZiMWM3Zjk4ZDJmYWRlNzlmZTcwNzFmZjgxZTc3YjQ5ZTQwYzJiOGU4ZWQyMTBlMzNkNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMxMzU4ODE5NjIzNTcwNzQ3ZDA1NjJhMjhjZjdjMmRhYTdjZjcxOGZiMDk5M2Y1ODc1N2FkZDQ5OWMwMzFkMTI4ZWU5MDEyNjBiODE5NTNjNGU5MDMyY2RhMzM4NjNiYzM4OTBjMTZjNGM1YjY5NDI4ZjRkY2RiZDg2NTM4OTZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjI2MGZlM2U4NzUyNGY5OGQ2MWQ3NjNhMzE2ZmNhMTZiMDc0OGMzMzQ3MWY3NTM1MTY4YTFmMGJkMGJiNjQ4Y2NkZTI5ZGFhMjkwNTIzMmUwNjczOTY4NzM1NjkzZmRhZDYxNjVjNmU3MmRlYjJjZjQ1ZWE3ZTFkZWE4OGRjYmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYzFlNmRiYWEyMDQwZWU5ZmIwNjViYzY2MjEzMjgyYzg1ODJhNzg2NDg0ZDBjYmE2ZDg1MzI4OWY1YjJlMTNmOWRkYzU2OTMxZTViOWMxZDExODUxYTMzN2JhNWQ0MjA2NGRhZTAwODVjZTRiMGQxMjE3NDQwOTM4MDI3MGZhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkxYmUyMjlkZGQwYTFhYmYyOTRmOGRiNmEyNjM1MjU4YjRhZWMzMmNjNzJmMzNkZTI4N2EwMTc1NWYyZjFhNDdiZjA3ZTc2MmFlZDhiMGMxM2JkMGUxZTc1NjhhOWI2YTQxNDI5ODJjMTkxYmRjN2I3MTI2YmMzYTFmZDQ3NjM5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi4xMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tbW9uIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpZGVudC1jaGVja2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTk3ZjE4OTMwNWZmMGU0ODc2ZmU1ZjRhOGRjZjg0ZTM4MzU2YjhhMzk1ZTllYWNkNzNiODk1N2NiMTkxMjE0NWI4NTc3OGFjYjcwNWYxMDAwYTI4MjhjZmFiNzcwNWY5NWNmNGQxOGQ0OGI2MGVlODQxMTE3MDNiNmNhMzdhOWIiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm9iamVjdC1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjNlZjFiMGI5NGI3MGQ1NTJhNDNiYmRhMWFjNDZmYmFhZDU2OGVlMDI0ODEzZThlNWQ4MjAyNWMxMTZkNGExNzkzMzcxM2NiMzQwMjc1ODU5ZmIzYmUzZjVhMzk3NGFlNjU2ZWYxYmViMDFhYTBlZmEwNWU4MGJlNWMwOGQwNiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby90cmFtcG9saW5lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3RyYW1wb2xpbmUtdjEuMC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYxLjAuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjZhN2QzMjkzZjQzODJhZWI1YmE2Y2EzNDE2ODc1ZDQwZGZiMGQ2NDI0ZTg5YzA4MDk3NDFjYTQ3NDVlOWM2NmIyNjhlYWY1MjI5ZWY2YmNkNjIzZTg5ODc2Njg2ODI4MDViMjJiNzJhOWI3YjQwZTY1MDk4NWQyMGNhZjU4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wYXJ0bWVudC1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE1OTU5MWE4ZTM2YWQxNmM0NmZlNmVjYzM0MDExZmJiZDhkNGZkMDkxNjA0ZDM5MTM1N2E0YjA4NzBiMTJlNjgxMTViM2FkYjg2MDFkNmZlYTlhYjhjMWJlMjFlMDczYWE4ZGU4OWM5NDNiYzMzMWE4NjQ5NjgwNWY0NzAwNTEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4dGVuc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXh0ZW5zaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzRkYjAxM2JhMzVhYWM3YjJlNDNmNTk1NzBlNTcxYWUyZmQ4M2RjOGRmOTA2YWM5NzY3YjM5N2I2MTAxMmY0NmQzMjU0NmE1OWViNzg2YjRiNzliZmVkYTczZDNhMzljMTBjYTkwMGEyNjBjMjQxN2Y0YjVlZTgxZjAxYTA2OWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA1ZTkyMzhmYzZhMmFhNzFkM2NmNzE3NjBlNGRhNTBhYjQ4NGVhZGY5MWM3MDlmZjE0ZTUzZjk4N2UwNzI4Njk2OTNjMWNlYjJkNTM5YTIxNDY2ZjE5NGQ0ZjE2NWFhMzc1ZjhiYjY1OGJmMDM2M2Q5NmE4N2ZmMTYwNmQzNDVkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Yjk5MDdmMjg0MmQzMzMwZThhMTE4ODNjMDg4OGRjZTk0ZTUwODdlNTAxNDBkNmM0Y2EwM2U0YzE3ZmUzZGI4YWRjZmExMjY0YWNhOWEzMjhjODBmZTQ5NmRkZWRjMGZhNTc0M2VhYjBiYWQyYjhkMjlhNmRlZmZiMWQwMTY4ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZmFhZTM2NTAzYmU1OTczOGY2OTE5MTdmMjU3OGEzYWRiNWE5ZTU4NGFkOWMzYjdhMTVmNDE0MjMyZjMwNTA3NmY3ZWM3YjJiMmU5ZGMxY2RjYTAzMzcxYzYyNjFmZWNiMDc2ZTU5ZmExYjhlMGJlOWRlNzljODBjMTg0YTE0YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtaG9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWhvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YTYxNDZjYzljOTYzZTYzMTMxZjAyYTU4ZGVmMTc2ZDU3YjU0ZmY4OGFjMTg3ODVkZmU3NGU1MjI3NzFlNjhmOWJlMTY1ODVhZGUwNWM1YWQxYWQwYzdmNDQ1NWUyNDU0OGJiZGU0MmE5MDI4NmFiYWQ0ZDgwMjUzMWNiYmVmMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTExMWExNGQzNmYzZTJkYzlmOGU2MjI4MmE4ZGYzNzQ4Y2Q1MWUxYjQ3NzRiNGZmYmIwNGUxNDhhZDA5ODhlNjVhYTZkODgyMGM5OGViODliOTFhMTUzZDM1MmRlYmM2YjM1MjVkNjY4NTA2NjJlYTViOGZhMDY3NzZkMTgzYzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhiMWMzNDQ0OTg2MzcxMzI3YTJlMTIzOWVhOTdjOTczNGRkNTgzMGU5MmFhMTNkMDliZDg0NzZiMWE2M2YzYzJjYWY3Y2Y0YTBlYzkxM2I5Y2VmNTc0MTgyMDhiMGU2OTdkOTY0M2M3ZjdlMjcwYTdmYTZlYTIyYmY1YWM0MTc2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcC1wYXJzZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcC1wYXJzZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYTY3ZmIzYjdkZmQwOWU3OWJmMzc5YzEzYjVhYzllMzU3MDg0ZDNlNGU0M2MxMmMzMjdiZTJiNGRkNDgzZTExZmYzZTdkODQ4MWEzYWJkMzgxY2FlNzVjZGZmYjNiNTcxMjlmNGNhZGViM2E4Y2MyMTkwYWZiMjU4MzQwNDUwYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0NGE4M2QzNjczNTY5MWYxOGIxMmE3ZDdkNTlkMDY5ZTkxMmZmMWY5M2U5NmIyMWUxY2U0YzU3MWE5NzljOTczYzk0MzU3ZWZmMWY1MzQzMTQ1MTUyOTM1YjhkODUwNTUyOWFkYzA2NDIzZjY3YTMwNTM3ODVlOTQyNGFmYzVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWJ5dGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1ieXRlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMxZWUxZDYwYmU5ZjdmMTMxMzliMzY3YjQ3MTFjMWNmY2M3OGNiY2FmNzgxODIzMGQ4NDZlMmNhMGJmMTZhOTU2YzI1NjM4NWNmZjk5NDhmMzQ2YTg0YzZlNjYyZDI0NDQyM2YxNDRlN2YzNjYwNjEwMTdiOGE4MTk0MWVjMzgwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MTU5MzUzNjI2NzcxNjhkMzE3YzgzYjkzNjdmZTdhZmE2NmQzOTc4NjUwZjMxZjM2YzFlMWZmMDM5NDc3YmI5OTA1NTAyZjk4MjdkMDk2MTVjMmU3YzM4ZjkyZjE3ZDRlOTRiMTI0NTkxZjI0MGNkYjVlMjhiMTA5ZjA5ZWI3MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTM3ZTdiZWExOGY3Y2EwYWIxNTQwMzc0M2JiN2ZmZGI5MzNkMGI5YTNkZmFmMzE4ZTI4NzY2MWUwNmZkYTlhMDdjNDRjNGY4NjY0M2NlMDJlNzFkMzhiOGE1M2RjMWEyZDhjNjRhN2UzMTY5MTJjMWM0NDY3ZDhjNjY5MWMzNjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLWNqcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLWNqcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3OTZiNjZlYmQzOTAwNDU5YmJjZjg2NTMyMTk0Yjg2NTU0OTM1ZTZlOTU3OGQxM2YxOWNlNzQ1YmUzOTFlOTZjMTEyNzlmZDFkODE4MmQxZDIyNDBiYWUzNGUzYjlkMTBjM2FlMzUyOTk2YjM5ZDUyODU4ZjcwZWRiMzQ5ZWE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXByZS1tanMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXByZS1tanMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MDFhODc4M2YyZjU3NTQzNTQ2YjA2MWU5NjEyNjhkMDJiMDMzYzEyYzEwNmE5YTI1NzQ1M2Y3YTU4NzQ2ZGVlYzk1OWZiNWQ4MDAwMGU2MTBlNTJiNzc1MmZiNzlhNzQ0MWQzNDE4YWE2ZWFmMjE3OTYzM2NlZjU5N2NiY2JmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS10ZXh0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS10ZXh0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTQ3NDlkMzZjMzdmYTRiMDQwZjM1NGE3Nzk2ZGYyODk5MGMyYzNkN2NhYTRkZjFmY2U5YjZlMGNkN2UzMWM3YmEzZDhiNGY0NDJjMWNkNWE1YjdmNzEwODE1OTA4YTcxYzQ1YjRlMzc3YTRlOTg3ZGE4OWY0ODRlNTI0MDQ0MTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LWZvcm1hdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LWZvcm1hdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQzOGY4NWU3NjI2MTJlYzVkZjY1MDIyMTNmZjg5YzgzOWE2OGU4NDY0N2IwZWY5NDUyMzk3ZTc4Nzg1OTg5MDQwMmFhZWMzMDk1N2ZmNmRiNWY1ZWY0YWE1NTFjYzNiMTNhNzJiOTM3YjRhOWIyNjcyZTQ1ZDQ1ZmJjOGRmNGYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BvbGljeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzAwZDljMjY5MDliM2M4NzU1MjY0NjA1Y2Y4ZjM3OGEzZmIzMzIwNTU2N2Q0ZDdjZjFkNWEzZmQ5YWEzMGY4YTQwNjZiMjNkMjA3ZjQ2MWQ1NGZiMjQ1NmZiMTk1MDQyZDgxYTNjMmZkYzI4OTkwZTk5NDRkNmIzMDcyMDgxZjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG93ZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb3dlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZWJhM2I2ZTU3MTA0Y2QyZTZlZGY4ZGQyM2M3NjM3NDhmY2YwNzYwY2U2MzQxMzc1NjcxYzY3ZWM2NzI2NjEyZTRlYzNhOWVjNDgxOWUzYmU4YjE1N2QzNmEyODEyMDlmOTY2ZWNmNjMxZjJiZTAyY2QyYTQ1NWM0YzBjMGE4MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1leHRlcm5hbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtZXh0ZXJuYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZW52LW9wdGlvbnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjYTc2ZWQ3YzZiNjU2NzFmNzBiMjY0NmY2ODk0MzU3MjRkOGI5OTMwYTVmZjI5ZDFmYjMyN2VkOTZmZDQxNDQ2OTUyNTg5NjJkYWZiOTgyODYyYTJlZmMxYjAzZDBhZDk2YjMzYzJjYWU1YmViZmEzNzI2ODg2YTA2ZjY2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMGZiNTNmMmVmZTcxM2M3MjU1MjIyMTlkMzA4MzcwZjcwNzVhMTBjYzlmYmVhZjE3OTI0M2U3MDNmNjExNGQ2YzE0YjNkZmMzNDE3YWRkODgyMzJiODBjMGVkNWE4YmJiNGI2OGZlNzUzZGUwZTQzNjhiMTVhZmI0YjNkNjBiNSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vycm9ycyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJhYzkyYmMwYjkyMDc3ZmNhMDU3ZDA2MmNkNGY1OWJiODliZWI5MzBlODM1OTg2MzQ2YjYxYmUwMTA4MjI4MGUyODRmNWIxNDU2YmE4OGQwOTZmMjg2YjEwMWRhZDhhMmJkM2IyOGQ3MTlkNzdiOWIyZmQ2Y2ZkZmU1ZmQ5NjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MTU1YWEzZDQxN2QyODdjOTljOTgxZDIzN2IyZGFjNDczZTE3ZmZlYmFlMmYzZGFhMzI5OTFiZDYxMjc1YWYwZmFmZjA3OTA3YjMwOWQ4M2Q1MGI2MzUyM2ZkOTI3MDlhN2JmZTkxZTg4OWJjYmMyNzFhZTVkOGUyY2NiZTFmZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbG9jYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xvY2FsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjBlZmU5MjhlZTUwMzllN2Q0MDk1OTRjZTA5ODIxYmZmNWVkNTFhYmUwYzI0ZWE5NTgwZjk2NDg3NjU3NTRhM2Q0NmRkNTk1NzhiZTZkMzQzNmFlM2QxNWM4MzJhNjM1MjQzOGRlNzFhM2VjODE5ODNiNjM3YTQwZTM4MmMwMzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJjZjI1Y2ZlYTFjNDM3YjMzYTEzNDI3MzJjYzg2YzE4ZjAzNjBhOWFkZjk2OWI1YmM0YzE4MmZiN2YzOTc0OWY5OTRjNTUxMzllOWU1NjU1YmViYTk3YjU0MmRjMzUzMzc1MWRhMDU4NjllMjFlYTFlMWQwN2E4MTAwNzFlYmE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjYzNhZDcwMGQwNjU0ZTZhNGZmMjc3YWVjMjYxMTUxYzk3YjkzMDAzZmQ1MDIzYzhiM2EzNmU1MWQ4YjhjNTllY2UyZTk1ZTI0NTQwYTQ0NTkzYmI2NDRmNmIxM2ZhZDBmYTY0ZjRiNjJkNjA2YmM5OTAyMmQ0ZmMxMzI4OWIyOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNGQyN2I2NTJiZGE5YjEwY2NmMjk4NjdiYThlN2U5MGE4NDI1OWY0OThmNzE3MzgyYjUzYmNjYTI5OTgwNjllYTFmMTRlZjJiM2YyODcyODRkMjU4OTBjNjAyODY5ZGY3Y2Y2NGQ4ZWQ4MWM3Y2QwYzczZmRlZmU1ZGVkY2IxNyIKICAgICAgICB9LAogICAgICAgICIuL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDYwNzEyMzhiMjVkMzA3NjZmNDQ3M2IzNjA3NWRiMDUwMDRhMzA5NWI3YmE2YWRkMDQ0ZDk4NjY1YzdlMGMzYzMwOWQwNGQ0MzU4YWFkOGIwNWRkOGZjZjAwZjdkZjI5NjE1NWM1ZjgyOWIyZjhiZjM4ZGRiZWZiMTBkNTgzNDkiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNS4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9pbXBvcnQtYnVuZGxlIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjEuMC4xMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC1hcmNoaXZlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC1hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcGFydG1lbnQtd3JhcHBlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyMzQyNDBkMWY3NzUxNmNlMDE1NDdmYTJjNDJkNzRiMDc3NTk1NWM4ZWU1NTc2NGI0MTNhMDBmNTQ1ODJiNmJlZDYyNWQ4NGQ0NTI2MTk0YzkwNjU3MGQ5NDQ5Njc3MDRjNzk5MzljOTIxMmI2ODliYzExYjg4NmNiZTEyYjMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM1ZTMwZjg5NDQ3MGM0ZTM3N2NmNGExYTVlNGQ1NWRkOGZkMWY3MmQ0OWM5NjAzMDQ3MzQ3YzBkNzdlMWUxYWMzODY5NTJjYWU2NDhiOTc3NDRlNmU2ZTFiOTk3Mjk4MTY5ZjJkNWE2Yzg2YWEzODg1OWU0ZjcwNWMyZTQyNzFmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9tYXJzaGFsLXYxLjguMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbWFyc2hhbCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4ODQzMGZjYjc4NmI1NjFjZjAzZWNmNjU5ZGE4ODBmYzhjNGE2YmUyMWVjNmEyNTZmZDg4NDNjOTJiYzY2YzFmMTBmOTgzNzFjYzg1YzM2NzBlYTdjY2Y3NDQwMGFiMTEyZTRkMTBiY2MzOWI2NWNlMDViNDg3NTJhMjhkMmNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyOGYzMjVhNDU0Y2FkMjMxOTFmYzhkNTFmMGJjZTkyNjkwYjc4YzkzODRlY2U1YTYyNjNkY2YxYmQ0MmFmM2Q5YmIxNWJiNzZhZDQxNTZkMDA5MDYzNTNkNWZjZGVkNmVjYTY4YWVhMzg3MmI2ZGVjZTcxNGMzMDlkYmJlYzk5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjU1NmFmMjhlYmFmNjhkNGZmMGZlMjk0NTI0YzkxMjMzODkzMmI4ZTI5MWUwNjhhZDYwNDBjNjMxMjA3NDhjNTY3ZGIxZDVhNGI2MjMxN2UzN2MzMzRhNzczY2IwYjJiZTkzMmI4ZTMyNmE3M2QxM2U1ZGEzYzM1MDAzZDYwNDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTBlODBhNTAxZjU3MDE0NDcxZjNkY2I2MzEzMzEwZmVjYjhhOTljNWY2NzkxOTRjNTEyOTIyYjk4NzJjYjhmMWRiNTEyNjM2YWVlYjA2Mzk1OWY0ODYyYjZkOGI0NTE0OWRkMGRhYjQ4MDZlYzZhYjE1OGM2OTdlMGFjNDlmNzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjI0NTNiMTlmNTdiYjljOWZlMjRjZDkyMTY3NmZiYzA4NTJmNDdhYjlhNjZlY2ZhNzUxMzZhZmM2NTI4NTU1NTRkZDg5MmNiMzk0ZjhiYjcyMjNhNTE4MmY2MWEzMzNiMDgzZDYyYmJkYTA3ZGQ2MzFlZWE1ZmM1NTY5ZTMyYTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWQ0YjVlY2NiYjlhZmJiNmJiMmU1ZmU2MTMyYzY4ZDAzNDQ0Y2IwOTQ5NDRkYjc5NTc1NmU4ZjQyNmZiMDI0OTVhYmFjYzllZjIxZDZhODFhNDc3MDBkY2NkMDM1YjYxNDQxMWYwOTUzZTM2YjU3NDc1OTJiNTI1NTJkMjM3OGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFjODNlZTZlN2E1NjRiZWE3ZjdhMmY3MDcyYjViNzE4NWVhZjgyNWU0MzUxMWNiNWZmZjU4NDNjYWE2YzZjMWJiMmJmZTY1NDM4NTVhZmZhZTcwNWRiN2Y0OWEyNGY5MzNjNjAxMTk5NTU0MTA1ZWI2ZWI4YjhhM2Y2NjQ2ZGE0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWNjN2NjMzAyMWRlMThlMTFmMTIxOWUyMWUyOGI5ODA0ZjQxMzUxZjMwNGQyZjFlNmI2OGEzYjY0NTY1Njk4MjdmY2FmNmVlZWIwMzg0NmQzNjAxOTIxNjU4YWE1ODNhYjhjYzYzZjhiNjBiYWU0NTg2NGQ3YmQ5MjJiNTZkOGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NS4xLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL25hdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTczMWM4MjRiMWQ5YjQxNzdmYjNmZWI1YTFlYjA3YTFjNWRmM2NhMWVhNDc2YTFlNTU4NmUxMGNiM2Y5M2MxNGQzZDQzNmY5MTQ4OTYxOTMyOTIxZWVlZjIzZWJlMzBmYjZiYjIzMzA0NGZiZWViNzZjNmY4ZTMzNTRiOWU2ZTUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIjogewogICAgICAibmFtZSI6ICJAZW5kby9wYXNzLXN0eWxlIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pZGVudC1jaGVja2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllMjQ0ZDk0MDhjZWRiNWYwOGQwMmIxMWViYzNkOTIwNTM0NTIwNmRhOGEyZTA4ZDZlMWI2YWY1MGVjOThmYTA0ZDAyYTdjMDg1MWM5ZWUwNTJjMWU3ZjJkYzA4NmY0OWQ1OGY4MGNmY2M0YmQ5NmEyOTM4ZDgxZDRkOTJhYzIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J5dGVBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnl0ZUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTY4ODIxNTMxZDlmMWZjYTEyODU2MDk0ZDMyNWQ3YzY1NmEyNzc5NjRkMjMwYmQ2NGMyMzViZmRjN2RhNDFhZGQzYWRkODYwYTJlNzdlN2NiNjcwZTFhYjVlMzExMTQ0ZGNmMDI1ZjRlOTM2YTNjOWMyZjAwZWNmNDBlYTk0ZWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMzZjMjM4YzMwYTlmZjg2NjNmZDI2YjU3OGJiOTNlYzIwZGQ2NWFhYTdlY2RhNGNjMjgzNTY3OTQ5MTQ2NDU4OTFkZjhmNzllMWIyMzIyNmE4NDlhMDdkNGE5ZjVkZGUzNTM5OTUzNDI2YTllYTQxZjYzOGJlNjhmMjE0N2RhMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjU2MDlmN2YwOTQwZGYzOWJiYWE1ODBhMDU2ZmYwM2Q1NGU3YWUyNWU1OWEwNTRlNzU0Mjg3YzNjN2Y4MDhlY2UxMjlhMWEwNGFhMDZiYjE5NTYyZWNjMjkwMmRkNzI5ZjgzMDMzOTI3YzM5NzMxMWE2ZWY1NTVkOGVlZmI3MzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYWVkN2NhNDk2YzFmMGM3OWE1MjhkN2IzZmY2MDAyYmQ5NTdlNzIxYmI4ODUwZDJjNThmNmUzZjhhNWQ2ODU5MmE4NGI4NjMzZjJkZDJhZDc3Y2I4Y2ViZmFlZmFhMmYyYWRjOWM1MTg3MDRkNzEwN2RkYzA4MDhjN2RiYzcwOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1YmFlMmYxZjQyNjAwYmI5NzI4ZWMxZDFlN2FjZTdlNTNhNGY2OWQzNmRlNWE4ZmNmYmM4NTBmYzRmZGE4YmViNDYzN2JhNjBhNWVhMGM2Y2ZhMGVmNWNiOWExZDgyMTYxYTc3M2RkNDdlNGQ0ZTc2NmNjYTY1NTg4ODgzZTkyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJhZWZkOWUyMzcwOWZkMWNlYzhkNmRkMWVkMGFjMTI1MjU5YWUzYThiY2FhMmI5MThiYjM3M2E2OWU3ZWY3OWEzOWNkNmQ5Y2Y2Njc0MzY2NzY3NDk0ZTM5MzgzMzJkMjcwMzcxMDQyZjgyMzI0YzgzNDZiZTU4NTcxOGQ3YmNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJlODc1NGMyOTg5M2JkZjg4YWVkMjljMjZmYWMwNzNiNTBhMmYwMTJlYTljNmM0MGE1MjQxNDBjZmZjZWFlYTRiOWUyYmU0ZDQ2NGUyNzNiZmE4NGNjZDI3ZGMzNDk3N2RjNzY3MmE0M2VmYTMzYjJhMjI4ODQ1MWExYTAyMTk0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZDVmMmM5ZDhjNDFmMWI4YmE5ODdlYjg3NGMyNjM1MDliMjJkOTBhZmEzYTNmM2JiODgxZGI5ZjBlODBiYTZhM2IzOTNhOTMwZWJiMjkxZTZmNDczZWU1NjA1MzBmY2NlZWYzZjMxZmQzNjBmZTMxMjU5MTI1YWVmYTQ4NzhmOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZGM2ZTdiYjhjZGNlZmVjZTk2MDA4NmNjZjliNmQ5NDNmNDBmN2RkZTg2OGViMTI1MTQ3MzNlYmQzZWUzNzVkOTRlOThmNTYxMjZhOGNjYzQ4NWEzNWY3ZmJhNzA2YTg5ODE3YWY0Nzk4ZjdkZTgyMzhlODFjMjI2MGVkYTJiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlT2YuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYTI2ZTA0ZGE1YzYyOTIzZTFmNDQ3YTBiNjI4ZjE3ZDk0OWUzMWUwODg1MTZhZjBjZDY4ODdlODUwYzkxNWUwZGRlY2Q0MmE0ZTA4YTViMzgxYzA3NjNmNDM1ZjEyYmY0Y2QzOTQ2YTE1NTA2ZTg0NDU3YmVlZTA1ODJhNGU2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZW1vdGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU0NzliZmJjMWFjNjVmZjQ0MzM3NWVmMjgyMGU1ZjU4ZWYxZjUzZGQwZTAzZWFkNWNhYjgxNTQzM2FiMWQwNjVhODFkOTQ3ZDBmYTY2MGY1MWI2N2MwYzY4OTRkMWNiYzQ4NTYwZmNlOWZmMmYxZTUwN2Q1MzJmMDE0N2RlZjdkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZS1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmUyNzcwN2VhODY5MWQ2ZjIxNzBmMmUxMjdiYjgzYjQ0ZDI2ODZmOWY5M2VlZjM3YWYwZGJmZjcwY2M0OWZhZGM5YzU4NGFkZmZkZTllMmE2ZDlmNjFiMTg2NWZjYWExOGRkZDk2ODFkNTc1NTQ1MzFlYzcyZDUxMmI0MmY2MDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RyaW5nLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdHJpbmcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZTUzMTVhNjRiZmQzMThhZjliMzUwZTQzYWFkZGVmNjE4YjllMDUyMzIyN2RkYjQxZGYzYjM2YmE3MDg3NjAwNDViNGM0ZTEyZjhiYjBjN2U1NGFjMjRiYWRkMjEzZTBjZjlkNWMwNDM2ZmRkMzhkYmE3MGI0ODcxNjJhMjkyNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zeW1ib2wuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N5bWJvbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk1OWRhZDMyMjEyMzAyZGI5OTNmYzc2ZmY0YjAyYzBlMDYwNjk5ZWM0NDJlMjI3NDdmNDQ0YWFiY2FmMmUzZjRmNzE5MWViMjY3N2E1OTM0YmYyOGY3ODlhMTc2MmFkNTcwNjBiYWNiODdiMWQ1NWI5YTAyYmYzZjliZTQ4MTU2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTkyN2YxMWVhZWE2MTRjMTkxZjk4YzhkNTdmYzcxNDllZjg4MzgwMzM3YmZmNDljYWQ5MzRjN2IzZmYxZmFiM2EwOGJlNzRmNjZmZmVhOTVhYWEyYjljNDQzYjNmZTA1Y2Q3ZjkwMTc1ZjgzNjdmZWI4NzQ1YmJjMjQxODcyNzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFkNWE3M2I0YzkxNjcyYzU3NTY5Mzc2NzkxOTM3ZjliMDM5NjI3MzhlN2MyYTQ0OGRjMGU2ZjhjNWZjOTBmMTNjNTk3YzBkNDJlYjgwYTg1OTA3MmZlOThhYjU2MmFlMzQxZTVmODUzODk2ZTY0YmNiZDg3ZWI0MmU4ODk4MTc5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJmNDY1MzMwN2Y4MDZmMTNiMmFkYjU5NmJiNmUyNGNhZmU4ZjA4MzQ0MmY4YjUwYjMyYTBlY2FiMWFmOGRlZTUyYjZhOWI4M2U2NGJjMmQ2NmJkNWRkNDIzZGRmMDZhMTIxNDFmOWFiOGU2NGNiMjYxNDA2NGVlNjUyZDA0MDA0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZDNhMjU2MzZlNTQyNzhiMzNmNmMzNjIxNDc4ODllNmZmMTBiZWRhODBjMDdlNmExNmQxOTA0N2I3YjNjNmEzNGQ3MzBlOWIzY2ZjOWY4NTExYjZlMjdiNmE2OTc3NjRmOTY4M2Q3MGRmNzA4NmUwODVmOTNkN2Y5NWZjNGZmYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRmYTZkMTJkNDdiYmExODZhNTJmMWY2ODY4NjAyZTA1YTk5ODJjYjNjYzcyODY4MjY4YzViMDc5OGNmYzk5OTM1NTA0MjQzOTU4MWY4MmE4NTUxNGNiMzIyZjQxZGFkYWQ2OWI5MTE5NjgyNzcwZmE0NTdjZWZkNTI3YWE1OThhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjODRkMDc2ZTBhNDE5ZmM4NjM3YWIzOGYyNDQzMzhjNDc2YzUwMTMyY2ZlMDkwMDJkZGRjYmJmY2QzNjViZjZjZjNkMzJiMDlkYTMyNTI1Zjc1YjYwZjVmYzY2MGRkYzBlMDhmMzZhNjA3YmEwNzdmNTk5YmM1NWYyOWVjYjM2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby90cmFtcG9saW5lLXYxLjAuNSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vdHJhbXBvbGluZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby90cmFtcG9saW5lLXYxLjAuNSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby90cmFtcG9saW5lLXYxLjAuNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTRlYWI5YWZmNzllMzJkNzRmY2U5ZmJiZDU4YmY4ZGNlZmQwNTY0ZGJiNGRiY2VkYTllYmFhYzU1ZjYxZTFlMzFkZWI1MTVhY2ZhNmNjNDM2Yzc2MTg2YmVjYTY4MzQ4ODFjZmEzZjUyYTdiOGJkNzZhNjliM2NkOTE2MmEyMjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhbXBvbGluZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhbXBvbGluZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZiYWUzYTZlYWFhOTM2ZTRiYWNiNzRhOWRkMzhlYzU4ZTg5NTdhMTJhNDA4OTc0ZTIzMzgyMmJmNjE3MTJmZjgzNjAwZjk4ZGU5MjdhNGQzYzQ0ZjQ4M2UxNmI2MDRmODE3NDQyZTAyN2QxN2RhOTViZjM2NjhlMDAzNDk2NDk2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby96aXAtdjEuMC4xMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vemlwIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3ppcC12MS4wLjExIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3ppcC12MS4wLjExIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZGZkYjdhZDg0M2E3MTg4OGI1NmFlNmZkYzMxZDQyMmUyNTEzMThkNjg5YTgxYmE2NmZiM2Q1MzQxZDAxODMzODljNWFlODhkNmViMDY4YzE0MDQ4ZDU3NDM0OTE3NzlkNTM0OTA3NDFhYWQyOTFiOWRmY2EwYmZiYmE2ODI4MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9idWZmZXItcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9idWZmZXItcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWVmOTU0ZWFjMjBjNWUxOWMyZjZkMTgzM2MyYjUzYmQzYzNmYzEwMDQwMDg3ZTdiYzdkNjRhMmIzZmM1OTMzNWM2MmRlYzFkZDhjMGNjZGIwMjVlZmRiYWM5MWIzNDdlNDNmMmIzMjRlM2Q5MTU2ZTY3YmFlZDE3YTE0M2RmMzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFlNzk2OGFjNmViODVhNWYwNWM4YzZlNGQ2MmZmNjRhNjhhYzk0NDUyOTI3ZDNjYWRlYmRhMTdkMDNhOTUxZmYxOTM3YTJmNTc0M2IxNWU2OWE0NTU0Mzk4MmUxN2M5YTgxYmYzNGMzY2FlMjYzNTNjYzFjYmJmNDMxMjU3NzJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXByZXNzaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb21wcmVzc2lvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRmNmUyMzllNjRhZTZkOTYzYjIwOGM4OWVmNzllY2NhYzhjNWE2NjMzNDg3Y2JmNjU4M2Q2ZjY0N2ZhOWYzZWE0NWU1OWFmNGQ4NGNmZThlYWU3OWJkN2QxMjJjYmMyYzI3MDhlNjI5MDI2NzkxMjZiZjIyMWViNmRlZGZlZTc0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NyYzMyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jcmMzMi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc5Yjc0MTdkYThkZTZhNjMxODIwMmFlNjNkZWNkMjllNjAyM2M5ZjVmZmUxN2QxZjJmZTFhMDYwZmVkOWZjMTg4ZWIwOWNhN2Y1ZGUwOTU4YTczMWY0YTQyYzg2OTYzZmE4OTFlMmE2YTZhNDJkMmU3MDYxZGUyODQ2YzVkZGJjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Zvcm1hdC1yZWFkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Zvcm1hdC1yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NTUxZDU5ZmE3YWQ5NGMyNGFmOWMxMGRkNGQzNjEzM2I2NTM1Y2FjMjJiMjdjYjliYmIyNjE3YWE5ZTAyZTllN2ZmOGExOTI4NzEyZWE4Mzc5YzMyOGQyNzk5YmQ5MDRlMmMwZGY5YzljNWEyZjUyOWRmOTY4ZDU1NWNkOGIzNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtd3JpdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTM3NDgzYzA4ODE2OWRlOWFjZGRkOWFmMTBmNWJjNGJlMGIzNThiNGNkODQzZWM3MTc5YWJjMzAwMmFkMGEyZDg5NDY4ZmVmOWI1M2EzODdiMDdlMTVmNWJkODQzMDEyZGJkZjgzZjA5Y2M5Y2RjYTA1OWRhNWMwOTI1NTNhZjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOGIyMzdhZDFjYmJiNWY5MDI0OWM2ZDk0OWM1ZjRkYjBmZTAyZmU5MWZhY2U3YjY3ZmFkOWNlN2YyZjZlN2M0ODE2Y2MwZGE4NGNlNmJhNTg5ZGRjNTFhMTBkNTkzYjk1MGJmNzIzZTgwZTVkZWE3NmEyYWJiMjExNzAxZWI5MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zaWduYXR1cmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NpZ25hdHVyZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJkYWVkMGY0YWIxYjE1Yzk4MTY0YjE0ZmRhMzVhMmY5NzA2NDdmNzUzZTAxOWY3MTBiZjVkZGU5NWZlNDQ5M2IzZmYxMTE5Y2YxZGY0NDUzN2RjMTU0M2RkN2I0MmU2NzBiNGEwNWEzNWFiMGY1MjhkYzY2MDRjMWYxZDNiODg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQxMDkyOWZlYWRkNjBhNmFiMjI1NTFlZDQ5YjA3ZWVmM2Y2MDc0OGU4NjIxMGUwMDU1NTUxZGI0OWFhZTI3NWI4MjcyNzQxNTFmOWI4ZDg2MWJlNjk0NmZiY2QyNzllYmEwNWViMjBlZDIzYzE2OGNhNjZkZjk5NWViMGVkM2UiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAAAfWxQ12QQAANkEAAAvAAAAQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MjIuMC9zcmMvdmF0LXNwYXduZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vaW1wb3J0LWJ1bmRsZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJidWlsZFJvb3RPYmplY3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+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/8VgBAABYAQAAHgAAAEBlbmRvL3ppcC12MS4wLjExL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACj63iQDQcAAA0HAAAfAAAAQGVuZG8vemlwLXYxLjAuMTEvc3JjL3dyaXRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci13cml0ZXIuanMiLCIuL2Zvcm1hdC13cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBXcml0ZXIiLCJ3cml0ZVppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEJ1ZmZlcldyaXRlcix3cml0ZVppcEZvcm1hdDskaM2PX2ltcG9ydHMoW1tcIi4vYnVmZmVyLXdyaXRlci5qc1wiLCBbW1wiQnVmZmVyV3JpdGVyXCIsWyRozY9fYSA9PiAoQnVmZmVyV3JpdGVyID0gJGjNj19hKV1dXV0sW1wiLi9mb3JtYXQtd3JpdGVyLmpzXCIsIFtbXCJ3cml0ZVppcFwiLFskaM2PX2EgPT4gKHdyaXRlWmlwRm9ybWF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuICAgICAgIGNsYXNzIFppcFdyaXRlciB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0geyBkYXRlOiBuZXcgRGF0ZSgpIH0pIHtcbiAgICBjb25zdCB7IGRhdGUgfSA9IG9wdGlvbnM7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICB0aGlzLmZpbGVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZGF0ZSA9IGRhdGU7XG4gIH1cblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICB3cml0ZShuYW1lLCBjb250ZW50LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IG1vZGUgPSAwbzY0NCwgZGF0ZSA9IHVuZGVmaW5lZCwgY29tbWVudCA9ICcnIH0gPSBvcHRpb25zO1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFppcFdyaXRlciB3cml0ZSByZXF1aXJlcyBjb250ZW50IGZvciAke25hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMuZmlsZXMuc2V0KG5hbWUsIHtcbiAgICAgIG5hbWUsXG4gICAgICBtb2RlLFxuICAgICAgZGF0ZSxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBjb21tZW50LFxuICAgIH0pO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgc25hcHNob3QoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ1ZmZlcldyaXRlcigpO1xuICAgIHdyaXRlWmlwRm9ybWF0KHdyaXRlciwgQXJyYXkuZnJvbSh0aGlzLmZpbGVzLnZhbHVlcygpKSk7XG4gICAgcmV0dXJuIHdyaXRlci5zdWJhcnJheSgpO1xuICB9XG59XG5cbi8qXG5cbiAqLyRozY9fb25jZS4gWmlwV3JpdGVyKFppcFdyaXRlcik7XG4gICAgICAgY29uc3Qgd3JpdGVaaXAgPSAoKSA9PiB7XG4gIGNvbnN0IHdyaXRlciA9IG5ldyBaaXBXcml0ZXIoKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB3cml0ZSA9IGFzeW5jIChwYXRoLCBkYXRhKSA9PiB7XG4gICAgd3JpdGVyLndyaXRlKHBhdGgsIGRhdGEpO1xuICB9O1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHNuYXBzaG90ID0gYXN5bmMgKCkgPT4gd3JpdGVyLnNuYXBzaG90KCk7XG4gIHJldHVybiB7IHdyaXRlLCBzbmFwc2hvdCB9O1xufTskaM2PX29uY2Uud3JpdGVaaXAod3JpdGVaaXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwV3JpdGVyIjpbIlppcFdyaXRlciJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAADTRAIgFdAAABXQAABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAB9bFDXZBAAA2QQAAC8AAAAAAAAAAAAAAKSBN3QAAEBhZ29yaWMvc3Bhd25lci12MC42LjktdTIyLjAvc3JjL3ZhdC1zcGF3bmVkLmpzUEsBAh4DCgAAAAAAAAAAADjUnGd1AgAAdQIAABwAAAAAAAAAAAAAAKSBXXkAAEBlbmRvL2Jhc2U2NC12MS4wLjEyL2F0b2IuanNQSwECHgMKAAAAAAAAAAAAksKTjzQDAAA0AwAAHAAAAAAAAAAAAAAApIEMfAAAQGVuZG8vYmFzZTY0LXYxLjAuMTIvYnRvYS5qc1BLAQIeAwoAAAAAAAAAAAAEe3Z/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":"0a49d81a292a8517c2867387236c0dd2e44c014de700916ccae899f8daa04ae99ceec277f52909d176e93492428b0e5a49bb4b0b30f8019a5ccb864af0ec8786"};