@agoric/spawner 0.6.9-u11.0 → 0.6.9-u11wf.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":"UEsDBAoAAAAAAAAAAAAZZdp3LX0AAC19AAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3Bhd25lci12MC42LjgiLAogICAgIm1vZHVsZSI6ICIuL3NyYy92YXQtc3Bhd25lZC5qcyIKICB9LAogICJjb21wYXJ0bWVudHMiOiB7CiAgICAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9zcGF3bmVyIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3Bhd25lci12MC42LjgiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zcGF3bmVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3Bhd25lci12MC42LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdEhvc3QuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtc3Bhd25lZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LXNwYXduZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NTYwMmRiZGI2ODc3YmNhNmQ0YmRiZDVlN2I2YzVhODcyNzA4NWQyOTBmMDk3YjFmYTJkMWJjMDQxZDlhNDA5OTI2N2U3OTQ5MWI4OGJlNmNjZWJhMjU5MDE4MDRhODNiYzgxODU4OTA4Yzc4Y2MyN2M1NzQ4NmU2YmYyM2RjNSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Jhc2U2NCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9iYXNlNjQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9hdG9iLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hdG9iLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9idG9hLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idG9hLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9kZWNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZW5jb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vYXRvYi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJhdG9iLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzYxNjA5NWU2NTVmYWRmYTg0YmM2MDNkNmJlYmVhYWRkOTgwYTU5ODhiZThkMjgxMjdhYTJlYzdkNjU3ZWNkN2FmZTBiODgyY2FmNDA1MzIwYWQxMGY4YmZlNjAwYTcyNzJhYTgzYmM2MWMyN2Q1ZWRhOTEwYWYzZjQ2YjFlYzMiCiAgICAgICAgfSwKICAgICAgICAiLi9idG9hLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImJ0b2EuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMGIxYzZlMzllYWQ5NmE4YjhlN2EyMTdhYWNjNDAzODMwOThmZDg3ODUzNTFlZWE0Y2M5OTQ5YTc1MGJkMmNlMzY2ZDRiOWFlMjAwNzk4ODBmMDdhNWM4ODM0MmEyNTlhZTJjZTAyZmQ5NTQyNTkzOTFmNWFkNTExNDRjMWM2NCIKICAgICAgICB9LAogICAgICAgICIuL2RlY29kZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJkZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3OTE4ZjU2Y2E5OTZlNTU4ZTVkMGYwYWEwMmMxZDdhYTc4NzFiYjBmNmJkMGNmNTYyZTI3YjdlZWViY2U1ZTg4OGU4ZjVlZGM5YjM0MmMyZGRiZWNjZTNkNTU1NmVmYThmODYxOGNiMjgwYzI2ZDM5MDVhN2I4N2UzMGM2ZTQ4MiIKICAgICAgICB9LAogICAgICAgICIuL2VuY29kZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJlbmNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNGM1YzczYTgxZDViNmEwZjA5ZTg2ZGI1NGRmMjIyZDA2NDU0NzBlZTVjMGNmNjIxNTAzYmNjOTMwODZmODg1ZWFmNjgyMzQyZDk0Yzc5MjExNGI0ZjEyYTJmZTE4ZjMxNTgzNjVmODYyMzY2ZDdjYzRjZGFiNTkwNmZhMmVkZSIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTYwZTE2MDRiYzZiNWQ1NmU4NjY4NWM3ODMxMDNkMjlhOTU1YzQxOGFiMjcxNjA1Y2IwZmJkZjgzM2M2Y2ZmOGE4NmM3YjZjZjA3MTQ1NjFlODFjOGQxYmE3YmU1MWMxMGE1NWY5ZTJiMjc4NGVhYTBiODk0YWFhOGUxOWNjOTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tbW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb21tb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NDAxZGRjM2MzYjg3MTI0N2UyYmMzN2I0YTYzNDkzZDg0ZWUzODI3NDllZDY5Mjg1MWQyYWNkZDhhZTUxZmY0YjAzYzAyZmZjYTA2NGQ4OWEyYjQwZjMwMjc3ZWU5NzI3MDUzNzc1NjQzNTcyOTZmYjAzODZjZWZkZGFmMWQ2ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJkZWYxZjc3ZmM1NjJjZjk0OGQyNjZjOTdlYWFjZWFhNjUxN2FjNGQ3MWYxMDU1NDI1ODVjZGU3N2M5NzljYTBkY2ViYzZlMmY1ODk1MTIzZTkwNWY0ZThkNmQyMTBiZWM2YjQ4YmUzYmVmZWQxMGZhMDIxNGFlODc3MWNlZDUxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDNjMzdlMjliNjIyNTQ5NDBkZDhiMWQ5MjA0YzE0MzhlNjU2MDY1YWM4YTZjNTk4ZTMzZWI3YzcwNDg2NDlhYThiZTUzNGMwY2MxYTE4ZmE1ODkyZjUzNzc1NDY2ZGQ0NzZjYTk3ZmM0NjFlOGFiNjZjMGYyYWEwOTBlYjA1NWMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY2pzLW1vZHVsZS1hbmFseXplciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyLXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXIvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXItdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQtdjAuNy4xOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0YXRpYy1tb2R1bGUtcmVjb3JkLXYwLjcuMTkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvcmVhZGVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9yZWFkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vd3JpdGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICIuL2ltcG9ydC1hcmNoaXZlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImltcG9ydC1hcmNoaXZlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjE4MmQ1NTNiZTJkZTA5NDBlZGNkN2E3YzRhMWEzN2U1NWYyNmY1NGU2Njk4MmRiZDUzNWZlYjY5YjZlZWI4MGM1ZjFiZDU0OWFkOTdjNjcwODhkNTA2NWUwYjNlZjYzZjJjOTEyYTc0YzliZWViN2ZkOTY1ZDU2M2M5ZGE5ZjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tcGFydG1lbnQtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb21wYXJ0bWVudC1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNGRiMmUwZGVmYTIxZDRlNmNhMDFlNzQxNDliZjQwNzUyMDg4YTM0NzM2MzFiYmNhZTUxM2NmNGViYmM1YjE3NjExNDZkNDVmYjE3NmYxMzQ4MGI3MjYzMGQ1MDYxYTM5YTRmYjc1NDZiM2FmMjgwN2M0MTI4YjIyZjZjMWYzOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHRlbnNpb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4dGVuc2lvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEwZWQ3ZWYyMzNjNGEzMTlmZmJjODYwNDBjNmYyOTYwNDYyZTMzOGEyYjY3MTgxOTk4ZjExODI5MTg0OTNmODhlMjJkMDU1MjgzOTFjYTQ5NDE4NmExYjZhZmUzNTJlYWEzNDk3YjY5OWM2Njg3NDViNjc1ODA5Y2U4YmU3NjZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbXBvcnQtYXJjaGl2ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZjYWJiOGViYmIzMWE3NGNjMDkxNDBmYzQ4YTlkYTJiODFmYzBkMmU2MDQzOTQxYWFhZWExMWEzY2E4MDViMjRmM2VmZmJiNDllYWM5ZGY4NmY0ZDU4OWIwZTgwZjY4MGQxMmZhNDVlNTViNDEwNDI3OGIyNzBhNGU3NDJhYTJlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2pzb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2pzb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ODkxMWE1NzdkNzA1M2UwZjZjYWI2MDkyMzhjY2U3MTY5YjQ5Mzc2NDRlYzZiZmI5OWU1ZjU1YmZjMTU3MTlhOTVlNTIwMWUzNmYzMDRiY2M4OWJjNWJhM2Y0ZjdlYWRmM2VjNzQ3ZTBmZTkwNWE5YWQ0ZTM4NGU0Nzc3MTlkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9saW5rLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9saW5rLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmQxODgxMmY4NjhiZjQxMmE0NjY3MzYyMjMwYzFmZWMyMWY3ZTk0YjE2ZGZiMjlmOTY5MjljMmU5ZGM1YzI1NWVmNDg5YTkzOTkxODA0NzI0MTU2ZWQ1MTg2YjYxZGMwZDY3ZjVmZDJkYjJkNTJjMDhmYjU2ZjczZDVhMmRiMDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMzgyNTAyZGFiNGNhNGE2NGRjNWY1ZmU1OGM2MjQzZjAyYjZiZjFlZTU3ZTYwYTNkNDc2OGE4NmQxNmIxYjIyOTNmMmU5ZDhjMzdjMjU5ZWJlYjExNjY1MzY2NTI5MzFjYjUyMzQyZWIwYTBmNGVkZmUyMTg2MWJiODVkMmNlZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1ieXRlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtYnl0ZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNTk2YWZkZDQ3MmExNjE2YjU5OTI4ZWM0ODAyMGM5Y2JlYzRiZDViOTEwOGYwNmI4N2Q3OGNkNDlkYjk2YWIzMDE4MDNhM2RmYTdiYTRmOGMxYzYzM2NiMDYzNGU2M2QzZmFmOGQ0NWJjZTQyNmU5Y2NmMWZiNmIyOTVmODRhNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWMzMmVhMjM5NDI3NTcyZDRlMmVhMjM3NTA0Y2YzNjcyNDYzZDQ3MzY2M2U1N2QyYjZkMjdhMDc5YjYyOWY2OTQ2ZTU2NDZiMDVhZmQ2MGI0OThjNjE5ZGQ1M2RmYTYxNDIyODYzYzA2MmFjZjkyMzA5NTEwMWU0Nzk0NjYzYzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtanNvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtanNvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEzMGU3YzU3NTUwOGNlYWIyYjk2NzExZjdlNDFhMmJkYzg5YjE2YjI2NGNkZTlkMTY2YjI2MDU2ZjZjNzE0MDIzNGYyOTViODQwMDJiZDE3ZjNmYTE3NmViNTYwYmU1YThmNDQ2OWRmODczY2VkMTNkZDhiZDJkNDU3Y2JiMjM0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXByZS1janMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXByZS1janMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZGY3YjdkY2VjNGJhNzEwZWM0MGVjM2RmNmFiNzg0MzlkNmY2N2E0ZDczMmE0NmU5MTc4YTEzYWI5MmE2YjFlNGIyNjcyYzJmN2NlMjBkNWEzZjJiY2Y3N2E4MTkyZWVkMDc4NDE0MTQyZDZjYTM1OGZlNDRmZjFmOTM4MmVmZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1wcmUtbWpzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1wcmUtbWpzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTg0YjQyNTgzZjhmNzIxZjNkZDNiODEyYmZlMTI5NWQ1Nzk1ZTY4OTc3OWY0ZjgwZmNiOGNlMzM3MDUzNjAzMmU4YTlhMDA2OWJkMDA1ZjM0YjVlNDRjODEyZTU3M2NlNjM3MjRlYWY0MDIxNWU1MjI0ODg0YWM5YzJkYWJlZjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtdGV4dC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtdGV4dC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJjNTJiNzExZGY2YzA5ZGU1NjNiMzQ5MjllMDIxYWY4NjZhNTM4MDJiOWIyZmQ3ZjFkZTRiMDBlMjk2YTJhMzBkYzIyNDY0OTA4ZTJiYWU1MmMxZjhjZDRmMTk3YjQwN2M3Yjg1YjA5NjAzNWI2NTdhNDM3MjRlODRlNDY2OTE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BvbGljeS1mb3JtYXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BvbGljeS1mb3JtYXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzM2Q5YmZiMjliN2VlNGYzODFlNzIyZmFiODFhNmY5YTExNzYwMGUyODYyM2UzNGMxMDhiODRlNzkxNDUxNWE3ZjAyZjdlZGJhYTkzMTY5MmYzYTFiOTEyZjhiYjEyYWQ5NTA3NjA4YjljNWQwNGU2MDk1MWIzZGU3ZTMxYjg0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb2xpY3kuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BvbGljeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI4ODY3NTI1MWZjNTEzNmY5ZTMwNzI5OGE5ZDNhMGU2YmUyNTQ5ZjhkMDA0NjBhZjE5MjJlYTVmZjJhMTZhZDBmZWQxNjc2MDcyZjgxOWRjZTE2ZDkwOTYwMjcxNWQxYjNmZWQ0NmViN2JkYTUwM2M4MTZmNGM2ZDhjMmNjYWNlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bvd2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG93ZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODkwYjRhOGQ0Y2RiNzQ0NWYyNjFlMjQwOGFkOGU1YjNjNGExY2M1NDgwZmYyMTg2NzAxZDNiZjdkYjhiNGQ1NjBjMTVlNTVmYTU3ZWU5ZDdjNDZhY2ViMzAxZTRlMDdlYWNmMDdhODM4YjM0ZDFjMTZkYzJkNzJkNDc1YmM5NGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzUzNjg0ODI2Y2I1NjYwOWY2MmI3ZDZiNGRlMzNkYWQyMmMyMGFkYWEyZWIzODgwMGMzNjRjZWM1MDk3MzgzZTk3M2YwNThiMzM1ZDRlNGM0ODAzMGU0MjhmN2I5OGRkYTJiZjIyODhkYmEzMDA4YWNiNTdiNGFlNzIyMDY0Y2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZlMjgyMDJjZWIyM2UwNjRkNWRjY2JlMDIxYWU3ZDFhNWZkY2NjMDIzNDI3MGRjNTYyNGZkOTFkZjIzNmY5MDdkY2M1ZDI1NDMyNmQxY2QzMmFjNTExNzYwMmQyZmEyMzllNmYzMjAzMzI4MmZkNjdlMjRmMWE3YTRkZTk1NjMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3OWQzYTI5ZWI3YmYzYmE4YTM5ZjJmOGFlZjg1MGE4YTljZmUxMGY5NTcyM2QyNzFkNDRlMjEyMmEyZThkMmRlNDk0MjZjMWM0ZDQ4Y2E1OWM4YmE2ZmYwZGY5Mjk5NTUyOGQzNDllZWZlMWQwZDUwM2JkZmE4MWY4NGZlZTZlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9iYXNlNjQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9hdG9iLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hdG9iLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9idG9hLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idG9hLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9kZWNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZW5jb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZjVkNjk2NjdmNjk5OTZjOWM3MzkyYWMwMGYzYTllYjgzZGRmMzExOTMyMWM1MmRkZWIzNzY2MDI4NDdmZTExNDFjY2JjOTQ3ZjI5NTA0NDE0Njk0MjA2NDA1ZjJmNjFlZWU4MmE2OGIwODFkMjQ4ZmNmOTYzNjQxMWZhNGNhOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzODQ5MWRmNjgwMDYwNmU4OTAyNzMwNTg4OWM5ZjEwNDI4M2IyYWZhZGJjMmIxZGFjMDVmYmZhNjBiZWVjYzIyZjcwZjYxZGViOTA0MTQ3MGI3ZmEwMGE0MzBiYTA3M2JkZGVlYWUwZmZkM2FlYmMxMjZjMWYwZGNhMjk3NWVkNyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MC44LjUiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZWMyZjc2YmZlZTM3ZjQ0YThkM2FmMjdiMjc4NjZhN2QzM2Y3ODY5ZWE4NzI4NWU0ZmNmZjFjM2QwNzY0YzFiYzNhNWRjMTc1MzFjNzFkMzNlMWVjNjRiNzU5NjBjYmFmN2ZlZWUwNGI3ZDVjZjMwNWJiODA0ZDMwNWE3ODBhNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUzNWE2OTYyZDcyZDlkMjQwNTFiOTc0OTkzMjMyNzE5ZWY2ZDk2NDhiYWVmMzgzMjJhNjM1ODcwMTE4ZDY4MmEzYzk2NjJiMTAyMDU3NWUzOGFiYWQwNmNkNTQzY2MyMWZmMTJkZWU1MWZhYTI0N2E2MzQ5NmE3ZDc3MjhjMjcyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRhMDJlYzFiMWIxM2VjOGUxZTdiZDc1ZmYwN2EwM2RlZWU1MTg4ZmNkNjIwMWU0YjVhMGNjNGZhNGI2MTU1M2VkMGUyYjgyNGI5MTMyYzVlZDlmZDcwOTAwYmFiMTZmZDNjMTRhNDcxYjAwM2MyNWNlMjYxYWY0MjAzMzFhZTQ5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWE4ZGQyYTJmZjhhYjA1ZDgxMjU4OTdmMTcyYWEwYTlmYTQyOTZkYWY4MjlmNDY4MjY3YjU5M2Q0NWE4NmMwZTQ3ODgyNGRkMGFiZjU1ZGYxOGQ4MGYxNzkwMzI2NDg2YTUzYzUwMGNmZDc1OTdmZDdiYjNmZmM1ODBmNTQ3ZjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2IyMzNhNWM1NjIyMjEyNGFhYjVkZTQ5ZTIxZjc2ZDY3YjZlM2NmMWRlMGYyNDVmMjFiODZiZmI0MzZjMDIwZjUwYzBjYzU5MGE5NmEwZGJhYTkzZTZkMzk0Mzk1NTgxZmU3NjkxNDkwMDM0NzU0NzU4ODJlMjIzYTY3MDM0NWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmI4MmQ1OTVkMmFmZDVkOWMwMmM1Y2JlMDJlN2Y3Yzk2MDg3YzYwY2QwOTA5MWI5OTc4MmJkOGE3YzEyNmIyMzkyNjJlOThkMGY0NjBhNDg5ODFiNWNmMzUxMWI3Yjc4Y2QwZjAwMWIyZmEwZTVlOTM4MTQzNWRhMTZkYjE2N2MiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmQ2MzJkNjRmNzYzOWRiMjc5MDA3NmY3ZjU5MzFiNDVjY2UyZDg0Mzg3Y2RhMmM3OGM5MWE0MjI5ZjgxNjM0NDE3NmJiNDcwMDhlMTk3NzA0ZjZiN2RhYWZkMjc0M2RlYjQ1YWQwNmM1YmM2Yjg4YzAzOGRmMGU2ZGZiYTI3ZjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQyNjE0NzA3MTRkNjVkMzNjZTZjOGRmZDlkYjRjY2JmY2E0YmM4OGIzMTk5OWJmMDE5N2I5NWJkMDI3M2ZjYWVjMzljNGU4NjY2OWY5NzcwYmE3MTJiMGI1YjZjZDIzMjNkNWJjNGJhMmY1MGM3YmUxZDU3MzdmZTlhNDdmNjAzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWYwODZhNjBjZDBmMzlkNzI2MGI4N2Y5YmEyMDAwNzJiMTlmYWNjNzRiY2MwYTYyNzZjZDBiMTBmYTM5ZDkxYzlmZTdlMzc5OGM3ODAwOGEwZmExYjI3Y2VjNDU2MjNlNWEyYWFlODFjNTQ1NjAzMGRkMTQ3NWI4OTUxZjEyYjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NC4xLjI3IjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyNTA4MmY0YzhjYTZhYTdlY2ZhYjkwYWMxMTY1YWZkNThjNzAwYzA1ZmI0NmMzODBhOGVhNDI3ZDBjYjdjMDJhZGIxMzM2MzUwYjczNDRmNjkyNTYxYzJhOThmYTI3ZmRkZDE5NGMzYTYxMzU1ZmZkODJiNGY3MzdlYmE5NDk5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saWIvZXNtL2F2YS1mYXN0LWNoZWNrLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NmI3MzIwM2IzYWMxZTc2MDEwODcyZjE2NjQ1N2Q1NTUzMjhmNDU5Y2Y1MGE1NzJmZmEwMTA0MWVjMDkzM2E3ZjU3OTE3MGFjZTBiNmU3NmFmNzkyZTEyYmJiZTFhZjU1YmQ2ZDJjNjhjNGVmMTFiNDBkZGE5NGVmZGM2MWI3MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMzOGJiNjBmNzg1NGI0YTdiNjFhMWZkMzNiMjRhN2U5ZDA1OGRhNzkwZTZmMGEyOTY0NDNmNzA5ZjIwNmZlZjczMTUwYjdlMmRlZDc5OWM2MzliNTg4NDhkYzQ1YTRmM2ZjYWE5OWEwZjFlNzI1YTJhZDlhNDNkY2U2OTA4MzkxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NGI4MTI1ZDA5ZDczYjAyNWM4MzlmNjI1MWRjYzA2YTUzZGNkMjVhZTkxOGM5NzNlMzYwMTYxMTYzMDhhNDhjMTgzMGFkMzM4NzNkOWI4ZWVlMDZhZDUwYjgyOWQ0NTAzNmU4YzQ4NjAzNjM5ZTJhNTQ4MmVlMmJhOWNkZDMwZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NGU2MjcyN2NjYThjZjNjMmI1YTNhNzhhNWIyNzlmMzY3OTNhMzhkMzY3MTgxNTJhY2E1YjFlMTg2NjY1YjMwNjM4ZGQxMjRhMWJiOGNjOTQ0YzExMWE3MTI2ODZiNDRkMGY3Y2FhYjRmMmY1ZjAyNzNhMDRmNDI3NmYyNzM4YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ3NmViZjM0ZTczZDA1MDM5Mzc0N2U5ZWFmMzVkOTcwN2ExOTA1ZDRjYzFjNTEwYTRmMTllMTVmYzM1MGVjYjFkYjQ5YjJmNTFmODRmYWFlY2I5YjY3YWY1NDhhY2MyZTUxMmZhYjJmYTE2MTBiMzY4ZGQxYTE3OWVhMGYzMzRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ4ZWVkYTM2ZGVkY2FiY2VmZmE5ZjI2ZTYzNTI1ZTY4ODcxYTMyY2JlZGNkN2MxYWQ2YjZkNTk0MzY2YjI3MjQ4YzFkNDM2ZTFmOWRjZjNiMDk3MTA3ZTM4MDFkMjI5ODE0NDVjOGMzMzJjYmQwNTMwMDc1OTlkZTUzMmJhZjEyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZDBlNGJjNmU0N2UzZjY0Nzk0NmUxYTRiOWEwY2VhNjQ3YzM1MzA3ZTk1NTNlNThmM2MxMzIxNjE4MzZiOWQzYjhjN2U3MDFiM2U2ODYwNzFiNjAxZjRiMGI4MDIzMzI2ZjliYTQ4N2FlYzgwMjUyYzk1Y2FhZDhmZDk5NjE0MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OTVhZWQ4NzRiNDk1NzY0OGYwZTU1YzhjNzU5MmRjN2UxYjY1MzA3OWUyNTg2NTk1YmRjZjg5MzdmNzIyYzJiZTg2N2FkY2ExNjNkMDQwNDMyNTEwNjYxMzBlMDJkZGM4Y2I3NjYzY2Y4ZDg3NjRiMTBiZjZhMjZhOTYyNGYxMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlT2YuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YzBjNzhiMDZmZmYyYjE3NWQ4NDNhOWIxM2ZmODczOTcwYzZjMmVlYjJlMGEyYTIwN2U5YWNiMjVhOWIwYTYyMWQ0ZWM4ZDIxZTBjY2E4ODNkMjAxMWJmZWUwN2Y3ZGI3MjhlMmVjMGI0NWIyNGQyNThlY2JmZTBkZWUwMDM1MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZW1vdGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1ODQyZmU4MjUxZDRlMDk2ZjEzY2JlNWViZjdlMGIzMGM2YjUzMGEwMGIzNGZhMDdiZTgwNGQ1ZDdiNDAwYTAyYjI2ZmY0MjY4YjE0ZGQ4NzdlOTZlMWFlMzNhZDA4ZWYyYWI4ODEyOTYzMmQ2Mjg3NTk1MmVhZmQwMTcyMTFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZS1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWI3MzQxZjg5ZWY3ZGFhNWEzYTAxODBlMWJmZjcxYzUyZDA4ODcxZWIwYWZjZTU3NzQ3MDNkOTUxODJkZDBjMDJjMDUwODMzZWY2MTk5YmYzMTJhYzVjMDJkYmU0NTIzZTRkOGEwZjE5NjkxMjVlYzc3NTk2Y2NiNzY1MDNmYzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiOTkxOWI3OGQwNzM2OWM2N2NiZTY4ZTg2ODBiMmM5MTlkNjA5ZDJkYmNiYjIxZDJjODBjZmYyNjJhMzY0NTM0N2E1MzBlNzM5MWQ0MWU3OGE0NDhkNzUxODMyNmExY2UzZWNiOWM5OWQxNjM0MzkwMTYzOTY1NDkyYWRlMDQ5YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQzOWYzMDViYzc5ZjFkYjlhNmNmYmY5NTI1MTkyNWIyZWU1NmJkMjliYjE1NTdmMjQ0Njk4ZmMyMzVkMGFmOWU3MjdhYzU3MjAyMjZlMzJkYzgwZmM4YWYzNjE3YjBhNGQ1M2NlNzcyZTcwM2UyNWZmMGI5ZWJlZDc0Yzc1NzM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NDE3MGM0ZTE2ZDUzNzk1YTg0NzlkMGMxYTc5ZDE5YjE5MGQ5MjJlMTYzMDFlN2EwYmI4YjgxNmQzYzQ5YmQyNWZlMGI4NGU4NzlkYTc4MGMzZmMwNjQxYWQ2OWNjNTdkZDFlNzk1ZWNlN2U4YmIyODEyZjc0MzA1OGFmZjAyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjlmZmU1NWEzMTAzNzNhNDU3YWE5ZDA3NzE2MTE4NTA1NGViMzZmODM1MzI4ZmNhMTRlZmQxMTQ1MWM2MTUwMmExMjBiODNjNzQ4MjA0ZmEwODc3YWZjNzA1MmViMjJhNGQ3YjBlMWIwYjYxOGRiOTAyMTdkNmU4Y2U3N2EyOTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE4MTRkZDE0M2RmZjczZGUzZWU0YzFmMDc3MDdlNTc3Y2FhY2FhM2FiZjRiMDU5MGNkZWRlMTBiOTE5OWE5MmQ3OTdmMGMxMWJiNzM4Mjk1YzQ5ZjFlN2VmOTBmM2QxMTZlMjhlNzRjMDg2NzM0ZWJjYThiY2RhMWRjOTM5ZDQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWVhNTVmYTJjYzFiNzM2ZTAyYmI4MzIyNDZkY2M2ZmNkNGEwYTFlYmMyNDFlMzgxZWY2ZjY0YmQ4ZWM0NmExNWQzZjc5N2VjMjJhMzVjOWM1Yzk1MTQyNGUzOWZkNmE2ODdjZGI0MTU1YzhkYjcxZjZlZmU3ZDNmZTk3ZTk0NWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzVlODMzNmNiYzQxY2QyZjYzMTE3N2MwNjEwOWNmM2Y4YjUxODE0Y2IzM2UyMjA4MmM4ZTllZWUwNzJlYzQ4OTE5ZDA4ZDQzZDI5ZDU2NTUxODI2Yzg5NTEzNTgzNTRkNjhlNWFhMDk2YzZhYTU2NjEzNDllMGZhMTA4MTZmNzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3ppcC12MC4yLjMxIjogewogICAgICAibmFtZSI6ICJAZW5kby96aXAiLAogICAgICAibGFiZWwiOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcmVhZGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC93cml0ZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3dyaXRlci5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDg0MzcyOTNhZjFkM2U4MDc0MzAzNDQxNTQ2OWJiOTdlODNiYzJjZGFhZmE3YjBiNmRjOGIyMWUwYzEwYmM2YjBlZGRiMTE0NDFjMWI3YTFjYjJlZTYzNDhjNGYwMWMyODM3ZjAyYjRhMzRkZWVhNjQwYzJmMDU0NDlhMmVkZDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXJlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXJlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEzNWRhZTY3ZThhZGRjNTFjMzVlOWNhNTRjMzllOGZlM2M5ZWUyODBhMmU4ZGNjN2I0NGMwZTQ4NTZkNWFhZDYyMDZlMWY4ZDBjZDYxZTE5MDc2M2JjMTcxODQxNDliMTE0YzRhYjQ0MWJmYWVkYjA3MTQ2MjFhNDVkNTJjZjgwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J1ZmZlci13cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J1ZmZlci13cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NGE4YzhlODg0NTg0ZDM2YzAyM2E0NGY1ZGE3NzNkN2QyYTllNDVlMTkzZmMwNGQ3NDJhMjJlZTI1OTAwMTBiZDU3YjNhYWQ4YjYyNDY3NmQ1YmE5ZjA0MGEwYzM0ODE4OTZhOWNjMTYxOTlhNmUyOTVmOGRkMDRjNzE4YjA0NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wcmVzc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcHJlc3Npb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMDVkYjQzNTNjODZmNTFkZTc5N2JkNmNjYWFlYjFjOTIxZGM3NDZlNzk0ZThjNjQyMTFmY2VlNzhkOTIwMDJiM2JhZjUyM2IxZjY5Nzg1YWZmOWJmYTU3NzlkMGY5MjkzOGY1ZjNhYWRiZjQ4OWZjODIyMTNhY2I5YjdkNDczYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jcmMzMi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY3JjMzIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NTM4NGUxMzlhZjlmMDkzYjllY2E1MmNjNWU2MGQ1ZWZlNDE1NTg0MGE2YWZlYjAyMWIxZThhZjgxZDMwMTczNDUxNzIxNGRiNGFkODhiMTM4NDFmZGI2MDExZTk2ZDYxY2NlM2IwN2RhMTc4MTg0ZmQ2YjhkMjBjNWU4MTgwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmNhNDQ3ZTJjYzRlOThmZjM3NmEzY2UwOWZkOTkwZWI1ZWUwYzdkMDVmMTA0Y2Q5NTlmODliNzJiYTQ3ZThjZGVmNGM0NjFmMDY3NzZlN2UzMzI1MzA5ZGY2YTAzZDFhNmI0YWExNzNhN2RjMWY3NzRlOWMxNjNjZDk4MjQ2MDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZm9ybWF0LXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZm9ybWF0LXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUzODk0ZGFmMzk2ZmMwZWRkM2RiYTBhM2IyZWI5NWQ1MWM0Njk4ZWE4MTcwYTA0YmRmZTljNzdlMDE4NTg4NmVmYmY2NWY1NzdiYWIxN2YyMWJhOTU3NTIwZGNjYjM4YmUwYWZhZjhmZjcxM2QwZDVkYzA5YTJiNTg1ZTFkYmVkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2FkMzUxZjAxNmE2NzE4NmU0M2VhY2ZlYTc2NDQyYjgzNWY2NmM0ZmQ3OGJhNDFiYjNiNTgwYTdmMGRmODk3OGZmMGQ5OTY0ZGRlNDliYmM3YzhhNzc4OGM5OWUwYTRhNmUzYjJhYzJlMzU0NjI1ZmE0YzkyN2E1Y2FjYzIyMGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2lnbmF0dXJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zaWduYXR1cmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiMDc3NTMyMGQ0ZjMyOWVlOGFhMDQxNDRhNzE0MDllN2NmNjk2NzZhYjVhZjI1YTZiNWI2ZTM2MzRjYjkxNDY2MmRjNDI1NzM4NDNlY2E5ZTE4YTc3N2Q1ZGQwMDQ5ODcyOGZkOWU4YzY1ZWExMGZiZGIzNmQ2M2FjZjExNTYzOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk2ZGZmYWNlNjMxZWI0NjVlODNmZTQ2NWM0YTg0ZGZhY2EyZjJjNGE3NjM4MzMzOTAyMDQ3ZWY2ZmM4ZWQ2OWJjMmYyYTY0OTFhYzI3Njg5ZmMzYTEwYmExZmYwNDE1MDA3N2YzZWYxNTRkYjYxZDI2ODAwYjE3MDJiNTU5NDdhIgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAwt1MYHsEAAB7BAAAKQAAAEBhZ29yaWMvc3Bhd25lci12MC42Ljgvc3JjL3ZhdC1zcGF3bmVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ltcG9ydC1idW5kbGUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYnVpbGRSb290T2JqZWN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGltcG9ydEJ1bmRsZSxGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vaW1wb3J0LWJ1bmRsZVwiLCBbW1wiaW1wb3J0QnVuZGxlXCIsIFskaOKAjV9hID0+IChpbXBvcnRCdW5kbGUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVpbGRSb290T2JqZWN0LCAnbmFtZScsIHt2YWx1ZTogXCJidWlsZFJvb3RPYmplY3RcIn0pOyRo4oCNX29uY2UuYnVpbGRSb290T2JqZWN0KGJ1aWxkUm9vdE9iamVjdCk7ICAgXG5cblxuXG5cbmNvbnN0IGVuZG93bWVudHM9e1xuVmF0RGF0YSxcbmNvbnNvbGUsXG5hc3NlcnQsXG5CYXNlNjQ6Z2xvYmFsVGhpcy5CYXNlNjQsLyogUHJlc2VudCBvbmx5IG9uIFhTbmFwKi9cblVSTDpnbG9iYWxUaGlzLlVSTC8qIEFic2VudCBvbmx5IG9uIFhTbmFwKi99O1xuXG5cbmZ1bmN0aW9uICAgICAgICBidWlsZFJvb3RPYmplY3QoKXtcbnJldHVybiBGYXIoJ3Jvb3QnLHtcbiAgICAgIGFzeW5jIGxvYWRCdW5kbGUoYnVuZGxlKXtcbmNvbnN0IG5zPWF3YWl0IGltcG9ydEJ1bmRsZShidW5kbGUse2VuZG93bWVudHN9KTtcbmNvbnN0IHN0YXJ0Rm49bnMuZGVmYXVsdDtcbnJldHVybiBGYXIoJ3NwYXduZWQgYnVuZGxlJyx7XG4gICAgICBhc3luYyBzdGFydChhcmdzUCl7XG5jb25zdCBhcmdzPWF3YWl0IGFyZ3NQO1xucmV0dXJuIHN0YXJ0Rm4oYXJncyk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJ1aWxkUm9vdE9iamVjdCI6WyJidWlsZFJvb3RPYmplY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA954aPOsCAADrAgAAHAAAAEBlbmRvL2Jhc2U2NC12MC4yLjMxL2F0b2IuanN7ImltcG9ydHMiOlsiLi9kZWNvZGUuanMiXSwiZXhwb3J0cyI6WyJhdG9iIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGRlY29kZUJhc2U2NDskaOKAjV9pbXBvcnRzKFtbXCIuL2RlY29kZS5qc1wiLCBbW1wiZGVjb2RlQmFzZTY0XCIsIFskaOKAjV9hID0+IChkZWNvZGVCYXNlNjQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZERhdGEgYSBiaW5hcnkgc3RyaW5nIGNvbnRhaW5pbmcgYmFzZTY0LWVuY29kZWQgZGF0YVxuICogQHJldHVybnMge3N0cmluZ30gYW4gQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgZGVjb2RlZCBkYXRhIGZyb20gYGVuY29kZWREYXRhYFxuICovXG5jb25zdCAgICAgICAgYXRvYj0oZW5jb2RlZERhdGEpPT57XG5jb25zdCBidWY9ZGVjb2RlQmFzZTY0KGVuY29kZWREYXRhKTtcbnJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7XG4gfTskaOKAjV9vbmNlLmF0b2IoYXRvYik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXRvYiI6WyJhdG9iIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHkkiZuNAwAAjQMAABwAAABAZW5kby9iYXNlNjQtdjAuMi4zMS9idG9hLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlLmpzIl0sImV4cG9ydHMiOlsiYnRvYSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBlbmNvZGVCYXNlNjQ7JGjigI1faW1wb3J0cyhbW1wiLi9lbmNvZGUuanNcIiwgW1tcImVuY29kZUJhc2U2NFwiLCBbJGjigI1fYSA9PiAoZW5jb2RlQmFzZTY0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1RvRW5jb2RlIHRoZSBiaW5hcnkgc3RyaW5nIHRvIGVuY29kZVxuICogQHJldHVybnMge3N0cmluZ30gYW4gQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJhc2U2NCByZXByZXNlbnRhdGlvbiBvZiBgc3RyaW5nVG9FbmNvZGVgXG4gKi9cbmNvbnN0ICAgICAgICBidG9hPShzdHJpbmdUb0VuY29kZSk9PntcbmNvbnN0IGJ5dGVzPXN0cmluZ1RvRW5jb2RlLnNwbGl0KCcnKS5tYXAoKGNoYXIpPT57XG5jb25zdCBiPWNoYXIuY2hhckNvZGVBdCgwKTtcbmlmKGI+MHhmZil7XG50aHJvdyBuZXcgRXJyb3IoIGBidG9hOiBjaGFyYWN0ZXIgb3V0IG9mIHJhbmdlOiAke2NoYXJ9YCk7XG4gfVxucmV0dXJuIGI7XG4gfSk7XG5jb25zdCBidWY9bmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xucmV0dXJuIGVuY29kZUJhc2U2NChidWYpO1xuIH07JGjigI1fb25jZS5idG9hKGJ0b2EpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJ0b2EiOlsiYnRvYSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB02udwlQEAAJUBAAAeAAAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2RlY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZGVjb2RlLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2RlY29kZS5qcyI6W1siZGVjb2RlQmFzZTY0IiwiZGVjb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABHQ26WlQEAAJUBAAAeAAAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZW5jb2RlLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZS5qcyI6W1siZW5jb2RlQmFzZTY0IiwiZW5jb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABXcWzggAIAAIACAAAdAAAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hdG9iLmpzIiwiLi9idG9hLmpzIiwiLi9zcmMvZGVjb2RlLmpzIiwiLi9zcmMvZW5jb2RlLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGUuanNcIiwgW11dLFtcIi4vc3JjL2RlY29kZS5qc1wiLCBbXV0sW1wiLi9idG9hLmpzXCIsIFtdXSxbXCIuL2F0b2IuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZW5jb2RlLmpzIjpbWyJlbmNvZGVCYXNlNjQiLCJlbmNvZGVCYXNlNjQiXV0sIi4vc3JjL2RlY29kZS5qcyI6W1siZGVjb2RlQmFzZTY0IiwiZGVjb2RlQmFzZTY0Il1dLCIuL2J0b2EuanMiOltbImJ0b2EiLCJidG9hIl1dLCIuL2F0b2IuanMiOltbImF0b2IiLCJhdG9iIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAoDnJAAwQAAAMEAAAiAAAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvc3JjL2NvbW1vbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYWxwaGFiZXQ2NCIsIm1vbm9kdTY0IiwicGFkZGluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbmNvbnN0ICAgICAgICBwYWRkaW5nPSc9JzskaOKAjV9vbmNlLnBhZGRpbmcocGFkZGluZyk7XG5cbmNvbnN0ICAgICAgICBhbHBoYWJldDY0PVxuJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG4vKipcbiAqIFRoZSBudW1lcmljIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBsZXR0ZXIgb2YgdGhlIGFscGhhYmV0LlxuICogSWYgYW4gYWxwaGFiZXQgaXMgbmFtZWQgZm9yIHRoZSBHcmVlayBsZXR0ZXJzIGFscGhhIGFuZCBiZXRhLCB0aGVuIGNsZWFybHkgYVxuICogbW9ub2R1IGlzIG5hbWVkIGZvciB0aGUgY29ycmVzcG9uZGluZyBHcmVlayBudW1iZXJzIG1vbm8gYW5kIGR1by5cbiAqXG4gKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn1cbiAqLyRo4oCNX29uY2UuYWxwaGFiZXQ2NChhbHBoYWJldDY0KTtcbmNvbnN0ICAgICAgICBtb25vZHU2ND17fTskaOKAjV9vbmNlLm1vbm9kdTY0KG1vbm9kdTY0KTtcbmZvcihsZXQgaT0wO2k8YWxwaGFiZXQ2NC5sZW5ndGg7aSs9MSl7XG5jb25zdCBjPWFscGhhYmV0NjRbaV07XG5tb25vZHU2NFtjXT1pO1xuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYWRkaW5nIjpbInBhZGRpbmciXSwiYWxwaGFiZXQ2NCI6WyJhbHBoYWJldDY0Il0sIm1vbm9kdTY0IjpbIm1vbm9kdTY0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJLtlGR8CQAAfAkAACIAAABAZW5kby9iYXNlNjQtdjAuMi4zMS9zcmMvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vY29tbW9uLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlQmFzZTY0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1vbm9kdTY0LHBhZGRpbmc7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcIm1vbm9kdTY0XCIsIFskaOKAjV9hID0+IChtb25vZHU2NCA9ICRo4oCNX2EpXV0sW1wicGFkZGluZ1wiLCBbJGjigI1fYSA9PiAocGFkZGluZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKlxuICogRGVjb2RlcyBhIEJhc2U2NCBzdHJpbmcgaW50byBieXRlcywgYXMgc3BlY2lmaWVkIGluXG4gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OCNzZWN0aW9uLTRcbiAqXG4gKiBYU25hcCBpcyBhIEphdmFTY3JpcHQgZW5naW5lIGJhc2VkIG9uIE1vZGRhYmxlL1hTLlxuICogVGhlIGFsZ29yaXRobSBiZWxvdyBpcyBvcmRlcnMgb2YgbWFnbml0dWRlIHRvbyBzbG93IG9uIHRoaXMgVk0sIGJ1dCBpdFxuICogYXJyYW5nZXMgYSBuYXRpdmUgYmluZGluZyBvbiB0aGUgZ2xvYmFsIG9iamVjdC5cbiAqIFdlIHVzZSB0aGF0IGlmIGl0IGlzIGF2YWlsYWJsZSBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgQmFzZTY0LWVuY29kZWQgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIFRoZSBuYW1lIG9mIHRoZSBzdHJpbmcgYXMgaXQgd2lsbCBhcHBlYXIgaW4gZXJyb3JcbiAqIG1lc3NhZ2VzLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IGRlY29kZWQgYnl0ZXNcbiAqL1xuY29uc3QganNEZWNvZGVCYXNlNjQ9KHN0cmluZyxuYW1lPSc8dW5rbm93bj4nKT0+e1xuY29uc3QgZGF0YT1uZXcgVWludDhBcnJheShNYXRoLmNlaWwoc3RyaW5nLmxlbmd0aCo0LzMpKTtcbmxldCByZWdpc3Rlcj0wO1xubGV0IHF1YW50dW09MDtcbmxldCBpPTA7LyogaW5kZXggaW4gc3RyaW5nKi9cbmxldCBqPTA7LyogaW5kZXggaW4gZGF0YSovXG5cbndoaWxlKGk8c3RyaW5nLmxlbmd0aCYmc3RyaW5nW2ldIT09cGFkZGluZyl7XG5jb25zdCBudW1iZXI9bW9ub2R1NjRbc3RyaW5nW2ldXTtcbmlmKG51bWJlcj09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvciggYEludmFsaWQgYmFzZTY0IGNoYXJhY3RlciAke3N0cmluZ1tpXX0gaW4gc3RyaW5nICR7bmFtZX1gKTtcbiB9XG5yZWdpc3Rlcj1yZWdpc3Rlcjw8NnxudW1iZXI7XG5xdWFudHVtKz02O1xuaWYocXVhbnR1bT49OCl7XG5xdWFudHVtLT04O1xuZGF0YVtqXT1yZWdpc3Rlcj4+PnF1YW50dW07XG5qKz0xO1xucmVnaXN0ZXImPSgxPDxxdWFudHVtKS0xO1xuIH1cbmkrPTE7XG4gfVxuXG53aGlsZShpPHN0cmluZy5sZW5ndGgmJnF1YW50dW0lOCE9PTApe1xuaWYoc3RyaW5nW2ldIT09cGFkZGluZyl7XG50aHJvdyBFcnJvciggYE1pc3NpbmcgcGFkZGluZyBhdCBvZmZzZXQgJHtpfSBvZiBzdHJpbmcgJHtuYW1lfWApO1xuIH1cbmkrPTE7XG5xdWFudHVtKz02O1xuIH1cblxuaWYoaTxzdHJpbmcubGVuZ3RoKXtcbnRocm93IEVycm9yKFxuIGBCYXNlNjQgc3RyaW5nIGhhcyB0cmFpbGluZyBnYXJiYWdlICR7c3RyaW5nLnN1YnN0cihcbmkpXG4gfSBpbiBzdHJpbmcgJHtuYW1lfWApO1xuXG4gfVxuXG5yZXR1cm4gZGF0YS5zdWJhcnJheSgwLGopO1xuIH07XG5cbi8qIFRoZSBYUyBCYXNlNjQuZGVjb2RlIGZ1bmN0aW9uIGlzIGZhc3RlciwgYnV0IG1pZ2h0IHJldHVybiBBcnJheUJ1ZmZlciAobm90Ki9cbi8qIFVpbnQ4QXJyYXkpLiAgQWRhcHQgaXQgdG8gb3VyIG5lZWRzLiovXG5jb25zdCBhZGFwdERlY29kZXI9XG4obmF0aXZlRGVjb2RlQmFzZTY0KT0+XG4oLi4uYXJncyk9PntcbmNvbnN0IGRlY29kZWQ9bmF0aXZlRGVjb2RlQmFzZTY0KC4uLmFyZ3MpO1xuaWYoZGVjb2RlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe1xucmV0dXJuIGRlY29kZWQ7XG4gfVxucmV0dXJuIG5ldyBVaW50OEFycmF5KGRlY29kZWQpO1xuIH07XG5cbi8qKiBAdHlwZSB7dHlwZW9mIGpzRGVjb2RlQmFzZTY0fSAqL1xuY29uc3QgICAgICAgIGRlY29kZUJhc2U2ND1cbmdsb2JhbFRoaXMuQmFzZTY0IT09dW5kZWZpbmVkP1xuYWRhcHREZWNvZGVyKGdsb2JhbFRoaXMuQmFzZTY0LmRlY29kZSk6XG5qc0RlY29kZUJhc2U2NDskaOKAjV9vbmNlLmRlY29kZUJhc2U2NChkZWNvZGVCYXNlNjQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZUJhc2U2NCI6WyJkZWNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGp+gAOYHAADmBwAAIgAAAEBlbmRvL2Jhc2U2NC12MC4yLjMxL3NyYy9lbmNvZGUuanN7ImltcG9ydHMiOlsiLi9jb21tb24uanMiXSwiZXhwb3J0cyI6WyJlbmNvZGVCYXNlNjQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYWxwaGFiZXQ2NCxwYWRkaW5nOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9uLmpzXCIsIFtbXCJhbHBoYWJldDY0XCIsIFskaOKAjV9hID0+IChhbHBoYWJldDY0ID0gJGjigI1fYSldXSxbXCJwYWRkaW5nXCIsIFskaOKAjV9hID0+IChwYWRkaW5nID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqXG4gKiBFbmNvZGVzIGJ5dGVzIGludG8gYSBCYXNlNjQgc3RyaW5nLCBhcyBzcGVjaWZpZWQgaW5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ4I3NlY3Rpb24tNFxuICpcbiAqIFhTbmFwIGlzIGEgSmF2YVNjcmlwdCBlbmdpbmUgYmFzZWQgb24gTW9kZGFibGUvWFMuXG4gKiBUaGUgYWxnb3JpdGhtIGJlbG93IGlzIG9yZGVycyBvZiBtYWduaXR1ZGUgdG9vIHNsb3cgb24gdGhpcyBWTSwgYnV0IGl0XG4gKiBhcnJhbmdlcyBhIG5hdGl2ZSBiaW5kaW5nIG9uIHRoZSBnbG9iYWwgb2JqZWN0LlxuICogV2UgdXNlIHRoYXQgaWYgaXQgaXMgYXZhaWxhYmxlIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBiYXNlNjQgZW5jb2RpbmdcbiAqL1xuY29uc3QganNFbmNvZGVCYXNlNjQ9KGRhdGEpPT57XG4vKiBBIGN1cnNvcnkgYmVuY2htYXJrIHNob3dzIHRoYXQgc3RyaW5nIGNvbmNhdGVuYXRpb24gaXMgYWJvdXQgMjUlIGZhc3RlciovXG4vKiB0aGFuIGJ1aWxkaW5nIGFuIGFycmF5IGFuZCBqb2luaW5nIGl0IGluIHY4LCBpbiAyMDIwLCBmb3Igc3RyaW5ncyBvZiBhYm91dCovXG4vKiAxMDAgbG9uZy4qL1xubGV0IHN0cmluZz0nJztcbmxldCByZWdpc3Rlcj0wO1xubGV0IHF1YW50dW09MDtcblxuZm9yKGxldCBpPTA7aTxkYXRhLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGI9ZGF0YVtpXTtcbnJlZ2lzdGVyPXJlZ2lzdGVyPDw4fGI7XG5xdWFudHVtKz04O1xuaWYocXVhbnR1bT09PTI0KXtcbnN0cmluZys9XG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MTgmMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MTImMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+NiYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4wJjB4M2ZdO1xucmVnaXN0ZXI9MDtcbnF1YW50dW09MDtcbiB9XG4gfVxuXG5zd2l0Y2gocXVhbnR1bSl7XG5jYXNlIDA6XG5icmVhaztcbmNhc2UgODpcbnN0cmluZys9XG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MiYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI8PDQmMHgzZl0rXG5wYWRkaW5nK1xucGFkZGluZztcbmJyZWFrO1xuY2FzZSAxNjpcbnN0cmluZys9XG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MTAmMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+NCYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI8PDImMHgzZl0rXG5wYWRkaW5nO1xuYnJlYWs7XG5kZWZhdWx0OlxudGhyb3cgRXJyb3IoIGBpbnRlcm5hbDogYmFkIHF1YW50dW0gJHtxdWFudHVtfWApO31cblxucmV0dXJuIHN0cmluZztcbiB9O1xuXG4vKiogQHR5cGUge3R5cGVvZiBqc0VuY29kZUJhc2U2NH0gKi9cbmNvbnN0ICAgICAgICBlbmNvZGVCYXNlNjQ9XG5nbG9iYWxUaGlzLkJhc2U2NCE9PXVuZGVmaW5lZD9nbG9iYWxUaGlzLkJhc2U2NC5lbmNvZGU6anNFbmNvZGVCYXNlNjQ7JGjigI1fb25jZS5lbmNvZGVCYXNlNjQoZW5jb2RlQmFzZTY0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJlbmNvZGVCYXNlNjQiOlsiZW5jb2RlQmFzZTY0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPz0xDYEAgAABAIAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L2ltcG9ydC1hcmNoaXZlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIl0sImV4cG9ydHMiOlsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIjpbWyJwYXJzZUFyY2hpdmUiLCJwYXJzZUFyY2hpdmUiXSxbImxvYWRBcmNoaXZlIiwibG9hZEFyY2hpdmUiXSxbImltcG9ydEFyY2hpdmUiLCJpbXBvcnRBcmNoaXZlIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACQ6+lKdTEAAHUxAAA2AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvY29tcGFydG1lbnQtbWFwLmpzeyJpbXBvcnRzIjpbIi4vcG9saWN5LWZvcm1hdC5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvbXBhcnRtZW50TWFwIiwicGF0aENvbXBhcmUiLCJzdHJpbmdDb21wYXJlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFBhY2thZ2VQb2xpY3k7JGjigI1faW1wb3J0cyhbW1wiLi9wb2xpY3ktZm9ybWF0LmpzXCIsIFtbXCJhc3NlcnRQYWNrYWdlUG9saWN5XCIsIFskaOKAjV9hID0+IChhc3NlcnRQYWNrYWdlUG9saWN5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qIFRPRE8gY29udmVydCB0byB0aGUgbmV3IGB8fGAgYXNzZXJ0IHN0eWxlLiovXG4vKiBEZWZlcnJlZCBiZWNhdXNlIHRoaXMgZmlsZSBwZXJ2YXNpdmVseSB1c2VzIHNpbXBsZSB0ZW1wbGF0ZSBzdHJpbmdzIHJhdGhlciB0aGFuKi9cbi8qIHRlbXBsYXRlIHN0cmluZ3MgdGFnZ2VkIHdpdGggYGFzc2VydC5kZXRhaWxzYCAoYWthIGBYYCksIGFuZCB1c2VzKi9cbi8qIHRoaXMgZGVmaW5pdGlvbiBvZiBgcWAgcmF0aGVyIHRoYW4gYGFzc2VydC5xdW90ZWAqL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgbW9kdWxlTGFuZ3VhZ2VzPVtcbidjanMnLFxuJ21qcycsXG4nanNvbicsXG4ndGV4dCcsXG4nYnl0ZXMnLFxuJ3ByZS1tanMtanNvbicsXG4ncHJlLWNqcy1qc29uJ107XG5cblxuLyoqIEB0eXBlIHsoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IG51bWJlcn0gKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5jb25zdCAgICAgICAgc3RyaW5nQ29tcGFyZT0oYSxiKT0+YT09PWI/MDphPGI/LTE6MTtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVybVxuICovJGjigI1fb25jZS5zdHJpbmdDb21wYXJlKHN0cmluZ0NvbXBhcmUpO1xuY29uc3QgY3VtdWxhdGl2ZUxlbmd0aD0obGVuZ3RoLHRlcm0pPT57XG5yZXR1cm4gbGVuZ3RoK3Rlcm0ubGVuZ3RoO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkfSBhXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz4gfCB1bmRlZmluZWR9IGJcbiAqL1xuY29uc3QgICAgICAgIHBhdGhDb21wYXJlPShhLGIpPT57XG4vKiBVbmRlZmluZWQgaXMgbm90IHByZWZlcnJlZCovXG5pZihhPT09dW5kZWZpbmVkJiZiPT09dW5kZWZpbmVkKXtcbnJldHVybiAwO1xuIH1cbmlmKGE9PT11bmRlZmluZWQpe1xucmV0dXJuIDE7XG4gfVxuaWYoYj09PXVuZGVmaW5lZCl7XG5yZXR1cm4tMTtcbiB9XG4vKiBQcmVmZXIgdGhlIHNob3J0ZXN0IGRlcGVuZGVuY3kgcGF0aC4qL1xuaWYoYS5sZW5ndGghPT1iLmxlbmd0aCl7XG5yZXR1cm4gYS5sZW5ndGgtYi5sZW5ndGg7XG4gfVxuLyogT3RoZXJ3aXNlLCBmYXZvciB0aGUgc2hvcnRlc3QgY3VtdWxhdGl2ZSBsZW5ndGguKi9cbmNvbnN0IGFTdW09YS5yZWR1Y2UoY3VtdWxhdGl2ZUxlbmd0aCwwKTtcbmNvbnN0IGJTdW09Yi5yZWR1Y2UoY3VtdWxhdGl2ZUxlbmd0aCwwKTtcbmlmKGFTdW0hPT1iU3VtKXtcbnJldHVybiBhU3VtLWJTdW07XG4gfVxuLyogT3RoZXJ3aXNlLCBjb21wYXJlIHRlcm1zIGxleGljYWxseS4qL1xuYXNzZXJ0KGEubGVuZ3RoPT09Yi5sZW5ndGgpOy8qIFJlbWluZGVyKi9cbi8qIFRoaXMgbG9vcCBndWFyYW50ZWVzIHRoYXQgaWYgYW55IHBhaXIgb2YgdGVybXMgaXMgZGlmZmVyZW50LCBpbmNsdWRpbmcgdGhlKi9cbi8qIGNhc2Ugd2hlcmUgb25lIGlzIGEgcHJlZml4IG9mIHRoZSBvdGhlciwgd2Ugd2lsbCByZXR1cm4gYSBub24temVybyB2YWx1ZS4qL1xuZm9yKGxldCBpPTA7aTxhLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGNvbXBhcmlzb249c3RyaW5nQ29tcGFyZShhW2ldLGJbaV0pO1xuaWYoY29tcGFyaXNvbiE9PTApe1xucmV0dXJuIGNvbXBhcmlzb247XG4gfVxuIH1cbi8qIElmIGFsbCBwYWlycyBvZiB0ZXJtcyBhcmUgdGhlIHNhbWUgcmVzcGVjdGl2ZSBsZW5ndGhzLCB3ZSBhcmUgZ3VhcmFudGVlZCovXG4vKiB0aGF0IHRoZXkgYXJlIGV4YWN0bHkgdGhlIHNhbWUgb3Igb25lIG9mIHRoZW0gaXMgbGV4aWNhbGx5IGRpc3RpbmN0IGFuZCB3b3VsZCovXG4vKiBoYXZlIGFscmVhZHkgYmVlbiBjYXVnaHQuKi9cbnJldHVybiAwO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGl0ZXJhYmxlXG4gKi8kaOKAjV9vbmNlLnBhdGhDb21wYXJlKHBhdGhDb21wYXJlKTtcbmZ1bmN0aW9uKmVudW1lcmF0ZShpdGVyYWJsZSl7XG5sZXQgaW5kZXg9MDtcbmZvcihjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSl7XG55aWVsZFtpbmRleCx2YWx1ZV07XG5pbmRleCs9MTtcbiB9XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuY29uc3QgYXNzZXJ0RW1wdHlPYmplY3Q9KG9iamVjdCxtZXNzYWdlKT0+e1xuYXNzZXJ0KE9iamVjdC5rZXlzKG9iamVjdCkubGVuZ3RoPT09MCxtZXNzYWdlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdGFnc1xuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRUYWdzPSh0YWdzLHVybCk9PntcbmlmKHRhZ3M9PT11bmRlZmluZWQpcmV0dXJuO1xuYXNzZXJ0KFxuQXJyYXkuaXNBcnJheSh0YWdzKSxcbiBgdGFncyBtdXN0IGJlIGFuIGFycmF5LCBnb3QgJHt0YWdzfSBpbiAke3EodXJsKX1gKTtcblxuZm9yKGNvbnN0W2luZGV4LHZhbHVlXW9mIGVudW1lcmF0ZSh0YWdzKSl7XG5hc3NlcnQudHlwZW9mKFxudmFsdWUsXG4nc3RyaW5nJyxcbiBgdGFnc1ske2luZGV4fV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYWxsZWdlZE1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRNb2R1bGU9KGFsbGVnZWRNb2R1bGUscGF0aCx1cmwpPT57XG5jb25zdHtjb21wYXJ0bWVudCxtb2R1bGUsLi4uZXh0cmF9PWFsbGVnZWRNb2R1bGU7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cSh7XG5leHRyYSxcbmNvbXBhcnRtZW50fSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxuY29tcGFydG1lbnQsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGNvbXBhcnRtZW50KX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5tb2R1bGUsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5tb2R1bGUgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShtb2R1bGUpfSBpbiAke3EodXJsKX1gKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYWxsZWdlZE1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0RmlsZU1vZHVsZT0oYWxsZWdlZE1vZHVsZSxwYXRoLHVybCk9PntcbmNvbnN0e2xvY2F0aW9uLHBhcnNlcixzaGE1MTIsLi4uZXh0cmF9PWFsbGVnZWRNb2R1bGU7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubG9jYXRpb24sXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5sb2NhdGlvbiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGxvY2F0aW9uKX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5wYXJzZXIsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5wYXJzZXIgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShwYXJzZXIpfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0KFxubW9kdWxlTGFuZ3VhZ2VzLmluY2x1ZGVzKHBhcnNlciksXG4gYCR7cGF0aH0ucGFyc2VyIG11c3QgYmUgb25lIG9mICR7cShtb2R1bGVMYW5ndWFnZXMpfSwgZ290ICR7cGFyc2VyfSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG5cbmlmKHNoYTUxMiE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKFxuc2hhNTEyLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uc2hhNTEyIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3Eoc2hhNTEyKX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhbGxlZ2VkTW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRFeGl0TW9kdWxlPShhbGxlZ2VkTW9kdWxlLHBhdGgsdXJsKT0+e1xuY29uc3R7ZXhpdCwuLi5leHRyYX09YWxsZWdlZE1vZHVsZTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5leGl0LFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uZXhpdCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGV4aXQpfSBpbiAke3EodXJsKX1gKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRNb2R1bGU9KGFsbGVnZWRNb2R1bGUscGF0aCx1cmwpPT57XG5jb25zdCBtb2R1bGVEZXNjcmlwdG9yPU9iamVjdChhbGxlZ2VkTW9kdWxlKTtcbmFzc2VydChcbmFsbGVnZWRNb2R1bGU9PT1tb2R1bGVEZXNjcmlwdG9yJiYhQXJyYXkuaXNBcnJheShtb2R1bGVEZXNjcmlwdG9yKSxcbiBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZE1vZHVsZX0gaW4gJHtxKHVybCl9YCk7XG5cblxuY29uc3R7Y29tcGFydG1lbnQsbW9kdWxlLGxvY2F0aW9uLHBhcnNlcixleGl0LGRlZmVycmVkRXJyb3J9PVxubW9kdWxlRGVzY3JpcHRvcjtcbmlmKGNvbXBhcnRtZW50IT09dW5kZWZpbmVkfHxtb2R1bGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0Q29tcGFydG1lbnRNb2R1bGUobW9kdWxlRGVzY3JpcHRvcixwYXRoLHVybCk7XG4gfWVsc2UgaWYobG9jYXRpb24hPT11bmRlZmluZWR8fHBhcnNlciE9PXVuZGVmaW5lZCl7XG5hc3NlcnRGaWxlTW9kdWxlKG1vZHVsZURlc2NyaXB0b3IscGF0aCx1cmwpO1xuIH1lbHNlIGlmKGV4aXQhPT11bmRlZmluZWQpe1xuYXNzZXJ0RXhpdE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLHBhdGgsdXJsKTtcbiB9ZWxzZSBpZihkZWZlcnJlZEVycm9yIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoXG5kZWZlcnJlZEVycm9yLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uZGVmZXJyZWRFcnJvciBtdXN0IGJlIGEgc3RyaW5nIGNvbnRhaWluZyBhbiBlcnJvciBtZXNzYWdlYCk7XG5cbiB9ZWxzZXtcbmFzc2VydC5mYWlsKFxuIGAke3BhdGh9IGlzIG5vdCBhIHZhbGlkIG1vZHVsZSBkZXNjcmlwdG9yLCBnb3QgJHtxKGFsbGVnZWRNb2R1bGUpfSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTW9kdWxlc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlcz0oYWxsZWdlZE1vZHVsZXMscGF0aCx1cmwpPT57XG5jb25zdCBtb2R1bGVzPU9iamVjdChhbGxlZ2VkTW9kdWxlcyk7XG5hc3NlcnQoXG5hbGxlZ2VkTW9kdWxlcz09PW1vZHVsZXN8fCFBcnJheS5pc0FycmF5KG1vZHVsZXMpLFxuIGBtb2R1bGVzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRNb2R1bGVzKX0gaW4gJHtxKHVybCl9YCk7XG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgT2JqZWN0LmVudHJpZXMobW9kdWxlcykpe1xuYXNzZXJ0TW9kdWxlKHZhbHVlLCBgJHtwYXRofS5tb2R1bGVzWyR7cShrZXkpfV1gLHVybCk7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUGFyc2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0UGFyc2Vycz0oYWxsZWdlZFBhcnNlcnMscGF0aCx1cmwpPT57XG5pZihhbGxlZ2VkUGFyc2Vycz09PXVuZGVmaW5lZCl7XG5yZXR1cm47XG4gfVxuY29uc3QgcGFyc2Vycz1PYmplY3QoYWxsZWdlZFBhcnNlcnMpO1xuYXNzZXJ0KFxuYWxsZWdlZFBhcnNlcnM9PT1wYXJzZXJzJiYhQXJyYXkuaXNBcnJheShwYXJzZXJzKSxcbiBgJHtwYXRofS5wYXJzZXJzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkUGFyc2Vyc30gaW4gJHtxKHVybCl9YCk7XG5cblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyhwYXJzZXJzKSl7XG5hc3NlcnQudHlwZW9mKFxua2V5LFxuJ3N0cmluZycsXG4gYGFsbCBrZXlzIG9mICR7cGF0aH0ucGFyc2VycyBtdXN0IGJlIHN0cmluZ3MsIGdvdCAke2tleX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG52YWx1ZSxcbidzdHJpbmcnLFxuIGAke3BhdGh9LnBhcnNlcnNbJHtxKGtleSl9XSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydChcbm1vZHVsZUxhbmd1YWdlcy5pbmNsdWRlcyh2YWx1ZSksXG4gYCR7cGF0aH0ucGFyc2Vyc1ske3Eoa2V5KX1dIG11c3QgYmUgb25lIG9mICR7cShcbm1vZHVsZUxhbmd1YWdlcylcbiB9LCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRTY29wZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGU9KGFsbGVnZWRTY29wZSxwYXRoLHVybCk9PntcbmNvbnN0IHNjb3BlPU9iamVjdChhbGxlZ2VkU2NvcGUpO1xuYXNzZXJ0KFxuYWxsZWdlZFNjb3BlPT09c2NvcGUmJiFBcnJheS5pc0FycmF5KHNjb3BlKSxcbiBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFNjb3BlfSBpbiAke3EodXJsKX1gKTtcblxuXG5jb25zdHtjb21wYXJ0bWVudCwuLi5leHRyYX09c2NvcGU7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5cbmFzc2VydC50eXBlb2YoXG5jb21wYXJ0bWVudCxcbidzdHJpbmcnLFxuIGAke3BhdGh9LmNvbXBhcnRtZW50IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoY29tcGFydG1lbnQpfSBpbiAke3EodXJsKX1gKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkU2NvcGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRTY29wZXM9KGFsbGVnZWRTY29wZXMscGF0aCx1cmwpPT57XG5pZihhbGxlZ2VkU2NvcGVzPT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCBzY29wZXM9T2JqZWN0KGFsbGVnZWRTY29wZXMpO1xuYXNzZXJ0KFxuYWxsZWdlZFNjb3Blcz09PXNjb3BlcyYmIUFycmF5LmlzQXJyYXkoc2NvcGVzKSxcbiBgJHtwYXRofS5zY29wZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZFNjb3Blcyl9IGluICR7cSh1cmwpfWApO1xuXG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgT2JqZWN0LmVudHJpZXMoc2NvcGVzKSl7XG5hc3NlcnQudHlwZW9mKFxua2V5LFxuJ3N0cmluZycsXG4gYGFsbCBrZXlzIG9mICR7cGF0aH0uc2NvcGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0U2NvcGUodmFsdWUsIGAke3BhdGh9LnNjb3Blc1ske3Eoa2V5KX1dYCx1cmwpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFR5cGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRUeXBlcz0oYWxsZWdlZFR5cGVzLHBhdGgsdXJsKT0+e1xuaWYoYWxsZWdlZFR5cGVzPT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCB0eXBlcz1PYmplY3QoYWxsZWdlZFR5cGVzKTtcbmFzc2VydChcbmFsbGVnZWRUeXBlcz09PXR5cGVzJiYhQXJyYXkuaXNBcnJheSh0eXBlcyksXG4gYCR7cGF0aH0udHlwZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRUeXBlc30gaW4gJHtxKHVybCl9YCk7XG5cblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyh0eXBlcykpe1xuYXNzZXJ0LnR5cGVvZihcbmtleSxcbidzdHJpbmcnLFxuIGBhbGwga2V5cyBvZiAke3BhdGh9LnR5cGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbnZhbHVlLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0udHlwZXNbJHtxKGtleSl9XSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydChcbm1vZHVsZUxhbmd1YWdlcy5pbmNsdWRlcyh2YWx1ZSksXG4gYCR7cGF0aH0udHlwZXNbJHtxKGtleSl9XSBtdXN0IGJlIG9uZSBvZiAke3EoXG5tb2R1bGVMYW5ndWFnZXMpXG4gfSwgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUG9saWN5XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdXG4gKi9cblxuY29uc3QgYXNzZXJ0UG9saWN5PShcbmFsbGVnZWRQb2xpY3ksXG5wYXRoLFxudXJsPSc8dW5rbm93bi1jb21wYXJ0bWVudC1tYXAuanNvbj4nKT0+XG57XG5hc3NlcnRQYWNrYWdlUG9saWN5KGFsbGVnZWRQb2xpY3ksIGAke3BhdGh9LnBvbGljeWAsdXJsKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZENvbXBhcnRtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudD0oYWxsZWdlZENvbXBhcnRtZW50LHBhdGgsdXJsKT0+e1xuY29uc3QgY29tcGFydG1lbnQ9T2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudCk7XG5hc3NlcnQoXG5hbGxlZ2VkQ29tcGFydG1lbnQ9PT1jb21wYXJ0bWVudCYmIUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnQpLFxuIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnR9IGluICR7cSh1cmwpfWApO1xuXG5cbmNvbnN0e1xubG9jYXRpb24sXG5uYW1lLFxubGFiZWwsXG5wYXJzZXJzLFxudHlwZXMsXG5zY29wZXMsXG5tb2R1bGVzLFxucG9saWN5LFxuLi4uZXh0cmF9PVxuY29tcGFydG1lbnQ7XG5cbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cblxuYXNzZXJ0LnR5cGVvZihcbmxvY2F0aW9uLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ubG9jYXRpb24gaW4gJHtxKHVybCl9IG11c3QgYmUgc3RyaW5nLCBnb3QgJHtxKGxvY2F0aW9uKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5uYW1lIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShuYW1lKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbmxhYmVsLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ubGFiZWwgaW4gJHtxKHVybCl9IG11c3QgYmUgc3RyaW5nLCBnb3QgJHtxKGxhYmVsKX1gKTtcblxuXG5hc3NlcnRNb2R1bGVzKG1vZHVsZXMscGF0aCx1cmwpO1xuYXNzZXJ0UGFyc2VycyhwYXJzZXJzLHBhdGgsdXJsKTtcbmFzc2VydFNjb3BlcyhzY29wZXMscGF0aCx1cmwpO1xuYXNzZXJ0VHlwZXModHlwZXMscGF0aCx1cmwpO1xuYXNzZXJ0UG9saWN5KHBvbGljeSxwYXRoLHVybCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRDb21wYXJ0bWVudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRzPShhbGxlZ2VkQ29tcGFydG1lbnRzLHVybCk9PntcbmNvbnN0IGNvbXBhcnRtZW50cz1PYmplY3QoYWxsZWdlZENvbXBhcnRtZW50cyk7XG5hc3NlcnQoXG5hbGxlZ2VkQ29tcGFydG1lbnRzPT09Y29tcGFydG1lbnRzfHwhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudHMpLFxuIGBjb21wYXJ0bWVudHMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZENvbXBhcnRtZW50cyl9IGluICR7cShcbnVybClcbiB9YCk7XG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgT2JqZWN0LmVudHJpZXMoY29tcGFydG1lbnRzKSl7XG5hc3NlcnRDb21wYXJ0bWVudCh2YWx1ZSwgYGNvbXBhcnRtZW50c1ske3Eoa2V5KX1dYCx1cmwpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZEVudHJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydEVudHJ5PShhbGxlZ2VkRW50cnksdXJsKT0+e1xuY29uc3QgZW50cnk9T2JqZWN0KGFsbGVnZWRFbnRyeSk7XG5hc3NlcnQoXG5hbGxlZ2VkRW50cnk9PT1lbnRyeSYmIUFycmF5LmlzQXJyYXkoZW50cnkpLFxuIGBcImVudHJ5XCIgbXVzdCBiZSBhbiBvYmplY3QgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHthbGxlZ2VkRW50cnl9IGluICR7cShcbnVybClcbiB9YCk7XG5cbmNvbnN0e2NvbXBhcnRtZW50LG1vZHVsZSwuLi5leHRyYX09ZW50cnk7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGBcImVudHJ5XCIgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxuY29tcGFydG1lbnQsXG4nc3RyaW5nJyxcbiBgZW50cnkuY29tcGFydG1lbnQgbXVzdCBiZSBhIHN0cmluZyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke2NvbXBhcnRtZW50fSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubW9kdWxlLFxuJ3N0cmluZycsXG4gYGVudHJ5Lm1vZHVsZSBtdXN0IGJlIGEgc3RyaW5nIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7bW9kdWxlfSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRDb21wYXJ0bWVudE1hcFxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBjb21wYXJ0bWVudE1hcCBpcyBYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29tcGFydG1lbnRNYXBEZXNjcmlwdG9yfVxuICovXG5cbmNvbnN0ICAgICAgICBhc3NlcnRDb21wYXJ0bWVudE1hcD0oXG5hbGxlZ2VkQ29tcGFydG1lbnRNYXAsXG51cmw9Jzx1bmtub3duLWNvbXBhcnRtZW50LW1hcC5qc29uPicpPT5cbntcbmNvbnN0IGNvbXBhcnRtZW50TWFwPU9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnRNYXApO1xuYXNzZXJ0KFxuYWxsZWdlZENvbXBhcnRtZW50TWFwPT09Y29tcGFydG1lbnRNYXAmJiFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50TWFwKSxcbiBgQ29tcGFydG1lbnQgbWFwIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnRNYXB9IGluICR7cShcbnVybClcbiB9YCk7XG5cbmNvbnN0e3RhZ3MsZW50cnksY29tcGFydG1lbnRzLC4uLmV4dHJhfT1PYmplY3QoY29tcGFydG1lbnRNYXApO1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgQ29tcGFydG1lbnQgbWFwIG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnRUYWdzKHRhZ3MsdXJsKTtcbmFzc2VydEVudHJ5KGVudHJ5LHVybCk7XG5hc3NlcnRDb21wYXJ0bWVudHMoY29tcGFydG1lbnRzLHVybCk7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvbXBhcnRtZW50TWFwKGFzc2VydENvbXBhcnRtZW50TWFwKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdDb21wYXJlIjpbInN0cmluZ0NvbXBhcmUiXSwicGF0aENvbXBhcmUiOlsicGF0aENvbXBhcmUiXSwiYXNzZXJ0Q29tcGFydG1lbnRNYXAiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZeYDsHwDAAB8AwAAMAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL2V4dGVuc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VFeHRlbnNpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIGBwYXJzZUV4dGVuc2lvbmAgcmV0dXJucyB0aGUgZmlsZSBleHRlbnNpb24gZm9yIHRoZSBnaXZlbiBVUkwsIG9yIGFuIGVtcHR5XG4gKiBzdHJpbmcgaWYgdGhlIHBhdGggaGFzIG5vIGV4dGVuc2lvbi5cbiAqIEV4cG9ydGVkIGZvciB0ZXN0cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBwYXJzZUV4dGVuc2lvbj0obG9jYXRpb24pPT57XG5jb25zdCBsYXN0U2xhc2g9bG9jYXRpb24ubGFzdEluZGV4T2YoJy8nKTtcbmlmKGxhc3RTbGFzaDwwKXtcbnJldHVybicnO1xuIH1cbmNvbnN0IGJhc2U9bG9jYXRpb24uc2xpY2UobGFzdFNsYXNoKzEpO1xuY29uc3QgbGFzdERvdD1iYXNlLmxhc3RJbmRleE9mKCcuJyk7XG5pZihsYXN0RG90PDApe1xucmV0dXJuJyc7XG4gfVxucmV0dXJuIGJhc2Uuc2xpY2UobGFzdERvdCsxKTtcbiB9OyRo4oCNX29uY2UucGFyc2VFeHRlbnNpb24ocGFyc2VFeHRlbnNpb24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhcnNlRXh0ZW5zaW9uIjpbInBhcnNlRXh0ZW5zaW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALDNizTOJwAAzicAADUAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9pbXBvcnQtYXJjaGl2ZS5qc3siaW1wb3J0cyI6WyIuL2NvbXBhcnRtZW50LW1hcC5qcyIsIi4vanNvbi5qcyIsIi4vbGluay5qcyIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9wYXJzZS1ieXRlcy5qcyIsIi4vcGFyc2UtanNvbi5qcyIsIi4vcGFyc2UtcHJlLWNqcy5qcyIsIi4vcGFyc2UtcHJlLW1qcy5qcyIsIi4vcGFyc2UtdGV4dC5qcyIsIi4vcG93ZXJzLmpzIiwiQGVuZG8vemlwIl0sImV4cG9ydHMiOlsiaW1wb3J0QXJjaGl2ZSIsImxvYWRBcmNoaXZlIiwicGFyc2VBcmNoaXZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFppcFJlYWRlcixsaW5rLHBhcnNlclByZUNqcyxwYXJzZXJKc29uLHBhcnNlclRleHQscGFyc2VyQnl0ZXMscGFyc2VyUHJlTWpzLHBhcnNlTG9jYXRlZEpzb24sdW5wYWNrUmVhZFBvd2Vycyxqb2luLGFzc2VydENvbXBhcnRtZW50TWFwOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3ppcFwiLCBbW1wiWmlwUmVhZGVyXCIsIFskaOKAjV9hID0+IChaaXBSZWFkZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9saW5rLmpzXCIsIFtbXCJsaW5rXCIsIFskaOKAjV9hID0+IChsaW5rID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtcHJlLWNqcy5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VyUHJlQ2pzID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtanNvbi5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VySnNvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLXRleHQuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHBhcnNlclRleHQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1ieXRlcy5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VyQnl0ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1wcmUtbWpzLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJQcmVNanMgPSAkaOKAjV9hKV1dXV0sW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsIFskaOKAjV9hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjigI1fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsIFskaOKAjV9hID0+ICh1bnBhY2tSZWFkUG93ZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJqb2luXCIsIFskaOKAjV9hID0+IChqb2luID0gJGjigI1fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtbWFwLmpzXCIsIFtbXCJhc3NlcnRDb21wYXJ0bWVudE1hcFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q29tcGFydG1lbnRNYXAgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgRGVmYXVsdENvbXBhcnRtZW50PUNvbXBhcnRtZW50O1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFBhcnNlckltcGxlbWVudGF0aW9uPn0gKi9cbmNvbnN0IHBhcnNlckZvckxhbmd1YWdlPXtcbidwcmUtY2pzLWpzb24nOnBhcnNlclByZUNqcyxcbidwcmUtbWpzLWpzb24nOnBhcnNlclByZU1qcyxcbmpzb246cGFyc2VySnNvbixcbnRleHQ6cGFyc2VyVGV4dCxcbmJ5dGVzOnBhcnNlckJ5dGVzfTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBlcnJvciB0byB0aHJvdyBvbiBleGVjdXRlXG4gKiBAcmV0dXJucyB7U3RhdGljTW9kdWxlVHlwZX1cbiAqL1xuY29uc3QgcG9zdHBvbmVFcnJvclRvRXhlY3V0ZT0oZXJyb3JNZXNzYWdlKT0+e1xuLyogUmV0dXJuIGEgcGxhY2UtaG9sZGVyIHRoYXQnZCB0aHJvdyBhbiBlcnJvciBpZiBleGVjdXRlZCovXG4vKiBUaGlzIGFsbG93cyBjanMgcGFyc2VyIHRvIG1vcmUgZWFnZXJseSBmaW5kIGNhbGxzIHRvIHJlcXVpcmUqL1xuLyogLSBpZiBwYXJzZXIgaWRlbnRpZmllZCBhIHJlcXVpcmUgY2FsbCB0aGF0J3MgYSBsb2NhbCBmdW5jdGlvbiwgZXhlY3V0ZSB3aWxsIG5ldmVyIGJlIGNhbGxlZCovXG4vKiAtIGlmIGFjdHVhbCByZXF1aXJlZCBtb2R1bGUgaXMgbWlzc2luZywgdGhlIGVycm9yIHdpbGwgaGFwcGVuIGFueXdheSAtIGF0IGV4ZWN1dGlvbiB0aW1lKi9cblxuY29uc3QgcmVjb3JkPWZyZWV6ZSh7XG5pbXBvcnRzOltdLFxuZXhwb3J0czpbXSxcbmV4ZWN1dGU6KCk9PntcbnRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gfX0pO1xuXG5cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXJjaGl2ZUltcG9ydEhvb2tNYWtlclxuICogQHBhcmFtIHtzdHJpbmd9IHBhY2thZ2VMb2NhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHBhY2thZ2VOYW1lXG4gKiBAcmV0dXJucyB7SW1wb3J0SG9va31cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7KHBhdGg6IHN0cmluZykgPT4gVWludDhBcnJheX0gZ2V0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50RGVzY3JpcHRvcj59IGNvbXBhcnRtZW50c1xuICogQHBhcmFtIHtzdHJpbmd9IGFyY2hpdmVMb2NhdGlvblxuICogQHBhcmFtIHtIYXNoRm59IFtjb21wdXRlU2hhNTEyXVxuICogQHBhcmFtIHtDb21wdXRlU291cmNlTG9jYXRpb25Ib29rfSBbY29tcHV0ZVNvdXJjZUxvY2F0aW9uXVxuICogQHJldHVybnMge0FyY2hpdmVJbXBvcnRIb29rTWFrZXJ9XG4gKi9cbmNvbnN0IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyPShcbmdldCxcbmNvbXBhcnRtZW50cyxcbmFyY2hpdmVMb2NhdGlvbixcbmNvbXB1dGVTaGE1MTI9dW5kZWZpbmVkLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uPXVuZGVmaW5lZCk9Plxue1xuLyogcGVyLWFzc2VtYmx5OiovXG4vKiogQHR5cGUge0FyY2hpdmVJbXBvcnRIb29rTWFrZXJ9ICovXG5jb25zdCBtYWtlSW1wb3J0SG9vaz0ocGFja2FnZUxvY2F0aW9uLHBhY2thZ2VOYW1lKT0+e1xuLyogcGVyLWNvbXBhcnRtZW50OiovXG5jb25zdHttb2R1bGVzfT1jb21wYXJ0bWVudHNbcGFja2FnZUxvY2F0aW9uXTtcbi8qKiBAdHlwZSB7SW1wb3J0SG9va30gKi9cbmNvbnN0IGltcG9ydEhvb2s9YXN5bmMobW9kdWxlU3BlY2lmaWVyKT0+e1xuLyogcGVyLW1vZHVsZToqL1xuY29uc3QgbW9kdWxlPW1vZHVsZXNbbW9kdWxlU3BlY2lmaWVyXTtcbmlmKG1vZHVsZT09PXVuZGVmaW5lZCl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYENhbm5vdCBmaW5kIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG5wYWNrYWdlTG9jYXRpb24pXG4gfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWApO1xuXG4gfVxuaWYobW9kdWxlLmRlZmVycmVkRXJyb3IhPT11bmRlZmluZWQpe1xucmV0dXJuIHBvc3Rwb25lRXJyb3JUb0V4ZWN1dGUobW9kdWxlLmRlZmVycmVkRXJyb3IpO1xuIH1cbmlmKG1vZHVsZS5wYXJzZXI9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgcGFyc2UgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbnBhY2thZ2VMb2NhdGlvbilcbiB9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCk7XG5cbiB9XG5pZihwYXJzZXJGb3JMYW5ndWFnZVttb2R1bGUucGFyc2VyXT09PXVuZGVmaW5lZCl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYENhbm5vdCBwYXJzZSAke3EobW9kdWxlLnBhcnNlcil9IG1vZHVsZSAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSBpbiBwYWNrYWdlICR7cShwYWNrYWdlTG9jYXRpb24pfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWApO1xuXG4gfVxuY29uc3R7cGFyc2V9PXBhcnNlckZvckxhbmd1YWdlW21vZHVsZS5wYXJzZXJdO1xuY29uc3QgbW9kdWxlTG9jYXRpb249IGAke3BhY2thZ2VMb2NhdGlvbn0vJHttb2R1bGUubG9jYXRpb259YDtcbmNvbnN0IG1vZHVsZUJ5dGVzPWdldChtb2R1bGVMb2NhdGlvbik7XG5cbmlmKGNvbXB1dGVTaGE1MTIhPT11bmRlZmluZWQmJm1vZHVsZS5zaGE1MTIhPT11bmRlZmluZWQpe1xuY29uc3Qgc2hhNTEyPWNvbXB1dGVTaGE1MTIobW9kdWxlQnl0ZXMpO1xuaWYoc2hhNTEyIT09bW9kdWxlLnNoYTUxMil7XG50aHJvdyBuZXcgRXJyb3IoXG4gYE1vZHVsZSAke3EobW9kdWxlLmxvY2F0aW9uKX0gb2YgcGFja2FnZSAke3EoXG5wYWNrYWdlTG9jYXRpb24pXG4gfSBpbiBhcmNoaXZlICR7cShcbmFyY2hpdmVMb2NhdGlvbilcbiB9IGZhaWxlZCBhIFNIQS01MTIgaW50ZWdyaXR5IGNoZWNrYCk7XG5cbiB9XG4gfVxuXG5sZXQgc291cmNlTG9jYXRpb249IGBmaWxlOi8vLyR7bW9kdWxlTG9jYXRpb259YDtcbmlmKHBhY2thZ2VOYW1lIT09dW5kZWZpbmVkKXtcbmNvbnN0IGJhc2U9cGFja2FnZU5hbWUuc3BsaXQoJy8nKS5zbGljZSgtMSkuam9pbignLycpO1xuc291cmNlTG9jYXRpb249IGAuLi4vJHtqb2luKGJhc2UsbW9kdWxlU3BlY2lmaWVyKX1gO1xuIH1cbmlmKGNvbXB1dGVTb3VyY2VMb2NhdGlvbiE9PXVuZGVmaW5lZCl7XG5zb3VyY2VMb2NhdGlvbj1cbmNvbXB1dGVTb3VyY2VMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sbW9kdWxlU3BlY2lmaWVyKXx8XG5zb3VyY2VMb2NhdGlvbjtcbiB9XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wKi9cbmNvbnN0e3JlY29yZH09YXdhaXQgcGFyc2UoXG5tb2R1bGVCeXRlcyxcbm1vZHVsZVNwZWNpZmllcixcbnNvdXJjZUxvY2F0aW9uLFxucGFja2FnZUxvY2F0aW9uKTtcblxucmV0dXJue3JlY29yZCxzcGVjaWZpZXI6bW9kdWxlU3BlY2lmaWVyfTtcbiB9O1xucmV0dXJuIGltcG9ydEhvb2s7XG4gfTtcbnJldHVybiBtYWtlSW1wb3J0SG9vaztcbiB9O1xuXG5jb25zdCBtYWtlRmVhdXhNb2R1bGVFeHBvcnRzTmFtZXNwYWNlPShDb21wYXJ0bWVudCk9Pntcbi8qIEB0cy1pZ25vcmUgVW5jbGVhciBhdCB0aW1lIG9mIHdyaXRpbmcgd2h5IENvbXBhcnRtZW50IHR5cGUgaXMgbm90Ki9cbi8qIGNvbnN0cnVjdGlibGUuKi9cbmNvbnN0IGNvbXBhcnRtZW50PW5ldyBDb21wYXJ0bWVudChcbnt9LFxue30sXG57XG5yZXNvbHZlSG9vaygpe1xucmV0dXJuJy4nO1xuIH0sXG5pbXBvcnRIb29rKCl7XG5yZXR1cm57XG5pbXBvcnRzOltdLFxuZXhlY3V0ZSgpeyB9fTtcblxuIH19KTtcblxuXG5yZXR1cm4gY29tcGFydG1lbnQubW9kdWxlKCcuJyk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGFyY2hpdmVCeXRlc1xuICogQHBhcmFtIHtzdHJpbmd9IFthcmNoaXZlTG9jYXRpb25dXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZXhwZWN0ZWRTaGE1MTJdXG4gKiBAcGFyYW0ge0hhc2hGbn0gW29wdGlvbnMuY29tcHV0ZVNoYTUxMl1cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFtvcHRpb25zLm1vZHVsZXNdXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50fSBbb3B0aW9ucy5Db21wYXJ0bWVudF1cbiAqIEBwYXJhbSB7Q29tcHV0ZVNvdXJjZUxvY2F0aW9uSG9va30gW29wdGlvbnMuY29tcHV0ZVNvdXJjZUxvY2F0aW9uXVxuICogQHJldHVybnMge1Byb21pc2U8QXBwbGljYXRpb24+fVxuICovXG5jb25zdCAgICAgICAgcGFyc2VBcmNoaXZlPWFzeW5jKFxuYXJjaGl2ZUJ5dGVzLFxuYXJjaGl2ZUxvY2F0aW9uPSc8dW5rbm93bj4nLFxub3B0aW9ucz17fSk9Plxue1xuY29uc3R7XG5jb21wdXRlU2hhNTEyPXVuZGVmaW5lZCxcbmV4cGVjdGVkU2hhNTEyPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbj11bmRlZmluZWQsXG5Db21wYXJ0bWVudD1EZWZhdWx0Q29tcGFydG1lbnQsXG5tb2R1bGVzPXVuZGVmaW5lZH09XG5vcHRpb25zO1xuXG5jb25zdCBhcmNoaXZlPW5ldyBaaXBSZWFkZXIoYXJjaGl2ZUJ5dGVzLHtuYW1lOmFyY2hpdmVMb2NhdGlvbn0pO1xuXG4vKiBUcmFjayBhbGwgbW9kdWxlcyB0aGF0IGdldCBsb2FkZWQsIGFsbCBmaWxlcyB0aGF0IGFyZSB1c2VkLiovXG5jb25zdCB1bnNlZW49bmV3IFNldChhcmNoaXZlLmZpbGVzLmtleXMoKSk7XG51bnNlZW4uc2l6ZT49Mnx8XG5GYWlsIGBBcmNoaXZlIGZhaWxlZCBzYW5pdHkgY2hlY2s6IHNob3VsZCBjb250YWluIGF0IGxlYXN0IGEgY29tcGFydG1lbnQgbWFwIGZpbGUgYW5kIG9uZSBtb2R1bGUgZmlsZSBpbiAke3EoXG5hcmNoaXZlTG9jYXRpb24pXG4gfWA7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqL1xuY29uc3QgZ2V0PShwYXRoKT0+e1xudW5zZWVuLmRlbGV0ZShwYXRoKTtcbnJldHVybiBhcmNoaXZlLnJlYWQocGF0aCk7XG4gfTtcblxuY29uc3QgY29tcGFydG1lbnRNYXBCeXRlcz1nZXQoJ2NvbXBhcnRtZW50LW1hcC5qc29uJyk7XG5cbmxldCBzaGE1MTI7XG5pZihjb21wdXRlU2hhNTEyIT09dW5kZWZpbmVkKXtcbnNoYTUxMj1jb21wdXRlU2hhNTEyKGNvbXBhcnRtZW50TWFwQnl0ZXMpO1xuIH1cbmlmKGV4cGVjdGVkU2hhNTEyIT09dW5kZWZpbmVkKXtcbmlmKHNoYTUxMj09PXVuZGVmaW5lZCl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYENhbm5vdCB2ZXJpZnkgZXhwZWN0ZWRTaGE1MTIgd2l0aG91dCBhbHNvIHByb3ZpZGluZyBjb21wdXRlU2hhNTEyLCBmb3IgYXJjaGl2ZSAke2FyY2hpdmVMb2NhdGlvbn1gKTtcblxuIH1cbmlmKHNoYTUxMiE9PWV4cGVjdGVkU2hhNTEyKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQXJjaGl2ZSBjb21wYXJ0bWVudCBtYXAgZmFpbGVkIGEgU0hBLTUxMiBpbnRlZ3JpdHkgY2hlY2ssIGV4cGVjdGVkICR7ZXhwZWN0ZWRTaGE1MTJ9LCBnb3QgJHtzaGE1MTJ9LCBmb3IgYXJjaGl2ZSAke2FyY2hpdmVMb2NhdGlvbn1gKTtcblxuIH1cbiB9XG5jb25zdCBjb21wYXJ0bWVudE1hcFRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGNvbXBhcnRtZW50TWFwQnl0ZXMpO1xuY29uc3QgY29tcGFydG1lbnRNYXA9cGFyc2VMb2NhdGVkSnNvbihcbmNvbXBhcnRtZW50TWFwVGV4dCxcbidjb21wYXJ0bWVudC1tYXAuanNvbicpO1xuXG5hc3NlcnRDb21wYXJ0bWVudE1hcChjb21wYXJ0bWVudE1hcCxhcmNoaXZlTG9jYXRpb24pO1xuXG5jb25zdHtcbmNvbXBhcnRtZW50cyxcbmVudHJ5Onttb2R1bGU6bW9kdWxlU3BlY2lmaWVyfX09XG5jb21wYXJ0bWVudE1hcDtcblxuLyogQXJjaGl2ZSBpbnRlZ3JpdHkgY2hlY2tzOiBlbnN1cmUgZXZlcnkgbW9kdWxlIGlzIHByZS1sb2FkZWQgc28gaXRzIGhhc2gqL1xuLyogZ2V0cyBjaGVja2VkLCBhbmQgZW5zdXJlIHRoYXQgZXZlcnkgZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyB1c2VkLCBhbmQqL1xuLyogdGhlcmVmb3JlIGNoZWNrZWQuKi9cbmlmKGNvbXB1dGVTaGE1MTIhPT11bmRlZmluZWQpe1xuY29uc3QgbWFrZUltcG9ydEhvb2s9bWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIoXG5nZXQsXG5jb21wYXJ0bWVudHMsXG5hcmNoaXZlTG9jYXRpb24sXG5jb21wdXRlU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uKTtcblxuLyogQSB3ZWFrbmVzcyBvZiB0aGUgY3VycmVudCBDb21wYXJ0bWVudCBkZXNpZ24gaXMgdGhhdCB0aGUgYG1vZHVsZXNgIG1hcCovXG4vKiBtdXN0IGJlIGdpdmVuIGEgbW9kdWxlIG5hbWVzcGFjZSBvYmplY3QgdGhhdCBwYXNzZXMgYSBicmFuZCBjaGVjay4qL1xuLyogV2UgZG9uJ3QgaGF2ZSBtb2R1bGUgaW5zdGFuY2VzIGZvciB0aGUgcHJlbG9hZCBwaGFzZSwgc28gd2Ugc3VwcGx5IGZha2UqL1xuLyogbmFtZXNwYWNlcy4qL1xuY29uc3R7Y29tcGFydG1lbnQscGVuZGluZ0pvYnNQcm9taXNlfT1saW5rKGNvbXBhcnRtZW50TWFwLHtcbm1ha2VJbXBvcnRIb29rLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVzOk9iamVjdC5mcm9tRW50cmllcyhcbk9iamVjdC5rZXlzKG1vZHVsZXN8fHt9KS5tYXAoKHNwZWNpZmllcik9PntcbnJldHVybltzcGVjaWZpZXIsbWFrZUZlYXV4TW9kdWxlRXhwb3J0c05hbWVzcGFjZShDb21wYXJ0bWVudCldO1xuIH0pKSxcblxuQ29tcGFydG1lbnR9KTtcblxuXG5hd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbmF3YWl0IGNvbXBhcnRtZW50LmxvYWQobW9kdWxlU3BlY2lmaWVyKTtcbnVuc2Vlbi5zaXplPT09MHx8XG5GYWlsIGBBcmNoaXZlIGNvbnRhaW5zIGV4dHJhbmVvdXMgZmlsZXM6ICR7cShbLi4udW5zZWVuXSl9IGluICR7cShcbmFyY2hpdmVMb2NhdGlvbilcbiB9YDtcbiB9XG5cbi8qKiBAdHlwZSB7RXhlY3V0ZUZufSAqL1xuY29uc3QgZXhlY3V0ZT1hc3luYyhvcHRpb25zKT0+e1xuY29uc3R7Z2xvYmFscyxtb2R1bGVzLHRyYW5zZm9ybXMsX19zaGltVHJhbnNmb3Jtc19fLENvbXBhcnRtZW50fT1cbm9wdGlvbnN8fHt9O1xuY29uc3QgbWFrZUltcG9ydEhvb2s9bWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIoXG5nZXQsXG5jb21wYXJ0bWVudHMsXG5hcmNoaXZlTG9jYXRpb24sXG5jb21wdXRlU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uKTtcblxuY29uc3R7Y29tcGFydG1lbnQscGVuZGluZ0pvYnNQcm9taXNlfT1saW5rKGNvbXBhcnRtZW50TWFwLHtcbm1ha2VJbXBvcnRIb29rLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5nbG9iYWxzLFxubW9kdWxlcyxcbnRyYW5zZm9ybXMsXG5fX3NoaW1UcmFuc2Zvcm1zX18sXG5Db21wYXJ0bWVudH0pO1xuXG5cbmF3YWl0IHBlbmRpbmdKb2JzUHJvbWlzZTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRvdC1ub3RhdGlvbiovXG5yZXR1cm4gY29tcGFydG1lbnRbJ2ltcG9ydCddKG1vZHVsZVNwZWNpZmllcik7XG4gfTtcblxucmV0dXJue2ltcG9ydDpleGVjdXRlLHNoYTUxMn07XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlYWRGbiB8IFJlYWRQb3dlcnN9IHJlYWRQb3dlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlTG9jYXRpb25cbiAqIEBwYXJhbSB7TG9hZEFyY2hpdmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtQcm9taXNlPEFwcGxpY2F0aW9uPn1cbiAqLyRo4oCNX29uY2UucGFyc2VBcmNoaXZlKHBhcnNlQXJjaGl2ZSk7XG5jb25zdCAgICAgICAgbG9hZEFyY2hpdmU9YXN5bmMoXG5yZWFkUG93ZXJzLFxuYXJjaGl2ZUxvY2F0aW9uLFxub3B0aW9ucz17fSk9Plxue1xuY29uc3R7cmVhZCxjb21wdXRlU2hhNTEyfT11bnBhY2tSZWFkUG93ZXJzKHJlYWRQb3dlcnMpO1xuY29uc3R7ZXhwZWN0ZWRTaGE1MTIsY29tcHV0ZVNvdXJjZUxvY2F0aW9uLG1vZHVsZXN9PW9wdGlvbnM7XG5jb25zdCBhcmNoaXZlQnl0ZXM9YXdhaXQgcmVhZChhcmNoaXZlTG9jYXRpb24pO1xucmV0dXJuIHBhcnNlQXJjaGl2ZShhcmNoaXZlQnl0ZXMsYXJjaGl2ZUxvY2F0aW9uLHtcbmNvbXB1dGVTaGE1MTIsXG5leHBlY3RlZFNoYTUxMixcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbm1vZHVsZXN9KTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWFkRm4gfCBSZWFkUG93ZXJzfSByZWFkUG93ZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZUxvY2F0aW9uXG4gKiBAcGFyYW0ge0V4ZWN1dGVPcHRpb25zICYgTG9hZEFyY2hpdmVPcHRpb25zfSBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fVxuICovJGjigI1fb25jZS5sb2FkQXJjaGl2ZShsb2FkQXJjaGl2ZSk7XG5jb25zdCAgICAgICAgaW1wb3J0QXJjaGl2ZT1hc3luYyhyZWFkUG93ZXJzLGFyY2hpdmVMb2NhdGlvbixvcHRpb25zKT0+e1xuY29uc3QgYXJjaGl2ZT1hd2FpdCBsb2FkQXJjaGl2ZShyZWFkUG93ZXJzLGFyY2hpdmVMb2NhdGlvbixvcHRpb25zKTtcbnJldHVybiBhcmNoaXZlLmltcG9ydChvcHRpb25zKTtcbiB9OyRo4oCNX29uY2UuaW1wb3J0QXJjaGl2ZShpbXBvcnRBcmNoaXZlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADFQABzSQMAAEkDAAArAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvanNvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VMb2NhdGVkSnNvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogUGFyc2VzIEpTT04gYW5kLCBpZiBuZWNlc3NhcnksIHRocm93cyBleGNlcHRpb25zIHRoYXQgaW5jbHVkZSB0aGUgbG9jYXRpb25cbiAqIG9mIHRoZSBvZmZlbmRpbmcgZmlsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAqL1xuY29uc3QgICAgICAgIHBhcnNlTG9jYXRlZEpzb249KHNvdXJjZSxsb2NhdGlvbik9PntcbnRyeXtcbnJldHVybiBKU09OLnBhcnNlKHNvdXJjZSk7XG4gfWNhdGNoKGVycm9yKXtcbmlmKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3Ipe1xudGhyb3cgbmV3IFN5bnRheEVycm9yKCBgQ2Fubm90IHBhcnNlIEpTT04gZnJvbSAke2xvY2F0aW9ufSwgJHtlcnJvcn1gKTtcbiB9XG50aHJvdyBlcnJvcjtcbiB9XG4gfTskaOKAjV9vbmNlLnBhcnNlTG9jYXRlZEpzb24ocGFyc2VMb2NhdGVkSnNvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFyc2VMb2NhdGVkSnNvbiI6WyJwYXJzZUxvY2F0ZWRKc29uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALqueymAOwAAgDsAACsAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9saW5rLmpzeyJpbXBvcnRzIjpbIi4vZXh0ZW5zaW9uLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImFzc2VtYmxlIiwibGluayIsIm1hcFBhcnNlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcmVzb2x2ZSxwYXJzZUV4dGVuc2lvbixlbmZvcmNlTW9kdWxlUG9saWN5LGF0dGVudWF0ZU1vZHVsZUhvb2ssQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQsZGlhZ25vc2VNaXNzaW5nQ29tcGFydG1lbnRFcnJvcixhdHRlbnVhdGVHbG9iYWxzLG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXI7JGjigI1faW1wb3J0cyhbW1wiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNcIiwgW1tcInJlc29sdmVcIiwgWyRo4oCNX2EgPT4gKHJlc29sdmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9leHRlbnNpb24uanNcIiwgW1tcInBhcnNlRXh0ZW5zaW9uXCIsIFskaOKAjV9hID0+IChwYXJzZUV4dGVuc2lvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLCBbJGjigI1fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRo4oCNX2EpXV0sW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLCBbJGjigI1fYSA9PiAoYXR0ZW51YXRlTW9kdWxlSG9vayA9ICRo4oCNX2EpXV0sW1wiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRcIiwgWyRo4oCNX2EgPT4gKEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UID0gJGjigI1fYSldXSxbXCJkaWFnbm9zZU1pc3NpbmdDb21wYXJ0bWVudEVycm9yXCIsIFskaOKAjV9hID0+IChkaWFnbm9zZU1pc3NpbmdDb21wYXJ0bWVudEVycm9yID0gJGjigI1fYSldXSxbXCJhdHRlbnVhdGVHbG9iYWxzXCIsIFskaOKAjV9hID0+IChhdHRlbnVhdGVHbG9iYWxzID0gJGjigI1fYSldXSxbXCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyXCIsIFskaOKAjV9hID0+IChtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZW50cmllcyxmcm9tRW50cmllc309T2JqZWN0O1xuY29uc3R7aGFzT3duUHJvcGVydHl9PU9iamVjdC5wcm90b3R5cGU7XG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e2FsbFNldHRsZWR9PVByb21pc2U7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHsoaXRlcmFibGU6IEl0ZXJhYmxlPEVSZWY8VD4+KSA9PiBQcm9taXNlPEFycmF5PFByb21pc2VTZXR0bGVkUmVzdWx0PFQ+Pj59XG4gKi9cbmNvbnN0IHByb21pc2VBbGxTZXR0bGVkPWFsbFNldHRsZWQuYmluZChQcm9taXNlKTtcblxuY29uc3QgaW5lcnRTdGF0aWNNb2R1bGVSZWNvcmQ9e1xuaW1wb3J0czpbXSxcbmV4cG9ydHM6W10sXG5leGVjdXRlKCl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYEFzc2VydGlvbiBmYWlsZWQ6IGNvbXBhcnRtZW50IGdyYXBocyBidWlsdCBmb3IgYXJjaGl2ZXMgY2Fubm90IGJlIGluaXRpYWxpemVkYCk7XG5cbiB9fTtcblxuXG5jb25zdCBpbmVydE1vZHVsZU5hbWVzcGFjZT1uZXcgQ29tcGFydG1lbnQoXG57fSxcbnt9LFxue1xucmVzb2x2ZUhvb2soKXtcbnJldHVybicnO1xuIH0sXG4gICAgICBhc3luYyBpbXBvcnRIb29rKCl7XG5yZXR1cm4gaW5lcnRTdGF0aWNNb2R1bGVSZWNvcmQ7XG4gfX0pLlxuXG5tb2R1bGUoJycpO1xuXG5jb25zdCBkZWZhdWx0Q29tcGFydG1lbnQ9Q29tcGFydG1lbnQ7XG5cbi8qIHEsIGFzIGluIHF1b3RlLCBmb3Igc3RyaW5ncyBpbiBlcnJvciBtZXNzYWdlcy4qL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBoYXM9KG9iamVjdCxrZXkpPT5hcHBseShoYXNPd25Qcm9wZXJ0eSxvYmplY3QsW2tleV0pO1xuXG4vKipcbiAqIERlY2lkZSBpZiBleHRlbnNpb24gaXMgY2xlYXJseSBpbmRpY2F0aW5nIGEgcGFyc2VyL2xhbmd1YWdlIGZvciBhIGZpbGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXh0ZW5zaW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlPShleHRlbnNpb24pPT5leHRlbnNpb24hPT0nanMnO1xuXG4vKipcbiAqIGBtYWtlRXh0ZW5zaW9uUGFyc2VyYCBwcm9kdWNlcyBhIGBwYXJzZXJgIHRoYXQgcGFyc2VzIHRoZSBjb250ZW50IG9mIGFcbiAqIG1vZHVsZSBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIGxhbmd1YWdlLCBnaXZlbiB0aGUgZXh0ZW5zaW9uXG4gKiBvZiB0aGUgbW9kdWxlIHNwZWNpZmllciBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbnRhaW5pbmcgY29tcGFydG1lbnQuXG4gKiBXZSBkbyBub3QgeWV0IHN1cHBvcnQgaW1wb3J0IGFzc2VydGlvbnMgYW5kIHdlIGRvIG5vdCBoYXZlIGEgbWVjaGFuaXNtXG4gKiBmb3IgdmFsaWRhdGluZyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBtb2R1bGUgY29udGVudCBhZ2FpbnN0IHRoZVxuICogbGFuZ3VhZ2UgaW1wbGllZCBieSB0aGUgZXh0ZW5zaW9uIG9yIGZpbGUgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGxhbmd1YWdlRm9yRXh0ZW5zaW9uIC0gbWFwcyBhIGZpbGUgZXh0ZW5zaW9uXG4gKiB0byB0aGUgY29ycmVzcG9uZGluZyBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIgLSBJbiBhIHJhcmUgY2FzZSxcbiAqIHRoZSB0eXBlIG9mIGEgbW9kdWxlIGlzIGltcGxpZWQgYnkgcGFja2FnZS5qc29uIGFuZCBzaG91bGQgbm90IGJlIGluZmVycmVkXG4gKiBmcm9tIGl0cyBleHRlbnNpb24uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFBhcnNlckltcGxlbWVudGF0aW9uPn0gcGFyc2VyRm9yTGFuZ3VhZ2VcbiAqIEBwYXJhbSB7TW9kdWxlVHJhbnNmb3Jtc30gbW9kdWxlVHJhbnNmb3Jtc1xuICogQHJldHVybnMge1BhcnNlRm59XG4gKi9cbmNvbnN0IG1ha2VFeHRlbnNpb25QYXJzZXI9KFxubGFuZ3VhZ2VGb3JFeHRlbnNpb24sXG5sYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbnBhcnNlckZvckxhbmd1YWdlLFxubW9kdWxlVHJhbnNmb3Jtcyk9Plxue1xucmV0dXJuIGFzeW5jKGJ5dGVzLHNwZWNpZmllcixsb2NhdGlvbixwYWNrYWdlTG9jYXRpb24sb3B0aW9ucyk9PntcbmxldCBsYW5ndWFnZTtcbmNvbnN0IGV4dGVuc2lvbj1wYXJzZUV4dGVuc2lvbihsb2NhdGlvbik7XG5cbmlmKFxuIWV4dGVuc2lvbkltcGxpZXNMYW5ndWFnZShleHRlbnNpb24pJiZcbmhhcyhsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixzcGVjaWZpZXIpKVxue1xubGFuZ3VhZ2U9bGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXJbc3BlY2lmaWVyXTtcbiB9ZWxzZXtcbmxhbmd1YWdlPWxhbmd1YWdlRm9yRXh0ZW5zaW9uW2V4dGVuc2lvbl18fGV4dGVuc2lvbjtcbiB9XG5cbmlmKGhhcyhtb2R1bGVUcmFuc2Zvcm1zLGxhbmd1YWdlKSl7XG4oe2J5dGVzLHBhcnNlcjpsYW5ndWFnZX09YXdhaXQgbW9kdWxlVHJhbnNmb3Jtc1tsYW5ndWFnZV0oXG5ieXRlcyxcbnNwZWNpZmllcixcbmxvY2F0aW9uLFxucGFja2FnZUxvY2F0aW9uKSk7XG5cbiB9XG5cbmlmKCFoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsbGFuZ3VhZ2UpKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IHBhcnNlIG1vZHVsZSAke3NwZWNpZmllcn0gYXQgJHtsb2NhdGlvbn0sIG5vIHBhcnNlciBjb25maWd1cmVkIGZvciB0aGUgbGFuZ3VhZ2UgJHtsYW5ndWFnZX1gKTtcblxuIH1cbmNvbnN0e3BhcnNlfT1wYXJzZXJGb3JMYW5ndWFnZVtsYW5ndWFnZV07XG5yZXR1cm4gcGFyc2UoYnl0ZXMsc3BlY2lmaWVyLGxvY2F0aW9uLHBhY2thZ2VMb2NhdGlvbixvcHRpb25zKTtcbiB9O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBMYW5ndWFnZT59IGxhbmd1YWdlRm9yRXh0ZW5zaW9uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyIC0gSW4gYSByYXJlIGNhc2UsIHRoZSB0eXBlIG9mIGEgbW9kdWxlXG4gKiBpcyBpbXBsaWVkIGJ5IHBhY2thZ2UuanNvbiBhbmQgc2hvdWxkIG5vdCBiZSBpbmZlcnJlZCBmcm9tIGl0cyBleHRlbnNpb24uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFBhcnNlckltcGxlbWVudGF0aW9uPn0gcGFyc2VyRm9yTGFuZ3VhZ2VcbiAqIEBwYXJhbSB7TW9kdWxlVHJhbnNmb3Jtc30gbW9kdWxlVHJhbnNmb3Jtc1xuICogQHJldHVybnMge1BhcnNlRm59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBQYXJzZXJzPShcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxubGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG5wYXJzZXJGb3JMYW5ndWFnZSxcbm1vZHVsZVRyYW5zZm9ybXM9e30pPT5cbntcbmNvbnN0IGxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcz1bXTtcbmNvbnN0IHByb2JsZW1zPVtdO1xuZm9yKGNvbnN0W2V4dGVuc2lvbixsYW5ndWFnZV1vZiBlbnRyaWVzKGxhbmd1YWdlRm9yRXh0ZW5zaW9uKSl7XG5pZihoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsbGFuZ3VhZ2UpKXtcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcy5wdXNoKFtleHRlbnNpb24sbGFuZ3VhZ2VdKTtcbiB9ZWxzZXtcbnByb2JsZW1zLnB1c2goIGAke3EobGFuZ3VhZ2UpfSBmb3IgZXh0ZW5zaW9uICR7cShleHRlbnNpb24pfWApO1xuIH1cbiB9XG5pZihwcm9ibGVtcy5sZW5ndGg+MCl7XG50aHJvdyBuZXcgRXJyb3IoIGBObyBwYXJzZXIgYXZhaWxhYmxlIGZvciBsYW5ndWFnZTogJHtwcm9ibGVtcy5qb2luKCcsICcpfWApO1xuIH1cbnJldHVybiBtYWtlRXh0ZW5zaW9uUGFyc2VyKFxuZnJvbUVudHJpZXMobGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzKSxcbmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVUcmFuc2Zvcm1zKTtcblxuIH07XG5cbi8qKlxuICogRm9yIGEgZnVsbCwgYWJzb2x1dGUgbW9kdWxlIHNwZWNpZmllciBsaWtlIFwiZGVwZW5kZW5jeVwiLFxuICogcHJvZHVjZSB0aGUgbW9kdWxlIHNwZWNpZmllciBpbiB0aGUgZGVwZW5kZW5jeSwgbGlrZSBcIi5cIi5cbiAqIEZvciBhIGRlZXBlciBwYXRoIGxpa2UgXCJAb3JnL2RlcC9hdXhcIiBhbmQgYSBwcmVmaXggbGlrZSBcIkBvcmcvZGVwXCIsIHByb2R1Y2VcbiAqIFwiLi9hdXhcIi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlU3BlY2lmaWVyXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqLyRo4oCNX29uY2UubWFwUGFyc2VycyhtYXBQYXJzZXJzKTtcbmNvbnN0IHRyaW1Nb2R1bGVTcGVjaWZpZXJQcmVmaXg9KG1vZHVsZVNwZWNpZmllcixwcmVmaXgpPT57XG5pZihtb2R1bGVTcGVjaWZpZXI9PT1wcmVmaXgpe1xucmV0dXJuJy4nO1xuIH1cbmlmKG1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCBgJHtwcmVmaXh9L2ApKXtcbnJldHVybiBgLi8ke21vZHVsZVNwZWNpZmllci5zbGljZShwcmVmaXgubGVuZ3RoKzEpfWA7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuXG4vKipcbiAqIGBtYWtlTW9kdWxlTWFwSG9va2AgZ2VuZXJhdGVzIGEgYG1vZHVsZU1hcEhvb2tgIGZvciB0aGUgYENvbXBhcnRtZW50YFxuICogY29uc3RydWN0b3IsIHN1aXRhYmxlIGZvciBOb2RlLmpzIHN0eWxlIHBhY2thZ2VzIHdoZXJlIGFueSBtb2R1bGUgaW4gdGhlXG4gKiBwYWNrYWdlIG1pZ2h0IGJlIGltcG9ydGVkLlxuICogU2luY2Ugc2VhcmNoaW5nIGZvciBhbGwgb2YgdGhlc2UgbW9kdWxlcyB1cCBmcm9udCBpcyBlaXRoZXIgbmVlZGxlc3NseVxuICogY29zdGx5IChvbiBhIGZpbGUgc3lzdGVtKSBvciBpbXBvc3NpYmxlIChmcm9tIGEgd2ViIHNlcnZpY2UpLCB3ZVxuICogbGV0IHRoZSBpbXBvcnQgZ3JhcGggZ3VpZGUgb3VyIHNlYXJjaC5cbiAqIEFueSBtb2R1bGUgc3BlY2lmaWVyIHdpdGggYW4gYWJzb2x1dGUgcHJlZml4IHNob3VsZCBiZSBjYXB0dXJlZCBieVxuICogdGhlIGBtb2R1bGVNYXBgIG9yIGBtb2R1bGVNYXBIb29rYC5cbiAqXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50RGVzY3JpcHRvcn0gY29tcGFydG1lbnREZXNjcmlwdG9yXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50Pn0gY29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcGFydG1lbnROYW1lXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1vZHVsZURlc2NyaXB0b3I+fSBtb2R1bGVEZXNjcmlwdG9yc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNb2R1bGVEZXNjcmlwdG9yPn0gc2NvcGVEZXNjcmlwdG9yc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBleGl0TW9kdWxlc1xuICogQHBhcmFtIHtEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IGF0dGVudWF0b3JzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFyY2hpdmVPbmx5XG4gKiBAcmV0dXJucyB7TW9kdWxlTWFwSG9vayB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgbWFrZU1vZHVsZU1hcEhvb2s9KFxuY29tcGFydG1lbnREZXNjcmlwdG9yLFxuY29tcGFydG1lbnRzLFxuY29tcGFydG1lbnROYW1lLFxubW9kdWxlRGVzY3JpcHRvcnMsXG5zY29wZURlc2NyaXB0b3JzLFxuZXhpdE1vZHVsZXMsXG5hdHRlbnVhdG9ycyxcbmFyY2hpdmVPbmx5KT0+XG57XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVTcGVjaWZpZXJcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBvYmplY3QgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1vZHVsZU1hcEhvb2s9KG1vZHVsZVNwZWNpZmllcik9PntcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5yZXRhaW5lZD10cnVlO1xuXG5jb25zdCBtb2R1bGVEZXNjcmlwdG9yPW1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl07XG5pZihtb2R1bGVEZXNjcmlwdG9yIT09dW5kZWZpbmVkKXtcbi8qIFwiZm9yZWlnbkNvbXBhcnRtZW50TmFtZVwiIHJlZmVycyB0byB0aGUgY29tcGFydG1lbnQgd2hpY2gqL1xuLyogbWF5IGRpZmZlciBmcm9tIHRoZSBjdXJyZW50IGNvbXBhcnRtZW50Ki9cbmNvbnN0e1xuY29tcGFydG1lbnQ6Zm9yZWlnbkNvbXBhcnRtZW50TmFtZT1jb21wYXJ0bWVudE5hbWUsXG5tb2R1bGU6Zm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbmV4aXR9PVxubW9kdWxlRGVzY3JpcHRvcjtcbmlmKGV4aXQhPT11bmRlZmluZWQpe1xuZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsY29tcGFydG1lbnREZXNjcmlwdG9yLHtcbmV4aXQ6dHJ1ZX0pO1xuXG5jb25zdCBtb2R1bGU9ZXhpdE1vZHVsZXNbZXhpdF07XG5pZihtb2R1bGU9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgaW1wb3J0IG1pc3NpbmcgZXh0ZXJuYWwgbW9kdWxlICR7cShcbmV4aXQpXG4gfSwgbWF5IGJlIG1pc3NpbmcgZnJvbSAke2NvbXBhcnRtZW50TmFtZX0gcGFja2FnZS5qc29uYCk7XG5cbiB9XG5pZihhcmNoaXZlT25seSl7XG5yZXR1cm4gaW5lcnRNb2R1bGVOYW1lc3BhY2U7XG4gfWVsc2V7XG5yZXR1cm4gYXR0ZW51YXRlTW9kdWxlSG9vayhcbmV4aXQsXG5tb2R1bGUsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuYXR0ZW51YXRvcnMpO1xuXG4gfVxuIH1cbmlmKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIhPT11bmRlZmluZWQpe1xuaWYoIW1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpKXtcbi8qIGFyY2hpdmUgZ29lcyB0aHJvdWdoIGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIgZm9yIGxvY2FsIG1vZHVsZXMgdG9vKi9cbmVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLGNvbXBhcnRtZW50RGVzY3JpcHRvcix7XG5leGl0OmZhbHNlfSk7XG5cbiB9XG5cbmNvbnN0IGZvcmVpZ25Db21wYXJ0bWVudD1jb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG5pZihmb3JlaWduQ29tcGFydG1lbnQ9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgaW1wb3J0IGZyb20gbWlzc2luZyBjb21wYXJ0bWVudCAke3EoXG5mb3JlaWduQ29tcGFydG1lbnROYW1lKVxuIH0ke2RpYWdub3NlTWlzc2luZ0NvbXBhcnRtZW50RXJyb3Ioe1xubW9kdWxlU3BlY2lmaWVyLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLFxuZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbmZvcmVpZ25Db21wYXJ0bWVudE5hbWV9KVxuIH1gKTtcblxuIH1cbnJldHVybiBmb3JlaWduQ29tcGFydG1lbnQubW9kdWxlKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIpO1xuIH1cbiB9ZWxzZSBpZihoYXMoZXhpdE1vZHVsZXMsbW9kdWxlU3BlY2lmaWVyKSl7XG5lbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllcixjb21wYXJ0bWVudERlc2NyaXB0b3Ise1xuZXhpdDp0cnVlfSk7XG5cblxuLyogV2hlbiBsaW5raW5nIG9mZiB0aGUgZmlsZXN5c3RlbSBhcyB3aXRoIGBpbXBvcnRMb2NhdGlvbmAsKi9cbi8qIHRoZXJlIGlzbid0IGEgbW9kdWxlIGRlc2NyaXB0b3IgZm9yIGV2ZXJ5IG1vZHVsZS4qL1xubW9kdWxlRGVzY3JpcHRvcnNbbW9kdWxlU3BlY2lmaWVyXT17ZXhpdDptb2R1bGVTcGVjaWZpZXJ9O1xuaWYoYXJjaGl2ZU9ubHkpe1xucmV0dXJuIGluZXJ0TW9kdWxlTmFtZXNwYWNlO1xuIH1lbHNle1xucmV0dXJuIGF0dGVudWF0ZU1vZHVsZUhvb2soXG5tb2R1bGVTcGVjaWZpZXIsXG5leGl0TW9kdWxlc1ttb2R1bGVTcGVjaWZpZXJdLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbmF0dGVudWF0b3JzKTtcblxuIH1cbiB9XG5cbi8qIFNlYXJjaCBmb3IgYSBzY29wZSB0aGF0IHNoYXJlcyBhIHByZWZpeCB3aXRoIHRoZSByZXF1ZXN0ZWQgbW9kdWxlKi9cbi8qIHNwZWNpZmllci4qL1xuLyogVGhpcyBtaWdodCBiZSBiZXR0ZXIgd2l0aCBhIHRyaWUsIGJ1dCBvbmx5IGEgYmVuY2htYXJrIG9uIHJlYWwtd29ybGQqL1xuLyogZGF0YSB3b3VsZCB0ZWxsIHVzIHdoZXRoZXIgdGhlIGFkZGl0aW9uYWwgY29tcGxleGl0eSB3b3VsZCB0cmFuc2xhdGUgdG8qL1xuLyogYmV0dGVyIHBlcmZvcm1hbmNlLCBzbyB0aGlzIGlzIGxlZnQgcmVhZGFibGUgYW5kIHByZXN1bWVkIHNsb3cgZm9yIG5vdy4qL1xuZm9yKGNvbnN0W3Njb3BlUHJlZml4LHNjb3BlRGVzY3JpcHRvcl1vZiBlbnRyaWVzKHNjb3BlRGVzY3JpcHRvcnMpKXtcbmNvbnN0IGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXI9dHJpbU1vZHVsZVNwZWNpZmllclByZWZpeChcbm1vZHVsZVNwZWNpZmllcixcbnNjb3BlUHJlZml4KTtcblxuXG5pZihmb3JlaWduTW9kdWxlU3BlY2lmaWVyIT09dW5kZWZpbmVkKXtcbmNvbnN0e2NvbXBhcnRtZW50OmZvcmVpZ25Db21wYXJ0bWVudE5hbWV9PXNjb3BlRGVzY3JpcHRvcjtcbmlmKGZvcmVpZ25Db21wYXJ0bWVudE5hbWU9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgaW1wb3J0IGZyb20gc2NvcGUgJHtzY29wZVByZWZpeH0gZHVlIHRvIG1pc3NpbmcgXCJjb21wYXJ0bWVudFwiIHByb3BlcnR5YCk7XG5cbiB9XG5jb25zdCBmb3JlaWduQ29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW2ZvcmVpZ25Db21wYXJ0bWVudE5hbWVdO1xuaWYoZm9yZWlnbkNvbXBhcnRtZW50PT09dW5kZWZpbmVkKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGltcG9ydCBmcm9tIG1pc3NpbmcgY29tcGFydG1lbnQgJHtxKFxuZm9yZWlnbkNvbXBhcnRtZW50TmFtZSlcbiB9JHtkaWFnbm9zZU1pc3NpbmdDb21wYXJ0bWVudEVycm9yKHtcbm1vZHVsZVNwZWNpZmllcixcbmNvbXBhcnRtZW50RGVzY3JpcHRvcixcbmZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIsXG5mb3JlaWduQ29tcGFydG1lbnROYW1lfSlcbiB9YCk7XG5cbiB9XG5cbi8qIERlc3BpdGUgYWxsIG5vbi1leGl0IG1vZHVsZXMgbm90IGFsbG93ZWQgYnkgcG9saWN5IGJlaW5nIGRyb3BwZWQqL1xuLyogd2hpbGUgYnVpbGRpbmcgdGhlIGdyYXBoLCB0aGlzIGNoZWNrIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG1vZHVsZSovXG4vKiBpcyB3cml0dGVuIGJhY2sgdG8gdGhlIGNvbXBhcnRtZW50IG1hcCBiZWxvdy4qL1xuZW5mb3JjZU1vZHVsZVBvbGljeShzY29wZVByZWZpeCxjb21wYXJ0bWVudERlc2NyaXB0b3Ise1xuZXhpdDpmYWxzZX0pO1xuXG4vKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgd2VpcmQuKi9cbi8qIEluZm9ybWF0aW9uIGlzIGZsb3dpbmcgYmFja3dhcmQuKi9cbi8qIFRoaXMgbW9kdWxlTWFwSG9vayB3cml0ZXMgYmFjayB0byB0aGUgYG1vZHVsZXNgIGRlc2NyaXB0b3IsIGZyb20gdGhlKi9cbi8qIG9yaWdpbmFsIGNvbXBhcnRtZW50IG1hcC4qL1xuLyogU28gdGhlIGNvbXBhcnRtZW50IG1hcCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY29tcGFydG1lbnQqL1xuLyogYXNzZW1ibHksIGNhbiB0aGVuIGJlIGNhcHR1cmVkIGluIGFuIGFyY2hpdmUsIG9idmlhdGluZyB0aGUgbmVlZCBmb3IqL1xuLyogYSBtb2R1bGVNYXBIb29rIHdoZW4gd2UgYXNzZW1ibGUgY29tcGFydG1lbnRzIGZyb20gdGhlIHJlc3VsdGluZyovXG4vKiBhcmNoaXZlLiovXG5tb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdPXtcbmNvbXBhcnRtZW50OmZvcmVpZ25Db21wYXJ0bWVudE5hbWUsXG5tb2R1bGU6Zm9yZWlnbk1vZHVsZVNwZWNpZmllcn07XG5cbnJldHVybiBmb3JlaWduQ29tcGFydG1lbnQubW9kdWxlKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIpO1xuIH1cbiB9XG5cbi8qIE5vIGVudHJ5IGluIHRoZSBtb2R1bGUgbWFwLiovXG4vKiBDb21wYXJ0bWVudHMgd2lsbCBmYWxsIHRocm91Z2ggdG8gdGhlaXIgYGltcG9ydEhvb2tgLiovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07XG5cbnJldHVybiBtb2R1bGVNYXBIb29rO1xuIH07XG5cbi8qKlxuICogQXNzZW1ibGUgYSBEQUcgb2YgY29tcGFydG1lbnRzIGFzIGRlY2xhcmVkIGluIGEgY29tcGFydG1lbnQgbWFwIHN0YXJ0aW5nIGF0XG4gKiB0aGUgbmFtZWQgY29tcGFydG1lbnQgYW5kIGJ1aWxkaW5nIGFsbCBjb21wYXJ0bWVudHMgdGhhdCBpdCBkZXBlbmRzIHVwb24sXG4gKiByZWN1cnNpdmVseSB0aHJlYWRpbmcgdGhlIG1vZHVsZXMgZXhwb3J0ZWQgYnkgb25lIGNvbXBhcnRtZW50IGludG8gdGhlXG4gKiBjb21wYXJ0bWVudCB0aGF0IGltcG9ydHMgdGhlbS5cbiAqIFJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIGNvbXBhcnRtZW50IERBRy5cbiAqIERvZXMgbm90IGxvYWQgb3IgZXhlY3V0ZSBhbnkgbW9kdWxlcy5cbiAqIFVzZXMgbWFrZUltcG9ydEhvb2sgd2l0aCB0aGUgZ2l2ZW4gXCJsb2NhdGlvblwiIHN0cmluZyBvZiBlYWNoIGNvbXBhcnRtZW50IGluXG4gKiB0aGUgREFHLlxuICogUGFzc2VzIHRoZSBnaXZlbiBnbG9iYWxzIGFuZCBleHRlcm5hbCBtb2R1bGVzIGludG8gdGhlIHJvb3QgY29tcGFydG1lbnRcbiAqIG9ubHkuXG4gKlxuICogQHBhcmFtIHtDb21wYXJ0bWVudE1hcERlc2NyaXB0b3J9IGNvbXBhcnRtZW50TWFwXG4gKiBAcGFyYW0ge0xpbmtPcHRpb25zfSBvcHRpb25zXG4gKi9cbmNvbnN0ICAgICAgICBsaW5rPShcbntlbnRyeSxjb21wYXJ0bWVudHM6Y29tcGFydG1lbnREZXNjcmlwdG9yc30sXG57XG5tYWtlSW1wb3J0SG9vayxcbnBhcnNlckZvckxhbmd1YWdlLFxuZ2xvYmFscz17fSxcbnRyYW5zZm9ybXM9W10sXG5tb2R1bGVUcmFuc2Zvcm1zPXt9LFxuX19zaGltVHJhbnNmb3Jtc19fPVtdLFxubW9kdWxlczpleGl0TW9kdWxlcz17fSxcbmFyY2hpdmVPbmx5PWZhbHNlLFxuQ29tcGFydG1lbnQ9ZGVmYXVsdENvbXBhcnRtZW50fSk9PlxuXG57XG5jb25zdHtjb21wYXJ0bWVudDplbnRyeUNvbXBhcnRtZW50TmFtZX09ZW50cnk7XG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgQ29tcGFydG1lbnQ+fSAqL1xuY29uc3QgY29tcGFydG1lbnRzPU9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGF0dGVudWF0b3JTcGVjaWZpZXJcbiAqL1xuY29uc3QgYXR0ZW51YXRvcnM9bWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcihcbmNvbXBhcnRtZW50cyxcbmNvbXBhcnRtZW50RGVzY3JpcHRvcnMpO1xuXG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmVzb2x2ZUhvb2s+fSAqL1xuY29uc3QgcmVzb2x2ZXJzPU9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmNvbnN0IHBlbmRpbmdKb2JzPVtdO1xuXG5mb3IoY29uc3RbY29tcGFydG1lbnROYW1lLGNvbXBhcnRtZW50RGVzY3JpcHRvcl1vZiBlbnRyaWVzKFxuY29tcGFydG1lbnREZXNjcmlwdG9ycykpXG57XG5jb25zdHtcbmxvY2F0aW9uLFxubmFtZSxcbm1vZHVsZXM9T2JqZWN0LmNyZWF0ZShudWxsKSxcbnBhcnNlcnM6bGFuZ3VhZ2VGb3JFeHRlbnNpb249T2JqZWN0LmNyZWF0ZShudWxsKSxcbnR5cGVzOmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyPU9iamVjdC5jcmVhdGUobnVsbCksXG5zY29wZXM9T2JqZWN0LmNyZWF0ZShudWxsKX09XG5jb21wYXJ0bWVudERlc2NyaXB0b3I7XG5cbi8qIENhcHR1cmUgdGhlIGRlZmF1bHQuKi9cbi8qIFRoZSBgbW9kdWxlTWFwSG9va2Agd3JpdGVzIGJhY2sgdG8gdGhlIGNvbXBhcnRtZW50IG1hcC4qL1xuY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXM9bW9kdWxlcztcblxuY29uc3QgcGFyc2U9bWFwUGFyc2Vycyhcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxubGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG5wYXJzZXJGb3JMYW5ndWFnZSxcbm1vZHVsZVRyYW5zZm9ybXMpO1xuXG4vKiogQHR5cGUge1Nob3VsZERlZmVyRXJyb3J9ICovXG5jb25zdCBzaG91bGREZWZlckVycm9yPShsYW5ndWFnZSk9PntcbmlmKGxhbmd1YWdlJiZoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsbGFuZ3VhZ2UpKXtcbnJldHVybiBwYXJzZXJGb3JMYW5ndWFnZVtsYW5ndWFnZV0uaGV1cmlzdGljSW1wb3J0cztcbiB9ZWxzZXtcbi8qIElmIGxhbmd1YWdlIGlzIHVuZGVmaW5lZCBvciB0aGVyZSdzIG5vIHBhcnNlciwgdGhlIGVycm9yIHdlIGNvdWxkIGNvbnNpZGVyIGRlZmVycmluZyBpcyBzdXJlbHkgcmVsYXRlZCB0byovXG4vKiB0aGF0LiBOb3RoaW5nIHRvIHRocm93IGhlcmUuKi9cbnJldHVybiBmYWxzZTtcbiB9XG4gfTtcblxuY29uc3QgaW1wb3J0SG9vaz1tYWtlSW1wb3J0SG9vayhcbmxvY2F0aW9uLFxubmFtZSxcbnBhcnNlLFxuc2hvdWxkRGVmZXJFcnJvcixcbmNvbXBhcnRtZW50cyk7XG5cbmNvbnN0IG1vZHVsZU1hcEhvb2s9bWFrZU1vZHVsZU1hcEhvb2soXG5jb21wYXJ0bWVudERlc2NyaXB0b3IsXG5jb21wYXJ0bWVudHMsXG5jb21wYXJ0bWVudE5hbWUsXG5tb2R1bGVzLFxuc2NvcGVzLFxuZXhpdE1vZHVsZXMsXG5hdHRlbnVhdG9ycyxcbmFyY2hpdmVPbmx5KTtcblxuY29uc3QgcmVzb2x2ZUhvb2s9cmVzb2x2ZTtcbnJlc29sdmVyc1tjb21wYXJ0bWVudE5hbWVdPXJlc29sdmU7XG5cbmNvbnN0IGNvbXBhcnRtZW50PW5ldyBDb21wYXJ0bWVudChPYmplY3QuY3JlYXRlKG51bGwpLHVuZGVmaW5lZCx7XG5yZXNvbHZlSG9vayxcbmltcG9ydEhvb2ssXG5tb2R1bGVNYXBIb29rLFxudHJhbnNmb3Jtcyxcbl9fc2hpbVRyYW5zZm9ybXNfXyxcbm5hbWU6bG9jYXRpb259KTtcblxuXG5pZighYXJjaGl2ZU9ubHkpe1xuYXR0ZW51YXRlR2xvYmFscyhcbmNvbXBhcnRtZW50Lmdsb2JhbFRoaXMsXG5nbG9iYWxzLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbmF0dGVudWF0b3JzLFxucGVuZGluZ0pvYnMsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSk7XG5cbiB9XG5cbmNvbXBhcnRtZW50c1tjb21wYXJ0bWVudE5hbWVdPWNvbXBhcnRtZW50O1xuIH1cblxuY29uc3QgY29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW2VudHJ5Q29tcGFydG1lbnROYW1lXTtcbmlmKGNvbXBhcnRtZW50PT09dW5kZWZpbmVkKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGFzc2VtYmxlIGNvbXBhcnRtZW50IGdyYXBoIGJlY2F1c2UgdGhlIHJvb3QgY29tcGFydG1lbnQgbmFtZWQgJHtxKFxuZW50cnlDb21wYXJ0bWVudE5hbWUpXG4gfSBpcyBtaXNzaW5nIGZyb20gdGhlIGNvbXBhcnRtZW50IG1hcGApO1xuXG4gfVxuY29uc3QgYXR0ZW51YXRvcnNDb21wYXJ0bWVudD1jb21wYXJ0bWVudHNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdO1xuXG5yZXR1cm57XG5jb21wYXJ0bWVudCxcbmNvbXBhcnRtZW50cyxcbnJlc29sdmVycyxcbmF0dGVudWF0b3JzQ29tcGFydG1lbnQsXG5wZW5kaW5nSm9ic1Byb21pc2U6cHJvbWlzZUFsbFNldHRsZWQocGVuZGluZ0pvYnMpLnRoZW4oXG4vKiogQHBhcmFtIHtQcm9taXNlU2V0dGxlZFJlc3VsdDx1bmtub3duPltdfSByZXN1bHRzICovKHJlc3VsdHMpPT57XG5jb25zdCBlcnJvcnM9cmVzdWx0cy5cbmZpbHRlcigocmVzdWx0KT0+cmVzdWx0LnN0YXR1cz09PSdyZWplY3RlZCcpLlxubWFwKFxuLyoqIEBwYXJhbSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0fSByZXN1bHQgKi8ocmVzdWx0KT0+XG5yZXN1bHQucmVhc29uKTtcblxuaWYoZXJyb3JzLmxlbmd0aD4wKXtcbnRocm93IG5ldyBFcnJvcihcbiBgR2xvYmFscyBhdHRlbnVhdGlvbiBlcnJvcnM6ICR7ZXJyb3JzLlxubWFwKChlcnJvcik9PmVycm9yLm1lc3NhZ2UpLlxuam9pbignLCAnKSB9YCk7XG5cbiB9XG4gfSl9O1xuXG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnRNYXBEZXNjcmlwdG9yfSBjb21wYXJ0bWVudE1hcFxuICogQHBhcmFtIHtMaW5rT3B0aW9uc30gb3B0aW9uc1xuICovJGjigI1fb25jZS5saW5rKGxpbmspO1xuY29uc3QgICAgICAgIGFzc2VtYmxlPShjb21wYXJ0bWVudE1hcCxvcHRpb25zKT0+XG5saW5rKGNvbXBhcnRtZW50TWFwLG9wdGlvbnMpLmNvbXBhcnRtZW50OyRo4oCNX29uY2UuYXNzZW1ibGUoYXNzZW1ibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcFBhcnNlcnMiOlsibWFwUGFyc2VycyJdLCJsaW5rIjpbImxpbmsiXSwiYXNzZW1ibGUiOlsiYXNzZW1ibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOmXnMeQUAADkFAAAPAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiam9pbiIsInJlbGF0aXZpemUiLCJyZXNvbHZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyogcSwgYXMgaW4gcXVvdGUsIGZvciBlcnJvciBtZXNzYWdlcy4qL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBBZHZhbmNlcyBhIHBhcnRpYWwgbW9kdWxlIHNwZWNpZmllciBzb2x1dGlvbiBieSBmb2xsb3dpbmcgdGhlIHBhdGhcbiAqIGNvbXBvbmVudHMgaW4gdGhlIGdpdmVuIHByb2JsZW0uXG4gKiBUaGUgcHJvYmxlbSBtYXkgbm90IHByb2R1Y2UgYSBwYXRoIHRoYXQgZXNjYXBlcyB0aGUgc29sdXRpb24sIHRoYXQgaXMsIHRoZVxuICogcHJvYmxlbSBtYXkgbm90IHRyYXZlcnNlIHVwIGZyb20gYW4gZW1wdHkgc29sdXRpb24uXG4gKiBgU29sdmVgIHJldHVybnMgZmFsc2UgaWYgdGhlIHByb2JsZW0gYXR0ZW1wdHMgdG8gZXNjYXBlLlxuICogQWR2YW5kaW5nIGEgcGFydGlhbCBzb2x1dGlvbiBpcyB0aGUgY29yZSBvZiBgcmVzb2x2ZWAsIGBqb2luYCwgYW5kXG4gKiBgcmVsYXRpdml6ZWAsIHdoaWNoIGhhdmUgZGlmZmVyZW50IGludmFyaWFudHMuXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzb2x1dGlvbiAtIGZ1bGx5IHJlc29sdmVkIHBhdGggY29tcG9uZW50cywgaW5jbHVkaW5nXG4gKiBhbnkgZnJvbSBhIHByaW9yIHBhdGggcmVzb2x1dGlvbiBpbml0aWFsbHkuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHByb2JsZW0gLSBwYXJ0aWFsbHkgcmVzb2x2ZWQgcGF0aCBjb21wb25lbnRzLCB0aGF0XG4gKiBpcywgaW5jbHVkaW5nICcuJyBhbmQgJy4uJyBjb21wb25lbnRzLlxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIHNvbHZlciB0ZXJtaW5hdGVkIGVhcmx5IGJlY2F1c2Ugb2YgYVxuICogbm9uc2Vuc2ljYWwgYXR0ZW1wdCB0byB0cmF2ZXJzZSBhYm92ZSB0aGUgcm9vdCBkaXJlY3RvcnkuXG4gKi9cbmNvbnN0IHNvbHZlPShzb2x1dGlvbixwcm9ibGVtKT0+e1xuZm9yKGNvbnN0IHBhcnQgb2YgcHJvYmxlbSl7XG5pZihwYXJ0PT09Jy4nfHxwYXJ0PT09Jycpe1xuLyogbm8tb3AqL1xuIH1lbHNlIGlmKHBhcnQ9PT0nLi4nKXtcbmlmKHNvbHV0aW9uLmxlbmd0aD09PTApe1xucmV0dXJuIGZhbHNlO1xuIH1cbnNvbHV0aW9uLnBvcCgpO1xuIH1lbHNle1xuc29sdXRpb24ucHVzaChwYXJ0KTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBgUmVzb2x2ZWAgY29tcHV0ZXMgdGhlIGZ1bGwgbW9kdWxlIHNwZWNpZmllciBmb3IgYSBnaXZlbiBpbXBvcnRlZCBtb2R1bGUgc3BlY2lmaWVyXG4gKiByZWxhdGl2ZSB0byB0aGUgcmVmZXJyZXIgbW9kdWxlIHNwZWNpZmllci5cbiAqIEluIE5vZGUuanMgY29tcGFydG1lbnRzLCB0aGUgcmVmZXJyZXIgbXVzdCBiZSBhbiBpbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyXG4gKiBpbiB0aGUgY29udGV4dCBvZiBhIGNvbXBhcnRtZW50LCBhbmQgYWxsIGludGVybmFsIG1vZHVsZSBzcGVjaWZpZXJzIGJlZ2luXG4gKiB3aXRoIGEgXCIuXCIgcGF0aCBjb21wb25lbnQuXG4gKiBUaGUgcmVmZXJlbnQgbWF5IGJlIGVpdGhlciBpbnRlcm5hbCBvciBleHRlcm5hbC5cbiAqIEluIE5vZGUuanMsIGZ1bGx5IHJlc29sdmVkIHBhdGhzIGFyZSB2YWxpZCBtb2R1bGUgc3BlY2lmaWVycywgYnV0IHRoZXNlXG4gKiBwYXRocyB0aGF0IGJlZ2luIHdpdGggLyBhcmUgZGlzYWxsb3dlZCBhcyB0aGV5IGNvdWxkIGJlIHVzZWQgdG8gZGVmZWF0XG4gKiBjb21wYXJ0bWVudCBjb250YWlubWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlYyAtIGEgcGF0aCB0byByZXNvbHZlLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZmVycmVyIC0gdGhlIGZ1bGx5IHJlc29sdmVkIHBhdGggb2YgcmVmZXJyZXIgbW9kdWxlLlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGZ1bGx5IHJlc29sdmVkIHBhdGguXG4gKi9cbmNvbnN0ICAgICAgICByZXNvbHZlPShzcGVjLHJlZmVycmVyKT0+e1xuc3BlYz1TdHJpbmcoc3BlY3x8JycpO1xucmVmZXJyZXI9U3RyaW5nKHJlZmVycmVyfHwnJyk7XG5cbmlmKHNwZWMuc3RhcnRzV2l0aCgnLycpKXtcbnRocm93IG5ldyBFcnJvciggYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBiZWdpbiB3aXRoIFwiL1wiYCk7XG4gfVxuaWYoIXJlZmVycmVyLnN0YXJ0c1dpdGgoJy4vJykpe1xudGhyb3cgbmV3IEVycm9yKCBgTW9kdWxlIHJlZmVycmVyICR7cShyZWZlcnJlcil9IG11c3QgYmVnaW4gd2l0aCBcIi4vXCJgKTtcbiB9XG5cbmNvbnN0IHNwZWNQYXJ0cz1zcGVjLnNwbGl0KCcvJyk7XG5jb25zdCBzb2x1dGlvbj1bXTtcbmNvbnN0IHByb2JsZW09W107XG5pZihzcGVjUGFydHNbMF09PT0nLid8fHNwZWNQYXJ0c1swXT09PScuLicpe1xuY29uc3QgcmVmZXJyZXJQYXJ0cz1yZWZlcnJlci5zcGxpdCgnLycpO1xucHJvYmxlbS5wdXNoKC4uLnJlZmVycmVyUGFydHMpO1xucHJvYmxlbS5wb3AoKTtcbnNvbHV0aW9uLnB1c2goJy4nKTtcbiB9XG5wcm9ibGVtLnB1c2goLi4uc3BlY1BhcnRzKTtcblxuaWYoIXNvbHZlKHNvbHV0aW9uLHByb2JsZW0pKXtcbnRocm93IG5ldyBFcnJvcihcbiBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IHZpYSByZWZlcnJlciAke3EoXG5yZWZlcnJlcilcbiB9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCk7XG5cbiB9XG5cbnJldHVybiBzb2x1dGlvbi5qb2luKCcvJyk7XG4gfTtcblxuLyoqXG4gKiBUbyBjb25zdHJ1Y3QgYSBtb2R1bGUgbWFwIGZyb20gYSBub2RlX21vZHVsZXMgcGFja2FnZSwgaW50ZXItcGFja2FnZSBsaW5rYWdlXG4gKiByZXF1aXJlcyBjb25uZWN0aW5nIGEgZnVsbCBiYXNlIG1vZHVsZSBzcGVjaWZpZXIgbGlrZSBcImRlcGVuZGVuY3ktcGFja2FnZVwiXG4gKiB0byB0aGUgb3RoZXIgcGFja2FnZSdzIGZ1bGwgaW50ZXJuYWwgbW9kdWxlIHNwZWNpZmllciBsaWtlIFwiLlwiIG9yXG4gKiBcIi4vdXRpbGl0eVwiLCB0byBmb3JtIGEgbG9jYWwgZnVsbCBtb2R1bGUgc3BlY2lmaWVyIGxpa2UgXCJkZXBlbmRlbmN5LXBhY2thZ2VcIlxuICogb3IgXCJkZXBlbmRlbmN5LXBhY2thZ2UvdXRpbGl0eVwiLlxuICogVGhpcyB0eXBlIG9mIGpvaW4gbWF5IGFzc2VydCB0aGF0IHRoZSBiYXNlIGlzIGFic29sdXRlIGFuZCB0aGUgcmVmZXJyZW50IGlzXG4gKiByZWxhdGl2ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZSAtIHRoZSBmdWxseSByZXNvbHZlZCBwYXRoIG9mIGEgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWMgLSB0aGUgcGFydGlhbGx5IHJlc29sdmVkIHBhdGggb2YgYW5vdGhlciBtb2R1bGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgZnVsbHkgcmVzb2x2ZWQgcGF0aCBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZS5cbiAqLyRo4oCNX29uY2UucmVzb2x2ZShyZXNvbHZlKTtcbmNvbnN0ICAgICAgICBqb2luPShiYXNlLHNwZWMpPT57XG5zcGVjPVN0cmluZyhzcGVjfHwnJyk7XG5iYXNlPVN0cmluZyhiYXNlfHwnJyk7XG5cbmNvbnN0IHNwZWNQYXJ0cz1zcGVjLnNwbGl0KCcvJyk7XG5jb25zdCBiYXNlUGFydHM9YmFzZS5zcGxpdCgnLycpO1xuXG5pZihzcGVjUGFydHMubGVuZ3RoPjEmJnNwZWNQYXJ0c1swXT09PScnKXtcbnRocm93IG5ldyBFcnJvciggYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBzdGFydCB3aXRoIFwiL1wiYCk7XG4gfVxuaWYoYmFzZVBhcnRzWzBdPT09Jy4nfHxiYXNlUGFydHNbMF09PT0nLi4nKXtcbnRocm93IG5ldyBFcnJvciggYEV4dGVybmFsIG1vZHVsZSBzcGVjaWZpZXIgJHtxKGJhc2UpfSBtdXN0IGJlIGFic29sdXRlYCk7XG4gfVxuaWYoc3BlY1BhcnRzWzBdIT09Jy4nKXtcbnRocm93IG5ldyBFcnJvciggYEludGVybmFsIG1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IGJlIHJlbGF0aXZlYCk7XG4gfVxuXG5jb25zdCBzb2x1dGlvbj1bXTtcbmlmKCFzb2x2ZShzb2x1dGlvbixzcGVjUGFydHMpKXtcbnRocm93IG5ldyBFcnJvcihcbiBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IHZpYSBiYXNlICR7cShcbmJhc2UpXG4gfSBtdXN0IG5vdCByZWZlciB0byBhIG1vZHVsZSBvdXRzaWRlIG9mIHRoZSBiYXNlYCk7XG5cbiB9XG5cbnJldHVybltiYXNlLC4uLnNvbHV0aW9uXS5qb2luKCcvJyk7XG4gfTtcblxuLyoqXG4gKiBSZWxhdGl2aXplIHR1cm5zIGFic29sdXRlIGlkZW50aWZpZXJzIGludG8gcmVsYXRpdmUgaWRlbnRpZmllcnMuXG4gKiBJbiBwYWNrYWdlLmpzb24sIGludGVybmFsIG1vZHVsZSBpZGVudGlmaWVycyBjYW4gYmUgZWl0aGVyIHJlbGF0aXZlIG9yXG4gKiBhYnNvbHV0ZSwgYnV0IGNvbXBhcnRtZW50cyBiYWNrZWQgYnkgbm9kZV9tb2R1bGVzIGFsd2F5cyB1c2UgcmVsYXRpdmUgbW9kdWxlXG4gKiBzcGVjaWZpZXJzIGZvciBpbnRlcm5hbCBsaW5rYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjIC0gYSBtb2R1bGUgc3BlY2lmaWVyIHRoYXQgb2YgYSBsb2NhbCBtb2R1bGUsIHRoYXQgbWlnaHRcbiAqIGJlIGVycm9uZW91c2x5IGZyYW1lZCB3aXRob3V0IGFuIGluaXRpYWwgJy4nIHBhdGggY29tcG9uZW50LlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGlkZW1wb3RlbnQgbW9kdWxlIHNwZWNpZmllciwgZW5zdXJlZCB0byBiZWdpbiB3aXRoXG4gKiAnLicuXG4gKi8kaOKAjV9vbmNlLmpvaW4oam9pbik7XG5jb25zdCAgICAgICAgcmVsYXRpdml6ZT0oc3BlYyk9PntcbnNwZWM9U3RyaW5nKHNwZWN8fCcnKTtcblxuY29uc3Qgc29sdXRpb249W107XG5pZighc29sdmUoc29sdXRpb24sc3BlYy5zcGxpdCgnLycpKSl7XG50aHJvdyBFcnJvcihcbiBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCk7XG5cbiB9XG5cbnJldHVyblsnLicsLi4uc29sdXRpb25dLmpvaW4oJy8nKTtcbiB9OyRo4oCNX29uY2UucmVsYXRpdml6ZShyZWxhdGl2aXplKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZXNvbHZlIjpbInJlc29sdmUiXSwiam9pbiI6WyJqb2luIl0sInJlbGF0aXZpemUiOlsicmVsYXRpdml6ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAAYO3abgUAAG4FAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcGFyc2UtYnl0ZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZUJ5dGVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBiZSByZWxpZWQgdXBvbiB0byBkZWFsIHdpdGggdGhlIG51YW5jZXMgb2YgUmVhZG9ubHksIHNvIHdlXG4gKiBib3Jyb3cgdGhlIHBhc3MtdGhyb3VnaCB0eXBlIGRlZmluaXRpb24gb2YgaGFyZGVuIGhlcmUuXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VCeXRlcz1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbl9sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24pPT5cbntcbi8qIFNuYXBzaG90IEFycmF5QnVmZmVyKi9cbmNvbnN0IGJ1ZmZlcj1uZXcgQXJyYXlCdWZmZXIoYnl0ZXMubGVuZ3RoKTtcbmNvbnN0IGJ5dGVzVmlldz1uZXcgVWludDhBcnJheShidWZmZXIpO1xuYnl0ZXNWaWV3LnNldChieXRlcyk7XG5cbi8qKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn0gKi9cbmNvbnN0IGltcG9ydHM9ZnJlZXplKFtdKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZXhwb3J0c1xuICovXG5jb25zdCBleGVjdXRlPShleHBvcnRzKT0+e1xuZXhwb3J0cy5kZWZhdWx0PWJ1ZmZlcjtcbiB9O1xuXG5yZXR1cm57XG5wYXJzZXI6J2J5dGVzJyxcbmJ5dGVzLFxucmVjb3JkOmZyZWV6ZSh7XG5pbXBvcnRzLFxuZXhwb3J0czpmcmVlemUoWydkZWZhdWx0J10pLFxuZXhlY3V0ZTpmcmVlemUoZXhlY3V0ZSl9KX07XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VCeXRlcyhwYXJzZUJ5dGVzKTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VCeXRlcyxcbmhldXJpc3RpY0ltcG9ydHM6ZmFsc2V9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlQnl0ZXMiOlsicGFyc2VCeXRlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1SpZBThYAAE4WAABGAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZ2V0TW9kdWxlUGF0aHMiLCJ3cmFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZEZufSBSZWFkRm4gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlYWRQb3dlcnN9IFJlYWRQb3dlcnMgKi9cblxuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHtmcmVlemUsa2V5cyxjcmVhdGUsaGFzT3duUHJvcGVydHksZGVmaW5lUHJvcGVydHl9PU9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaGFzPShvYmplY3Qsa2V5KT0+YXBwbHkoaGFzT3duUHJvcGVydHksb2JqZWN0LFtrZXldKTtcblxuY29uc3Qgbm9UcmFpbGluZ1NsYXNoPShwYXRoKT0+e1xuY29uc3QgbD1wYXRoLmxlbmd0aC0xO1xucmV0dXJuIHBhdGhbbF09PT0nXFxcXCd8fHBhdGhbbF09PT0nLyc/cGF0aC5zbGljZSgwLC0xKTpwYXRoO1xuIH07XG5cbi8qKlxuICogR2VuZXJhdGVzIHZhbHVlcyBmb3IgX19maWxlbmFtZSBhbmQgX19kaXJuYW1lIGZyb20gbG9jYXRpb25cbiAqXG4gKiBAcGFyYW0ge1JlYWRQb3dlcnMgfCBSZWFkRm4gfCB1bmRlZmluZWR9IHJlYWRQb3dlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICogQHJldHVybnMge3tcbiAqICAgZmlsZW5hbWU6c3RyaW5nfG51bGwsXG4gKiAgIGRpcm5hbWU6IHN0cmluZ3xudWxsXG4gKiB9fVxuICovXG5jb25zdCAgICAgICAgZ2V0TW9kdWxlUGF0aHM9KHJlYWRQb3dlcnMsbG9jYXRpb24pPT57XG5pZihcbnJlYWRQb3dlcnMmJlxudHlwZW9mIHJlYWRQb3dlcnMhPT0nZnVuY3Rpb24nJiZcbnJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aClcbntcbmxldCBmaWxlbmFtZT1sb2NhdGlvbjtcbmxldCBkaXJuYW1lO1xudHJ5e1xuZGlybmFtZT1uZXcgVVJMKCcuLycsZmlsZW5hbWUpLmhyZWY7XG4gfWNhdGNoKF8pe1xucmV0dXJue1xuZmlsZW5hbWU6bnVsbCxcbmRpcm5hbWU6bnVsbH07XG5cbiB9XG5cbmZpbGVuYW1lPXJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aChmaWxlbmFtZSkudG9TdHJpbmcoKTtcbmRpcm5hbWU9bm9UcmFpbGluZ1NsYXNoKHJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aChkaXJuYW1lKS50b1N0cmluZygpKTtcblxucmV0dXJue1xuZmlsZW5hbWUsXG5kaXJuYW1lfTtcblxuIH1lbHNle1xucmV0dXJue1xuZmlsZW5hbWU6bnVsbCxcbmRpcm5hbWU6bnVsbH07XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBNb2R1bGVFbnZpcm9ubWVudFJlY29yZCB3cmFwcGVyXG4gKiBDcmVhdGVzIHNoYXJlZCBleHBvcnQgcHJvY2Vzc2luZyBwcmltaXRpdmVzIHRvIGJlIHVzZWQgYm90aCBMb2NhdGlvbiBhbmQgQXJjaGl2ZSB1c2VjYXNlcyBvZiBjanNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gaW5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbi5tb2R1bGVFbnZpcm9ubWVudFJlY29yZFxuICogQHBhcmFtIHtDb21wYXJ0bWVudH0gaW4uY29tcGFydG1lbnRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gaW4ucmVzb2x2ZWRJbXBvcnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gaW4ubG9jYXRpb25cbiAqIEBwYXJhbSB7UmVhZEZufFJlYWRQb3dlcnN9IGluLnJlYWRQb3dlcnNcbiAqIEByZXR1cm5zIHt7XG4gKiAgIG1vZHVsZTogeyBleHBvcnRzOiBhbnkgfSxcbiAqICAgbW9kdWxlRXhwb3J0czogYW55LFxuICogICBhZnRlckV4ZWN1dGU6IEZ1bmN0aW9uLFxuICogICByZXF1aXJlOiBGdW5jdGlvbixcbiAqIH19XG4gKi8kaOKAjV9vbmNlLmdldE1vZHVsZVBhdGhzKGdldE1vZHVsZVBhdGhzKTtcbmNvbnN0ICAgICAgICB3cmFwPSh7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZCxcbmNvbXBhcnRtZW50LFxucmVzb2x2ZWRJbXBvcnRzLFxubG9jYXRpb24sXG5yZWFkUG93ZXJzfSk9Plxue1xuLyogVGhpcyBpbml0aWFsIGRlZmF1bHQgdmFsdWUgbWFrZXMgdGhpbmdzIGxpa2UgZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eSgpIHdvcmsgaW4gY2pzLiovXG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0PWNyZWF0ZShcbmNvbXBhcnRtZW50Lmdsb2JhbFRoaXMuT2JqZWN0LnByb3RvdHlwZSk7XG5cblxuLyogU2V0IGFsbCBleHBvcnRlZCBwcm9wZXJ0aWVzIG9uIHRoZSBkZWZ1bHQgYW5kIGNhbGwgbmFtZWRFeHBvcnRQcm9wIHRvIGFkZCB0aGVtIG9uIHRoZSBuYW1lc3BhY2UgZm9yIGltcG9ydCAqLiovXG4vKiBSb290IG5hbWVzcGFjZSBpcyBvbmx5IGFjY2Vzc2libGUgZm9yIGltcG9ydHMuIFJlcXVpcmluZyBmcm9tIGNqcyBnZXRzIHRoZSBkZWZhdWx0IGZpZWxkIG9mIHRoZSBuYW1lc3BhY2UuKi9cbmNvbnN0IHByb21vdGVUb05hbWVkRXhwb3J0PShwcm9wLHZhbHVlKT0+e1xuLyogX19lc01vZHVsZSBuZWVkcyB0byBiZSBwcmVzZW50IGZvciB0eXBlc2NyaXB0LWNvbXBpbGVkIG1vZHVsZXMgdG8gd29yaywgY2FuJ3QgYmUgc2tpcHBlZCovXG5pZihwcm9wIT09J2RlZmF1bHQnKXtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkW3Byb3BdPXZhbHVlO1xuIH1cbiB9O1xuXG5jb25zdCBvcmlnaW5hbEV4cG9ydHM9bmV3IFByb3h5KG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQse1xuc2V0KF90YXJnZXQscHJvcCx2YWx1ZSl7XG5wcm9tb3RlVG9OYW1lZEV4cG9ydChwcm9wLHZhbHVlKTtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHRbcHJvcF09dmFsdWU7XG5yZXR1cm4gdHJ1ZTtcbiB9LFxuZGVmaW5lUHJvcGVydHkodGFyZ2V0LHByb3AsZGVzY3JpcHRvcil7XG5pZihoYXMoZGVzY3JpcHRvciwndmFsdWUnKSl7XG4vKiBUaGlzIHdpbGwgcmVzdWx0IGluIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMgYmVpbmcgZW51bWVyYWJsZSBmb3IgbmFtZWQgaW1wb3J0IHB1cnBvc2VzLiBXZSBjb3VsZCBjaGVjayovXG4vKiBlbnVtZXJhYmxlIGhlcmUsIGJ1dCBJIGRvbid0IHNlZSBwb3NzaWJsZSBiZW5lZml0cyBvZiBzdWNoIHJlc3RyaWN0aW9uLiovXG5wcm9tb3RlVG9OYW1lZEV4cG9ydChwcm9wLGRlc2NyaXB0b3IudmFsdWUpO1xuIH1cbi8qIEFsbCB0aGUgZGVmaW5lUHJvcGVydHkgdHJpY2tlcnkgd2l0aCBnZXR0ZXJzIHVzZWQgZm9yIGxhenkgaW5pdGlhbGl6YXRpb24gd2lsbCB3b3JrLiBUaGUgdHJhcCBpcyBoZXJlIG9ubHkgdG8qL1xuLyogZWxldmF0ZSB0aGUgdmFsdWVzIHdpdGggbmFtZWRFeHBvcnRQcm9wIHdoZW5ldmVyIHBvc3NpYmxlLiBSZXBsYWNpbmcgZ2V0dGVycyB3aXRoIHdyYXBwZWQgb25lcyB0byBmYWNpbGl0YXRlKi9cbi8qIHByb3BhZ2F0aW5nIHRoZSBsYXp5IHZhbHVlIHRvIHRoZSBuYW1lc3BhY2UgaXMgbm90IHBvc3NpYmxlIGJlY2F1c2UgZGVmaW5pbmcgYSBwcm9wZXJ0eSB3aXRoIG1vZGlmaWVkKi9cbi8qIGRlc2NyaXB0b3IuZ2V0IGluIHRoZSB0cmFwIHdpbGwgY2F1c2UgYW4gZXJyb3IuKi9cbi8qIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBpcyB1c2VkIGluc3RlYWQgb2YgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLiovXG5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQscHJvcCxkZXNjcmlwdG9yKTtcbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG5sZXQgZmluYWxFeHBvcnRzPW9yaWdpbmFsRXhwb3J0cztcblxuY29uc3QgbW9kdWxlPWZyZWV6ZSh7XG5nZXQgZXhwb3J0cygpe1xucmV0dXJuIGZpbmFsRXhwb3J0cztcbiB9LFxuc2V0IGV4cG9ydHModmFsdWUpe1xuZmluYWxFeHBvcnRzPXZhbHVlO1xuIH19KTtcblxuXG5jb25zdCByZXF1aXJlPSgvKiogQHR5cGUge3N0cmluZ30gKi9pbXBvcnRTcGVjaWZpZXIpPT57XG5jb25zdCBuYW1lc3BhY2U9Y29tcGFydG1lbnQuaW1wb3J0Tm93KHJlc29sdmVkSW1wb3J0c1tpbXBvcnRTcGVjaWZpZXJdKTtcbi8qIElmIHlvdSByZWFkIHRoaXMgZmlsZSBjYXJlZnVsbHksIHlvdSdsbCBzZWUgaXQncyBub3QgcG9zc2libGUgZm9yIGEgY2pzIG1vZHVsZSB0byBub3QgaGF2ZSB0aGUgZGVmYXVsdCBhbnltb3JlLiovXG4vKiBJdCdzIGN1cnJlbnRseSBwb3NzaWJsZSB0byByZXF1aXJlIG1vZHVsZXMgdGhhdCB3ZXJlIG5vdCBjcmVhdGVkIGJ5IHRoaXMgZmlsZSB0aG91Z2guKi9cbmlmKGhhcyhuYW1lc3BhY2UsJ2RlZmF1bHQnKSl7XG5yZXR1cm4gbmFtZXNwYWNlLmRlZmF1bHQ7XG4gfWVsc2V7XG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cbiB9O1xuaWYodHlwZW9mIHJlYWRQb3dlcnM9PT0nb2JqZWN0JyYmcmVhZFBvd2Vycy5yZXF1aXJlUmVzb2x2ZSl7XG5jb25zdHtyZXF1aXJlUmVzb2x2ZX09cmVhZFBvd2VycztcbnJlcXVpcmUucmVzb2x2ZT1mcmVlemUoKHNwZWNpZmllcixvcHRpb25zKT0+XG5yZXF1aXJlUmVzb2x2ZShsb2NhdGlvbixzcGVjaWZpZXIsb3B0aW9ucykpO1xuXG4gfWVsc2V7XG5yZXF1aXJlLnJlc29sdmU9ZnJlZXplKChzcGVjaWZpZXIpPT57XG5jb25zdCBlcnJvcj1FcnJvcihcbiBgQ2Fubm90IGZpbmQgbW9kdWxlICcke3NwZWNpZmllcn0nXFxuQWRkIHJlcXVpcmVSZXNvbHZlIHRvIEVuZG8gQ29tcGFydG1lbnQgTWFwcGVyIHJlYWRQb3dlcnMuYCk7XG5cbmRlZmluZVByb3BlcnR5KGVycm9yLCdjb2RlJyx7dmFsdWU6J01PRFVMRV9OT1RfRk9VTkQnfSk7XG50aHJvdyBlcnJvcjtcbiB9KTtcbiB9XG5cbmZyZWV6ZShyZXF1aXJlKTtcblxuY29uc3QgYWZ0ZXJFeGVjdXRlPSgpPT57XG5jb25zdCBleHBvcnRzSGF2ZUJlZW5PdmVyd3JpdHRlbj1maW5hbEV4cG9ydHMhPT1vcmlnaW5hbEV4cG9ydHM7XG4vKiBQcm9tb3RlcyBrZXlzIGZyb20gcmVkZWZpbmVkIG1vZHVsZS5leHBvcnQgdG8gdG9wIGxldmVsIG5hbWVzcGFjZSBmb3IgaW1wb3J0ICoqL1xuLyogTm90ZTogV2UgY291bGQgZG8gaXQgbGVzcyBjb25zaXN0ZW50bHkgYnV0IGNsb3NlciB0byBob3cgbm9kZSBkb2VzIGl0IGlmIHdlIGl0ZXJhdGVkIG92ZXIgZXhwb3J0cyBkZXRlY3RlZCBieSovXG4vKiB0aGUgbGV4ZXIuKi9cbmlmKGV4cG9ydHNIYXZlQmVlbk92ZXJ3cml0dGVuKXtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQ9ZmluYWxFeHBvcnRzO1xua2V5cyhtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0fHx7fSkuZm9yRWFjaCgocHJvcCk9PntcbmlmKHByb3AhPT0nZGVmYXVsdCcpXG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZFtwcm9wXT1tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuIH0pO1xuIH1cbiB9O1xuXG5yZXR1cm57XG5tb2R1bGUsXG5tb2R1bGVFeHBvcnRzOm9yaWdpbmFsRXhwb3J0cyxcbmFmdGVyRXhlY3V0ZSxcbnJlcXVpcmV9O1xuXG4gfTskaOKAjV9vbmNlLndyYXAod3JhcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TW9kdWxlUGF0aHMiOlsiZ2V0TW9kdWxlUGF0aHMiXSwid3JhcCI6WyJ3cmFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAvdd+ORBQAAkQUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wYXJzZS1qc29uLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZUpzb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFyc2VMb2NhdGVkSnNvbjskaOKAjV9pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogVHlwZVNjcmlwdCBjYW5ub3QgYmUgcmVsaWVkIHVwb24gdG8gZGVhbCB3aXRoIHRoZSBudWFuY2VzIG9mIFJlYWRvbmx5LCBzbyB3ZVxuICogYm9ycm93IHRoZSBwYXNzLXRocm91Z2ggdHlwZSBkZWZpbml0aW9uIG9mIGhhcmRlbiBoZXJlLlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCdzZXMnKS5IYXJkZW59XG4gKi9cbmNvbnN0IGZyZWV6ZT1PYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZUpzb249YXN5bmMoXG5ieXRlcyxcbl9zcGVjaWZpZXIsXG5sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24pPT5cbntcbmNvbnN0IHNvdXJjZT10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuY29uc3QgaW1wb3J0cz1mcmVlemUoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBleHBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KGV4cG9ydHMpPT57XG5leHBvcnRzLmRlZmF1bHQ9cGFyc2VMb2NhdGVkSnNvbihzb3VyY2UsbG9jYXRpb24pO1xuIH07XG5yZXR1cm57XG5wYXJzZXI6J2pzb24nLFxuYnl0ZXMsXG5yZWNvcmQ6ZnJlZXplKHtcbmltcG9ydHMsXG5leHBvcnRzOmZyZWV6ZShbJ2RlZmF1bHQnXSksXG5leGVjdXRlOmZyZWV6ZShleGVjdXRlKX0pfTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZUpzb24ocGFyc2VKc29uKTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VKc29uLFxuaGV1cmlzdGljSW1wb3J0czpmYWxzZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VKc29uIjpbInBhcnNlSnNvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADGORBhdwcAAHcHAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcGFyc2UtcHJlLWNqcy5qc3siaW1wb3J0cyI6WyIuL2pzb24uanMiLCIuL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VQcmVDanMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFyc2VMb2NhdGVkSnNvbix3cmFwLGdldE1vZHVsZVBhdGhzOyRo4oCNX2ltcG9ydHMoW1tcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLCBbJGjigI1fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanNcIiwgW1tcIndyYXBcIiwgWyRo4oCNX2EgPT4gKHdyYXAgPSAkaOKAjV9hKV1dLFtcImdldE1vZHVsZVBhdGhzXCIsIFskaOKAjV9hID0+IChnZXRNb2R1bGVQYXRocyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZVByZUNqcz1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbmxvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbixcbntyZWFkUG93ZXJzfT17fSk9Plxue1xuY29uc3QgdGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuY29uc3R7c291cmNlLGltcG9ydHMsZXhwb3J0cyxyZWV4cG9ydHN9PXBhcnNlTG9jYXRlZEpzb24oXG50ZXh0LFxubG9jYXRpb24pO1xuXG5cbmNvbnN0e2ZpbGVuYW1lLGRpcm5hbWV9PWF3YWl0IGdldE1vZHVsZVBhdGhzKHJlYWRQb3dlcnMsbG9jYXRpb24pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZFxuICogQHBhcmFtIHtDb21wYXJ0bWVudH0gY29tcGFydG1lbnRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gcmVzb2x2ZWRJbXBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KG1vZHVsZUVudmlyb25tZW50UmVjb3JkLGNvbXBhcnRtZW50LHJlc29sdmVkSW1wb3J0cyk9PntcbmNvbnN0IGZ1bmN0b3I9Y29tcGFydG1lbnQuZXZhbHVhdGUoc291cmNlKTtcblxuY29uc3R7cmVxdWlyZSxtb2R1bGVFeHBvcnRzLG1vZHVsZSxhZnRlckV4ZWN1dGV9PXdyYXAoe1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmQsXG5jb21wYXJ0bWVudCxcbnJlc29sdmVkSW1wb3J0cyxcbmxvY2F0aW9uLFxucmVhZFBvd2Vyc30pO1xuXG5cbmZ1bmN0b3IocmVxdWlyZSxtb2R1bGVFeHBvcnRzLG1vZHVsZSxmaWxlbmFtZSxkaXJuYW1lKTtcblxuYWZ0ZXJFeGVjdXRlKCk7XG4gfTtcblxucmV0dXJue1xucGFyc2VyOidwcmUtY2pzLWpzb24nLFxuYnl0ZXMsXG5yZWNvcmQ6e1xuaW1wb3J0cyxcbnJlZXhwb3J0cyxcbmV4cG9ydHMsXG5leGVjdXRlfX07XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VQcmVDanMocGFyc2VQcmVDanMpO1xuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDp7XG5wYXJzZTpwYXJzZVByZUNqcyxcbmhldXJpc3RpY0ltcG9ydHM6dHJ1ZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVDanMiOlsicGFyc2VQcmVDanMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAq6T11YYEAACGBAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL3BhcnNlLXByZS1tanMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlTWpzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhcnNlTG9jYXRlZEpzb247JGjigI1faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsIFskaOKAjV9hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZVByZU1qcz1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbmxvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbik9Plxue1xuY29uc3QgdGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuY29uc3QgcmVjb3JkPXBhcnNlTG9jYXRlZEpzb24odGV4dCxsb2NhdGlvbik7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGUqL1xucmVjb3JkLl9fc3luY01vZHVsZVByb2dyYW1fXys9IGAvLyMgc291cmNlVVJMPSR7bG9jYXRpb259XFxuYDtcbnJldHVybntcbnBhcnNlcjoncHJlLW1qcy1qc29uJyxcbmJ5dGVzLFxucmVjb3JkfTtcblxuIH07XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VQcmVNanMocGFyc2VQcmVNanMpO1xuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDp7XG5wYXJzZTpwYXJzZVByZU1qcyxcbmhldXJpc3RpY0ltcG9ydHM6ZmFsc2V9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlUHJlTWpzIjpbInBhcnNlUHJlTWpzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOQiGN8rBQAAKwUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wYXJzZS10ZXh0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VUZXh0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBiZSByZWxpZWQgdXBvbiB0byBkZWFsIHdpdGggdGhlIG51YW5jZXMgb2YgUmVhZG9ubHksIHNvIHdlXG4gKiBib3Jyb3cgdGhlIHBhc3MtdGhyb3VnaCB0eXBlIGRlZmluaXRpb24gb2YgaGFyZGVuIGhlcmUuXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXJzZUZufSAqL1xuY29uc3QgICAgICAgIHBhcnNlVGV4dD1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbl9sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24pPT5cbntcbmNvbnN0IHRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcblxuLyoqIEB0eXBlIHtBcnJheTxzdHJpbmc+fSAqL1xuY29uc3QgaW1wb3J0cz1mcmVlemUoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBleHBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KGV4cG9ydHMpPT57XG5leHBvcnRzLmRlZmF1bHQ9dGV4dDtcbiB9O1xuXG5yZXR1cm57XG5wYXJzZXI6J3RleHQnLFxuYnl0ZXMsXG5yZWNvcmQ6ZnJlZXplKHtcbmltcG9ydHMsXG5leHBvcnRzOmZyZWV6ZShbJ2RlZmF1bHQnXSksXG5leGVjdXRlOmZyZWV6ZShleGVjdXRlKX0pfTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZVRleHQocGFyc2VUZXh0KTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VUZXh0LFxuaGV1cmlzdGljSW1wb3J0czpmYWxzZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VUZXh0IjpbInBhcnNlVGV4dCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACmnhiXUhgAAFIYAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcG9saWN5LWZvcm1hdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSIsImFzc2VydFBvbGljeSIsImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiIsImlzQWxsb3dpbmdFdmVyeXRoaW5nIiwiaXNBdHRlbnVhdGlvbkRlZmluaXRpb24iLCJwb2xpY3lMb29rdXBIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb259IEF0dGVudWF0aW9uRGVmaW5pdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVW5pZmllZEF0dGVudWF0aW9uRGVmaW5pdGlvbn0gVW5pZmllZEF0dGVudWF0aW9uRGVmaW5pdGlvbiAqL1xuXG5jb25zdHtlbnRyaWVzLGtleXN9PU9iamVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgQVRURU5VQVRPUl9LRVk9J2F0dGVudWF0ZSc7XG5jb25zdCBBVFRFTlVBVE9SX1BBUkFNU19LRVk9J3BhcmFtcyc7XG5jb25zdCBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUU9J2FueSc7XG5jb25zdCBQT0xJQ1lfRklFTERTX0xPT0tVUD1bJ2J1aWx0aW5zJywnZ2xvYmFscycsJ3BhY2thZ2VzJ107XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYWNrYWdlUG9saWN5XG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtTmFtZVxuICogQHJldHVybnMge2Jvb2xlYW4gfCBvYmplY3R9XG4gKi9cbmNvbnN0ICAgICAgICBwb2xpY3lMb29rdXBIZWxwZXI9KHBhY2thZ2VQb2xpY3ksZmllbGQsaXRlbU5hbWUpPT57XG5pZighUE9MSUNZX0ZJRUxEU19MT09LVVAuaW5jbHVkZXMoZmllbGQpKXtcbnRocm93IEVycm9yKCBgSW52YWxpZCBmaWVsZCAke3EoZmllbGQpfWApO1xuIH1cbmlmKFxudHlwZW9mIHBhY2thZ2VQb2xpY3khPT0nb2JqZWN0J3x8XG5wYWNrYWdlUG9saWN5PT09bnVsbHx8XG4hcGFja2FnZVBvbGljeVtmaWVsZF0pXG57XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5pZihwYWNrYWdlUG9saWN5W2ZpZWxkXT09PVdJTERDQVJEX1BPTElDWV9WQUxVRSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihwYWNrYWdlUG9saWN5W2ZpZWxkXVtpdGVtTmFtZV0pe1xucmV0dXJuIHBhY2thZ2VQb2xpY3lbZmllbGRdW2l0ZW1OYW1lXTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHBvbGljeSB2YWx1ZSBpcyBzZXQgdG8gd2lsZGNhcmQgdG8gYWxsb3cgZXZlcnl0aGluZ1xuICpcbiAqIEBwYXJhbSB7Kn0gcG9saWN5VmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5wb2xpY3lMb29rdXBIZWxwZXIocG9saWN5TG9va3VwSGVscGVyKTtcbmNvbnN0ICAgICAgICBpc0FsbG93aW5nRXZlcnl0aGluZz0ocG9saWN5VmFsdWUpPT5cbnBvbGljeVZhbHVlPT09V0lMRENBUkRfUE9MSUNZX1ZBTFVFO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0F0dGVudWF0aW9uRGVmaW5pdGlvbn0gcG90ZW50aWFsRGVmaW5pdGlvblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmlzQWxsb3dpbmdFdmVyeXRoaW5nKGlzQWxsb3dpbmdFdmVyeXRoaW5nKTtcbmNvbnN0ICAgICAgICBpc0F0dGVudWF0aW9uRGVmaW5pdGlvbj0ocG90ZW50aWFsRGVmaW5pdGlvbik9PntcbnJldHVybihcbnR5cGVvZiBwb3RlbnRpYWxEZWZpbml0aW9uPT09J29iamVjdCcmJlxudHlwZW9mIHBvdGVudGlhbERlZmluaXRpb25bQVRURU5VQVRPUl9LRVldPT09J3N0cmluZyd8fC8qIG9iamVjdCB3aXRoIGF0dGVudWF0b3IgbmFtZSovXG5pc0FycmF5KHBvdGVudGlhbERlZmluaXRpb24pLyogcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3IqLyk7XG5cbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0F0dGVudWF0aW9uRGVmaW5pdGlvbn0gYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcmV0dXJucyB7VW5pZmllZEF0dGVudWF0aW9uRGVmaW5pdGlvbn1cbiAqLyRo4oCNX29uY2UuaXNBdHRlbnVhdGlvbkRlZmluaXRpb24oaXNBdHRlbnVhdGlvbkRlZmluaXRpb24pO1xuY29uc3QgICAgICAgIGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbj0oYXR0ZW51YXRpb25EZWZpbml0aW9uKT0+e1xuaWYoIWlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbikpe1xudGhyb3cgRXJyb3IoXG4gYEludmFsaWQgYXR0ZW51YXRpb24gJHtxKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uKVxuIH0sIG11c3QgYmUgYW4gYXJyYXkgb2YgcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3Igb3IgYW4gb2JqZWN0IHdpdGggYW4gYXR0ZW51YXRvciBrZXlgKTtcblxuIH1cbmlmKGlzQXJyYXkoYXR0ZW51YXRpb25EZWZpbml0aW9uKSl7XG5yZXR1cm57XG5kaXNwbGF5TmFtZTonPGRlZmF1bHQgYXR0ZW51YXRvcj4nLFxuc3BlY2lmaWVyOm51bGwsXG5wYXJhbXM6YXR0ZW51YXRpb25EZWZpbml0aW9ufTtcblxuIH1lbHNle1xucmV0dXJue1xuZGlzcGxheU5hbWU6YXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfS0VZXSxcbnNwZWNpZmllcjphdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxucGFyYW1zOmF0dGVudWF0aW9uRGVmaW5pdGlvbltBVFRFTlVBVE9SX1BBUkFNU19LRVldfTtcblxuIH1cbiB9OyRo4oCNX29uY2UuZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbik7XG5cbmNvbnN0IGlzUmVjb3JkT2Y9KGl0ZW0scHJlZGljYXRlKT0+e1xuaWYodHlwZW9mIGl0ZW0hPT0nb2JqZWN0J3x8aXRlbT09PW51bGx8fGlzQXJyYXkoaXRlbSkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbnJldHVybiBlbnRyaWVzKGl0ZW0pLmV2ZXJ5KChba2V5LHZhbHVlXSk9PnByZWRpY2F0ZSh2YWx1ZSxrZXkpKTtcbiB9O1xuY29uc3QgaXNCb29sZWFuPShpdGVtKT0+dHlwZW9mIGl0ZW09PT0nYm9vbGVhbic7XG5jb25zdCBwcmVkaWNhdGVPcj1cbiguLi5wcmVkaWNhdGVzKT0+XG4oaXRlbSk9PlxucHJlZGljYXRlcy5zb21lKChwKT0+cChpdGVtKSk7XG5jb25zdCBpc1BvbGljeUl0ZW09KGl0ZW0pPT5cbml0ZW09PT11bmRlZmluZWR8fFxuaXRlbT09PVdJTERDQVJEX1BPTElDWV9WQUxVRXx8XG5pc1JlY29yZE9mKGl0ZW0saXNCb29sZWFuKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUGFja2FnZVBvbGljeVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQYWNrYWdlUG9saWN5PShhbGxlZ2VkUGFja2FnZVBvbGljeSxwYXRoLHVybCk9PntcbmlmKGFsbGVnZWRQYWNrYWdlUG9saWN5PT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCBpblVybD11cmw/IGAgaW4gJHtxKHVybCl9YDonJztcblxuY29uc3QgcGFja2FnZVBvbGljeT1PYmplY3QoYWxsZWdlZFBhY2thZ2VQb2xpY3kpO1xuYXNzZXJ0KFxuYWxsZWdlZFBhY2thZ2VQb2xpY3k9PT1wYWNrYWdlUG9saWN5JiYhaXNBcnJheShhbGxlZ2VkUGFja2FnZVBvbGljeSksXG4gYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQYWNrYWdlUG9saWN5fSR7aW5Vcmx9YCk7XG5cbmNvbnN0e1xucGFja2FnZXMsXG5idWlsdGlucyxcbmdsb2JhbHMsXG5ub0dsb2JhbEZyZWV6ZSxcbmRlZmF1bHRBdHRlbnVhdG9yOl9pZ25vcmUsLyogYSBjYXJ2ZSBvdXQgZm9yIHRoZSBkZWZhdWx0IGF0dGVudWF0b3IgaW4gY29tcGFydG1lbnQgbWFwKi9cbi4uLmV4dHJhfT1cbnBhY2thZ2VQb2xpY3k7XG5cbmFzc2VydChcbmtleXMoZXh0cmEpLmxlbmd0aD09PTAsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKGtleXMoZXh0cmEpKX0ke2luVXJsfWApO1xuXG5cbmFzc2VydChcbm5vR2xvYmFsRnJlZXplPT09dW5kZWZpbmVkfHx0eXBlb2Ygbm9HbG9iYWxGcmVlemU9PT0nYm9vbGVhbicsXG4gYCR7cGF0aH0ubm9HbG9iYWxGcmVlemUgbXVzdCBiZSBhIGJvb2xlYW4sIGdvdCAke3Eoe1xubm9HbG9iYWxGcmVlemV9KVxuIH0ke2luVXJsfWApO1xuXG5cbmlzUG9saWN5SXRlbShwYWNrYWdlcyl8fFxuYXNzZXJ0LmZhaWwoXG4gYCR7cGF0aH0ucGFja2FnZXMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucywgZ290ICR7cSh7XG5wYWNrYWdlc30pXG4gfSR7aW5Vcmx9YCk7XG5cblxuaXNQb2xpY3lJdGVtKGdsb2JhbHMpfHxcbmlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGdsb2JhbHMpfHxcbmFzc2VydC5mYWlsKFxuIGAke3BhdGh9Lmdsb2JhbHMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhIHNpbmdsZSBhdHRlbnVhdGlvbiwgZ290ICR7cShcbntcbmdsb2JhbHN9KVxuXG4gfSR7aW5Vcmx9YCk7XG5cblxuaXNQb2xpY3lJdGVtKGJ1aWx0aW5zKXx8XG5pc1JlY29yZE9mKGJ1aWx0aW5zLHByZWRpY2F0ZU9yKGlzQm9vbGVhbixpc0F0dGVudWF0aW9uRGVmaW5pdGlvbikpfHxcbmFzc2VydC5mYWlsKFxuIGAke3BhdGh9LmJ1aWx0aW5zIG11c3QgYmUgYSByZWNvcmQgb2YgYm9vbGVhbnMgb3IgYXR0ZW51YXRpb25zLCBnb3QgJHtxKHtcbmJ1aWx0aW5zfSlcbiB9JHtpblVybH1gKTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFBvbGljeVxuICogQHJldHVybnMge3ZvaWR9XG4gKi8kaOKAjV9vbmNlLmFzc2VydFBhY2thZ2VQb2xpY3koYXNzZXJ0UGFja2FnZVBvbGljeSk7XG5jb25zdCAgICAgICAgYXNzZXJ0UG9saWN5PShhbGxlZ2VkUG9saWN5KT0+e1xuaWYoYWxsZWdlZFBvbGljeT09PXVuZGVmaW5lZCl7XG5yZXR1cm47XG4gfVxuY29uc3QgcG9saWN5PU9iamVjdChhbGxlZ2VkUG9saWN5KTtcbmFzc2VydChcbmFsbGVnZWRQb2xpY3k9PT1wb2xpY3kmJiFBcnJheS5pc0FycmF5KHBvbGljeSksXG4gYHBvbGljeSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFBvbGljeX1gKTtcblxuXG5jb25zdHtyZXNvdXJjZXMsZW50cnksZGVmYXVsdEF0dGVudWF0b3IsLi4uZXh0cmF9PXBvbGljeTtcbmFzc2VydChcbmtleXMoZXh0cmEpLmxlbmd0aD09PTAsXG4gYHBvbGljeSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoa2V5cyhleHRyYSkpfWApO1xuXG5cbmFzc2VydChcbnR5cGVvZiByZXNvdXJjZXM9PT0nb2JqZWN0JyYmcmVzb3VyY2VzIT09bnVsbCxcbiBgcG9saWN5LnJlc291cmNlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShyZXNvdXJjZXMpfWApO1xuXG5hc3NlcnQoXG4hZGVmYXVsdEF0dGVudWF0b3J8fHR5cGVvZiBkZWZhdWx0QXR0ZW51YXRvcj09PSdzdHJpbmcnLFxuIGBwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShyZXNvdXJjZXMpfWApO1xuXG5cbmFzc2VydFBhY2thZ2VQb2xpY3koZW50cnksIGBwb2xpY3kuZW50cnlgKTtcblxuZW50cmllcyhyZXNvdXJjZXMpLmZvckVhY2goKFtrZXksdmFsdWVdKT0+e1xuYXNzZXJ0UGFja2FnZVBvbGljeSh2YWx1ZSwgYHBvbGljeS5yZXNvdXJjZXNbXCIke2tleX1cIl1gKTtcbiB9KTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UG9saWN5KGFzc2VydFBvbGljeSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicG9saWN5TG9va3VwSGVscGVyIjpbInBvbGljeUxvb2t1cEhlbHBlciJdLCJpc0FsbG93aW5nRXZlcnl0aGluZyI6WyJpc0FsbG93aW5nRXZlcnl0aGluZyJdLCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiI6WyJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiJdLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iOlsiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uIl0sImFzc2VydFBhY2thZ2VQb2xpY3kiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSJdLCJhc3NlcnRQb2xpY3kiOlsiYXNzZXJ0UG9saWN5Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJqOx8Z4PAAAeDwAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wb2xpY3kuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiLCJhdHRlbnVhdGVHbG9iYWxzIiwiYXR0ZW51YXRlTW9kdWxlSG9vayIsImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiLCJkZXRlY3RBdHRlbnVhdG9ycyIsImRpYWdub3NlTWlzc2luZ0NvbXBhcnRtZW50RXJyb3IiLCJlbmZvcmNlTW9kdWxlUG9saWN5IiwiZ2V0UG9saWN5Rm9yUGFja2FnZSIsIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcG9saWN5TG9va3VwSGVscGVyLGlzQXR0ZW51YXRpb25EZWZpbml0aW9uLGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbixpc0FsbG93aW5nRXZlcnl0aGluZzskaOKAjV9pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcInBvbGljeUxvb2t1cEhlbHBlclwiLCBbJGjigI1fYSA9PiAocG9saWN5TG9va3VwSGVscGVyID0gJGjigI1fYSldXSxbXCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvblwiLCBbJGjigI1fYSA9PiAoaXNBdHRlbnVhdGlvbkRlZmluaXRpb24gPSAkaOKAjV9hKV1dLFtcImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvblwiLCBbJGjigI1fYSA9PiAoZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uID0gJGjigI1fYSldXSxbXCJpc0FsbG93aW5nRXZlcnl0aGluZ1wiLCBbJGjigI1fYSA9PiAoaXNBbGxvd2luZ0V2ZXJ5dGhpbmcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2VudHJpZXMsdmFsdWVzLGFzc2lnbixrZXlzLGZyZWV6ZX09T2JqZWN0O1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBDb25zdCBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGludGVybmFsIGF0dGVudWF0b3JzIGNvbXBhcnRtZW50XG4gKi9cbmNvbnN0ICAgICAgICBBVFRFTlVBVE9SU19DT01QQVJUTUVOVD0nPEFUVEVOVUFUT1JTPic7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgKG9wdGlvbmFsbHkgbGltaXRlZCB0byBhIHNwZWNpZmljIGxpc3QpIGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBmcm9tXG4gKiBAcGFyYW0ge29iamVjdH0gdG9cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gW2xpc3RdXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovJGjigI1fb25jZS5BVFRFTlVBVE9SU19DT01QQVJUTUVOVChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCk7XG5jb25zdCBzZWxlY3RpdmVDb3B5PShmcm9tLHRvLGxpc3QpPT57XG5pZighbGlzdCl7XG5saXN0PWtleXMoZnJvbSk7XG4gfVxuZm9yKGxldCBpbmRleD0wO2luZGV4PGxpc3QubGVuZ3RoO2luZGV4Kz0xKXtcbmNvbnN0IGtleT1saXN0W2luZGV4XTtcbi8qIElmIGFuIGVuZG93bWVudCBpcyBtaXNzaW5nLCBnbG9iYWwgdmFsdWUgaXMgdW5kZWZpbmVkLiovXG4vKiBUaGlzIGlzIGFuIGV4cGVjdGVkIGJlaGF2aW9yIGlmIGdsb2JhbHMgYXJlIHVzZWQgZm9yIHBsYXRmb3JtIGZlYXR1cmUgZGV0ZWN0aW9uKi9cbnRvW2tleV09ZnJvbVtrZXldO1xuIH1cbnJldHVybiB0bztcbiB9O1xuXG5jb25zdCBjb2xsZWN0QXR0ZW51YXRvcnM9KGF0dGVudWF0b3JzLHBvbGljeUZyYWdtZW50KT0+e1xuaWYocG9saWN5RnJhZ21lbnQuYXR0ZW51YXRlKXtcbmF0dGVudWF0b3JzLnB1c2gocG9saWN5RnJhZ21lbnQuYXR0ZW51YXRlKTtcbiB9XG5mb3IoY29uc3QgdmFsdWUgb2YgdmFsdWVzKHBvbGljeUZyYWdtZW50KSl7XG5pZih0eXBlb2YgdmFsdWU9PT0nb2JqZWN0JyYmdmFsdWUhPT1udWxsKXtcbmNvbGxlY3RBdHRlbnVhdG9ycyhhdHRlbnVhdG9ycyx2YWx1ZSk7XG4gfVxuIH1cbiB9O1xuXG5jb25zdCBhdHRlbnVhdG9yc0NhY2hlPW5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEdvZXMgdGhyb3VnaCBwb2xpY3kgYW5kIGxpc3RzIGFsbCBhdHRlbnVhdG9yIHNwZWNpZmllcnMgdXNlZC5cbiAqIE1lbW9pemF0aW9uIGtleWVkIG9uIHBvbGljeSBvYmplY3QgcmVmZXJlbmNlXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHBvbGljeVxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IGF0dGVudWF0b3JzXG4gKi9cbmNvbnN0ICAgICAgICBkZXRlY3RBdHRlbnVhdG9ycz0ocG9saWN5KT0+e1xuaWYoIXBvbGljeSl7XG5yZXR1cm5bXTtcbiB9XG5pZighYXR0ZW51YXRvcnNDYWNoZS5oYXMocG9saWN5KSl7XG5jb25zdCBhdHRlbnVhdG9ycz1bXTtcbmlmKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcil7XG5hdHRlbnVhdG9ycy5wdXNoKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcik7XG4gfVxuY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLHBvbGljeSk7XG5hdHRlbnVhdG9yc0NhY2hlLnNldChwb2xpY3ksYXR0ZW51YXRvcnMpO1xuIH1cbnJldHVybiBhdHRlbnVhdG9yc0NhY2hlLmdldChwb2xpY3kpO1xuIH07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIGEgcGFja2FnZSBmb3IgcG9saWN5IGxvb2t1cCBwdXJwb3Nlcy5cbiAqXG4gKiBAcGFyYW0ge1BhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqLyRo4oCNX29uY2UuZGV0ZWN0QXR0ZW51YXRvcnMoZGV0ZWN0QXR0ZW51YXRvcnMpO1xuY29uc3QgZ2VuZXJhdGVDYW5vbmljYWxOYW1lPSh7aXNFbnRyeT1mYWxzZSxuYW1lLHBhdGh9KT0+e1xuaWYoaXNFbnRyeSl7XG50aHJvdyBFcnJvcignRW50cnkgbW9kdWxlIGNhbm5vdCBiZSBpZGVudGlmaWVkIHdpdGggYSBjYW5vbmljYWxOYW1lJyk7XG4gfVxuaWYobmFtZT09PUFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKXtcbnJldHVybiBBVFRFTlVBVE9SU19DT01QQVJUTUVOVDtcbiB9XG5yZXR1cm4gcGF0aC5qb2luKCc+Jyk7XG4gfTtcblxuLyoqXG4gKiBWZXJpZmllcyBpZiBhIG1vZHVsZSBpZGVudGlmaWVkIGJ5IG5hbWluZ0tpdCBjYW4gYmUgYSBkZXBlbmRlbmN5IG9mIGEgcGFja2FnZSBwZXIgcGFja2FnZVBvbGljeS5cbiAqIHBhY2thZ2VQb2xpY3kgaXMgcmVxdWlyZWQsIHdoZW4gcG9saWN5IGlzIG5vdCBzZXQsIHNraXBwaW5nIG5lZWRzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGNhbGxlci5cbiAqXG4gKiBAcGFyYW0ge1BhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdFxuICogQHBhcmFtIHsqfSBwYWNrYWdlUG9saWN5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3k9KG5hbWluZ0tpdCxwYWNrYWdlUG9saWN5KT0+e1xuaWYobmFtaW5nS2l0LmlzRW50cnkpe1xuLyogZGVwZW5kZW5jeSBvbiBlbnRyeSBjb21wYXJ0bWVudCBzaG91bGQgbmV2ZXIgYmUgYWxsb3dlZCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgY2Fub25pY2FsTmFtZT1nZW5lcmF0ZUNhbm9uaWNhbE5hbWUobmFtaW5nS2l0KTtcbnJldHVybiEhcG9saWN5TG9va3VwSGVscGVyKHBhY2thZ2VQb2xpY3ksJ3BhY2thZ2VzJyxjYW5vbmljYWxOYW1lKTtcbiB9OyRo4oCNX29uY2UuZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeShkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5KTtcblxuY29uc3QgdmFsaWRhdGVEZXBlbmRlbmNpZXM9KHBvbGljeSxjYW5vbmljYWxOYW1lKT0+e1xuY29uc3QgcGFja2FnZXM9cG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXS5wYWNrYWdlcztcbmlmKCFwYWNrYWdlc3x8aXNBbGxvd2luZ0V2ZXJ5dGhpbmcocGFja2FnZXMpKXtcbnJldHVybjtcbiB9XG5cbmNvbnN0IHBhY2thZ2VOYW1lcz1rZXlzKHBhY2thZ2VzKTtcbmNvbnN0IGF0dGVudWF0b3JzPWRldGVjdEF0dGVudWF0b3JzKHBvbGljeSk7XG4vKiBKb2luIGF0dGVudWF0b3JzIHdpdGggcGFja2FnZU5hbWVzIGludG8gYSBTZXQgdG8gZGVkdXBsaWNhdGUgYW5kIGNoZWNrIGlmIGFsbCBhcmUgbGlzdGVkIGluIHBvbGljeS5yZXNvdXJjZXMqL1xuY29uc3QgYWxsU3BlY2lmaWVycz1uZXcgU2V0KFsuLi5wYWNrYWdlTmFtZXMsLi4uYXR0ZW51YXRvcnNdKTtcbmZvcihjb25zdCBzcGVjaWZpZXIgb2YgYWxsU3BlY2lmaWVycyl7XG5pZighKHNwZWNpZmllciBpbiBwb2xpY3kucmVzb3VyY2VzKSl7XG50aHJvdyBFcnJvcihcbiBgUGFja2FnZSAke3Eoc3BlY2lmaWVyKX0gaXMgYWxsb3dlZCBmb3IgJHtxKFxuY2Fub25pY2FsTmFtZSlcbiB9IHRvIGltcG9ydCBidXQgaXRzIHBvbGljeSBpcyBub3QgZGVmaW5lZC4gUGxlYXNlIGFkZCBhIHBvbGljeSBmb3IgJHtxKFxuc3BlY2lmaWVyKVxuIH1gKTtcblxuIH1cbiB9XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb2xpY3kgYXBwbGljYWJsZSB0byB0aGUgY2Fub25pY2FsTmFtZSBvZiB0aGUgcGFja2FnZVxuICpcbiAqIEBwYXJhbSB7UGFja2FnZU5hbWluZ0tpdH0gbmFtaW5nS2l0IC0gYSBrZXkgaW4gdGhlIHBvbGljeSByZXNvdXJjZXMgc3BlYyBpcyBkZXJpdmVkIGZybSB0aGVzZVxuICogQHBhcmFtIHtvYmplY3R8dW5kZWZpbmVkfSBwb2xpY3kgLSB1c2VyIHN1cHBsaWVkIHBvbGljeVxuICogQHJldHVybnMge29iamVjdHx1bmRlZmluZWR9IHBhY2thZ2VQb2xpY3kgaWYgcG9saWN5IHdhcyBzcGVjaWZpZWRcbiAqL1xuY29uc3QgICAgICAgIGdldFBvbGljeUZvclBhY2thZ2U9KG5hbWluZ0tpdCxwb2xpY3kpPT57XG5pZighcG9saWN5KXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuaWYobmFtaW5nS2l0LmlzRW50cnkpe1xucmV0dXJuIHBvbGljeS5lbnRyeTtcbiB9XG5jb25zdCBjYW5vbmljYWxOYW1lPWdlbmVyYXRlQ2Fub25pY2FsTmFtZShuYW1pbmdLaXQpO1xuaWYoY2Fub25pY2FsTmFtZT09PUFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKXtcbnJldHVybntcbmRlZmF1bHRBdHRlbnVhdG9yOnBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcixcbnBhY2thZ2VzOmRldGVjdEF0dGVudWF0b3JzKHBvbGljeSkucmVkdWNlKChwYWNrYWdlcyxzcGVjaWZpZXIpPT57XG5wYWNrYWdlc1tzcGVjaWZpZXJdPXRydWU7XG5yZXR1cm4gcGFja2FnZXM7XG4gfSx7fSl9O1xuXG4gfVxuaWYocG9saWN5LnJlc291cmNlcyYmcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXSl7XG52YWxpZGF0ZURlcGVuZGVuY2llcyhwb2xpY3ksY2Fub25pY2FsTmFtZSk7XG5yZXR1cm4gcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXTtcbiB9ZWxzZXtcbmNvbnNvbGUud2FybihcbiBgTm8gcG9saWN5IGZvciAnJHtjYW5vbmljYWxOYW1lfScsIG9taXR0aW5nIGZyb20gY29tcGFydG1lbnQgbWFwLmApO1xuXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbiB9OyRo4oCNX29uY2UuZ2V0UG9saWN5Rm9yUGFja2FnZShnZXRQb2xpY3lGb3JQYWNrYWdlKTtcblxuY29uc3QgZ2V0R2xvYmFsc0xpc3Q9KHBhY2thZ2VQb2xpY3kpPT57XG5pZighcGFja2FnZVBvbGljeS5nbG9iYWxzKXtcbnJldHVybltdO1xuIH1cbi8qIFRPRE86IGhhbmRsZSAnd3JpdGUnIHBvbGljeTogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xNDgyKi9cbnJldHVybiBlbnRyaWVzKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykuXG5maWx0ZXIoKFtfa2V5LHZhbHVlXSk9PnZhbHVlKS5cbm1hcCgoW2tleSxfdnZhbHVlXSk9PmtleSk7XG4gfTtcblxuY29uc3QgR0xPQkFMX0FUVEVOVUFUT1I9J2F0dGVudWF0ZUdsb2JhbHMnO1xuY29uc3QgTU9EVUxFX0FUVEVOVUFUT1I9J2F0dGVudWF0ZU1vZHVsZSc7XG4vKipcbiAqXG4gKiBAcGFyYW0ge0F0dGVudWF0aW9uRGVmaW5pdGlvbn0gYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcGFyYW0ge0RlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gYXR0ZW51YXRvcnNQcm92aWRlclxuICogQHBhcmFtIHtzdHJpbmd9IGF0dGVudWF0b3JFeHBvcnROYW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxGdW5jdGlvbj59XG4gKi9cbmNvbnN0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uPWFzeW5jKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnNQcm92aWRlcixcbmF0dGVudWF0b3JFeHBvcnROYW1lKT0+XG57XG5pZighYXR0ZW51YXRvcnNQcm92aWRlcil7XG50aHJvdyBFcnJvciggYGF0dGVudWF0b3JzUHJvdmlkZXIgaXMgcmVxdWlyZWQgdG8gaW1wb3J0IGF0dGVudWF0b3JzYCk7XG4gfVxuY29uc3R7c3BlY2lmaWVyLHBhcmFtcyxkaXNwbGF5TmFtZX09Z2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uKTtcblxuY29uc3QgYXR0ZW51YXRvcj1hd2FpdCBhdHRlbnVhdG9yc1Byb3ZpZGVyLmltcG9ydChzcGVjaWZpZXIpO1xuaWYoIWF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdKXtcbnRocm93IEVycm9yKFxuIGBBdHRlbnVhdG9yICR7cShkaXNwbGF5TmFtZSl9IGRvZXMgbm90IGV4cG9ydCAke3EoYXR0ZW51YXRvckV4cG9ydE5hbWUpfWApO1xuXG4gfVxuLyogVE9ETzogdW5jdXJyeSBiaW5kIGZvciBzZWN1cml0eT8qL1xuY29uc3QgYXR0ZW51YXRlPWF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdLmJpbmQoYXR0ZW51YXRvcixwYXJhbXMpO1xucmV0dXJuIGF0dGVudWF0ZTtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50Pn0gY29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50RGVzY3JpcHRvcj59IGNvbXBhcnRtZW50RGVzY3JpcHRvcnNcbiAqIEByZXR1cm5zIHtEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyPShcbmNvbXBhcnRtZW50cyxcbmNvbXBhcnRtZW50RGVzY3JpcHRvcnMpPT5cbntcbmxldCBpbXBvcnRBdHRlbnVhdG9yO1xubGV0IGRlZmF1bHRBdHRlbnVhdG9yO1xuLyogQXR0ZW51YXRvcnMgY29tcGFydG1lbnQgaXMgbm90IGNyZWF0ZWQgd2hlbiB0aGVyZSdzIG5vIHBvbGljeS4qL1xuLyogRXJyb3JzIHNob3VsZCBiZSB0aHJvd24gd2hlbiB0aGUgcHJvdmlkZXIgaXMgdXNlZC4qL1xuaWYoIWNvbXBhcnRtZW50RGVzY3JpcHRvcnNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdKXtcbmltcG9ydEF0dGVudWF0b3I9YXN5bmMoKT0+e1xudGhyb3cgRXJyb3IoIGBObyBhdHRlbnVhdG9ycyBzcGVjaWZpZWQgaW4gcG9saWN5YCk7XG4gfTtcbiB9ZWxzZXtcbmRlZmF1bHRBdHRlbnVhdG9yPVxuY29tcGFydG1lbnREZXNjcmlwdG9yc1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0ucG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yO1xuXG4vKiBBdCB0aGUgdGltZSBvZiB0aGlzIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZCwgYXR0ZW51YXRvcnMgY29tcGFydG1lbnQgd29uJ3QqL1xuLyogZXhpc3QgeWV0LCB3ZSBuZWVkIHRvIGRlZmVyIGxvb2tpbmcgaXQgdXAgaW4gY29tcGFydG1lbnRzIHRvIHRoZSB0aW1lIG9mKi9cbi8qIHRoZSBpbXBvcnQgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLiovXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0ZW51YXRvclNwZWNpZmllclxuICogQHJldHVybnMge1Byb21pc2U8QXR0ZW51YXRvcj59XG4gKi9cbmltcG9ydEF0dGVudWF0b3I9YXN5bmMoYXR0ZW51YXRvclNwZWNpZmllcik9PntcbmlmKCFhdHRlbnVhdG9yU3BlY2lmaWVyKXtcbmlmKCFkZWZhdWx0QXR0ZW51YXRvcil7XG50aHJvdyBFcnJvciggYE5vIGRlZmF1bHQgYXR0ZW51YXRvciBzcGVjaWZpZWQgaW4gcG9saWN5YCk7XG4gfVxuYXR0ZW51YXRvclNwZWNpZmllcj1kZWZhdWx0QXR0ZW51YXRvcjtcbiB9XG5jb25zdHtuYW1lc3BhY2V9PWF3YWl0IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0uaW1wb3J0KFxuYXR0ZW51YXRvclNwZWNpZmllcik7XG5cbnJldHVybiBuYW1lc3BhY2U7XG4gfTtcbiB9XG5cbnJldHVybntcbmltcG9ydDppbXBvcnRBdHRlbnVhdG9yfTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge0RlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gb3B0aW9ucy5hdHRlbnVhdG9yc1xuICogQHBhcmFtIHtBdHRlbnVhdGlvbkRlZmluaXRpb259IG9wdGlvbnMuYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucy5nbG9iYWxUaGlzXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucy5nbG9iYWxzXG4gKi8kaOKAjV9vbmNlLm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIobWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcik7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVHbG9iYWxUaGlzKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuZ2xvYmFsVGhpcyxcbmdsb2JhbHN9KVxue1xuY29uc3QgYXR0ZW51YXRlPWF3YWl0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnMsXG5HTE9CQUxfQVRURU5VQVRPUik7XG5cblxuLyogYXR0ZW51YXRlIGNhbiBlaXRoZXIgZGVmaW5lIHByb3BlcnRpZXMgb24gZ2xvYmFsVGhpcyBvbiBpdHMgb3duLCovXG4vKiBvciByZXR1cm4gYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyB0byB0cmFuc2ZlciBvbnRvIGdsb2JhbFRoaXMuKi9cbi8qIFRoZSBsYXR0ZXIgaXMgY29uc2lzdGVudCB3aXRoIGhvdyBtb2R1bGUgYXR0ZW51YXRvcnMgd29yayBzbyB0aGF0Ki9cbi8qIG9uZSBhdHRlbnVhdG9yIGltcGxlbWVudGF0aW9uIGNhbiBiZSB1c2VkIGZvciBib3RoIGlmIHVzZSBvZiovXG4vKiBkZWZpbmVQcm9wZXJ0eSBpcyBub3QgbmVlZGVkIGZvciBhdHRlbnVhdGluZyBnbG9iYWxzLiovXG5jb25zdCByZXN1bHQ9YXdhaXQgYXR0ZW51YXRlKGdsb2JhbHMsZ2xvYmFsVGhpcyk7XG5pZih0eXBlb2YgcmVzdWx0PT09J29iamVjdCcmJnJlc3VsdCE9PW51bGwpe1xuYXNzaWduKGdsb2JhbFRoaXMscmVzdWx0KTtcbiB9XG4gfVxuXG4vKipcbiAqIEZpbHRlcnMgYXZhaWxhYmxlIGdsb2JhbHMgYW5kIHJldHVybnMgYSBjb3B5IGFjY29yZGluZyB0byB0aGUgcG9saWN5XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGdsb2JhbFRoaXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBnbG9iYWxzXG4gKiBAcGFyYW0ge29iamVjdH0gcGFja2FnZVBvbGljeVxuICogQHBhcmFtIHtEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IGF0dGVudWF0b3JzXG4gKiBAcGFyYW0ge0FycmF5PFByb21pc2U+fSBwZW5kaW5nSm9ic1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXR0ZW51YXRlR2xvYmFscz0oXG5nbG9iYWxUaGlzLFxuZ2xvYmFscyxcbnBhY2thZ2VQb2xpY3ksXG5hdHRlbnVhdG9ycyxcbnBlbmRpbmdKb2JzLFxubmFtZT0nPHVua25vd24+Jyk9Plxue1xubGV0IGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dD0oKT0+e1xuZnJlZXplKGdsb2JhbFRoaXMpO1xuIH07XG5pZihwYWNrYWdlUG9saWN5JiZwYWNrYWdlUG9saWN5Lm5vR2xvYmFsRnJlZXplKXtcbmZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dD0oKT0+eyB9O1xuIH1cbmlmKCFwYWNrYWdlUG9saWN5fHxpc0FsbG93aW5nRXZlcnl0aGluZyhwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKXtcbnNlbGVjdGl2ZUNvcHkoZ2xvYmFscyxnbG9iYWxUaGlzKTtcbmZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xucmV0dXJuO1xuIH1cbmlmKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykpe1xuY29uc3QgYXR0ZW51YXRpb25EZWZpbml0aW9uPXBhY2thZ2VQb2xpY3kuZ2xvYmFscztcbmNvbnN0e2Rpc3BsYXlOYW1lfT1nZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oYXR0ZW51YXRpb25EZWZpbml0aW9uKTtcbmNvbnN0IGF0dGVudWF0aW9uUHJvbWlzZT1Qcm9taXNlLnJlc29sdmUoKS8qIGRlbGF5IHRvIG5leHQgdGljayB3aGlsZSBsaW5raW5nIGlzIHN5bmNocm9ub3VzbHkgZmluYWxpemVkKi8uXG50aGVuKCgpPT5cbmF0dGVudWF0ZUdsb2JhbFRoaXMoe1xuYXR0ZW51YXRvcnMsXG5hdHRlbnVhdGlvbkRlZmluaXRpb24sXG5nbG9iYWxUaGlzLFxuZ2xvYmFsc30pKS5cblxuXG50aGVuKGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCwoZXJyb3IpPT57XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbnRocm93IEVycm9yKFxuIGBFcnJvciB3aGlsZSBhdHRlbnVhdGluZyBnbG9iYWxzIGZvciAke3EobmFtZSl9IHdpdGggJHtxKFxuZGlzcGxheU5hbWUpXG4gfTogJHtxKGVycm9yLm1lc3NhZ2UpfWAvKiBUT0RPOiBjb25zaWRlciBhbiBvcHRpb24gdG8gZXhwb3NlIHN0YWNrdHJhY2UgZm9yIGVhc2Ugb2YgZGVidWdnaW5nKi8pO1xuXG4gfSk7XG5wZW5kaW5nSm9icy5wdXNoKGF0dGVudWF0aW9uUHJvbWlzZSk7XG5cbnJldHVybjtcbiB9XG5jb25zdCBsaXN0PWdldEdsb2JhbHNMaXN0KHBhY2thZ2VQb2xpY3kpO1xuc2VsZWN0aXZlQ29weShnbG9iYWxzLGdsb2JhbFRoaXMsbGlzdCk7XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbiB9O1xuXG4vKipcbiAqIFRocm93cyBpZiBpbXBvcnRpbmcgb2YgdGhlIHNwZWNpZmllciBpcyBub3QgYWxsb3dlZCBieSB0aGUgcG9saWN5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmllclxuICogQHBhcmFtIHtvYmplY3R9IGNvbXBhcnRtZW50RGVzY3JpcHRvclxuICogQHBhcmFtIHtvYmplY3R9IFtpbmZvXVxuICovJGjigI1fb25jZS5hdHRlbnVhdGVHbG9iYWxzKGF0dGVudWF0ZUdsb2JhbHMpO1xuY29uc3QgICAgICAgIGVuZm9yY2VNb2R1bGVQb2xpY3k9KHNwZWNpZmllcixjb21wYXJ0bWVudERlc2NyaXB0b3IsaW5mbyk9PntcbmNvbnN0e3BvbGljeSxtb2R1bGVzfT1jb21wYXJ0bWVudERlc2NyaXB0b3I7XG5pZighcG9saWN5KXtcbnJldHVybjtcbiB9XG5cbmlmKCFpbmZvLmV4aXQpe1xuaWYoIW1vZHVsZXNbc3BlY2lmaWVyXSl7XG50aHJvdyBFcnJvcihcbiBgSW1wb3J0aW5nICcke3NwZWNpZmllcn0nIHdhcyBub3QgYWxsb3dlZCBieSBwb2xpY3kgcGFja2FnZXM6JHtxKFxucG9saWN5LnBhY2thZ2VzKVxuIH1gKTtcblxuIH1cbnJldHVybjtcbiB9XG5cbmlmKCFwb2xpY3lMb29rdXBIZWxwZXIocG9saWN5LCdidWlsdGlucycsc3BlY2lmaWVyKSl7XG50aHJvdyBFcnJvcihcbiBgSW1wb3J0aW5nICcke3NwZWNpZmllcn0nIHdhcyBub3QgYWxsb3dlZCBieSBwb2xpY3kgJ2J1aWx0aW5zJzoke3EoXG5wb2xpY3kuYnVpbHRpbnMpXG4gfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge0RlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gb3B0aW9ucy5hdHRlbnVhdG9yc1xuICogQHBhcmFtIHtBdHRlbnVhdGlvbkRlZmluaXRpb259IG9wdGlvbnMuYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcGFyYW0ge01vZHVsZUV4cG9ydHNOYW1lc3BhY2V9IG9wdGlvbnMub3JpZ2luYWxNb2R1bGVcbiAqIEByZXR1cm5zIHtNb2R1bGVFeHBvcnRzTmFtZXNwYWNlfVxuICovJGjigI1fb25jZS5lbmZvcmNlTW9kdWxlUG9saWN5KGVuZm9yY2VNb2R1bGVQb2xpY3kpO1xuZnVuY3Rpb24gYXR0ZW51YXRlTW9kdWxlKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxub3JpZ2luYWxNb2R1bGV9KVxue1xuY29uc3QgYXR0ZW51YXRpb25Db21wYXJ0bWVudD1uZXcgQ29tcGFydG1lbnQoXG57fSxcbnt9LFxue1xucmVzb2x2ZUhvb2s6KG1vZHVsZVNwZWNpZmllcik9Pm1vZHVsZVNwZWNpZmllcixcbmltcG9ydEhvb2s6YXN5bmMoKT0+e1xuY29uc3QgYXR0ZW51YXRlPWF3YWl0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnMsXG5NT0RVTEVfQVRURU5VQVRPUik7XG5cbmNvbnN0IG5zPWF3YWl0IGF0dGVudWF0ZShvcmlnaW5hbE1vZHVsZSk7XG5jb25zdCBzdGF0aWNNb2R1bGVSZWNvcmQ9ZnJlZXplKHtcbmltcG9ydHM6W10sXG5leHBvcnRzOmtleXMobnMpLFxuZXhlY3V0ZToobW9kdWxlRXhwb3J0cyk9PntcbmFzc2lnbihtb2R1bGVFeHBvcnRzLG5zKTtcbiB9fSk7XG5cbnJldHVybiBzdGF0aWNNb2R1bGVSZWNvcmQ7XG4gfX0pO1xuXG5cbnJldHVybiBhdHRlbnVhdGlvbkNvbXBhcnRtZW50Lm1vZHVsZSgnLicpO1xuIH1cblxuLyoqXG4gKiBUaHJvd3MgaWYgaW1wb3J0aW5nIG9mIHRoZSBzcGVjaWZpZXIgaXMgbm90IGFsbG93ZWQgYnkgdGhlIHBvbGljeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjaWZpZXIgLSBleGl0IG1vZHVsZSBuYW1lXG4gKiBAcGFyYW0ge29iamVjdH0gb3JpZ2luYWxNb2R1bGUgLSByZWZlcmVuY2UgdG8gdGhlIGV4aXQgbW9kdWxlXG4gKiBAcGFyYW0ge29iamVjdH0gcG9saWN5IC0gbG9jYWwgY29tcGFydG1lbnQgcG9saWN5XG4gKiBAcGFyYW0ge0RlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gYXR0ZW51YXRvcnMgLSBhIGtleS12YWx1ZSB3aGVyZSBhdHRlbnVhdGlvbnMgY2FuIGJlIGZvdW5kXG4gKi9cbmNvbnN0ICAgICAgICBhdHRlbnVhdGVNb2R1bGVIb29rPShcbnNwZWNpZmllcixcbm9yaWdpbmFsTW9kdWxlLFxucG9saWN5LFxuYXR0ZW51YXRvcnMpPT5cbntcbmNvbnN0IHBvbGljeVZhbHVlPXBvbGljeUxvb2t1cEhlbHBlcihwb2xpY3ksJ2J1aWx0aW5zJyxzcGVjaWZpZXIpO1xuaWYoIXBvbGljeXx8cG9saWN5VmFsdWU9PT10cnVlKXtcbnJldHVybiBvcmlnaW5hbE1vZHVsZTtcbiB9XG5cbmlmKCFwb2xpY3lWYWx1ZSl7XG50aHJvdyBFcnJvcihcbiBgQXR0ZW51YXRpb24gZmFpbGVkICcke3NwZWNpZmllcn0nIHdhcyBub3QgaW4gcG9saWN5IGJ1aWx0aW5zOiR7cShcbnBvbGljeS5idWlsdGlucylcbiB9YCk7XG5cbiB9XG5cbnJldHVybiBhdHRlbnVhdGVNb2R1bGUoe1xuYXR0ZW51YXRvcnMsXG5hdHRlbnVhdGlvbkRlZmluaXRpb246cG9saWN5VmFsdWUsXG5vcmlnaW5hbE1vZHVsZX0pO1xuXG4gfTskaOKAjV9vbmNlLmF0dGVudWF0ZU1vZHVsZUhvb2soYXR0ZW51YXRlTW9kdWxlSG9vayk7XG5cbmNvbnN0IHBhZERpYWdub3Npcz0odGV4dCk9PiBgICgke3RleHR9KWA7XG4vKipcbiAqIFByb3ZpZGUgZGlnbm9zdGljIGluZm9ybWF0aW9uIGZvciBhIG1pc3NpbmcgY29tcGFydG1lbnQgZXJyb3JcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gIGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSAgYXJncy5tb2R1bGVTcGVjaWZpZXJcbiAqIEBwYXJhbSB7b2JqZWN0fSAgYXJncy5jb21wYXJ0bWVudERlc2NyaXB0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSAgYXJncy5mb3JlaWduTW9kdWxlU3BlY2lmaWVyXG4gKiBAcGFyYW0ge3N0cmluZ30gIGFyZ3MuZm9yZWlnbkNvbXBhcnRtZW50TmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIGRpYWdub3NlTWlzc2luZ0NvbXBhcnRtZW50RXJyb3I9KHtcbm1vZHVsZVNwZWNpZmllcixcbmNvbXBhcnRtZW50RGVzY3JpcHRvcixcbmZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIsXG5mb3JlaWduQ29tcGFydG1lbnROYW1lfSk9Plxue1xuY29uc3R7cG9saWN5LG5hbWUsc2NvcGVzfT1jb21wYXJ0bWVudERlc2NyaXB0b3I7XG5cbmlmKHBvbGljeSl7XG5pZighcG9saWN5LnBhY2thZ2VzKXtcbnJldHVybiBwYWREaWFnbm9zaXMoXG4gYFRoZXJlIHdlcmUgbm8gYWxsb3dlZCBwYWNrYWdlcyBzcGVjaWZpZWQgaW4gcG9saWN5IGZvciAke3EobmFtZSl9YCk7XG5cbiB9XG5pZihuYW1lPT09QVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpe1xucmV0dXJuIHBhZERpYWdub3NpcyhcbiBgQXR0ZW51YXRvciAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSB3YXMgaW1wb3J0ZWQgYnV0IHRoZXJlIGlzIG5vIHBvbGljeSByZXNvdXJjZXMgZW50cnkgZGVmaW5lZCBmb3IgaXQuYCk7XG5cbiB9XG5cbmNvbnN0IHNjb3BlTmFtZXM9ZW50cmllcyhzY29wZXMpLlxuZmlsdGVyKChbX25hbWUsc2NvcGVdKT0+c2NvcGUuY29tcGFydG1lbnQ9PT1mb3JlaWduQ29tcGFydG1lbnROYW1lKS5cbm1hcCgoW3Njb3BlTmFtZV0pPT5zY29wZU5hbWUpO1xuaWYoc2NvcGVOYW1lcy5sZW5ndGg9PT0xJiZzY29wZU5hbWVzWzBdPT09bW9kdWxlU3BlY2lmaWVyKXtcbnJldHVybiBwYWREaWFnbm9zaXMoXG4gYFBhY2thZ2UgJHtxKFxubW9kdWxlU3BlY2lmaWVyKVxuIH0gaXMgbWlzc2luZy4gQXJlIHlvdSBzdXJlIHRoZXJlIGlzIGFuIGVudHJ5IGluIHBvbGljeSByZXNvdXJjZXMgc3BlY2lmaWVkIGZvciBpdD9gKTtcblxuIH1lbHNle1xucmV0dXJuIHBhZERpYWdub3NpcyhcbiBgUGFja2FnZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gcmVzb2x2ZXMgdG8gJHtxKFxuZm9yZWlnbk1vZHVsZVNwZWNpZmllcilcbiB9IGluICR7cShcbmZvcmVpZ25Db21wYXJ0bWVudE5hbWUpXG4gfSB3aGljaCBzZWVtcyBkaXNhbGxvd2VkIGJ5IHBvbGljeS4gVGhlcmUgaXMgbGlrZWx5IGFuIG92ZXJyaWRlIGRlZmluZWQgdGhhdCBjYXVzZXMgYW5vdGhlciBwYWNrYWdlIHRvIGJlIGltcG9ydGVkIGFzICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9LmApO1xuXG4gfVxuIH1cbi8qIE9taXQgZGlhZ25vc3RpY3Mgd2hlbiBwYXJlbnQgcGFja2FnZSBoYWQgbm8gcG9saWN5IC0gaXQgbWVhbnMgdGhlcmUgd2FzIG5vIHBvbGljeS4qL1xucmV0dXJuJyc7XG4gfTskaOKAjV9vbmNlLmRpYWdub3NlTWlzc2luZ0NvbXBhcnRtZW50RXJyb3IoZGlhZ25vc2VNaXNzaW5nQ29tcGFydG1lbnRFcnJvcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiXSwiZGV0ZWN0QXR0ZW51YXRvcnMiOlsiZGV0ZWN0QXR0ZW51YXRvcnMiXSwiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSI6WyJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5Il0sImdldFBvbGljeUZvclBhY2thZ2UiOlsiZ2V0UG9saWN5Rm9yUGFja2FnZSJdLCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIjpbIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwiYXR0ZW51YXRlR2xvYmFscyI6WyJhdHRlbnVhdGVHbG9iYWxzIl0sImVuZm9yY2VNb2R1bGVQb2xpY3kiOlsiZW5mb3JjZU1vZHVsZVBvbGljeSJdLCJhdHRlbnVhdGVNb2R1bGVIb29rIjpbImF0dGVudWF0ZU1vZHVsZUhvb2siXSwiZGlhZ25vc2VNaXNzaW5nQ29tcGFydG1lbnRFcnJvciI6WyJkaWFnbm9zZU1pc3NpbmdDb21wYXJ0bWVudEVycm9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEFxd72NAwAAjQMAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wb3dlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInVucGFja1JlYWRQb3dlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZEZufSBSZWFkRm4gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNhbm9uaWNhbEZufSBDYW5vbmljYWxGbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZFBvd2Vyc30gUmVhZFBvd2VycyAqL1xuXG4vKiogQHR5cGUge0Nhbm9uaWNhbEZufSAqL1xuY29uc3QgY2Fub25pY2FsU2hpbT1hc3luYyhwYXRoKT0+cGF0aDtcblxuLyoqXG4gKiBAcGFyYW0ge1JlYWRGbiB8IFJlYWRQb3dlcnN9IHBvd2Vyc1xuICogQHJldHVybnMge1JlYWRQb3dlcnN9XG4gKi9cbmNvbnN0ICAgICAgICB1bnBhY2tSZWFkUG93ZXJzPShwb3dlcnMpPT57XG5pZih0eXBlb2YgcG93ZXJzPT09J2Z1bmN0aW9uJyl7XG5yZXR1cm57XG5yZWFkOnBvd2VycyxcbmNhbm9uaWNhbDpjYW5vbmljYWxTaGltfTtcblxuIH1cbnJldHVybiBwb3dlcnM7XG4gfTskaOKAjV9vbmNlLnVucGFja1JlYWRQb3dlcnModW5wYWNrUmVhZFBvd2Vycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidW5wYWNrUmVhZFBvd2VycyI6WyJ1bnBhY2tSZWFkUG93ZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH4kbi3SEQAA0hEAACQAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgdHJhY2tUdXJuczskaOKAjV9pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsIFskaOKAjV9hID0+ICh0cmFja1R1cm5zID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXI9e1xuc2V0KF90YXJnZXQsX3Byb3AsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuaXNFeHRlbnNpYmxlKF90YXJnZXQpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5zZXRQcm90b3R5cGVPZihfdGFyZ2V0LF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmRlbGV0ZVByb3BlcnR5KF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIGZhbHNlO1xuIH19O1xuXG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQoX3RhcmdldCxwLHJlY2VpdmVyKXtcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbmlmKHRoaXMhPT1yZWNlaXZlcil7XG4vKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbmFzc2VydC5lcnJvcihcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtwfVwiIG1ldGhvZCBvZiBFKCR7cSh4KX0pYCkpO1xuXG5cbiB9XG5cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZCh4LHAsYXJncyk7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnQXJyYXk9W10pe1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24oeCxhcmdBcnJheSk7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVzZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKXtcbnJldHVybiBoYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldChfdGFyZ2V0LHAscmVjZWl2ZXIpe1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG50aGlzPT09cmVjZWl2ZXJ8fFxuRmFpbCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocCl9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKFxueClcbiB9KWA7XG5IYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHgscCxhcmdzKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKXtcbkhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seSh4LGFyZ3NBcnJheSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0sXG5oYXMoX3RhcmdldCxfcCl7XG4vKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9pbmRleCcpLkVQcm94eX1cbiAqL1xuZnVuY3Rpb24gICAgICAgICAgICAgICAgbWFrZUUoSGFuZGxlZFByb21pc2Upe1xuZnVuY3Rpb24gRSh4KXtcbmNvbnN0IGhhbmRsZXI9RVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKTtcbnJldHVybiBoYXJkZW4obmV3IFByb3h5KCgpPT57IH0saGFuZGxlcikpO1xuIH1cblxuY29uc3QgbWFrZUVHZXR0ZXJQcm94eT0oeCk9PlxubmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCkse1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhcyhfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiB0cnVlO1xuIH0sXG5nZXQoX3RhcmdldCxwcm9wKXtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5nZXQoeCxwcm9wKTtcbiB9fSk7XG5cblxuRS5nZXQ9bWFrZUVHZXR0ZXJQcm94eTtcbkUucmVzb2x2ZT1IYW5kbGVkUHJvbWlzZS5yZXNvbHZlO1xuRS5zZW5kT25seT0oeCk9PntcbmNvbnN0IGhhbmRsZXI9RXNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfTtcblxuRS53aGVuPSh4LG9uZnVsZmlsbGVkLG9ucmVqZWN0ZWQpPT57XG5jb25zdFtvbnN1Y2Nlc3Msb25mYWlsdXJlXT10cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSk7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKG9uc3VjY2VzcyxvbmZhaWx1cmUpO1xuIH07XG5cbnJldHVybiBoYXJkZW4oRSk7XG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIG1ha2VFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANwvtTx8CAAAfAgAAKgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoSGFuZGxlZFByb21pc2UpOyRo4oCNX29uY2UuRShFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoVgjP48QAACPEAAALgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLW5vY2hlY2sqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyogTk9URTogV2UgY2FuJ3QgaW1wb3J0IHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3QgaW4gc2NvcGUgYmVmb3JlIGxvY2tkb3duLiovXG4vKiBpbXBvcnQgeyBhc3NlcnQsIGRldGFpbHMgYXMgWCwgRmFpbCB9IGZyb20gJ0BhZ29yaWMvYXNzZXJ0JzsqL1xuXG4vKiBXQVJOSU5HOiBHbG9iYWwgTXV0YWJsZSBTdGF0ZSEqL1xuLyogVGhpcyBzdGF0ZSBpcyBjb21tdW5pY2F0ZWQgdG8gYGFzc2VydGAgdGhhdCBtYWtlcyBpdCBhdmFpbGFibGUgdG8gdGhlKi9cbi8qIGNhdXNhbCBjb25zb2xlLCB3aGljaCBhZmZlY3RzIHRoZSBjb25zb2xlIGxvZyBvdXRwdXQuIE5vcm1hbGx5IHdlKi9cbi8qIHJlZ2FyZCB0aGUgYWJpbGl0eSB0byBzZWUgY29uc29sZSBsb2cgb3V0cHV0IGFzIGEgbWV0YS1sZXZlbCBwcml2aWxlZ2UqL1xuLyogYW5hbG9nb3VzIHRvIHRoZSBhYmlsaXR5IHRvIGRlYnVnLiBBc2lkZSBmcm9tIHRoYXQsIHRoaXMgbW9kdWxlIHNob3VsZCovXG4vKiBub3QgaGF2ZSBhbnkgb2JzZXJ2YWJseSBtdXRhYmxlIHN0YXRlLiovXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuPTA7XG5sZXQgaGlkZGVuQ3VycmVudEV2ZW50PTA7XG5cbi8qIFRPRE8gVXNlIGVudmlyb25tZW50LW9wdGlvbnMuanMgY3VycmVudGx5IGluIHNlcy9zcmMgYWZ0ZXIgZmFjdG9yaW5nIGl0IG91dCovXG4vKiB0byBhIG5ldyBwYWNrYWdlLiovXG5jb25zdCBlbnY9KGdsb2JhbFRoaXMucHJvY2Vzc3x8e30pLmVudnx8e307XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFPShlbnYuREVCVUd8fCcnKS5zcGxpdCgnOicpLmluY2x1ZGVzKCd0cmFjay10dXJucycpO1xuXG5jb25zdCB2YWxpZE9wdGlvblZhbHVlcz1mcmVlemUoW3VuZGVmaW5lZCwnZW5hYmxlZCcsJ2Rpc2FibGVkJ10pO1xuXG4vKiBUcmFjay10dXJucyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBkaXNhYmxlZCBieSBhbiBlbnZpcm9ubWVudCovXG4vKiBvcHRpb24uKi9cbmNvbnN0IGVudk9wdGlvblZhbHVlPWVudi5UUkFDS19UVVJOUztcbmlmKCF2YWxpZE9wdGlvblZhbHVlcy5pbmNsdWRlcyhlbnZPcHRpb25WYWx1ZSkpe1xudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgdW5yZWNvZ25pemVkIFRSQUNLX1RVUk5TICR7SlNPTi5zdHJpbmdpZnkoZW52T3B0aW9uVmFsdWUpfWApO1xuXG4gfVxuY29uc3QgRU5BQkxFRD0oZW52T3B0aW9uVmFsdWV8fCdkaXNhYmxlZCcpPT09J2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvdXQgb2YgdHJhY2tUdXJucygpIHRvIGRpc2NvdXJhZ2UgdGhlKi9cbi8qIGNsb3N1cmVzIGZyb20gaG9sZGluZyBvbnRvICdhcmdzJyBvciAnZnVuYycgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LCovXG4vKiB3aGljaCB3ZSd2ZSBzZWVuIGNhdXNlIEhhbmRsZWRQcm9taXNlIGFyZ3VtZW50cyB0byBiZSByZXRhaW5lZCBmb3IqL1xuLyogYSBzdXJwcmlzaW5nbHkgbG9uZyB0aW1lLiovXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGU9KGRldGFpbHNOb3RlKT0+KHJlYXNvbik9PntcbmlmKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKHJlYXNvbixkZXRhaWxzTm90ZSk7XG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLHJlYXNvbik7XG4gfVxuIH07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbj1cbihmdW5jLHNlbmRpbmdFcnJvcixYKT0+XG4oLi4uYXJncyk9PntcbmhpZGRlblByaW9yRXJyb3I9c2VuZGluZ0Vycm9yO1xuaGlkZGVuQ3VycmVudFR1cm4rPTE7XG5oaWRkZW5DdXJyZW50RXZlbnQ9MDtcbnRyeXtcbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbmlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLGVycik7XG4gfVxudGhyb3cgZXJyO1xuIH1cbi8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG5jb25zdCBkZXRhaWxzTm90ZT1YIGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xucmV0dXJuIHJlc3VsdDtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9bmV3IEVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuIGZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSk7XG4gfTskaOKAjV9vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP0lSmYLDAAACwwAADUAAABAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuNC9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQsICduYW1lJywge3ZhbHVlOiBcIndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50XCJ9KTskaOKAjV9vbmNlLndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KTsgICBmdW5jdGlvbiAgICAgICAgd3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQoXG5PbGRDb21wYXJ0bWVudCxcbmluZXNjYXBhYmxlVHJhbnNmb3JtcyxcbmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcylcbntcbi8qIFRoaXMgaXMgdGhlIG5ldyBDb21wYXJ0bWVudCBjb25zdHJ1Y3Rvci4gV2UgbmFtZSBpdCBgQ29tcGFydG1lbnRgIHNvKi9cbi8qIHRoYXQgaXQncyAubmFtZSBwcm9wZXJ0eSBpcyBjb3JyZWN0LCBidXQgd2UgaG9sZCBpdCBpbiAnTmV3Q29tcGFydG1lbnQnKi9cbi8qIHNvIHRoYXQgbGludCBkb2Vzbid0IHRoaW5rIHdlJ3JlIHNoYWRvd2luZyB0aGUgb3JpZ2luYWwuKi9cbmNvbnN0IE5ld0NvbXBhcnRtZW50PWZ1bmN0aW9uIENvbXBhcnRtZW50KFxuZW5kb3dtZW50cyxcbm1vZHVsZXMsXG5vbGRPcHRpb25zPXt9KVxue1xuY29uc3R7dHJhbnNmb3JtczpvbGRUcmFuc2Zvcm1zPVtdLC4uLm90aGVyT3B0aW9uc309b2xkT3B0aW9ucztcbmNvbnN0IG5ld1RyYW5zZm9ybXM9Wy4uLm9sZFRyYW5zZm9ybXMsLi4uaW5lc2NhcGFibGVUcmFuc2Zvcm1zXTtcbmNvbnN0IG5ld09wdGlvbnM9e1xuLi4ub3RoZXJPcHRpb25zLFxudHJhbnNmb3JtczpuZXdUcmFuc2Zvcm1zfTtcblxuXG4vKiBUaGUgcmVhbCBDb21wYXJ0bWVudCBpcyBkZWZpbmVkIGFzIGEgY2xhc3MsIHNvICduZXcgQ29tcGFydG1lbnQoKScqL1xuLyogd29ya3MgYnV0IG5vdCAnQ29tcGFydG1lbnQoKScuIFdlIGNhbiBiZWhhdmUgdGhlIHNhbWUgd2F5LiBJdCB3b3VsZCBiZSovXG4vKiBuaWNlIHRvIGRlbGVnYXRlIHRoZSAndGhyb3cnIHRvIHRoZSBvcmlnaW5hbCBjb25zdHJ1Y3RvciBieSBrbm93aW5nKi9cbi8qIGNhbGxpbmcgaXQgdGhlIHdyb25nIHdheSwgYnV0IEkgZG9uJ3Qga25vdyBob3cgdG8gZG8gdGhhdC4qL1xuaWYobmV3LnRhcmdldD09PXVuZGVmaW5lZCl7XG4vKiBgbmV3Q29tcGFydG1lbnRgIHdhcyBjYWxsZWQgYXMgYSBmdW5jdGlvbiovXG50aHJvdyBFcnJvcignQ29tcGFydG1lbnQgbXVzdCBiZSBjYWxsZWQgYXMgYSBjb25zdHJ1Y3RvcicpO1xuIH1cblxuLyogSXQsIG9yIGEgc3ViY2xhc3MsIHdhcyBjYWxsZWQgYXMgYSBjb25zdHJ1Y3RvciovXG5cbmNvbnN0IGM9UmVmbGVjdC5jb25zdHJ1Y3QoXG5PbGRDb21wYXJ0bWVudCxcbltlbmRvd21lbnRzLG1vZHVsZXMsbmV3T3B0aW9uc10sXG5uZXcudGFyZ2V0KTtcblxuLyogVGhlIGNvbmZpbmVtZW50IGFwcGxpZXMgdG8gYWxsIGNvbXBhcnRtZW50cyB0b28uIFRoaXMgcmVsaWVzIHVwb24gdGhlKi9cbi8qIGNoaWxkJ3Mgbm9ybWFsIENvbXBhcnRtZW50IGJlaGF2aW5nIHRoZSBzYW1lIHdheSBhcyB0aGUgcGFyZW50J3MsKi9cbi8qIHdoaWNoIHdpbGwgY2Vhc2UgdG8gYmUgdGhlIGNhc2Ugc29vbiAodGhlaXIgbW9kdWxlIHRhYmxlcyBhcmUqL1xuLyogZGlmZmVyZW50KS4gVE9ETzogdXBkYXRlIHRoaXMgd2hlbiB0aGF0IGhhcHBlbnMsIHdlIG5lZWQgc29tZXRoaW5nKi9cbi8qIGxpa2UgYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50ID0gd3JhcChjLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQpLCBidXQqL1xuLyogdGhlcmUgYXJlIGRldGFpbHMgdG8gd29yayBvdXQuKi9cbmMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudD1OZXdDb21wYXJ0bWVudDtcblxuZm9yKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXMoaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzKSl7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoYy5nbG9iYWxUaGlzLHByb3Ase1xudmFsdWU6aW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzW3Byb3BdLFxud3JpdGFibGU6dHJ1ZSxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6dHJ1ZX0pO1xuXG4gfVxuXG5yZXR1cm4gYztcbiB9O1xuXG4vKiBlbnN1cmUgYChjIGlzaW5zdGFuY2UgQ29tcGFydG1lbnQpYCByZW1haW5zIHRydWUqL1xuTmV3Q29tcGFydG1lbnQucHJvdG90eXBlPU9sZENvbXBhcnRtZW50LnByb3RvdHlwZTtcblxuLyogU0VDVVJJVFkgTk9URTogaWYgdGhpcyB3ZXJlIHVzZWQgb3V0c2lkZSBvZiBTRVMsIHRoaXMgbWlnaHQgbGVhdmUqL1xuLyogYy5wcm90b3R5cGUuY29uc3RydWN0b3IgcG9pbnRpbmcgYXQgdGhlIG9yaWdpbmFsICh1bnRhbWVkKSBDb21wYXJ0bWVudCwqL1xuLyogd2hpY2ggd291bGQgYWxsb3cgYSBicmVhY2guIEtyaXMgc2F5cyB0aGlzIHdpbGwgYmUgaGFyZCB0byBmaXggdW50aWwgaGUqL1xuLyogcmV3cml0ZXMgdGhlIGNvbXBhcnRtZW50IHNoaW0sIHBvc3NpYmx5IGFzIGEgcGxhaW4gZnVuY3Rpb24gaW5zdGVhZCBvZiBhKi9cbi8qIGNsYXNzLiBVbmRlciBTRVMsIE9sZENvbXBhcnRtZW50LnByb3RvdHlwZS5jb25zdHJ1Y3RvciBpcyB0YW1lZCovXG5cbnJldHVybiBOZXdDb21wYXJ0bWVudDtcbiB9XG5cbi8qIHN3aW5nc2V0IHdvdWxkIGRvIHRoaXMgdG8gZWFjaCBkeW5hbWljIHZhdCovXG4vKiBjLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQgPSB3cmFwQ29tcGFydG1lbnQoYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50LCAuLik7Ki9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCI6WyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAxrMWAWRMAAFkTAAAnAAAAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY29tcGFydG1lbnQtd3JhcHBlci5qcyIsIkBlbmRvL2Jhc2U2NCIsIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEJ1bmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXJzZUFyY2hpdmUsZGVjb2RlQmFzZTY0LHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qc1wiLCBbW1wicGFyc2VBcmNoaXZlXCIsIFskaOKAjV9hID0+IChwYXJzZUFyY2hpdmUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vYmFzZTY0XCIsIFtbXCJkZWNvZGVCYXNlNjRcIiwgWyRo4oCNX2EgPT4gKGRlY29kZUJhc2U2NCA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbXBhcnRtZW50LXdyYXBwZXIuanNcIiwgW1tcIndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50XCIsIFskaOKAjV9hID0+ICh3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpbXBvcnRCdW5kbGUsICduYW1lJywge3ZhbHVlOiBcImltcG9ydEJ1bmRsZVwifSk7JGjigI1fb25jZS5pbXBvcnRCdW5kbGUoaW1wb3J0QnVuZGxlKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiBpbXBvcnRCdW5kbGUgdGFrZXMgdGhlIG91dHB1dCBvZiBidW5kbGUtc291cmNlLCBhbmQgcmV0dXJucyBhIG5hbWVzcGFjZSovXG4vKiBvYmplY3QgKHdpdGggLmRlZmF1bHQsIGFuZCBtYXliZSBvdGhlciBwcm9wZXJ0aWVzIGZvciBuYW1lZCBleHBvcnRzKSovXG5cbmFzeW5jIGZ1bmN0aW9uICAgICAgICBpbXBvcnRCdW5kbGUoYnVuZGxlLG9wdGlvbnM9e30pe1xuY29uc3R7XG5maWxlUHJlZml4LFxuZW5kb3dtZW50czpvcHRFbmRvd21lbnRzPXt9LFxuLyogdHJhbnNmb3JtcyBhcmUgaW5kZWVkIF9fc2hpbVRyYW5zZm9ybXNfXywgaW50ZW5kZWQgdG8gYXBwbHkgdG8gYm90aCovXG4vKiBldmFsdWF0ZWQgcHJvZ3JhbXMgYW5kIG1vZHVsZXMgc2hpbW1lZCB0byBwcm9ncmFtcy4qL1xudHJhbnNmb3Jtcz1bXSxcbmluZXNjYXBhYmxlVHJhbnNmb3Jtcz1bXSxcbmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcz17fX09XG5vcHRpb25zO1xuY29uc3QgZW5kb3dtZW50cz17XG5UZXh0RW5jb2RlcixcblRleHREZWNvZGVyLFxuVVJMOmdsb2JhbFRoaXMuVVJMLC8qIEFic2VudCBvbmx5IGluIFhTbmFwKi9cbkJhc2U2NDpnbG9iYWxUaGlzLkJhc2U2NCwvKiBQcmVzZW50IG9ubHkgaW4gWFNuYXAqL1xuYXRvYjpnbG9iYWxUaGlzLmF0b2IsXG5idG9hOmdsb2JhbFRoaXMuYnRvYSxcbi4uLm9wdEVuZG93bWVudHN9O1xuXG5cbmxldCBDb21wYXJ0bWVudFRvVXNlPUNvbXBhcnRtZW50O1xuaWYoXG5pbmVzY2FwYWJsZVRyYW5zZm9ybXMubGVuZ3RofHxcbk9iamVjdC5rZXlzKGluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcykubGVuZ3RoKVxue1xuLyogQHRzLWV4cGVjdC1lcnJvciBUUzIzMjIgbm8gbWF0Y2ggZm9yIHRoZSBzaWduYXR1cmUqL1xuQ29tcGFydG1lbnRUb1VzZT13cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudChcbkNvbXBhcnRtZW50LFxuaW5lc2NhcGFibGVUcmFuc2Zvcm1zLFxuaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzKTtcblxuIH1cblxuY29uc3R7bW9kdWxlRm9ybWF0fT1idW5kbGU7XG5pZihtb2R1bGVGb3JtYXQ9PT0nZW5kb1ppcEJhc2U2NCcpe1xuY29uc3R7ZW5kb1ppcEJhc2U2NH09YnVuZGxlO1xuY29uc3QgYnl0ZXM9ZGVjb2RlQmFzZTY0KGVuZG9aaXBCYXNlNjQpO1xuY29uc3QgYXJjaGl2ZT1hd2FpdCBwYXJzZUFyY2hpdmUoYnl0ZXMpO1xuLyogQ2FsbCBpbXBvcnQgYnkgcHJvcGVydHkgdG8gYnlwYXNzIFNFUyBjZW5zb3JpbmcgZm9yIGR5bmFtaWMgaW1wb3J0LiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZG90LW5vdGF0aW9uKi9cbmNvbnN0e25hbWVzcGFjZX09YXdhaXQgYXJjaGl2ZVsnaW1wb3J0J10oe1xuZ2xvYmFsczplbmRvd21lbnRzLFxuX19zaGltVHJhbnNmb3Jtc19fOnRyYW5zZm9ybXMsXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTMjc0MCBtaXNzaW5nIHByb3BlcnRpZXMgZnJvbSB0eXBlKi9cbkNvbXBhcnRtZW50OkNvbXBhcnRtZW50VG9Vc2V9KTtcblxuLyogbmFtZXNwYWNlLmRlZmF1bHQgaGFzIHRoZSBkZWZhdWx0IGV4cG9ydCovXG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cblxubGV0IGM7XG5jb25zdHtzb3VyY2Usc291cmNlTWFwfT1idW5kbGU7XG5pZihtb2R1bGVGb3JtYXQ9PT0nZ2V0RXhwb3J0Jyl7XG4vKiBUaGUgJ2dldEV4cG9ydCcgZm9ybWF0IGlzIGEgc3RyaW5nIHdoaWNoIGRlZmluZXMgYSB3cmFwcGVyIGZ1bmN0aW9uKi9cbi8qIG5hbWVkIGBnZXRFeHBvcnQoKWAuIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBgbW9kdWxlYCB0byB0aGUqL1xuLyogbGluZWFyaXplZCBzb3VyY2UgZmlsZSwgZXhlY3V0ZXMgdGhhdCBzb3VyY2UsIHRoZW4gcmV0dXJucyovXG4vKiBgbW9kdWxlLmV4cG9ydHNgLiBUbyBnZXQgdGhlIGZ1bmN0aW9uIG9iamVjdCBvdXQgb2YgYSBwcm9ncmFtLW1vZGUqL1xuLyogZXZhbHVhdGlvbiwgd2UgbXVzdCB3cmFwIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHBhcmVudGhlc2VzKi9cbi8qIChtYWtpbmcgaXQgYW4gZXhwcmVzc2lvbikuIFdlIGFsc28gd2FudCB0byBhcHBlbmQgdGhlIGBzb3VyY2VNYXBgKi9cbi8qIGNvbW1lbnQgc28gYGV2YWx1YXRlYCBjYW4gYXR0YWNoIHVzZWZ1bCBkZWJ1ZyBpbmZvcm1hdGlvbi4gRmluYWxseSwgdG8qL1xuLyogZXh0cmFjdCB0aGUgbmFtZXNwYWNlIG9iamVjdCwgd2UgbmVlZCB0byBpbnZva2UgdGhpcyBmdW5jdGlvbi4qL1xuIH1lbHNlIGlmKG1vZHVsZUZvcm1hdD09PSduZXN0ZWRFdmFsdWF0ZScpe1xuLyogVGhlICduZXN0ZWRFdmFsdWF0ZScgZm9ybWF0IGlzIHNpbWlsYXIsIGV4Y2VwdCB0aGUgd3JhcHBlciBmdW5jdGlvbiovXG4vKiAobm93IG5hbWVkIGBnZXRFeHBvcnRXaXRoTmVzdGVkRXZhbHVhdGVgKSB3cmFwcyBtb3JlIHRoYW4gYSBzaW5nbGUqL1xuLyogbGluZWFyaXplZCBzdHJpbmcuIEVhY2ggc291cmNlIG1vZHVsZSBpcyBwcm9jZXNzZWQgKGNvbnZlcnRpbmcqL1xuLyogYGltcG9ydGAgaW50byBgcmVxdWlyZWApIGFuZCBhZGRlZCB0byBhIHRhYmxlIG5hbWVkIGBzb3VyY2VCdW5kbGVgLiovXG4vKiBFYWNoIG1vZHVsZSB3aWxsIGJlIGV2YWx1YXRlZCBzZXBhcmF0ZWx5IChzbyB0aGV5IGNhbiBnZXQgZGlzdGluY3QqL1xuLyogc291cmNlTWFwIHN0cmluZ3MpLCB1c2luZyBhIG1hbmRhdG9yeSBlbmRvd21lbnQgbmFtZWQqL1xuLyogYG5lc3RlZEV2YWx1YXRlYC4gVGhlIHdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoKi9cbi8qIGBmaWxlUHJlZml4YCwgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBzb3VyY2VNYXAgZm9yIHRoZSB0b3AtbGV2ZWwqL1xuLyogbW9kdWxlLiBUaGUgc291cmNlTWFwIG5hbWUgZm9yIG90aGVyIG1vZHVsZXMgd2lsbCBiZSBkZXJpdmVkIGZyb20qL1xuLyogYGZpbGVQcmVmaXhgIGFuZCB0aGUgcmVsYXRpdmUgaW1wb3J0IHBhdGggb2YgZWFjaCBtb2R1bGUuKi9cbmVuZG93bWVudHMubmVzdGVkRXZhbHVhdGU9KHNyYyk9PmMuZXZhbHVhdGUoc3JjKTtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCBtb2R1bGVGb3JtYXQgJyR7bW9kdWxlRm9ybWF0fSdgO1xuIH1cblxuYz1uZXcgQ29tcGFydG1lbnRUb1VzZShlbmRvd21lbnRzLHt9LHt0cmFuc2Zvcm1zfSk7XG5oYXJkZW4oYy5nbG9iYWxUaGlzKTtcbmNvbnN0IGFjdHVhbFNvdXJjZT0gYCgke3NvdXJjZX0pXFxuJHtzb3VyY2VNYXB8fCcnfWA7XG5jb25zdCBuYW1lc3BhY2U9Yy5ldmFsdWF0ZShhY3R1YWxTb3VyY2UpKGZpbGVQcmVmaXgpO1xuLyogbmFtZXNwYWNlLmRlZmF1bHQgaGFzIHRoZSBkZWZhdWx0IGV4cG9ydCovXG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cblxuLyogaW1wb3J0QnVuZGxlKGJ1bmRsZSwgeyBtZXRlcmluZzogeyBnZXRNZXRlciwgbWV0ZXJpbmdPcHRpb25zIH0gfSk7XG5pbXBvcnRCdW5kbGUoYnVuZGxlLCB7IHRyYW5zZm9ybXM6IFsgbWV0ZXJUcmFuc2Zvcm0gXSwgbGV4aWNhbHM6IHsgZ2V0TWV0ZXIgfSB9KTtcbmltcG9ydEJ1bmRsZShidW5kbGUsIHsgbWFuZGF0b3J5VHJhbnNmb3JtczogWyBtZXRlclRyYW5zZm9ybSBdLCBtYW5kYXRvcnlMZXhpY2FsczogeyBnZXRNZXRlciB9IH0pO1xuIC8vIHRoZW4gaW1wb3J0QnVuZGxlIGJ1aWxkcyB0aGUgQ29tcGFydG1lbnQgd3JhcHBlclxuIFhTOlxuIHhzLnNldE1ldGVyKCk7XG54cy5jYWxsV2l0aE1ldGVyKG1ldGVyLCBucy5kaXNwYXRjaCk7XG54cy5jYWxsV2l0aEtlZXBlcihrZWVwZXIsIG5zLmRpc3BhdGNoKTsgLy8ga2VlcGVyLmdldE1ldGVyKCkgLT4gbWV0ZXIsIHRoZW4gbnMuZGlzcGF0Y2goKVxuLy8ga2VlcGVyLnN0YXJ0Q3JhbmsobWV0YWRhdGEudHNoaXJ0c2l6ZSlcbi8vICAgLy8ga2VlcGVyIHNldHMgbWV0ZXIgdG8gc29tZSBmaXhlZCB2YWx1ZVxuLy8gaW5pdGlhbE1ldGVyID0ga2VlcGVyLmdldE1ldGVyKClcbi8vIG5zLmRpc3BhdGNoKCkgLy8gZHJhaW5zIGluaXRpYWxNZXRlclxuLy8gbWF5YmU6IGtlZXBlci5lbmRDcmFuaygpID8/P1xuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaW1wb3J0QnVuZGxlIjpbImltcG9ydEJ1bmRsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACljzr3SgcAAEoHAAAdAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL3JhbmtPcmRlci5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanNcIiwgW11dLFtcIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9yYW5rT3JkZXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6W1siZGVlcGx5RnVsZmlsbGVkIiwiZGVlcGx5RnVsZmlsbGVkIl1dLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXV0sIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjpbWyJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiXSxbIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSJdLFsiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNFbmNvZGVkUmVtb3RhYmxlIl0sWyJ6ZXJvUGFkIiwiemVyb1BhZCJdLFsicmVjb3JkTmFtZXMiLCJyZWNvcmROYW1lcyJdLFsicmVjb3JkVmFsdWVzIiwicmVjb3JkVmFsdWVzIl1dLCIuL3NyYy9yYW5rT3JkZXIuanMiOltbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIl0sWyJjb21wYXJlUmFuayIsImNvbXBhcmVSYW5rIl0sWyJpc1JhbmtTb3J0ZWQiLCJpc1JhbmtTb3J0ZWQiXSxbInNvcnRCeVJhbmsiLCJzb3J0QnlSYW5rIl0sWyJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQW50aVJhbmsiXSxbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXSxbImdldFBhc3NTdHlsZUNvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiXSxbImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sWyJ1bmlvblJhbmtDb3ZlcnMiLCJ1bmlvblJhbmtDb3ZlcnMiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAA0IJnuUDQAAlA0AACsAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJkZWVwbHlGdWxmaWxsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxpc1Byb21pc2UsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5FUmVmPFQ+fSBFUmVmICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZnJvbUVudHJpZXN9PU9iamVjdDtcblxuLyoqXG4gKiBHaXZlbiBhIFBhc3NhYmxlIGB2YWxgIHdob3NlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgbWF5IGNvbnRhaW4gbGVhZlxuICogcHJvbWlzZXMsIHJldHVybiBhIHByb21pc2UgZm9yIGEgcmVwbGFjZW1lbnQgUGFzc2FibGUsXG4gKiB3aGVyZSB0aGF0IHJlcGxhY2VtZW50IGlzICpkZWVwbHkgZnVsZmlsbGVkKiwgaS5lLiwgaXRzXG4gKiBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW55IHByb21pc2VzLlxuICpcbiAqIFRoaXMgaXMgYSBkZWVwIGZvcm0gb2YgYFByb21pc2UuYWxsYCBzcGVjaWFsaXplZCBmb3IgUGFzc2FibGVzLiBGb3IgZWFjaFxuICogZW5jb3VudGVyZWQgcHJvbWlzZSwgcmVwbGFjZSBpdCB3aXRoIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm0gb2ZcbiAqIGl0cyBmdWxmaWxsbWVudC5cbiAqIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgcmVqZWN0LCB0aGVuIHRoZSBwcm9taXNlIGZvciB0aGUgcmVwbGFjZW1lbnRcbiAqIHJlamVjdHMuIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgbmV2ZXIgc2V0dGxlLCB0aGVuIHRoZSBwcm9taXNlIGZvclxuICogdGhlIHJlcGxhY2VtZW50IG5ldmVyIHNldHRsZXMuXG4gKlxuICogSWYgdGhlIHJlcGxhY2VtZW50IHdvdWxkIG5vdCBiZSBQYXNzYWJsZSwgaS5lLiwgaWYgYHZhbGAgaXMgbm90XG4gKiBQYXNzYWJsZSwgb3IgaWYgYW55IG9mIHRoZSB0cmFuc2l0aXZlIHByb21pc2VzIGZ1bGZpbGwgdG8gc29tZXRoaW5nXG4gKiB0aGF0IGlzIG5vdCBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSByZWplY3RzLlxuICpcbiAqIElmIGB2YWxgIG9yIGl0cyBwYXJ0cyBhcmUgbm9uLWtleSBQYXNzYWJsZXMgb25seSAqYmVjYXVzZSogdGhleSBjb250YWluc1xuICogcHJvbWlzZXMsIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm1zIG9mIHZhbCBvciBpdHMgcGFydHMgbWF5IGJlIGtleXMuIFRoaXNcbiAqIGlzIGZvciB0aGUgaGlnaGVyIFwic3RvcmVcIiBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0byBkZXRlcm1pbmUsIGJlY2F1c2UgaXRcbiAqIGRlZmluZXMgdGhlIFwia2V5XCIgbm90aW9uIGluIHF1ZXN0aW9uLlxuICpcbiAqIC8vIFRPRE86IFRoYXQgaGlnaGVyIGxldmVsIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIG1pZ3JhdGVkIGZyb21cbiAqIC8vIGBAYWdvcmljL3N0b3JlYCB0byBgQGVuZG8vcGF0dGVybnNgLiBPbmNlIHRoYXQgaXMgZmFyIGVub3VnaCBhbG9uZyxcbiAqIC8vIHJldmlzZSB0aGUgYWJvdmUgY29tbWVudCB0byBtYXRjaC5cbiAqIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNDUxXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXNzYWJsZT59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWQ9YXN5bmModmFsKT0+e1xuaWYoIWlzT2JqZWN0KHZhbCkpe1xucmV0dXJuIHZhbDtcbiB9XG5pZihpc1Byb21pc2UodmFsKSl7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuY29uc3QgbmFtZXM9b3duS2V5cyh2YWwpO1xuY29uc3QgdmFsUHM9bmFtZXMubWFwKChuYW1lKT0+ZGVlcGx5RnVsZmlsbGVkKHZhbFtuYW1lXSkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5cbmhhcmRlbihmcm9tRW50cmllcyh2YWxzLm1hcCgoYyxpKT0+W25hbWVzW2ldLGNdKSkpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5jb25zdCB2YWxQcz12YWwubWFwKChwKT0+ZGVlcGx5RnVsZmlsbGVkKHApKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+aGFyZGVuKHZhbHMpKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyh2YWwpO1xucmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodmFsLnBheWxvYWQpLChwYXlsb2FkKT0+XG5tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKSk7XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgVW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9OyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADtyz4DkPwAA5D8AACoAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGFzc2VydFJlY29yZCxpc0Vycm9yTGlrZSxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvdmVyfSBSYW5rQ292ZXIgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtmcm9tRW50cmllcyxpc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCwgd2UgaGF2ZSBvbmx5XG4gKiBzdHJpbmctbmFtZWQgb3duIHByb3BlcnRpZXMuIGByZWNvcmROYW1lc2AgcmV0dXJucyB0aG9zZSBuYW1lICpyZXZlcnNlKlxuICogc29ydGVkLCBiZWNhdXNlIHRoYXQncyBob3cgcmVjb3JkcyBhcmUgY29tcGFyZWQsIGVuY29kZWQsIGFuZCBzb3J0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmROYW1lcz0ocmVjb3JkKT0+XG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjEwMDM2NTcyNDQqL1xuLyogY29tcGFyZXMgdHdvIHdheXMgb2YgcmV2ZXJzZSBzb3J0aW5nLCBhbmQgc2hvd3MgdGhhdCBgLnNvcnQoKS5yZXZlcnNlKClgKi9cbi8qIGlzIGN1cnJlbnRseSBmYXN0ZXIgb24gTW9kZGFibGUgWFMsIHdoaWxlIHRoZSBvdGhlciB3YXksKi9cbi8qIGAuc29ydChyZXZlcnNlQ29tcGFyYXRvcilgLCBpcyBmYXN0ZXIgb24gdjguIFdlIGN1cnJlbnRseSBjYXJlIG1vcmUgYWJvdXQqL1xuLyogWFMgcGVyZm9ybWFuY2UsIHNvIHdlIHJldmVyc2Ugc29ydCB1c2luZyBgLnNvcnQoKS5yZXZlcnNlKClgLiovXG5oYXJkZW4oLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJlY29yZCkuc29ydCgpLnJldmVyc2UoKSk7JGjigI1fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkIGFuZCBgbmFtZXNgIGlzIGByZWNvcmROYW1lcyhyZWNvcmQpYCxcbiAqIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZFZhbHVlcz0ocmVjb3JkLG5hbWVzKT0+XG5oYXJkZW4obmFtZXMubWFwKChuYW1lKT0+cmVjb3JkW25hbWVdKSk7JGjigI1fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gblxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICB6ZXJvUGFkPShuLHNpemUpPT57XG5jb25zdCBuU3RyPSBgJHtufWA7XG5hc3NlcnQoblN0ci5sZW5ndGg8PXNpemUpO1xuY29uc3Qgc3RyPSBgMDAwMDAwMDAwMDAwMDAwMDAwMDAke25TdHJ9YDtcbmNvbnN0IHJlc3VsdD1zdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGgtc2l6ZSk7XG5hc3NlcnQocmVzdWx0Lmxlbmd0aD09PXNpemUpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLyogVGhpcyBpcyB0aGUgSmF2YVNjcmlwdCBhbmFsb2cgdG8gYSBDIHVuaW9uOiBhIHdheSB0byBtYXAgYmV0d2VlbiBhIGZsb2F0IGFzIGEqL1xuLyogbnVtYmVyIGFuZCB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgZmxvYXQgYXMgYSBidWZmZXIgZnVsbCBvZiBieXRlcy4gIE5vdGUqL1xuLyogdGhhdCB0aGUgbXV0YXRpb24gb2Ygc3RhdGljIHN0YXRlIGhlcmUgbWFrZXMgdGhpcyBpbnZhbGlkIEplc3NpZSBjb2RlLCBidXQqL1xuLyogZG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgdGhlIG51Z2F0b3J5IGFuZCBncmF0dWl0b3VzIGFsbG9jYXRpb25zIHRoYXQgd291bGQqL1xuLyogaGFwcGVuIGV2ZXJ5IHRpbWUgeW91IGRvIGEgY29udmVyc2lvbiAtLSBhbmQgaW4gcHJhY3RpY2FsIHRlcm1zIGl0J3Mgc2FmZSovXG4vKiBiZWNhdXNlIHdlIHB1dCB0aGUgdmFsdWUgaW4gb25lIHNpZGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgdGFrZSBpdCBvdXQgdGhlKi9cbi8qIG90aGVyOyB0aGVyZSBpcyBubyBhY3R1YWwgc3RhdGUgcmV0YWluZWQgaW4gdGhlIGNsYXNzaWMgc2Vuc2UgYW5kIHRodXMgbm8qL1xuLyogcmUtZW50cmFuY3kgaXNzdWUuKi9cbmNvbnN0IGFzTnVtYmVyPW5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHM9bmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8qIEphdmFTY3JpcHQgbnVtYmVycyBhcmUgZW5jb2RlZCBieSBvdXRwdXR0aW5nIHRoZSBiYXNlLTE2Ki9cbi8qIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgSUVFRSBmbG9hdGluZyBwb2ludCovXG4vKiByZXByZXNlbnRhdGlvbi4gIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFsbCBiaXRzIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gYXJlKi9cbi8qIGNvbXBsZW1lbnRlZCBwcmlvciB0byB0aGUgYmFzZS0xNiBjb252ZXJzaW9uLCB3aGlsZSBmb3IgcG9zaXRpdmUgdmFsdWVzLCB0aGUqL1xuLyogc2lnbiBiaXQgaXMgY29tcGxlbWVudGVkLiAgVGhpcyBlbnN1cmVzIGJvdGggdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBiZWZvcmUqL1xuLyogcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGFjY29yZGluZyB0byB0aGVpciBuZWdhdGl2ZSovXG4vKiBtYWduaXR1ZGUgcmF0aGVyIHRoYW4gdGhlaXIgcG9zaXRpdmUgbWFnbml0dWRlLiAgVGhpcyByZXN1bHRzIGluIGFuIEFTQ0lJKi9cbi8qIGVuY29kaW5nIHdob3NlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtZXJpYyBzb3J0IG9yZGVyKi9cbi8qIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMuKi9cblxuLyogVE9ETyBDaG9vc2UgdGhlIHNhbWUgY2Fub25pY2FsIE5hTiBlbmNvZGluZyB0aGF0IGNvc21XYXNtIGFuZCBld2FzbSBjaG9zZS4qL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cz0nZmZmODAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpbmFyeTY0PShuKT0+e1xuLyogTm9ybWFsaXplIC0wIHRvIDAgYW5kIE5hTiB0byBhIGNhbm9uaWNhbCBlbmNvZGluZyovXG5pZihpcyhuLC0wKSl7XG5uPTA7XG4gfWVsc2UgaWYoaXMobixOYU4pKXtcbnJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuIH1cbmFzTnVtYmVyWzBdPW47XG5sZXQgYml0cz1hc0JpdHNbMF07XG5pZihuPDApe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxucmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLDE2KX1gO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZUJpbmFyeTY0PShlbmNvZGVkKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdmJyl8fEZhaWwgYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBiaXRzPUJpZ0ludCggYDB4JHtlbmNvZGVkLnN1YnN0cmluZygxKX1gKTtcbmlmKGVuY29kZWRbMV08JzgnKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbmFzQml0c1swXT1iaXRzO1xuY29uc3QgcmVzdWx0PWFzTnVtYmVyWzBdO1xuIWlzKHJlc3VsdCwtMCl8fEZhaWwgYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtlbmNvZGVkfWA7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogRW5jb2RlIGEgSmF2YVNjcmlwdCBiaWdpbnQgdXNpbmcgYSB2YXJpYW50IG9mIEVsaWFzIGRlbHRhIGNvZGluZywgd2l0aCBhblxuICogaW5pdGlhbCBjb21wb25lbnQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2l0IGNvdW50IGFzIGEgdW5hcnkgc3RyaW5nLCBhXG4gKiBzZWNvbmQgY29tcG9uZW50IGZvciB0aGUgZGVjaW1hbCBkaWdpdCBjb3VudCwgYW5kIGEgdGhpcmQgY29tcG9uZW50IGZvciB0aGVcbiAqIGRlY2ltYWwgZGlnaXRzIHByZWNlZGVkIGJ5IGEgZ3JhdHVpdG91cyBzZXBhcmF0aW5nIGNvbG9uLlxuICogVG8gZW5zdXJlIHRoYXQgdGhlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBvZiBlbmNvZGVkIHZhbHVlcyBtYXRjaGVzIHRoZVxuICogbnVtZXJpYyBzb3J0IG9yZGVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMsIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bmFyeVxuICogcHJlZml4IGFyZSBkaWZmZXJlbnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyAodHlwZSBcIm5cIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mXG4gKiBcIiNcInMgW3doaWNoIHNvcnQgYmVmb3JlIGRlY2ltYWwgZGlnaXRzXSkgdnMuIHBvc2l0aXZlIGFuZCB6ZXJvIHZhbHVlcyAodHlwZVxuICogXCJwXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBcIn5cInMgW3doaWNoIHNvcnQgYWZ0ZXIgZGVjaW1hbCBkaWdpdHNdKSBhbmRcbiAqIGVhY2ggZGVjaW1hbCBkaWdpdCBvZiB0aGUgZW5jb2RpbmcgZm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBpdHNcbiAqIHRlbidzIGNvbXBsZW1lbnQgKHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzIG9mIHRoZSBzYW1lIHNjYWxlIHNvcnQgYnlcbiAqICpkZXNjZW5kaW5nKiBhYnNvbHV0ZSB2YWx1ZSkuXG4gKlxuICogQHBhcmFtIHtiaWdpbnR9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpZ0ludD0obik9PntcbmNvbnN0IGFicz1uPDBuPy1uOm47XG5jb25zdCBuRGlnaXRzPWFicy50b1N0cmluZygpLmxlbmd0aDtcbmNvbnN0IGxEaWdpdHM9bkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbmlmKG48MG4pe1xucmV0dXJuIGBuJHtcbi8qIEEgXCIjXCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nIycucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbigxMCoqbERpZ2l0cy1uRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsJzAnKVxuIH06JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBkaWdpdHMuKi9cbigxMG4qKkJpZ0ludChuRGlnaXRzKStuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsJzAnKVxuIH1gO1xuIH1lbHNle1xucmV0dXJuIGBwJHtcbi8qIEEgXCJ+XCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nficucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbm5EaWdpdHNcbiB9OiR7XG4vKiBUaGUgZGlnaXRzLiovXG5uXG4gfWA7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmNvbnN0IGRlY29kZUJpZ0ludD0oZW5jb2RlZCk9PntcbmNvbnN0IHR5cGVQcmVmaXg9ZW5jb2RlZC5jaGFyQXQoMCk7LyogZmFzdGVyIHRoYW4gZW5jb2RlZFswXSovXG5sZXQgcmVtPWVuY29kZWQuc2xpY2UoMSk7XG50eXBlUHJlZml4PT09J3AnfHxcbnR5cGVQcmVmaXg9PT0nbid8fFxuRmFpbCBgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG5jb25zdCBsRGlnaXRzPXJlbS5zZWFyY2goL1swLTldLykrMTtcbmxEaWdpdHM+PTF8fEZhaWwgYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cy0xKTtcblxucmVtLmxlbmd0aD49bERpZ2l0c3x8RmFpbCBgQ29tcGxldGUgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuY29uc3Qgc25EaWdpdHM9cmVtLnNsaWNlKDAsbERpZ2l0cyk7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMpO1xuL15bMC05XSskLy50ZXN0KHNuRGlnaXRzKXx8RmFpbCBgRGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbkRpZ2l0cz1wYXJzZUludChzbkRpZ2l0cywxMCk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuMDpcIiBhbmQgXCJuMDA64oCmXCIgYW5kIFwibjkxOuKAplwiIHRocm91Z2ggXCJuOTk64oCmXCI/Ki9cbm5EaWdpdHM9MTAqKmxEaWdpdHMtbkRpZ2l0cztcbiB9XG5cbnJlbS5zdGFydHNXaXRoKCc6Jyl8fEZhaWwgYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5yZW09cmVtLnNsaWNlKDEpO1xucmVtLmxlbmd0aD09PW5EaWdpdHN8fFxuRmFpbCBgRml4ZWQtbGVuZ3RoIGRpZ2l0IHNlcXVlbmNlIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuPUJpZ0ludChyZW0pO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjk6MFwiIGFuZCBcIm44OjAwXCIgYW5kIFwibjg6OTFcIiB0aHJvdWdoIFwibjg6OTlcIj8qL1xubj0tKDEwbioqQmlnSW50KG5EaWdpdHMpLW4pO1xuIH1cblxucmV0dXJuIG47XG4gfTtcblxuLyogYCdcXHUwMDAwJ2AgaXMgdGhlIHRlcm1pbmF0b3IgYWZ0ZXIgZWxlbWVudHMuKi9cbi8qIGAnXFx1MDAwMSdgIGlzIHRoZSBiYWNrc2xhc2gtbGlrZSBlc2NhcGUgY2hhcmFjdGVyLCBmb3IqL1xuLyogZXNjYXBpbmcgYm90aCBvZiB0aGVzZSBjaGFyYWN0ZXJzLiovXG5cbmNvbnN0IGVuY29kZUFycmF5PShhcnJheSxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IGNoYXJzPVsnWyddO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpe1xuY29uc3QgZW5jPWVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuZm9yKGNvbnN0IGMgb2YgZW5jKXtcbmlmKGM9PT0nXFx1MDAwMCd8fGM9PT0nXFx1MDAwMScpe1xuY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuIH1cbmNoYXJzLnB1c2goYyk7XG4gfVxuY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuIH1cbnJldHVybiBjaGFycy5qb2luKCcnKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfSBkZWNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5jb25zdCBkZWNvZGVBcnJheT0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmVuY29kZWQuc3RhcnRzV2l0aCgnWycpfHxGYWlsIGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmNvbnN0IGVsZW1lbnRzPVtdO1xuY29uc3QgZWxlbUNoYXJzPVtdO1xuZm9yKGxldCBpPTE7aTxlbmNvZGVkLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGM9ZW5jb2RlZFtpXTtcbmlmKGM9PT0nXFx1MDAwMCcpe1xuY29uc3QgZW5jb2RlZEVsZW1lbnQ9ZWxlbUNoYXJzLmpvaW4oJycpO1xuZWxlbUNoYXJzLmxlbmd0aD0wO1xuY29uc3QgZWxlbWVudD1kZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMScpe1xuaSs9MTtcbmk8ZW5jb2RlZC5sZW5ndGh8fEZhaWwgYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7ZW5jb2RlZH1gO1xuY29uc3QgYzI9ZW5jb2RlZFtpXTtcbmMyPT09J1xcdTAwMDAnfHxcbmMyPT09J1xcdTAwMDEnfHxcbkZhaWwgYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjMn1gO1xuZWxlbUNoYXJzLnB1c2goYzIpO1xuIH1lbHNle1xuZWxlbUNoYXJzLnB1c2goYyk7XG4gfVxuIH1cbmVsZW1DaGFycy5sZW5ndGg9PT0wfHxGYWlsIGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2VuY29kZWR9YDtcbnJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlY29yZD0ocmVjb3JkLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgbmFtZXM9cmVjb3JkTmFtZXMocmVjb3JkKTtcbmNvbnN0IHZhbHVlcz1yZWNvcmRWYWx1ZXMocmVjb3JkLG5hbWVzKTtcbnJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcyx2YWx1ZXNdKSxlbmNvZGVQYXNzYWJsZSl9YDtcbiB9O1xuXG5jb25zdCBkZWNvZGVSZWNvcmQ9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5hc3NlcnQoZW5jb2RlZC5zdGFydHNXaXRoKCcoJykpO1xuY29uc3Qga2V5c3ZhbHM9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xua2V5c3ZhbHMubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFtrZXlzLHZhbHNdPWtleXN2YWxzO1xuXG5wYXNzU3R5bGVPZihrZXlzKT09PSdjb3B5QXJyYXknJiZcbnBhc3NTdHlsZU9mKHZhbHMpPT09J2NvcHlBcnJheScmJlxua2V5cy5sZW5ndGg9PT12YWxzLmxlbmd0aCYmXG5rZXlzLmV2ZXJ5KChrZXkpPT50eXBlb2Yga2V5PT09J3N0cmluZycpfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtlbmNvZGVkfWA7XG5jb25zdCBtYXBFbnRyaWVzPWtleXMubWFwKChrZXksaSk9PltrZXksdmFsc1tpXV0pO1xuY29uc3QgcmVjb3JkPWhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG5hc3NlcnRSZWNvcmQocmVjb3JkLCdkZWNvZGVkIHJlY29yZCcpO1xucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQ9KHRhZ2dlZCxlbmNvZGVQYXNzYWJsZSk9PlxuIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLHRhZ2dlZC5wYXlsb2FkXSksZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJzonKSk7XG5jb25zdCB0YWdwYXlsb2FkPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbnRhZ3BheWxvYWQubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFt0YWcscGF5bG9hZF09dGFncGF5bG9hZDtcbnBhc3NTdHlsZU9mKHRhZyk9PT0nc3RyaW5nJ3x8XG5GYWlsIGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLHBheWxvYWQpO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlUGFzc2FibGU9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmVuY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5lbmNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbmVuY29kZU9wdGlvbnM7XG5cbmNvbnN0IGVuY29kZVBhc3NhYmxlPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG5yZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6e1xucmV0dXJuJ3YnO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4neic7XG4gfVxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gfVxuY2FzZSdzdHJpbmcnOntcbnJldHVybiBgcyR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOntcbnJldHVybiBgYiR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGUocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJ3InKXx8XG5GYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcInJcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCchJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiFcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgnPycpfHxcbkZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBgeSR7bmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKX1gO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xucmV0dXJuIGVuY29kZVJlY29yZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlUGFzc2FibGU9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmRlY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5kZWNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbmRlY29kZU9wdGlvbnM7XG5cbmNvbnN0IGRlY29kZVBhc3NhYmxlPShlbmNvZGVkKT0+e1xuc3dpdGNoKGVuY29kZWQuY2hhckF0KDApKXtcbmNhc2Undic6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd6Jzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnZic6e1xucmV0dXJuIGRlY29kZUJpbmFyeTY0KGVuY29kZWQpO1xuIH1cbmNhc2Uncyc6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpO1xuIH1cbmNhc2UnYic6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpIT09J2ZhbHNlJztcbiB9XG5jYXNlJ24nOlxuY2FzZSdwJzp7XG5yZXR1cm4gZGVjb2RlQmlnSW50KGVuY29kZWQpO1xuIH1cbmNhc2Uncic6e1xucmV0dXJuIGRlY29kZVJlbW90YWJsZShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJz8nOntcbnJldHVybiBkZWNvZGVQcm9taXNlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnISc6e1xucmV0dXJuIGRlY29kZUVycm9yKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UneSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGVkLnN1YnN0cmluZygxKSk7XG4gfVxuY2FzZSdbJzp7XG5yZXR1cm4gZGVjb2RlQXJyYXkoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZScoJzp7XG5yZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnOic6e1xucmV0dXJuIGRlY29kZVRhZ2dlZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGludmFsaWQgZGF0YWJhc2Uga2V5OiAke2VuY29kZWR9YDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG5jb25zdCAgICAgICAgaXNFbmNvZGVkUmVtb3RhYmxlPShlbmNvZGVkKT0+ZW5jb2RlZC5jaGFyQXQoMCk9PT0ncic7JGjigI1fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGUge1JlY29yZDxQYXNzU3R5bGUsIHN0cmluZz59XG4gKiBUaGUgc2luZ2xlIHByZWZpeCBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQgZm9yIGVhY2ggUGFzc1N0eWxlIGNhdGVnb3J5LlxuICogYGJpZ2ludGAgaXMgYSB0d28gY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIGVhY2ggb2YgdGhvc2UgY2hhcmFjdGVyc1xuICogaW5kaXZpZHVhbGx5IGlzIGEgdmFsaWQgYmlnaW50IHByZWZpeC4gYG5gIGZvciBcIm5lZ2F0aXZlXCIgYW5kIGBwYCBmb3JcbiAqIFwicG9zaXRpdmVcIi4gVGhlIG9yZGVyaW5nIG9mIHRoZXNlIHByZWZpeGVzIGlzIHRoZSBzYW1lIGFzIHRoZVxuICogcmFua09yZGVyaW5nIG9mIHRoZWlyIHJlc3BlY3RpdmUgUGFzc1N0eWxlcy4gVGhpcyB0YWJsZSBpcyBpbXBvcnRlZCBieVxuICogcmFua09yZGVyLmpzIGZvciB0aGlzIHB1cnBvc2UuXG4gKlxuICogSW4gYWRkaXRpb24sIGB8YCBpcyB0aGUgcmVtb3RhYmxlLT5vcmRpbmFsIG1hcHBpbmcgcHJlZml4OlxuICogVGhpcyBpcyBub3QgdXNlZCBpbiBjb3ZlcnMgYnV0IGl0IGlzXG4gKiByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBOb3RlIHRoYXQgdGhlIHByZWZpeCBpcyA+IGFueVxuICogcHJlZml4IHVzZWQgYnkgYW55IGNvdmVyIHNvIHRoYXQgb3JkaW5hbCBtYXBwaW5nIGtleXMgYXJlIGFsd2F5cyBvdXRzaWRlXG4gKiB0aGUgcmFuZ2Ugb2YgdmFsaWQgY29sbGVjdGlvbiBlbnRyeSBrZXlzLlxuICovXG5jb25zdCAgICAgICAgcGFzc1N0eWxlUHJlZml4ZXM9e1xuZXJyb3I6JyEnLFxuY29weVJlY29yZDonKCcsXG50YWdnZWQ6JzonLFxucHJvbWlzZTonPycsXG5jb3B5QXJyYXk6J1snLFxuYm9vbGVhbjonYicsXG5udW1iZXI6J2YnLFxuYmlnaW50OiducCcsXG5yZW1vdGFibGU6J3InLFxuc3RyaW5nOidzJyxcbm51bGw6J3YnLFxuc3ltYm9sOid5JyxcbnVuZGVmaW5lZDoneid9OyRo4oCNX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xuXG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUHJlZml4ZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMRTp/D8PwAA/D8AACsAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJRQ0xBU1MiLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiLCJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsaXNPYmplY3QsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ1VuaW9ufSBFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbmRlZmluZVByb3BlcnRpZXMsXG5pcyxcbmVudHJpZXMsXG5mcm9tRW50cmllcyxcbmZyZWV6ZX09XG5PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogU3BlY2lhbCBwcm9wZXJ0eSBuYW1lIHRoYXQgaW5kaWNhdGVzIGFuIGVuY29kaW5nIHRoYXQgbmVlZHMgc3BlY2lhbFxuICogZGVjb2RpbmcuXG4gKi9cbmNvbnN0IFFDTEFTUz0nQHFjbGFzcyc7JGjigI1fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtlbmNvZGVkIGlzIEVuY29kaW5nVW5pb259XG4gKi9cbmNvbnN0IGhhc1FDbGFzcz0oZW5jb2RlZCk9Pmhhc093blByb3BlcnR5T2YoZW5jb2RlZCxRQ0xBU1MpO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBxY2xhc3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzPShlbmNvZGVkLHFjbGFzcyk9PlxuaXNPYmplY3QoZW5jb2RlZCkmJlxuIWlzQXJyYXkoZW5jb2RlZCkmJlxuaGFzUUNsYXNzKGVuY29kZWQpJiZcbmVuY29kZWRbUUNMQVNTXT09PXFjbGFzcztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb0NhcERhdGFPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlRXJyb3JUb0NhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0ocmVtKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIpPT5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvQ2FwRGF0YU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IEVuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvQ2FwRGF0YT0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPWRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhPWRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGE9ZG9udEVuY29kZUVycm9yVG9DYXBEYXRhfT1cbmVuY29kZU9wdGlvbnM7XG5cbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRlbHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9DYXBEYXRhYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvQ2FwRGF0YWAgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGFzIFtRQ0xBU1NdIGNvbXBvc2l0ZXMuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdzdHJpbmcnOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJue1tRQ0xBU1NdOid1bmRlZmluZWQnfTtcbiB9XG5jYXNlJ251bWJlcic6e1xuLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm57W1FDTEFTU106J05hTid9O1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOidJbmZpbml0eSd9O1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonLUluZmluaXR5J307XG4gfVxuLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm57XG5bUUNMQVNTXTonYmlnaW50JyxcbmRpZ2l0czpTdHJpbmcocGFzc2FibGUpfTtcblxuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm57XG5bUUNMQVNTXTonc3ltYm9sJyxcbm5hbWV9O1xuXG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLFFDTEFTUykpe1xuLyogSGlsYmVydCBob3RlbCovXG5jb25zdHtbUUNMQVNTXTpxY2xhc3NWYWx1ZSwuLi5yZXN0fT1wYXNzYWJsZTtcbi8qKiBAdHlwZSB7RW5jb2Rpbmd9ICovXG5jb25zdCByZXN1bHQ9e1xuW1FDTEFTU106J2hpbGJlcnQnLFxub3JpZ2luYWw6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocWNsYXNzVmFsdWUpfTtcblxuaWYob3duS2V5cyhyZXN0KS5sZW5ndGg+PTEpe1xuLyogV2UgaGFyZGVuIHRoZSBlbnRpcmUgY2FwRGF0YSBlbmNvZGluZyBiZWZvcmUgd2UgcmV0dXJuIGl0LiovXG4vKiBgZW5jb2RlVG9DYXBEYXRhYCByZXF1aXJlcyB0aGF0IGl0cyBpbnB1dCBiZSBQYXNzYWJsZSwgYW5kKi9cbi8qIHRoZXJlZm9yZSBoYXJkZW5lZC4qL1xuLyogVGhlIGBmcmVlemVgIGhlcmUgaXMgbmVlZGVkIGFueXdheSwgYmVjYXVzZSB0aGUgYHJlc3RgIGlzKi9cbi8qIGZyZXNobHkgY29uc3RydWN0ZWQgYnkgdGhlIGAuLi5gIGFib3ZlLCBhbmQgd2UncmUgdXNpbmcgaXQqL1xuLyogYXMgaW1wdXQgaW4gYW5vdGhlciBjYWxsIHRvIGBlbmNvZGVUb0NhcERhdGFgLiovXG5yZXN1bHQucmVzdD1lbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W25hbWUsZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG5bUUNMQVNTXTondGFnZ2VkJyxcbnRhZzpnZXRUYWcocGFzc2FibGUpLFxucGF5bG9hZDplbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG5wYXNzYWJsZSxcbmVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcblxuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUylcbiB9ICR7cSgnc2xvdCcpfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nc2xvdCcpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ2Vycm9yJykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ2Vycm9yJylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbnJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVQcm9taXNlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0oc2xvdEVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGE9KGVycm9yRW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2hcbiAqIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvblxuICogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmVcbiAqIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuXG4gKlxuICogVGhpcyBzZWVtcyBsaWtlIHRoZSBiZXN0IHN0YXJ0aW5nIHBvaW50IHRvIGluY3JlbWVudGFsbHkgZXZvbHZlIHRvIGFuXG4gKiBBUEkgd2hlcmUgdGhlc2UgY2FuIHJlbGlhYmx5IGRpZmZlci5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzRcbiAqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbUNhcERhdGE9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhPWRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhfT1cbmRlY29kZU9wdGlvbnM7XG5cbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPT09ZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhfHxcbkZhaWwgYEFuIGltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uIGZvciBub3c6IElmIGVpdGhlciBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSBvciBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lOiAke3EoXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSlcbiB9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbi8qKlxuICogYGRlY29kZUZyb21DYXBEYXRhYCBtYXkgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBqc29uRW5jb2RlZGBcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvQ2FwRGF0YWBcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbUNhcERhdGFgIGNhbm5vdCByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbUNhcERhdGFgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30ganNvbkVuY29kZWQgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tQ2FwRGF0YT0oanNvbkVuY29kZWQpPT57XG5pZighaXNPYmplY3QoanNvbkVuY29kZWQpKXtcbi8qIHByaW1pdGl2ZXMgcGFzcyB0aHJvdWdoKi9cbnJldHVybiBqc29uRW5jb2RlZDtcbiB9XG5pZihpc0FycmF5KGpzb25FbmNvZGVkKSl7XG5yZXR1cm4ganNvbkVuY29kZWQubWFwKChlbmNvZGVkVmFsKT0+ZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCkpO1xuIH1lbHNlIGlmKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpe1xuY29uc3QgcWNsYXNzPWpzb25FbmNvZGVkW1FDTEFTU107XG50eXBlb2YgcWNsYXNzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCAke3EoUUNMQVNTKX0gdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuc3dpdGNoKHFjbGFzcyl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZSdJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtkaWdpdHN9PWpzb25FbmNvZGVkO1xudHlwZW9mIGRpZ2l0cz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbnJldHVybiBCaWdJbnQoZGlnaXRzKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogRGVwcmVjYXRlZCBxY2xhc3MuIFRPRE8gbWFrZSBjb25kaXRpb25hbCovXG4vKiBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRXZlbnR1YWxseSByZW1vdmUsIGJ1dCBhZnRlciBjb25maWRlbnQqL1xuLyogdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBzdXBwb3J0ZWQgc2VuZGVycy4qL1xuLyoqL1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbnJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e25hbWV9PWpzb25FbmNvZGVkO1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e3RhZyxwYXlsb2FkfT1qc29uRW5jb2RlZDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gfVxuY2FzZSdzbG90Jzp7XG4vKiBTZWUgbm90ZSBhYm92ZSBhYm91dCBob3cgdGhlIGN1cnJlbnQgZW5jb2RpbmcgY2Fubm90IHJlbGlhYmx5Ki9cbi8qIGRpc3Rpbmd1aXNoIHdoaWNoIHdlIHNob3VsZCBjYWxsLCBzbyBpbiB0aGUgbm9uLWRlZmF1bHQgY2FzZSovXG4vKiBib3RoIG11c3QgYmUgdGhlIHNhbWUgYW5kIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHdlIGNhbGwuKi9cbmNvbnN0IGRlY29kZWQ9ZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuLyogQkVXQVJFOiBjYXBkYXRhIGRvZXMgbm90IGNoZWNrIHRoYXQgYGRlY29kZWRgIGlzKi9cbi8qIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZSwgc2luY2UgdGhhdCB3b3VsZCBicmVhayBzb21lKi9cbi8qIGNhcGRhdGEgY2xpZW50cy4gV2UgYXJlIGRlcHJlY2F0aW5nIGNhcGRhdGEsIGFuZCB0aGVzZSBjbGllbnRzKi9cbi8qIHdpbGwgbmVlZCB0byB1cGRhdGUgYmVmb3JlIHN3aXRjaGluZyB0byBzbWFsbGNhcHMuKi9cbnJldHVybiBkZWNvZGVkO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGRlY29kZWQ9ZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG5pZihwYXNzU3R5bGVPZihkZWNvZGVkKT09PSdlcnJvcicpe1xucmV0dXJuIGRlY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbUNhcERhdGEgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke2RlY29kZWR9YDtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtvcmlnaW5hbCxyZXN0fT1qc29uRW5jb2RlZDtcbmhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ29yaWdpbmFsJyl8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7anNvbkVuY29kZWR9YDtcbi8qIERvbid0IGhhcmRlbiBzaW5jZSB3ZSdyZSBub3QgZG9uZSBtdXRhdGluZyBpdCovXG5jb25zdCByZXN1bHQ9e1tRQ0xBU1NdOmRlY29kZUZyb21DYXBEYXRhKG9yaWdpbmFsKX07XG5pZihoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdyZXN0Jykpe1xuY29uc3QgaXNOb25FbXB0eU9iamVjdD1cbnR5cGVvZiByZXN0PT09J29iamVjdCcmJlxucmVzdCE9PW51bGwmJlxub3duS2V5cyhyZXN0KS5sZW5ndGg+PTE7XG5pZighaXNOb25FbXB0eU9iamVjdCl7XG50aHJvdyBGYWlsIGBSZXN0IGVuY29kaW5nIG11c3QgYmUgYSBub24tZW1wdHkgb2JqZWN0OiAke3Jlc3R9YDtcbiB9XG5jb25zdCByZXN0T2JqPWRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuLyogVE9ETyByZWFsbHkgc2hvdWxkIGFzc2VydCB0aGF0IGBwYXNzU3R5bGVPZihyZXN0KWAgaXMqL1xuLyogYCdjb3B5UmVjb3JkJ2AgYnV0IHdlJ2QgaGF2ZSB0byBoYXJkZW4gaXQgYW5kIGl0IGlzIHRvbyovXG4vKiBlYXJseSB0byBkbyB0aGF0LiovXG4haGFzT3duUHJvcGVydHlPZihyZXN0T2JqLFFDTEFTUyl8fFxuRmFpbCBgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoaXMgaXMgdGhlIGVycm9yIGNhc2Ugd2UncmUgdGVzdGluZyBmb3IqL1xuY2FzZSdpYmlkJzp7XG50aHJvdyBGYWlsIGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbnFjbGFzcylcbiB9YDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZXtcbmFzc2VydCh0eXBlb2YganNvbkVuY29kZWQ9PT0nb2JqZWN0JyYmanNvbkVuY29kZWQhPT1udWxsKTtcbmNvbnN0IGRlY29kZUVudHJ5PShbbmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgJHtxKG5hbWUpfSBvZiAke2pzb25FbmNvZGVkfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21DYXBEYXRhKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACzXvdrxTsAAMU7AAAtAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ30gU21hbGxjYXBzRW5jb2RpbmcgKlgvKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2RpbmdVbmlvbn0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqWC8qL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nICovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtpcyxlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IEJBTkc9JyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIPSctJy5jaGFyQ29kZUF0KDApO1xuXG4vKipcbiAqIEFuIGBlbmNvZGVUb1NtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYSBwYXNzYWJsZSBhbmQgcmV0dXJucyBhXG4gKiBKU09OLXJlcHJlc2VudGFibGUgb2JqZWN0IChpLmUuLCByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoXG4gKiBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXBsYWNlcnMgb3IgcmV2aXZlcnNcbiAqIHJldHVybnMgYW4gZXF1aXZhbGVudCBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBvYmplY3QgaWRlbnRpdHkpLlxuICogV2UgY2FsbCB0aGlzIHJlcHJlc2VudGF0aW9uIGEgU21hbGxjYXBzIEVuY29kaW5nLlxuICpcbiAqIEEgYGRlY29kZUZyb21TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGFzIGFyZ3VtZW50IHdoYXQgaXRcbiAqICphc3N1bWVzKiBpcyB0aGUgcmVzdWx0IG9mIGEgcGxhaW4gYEpTT04ucGFyc2VgIHdpdGggbm8gcmVzb2x2ZXIuIEl0IHRoZW5cbiAqIG11c3QgdmFsaWRhdGUgdGhhdCBpdCBpcyBhIHZhbGlkIFNtYWxsY2FwcyBFbmNvZGluZywgYW5kIGlmIGl0IGlzLFxuICogcmV0dXJuIGEgY29ycmVzcG9uZGluZyBwYXNzYWJsZS5cbiAqXG4gKiBTbWFsbGNhcHMgY29uc2lkZXJzIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gYCFgIChhc2NpaSBjb2RlIDMzLCBCQU5HKVxuICogYW5kIGAtYCAoYXNjaWkgY29kZSA0NSwgREFTSCkgdG8gYmUgc3BlY2lhbCBwcmVmaXhlcyBhbGxvd2luZ1xuICogcmVwcmVzZW50YXRpb24gb2YgSlNPTi1pbmNvbXBhdGlibGUgZGF0YSB1c2luZyBzdHJpbmdzLlxuICogVGhlc2UgY2hhcmFjdGVycywgaW4gb3JkZXIsIGFyZSBgIVwiIyQlJicoKSorLC1gXG4gKiBPZiB0aGVzZSwgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICogYCFgIC0gZXNjYXBlZCBzdHJpbmdcbiAqICAqIGArYCAtIG5vbi1uZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAtYCAtIG5lZ2F0aXZlIGJpZ2ludFxuICogICogYCNgIC0gbWFuaWZlc3QgY29uc3RhbnRcbiAqICAqIGAlYCAtIHN5bWJvbFxuICogICogYCRgIC0gcmVtb3RhYmxlXG4gKiAgKiBgJmAgLSBwcm9taXNlXG4gKlxuICogQWxsIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyAoYFwiJygpKixgKSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4gKlxuICogVGhlIG1hbmlmZXN0IGNvbnN0YW50cyB0aGF0IHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyBmb3IgdmFsdWVzOlxuICogICogYCN1bmRlZmluZWRgXG4gKiAgKiBgI05hTmBcbiAqICAqIGAjSW5maW5pdHlgXG4gKiAgKiBgIy1JbmZpbml0eWBcbiAqXG4gKiBhbmQgZm9yIHByb3BlcnR5IG5hbWVzIGFuYWxvZ291cyB0byBjYXBkYXRhIEBxY2xhc3M6XG4gKiAgKiBgI3RhZ2BcbiAqICAqIGAjZXJyb3JgXG4gKlxuICogQWxsIG90aGVyIGVuY29kZWQgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgI2AgYXJlIHJlc2VydmVkIGZvclxuICogZnV0dXJlIHVzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFN0clxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWw9KGVuY29kZWRTdHIpPT57XG5pZihlbmNvZGVkU3RyPT09Jycpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIGNoYXJDb2RlQXQoMCkgYW5kIG51bWJlciBjb21wYXJlIGlzIGEgYml0IGZhc3Rlci4qL1xuY29uc3QgY29kZT1lbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgeW9kYSovXG5yZXR1cm4gQkFORzw9Y29kZSYmY29kZTw9REFTSDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIpPT5cbkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIGVuY29kZU9wdGlvbnMgaXMgYWN0dWFsbHkgb3B0aW9uYWwsIGJ1dCBub3QgbWFya2VkIGFzIHN1Y2ggdG8gd29yayBhcm91bmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAyODZcbiAqXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9TbWFsbGNhcHM9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz1kb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz1kb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwc309XG5lbmNvZGVPcHRpb25zO1xuXG5jb25zdCBhc3NlcnRFbmNvZGVkRXJyb3I9KGVuY29kaW5nKT0+e1xudHlwZW9mIGVuY29kaW5nPT09J29iamVjdCcmJmhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpfHxcbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKFxuZW5jb2RpbmcpXG4gfWA7XG4vKiBBc3NlcnQgdGhhdCB0aGUgI2Vycm9yIHByb3BlcnR5IGRlY29kZXMgdG8gYSBzdHJpbmcuKi9cbmNvbnN0IG1lc3NhZ2U9ZW5jb2RpbmdbJyNlcnJvciddO1xudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJyYmKFxuIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSl8fG1lc3NhZ2Uuc3RhcnRzV2l0aCgnIScpKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIHN0cmluZyBtZXNzYWdlOiAke3EobWVzc2FnZSl9YDtcbiB9O1xuXG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtTbWFsbGNhcHNFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvU21hbGxjYXBzYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvU21hbGxjYXBzYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cj0ocGFzc2FibGUpPT57XG4vKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbi8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBpbnRvIHNtYWxsY2FwcyBzdHJpbmdzLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzp7XG4vKiBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmlmKHN0YXJ0c1NwZWNpYWwocGFzc2FibGUpKXtcbi8qIFN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGEgc3BlY2lhbCBjaGFyIGFyZSBxdW90ZWQgd2l0aCBgIWAuKi9cbi8qIFNpbmNlIGAhYCBpcyBpdHNlbGYgYSBzcGVjaWFsIGNoYXJhY3RlciwgdGhpcyB0cml2aWFsbHkgZG9lcyovXG4vKiB0aGUgSGlsYmVydCBob3RlbC4gQWxzbywgc2luY2UgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUqL1xuLyogYSBjb250aW51b3VzIHN1YnJhbmdlIG9mIGFzY2lpLCB0aGlzIHF1b3RpbmcgaXMgc29ydC1vcmRlciovXG4vKiBwcmVzZXJ2aW5nLiovXG5yZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gfVxuLyogQWxsIG90aGVyIHN0cmluZ3MgcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4nI3VuZGVmaW5lZCc7XG4gfVxuY2FzZSdudW1iZXInOntcbi8qIFNwZWNpYWwtY2FzZSBudW1iZXJzIHdpdGggbm8gZGlnaXQtYmFzZWQgcmVwcmVzZW50YXRpb24uKi9cbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJuJyNOYU4nO1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJuJyNJbmZpbml0eSc7XG4gfWVsc2UgaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJuJyMtSW5maW5pdHknO1xuIH1cbi8qIFBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGVsc2UsIHJlcGxhY2luZyAtMCB3aXRoIDAuKi9cbnJldHVybiBpcyhwYXNzYWJsZSwtMCk/MDpwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3Qgc3RyPVN0cmluZyhwYXNzYWJsZSk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7YmlnaW50fSAqL3Bhc3NhYmxlPDBuP3N0cjpgKyR7c3RyfWApO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm4gYCUke25hbWV9YDtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4vKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbmNvbnN0IG5hbWVzPW93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbnJldHVybiBmcm9tRW50cmllcyhcbm5hbWVzLm1hcCgobmFtZSk9PltcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKV0pKTtcblxuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbicjdGFnJzplbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKGdldFRhZyhwYXNzYWJsZSkpLFxucGF5bG9hZDplbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5zdGFydHNXaXRoKCckJykpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5zdGFydHNXaXRoKCcmJykpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCImXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5hc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbmNvbnN0IHJlc3VsdD1oYXJkZW4oXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpKTtcblxuYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvU21hbGxjYXBzKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5oYXJkZW4obWFrZUVuY29kZVRvU21hbGxjYXBzKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7cShlbmNvZGluZyl9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogU21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21TbWFsbGNhcHM9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9ZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwc309XG5kZWNvZGVPcHRpb25zO1xuXG4vKipcbiAqIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtYXkgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBlbmNvZGluZ2BcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvU21hbGxjYXBzYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBjYW5ub3QgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21TbWFsbGNhcHNgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtTbWFsbGNhcHNFbmNvZGluZ30gZW5jb2RpbmcgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PntcbnN3aXRjaCh0eXBlb2YgZW5jb2Rpbmcpe1xuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmlmKCFzdGFydHNTcGVjaWFsKGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY29uc3QgYz1lbmNvZGluZy5jaGFyQXQoMCk7XG5zd2l0Y2goYyl7XG5jYXNlJyEnOntcbi8qIHVuLWhpbGJlcnQtaWZ5IHRoZSBzdHJpbmcqL1xucmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuIH1cbmNhc2UnJSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gfVxuY2FzZScjJzp7XG5zd2l0Y2goZW5jb2Rpbmcpe1xuY2FzZScjdW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnI05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJyNJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnIy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5rbm93biBjb25zdGFudCBcIiR7cShlbmNvZGluZyl9XCJgLFR5cGVFcnJvcik7XG4gfX1cblxuIH1cbmNhc2UnKyc6XG5jYXNlJy0nOntcbnJldHVybiBCaWdJbnQoZW5jb2RpbmcpO1xuIH1cbmNhc2UnJCc6e1xuY29uc3QgcmVzdWx0PWRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3JlbW90YWJsZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZScmJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3Byb21pc2UnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBTcGVjaWFsIGNoYXIgJHtxKFxuYylcbiB9IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlOiAke2VuY29kaW5nfWA7XG4gfX1cblxuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihlbmNvZGluZz09PW51bGwpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cblxuaWYoaXNBcnJheShlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nLm1hcCgodmFsKT0+ZGVjb2RlRnJvbVNtYWxsY2Fwcyh2YWwpKTtcbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyN0YWcnKSl7XG5jb25zdHsnI3RhZyc6dGFnLHBheWxvYWQsLi4ucmVzdH09ZW5jb2Rpbmc7XG50eXBlb2YgdGFnPT09J3N0cmluZyd8fFxuRmFpbCBgVmFsdWUgb2YgXCIjdGFnXCIsIHRoZSB0YWcsIG11c3QgYmUgYSBzdHJpbmc6ICR7ZW5jb2Rpbmd9YDtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGAjdGFnIHJlY29yZCB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShvd25LZXlzKHJlc3QpKX1gO1xucmV0dXJuIG1ha2VUYWdnZWQoXG5kZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG5kZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpKTtcblxuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJykpe1xuY29uc3QgcmVzdWx0PWRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbnBhc3NTdHlsZU9mKHJlc3VsdCk9PT0nZXJyb3InfHxcbkZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5cbmNvbnN0IGRlY29kZUVudHJ5PShbZW5jb2RlZE5hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgZW5jb2RlZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbmVuY29kZWROYW1lKVxuIH0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4hZW5jb2RlZE5hbWUuc3RhcnRzV2l0aCgnIycpfHxcbkZhaWwgYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuY29uc3QgbmFtZT1kZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG50eXBlb2YgZW5jb2RpbmcpXG4gfTogJHtlbmNvZGluZ31gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACEKS/awqAACsKgAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsUUNMQVNTOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9hID0+IChRQ0xBU1MgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2FwRGF0YTxUPn0gQ2FwRGF0YSAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtzdHJpbmdpZnk6cXVvdGV9PUpTT047XG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5kZW50ZXJcbiAqIEBwcm9wZXJ0eSB7KG9wZW5CcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gb3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7KHRva2VuOiBzdHJpbmcpID0+IG51bWJlcn0gbmV4dFxuICogQHByb3BlcnR5IHsoY2xvc2VCcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gY2xvc2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBkb25lXG4gKi9cblxuLyoqXG4gKiBHZW5lcm91cyB3aGl0ZXNwYWNlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyPSgpPT57XG5jb25zdCBzdHJpbmdzPVtdO1xubGV0IGxldmVsPTA7XG5sZXQgbmVlZFNwYWNlPWZhbHNlO1xuY29uc3QgbGluZT0oKT0+e1xubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywnICAnLnJlcGVhdChsZXZlbCkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+e1xubGV2ZWwrPTE7XG5pZihuZWVkU3BhY2Upe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gfSxcbmxpbmUsXG5uZXh0Oih0b2tlbik9PntcbmlmKG5lZWRTcGFjZSYmdG9rZW4hPT0nLCcpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPXRydWU7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmFzc2VydChsZXZlbD49MSk7XG5sZXZlbC09MTtcbmxpbmUoKTtcbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+e1xuYXNzZXJ0LmVxdWFsKGxldmVsLDApO1xucmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Ygb25lIHRva2VuIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlclxuICogb2YgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGlzIHBhdHRlcm4sIHRoZW4gdGhlIHR3byB0b2tlbnMgbXVzdCBiZVxuICogc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgdG8gcHJlc2VydmUgdGhlaXIgbWVhbmluZy4gT3RoZXJ3aXNlIHRoZVxuICogd2hpdGVzcGFjZSBpbiB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBUaGUgYDwhYCBhbmQgYC0+YCBjYXNlcyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGZvcm1hdGlvbiBvZiBhblxuICogaHRtbC1saWtlIGNvbW1lbnQuIEkgZG9uJ3QgdGhpbmsgdGhlIGRvdWJsZSBhbmdsZSBicmFja2V0cyBhcmUgYWN0dWFsbHlcbiAqIG5lZWRlZCBidXQgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgaXQgZW5vdWdoIHRvIHJlbW92ZSB0aGVtLlxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybj0vXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qKlxuICogTWluaW11bSB3aGl0ZXNwYWNlIG5lZWRlZCB0byBwcmVzZXZlIG1lYW5pbmcuXG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlcj0oKT0+e1xuLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbmNvbnN0IHN0cmluZ3M9W107XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+c3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KSxcbmxpbmU6KCk9PnN0cmluZ3MubGVuZ3RoLFxubmV4dDoodG9rZW4pPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSl7XG5jb25zdCBsYXN0PXN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV07XG5pZihsYXN0Lmxlbmd0aD49MSYmdG9rZW4ubGVuZ3RoPj0xKXtcbmNvbnN0IHBhaXI9IGAke2xhc3RbbGFzdC5sZW5ndGgtMV19JHt0b2tlblswXX1gO1xuaWYoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG4gfVxuIH1cbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEmJnN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV09PT0nLCcpe1xuc3RyaW5ncy5wb3AoKTtcbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PnN0cmluZ3Muam9pbignJyl9KTtcblxuIH07XG5cbmNvbnN0IGlkZW50UGF0dGVybj0vXlthLXpBLVpdXFx3KiQvO1xuaGFyZGVuKGlkZW50UGF0dGVybik7XG5jb25zdCBBdEF0UHJlZml4UGF0dGVybj0vXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGluZ1xuICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkSW5kZW50XG4gKiBAcGFyYW0ge2FueVtdfSBbc2xvdHNdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVUb0p1c3Rpbj0oZW5jb2Rpbmcsc2hvdWxkSW5kZW50PWZhbHNlLHNsb3RzPVtdKT0+e1xuLyoqXG4gKiBUaGUgZmlyc3QgcGFzcyBkb2VzIHNvbWUgaW5wdXQgdmFsaWRhdGlvbi5cbiAqIEl0cyBjb250cm9sIGZsb3cgc2hvdWxkIG1pcnJvciBgcmVjdXJgIGFzIGNsb3NlbHkgYXMgcG9zc2libGVcbiAqIGFuZCB0aGUgdHdvIHNob3VsZCBiZSBtYWludGFpbmVkIHRvZ2V0aGVyLiBUaGV5IG11c3QgdmlzaXQgZXZlcnl0aGluZ1xuICogaW4gdGhlIHNhbWUgb3JkZXIuXG4gKlxuICogVE9ETyBub3cgdGhhdCBpYmlkcyBhcmUgZ29uZSwgd2Ugc2hvdWxkIGZvbGQgdGhpcyBiYWNrIHRvZ2V0aGVyIGludG9cbiAqIG9uZSB2YWxpZGF0aW5nIHBhc3MuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IHByZXBhcmU9KHJhd1RyZWUpPT57XG5pZighaXNPYmplY3QocmF3VHJlZSkpe1xucmV0dXJuO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xudHlwZW9mIHFjbGFzcz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbnJldHVybjtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xudHlwZW9mIGRpZ2l0cz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbnJldHVybjtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xucmV0dXJuO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5yZXR1cm47XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZih0YWcsJ3N0cmluZycpO1xucHJlcGFyZShwYXlsb2FkKTtcbnJldHVybjtcbiB9XG5jYXNlJ3Nsb3QnOntcbmNvbnN0e2luZGV4LGlmYWNlfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5OYXQoaW5kZXgpO1xuaWYoaWZhY2UhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihpZmFjZSwnc3RyaW5nJyk7XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbidvcmlnaW5hbCdpbiByYXdUcmVlfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbnByZXBhcmUob3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5pZih0eXBlb2YgcmVzdCE9PSdvYmplY3QnKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGA7XG4gfVxuaWYocmVzdD09PW51bGwpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIG51bGxgO1xuIH1cbmlmKGlzQXJyYXkocmVzdCkpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiB9XG5pZihRQ0xBU1MgaW4gcmVzdCl7XG50aHJvdyBGYWlsIGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuIH1cbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xucHJlcGFyZShyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIG5hbWUpfWA7XG5nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpIT09dW5kZWZpbmVkfHxcbkZhaWwgYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gO1xucmV0dXJuO1xuIH1cblxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbnByZXBhcmUocmF3VHJlZVtpXSk7XG4gfVxuIH1lbHNle1xuY29uc3QgbmFtZXM9b3duS2V5cyhyYXdUcmVlKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gfVxucHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiB9XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VJbmRlbnRlcj1zaG91bGRJbmRlbnQ/bWFrZVllc0luZGVudGVyOm1ha2VOb0luZGVudGVyO1xubGV0IG91dD1tYWtlSW5kZW50ZXIoKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFzcyByZWN1cnNpb24gYWZ0ZXIgdGhlIGZpcnN0IHBhc3MgYHByZXBhcmVgLlxuICogVGhlIGZpcnN0IHBhc3MgZGlkIHNvbWUgaW5wdXQgdmFsaWRhdGlvbiBzb1xuICogaGVyZSB3ZSBjYW4gc2FmZWx5IGFzc3VtZSBldmVyeXRoaW5nIHRob3NlIHRoaW5ncyBhcmUgdmFsaWRhdGVkLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZT0ocmF3VHJlZSk9Pntcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gfTtcblxuY29uc3QgZGVjb2RlUHJvcGVydHk9KG5hbWUsdmFsdWUpPT57XG5vdXQubGluZSgpO1xuaWYobmFtZT09PSdfX3Byb3RvX18nKXtcbi8qIEphdmFTY3JpcHQgaW50ZXJwcmV0cyBge19fcHJvdG9fXzogeCwgLi4ufWAqL1xuLyogYXMgbWFraW5nIGFuIG9iamVjdCBpbmhlcml0aW5nIGZyb20gYHhgLCB3aGVyZWFzKi9cbi8qIGluIEpTT04gaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgbmFtZS4gUHJlc2VydmUgdGhlKi9cbi8qIEpTT04gbWVhbmluZy4qL1xub3V0Lm5leHQoIGBbXCJfX3Byb3RvX19cIl06YCk7XG4gfWVsc2UgaWYoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpe1xub3V0Lm5leHQoIGAke25hbWV9OmApO1xuIH1lbHNle1xub3V0Lm5leHQoIGAke3F1b3RlKG5hbWUpfTpgKTtcbiB9XG5kZWNvZGUodmFsdWUpO1xub3V0Lm5leHQoJywnKTtcbiB9O1xuXG4vKipcbiAqIE1vZGVsZWQgYWZ0ZXIgYGZ1bGxSZXZpdmVgIGluIG1hcnNoYWwuanNcbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByZWN1cj0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG4vKiBwcmltaXRpdmVzIGdldCBxdW90ZWQqL1xucmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YocWNsYXNzLCdzdHJpbmcnKTtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4vKiBTd2l0Y2hpbmcgb24gYGVuY29kZWRbUUNMQVNTXWAgKG9yIGFueXRoaW5nIGxlc3MgZGlyZWN0LCBsaWtlKi9cbi8qIGBxY2xhc3NgKSBkb2VzIG5vdCBkaXNjcmltaW5hdGUgcmF3VHJlZSBpbiB0eXBlc2NyaXB0QDQuMi4zIGFuZCovXG4vKiBlYXJsaWVyLiovXG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG4vKiBUaGVpciBxY2xhc3MgaXMgdGhlaXIgZXhwcmVzc2lvbiBzb3VyY2UuKi9cbnJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGRpZ2l0cywnc3RyaW5nJyk7XG5yZXR1cm4gb3V0Lm5leHQoIGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogVE9ETyBkZXByZWNhdGVkLiBFdmVudHVhbGx5IHJlbW92ZS4qL1xucmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5jb25zdCByZWdpc3RlcmVkTmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihyZWdpc3RlcmVkTmFtZT09PXVuZGVmaW5lZCl7XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuYXNzZXJ0KG1hdGNoIT09bnVsbCk7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5hc3NlcnQoU3ltYm9sW3N1ZmZpeF09PT1zeW0pO1xuYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLiR7c3VmZml4fWApO1xuIH1cbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC5mb3IoJHtxdW90ZShyZWdpc3RlcmVkTmFtZSl9KWApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbm91dC5uZXh0KCBgbWFrZVRhZ2dlZCgke3F1b3RlKHRhZyl9LGApO1xuZGVjb2RlKHBheWxvYWQpO1xucmV0dXJuIG91dC5uZXh0KCcpJyk7XG4gfVxuXG5jYXNlJ3Nsb3QnOntcbmxldHtpZmFjZX09cmF3VHJlZTtcbmNvbnN0IGluZGV4PU51bWJlcihOYXQocmF3VHJlZS5pbmRleCkpO1xuY29uc3QgbmVzdGVkUmVuZGVyPShhcmcpPT57XG5jb25zdCBvbGRPdXQ9b3V0O1xudHJ5e1xub3V0PW1ha2VOb0luZGVudGVyKCk7XG5kZWNvZGUoYXJnKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH1maW5hbGx5e1xub3V0PW9sZE91dDtcbiB9XG4gfTtcbmlmKGluZGV4PHNsb3RzLmxlbmd0aCl7XG5jb25zdCBzbG90PW5lc3RlZFJlbmRlcihzbG90c1tpbmRleF0pO1xuaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdFRvVmFsKCR7c2xvdH0pYCk7XG4gfVxuaWZhY2U9bmVzdGVkUmVuZGVyKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3RUb1ZhbCgke3Nsb3R9LCR7aWZhY2V9KWApO1xuIH1lbHNlIGlmKGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0pYCk7XG4gfVxuaWZhY2U9bmVzdGVkUmVuZGVyKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0sJHtpZmFjZX0pYCk7XG4gfVxuXG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG5vdXQub3BlbigneycpO1xuZGVjb2RlUHJvcGVydHkoUUNMQVNTLG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihyZXN0LCdvYmplY3QnKTtcbmFzc2VydChyZXN0IT09bnVsbCk7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbm5hbWUpXG4gfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgO1xuIH1cbmRlY29kZVByb3BlcnR5KG5hbWUscmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG5cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbnJldHVybiBvdXQubmV4dCggYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCdbXScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ1snKTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xub3V0LmxpbmUoKTtcbmRlY29kZShyYXdUcmVlW2ldKTtcbm91dC5uZXh0KCcsJyk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnXScpO1xuIH1cbiB9ZWxzZXtcbi8qIHJhd1RyZWUgaXMgYW4gYEVuY29kaW5nUmVjb3JkYCB3aGljaCBvbmx5IGhhcyBzdHJpbmcga2V5cywqL1xuLyogYnV0IHNpbmNlIG93bktleXMgaXMgbm90IGdlbmVyaWMsIGl0IGNhbid0IHByb3BhZ2F0ZSB0aGF0Ki9cbmNvbnN0IG5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyYXdUcmVlKTtcbmlmKG5hbWVzLmxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCd7fScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ3snKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmRlY29kZVByb3BlcnR5KG5hbWUscmF3VHJlZVtuYW1lXSk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cbiB9XG4gfTtcbnByZXBhcmUoZW5jb2RpbmcpO1xuZGVjb2RlKGVuY29kaW5nKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH07JGjigI1fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABPT1RvcBgAA3AYAAC0AAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZU1hcnNoYWw7JGjigI1faW1wb3J0cyhbW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFZhbFRvU2xvdD0odmFsKT0+XG5GYWlsIGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWw9KHNsb3QsX2lmYWNlKT0+XG5GYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90cyAke3Nsb3R9YDtcblxuY29uc3QgYmFkQXJyYXlIYW5kbGVyPWhhcmRlbih7XG5nZXQ6KF90YXJnZXQsbmFtZSxfcmVjZWl2ZXIpPT57XG5pZihuYW1lPT09J2xlbmd0aCcpe1xucmV0dXJuIDA7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gfX0pO1xuXG5cbmNvbnN0IGJhZEFycmF5PWhhcmRlbihuZXcgUHJveHkoaGFyZGVuKFtdKSxiYWRBcnJheUhhbmRsZXIpKTtcblxuY29uc3R7c2VyaWFsaXplLHVuc2VyaWFsaXplfT1tYWtlTWFyc2hhbChcbmRvTm90Q29udmVydFZhbFRvU2xvdCxcbmRvTm90Q29udmVydFNsb3RUb1ZhbCxcbntcbmVycm9yVGFnZ2luZzonb2ZmJyxcbi8qIFRPRE8gZml4IHRlc3RzIHRvIHdvcmtzIHdpdGggc21hbGxjYXBzLiovXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidjYXBkYXRhJ30pO1xuXG5cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHN0cmluZ2lmeT0odmFsKT0+c2VyaWFsaXplKHZhbCkuYm9keTskaOKAjV9vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBwYXJzZT0oc3RyKT0+XG51bnNlcmlhbGl6ZShcbmhhcmRlbih7XG5ib2R5OnN0cixcbnNsb3RzOmJhZEFycmF5fSkpOyRo4oCNX29uY2UucGFyc2UocGFyc2UpO1xuXG5cbmhhcmRlbihwYXJzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC+nmlK7DIAAOwyAAAjAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2VuY29kZVRvU21hbGxjYXBzLmpzIiwiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5T2YsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRo4oCNX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5NYWtlTWFyc2hhbE9wdGlvbnN9IE1ha2VNYXJzaGFsT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxTbG90Pn0gQ29udmVydFNsb3RUb1ZhbCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxTbG90Pn0gQ29udmVydFZhbFRvU2xvdCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVG9DYXBEYXRhPFNsb3Q+fSBUb0NhcERhdGEgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkZyb21DYXBEYXRhPFNsb3Q+fSBGcm9tQ2FwRGF0YSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIHtDb252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm49KHgpPT54O1xuLyoqIEB0eXBlIHtDb252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkZWZhdWx0U2xvdFRvVmFsRm49KHgsXyk9Png7XG5cbi8qKlxuICogQHRlbXBsYXRlIFNsb3RcbiAqIEBwYXJhbSB7Q29udmVydFZhbFRvU2xvdDxTbG90Pn0gW2NvbnZlcnRWYWxUb1Nsb3RdXG4gKiBAcGFyYW0ge0NvbnZlcnRTbG90VG9WYWw8U2xvdD59IFtjb252ZXJ0U2xvdFRvVmFsXVxuICogQHBhcmFtIHtNYWtlTWFyc2hhbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXJzaGFsPShcbmNvbnZlcnRWYWxUb1Nsb3Q9ZGVmYXVsdFZhbFRvU2xvdEZuLFxuY29udmVydFNsb3RUb1ZhbD1kZWZhdWx0U2xvdFRvVmFsRm4sXG57XG5lcnJvclRhZ2dpbmc9J29uJyxcbm1hcnNoYWxOYW1lPSdhbm9uLW1hcnNoYWwnLFxuLyogVE9ETyBUZW1wb3JhcnkgaGFjay4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc4MCovXG5lcnJvcklkTnVtPTEwMDAwLFxuLyogV2UgcHJlZmVyIHRoYXQgdGhlIGNhbGxlciBpbnN0ZWFkIGxvZyB0byBzb21ld2hlcmUgaGlkZGVuKi9cbi8qIHRvIGJlIHJldmVhbGVkIHdoZW4gY29ycmVsYXRpbmcgd2l0aCB0aGUgcmVjZWl2ZWQgZXJyb3IuKi9cbm1hcnNoYWxTYXZlRXJyb3I9KGVycik9PlxuY29uc29sZS5sb2coJ1RlbXBvcmFyeSBsb2dnaW5nIG9mIHNlbnQgZXJyb3InLGVyciksXG4vKiBEZWZhdWx0IHRvICdjYXBkYXRhJyBiZWNhdXNlIGl0IHdhcyBpbXBsZW1lbnRlZCBmaXJzdC4qL1xuLyogU29tZXRpbWVzLCBvbnRvZ2VueSBkb2VzIHJlY2FwaXR1bGF0ZSBwaHlsb2dlbnkgOykqL1xuc2VyaWFsaXplQm9keUZvcm1hdD0nY2FwZGF0YSd9PVxue30pPT5cbntcbmFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsJ3N0cmluZycpO1xuZXJyb3JUYWdnaW5nPT09J29uJ3x8XG5lcnJvclRhZ2dpbmc9PT0nb2ZmJ3x8XG5GYWlsIGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gO1xuY29uc3QgbmV4dEVycm9ySWQ9KCk9PntcbmVycm9ySWROdW0rPTE7XG5yZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1RvQ2FwRGF0YTxTbG90Pn1cbiAqL1xuY29uc3QgdG9DYXBEYXRhPShyb290KT0+e1xuY29uc3Qgc2xvdHM9W107XG4vKiBtYXBzIHZhbCAocHJvbWlzZSBvciByZW1vdGFibGUpIHRvIGluZGV4IG9mIHNsb3RzW10qL1xuY29uc3Qgc2xvdE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGUgfCBQcm9taXNlfSBwYXNzYWJsZVxuICogQHJldHVybnMge3tpbmRleDogbnVtYmVyLCByZXBlYXQ6IGJvb2xlYW59fVxuICovXG5jb25zdCBlbmNvZGVTbG90Q29tbW9uPShwYXNzYWJsZSk9PntcbmxldCBpbmRleD1zbG90TWFwLmdldChwYXNzYWJsZSk7XG5pZihpbmRleCE9PXVuZGVmaW5lZCl7XG4vKiBUT0RPIGFzc2VydCB0aGF0IGl0J3MgdGhlIHNhbWUgaWZhY2UgYXMgYmVmb3JlKi9cbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OnRydWV9KTtcbiB9XG5cbmluZGV4PXNsb3RzLmxlbmd0aDtcbmNvbnN0IHNsb3Q9Y29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG5zbG90cy5wdXNoKHNsb3QpO1xuc2xvdE1hcC5zZXQocGFzc2FibGUsaW5kZXgpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OmZhbHNlfSk7XG4gfTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiB1bmtub3dufSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yQ29tbW9uPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBtZXNzYWdlPWVuY29kZVJlY3VyKCBgJHtlcnIubWVzc2FnZX1gKTtcbmFzc2VydC50eXBlb2YobWVzc2FnZSwnc3RyaW5nJyk7XG5jb25zdCBuYW1lPWVuY29kZVJlY3VyKCBgJHtlcnIubmFtZX1gKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG4vKiBNdXN0IGVuY29kZSBgY2F1c2VgLCBgZXJyb3JzYC4qL1xuLyogbmVzdGVkIG5vbi1wYXNzYWJsZSBlcnJvcnMgbXVzdCBiZSBvayBmcm9tIGhlcmUuKi9cbmlmKGVycm9yVGFnZ2luZz09PSdvbicpe1xuLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4vKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4vKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4vKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4vKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbi8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG5jb25zdCBlcnJvcklkPWVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuYXNzZXJ0LnR5cGVvZihlcnJvcklkLCdzdHJpbmcnKTtcbmFzc2VydC5ub3RlKGVycixYIGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbm1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbnJldHVybiBoYXJkZW4oe2Vycm9ySWQsbWVzc2FnZSxuYW1lfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHttZXNzYWdlLG5hbWV9KTtcbiB9XG4gfTtcblxuaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdjYXBkYXRhJyl7XG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YT0ocGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGluZGV4fSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaWZhY2UsaW5kZXh9KTtcbiB9XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPSh2YWwsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHZhbCxnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gaXNFcnJvckxpa2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonZXJyb3InLC4uLmVyckRhdGF9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb0NhcERhdGE9bWFrZUVuY29kZVRvQ2FwRGF0YSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGF9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvQ2FwRGF0YShyb290KTtcbmNvbnN0IGJvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbmJvZHksXG5zbG90c30pO1xuXG4gfWVsc2UgaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdzbWFsbGNhcHMnKXtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzPShwcmVmaXgscGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuLyogVE9ETyBleHBsb3JlIHJlbW92aW5nIHRoaXMgc3BlY2lhbCBjYXNlKi9cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuIH1cbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW1vdGFibGUsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLHJlbW90YWJsZSxnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJyxwcm9taXNlKTtcblxuY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xuY29uc3R7bWVzc2FnZSwuLi5yZXN0fT1lcnJEYXRhO1xucmV0dXJuIGhhcmRlbih7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0fSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9bWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc30pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG5jb25zdCBzbWFsbGNhcHNCb2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG4vKiBWYWxpZCBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGEgdmFsaWQgc2lnbmFsKi9cbi8qIGluZGljYXRpbmcgc21hbGxjYXBzIGZvcm1hdC4qL1xuYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbnNsb3RzfSk7XG5cbiB9ZWxzZXtcbi8qIFRoZSBgdGhyb3dgIGlzIGEgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBBZGRlZCBmb3IgY29uZnVzZWQgbGludGVycy4qL1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuIH1cbiB9O1xuXG5jb25zdCBtYWtlRnVsbFJldml2ZT0oc2xvdHMpPT57XG4vKiogQHR5cGUge01hcDxudW1iZXIsIFBhc3NhYmxlPn0gKi9cbmNvbnN0IHZhbE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1JlbW90YWJsZSB8IFByb21pc2V9XG4gKi9cbmNvbnN0IGRlY29kZVNsb3RDb21tb249KHNsb3REYXRhKT0+e1xuY29uc3R7aWZhY2U9dW5kZWZpbmVkLGluZGV4LC4uLnJlc3R9PXNsb3REYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG5pZih2YWxNYXAuaGFzKGluZGV4KSl7XG5yZXR1cm4gdmFsTWFwLmdldChpbmRleCk7XG4gfVxuLyogVE9ETyBTRUNVUklUWSBIQVpBUkQ6IG11c3QgZW5mb2NlIHRoYXQgcmVtb3RhYmxlIHZzIHByb21pc2UqL1xuLyogaXMgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGVkIHN0cmluZy4qL1xuY29uc3Qgc2xvdD1zbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuY29uc3QgdmFsPWNvbnZlcnRTbG90VG9WYWwoc2xvdCxpZmFjZSk7XG52YWxNYXAuc2V0KGluZGV4LHZhbCk7XG5yZXR1cm4gdmFsO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fSBlcnJEYXRhXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuY29uc3QgZGVjb2RlRXJyb3JDb21tb249KGVyckRhdGEsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtlcnJvcklkPXVuZGVmaW5lZCxtZXNzYWdlLG5hbWUsLi4ucmVzdH09ZXJyRGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbi8qIFRPRE8gTXVzdCBkZWNvZGUgYGNhdXNlYCBhbmQgYGVycm9yc2AgcHJvcGVydGllcyovXG4vKiBjYXBEYXRhIGRvZXMgbm90IHRyYW5zZm9ybSBzdHJpbmdzLiBUaGUgY2FsbHMgdG8gYGRlY29kZVJlY3VyYCovXG4vKiBhcmUgZm9yIHJldXNlIGJ5IG90aGVyIGVuY29kaW5ncyB0aGF0IGRvLCBzdWNoIGFzIHNtYWxsY2Fwcy4qL1xuY29uc3QgZE5hbWU9ZGVjb2RlUmVjdXIobmFtZSk7XG5jb25zdCBkTWVzc2FnZT1kZWNvZGVSZWN1cihtZXNzYWdlKTtcbmNvbnN0IGRFcnJvcklkPWVycm9ySWQmJmRlY29kZVJlY3VyKGVycm9ySWQpO1xudHlwZW9mIGROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xudHlwZW9mIGRNZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSl8fEVycm9yO1xuLyogZXJyb3JJZCBpcyBhIGxhdGUgYWRkaXRpb24gc28gYmUgdG9sZXJhbnQgb2YgaXRzIGFic2VuY2UuKi9cbmNvbnN0IGVycm9yTmFtZT1cbmRFcnJvcklkPT09dW5kZWZpbmVkP1xuIGBSZW1vdGUke0VDLm5hbWV9YDpcbiBgUmVtb3RlJHtFQy5uYW1lfSgke2RFcnJvcklkfSlgO1xuY29uc3QgZXJyb3I9YXNzZXJ0LmVycm9yKGRNZXNzYWdlLEVDLHtlcnJvck5hbWV9KTtcbnJldHVybiBoYXJkZW4oZXJyb3IpO1xuIH07XG5cbi8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuLyogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uKi9cbi8qIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlKi9cbi8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzQqL1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHJhd1RyZWUsX2RlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5zbG90RGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhPShyYXdUcmVlLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5lcnJEYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21DYXBEYXRhPW1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGF9KTtcblxuXG5jb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHM9KHByZWZpeCk9Pntcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ0VuY29kaW5nXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gX2RlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlIHwgUHJvbWlzZX1cbiAqL1xucmV0dXJuKHN0cmluZ0VuY29kaW5nLF9kZWNvZGVSZWN1cik9PntcbmFzc2VydChzdHJpbmdFbmNvZGluZy5zdGFydHNXaXRoKHByZWZpeCkpO1xuLyogc2xvdHM6ICRzbG90SW5kZXguaWZhY2Ugb3IgJHNsb3RJbmRleCovXG5jb25zdCBpPXN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbmNvbnN0IGluZGV4PU51bWJlcihzdHJpbmdFbmNvZGluZy5zbGljZSgxLGk8MD91bmRlZmluZWQ6aSkpO1xuLyogaSA8IDAgbWVhbnMgdGhlcmUgd2FzIG5vIGlmYWNlIGluY2x1ZGVkLiovXG5jb25zdCBpZmFjZT1pPDA/dW5kZWZpbmVkOnN0cmluZ0VuY29kaW5nLnNsaWNlKGkrMSk7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7aWZhY2UsaW5kZXh9KTtcbiB9O1xuIH07XG5jb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJCcpO1xuY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCcmJyk7XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcsZGVjb2RlUmVjdXIpPT57XG5jb25zdHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3RFcnJEYXRhfT1lbmNvZGluZztcbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RFcnJEYXRhLCdtZXNzYWdlJyl8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oe21lc3NhZ2UsLi4ucmVzdEVyckRhdGF9LGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwc30pO1xuXG5cbnJldHVybiBoYXJkZW4oe3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtGcm9tQ2FwRGF0YTxTbG90Pn1cbiAqL1xuY29uc3QgZnJvbUNhcERhdGE9KGRhdGEpPT57XG5jb25zdHtib2R5LHNsb3RzfT1kYXRhO1xudHlwZW9mIGJvZHk9PT0nc3RyaW5nJ3x8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG5pc0FycmF5KGRhdGEuc2xvdHMpfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5zbG90cyBhcmUgbm90IEFycmF5KWA7XG5jb25zdHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfT1tYWtlRnVsbFJldml2ZShzbG90cyk7XG5sZXQgcmVzdWx0O1xuLyogSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhbiB1bmFtYmlndW91cyBzaWduYWwuKi9cbmlmKGJvZHkuc3RhcnRzV2l0aCgnIycpKXtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9Ym9keS5zbGljZSgxKTtcbmNvbnN0IGVuY29kaW5nPWhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuIH1lbHNle1xuY29uc3QgcmF3VHJlZT1oYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiB9XG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM3Ki9cbi8qIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpeGVkIG9uY2Ugd2UndmUgY29tcGxldGVkIHRoZSBzd2l0Y2gqL1xuLyogdG8gc21hbGxjYXBzLiovXG5hc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtcbnRvQ2FwRGF0YSxcbmZyb21DYXBEYXRhLFxuXG4vKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqL1xuLyoqIEBkZXByZWNhdGVkIHVzZSB0b0NhcERhdGEgKi9cbnNlcmlhbGl6ZTp0b0NhcERhdGEsXG4vKiogQGRlcHJlY2F0ZWQgdXNlIGZyb21DYXBEYXRhICovXG51bnNlcmlhbGl6ZTpmcm9tQ2FwRGF0YX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABXRGQKfkAAAH5AAAAlAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL3JhbmtPcmRlci5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVBhc3NhYmxlLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbIkZ1bGxSYW5rQ292ZXIiLCJhc3NlcnRSYW5rU29ydGVkIiwiY29tcGFyYXRvck1pcnJvckltYWdlIiwiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZVJhbmsiLCJjb3ZlcmVkRW50cmllcyIsImdldEluZGV4Q292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciIsImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpc1JhbmtTb3J0ZWQiLCJtYWtlQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Iiwic29ydEJ5UmFuayIsInVuaW9uUmFua0NvdmVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJwYXNzU3R5bGVQcmVmaXhlc1wiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlUHJlZml4ZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb3Zlcn0gUmFua0NvdmVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SYW5rQ29tcGFyaXNvbn0gUmFua0NvbXBhcmlzb24gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb21wYXJlfSBSYW5rQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxzZXRQcm90b3R5cGVPZixpc309T2JqZWN0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W251bWJlciwgbnVtYmVyXX0gSW5kZXhDb3ZlclxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbiB1c2VkIGJ5IEphdmFTY3JpcHQncyBNYXAgYW5kIFNldFxuICogYWJzdHJhY3Rpb25zLCB3aGVyZSBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGFuZCAtMCBpcyB0aGUgc2FtZSBhc1xuICogMC4gTWFyc2hhbCBzZXJpYWxpemVzIC0wIGFzIHplcm8sIHNvIHRoZSBzZW1hbnRpY3Mgb2Ygb3VyIGRpc3RyaWJ1dGVkXG4gKiBvYmplY3Qgc3lzdGVtIGRvZXMgbm90IGRpc3Rpbmd1aXNoIDAgZnJvbSAtMC5cbiAqXG4gKiBgc2FtZVZhbHVlWmVyb2AgaXMgdGhlIEVjbWFTY3JpcHQgc3BlYyBuYW1lIGZvciB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24sXG4gKiBidXQgVE9ETyB3ZSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSBBUEkuXG4gKlxuICogQHBhcmFtIHthbnl9IHhcbiAqIEBwYXJhbSB7YW55fSB5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc2FtZVZhbHVlWmVybz0oeCx5KT0+eD09PXl8fGlzKHgseSk7XG5cbmNvbnN0IHRyaXZpYWxDb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnksIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xubGVmdDxyaWdodD8tMTpsZWZ0PT09cmlnaHQ/MDoxO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8UGFzc1N0eWxlLCB7IGluZGV4OiBudW1iZXIsIGNvdmVyOiBSYW5rQ292ZXIgfT59IFBhc3NTdHlsZVJhbmtzUmVjb3JkXG4gKi9cblxuY29uc3QgcGFzc1N0eWxlUmFua3M9LyoqIEB0eXBlIHtQYXNzU3R5bGVSYW5rc1JlY29yZH0gKi9cbmZyb21FbnRyaWVzKFxuZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbi8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LiovLlxuc29ydCgoW19sZWZ0U3R5bGUsbGVmdFByZWZpeGVzXSxbX3JpZ2h0U3R5bGUscmlnaHRQcmVmaXhlc10pPT57XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLHJpZ2h0UHJlZml4ZXMpO1xuIH0pLlxubWFwKChbcGFzc1N0eWxlLHByZWZpeGVzXSxpbmRleCk9Pntcbi8qIENvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhbnkgY2hhcmFjdGVyIGluIGBwcmVmaXhlc2AsKi9cbi8qIHZlcmlmeWluZyB0aGF0IGl0IGlzIHNvcnRlZCBzbyB0aGF0IGlzKi9cbi8qIGFsbCBzIHN1Y2ggdGhhdCBwcmVmaXhlcy5hdCgwKSDiiaQgcyA8IHN1Y2Nlc3NvcihwcmVmaXhlcy5hdCgtMSkpLiovXG5wcmVmaXhlcz09PVsuLi5wcmVmaXhlc10uc29ydCgpLmpvaW4oJycpfHxcbkZhaWwgYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG5jb25zdCBjb3Zlcj1bXG5wcmVmaXhlcy5jaGFyQXQoMCksXG5TdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoLTEpKzEpXTtcblxucmV0dXJuW3Bhc3NTdHlsZSx7aW5kZXgsY292ZXJ9XTtcbiB9KSk7XG5cblxuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKipcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRQYXNzU3R5bGVDb3Zlcj0ocGFzc1N0eWxlKT0+cGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaOKAjV9vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZD1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmU9fSBjb21wYXJlUmVtb3RhYmxlc1xuICogQW4gb3B0aW9uIHRvIGNyZWF0ZSBhIGNvbXBhcmF0b3IgaW4gd2hpY2ggYW4gaW50ZXJuYWwgb3JkZXIgaXNcbiAqIGFzc2lnbmVkIHRvIHJlbW90YWJsZXMuIFRoaXMgZGVmYXVsdHMgdG8gYSBjb21wYXJhdG9yIHRoYXRcbiAqIGFsd2F5cyByZXR1cm5zIGAwYCwgbWVhbmluZyB0aGF0IGFsbCByZW1vdGFibGVzIGFyZSB0aWVkXG4gKiBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyYXRvcktpdH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb21wYXJhdG9yS2l0PShjb21wYXJlUmVtb3RhYmxlcz0oX3gsX3kpPT4wKT0+e1xuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGNvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT57XG5pZihzYW1lVmFsdWVaZXJvKGxlZnQscmlnaHQpKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG5wYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxucGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgpO1xuXG4gfVxuLyogZXNsaW50LWRpc2FibGUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyAtLVxuICogV2Uga25vdyBgbGVmdGAgYW5kIGByaWdodGAgYXJlIGNvbXBhcmFibGUuXG4gKi9cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbi8qIEZvciBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIGFsbCBtZW1iZXJzIG9mIHRoYXQgcGFzc1N0eWxlIGFyZSB0aWVkKi9cbi8qIGZvciB0aGUgc2FtZSByYW5rLiovXG5yZXR1cm4gMDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOntcbi8qIFdpdGhpbiBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIHRoZSByYW5rIG9yZGVyaW5nIGFncmVlcyB3aXRoKi9cbi8qIEphdmFTY3JpcHQncyByZWxhdGlvbmFsIG9wZXJhdG9ycyBgPGAgYW5kIGA+YC4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGNvbXBhcmF0b3IoXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wocmlnaHQpKTtcblxuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBgTmFOYCdzIHJhbmsgaXMgYWZ0ZXIgYWxsIG90aGVyIG51bWJlcnMuKi9cbmlmKE51bWJlci5pc05hTihsZWZ0KSl7XG5hc3NlcnQoIU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIDE7XG4gfWVsc2UgaWYoTnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG5yZXR1cm4tMTtcbiB9XG4vKiBUaGUgcmFuayBvcmRlcmluZyBvZiBub24tTmFOIG51bWJlcnMgYWdyZWVzIHdpdGggSmF2YVNjcmlwdCdzKi9cbi8qIHJlbGF0aW9uYWwgb3BlcmF0b3JzICc8JyBhbmQgJz4nLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBpbnZlcnNlIHNvcnRlZCBvcmRlciBvZiBwcm9wZXJ0eSBuYW1lcywgdGhlbiovXG4vKiBsZXhpY29ncmFwaGljIGJ5IGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoYXQgc2FtZSBpbnZlcnNlKi9cbi8qIG9yZGVyIG9mIHRoZWlyIHByb3BlcnR5IG5hbWVzLiBDb21wYXJpbmcgbmFtZXMgYnkgdGhlbXNlbHZlcyBmaXJzdCwqL1xuLyogYWxsIHJlY29yZHMgd2l0aCB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YgcHJvcGVydHkgbmFtZXMgc29ydCBuZXh0IHRvKi9cbi8qIGVhY2ggb3RoZXIgaW4gYSByYW5rLXNvcnQgb2YgY29weVJlY29yZHMuKi9cblxuLyogVGhlIGNvcHlSZWNvcmQgaW52YXJpYW50cyBlbmZvcmNlZCBieSBwYXNzU3R5bGVPZiBlbnN1cmUgdGhhdCovXG4vKiBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIGFyZSBzdHJpbmdzLiBXZSBuZWVkIHRoZSByZXZlcnNlIHNvcnRlZCBvcmRlciovXG4vKiBvZiB0aGVzZSBuYW1lcywgd2hpY2ggd2UgdGhlbiBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5LiBUaGlzIGVuc3VyZXMqL1xuLyogdGhhdCBpZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFggYXJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiByZWNvcmQgWSwqL1xuLyogdGhlbiByZWNvcmQgWCB3aWxsIGhhdmUgYW4gZWFybGllciByYW5rIGFuZCBzb3J0IHRvIHRoZSBsZWZ0IG9mIFkuKi9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0TmFtZXMscmlnaHROYW1lcyk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IoXG5yZWNvcmRWYWx1ZXMobGVmdCxsZWZ0TmFtZXMpLFxucmVjb3JkVmFsdWVzKHJpZ2h0LHJpZ2h0TmFtZXMpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0W2ldLHJpZ2h0W2ldKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIHdlcmUgdGllZCwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuLyogSWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaGFzIGFuIGVhcmxpZXIgcmFuayB0aGFuIFkuKi9cbnJldHVybiBjb21wYXJhdG9yKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgYFtTeW1ib2wudG9TdHJpbmdUYWddYCB0aGVuIGAucGF5bG9hZGAuKi9cbmNvbnN0IGxhYmVsQ29tcD1jb21wYXJhdG9yKGdldFRhZyhsZWZ0KSxnZXRUYWcocmlnaHQpKTtcbmlmKGxhYmVsQ29tcCE9PTApe1xucmV0dXJuIGxhYmVsQ29tcDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQscmlnaHQucGF5bG9hZCk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gO1xuIH19XG5cbi8qIGVzbGludC1lbmFibGUgKi9cbiB9O1xuXG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgYW50aUNvbXBhcmF0b3I9KHgseSk9PmNvbXBhcmF0b3IoeSx4KTtcblxubWVtb09mU29ydGVkLnNldChjb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xubWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGNvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3IpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoYW50aUNvbXBhcmF0b3IsY29tcGFyYXRvcik7XG5cbnJldHVybiBoYXJkZW4oe2NvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3J9KTtcbiB9O1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmU9fVxuICovJGjigI1fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG5jb25zdCAgICAgICAgY29tcGFyYXRvck1pcnJvckltYWdlPShjb21wYXJhdG9yKT0+XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLmdldChjb21wYXJhdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuY29uc3QgICAgICAgIGlzUmFua1NvcnRlZD0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuaWYoc3ViTWVtb09mU29ydGVkLmhhcyhwYXNzYWJsZXMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpPT09J2NvcHlBcnJheScpO1xuZm9yKGxldCBpPTE7aTxwYXNzYWJsZXMubGVuZ3RoO2krPTEpe1xuaWYoY29tcGFyZShwYXNzYWJsZXNbaS0xXSxwYXNzYWJsZXNbaV0pPj0xKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuc3ViTWVtb09mU29ydGVkLmFkZChwYXNzYWJsZXMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmlzUmFua1NvcnRlZChpc1JhbmtTb3J0ZWQpO1xuaGFyZGVuKGlzUmFua1NvcnRlZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFJhbmtTb3J0ZWQ9KHNvcnRlZCxjb21wYXJlKT0+XG5pc1JhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpfHxcbi8qIFRPRE8gYXNzZXJ0IG9uIGJ1ZyBjb3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi4gRml4LiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuRmFpbCBgTXVzdCBiZSByYW5rIHNvcnRlZDogJHtzb3J0ZWR9IHZzICR7c29ydEJ5UmFuayhzb3J0ZWQsY29tcGFyZSl9YDskaOKAjV9vbmNlLmFzc2VydFJhbmtTb3J0ZWQoYXNzZXJ0UmFua1NvcnRlZCk7XG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qKlxuICogVE9ETyBTRUNVUklUWSBCVUc6IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDI2MFxuICogc29ydEJ5UmFuayBjdXJyZW50bHkgdXNlcyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGRpcmVjdGx5LCBhbmRcbiAqIHNvIG9ubHkgd29ya3MgY29ycmVjdGx5IHdoZW4gZ2l2ZW4gYSBgY29tcGFyZWAgZnVuY3Rpb24gdGhhdCBjb25zaWRlcnNcbiAqIGB1bmRlZmluZWRgIHN0cmljdGx5IGJpZ2dlciAoYD5gKSB0aGFuIGV2ZXJ5dGhpbmcgZWxzZS4gVGhpcyBpc1xuICogYmVjYXVzZSBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGJpemFycmVseSBtb3ZlcyBhbGwgYHVuZGVmaW5lZGBzIHRvXG4gKiB0aGUgZW5kIG9mIHRoZSBhcnJheSByZWdhcmRsZXNzLCB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIGBjb21wYXJlYFxuICogZnVuY3Rpb24uIFRoaXMgaXMgYSBnZW51aW5lIGJ1ZyBmb3IgdXMgTk9XIGJlY2F1c2Ugc29tZXRpbWVzIHdlIHNvcnRcbiAqIGluIHJldmVyc2Ugb3JkZXIgYnkgcGFzc2luZyBhIHJldmVyc2VkIHJhbmsgY29tcGFyaXNvbiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFBhc3NhYmxlPn0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7UGFzc2FibGVbXX1cbiAqL1xuY29uc3QgICAgICAgIHNvcnRCeVJhbms9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuaWYoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKXtcbmhhcmRlbihwYXNzYWJsZXMpO1xuLyogQ2FsbGluZyBpc1JhbmtTb3J0ZWQgZ2l2ZXMgaXQgYSBjaGFuY2UgdG8gZ2V0IG1lbW9pemVkIGZvciovXG4vKiB0aGlzIGBjb21wYXJlYCBmdW5jdGlvbiBldmVuIGlmIGl0IHdhcyBhbHJlYWR5IG1lbW9pemVkIGZvciBhIGRpZmZlcmVudCovXG4vKiBgY29tcGFyZWAgZnVuY3Rpb24uKi9cbmlmKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsY29tcGFyZSkpe1xucmV0dXJuIHBhc3NhYmxlcztcbiB9XG4gfVxuY29uc3QgdW5zb3J0ZWQ9Wy4uLnBhc3NhYmxlc107XG51bnNvcnRlZC5mb3JFYWNoKGhhcmRlbik7XG5jb25zdCBzb3J0ZWQ9aGFyZGVuKHVuc29ydGVkLnNvcnQoY29tcGFyZSkpO1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbnN1Yk1lbW9PZlNvcnRlZC5hZGQoc29ydGVkKTtcbnJldHVybiBzb3J0ZWQ7XG4gfTskaOKAjV9vbmNlLnNvcnRCeVJhbmsoc29ydEJ5UmFuayk7XG5oYXJkZW4oc29ydEJ5UmFuayk7XG5cbi8qKlxuICogU2VlXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfc2VhcmNoX2FsZ29yaXRobSNQcm9jZWR1cmVfZm9yX2ZpbmRpbmdfdGhlX2xlZnRtb3N0X2VsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcGFyYW0geyhcImxlZnRNb3N0XCIgfCBcInJpZ2h0TW9zdFwiKT19IGJpYXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJhbmtTZWFyY2g9KHNvcnRlZCxjb21wYXJlLGtleSxiaWFzPSdsZWZ0TW9zdCcpPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmxldCBsZWZ0PTA7XG5sZXQgcmlnaHQ9c29ydGVkLmxlbmd0aDtcbndoaWxlKGxlZnQ8cmlnaHQpe1xuY29uc3QgbT1NYXRoLmZsb29yKChsZWZ0K3JpZ2h0KS8yKTtcbmNvbnN0IGNvbXA9Y29tcGFyZShzb3J0ZWRbbV0sa2V5KTtcbmlmKGNvbXA8PS0xfHxjb21wPT09MCYmYmlhcz09PSdyaWdodE1vc3QnKXtcbmxlZnQ9bSsxO1xuIH1lbHNle1xuYXNzZXJ0KGNvbXA+PTF8fGNvbXA9PT0wJiZiaWFzPT09J2xlZnRNb3N0Jyk7XG5yaWdodD1tO1xuIH1cbiB9XG5yZXR1cm4gYmlhcz09PSdsZWZ0TW9zdCc/bGVmdDpyaWdodC0xO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSByYW5rQ292ZXJcbiAqIEByZXR1cm5zIHtJbmRleENvdmVyfVxuICovXG5jb25zdCAgICAgICAgZ2V0SW5kZXhDb3Zlcj0oc29ydGVkLGNvbXBhcmUsW2xlZnRLZXkscmlnaHRLZXldKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5jb25zdCBsZWZ0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxsZWZ0S2V5LCdsZWZ0TW9zdCcpO1xuY29uc3QgcmlnaHRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLHJpZ2h0S2V5LCdyaWdodE1vc3QnKTtcbnJldHVybltsZWZ0SW5kZXgscmlnaHRJbmRleF07XG4gfTskaOKAjV9vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qKiBAdHlwZSB7UmFua0NvdmVyfSAqL1xuY29uc3QgICAgICAgIEZ1bGxSYW5rQ292ZXI9aGFyZGVuKFsnJywneyddKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqLyRo4oCNX29uY2UuRnVsbFJhbmtDb3ZlcihGdWxsUmFua0NvdmVyKTtcbmNvbnN0ICAgICAgICBjb3ZlcmVkRW50cmllcz0oc29ydGVkLFtsZWZ0SW5kZXgscmlnaHRJbmRleF0pPT57XG4vKiogQHR5cGUge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59ICovXG5jb25zdCBpdGVyYWJsZT1oYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPWxlZnRJbmRleDtcbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuaWYoaTw9cmlnaHRJbmRleCl7XG5jb25zdCBlbGVtZW50PXNvcnRlZFtpXTtcbmkrPTE7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTpbaSxlbGVtZW50XSxkb25lOmZhbHNlfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTp1bmRlZmluZWQsZG9uZTp0cnVlfSk7XG4gfVxuIH19KTtcblxuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5jb3ZlcmVkRW50cmllcyhjb3ZlcmVkRW50cmllcyk7XG5oYXJkZW4oY292ZXJlZEVudHJpZXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWF4UmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik+PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWluUmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik8PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIHVuaW9uUmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgdW5pb25SYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1pblJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5tYXhSYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZSh1bmlvblJhbmtDb3ZlclBhaXIsWyd7JywnJ10pO1xuIH07JGjigI1fb25jZS51bmlvblJhbmtDb3ZlcnModW5pb25SYW5rQ292ZXJzKTtcbmhhcmRlbih1bmlvblJhbmtDb3ZlcnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGludGVyc2VjdFJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IGludGVyc2VjdFJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWF4UmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1pblJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKGludGVyc2VjdFJhbmtDb3ZlclBhaXIsWycnLCd7J10pO1xuIH07JGjigI1fb25jZS5pbnRlcnNlY3RSYW5rQ292ZXJzKGludGVyc2VjdFJhbmtDb3ZlcnMpO1xuXG5jb25zdCAgICAgICB7Y29tcGFyYXRvcjpjb21wYXJlUmFuayxhbnRpQ29tcGFyYXRvcjpjb21wYXJlQW50aVJhbmt9PVxubWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wYXJhdG9yIGtpdCBpbiB3aGljaCByZW1vdGFibGVzIGFyZSBmdWxseSBvcmRlcmVkXG4gKiBieSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZmlyc3Qgc2VlbiBieSAqdGhpcyogY29tcGFyYXRvciBraXQuXG4gKiBCRVdBUkU6IFRoaXMgaXMgb2JzZXJ2YWJsZSBtdXRhYmxlIHN0YXRlLCBzbyBzdWNoIGEgY29tcGFyYXRvciBraXRcbiAqIHNob3VsZCBuZXZlciBiZSBzaGFyZWQgYW1vbmcgc3Vic3lzdGVtcyB0aGF0IHNob3VsZCBub3QgYmUgYWJsZVxuICogdG8gY29tbXVuaWNhdGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgb3JkZXIgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIGZvciBzdG9yZVxuICogb3JkZXJpbmcsIHNpbmNlIGl0IGhhcyBubyBtZW1vcnkgb2YgZGVsZXRlZCBrZXlzLlxuICpcbiAqIFRoZXNlIGZ1bGwgb3JkZXIgY29tcGFyYXRvciBraXQgaXMgc3RyaWN0bHkgbW9yZSBwcmVjaXNlIHRoYXQgdGhlXG4gKiByYW5rIG9yZGVyIGNvbXBhcmF0b3Iga2l0cyBhYm92ZS4gQXMgYSByZXN1bHQsIGFueSBhcnJheSB3aGljaCBpc1xuICogc29ydGVkIGJ5IHN1Y2ggYSBmdWxsIG9yZGVyIHdpbGwgcGFzcyB0aGUgaXNSYW5rU29ydGVkIHRlc3Qgd2l0aFxuICogYSBjb3JyZXNwb25kaW5nIHJhbmsgb3JkZXIuXG4gKlxuICogQW4gYXJyYXkgd2hpY2ggaXMgc29ydGVkIGJ5IGEgKmZyZXNoKiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIGkuZS4sXG4gKiBvbmUgdGhhdCBoYXMgbm90IHlldCBzZWVuIGFueSByZW1vdGFibGVzLCB3aWxsIG9mIGNvdXJzZSByZW1haW5cbiAqIHNvcnRlZCBieSBhY2NvcmRpbmcgdG8gKnRoYXQqIGZ1bGwgb3JkZXIgY29tcGFyYXRvci4gQW4gYXJyYXkgKm9mXG4gKiBzY2FsYXJzKiBzb3J0ZWQgYnkgYSBmcmVzaCBmdWxsIG9yZGVyIHdpbGwgcmVtYWluIHNvcnRlZCBldmVuXG4gKiBhY2NvcmRpbmcgdG8gYSBuZXcgZnJlc2ggZnVsbCBvcmRlciBjb21wYXJhdG9yLCBzaW5jZSBpdCB3aWxsIHNlZVxuICogdGhlIHJlbW90YWJsZXMgaW4gdGhlIHNhbWUgb3JkZXIgYWdhaW4uIFVuZm9ydHVuYXRlbHksIHRoaXMgaXNcbiAqIG5vdCB0cnVlIG9mIGFycmF5cyBvZiBwYXNzYWJsZXMgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsb25nTGl2ZWRcbiAqIEByZXR1cm5zIHtGdWxsQ29tcGFyYXRvcktpdH1cbiAqLyRo4oCNX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRo4oCNX29uY2UuY29tcGFyZUFudGlSYW5rKGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCAgICAgICAgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQ9KGxvbmdMaXZlZD1mYWxzZSk9PntcbmxldCBudW1TZWVuPTA7XG4vKiBXaGVuIGR5bmFtaWNhbGx5IGNyZWF0ZWQgd2l0aCBzaG9ydCBsaWZldGltZXMgKHRoZSBkZWZhdWx0KSBhIFdlYWtNYXAqL1xuLyogd291bGQgcGVyZm9ybSBwb29ybHksIGFuZCB0aGUgbGVhayBjcmVhdGVkIGJ5IGEgTWFwIG9ubHkgbGFzdHMgYXMgbG9uZyovXG4vKiBhcyB0aGUgTWFwLiovXG5jb25zdCBNYXBDb25zdHJ1Y3Rvcj1sb25nTGl2ZWQ/V2Vha01hcDpNYXA7XG5jb25zdCBzZWVuPW5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuY29uc3QgdGFnPShyKT0+e1xuaWYoc2Vlbi5oYXMocikpe1xucmV0dXJuIHNlZW4uZ2V0KHIpO1xuIH1cbm51bVNlZW4rPTE7XG5zZWVuLnNldChyLG51bVNlZW4pO1xucmV0dXJuIG51bVNlZW47XG4gfTtcbmNvbnN0IGNvbXBhcmVSZW1vdGFibGVzPSh4LHkpPT5jb21wYXJlUmFuayh0YWcoeCksdGFnKHkpKTtcbnJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbmhhcmRlbihtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACEAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJR6bvc8LAADPCwAAHgAAAEBlbmRvL25hdC12NC4xLjI3L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsICduYW1lJywge3ZhbHVlOiBcImlzTmF0XCJ9KTskaOKAjV9vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJOYXRcIn0pOyRo4oCNX29uY2UuTmF0KE5hdCk7ICAgLyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5yZXR1cm4gYWxsZWdlZE51bT49MDtcbiB9XG5pZih0eXBlb2YgYWxsZWdlZE51bSE9PSdudW1iZXInKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbnJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSYmYWxsZWdlZE51bT49MDtcbiB9XG5cbi8qKlxuICogSWYgYGFsbGVnZWROdW1iZXJgIHBhc3NlcyB0aGUgYGlzTmF0YCB0ZXN0LCB0aGVuIHJldHVybiBpdCBhcyBhIGJpZ2ludC5cbiAqIE90aGVyd2lzZSB0aHJvdyBhbiBhcHByb3ByaWF0ZSBlcnJvci5cbiAqXG4gKiBJZiBgYWxsZWdlZE51bWAgaXMgbmVpdGhlciBhIGJpZ2ludCBub3IgYSBudW1iZXIsIGBOYXRgIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBpcyBub3QgYSBbc2FmZWx5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiBub24tbmVnYXRpdmUgaW50ZWdlciwgYE5hdGAgdGhyb3dzIGEgYFJhbmdlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBiaWdpbnQgaWYgbmVjZXNzYXJ5IGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuIH1cbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABl8owafAgAAHwIAAAgAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZXJyb3IuanMiLCIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiRmFyIiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSIsImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJpc09iamVjdCIsImlzT2JqZWN0IiwiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2l0ZXItaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL2Vycm9yLmpzXCIsIFtdXSxbXCIuL3NyYy9yZW1vdGFibGUuanNcIiwgW11dLFtcIi4vc3JjL3N5bWJvbC5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlT2YuanNcIiwgW11dLFtcIi4vc3JjL21ha2VUYWdnZWQuanNcIiwgW11dLFtcIi4vc3JjL21ha2UtZmFyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOltbIm1hcEl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSxbImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiXV0sIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjpbWyJQQVNTX1NUWUxFIiwiUEFTU19TVFlMRSJdLFsiaXNPYmplY3QiLCJpc09iamVjdCJdLFsiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENoZWNrZXIiXSxbImdldFRhZyIsImdldFRhZyJdLFsiaGFzT3duUHJvcGVydHlPZiIsImhhc093blByb3BlcnR5T2YiXV0sIi4vc3JjL2Vycm9yLmpzIjpbWyJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLFsidG9QYXNzYWJsZUVycm9yIiwidG9QYXNzYWJsZUVycm9yIl0sWyJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIl1dLCIuL3NyYy9yZW1vdGFibGUuanMiOltbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXV0sIi4vc3JjL3N5bWJvbC5qcyI6W1siYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLFsiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiXSxbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLFsicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl1dLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6W1sicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdLFsiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSJdXSwiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6W1sibWFrZVRhZ2dlZCIsIm1ha2VUYWdnZWQiXV0sIi4vc3JjL21ha2UtZmFyLmpzIjpbWyJSZW1vdGFibGUiLCJSZW1vdGFibGUiXSxbIkZhciIsIkZhciJdLFsiVG9GYXJGdW5jdGlvbiIsIlRvRmFyRnVuY3Rpb24iXV0sIi4vc3JjL3R5cGVHdWFyZHMuanMiOltbImFzc2VydFJlY29yZCIsImFzc2VydFJlY29yZCJdLFsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5Il0sWyJhc3NlcnRSZW1vdGFibGUiLCJhc3NlcnRSZW1vdGFibGUiXSxbImlzUmVtb3RhYmxlIiwiaXNSZW1vdGFibGUiXSxbImlzUmVjb3JkIiwiaXNSZWNvcmQiXSxbImlzQ29weUFycmF5IiwiaXNDb3B5QXJyYXkiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN5GtqqTBwAAkwcAACgAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvY29weUFycmF5LmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5QXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5LHByb3RvdHlwZTphcnJheVByb3RvdHlwZX09QXJyYXk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjYW5CZVZhbGlkPShjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+XG5pc0FycmF5KGNhbmRpZGF0ZSl8fFxuISFjaGVjayYmY2hlY2soZmFsc2UsWCBgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlBcnJheUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5QXJyYXknLFxuXG5jYW5CZVZhbGlkLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk9PT1hcnJheVByb3RvdHlwZXx8XG5hc3NlcnQuZmFpbChYIGBNYWxmb3JtZWQgYXJyYXk6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFNpbmNlIHdlJ3JlIGFscmVhZHkgZW5zdXJlZCBjYW5kaWRhdGUgaXMgYW4gYXJyYXksIGl0IHNob3VsZCBub3QgYmUqL1xuLyogcG9zc2libGUgZm9yIHRoZSBmb2xsb3dpbmcgdGVzdCB0byBmYWlsKi9cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdsZW5ndGgnLGZhbHNlLGFzc2VydENoZWNrZXIpO1xuY29uc3QgbGVuPS8qKiBAdHlwZSB7dW5rbm93bltdfSAqL2NhbmRpZGF0ZS5sZW5ndGg7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLGksdHJ1ZSxhc3NlcnRDaGVja2VyKTtcbiB9XG4vKiArMSBmb3IgdGhlICdsZW5ndGgnIHByb3BlcnR5IGl0c2VsZi4qL1xub3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aD09PWxlbisxfHxcbmFzc2VydC5mYWlsKFggYEFycmF5cyBtdXN0IG5vdCBoYXZlIG5vbi1pbmRleGVzOiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5jYW5kaWRhdGUuZXZlcnkoKHYpPT4hIXBhc3NTdHlsZU9mUmVjdXIodikpO1xuIH19KTskaOKAjV9vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAg/XbLM8HAADPBwAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsdmFsdWVzLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5UmVjb3JkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlSZWNvcmQnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkhPT1vYmplY3RQcm90b3R5cGUpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cblxucmV0dXJuIG93bktleXMoY2FuZGlkYXRlKS5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuKHR5cGVvZiBrZXk9PT0nc3RyaW5nJ3x8XG4hIXJlamVjdCYmXG5yZWplY3QoXG5YIGBSZWNvcmRzIGNhbiBvbmx5IGhhdmUgc3RyaW5nLW5hbWVkIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWApKSYmKFxuXG4hY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcbi8qIFRPRE86IFVwZGF0ZSBtZXNzYWdlIG5vdyB0aGF0IHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgXCJpbXBsaWNpdCBSZW1vdGFibGVcIi4qL1xuWCBgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSkpO1xuXG5cbiB9KTtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5Db3B5UmVjb3JkSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKXtcbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLG5hbWUsdHJ1ZSxhc3NlcnRDaGVja2VyKTtcbiB9XG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5mb3IoY29uc3QgdmFsIG9mIHZhbHVlcyhjYW5kaWRhdGUpKXtcbnBhc3NTdHlsZU9mUmVjdXIodmFsKTtcbiB9XG4gfX0pOyRo4oCNX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5UmVjb3JkSGVscGVyIjpbIkNvcHlSZWNvcmRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA06A4cZ0RAACdEQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwiaXNFcnJvckxpa2UiLCJ0b1Bhc3NhYmxlRXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogVE9ETzogTWFpbnRlbmFuY2UgaGF6YXJkOiBDb29yZGluYXRlIHdpdGggdGhlIGxpc3Qgb2YgZXJyb3JzIGluIHRoZSBTRVMqL1xuLyogd2hpbGVsaXN0LiBDdXJyZW50bHksIGJvdGggb21pdCBBZ2dyZWdhdGVFcnJvciwgd2hpY2ggaXMgbm93IHN0YW5kYXJkLiBCb3RoKi9cbi8qIG11c3QgZXZlbnR1YWxseSBpbmNsdWRlIGl0LiovXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycz1uZXcgTWFwKFtcblsnRXJyb3InLEVycm9yXSxcblsnRXZhbEVycm9yJyxFdmFsRXJyb3JdLFxuWydSYW5nZUVycm9yJyxSYW5nZUVycm9yXSxcblsnUmVmZXJlbmNlRXJyb3InLFJlZmVyZW5jZUVycm9yXSxcblsnU3ludGF4RXJyb3InLFN5bnRheEVycm9yXSxcblsnVHlwZUVycm9yJyxUeXBlRXJyb3JdLFxuWydVUklFcnJvcicsVVJJRXJyb3JdXSk7XG5cblxuY29uc3QgICAgICAgIGdldEVycm9yQ29uc3RydWN0b3I9KG5hbWUpPT5lcnJvckNvbnN0cnVjdG9ycy5nZXQobmFtZSk7JGjigI1fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZT0oY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG4vKiBUT0RPOiBOZWVkIGEgYmV0dGVyIHRlc3QgdGhhbiBpbnN0YW5jZW9mKi9cbnJldHVybihcbmNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yfHxcbnJlamVjdCYmcmVqZWN0KFggYEVycm9yIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcblxuLyoqXG4gKiBWYWxpZGF0aW5nIGVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlIHJhaXNlcyBhIHRlbnNpb24gYmV0d2VlbiBzZWN1cml0eVxuICogdnMgcHJlc2VydmluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBGb3IgZXJyb3JzLCB3ZSBuZWVkIHRvIHJlbWVtYmVyXG4gKiB0aGUgZXJyb3IgaXRzZWxmIGV4aXN0cyB0byBoZWxwIHVzIGRpYWdub3NlIGEgYnVnIHRoYXQncyBsaWtlbHkgbW9yZVxuICogcHJlc3NpbmcgdGhhbiBhIHZhbGlkaXR5IGJ1ZyBpbiB0aGUgZXJyb3IgaXRzZWxmLiBUaHVzLCB3aGVuZXZlciBpdCBpcyBzYWZlXG4gKiB0byBkbyBzbywgd2UgcHJlZmVyIHRvIGxldCB0aGUgZXJyb3ItbGlrZSB0ZXN0IHN1Y2NlZWQgYW5kIHRvIGNvdWNoIHRoZXNlXG4gKiBjb21wbGFpbnRzIGFzIG5vdGVzIG9uIHRoZSBlcnJvci5cbiAqXG4gKiBUbyByZXNvbHZlIHRoaXMsIHN1Y2ggYSBtYWxmb3JtZWQgZXJyb3Igb2JqZWN0IHdpbGwgc3RpbGwgcGFzc1xuICogYGlzRXJyb3JMaWtlYCBzbyBtYXJzaGFsIGNhbiB1c2UgdGhpcyBmb3IgdG9wIGxldmVsIGVycm9yIHRvIHJlcG9ydCBmcm9tLFxuICogZXZlbiBpZiBpdCB3b3VsZCBub3QgYWN0dWFsbHkgdmFsaWRhdGUuXG4gKiBJbnN0ZWFkLCB0aGUgZGlhZ25vc3RpY3MgdGhhdCBgYXNzZXJ0RXJyb3JgIHdvdWxkIGhhdmUgcmVwb3J0ZWQgYXJlXG4gKiBhdHRhY2hlZCBhcyBub3RlcyB0byB0aGUgbWFsZm9ybWVkIGVycm9yLiBUaHVzLCBhIG1hbGZvcm1lZFxuICogZXJyb3IgaXMgcGFzc2FibGUgYnkgaXRzZWxmLCBidXQgbm90IGFzIHBhcnQgb2YgYSBwYXNzYWJsZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNFcnJvckxpa2U9KGNhbmRpZGF0ZSk9PmNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjigI1fb25jZS5pc0Vycm9yTGlrZShpc0Vycm9yTGlrZSk7XG5oYXJkZW4oaXNFcnJvckxpa2UpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBFcnJvckhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidlcnJvcicsXG5cbmNhbkJlVmFsaWQ6Y2hlY2tFcnJvckxpa2UsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT57XG5FcnJvckhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG5jb25zdHtuYW1lfT1wcm90bztcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IobmFtZSk7XG5FQyYmRUMucHJvdG90eXBlPT09cHJvdG98fFxuRmFpbCBgRXJyb3JzIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGUgJHtjYW5kaWRhdGV9YDtcblxuY29uc3R7XG4vKiBNdXN0IGFsbG93IGBjYXVzZWAsIGBlcnJvcnNgKi9cbm1lc3NhZ2U6bURlc2MsXG4vKiBBbGxvdyBidXQgaWdub3JlIG9ubHkgZXh0cmFuZW91cyBvd24gYHN0YWNrYCBwcm9wZXJ0eS4qL1xuc3RhY2s6X29wdFN0YWNrRGVzYyxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5vd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPDF8fFxuRmFpbCBgUGFzc2VkIEVycm9yIGhhcyBleHRyYSB1bnBhc3NlZCBwcm9wZXJ0aWVzICR7cmVzdERlc2NzfWA7XG5pZihtRGVzYyl7XG50eXBlb2YgbURlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBiZSBhIHN0cmluZy12YWx1ZWQgZGF0YSBwcm9wZXJ0eS5gO1xuIW1EZXNjLmVudW1lcmFibGV8fFxuRmFpbCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3Qgbm90IGJlIGVudW1lcmFibGVgO1xuIH1cbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG4vKipcbiAqIFJldHVybiBhIG5ldyBwYXNzYWJsZSBlcnJvciB0aGF0IHByb3BhZ2F0ZXMgdGhlIGRpYWdub3N0aWMgaW5mbyBvZiB0aGVcbiAqIG9yaWdpbmFsLCBhbmQgaXMgbGlua2VkIHRvIHRoZSBvcmlnaW5hbCBhcyBhIG5vdGUuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi8kaOKAjV9vbmNlLkVycm9ySGVscGVyKEVycm9ySGVscGVyKTtcbmNvbnN0ICAgICAgICB0b1Bhc3NhYmxlRXJyb3I9KGVycik9PntcbmNvbnN0e25hbWUsbWVzc2FnZX09ZXJyO1xuXG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKCBgJHtuYW1lfWApfHxFcnJvcjtcbmNvbnN0IG5ld0Vycm9yPWhhcmRlbihuZXcgRUMoIGAke21lc3NhZ2V9YCkpO1xuLyogRXZlbiB0aGUgY2xlYW5lZCB1cCBlcnJvciBjb3B5LCBpZiBzZW50IHRvIHRoZSBjb25zb2xlLCBzaG91bGQqL1xuLyogY2F1c2UgaGlkZGVuIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gb2YgdGhlIG9yaWdpbmFsIGVycm9yKi9cbi8qIHRvIGJlIGxvZ2dlZC4qL1xuYXNzZXJ0Lm5vdGUobmV3RXJyb3IsWCBgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG5yZXR1cm4gbmV3RXJyb3I7XG4gfTskaOKAjV9vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIl0sImlzRXJyb3JMaWtlIjpbImlzRXJyb3JMaWtlIl0sIkVycm9ySGVscGVyIjpbIkVycm9ySGVscGVyIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASjtmg1UIAABVCAAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIi4vbWFrZS1mYXIuanNcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgYW5kXG4gKiBoYXZlIHRoZSBzYW1lIHRlcm1pbmF0aW9uIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWUgb3IgZmFpbHVyZVxuICogcmVhc29uLiBCdXQgdGhlIG5vbi1maW5hbCB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIG5vbi1maW5hbFxuICogdmFsdWVzIGZyb20gYGJhc2VJdGVyYXRvcmAgYXMgdHJhbnNmb3JtZWQgYnkgYGZ1bmNgLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFVcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IFV9IGZ1bmNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxVPn1cbiAqL1xuY29uc3QgICAgICAgIG1hcEl0ZXJhYmxlPShiYXNlSXRlcmFibGUsZnVuYyk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignbWFwcGVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdtYXBwZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0e3ZhbHVlOmJhc2VWYWx1ZSxkb25lfT1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3QgdmFsdWU9ZG9uZT9iYXNlVmFsdWU6ZnVuYyhiYXNlVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7dmFsdWUsZG9uZX0pO1xuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcblxuaGFyZGVuKG1hcEl0ZXJhYmxlKTtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhIHN1YnNldCBvZiB0aGUgbm9uLWZpbmFsIHZhbHVlcyBmcm9tIHRoZVxuICogYGJhc2VJdGVyYXRvcmAgLS0tIHRob3NlIGZvciB3aGljaCBgcHJlZCh2YWx1ZSlgIHdhcyB0cnV0aHkuIFRoZSByZXN1bHRcbiAqIGhhcyB0aGUgc2FtZSB0ZXJtaW5hdGlvbiBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZVxuICogb3IgZmFpbHVyZSByZWFzb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IGJvb2xlYW59IHByZWRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIGZpbHRlckl0ZXJhYmxlPShiYXNlSXRlcmFibGUscHJlZCk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignZmlsdGVyZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5mb3IoOzspe1xuY29uc3QgcmVzdWx0PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdHt2YWx1ZSxkb25lfT1yZXN1bHQ7XG5pZihkb25lfHxwcmVkKHZhbHVlKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UuZmlsdGVySXRlcmFibGUoZmlsdGVySXRlcmFibGUpO1xuXG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIl0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGJNZwNOGgAAThoAACcAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvbWFrZS1mYXIuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcImFzc2VydElmYWNlXCIsIFskaOKAjV9hID0+IChhc3NlcnRJZmFjZSA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXSxbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHRlbXBsYXRlIEwsUiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPEwsIFI+fSBSZW1vdGFibGVCcmFuZCAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5zZXRQcm90b3R5cGVPZixcbmNyZWF0ZSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5cbi8qKlxuICogTm93IHRoYXQgdGhlIHJlbW90YWJsZVByb3RvIGRvZXMgbm90IHByb3ZpZGUgaXRzIG93biBgdG9TdHJpbmdgIG1ldGhvZCxcbiAqIGVuc3VyZSBpdCBhbHdheXMgaW5oZXJpdHMgZnJvbSBzb21ldGhpbmcuIFRoZSBvcmlnaW5hbCBwcm90b3R5cGUgb2ZcbiAqIGByZW1vdGFibGVgIGlmIHRoZXJlIHdhcyBvbmUsIG9yIGBPYmplY3QucHJvdG90eXBlYCBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlbW90YWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuY29uc3QgbWFrZVJlbW90YWJsZVByb3RvPShyZW1vdGFibGUsaWZhY2UpPT57XG5sZXQgb2xkUHJvdG89Z2V0UHJvdG90eXBlT2YocmVtb3RhYmxlKTtcbmlmKHR5cGVvZiByZW1vdGFibGU9PT0nb2JqZWN0Jyl7XG5pZihvbGRQcm90bz09PW51bGwpe1xub2xkUHJvdG89b2JqZWN0UHJvdG90eXBlO1xuIH1cbm9sZFByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbkZhaWwgYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNlIGlmKHR5cGVvZiByZW1vdGFibGU9PT0nZnVuY3Rpb24nKXtcbm9sZFByb3RvIT09bnVsbHx8XG5GYWlsIGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbm9sZFByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuZ2V0UHJvdG90eXBlT2Yob2xkUHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuRmFpbCBgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9sZFByb3RvLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3JlbW90YWJsZSd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOmlmYWNlfX0pKTtcblxuXG4gfTtcblxuY29uc3QgYXNzZXJ0Q2FuQmVSZW1vdGFibGU9KGNhbmRpZGF0ZSk9PlxuUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBSZW1vdGFibGUuICBBZnRlciB0aGlzLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpXG4gKiByZXR1cm5zIGlmYWNlLlxuICpcbiAqIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvODA0XG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2U9J1JlbW90YWJsZSddIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3JcbiAqIHRoZSByZW1vdGFibGUuIEZvciBub3csIGEgc3RyaW5nIGlmYWNlIG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoXG4gKiBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIiwgdG8gc2VydmUgYXMgdGhlIGFsbGVnZWQgbmFtZS4gTW9yZVxuICogZ2VuZXJhbCBpZmFjZXMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIFRoaXMgaXMgdGVtcG9yYXJ5LiBXZSBpbmNsdWRlIHRoZVxuICogXCJBbGxlZ2VkXCIgb3IgXCJEZWJ1Z05hbWVcIiBhcyBhIHJlbWluZGVyIHRoYXQgd2UgZG8gbm90IHlldCBoYXZlIFN3aW5nU2V0XG4gKiBvciBDb21tcyBWYXRcbiAqIHN1cHBvcnQgZm9yIGVuc3VyaW5nIHRoaXMgaXMgYWNjb3JkaW5nIHRvIHRoZSB2YXQgaG9zdGluZyB0aGUgb2JqZWN0LlxuICogQ3VycmVudGx5LCBBbGljZSBjYW4gdGVsbCBCb2IgYWJvdXQgQ2Fyb2wsIHdoZXJlIFZhdEEgKG9uIEFsaWNlJ3MgYmVoYWxmKVxuICogbWlzcmVwcmVzZW50cyBDYXJvbCdzIGBpZmFjZWAuIFZhdEIgYW5kIHRoZXJlZm9yZSBCb2Igd2lsbCB0aGVuIHNlZVxuICogQ2Fyb2wncyBgaWZhY2VgIGFzIG1pc3JlcHJlc2VudGVkIGJ5IFZhdEEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gW3Byb3BzPXVuZGVmaW5lZF0gQ3VycmVudGx5IG1heSBvbmx5IGJlIHVuZGVmaW5lZC5cbiAqIFRoYXQgcGxhbiBpcyB0aGF0IG93bi1wcm9wZXJ0aWVzIGFyZSBjb3BpZWQgdG8gdGhlIHJlbW90YWJsZVxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlPXt9XSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICogQHJldHVybnMge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59IHJlbW90YWJsZSwgbW9kaWZpZWQgZm9yIGRlYnVnZ2FiaWxpdHlcbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZT0oXG5pZmFjZT0nUmVtb3RhYmxlJyxcbnByb3BzPXVuZGVmaW5lZCxcbnJlbW90YWJsZT0vKiogQHR5cGUge1R9ICove30pPT5cbntcbmFzc2VydElmYWNlKGlmYWNlKTtcbmFzc2VydChpZmFjZSk7XG4vKiBUT0RPOiBXaGVuIGlmYWNlIGlzIHJpY2hlciB0aGFuIGp1c3Qgc3RyaW5nLCB3ZSBuZWVkIHRvIGdldCB0aGUgYWxsZWdlZE5hbWUqL1xuLyogaW4gYSBkaWZmZXJlbnQgd2F5LiovXG5wcm9wcz09PXVuZGVmaW5lZHx8RmFpbCBgUmVtb3RhYmxlIHByb3BzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgJHtwcm9wc31gO1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIHRoYXQgdGhlIHVubW9kaWZpZWQgb2JqZWN0IGlzIGFibGUgdG8gYmVjb21lIGEgUmVtb3RhYmxlLiovXG5hc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgbWFya2VkLiovXG4hKFBBU1NfU1RZTEUgaW4gcmVtb3RhYmxlKXx8XG5GYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxucmVtb3RhYmxlW1BBU1NfU1RZTEVdKVxuIH1gO1xuLyogYGlzRnJvemVuYCBhbHdheXMgcmV0dXJucyB0cnVlIHdpdGggYSBmYWtlIGBoYXJkZW5gLCBidXQgd2Ugd2FudCB0aGF0IGNhc2UqL1xuLyogdG8gc3VjY2VlZCBhbnl3YXkuIEZha2luZyBgaGFyZGVuYCBpcyBvbmx5IGNvcnJlY3RuZXNzIHByZXNlcnZpbmcqL1xuLyogaWYgdGhlIGNvZGUgaW4gcXVlc3Rpb24gY29udGFpbnMgbm8gYnVncyB0aGF0IHRoZSByZWFsIGBoYXJkZW5gIHdvdWxkKi9cbi8qIGhhdmUgY2F1Z2h0LiovXG4vKiBAdHMtaWdub3JlIGBpc0Zha2VgIHB1cnBvc2VseSBub3QgaW4gdGhlIHR5cGUqL1xuaGFyZGVuLmlzRmFrZXx8XG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgZnJvemVuLiovXG4haXNGcm96ZW4ocmVtb3RhYmxlKXx8XG5GYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgZnJvemVuYDtcbmNvbnN0IHJlbW90YWJsZVByb3RvPW1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsaWZhY2UpO1xuXG4vKiBUYWtlIGEgc3RhdGljIGNvcHkgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgYXMgZGF0YSBwcm9wZXJ0aWVzLiovXG4vKiBjb25zdCBwcm9wRGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHsgLi4ucHJvcHMgfSk7Ki9cbmNvbnN0IG11dGF0ZUhhcmRlbkFuZENoZWNrPSh0YXJnZXQpPT57XG4vKiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcERlc2NzKTsqL1xuc2V0UHJvdG90eXBlT2YodGFyZ2V0LHJlbW90YWJsZVByb3RvKTtcbmhhcmRlbih0YXJnZXQpO1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUodGFyZ2V0KTtcbiB9O1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIGEgZnJlc2ggcmVtb3RhYmxlIHRvIHNlZSBpZiBvdXIgcnVsZXMgZml0LiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayh7fSk7XG5cbi8qIEFjdHVhbGx5IGZpbmlzaCB0aGUgbmV3IHJlbW90YWJsZS4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2socmVtb3RhYmxlKTtcblxuLyogQ09NTUlUVEVEISovXG4vKiBXZSdyZSBjb21taXR0ZWQsIHNvIGtlZXAgdGhlIGludGVyZmFjZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4qL1xuYXNzZXJ0KGlmYWNlIT09dW5kZWZpbmVkKTsvKiBUbyBtYWtlIFR5cGVTY3JpcHQgaGFwcHkqL1xucmV0dXJuICgvKiogQHR5cGUge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59ICovcmVtb3RhYmxlKTtcbiB9OyRo4oCNX29uY2UuUmVtb3RhYmxlKFJlbW90YWJsZSk7XG5oYXJkZW4oUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBBIGNvbmNpc2UgY29udmVuaWVuY2UgZm9yIHRoZSBtb3N0IGNvbW1vbiBgUmVtb3RhYmxlYCB1c2UuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgVGhpcyBuYW1lIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggYEFsbGVnZWQ6IGBcbiAqIGZvciBub3cgdG8gZm9ybSB0aGUgYFJlbW90YWJsZWAgYGlmYWNlYCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZT17fV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqL1xuY29uc3QgICAgICAgIEZhcj0oZmFyTmFtZSxyZW1vdGFibGU9dW5kZWZpbmVkKT0+e1xuY29uc3Qgcj1yZW1vdGFibGU9PT11bmRlZmluZWQ/LyoqIEB0eXBlIHtUfSAqL3t9OnJlbW90YWJsZTtcbnJldHVybiBSZW1vdGFibGUoIGBBbGxlZ2VkOiAke2Zhck5hbWV9YCx1bmRlZmluZWQscik7XG4gfTskaOKAjV9vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qKlxuICogQ29lcmNlIGBmdW5jYCB0byBhIGZhciBmdW5jdGlvbiB0aGF0IHByZXNlcnZlcyBpdHMgY2FsbCBiZWhhdmlvci5cbiAqIElmIGl0IGlzIGFscmVhZHkgYSBmYXIgZnVuY3Rpb24sIHJldHVybiBpdC4gT3RoZXJ3aXNlIG1ha2UgYW5kIHJldHVybiBhXG4gKiBuZXcgZmFyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCBmb3J3YXJkcyBjYWxscyB0byBpdC4gVGhpc1xuICogd29ya3MgZXZlbiBpZiBgZnVuY2AgaXMgYWxyZWFkeSBmcm96ZW4uIGBUb0ZhckZ1bmN0aW9uYCBpcyB0byBiZSB1c2VkXG4gKiB3aGVuIHRoZSBmdW5jdGlvbiBjb21lcyBmcm9tIGVsc2V3aGVyZSB1bmRlciBsZXNzIGNvbnRyb2wuIEZvciBmdW5jdGlvbnNcbiAqIHlvdSBhdXRob3IgaW4gcGxhY2UsIGJldHRlciB0byB1c2UgYEZhcmAgb24gdGhlaXIgZnVuY3Rpb24gbGl0ZXJhbCBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSB0byBiZSB1c2VkIG9ubHkgaWYgYGZ1bmNgIGlzIG5vdCBhbHJlYWR5IGFcbiAqIGZhciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IGZ1bmNcbiAqL1xuY29uc3QgICAgICAgIFRvRmFyRnVuY3Rpb249KGZhck5hbWUsZnVuYyk9PntcbmlmKGdldEludGVyZmFjZU9mKGZ1bmMpIT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jO1xuIH1cbnJldHVybiBGYXIoZmFyTmFtZSwoLi4uYXJncyk9PmZ1bmMoLi4uYXJncykpO1xuIH07JGjigI1fb25jZS5Ub0ZhckZ1bmN0aW9uKFRvRmFyRnVuY3Rpb24pO1xuaGFyZGVuKFRvRmFyRnVuY3Rpb24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiRmFyIjpbIkZhciJdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAApF75R0EAAAdBAAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9tYWtlVGFnZ2VkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZVRhZ2dlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e2NyZWF0ZSxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICBtYWtlVGFnZ2VkPSh0YWcscGF5bG9hZCk9PntcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBUaGUgdGFnIG9mIGEgdGFnZ2VkIHJlY29yZCBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ31gO1xuYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2JqZWN0UHJvdG90eXBlLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3RhZ2dlZCd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOnRhZ30sXG5wYXlsb2FkOnt2YWx1ZTpwYXlsb2FkLGVudW1lcmFibGU6dHJ1ZX19KSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlVGFnZ2VkKG1ha2VUYWdnZWQpO1xuaGFyZGVuKG1ha2VUYWdnZWQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAZQCjG9RkAAPUZAAAwAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJQQVNTX1NUWUxFIiwiYXNzZXJ0Q2hlY2tlciIsImNhbkJlTWV0aG9kIiwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCIsImNoZWNrTm9ybWFsUHJvcGVydHkiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuZ2V0UHJvdG90eXBlT2YsXG5oYXNPd25Qcm9wZXJ0eTpvYmplY3RIYXNPd25Qcm9wZXJ0eSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e3RvU3RyaW5nVGFnOnRvU3RyaW5nVGFnU3ltYm9sfT1TeW1ib2w7XG5cbmNvbnN0IHR5cGVkQXJyYXlQcm90b3R5cGU9Z2V0UHJvdG90eXBlT2YoVWludDhBcnJheS5wcm90b3R5cGUpO1xuY29uc3QgdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG50eXBlZEFycmF5UHJvdG90eXBlLFxudG9TdHJpbmdUYWdTeW1ib2wpO1xuXG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9dHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYy5nZXQ7XG5hc3NlcnQodHlwZW9mIGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz09PSdmdW5jdGlvbicpO1xuXG5jb25zdCAgICAgICAgaGFzT3duUHJvcGVydHlPZj0ob2JqLHByb3ApPT5cbmFwcGx5KG9iamVjdEhhc093blByb3BlcnR5LG9iaixbcHJvcF0pOyRo4oCNX29uY2UuaGFzT3duUHJvcGVydHlPZihoYXNPd25Qcm9wZXJ0eU9mKTtcbmhhcmRlbihoYXNPd25Qcm9wZXJ0eU9mKTtcblxuY29uc3QgICAgICAgIGlzT2JqZWN0PSh2YWwpPT5PYmplY3QodmFsKT09PXZhbDskaOKAjV9vbmNlLmlzT2JqZWN0KGlzT2JqZWN0KTtcbmhhcmRlbihpc09iamVjdCk7XG5cbi8qKlxuICogRHVwbGljYXRlcyBwYWNrYWdlcy9zZXMvc3JjL21ha2UtaGFyZGVuZXIuanMgdG8gYXZvaWQgYSBkZXBlbmRlbmN5LlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqZWN0XG4gKi9cbmNvbnN0ICAgICAgICBpc1R5cGVkQXJyYXk9KG9iamVjdCk9Pntcbi8qIFRoZSBvYmplY3QgbXVzdCBwYXNzIGEgYnJhbmQgY2hlY2sgb3IgdG9TdHJpbmdUYWcgd2lsbCByZXR1cm4gdW5kZWZpbmVkLiovXG5jb25zdCB0YWc9YXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLG9iamVjdCxbXSk7XG5yZXR1cm4gdGFnIT09dW5kZWZpbmVkO1xuIH07JGjigI1fb25jZS5pc1R5cGVkQXJyYXkoaXNUeXBlZEFycmF5KTtcbmhhcmRlbihpc1R5cGVkQXJyYXkpO1xuXG5jb25zdCAgICAgICAgUEFTU19TVFlMRT1TeW1ib2wuZm9yKCdwYXNzU3R5bGUnKTtcblxuLyoqXG4gKiBGb3IgYSBmdW5jdGlvbiB0byBiZSBhIHZhbGlkIG1ldGhvZCwgaXQgbXVzdCBub3QgYmUgcGFzc2FibGUuXG4gKiBPdGhlcndpc2UsIHdlIHJpc2sgY29uZnVzaW5nIHBhc3MtYnktY29weSBkYXRhIGNhcnJ5aW5nXG4gKiBmYXIgZnVuY3Rpb25zIHdpdGggYXR0ZW1wdHMgYXQgZmFyIG9iamVjdHMgd2l0aCBtZXRob2RzLlxuICpcbiAqIFRPRE8gSEFaQVJEIEJlY2F1c2Ugd2UgY2hlY2sgdGhpcyBvbiB0aGUgd2F5IHRvIGhhcmRlbmluZyBhIHJlbW90YWJsZSxcbiAqIHdlIGNhbm5vdCB5ZXQgY2hlY2sgdGhhdCBgZnVuY2AgaXMgaGFyZGVuZWQuIEhvd2V2ZXIsIHdpdGhvdXRcbiAqIGRvaW5nIHNvLCBpdCdzIGluaGVyaXRhbmNlIG1pZ2h0IGNoYW5nZSBhZnRlciB0aGUgYFBBU1NfU1RZTEVgXG4gKiBjaGVjayBiZWxvdy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gZnVuY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG5jb25zdCAgICAgICAgY2FuQmVNZXRob2Q9KGZ1bmMpPT5cbnR5cGVvZiBmdW5jPT09J2Z1bmN0aW9uJyYmIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRo4oCNX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLyoqXG4gKiBCZWxvdyB3ZSBoYXZlIGEgc2VyaWVzIG9mIHByZWRpY2F0ZSBmdW5jdGlvbnMgYW5kIHRoZWlyIChjdXJyaWVkKSBhc3NlcnRpb25cbiAqIGZ1bmN0aW9ucy4gVGhlIHNlbWFudGljcyBvZiB0aGUgYXNzZXJ0aW9uIGZ1bmN0aW9uIGlzIGp1c3QgdG8gYXNzZXJ0IHRoYXRcbiAqIHRoZSBjb3JyZXNwb25kaW5nIHByZWRpY2F0ZSBmdW5jdGlvbiB3b3VsZCBoYXZlIHJldHVybmVkIHRydWUuIEJ1dCBpdFxuICogcmVwcm9kdWNlcyB0aGUgaW50ZXJuYWwgdGVzdHMgc28gZmFpbHVyZXMgY2FuIGdpdmUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENoZWNrZXI9KGNvbmQsZGV0YWlscyk9PntcbmFzc2VydChjb25kLGRldGFpbHMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmFzc2VydENoZWNrZXIoYXNzZXJ0Q2hlY2tlcik7XG5oYXJkZW4oYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ2hlY2tzIGZvciB0aGUgcHJlc2VuY2UgYW5kIGVudW1lcmFiaWxpdHkgb2YgYW4gb3duIGRhdGEgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfHN5bWJvbH0gcHJvcGVydHlOYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEJlRW51bWVyYWJsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrTm9ybWFsUHJvcGVydHk9KFxuY2FuZGlkYXRlLFxucHJvcGVydHlOYW1lLFxuc2hvdWxkQmVFbnVtZXJhYmxlLFxuY2hlY2spPT5cbntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCBkZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUscHJvcGVydHlOYW1lKTtcbmlmKGRlc2M9PT11bmRlZmluZWQpe1xucmV0dXJuKFxucmVqZWN0JiZyZWplY3QoWCBgJHtxKHByb3BlcnR5TmFtZSl9IHByb3BlcnR5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5yZXR1cm4oXG4oaGFzT3duUHJvcGVydHlPZihkZXNjLCd2YWx1ZScpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBub3QgYmUgYW4gYWNjZXNzb3IgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5zaG91bGRCZUVudW1lcmFibGU/XG5kZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApOlxuXG4hZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EoXG5wcm9wZXJ0eU5hbWUpXG4gfSBtdXN0IG5vdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuY2hlY2tOb3JtYWxQcm9wZXJ0eShjaGVja05vcm1hbFByb3BlcnR5KTtcbmhhcmRlbihjaGVja05vcm1hbFByb3BlcnR5KTtcblxuY29uc3QgICAgICAgIGdldFRhZz0odGFnUmVjb3JkKT0+dGFnUmVjb3JkW1N5bWJvbC50b1N0cmluZ1RhZ107JGjigI1fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG5jb25zdCAgICAgICAgY2hlY2tQYXNzU3R5bGU9KG9iaixleHBlY3RlZFBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCBhY3R1YWw9b2JqW1BBU1NfU1RZTEVdO1xucmV0dXJuKFxuYWN0dWFsPT09ZXhwZWN0ZWRQYXNzU3R5bGV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShhY3R1YWwpfTogJHtvYmp9YCkpO1xuXG4gfTskaOKAjV9vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZD0oY2hlY2tQcm90byk9Pntcbi8qKlxuICogQHBhcmFtIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nIH19IHRhZ1JlY29yZFxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tUYWdSZWNvcmQ9KHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuKGlzT2JqZWN0KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkmJihcbmlzRnJvemVuKHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QoWCBgQSB0YWdSZWNvcmQgbXVzdCBiZSBmcm96ZW46ICR7dGFnUmVjb3JkfWApKSYmKFxuIWlzQXJyYXkodGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBbiBhcnJheSBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxQQVNTX1NUWUxFLGZhbHNlLGNoZWNrKSYmXG5jaGVja1Bhc3NTdHlsZSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxTeW1ib2wudG9TdHJpbmdUYWcsZmFsc2UsY2hlY2spJiYoXG50eXBlb2YgZ2V0VGFnKHRhZ1JlY29yZCk9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgQSBbU3ltYm9sLnRvU3RyaW5nVGFnXS1uYW1lZCBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ1JlY29yZH1gKSkmJlxuXG5jaGVja1Byb3RvKHRhZ1JlY29yZCxnZXRQcm90b3R5cGVPZih0YWdSZWNvcmQpLGNoZWNrKSk7XG5cbiB9O1xucmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG4gfTtcblxuY29uc3QgICAgICAgIGNoZWNrVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soZmFsc2UsWCBgQSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tUYWdSZWNvcmQoY2hlY2tUYWdSZWNvcmQpO1xuXG5oYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuXG5jb25zdCAgICAgICAgY2hlY2tGdW5jdGlvblRhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbnByb3RvIT09bnVsbCYmZ2V0UHJvdG90eXBlT2YocHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhcbmZhbHNlLFxuWCBgRm9yIGZ1bmN0aW9ucywgYSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja0Z1bmN0aW9uVGFnUmVjb3JkKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xuXG5cbmhhcmRlbihjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sImNoZWNrTm9ybWFsUHJvcGVydHkiOlsiY2hlY2tOb3JtYWxQcm9wZXJ0eSJdLCJnZXRUYWciOlsiZ2V0VGFnIl0sImNoZWNrUGFzc1N0eWxlIjpbImNoZWNrUGFzc1N0eWxlIl0sImNoZWNrVGFnUmVjb3JkIjpbImNoZWNrVGFnUmVjb3JkIl0sImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiOlsiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAubrENgxsAAIMbAAAqAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3Bhc3NTdHlsZU9mLmpzeyJpbXBvcnRzIjpbIi4vY29weUFycmF5LmpzIiwiLi9jb3B5UmVjb3JkLmpzIiwiLi9lcnJvci5qcyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc2FmZS1wcm9taXNlLmpzIiwiLi9zeW1ib2wuanMiLCIuL3RhZ2dlZC5qcyIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGUiLCJwYXNzU3R5bGVPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsaXNPYmplY3QsaXNUeXBlZEFycmF5LFBBU1NfU1RZTEUsQ29weUFycmF5SGVscGVyLENvcHlSZWNvcmRIZWxwZXIsVGFnZ2VkSGVscGVyLEVycm9ySGVscGVyLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJpc1R5cGVkQXJyYXlcIiwgWyRo4oCNX2EgPT4gKGlzVHlwZWRBcnJheSA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlBcnJheS5qc1wiLCBbW1wiQ29weUFycmF5SGVscGVyXCIsIFskaOKAjV9hID0+IChDb3B5QXJyYXlIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5UmVjb3JkLmpzXCIsIFtbXCJDb3B5UmVjb3JkSGVscGVyXCIsIFskaOKAjV9hID0+IChDb3B5UmVjb3JkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vdGFnZ2VkLmpzXCIsIFtbXCJUYWdnZWRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLCBbJGjigI1fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiLi9zYWZlLXByb21pc2UuanNcIiwgW1tcImFzc2VydFNhZmVQcm9taXNlXCIsIFskaOKAjV9hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlT2Z9IFBhc3NTdHlsZU9mICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QcmltaXRpdmVTdHlsZX0gUHJpbWl0aXZlU3R5bGUgKi9cblxuLyoqIEB0eXBlZGVmIHtFeGNsdWRlPFBhc3NTdHlsZSwgUHJpbWl0aXZlU3R5bGUgfCBcInByb21pc2VcIj59IEhlbHBlclBhc3NTdHlsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNGcm96ZW59PU9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzXG4gKiBAcmV0dXJucyB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgUGFzc1N0eWxlSGVscGVyPiB9XG4gKi9cblxuY29uc3QgbWFrZUhlbHBlclRhYmxlPShwYXNzU3R5bGVIZWxwZXJzKT0+e1xuLyoqIEB0eXBlIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBhbnk+ICYge19fcHJvdG9fXzogbnVsbH19ICovXG5jb25zdCBIZWxwZXJUYWJsZT17XG5fX3Byb3RvX186bnVsbCxcbmNvcHlBcnJheTp1bmRlZmluZWQsXG5jb3B5UmVjb3JkOnVuZGVmaW5lZCxcbnRhZ2dlZDp1bmRlZmluZWQsXG5lcnJvcjp1bmRlZmluZWQsXG5yZW1vdGFibGU6dW5kZWZpbmVkfTtcblxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmNvbnN0e3N0eWxlTmFtZX09aGVscGVyO1xuc3R5bGVOYW1lIGluIEhlbHBlclRhYmxlfHxGYWlsIGBVbnJlY29nbml6ZWQgaGVscGVyOiAke3Eoc3R5bGVOYW1lKX1gO1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXT09PXVuZGVmaW5lZHx8XG5GYWlsIGBjb25mbGljdGluZyBoZWxwZXJzIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXT1oZWxwZXI7XG4gfVxuZm9yKGNvbnN0IHN0eWxlTmFtZSBvZiBvd25LZXlzKEhlbHBlclRhYmxlKSl7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdIT09dW5kZWZpbmVkfHxcbkZhaWwgYG1pc3NpbmcgaGVscGVyIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuIH1cblxucmV0dXJuIGhhcmRlbihIZWxwZXJUYWJsZSk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzIFRoZSBwYXNzU3R5bGVIZWxwZXJzIHRvIHJlZ2lzdGVyLFxuICogaW4gcHJpb3JpdHkgb3JkZXIuXG4gKiBOT1RFIFRoZXNlIG11c3QgYWxsIGJlIFwidHJ1c3RlZFwiLFxuICogY29tcGxldGUsIGFuZCBub24tY29sbGlkaW5nLiBgbWFrZVBhc3NTdHlsZU9mYCBtYXkgKmFzc3VtZSogdGhhdCBlYWNoIGhlbHBlclxuICogZG9lcyB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvLiBgbWFrZVBhc3NTdHlsZU9mYCBpcyBub3QgdHJ5aW5nIHRvIGRlZmVuZFxuICogaXRzZWxmIGFnYWluc3QgbWFsaWNpb3VzIGhlbHBlcnMsIHRob3VnaCBpdCBkb2VzIGRlZmVuZCBhZ2FpbnN0IHNvbWVcbiAqIGFjY2lkZW50cy5cbiAqIEByZXR1cm5zIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgbWFrZVBhc3NTdHlsZU9mPShwYXNzU3R5bGVIZWxwZXJzKT0+e1xuY29uc3QgSGVscGVyVGFibGU9bWFrZUhlbHBlclRhYmxlKHBhc3NTdHlsZUhlbHBlcnMpO1xuY29uc3QgcmVtb3RhYmxlSGVscGVyPUhlbHBlclRhYmxlLnJlbW90YWJsZTtcblxuLyoqXG4gKiBQdXJlbHkgZm9yIHBlcmZvcm1hbmNlLiBIb3dldmVyIGl0IGlzIG11dGFibGUgc3RhdGljIHN0YXRlLCBhbmRcbiAqIGl0IGRvZXMgaGF2ZSBzb21lIG9ic2VydmFiaWxpdHkgb24gcHJveGllcy4gVE9ETyBuZWVkIHRvIGFzc2Vzc1xuICogd2hldGhlciB0aGlzIGNyZWF0ZXMgYSBzdGF0aWMgY29tbXVuaWNhdGlvbnMgY2hhbm5lbC5cbiAqXG4gKiBwYXNzU3R5bGVPZiBkb2VzIGEgZnVsbCByZWN1cnNpdmUgd2FsayBvZiBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoYXQgdGhleSBhcmUgYWN5Y2xpYy4gSW4gYWRkaXRpb25cbiAqIGl0IGlzIHVzZWQgYnkgb3RoZXIgYWxnb3JpdGhtcyB0byByZWN1cnNpdmVseSB3YWxrIHRoZXNlIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgc28gd2l0aG91dCB0aGlzIGNhY2hlLCB0aGVzZSBhbGdvcml0aG1zIGNvdWxkIGJlXG4gKiBPKE4qKjIpIG9yIHdvcnNlLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwPFBhc3NhYmxlLCBQYXNzU3R5bGU+fVxuICovXG5jb25zdCBwYXNzU3R5bGVNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZj0ocGFzc2FibGUpPT57XG4vKiBFdmVuIHdoZW4gYSBXZWFrU2V0IGlzIGNvcnJlY3QsIHdoZW4gdGhlIHNldCBoYXMgYSBzaG9ydGVyIGxpZmV0aW1lKi9cbi8qIHRoYW4gaXRzIGtleXMsIHdlIHByZWZlciBhIFNldCBkdWUgdG8gZXhwZWN0ZWQgaW1wbGVtZW50YXRpb24qL1xuLyogdHJhZGVvZmZzLiovXG5jb25zdCBpblByb2dyZXNzPW5ldyBTZXQoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mUmVjdXI9KGlubmVyKT0+e1xuY29uc3QgaW5uZXJJc09iamVjdD1pc09iamVjdChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbmlmKHBhc3NTdHlsZU1lbW8uaGFzKGlubmVyKSl7XG4vKiBAdHMtaWdub3JlIFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXQgYGdldGAgYWZ0ZXIgYGhhc2AgaXMgc2FmZSovXG5yZXR1cm4gcGFzc1N0eWxlTWVtby5nZXQoaW5uZXIpO1xuIH1cbiFpblByb2dyZXNzLmhhcyhpbm5lcil8fFxuRmFpbCBgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG5pblByb2dyZXNzLmFkZChpbm5lcik7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xucGFzc1N0eWxlTWVtby5zZXQoaW5uZXIscGFzc1N0eWxlKTtcbmluUHJvZ3Jlc3MuZGVsZXRlKGlubmVyKTtcbiB9XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZkludGVybmFsPShpbm5lcik9PntcbmNvbnN0IHR5cGVzdHI9dHlwZW9mIGlubmVyO1xuc3dpdGNoKHR5cGVzdHIpe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm4gdHlwZXN0cjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2woaW5uZXIpO1xucmV0dXJuJ3N5bWJvbCc7XG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGlubmVyPT09bnVsbCl7XG5yZXR1cm4nbnVsbCc7XG4gfVxuaWYoIWlzRnJvemVuKGlubmVyKSl7XG5hc3NlcnQuZmFpbChcbi8qIFR5cGVkQXJyYXlzIGdldCBzcGVjaWFsIHRyZWF0bWVudCBpbiBoYXJkZW4oKSovXG4vKiBhbmQgYSBjb3JyZXNwb25kaW5nIHNwZWNpYWwgZXJyb3IgbWVzc2FnZSBoZXJlLiovXG5pc1R5cGVkQXJyYXkoaW5uZXIpP1xuWCBgQ2Fubm90IHBhc3MgbXV0YWJsZSB0eXBlZCBhcnJheXMgbGlrZSAke2lubmVyfS5gOlxuWCBgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWApO1xuXG4gfVxuaWYoaXNQcm9taXNlKGlubmVyKSl7XG5hc3NlcnRTYWZlUHJvbWlzZShpbm5lcik7XG5yZXR1cm4ncHJvbWlzZSc7XG4gfVxudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5jb25zdCBwYXNzU3R5bGVUYWc9aW5uZXJbUEFTU19TVFlMRV07XG5pZihwYXNzU3R5bGVUYWchPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihwYXNzU3R5bGVUYWcsJ3N0cmluZycpO1xuY29uc3QgaGVscGVyPUhlbHBlclRhYmxlW3Bhc3NTdHlsZVRhZ107XG5oZWxwZXIhPT11bmRlZmluZWR8fFxuRmFpbCBgVW5yZWNvZ25pemVkIFBhc3NTdHlsZTogJHtxKHBhc3NTdHlsZVRhZyl9YDtcbmhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybiAoLyoqIEB0eXBlIHtQYXNzU3R5bGV9ICovcGFzc1N0eWxlVGFnKTtcbiB9XG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuaWYoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKXtcbmhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybiBoZWxwZXIuc3R5bGVOYW1lO1xuIH1cbiB9XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5jYXNlJ2Z1bmN0aW9uJzp7XG5pc0Zyb3plbihpbm5lcil8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWA7XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgVW5yZWNvZ25pemVkIHR5cGVvZiAke3EodHlwZXN0cil9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9O1xuXG5yZXR1cm4gcGFzc1N0eWxlT2ZSZWN1cihwYXNzYWJsZSk7XG4gfTtcbnJldHVybiBoYXJkZW4ocGFzc1N0eWxlT2YpO1xuIH07XG5cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVPZj1tYWtlUGFzc1N0eWxlT2YoW1xuQ29weUFycmF5SGVscGVyLFxuQ29weVJlY29yZEhlbHBlcixcblRhZ2dlZEhlbHBlcixcbkVycm9ySGVscGVyLFxuUmVtb3RhYmxlSGVscGVyXSk7JGjigI1fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlPSh2YWwpPT57XG5wYXNzU3R5bGVPZih2YWwpOy8qIHRocm93cyBpZiB2YWwgaXMgbm90IGEgcGFzc2FibGUqL1xuIH07JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZShhc3NlcnRQYXNzYWJsZSk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABSxon3DIQAAwyEAACgAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImdldEludGVyZmFjZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsaGFzT3duUHJvcGVydHlPZixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNPYmplY3QsZ2V0VGFnOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5NYXJzaGFsR2V0SW50ZXJmYWNlT2Z9IE1hcnNoYWxHZXRJbnRlcmZhY2VPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGUsXG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tJZmFjZT0oaWZhY2UsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4odHlwZW9mIGlmYWNlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpJiYoXG5cbmlmYWNlPT09J1JlbW90YWJsZSd8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJyl8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRm9yIG5vdywgaWZhY2UgJHtxKFxuaWZhY2UpXG4gfSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aCBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIjsgdW5pbXBsZW1lbnRlZGApKSk7XG5cblxuIH07XG5cbi8qKlxuICogQW4gYGlmYWNlYCBtdXN0IGJlIHB1cmUuIFJpZ2h0IG5vdyBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aGljaCBpcyBwdXJlLlxuICogTGF0ZXIgd2UgZXhwZWN0IHRvIGluY2x1ZGUgc29tZSBvdGhlciB2YWx1ZXMgdGhhdCBxdWFsaWZ5IGFzIGBQdXJlRGF0YWAsXG4gKiB3aGljaCBpcyBhIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBlbmRpbmcgb25seSBpbiBwcmltaXRpdmVzIG9yXG4gKiBlbXB0eSBwYXNzLWJ5LWNvcHkgY29tcG9zaXRlcy4gTm8gcmVtb3RhYmxlcywgcHJvbWlzZXMsIG9yIGVycm9ycy5cbiAqIFdlICphc3N1bWUqIGZvciBub3cgdGhhdCB0aGUgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGNvbnRhaW5zIG5vXG4gKiBwcm94aWVzLlxuICpcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydElmYWNlPShpZmFjZSk9PmNoZWNrSWZhY2UoaWZhY2UsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0IHwgRnVuY3Rpb259IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2Y9KG9yaWdpbmFsLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlzT2JqZWN0KG9yaWdpbmFsKXx8XG5GYWlsIGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuLyogQSB2YWxpZCByZW1vdGFibGUgb2JqZWN0IG11c3QgaW5oZXJpdCBmcm9tIGEgXCJ0YWcgcmVjb3JkXCIgLS0gYSovXG4vKiBwbGFpbi1vYmplY3QgcHJvdG90eXBlIGNvbnNpc3Rpbmcgb2Ygb25seSovXG4vKiBhIGBQQVNTX1NUWUxFYCBwcm9wZXJ0eSB3aXRoIHZhbHVlIFwicmVtb3RhYmxlXCIgYW5kIGEgc3VpdGFibGUgYFN5bWJvbC50b1N0cmluZ1RhZ2AqL1xuLyogcHJvcGVydHkuIFRoZSByZW1vdGFibGUgY291bGQgaW5oZXJpdCBkaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLCBvciovXG4vKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4vKiBpbmhlcml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQuKi9cbi8qKi9cbi8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuLyogd2l0aCBQQVNTX1NUWUxFIGZyb20gSlNEb2MuKi9cbi8qKi9cbi8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4vKiBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nLCovXG4vKiB9fSovXG4vKiovXG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG5pZihwcm90bz09PW9iamVjdFByb3RvdHlwZXx8cHJvdG89PT1udWxsKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVtb3RhYmxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQ6ICR7cShvcmlnaW5hbCl9YCkpO1xuXG4gfVxuXG5pZih0eXBlb2Ygb3JpZ2luYWw9PT0nb2JqZWN0Jyl7XG5jb25zdCBwcm90b1Byb3RvPWdldFByb3RvdHlwZU9mKHByb3RvKTtcbmlmKHByb3RvUHJvdG8hPT1vYmplY3RQcm90b3R5cGUmJnByb3RvUHJvdG8hPT1udWxsKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sY2hlY2spO1xuIH1cbmlmKCFjaGVja1RhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9ZWxzZSBpZih0eXBlb2Ygb3JpZ2luYWw9PT0nZnVuY3Rpb24nKXtcbmlmKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOnt2YWx1ZTppZmFjZX0sXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbnJldHVybihcbihvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkmJlxuXG5jaGVja0lmYWNlKGlmYWNlLGNoZWNrKSk7XG5cbiB9O1xuXG4vKipcbiAqIEtlZXAgYSB3ZWFrIHNldCBvZiBjb25maXJtZWQgcmVtb3RhYmxlcyBmb3IgbWFyc2hhbCBwZXJmb3JtYW5jZVxuICogKHdpdGhvdXQgd2hpY2ggd2Ugd291bGQgaW5jdXIgYSByZWR1bmRhbnQgdmVyaWZpY2F0aW9uIGluXG4gKiBnZXRJbnRlcmZhY2VPZikuXG4gKiBXZSBkb24ndCByZW1lbWJlciByZWplY3Rpb25zIGJlY2F1c2UgdGhleSBhcmUgcG9zc2libGUgdG8gY29ycmVjdFxuICogd2l0aCBlLmcuIGBoYXJkZW5gLlxuICpcbiAqIEB0eXBlIHtXZWFrU2V0PFJlbW90YWJsZT59XG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXM9bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZT0odmFsLGNoZWNrKT0+e1xuaWYoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoIWlzRnJvemVuKHZhbCkpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YCk7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCByZXN1bHQ9Y2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKiBAdHlwZSB7TWFyc2hhbEdldEludGVyZmFjZU9mfSAqL1xuY29uc3QgICAgICAgIGdldEludGVyZmFjZU9mPSh2YWwpPT57XG5pZihcbiFpc09iamVjdCh2YWwpfHxcbnZhbFtQQVNTX1NUWUxFXSE9PSdyZW1vdGFibGUnfHxcbiFjaGVja1JlbW90YWJsZSh2YWwpKVxue1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm4gZ2V0VGFnKHZhbCk7XG4gfTskaOKAjV9vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGVIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZToncmVtb3RhYmxlJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCB2YWxpZFR5cGU9XG4oaXNPYmplY3QoY2FuZGlkYXRlKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKSYmKFxuIWlzQXJyYXkoY2FuZGlkYXRlKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG5pZighdmFsaWRUeXBlKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nb2JqZWN0Jyl7XG4vKiBFdmVyeSBvd24gcHJvcGVydHkgKHJlZ2FyZGxlc3Mgb2YgZW51bWVyYWJpbGl0eSkqL1xuLyogbXVzdCBoYXZlIGEgZnVuY3Rpb24gdmFsdWUuKi9cbnJldHVybiBvd25LZXlzKGRlc2NzKS5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuLyogVHlwZWNhc3QgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuKGhhc093blByb3BlcnR5T2YoZGVzY3NbLyoqIEB0eXBlIHtzdHJpbmd9ICova2V5XSwndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxua2V5PT09U3ltYm9sLnRvU3RyaW5nVGFnJiZjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLGNoZWNrKXx8XG4oY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmtleSE9PVBBU1NfU1RZTEV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpO1xuXG4gfSk7XG4gfWVsc2UgaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdmdW5jdGlvbicpe1xuLyogRmFyIGZ1bmN0aW9ucyBjYW5ub3QgYmUgbWV0aG9kcywgYW5kIGNhbm5vdCBoYXZlIG1ldGhvZHMuKi9cbi8qIFRoZXkgbXVzdCBoYXZlIGV4YWN0bHkgZXhwZWN0ZWQgYC5uYW1lYCBhbmQgYC5sZW5ndGhgIHByb3BlcnRpZXMqL1xuY29uc3R7XG5uYW1lOm5hbWVEZXNjLFxubGVuZ3RoOmxlbmd0aERlc2MsXG4vKiBAdHMtaWdub3JlIFRTIGRvZXNuJ3QgbGlrZSBzeW1ib2xzIGFzIGNvbXB1dGVkIGluZGV4ZXM/PyovXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp0b1N0cmluZ1RhZ0Rlc2MsXG4uLi5yZXN0RGVzY3N9PVxuZGVzY3M7XG5jb25zdCByZXN0S2V5cz1vd25LZXlzKHJlc3REZXNjcyk7XG5yZXR1cm4oXG4obmFtZURlc2MmJnR5cGVvZiBuYW1lRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5sZW5ndGhEZXNjJiZ0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZT09PSdudW1iZXInfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG50b1N0cmluZ1RhZ0Rlc2M9PT11bmRlZmluZWR8fFxuKHR5cGVvZiB0b1N0cmluZ1RhZ0Rlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiZcblxuY2hlY2tJZmFjZSh0b1N0cmluZ1RhZ0Rlc2MudmFsdWUsY2hlY2spKSYmKFxucmVzdEtleXMubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9ucyB1bmV4cGVjdGVkIHByb3BlcnRpZXMgYmVzaWRlcyAubmFtZSBhbmQgLmxlbmd0aCAke3Jlc3RLZXlzfWApKSk7XG5cblxuIH1cbnJldHVybiByZWplY3QmJnJlamVjdChYIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWApO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT5jaGVja1JlbW90YWJsZShjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlciksXG5cbmV2ZXJ5OihfcGFzc2FibGUsX2ZuKT0+dHJ1ZX0pOyRo4oCNX29uY2UuUmVtb3RhYmxlSGVscGVyKFJlbW90YWJsZUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA14k6Kmg8AAJoPAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGFzc2VydENoZWNrZXIsaGFzT3duUHJvcGVydHlPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0Zyb3plbixnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2V9IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuY29uc3Qga2V5cz1vd25LZXlzKHByKTtcblxuaWYoa2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuY29uc3QgdW5rbm93bktleXM9a2V5cy5maWx0ZXIoXG4oa2V5KT0+dHlwZW9mIGtleSE9PSdzeW1ib2wnfHwhaGFzT3duUHJvcGVydHlPZihQcm9taXNlLnByb3RvdHlwZSxrZXkpKTtcblxuXG5pZih1bmtub3duS2V5cy5sZW5ndGghPT0wKXtcbnJldHVybiByZWplY3QoXG5YIGAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWApO1xuXG4gfVxuXG4vKipcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBhbHNvIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuY29uc3QgY2hlY2tTYWZlQXN5bmNIb29rc0tleT0oa2V5KT0+e1xuY29uc3QgdmFsPXByW2tleV07XG5pZih2YWw9PT11bmRlZmluZWR8fHR5cGVvZiB2YWw9PT0nbnVtYmVyJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihcbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmXG52YWwhPT1udWxsJiZcbmlzRnJvemVuKHZhbCkmJlxuZ2V0UHJvdG90eXBlT2YodmFsKT09PU9iamVjdC5wcm90b3R5cGUpXG57XG5jb25zdCBzdWJLZXlzPW93bktleXModmFsKTtcbmlmKHN1YktleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmlmKFxuc3ViS2V5cy5sZW5ndGg9PT0xJiZcbnN1YktleXNbMF09PT0nZGVzdHJveWVkJyYmXG52YWwuZGVzdHJveWVkPT09ZmFsc2UpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIHJlamVjdChcblggYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpcyAke3ZhbH1gKTtcblxuIH07XG5cbnJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZUFzeW5jSG9va3NLZXkpO1xuIH07XG5cbi8qKlxuICogVW5kZXIgSGFyZGVuZWQgSlMgYSBwcm9taXNlIGlzIFwic2FmZVwiIGlmIGl0cyBgdGhlbmAgbWV0aG9kIGNhbiBiZSBjYWxsZWRcbiAqIHN5bmNocm9ub3VzbHkgd2l0aG91dCBnaXZpbmcgdGhlIHByb21pc2UgYW4gb3Bwb3J0dW5pdHkgZm9yIGFcbiAqIHJlZW50cmFuY3kgYXR0YWNrIGR1cmluZyB0aGF0IGNhbGwuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85XG4gKiByYWlzZXMgdGhlIGlzc3VlIG9mIHRlc3RpbmcgdGhhdCBhIHNwZWNpbWVuIGlzIGEgc2FmZSBwcm9taXNlXG4gKiBzdWNoIHRoYXQgdGhlIHRlc3QgYWxzbyBkb2VzIG5vdCBnaXZlIHRoZSBzcGVjaW1lbiBhXG4gKiByZWVudHJhbmN5IG9wcG9ydHVuaXR5LiBUaGF0IGlzIHdlbGwgYmV5b25kIHRoZSBhbWJpdGlvbiBoZXJlLlxuICogVE9ETyBUaG91Z2ggaWYgd2UgZmlndXJlIG91dCBhIG5pY2Ugc29sdXRpb24sIGl0IG1pZ2h0IGJlIGdvb2QgdG9cbiAqIHVzZSBpdCBoZXJlIGFzIHdlbGwuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZT0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbnJldHVybihcbihpc0Zyb3plbihwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkpJiYoXG5pc1Byb21pc2UocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApKSYmKFxuZ2V0UHJvdG90eXBlT2YocHIpPT09UHJvbWlzZS5wcm90b3R5cGV8fFxucmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IGluaGVyaXQgZnJvbSBQcm9taXNlLnByb3RvdHlwZTogJHtxKFxuZ2V0UHJvdG90eXBlT2YocHIpKVxuIH1gKSkmJlxuXG5jaGVja1Byb21pc2VPd25LZXlzKC8qKiBAdHlwZSB7UHJvbWlzZX0gKi9wcixjaGVjaykpO1xuXG4gfTtcbmhhcmRlbihjaGVja1NhZmVQcm9taXNlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuY29uc3QgICAgICAgIGlzU2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwciwoeCk9PngpOyRo4oCNX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuY29uc3QgICAgICAgIGFzc2VydFNhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRTYWZlUHJvbWlzZShhc3NlcnRTYWZlUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMcf1VBHEgAARxIAACUAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvc3ltYm9sLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBjb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogVGhlIHdlbGwga25vd24gc3ltYm9scyBhcmUgc3RhdGljIHN5bWJvbCB2YWx1ZXMgb24gdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yLlxuICovXG5jb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcz1uZXcgTWFwKFxub3duS2V5cyhTeW1ib2wpLlxuZmlsdGVyKFxuKG5hbWUpPT50eXBlb2YgbmFtZT09PSdzdHJpbmcnJiZ0eXBlb2YgU3ltYm9sW25hbWVdPT09J3N5bWJvbCcpLlxuXG5maWx0ZXIoKG5hbWUpPT57XG4vKiBAdHMtZXhwZWN0LWVycm9yIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovXG4hbmFtZS5zdGFydHNXaXRoKCdAQCcpfHxcbkZhaWwgYERpZCBub3QgZXhwZWN0IFN5bWJvbCB0byBoYXZlIGEgc3ltYm9sLXZhbHVlZCBwcm9wZXJ0eSBuYW1lIHN0YXJ0aW5nIHdpdGggXCJAQFwiICR7cShcbm5hbWUpXG4gfWA7XG5yZXR1cm4gdHJ1ZTtcbiB9KVxuLyogQHRzLWlnbm9yZSBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqLy5cbm1hcCgobmFtZSk9PltTeW1ib2xbbmFtZV0sIGBAQCR7bmFtZX1gXSkpO1xuXG5cbi8qKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3ltXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUGFzc2FibGVTeW1ib2w9KHN5bSk9PlxudHlwZW9mIHN5bT09PSdzeW1ib2wnJiYoXG50eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pPT09J3N0cmluZyd8fHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaOKAjV9vbmNlLmlzUGFzc2FibGVTeW1ib2woaXNQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oaXNQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG5pc1Bhc3NhYmxlU3ltYm9sKHN5bSl8fFxuRmFpbCBgT25seSByZWdpc3RlcmVkIHN5bWJvbHMgb3Igd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZTogJHtxKHN5bSl9YDskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qKlxuICogSWYgYHN5bWAgaXMgYSBwYXNzYWJsZSBzeW1ib2wsIHJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpc1xuICogc3ltYm9sLiBJZiBgc3ltYCBpcyBhIG5vbi1wYXNzYWJsZSBzeW1ib2wsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLiBTaW5jZSB0aGUgcmVnaXN0cmF0aW9uIHN0cmluZyBvZiBhIHJlZ2lzdGVyZWQgc3ltYm9sIGNhbiBiZSBhbnlcbiAqIHN0cmluZywgaWYgd2Ugc2ltcGx5IHVzZWQgdGhhdCB0byBpZGVudGlmeSB0aG9zZSBzeW1ib2xzLCB0aGVyZSB3b3VsZCBub3RcbiAqIGJlIGFueSByZW1haW5pbmcgc3RyaW5ncyBsZWZ0IG92ZXIgdG8gaWRlbnRpZnkgdGhlIHdlbGwta25vd24gc3ltYm9scy5cbiAqIEluc3RlYWQsIHdlIHJlc2VydmUgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgXCJAQFwiYCBmb3IgcHVycG9zZXMgb2YgdGhpc1xuICogZW5jb2RpbmcuIFdlIGlkZW50aWZ5IGEgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhcyBgU3ltYm9sLml0ZXJhdG9yYFxuICogYnkgcHJlZml4aW5nIHRoZSBwcm9wZXJ0eSBuYW1lIHdpdGggYFwiQEBcImAsIHN1Y2ggYXMgYFwiQEBpdGVyYXRvclwiYC5cbiAqIEZvciByZWdpc3RlcmVkIHN5bWJvbHMgd2hvc2UgbmFtZSBoYXBwZW5zIHRvIGJlZ2luIHdpdGggYFwiQEBcImAsIHN1Y2hcbiAqIGFzIGBTeW1ib2wuZm9yKCdAQGl0ZXJhdG9yJylgIG9yIGBTeW1ib2wuZm9yKCdAQGZvbycpYCwgd2UgaWRlbnRpZnlcbiAqIHRoZW0gYnkgcHJlZml4aW5nIHRoZW0gd2l0aCBhbiBleHRyYSBgXCJAQFwiYCwgc3VjaCBhc1xuICogYFwiQEBAQGl0ZXJhdG9yXCJgIG9yIGBcIkBAQEBmb29cImAuIChUaGlzIGlzIHRoZSBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nXG4gKiB0ZWNobmlxdWUuKVxuICpcbiAqIEBwYXJhbSB7c3ltYm9sfSBzeW1cbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovXG5jb25zdCAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sPShzeW0pPT57XG5jb25zdCBuYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKG5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHdlbGxLbm93blN5bWJvbE5hbWVzLmdldChzeW0pO1xuIH1cbmlmKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gYEBAJHtuYW1lfWA7XG4gfVxucmV0dXJuIG5hbWU7XG4gfTskaOKAjV9vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIElmIGBuYW1lYCBpcyBhIHN0cmluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieVxuICogYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAsIHJldHVybiB0aGUgc3ltYm9sIGFyZ3VtZW50IGl0IHdhcyBwcm9kdWNlZCB0b1xuICogcmVwcmVzZW50LlxuICpcbiAqICAgIElmIGBuYW1lYCBkb2VzIG5vdCBiZWdpbiB3aXRoIGBcIkBAXCJgLCB0aGVuIGp1c3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgcmVnaXN0ZXJlZCBzeW1ib2wsIGBTeW1ib2wuZm9yKG5hbWUpYC5cbiAqICAgIElmIGBuYW1lYCBpcyBgXCJAQFwiYCBmb2xsb3dlZCBieSBhIHdlbGwga25vd24gc3ltYm9sJ3MgcHJvcGVydHkgbmFtZSBvblxuICogICAgICBgU3ltYm9sYCBzdWNoIGBcIkBAaXRlcmF0b3JcIiwgcmV0dXJuIHRoYXQgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhc1xuICogICAgICBgU3ltYm9sLml0ZXJhdG9yYFxuICogICAgSWYgYG5hbWVgIGJlZ2lucyB3aXRoIGBcIkBAQEBcImAgaXQgZW5jb2RlcyB0aGUgcmVnaXN0ZXJlZCBzeW1ib2wgd2hvc2VcbiAqICAgICAgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpbnN0ZWFkLlxuICogICAgT3RoZXJ3aXNlLCBpZiBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGl0IG1heSBlbmNvZGUgYSByZWdpc3RlcmVkIHN5bWJvbFxuICogICAgICBmcm9tIGEgZnV0dXJlIHZlcnNpb24gb2YgSmF2YVNjcmlwdCwgYnV0IGl0IGlzIG5vdCBvbmUgd2UgY2FuIGRlY29kZVxuICogICAgICB5ZXQsIHNvIHRocm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sPX1cbiAqL1xuY29uc3QgICAgICAgIHBhc3NhYmxlU3ltYm9sRm9yTmFtZT0obmFtZSk9PntcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuaWYobWF0Y2gpe1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuaWYoc3VmZml4LnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiB9ZWxzZXtcbmNvbnN0IHN5bT1TeW1ib2xbc3VmZml4XTtcbmlmKHR5cGVvZiBzeW09PT0nc3ltYm9sJyl7XG5yZXR1cm4gc3ltO1xuIH1cbkZhaWwgYFJlc2VydmVkIGZvciB3ZWxsIGtub3duIHN5bWJvbCAke3Eoc3VmZml4KX06ICR7cShuYW1lKX1gO1xuIH1cbiB9XG5yZXR1cm4gU3ltYm9sLmZvcihuYW1lKTtcbiB9OyRo4oCNX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlU3ltYm9sIjpbImlzUGFzc2FibGVTeW1ib2wiXSwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACW8XPv9BwAA/QcAACUAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvdGFnZ2VkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJUYWdnZWRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjaGVja1RhZ1JlY29yZCxQQVNTX1NUWUxFLGNoZWNrTm9ybWFsUHJvcGVydHksY2hlY2tQYXNzU3R5bGU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJjaGVja1Bhc3NTdHlsZVwiLCBbJGjigI1fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgVGFnZ2VkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3RhZ2dlZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwndGFnZ2VkJyxjaGVjayksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwndGFnZ2VkJyxhc3NlcnRDaGVja2VyKTtcblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOl9sYWJlbERlc2MsXG5wYXlsb2FkOl9wYXlsb2FkRGVzYywvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbkZhaWwgYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdwYXlsb2FkJyx0cnVlLGFzc2VydENoZWNrZXIpO1xuXG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5wYXNzU3R5bGVPZlJlY3VyKGNhbmRpZGF0ZS5wYXlsb2FkKTtcbiB9fSk7JGjigI1fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHqgfmgSDQAAEg0AACkAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBhcnJheSwgQUtBIGEgXCJjb3B5QXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFyclxuICogQHJldHVybnMge2FyciBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuY29uc3QgaXNDb3B5QXJyYXk9KGFycik9PnBhc3NTdHlsZU9mKGFycik9PT0nY29weUFycmF5JzskaOKAjV9vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBBS0EgYVxuICogXCJjb3B5UmVjb3JkXCIgaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHJldHVybnMge3JlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbmNvbnN0IGlzUmVjb3JkPShyZWNvcmQpPT5wYXNzU3R5bGVPZihyZWNvcmQpPT09J2NvcHlSZWNvcmQnOyRo4oCNX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHJlbW90YWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtyZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5jb25zdCBpc1JlbW90YWJsZT0ocmVtb3RhYmxlKT0+cGFzc1N0eWxlT2YocmVtb3RhYmxlKT09PSdyZW1vdGFibGUnOyRo4oCNX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0QXJyYXlcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFycmF5XG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnJheSBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydEFycmF5fSAqL1xuY29uc3QgYXNzZXJ0Q29weUFycmF5PShhcnJheSxvcHROYW1lT2ZBcnJheT0nQWxsZWdlZCBhcnJheScpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YoYXJyYXkpO1xucGFzc1N0eWxlPT09J2NvcHlBcnJheSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJheX0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBhcnJheSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVjb3JkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVjb3JkfSAqL1xuY29uc3QgYXNzZXJ0UmVjb3JkPShyZWNvcmQsb3B0TmFtZU9mUmVjb3JkPSdBbGxlZ2VkIHJlY29yZCcpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVjb3JkKTtcbnBhc3NTdHlsZT09PSdjb3B5UmVjb3JkJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVjb3JkKX0gJHtyZWNvcmR9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZW1vdGFibGVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZW1vdGFibGVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZW1vdGFibGV9ICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGU9KFxucmVtb3RhYmxlLFxub3B0TmFtZU9mUmVtb3RhYmxlPSdBbGxlZ2VkIHJlbW90YWJsZScpPT5cbntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZW1vdGFibGUpO1xucGFzc1N0eWxlPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAClK+n3AJAABwCQAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCxtZW1vUmFjZTskaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLCBbJGjigI1fYSA9PiAobWVtb1JhY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlUHJvbWlzZUtpdFwifSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywgJ25hbWUnLCB7dmFsdWU6IFwicmFjZVByb21pc2VzXCJ9KTskaOKAjV9vbmNlLnJhY2VQcm9taXNlcyhyYWNlUHJvbWlzZXMpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2U9Z2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZXx8UHJvbWlzZTtcblxuLyoqXG4gKiBtYWtlUHJvbWlzZUtpdCgpIGJ1aWxkcyBhIFByb21pc2Ugb2JqZWN0LCBhbmQgcmV0dXJucyBhIHJlY29yZFxuICogY29udGFpbmluZyB0aGUgcHJvbWlzZSBpdHNlbGYsIGFzIHdlbGwgYXMgc2VwYXJhdGUgZmFjZXRzIGZvciByZXNvbHZpbmdcbiAqIGFuZCByZWplY3RpbmcgaXQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3NyYy90eXBlcy5qcycpLlByb21pc2VLaXQ8VD59XG4gKi9cbmZ1bmN0aW9uICAgICAgICBtYWtlUHJvbWlzZUtpdCgpe1xuY29uc3R7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9PW1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpO1xuXG5jb25zdCBwcm9taXNlPW5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxucmV0dXJuIGhhcmRlbih7cHJvbWlzZSxyZXNvbHZlLHJlamVjdH0pO1xuIH1cbmhhcmRlbihtYWtlUHJvbWlzZUtpdCk7XG5cbi8qIE5COiBBbm90aGVyIGltcGxlbWVudGF0aW9uIGZvciBQcm9taXNlLnJhY2Ugd291bGQgYmUgdG8gdXNlIHRoZSByZWxlYXNpbmcgZXhlY3V0b3IsKi9cbi8qIEhvd2V2ZXIgd2hpbGUgaXQgd291bGQgbm8gbG9uZ2VyIGxlYWsgdGhlIHJhY2VkIHByb21pc2Ugb2JqZWN0cyB0aGVtc2VsdmVzLCBpdCB3b3VsZCovXG4vKiBzdGlsbCBsZWFrIHJlYWN0aW9ucyBvbiB0aGUgbm9uLXJlc29sdmVkIHByb21pc2VzIGNvbnRlbmRpbmcgZm9yIHRoZSByYWNlLiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gICAgICAgIHJhY2VQcm9taXNlcyh2YWx1ZXMpe1xucmV0dXJuIGhhcmRlbihtZW1vUmFjZS5jYWxsKEJlc3RQaXBlbGluYWJsZVByb21pc2UsdmFsdWVzKSk7XG4gfVxuaGFyZGVuKHJhY2VQcm9taXNlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACIfYGs3wIAAN8CAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzUHJvbWlzZSwgJ25hbWUnLCB7dmFsdWU6IFwiaXNQcm9taXNlXCJ9KTskaOKAjV9vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOyAgIC8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBtYXliZVByb21pc2UgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHttYXliZVByb21pc2UgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuZnVuY3Rpb24gICAgICAgIGlzUHJvbWlzZShtYXliZVByb21pc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpPT09bWF5YmVQcm9taXNlO1xuIH1cbmhhcmRlbihpc1Byb21pc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHadN674SAAC+EgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBJbml0aWFsIHZlcnNpb24gYXV0aG9yZWQgYnkgQnJpYW4gS2ltOlxuaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8xNzQ2OSNpc3N1ZWNvbW1lbnQtNjg1MjE2Nzc3XG4gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbiBBbnlvbmUgaXMgZnJlZSB0byBjb3B5LCBtb2RpZnksIHB1Ymxpc2gsIHVzZSwgY29tcGlsZSwgc2VsbCwgb3JcbmRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgZWl0aGVyIGluIHNvdXJjZSBjb2RlIGZvcm0gb3IgYXMgYSBjb21waWxlZFxuYmluYXJ5LCBmb3IgYW55IHB1cnBvc2UsIGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwsIGFuZCBieSBhbnlcbm1lYW5zLlxuIEluIGp1cmlzZGljdGlvbnMgdGhhdCByZWNvZ25pemUgY29weXJpZ2h0IGxhd3MsIHRoZSBhdXRob3Igb3IgYXV0aG9yc1xub2YgdGhpcyBzb2Z0d2FyZSBkZWRpY2F0ZSBhbnkgYW5kIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlXG5zb2Z0d2FyZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0XG5vZiB0aGUgcHVibGljIGF0IGxhcmdlIGFuZCB0byB0aGUgZGV0cmltZW50IG9mIG91ciBoZWlycyBhbmRcbnN1Y2Nlc3NvcnMuIFdlIGludGVuZCB0aGlzIGRlZGljYXRpb24gdG8gYmUgYW4gb3ZlcnQgYWN0IG9mXG5yZWxpbnF1aXNobWVudCBpbiBwZXJwZXR1aXR5IG9mIGFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXNcbnNvZnR3YXJlIHVuZGVyIGNvcHlyaWdodCBsYXcuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Jcbk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLFxuQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SXG5PVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byA8aHR0cDovL3VubGljZW5zZS5vcmcvPlxuKi9cblxuXG5cblxuXG5cblxuY29uc3QgaXNPYmplY3Q9KHZhbHVlKT0+T2JqZWN0KHZhbHVlKT09PXZhbHVlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWZlcnJlZFxuICogQHByb3BlcnR5IHsodmFsdWU/OiBYaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FUmVmPFQ+ICkgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHByb3BlcnR5IHsoZXJyPzogYW55ICkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IG5ldmVyXG4gKiAgfCB7c2V0dGxlZDogZmFsc2UsIGRlZmVycmVkczogU2V0PERlZmVycmVkPn1cbiAqICB8IHtzZXR0bGVkOiB0cnVlLCBkZWZlcnJlZHM/OiB1bmRlZmluZWR9XG4gKiB9IFByb21pc2VNZW1vUmVjb3JkXG4gKi9cblxuLyogS2V5cyBhcmUgdGhlIHZhbHVlcyBwYXNzZWQgdG8gcmFjZSwgdmFsdWVzIGFyZSBhIHJlY29yZCBvZiBkYXRhIGNvbnRhaW5pbmcgYSovXG4vKiBzZXQgb2YgZGVmZXJyZWRzIGFuZCB3aGV0aGVyIHRoZSB2YWx1ZSBoYXMgc2V0dGxlZC4qL1xuLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgUHJvbWlzZU1lbW9SZWNvcmQ+fSAqL1xuY29uc3Qga25vd25Qcm9taXNlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZU1lbW9SZWNvcmQgfCB1bmRlZmluZWR9IHJlY29yZFxuICogQHJldHVybnMge1NldDxEZWZlcnJlZD59XG4gKi9cbmNvbnN0IG1hcmtTZXR0bGVkPShyZWNvcmQpPT57XG5pZighcmVjb3JkfHxyZWNvcmQuc2V0dGxlZCl7XG5yZXR1cm4gbmV3IFNldCgpO1xuIH1cblxuY29uc3R7ZGVmZXJyZWRzfT1yZWNvcmQ7XG5PYmplY3QuYXNzaWduKHJlY29yZCx7XG5kZWZlcnJlZHM6dW5kZWZpbmVkLFxuc2V0dGxlZDp0cnVlfSk7XG5cbk9iamVjdC5mcmVlemUocmVjb3JkKTtcbnJldHVybiBkZWZlcnJlZHM7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZU1lbW9SZWNvcmR9XG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQ9KHZhbHVlKT0+e1xuaWYoIWlzT2JqZWN0KHZhbHVlKSl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIGEgcHJpbWl0aXZlLCBhdHRlbXB0aW5nIHRvIHVzZSBpdCBhcyBhIGtleSBpbiB0aGUqL1xuLyogd2Vha21hcCB3b3VsZCB0aHJvdyBhbiBlcnJvci4gTHVja2lseSwgaXQgaXMgc2FmZSB0byBjYWxsKi9cbi8qIGBQcm9taXNlLnJlc29sdmUoY29udGVuZGVyKS50aGVuYCBvbiBhIHByaW1pdGl2ZSB2YWx1ZSBtdWx0aXBsZSB0aW1lcyovXG4vKiBiZWNhdXNlIHRoZSBwcm9taXNlIGZ1bGZpbGxzIGltbWVkaWF0ZWx5LiBTbyB3ZSBmYWtlIGEgc2V0dGxlZCByZWNvcmQuKi9cbnJldHVybiBoYXJkZW4oe3NldHRsZWQ6dHJ1ZX0pO1xuIH1cblxubGV0IHJlY29yZD1rbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbmlmKCFyZWNvcmQpe1xucmVjb3JkPXtkZWZlcnJlZHM6bmV3IFNldCgpLHNldHRsZWQ6ZmFsc2V9O1xua25vd25Qcm9taXNlcy5zZXQodmFsdWUscmVjb3JkKTtcbi8qIFRoaXMgY2FsbCB0byBgdGhlbmAgaGFwcGVucyBvbmNlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHZhbHVlLiovXG5Qcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oXG4odmFsKT0+e1xuZm9yKGNvbnN0e3Jlc29sdmV9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZXNvbHZlKHZhbCk7XG4gfVxuIH0sXG4oZXJyKT0+e1xuZm9yKGNvbnN0e3JlamVjdH1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlamVjdChlcnIpO1xuIH1cbiB9KTtcblxuIH1cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3R7cmFjZX09e1xuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSBbUD1Qcm9taXNlQ29uc3RydWN0b3JdXG4gKiBAdGhpcyB7UH1cbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5yYWNlKHZhbHVlcyl7XG5sZXQgZGVmZXJyZWQ7XG4vKiogQHR5cGUge1RbXX0gKi9cbmNvbnN0IGNhY2hlZFZhbHVlcz1bXTtcbmNvbnN0IEM9dGhpcztcbmNvbnN0IHJlc3VsdD1uZXcgQygocmVzb2x2ZSxyZWplY3QpPT57XG5kZWZlcnJlZD17cmVzb2x2ZSxyZWplY3R9O1xuZm9yKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyl7XG5jYWNoZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG5jb25zdHtzZXR0bGVkLGRlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihzZXR0bGVkKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgc2V0dGxlZCAoaW5jbHVkaW5nIHByaW1pdGl2ZXMpLCBpdCBpcyBzYWZlKi9cbi8qIHRvIGNhbGwgYFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbmAgb24gaXQuKi9cbkMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLHJlamVjdCk7XG4gfWVsc2V7XG5kZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuXG4vKiBUaGUgZmluYWxseSBjYWxsYmFjayBleGVjdXRlcyB3aGVuIGFueSB2YWx1ZSBzZXR0bGVzLCBwcmV2ZW50aW5nIGFueSBvZiovXG4vKiB0aGUgdW5yZXNvbHZlZCB2YWx1ZXMgZnJvbSByZXRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIHJlc29sdmVkIHZhbHVlLiovXG5yZXR1cm4gcmVzdWx0LmZpbmFsbHkoKCk9PntcbmZvcihjb25zdCB2YWx1ZSBvZiBjYWNoZWRWYWx1ZXMpe1xuY29uc3R7ZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKGRlZmVycmVkcyl7XG5kZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuIH19OyRo4oCNX29uY2UucmFjZShyYWNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANNDsO5pBwAAaQcAADUAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvciBUaGUgcHJvbWlzZSBleGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKSBidWlsZHMgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIHdoaWNoIGRyb3AgcmVmZXJlbmNlc1xuICogdG8gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBnYXRoZXJlZCBmcm9tIGFuIGV4ZWN1dG9yIHRvIGJlIHVzZWQgd2l0aCBhXG4gKiBwcm9taXNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UGljazxYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPiwgJ3Jlc29sdmUnIHwgJ3JlamVjdCc+ICYgeyBleGVjdXRvcjogUHJvbWlzZUV4ZWN1dG9yPFQ+fX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKCh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVzb2x2ZTtcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgocmVhc29uOiB1bmtub3duKSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlamVjdDtcblxuLyoqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD59IHZhbHVlICovXG5jb25zdCByZXNvbHZlPSh2YWx1ZSk9PntcbmlmKGludGVybmFsUmVzb2x2ZSl7XG5pbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PW51bGwpO1xuIH1cbiB9O1xuXG4vKiogQHBhcmFtIHt1bmtub3dufSByZWFzb24gKi9cbmNvbnN0IHJlamVjdD0ocmVhc29uKT0+e1xuaWYoaW50ZXJuYWxSZWplY3Qpe1xuaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlamVjdD09PW51bGwpO1xuIH1cbiB9O1xuXG5jb25zdCBleGVjdXRvcj0ocmVzLHJlaik9PntcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT11bmRlZmluZWQmJmludGVybmFsUmVqZWN0PT09dW5kZWZpbmVkKTtcbmludGVybmFsUmVzb2x2ZT1yZXM7XG5pbnRlcm5hbFJlamVjdD1yZWo7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9KTtcbiB9OyRo4oCNX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACYAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACSDS/HdgIAAHYCAAAaAAAAQGVuZG8vemlwLXYwLjIuMzEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvcmVhZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy93cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIiwicmVhZFppcCIsIndyaXRlWmlwIiwid3JpdGVaaXAiXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL3JlYWRlci5qc1wiLCBbXV0sW1wiLi9zcmMvd3JpdGVyLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL3JlYWRlci5qcyI6W1siWmlwUmVhZGVyIiwiWmlwUmVhZGVyIl0sWyJyZWFkWmlwIiwicmVhZFppcCJdXSwiLi9zcmMvd3JpdGVyLmpzIjpbWyJaaXBXcml0ZXIiLCJaaXBXcml0ZXIiXSxbIndyaXRlWmlwIiwid3JpdGVaaXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJqQuw3XFwAA1xcAACYAAABAZW5kby96aXAtdjAuMi4zMS9zcmMvYnVmZmVyLXJlYWRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyUmVhZGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCdWZmZXJSZWFkZXJTdGF0ZVxuICogQHByb3BlcnR5IHtVaW50OEFycmF5fSBieXRlc1xuICogQHByb3BlcnR5IHtEYXRhVmlld30gZGF0YVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlbmd0aFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZGV4XG4gKiBAcHJvcGVydHkge251bWJlcn0gb2Zmc2V0XG4gKi9cblxuLyoqIEB0eXBlIHtXZWFrTWFwPEJ1ZmZlclJlYWRlciwgQnVmZmVyUmVhZGVyU3RhdGU+fSAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkcz1uZXcgV2Vha01hcCgpO1xuXG4vKiogQHR5cGUgeyhidWZmZXJSZWFkZXI6IEJ1ZmZlclJlYWRlcikgPT4gQnVmZmVyUmVhZGVyU3RhdGV9ICovXG5jb25zdCBwcml2YXRlRmllbGRzR2V0PXByaXZhdGVGaWVsZHMuZ2V0LmJpbmQocHJpdmF0ZUZpZWxkcyk7XG5cbmNsYXNzICAgICAgICBCdWZmZXJSZWFkZXJ7XG4vKipcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlclxuICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcil7XG5jb25zdCBieXRlcz1uZXcgVWludDhBcnJheShidWZmZXIpO1xuY29uc3QgZGF0YT1uZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbnByaXZhdGVGaWVsZHMuc2V0KHRoaXMse1xuYnl0ZXMsXG5kYXRhLFxubGVuZ3RoOmJ5dGVzLmxlbmd0aCxcbmluZGV4OjAsXG5vZmZzZXQ6MH0pO1xuXG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgICBnZXQgbGVuZ3RoKCl7XG5yZXR1cm4gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKS5sZW5ndGg7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgIGdldCBpbmRleCgpe1xucmV0dXJuIHByaXZhdGVGaWVsZHNHZXQodGhpcykuaW5kZXg7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICovXG4gICAgICAgICBzZXQgaW5kZXgoaW5kZXgpe1xudGhpcy5zZWVrKGluZGV4KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICovXG4gICAgICAgICAgc2V0IG9mZnNldChvZmZzZXQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZihvZmZzZXQ+ZmllbGRzLmRhdGEuYnl0ZUxlbmd0aCl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzZXQgb2Zmc2V0IGJleW9uZCBsZW5ndGggb2YgdW5kZXJseWluZyBkYXRhJyk7XG4gfVxuaWYob2Zmc2V0PDApe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2V0IG5lZ2F0aXZlIG9mZnNldCcpO1xuIH1cbmZpZWxkcy5vZmZzZXQ9b2Zmc2V0O1xuZmllbGRzLmxlbmd0aD1maWVsZHMuZGF0YS5ieXRlTGVuZ3RoLWZpZWxkcy5vZmZzZXQ7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIHJlYWQgaGVhZCBjYW4gbW92ZSB0byB0aGUgZ2l2ZW4gYWJzb2x1dGVcbiAqIGluZGV4LlxuICovXG4gICAgICAgY2FuU2VlayhpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiBpbmRleD49MCYmZmllbGRzLm9mZnNldCtpbmRleDw9ZmllbGRzLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IHRoZSBpbmRleCB0byBjaGVjay5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5cbiAqL1xuICAgICAgICAgICAgIGFzc2VydENhblNlZWsoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZighdGhpcy5jYW5TZWVrKGluZGV4KSl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYEVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gJHtmaWVsZHMubGVuZ3RofSwgYXNrZWQgaW5kZXggJHtpbmRleH1gKTtcblxuIH1cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBwcmlvciBpbmRleFxuICovXG4gICAgc2VlayhpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmNvbnN0IHJlc3RvcmU9ZmllbGRzLmluZGV4O1xudGhpcy5hc3NlcnRDYW5TZWVrKGluZGV4KTtcbmZpZWxkcy5pbmRleD1pbmRleDtcbnJldHVybiByZXN0b3JlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICBwZWVrKHNpemUpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4vKiBDbGFtcCBzaXplLiovXG5zaXplPU1hdGgubWF4KDAsTWF0aC5taW4oZmllbGRzLmxlbmd0aC1maWVsZHMuaW5kZXgsc2l6ZSkpO1xuaWYoc2l6ZT09PTApe1xuLyogaW4gSUUxMCwgd2hlbiB1c2luZyBzdWJhcnJheShpZHgsIGlkeCksIHdlIGdldCB0aGUgYXJyYXkgWzB4MDBdIGluc3RlYWQgb2YgW10uKi9cbnJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiB9XG5jb25zdCByZXN1bHQ9ZmllbGRzLmJ5dGVzLnN1YmFycmF5KFxuZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXgsXG5maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleCtzaXplKTtcblxucmV0dXJuIHJlc3VsdDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICovXG4gICAgICAgY2FuUmVhZChvZmZzZXQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5yZXR1cm4gdGhpcy5jYW5TZWVrKGZpZWxkcy5pbmRleCtvZmZzZXQpO1xuIH1cblxuLyoqXG4gKiBDaGVjayB0aGF0IHRoZSBvZmZzZXQgd2lsbCBub3QgZ28gdG9vIGZhci5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IHRoZSBhZGRpdGlvbmFsIG9mZnNldCB0byBjaGVjay5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMuXG4gKi9cbiAgICAgICAgICAgICBhc3NlcnRDYW5SZWFkKG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuU2VlayhmaWVsZHMuaW5kZXgrb2Zmc2V0KTtcbiB9XG5cbi8qKlxuICogR2V0IHJhdyBkYXRhIHdpdGhvdXQgY29udmVyc2lvbiwgPHNpemU+IGJ5dGVzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSB0aGUgcmF3IGRhdGEuXG4gKi9cbiAgICByZWFkKHNpemUpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG50aGlzLmFzc2VydENhblJlYWQoc2l6ZSk7XG5jb25zdCByZXN1bHQ9dGhpcy5wZWVrKHNpemUpO1xuZmllbGRzLmluZGV4Kz1zaXplO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgcmVhZFVpbnQ4KCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuUmVhZCgxKTtcbmNvbnN0IGluZGV4PWZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4O1xuY29uc3QgdmFsdWU9ZmllbGRzLmRhdGEuZ2V0VWludDgoaW5kZXgpO1xuZmllbGRzLmluZGV4Kz0xO1xucmV0dXJuIHZhbHVlO1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICogQHBhcmFtIHtib29sZWFuPX0gbGl0dGxlRW5kaWFuXG4gKi9cbiAgICAgICAgICByZWFkVWludDE2KGxpdHRsZUVuZGlhbil7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuUmVhZCgyKTtcbmNvbnN0IGluZGV4PWZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4O1xuY29uc3QgdmFsdWU9ZmllbGRzLmRhdGEuZ2V0VWludDE2KGluZGV4LGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTI7XG5yZXR1cm4gdmFsdWU7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgIHJlYWRVaW50MzIobGl0dGxlRW5kaWFuKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5SZWFkKDQpO1xuY29uc3QgaW5kZXg9ZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXg7XG5jb25zdCB2YWx1ZT1maWVsZHMuZGF0YS5nZXRVaW50MzIoaW5kZXgsbGl0dGxlRW5kaWFuKTtcbmZpZWxkcy5pbmRleCs9NDtcbnJldHVybiB2YWx1ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICBieXRlQXQoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5yZXR1cm4gZmllbGRzLmJ5dGVzW2ZpZWxkcy5vZmZzZXQraW5kZXhdO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKi9cbiAgICBza2lwKG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuc2VlayhmaWVsZHMuaW5kZXgrb2Zmc2V0KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBleHBlY3RlZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgIGV4cGVjdChleHBlY3RlZCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmlmKCF0aGlzLm1hdGNoQXQoZmllbGRzLmluZGV4LGV4cGVjdGVkKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuZmllbGRzLmluZGV4Kz1leHBlY3RlZC5sZW5ndGg7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGV4cGVjdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIG1hdGNoQXQoaW5kZXgsZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZihpbmRleCtleHBlY3RlZC5sZW5ndGg+ZmllbGRzLmxlbmd0aHx8aW5kZXg8MCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuZm9yKGxldCBpPTA7aTxleHBlY3RlZC5sZW5ndGg7aSs9MSl7XG5pZihleHBlY3RlZFtpXSE9PXRoaXMuYnl0ZUF0KGluZGV4K2kpKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqL1xuICAgICAgYXNzZXJ0KGV4cGVjdGVkKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuaWYoIXRoaXMuZXhwZWN0KGV4cGVjdGVkKSl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYEV4cGVjdGVkICR7cShleHBlY3RlZCl9IGF0ICR7ZmllbGRzLmluZGV4fSwgZ290ICR7dGhpcy5wZWVrKFxuZXhwZWN0ZWQubGVuZ3RoKVxuIH1gKTtcblxuIH1cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBleHBlY3RlZFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICBmaW5kTGFzdChleHBlY3RlZCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmxldCBpbmRleD1maWVsZHMubGVuZ3RoLWV4cGVjdGVkLmxlbmd0aDtcbndoaWxlKGluZGV4Pj0wJiYhdGhpcy5tYXRjaEF0KGluZGV4LGV4cGVjdGVkKSl7XG5pbmRleC09MTtcbiB9XG5yZXR1cm4gaW5kZXg7XG4gfX0kaOKAjV9vbmNlLiBCdWZmZXJSZWFkZXIoQnVmZmVyUmVhZGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJSZWFkZXIiOlsiQnVmZmVyUmVhZGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH+1I7fpEAAA6RAAACYAAABAZW5kby96aXAtdjAuMi4zMS9zcmMvYnVmZmVyLXdyaXRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyV3JpdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxCdWZmZXJXcml0ZXIsIHtcbiAqICAgbGVuZ3RoOiBudW1iZXIsXG4gKiAgIGluZGV4OiBudW1iZXIsXG4gKiAgIGJ5dGVzOiBVaW50OEFycmF5LFxuICogICBkYXRhOiBEYXRhVmlldyxcbiAqICAgY2FwYWNpdHk6IG51bWJlcixcbiAqIH0+fVxuICovXG5jb25zdCBwcml2YXRlRmllbGRzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHNlbGZcbiAqL1xuY29uc3QgZ2V0UHJpdmF0ZUZpZWxkcz0oc2VsZik9PntcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzLmdldChzZWxmKTtcbmlmKCFmaWVsZHMpe1xudGhyb3cgbmV3IEVycm9yKCdCdWZmZXJXcml0ZXIgZmllbGRzIGFyZSBub3QgaW5pdGlhbGl6ZWQnKTtcbiB9XG5yZXR1cm4gZmllbGRzO1xuIH07XG5cbmNvbnN0IGFzc2VydE5hdE51bWJlcj0obik9PntcbmlmKE51bWJlci5pc1NhZmVJbnRlZ2VyKG4pJiYvKiogQHR5cGUge251bWJlcn0gKi9uPj0wKXtcbnJldHVybjtcbiB9XG50aHJvdyBUeXBlRXJyb3IoIGBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIGdvdCAke259YCk7XG4gfTtcblxuY2xhc3MgICAgICAgIEJ1ZmZlcldyaXRlcntcbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgIGdldCBsZW5ndGgoKXtcbnJldHVybiBnZXRQcml2YXRlRmllbGRzKHRoaXMpLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgZ2V0IGluZGV4KCl7XG5yZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5pbmRleDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICAgICAgIHNldCBpbmRleChpbmRleCl7XG50aGlzLnNlZWsoaW5kZXgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcj19IGNhcGFjaXR5XG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoY2FwYWNpdHk9MTYpe1xuY29uc3QgYnl0ZXM9bmV3IFVpbnQ4QXJyYXkoY2FwYWNpdHkpO1xuY29uc3QgZGF0YT1uZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbnByaXZhdGVGaWVsZHMuc2V0KHRoaXMse1xuYnl0ZXMsXG5kYXRhLFxuaW5kZXg6MCxcbmxlbmd0aDowLFxuY2FwYWNpdHl9KTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gcmVxdWlyZWRcbiAqL1xuICAgICAgICAgICAgIGVuc3VyZUNhblNlZWsocmVxdWlyZWQpe1xuYXNzZXJ0TmF0TnVtYmVyKHJlcXVpcmVkKTtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xubGV0IGNhcGFjaXR5PWZpZWxkcy5jYXBhY2l0eTtcbndoaWxlKGNhcGFjaXR5PHJlcXVpcmVkKXtcbmNhcGFjaXR5Kj0yO1xuIH1cbmNvbnN0IGJ5dGVzPW5ldyBVaW50OEFycmF5KGNhcGFjaXR5KTtcbmNvbnN0IGRhdGE9bmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlcik7XG5ieXRlcy5zZXQoZmllbGRzLmJ5dGVzLnN1YmFycmF5KDAsZmllbGRzLmxlbmd0aCkpO1xuZmllbGRzLmJ5dGVzPWJ5dGVzO1xuZmllbGRzLmRhdGE9ZGF0YTtcbmZpZWxkcy5jYXBhY2l0eT1jYXBhY2l0eTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICBzZWVrKGluZGV4KXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5TZWVrKGluZGV4KTtcbmZpZWxkcy5pbmRleD1pbmRleDtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICovXG4gICAgICAgICAgICAgIGVuc3VyZUNhbldyaXRlKHNpemUpe1xuYXNzZXJ0TmF0TnVtYmVyKHNpemUpO1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhblNlZWsoZmllbGRzLmluZGV4K3NpemUpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKi9cbiAgICAgd3JpdGUoYnl0ZXMpe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKGJ5dGVzLmJ5dGVMZW5ndGgpO1xuZmllbGRzLmJ5dGVzLnNldChieXRlcyxmaWVsZHMuaW5kZXgpO1xuZmllbGRzLmluZGV4Kz1ieXRlcy5ieXRlTGVuZ3RoO1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFxuICogQHBhcmFtIHtudW1iZXJ9IGVuZFxuICovXG4gICAgICAgICB3cml0ZUNvcHkoc3RhcnQsZW5kKXtcbmFzc2VydE5hdE51bWJlcihzdGFydCk7XG5hc3NlcnROYXROdW1iZXIoZW5kKTtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuY29uc3Qgc2l6ZT1lbmQtc3RhcnQ7XG50aGlzLmVuc3VyZUNhbldyaXRlKHNpemUpO1xuZmllbGRzLmJ5dGVzLmNvcHlXaXRoaW4oZmllbGRzLmluZGV4LHN0YXJ0LGVuZCk7XG5maWVsZHMuaW5kZXgrPXNpemU7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKi9cbiAgICAgICAgICB3cml0ZVVpbnQ4KHZhbHVlKXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5Xcml0ZSgxKTtcbmZpZWxkcy5kYXRhLnNldFVpbnQ4KGZpZWxkcy5pbmRleCx2YWx1ZSk7XG5maWVsZHMuaW5kZXgrPTE7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgICB3cml0ZVVpbnQxNih2YWx1ZSxsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKDIpO1xuY29uc3QgaW5kZXg9ZmllbGRzLmluZGV4O1xuZmllbGRzLmRhdGEuc2V0VWludDE2KGluZGV4LHZhbHVlLGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTI7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgICB3cml0ZVVpbnQzMih2YWx1ZSxsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKDQpO1xuY29uc3QgaW5kZXg9ZmllbGRzLmluZGV4O1xuZmllbGRzLmRhdGEuc2V0VWludDMyKGluZGV4LHZhbHVlLGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTQ7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXI9fSBiZWdpblxuICogQHBhcmFtIHtudW1iZXI9fSBlbmRcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG4gICAgICAgIHN1YmFycmF5KGJlZ2luLGVuZCl7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnJldHVybiBmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCxmaWVsZHMubGVuZ3RoKS5zdWJhcnJheShiZWdpbixlbmQpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcj19IGJlZ2luXG4gKiBAcGFyYW0ge251bWJlcj19IGVuZFxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICAgc2xpY2UoYmVnaW4sZW5kKXtcbnJldHVybiB0aGlzLnN1YmFycmF5KGJlZ2luLGVuZCkuc2xpY2UoKTtcbiB9fSRo4oCNX29uY2UuIEJ1ZmZlcldyaXRlcihCdWZmZXJXcml0ZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJ1ZmZlcldyaXRlciI6WyJCdWZmZXJXcml0ZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoKCVXcMBAADDAQAAJAAAAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9jb21wcmVzc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiU1RPUkUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiBTVE9SRSBpcyB0aGUgbWFnaWMgbnVtYmVyIGZvciBcIm5vdCBjb21wcmVzc2VkXCIuKi9cbmNvbnN0ICAgICAgICBTVE9SRT0wOyRo4oCNX29uY2UuU1RPUkUoU1RPUkUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlNUT1JFIjpbIlNUT1JFIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB/iuys/BQAAPwUAAB4AAABAZW5kby96aXAtdjAuMi4zMS9zcmMvY3JjMzIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImNyYzMyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNyYzMyLCAnbmFtZScsIHt2YWx1ZTogXCJjcmMzMlwifSk7JGjigI1fb25jZS5jcmMzMihjcmMzMik7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBgbWFrZVRhYmxlYCBhbmQgYGNyYzMyYCBjb21lIGZyb20gYHBha29gLCBmcm9tXG4gKiBwYWtvL2xpYi96bGliL2NyYzMyLmpzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgc2VlIHBha29cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vKiBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZSovXG4vKipcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fVxuICovXG5mdW5jdGlvbiBtYWtlVGFibGUoKXtcbmxldCBjO1xuY29uc3QgdGFibGU9W107XG5cbmZvcihsZXQgbj0wO248MjU2O24rPTEpe1xuYz1uO1xuZm9yKGxldCBrPTA7azw4O2srPTEpe1xuYz1jJjE/MHhlZGI4ODMyMF5jPj4+MTpjPj4+MTtcbiB9XG50YWJsZVtuXT1jO1xuIH1cblxucmV0dXJuIHRhYmxlO1xuIH1cblxuLyogSW5pdGlhbGl6ZSBhIHRhYmxlIG9mIDI1NiBzaWduZWQgMzIgYml0IGludGVnZXJzLiovXG5jb25zdCB0YWJsZT1tYWtlVGFibGUoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjcmNcbiAqL1xuZnVuY3Rpb24gICAgICAgIGNyYzMyKGJ5dGVzLGxlbmd0aD1ieXRlcy5sZW5ndGgsaW5kZXg9MCxjcmM9MCl7XG5jb25zdCBlbmQ9aW5kZXgrbGVuZ3RoO1xuXG5jcmNePS0xO1xuXG5mb3IobGV0IGk9aW5kZXg7aTxlbmQ7aSs9MSl7XG5jcmM9Y3JjPj4+OF50YWJsZVsoY3JjXmJ5dGVzW2ldKSYweGZmXTtcbiB9XG5cbnJldHVybihjcmNeLTEpPj4+MDtcbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY3JjMzIiOlsiY3JjMzIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAF8hS7iQ0AAAkNAAAJgAAAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9mb3JtYXQtcmVhZGVyLmpzeyJpbXBvcnRzIjpbIi4vY29tcHJlc3Npb24uanMiLCIuL2NyYzMyLmpzIiwiLi9zaWduYXR1cmUuanMiLCIuL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsicmVhZFppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBjcmMzMixzaWduYXR1cmUsY29tcHJlc3Npb247JGjigI1faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIiwgWyRo4oCNX2EgPT4gKGNyYzMyID0gJGjigI1fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChzaWduYXR1cmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoY29tcHJlc3Npb24gPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmVhZFppcCwgJ25hbWUnLCB7dmFsdWU6IFwicmVhZFppcFwifSk7JGjigI1fb25jZS5yZWFkWmlwKHJlYWRaaXApOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBxLCBhcyBpbiBxdW90ZSwgZm9yIHF1b3Rpbmcgc3RyaW5ncyBpbiBlcnJvcnMqL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgTUFYX1ZBTFVFXzE2QklUUz02NTUzNTtcbmNvbnN0IE1BWF9WQUxVRV8zMkJJVFM9NDI5NDk2NzI5NTtcblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdEZsYWdcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VuY3J5cHRlZChiaXRGbGFnKXtcbnJldHVybihiaXRGbGFnJjB4MDAwMSk9PT0weDAwMDE7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtEYXRlfVxuICogQHNlZSBodHRwOi8vd3d3LmRlbG9yaWUuY29tL2RqZ3BwL2RvYy9yYmludGVyL2l0LzY1LzE2Lmh0bWxcbiAqIEBzZWUgaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvcmJpbnRlci9pdC82Ni8xNi5odG1sXG4gKi9cbmZ1bmN0aW9uIHJlYWREb3NEYXRlVGltZShyZWFkZXIpe1xuY29uc3QgZG9zVGltZT1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbnJldHVybiBuZXcgRGF0ZShcbkRhdGUuVVRDKFxuKGRvc1RpbWU+PjI1JjB4N2YpKzE5ODAsLyogeWVhciovXG4oZG9zVGltZT4+MjEmMHgwZiktMSwvKiBtb250aCovXG5kb3NUaW1lPj4xNiYweDFmLC8qIGRheSovXG5kb3NUaW1lPj4xMSYweDFmLC8qIGhvdXIqL1xuZG9zVGltZT4+NSYweDNmLC8qIG1pbnV0ZSovXG4oZG9zVGltZSYweDFmKTw8MS8qIHNlY29uZCovKSk7XG5cblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7QXJjaGl2ZUhlYWRlcnN9XG4gKi9cbmZ1bmN0aW9uIHJlYWRIZWFkZXJzKHJlYWRlcil7XG5yZXR1cm57XG52ZXJzaW9uTmVlZGVkOnJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuYml0RmxhZzpyZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbmNvbXByZXNzaW9uTWV0aG9kOnJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuZGF0ZTpyZWFkRG9zRGF0ZVRpbWUocmVhZGVyKSxcbmNyYzMyOnJlYWRlci5yZWFkVWludDMyKHRydWUpLFxuY29tcHJlc3NlZExlbmd0aDpyZWFkZXIucmVhZFVpbnQzMih0cnVlKSxcbnVuY29tcHJlc3NlZExlbmd0aDpyZWFkZXIucmVhZFVpbnQzMih0cnVlKX07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0NlbnRyYWxGaWxlUmVjb3JkfVxuICovXG5mdW5jdGlvbiByZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKXtcbmNvbnN0IHZlcnNpb249cmVhZGVyLnJlYWRVaW50OCgpO1xuY29uc3QgbWFkZUJ5PXJlYWRlci5yZWFkVWludDgoKTtcbmNvbnN0IGhlYWRlcnM9cmVhZEhlYWRlcnMocmVhZGVyKTtcbmNvbnN0IG5hbWVMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBleHRyYUZpZWxkc0xlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGNvbW1lbnRMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBkaXNrTnVtYmVyU3RhcnQ9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZXh0ZXJuYWxGaWxlQXR0cmlidXRlcz1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbmNvbnN0IGZpbGVTdGFydD1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcblxuY29uc3QgbmFtZT1yZWFkZXIucmVhZChuYW1lTGVuZ3RoKTtcbi8qIFRPRE8gcmVhZCBleHRyYSBmaWVsZHMsIHBhcnRpY3VsYXJseSBaaXA2NCovXG5yZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5cbmlmKGhlYWRlcnMudW5jb21wcmVzc2VkTGVuZ3RoPT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuaWYoaGVhZGVycy5jb21wcmVzc2VkTGVuZ3RoPT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuaWYoZmlsZVN0YXJ0PT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuaWYoZGlza051bWJlclN0YXJ0PT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuXG5jb25zdCBjb21tZW50PXJlYWRlci5yZWFkKGNvbW1lbnRMZW5ndGgpO1xuXG5yZXR1cm57XG5uYW1lLFxudmVyc2lvbixcbm1hZGVCeSxcbi4uLmhlYWRlcnMsXG5kaXNrTnVtYmVyU3RhcnQsXG5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzLFxuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyxcbmZpbGVTdGFydCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEBwYXJhbSB7Q2VudHJhbERpcmVjdG9yeUxvY2F0b3J9IGxvY2F0b3JcbiAqIEByZXR1cm5zIHtBcnJheTxDZW50cmFsRmlsZVJlY29yZD59XG4gKi9cbmZ1bmN0aW9uIHJlYWRDZW50cmFsRGlyZWN0b3J5KHJlYWRlcixsb2NhdG9yKXtcbmNvbnN0e2NlbnRyYWxEaXJlY3RvcnlPZmZzZXQsY2VudHJhbERpcmVjdG9yeVJlY29yZHN9PWxvY2F0b3I7XG5yZWFkZXIuc2VlayhjZW50cmFsRGlyZWN0b3J5T2Zmc2V0KTtcblxuY29uc3QgZW50cmllcz1bXTtcbndoaWxlKHJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpKXtcbmNvbnN0IGVudHJ5PXJlYWRDZW50cmFsRmlsZUhlYWRlcihyZWFkZXIpO1xuZW50cmllcy5wdXNoKGVudHJ5KTtcbiB9XG5cbmlmKGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzIT09ZW50cmllcy5sZW5ndGgpe1xuLyogV2UgZXhwZWN0ZWQgc29tZSByZWNvcmRzIGJ1dCBjb3VsZG4ndCBmaW5kIEFOWS4qL1xuLyogVGhpcyBpcyByZWFsbHkgc3VzcGljaW91cywgYXMgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuKi9cbnRocm93IG5ldyBFcnJvcihcbiBgQ29ycnVwdGVkIHppcCBvciBidWc6IGV4cGVjdGVkICR7Y2VudHJhbERpcmVjdG9yeVJlY29yZHN9IHJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdCAke2VudHJpZXMubGVuZ3RofWApO1xuXG4gfVxuXG5yZXR1cm4gZW50cmllcztcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0xvY2FsRmlsZVJlY29yZH1cbiAqL1xuZnVuY3Rpb24gcmVhZEZpbGUocmVhZGVyKXtcbnJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbmNvbnN0IGhlYWRlcnM9cmVhZEhlYWRlcnMocmVhZGVyKTtcbmNvbnN0IG5hbWVMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBleHRyYUZpZWxkc0xlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IG5hbWU9cmVhZGVyLnJlYWQobmFtZUxlbmd0aCk7XG5yZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5jb25zdCBjb250ZW50PXJlYWRlci5yZWFkKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCk7XG5yZXR1cm57bmFtZSwuLi5oZWFkZXJzLGNvbnRlbnR9O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcGFyYW0ge0FycmF5PENlbnRyYWxGaWxlUmVjb3JkPn0gcmVjb3Jkc1xuICogQHJldHVybnMge0FycmF5PExvY2FsRmlsZVJlY29yZD59XG4gKi9cbmZ1bmN0aW9uIHJlYWRMb2NhbEZpbGVzKHJlYWRlcixyZWNvcmRzKXtcbmNvbnN0IGZpbGVzPVtdO1xuZm9yKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKXtcbnJlYWRlci5zZWVrKHJlY29yZC5maWxlU3RhcnQpO1xuY29uc3QgZmlsZT1yZWFkRmlsZShyZWFkZXIpO1xuZmlsZXMucHVzaChmaWxlKTtcbiB9XG5yZXR1cm4gZmlsZXM7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtDZW50cmFsRGlyZWN0b3J5TG9jYXRvcn1cbiAqL1xuZnVuY3Rpb24gcmVhZEJsb2NrRW5kT2ZDZW50cmFsKHJlYWRlcil7XG5pZighcmVhZGVyLmV4cGVjdChzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSl7XG50aHJvdyBuZXcgRXJyb3IoXG4nQ29ycnVwdCB6aXAgZmlsZSwgb3IgemlwIGZpbGUgY29udGFpbmluZyBhbiB1bnN1cHBvcnRlZCB2YXJpYWJsZS13aWR0aCBlbmQtb2YtYXJjaGl2ZSBjb21tZW50LCBvciBhbiB1bnN1cHBvcnRlZCB6aXAgZmlsZSB3aXRoIDY0IGJpdCBzaXplcycpO1xuXG4gfVxuY29uc3QgZGlza051bWJlcj1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVJlY29yZHNPblRoaXNEaXNrPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVJlY29yZHM9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5U2l6ZT1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQ9cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5jb25zdCBjb21tZW50TGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuLyogV2FybmluZzogdGhlIGVuY29kaW5nIGRlcGVuZHMgb2YgdGhlIHN5c3RlbSBsb2NhbGUuKi9cbi8qIE9uIGEgTGludXggbWFjaGluZSB3aXRoIExBTkc9ZW5fVVMudXRmOCwgdGhpcyBmaWVsZCBpcyB1dGY4IGVuY29kZWQuKi9cbi8qIE9uIGEgV2luZG93cyBtYWNoaW5lLCB0aGlzIGZpZWxkIGlzIGVuY29kZWQgd2l0aCB0aGUgbG9jYWxpemVkIFdpbmRvd3MqL1xuLyogY29kZSBwYWdlLiovXG5jb25zdCBjb21tZW50PXRleHREZWNvZGVyLmRlY29kZShyZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKSk7XG5yZXR1cm57XG5kaXNrTnVtYmVyLFxuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQsXG5jZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2ssXG5jZW50cmFsRGlyZWN0b3J5UmVjb3JkcyxcbmNlbnRyYWxEaXJlY3RvcnlTaXplLFxuY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtDZW50cmFsRGlyZWN0b3J5TG9jYXRvcn1cbiAqL1xuZnVuY3Rpb24gcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpe1xuLyogWmlwIGZpbGVzIGFyZSBwZXJtaXR0ZWQgdG8gaGF2ZSBhIHZhcmlhYmxlLXdpZHRoIGNvbW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUqL1xuLyogXCJlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkXCIgYW5kIG1heSBoYXZlIHN1YnNlcXVlbnQgWmlwNjQgaGVhZGVycy4qL1xuLyogVGhlIHByZXNjcmliZWQgbWV0aG9kIG9mIGZpbmRpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgXCJlbmQgb2YgY2VudHJhbCovXG4vKiBkaXJlY3RvcnkgcmVjb3JkXCIgaXMgdG8gc2VlayB0aGUgbWFnaWMgbnVtYmVyOiovXG4vKiovXG4vKiByZWFkZXIuZmluZExhc3Qoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7Ki9cbi8qKi9cbi8qIFRoaXMgaW50cm9kdWNlcyBhIG51bWJlciBvZiB1bmRlc2lyYWJsZSwgYXR0YWNrYWJsZSBhbWJpZ3VpdGllcyovXG4vKiBBZ29yaWMgaXMgbm90IGNvbWZvcnRhYmxlIHN1cHBvcnRpbmcsIHNvIHdlIGZvcmJpZCB0aGUgY29tbWVudCovXG4vKiBhbmQgNjQgYml0IHppcCBzdXBwb3J0IHNvIHdlIGNhbiBzZWVrIGEgcHJlZGljdGFibGUgbGVuZ3RoKi9cbi8qIGZyb20gdGhlIGVuZC4qL1xuY29uc3QgY2VudHJhbERpcmVjdG9yeUVuZD1yZWFkZXIubGVuZ3RoLTIyO1xuaWYoY2VudHJhbERpcmVjdG9yeUVuZDwwKXtcbnRocm93IG5ldyBFcnJvcignQ29ycnVwdGVkIHppcDogbm90IGVub3VnaCBjb250ZW50Jyk7XG4gfVxucmVhZGVyLnNlZWsoY2VudHJhbERpcmVjdG9yeUVuZCk7XG5jb25zdCBsb2NhdG9yPXJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpO1xuXG4vKiBFeGNlcnB0IGZyb20gdGhlIHppcCBzcGVjOiovXG4vKiA0KSAgSWYgb25lIG9mIHRoZSBmaWVsZHMgaW4gdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSovXG4vKiByZWNvcmQgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVxdWlyZWQgZGF0YSwgdGhlIGZpZWxkKi9cbi8qIHNob3VsZCBiZSBzZXQgdG8gLTEgKDB4RkZGRiBvciAweEZGRkZGRkZGKSBhbmQgdGhlKi9cbi8qIFpJUDY0IGZvcm1hdCByZWNvcmQgc2hvdWxkIGJlIGNyZWF0ZWQuKi9cbi8qIDUpICBUaGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCBhbmQgdGhlKi9cbi8qIFppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yIHJlY29yZCBtdXN0Ki9cbi8qIHJlc2lkZSBvbiB0aGUgc2FtZSBkaXNrIHdoZW4gc3BsaXR0aW5nIG9yIHNwYW5uaW5nKi9cbi8qIGFuIGFyY2hpdmUuKi9cbmNvbnN0IHppcDY0PVxubG9jYXRvci5kaXNrTnVtYmVyPT09TUFYX1ZBTFVFXzE2QklUU3x8XG5sb2NhdG9yLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PT09TUFYX1ZBTFVFXzE2QklUU3x8XG5sb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzaz09PU1BWF9WQUxVRV8xNkJJVFN8fFxubG9jYXRvci5jZW50cmFsRGlyZWN0b3J5UmVjb3Jkcz09PU1BWF9WQUxVRV8xNkJJVFN8fFxubG9jYXRvci5jZW50cmFsRGlyZWN0b3J5U2l6ZT09PU1BWF9WQUxVRV8zMkJJVFN8fFxubG9jYXRvci5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0PT09TUFYX1ZBTFVFXzMyQklUUztcblxuaWYoemlwNjQpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cblxuY29uc3R7XG5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0LFxuY2VudHJhbERpcmVjdG9yeVNpemVcbi8qIHppcDY0RW5kT2ZDZW50cmFsU2l6ZSovfT1cbmxvY2F0b3I7XG5cbmNvbnN0IGV4cGVjdGVkQ2VudHJhbERpcmVjdG9yeUVuZD1cbmNlbnRyYWxEaXJlY3RvcnlPZmZzZXQrY2VudHJhbERpcmVjdG9yeVNpemU7XG5jb25zdCBleHRyYUJ5dGVzPWNlbnRyYWxEaXJlY3RvcnlFbmQtZXhwZWN0ZWRDZW50cmFsRGlyZWN0b3J5RW5kO1xuXG5yZWFkZXIub2Zmc2V0PWV4dHJhQnl0ZXM7XG5cbnJldHVybiBsb2NhdG9yO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0NlbnRyYWxGaWxlUmVjb3JkfSBjZW50cmFsUmVjb3JkXG4gKiBAcGFyYW0ge0xvY2FsRmlsZVJlY29yZH0gbG9jYWxSZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlTmFtZVxuICovXG5mdW5jdGlvbiBjaGVja1JlY29yZHMoY2VudHJhbFJlY29yZCxsb2NhbFJlY29yZCxhcmNoaXZlTmFtZSl7XG5jb25zdCBjZW50cmFsTmFtZT10ZXh0RGVjb2Rlci5kZWNvZGUoY2VudHJhbFJlY29yZC5uYW1lKTtcbmNvbnN0IGxvY2FsTmFtZT10ZXh0RGVjb2Rlci5kZWNvZGUobG9jYWxSZWNvcmQubmFtZSk7XG5cbi8qIEluIHNvbWUgemlwIGZpbGVzIGNyZWF0ZWQgb24gV2luZG93cywgdGhlIGZpbGVuYW1lIHN0b3JlZCBpbiB0aGUgY2VudHJhbCovXG4vKiBkaXIgY29udGFpbnMgXCJcXFwiIGluc3RlYWQgb2YgXCIvXCIuICBTdHJhbmdlbHksIHRoZSBmaWxlIG5hbWUgaW4gdGhlIGxvY2FsKi9cbi8qIGRpcmVjdG9yeSB1c2VzIFwiL1wiIGFzIHNwZWNpZmllZDoqL1xuLyogaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvRkFRLmh0bWwjYmFja3NsYXNoZXMgb3IgQVBQTk9URSM0LjQuMTcuMSwgXCJBbGwqL1xuLyogc2xhc2hlcyBNVVNUIGJlIGZvcndhcmQgc2xhc2hlcyAnLydcIikgYnV0IHRoZXJlIGFyZSBhIGxvdCBvZiBiYWQgemlwKi9cbi8qIGdlbmVyYXRvcnMuLi4gIFNlYXJjaCBcInVuemlwIG1pc21hdGNoaW5nIFwibG9jYWxcIiBmaWxlbmFtZSBjb250aW51aW5nIHdpdGgqL1xuLyogXCJjZW50cmFsXCIgZmlsZW5hbWUgdmVyc2lvblwiLiovXG4vKiovXG4vKiBUaGUgcmVhc29uaW5nIGFwcGVhcnMgdG8gYmUgdGhhdCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaXMgZm9yKi9cbi8qIHVzZXIgZGlzcGxheSBhbmQgbWF5IGRpZmZlciwgdGhvdWdoIHRoaXMgb3BlbnMgdGhlIHBvc3NpYmlsaXR5Ki9cbi8qIGZvciBzcG9vZmluZyBhdHRhY2tzLiovXG4vKiBodHRwOi8vc2VjbGlzdHMub3JnL2Z1bGxkaXNjbG9zdXJlLzIwMDkvU2VwLzM5NCovXG4vKiovXG4vKiBXZSBzdHJpa2UgYSBjb21wcm9taXNlOiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgbmFtZSBtYXkgdmFyeSBmcm9tIHRoZSBsb2NhbCovXG4vKiBuYW1lIGV4YWN0bHkgYW5kIG9ubHkgYnkgZGlmZmVyZW50IHNsYXNoZXMuKi9cbmlmKGNlbnRyYWxOYW1lLnJlcGxhY2UoL1xcXFwvZywnLycpIT09bG9jYWxOYW1lKXtcbnRocm93IG5ldyBFcnJvcihcbiBgWmlwIGludGVncml0eSBlcnJvcjogY2VudHJhbCByZWNvcmQgZmlsZSBuYW1lICR7cShcbmNlbnRyYWxOYW1lKVxuIH0gbXVzdCBtYXRjaCBsb2NhbCBmaWxlIG5hbWUgJHtxKGxvY2FsTmFtZSl9IGluIGFyY2hpdmUgJHtxKFxuYXJjaGl2ZU5hbWUpXG4gfWApO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrKHZhbHVlLG1lc3NhZ2Upe1xuaWYoIXZhbHVlKXtcbnRocm93IG5ldyBFcnJvcihcbiBgWmlwIGludGVncml0eSBlcnJvcjogJHttZXNzYWdlfSBmb3IgZmlsZSAke3EoXG5sb2NhbE5hbWUpXG4gfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTmFtZSl9YCk7XG5cbiB9XG4gfVxuXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQuYml0RmxhZz09PWxvY2FsUmVjb3JkLmJpdEZsYWcsXG4gYENlbnRyYWwgcmVjb3JkIGJpdCBmbGFnICR7Y2VudHJhbFJlY29yZC5iaXRGbGFnLnRvU3RyaW5nKFxuMTYpXG4gfSBtdXN0IG1hdGNoIGxvY2FsIHJlY29yZCBiaXQgZmxhZyAke2xvY2FsUmVjb3JkLmJpdEZsYWcudG9TdHJpbmcoMTYpfWApO1xuXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2Q9PT1sb2NhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCxcbiBgQ2VudHJhbCByZWNvcmQgY29tcHJlc3Npb24gbWV0aG9kICR7cShcbmNlbnRyYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QpXG4gfSBtdXN0IG1hdGNoIGxvY2FsIGNvbXByZXNzaW9uIG1ldGhvZCAke3EobG9jYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QpfWApO1xuXG4vKiBUT0RPIERhdGUgaW50ZWdyaXR5IGNoZWNrIHdvdWxkIGJlIGVhc2llciBvbiB0aGUgb3JpZ2luYWwgYnl0ZXMuKi9cbi8qIFBlcmhhcHMgZGVmZXIgZGVjb2RpbmcgdGhlIHVuZGVybHlpbmcgYnl0ZXMuKi9cbmNoZWNrKFxuY2VudHJhbFJlY29yZC5jcmMzMj09PWxvY2FsUmVjb3JkLmNyYzMyLFxuIGBDZW50cmFsIHJlY29yZCBDUkMtMzIgY2hlY2tzdW0gJHtjZW50cmFsUmVjb3JkLmNyYzMyfSBtdXN0IG1hdGNoIGxvY2FsIGNoZWNrc3VtICR7bG9jYWxSZWNvcmQuY3JjMzJ9YCk7XG5cbmNoZWNrKFxuY2VudHJhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RoPT09bG9jYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aCxcbiBgQ2VudHJhbCByZWNvcmQgY29tcHJlc3NlZCBzaXplICR7Y2VudHJhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RofSBtdXN0IG1hdGNoIGxvY2FsICR7bG9jYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aH1gKTtcblxuY2hlY2soXG5jZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aD09PWxvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aCxcbiBgQ2VudHJhbCByZWNvcmQgdW5jb21wcmVzc2VkIHNpemUgJHtjZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH1gKTtcblxuXG5jb25zdCBjaGVja3N1bT1jcmMzMihsb2NhbFJlY29yZC5jb250ZW50KTtcbmNoZWNrKFxuY2hlY2tzdW09PT1sb2NhbFJlY29yZC5jcmMzMixcbiBgQ1JDLTMyIGNoZWNrc3VtIG1pc21hdGNoLCB3YW50ZWQgJHtsb2NhbFJlY29yZC5jcmMzMn0gYnV0IGFjdHVhbCBjb250ZW50IGlzICR7Y2hlY2tzdW19YCk7XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXNcbiAqL1xuZnVuY3Rpb24gbW9kZUZvckV4dGVybmFsQXR0cmlidXRlcyhleHRlcm5hbEZpbGVBdHRyaWJ1dGVzKXtcbnJldHVybiBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzPj4xNiYweGZmZmY7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7Q2VudHJhbEZpbGVSZWNvcmR9IGNlbnRyYWxSZWNvcmRcbiAqIEBwYXJhbSB7TG9jYWxGaWxlUmVjb3JkfSBsb2NhbFJlY29yZFxuICogQHJldHVybnMge0NvbXByZXNzZWRGaWxlfVxuICovXG5mdW5jdGlvbiByZWNvcmRUb0ZpbGUoY2VudHJhbFJlY29yZCxsb2NhbFJlY29yZCl7XG5jb25zdCBtb2RlPW1vZGVGb3JFeHRlcm5hbEF0dHJpYnV0ZXMoY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzKTtcbnJldHVybntcbm5hbWU6Y2VudHJhbFJlY29yZC5uYW1lLFxubW9kZSxcbmRhdGU6Y2VudHJhbFJlY29yZC5kYXRlLFxuY3JjMzI6Y2VudHJhbFJlY29yZC5jcmMzMixcbmNvbXByZXNzaW9uTWV0aG9kOmNlbnRyYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QsXG5jb21wcmVzc2VkTGVuZ3RoOmNlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aCxcbnVuY29tcHJlc3NlZExlbmd0aDpjZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aCxcbmNvbnRlbnQ6bG9jYWxSZWNvcmQuY29udGVudCxcbmNvbW1lbnQ6Y2VudHJhbFJlY29yZC5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0NvbXByZXNzZWRGaWxlfSBmaWxlXG4gKiBAcmV0dXJucyB7VW5jb21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gZGVjb21wcmVzc0ZpbGUoZmlsZSl7XG5pZihmaWxlLmNvbXByZXNzaW9uTWV0aG9kIT09Y29tcHJlc3Npb24uU1RPUkUpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgZmluZCBkZWNvbXByZXNzb3IgZm9yIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG5maWxlLmNvbXByZXNzaW9uTWV0aG9kKVxuIH0gZm9yIGZpbGUgJHtmaWxlLm5hbWV9YCk7XG5cbiB9XG5yZXR1cm57XG5uYW1lOmZpbGUubmFtZSxcbm1vZGU6ZmlsZS5tb2RlLFxuZGF0ZTpmaWxlLmRhdGUsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VuY29tcHJlc3NlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtBcmNoaXZlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIGRlY29kZUZpbGUoZmlsZSl7XG5jb25zdCBuYW1lPXRleHREZWNvZGVyLmRlY29kZShmaWxlLm5hbWUpO1xuY29uc3QgY29tbWVudD10ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5jb21tZW50KTtcbnJldHVybntcbm5hbWUsXG50eXBlOidmaWxlJyxcbm1vZGU6ZmlsZS5tb2RlJjBvNzc3LFxuZGF0ZTpmaWxlLmRhdGUsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cbmZ1bmN0aW9uICAgICAgICByZWFkWmlwKHJlYWRlcixuYW1lPSc8dW5rbm93bj4nKXtcbmNvbnN0IGxvY2F0b3I9cmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpO1xuY29uc3QgY2VudHJhbFJlY29yZHM9cmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLGxvY2F0b3IpO1xuY29uc3QgbG9jYWxSZWNvcmRzPXJlYWRMb2NhbEZpbGVzKHJlYWRlcixjZW50cmFsUmVjb3Jkcyk7XG5jb25zdCBmaWxlcz1uZXcgTWFwKCk7XG5cbmZvcihsZXQgaT0wO2k8Y2VudHJhbFJlY29yZHMubGVuZ3RoO2krPTEpe1xuY29uc3QgY2VudHJhbFJlY29yZD1jZW50cmFsUmVjb3Jkc1tpXTtcbmNvbnN0IGxvY2FsUmVjb3JkPWxvY2FsUmVjb3Jkc1tpXTtcblxuY2hlY2tSZWNvcmRzKGNlbnRyYWxSZWNvcmQsbG9jYWxSZWNvcmQsbmFtZSk7XG5cbmlmKGlzRW5jcnlwdGVkKGNlbnRyYWxSZWNvcmQuYml0RmxhZykpe1xudGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gfVxuXG5jb25zdCBpc0Rpcj0oY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzJjB4MDAxMCkhPT0wO1xuaWYoIWlzRGlyKXtcbmNvbnN0IGNvbXByZXNzZWRGaWxlPXJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLGxvY2FsUmVjb3JkKTtcbmNvbnN0IGRlY29tcHJlc3NlZEZpbGU9ZGVjb21wcmVzc0ZpbGUoY29tcHJlc3NlZEZpbGUpO1xuY29uc3QgZGVjb2RlZEZpbGU9ZGVjb2RlRmlsZShkZWNvbXByZXNzZWRGaWxlKTtcbmZpbGVzLnNldChkZWNvZGVkRmlsZS5uYW1lLGRlY29kZWRGaWxlKTtcbiB9XG4vKiBUT0RPIGhhbmRsZSBleHBsaWNpdCBkaXJlY3RvcnkgZW50cmllcyovXG4gfVxucmV0dXJuIGZpbGVzO1xuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3pN+N6UbAAClGwAAJgAAAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9mb3JtYXQtd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vY29tcHJlc3Npb24uanMiLCIuL2NyYzMyLmpzIiwiLi9zaWduYXR1cmUuanMiXSwiZXhwb3J0cyI6WyJ3cml0ZVppcCIsIndyaXRlWmlwUmVjb3JkcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBjcmMzMixzaWduYXR1cmUsY29tcHJlc3Npb247JGjigI1faW1wb3J0cyhbW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIiwgWyRo4oCNX2EgPT4gKGNyYzMyID0gJGjigI1fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChzaWduYXR1cmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoY29tcHJlc3Npb24gPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JpdGVaaXBSZWNvcmRzLCAnbmFtZScsIHt2YWx1ZTogXCJ3cml0ZVppcFJlY29yZHNcIn0pOyRo4oCNX29uY2Uud3JpdGVaaXBSZWNvcmRzKHdyaXRlWmlwUmVjb3Jkcyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwLCAnbmFtZScsIHt2YWx1ZTogXCJ3cml0ZVppcFwifSk7JGjigI1fb25jZS53cml0ZVppcCh3cml0ZVppcCk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCBVTklYPTM7XG5jb25zdCBVTklYX1ZFUlNJT049MzA7XG5cbmNvbnN0IHRleHRFbmNvZGVyPW5ldyBUZXh0RW5jb2RlcigpO1xuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7RGF0ZT99IGRhdGVcbiAqIEBzZWUgaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvcmJpbnRlci9pdC82NS8xNi5odG1sXG4gKiBAc2VlIGh0dHA6Ly93d3cuZGVsb3JpZS5jb20vZGpncHAvZG9jL3JiaW50ZXIvaXQvNjYvMTYuaHRtbFxuICovXG5mdW5jdGlvbiB3cml0ZURvc0RhdGVUaW1lKHdyaXRlcixkYXRlKXtcbmNvbnN0IGRvc1RpbWU9XG5kYXRlIT09dW5kZWZpbmVkJiZkYXRlIT09bnVsbD9cbihkYXRlLmdldFVUQ0Z1bGxZZWFyKCktMTk4MCYweDdmKTw8MjV8LyogeWVhciovXG5kYXRlLmdldFVUQ01vbnRoKCkrMTw8MjF8LyogbW9udGgqL1xuZGF0ZS5nZXRVVENEYXRlKCk8PDE2fC8qIGRheSovXG5kYXRlLmdldFVUQ0hvdXJzKCk8PDExfC8qIGhvdXIqL1xuZGF0ZS5nZXRVVENNaW51dGVzKCk8PDV8LyogbWludXRlKi9cbmRhdGUuZ2V0VVRDU2Vjb25kcygpPj4xLyogc2Vjb25kKi86XG4wOy8qIEVwb2NoIG9yaWdpbiBieSBkZWZhdWx0LiovXG53cml0ZXIud3JpdGVVaW50MzIoZG9zVGltZSx0cnVlKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtGaWxlUmVjb3JkfSBmaWxlXG4gKiBAcmV0dXJucyB7TG9jYWxGaWxlTG9jYXRvcn1cbiAqL1xuZnVuY3Rpb24gd3JpdGVGaWxlKHdyaXRlcixmaWxlKXtcbi8qIEhlYWRlciovXG5jb25zdCBmaWxlU3RhcnQ9d3JpdGVyLmluZGV4O1xud3JpdGVyLndyaXRlKHNpZ25hdHVyZS5MT0NBTF9GSUxFX0hFQURFUik7XG5jb25zdCBoZWFkZXJTdGFydD13cml0ZXIuaW5kZXg7XG4vKiBWZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0Ki9cbndyaXRlci53cml0ZVVpbnQxNigxMCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmJpdEZsYWcsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCx0cnVlKTtcbndyaXRlRG9zRGF0ZVRpbWUod3JpdGVyLGZpbGUuZGF0ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS5jcmMzMix0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihmaWxlLmNvbXByZXNzZWRMZW5ndGgsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5uYW1lLmxlbmd0aCx0cnVlKTtcbmNvbnN0IGhlYWRlckVuZD13cml0ZXIubGVuZ3RoO1xuXG4vKiBUT0RPIGNvdW50IG9mIGV4dHJhIGZpZWxkcyBsZW5ndGgqL1xud3JpdGVyLndyaXRlVWludDE2KDAsdHJ1ZSk7XG53cml0ZXIud3JpdGUoZmlsZS5uYW1lKTtcbi8qIFRPRE8gd3JpdGUgZXh0cmEgZmllbGRzKi9cbndyaXRlci53cml0ZShmaWxlLmNvbnRlbnQpO1xuXG5yZXR1cm57XG5maWxlU3RhcnQsXG5oZWFkZXJTdGFydCxcbmhlYWRlckVuZH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtGaWxlUmVjb3JkfSBmaWxlXG4gKiBAcGFyYW0ge0xvY2FsRmlsZUxvY2F0b3J9IGxvY2F0b3JcbiAqL1xuZnVuY3Rpb24gd3JpdGVDZW50cmFsRmlsZUhlYWRlcih3cml0ZXIsZmlsZSxsb2NhdG9yKXtcbndyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9GSUxFX0hFQURFUik7XG53cml0ZXIud3JpdGVVaW50OChmaWxlLnZlcnNpb24pO1xud3JpdGVyLndyaXRlVWludDgoZmlsZS5tYWRlQnkpO1xud3JpdGVyLndyaXRlQ29weShsb2NhdG9yLmhlYWRlclN0YXJ0LGxvY2F0b3IuaGVhZGVyRW5kKTtcbi8qIFRPRE8gZXh0cmEgZmllbGRzIGxlbmd0aCovXG53cml0ZXIud3JpdGVVaW50MTYoMCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmNvbW1lbnQubGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuZGlza051bWJlclN0YXJ0LHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihmaWxlLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIobG9jYXRvci5maWxlU3RhcnQsdHJ1ZSk7XG53cml0ZXIud3JpdGUoZmlsZS5jZW50cmFsTmFtZSk7XG4vKiBUT0RPIGV4dHJhIGZpZWxkcyovXG53cml0ZXIud3JpdGUoZmlsZS5jb21tZW50KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtudW1iZXJ9IGVudHJpZXNDb3VudFxuICogQHBhcmFtIHtudW1iZXJ9IGNlbnRyYWxEaXJlY3RvcnlTdGFydFxuICogQHBhcmFtIHtudW1iZXJ9IGNlbnRyYWxEaXJlY3RvcnlMZW5ndGhcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gY29tbWVudEJ5dGVzXG4gKi9cbmZ1bmN0aW9uIHdyaXRlRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKFxud3JpdGVyLFxuZW50cmllc0NvdW50LFxuY2VudHJhbERpcmVjdG9yeVN0YXJ0LFxuY2VudHJhbERpcmVjdG9yeUxlbmd0aCxcbmNvbW1lbnRCeXRlcylcbntcbndyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbndyaXRlci53cml0ZVVpbnQxNigwLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KDAsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZW50cmllc0NvdW50LHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGVudHJpZXNDb3VudCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihjZW50cmFsRGlyZWN0b3J5TGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGNlbnRyYWxEaXJlY3RvcnlTdGFydCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihjb21tZW50Qnl0ZXMubGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlKGNvbW1lbnRCeXRlcyk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7QXJyYXk8RmlsZVJlY29yZD59IHJlY29yZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tZW50XG4gKi9cbmZ1bmN0aW9uICAgICAgICB3cml0ZVppcFJlY29yZHMod3JpdGVyLHJlY29yZHMsY29tbWVudD0nJyl7XG4vKiBXcml0ZSByZWNvcmRzIHdpdGggbG9jYWwgaGVhZGVycy4qL1xuY29uc3QgbG9jYXRvcnM9W107XG5mb3IobGV0IGk9MDtpPHJlY29yZHMubGVuZ3RoO2krPTEpe1xubG9jYXRvcnMucHVzaCh3cml0ZUZpbGUod3JpdGVyLHJlY29yZHNbaV0pKTtcbiB9XG5cbi8qIHdyaXRlQ2VudHJhbERpcmVjdG9yeSovXG5jb25zdCBjZW50cmFsRGlyZWN0b3J5U3RhcnQ9d3JpdGVyLmluZGV4O1xuZm9yKGxldCBpPTA7aTxsb2NhdG9ycy5sZW5ndGg7aSs9MSl7XG53cml0ZUNlbnRyYWxGaWxlSGVhZGVyKHdyaXRlcixyZWNvcmRzW2ldLGxvY2F0b3JzW2ldKTtcbiB9XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5TGVuZ3RoPXdyaXRlci5pbmRleC1jZW50cmFsRGlyZWN0b3J5U3RhcnQ7XG5cbmNvbnN0IGNvbW1lbnRCeXRlcz10ZXh0RW5jb2Rlci5lbmNvZGUoY29tbWVudCk7XG5cbi8qIFdyaXRlIGNlbnRyYWwgZGlyZWN0b3J5IGVuZC4qL1xud3JpdGVFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoXG53cml0ZXIsXG5yZWNvcmRzLmxlbmd0aCxcbmNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbmNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsXG5jb21tZW50Qnl0ZXMpO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkFyY2hpdmVkRmlsZX0gZmlsZVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5VbmNvbXByZXNzZWRGaWxlfVxuICovXG5mdW5jdGlvbiBlbmNvZGVGaWxlKGZpbGUpe1xuY29uc3QgbmFtZT10ZXh0RW5jb2Rlci5lbmNvZGUoZmlsZS5uYW1lLnJlcGxhY2UoL1xcXFwvZywnLycpKTtcbmNvbnN0IGNvbW1lbnQ9dGV4dEVuY29kZXIuZW5jb2RlKGZpbGUuY29tbWVudCk7XG5yZXR1cm57XG5uYW1lLFxubW9kZTpmaWxlLm1vZGUsXG5kYXRlOmZpbGUuZGF0ZSxcbmNvbnRlbnQ6ZmlsZS5jb250ZW50LFxuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVW5jb21wcmVzc2VkRmlsZX0gZmlsZVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NGaWxlV2l0aFN0b3JlKGZpbGUpe1xucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY3JjMzI6Y3JjMzIoZmlsZS5jb250ZW50KSxcbmNvbXByZXNzaW9uTWV0aG9kOmNvbXByZXNzaW9uLlNUT1JFLFxuY29tcHJlc3NlZExlbmd0aDpmaWxlLmNvbnRlbnQubGVuZ3RoLFxudW5jb21wcmVzc2VkTGVuZ3RoOmZpbGUuY29udGVudC5sZW5ndGgsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBDb21wdXRlcyBaaXAgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIGZpZWxkIGZyb20gYSBVTklYIG1vZGUgZm9yIGEgZmlsZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbW9kZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhtb2RlKXtcbnJldHVybihtb2RlJjBvNzc3fDBvMTAwMDAwKTw8MTY7XG4gfVxuXG4vKiBUT0RPIEFkZCBzdXBwb3J0IGZvciBkaXJlY3RvcnkgcmVjb3Jkcy4qL1xuLyogLyoqKi9cbi8qICogQHBhcmFtIHtudW1iZXJ9IG1vZGUqL1xuLyogKiBAcmV0dXJuIHtudW1iZXJ9Ki9cbi8qICpYLyovXG4vKiBmdW5jdGlvbiBleHRlcm5hbERpcmVjdG9yeUF0dHJpYnV0ZXMobW9kZSkgeyovXG4vKiAvLyBUaGUgMHgxMCBpcyB0aGUgRE9TIGRpcmVjdG9yeSBhdHRyaWJ1dGUsIHdoaWNoIGlzIHNldCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtLiovXG4vKiByZXR1cm4gKChtb2RlICYgMG83NzcpIHwgMG80MDAwMCkgPDwgMTYgfCAweDEwOyovXG4vKiB9Ki9cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db21wcmVzc2VkRmlsZX0gZmlsZVxuICogQHJldHVybnMge0ZpbGVSZWNvcmR9XG4gKi9cbmZ1bmN0aW9uIG1ha2VGaWxlUmVjb3JkKGZpbGUpe1xucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5jZW50cmFsTmFtZTpmaWxlLm5hbWUsXG5tYWRlQnk6VU5JWCxcbnZlcnNpb246VU5JWF9WRVJTSU9OLFxudmVyc2lvbk5lZWRlZDowLC8qIFRPRE8gdGhpcyBpcyBwcm9iYWJseSB0b28gbGF4LiovXG5iaXRGbGFnOjAsXG5jb21wcmVzc2lvbk1ldGhvZDpjb21wcmVzc2lvbi5TVE9SRSxcbmRhdGU6ZmlsZS5kYXRlLFxuY3JjMzI6ZmlsZS5jcmMzMixcbmNvbXByZXNzZWRMZW5ndGg6ZmlsZS5jb21wcmVzc2VkTGVuZ3RoLFxudW5jb21wcmVzc2VkTGVuZ3RoOmZpbGUudW5jb21wcmVzc2VkTGVuZ3RoLFxuZGlza051bWJlclN0YXJ0OjAsXG5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzOjAsXG5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzOmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMoZmlsZS5tb2RlKSxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50LFxuY29udGVudDpmaWxlLmNvbnRlbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7QXJyYXk8WGltcG9ydCgnLi90eXBlcy5qcycpLkFyY2hpdmVkRmlsZT59IGZpbGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudFxuICovXG5mdW5jdGlvbiAgICAgICAgd3JpdGVaaXAod3JpdGVyLGZpbGVzLGNvbW1lbnQ9Jycpe1xuY29uc3QgZW5jb2RlZEZpbGVzPWZpbGVzLm1hcChlbmNvZGVGaWxlKTtcbmNvbnN0IGNvbXByZXNzZWRGaWxlcz1lbmNvZGVkRmlsZXMubWFwKGNvbXByZXNzRmlsZVdpdGhTdG9yZSk7XG4vKiBUT0RPIGNvbGxhdGUgZGlyZWN0b3J5UmVjb3JkcyBmcm9tIGZpbGUgYmFzZXMuKi9cbmNvbnN0IGZpbGVSZWNvcmRzPWNvbXByZXNzZWRGaWxlcy5tYXAobWFrZUZpbGVSZWNvcmQpO1xud3JpdGVaaXBSZWNvcmRzKHdyaXRlcixmaWxlUmVjb3Jkcyxjb21tZW50KTtcbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsid3JpdGVaaXBSZWNvcmRzIjpbIndyaXRlWmlwUmVjb3JkcyJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADnCVhiLAcAACwHAAAfAAAAQGVuZG8vemlwLXYwLjIuMzEvc3JjL3JlYWRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci1yZWFkZXIuanMiLCIuL2Zvcm1hdC1yZWFkZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBSZWFkZXIiLCJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEJ1ZmZlclJlYWRlcixyZWFkWmlwRm9ybWF0OyRo4oCNX2ltcG9ydHMoW1tcIi4vYnVmZmVyLXJlYWRlci5qc1wiLCBbW1wiQnVmZmVyUmVhZGVyXCIsIFskaOKAjV9hID0+IChCdWZmZXJSZWFkZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9mb3JtYXQtcmVhZGVyLmpzXCIsIFtbXCJyZWFkWmlwXCIsIFskaOKAjV9hID0+IChyZWFkWmlwRm9ybWF0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNsYXNzICAgICAgICBaaXBSZWFkZXJ7XG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm5hbWVdXG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoZGF0YSxvcHRpb25zPXt9KXtcbmNvbnN0e25hbWU9Jzx1bmtub3duPid9PW9wdGlvbnM7XG5jb25zdCByZWFkZXI9bmV3IEJ1ZmZlclJlYWRlcihkYXRhKTtcbnRoaXMuZmlsZXM9cmVhZFppcEZvcm1hdChyZWFkZXIpO1xudGhpcy5uYW1lPW5hbWU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgIHJlYWQobmFtZSl7XG5jb25zdCBmaWxlPXRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuaWYoZmlsZT09PXVuZGVmaW5lZCl7XG50aHJvdyBuZXcgRXJyb3IoIGBDYW5ub3QgZmluZCBmaWxlICR7bmFtZX0gaW4gWmlwIGZpbGUgJHt0aGlzLm5hbWV9YCk7XG4gfVxucmV0dXJuIGZpbGUuY29udGVudDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXJjaGl2ZWRTdGF0PX1cbiAqL1xuICAgIHN0YXQobmFtZSl7XG5jb25zdCBmaWxlPXRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuaWYoZmlsZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybntcbnR5cGU6ZmlsZS50eXBlLFxubW9kZTpmaWxlLm1vZGUsXG5kYXRlOmZpbGUuZGF0ZSxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50fTtcblxuIH19XG5cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8WGltcG9ydCgnLi90eXBlcy5qcycpLkFyY2hpdmVSZWFkZXI+fVxuICovJGjigI1fb25jZS4gWmlwUmVhZGVyKFppcFJlYWRlcik7XG5jb25zdCAgICAgICAgcmVhZFppcD1hc3luYyhkYXRhLGxvY2F0aW9uKT0+e1xuY29uc3QgcmVhZGVyPW5ldyBaaXBSZWFkZXIoZGF0YSx7bmFtZTpsb2NhdGlvbn0pO1xuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZEZufSAqL1xuY29uc3QgcmVhZD1hc3luYyhwYXRoKT0+cmVhZGVyLnJlYWQocGF0aCk7XG5yZXR1cm57cmVhZH07XG4gfTskaOKAjV9vbmNlLnJlYWRaaXAocmVhZFppcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwUmVhZGVyIjpbIlppcFJlYWRlciJdLCJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEDREGrYGAAC2BgAAIgAAAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9zaWduYXR1cmUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkNFTlRSQUxfRElSRUNUT1JZX0VORCIsIkNFTlRSQUxfRklMRV9IRUFERVIiLCJEQVRBX0RFU0NSSVBUT1IiLCJMT0NBTF9GSUxFX0hFQURFUiIsIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCIsIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyogZXNsaW50IG5vLWJpdHdpc2U6IFtcIm9mZlwiXSAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG5mdW5jdGlvbiB1KHN0cmluZyl7XG5jb25zdCBhcnJheT1uZXcgVWludDhBcnJheShzdHJpbmcubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8c3RyaW5nLmxlbmd0aDtpKz0xKXtcbmFycmF5W2ldPXN0cmluZy5jaGFyQ29kZUF0KGkpJjB4ZmY7XG4gfVxucmV0dXJuIGFycmF5O1xuIH1cblxuY29uc3QgICAgICAgIExPQ0FMX0ZJTEVfSEVBREVSPXUoJ1BLXFx4MDNcXHgwNCcpOyRo4oCNX29uY2UuTE9DQUxfRklMRV9IRUFERVIoTE9DQUxfRklMRV9IRUFERVIpO1xuY29uc3QgICAgICAgIENFTlRSQUxfRklMRV9IRUFERVI9dSgnUEtcXHgwMVxceDAyJyk7JGjigI1fb25jZS5DRU5UUkFMX0ZJTEVfSEVBREVSKENFTlRSQUxfRklMRV9IRUFERVIpO1xuY29uc3QgICAgICAgIENFTlRSQUxfRElSRUNUT1JZX0VORD11KCdQS1xceDA1XFx4MDYnKTskaOKAjV9vbmNlLkNFTlRSQUxfRElSRUNUT1JZX0VORChDRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuY29uc3QgICAgICAgIFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1I9dSgnUEtcXHgwNlxceDA3Jyk7JGjigI1fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuY29uc3QgICAgICAgIFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORD11KCdQS1xceDA2XFx4MDYnKTskaOKAjV9vbmNlLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORChaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuY29uc3QgICAgICAgIERBVEFfREVTQ1JJUFRPUj11KCdQS1xceDA3XFx4MDgnKTskaOKAjV9vbmNlLkRBVEFfREVTQ1JJUFRPUihEQVRBX0RFU0NSSVBUT1IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkxPQ0FMX0ZJTEVfSEVBREVSIjpbIkxPQ0FMX0ZJTEVfSEVBREVSIl0sIkNFTlRSQUxfRklMRV9IRUFERVIiOlsiQ0VOVFJBTF9GSUxFX0hFQURFUiJdLCJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiOlsiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIl0sIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiOlsiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiJdLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiOlsiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIl0sIkRBVEFfREVTQ1JJUFRPUiI6WyJEQVRBX0RFU0NSSVBUT1IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAHgAAAEBlbmRvL3ppcC12MC4yLjMxL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACD2SsWWAcAAFgHAAAfAAAAQGVuZG8vemlwLXYwLjIuMzEvc3JjL3dyaXRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci13cml0ZXIuanMiLCIuL2Zvcm1hdC13cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBXcml0ZXIiLCJ3cml0ZVppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBCdWZmZXJXcml0ZXIsd3JpdGVaaXBGb3JtYXQ7JGjigI1faW1wb3J0cyhbW1wiLi9idWZmZXItd3JpdGVyLmpzXCIsIFtbXCJCdWZmZXJXcml0ZXJcIiwgWyRo4oCNX2EgPT4gKEJ1ZmZlcldyaXRlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2Zvcm1hdC13cml0ZXIuanNcIiwgW1tcIndyaXRlWmlwXCIsIFskaOKAjV9hID0+ICh3cml0ZVppcEZvcm1hdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jbGFzcyAgICAgICAgWmlwV3JpdGVye1xuLyoqXG4gKiBAcGFyYW0ge3tcbiAqICAgZGF0ZTogRGF0ZSxcbiAqIH19IG9wdGlvbnNcbiAqL1xuICAgICAgICAgICBjb25zdHJ1Y3RvcihvcHRpb25zPXtkYXRlOm5ldyBEYXRlKCl9KXtcbmNvbnN0e2RhdGV9PW9wdGlvbnM7XG4vKiogdHlwZSB7TWFwPHN0cmluZywgWkZpbGU+fSAqL1xudGhpcy5maWxlcz1uZXcgTWFwKCk7XG50aGlzLmRhdGU9ZGF0ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gY29udGVudFxuICogQHBhcmFtIHt7XG4gKiAgIG1vZGU/OiBudW1iZXIsXG4gKiAgIGRhdGU/OiBEYXRlLFxuICogICBjb21tZW50Pzogc3RyaW5nLFxuICogfX0gW29wdGlvbnNdXG4gKi9cbiAgICAgd3JpdGUobmFtZSxjb250ZW50LG9wdGlvbnM9e30pe1xuY29uc3R7bW9kZT0wbzY0NCxkYXRlPXVuZGVmaW5lZCxjb21tZW50PScnfT1vcHRpb25zO1xuaWYoIWNvbnRlbnQpe1xudGhyb3cgbmV3IEVycm9yKCBgWmlwV3JpdGVyIHdyaXRlIHJlcXVpcmVzIGNvbnRlbnQgZm9yICR7bmFtZX1gKTtcbiB9XG50aGlzLmZpbGVzLnNldChuYW1lLHtcbm5hbWUsXG5tb2RlLFxuZGF0ZSxcbmNvbnRlbnQsXG5jb21tZW50fSk7XG5cbiB9XG5cbi8qKlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICAgICAgc25hcHNob3QoKXtcbmNvbnN0IHdyaXRlcj1uZXcgQnVmZmVyV3JpdGVyKCk7XG53cml0ZVppcEZvcm1hdCh3cml0ZXIsQXJyYXkuZnJvbSh0aGlzLmZpbGVzLnZhbHVlcygpKSk7XG5yZXR1cm4gd3JpdGVyLnN1YmFycmF5KCk7XG4gfX1cblxuXG4vKipcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXJjaGl2ZVdyaXRlcn1cbiAqLyRo4oCNX29uY2UuIFppcFdyaXRlcihaaXBXcml0ZXIpO1xuY29uc3QgICAgICAgIHdyaXRlWmlwPSgpPT57XG5jb25zdCB3cml0ZXI9bmV3IFppcFdyaXRlcigpO1xuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuV3JpdGVGbn0gKi9cbmNvbnN0IHdyaXRlPWFzeW5jKHBhdGgsZGF0YSk9PntcbndyaXRlci53cml0ZShwYXRoLGRhdGEpO1xuIH07XG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbmFwc2hvdEZufSAqL1xuY29uc3Qgc25hcHNob3Q9YXN5bmMoKT0+d3JpdGVyLnNuYXBzaG90KCk7XG5yZXR1cm57d3JpdGUsc25hcHNob3R9O1xuIH07JGjigI1fb25jZS53cml0ZVppcCh3cml0ZVppcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwV3JpdGVyIjpbIlppcFdyaXRlciJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAABll2nctfQAALX0AABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAMLdTGB7BAAAewQAACkAAAAAAAAAAAAAAKSBX30AAEBhZ29yaWMvc3Bhd25lci12MC42Ljgvc3JjL3ZhdC1zcGF3bmVkLmpzUEsBAh4DCgAAAAAAAAAAAPeeGjzrAgAA6wIAABwAAAAAAAAAAAAAAKSBIYIAAEBlbmRvL2Jhc2U2NC12MC4yLjMxL2F0b2IuanNQSwECHgMKAAAAAAAAAAAAeSSJm40DAACNAwAAHAAAAAAAAAAAAAAApIFGhQAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvYnRvYS5qc1BLAQIeAwoAAAAAAAAAAAB02udwlQEAAJUBAAAeAAAAAAAAAAAAAACkgQ2JAABAZW5kby9iYXNlNjQtdjAuMi4zMS9kZWNvZGUuanNQSwECHgMKAAAAAAAAAAAAR0NulpUBAACVAQAAHgAAAAAAAAAAAAAApIHeigAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAAFdxbOCAAgAAgAIAAB0AAAAAAAAAAAAAAKSBr4wAAEBlbmRvL2Jhc2U2NC12MC4yLjMxL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAACgOckADBAAAAwQAACIAAAAAAAAAAAAAAKSBao8AAEBlbmRvL2Jhc2U2NC12MC4yLjMxL3NyYy9jb21tb24uanNQSwECHgMKAAAAAAAAAAAAku2UZHwJAAB8CQAAIgAAAAAAAAAAAAAApIGtkwAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvc3JjL2RlY29kZS5qc1BLAQIeAwoAAAAAAAAAAAAan6AA5gcAAOYHAAAiAAAAAAAAAAAAAACkgWmdAABAZW5kby9iYXNlNjQtdjAuMi4zMS9zcmMvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAAPz0xDYEAgAABAIAADEAAAAAAAAAAAAAAKSBj6UAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvaW1wb3J0LWFyY2hpdmUuanNQSwECHgMKAAAAAAAAAAAAkOvpSnUxAAB1MQAANgAAAAAAAAAAAAAApIHipwAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvY29tcGFydG1lbnQtbWFwLmpzUEsBAh4DCgAAAAAAAAAAAGXmA7B8AwAAfAMAADAAAAAAAAAAAAAAAKSBq9kAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL2V4dGVuc2lvbi5qc1BLAQIeAwoAAAAAAAAAAACwzYs0zicAAM4nAAA1AAAAAAAAAAAAAACkgXXdAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAADFQABzSQMAAEkDAAArAAAAAAAAAAAAAACkgZYFAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9qc29uLmpzUEsBAh4DCgAAAAAAAAAAALqueymAOwAAgDsAACsAAAAAAAAAAAAAAKSBKAkBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL2xpbmsuanNQSwECHgMKAAAAAAAAAAAAOmXnMeQUAADkFAAAPAAAAAAAAAAAAAAApIHxRAEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAABg7dpuBQAAbgUAADIAAAAAAAAAAAAAAKSBL1oBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL3BhcnNlLWJ5dGVzLmpzUEsBAh4DCgAAAAAAAAAAAHVKlkFOFgAAThYAAEYAAAAAAAAAAAAAAKSB7V8BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanNQSwECHgMKAAAAAAAAAAAAC91345EFAACRBQAAMQAAAAAAAAAAAAAApIGfdgEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcGFyc2UtanNvbi5qc1BLAQIeAwoAAAAAAAAAAADGORBhdwcAAHcHAAA0AAAAAAAAAAAAAACkgX98AQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wYXJzZS1wcmUtY2pzLmpzUEsBAh4DCgAAAAAAAAAAAKuk9dWGBAAAhgQAADQAAAAAAAAAAAAAAKSBSIQBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL3BhcnNlLXByZS1tanMuanNQSwECHgMKAAAAAAAAAAAA5CIY3ysFAAArBQAAMQAAAAAAAAAAAAAApIEgiQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcGFyc2UtdGV4dC5qc1BLAQIeAwoAAAAAAAAAAACmnhiXUhgAAFIYAAA0AAAAAAAAAAAAAACkgZqOAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wb2xpY3ktZm9ybWF0LmpzUEsBAh4DCgAAAAAAAAAAAJqOx8Z4PAAAeDwAAC0AAAAAAAAAAAAAAKSBPqcBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL3BvbGljeS5qc1BLAQIeAwoAAAAAAAAAAABBcXe9jQMAAI0DAAAtAAAAAAAAAAAAAACkgQHkAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wb3dlcnMuanNQSwECHgMKAAAAAAAAAAAAfiRuLdIRAADSEQAAJAAAAAAAAAAAAAAApIHZ5wEAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yL3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAADcL7U8fAgAAHwIAACoAAAAAAAAAAAAAAKSB7fkBAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAAChWCM/jxAAAI8QAAAuAAAAAAAAAAAAAACkgVT8AQBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAP0lSmYLDAAACwwAADUAAAAAAAAAAAAAAKSBLw0CAEBlbmRvL2ltcG9ydC1idW5kbGUtdjAuMy40L3NyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzUEsBAh4DCgAAAAAAAAAAADGsxYBZEwAAWRMAACcAAAAAAAAAAAAAAKSBjRkCAEBlbmRvL2ltcG9ydC1idW5kbGUtdjAuMy40L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACljzr3SgcAAEoHAAAdAAAAAAAAAAAAAACkgSstAgBAZW5kby9tYXJzaGFsLXYwLjguNS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAANCCZ7lA0AAJQNAAArAAAAAAAAAAAAAACkgbA0AgBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAADtyz4DkPwAA5D8AACoAAAAAAAAAAAAAAKSBjUICAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAADEU6fw/D8AAPw/AAArAAAAAAAAAAAAAACkgbmCAgBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzUEsBAh4DCgAAAAAAAAAAALNe92vFOwAAxTsAAC0AAAAAAAAAAAAAAKSB/sICAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc1BLAQIeAwoAAAAAAAAAAAAIQpL9rCoAAKwqAAAqAAAAAAAAAAAAAACkgQ7/AgBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvbWFyc2hhbC1qdXN0aW4uanNQSwECHgMKAAAAAAAAAAAAE9PVG9wGAADcBgAALQAAAAAAAAAAAAAApIECKgMAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAAL6eaUrsMgAA7DIAACMAAAAAAAAAAAAAAKSBKTEDAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAFdEZAp+QAAAfkAAACUAAAAAAAAAAAAAAKSBVmQDAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAIQAAAAAAAAAAAAAApIEXpQMAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAACUem73PCwAAzwsAAB4AAAAAAAAAAAAAAKSBiqYDAEBlbmRvL25hdC12NC4xLjI3L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABl8owafAgAAHwIAAAgAAAAAAAAAAAAAACkgZWyAwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADeRraqkwcAAJMHAAAoAAAAAAAAAAAAAACkgU+7AwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAAIP12yzPBwAAzwcAACkAAAAAAAAAAAAAAKSBKMMDAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAANOgOHGdEQAAnREAACQAAAAAAAAAAAAAAKSBPssDAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9lcnJvci5qc1BLAQIeAwoAAAAAAAAAAABKO2aDVQgAAFUIAAArAAAAAAAAAAAAAACkgR3dAwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvaXRlci1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAGJNZwNOGgAAThoAACcAAAAAAAAAAAAAAKSBu+UDAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9tYWtlLWZhci5qc1BLAQIeAwoAAAAAAAAAAAACkXvlHQQAAB0EAAApAAAAAAAAAAAAAACkgU4ABABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvbWFrZVRhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAAZQCjG9RkAAPUZAAAwAAAAAAAAAAAAAACkgbIEBABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAALm6xDYMbAACDGwAAKgAAAAAAAAAAAAAApIH1HgQAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAABSxon3DIQAAwyEAACgAAAAAAAAAAAAAAKSBwDoEAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAANeJOipoPAACaDwAAKwAAAAAAAAAAAAAApIHJXAQAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3NhZmUtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAADHH9VQRxIAAEcSAAAlAAAAAAAAAAAAAACkgaxsBABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvc3ltYm9sLmpzUEsBAh4DCgAAAAAAAAAAACW8XPv9BwAA/QcAACUAAAAAAAAAAAAAAKSBNn8EAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90YWdnZWQuanNQSwECHgMKAAAAAAAAAAAAeqB+aBINAAASDQAAKQAAAAAAAAAAAAAApIF2hwQAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAJAAAAAAAAAAAAAAApIHPlAQAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAApSvp9wCQAAcAkAACIAAAAAAAAAAAAAAKSBRZYEAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAiH2BrN8CAADfAgAAKwAAAAAAAAAAAAAApIH1nwQAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAAdp03rvhIAAL4SAAAqAAAAAAAAAAAAAACkgR2jBABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9tZW1vLXJhY2UuanNQSwECHgMKAAAAAAAAAAAA00Ow7mkHAABpBwAANQAAAAAAAAAAAAAApIEjtgQAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAJgAAAAAAAAAAAAAApIHfvQQAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAkg0vx3YCAAB2AgAAGgAAAAAAAAAAAAAApIFXvwQAQGVuZG8vemlwLXYwLjIuMzEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAmpC7DdcXAADXFwAAJgAAAAAAAAAAAAAApIEFwgQAQGVuZG8vemlwLXYwLjIuMzEvc3JjL2J1ZmZlci1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAf7Ujt+kQAADpEAAAJgAAAAAAAAAAAAAApIEg2gQAQGVuZG8vemlwLXYwLjIuMzEvc3JjL2J1ZmZlci13cml0ZXIuanNQSwECHgMKAAAAAAAAAAAAoKCVXcMBAADDAQAAJAAAAAAAAAAAAAAApIFN6wQAQGVuZG8vemlwLXYwLjIuMzEvc3JjL2NvbXByZXNzaW9uLmpzUEsBAh4DCgAAAAAAAAAAAB/iuys/BQAAPwUAAB4AAAAAAAAAAAAAAKSBUu0EAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9jcmMzMi5qc1BLAQIeAwoAAAAAAAAAAAAXyFLuJDQAACQ0AAAmAAAAAAAAAAAAAACkgc3yBABAZW5kby96aXAtdjAuMi4zMS9zcmMvZm9ybWF0LXJlYWRlci5qc1BLAQIeAwoAAAAAAAAAAADek343pRsAAKUbAAAmAAAAAAAAAAAAAACkgTUnBQBAZW5kby96aXAtdjAuMi4zMS9zcmMvZm9ybWF0LXdyaXRlci5qc1BLAQIeAwoAAAAAAAAAAADnCVhiLAcAACwHAAAfAAAAAAAAAAAAAACkgR5DBQBAZW5kby96aXAtdjAuMi4zMS9zcmMvcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAABA0RBq2BgAAtgYAACIAAAAAAAAAAAAAAKSBh0oFAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9zaWduYXR1cmUuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAHgAAAAAAAAAAAAAApIF9UQUAQGVuZG8vemlwLXYwLjIuMzEvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAIPZKxZYBwAAWAcAAB8AAAAAAAAAAAAAAKSB7VIFAEBlbmRvL3ppcC12MC4yLjMxL3NyYy93cml0ZXIuanNQSwUGAAAAAEkASQCYGAAAgloFAAAA","endoZipBase64Sha512":"f43dc56e2e260e786d5777f3df1fc4d20b8e14e59627ab7c8a5954530947fef1ca68c3368380292c0c1065cf7956e5c2cf3bb64fd71487fe4dd09f4471f67987"};
1
+ export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAAxAzdQS30AAEt9AAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3Bhd25lci12MC42LjktdTExLjAiLAogICAgIm1vZHVsZSI6ICIuL3NyYy92YXQtc3Bhd25lZC5qcyIKICB9LAogICJjb21wYXJ0bWVudHMiOiB7CiAgICAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MTEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9zcGF3bmVyIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3Bhd25lci12MC42LjktdTExLjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOS11MTEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zcGF3bmVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3Bhd25lci12MC42LjktdTExLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdEhvc3QuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtc3Bhd25lZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LXNwYXduZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NTYwMmRiZGI2ODc3YmNhNmQ0YmRiZDVlN2I2YzVhODcyNzA4NWQyOTBmMDk3YjFmYTJkMWJjMDQxZDlhNDA5OTI2N2U3OTQ5MWI4OGJlNmNjZWJhMjU5MDE4MDRhODNiYzgxODU4OTA4Yzc4Y2MyN2M1NzQ4NmU2YmYyM2RjNSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Jhc2U2NCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9iYXNlNjQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9hdG9iLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hdG9iLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9idG9hLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idG9hLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9kZWNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZW5jb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vYXRvYi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJhdG9iLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzYxNjA5NWU2NTVmYWRmYTg0YmM2MDNkNmJlYmVhYWRkOTgwYTU5ODhiZThkMjgxMjdhYTJlYzdkNjU3ZWNkN2FmZTBiODgyY2FmNDA1MzIwYWQxMGY4YmZlNjAwYTcyNzJhYTgzYmM2MWMyN2Q1ZWRhOTEwYWYzZjQ2YjFlYzMiCiAgICAgICAgfSwKICAgICAgICAiLi9idG9hLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImJ0b2EuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMGIxYzZlMzllYWQ5NmE4YjhlN2EyMTdhYWNjNDAzODMwOThmZDg3ODUzNTFlZWE0Y2M5OTQ5YTc1MGJkMmNlMzY2ZDRiOWFlMjAwNzk4ODBmMDdhNWM4ODM0MmEyNTlhZTJjZTAyZmQ5NTQyNTkzOTFmNWFkNTExNDRjMWM2NCIKICAgICAgICB9LAogICAgICAgICIuL2RlY29kZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJkZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3OTE4ZjU2Y2E5OTZlNTU4ZTVkMGYwYWEwMmMxZDdhYTc4NzFiYjBmNmJkMGNmNTYyZTI3YjdlZWViY2U1ZTg4OGU4ZjVlZGM5YjM0MmMyZGRiZWNjZTNkNTU1NmVmYThmODYxOGNiMjgwYzI2ZDM5MDVhN2I4N2UzMGM2ZTQ4MiIKICAgICAgICB9LAogICAgICAgICIuL2VuY29kZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJlbmNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNGM1YzczYTgxZDViNmEwZjA5ZTg2ZGI1NGRmMjIyZDA2NDU0NzBlZTVjMGNmNjIxNTAzYmNjOTMwODZmODg1ZWFmNjgyMzQyZDk0Yzc5MjExNGI0ZjEyYTJmZTE4ZjMxNTgzNjVmODYyMzY2ZDdjYzRjZGFiNTkwNmZhMmVkZSIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTYwZTE2MDRiYzZiNWQ1NmU4NjY4NWM3ODMxMDNkMjlhOTU1YzQxOGFiMjcxNjA1Y2IwZmJkZjgzM2M2Y2ZmOGE4NmM3YjZjZjA3MTQ1NjFlODFjOGQxYmE3YmU1MWMxMGE1NWY5ZTJiMjc4NGVhYTBiODk0YWFhOGUxOWNjOTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tbW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb21tb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NDAxZGRjM2MzYjg3MTI0N2UyYmMzN2I0YTYzNDkzZDg0ZWUzODI3NDllZDY5Mjg1MWQyYWNkZDhhZTUxZmY0YjAzYzAyZmZjYTA2NGQ4OWEyYjQwZjMwMjc3ZWU5NzI3MDUzNzc1NjQzNTcyOTZmYjAzODZjZWZkZGFmMWQ2ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJkZWYxZjc3ZmM1NjJjZjk0OGQyNjZjOTdlYWFjZWFhNjUxN2FjNGQ3MWYxMDU1NDI1ODVjZGU3N2M5NzljYTBkY2ViYzZlMmY1ODk1MTIzZTkwNWY0ZThkNmQyMTBiZWM2YjQ4YmUzYmVmZWQxMGZhMDIxNGFlODc3MWNlZDUxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDNjMzdlMjliNjIyNTQ5NDBkZDhiMWQ5MjA0YzE0MzhlNjU2MDY1YWM4YTZjNTk4ZTMzZWI3YzcwNDg2NDlhYThiZTUzNGMwY2MxYTE4ZmE1ODkyZjUzNzc1NDY2ZGQ0NzZjYTk3ZmM0NjFlOGFiNjZjMGYyYWEwOTBlYjA1NWMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY2pzLW1vZHVsZS1hbmFseXplciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyLXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXIvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXItdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQtdjAuNy4xOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RhdGljLW1vZHVsZS1yZWNvcmQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0YXRpYy1tb2R1bGUtcmVjb3JkLXYwLjcuMTkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvcmVhZGVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9yZWFkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vd3JpdGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICIuL2ltcG9ydC1hcmNoaXZlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImltcG9ydC1hcmNoaXZlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjE4MmQ1NTNiZTJkZTA5NDBlZGNkN2E3YzRhMWEzN2U1NWYyNmY1NGU2Njk4MmRiZDUzNWZlYjY5YjZlZWI4MGM1ZjFiZDU0OWFkOTdjNjcwODhkNTA2NWUwYjNlZjYzZjJjOTEyYTc0YzliZWViN2ZkOTY1ZDU2M2M5ZGE5ZjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29tcGFydG1lbnQtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb21wYXJ0bWVudC1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNGRiMmUwZGVmYTIxZDRlNmNhMDFlNzQxNDliZjQwNzUyMDg4YTM0NzM2MzFiYmNhZTUxM2NmNGViYmM1YjE3NjExNDZkNDVmYjE3NmYxMzQ4MGI3MjYzMGQ1MDYxYTM5YTRmYjc1NDZiM2FmMjgwN2M0MTI4YjIyZjZjMWYzOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHRlbnNpb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4dGVuc2lvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEwZWQ3ZWYyMzNjNGEzMTlmZmJjODYwNDBjNmYyOTYwNDYyZTMzOGEyYjY3MTgxOTk4ZjExODI5MTg0OTNmODhlMjJkMDU1MjgzOTFjYTQ5NDE4NmExYjZhZmUzNTJlYWEzNDk3YjY5OWM2Njg3NDViNjc1ODA5Y2U4YmU3NjZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbXBvcnQtYXJjaGl2ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZjYWJiOGViYmIzMWE3NGNjMDkxNDBmYzQ4YTlkYTJiODFmYzBkMmU2MDQzOTQxYWFhZWExMWEzY2E4MDViMjRmM2VmZmJiNDllYWM5ZGY4NmY0ZDU4OWIwZTgwZjY4MGQxMmZhNDVlNTViNDEwNDI3OGIyNzBhNGU3NDJhYTJlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2pzb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2pzb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ODkxMWE1NzdkNzA1M2UwZjZjYWI2MDkyMzhjY2U3MTY5YjQ5Mzc2NDRlYzZiZmI5OWU1ZjU1YmZjMTU3MTlhOTVlNTIwMWUzNmYzMDRiY2M4OWJjNWJhM2Y0ZjdlYWRmM2VjNzQ3ZTBmZTkwNWE5YWQ0ZTM4NGU0Nzc3MTlkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9saW5rLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9saW5rLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmQxODgxMmY4NjhiZjQxMmE0NjY3MzYyMjMwYzFmZWMyMWY3ZTk0YjE2ZGZiMjlmOTY5MjljMmU5ZGM1YzI1NWVmNDg5YTkzOTkxODA0NzI0MTU2ZWQ1MTg2YjYxZGMwZDY3ZjVmZDJkYjJkNTJjMDhmYjU2ZjczZDVhMmRiMDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMzgyNTAyZGFiNGNhNGE2NGRjNWY1ZmU1OGM2MjQzZjAyYjZiZjFlZTU3ZTYwYTNkNDc2OGE4NmQxNmIxYjIyOTNmMmU5ZDhjMzdjMjU5ZWJlYjExNjY1MzY2NTI5MzFjYjUyMzQyZWIwYTBmNGVkZmUyMTg2MWJiODVkMmNlZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1ieXRlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtYnl0ZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNTk2YWZkZDQ3MmExNjE2YjU5OTI4ZWM0ODAyMGM5Y2JlYzRiZDViOTEwOGYwNmI4N2Q3OGNkNDlkYjk2YWIzMDE4MDNhM2RmYTdiYTRmOGMxYzYzM2NiMDYzNGU2M2QzZmFmOGQ0NWJjZTQyNmU5Y2NmMWZiNmIyOTVmODRhNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWMzMmVhMjM5NDI3NTcyZDRlMmVhMjM3NTA0Y2YzNjcyNDYzZDQ3MzY2M2U1N2QyYjZkMjdhMDc5YjYyOWY2OTQ2ZTU2NDZiMDVhZmQ2MGI0OThjNjE5ZGQ1M2RmYTYxNDIyODYzYzA2MmFjZjkyMzA5NTEwMWU0Nzk0NjYzYzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtanNvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtanNvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEzMGU3YzU3NTUwOGNlYWIyYjk2NzExZjdlNDFhMmJkYzg5YjE2YjI2NGNkZTlkMTY2YjI2MDU2ZjZjNzE0MDIzNGYyOTViODQwMDJiZDE3ZjNmYTE3NmViNTYwYmU1YThmNDQ2OWRmODczY2VkMTNkZDhiZDJkNDU3Y2JiMjM0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXByZS1janMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXByZS1janMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZGY3YjdkY2VjNGJhNzEwZWM0MGVjM2RmNmFiNzg0MzlkNmY2N2E0ZDczMmE0NmU5MTc4YTEzYWI5MmE2YjFlNGIyNjcyYzJmN2NlMjBkNWEzZjJiY2Y3N2E4MTkyZWVkMDc4NDE0MTQyZDZjYTM1OGZlNDRmZjFmOTM4MmVmZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1wcmUtbWpzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1wcmUtbWpzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTg0YjQyNTgzZjhmNzIxZjNkZDNiODEyYmZlMTI5NWQ1Nzk1ZTY4OTc3OWY0ZjgwZmNiOGNlMzM3MDUzNjAzMmU4YTlhMDA2OWJkMDA1ZjM0YjVlNDRjODEyZTU3M2NlNjM3MjRlYWY0MDIxNWU1MjI0ODg0YWM5YzJkYWJlZjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtdGV4dC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtdGV4dC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJjNTJiNzExZGY2YzA5ZGU1NjNiMzQ5MjllMDIxYWY4NjZhNTM4MDJiOWIyZmQ3ZjFkZTRiMDBlMjk2YTJhMzBkYzIyNDY0OTA4ZTJiYWU1MmMxZjhjZDRmMTk3YjQwN2M3Yjg1YjA5NjAzNWI2NTdhNDM3MjRlODRlNDY2OTE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BvbGljeS1mb3JtYXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BvbGljeS1mb3JtYXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzM2Q5YmZiMjliN2VlNGYzODFlNzIyZmFiODFhNmY5YTExNzYwMGUyODYyM2UzNGMxMDhiODRlNzkxNDUxNWE3ZjAyZjdlZGJhYTkzMTY5MmYzYTFiOTEyZjhiYjEyYWQ5NTA3NjA4YjljNWQwNGU2MDk1MWIzZGU3ZTMxYjg0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb2xpY3kuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BvbGljeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI4ODY3NTI1MWZjNTEzNmY5ZTMwNzI5OGE5ZDNhMGU2YmUyNTQ5ZjhkMDA0NjBhZjE5MjJlYTVmZjJhMTZhZDBmZWQxNjc2MDcyZjgxOWRjZTE2ZDkwOTYwMjcxNWQxYjNmZWQ0NmViN2JkYTUwM2M4MTZmNGM2ZDhjMmNjYWNlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bvd2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG93ZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODkwYjRhOGQ0Y2RiNzQ0NWYyNjFlMjQwOGFkOGU1YjNjNGExY2M1NDgwZmYyMTg2NzAxZDNiZjdkYjhiNGQ1NjBjMTVlNTVmYTU3ZWU5ZDdjNDZhY2ViMzAxZTRlMDdlYWNmMDdhODM4YjM0ZDFjMTZkYzJkNzJkNDc1YmM5NGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzUzNjg0ODI2Y2I1NjYwOWY2MmI3ZDZiNGRlMzNkYWQyMmMyMGFkYWEyZWIzODgwMGMzNjRjZWM1MDk3MzgzZTk3M2YwNThiMzM1ZDRlNGM0ODAzMGU0MjhmN2I5OGRkYTJiZjIyODhkYmEzMDA4YWNiNTdiNGFlNzIyMDY0Y2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZlMjgyMDJjZWIyM2UwNjRkNWRjY2JlMDIxYWU3ZDFhNWZkY2NjMDIzNDI3MGRjNTYyNGZkOTFkZjIzNmY5MDdkY2M1ZDI1NDMyNmQxY2QzMmFjNTExNzYwMmQyZmEyMzllNmYzMjAzMzI4MmZkNjdlMjRmMWE3YTRkZTk1NjMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3OWQzYTI5ZWI3YmYzYmE4YTM5ZjJmOGFlZjg1MGE4YTljZmUxMGY5NTcyM2QyNzFkNDRlMjEyMmEyZThkMmRlNDk0MjZjMWM0ZDQ4Y2E1OWM4YmE2ZmYwZGY5Mjk5NTUyOGQzNDllZWZlMWQwZDUwM2JkZmE4MWY4NGZlZTZlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9iYXNlNjQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9hdG9iLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hdG9iLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9idG9hLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idG9hLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9kZWNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZW5jb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZjVkNjk2NjdmNjk5OTZjOWM3MzkyYWMwMGYzYTllYjgzZGRmMzExOTMyMWM1MmRkZWIzNzY2MDI4NDdmZTExNDFjY2JjOTQ3ZjI5NTA0NDE0Njk0MjA2NDA1ZjJmNjFlZWU4MmE2OGIwODFkMjQ4ZmNmOTYzNjQxMWZhNGNhOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzODQ5MWRmNjgwMDYwNmU4OTAyNzMwNTg4OWM5ZjEwNDI4M2IyYWZhZGJjMmIxZGFjMDVmYmZhNjBiZWVjYzIyZjcwZjYxZGViOTA0MTQ3MGI3ZmEwMGE0MzBiYTA3M2JkZGVlYWUwZmZkM2FlYmMxMjZjMWYwZGNhMjk3NWVkNyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MC44LjUiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZWMyZjc2YmZlZTM3ZjQ0YThkM2FmMjdiMjc4NjZhN2QzM2Y3ODY5ZWE4NzI4NWU0ZmNmZjFjM2QwNzY0YzFiYzNhNWRjMTc1MzFjNzFkMzNlMWVjNjRiNzU5NjBjYmFmN2ZlZWUwNGI3ZDVjZjMwNWJiODA0ZDMwNWE3ODBhNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUzNWE2OTYyZDcyZDlkMjQwNTFiOTc0OTkzMjMyNzE5ZWY2ZDk2NDhiYWVmMzgzMjJhNjM1ODcwMTE4ZDY4MmEzYzk2NjJiMTAyMDU3NWUzOGFiYWQwNmNkNTQzY2MyMWZmMTJkZWU1MWZhYTI0N2E2MzQ5NmE3ZDc3MjhjMjcyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRhMDJlYzFiMWIxM2VjOGUxZTdiZDc1ZmYwN2EwM2RlZWU1MTg4ZmNkNjIwMWU0YjVhMGNjNGZhNGI2MTU1M2VkMGUyYjgyNGI5MTMyYzVlZDlmZDcwOTAwYmFiMTZmZDNjMTRhNDcxYjAwM2MyNWNlMjYxYWY0MjAzMzFhZTQ5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWE4ZGQyYTJmZjhhYjA1ZDgxMjU4OTdmMTcyYWEwYTlmYTQyOTZkYWY4MjlmNDY4MjY3YjU5M2Q0NWE4NmMwZTQ3ODgyNGRkMGFiZjU1ZGYxOGQ4MGYxNzkwMzI2NDg2YTUzYzUwMGNmZDc1OTdmZDdiYjNmZmM1ODBmNTQ3ZjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2IyMzNhNWM1NjIyMjEyNGFhYjVkZTQ5ZTIxZjc2ZDY3YjZlM2NmMWRlMGYyNDVmMjFiODZiZmI0MzZjMDIwZjUwYzBjYzU5MGE5NmEwZGJhYTkzZTZkMzk0Mzk1NTgxZmU3NjkxNDkwMDM0NzU0NzU4ODJlMjIzYTY3MDM0NWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmI4MmQ1OTVkMmFmZDVkOWMwMmM1Y2JlMDJlN2Y3Yzk2MDg3YzYwY2QwOTA5MWI5OTc4MmJkOGE3YzEyNmIyMzkyNjJlOThkMGY0NjBhNDg5ODFiNWNmMzUxMWI3Yjc4Y2QwZjAwMWIyZmEwZTVlOTM4MTQzNWRhMTZkYjE2N2MiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmQ2MzJkNjRmNzYzOWRiMjc5MDA3NmY3ZjU5MzFiNDVjY2UyZDg0Mzg3Y2RhMmM3OGM5MWE0MjI5ZjgxNjM0NDE3NmJiNDcwMDhlMTk3NzA0ZjZiN2RhYWZkMjc0M2RlYjQ1YWQwNmM1YmM2Yjg4YzAzOGRmMGU2ZGZiYTI3ZjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQyNjE0NzA3MTRkNjVkMzNjZTZjOGRmZDlkYjRjY2JmY2E0YmM4OGIzMTk5OWJmMDE5N2I5NWJkMDI3M2ZjYWVjMzljNGU4NjY2OWY5NzcwYmE3MTJiMGI1YjZjZDIzMjNkNWJjNGJhMmY1MGM3YmUxZDU3MzdmZTlhNDdmNjAzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWYwODZhNjBjZDBmMzlkNzI2MGI4N2Y5YmEyMDAwNzJiMTlmYWNjNzRiY2MwYTYyNzZjZDBiMTBmYTM5ZDkxYzlmZTdlMzc5OGM3ODAwOGEwZmExYjI3Y2VjNDU2MjNlNWEyYWFlODFjNTQ1NjAzMGRkMTQ3NWI4OTUxZjEyYjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NC4xLjI3IjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyNTA4MmY0YzhjYTZhYTdlY2ZhYjkwYWMxMTY1YWZkNThjNzAwYzA1ZmI0NmMzODBhOGVhNDI3ZDBjYjdjMDJhZGIxMzM2MzUwYjczNDRmNjkyNTYxYzJhOThmYTI3ZmRkZDE5NGMzYTYxMzU1ZmZkODJiNGY3MzdlYmE5NDk5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saWIvZXNtL2F2YS1mYXN0LWNoZWNrLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBmYXN0LWNoZWNrL2F2YS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NmI3MzIwM2IzYWMxZTc2MDEwODcyZjE2NjQ1N2Q1NTUzMjhmNDU5Y2Y1MGE1NzJmZmEwMTA0MWVjMDkzM2E3ZjU3OTE3MGFjZTBiNmU3NmFmNzkyZTEyYmJiZTFhZjU1YmQ2ZDJjNjhjNGVmMTFiNDBkZGE5NGVmZGM2MWI3MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMzOGJiNjBmNzg1NGI0YTdiNjFhMWZkMzNiMjRhN2U5ZDA1OGRhNzkwZTZmMGEyOTY0NDNmNzA5ZjIwNmZlZjczMTUwYjdlMmRlZDc5OWM2MzliNTg4NDhkYzQ1YTRmM2ZjYWE5OWEwZjFlNzI1YTJhZDlhNDNkY2U2OTA4MzkxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NGI4MTI1ZDA5ZDczYjAyNWM4MzlmNjI1MWRjYzA2YTUzZGNkMjVhZTkxOGM5NzNlMzYwMTYxMTYzMDhhNDhjMTgzMGFkMzM4NzNkOWI4ZWVlMDZhZDUwYjgyOWQ0NTAzNmU4YzQ4NjAzNjM5ZTJhNTQ4MmVlMmJhOWNkZDMwZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NGU2MjcyN2NjYThjZjNjMmI1YTNhNzhhNWIyNzlmMzY3OTNhMzhkMzY3MTgxNTJhY2E1YjFlMTg2NjY1YjMwNjM4ZGQxMjRhMWJiOGNjOTQ0YzExMWE3MTI2ODZiNDRkMGY3Y2FhYjRmMmY1ZjAyNzNhMDRmNDI3NmYyNzM4YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ3NmViZjM0ZTczZDA1MDM5Mzc0N2U5ZWFmMzVkOTcwN2ExOTA1ZDRjYzFjNTEwYTRmMTllMTVmYzM1MGVjYjFkYjQ5YjJmNTFmODRmYWFlY2I5YjY3YWY1NDhhY2MyZTUxMmZhYjJmYTE2MTBiMzY4ZGQxYTE3OWVhMGYzMzRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ4ZWVkYTM2ZGVkY2FiY2VmZmE5ZjI2ZTYzNTI1ZTY4ODcxYTMyY2JlZGNkN2MxYWQ2YjZkNTk0MzY2YjI3MjQ4YzFkNDM2ZTFmOWRjZjNiMDk3MTA3ZTM4MDFkMjI5ODE0NDVjOGMzMzJjYmQwNTMwMDc1OTlkZTUzMmJhZjEyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZDBlNGJjNmU0N2UzZjY0Nzk0NmUxYTRiOWEwY2VhNjQ3YzM1MzA3ZTk1NTNlNThmM2MxMzIxNjE4MzZiOWQzYjhjN2U3MDFiM2U2ODYwNzFiNjAxZjRiMGI4MDIzMzI2ZjliYTQ4N2FlYzgwMjUyYzk1Y2FhZDhmZDk5NjE0MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0OTVhZWQ4NzRiNDk1NzY0OGYwZTU1YzhjNzU5MmRjN2UxYjY1MzA3OWUyNTg2NTk1YmRjZjg5MzdmNzIyYzJiZTg2N2FkY2ExNjNkMDQwNDMyNTEwNjYxMzBlMDJkZGM4Y2I3NjYzY2Y4ZDg3NjRiMTBiZjZhMjZhOTYyNGYxMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlT2YuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YzBjNzhiMDZmZmYyYjE3NWQ4NDNhOWIxM2ZmODczOTcwYzZjMmVlYjJlMGEyYTIwN2U5YWNiMjVhOWIwYTYyMWQ0ZWM4ZDIxZTBjY2E4ODNkMjAxMWJmZWUwN2Y3ZGI3MjhlMmVjMGI0NWIyNGQyNThlY2JmZTBkZWUwMDM1MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZW1vdGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1ODQyZmU4MjUxZDRlMDk2ZjEzY2JlNWViZjdlMGIzMGM2YjUzMGEwMGIzNGZhMDdiZTgwNGQ1ZDdiNDAwYTAyYjI2ZmY0MjY4YjE0ZGQ4NzdlOTZlMWFlMzNhZDA4ZWYyYWI4ODEyOTYzMmQ2Mjg3NTk1MmVhZmQwMTcyMTFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZS1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWI3MzQxZjg5ZWY3ZGFhNWEzYTAxODBlMWJmZjcxYzUyZDA4ODcxZWIwYWZjZTU3NzQ3MDNkOTUxODJkZDBjMDJjMDUwODMzZWY2MTk5YmYzMTJhYzVjMDJkYmU0NTIzZTRkOGEwZjE5NjkxMjVlYzc3NTk2Y2NiNzY1MDNmYzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiOTkxOWI3OGQwNzM2OWM2N2NiZTY4ZTg2ODBiMmM5MTlkNjA5ZDJkYmNiYjIxZDJjODBjZmYyNjJhMzY0NTM0N2E1MzBlNzM5MWQ0MWU3OGE0NDhkNzUxODMyNmExY2UzZWNiOWM5OWQxNjM0MzkwMTYzOTY1NDkyYWRlMDQ5YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQzOWYzMDViYzc5ZjFkYjlhNmNmYmY5NTI1MTkyNWIyZWU1NmJkMjliYjE1NTdmMjQ0Njk4ZmMyMzVkMGFmOWU3MjdhYzU3MjAyMjZlMzJkYzgwZmM4YWYzNjE3YjBhNGQ1M2NlNzcyZTcwM2UyNWZmMGI5ZWJlZDc0Yzc1NzM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NDE3MGM0ZTE2ZDUzNzk1YTg0NzlkMGMxYTc5ZDE5YjE5MGQ5MjJlMTYzMDFlN2EwYmI4YjgxNmQzYzQ5YmQyNWZlMGI4NGU4NzlkYTc4MGMzZmMwNjQxYWQ2OWNjNTdkZDFlNzk1ZWNlN2U4YmIyODEyZjc0MzA1OGFmZjAyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjlmZmU1NWEzMTAzNzNhNDU3YWE5ZDA3NzE2MTE4NTA1NGViMzZmODM1MzI4ZmNhMTRlZmQxMTQ1MWM2MTUwMmExMjBiODNjNzQ4MjA0ZmEwODc3YWZjNzA1MmViMjJhNGQ3YjBlMWIwYjYxOGRiOTAyMTdkNmU4Y2U3N2EyOTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE4MTRkZDE0M2RmZjczZGUzZWU0YzFmMDc3MDdlNTc3Y2FhY2FhM2FiZjRiMDU5MGNkZWRlMTBiOTE5OWE5MmQ3OTdmMGMxMWJiNzM4Mjk1YzQ5ZjFlN2VmOTBmM2QxMTZlMjhlNzRjMDg2NzM0ZWJjYThiY2RhMWRjOTM5ZDQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWVhNTVmYTJjYzFiNzM2ZTAyYmI4MzIyNDZkY2M2ZmNkNGEwYTFlYmMyNDFlMzgxZWY2ZjY0YmQ4ZWM0NmExNWQzZjc5N2VjMjJhMzVjOWM1Yzk1MTQyNGUzOWZkNmE2ODdjZGI0MTU1YzhkYjcxZjZlZmU3ZDNmZTk3ZTk0NWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzVlODMzNmNiYzQxY2QyZjYzMTE3N2MwNjEwOWNmM2Y4YjUxODE0Y2IzM2UyMjA4MmM4ZTllZWUwNzJlYzQ4OTE5ZDA4ZDQzZDI5ZDU2NTUxODI2Yzg5NTEzNTgzNTRkNjhlNWFhMDk2YzZhYTU2NjEzNDllMGZhMTA4MTZmNzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3ppcC12MC4yLjMxIjogewogICAgICAibmFtZSI6ICJAZW5kby96aXAiLAogICAgICAibGFiZWwiOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcmVhZGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC93cml0ZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3dyaXRlci5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDg0MzcyOTNhZjFkM2U4MDc0MzAzNDQxNTQ2OWJiOTdlODNiYzJjZGFhZmE3YjBiNmRjOGIyMWUwYzEwYmM2YjBlZGRiMTE0NDFjMWI3YTFjYjJlZTYzNDhjNGYwMWMyODM3ZjAyYjRhMzRkZWVhNjQwYzJmMDU0NDlhMmVkZDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXJlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXJlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEzNWRhZTY3ZThhZGRjNTFjMzVlOWNhNTRjMzllOGZlM2M5ZWUyODBhMmU4ZGNjN2I0NGMwZTQ4NTZkNWFhZDYyMDZlMWY4ZDBjZDYxZTE5MDc2M2JjMTcxODQxNDliMTE0YzRhYjQ0MWJmYWVkYjA3MTQ2MjFhNDVkNTJjZjgwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J1ZmZlci13cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J1ZmZlci13cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NGE4YzhlODg0NTg0ZDM2YzAyM2E0NGY1ZGE3NzNkN2QyYTllNDVlMTkzZmMwNGQ3NDJhMjJlZTI1OTAwMTBiZDU3YjNhYWQ4YjYyNDY3NmQ1YmE5ZjA0MGEwYzM0ODE4OTZhOWNjMTYxOTlhNmUyOTVmOGRkMDRjNzE4YjA0NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wcmVzc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcHJlc3Npb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMDVkYjQzNTNjODZmNTFkZTc5N2JkNmNjYWFlYjFjOTIxZGM3NDZlNzk0ZThjNjQyMTFmY2VlNzhkOTIwMDJiM2JhZjUyM2IxZjY5Nzg1YWZmOWJmYTU3NzlkMGY5MjkzOGY1ZjNhYWRiZjQ4OWZjODIyMTNhY2I5YjdkNDczYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jcmMzMi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY3JjMzIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NTM4NGUxMzlhZjlmMDkzYjllY2E1MmNjNWU2MGQ1ZWZlNDE1NTg0MGE2YWZlYjAyMWIxZThhZjgxZDMwMTczNDUxNzIxNGRiNGFkODhiMTM4NDFmZGI2MDExZTk2ZDYxY2NlM2IwN2RhMTc4MTg0ZmQ2YjhkMjBjNWU4MTgwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmNhNDQ3ZTJjYzRlOThmZjM3NmEzY2UwOWZkOTkwZWI1ZWUwYzdkMDVmMTA0Y2Q5NTlmODliNzJiYTQ3ZThjZGVmNGM0NjFmMDY3NzZlN2UzMzI1MzA5ZGY2YTAzZDFhNmI0YWExNzNhN2RjMWY3NzRlOWMxNjNjZDk4MjQ2MDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZm9ybWF0LXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZm9ybWF0LXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUzODk0ZGFmMzk2ZmMwZWRkM2RiYTBhM2IyZWI5NWQ1MWM0Njk4ZWE4MTcwYTA0YmRmZTljNzdlMDE4NTg4NmVmYmY2NWY1NzdiYWIxN2YyMWJhOTU3NTIwZGNjYjM4YmUwYWZhZjhmZjcxM2QwZDVkYzA5YTJiNTg1ZTFkYmVkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2FkMzUxZjAxNmE2NzE4NmU0M2VhY2ZlYTc2NDQyYjgzNWY2NmM0ZmQ3OGJhNDFiYjNiNTgwYTdmMGRmODk3OGZmMGQ5OTY0ZGRlNDliYmM3YzhhNzc4OGM5OWUwYTRhNmUzYjJhYzJlMzU0NjI1ZmE0YzkyN2E1Y2FjYzIyMGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2lnbmF0dXJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zaWduYXR1cmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiMDc3NTMyMGQ0ZjMyOWVlOGFhMDQxNDRhNzE0MDllN2NmNjk2NzZhYjVhZjI1YTZiNWI2ZTM2MzRjYjkxNDY2MmRjNDI1NzM4NDNlY2E5ZTE4YTc3N2Q1ZGQwMDQ5ODcyOGZkOWU4YzY1ZWExMGZiZGIzNmQ2M2FjZjExNTYzOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk2ZGZmYWNlNjMxZWI0NjVlODNmZTQ2NWM0YTg0ZGZhY2EyZjJjNGE3NjM4MzMzOTAyMDQ3ZWY2ZmM4ZWQ2OWJjMmYyYTY0OTFhYzI3Njg5ZmMzYTEwYmExZmYwNDE1MDA3N2YzZWYxNTRkYjYxZDI2ODAwYjE3MDJiNTU5NDdhIgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAwt1MYHsEAAB7BAAALwAAAEBhZ29yaWMvc3Bhd25lci12MC42LjktdTExLjAvc3JjL3ZhdC1zcGF3bmVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ltcG9ydC1idW5kbGUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYnVpbGRSb290T2JqZWN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGltcG9ydEJ1bmRsZSxGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vaW1wb3J0LWJ1bmRsZVwiLCBbW1wiaW1wb3J0QnVuZGxlXCIsIFskaOKAjV9hID0+IChpbXBvcnRCdW5kbGUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVpbGRSb290T2JqZWN0LCAnbmFtZScsIHt2YWx1ZTogXCJidWlsZFJvb3RPYmplY3RcIn0pOyRo4oCNX29uY2UuYnVpbGRSb290T2JqZWN0KGJ1aWxkUm9vdE9iamVjdCk7ICAgXG5cblxuXG5cbmNvbnN0IGVuZG93bWVudHM9e1xuVmF0RGF0YSxcbmNvbnNvbGUsXG5hc3NlcnQsXG5CYXNlNjQ6Z2xvYmFsVGhpcy5CYXNlNjQsLyogUHJlc2VudCBvbmx5IG9uIFhTbmFwKi9cblVSTDpnbG9iYWxUaGlzLlVSTC8qIEFic2VudCBvbmx5IG9uIFhTbmFwKi99O1xuXG5cbmZ1bmN0aW9uICAgICAgICBidWlsZFJvb3RPYmplY3QoKXtcbnJldHVybiBGYXIoJ3Jvb3QnLHtcbiAgICAgIGFzeW5jIGxvYWRCdW5kbGUoYnVuZGxlKXtcbmNvbnN0IG5zPWF3YWl0IGltcG9ydEJ1bmRsZShidW5kbGUse2VuZG93bWVudHN9KTtcbmNvbnN0IHN0YXJ0Rm49bnMuZGVmYXVsdDtcbnJldHVybiBGYXIoJ3NwYXduZWQgYnVuZGxlJyx7XG4gICAgICBhc3luYyBzdGFydChhcmdzUCl7XG5jb25zdCBhcmdzPWF3YWl0IGFyZ3NQO1xucmV0dXJuIHN0YXJ0Rm4oYXJncyk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJ1aWxkUm9vdE9iamVjdCI6WyJidWlsZFJvb3RPYmplY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA954aPOsCAADrAgAAHAAAAEBlbmRvL2Jhc2U2NC12MC4yLjMxL2F0b2IuanN7ImltcG9ydHMiOlsiLi9kZWNvZGUuanMiXSwiZXhwb3J0cyI6WyJhdG9iIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGRlY29kZUJhc2U2NDskaOKAjV9pbXBvcnRzKFtbXCIuL2RlY29kZS5qc1wiLCBbW1wiZGVjb2RlQmFzZTY0XCIsIFskaOKAjV9hID0+IChkZWNvZGVCYXNlNjQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZERhdGEgYSBiaW5hcnkgc3RyaW5nIGNvbnRhaW5pbmcgYmFzZTY0LWVuY29kZWQgZGF0YVxuICogQHJldHVybnMge3N0cmluZ30gYW4gQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgZGVjb2RlZCBkYXRhIGZyb20gYGVuY29kZWREYXRhYFxuICovXG5jb25zdCAgICAgICAgYXRvYj0oZW5jb2RlZERhdGEpPT57XG5jb25zdCBidWY9ZGVjb2RlQmFzZTY0KGVuY29kZWREYXRhKTtcbnJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ1Zik7XG4gfTskaOKAjV9vbmNlLmF0b2IoYXRvYik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXRvYiI6WyJhdG9iIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHkkiZuNAwAAjQMAABwAAABAZW5kby9iYXNlNjQtdjAuMi4zMS9idG9hLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlLmpzIl0sImV4cG9ydHMiOlsiYnRvYSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBlbmNvZGVCYXNlNjQ7JGjigI1faW1wb3J0cyhbW1wiLi9lbmNvZGUuanNcIiwgW1tcImVuY29kZUJhc2U2NFwiLCBbJGjigI1fYSA9PiAoZW5jb2RlQmFzZTY0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ1RvRW5jb2RlIHRoZSBiaW5hcnkgc3RyaW5nIHRvIGVuY29kZVxuICogQHJldHVybnMge3N0cmluZ30gYW4gQVNDSUkgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGJhc2U2NCByZXByZXNlbnRhdGlvbiBvZiBgc3RyaW5nVG9FbmNvZGVgXG4gKi9cbmNvbnN0ICAgICAgICBidG9hPShzdHJpbmdUb0VuY29kZSk9PntcbmNvbnN0IGJ5dGVzPXN0cmluZ1RvRW5jb2RlLnNwbGl0KCcnKS5tYXAoKGNoYXIpPT57XG5jb25zdCBiPWNoYXIuY2hhckNvZGVBdCgwKTtcbmlmKGI+MHhmZil7XG50aHJvdyBuZXcgRXJyb3IoIGBidG9hOiBjaGFyYWN0ZXIgb3V0IG9mIHJhbmdlOiAke2NoYXJ9YCk7XG4gfVxucmV0dXJuIGI7XG4gfSk7XG5jb25zdCBidWY9bmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xucmV0dXJuIGVuY29kZUJhc2U2NChidWYpO1xuIH07JGjigI1fb25jZS5idG9hKGJ0b2EpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJ0b2EiOlsiYnRvYSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB02udwlQEAAJUBAAAeAAAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2RlY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZGVjb2RlLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2RlY29kZS5qcyI6W1siZGVjb2RlQmFzZTY0IiwiZGVjb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABHQ26WlQEAAJUBAAAeAAAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZW5jb2RlLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZS5qcyI6W1siZW5jb2RlQmFzZTY0IiwiZW5jb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABXcWzggAIAAIACAAAdAAAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hdG9iLmpzIiwiLi9idG9hLmpzIiwiLi9zcmMvZGVjb2RlLmpzIiwiLi9zcmMvZW5jb2RlLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGUuanNcIiwgW11dLFtcIi4vc3JjL2RlY29kZS5qc1wiLCBbXV0sW1wiLi9idG9hLmpzXCIsIFtdXSxbXCIuL2F0b2IuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZW5jb2RlLmpzIjpbWyJlbmNvZGVCYXNlNjQiLCJlbmNvZGVCYXNlNjQiXV0sIi4vc3JjL2RlY29kZS5qcyI6W1siZGVjb2RlQmFzZTY0IiwiZGVjb2RlQmFzZTY0Il1dLCIuL2J0b2EuanMiOltbImJ0b2EiLCJidG9hIl1dLCIuL2F0b2IuanMiOltbImF0b2IiLCJhdG9iIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAoDnJAAwQAAAMEAAAiAAAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvc3JjL2NvbW1vbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYWxwaGFiZXQ2NCIsIm1vbm9kdTY0IiwicGFkZGluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbmNvbnN0ICAgICAgICBwYWRkaW5nPSc9JzskaOKAjV9vbmNlLnBhZGRpbmcocGFkZGluZyk7XG5cbmNvbnN0ICAgICAgICBhbHBoYWJldDY0PVxuJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG4vKipcbiAqIFRoZSBudW1lcmljIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBsZXR0ZXIgb2YgdGhlIGFscGhhYmV0LlxuICogSWYgYW4gYWxwaGFiZXQgaXMgbmFtZWQgZm9yIHRoZSBHcmVlayBsZXR0ZXJzIGFscGhhIGFuZCBiZXRhLCB0aGVuIGNsZWFybHkgYVxuICogbW9ub2R1IGlzIG5hbWVkIGZvciB0aGUgY29ycmVzcG9uZGluZyBHcmVlayBudW1iZXJzIG1vbm8gYW5kIGR1by5cbiAqXG4gKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn1cbiAqLyRo4oCNX29uY2UuYWxwaGFiZXQ2NChhbHBoYWJldDY0KTtcbmNvbnN0ICAgICAgICBtb25vZHU2ND17fTskaOKAjV9vbmNlLm1vbm9kdTY0KG1vbm9kdTY0KTtcbmZvcihsZXQgaT0wO2k8YWxwaGFiZXQ2NC5sZW5ndGg7aSs9MSl7XG5jb25zdCBjPWFscGhhYmV0NjRbaV07XG5tb25vZHU2NFtjXT1pO1xuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYWRkaW5nIjpbInBhZGRpbmciXSwiYWxwaGFiZXQ2NCI6WyJhbHBoYWJldDY0Il0sIm1vbm9kdTY0IjpbIm1vbm9kdTY0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJLtlGR8CQAAfAkAACIAAABAZW5kby9iYXNlNjQtdjAuMi4zMS9zcmMvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vY29tbW9uLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlQmFzZTY0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1vbm9kdTY0LHBhZGRpbmc7JGjigI1faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcIm1vbm9kdTY0XCIsIFskaOKAjV9hID0+IChtb25vZHU2NCA9ICRo4oCNX2EpXV0sW1wicGFkZGluZ1wiLCBbJGjigI1fYSA9PiAocGFkZGluZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKlxuICogRGVjb2RlcyBhIEJhc2U2NCBzdHJpbmcgaW50byBieXRlcywgYXMgc3BlY2lmaWVkIGluXG4gKiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OCNzZWN0aW9uLTRcbiAqXG4gKiBYU25hcCBpcyBhIEphdmFTY3JpcHQgZW5naW5lIGJhc2VkIG9uIE1vZGRhYmxlL1hTLlxuICogVGhlIGFsZ29yaXRobSBiZWxvdyBpcyBvcmRlcnMgb2YgbWFnbml0dWRlIHRvbyBzbG93IG9uIHRoaXMgVk0sIGJ1dCBpdFxuICogYXJyYW5nZXMgYSBuYXRpdmUgYmluZGluZyBvbiB0aGUgZ2xvYmFsIG9iamVjdC5cbiAqIFdlIHVzZSB0aGF0IGlmIGl0IGlzIGF2YWlsYWJsZSBpbnN0ZWFkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgQmFzZTY0LWVuY29kZWQgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gW25hbWVdIFRoZSBuYW1lIG9mIHRoZSBzdHJpbmcgYXMgaXQgd2lsbCBhcHBlYXIgaW4gZXJyb3JcbiAqIG1lc3NhZ2VzLlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9IGRlY29kZWQgYnl0ZXNcbiAqL1xuY29uc3QganNEZWNvZGVCYXNlNjQ9KHN0cmluZyxuYW1lPSc8dW5rbm93bj4nKT0+e1xuY29uc3QgZGF0YT1uZXcgVWludDhBcnJheShNYXRoLmNlaWwoc3RyaW5nLmxlbmd0aCo0LzMpKTtcbmxldCByZWdpc3Rlcj0wO1xubGV0IHF1YW50dW09MDtcbmxldCBpPTA7LyogaW5kZXggaW4gc3RyaW5nKi9cbmxldCBqPTA7LyogaW5kZXggaW4gZGF0YSovXG5cbndoaWxlKGk8c3RyaW5nLmxlbmd0aCYmc3RyaW5nW2ldIT09cGFkZGluZyl7XG5jb25zdCBudW1iZXI9bW9ub2R1NjRbc3RyaW5nW2ldXTtcbmlmKG51bWJlcj09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvciggYEludmFsaWQgYmFzZTY0IGNoYXJhY3RlciAke3N0cmluZ1tpXX0gaW4gc3RyaW5nICR7bmFtZX1gKTtcbiB9XG5yZWdpc3Rlcj1yZWdpc3Rlcjw8NnxudW1iZXI7XG5xdWFudHVtKz02O1xuaWYocXVhbnR1bT49OCl7XG5xdWFudHVtLT04O1xuZGF0YVtqXT1yZWdpc3Rlcj4+PnF1YW50dW07XG5qKz0xO1xucmVnaXN0ZXImPSgxPDxxdWFudHVtKS0xO1xuIH1cbmkrPTE7XG4gfVxuXG53aGlsZShpPHN0cmluZy5sZW5ndGgmJnF1YW50dW0lOCE9PTApe1xuaWYoc3RyaW5nW2ldIT09cGFkZGluZyl7XG50aHJvdyBFcnJvciggYE1pc3NpbmcgcGFkZGluZyBhdCBvZmZzZXQgJHtpfSBvZiBzdHJpbmcgJHtuYW1lfWApO1xuIH1cbmkrPTE7XG5xdWFudHVtKz02O1xuIH1cblxuaWYoaTxzdHJpbmcubGVuZ3RoKXtcbnRocm93IEVycm9yKFxuIGBCYXNlNjQgc3RyaW5nIGhhcyB0cmFpbGluZyBnYXJiYWdlICR7c3RyaW5nLnN1YnN0cihcbmkpXG4gfSBpbiBzdHJpbmcgJHtuYW1lfWApO1xuXG4gfVxuXG5yZXR1cm4gZGF0YS5zdWJhcnJheSgwLGopO1xuIH07XG5cbi8qIFRoZSBYUyBCYXNlNjQuZGVjb2RlIGZ1bmN0aW9uIGlzIGZhc3RlciwgYnV0IG1pZ2h0IHJldHVybiBBcnJheUJ1ZmZlciAobm90Ki9cbi8qIFVpbnQ4QXJyYXkpLiAgQWRhcHQgaXQgdG8gb3VyIG5lZWRzLiovXG5jb25zdCBhZGFwdERlY29kZXI9XG4obmF0aXZlRGVjb2RlQmFzZTY0KT0+XG4oLi4uYXJncyk9PntcbmNvbnN0IGRlY29kZWQ9bmF0aXZlRGVjb2RlQmFzZTY0KC4uLmFyZ3MpO1xuaWYoZGVjb2RlZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpe1xucmV0dXJuIGRlY29kZWQ7XG4gfVxucmV0dXJuIG5ldyBVaW50OEFycmF5KGRlY29kZWQpO1xuIH07XG5cbi8qKiBAdHlwZSB7dHlwZW9mIGpzRGVjb2RlQmFzZTY0fSAqL1xuY29uc3QgICAgICAgIGRlY29kZUJhc2U2ND1cbmdsb2JhbFRoaXMuQmFzZTY0IT09dW5kZWZpbmVkP1xuYWRhcHREZWNvZGVyKGdsb2JhbFRoaXMuQmFzZTY0LmRlY29kZSk6XG5qc0RlY29kZUJhc2U2NDskaOKAjV9vbmNlLmRlY29kZUJhc2U2NChkZWNvZGVCYXNlNjQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZUJhc2U2NCI6WyJkZWNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGp+gAOYHAADmBwAAIgAAAEBlbmRvL2Jhc2U2NC12MC4yLjMxL3NyYy9lbmNvZGUuanN7ImltcG9ydHMiOlsiLi9jb21tb24uanMiXSwiZXhwb3J0cyI6WyJlbmNvZGVCYXNlNjQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYWxwaGFiZXQ2NCxwYWRkaW5nOyRo4oCNX2ltcG9ydHMoW1tcIi4vY29tbW9uLmpzXCIsIFtbXCJhbHBoYWJldDY0XCIsIFskaOKAjV9hID0+IChhbHBoYWJldDY0ID0gJGjigI1fYSldXSxbXCJwYWRkaW5nXCIsIFskaOKAjV9hID0+IChwYWRkaW5nID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqXG4gKiBFbmNvZGVzIGJ5dGVzIGludG8gYSBCYXNlNjQgc3RyaW5nLCBhcyBzcGVjaWZpZWQgaW5cbiAqIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM0NjQ4I3NlY3Rpb24tNFxuICpcbiAqIFhTbmFwIGlzIGEgSmF2YVNjcmlwdCBlbmdpbmUgYmFzZWQgb24gTW9kZGFibGUvWFMuXG4gKiBUaGUgYWxnb3JpdGhtIGJlbG93IGlzIG9yZGVycyBvZiBtYWduaXR1ZGUgdG9vIHNsb3cgb24gdGhpcyBWTSwgYnV0IGl0XG4gKiBhcnJhbmdlcyBhIG5hdGl2ZSBiaW5kaW5nIG9uIHRoZSBnbG9iYWwgb2JqZWN0LlxuICogV2UgdXNlIHRoYXQgaWYgaXQgaXMgYXZhaWxhYmxlIGluc3RlYWQuXG4gKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBiYXNlNjQgZW5jb2RpbmdcbiAqL1xuY29uc3QganNFbmNvZGVCYXNlNjQ9KGRhdGEpPT57XG4vKiBBIGN1cnNvcnkgYmVuY2htYXJrIHNob3dzIHRoYXQgc3RyaW5nIGNvbmNhdGVuYXRpb24gaXMgYWJvdXQgMjUlIGZhc3RlciovXG4vKiB0aGFuIGJ1aWxkaW5nIGFuIGFycmF5IGFuZCBqb2luaW5nIGl0IGluIHY4LCBpbiAyMDIwLCBmb3Igc3RyaW5ncyBvZiBhYm91dCovXG4vKiAxMDAgbG9uZy4qL1xubGV0IHN0cmluZz0nJztcbmxldCByZWdpc3Rlcj0wO1xubGV0IHF1YW50dW09MDtcblxuZm9yKGxldCBpPTA7aTxkYXRhLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGI9ZGF0YVtpXTtcbnJlZ2lzdGVyPXJlZ2lzdGVyPDw4fGI7XG5xdWFudHVtKz04O1xuaWYocXVhbnR1bT09PTI0KXtcbnN0cmluZys9XG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MTgmMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MTImMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+NiYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI+Pj4wJjB4M2ZdO1xucmVnaXN0ZXI9MDtcbnF1YW50dW09MDtcbiB9XG4gfVxuXG5zd2l0Y2gocXVhbnR1bSl7XG5jYXNlIDA6XG5icmVhaztcbmNhc2UgODpcbnN0cmluZys9XG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MiYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI8PDQmMHgzZl0rXG5wYWRkaW5nK1xucGFkZGluZztcbmJyZWFrO1xuY2FzZSAxNjpcbnN0cmluZys9XG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+MTAmMHgzZl0rXG5hbHBoYWJldDY0W3JlZ2lzdGVyPj4+NCYweDNmXStcbmFscGhhYmV0NjRbcmVnaXN0ZXI8PDImMHgzZl0rXG5wYWRkaW5nO1xuYnJlYWs7XG5kZWZhdWx0OlxudGhyb3cgRXJyb3IoIGBpbnRlcm5hbDogYmFkIHF1YW50dW0gJHtxdWFudHVtfWApO31cblxucmV0dXJuIHN0cmluZztcbiB9O1xuXG4vKiogQHR5cGUge3R5cGVvZiBqc0VuY29kZUJhc2U2NH0gKi9cbmNvbnN0ICAgICAgICBlbmNvZGVCYXNlNjQ9XG5nbG9iYWxUaGlzLkJhc2U2NCE9PXVuZGVmaW5lZD9nbG9iYWxUaGlzLkJhc2U2NC5lbmNvZGU6anNFbmNvZGVCYXNlNjQ7JGjigI1fb25jZS5lbmNvZGVCYXNlNjQoZW5jb2RlQmFzZTY0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJlbmNvZGVCYXNlNjQiOlsiZW5jb2RlQmFzZTY0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPz0xDYEAgAABAIAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L2ltcG9ydC1hcmNoaXZlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIl0sImV4cG9ydHMiOlsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIjpbWyJwYXJzZUFyY2hpdmUiLCJwYXJzZUFyY2hpdmUiXSxbImxvYWRBcmNoaXZlIiwibG9hZEFyY2hpdmUiXSxbImltcG9ydEFyY2hpdmUiLCJpbXBvcnRBcmNoaXZlIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACQ6+lKdTEAAHUxAAA2AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvY29tcGFydG1lbnQtbWFwLmpzeyJpbXBvcnRzIjpbIi4vcG9saWN5LWZvcm1hdC5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvbXBhcnRtZW50TWFwIiwicGF0aENvbXBhcmUiLCJzdHJpbmdDb21wYXJlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFBhY2thZ2VQb2xpY3k7JGjigI1faW1wb3J0cyhbW1wiLi9wb2xpY3ktZm9ybWF0LmpzXCIsIFtbXCJhc3NlcnRQYWNrYWdlUG9saWN5XCIsIFskaOKAjV9hID0+IChhc3NlcnRQYWNrYWdlUG9saWN5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qIFRPRE8gY29udmVydCB0byB0aGUgbmV3IGB8fGAgYXNzZXJ0IHN0eWxlLiovXG4vKiBEZWZlcnJlZCBiZWNhdXNlIHRoaXMgZmlsZSBwZXJ2YXNpdmVseSB1c2VzIHNpbXBsZSB0ZW1wbGF0ZSBzdHJpbmdzIHJhdGhlciB0aGFuKi9cbi8qIHRlbXBsYXRlIHN0cmluZ3MgdGFnZ2VkIHdpdGggYGFzc2VydC5kZXRhaWxzYCAoYWthIGBYYCksIGFuZCB1c2VzKi9cbi8qIHRoaXMgZGVmaW5pdGlvbiBvZiBgcWAgcmF0aGVyIHRoYW4gYGFzc2VydC5xdW90ZWAqL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgbW9kdWxlTGFuZ3VhZ2VzPVtcbidjanMnLFxuJ21qcycsXG4nanNvbicsXG4ndGV4dCcsXG4nYnl0ZXMnLFxuJ3ByZS1tanMtanNvbicsXG4ncHJlLWNqcy1qc29uJ107XG5cblxuLyoqIEB0eXBlIHsoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IG51bWJlcn0gKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5jb25zdCAgICAgICAgc3RyaW5nQ29tcGFyZT0oYSxiKT0+YT09PWI/MDphPGI/LTE6MTtcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge3N0cmluZ30gdGVybVxuICovJGjigI1fb25jZS5zdHJpbmdDb21wYXJlKHN0cmluZ0NvbXBhcmUpO1xuY29uc3QgY3VtdWxhdGl2ZUxlbmd0aD0obGVuZ3RoLHRlcm0pPT57XG5yZXR1cm4gbGVuZ3RoK3Rlcm0ubGVuZ3RoO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkfSBhXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz4gfCB1bmRlZmluZWR9IGJcbiAqL1xuY29uc3QgICAgICAgIHBhdGhDb21wYXJlPShhLGIpPT57XG4vKiBVbmRlZmluZWQgaXMgbm90IHByZWZlcnJlZCovXG5pZihhPT09dW5kZWZpbmVkJiZiPT09dW5kZWZpbmVkKXtcbnJldHVybiAwO1xuIH1cbmlmKGE9PT11bmRlZmluZWQpe1xucmV0dXJuIDE7XG4gfVxuaWYoYj09PXVuZGVmaW5lZCl7XG5yZXR1cm4tMTtcbiB9XG4vKiBQcmVmZXIgdGhlIHNob3J0ZXN0IGRlcGVuZGVuY3kgcGF0aC4qL1xuaWYoYS5sZW5ndGghPT1iLmxlbmd0aCl7XG5yZXR1cm4gYS5sZW5ndGgtYi5sZW5ndGg7XG4gfVxuLyogT3RoZXJ3aXNlLCBmYXZvciB0aGUgc2hvcnRlc3QgY3VtdWxhdGl2ZSBsZW5ndGguKi9cbmNvbnN0IGFTdW09YS5yZWR1Y2UoY3VtdWxhdGl2ZUxlbmd0aCwwKTtcbmNvbnN0IGJTdW09Yi5yZWR1Y2UoY3VtdWxhdGl2ZUxlbmd0aCwwKTtcbmlmKGFTdW0hPT1iU3VtKXtcbnJldHVybiBhU3VtLWJTdW07XG4gfVxuLyogT3RoZXJ3aXNlLCBjb21wYXJlIHRlcm1zIGxleGljYWxseS4qL1xuYXNzZXJ0KGEubGVuZ3RoPT09Yi5sZW5ndGgpOy8qIFJlbWluZGVyKi9cbi8qIFRoaXMgbG9vcCBndWFyYW50ZWVzIHRoYXQgaWYgYW55IHBhaXIgb2YgdGVybXMgaXMgZGlmZmVyZW50LCBpbmNsdWRpbmcgdGhlKi9cbi8qIGNhc2Ugd2hlcmUgb25lIGlzIGEgcHJlZml4IG9mIHRoZSBvdGhlciwgd2Ugd2lsbCByZXR1cm4gYSBub24temVybyB2YWx1ZS4qL1xuZm9yKGxldCBpPTA7aTxhLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGNvbXBhcmlzb249c3RyaW5nQ29tcGFyZShhW2ldLGJbaV0pO1xuaWYoY29tcGFyaXNvbiE9PTApe1xucmV0dXJuIGNvbXBhcmlzb247XG4gfVxuIH1cbi8qIElmIGFsbCBwYWlycyBvZiB0ZXJtcyBhcmUgdGhlIHNhbWUgcmVzcGVjdGl2ZSBsZW5ndGhzLCB3ZSBhcmUgZ3VhcmFudGVlZCovXG4vKiB0aGF0IHRoZXkgYXJlIGV4YWN0bHkgdGhlIHNhbWUgb3Igb25lIG9mIHRoZW0gaXMgbGV4aWNhbGx5IGRpc3RpbmN0IGFuZCB3b3VsZCovXG4vKiBoYXZlIGFscmVhZHkgYmVlbiBjYXVnaHQuKi9cbnJldHVybiAwO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGl0ZXJhYmxlXG4gKi8kaOKAjV9vbmNlLnBhdGhDb21wYXJlKHBhdGhDb21wYXJlKTtcbmZ1bmN0aW9uKmVudW1lcmF0ZShpdGVyYWJsZSl7XG5sZXQgaW5kZXg9MDtcbmZvcihjb25zdCB2YWx1ZSBvZiBpdGVyYWJsZSl7XG55aWVsZFtpbmRleCx2YWx1ZV07XG5pbmRleCs9MTtcbiB9XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IG9iamVjdFxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2VcbiAqL1xuY29uc3QgYXNzZXJ0RW1wdHlPYmplY3Q9KG9iamVjdCxtZXNzYWdlKT0+e1xuYXNzZXJ0KE9iamVjdC5rZXlzKG9iamVjdCkubGVuZ3RoPT09MCxtZXNzYWdlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gdGFnc1xuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRUYWdzPSh0YWdzLHVybCk9PntcbmlmKHRhZ3M9PT11bmRlZmluZWQpcmV0dXJuO1xuYXNzZXJ0KFxuQXJyYXkuaXNBcnJheSh0YWdzKSxcbiBgdGFncyBtdXN0IGJlIGFuIGFycmF5LCBnb3QgJHt0YWdzfSBpbiAke3EodXJsKX1gKTtcblxuZm9yKGNvbnN0W2luZGV4LHZhbHVlXW9mIGVudW1lcmF0ZSh0YWdzKSl7XG5hc3NlcnQudHlwZW9mKFxudmFsdWUsXG4nc3RyaW5nJyxcbiBgdGFnc1ske2luZGV4fV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYWxsZWdlZE1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRNb2R1bGU9KGFsbGVnZWRNb2R1bGUscGF0aCx1cmwpPT57XG5jb25zdHtjb21wYXJ0bWVudCxtb2R1bGUsLi4uZXh0cmF9PWFsbGVnZWRNb2R1bGU7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cSh7XG5leHRyYSxcbmNvbXBhcnRtZW50fSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxuY29tcGFydG1lbnQsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGNvbXBhcnRtZW50KX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5tb2R1bGUsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5tb2R1bGUgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShtb2R1bGUpfSBpbiAke3EodXJsKX1gKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYWxsZWdlZE1vZHVsZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0RmlsZU1vZHVsZT0oYWxsZWdlZE1vZHVsZSxwYXRoLHVybCk9PntcbmNvbnN0e2xvY2F0aW9uLHBhcnNlcixzaGE1MTIsLi4uZXh0cmF9PWFsbGVnZWRNb2R1bGU7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubG9jYXRpb24sXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5sb2NhdGlvbiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGxvY2F0aW9uKX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5wYXJzZXIsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5wYXJzZXIgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShwYXJzZXIpfSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0KFxubW9kdWxlTGFuZ3VhZ2VzLmluY2x1ZGVzKHBhcnNlciksXG4gYCR7cGF0aH0ucGFyc2VyIG11c3QgYmUgb25lIG9mICR7cShtb2R1bGVMYW5ndWFnZXMpfSwgZ290ICR7cGFyc2VyfSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG5cbmlmKHNoYTUxMiE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKFxuc2hhNTEyLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uc2hhNTEyIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3Eoc2hhNTEyKX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBhbGxlZ2VkTW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRFeGl0TW9kdWxlPShhbGxlZ2VkTW9kdWxlLHBhdGgsdXJsKT0+e1xuY29uc3R7ZXhpdCwuLi5leHRyYX09YWxsZWdlZE1vZHVsZTtcbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG5leGl0LFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uZXhpdCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGV4aXQpfSBpbiAke3EodXJsKX1gKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTW9kdWxlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRNb2R1bGU9KGFsbGVnZWRNb2R1bGUscGF0aCx1cmwpPT57XG5jb25zdCBtb2R1bGVEZXNjcmlwdG9yPU9iamVjdChhbGxlZ2VkTW9kdWxlKTtcbmFzc2VydChcbmFsbGVnZWRNb2R1bGU9PT1tb2R1bGVEZXNjcmlwdG9yJiYhQXJyYXkuaXNBcnJheShtb2R1bGVEZXNjcmlwdG9yKSxcbiBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZE1vZHVsZX0gaW4gJHtxKHVybCl9YCk7XG5cblxuY29uc3R7Y29tcGFydG1lbnQsbW9kdWxlLGxvY2F0aW9uLHBhcnNlcixleGl0LGRlZmVycmVkRXJyb3J9PVxubW9kdWxlRGVzY3JpcHRvcjtcbmlmKGNvbXBhcnRtZW50IT09dW5kZWZpbmVkfHxtb2R1bGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0Q29tcGFydG1lbnRNb2R1bGUobW9kdWxlRGVzY3JpcHRvcixwYXRoLHVybCk7XG4gfWVsc2UgaWYobG9jYXRpb24hPT11bmRlZmluZWR8fHBhcnNlciE9PXVuZGVmaW5lZCl7XG5hc3NlcnRGaWxlTW9kdWxlKG1vZHVsZURlc2NyaXB0b3IscGF0aCx1cmwpO1xuIH1lbHNlIGlmKGV4aXQhPT11bmRlZmluZWQpe1xuYXNzZXJ0RXhpdE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLHBhdGgsdXJsKTtcbiB9ZWxzZSBpZihkZWZlcnJlZEVycm9yIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoXG5kZWZlcnJlZEVycm9yLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0uZGVmZXJyZWRFcnJvciBtdXN0IGJlIGEgc3RyaW5nIGNvbnRhaWluZyBhbiBlcnJvciBtZXNzYWdlYCk7XG5cbiB9ZWxzZXtcbmFzc2VydC5mYWlsKFxuIGAke3BhdGh9IGlzIG5vdCBhIHZhbGlkIG1vZHVsZSBkZXNjcmlwdG9yLCBnb3QgJHtxKGFsbGVnZWRNb2R1bGUpfSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTW9kdWxlc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlcz0oYWxsZWdlZE1vZHVsZXMscGF0aCx1cmwpPT57XG5jb25zdCBtb2R1bGVzPU9iamVjdChhbGxlZ2VkTW9kdWxlcyk7XG5hc3NlcnQoXG5hbGxlZ2VkTW9kdWxlcz09PW1vZHVsZXN8fCFBcnJheS5pc0FycmF5KG1vZHVsZXMpLFxuIGBtb2R1bGVzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRNb2R1bGVzKX0gaW4gJHtxKHVybCl9YCk7XG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgT2JqZWN0LmVudHJpZXMobW9kdWxlcykpe1xuYXNzZXJ0TW9kdWxlKHZhbHVlLCBgJHtwYXRofS5tb2R1bGVzWyR7cShrZXkpfV1gLHVybCk7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUGFyc2Vyc1xuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0UGFyc2Vycz0oYWxsZWdlZFBhcnNlcnMscGF0aCx1cmwpPT57XG5pZihhbGxlZ2VkUGFyc2Vycz09PXVuZGVmaW5lZCl7XG5yZXR1cm47XG4gfVxuY29uc3QgcGFyc2Vycz1PYmplY3QoYWxsZWdlZFBhcnNlcnMpO1xuYXNzZXJ0KFxuYWxsZWdlZFBhcnNlcnM9PT1wYXJzZXJzJiYhQXJyYXkuaXNBcnJheShwYXJzZXJzKSxcbiBgJHtwYXRofS5wYXJzZXJzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkUGFyc2Vyc30gaW4gJHtxKHVybCl9YCk7XG5cblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyhwYXJzZXJzKSl7XG5hc3NlcnQudHlwZW9mKFxua2V5LFxuJ3N0cmluZycsXG4gYGFsbCBrZXlzIG9mICR7cGF0aH0ucGFyc2VycyBtdXN0IGJlIHN0cmluZ3MsIGdvdCAke2tleX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydC50eXBlb2YoXG52YWx1ZSxcbidzdHJpbmcnLFxuIGAke3BhdGh9LnBhcnNlcnNbJHtxKGtleSl9XSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydChcbm1vZHVsZUxhbmd1YWdlcy5pbmNsdWRlcyh2YWx1ZSksXG4gYCR7cGF0aH0ucGFyc2Vyc1ske3Eoa2V5KX1dIG11c3QgYmUgb25lIG9mICR7cShcbm1vZHVsZUxhbmd1YWdlcylcbiB9LCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRTY29wZVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGU9KGFsbGVnZWRTY29wZSxwYXRoLHVybCk9PntcbmNvbnN0IHNjb3BlPU9iamVjdChhbGxlZ2VkU2NvcGUpO1xuYXNzZXJ0KFxuYWxsZWdlZFNjb3BlPT09c2NvcGUmJiFBcnJheS5pc0FycmF5KHNjb3BlKSxcbiBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFNjb3BlfSBpbiAke3EodXJsKX1gKTtcblxuXG5jb25zdHtjb21wYXJ0bWVudCwuLi5leHRyYX09c2NvcGU7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5cbmFzc2VydC50eXBlb2YoXG5jb21wYXJ0bWVudCxcbidzdHJpbmcnLFxuIGAke3BhdGh9LmNvbXBhcnRtZW50IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoY29tcGFydG1lbnQpfSBpbiAke3EodXJsKX1gKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkU2NvcGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRTY29wZXM9KGFsbGVnZWRTY29wZXMscGF0aCx1cmwpPT57XG5pZihhbGxlZ2VkU2NvcGVzPT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCBzY29wZXM9T2JqZWN0KGFsbGVnZWRTY29wZXMpO1xuYXNzZXJ0KFxuYWxsZWdlZFNjb3Blcz09PXNjb3BlcyYmIUFycmF5LmlzQXJyYXkoc2NvcGVzKSxcbiBgJHtwYXRofS5zY29wZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZFNjb3Blcyl9IGluICR7cSh1cmwpfWApO1xuXG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgT2JqZWN0LmVudHJpZXMoc2NvcGVzKSl7XG5hc3NlcnQudHlwZW9mKFxua2V5LFxuJ3N0cmluZycsXG4gYGFsbCBrZXlzIG9mICR7cGF0aH0uc2NvcGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0U2NvcGUodmFsdWUsIGAke3BhdGh9LnNjb3Blc1ske3Eoa2V5KX1dYCx1cmwpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFR5cGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRUeXBlcz0oYWxsZWdlZFR5cGVzLHBhdGgsdXJsKT0+e1xuaWYoYWxsZWdlZFR5cGVzPT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCB0eXBlcz1PYmplY3QoYWxsZWdlZFR5cGVzKTtcbmFzc2VydChcbmFsbGVnZWRUeXBlcz09PXR5cGVzJiYhQXJyYXkuaXNBcnJheSh0eXBlcyksXG4gYCR7cGF0aH0udHlwZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRUeXBlc30gaW4gJHtxKHVybCl9YCk7XG5cblxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZiBPYmplY3QuZW50cmllcyh0eXBlcykpe1xuYXNzZXJ0LnR5cGVvZihcbmtleSxcbidzdHJpbmcnLFxuIGBhbGwga2V5cyBvZiAke3BhdGh9LnR5cGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbnZhbHVlLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0udHlwZXNbJHtxKGtleSl9XSBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHt2YWx1ZX0gaW4gJHtxKHVybCl9YCk7XG5cbmFzc2VydChcbm1vZHVsZUxhbmd1YWdlcy5pbmNsdWRlcyh2YWx1ZSksXG4gYCR7cGF0aH0udHlwZXNbJHtxKGtleSl9XSBtdXN0IGJlIG9uZSBvZiAke3EoXG5tb2R1bGVMYW5ndWFnZXMpXG4gfSwgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUG9saWN5XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdXG4gKi9cblxuY29uc3QgYXNzZXJ0UG9saWN5PShcbmFsbGVnZWRQb2xpY3ksXG5wYXRoLFxudXJsPSc8dW5rbm93bi1jb21wYXJ0bWVudC1tYXAuanNvbj4nKT0+XG57XG5hc3NlcnRQYWNrYWdlUG9saWN5KGFsbGVnZWRQb2xpY3ksIGAke3BhdGh9LnBvbGljeWAsdXJsKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZENvbXBhcnRtZW50XG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtzdHJpbmd9IHVybFxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudD0oYWxsZWdlZENvbXBhcnRtZW50LHBhdGgsdXJsKT0+e1xuY29uc3QgY29tcGFydG1lbnQ9T2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudCk7XG5hc3NlcnQoXG5hbGxlZ2VkQ29tcGFydG1lbnQ9PT1jb21wYXJ0bWVudCYmIUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnQpLFxuIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnR9IGluICR7cSh1cmwpfWApO1xuXG5cbmNvbnN0e1xubG9jYXRpb24sXG5uYW1lLFxubGFiZWwsXG5wYXJzZXJzLFxudHlwZXMsXG5zY29wZXMsXG5tb2R1bGVzLFxucG9saWN5LFxuLi4uZXh0cmF9PVxuY29tcGFydG1lbnQ7XG5cbmFzc2VydEVtcHR5T2JqZWN0KFxuZXh0cmEsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuT2JqZWN0LmtleXMoZXh0cmEpKVxuIH0gaW4gJHtxKHVybCl9YCk7XG5cblxuYXNzZXJ0LnR5cGVvZihcbmxvY2F0aW9uLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ubG9jYXRpb24gaW4gJHtxKHVybCl9IG11c3QgYmUgc3RyaW5nLCBnb3QgJHtxKGxvY2F0aW9uKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcbiBgJHtwYXRofS5uYW1lIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShuYW1lKX1gKTtcblxuYXNzZXJ0LnR5cGVvZihcbmxhYmVsLFxuJ3N0cmluZycsXG4gYCR7cGF0aH0ubGFiZWwgaW4gJHtxKHVybCl9IG11c3QgYmUgc3RyaW5nLCBnb3QgJHtxKGxhYmVsKX1gKTtcblxuXG5hc3NlcnRNb2R1bGVzKG1vZHVsZXMscGF0aCx1cmwpO1xuYXNzZXJ0UGFyc2VycyhwYXJzZXJzLHBhdGgsdXJsKTtcbmFzc2VydFNjb3BlcyhzY29wZXMscGF0aCx1cmwpO1xuYXNzZXJ0VHlwZXModHlwZXMscGF0aCx1cmwpO1xuYXNzZXJ0UG9saWN5KHBvbGljeSxwYXRoLHVybCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRDb21wYXJ0bWVudHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRzPShhbGxlZ2VkQ29tcGFydG1lbnRzLHVybCk9PntcbmNvbnN0IGNvbXBhcnRtZW50cz1PYmplY3QoYWxsZWdlZENvbXBhcnRtZW50cyk7XG5hc3NlcnQoXG5hbGxlZ2VkQ29tcGFydG1lbnRzPT09Y29tcGFydG1lbnRzfHwhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudHMpLFxuIGBjb21wYXJ0bWVudHMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZENvbXBhcnRtZW50cyl9IGluICR7cShcbnVybClcbiB9YCk7XG5cbmZvcihjb25zdFtrZXksdmFsdWVdb2YgT2JqZWN0LmVudHJpZXMoY29tcGFydG1lbnRzKSl7XG5hc3NlcnRDb21wYXJ0bWVudCh2YWx1ZSwgYGNvbXBhcnRtZW50c1ske3Eoa2V5KX1dYCx1cmwpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZEVudHJ5XG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gKi9cbmNvbnN0IGFzc2VydEVudHJ5PShhbGxlZ2VkRW50cnksdXJsKT0+e1xuY29uc3QgZW50cnk9T2JqZWN0KGFsbGVnZWRFbnRyeSk7XG5hc3NlcnQoXG5hbGxlZ2VkRW50cnk9PT1lbnRyeSYmIUFycmF5LmlzQXJyYXkoZW50cnkpLFxuIGBcImVudHJ5XCIgbXVzdCBiZSBhbiBvYmplY3QgaW4gY29tcGFydG1lbnQgbWFwLCBnb3QgJHthbGxlZ2VkRW50cnl9IGluICR7cShcbnVybClcbiB9YCk7XG5cbmNvbnN0e2NvbXBhcnRtZW50LG1vZHVsZSwuLi5leHRyYX09ZW50cnk7XG5hc3NlcnRFbXB0eU9iamVjdChcbmV4dHJhLFxuIGBcImVudHJ5XCIgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnQudHlwZW9mKFxuY29tcGFydG1lbnQsXG4nc3RyaW5nJyxcbiBgZW50cnkuY29tcGFydG1lbnQgbXVzdCBiZSBhIHN0cmluZyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke2NvbXBhcnRtZW50fSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG5hc3NlcnQudHlwZW9mKFxubW9kdWxlLFxuJ3N0cmluZycsXG4gYGVudHJ5Lm1vZHVsZSBtdXN0IGJlIGEgc3RyaW5nIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7bW9kdWxlfSBpbiAke3EoXG51cmwpXG4gfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWRDb21wYXJ0bWVudE1hcFxuICogQHBhcmFtIHtzdHJpbmd9IFt1cmxdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBjb21wYXJ0bWVudE1hcCBpcyBYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29tcGFydG1lbnRNYXBEZXNjcmlwdG9yfVxuICovXG5cbmNvbnN0ICAgICAgICBhc3NlcnRDb21wYXJ0bWVudE1hcD0oXG5hbGxlZ2VkQ29tcGFydG1lbnRNYXAsXG51cmw9Jzx1bmtub3duLWNvbXBhcnRtZW50LW1hcC5qc29uPicpPT5cbntcbmNvbnN0IGNvbXBhcnRtZW50TWFwPU9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnRNYXApO1xuYXNzZXJ0KFxuYWxsZWdlZENvbXBhcnRtZW50TWFwPT09Y29tcGFydG1lbnRNYXAmJiFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50TWFwKSxcbiBgQ29tcGFydG1lbnQgbWFwIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnRNYXB9IGluICR7cShcbnVybClcbiB9YCk7XG5cbmNvbnN0e3RhZ3MsZW50cnksY29tcGFydG1lbnRzLC4uLmV4dHJhfT1PYmplY3QoY29tcGFydG1lbnRNYXApO1xuYXNzZXJ0RW1wdHlPYmplY3QoXG5leHRyYSxcbiBgQ29tcGFydG1lbnQgbWFwIG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbk9iamVjdC5rZXlzKGV4dHJhKSlcbiB9IGluICR7cSh1cmwpfWApO1xuXG5hc3NlcnRUYWdzKHRhZ3MsdXJsKTtcbmFzc2VydEVudHJ5KGVudHJ5LHVybCk7XG5hc3NlcnRDb21wYXJ0bWVudHMoY29tcGFydG1lbnRzLHVybCk7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvbXBhcnRtZW50TWFwKGFzc2VydENvbXBhcnRtZW50TWFwKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdDb21wYXJlIjpbInN0cmluZ0NvbXBhcmUiXSwicGF0aENvbXBhcmUiOlsicGF0aENvbXBhcmUiXSwiYXNzZXJ0Q29tcGFydG1lbnRNYXAiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZeYDsHwDAAB8AwAAMAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL2V4dGVuc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VFeHRlbnNpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIGBwYXJzZUV4dGVuc2lvbmAgcmV0dXJucyB0aGUgZmlsZSBleHRlbnNpb24gZm9yIHRoZSBnaXZlbiBVUkwsIG9yIGFuIGVtcHR5XG4gKiBzdHJpbmcgaWYgdGhlIHBhdGggaGFzIG5vIGV4dGVuc2lvbi5cbiAqIEV4cG9ydGVkIGZvciB0ZXN0cy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBwYXJzZUV4dGVuc2lvbj0obG9jYXRpb24pPT57XG5jb25zdCBsYXN0U2xhc2g9bG9jYXRpb24ubGFzdEluZGV4T2YoJy8nKTtcbmlmKGxhc3RTbGFzaDwwKXtcbnJldHVybicnO1xuIH1cbmNvbnN0IGJhc2U9bG9jYXRpb24uc2xpY2UobGFzdFNsYXNoKzEpO1xuY29uc3QgbGFzdERvdD1iYXNlLmxhc3RJbmRleE9mKCcuJyk7XG5pZihsYXN0RG90PDApe1xucmV0dXJuJyc7XG4gfVxucmV0dXJuIGJhc2Uuc2xpY2UobGFzdERvdCsxKTtcbiB9OyRo4oCNX29uY2UucGFyc2VFeHRlbnNpb24ocGFyc2VFeHRlbnNpb24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhcnNlRXh0ZW5zaW9uIjpbInBhcnNlRXh0ZW5zaW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALDNizTOJwAAzicAADUAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9pbXBvcnQtYXJjaGl2ZS5qc3siaW1wb3J0cyI6WyIuL2NvbXBhcnRtZW50LW1hcC5qcyIsIi4vanNvbi5qcyIsIi4vbGluay5qcyIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9wYXJzZS1ieXRlcy5qcyIsIi4vcGFyc2UtanNvbi5qcyIsIi4vcGFyc2UtcHJlLWNqcy5qcyIsIi4vcGFyc2UtcHJlLW1qcy5qcyIsIi4vcGFyc2UtdGV4dC5qcyIsIi4vcG93ZXJzLmpzIiwiQGVuZG8vemlwIl0sImV4cG9ydHMiOlsiaW1wb3J0QXJjaGl2ZSIsImxvYWRBcmNoaXZlIiwicGFyc2VBcmNoaXZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFppcFJlYWRlcixsaW5rLHBhcnNlclByZUNqcyxwYXJzZXJKc29uLHBhcnNlclRleHQscGFyc2VyQnl0ZXMscGFyc2VyUHJlTWpzLHBhcnNlTG9jYXRlZEpzb24sdW5wYWNrUmVhZFBvd2Vycyxqb2luLGFzc2VydENvbXBhcnRtZW50TWFwOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3ppcFwiLCBbW1wiWmlwUmVhZGVyXCIsIFskaOKAjV9hID0+IChaaXBSZWFkZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9saW5rLmpzXCIsIFtbXCJsaW5rXCIsIFskaOKAjV9hID0+IChsaW5rID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtcHJlLWNqcy5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VyUHJlQ2pzID0gJGjigI1fYSldXV1dLFtcIi4vcGFyc2UtanNvbi5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VySnNvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLXRleHQuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKHBhcnNlclRleHQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1ieXRlcy5qc1wiLCBbW1wiZGVmYXVsdFwiLCBbJGjigI1fYSA9PiAocGFyc2VyQnl0ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXJzZS1wcmUtbWpzLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChwYXJzZXJQcmVNanMgPSAkaOKAjV9hKV1dXV0sW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsIFskaOKAjV9hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjigI1fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsIFskaOKAjV9hID0+ICh1bnBhY2tSZWFkUG93ZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJqb2luXCIsIFskaOKAjV9hID0+IChqb2luID0gJGjigI1fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtbWFwLmpzXCIsIFtbXCJhc3NlcnRDb21wYXJ0bWVudE1hcFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q29tcGFydG1lbnRNYXAgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgRGVmYXVsdENvbXBhcnRtZW50PUNvbXBhcnRtZW50O1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFBhcnNlckltcGxlbWVudGF0aW9uPn0gKi9cbmNvbnN0IHBhcnNlckZvckxhbmd1YWdlPXtcbidwcmUtY2pzLWpzb24nOnBhcnNlclByZUNqcyxcbidwcmUtbWpzLWpzb24nOnBhcnNlclByZU1qcyxcbmpzb246cGFyc2VySnNvbixcbnRleHQ6cGFyc2VyVGV4dCxcbmJ5dGVzOnBhcnNlckJ5dGVzfTtcblxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlcnJvck1lc3NhZ2UgLSBlcnJvciB0byB0aHJvdyBvbiBleGVjdXRlXG4gKiBAcmV0dXJucyB7U3RhdGljTW9kdWxlVHlwZX1cbiAqL1xuY29uc3QgcG9zdHBvbmVFcnJvclRvRXhlY3V0ZT0oZXJyb3JNZXNzYWdlKT0+e1xuLyogUmV0dXJuIGEgcGxhY2UtaG9sZGVyIHRoYXQnZCB0aHJvdyBhbiBlcnJvciBpZiBleGVjdXRlZCovXG4vKiBUaGlzIGFsbG93cyBjanMgcGFyc2VyIHRvIG1vcmUgZWFnZXJseSBmaW5kIGNhbGxzIHRvIHJlcXVpcmUqL1xuLyogLSBpZiBwYXJzZXIgaWRlbnRpZmllZCBhIHJlcXVpcmUgY2FsbCB0aGF0J3MgYSBsb2NhbCBmdW5jdGlvbiwgZXhlY3V0ZSB3aWxsIG5ldmVyIGJlIGNhbGxlZCovXG4vKiAtIGlmIGFjdHVhbCByZXF1aXJlZCBtb2R1bGUgaXMgbWlzc2luZywgdGhlIGVycm9yIHdpbGwgaGFwcGVuIGFueXdheSAtIGF0IGV4ZWN1dGlvbiB0aW1lKi9cblxuY29uc3QgcmVjb3JkPWZyZWV6ZSh7XG5pbXBvcnRzOltdLFxuZXhwb3J0czpbXSxcbmV4ZWN1dGU6KCk9PntcbnRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gfX0pO1xuXG5cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXJjaGl2ZUltcG9ydEhvb2tNYWtlclxuICogQHBhcmFtIHtzdHJpbmd9IHBhY2thZ2VMb2NhdGlvblxuICogQHBhcmFtIHtzdHJpbmd9IHBhY2thZ2VOYW1lXG4gKiBAcmV0dXJucyB7SW1wb3J0SG9va31cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7KHBhdGg6IHN0cmluZykgPT4gVWludDhBcnJheX0gZ2V0XG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50RGVzY3JpcHRvcj59IGNvbXBhcnRtZW50c1xuICogQHBhcmFtIHtzdHJpbmd9IGFyY2hpdmVMb2NhdGlvblxuICogQHBhcmFtIHtIYXNoRm59IFtjb21wdXRlU2hhNTEyXVxuICogQHBhcmFtIHtDb21wdXRlU291cmNlTG9jYXRpb25Ib29rfSBbY29tcHV0ZVNvdXJjZUxvY2F0aW9uXVxuICogQHJldHVybnMge0FyY2hpdmVJbXBvcnRIb29rTWFrZXJ9XG4gKi9cbmNvbnN0IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyPShcbmdldCxcbmNvbXBhcnRtZW50cyxcbmFyY2hpdmVMb2NhdGlvbixcbmNvbXB1dGVTaGE1MTI9dW5kZWZpbmVkLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uPXVuZGVmaW5lZCk9Plxue1xuLyogcGVyLWFzc2VtYmx5OiovXG4vKiogQHR5cGUge0FyY2hpdmVJbXBvcnRIb29rTWFrZXJ9ICovXG5jb25zdCBtYWtlSW1wb3J0SG9vaz0ocGFja2FnZUxvY2F0aW9uLHBhY2thZ2VOYW1lKT0+e1xuLyogcGVyLWNvbXBhcnRtZW50OiovXG5jb25zdHttb2R1bGVzfT1jb21wYXJ0bWVudHNbcGFja2FnZUxvY2F0aW9uXTtcbi8qKiBAdHlwZSB7SW1wb3J0SG9va30gKi9cbmNvbnN0IGltcG9ydEhvb2s9YXN5bmMobW9kdWxlU3BlY2lmaWVyKT0+e1xuLyogcGVyLW1vZHVsZToqL1xuY29uc3QgbW9kdWxlPW1vZHVsZXNbbW9kdWxlU3BlY2lmaWVyXTtcbmlmKG1vZHVsZT09PXVuZGVmaW5lZCl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYENhbm5vdCBmaW5kIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG5wYWNrYWdlTG9jYXRpb24pXG4gfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWApO1xuXG4gfVxuaWYobW9kdWxlLmRlZmVycmVkRXJyb3IhPT11bmRlZmluZWQpe1xucmV0dXJuIHBvc3Rwb25lRXJyb3JUb0V4ZWN1dGUobW9kdWxlLmRlZmVycmVkRXJyb3IpO1xuIH1cbmlmKG1vZHVsZS5wYXJzZXI9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgcGFyc2UgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbnBhY2thZ2VMb2NhdGlvbilcbiB9IGluIGFyY2hpdmUgJHtxKGFyY2hpdmVMb2NhdGlvbil9YCk7XG5cbiB9XG5pZihwYXJzZXJGb3JMYW5ndWFnZVttb2R1bGUucGFyc2VyXT09PXVuZGVmaW5lZCl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYENhbm5vdCBwYXJzZSAke3EobW9kdWxlLnBhcnNlcil9IG1vZHVsZSAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSBpbiBwYWNrYWdlICR7cShwYWNrYWdlTG9jYXRpb24pfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWApO1xuXG4gfVxuY29uc3R7cGFyc2V9PXBhcnNlckZvckxhbmd1YWdlW21vZHVsZS5wYXJzZXJdO1xuY29uc3QgbW9kdWxlTG9jYXRpb249IGAke3BhY2thZ2VMb2NhdGlvbn0vJHttb2R1bGUubG9jYXRpb259YDtcbmNvbnN0IG1vZHVsZUJ5dGVzPWdldChtb2R1bGVMb2NhdGlvbik7XG5cbmlmKGNvbXB1dGVTaGE1MTIhPT11bmRlZmluZWQmJm1vZHVsZS5zaGE1MTIhPT11bmRlZmluZWQpe1xuY29uc3Qgc2hhNTEyPWNvbXB1dGVTaGE1MTIobW9kdWxlQnl0ZXMpO1xuaWYoc2hhNTEyIT09bW9kdWxlLnNoYTUxMil7XG50aHJvdyBuZXcgRXJyb3IoXG4gYE1vZHVsZSAke3EobW9kdWxlLmxvY2F0aW9uKX0gb2YgcGFja2FnZSAke3EoXG5wYWNrYWdlTG9jYXRpb24pXG4gfSBpbiBhcmNoaXZlICR7cShcbmFyY2hpdmVMb2NhdGlvbilcbiB9IGZhaWxlZCBhIFNIQS01MTIgaW50ZWdyaXR5IGNoZWNrYCk7XG5cbiB9XG4gfVxuXG5sZXQgc291cmNlTG9jYXRpb249IGBmaWxlOi8vLyR7bW9kdWxlTG9jYXRpb259YDtcbmlmKHBhY2thZ2VOYW1lIT09dW5kZWZpbmVkKXtcbmNvbnN0IGJhc2U9cGFja2FnZU5hbWUuc3BsaXQoJy8nKS5zbGljZSgtMSkuam9pbignLycpO1xuc291cmNlTG9jYXRpb249IGAuLi4vJHtqb2luKGJhc2UsbW9kdWxlU3BlY2lmaWVyKX1gO1xuIH1cbmlmKGNvbXB1dGVTb3VyY2VMb2NhdGlvbiE9PXVuZGVmaW5lZCl7XG5zb3VyY2VMb2NhdGlvbj1cbmNvbXB1dGVTb3VyY2VMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sbW9kdWxlU3BlY2lmaWVyKXx8XG5zb3VyY2VMb2NhdGlvbjtcbiB9XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wKi9cbmNvbnN0e3JlY29yZH09YXdhaXQgcGFyc2UoXG5tb2R1bGVCeXRlcyxcbm1vZHVsZVNwZWNpZmllcixcbnNvdXJjZUxvY2F0aW9uLFxucGFja2FnZUxvY2F0aW9uKTtcblxucmV0dXJue3JlY29yZCxzcGVjaWZpZXI6bW9kdWxlU3BlY2lmaWVyfTtcbiB9O1xucmV0dXJuIGltcG9ydEhvb2s7XG4gfTtcbnJldHVybiBtYWtlSW1wb3J0SG9vaztcbiB9O1xuXG5jb25zdCBtYWtlRmVhdXhNb2R1bGVFeHBvcnRzTmFtZXNwYWNlPShDb21wYXJ0bWVudCk9Pntcbi8qIEB0cy1pZ25vcmUgVW5jbGVhciBhdCB0aW1lIG9mIHdyaXRpbmcgd2h5IENvbXBhcnRtZW50IHR5cGUgaXMgbm90Ki9cbi8qIGNvbnN0cnVjdGlibGUuKi9cbmNvbnN0IGNvbXBhcnRtZW50PW5ldyBDb21wYXJ0bWVudChcbnt9LFxue30sXG57XG5yZXNvbHZlSG9vaygpe1xucmV0dXJuJy4nO1xuIH0sXG5pbXBvcnRIb29rKCl7XG5yZXR1cm57XG5pbXBvcnRzOltdLFxuZXhlY3V0ZSgpeyB9fTtcblxuIH19KTtcblxuXG5yZXR1cm4gY29tcGFydG1lbnQubW9kdWxlKCcuJyk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGFyY2hpdmVCeXRlc1xuICogQHBhcmFtIHtzdHJpbmd9IFthcmNoaXZlTG9jYXRpb25dXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdGlvbnMuZXhwZWN0ZWRTaGE1MTJdXG4gKiBAcGFyYW0ge0hhc2hGbn0gW29wdGlvbnMuY29tcHV0ZVNoYTUxMl1cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFtvcHRpb25zLm1vZHVsZXNdXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50fSBbb3B0aW9ucy5Db21wYXJ0bWVudF1cbiAqIEBwYXJhbSB7Q29tcHV0ZVNvdXJjZUxvY2F0aW9uSG9va30gW29wdGlvbnMuY29tcHV0ZVNvdXJjZUxvY2F0aW9uXVxuICogQHJldHVybnMge1Byb21pc2U8QXBwbGljYXRpb24+fVxuICovXG5jb25zdCAgICAgICAgcGFyc2VBcmNoaXZlPWFzeW5jKFxuYXJjaGl2ZUJ5dGVzLFxuYXJjaGl2ZUxvY2F0aW9uPSc8dW5rbm93bj4nLFxub3B0aW9ucz17fSk9Plxue1xuY29uc3R7XG5jb21wdXRlU2hhNTEyPXVuZGVmaW5lZCxcbmV4cGVjdGVkU2hhNTEyPXVuZGVmaW5lZCxcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbj11bmRlZmluZWQsXG5Db21wYXJ0bWVudD1EZWZhdWx0Q29tcGFydG1lbnQsXG5tb2R1bGVzPXVuZGVmaW5lZH09XG5vcHRpb25zO1xuXG5jb25zdCBhcmNoaXZlPW5ldyBaaXBSZWFkZXIoYXJjaGl2ZUJ5dGVzLHtuYW1lOmFyY2hpdmVMb2NhdGlvbn0pO1xuXG4vKiBUcmFjayBhbGwgbW9kdWxlcyB0aGF0IGdldCBsb2FkZWQsIGFsbCBmaWxlcyB0aGF0IGFyZSB1c2VkLiovXG5jb25zdCB1bnNlZW49bmV3IFNldChhcmNoaXZlLmZpbGVzLmtleXMoKSk7XG51bnNlZW4uc2l6ZT49Mnx8XG5GYWlsIGBBcmNoaXZlIGZhaWxlZCBzYW5pdHkgY2hlY2s6IHNob3VsZCBjb250YWluIGF0IGxlYXN0IGEgY29tcGFydG1lbnQgbWFwIGZpbGUgYW5kIG9uZSBtb2R1bGUgZmlsZSBpbiAke3EoXG5hcmNoaXZlTG9jYXRpb24pXG4gfWA7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqL1xuY29uc3QgZ2V0PShwYXRoKT0+e1xudW5zZWVuLmRlbGV0ZShwYXRoKTtcbnJldHVybiBhcmNoaXZlLnJlYWQocGF0aCk7XG4gfTtcblxuY29uc3QgY29tcGFydG1lbnRNYXBCeXRlcz1nZXQoJ2NvbXBhcnRtZW50LW1hcC5qc29uJyk7XG5cbmxldCBzaGE1MTI7XG5pZihjb21wdXRlU2hhNTEyIT09dW5kZWZpbmVkKXtcbnNoYTUxMj1jb21wdXRlU2hhNTEyKGNvbXBhcnRtZW50TWFwQnl0ZXMpO1xuIH1cbmlmKGV4cGVjdGVkU2hhNTEyIT09dW5kZWZpbmVkKXtcbmlmKHNoYTUxMj09PXVuZGVmaW5lZCl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYENhbm5vdCB2ZXJpZnkgZXhwZWN0ZWRTaGE1MTIgd2l0aG91dCBhbHNvIHByb3ZpZGluZyBjb21wdXRlU2hhNTEyLCBmb3IgYXJjaGl2ZSAke2FyY2hpdmVMb2NhdGlvbn1gKTtcblxuIH1cbmlmKHNoYTUxMiE9PWV4cGVjdGVkU2hhNTEyKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQXJjaGl2ZSBjb21wYXJ0bWVudCBtYXAgZmFpbGVkIGEgU0hBLTUxMiBpbnRlZ3JpdHkgY2hlY2ssIGV4cGVjdGVkICR7ZXhwZWN0ZWRTaGE1MTJ9LCBnb3QgJHtzaGE1MTJ9LCBmb3IgYXJjaGl2ZSAke2FyY2hpdmVMb2NhdGlvbn1gKTtcblxuIH1cbiB9XG5jb25zdCBjb21wYXJ0bWVudE1hcFRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGNvbXBhcnRtZW50TWFwQnl0ZXMpO1xuY29uc3QgY29tcGFydG1lbnRNYXA9cGFyc2VMb2NhdGVkSnNvbihcbmNvbXBhcnRtZW50TWFwVGV4dCxcbidjb21wYXJ0bWVudC1tYXAuanNvbicpO1xuXG5hc3NlcnRDb21wYXJ0bWVudE1hcChjb21wYXJ0bWVudE1hcCxhcmNoaXZlTG9jYXRpb24pO1xuXG5jb25zdHtcbmNvbXBhcnRtZW50cyxcbmVudHJ5Onttb2R1bGU6bW9kdWxlU3BlY2lmaWVyfX09XG5jb21wYXJ0bWVudE1hcDtcblxuLyogQXJjaGl2ZSBpbnRlZ3JpdHkgY2hlY2tzOiBlbnN1cmUgZXZlcnkgbW9kdWxlIGlzIHByZS1sb2FkZWQgc28gaXRzIGhhc2gqL1xuLyogZ2V0cyBjaGVja2VkLCBhbmQgZW5zdXJlIHRoYXQgZXZlcnkgZmlsZSBpbiB0aGUgYXJjaGl2ZSBpcyB1c2VkLCBhbmQqL1xuLyogdGhlcmVmb3JlIGNoZWNrZWQuKi9cbmlmKGNvbXB1dGVTaGE1MTIhPT11bmRlZmluZWQpe1xuY29uc3QgbWFrZUltcG9ydEhvb2s9bWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIoXG5nZXQsXG5jb21wYXJ0bWVudHMsXG5hcmNoaXZlTG9jYXRpb24sXG5jb21wdXRlU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uKTtcblxuLyogQSB3ZWFrbmVzcyBvZiB0aGUgY3VycmVudCBDb21wYXJ0bWVudCBkZXNpZ24gaXMgdGhhdCB0aGUgYG1vZHVsZXNgIG1hcCovXG4vKiBtdXN0IGJlIGdpdmVuIGEgbW9kdWxlIG5hbWVzcGFjZSBvYmplY3QgdGhhdCBwYXNzZXMgYSBicmFuZCBjaGVjay4qL1xuLyogV2UgZG9uJ3QgaGF2ZSBtb2R1bGUgaW5zdGFuY2VzIGZvciB0aGUgcHJlbG9hZCBwaGFzZSwgc28gd2Ugc3VwcGx5IGZha2UqL1xuLyogbmFtZXNwYWNlcy4qL1xuY29uc3R7Y29tcGFydG1lbnQscGVuZGluZ0pvYnNQcm9taXNlfT1saW5rKGNvbXBhcnRtZW50TWFwLHtcbm1ha2VJbXBvcnRIb29rLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVzOk9iamVjdC5mcm9tRW50cmllcyhcbk9iamVjdC5rZXlzKG1vZHVsZXN8fHt9KS5tYXAoKHNwZWNpZmllcik9PntcbnJldHVybltzcGVjaWZpZXIsbWFrZUZlYXV4TW9kdWxlRXhwb3J0c05hbWVzcGFjZShDb21wYXJ0bWVudCldO1xuIH0pKSxcblxuQ29tcGFydG1lbnR9KTtcblxuXG5hd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbmF3YWl0IGNvbXBhcnRtZW50LmxvYWQobW9kdWxlU3BlY2lmaWVyKTtcbnVuc2Vlbi5zaXplPT09MHx8XG5GYWlsIGBBcmNoaXZlIGNvbnRhaW5zIGV4dHJhbmVvdXMgZmlsZXM6ICR7cShbLi4udW5zZWVuXSl9IGluICR7cShcbmFyY2hpdmVMb2NhdGlvbilcbiB9YDtcbiB9XG5cbi8qKiBAdHlwZSB7RXhlY3V0ZUZufSAqL1xuY29uc3QgZXhlY3V0ZT1hc3luYyhvcHRpb25zKT0+e1xuY29uc3R7Z2xvYmFscyxtb2R1bGVzLHRyYW5zZm9ybXMsX19zaGltVHJhbnNmb3Jtc19fLENvbXBhcnRtZW50fT1cbm9wdGlvbnN8fHt9O1xuY29uc3QgbWFrZUltcG9ydEhvb2s9bWFrZUFyY2hpdmVJbXBvcnRIb29rTWFrZXIoXG5nZXQsXG5jb21wYXJ0bWVudHMsXG5hcmNoaXZlTG9jYXRpb24sXG5jb21wdXRlU2hhNTEyLFxuY29tcHV0ZVNvdXJjZUxvY2F0aW9uKTtcblxuY29uc3R7Y29tcGFydG1lbnQscGVuZGluZ0pvYnNQcm9taXNlfT1saW5rKGNvbXBhcnRtZW50TWFwLHtcbm1ha2VJbXBvcnRIb29rLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5nbG9iYWxzLFxubW9kdWxlcyxcbnRyYW5zZm9ybXMsXG5fX3NoaW1UcmFuc2Zvcm1zX18sXG5Db21wYXJ0bWVudH0pO1xuXG5cbmF3YWl0IHBlbmRpbmdKb2JzUHJvbWlzZTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRvdC1ub3RhdGlvbiovXG5yZXR1cm4gY29tcGFydG1lbnRbJ2ltcG9ydCddKG1vZHVsZVNwZWNpZmllcik7XG4gfTtcblxucmV0dXJue2ltcG9ydDpleGVjdXRlLHNoYTUxMn07XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlYWRGbiB8IFJlYWRQb3dlcnN9IHJlYWRQb3dlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlTG9jYXRpb25cbiAqIEBwYXJhbSB7TG9hZEFyY2hpdmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtQcm9taXNlPEFwcGxpY2F0aW9uPn1cbiAqLyRo4oCNX29uY2UucGFyc2VBcmNoaXZlKHBhcnNlQXJjaGl2ZSk7XG5jb25zdCAgICAgICAgbG9hZEFyY2hpdmU9YXN5bmMoXG5yZWFkUG93ZXJzLFxuYXJjaGl2ZUxvY2F0aW9uLFxub3B0aW9ucz17fSk9Plxue1xuY29uc3R7cmVhZCxjb21wdXRlU2hhNTEyfT11bnBhY2tSZWFkUG93ZXJzKHJlYWRQb3dlcnMpO1xuY29uc3R7ZXhwZWN0ZWRTaGE1MTIsY29tcHV0ZVNvdXJjZUxvY2F0aW9uLG1vZHVsZXN9PW9wdGlvbnM7XG5jb25zdCBhcmNoaXZlQnl0ZXM9YXdhaXQgcmVhZChhcmNoaXZlTG9jYXRpb24pO1xucmV0dXJuIHBhcnNlQXJjaGl2ZShhcmNoaXZlQnl0ZXMsYXJjaGl2ZUxvY2F0aW9uLHtcbmNvbXB1dGVTaGE1MTIsXG5leHBlY3RlZFNoYTUxMixcbmNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbm1vZHVsZXN9KTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWFkRm4gfCBSZWFkUG93ZXJzfSByZWFkUG93ZXJzXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZUxvY2F0aW9uXG4gKiBAcGFyYW0ge0V4ZWN1dGVPcHRpb25zICYgTG9hZEFyY2hpdmVPcHRpb25zfSBvcHRpb25zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fVxuICovJGjigI1fb25jZS5sb2FkQXJjaGl2ZShsb2FkQXJjaGl2ZSk7XG5jb25zdCAgICAgICAgaW1wb3J0QXJjaGl2ZT1hc3luYyhyZWFkUG93ZXJzLGFyY2hpdmVMb2NhdGlvbixvcHRpb25zKT0+e1xuY29uc3QgYXJjaGl2ZT1hd2FpdCBsb2FkQXJjaGl2ZShyZWFkUG93ZXJzLGFyY2hpdmVMb2NhdGlvbixvcHRpb25zKTtcbnJldHVybiBhcmNoaXZlLmltcG9ydChvcHRpb25zKTtcbiB9OyRo4oCNX29uY2UuaW1wb3J0QXJjaGl2ZShpbXBvcnRBcmNoaXZlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADFQABzSQMAAEkDAAArAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvanNvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VMb2NhdGVkSnNvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogUGFyc2VzIEpTT04gYW5kLCBpZiBuZWNlc3NhcnksIHRocm93cyBleGNlcHRpb25zIHRoYXQgaW5jbHVkZSB0aGUgbG9jYXRpb25cbiAqIG9mIHRoZSBvZmZlbmRpbmcgZmlsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc291cmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAqL1xuY29uc3QgICAgICAgIHBhcnNlTG9jYXRlZEpzb249KHNvdXJjZSxsb2NhdGlvbik9PntcbnRyeXtcbnJldHVybiBKU09OLnBhcnNlKHNvdXJjZSk7XG4gfWNhdGNoKGVycm9yKXtcbmlmKGVycm9yIGluc3RhbmNlb2YgU3ludGF4RXJyb3Ipe1xudGhyb3cgbmV3IFN5bnRheEVycm9yKCBgQ2Fubm90IHBhcnNlIEpTT04gZnJvbSAke2xvY2F0aW9ufSwgJHtlcnJvcn1gKTtcbiB9XG50aHJvdyBlcnJvcjtcbiB9XG4gfTskaOKAjV9vbmNlLnBhcnNlTG9jYXRlZEpzb24ocGFyc2VMb2NhdGVkSnNvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFyc2VMb2NhdGVkSnNvbiI6WyJwYXJzZUxvY2F0ZWRKc29uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALqueymAOwAAgDsAACsAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9saW5rLmpzeyJpbXBvcnRzIjpbIi4vZXh0ZW5zaW9uLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImFzc2VtYmxlIiwibGluayIsIm1hcFBhcnNlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcmVzb2x2ZSxwYXJzZUV4dGVuc2lvbixlbmZvcmNlTW9kdWxlUG9saWN5LGF0dGVudWF0ZU1vZHVsZUhvb2ssQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQsZGlhZ25vc2VNaXNzaW5nQ29tcGFydG1lbnRFcnJvcixhdHRlbnVhdGVHbG9iYWxzLG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXI7JGjigI1faW1wb3J0cyhbW1wiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNcIiwgW1tcInJlc29sdmVcIiwgWyRo4oCNX2EgPT4gKHJlc29sdmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9leHRlbnNpb24uanNcIiwgW1tcInBhcnNlRXh0ZW5zaW9uXCIsIFskaOKAjV9hID0+IChwYXJzZUV4dGVuc2lvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLCBbJGjigI1fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRo4oCNX2EpXV0sW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLCBbJGjigI1fYSA9PiAoYXR0ZW51YXRlTW9kdWxlSG9vayA9ICRo4oCNX2EpXV0sW1wiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRcIiwgWyRo4oCNX2EgPT4gKEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UID0gJGjigI1fYSldXSxbXCJkaWFnbm9zZU1pc3NpbmdDb21wYXJ0bWVudEVycm9yXCIsIFskaOKAjV9hID0+IChkaWFnbm9zZU1pc3NpbmdDb21wYXJ0bWVudEVycm9yID0gJGjigI1fYSldXSxbXCJhdHRlbnVhdGVHbG9iYWxzXCIsIFskaOKAjV9hID0+IChhdHRlbnVhdGVHbG9iYWxzID0gJGjigI1fYSldXSxbXCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyXCIsIFskaOKAjV9hID0+IChtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZW50cmllcyxmcm9tRW50cmllc309T2JqZWN0O1xuY29uc3R7aGFzT3duUHJvcGVydHl9PU9iamVjdC5wcm90b3R5cGU7XG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e2FsbFNldHRsZWR9PVByb21pc2U7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHsoaXRlcmFibGU6IEl0ZXJhYmxlPEVSZWY8VD4+KSA9PiBQcm9taXNlPEFycmF5PFByb21pc2VTZXR0bGVkUmVzdWx0PFQ+Pj59XG4gKi9cbmNvbnN0IHByb21pc2VBbGxTZXR0bGVkPWFsbFNldHRsZWQuYmluZChQcm9taXNlKTtcblxuY29uc3QgaW5lcnRTdGF0aWNNb2R1bGVSZWNvcmQ9e1xuaW1wb3J0czpbXSxcbmV4cG9ydHM6W10sXG5leGVjdXRlKCl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYEFzc2VydGlvbiBmYWlsZWQ6IGNvbXBhcnRtZW50IGdyYXBocyBidWlsdCBmb3IgYXJjaGl2ZXMgY2Fubm90IGJlIGluaXRpYWxpemVkYCk7XG5cbiB9fTtcblxuXG5jb25zdCBpbmVydE1vZHVsZU5hbWVzcGFjZT1uZXcgQ29tcGFydG1lbnQoXG57fSxcbnt9LFxue1xucmVzb2x2ZUhvb2soKXtcbnJldHVybicnO1xuIH0sXG4gICAgICBhc3luYyBpbXBvcnRIb29rKCl7XG5yZXR1cm4gaW5lcnRTdGF0aWNNb2R1bGVSZWNvcmQ7XG4gfX0pLlxuXG5tb2R1bGUoJycpO1xuXG5jb25zdCBkZWZhdWx0Q29tcGFydG1lbnQ9Q29tcGFydG1lbnQ7XG5cbi8qIHEsIGFzIGluIHF1b3RlLCBmb3Igc3RyaW5ncyBpbiBlcnJvciBtZXNzYWdlcy4qL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBoYXM9KG9iamVjdCxrZXkpPT5hcHBseShoYXNPd25Qcm9wZXJ0eSxvYmplY3QsW2tleV0pO1xuXG4vKipcbiAqIERlY2lkZSBpZiBleHRlbnNpb24gaXMgY2xlYXJseSBpbmRpY2F0aW5nIGEgcGFyc2VyL2xhbmd1YWdlIGZvciBhIGZpbGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZXh0ZW5zaW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlPShleHRlbnNpb24pPT5leHRlbnNpb24hPT0nanMnO1xuXG4vKipcbiAqIGBtYWtlRXh0ZW5zaW9uUGFyc2VyYCBwcm9kdWNlcyBhIGBwYXJzZXJgIHRoYXQgcGFyc2VzIHRoZSBjb250ZW50IG9mIGFcbiAqIG1vZHVsZSBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIGxhbmd1YWdlLCBnaXZlbiB0aGUgZXh0ZW5zaW9uXG4gKiBvZiB0aGUgbW9kdWxlIHNwZWNpZmllciBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbnRhaW5pbmcgY29tcGFydG1lbnQuXG4gKiBXZSBkbyBub3QgeWV0IHN1cHBvcnQgaW1wb3J0IGFzc2VydGlvbnMgYW5kIHdlIGRvIG5vdCBoYXZlIGEgbWVjaGFuaXNtXG4gKiBmb3IgdmFsaWRhdGluZyB0aGUgTUlNRSB0eXBlIG9mIHRoZSBtb2R1bGUgY29udGVudCBhZ2FpbnN0IHRoZVxuICogbGFuZ3VhZ2UgaW1wbGllZCBieSB0aGUgZXh0ZW5zaW9uIG9yIGZpbGUgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGxhbmd1YWdlRm9yRXh0ZW5zaW9uIC0gbWFwcyBhIGZpbGUgZXh0ZW5zaW9uXG4gKiB0byB0aGUgY29ycmVzcG9uZGluZyBsYW5ndWFnZS5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIgLSBJbiBhIHJhcmUgY2FzZSxcbiAqIHRoZSB0eXBlIG9mIGEgbW9kdWxlIGlzIGltcGxpZWQgYnkgcGFja2FnZS5qc29uIGFuZCBzaG91bGQgbm90IGJlIGluZmVycmVkXG4gKiBmcm9tIGl0cyBleHRlbnNpb24uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFBhcnNlckltcGxlbWVudGF0aW9uPn0gcGFyc2VyRm9yTGFuZ3VhZ2VcbiAqIEBwYXJhbSB7TW9kdWxlVHJhbnNmb3Jtc30gbW9kdWxlVHJhbnNmb3Jtc1xuICogQHJldHVybnMge1BhcnNlRm59XG4gKi9cbmNvbnN0IG1ha2VFeHRlbnNpb25QYXJzZXI9KFxubGFuZ3VhZ2VGb3JFeHRlbnNpb24sXG5sYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbnBhcnNlckZvckxhbmd1YWdlLFxubW9kdWxlVHJhbnNmb3Jtcyk9Plxue1xucmV0dXJuIGFzeW5jKGJ5dGVzLHNwZWNpZmllcixsb2NhdGlvbixwYWNrYWdlTG9jYXRpb24sb3B0aW9ucyk9PntcbmxldCBsYW5ndWFnZTtcbmNvbnN0IGV4dGVuc2lvbj1wYXJzZUV4dGVuc2lvbihsb2NhdGlvbik7XG5cbmlmKFxuIWV4dGVuc2lvbkltcGxpZXNMYW5ndWFnZShleHRlbnNpb24pJiZcbmhhcyhsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixzcGVjaWZpZXIpKVxue1xubGFuZ3VhZ2U9bGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXJbc3BlY2lmaWVyXTtcbiB9ZWxzZXtcbmxhbmd1YWdlPWxhbmd1YWdlRm9yRXh0ZW5zaW9uW2V4dGVuc2lvbl18fGV4dGVuc2lvbjtcbiB9XG5cbmlmKGhhcyhtb2R1bGVUcmFuc2Zvcm1zLGxhbmd1YWdlKSl7XG4oe2J5dGVzLHBhcnNlcjpsYW5ndWFnZX09YXdhaXQgbW9kdWxlVHJhbnNmb3Jtc1tsYW5ndWFnZV0oXG5ieXRlcyxcbnNwZWNpZmllcixcbmxvY2F0aW9uLFxucGFja2FnZUxvY2F0aW9uKSk7XG5cbiB9XG5cbmlmKCFoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsbGFuZ3VhZ2UpKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IHBhcnNlIG1vZHVsZSAke3NwZWNpZmllcn0gYXQgJHtsb2NhdGlvbn0sIG5vIHBhcnNlciBjb25maWd1cmVkIGZvciB0aGUgbGFuZ3VhZ2UgJHtsYW5ndWFnZX1gKTtcblxuIH1cbmNvbnN0e3BhcnNlfT1wYXJzZXJGb3JMYW5ndWFnZVtsYW5ndWFnZV07XG5yZXR1cm4gcGFyc2UoYnl0ZXMsc3BlY2lmaWVyLGxvY2F0aW9uLHBhY2thZ2VMb2NhdGlvbixvcHRpb25zKTtcbiB9O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBMYW5ndWFnZT59IGxhbmd1YWdlRm9yRXh0ZW5zaW9uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHN0cmluZz59IGxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyIC0gSW4gYSByYXJlIGNhc2UsIHRoZSB0eXBlIG9mIGEgbW9kdWxlXG4gKiBpcyBpbXBsaWVkIGJ5IHBhY2thZ2UuanNvbiBhbmQgc2hvdWxkIG5vdCBiZSBpbmZlcnJlZCBmcm9tIGl0cyBleHRlbnNpb24uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIFBhcnNlckltcGxlbWVudGF0aW9uPn0gcGFyc2VyRm9yTGFuZ3VhZ2VcbiAqIEBwYXJhbSB7TW9kdWxlVHJhbnNmb3Jtc30gbW9kdWxlVHJhbnNmb3Jtc1xuICogQHJldHVybnMge1BhcnNlRm59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBQYXJzZXJzPShcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxubGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG5wYXJzZXJGb3JMYW5ndWFnZSxcbm1vZHVsZVRyYW5zZm9ybXM9e30pPT5cbntcbmNvbnN0IGxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcz1bXTtcbmNvbnN0IHByb2JsZW1zPVtdO1xuZm9yKGNvbnN0W2V4dGVuc2lvbixsYW5ndWFnZV1vZiBlbnRyaWVzKGxhbmd1YWdlRm9yRXh0ZW5zaW9uKSl7XG5pZihoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsbGFuZ3VhZ2UpKXtcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcy5wdXNoKFtleHRlbnNpb24sbGFuZ3VhZ2VdKTtcbiB9ZWxzZXtcbnByb2JsZW1zLnB1c2goIGAke3EobGFuZ3VhZ2UpfSBmb3IgZXh0ZW5zaW9uICR7cShleHRlbnNpb24pfWApO1xuIH1cbiB9XG5pZihwcm9ibGVtcy5sZW5ndGg+MCl7XG50aHJvdyBuZXcgRXJyb3IoIGBObyBwYXJzZXIgYXZhaWxhYmxlIGZvciBsYW5ndWFnZTogJHtwcm9ibGVtcy5qb2luKCcsICcpfWApO1xuIH1cbnJldHVybiBtYWtlRXh0ZW5zaW9uUGFyc2VyKFxuZnJvbUVudHJpZXMobGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzKSxcbmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyLFxucGFyc2VyRm9yTGFuZ3VhZ2UsXG5tb2R1bGVUcmFuc2Zvcm1zKTtcblxuIH07XG5cbi8qKlxuICogRm9yIGEgZnVsbCwgYWJzb2x1dGUgbW9kdWxlIHNwZWNpZmllciBsaWtlIFwiZGVwZW5kZW5jeVwiLFxuICogcHJvZHVjZSB0aGUgbW9kdWxlIHNwZWNpZmllciBpbiB0aGUgZGVwZW5kZW5jeSwgbGlrZSBcIi5cIi5cbiAqIEZvciBhIGRlZXBlciBwYXRoIGxpa2UgXCJAb3JnL2RlcC9hdXhcIiBhbmQgYSBwcmVmaXggbGlrZSBcIkBvcmcvZGVwXCIsIHByb2R1Y2VcbiAqIFwiLi9hdXhcIi5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlU3BlY2lmaWVyXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqLyRo4oCNX29uY2UubWFwUGFyc2VycyhtYXBQYXJzZXJzKTtcbmNvbnN0IHRyaW1Nb2R1bGVTcGVjaWZpZXJQcmVmaXg9KG1vZHVsZVNwZWNpZmllcixwcmVmaXgpPT57XG5pZihtb2R1bGVTcGVjaWZpZXI9PT1wcmVmaXgpe1xucmV0dXJuJy4nO1xuIH1cbmlmKG1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCBgJHtwcmVmaXh9L2ApKXtcbnJldHVybiBgLi8ke21vZHVsZVNwZWNpZmllci5zbGljZShwcmVmaXgubGVuZ3RoKzEpfWA7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuXG4vKipcbiAqIGBtYWtlTW9kdWxlTWFwSG9va2AgZ2VuZXJhdGVzIGEgYG1vZHVsZU1hcEhvb2tgIGZvciB0aGUgYENvbXBhcnRtZW50YFxuICogY29uc3RydWN0b3IsIHN1aXRhYmxlIGZvciBOb2RlLmpzIHN0eWxlIHBhY2thZ2VzIHdoZXJlIGFueSBtb2R1bGUgaW4gdGhlXG4gKiBwYWNrYWdlIG1pZ2h0IGJlIGltcG9ydGVkLlxuICogU2luY2Ugc2VhcmNoaW5nIGZvciBhbGwgb2YgdGhlc2UgbW9kdWxlcyB1cCBmcm9udCBpcyBlaXRoZXIgbmVlZGxlc3NseVxuICogY29zdGx5IChvbiBhIGZpbGUgc3lzdGVtKSBvciBpbXBvc3NpYmxlIChmcm9tIGEgd2ViIHNlcnZpY2UpLCB3ZVxuICogbGV0IHRoZSBpbXBvcnQgZ3JhcGggZ3VpZGUgb3VyIHNlYXJjaC5cbiAqIEFueSBtb2R1bGUgc3BlY2lmaWVyIHdpdGggYW4gYWJzb2x1dGUgcHJlZml4IHNob3VsZCBiZSBjYXB0dXJlZCBieVxuICogdGhlIGBtb2R1bGVNYXBgIG9yIGBtb2R1bGVNYXBIb29rYC5cbiAqXG4gKiBAcGFyYW0ge0NvbXBhcnRtZW50RGVzY3JpcHRvcn0gY29tcGFydG1lbnREZXNjcmlwdG9yXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50Pn0gY29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tcGFydG1lbnROYW1lXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIE1vZHVsZURlc2NyaXB0b3I+fSBtb2R1bGVEZXNjcmlwdG9yc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBNb2R1bGVEZXNjcmlwdG9yPn0gc2NvcGVEZXNjcmlwdG9yc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+fSBleGl0TW9kdWxlc1xuICogQHBhcmFtIHtEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IGF0dGVudWF0b3JzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFyY2hpdmVPbmx5XG4gKiBAcmV0dXJucyB7TW9kdWxlTWFwSG9vayB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgbWFrZU1vZHVsZU1hcEhvb2s9KFxuY29tcGFydG1lbnREZXNjcmlwdG9yLFxuY29tcGFydG1lbnRzLFxuY29tcGFydG1lbnROYW1lLFxubW9kdWxlRGVzY3JpcHRvcnMsXG5zY29wZURlc2NyaXB0b3JzLFxuZXhpdE1vZHVsZXMsXG5hdHRlbnVhdG9ycyxcbmFyY2hpdmVPbmx5KT0+XG57XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVTcGVjaWZpZXJcbiAqIEByZXR1cm5zIHtzdHJpbmcgfCBvYmplY3QgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1vZHVsZU1hcEhvb2s9KG1vZHVsZVNwZWNpZmllcik9PntcbmNvbXBhcnRtZW50RGVzY3JpcHRvci5yZXRhaW5lZD10cnVlO1xuXG5jb25zdCBtb2R1bGVEZXNjcmlwdG9yPW1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl07XG5pZihtb2R1bGVEZXNjcmlwdG9yIT09dW5kZWZpbmVkKXtcbi8qIFwiZm9yZWlnbkNvbXBhcnRtZW50TmFtZVwiIHJlZmVycyB0byB0aGUgY29tcGFydG1lbnQgd2hpY2gqL1xuLyogbWF5IGRpZmZlciBmcm9tIHRoZSBjdXJyZW50IGNvbXBhcnRtZW50Ki9cbmNvbnN0e1xuY29tcGFydG1lbnQ6Zm9yZWlnbkNvbXBhcnRtZW50TmFtZT1jb21wYXJ0bWVudE5hbWUsXG5tb2R1bGU6Zm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbmV4aXR9PVxubW9kdWxlRGVzY3JpcHRvcjtcbmlmKGV4aXQhPT11bmRlZmluZWQpe1xuZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsY29tcGFydG1lbnREZXNjcmlwdG9yLHtcbmV4aXQ6dHJ1ZX0pO1xuXG5jb25zdCBtb2R1bGU9ZXhpdE1vZHVsZXNbZXhpdF07XG5pZihtb2R1bGU9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgaW1wb3J0IG1pc3NpbmcgZXh0ZXJuYWwgbW9kdWxlICR7cShcbmV4aXQpXG4gfSwgbWF5IGJlIG1pc3NpbmcgZnJvbSAke2NvbXBhcnRtZW50TmFtZX0gcGFja2FnZS5qc29uYCk7XG5cbiB9XG5pZihhcmNoaXZlT25seSl7XG5yZXR1cm4gaW5lcnRNb2R1bGVOYW1lc3BhY2U7XG4gfWVsc2V7XG5yZXR1cm4gYXR0ZW51YXRlTW9kdWxlSG9vayhcbmV4aXQsXG5tb2R1bGUsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuYXR0ZW51YXRvcnMpO1xuXG4gfVxuIH1cbmlmKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIhPT11bmRlZmluZWQpe1xuaWYoIW1vZHVsZVNwZWNpZmllci5zdGFydHNXaXRoKCcuLycpKXtcbi8qIGFyY2hpdmUgZ29lcyB0aHJvdWdoIGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIgZm9yIGxvY2FsIG1vZHVsZXMgdG9vKi9cbmVuZm9yY2VNb2R1bGVQb2xpY3kobW9kdWxlU3BlY2lmaWVyLGNvbXBhcnRtZW50RGVzY3JpcHRvcix7XG5leGl0OmZhbHNlfSk7XG5cbiB9XG5cbmNvbnN0IGZvcmVpZ25Db21wYXJ0bWVudD1jb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG5pZihmb3JlaWduQ29tcGFydG1lbnQ9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgaW1wb3J0IGZyb20gbWlzc2luZyBjb21wYXJ0bWVudCAke3EoXG5mb3JlaWduQ29tcGFydG1lbnROYW1lKVxuIH0ke2RpYWdub3NlTWlzc2luZ0NvbXBhcnRtZW50RXJyb3Ioe1xubW9kdWxlU3BlY2lmaWVyLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLFxuZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbmZvcmVpZ25Db21wYXJ0bWVudE5hbWV9KVxuIH1gKTtcblxuIH1cbnJldHVybiBmb3JlaWduQ29tcGFydG1lbnQubW9kdWxlKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIpO1xuIH1cbiB9ZWxzZSBpZihoYXMoZXhpdE1vZHVsZXMsbW9kdWxlU3BlY2lmaWVyKSl7XG5lbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllcixjb21wYXJ0bWVudERlc2NyaXB0b3Ise1xuZXhpdDp0cnVlfSk7XG5cblxuLyogV2hlbiBsaW5raW5nIG9mZiB0aGUgZmlsZXN5c3RlbSBhcyB3aXRoIGBpbXBvcnRMb2NhdGlvbmAsKi9cbi8qIHRoZXJlIGlzbid0IGEgbW9kdWxlIGRlc2NyaXB0b3IgZm9yIGV2ZXJ5IG1vZHVsZS4qL1xubW9kdWxlRGVzY3JpcHRvcnNbbW9kdWxlU3BlY2lmaWVyXT17ZXhpdDptb2R1bGVTcGVjaWZpZXJ9O1xuaWYoYXJjaGl2ZU9ubHkpe1xucmV0dXJuIGluZXJ0TW9kdWxlTmFtZXNwYWNlO1xuIH1lbHNle1xucmV0dXJuIGF0dGVudWF0ZU1vZHVsZUhvb2soXG5tb2R1bGVTcGVjaWZpZXIsXG5leGl0TW9kdWxlc1ttb2R1bGVTcGVjaWZpZXJdLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbmF0dGVudWF0b3JzKTtcblxuIH1cbiB9XG5cbi8qIFNlYXJjaCBmb3IgYSBzY29wZSB0aGF0IHNoYXJlcyBhIHByZWZpeCB3aXRoIHRoZSByZXF1ZXN0ZWQgbW9kdWxlKi9cbi8qIHNwZWNpZmllci4qL1xuLyogVGhpcyBtaWdodCBiZSBiZXR0ZXIgd2l0aCBhIHRyaWUsIGJ1dCBvbmx5IGEgYmVuY2htYXJrIG9uIHJlYWwtd29ybGQqL1xuLyogZGF0YSB3b3VsZCB0ZWxsIHVzIHdoZXRoZXIgdGhlIGFkZGl0aW9uYWwgY29tcGxleGl0eSB3b3VsZCB0cmFuc2xhdGUgdG8qL1xuLyogYmV0dGVyIHBlcmZvcm1hbmNlLCBzbyB0aGlzIGlzIGxlZnQgcmVhZGFibGUgYW5kIHByZXN1bWVkIHNsb3cgZm9yIG5vdy4qL1xuZm9yKGNvbnN0W3Njb3BlUHJlZml4LHNjb3BlRGVzY3JpcHRvcl1vZiBlbnRyaWVzKHNjb3BlRGVzY3JpcHRvcnMpKXtcbmNvbnN0IGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXI9dHJpbU1vZHVsZVNwZWNpZmllclByZWZpeChcbm1vZHVsZVNwZWNpZmllcixcbnNjb3BlUHJlZml4KTtcblxuXG5pZihmb3JlaWduTW9kdWxlU3BlY2lmaWVyIT09dW5kZWZpbmVkKXtcbmNvbnN0e2NvbXBhcnRtZW50OmZvcmVpZ25Db21wYXJ0bWVudE5hbWV9PXNjb3BlRGVzY3JpcHRvcjtcbmlmKGZvcmVpZ25Db21wYXJ0bWVudE5hbWU9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgaW1wb3J0IGZyb20gc2NvcGUgJHtzY29wZVByZWZpeH0gZHVlIHRvIG1pc3NpbmcgXCJjb21wYXJ0bWVudFwiIHByb3BlcnR5YCk7XG5cbiB9XG5jb25zdCBmb3JlaWduQ29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW2ZvcmVpZ25Db21wYXJ0bWVudE5hbWVdO1xuaWYoZm9yZWlnbkNvbXBhcnRtZW50PT09dW5kZWZpbmVkKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGltcG9ydCBmcm9tIG1pc3NpbmcgY29tcGFydG1lbnQgJHtxKFxuZm9yZWlnbkNvbXBhcnRtZW50TmFtZSlcbiB9JHtkaWFnbm9zZU1pc3NpbmdDb21wYXJ0bWVudEVycm9yKHtcbm1vZHVsZVNwZWNpZmllcixcbmNvbXBhcnRtZW50RGVzY3JpcHRvcixcbmZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIsXG5mb3JlaWduQ29tcGFydG1lbnROYW1lfSlcbiB9YCk7XG5cbiB9XG5cbi8qIERlc3BpdGUgYWxsIG5vbi1leGl0IG1vZHVsZXMgbm90IGFsbG93ZWQgYnkgcG9saWN5IGJlaW5nIGRyb3BwZWQqL1xuLyogd2hpbGUgYnVpbGRpbmcgdGhlIGdyYXBoLCB0aGlzIGNoZWNrIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG1vZHVsZSovXG4vKiBpcyB3cml0dGVuIGJhY2sgdG8gdGhlIGNvbXBhcnRtZW50IG1hcCBiZWxvdy4qL1xuZW5mb3JjZU1vZHVsZVBvbGljeShzY29wZVByZWZpeCxjb21wYXJ0bWVudERlc2NyaXB0b3Ise1xuZXhpdDpmYWxzZX0pO1xuXG4vKiBUaGUgZm9sbG93aW5nIGxpbmUgaXMgd2VpcmQuKi9cbi8qIEluZm9ybWF0aW9uIGlzIGZsb3dpbmcgYmFja3dhcmQuKi9cbi8qIFRoaXMgbW9kdWxlTWFwSG9vayB3cml0ZXMgYmFjayB0byB0aGUgYG1vZHVsZXNgIGRlc2NyaXB0b3IsIGZyb20gdGhlKi9cbi8qIG9yaWdpbmFsIGNvbXBhcnRtZW50IG1hcC4qL1xuLyogU28gdGhlIGNvbXBhcnRtZW50IG1hcCB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgY29tcGFydG1lbnQqL1xuLyogYXNzZW1ibHksIGNhbiB0aGVuIGJlIGNhcHR1cmVkIGluIGFuIGFyY2hpdmUsIG9idmlhdGluZyB0aGUgbmVlZCBmb3IqL1xuLyogYSBtb2R1bGVNYXBIb29rIHdoZW4gd2UgYXNzZW1ibGUgY29tcGFydG1lbnRzIGZyb20gdGhlIHJlc3VsdGluZyovXG4vKiBhcmNoaXZlLiovXG5tb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdPXtcbmNvbXBhcnRtZW50OmZvcmVpZ25Db21wYXJ0bWVudE5hbWUsXG5tb2R1bGU6Zm9yZWlnbk1vZHVsZVNwZWNpZmllcn07XG5cbnJldHVybiBmb3JlaWduQ29tcGFydG1lbnQubW9kdWxlKGZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIpO1xuIH1cbiB9XG5cbi8qIE5vIGVudHJ5IGluIHRoZSBtb2R1bGUgbWFwLiovXG4vKiBDb21wYXJ0bWVudHMgd2lsbCBmYWxsIHRocm91Z2ggdG8gdGhlaXIgYGltcG9ydEhvb2tgLiovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07XG5cbnJldHVybiBtb2R1bGVNYXBIb29rO1xuIH07XG5cbi8qKlxuICogQXNzZW1ibGUgYSBEQUcgb2YgY29tcGFydG1lbnRzIGFzIGRlY2xhcmVkIGluIGEgY29tcGFydG1lbnQgbWFwIHN0YXJ0aW5nIGF0XG4gKiB0aGUgbmFtZWQgY29tcGFydG1lbnQgYW5kIGJ1aWxkaW5nIGFsbCBjb21wYXJ0bWVudHMgdGhhdCBpdCBkZXBlbmRzIHVwb24sXG4gKiByZWN1cnNpdmVseSB0aHJlYWRpbmcgdGhlIG1vZHVsZXMgZXhwb3J0ZWQgYnkgb25lIGNvbXBhcnRtZW50IGludG8gdGhlXG4gKiBjb21wYXJ0bWVudCB0aGF0IGltcG9ydHMgdGhlbS5cbiAqIFJldHVybnMgdGhlIHJvb3Qgb2YgdGhlIGNvbXBhcnRtZW50IERBRy5cbiAqIERvZXMgbm90IGxvYWQgb3IgZXhlY3V0ZSBhbnkgbW9kdWxlcy5cbiAqIFVzZXMgbWFrZUltcG9ydEhvb2sgd2l0aCB0aGUgZ2l2ZW4gXCJsb2NhdGlvblwiIHN0cmluZyBvZiBlYWNoIGNvbXBhcnRtZW50IGluXG4gKiB0aGUgREFHLlxuICogUGFzc2VzIHRoZSBnaXZlbiBnbG9iYWxzIGFuZCBleHRlcm5hbCBtb2R1bGVzIGludG8gdGhlIHJvb3QgY29tcGFydG1lbnRcbiAqIG9ubHkuXG4gKlxuICogQHBhcmFtIHtDb21wYXJ0bWVudE1hcERlc2NyaXB0b3J9IGNvbXBhcnRtZW50TWFwXG4gKiBAcGFyYW0ge0xpbmtPcHRpb25zfSBvcHRpb25zXG4gKi9cbmNvbnN0ICAgICAgICBsaW5rPShcbntlbnRyeSxjb21wYXJ0bWVudHM6Y29tcGFydG1lbnREZXNjcmlwdG9yc30sXG57XG5tYWtlSW1wb3J0SG9vayxcbnBhcnNlckZvckxhbmd1YWdlLFxuZ2xvYmFscz17fSxcbnRyYW5zZm9ybXM9W10sXG5tb2R1bGVUcmFuc2Zvcm1zPXt9LFxuX19zaGltVHJhbnNmb3Jtc19fPVtdLFxubW9kdWxlczpleGl0TW9kdWxlcz17fSxcbmFyY2hpdmVPbmx5PWZhbHNlLFxuQ29tcGFydG1lbnQ9ZGVmYXVsdENvbXBhcnRtZW50fSk9PlxuXG57XG5jb25zdHtjb21wYXJ0bWVudDplbnRyeUNvbXBhcnRtZW50TmFtZX09ZW50cnk7XG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgQ29tcGFydG1lbnQ+fSAqL1xuY29uc3QgY29tcGFydG1lbnRzPU9iamVjdC5jcmVhdGUobnVsbCk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGF0dGVudWF0b3JTcGVjaWZpZXJcbiAqL1xuY29uc3QgYXR0ZW51YXRvcnM9bWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcihcbmNvbXBhcnRtZW50cyxcbmNvbXBhcnRtZW50RGVzY3JpcHRvcnMpO1xuXG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmVzb2x2ZUhvb2s+fSAqL1xuY29uc3QgcmVzb2x2ZXJzPU9iamVjdC5jcmVhdGUobnVsbCk7XG5cbmNvbnN0IHBlbmRpbmdKb2JzPVtdO1xuXG5mb3IoY29uc3RbY29tcGFydG1lbnROYW1lLGNvbXBhcnRtZW50RGVzY3JpcHRvcl1vZiBlbnRyaWVzKFxuY29tcGFydG1lbnREZXNjcmlwdG9ycykpXG57XG5jb25zdHtcbmxvY2F0aW9uLFxubmFtZSxcbm1vZHVsZXM9T2JqZWN0LmNyZWF0ZShudWxsKSxcbnBhcnNlcnM6bGFuZ3VhZ2VGb3JFeHRlbnNpb249T2JqZWN0LmNyZWF0ZShudWxsKSxcbnR5cGVzOmxhbmd1YWdlRm9yTW9kdWxlU3BlY2lmaWVyPU9iamVjdC5jcmVhdGUobnVsbCksXG5zY29wZXM9T2JqZWN0LmNyZWF0ZShudWxsKX09XG5jb21wYXJ0bWVudERlc2NyaXB0b3I7XG5cbi8qIENhcHR1cmUgdGhlIGRlZmF1bHQuKi9cbi8qIFRoZSBgbW9kdWxlTWFwSG9va2Agd3JpdGVzIGJhY2sgdG8gdGhlIGNvbXBhcnRtZW50IG1hcC4qL1xuY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXM9bW9kdWxlcztcblxuY29uc3QgcGFyc2U9bWFwUGFyc2Vycyhcbmxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxubGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG5wYXJzZXJGb3JMYW5ndWFnZSxcbm1vZHVsZVRyYW5zZm9ybXMpO1xuXG4vKiogQHR5cGUge1Nob3VsZERlZmVyRXJyb3J9ICovXG5jb25zdCBzaG91bGREZWZlckVycm9yPShsYW5ndWFnZSk9PntcbmlmKGxhbmd1YWdlJiZoYXMocGFyc2VyRm9yTGFuZ3VhZ2UsbGFuZ3VhZ2UpKXtcbnJldHVybiBwYXJzZXJGb3JMYW5ndWFnZVtsYW5ndWFnZV0uaGV1cmlzdGljSW1wb3J0cztcbiB9ZWxzZXtcbi8qIElmIGxhbmd1YWdlIGlzIHVuZGVmaW5lZCBvciB0aGVyZSdzIG5vIHBhcnNlciwgdGhlIGVycm9yIHdlIGNvdWxkIGNvbnNpZGVyIGRlZmVycmluZyBpcyBzdXJlbHkgcmVsYXRlZCB0byovXG4vKiB0aGF0LiBOb3RoaW5nIHRvIHRocm93IGhlcmUuKi9cbnJldHVybiBmYWxzZTtcbiB9XG4gfTtcblxuY29uc3QgaW1wb3J0SG9vaz1tYWtlSW1wb3J0SG9vayhcbmxvY2F0aW9uLFxubmFtZSxcbnBhcnNlLFxuc2hvdWxkRGVmZXJFcnJvcixcbmNvbXBhcnRtZW50cyk7XG5cbmNvbnN0IG1vZHVsZU1hcEhvb2s9bWFrZU1vZHVsZU1hcEhvb2soXG5jb21wYXJ0bWVudERlc2NyaXB0b3IsXG5jb21wYXJ0bWVudHMsXG5jb21wYXJ0bWVudE5hbWUsXG5tb2R1bGVzLFxuc2NvcGVzLFxuZXhpdE1vZHVsZXMsXG5hdHRlbnVhdG9ycyxcbmFyY2hpdmVPbmx5KTtcblxuY29uc3QgcmVzb2x2ZUhvb2s9cmVzb2x2ZTtcbnJlc29sdmVyc1tjb21wYXJ0bWVudE5hbWVdPXJlc29sdmU7XG5cbmNvbnN0IGNvbXBhcnRtZW50PW5ldyBDb21wYXJ0bWVudChPYmplY3QuY3JlYXRlKG51bGwpLHVuZGVmaW5lZCx7XG5yZXNvbHZlSG9vayxcbmltcG9ydEhvb2ssXG5tb2R1bGVNYXBIb29rLFxudHJhbnNmb3Jtcyxcbl9fc2hpbVRyYW5zZm9ybXNfXyxcbm5hbWU6bG9jYXRpb259KTtcblxuXG5pZighYXJjaGl2ZU9ubHkpe1xuYXR0ZW51YXRlR2xvYmFscyhcbmNvbXBhcnRtZW50Lmdsb2JhbFRoaXMsXG5nbG9iYWxzLFxuY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbmF0dGVudWF0b3JzLFxucGVuZGluZ0pvYnMsXG5jb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSk7XG5cbiB9XG5cbmNvbXBhcnRtZW50c1tjb21wYXJ0bWVudE5hbWVdPWNvbXBhcnRtZW50O1xuIH1cblxuY29uc3QgY29tcGFydG1lbnQ9Y29tcGFydG1lbnRzW2VudHJ5Q29tcGFydG1lbnROYW1lXTtcbmlmKGNvbXBhcnRtZW50PT09dW5kZWZpbmVkKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGFzc2VtYmxlIGNvbXBhcnRtZW50IGdyYXBoIGJlY2F1c2UgdGhlIHJvb3QgY29tcGFydG1lbnQgbmFtZWQgJHtxKFxuZW50cnlDb21wYXJ0bWVudE5hbWUpXG4gfSBpcyBtaXNzaW5nIGZyb20gdGhlIGNvbXBhcnRtZW50IG1hcGApO1xuXG4gfVxuY29uc3QgYXR0ZW51YXRvcnNDb21wYXJ0bWVudD1jb21wYXJ0bWVudHNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdO1xuXG5yZXR1cm57XG5jb21wYXJ0bWVudCxcbmNvbXBhcnRtZW50cyxcbnJlc29sdmVycyxcbmF0dGVudWF0b3JzQ29tcGFydG1lbnQsXG5wZW5kaW5nSm9ic1Byb21pc2U6cHJvbWlzZUFsbFNldHRsZWQocGVuZGluZ0pvYnMpLnRoZW4oXG4vKiogQHBhcmFtIHtQcm9taXNlU2V0dGxlZFJlc3VsdDx1bmtub3duPltdfSByZXN1bHRzICovKHJlc3VsdHMpPT57XG5jb25zdCBlcnJvcnM9cmVzdWx0cy5cbmZpbHRlcigocmVzdWx0KT0+cmVzdWx0LnN0YXR1cz09PSdyZWplY3RlZCcpLlxubWFwKFxuLyoqIEBwYXJhbSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0fSByZXN1bHQgKi8ocmVzdWx0KT0+XG5yZXN1bHQucmVhc29uKTtcblxuaWYoZXJyb3JzLmxlbmd0aD4wKXtcbnRocm93IG5ldyBFcnJvcihcbiBgR2xvYmFscyBhdHRlbnVhdGlvbiBlcnJvcnM6ICR7ZXJyb3JzLlxubWFwKChlcnJvcik9PmVycm9yLm1lc3NhZ2UpLlxuam9pbignLCAnKSB9YCk7XG5cbiB9XG4gfSl9O1xuXG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7Q29tcGFydG1lbnRNYXBEZXNjcmlwdG9yfSBjb21wYXJ0bWVudE1hcFxuICogQHBhcmFtIHtMaW5rT3B0aW9uc30gb3B0aW9uc1xuICovJGjigI1fb25jZS5saW5rKGxpbmspO1xuY29uc3QgICAgICAgIGFzc2VtYmxlPShjb21wYXJ0bWVudE1hcCxvcHRpb25zKT0+XG5saW5rKGNvbXBhcnRtZW50TWFwLG9wdGlvbnMpLmNvbXBhcnRtZW50OyRo4oCNX29uY2UuYXNzZW1ibGUoYXNzZW1ibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcFBhcnNlcnMiOlsibWFwUGFyc2VycyJdLCJsaW5rIjpbImxpbmsiXSwiYXNzZW1ibGUiOlsiYXNzZW1ibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOmXnMeQUAADkFAAAPAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiam9pbiIsInJlbGF0aXZpemUiLCJyZXNvbHZlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyogcSwgYXMgaW4gcXVvdGUsIGZvciBlcnJvciBtZXNzYWdlcy4qL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBBZHZhbmNlcyBhIHBhcnRpYWwgbW9kdWxlIHNwZWNpZmllciBzb2x1dGlvbiBieSBmb2xsb3dpbmcgdGhlIHBhdGhcbiAqIGNvbXBvbmVudHMgaW4gdGhlIGdpdmVuIHByb2JsZW0uXG4gKiBUaGUgcHJvYmxlbSBtYXkgbm90IHByb2R1Y2UgYSBwYXRoIHRoYXQgZXNjYXBlcyB0aGUgc29sdXRpb24sIHRoYXQgaXMsIHRoZVxuICogcHJvYmxlbSBtYXkgbm90IHRyYXZlcnNlIHVwIGZyb20gYW4gZW1wdHkgc29sdXRpb24uXG4gKiBgU29sdmVgIHJldHVybnMgZmFsc2UgaWYgdGhlIHByb2JsZW0gYXR0ZW1wdHMgdG8gZXNjYXBlLlxuICogQWR2YW5kaW5nIGEgcGFydGlhbCBzb2x1dGlvbiBpcyB0aGUgY29yZSBvZiBgcmVzb2x2ZWAsIGBqb2luYCwgYW5kXG4gKiBgcmVsYXRpdml6ZWAsIHdoaWNoIGhhdmUgZGlmZmVyZW50IGludmFyaWFudHMuXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzb2x1dGlvbiAtIGZ1bGx5IHJlc29sdmVkIHBhdGggY29tcG9uZW50cywgaW5jbHVkaW5nXG4gKiBhbnkgZnJvbSBhIHByaW9yIHBhdGggcmVzb2x1dGlvbiBpbml0aWFsbHkuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHByb2JsZW0gLSBwYXJ0aWFsbHkgcmVzb2x2ZWQgcGF0aCBjb21wb25lbnRzLCB0aGF0XG4gKiBpcywgaW5jbHVkaW5nICcuJyBhbmQgJy4uJyBjb21wb25lbnRzLlxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIHNvbHZlciB0ZXJtaW5hdGVkIGVhcmx5IGJlY2F1c2Ugb2YgYVxuICogbm9uc2Vuc2ljYWwgYXR0ZW1wdCB0byB0cmF2ZXJzZSBhYm92ZSB0aGUgcm9vdCBkaXJlY3RvcnkuXG4gKi9cbmNvbnN0IHNvbHZlPShzb2x1dGlvbixwcm9ibGVtKT0+e1xuZm9yKGNvbnN0IHBhcnQgb2YgcHJvYmxlbSl7XG5pZihwYXJ0PT09Jy4nfHxwYXJ0PT09Jycpe1xuLyogbm8tb3AqL1xuIH1lbHNlIGlmKHBhcnQ9PT0nLi4nKXtcbmlmKHNvbHV0aW9uLmxlbmd0aD09PTApe1xucmV0dXJuIGZhbHNlO1xuIH1cbnNvbHV0aW9uLnBvcCgpO1xuIH1lbHNle1xuc29sdXRpb24ucHVzaChwYXJ0KTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBgUmVzb2x2ZWAgY29tcHV0ZXMgdGhlIGZ1bGwgbW9kdWxlIHNwZWNpZmllciBmb3IgYSBnaXZlbiBpbXBvcnRlZCBtb2R1bGUgc3BlY2lmaWVyXG4gKiByZWxhdGl2ZSB0byB0aGUgcmVmZXJyZXIgbW9kdWxlIHNwZWNpZmllci5cbiAqIEluIE5vZGUuanMgY29tcGFydG1lbnRzLCB0aGUgcmVmZXJyZXIgbXVzdCBiZSBhbiBpbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyXG4gKiBpbiB0aGUgY29udGV4dCBvZiBhIGNvbXBhcnRtZW50LCBhbmQgYWxsIGludGVybmFsIG1vZHVsZSBzcGVjaWZpZXJzIGJlZ2luXG4gKiB3aXRoIGEgXCIuXCIgcGF0aCBjb21wb25lbnQuXG4gKiBUaGUgcmVmZXJlbnQgbWF5IGJlIGVpdGhlciBpbnRlcm5hbCBvciBleHRlcm5hbC5cbiAqIEluIE5vZGUuanMsIGZ1bGx5IHJlc29sdmVkIHBhdGhzIGFyZSB2YWxpZCBtb2R1bGUgc3BlY2lmaWVycywgYnV0IHRoZXNlXG4gKiBwYXRocyB0aGF0IGJlZ2luIHdpdGggLyBhcmUgZGlzYWxsb3dlZCBhcyB0aGV5IGNvdWxkIGJlIHVzZWQgdG8gZGVmZWF0XG4gKiBjb21wYXJ0bWVudCBjb250YWlubWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3BlYyAtIGEgcGF0aCB0byByZXNvbHZlLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlZmVycmVyIC0gdGhlIGZ1bGx5IHJlc29sdmVkIHBhdGggb2YgcmVmZXJyZXIgbW9kdWxlLlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGZ1bGx5IHJlc29sdmVkIHBhdGguXG4gKi9cbmNvbnN0ICAgICAgICByZXNvbHZlPShzcGVjLHJlZmVycmVyKT0+e1xuc3BlYz1TdHJpbmcoc3BlY3x8JycpO1xucmVmZXJyZXI9U3RyaW5nKHJlZmVycmVyfHwnJyk7XG5cbmlmKHNwZWMuc3RhcnRzV2l0aCgnLycpKXtcbnRocm93IG5ldyBFcnJvciggYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBiZWdpbiB3aXRoIFwiL1wiYCk7XG4gfVxuaWYoIXJlZmVycmVyLnN0YXJ0c1dpdGgoJy4vJykpe1xudGhyb3cgbmV3IEVycm9yKCBgTW9kdWxlIHJlZmVycmVyICR7cShyZWZlcnJlcil9IG11c3QgYmVnaW4gd2l0aCBcIi4vXCJgKTtcbiB9XG5cbmNvbnN0IHNwZWNQYXJ0cz1zcGVjLnNwbGl0KCcvJyk7XG5jb25zdCBzb2x1dGlvbj1bXTtcbmNvbnN0IHByb2JsZW09W107XG5pZihzcGVjUGFydHNbMF09PT0nLid8fHNwZWNQYXJ0c1swXT09PScuLicpe1xuY29uc3QgcmVmZXJyZXJQYXJ0cz1yZWZlcnJlci5zcGxpdCgnLycpO1xucHJvYmxlbS5wdXNoKC4uLnJlZmVycmVyUGFydHMpO1xucHJvYmxlbS5wb3AoKTtcbnNvbHV0aW9uLnB1c2goJy4nKTtcbiB9XG5wcm9ibGVtLnB1c2goLi4uc3BlY1BhcnRzKTtcblxuaWYoIXNvbHZlKHNvbHV0aW9uLHByb2JsZW0pKXtcbnRocm93IG5ldyBFcnJvcihcbiBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IHZpYSByZWZlcnJlciAke3EoXG5yZWZlcnJlcilcbiB9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCk7XG5cbiB9XG5cbnJldHVybiBzb2x1dGlvbi5qb2luKCcvJyk7XG4gfTtcblxuLyoqXG4gKiBUbyBjb25zdHJ1Y3QgYSBtb2R1bGUgbWFwIGZyb20gYSBub2RlX21vZHVsZXMgcGFja2FnZSwgaW50ZXItcGFja2FnZSBsaW5rYWdlXG4gKiByZXF1aXJlcyBjb25uZWN0aW5nIGEgZnVsbCBiYXNlIG1vZHVsZSBzcGVjaWZpZXIgbGlrZSBcImRlcGVuZGVuY3ktcGFja2FnZVwiXG4gKiB0byB0aGUgb3RoZXIgcGFja2FnZSdzIGZ1bGwgaW50ZXJuYWwgbW9kdWxlIHNwZWNpZmllciBsaWtlIFwiLlwiIG9yXG4gKiBcIi4vdXRpbGl0eVwiLCB0byBmb3JtIGEgbG9jYWwgZnVsbCBtb2R1bGUgc3BlY2lmaWVyIGxpa2UgXCJkZXBlbmRlbmN5LXBhY2thZ2VcIlxuICogb3IgXCJkZXBlbmRlbmN5LXBhY2thZ2UvdXRpbGl0eVwiLlxuICogVGhpcyB0eXBlIG9mIGpvaW4gbWF5IGFzc2VydCB0aGF0IHRoZSBiYXNlIGlzIGFic29sdXRlIGFuZCB0aGUgcmVmZXJyZW50IGlzXG4gKiByZWxhdGl2ZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYmFzZSAtIHRoZSBmdWxseSByZXNvbHZlZCBwYXRoIG9mIGEgbW9kdWxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWMgLSB0aGUgcGFydGlhbGx5IHJlc29sdmVkIHBhdGggb2YgYW5vdGhlciBtb2R1bGUuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgZnVsbHkgcmVzb2x2ZWQgcGF0aCBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZS5cbiAqLyRo4oCNX29uY2UucmVzb2x2ZShyZXNvbHZlKTtcbmNvbnN0ICAgICAgICBqb2luPShiYXNlLHNwZWMpPT57XG5zcGVjPVN0cmluZyhzcGVjfHwnJyk7XG5iYXNlPVN0cmluZyhiYXNlfHwnJyk7XG5cbmNvbnN0IHNwZWNQYXJ0cz1zcGVjLnNwbGl0KCcvJyk7XG5jb25zdCBiYXNlUGFydHM9YmFzZS5zcGxpdCgnLycpO1xuXG5pZihzcGVjUGFydHMubGVuZ3RoPjEmJnNwZWNQYXJ0c1swXT09PScnKXtcbnRocm93IG5ldyBFcnJvciggYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBzdGFydCB3aXRoIFwiL1wiYCk7XG4gfVxuaWYoYmFzZVBhcnRzWzBdPT09Jy4nfHxiYXNlUGFydHNbMF09PT0nLi4nKXtcbnRocm93IG5ldyBFcnJvciggYEV4dGVybmFsIG1vZHVsZSBzcGVjaWZpZXIgJHtxKGJhc2UpfSBtdXN0IGJlIGFic29sdXRlYCk7XG4gfVxuaWYoc3BlY1BhcnRzWzBdIT09Jy4nKXtcbnRocm93IG5ldyBFcnJvciggYEludGVybmFsIG1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IGJlIHJlbGF0aXZlYCk7XG4gfVxuXG5jb25zdCBzb2x1dGlvbj1bXTtcbmlmKCFzb2x2ZShzb2x1dGlvbixzcGVjUGFydHMpKXtcbnRocm93IG5ldyBFcnJvcihcbiBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IHZpYSBiYXNlICR7cShcbmJhc2UpXG4gfSBtdXN0IG5vdCByZWZlciB0byBhIG1vZHVsZSBvdXRzaWRlIG9mIHRoZSBiYXNlYCk7XG5cbiB9XG5cbnJldHVybltiYXNlLC4uLnNvbHV0aW9uXS5qb2luKCcvJyk7XG4gfTtcblxuLyoqXG4gKiBSZWxhdGl2aXplIHR1cm5zIGFic29sdXRlIGlkZW50aWZpZXJzIGludG8gcmVsYXRpdmUgaWRlbnRpZmllcnMuXG4gKiBJbiBwYWNrYWdlLmpzb24sIGludGVybmFsIG1vZHVsZSBpZGVudGlmaWVycyBjYW4gYmUgZWl0aGVyIHJlbGF0aXZlIG9yXG4gKiBhYnNvbHV0ZSwgYnV0IGNvbXBhcnRtZW50cyBiYWNrZWQgYnkgbm9kZV9tb2R1bGVzIGFsd2F5cyB1c2UgcmVsYXRpdmUgbW9kdWxlXG4gKiBzcGVjaWZpZXJzIGZvciBpbnRlcm5hbCBsaW5rYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjIC0gYSBtb2R1bGUgc3BlY2lmaWVyIHRoYXQgb2YgYSBsb2NhbCBtb2R1bGUsIHRoYXQgbWlnaHRcbiAqIGJlIGVycm9uZW91c2x5IGZyYW1lZCB3aXRob3V0IGFuIGluaXRpYWwgJy4nIHBhdGggY29tcG9uZW50LlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIGlkZW1wb3RlbnQgbW9kdWxlIHNwZWNpZmllciwgZW5zdXJlZCB0byBiZWdpbiB3aXRoXG4gKiAnLicuXG4gKi8kaOKAjV9vbmNlLmpvaW4oam9pbik7XG5jb25zdCAgICAgICAgcmVsYXRpdml6ZT0oc3BlYyk9PntcbnNwZWM9U3RyaW5nKHNwZWN8fCcnKTtcblxuY29uc3Qgc29sdXRpb249W107XG5pZighc29sdmUoc29sdXRpb24sc3BlYy5zcGxpdCgnLycpKSl7XG50aHJvdyBFcnJvcihcbiBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCk7XG5cbiB9XG5cbnJldHVyblsnLicsLi4uc29sdXRpb25dLmpvaW4oJy8nKTtcbiB9OyRo4oCNX29uY2UucmVsYXRpdml6ZShyZWxhdGl2aXplKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZXNvbHZlIjpbInJlc29sdmUiXSwiam9pbiI6WyJqb2luIl0sInJlbGF0aXZpemUiOlsicmVsYXRpdml6ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAAYO3abgUAAG4FAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcGFyc2UtYnl0ZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZUJ5dGVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBiZSByZWxpZWQgdXBvbiB0byBkZWFsIHdpdGggdGhlIG51YW5jZXMgb2YgUmVhZG9ubHksIHNvIHdlXG4gKiBib3Jyb3cgdGhlIHBhc3MtdGhyb3VnaCB0eXBlIGRlZmluaXRpb24gb2YgaGFyZGVuIGhlcmUuXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhcnNlRm59ICovXG5jb25zdCAgICAgICAgcGFyc2VCeXRlcz1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbl9sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24pPT5cbntcbi8qIFNuYXBzaG90IEFycmF5QnVmZmVyKi9cbmNvbnN0IGJ1ZmZlcj1uZXcgQXJyYXlCdWZmZXIoYnl0ZXMubGVuZ3RoKTtcbmNvbnN0IGJ5dGVzVmlldz1uZXcgVWludDhBcnJheShidWZmZXIpO1xuYnl0ZXNWaWV3LnNldChieXRlcyk7XG5cbi8qKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn0gKi9cbmNvbnN0IGltcG9ydHM9ZnJlZXplKFtdKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gZXhwb3J0c1xuICovXG5jb25zdCBleGVjdXRlPShleHBvcnRzKT0+e1xuZXhwb3J0cy5kZWZhdWx0PWJ1ZmZlcjtcbiB9O1xuXG5yZXR1cm57XG5wYXJzZXI6J2J5dGVzJyxcbmJ5dGVzLFxucmVjb3JkOmZyZWV6ZSh7XG5pbXBvcnRzLFxuZXhwb3J0czpmcmVlemUoWydkZWZhdWx0J10pLFxuZXhlY3V0ZTpmcmVlemUoZXhlY3V0ZSl9KX07XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VCeXRlcyhwYXJzZUJ5dGVzKTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VCeXRlcyxcbmhldXJpc3RpY0ltcG9ydHM6ZmFsc2V9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlQnl0ZXMiOlsicGFyc2VCeXRlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1SpZBThYAAE4WAABGAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZ2V0TW9kdWxlUGF0aHMiLCJ3cmFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZEZufSBSZWFkRm4gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlYWRQb3dlcnN9IFJlYWRQb3dlcnMgKi9cblxuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHtmcmVlemUsa2V5cyxjcmVhdGUsaGFzT3duUHJvcGVydHksZGVmaW5lUHJvcGVydHl9PU9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gb2JqZWN0XG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaGFzPShvYmplY3Qsa2V5KT0+YXBwbHkoaGFzT3duUHJvcGVydHksb2JqZWN0LFtrZXldKTtcblxuY29uc3Qgbm9UcmFpbGluZ1NsYXNoPShwYXRoKT0+e1xuY29uc3QgbD1wYXRoLmxlbmd0aC0xO1xucmV0dXJuIHBhdGhbbF09PT0nXFxcXCd8fHBhdGhbbF09PT0nLyc/cGF0aC5zbGljZSgwLC0xKTpwYXRoO1xuIH07XG5cbi8qKlxuICogR2VuZXJhdGVzIHZhbHVlcyBmb3IgX19maWxlbmFtZSBhbmQgX19kaXJuYW1lIGZyb20gbG9jYXRpb25cbiAqXG4gKiBAcGFyYW0ge1JlYWRQb3dlcnMgfCBSZWFkRm4gfCB1bmRlZmluZWR9IHJlYWRQb3dlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICogQHJldHVybnMge3tcbiAqICAgZmlsZW5hbWU6c3RyaW5nfG51bGwsXG4gKiAgIGRpcm5hbWU6IHN0cmluZ3xudWxsXG4gKiB9fVxuICovXG5jb25zdCAgICAgICAgZ2V0TW9kdWxlUGF0aHM9KHJlYWRQb3dlcnMsbG9jYXRpb24pPT57XG5pZihcbnJlYWRQb3dlcnMmJlxudHlwZW9mIHJlYWRQb3dlcnMhPT0nZnVuY3Rpb24nJiZcbnJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aClcbntcbmxldCBmaWxlbmFtZT1sb2NhdGlvbjtcbmxldCBkaXJuYW1lO1xudHJ5e1xuZGlybmFtZT1uZXcgVVJMKCcuLycsZmlsZW5hbWUpLmhyZWY7XG4gfWNhdGNoKF8pe1xucmV0dXJue1xuZmlsZW5hbWU6bnVsbCxcbmRpcm5hbWU6bnVsbH07XG5cbiB9XG5cbmZpbGVuYW1lPXJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aChmaWxlbmFtZSkudG9TdHJpbmcoKTtcbmRpcm5hbWU9bm9UcmFpbGluZ1NsYXNoKHJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aChkaXJuYW1lKS50b1N0cmluZygpKTtcblxucmV0dXJue1xuZmlsZW5hbWUsXG5kaXJuYW1lfTtcblxuIH1lbHNle1xucmV0dXJue1xuZmlsZW5hbWU6bnVsbCxcbmRpcm5hbWU6bnVsbH07XG5cbiB9XG4gfTtcblxuLyoqXG4gKiBNb2R1bGVFbnZpcm9ubWVudFJlY29yZCB3cmFwcGVyXG4gKiBDcmVhdGVzIHNoYXJlZCBleHBvcnQgcHJvY2Vzc2luZyBwcmltaXRpdmVzIHRvIGJlIHVzZWQgYm90aCBMb2NhdGlvbiBhbmQgQXJjaGl2ZSB1c2VjYXNlcyBvZiBjanNcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gaW5cbiAqIEBwYXJhbSB7b2JqZWN0fSBpbi5tb2R1bGVFbnZpcm9ubWVudFJlY29yZFxuICogQHBhcmFtIHtDb21wYXJ0bWVudH0gaW4uY29tcGFydG1lbnRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gaW4ucmVzb2x2ZWRJbXBvcnRzXG4gKiBAcGFyYW0ge3N0cmluZ30gaW4ubG9jYXRpb25cbiAqIEBwYXJhbSB7UmVhZEZufFJlYWRQb3dlcnN9IGluLnJlYWRQb3dlcnNcbiAqIEByZXR1cm5zIHt7XG4gKiAgIG1vZHVsZTogeyBleHBvcnRzOiBhbnkgfSxcbiAqICAgbW9kdWxlRXhwb3J0czogYW55LFxuICogICBhZnRlckV4ZWN1dGU6IEZ1bmN0aW9uLFxuICogICByZXF1aXJlOiBGdW5jdGlvbixcbiAqIH19XG4gKi8kaOKAjV9vbmNlLmdldE1vZHVsZVBhdGhzKGdldE1vZHVsZVBhdGhzKTtcbmNvbnN0ICAgICAgICB3cmFwPSh7XG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZCxcbmNvbXBhcnRtZW50LFxucmVzb2x2ZWRJbXBvcnRzLFxubG9jYXRpb24sXG5yZWFkUG93ZXJzfSk9Plxue1xuLyogVGhpcyBpbml0aWFsIGRlZmF1bHQgdmFsdWUgbWFrZXMgdGhpbmdzIGxpa2UgZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eSgpIHdvcmsgaW4gY2pzLiovXG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0PWNyZWF0ZShcbmNvbXBhcnRtZW50Lmdsb2JhbFRoaXMuT2JqZWN0LnByb3RvdHlwZSk7XG5cblxuLyogU2V0IGFsbCBleHBvcnRlZCBwcm9wZXJ0aWVzIG9uIHRoZSBkZWZ1bHQgYW5kIGNhbGwgbmFtZWRFeHBvcnRQcm9wIHRvIGFkZCB0aGVtIG9uIHRoZSBuYW1lc3BhY2UgZm9yIGltcG9ydCAqLiovXG4vKiBSb290IG5hbWVzcGFjZSBpcyBvbmx5IGFjY2Vzc2libGUgZm9yIGltcG9ydHMuIFJlcXVpcmluZyBmcm9tIGNqcyBnZXRzIHRoZSBkZWZhdWx0IGZpZWxkIG9mIHRoZSBuYW1lc3BhY2UuKi9cbmNvbnN0IHByb21vdGVUb05hbWVkRXhwb3J0PShwcm9wLHZhbHVlKT0+e1xuLyogX19lc01vZHVsZSBuZWVkcyB0byBiZSBwcmVzZW50IGZvciB0eXBlc2NyaXB0LWNvbXBpbGVkIG1vZHVsZXMgdG8gd29yaywgY2FuJ3QgYmUgc2tpcHBlZCovXG5pZihwcm9wIT09J2RlZmF1bHQnKXtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkW3Byb3BdPXZhbHVlO1xuIH1cbiB9O1xuXG5jb25zdCBvcmlnaW5hbEV4cG9ydHM9bmV3IFByb3h5KG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQse1xuc2V0KF90YXJnZXQscHJvcCx2YWx1ZSl7XG5wcm9tb3RlVG9OYW1lZEV4cG9ydChwcm9wLHZhbHVlKTtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHRbcHJvcF09dmFsdWU7XG5yZXR1cm4gdHJ1ZTtcbiB9LFxuZGVmaW5lUHJvcGVydHkodGFyZ2V0LHByb3AsZGVzY3JpcHRvcil7XG5pZihoYXMoZGVzY3JpcHRvciwndmFsdWUnKSl7XG4vKiBUaGlzIHdpbGwgcmVzdWx0IGluIG5vbi1lbnVtZXJhYmxlIHByb3BlcnRpZXMgYmVpbmcgZW51bWVyYWJsZSBmb3IgbmFtZWQgaW1wb3J0IHB1cnBvc2VzLiBXZSBjb3VsZCBjaGVjayovXG4vKiBlbnVtZXJhYmxlIGhlcmUsIGJ1dCBJIGRvbid0IHNlZSBwb3NzaWJsZSBiZW5lZml0cyBvZiBzdWNoIHJlc3RyaWN0aW9uLiovXG5wcm9tb3RlVG9OYW1lZEV4cG9ydChwcm9wLGRlc2NyaXB0b3IudmFsdWUpO1xuIH1cbi8qIEFsbCB0aGUgZGVmaW5lUHJvcGVydHkgdHJpY2tlcnkgd2l0aCBnZXR0ZXJzIHVzZWQgZm9yIGxhenkgaW5pdGlhbGl6YXRpb24gd2lsbCB3b3JrLiBUaGUgdHJhcCBpcyBoZXJlIG9ubHkgdG8qL1xuLyogZWxldmF0ZSB0aGUgdmFsdWVzIHdpdGggbmFtZWRFeHBvcnRQcm9wIHdoZW5ldmVyIHBvc3NpYmxlLiBSZXBsYWNpbmcgZ2V0dGVycyB3aXRoIHdyYXBwZWQgb25lcyB0byBmYWNpbGl0YXRlKi9cbi8qIHByb3BhZ2F0aW5nIHRoZSBsYXp5IHZhbHVlIHRvIHRoZSBuYW1lc3BhY2UgaXMgbm90IHBvc3NpYmxlIGJlY2F1c2UgZGVmaW5pbmcgYSBwcm9wZXJ0eSB3aXRoIG1vZGlmaWVkKi9cbi8qIGRlc2NyaXB0b3IuZ2V0IGluIHRoZSB0cmFwIHdpbGwgY2F1c2UgYW4gZXJyb3IuKi9cbi8qIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBpcyB1c2VkIGluc3RlYWQgb2YgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSBmb3IgYmV0dGVyIGVycm9yIG1lc3NhZ2VzLiovXG5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQscHJvcCxkZXNjcmlwdG9yKTtcbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG5sZXQgZmluYWxFeHBvcnRzPW9yaWdpbmFsRXhwb3J0cztcblxuY29uc3QgbW9kdWxlPWZyZWV6ZSh7XG5nZXQgZXhwb3J0cygpe1xucmV0dXJuIGZpbmFsRXhwb3J0cztcbiB9LFxuc2V0IGV4cG9ydHModmFsdWUpe1xuZmluYWxFeHBvcnRzPXZhbHVlO1xuIH19KTtcblxuXG5jb25zdCByZXF1aXJlPSgvKiogQHR5cGUge3N0cmluZ30gKi9pbXBvcnRTcGVjaWZpZXIpPT57XG5jb25zdCBuYW1lc3BhY2U9Y29tcGFydG1lbnQuaW1wb3J0Tm93KHJlc29sdmVkSW1wb3J0c1tpbXBvcnRTcGVjaWZpZXJdKTtcbi8qIElmIHlvdSByZWFkIHRoaXMgZmlsZSBjYXJlZnVsbHksIHlvdSdsbCBzZWUgaXQncyBub3QgcG9zc2libGUgZm9yIGEgY2pzIG1vZHVsZSB0byBub3QgaGF2ZSB0aGUgZGVmYXVsdCBhbnltb3JlLiovXG4vKiBJdCdzIGN1cnJlbnRseSBwb3NzaWJsZSB0byByZXF1aXJlIG1vZHVsZXMgdGhhdCB3ZXJlIG5vdCBjcmVhdGVkIGJ5IHRoaXMgZmlsZSB0aG91Z2guKi9cbmlmKGhhcyhuYW1lc3BhY2UsJ2RlZmF1bHQnKSl7XG5yZXR1cm4gbmFtZXNwYWNlLmRlZmF1bHQ7XG4gfWVsc2V7XG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cbiB9O1xuaWYodHlwZW9mIHJlYWRQb3dlcnM9PT0nb2JqZWN0JyYmcmVhZFBvd2Vycy5yZXF1aXJlUmVzb2x2ZSl7XG5jb25zdHtyZXF1aXJlUmVzb2x2ZX09cmVhZFBvd2VycztcbnJlcXVpcmUucmVzb2x2ZT1mcmVlemUoKHNwZWNpZmllcixvcHRpb25zKT0+XG5yZXF1aXJlUmVzb2x2ZShsb2NhdGlvbixzcGVjaWZpZXIsb3B0aW9ucykpO1xuXG4gfWVsc2V7XG5yZXF1aXJlLnJlc29sdmU9ZnJlZXplKChzcGVjaWZpZXIpPT57XG5jb25zdCBlcnJvcj1FcnJvcihcbiBgQ2Fubm90IGZpbmQgbW9kdWxlICcke3NwZWNpZmllcn0nXFxuQWRkIHJlcXVpcmVSZXNvbHZlIHRvIEVuZG8gQ29tcGFydG1lbnQgTWFwcGVyIHJlYWRQb3dlcnMuYCk7XG5cbmRlZmluZVByb3BlcnR5KGVycm9yLCdjb2RlJyx7dmFsdWU6J01PRFVMRV9OT1RfRk9VTkQnfSk7XG50aHJvdyBlcnJvcjtcbiB9KTtcbiB9XG5cbmZyZWV6ZShyZXF1aXJlKTtcblxuY29uc3QgYWZ0ZXJFeGVjdXRlPSgpPT57XG5jb25zdCBleHBvcnRzSGF2ZUJlZW5PdmVyd3JpdHRlbj1maW5hbEV4cG9ydHMhPT1vcmlnaW5hbEV4cG9ydHM7XG4vKiBQcm9tb3RlcyBrZXlzIGZyb20gcmVkZWZpbmVkIG1vZHVsZS5leHBvcnQgdG8gdG9wIGxldmVsIG5hbWVzcGFjZSBmb3IgaW1wb3J0ICoqL1xuLyogTm90ZTogV2UgY291bGQgZG8gaXQgbGVzcyBjb25zaXN0ZW50bHkgYnV0IGNsb3NlciB0byBob3cgbm9kZSBkb2VzIGl0IGlmIHdlIGl0ZXJhdGVkIG92ZXIgZXhwb3J0cyBkZXRlY3RlZCBieSovXG4vKiB0aGUgbGV4ZXIuKi9cbmlmKGV4cG9ydHNIYXZlQmVlbk92ZXJ3cml0dGVuKXtcbm1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQ9ZmluYWxFeHBvcnRzO1xua2V5cyhtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0fHx7fSkuZm9yRWFjaCgocHJvcCk9PntcbmlmKHByb3AhPT0nZGVmYXVsdCcpXG5tb2R1bGVFbnZpcm9ubWVudFJlY29yZFtwcm9wXT1tb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuIH0pO1xuIH1cbiB9O1xuXG5yZXR1cm57XG5tb2R1bGUsXG5tb2R1bGVFeHBvcnRzOm9yaWdpbmFsRXhwb3J0cyxcbmFmdGVyRXhlY3V0ZSxcbnJlcXVpcmV9O1xuXG4gfTskaOKAjV9vbmNlLndyYXAod3JhcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TW9kdWxlUGF0aHMiOlsiZ2V0TW9kdWxlUGF0aHMiXSwid3JhcCI6WyJ3cmFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAvdd+ORBQAAkQUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wYXJzZS1qc29uLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZUpzb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFyc2VMb2NhdGVkSnNvbjskaOKAjV9pbXBvcnRzKFtbXCIuL2pzb24uanNcIiwgW1tcInBhcnNlTG9jYXRlZEpzb25cIiwgWyRo4oCNX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogVHlwZVNjcmlwdCBjYW5ub3QgYmUgcmVsaWVkIHVwb24gdG8gZGVhbCB3aXRoIHRoZSBudWFuY2VzIG9mIFJlYWRvbmx5LCBzbyB3ZVxuICogYm9ycm93IHRoZSBwYXNzLXRocm91Z2ggdHlwZSBkZWZpbml0aW9uIG9mIGhhcmRlbiBoZXJlLlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCdzZXMnKS5IYXJkZW59XG4gKi9cbmNvbnN0IGZyZWV6ZT1PYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZUpzb249YXN5bmMoXG5ieXRlcyxcbl9zcGVjaWZpZXIsXG5sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24pPT5cbntcbmNvbnN0IHNvdXJjZT10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuY29uc3QgaW1wb3J0cz1mcmVlemUoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBleHBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KGV4cG9ydHMpPT57XG5leHBvcnRzLmRlZmF1bHQ9cGFyc2VMb2NhdGVkSnNvbihzb3VyY2UsbG9jYXRpb24pO1xuIH07XG5yZXR1cm57XG5wYXJzZXI6J2pzb24nLFxuYnl0ZXMsXG5yZWNvcmQ6ZnJlZXplKHtcbmltcG9ydHMsXG5leHBvcnRzOmZyZWV6ZShbJ2RlZmF1bHQnXSksXG5leGVjdXRlOmZyZWV6ZShleGVjdXRlKX0pfTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZUpzb24ocGFyc2VKc29uKTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VKc29uLFxuaGV1cmlzdGljSW1wb3J0czpmYWxzZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VKc29uIjpbInBhcnNlSnNvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADGORBhdwcAAHcHAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcGFyc2UtcHJlLWNqcy5qc3siaW1wb3J0cyI6WyIuL2pzb24uanMiLCIuL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VQcmVDanMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFyc2VMb2NhdGVkSnNvbix3cmFwLGdldE1vZHVsZVBhdGhzOyRo4oCNX2ltcG9ydHMoW1tcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLCBbJGjigI1fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanNcIiwgW1tcIndyYXBcIiwgWyRo4oCNX2EgPT4gKHdyYXAgPSAkaOKAjV9hKV1dLFtcImdldE1vZHVsZVBhdGhzXCIsIFskaOKAjV9hID0+IChnZXRNb2R1bGVQYXRocyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZVByZUNqcz1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbmxvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbixcbntyZWFkUG93ZXJzfT17fSk9Plxue1xuY29uc3QgdGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuY29uc3R7c291cmNlLGltcG9ydHMsZXhwb3J0cyxyZWV4cG9ydHN9PXBhcnNlTG9jYXRlZEpzb24oXG50ZXh0LFxubG9jYXRpb24pO1xuXG5cbmNvbnN0e2ZpbGVuYW1lLGRpcm5hbWV9PWF3YWl0IGdldE1vZHVsZVBhdGhzKHJlYWRQb3dlcnMsbG9jYXRpb24pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZFxuICogQHBhcmFtIHtDb21wYXJ0bWVudH0gY29tcGFydG1lbnRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gcmVzb2x2ZWRJbXBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KG1vZHVsZUVudmlyb25tZW50UmVjb3JkLGNvbXBhcnRtZW50LHJlc29sdmVkSW1wb3J0cyk9PntcbmNvbnN0IGZ1bmN0b3I9Y29tcGFydG1lbnQuZXZhbHVhdGUoc291cmNlKTtcblxuY29uc3R7cmVxdWlyZSxtb2R1bGVFeHBvcnRzLG1vZHVsZSxhZnRlckV4ZWN1dGV9PXdyYXAoe1xubW9kdWxlRW52aXJvbm1lbnRSZWNvcmQsXG5jb21wYXJ0bWVudCxcbnJlc29sdmVkSW1wb3J0cyxcbmxvY2F0aW9uLFxucmVhZFBvd2Vyc30pO1xuXG5cbmZ1bmN0b3IocmVxdWlyZSxtb2R1bGVFeHBvcnRzLG1vZHVsZSxmaWxlbmFtZSxkaXJuYW1lKTtcblxuYWZ0ZXJFeGVjdXRlKCk7XG4gfTtcblxucmV0dXJue1xucGFyc2VyOidwcmUtY2pzLWpzb24nLFxuYnl0ZXMsXG5yZWNvcmQ6e1xuaW1wb3J0cyxcbnJlZXhwb3J0cyxcbmV4cG9ydHMsXG5leGVjdXRlfX07XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VQcmVDanMocGFyc2VQcmVDanMpO1xuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDp7XG5wYXJzZTpwYXJzZVByZUNqcyxcbmhldXJpc3RpY0ltcG9ydHM6dHJ1ZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVDanMiOlsicGFyc2VQcmVDanMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAq6T11YYEAACGBAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL3BhcnNlLXByZS1tanMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlTWpzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhcnNlTG9jYXRlZEpzb247JGjigI1faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsIFskaOKAjV9hID0+IChwYXJzZUxvY2F0ZWRKc29uID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCB0ZXh0RGVjb2Rlcj1uZXcgVGV4dERlY29kZXIoKTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VGbn0gKi9cbmNvbnN0ICAgICAgICBwYXJzZVByZU1qcz1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbmxvY2F0aW9uLFxuX3BhY2thZ2VMb2NhdGlvbik9Plxue1xuY29uc3QgdGV4dD10ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuY29uc3QgcmVjb3JkPXBhcnNlTG9jYXRlZEpzb24odGV4dCxsb2NhdGlvbik7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGUqL1xucmVjb3JkLl9fc3luY01vZHVsZVByb2dyYW1fXys9IGAvLyMgc291cmNlVVJMPSR7bG9jYXRpb259XFxuYDtcbnJldHVybntcbnBhcnNlcjoncHJlLW1qcy1qc29uJyxcbmJ5dGVzLFxucmVjb3JkfTtcblxuIH07XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhcnNlckltcGxlbWVudGF0aW9ufSAqLyRo4oCNX29uY2UucGFyc2VQcmVNanMocGFyc2VQcmVNanMpO1xuY29uc3R7ZGVmYXVsdDokY+KAjV9kZWZhdWx0fT17ZGVmYXVsdDp7XG5wYXJzZTpwYXJzZVByZU1qcyxcbmhldXJpc3RpY0ltcG9ydHM6ZmFsc2V9fTskaOKAjV9vbmNlLmRlZmF1bHQoJGPigI1fZGVmYXVsdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlUHJlTWpzIjpbInBhcnNlUHJlTWpzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOQiGN8rBQAAKwUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wYXJzZS10ZXh0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VUZXh0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBiZSByZWxpZWQgdXBvbiB0byBkZWFsIHdpdGggdGhlIG51YW5jZXMgb2YgUmVhZG9ubHksIHNvIHdlXG4gKiBib3Jyb3cgdGhlIHBhc3MtdGhyb3VnaCB0eXBlIGRlZmluaXRpb24gb2YgaGFyZGVuIGhlcmUuXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJ3NlcycpLkhhcmRlbn1cbiAqL1xuY29uc3QgZnJlZXplPU9iamVjdC5mcmVlemU7XG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXJzZUZufSAqL1xuY29uc3QgICAgICAgIHBhcnNlVGV4dD1hc3luYyhcbmJ5dGVzLFxuX3NwZWNpZmllcixcbl9sb2NhdGlvbixcbl9wYWNrYWdlTG9jYXRpb24pPT5cbntcbmNvbnN0IHRleHQ9dGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcblxuLyoqIEB0eXBlIHtBcnJheTxzdHJpbmc+fSAqL1xuY29uc3QgaW1wb3J0cz1mcmVlemUoW10pO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBleHBvcnRzXG4gKi9cbmNvbnN0IGV4ZWN1dGU9KGV4cG9ydHMpPT57XG5leHBvcnRzLmRlZmF1bHQ9dGV4dDtcbiB9O1xuXG5yZXR1cm57XG5wYXJzZXI6J3RleHQnLFxuYnl0ZXMsXG5yZWNvcmQ6ZnJlZXplKHtcbmltcG9ydHMsXG5leHBvcnRzOmZyZWV6ZShbJ2RlZmF1bHQnXSksXG5leGVjdXRlOmZyZWV6ZShleGVjdXRlKX0pfTtcblxuXG4gfTtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFyc2VySW1wbGVtZW50YXRpb259ICovJGjigI1fb25jZS5wYXJzZVRleHQocGFyc2VUZXh0KTtcbmNvbnN0e2RlZmF1bHQ6JGPigI1fZGVmYXVsdH09e2RlZmF1bHQ6e1xucGFyc2U6cGFyc2VUZXh0LFxuaGV1cmlzdGljSW1wb3J0czpmYWxzZX19OyRo4oCNX29uY2UuZGVmYXVsdCgkY+KAjV9kZWZhdWx0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VUZXh0IjpbInBhcnNlVGV4dCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACmnhiXUhgAAFIYAAA0AAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcG9saWN5LWZvcm1hdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSIsImFzc2VydFBvbGljeSIsImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiIsImlzQWxsb3dpbmdFdmVyeXRoaW5nIiwiaXNBdHRlbnVhdGlvbkRlZmluaXRpb24iLCJwb2xpY3lMb29rdXBIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5BdHRlbnVhdGlvbkRlZmluaXRpb259IEF0dGVudWF0aW9uRGVmaW5pdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVW5pZmllZEF0dGVudWF0aW9uRGVmaW5pdGlvbn0gVW5pZmllZEF0dGVudWF0aW9uRGVmaW5pdGlvbiAqL1xuXG5jb25zdHtlbnRyaWVzLGtleXN9PU9iamVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgQVRURU5VQVRPUl9LRVk9J2F0dGVudWF0ZSc7XG5jb25zdCBBVFRFTlVBVE9SX1BBUkFNU19LRVk9J3BhcmFtcyc7XG5jb25zdCBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUU9J2FueSc7XG5jb25zdCBQT0xJQ1lfRklFTERTX0xPT0tVUD1bJ2J1aWx0aW5zJywnZ2xvYmFscycsJ3BhY2thZ2VzJ107XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBwYWNrYWdlUG9saWN5XG4gKiBAcGFyYW0ge3N0cmluZ30gZmllbGRcbiAqIEBwYXJhbSB7c3RyaW5nfSBpdGVtTmFtZVxuICogQHJldHVybnMge2Jvb2xlYW4gfCBvYmplY3R9XG4gKi9cbmNvbnN0ICAgICAgICBwb2xpY3lMb29rdXBIZWxwZXI9KHBhY2thZ2VQb2xpY3ksZmllbGQsaXRlbU5hbWUpPT57XG5pZighUE9MSUNZX0ZJRUxEU19MT09LVVAuaW5jbHVkZXMoZmllbGQpKXtcbnRocm93IEVycm9yKCBgSW52YWxpZCBmaWVsZCAke3EoZmllbGQpfWApO1xuIH1cbmlmKFxudHlwZW9mIHBhY2thZ2VQb2xpY3khPT0nb2JqZWN0J3x8XG5wYWNrYWdlUG9saWN5PT09bnVsbHx8XG4hcGFja2FnZVBvbGljeVtmaWVsZF0pXG57XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5pZihwYWNrYWdlUG9saWN5W2ZpZWxkXT09PVdJTERDQVJEX1BPTElDWV9WQUxVRSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihwYWNrYWdlUG9saWN5W2ZpZWxkXVtpdGVtTmFtZV0pe1xucmV0dXJuIHBhY2thZ2VQb2xpY3lbZmllbGRdW2l0ZW1OYW1lXTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIHBvbGljeSB2YWx1ZSBpcyBzZXQgdG8gd2lsZGNhcmQgdG8gYWxsb3cgZXZlcnl0aGluZ1xuICpcbiAqIEBwYXJhbSB7Kn0gcG9saWN5VmFsdWVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5wb2xpY3lMb29rdXBIZWxwZXIocG9saWN5TG9va3VwSGVscGVyKTtcbmNvbnN0ICAgICAgICBpc0FsbG93aW5nRXZlcnl0aGluZz0ocG9saWN5VmFsdWUpPT5cbnBvbGljeVZhbHVlPT09V0lMRENBUkRfUE9MSUNZX1ZBTFVFO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0F0dGVudWF0aW9uRGVmaW5pdGlvbn0gcG90ZW50aWFsRGVmaW5pdGlvblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmlzQWxsb3dpbmdFdmVyeXRoaW5nKGlzQWxsb3dpbmdFdmVyeXRoaW5nKTtcbmNvbnN0ICAgICAgICBpc0F0dGVudWF0aW9uRGVmaW5pdGlvbj0ocG90ZW50aWFsRGVmaW5pdGlvbik9PntcbnJldHVybihcbnR5cGVvZiBwb3RlbnRpYWxEZWZpbml0aW9uPT09J29iamVjdCcmJlxudHlwZW9mIHBvdGVudGlhbERlZmluaXRpb25bQVRURU5VQVRPUl9LRVldPT09J3N0cmluZyd8fC8qIG9iamVjdCB3aXRoIGF0dGVudWF0b3IgbmFtZSovXG5pc0FycmF5KHBvdGVudGlhbERlZmluaXRpb24pLyogcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3IqLyk7XG5cbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0F0dGVudWF0aW9uRGVmaW5pdGlvbn0gYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcmV0dXJucyB7VW5pZmllZEF0dGVudWF0aW9uRGVmaW5pdGlvbn1cbiAqLyRo4oCNX29uY2UuaXNBdHRlbnVhdGlvbkRlZmluaXRpb24oaXNBdHRlbnVhdGlvbkRlZmluaXRpb24pO1xuY29uc3QgICAgICAgIGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbj0oYXR0ZW51YXRpb25EZWZpbml0aW9uKT0+e1xuaWYoIWlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbikpe1xudGhyb3cgRXJyb3IoXG4gYEludmFsaWQgYXR0ZW51YXRpb24gJHtxKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uKVxuIH0sIG11c3QgYmUgYW4gYXJyYXkgb2YgcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3Igb3IgYW4gb2JqZWN0IHdpdGggYW4gYXR0ZW51YXRvciBrZXlgKTtcblxuIH1cbmlmKGlzQXJyYXkoYXR0ZW51YXRpb25EZWZpbml0aW9uKSl7XG5yZXR1cm57XG5kaXNwbGF5TmFtZTonPGRlZmF1bHQgYXR0ZW51YXRvcj4nLFxuc3BlY2lmaWVyOm51bGwsXG5wYXJhbXM6YXR0ZW51YXRpb25EZWZpbml0aW9ufTtcblxuIH1lbHNle1xucmV0dXJue1xuZGlzcGxheU5hbWU6YXR0ZW51YXRpb25EZWZpbml0aW9uW0FUVEVOVUFUT1JfS0VZXSxcbnNwZWNpZmllcjphdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxucGFyYW1zOmF0dGVudWF0aW9uRGVmaW5pdGlvbltBVFRFTlVBVE9SX1BBUkFNU19LRVldfTtcblxuIH1cbiB9OyRo4oCNX29uY2UuZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbik7XG5cbmNvbnN0IGlzUmVjb3JkT2Y9KGl0ZW0scHJlZGljYXRlKT0+e1xuaWYodHlwZW9mIGl0ZW0hPT0nb2JqZWN0J3x8aXRlbT09PW51bGx8fGlzQXJyYXkoaXRlbSkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbnJldHVybiBlbnRyaWVzKGl0ZW0pLmV2ZXJ5KChba2V5LHZhbHVlXSk9PnByZWRpY2F0ZSh2YWx1ZSxrZXkpKTtcbiB9O1xuY29uc3QgaXNCb29sZWFuPShpdGVtKT0+dHlwZW9mIGl0ZW09PT0nYm9vbGVhbic7XG5jb25zdCBwcmVkaWNhdGVPcj1cbiguLi5wcmVkaWNhdGVzKT0+XG4oaXRlbSk9PlxucHJlZGljYXRlcy5zb21lKChwKT0+cChpdGVtKSk7XG5jb25zdCBpc1BvbGljeUl0ZW09KGl0ZW0pPT5cbml0ZW09PT11bmRlZmluZWR8fFxuaXRlbT09PVdJTERDQVJEX1BPTElDWV9WQUxVRXx8XG5pc1JlY29yZE9mKGl0ZW0saXNCb29sZWFuKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkUGFja2FnZVBvbGljeVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdXJsXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQYWNrYWdlUG9saWN5PShhbGxlZ2VkUGFja2FnZVBvbGljeSxwYXRoLHVybCk9PntcbmlmKGFsbGVnZWRQYWNrYWdlUG9saWN5PT09dW5kZWZpbmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCBpblVybD11cmw/IGAgaW4gJHtxKHVybCl9YDonJztcblxuY29uc3QgcGFja2FnZVBvbGljeT1PYmplY3QoYWxsZWdlZFBhY2thZ2VQb2xpY3kpO1xuYXNzZXJ0KFxuYWxsZWdlZFBhY2thZ2VQb2xpY3k9PT1wYWNrYWdlUG9saWN5JiYhaXNBcnJheShhbGxlZ2VkUGFja2FnZVBvbGljeSksXG4gYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQYWNrYWdlUG9saWN5fSR7aW5Vcmx9YCk7XG5cbmNvbnN0e1xucGFja2FnZXMsXG5idWlsdGlucyxcbmdsb2JhbHMsXG5ub0dsb2JhbEZyZWV6ZSxcbmRlZmF1bHRBdHRlbnVhdG9yOl9pZ25vcmUsLyogYSBjYXJ2ZSBvdXQgZm9yIHRoZSBkZWZhdWx0IGF0dGVudWF0b3IgaW4gY29tcGFydG1lbnQgbWFwKi9cbi4uLmV4dHJhfT1cbnBhY2thZ2VQb2xpY3k7XG5cbmFzc2VydChcbmtleXMoZXh0cmEpLmxlbmd0aD09PTAsXG4gYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKGtleXMoZXh0cmEpKX0ke2luVXJsfWApO1xuXG5cbmFzc2VydChcbm5vR2xvYmFsRnJlZXplPT09dW5kZWZpbmVkfHx0eXBlb2Ygbm9HbG9iYWxGcmVlemU9PT0nYm9vbGVhbicsXG4gYCR7cGF0aH0ubm9HbG9iYWxGcmVlemUgbXVzdCBiZSBhIGJvb2xlYW4sIGdvdCAke3Eoe1xubm9HbG9iYWxGcmVlemV9KVxuIH0ke2luVXJsfWApO1xuXG5cbmlzUG9saWN5SXRlbShwYWNrYWdlcyl8fFxuYXNzZXJ0LmZhaWwoXG4gYCR7cGF0aH0ucGFja2FnZXMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucywgZ290ICR7cSh7XG5wYWNrYWdlc30pXG4gfSR7aW5Vcmx9YCk7XG5cblxuaXNQb2xpY3lJdGVtKGdsb2JhbHMpfHxcbmlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGdsb2JhbHMpfHxcbmFzc2VydC5mYWlsKFxuIGAke3BhdGh9Lmdsb2JhbHMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhIHNpbmdsZSBhdHRlbnVhdGlvbiwgZ290ICR7cShcbntcbmdsb2JhbHN9KVxuXG4gfSR7aW5Vcmx9YCk7XG5cblxuaXNQb2xpY3lJdGVtKGJ1aWx0aW5zKXx8XG5pc1JlY29yZE9mKGJ1aWx0aW5zLHByZWRpY2F0ZU9yKGlzQm9vbGVhbixpc0F0dGVudWF0aW9uRGVmaW5pdGlvbikpfHxcbmFzc2VydC5mYWlsKFxuIGAke3BhdGh9LmJ1aWx0aW5zIG11c3QgYmUgYSByZWNvcmQgb2YgYm9vbGVhbnMgb3IgYXR0ZW51YXRpb25zLCBnb3QgJHtxKHtcbmJ1aWx0aW5zfSlcbiB9JHtpblVybH1gKTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZFBvbGljeVxuICogQHJldHVybnMge3ZvaWR9XG4gKi8kaOKAjV9vbmNlLmFzc2VydFBhY2thZ2VQb2xpY3koYXNzZXJ0UGFja2FnZVBvbGljeSk7XG5jb25zdCAgICAgICAgYXNzZXJ0UG9saWN5PShhbGxlZ2VkUG9saWN5KT0+e1xuaWYoYWxsZWdlZFBvbGljeT09PXVuZGVmaW5lZCl7XG5yZXR1cm47XG4gfVxuY29uc3QgcG9saWN5PU9iamVjdChhbGxlZ2VkUG9saWN5KTtcbmFzc2VydChcbmFsbGVnZWRQb2xpY3k9PT1wb2xpY3kmJiFBcnJheS5pc0FycmF5KHBvbGljeSksXG4gYHBvbGljeSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFBvbGljeX1gKTtcblxuXG5jb25zdHtyZXNvdXJjZXMsZW50cnksZGVmYXVsdEF0dGVudWF0b3IsLi4uZXh0cmF9PXBvbGljeTtcbmFzc2VydChcbmtleXMoZXh0cmEpLmxlbmd0aD09PTAsXG4gYHBvbGljeSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoa2V5cyhleHRyYSkpfWApO1xuXG5cbmFzc2VydChcbnR5cGVvZiByZXNvdXJjZXM9PT0nb2JqZWN0JyYmcmVzb3VyY2VzIT09bnVsbCxcbiBgcG9saWN5LnJlc291cmNlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShyZXNvdXJjZXMpfWApO1xuXG5hc3NlcnQoXG4hZGVmYXVsdEF0dGVudWF0b3J8fHR5cGVvZiBkZWZhdWx0QXR0ZW51YXRvcj09PSdzdHJpbmcnLFxuIGBwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShyZXNvdXJjZXMpfWApO1xuXG5cbmFzc2VydFBhY2thZ2VQb2xpY3koZW50cnksIGBwb2xpY3kuZW50cnlgKTtcblxuZW50cmllcyhyZXNvdXJjZXMpLmZvckVhY2goKFtrZXksdmFsdWVdKT0+e1xuYXNzZXJ0UGFja2FnZVBvbGljeSh2YWx1ZSwgYHBvbGljeS5yZXNvdXJjZXNbXCIke2tleX1cIl1gKTtcbiB9KTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UG9saWN5KGFzc2VydFBvbGljeSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicG9saWN5TG9va3VwSGVscGVyIjpbInBvbGljeUxvb2t1cEhlbHBlciJdLCJpc0FsbG93aW5nRXZlcnl0aGluZyI6WyJpc0FsbG93aW5nRXZlcnl0aGluZyJdLCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiI6WyJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiJdLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iOlsiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uIl0sImFzc2VydFBhY2thZ2VQb2xpY3kiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSJdLCJhc3NlcnRQb2xpY3kiOlsiYXNzZXJ0UG9saWN5Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJqOx8Z4PAAAeDwAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wb2xpY3kuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiLCJhdHRlbnVhdGVHbG9iYWxzIiwiYXR0ZW51YXRlTW9kdWxlSG9vayIsImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiLCJkZXRlY3RBdHRlbnVhdG9ycyIsImRpYWdub3NlTWlzc2luZ0NvbXBhcnRtZW50RXJyb3IiLCJlbmZvcmNlTW9kdWxlUG9saWN5IiwiZ2V0UG9saWN5Rm9yUGFja2FnZSIsIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcG9saWN5TG9va3VwSGVscGVyLGlzQXR0ZW51YXRpb25EZWZpbml0aW9uLGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbixpc0FsbG93aW5nRXZlcnl0aGluZzskaOKAjV9pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcInBvbGljeUxvb2t1cEhlbHBlclwiLCBbJGjigI1fYSA9PiAocG9saWN5TG9va3VwSGVscGVyID0gJGjigI1fYSldXSxbXCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvblwiLCBbJGjigI1fYSA9PiAoaXNBdHRlbnVhdGlvbkRlZmluaXRpb24gPSAkaOKAjV9hKV1dLFtcImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvblwiLCBbJGjigI1fYSA9PiAoZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uID0gJGjigI1fYSldXSxbXCJpc0FsbG93aW5nRXZlcnl0aGluZ1wiLCBbJGjigI1fYSA9PiAoaXNBbGxvd2luZ0V2ZXJ5dGhpbmcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2VudHJpZXMsdmFsdWVzLGFzc2lnbixrZXlzLGZyZWV6ZX09T2JqZWN0O1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBDb25zdCBzdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGludGVybmFsIGF0dGVudWF0b3JzIGNvbXBhcnRtZW50XG4gKi9cbmNvbnN0ICAgICAgICBBVFRFTlVBVE9SU19DT01QQVJUTUVOVD0nPEFUVEVOVUFUT1JTPic7XG5cbi8qKlxuICogQ29waWVzIHByb3BlcnRpZXMgKG9wdGlvbmFsbHkgbGltaXRlZCB0byBhIHNwZWNpZmljIGxpc3QpIGZyb20gb25lIG9iamVjdCB0byBhbm90aGVyLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBmcm9tXG4gKiBAcGFyYW0ge29iamVjdH0gdG9cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gW2xpc3RdXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovJGjigI1fb25jZS5BVFRFTlVBVE9SU19DT01QQVJUTUVOVChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCk7XG5jb25zdCBzZWxlY3RpdmVDb3B5PShmcm9tLHRvLGxpc3QpPT57XG5pZighbGlzdCl7XG5saXN0PWtleXMoZnJvbSk7XG4gfVxuZm9yKGxldCBpbmRleD0wO2luZGV4PGxpc3QubGVuZ3RoO2luZGV4Kz0xKXtcbmNvbnN0IGtleT1saXN0W2luZGV4XTtcbi8qIElmIGFuIGVuZG93bWVudCBpcyBtaXNzaW5nLCBnbG9iYWwgdmFsdWUgaXMgdW5kZWZpbmVkLiovXG4vKiBUaGlzIGlzIGFuIGV4cGVjdGVkIGJlaGF2aW9yIGlmIGdsb2JhbHMgYXJlIHVzZWQgZm9yIHBsYXRmb3JtIGZlYXR1cmUgZGV0ZWN0aW9uKi9cbnRvW2tleV09ZnJvbVtrZXldO1xuIH1cbnJldHVybiB0bztcbiB9O1xuXG5jb25zdCBjb2xsZWN0QXR0ZW51YXRvcnM9KGF0dGVudWF0b3JzLHBvbGljeUZyYWdtZW50KT0+e1xuaWYocG9saWN5RnJhZ21lbnQuYXR0ZW51YXRlKXtcbmF0dGVudWF0b3JzLnB1c2gocG9saWN5RnJhZ21lbnQuYXR0ZW51YXRlKTtcbiB9XG5mb3IoY29uc3QgdmFsdWUgb2YgdmFsdWVzKHBvbGljeUZyYWdtZW50KSl7XG5pZih0eXBlb2YgdmFsdWU9PT0nb2JqZWN0JyYmdmFsdWUhPT1udWxsKXtcbmNvbGxlY3RBdHRlbnVhdG9ycyhhdHRlbnVhdG9ycyx2YWx1ZSk7XG4gfVxuIH1cbiB9O1xuXG5jb25zdCBhdHRlbnVhdG9yc0NhY2hlPW5ldyBXZWFrTWFwKCk7XG4vKipcbiAqIEdvZXMgdGhyb3VnaCBwb2xpY3kgYW5kIGxpc3RzIGFsbCBhdHRlbnVhdG9yIHNwZWNpZmllcnMgdXNlZC5cbiAqIE1lbW9pemF0aW9uIGtleWVkIG9uIHBvbGljeSBvYmplY3QgcmVmZXJlbmNlXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHBvbGljeVxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IGF0dGVudWF0b3JzXG4gKi9cbmNvbnN0ICAgICAgICBkZXRlY3RBdHRlbnVhdG9ycz0ocG9saWN5KT0+e1xuaWYoIXBvbGljeSl7XG5yZXR1cm5bXTtcbiB9XG5pZighYXR0ZW51YXRvcnNDYWNoZS5oYXMocG9saWN5KSl7XG5jb25zdCBhdHRlbnVhdG9ycz1bXTtcbmlmKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcil7XG5hdHRlbnVhdG9ycy5wdXNoKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcik7XG4gfVxuY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLHBvbGljeSk7XG5hdHRlbnVhdG9yc0NhY2hlLnNldChwb2xpY3ksYXR0ZW51YXRvcnMpO1xuIH1cbnJldHVybiBhdHRlbnVhdG9yc0NhY2hlLmdldChwb2xpY3kpO1xuIH07XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIGEgcGFja2FnZSBmb3IgcG9saWN5IGxvb2t1cCBwdXJwb3Nlcy5cbiAqXG4gKiBAcGFyYW0ge1BhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqLyRo4oCNX29uY2UuZGV0ZWN0QXR0ZW51YXRvcnMoZGV0ZWN0QXR0ZW51YXRvcnMpO1xuY29uc3QgZ2VuZXJhdGVDYW5vbmljYWxOYW1lPSh7aXNFbnRyeT1mYWxzZSxuYW1lLHBhdGh9KT0+e1xuaWYoaXNFbnRyeSl7XG50aHJvdyBFcnJvcignRW50cnkgbW9kdWxlIGNhbm5vdCBiZSBpZGVudGlmaWVkIHdpdGggYSBjYW5vbmljYWxOYW1lJyk7XG4gfVxuaWYobmFtZT09PUFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKXtcbnJldHVybiBBVFRFTlVBVE9SU19DT01QQVJUTUVOVDtcbiB9XG5yZXR1cm4gcGF0aC5qb2luKCc+Jyk7XG4gfTtcblxuLyoqXG4gKiBWZXJpZmllcyBpZiBhIG1vZHVsZSBpZGVudGlmaWVkIGJ5IG5hbWluZ0tpdCBjYW4gYmUgYSBkZXBlbmRlbmN5IG9mIGEgcGFja2FnZSBwZXIgcGFja2FnZVBvbGljeS5cbiAqIHBhY2thZ2VQb2xpY3kgaXMgcmVxdWlyZWQsIHdoZW4gcG9saWN5IGlzIG5vdCBzZXQsIHNraXBwaW5nIG5lZWRzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGNhbGxlci5cbiAqXG4gKiBAcGFyYW0ge1BhY2thZ2VOYW1pbmdLaXR9IG5hbWluZ0tpdFxuICogQHBhcmFtIHsqfSBwYWNrYWdlUG9saWN5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3k9KG5hbWluZ0tpdCxwYWNrYWdlUG9saWN5KT0+e1xuaWYobmFtaW5nS2l0LmlzRW50cnkpe1xuLyogZGVwZW5kZW5jeSBvbiBlbnRyeSBjb21wYXJ0bWVudCBzaG91bGQgbmV2ZXIgYmUgYWxsb3dlZCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgY2Fub25pY2FsTmFtZT1nZW5lcmF0ZUNhbm9uaWNhbE5hbWUobmFtaW5nS2l0KTtcbnJldHVybiEhcG9saWN5TG9va3VwSGVscGVyKHBhY2thZ2VQb2xpY3ksJ3BhY2thZ2VzJyxjYW5vbmljYWxOYW1lKTtcbiB9OyRo4oCNX29uY2UuZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeShkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5KTtcblxuY29uc3QgdmFsaWRhdGVEZXBlbmRlbmNpZXM9KHBvbGljeSxjYW5vbmljYWxOYW1lKT0+e1xuY29uc3QgcGFja2FnZXM9cG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXS5wYWNrYWdlcztcbmlmKCFwYWNrYWdlc3x8aXNBbGxvd2luZ0V2ZXJ5dGhpbmcocGFja2FnZXMpKXtcbnJldHVybjtcbiB9XG5cbmNvbnN0IHBhY2thZ2VOYW1lcz1rZXlzKHBhY2thZ2VzKTtcbmNvbnN0IGF0dGVudWF0b3JzPWRldGVjdEF0dGVudWF0b3JzKHBvbGljeSk7XG4vKiBKb2luIGF0dGVudWF0b3JzIHdpdGggcGFja2FnZU5hbWVzIGludG8gYSBTZXQgdG8gZGVkdXBsaWNhdGUgYW5kIGNoZWNrIGlmIGFsbCBhcmUgbGlzdGVkIGluIHBvbGljeS5yZXNvdXJjZXMqL1xuY29uc3QgYWxsU3BlY2lmaWVycz1uZXcgU2V0KFsuLi5wYWNrYWdlTmFtZXMsLi4uYXR0ZW51YXRvcnNdKTtcbmZvcihjb25zdCBzcGVjaWZpZXIgb2YgYWxsU3BlY2lmaWVycyl7XG5pZighKHNwZWNpZmllciBpbiBwb2xpY3kucmVzb3VyY2VzKSl7XG50aHJvdyBFcnJvcihcbiBgUGFja2FnZSAke3Eoc3BlY2lmaWVyKX0gaXMgYWxsb3dlZCBmb3IgJHtxKFxuY2Fub25pY2FsTmFtZSlcbiB9IHRvIGltcG9ydCBidXQgaXRzIHBvbGljeSBpcyBub3QgZGVmaW5lZC4gUGxlYXNlIGFkZCBhIHBvbGljeSBmb3IgJHtxKFxuc3BlY2lmaWVyKVxuIH1gKTtcblxuIH1cbiB9XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwb2xpY3kgYXBwbGljYWJsZSB0byB0aGUgY2Fub25pY2FsTmFtZSBvZiB0aGUgcGFja2FnZVxuICpcbiAqIEBwYXJhbSB7UGFja2FnZU5hbWluZ0tpdH0gbmFtaW5nS2l0IC0gYSBrZXkgaW4gdGhlIHBvbGljeSByZXNvdXJjZXMgc3BlYyBpcyBkZXJpdmVkIGZybSB0aGVzZVxuICogQHBhcmFtIHtvYmplY3R8dW5kZWZpbmVkfSBwb2xpY3kgLSB1c2VyIHN1cHBsaWVkIHBvbGljeVxuICogQHJldHVybnMge29iamVjdHx1bmRlZmluZWR9IHBhY2thZ2VQb2xpY3kgaWYgcG9saWN5IHdhcyBzcGVjaWZpZWRcbiAqL1xuY29uc3QgICAgICAgIGdldFBvbGljeUZvclBhY2thZ2U9KG5hbWluZ0tpdCxwb2xpY3kpPT57XG5pZighcG9saWN5KXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuaWYobmFtaW5nS2l0LmlzRW50cnkpe1xucmV0dXJuIHBvbGljeS5lbnRyeTtcbiB9XG5jb25zdCBjYW5vbmljYWxOYW1lPWdlbmVyYXRlQ2Fub25pY2FsTmFtZShuYW1pbmdLaXQpO1xuaWYoY2Fub25pY2FsTmFtZT09PUFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKXtcbnJldHVybntcbmRlZmF1bHRBdHRlbnVhdG9yOnBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcixcbnBhY2thZ2VzOmRldGVjdEF0dGVudWF0b3JzKHBvbGljeSkucmVkdWNlKChwYWNrYWdlcyxzcGVjaWZpZXIpPT57XG5wYWNrYWdlc1tzcGVjaWZpZXJdPXRydWU7XG5yZXR1cm4gcGFja2FnZXM7XG4gfSx7fSl9O1xuXG4gfVxuaWYocG9saWN5LnJlc291cmNlcyYmcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXSl7XG52YWxpZGF0ZURlcGVuZGVuY2llcyhwb2xpY3ksY2Fub25pY2FsTmFtZSk7XG5yZXR1cm4gcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXTtcbiB9ZWxzZXtcbmNvbnNvbGUud2FybihcbiBgTm8gcG9saWN5IGZvciAnJHtjYW5vbmljYWxOYW1lfScsIG9taXR0aW5nIGZyb20gY29tcGFydG1lbnQgbWFwLmApO1xuXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbiB9OyRo4oCNX29uY2UuZ2V0UG9saWN5Rm9yUGFja2FnZShnZXRQb2xpY3lGb3JQYWNrYWdlKTtcblxuY29uc3QgZ2V0R2xvYmFsc0xpc3Q9KHBhY2thZ2VQb2xpY3kpPT57XG5pZighcGFja2FnZVBvbGljeS5nbG9iYWxzKXtcbnJldHVybltdO1xuIH1cbi8qIFRPRE86IGhhbmRsZSAnd3JpdGUnIHBvbGljeTogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xNDgyKi9cbnJldHVybiBlbnRyaWVzKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykuXG5maWx0ZXIoKFtfa2V5LHZhbHVlXSk9PnZhbHVlKS5cbm1hcCgoW2tleSxfdnZhbHVlXSk9PmtleSk7XG4gfTtcblxuY29uc3QgR0xPQkFMX0FUVEVOVUFUT1I9J2F0dGVudWF0ZUdsb2JhbHMnO1xuY29uc3QgTU9EVUxFX0FUVEVOVUFUT1I9J2F0dGVudWF0ZU1vZHVsZSc7XG4vKipcbiAqXG4gKiBAcGFyYW0ge0F0dGVudWF0aW9uRGVmaW5pdGlvbn0gYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcGFyYW0ge0RlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gYXR0ZW51YXRvcnNQcm92aWRlclxuICogQHBhcmFtIHtzdHJpbmd9IGF0dGVudWF0b3JFeHBvcnROYW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxGdW5jdGlvbj59XG4gKi9cbmNvbnN0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uPWFzeW5jKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnNQcm92aWRlcixcbmF0dGVudWF0b3JFeHBvcnROYW1lKT0+XG57XG5pZighYXR0ZW51YXRvcnNQcm92aWRlcil7XG50aHJvdyBFcnJvciggYGF0dGVudWF0b3JzUHJvdmlkZXIgaXMgcmVxdWlyZWQgdG8gaW1wb3J0IGF0dGVudWF0b3JzYCk7XG4gfVxuY29uc3R7c3BlY2lmaWVyLHBhcmFtcyxkaXNwbGF5TmFtZX09Z2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uKTtcblxuY29uc3QgYXR0ZW51YXRvcj1hd2FpdCBhdHRlbnVhdG9yc1Byb3ZpZGVyLmltcG9ydChzcGVjaWZpZXIpO1xuaWYoIWF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdKXtcbnRocm93IEVycm9yKFxuIGBBdHRlbnVhdG9yICR7cShkaXNwbGF5TmFtZSl9IGRvZXMgbm90IGV4cG9ydCAke3EoYXR0ZW51YXRvckV4cG9ydE5hbWUpfWApO1xuXG4gfVxuLyogVE9ETzogdW5jdXJyeSBiaW5kIGZvciBzZWN1cml0eT8qL1xuY29uc3QgYXR0ZW51YXRlPWF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdLmJpbmQoYXR0ZW51YXRvcixwYXJhbXMpO1xucmV0dXJuIGF0dGVudWF0ZTtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50Pn0gY29tcGFydG1lbnRzXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIENvbXBhcnRtZW50RGVzY3JpcHRvcj59IGNvbXBhcnRtZW50RGVzY3JpcHRvcnNcbiAqIEByZXR1cm5zIHtEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyPShcbmNvbXBhcnRtZW50cyxcbmNvbXBhcnRtZW50RGVzY3JpcHRvcnMpPT5cbntcbmxldCBpbXBvcnRBdHRlbnVhdG9yO1xubGV0IGRlZmF1bHRBdHRlbnVhdG9yO1xuLyogQXR0ZW51YXRvcnMgY29tcGFydG1lbnQgaXMgbm90IGNyZWF0ZWQgd2hlbiB0aGVyZSdzIG5vIHBvbGljeS4qL1xuLyogRXJyb3JzIHNob3VsZCBiZSB0aHJvd24gd2hlbiB0aGUgcHJvdmlkZXIgaXMgdXNlZC4qL1xuaWYoIWNvbXBhcnRtZW50RGVzY3JpcHRvcnNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdKXtcbmltcG9ydEF0dGVudWF0b3I9YXN5bmMoKT0+e1xudGhyb3cgRXJyb3IoIGBObyBhdHRlbnVhdG9ycyBzcGVjaWZpZWQgaW4gcG9saWN5YCk7XG4gfTtcbiB9ZWxzZXtcbmRlZmF1bHRBdHRlbnVhdG9yPVxuY29tcGFydG1lbnREZXNjcmlwdG9yc1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0ucG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yO1xuXG4vKiBBdCB0aGUgdGltZSBvZiB0aGlzIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZCwgYXR0ZW51YXRvcnMgY29tcGFydG1lbnQgd29uJ3QqL1xuLyogZXhpc3QgeWV0LCB3ZSBuZWVkIHRvIGRlZmVyIGxvb2tpbmcgaXQgdXAgaW4gY29tcGFydG1lbnRzIHRvIHRoZSB0aW1lIG9mKi9cbi8qIHRoZSBpbXBvcnQgZnVuY3Rpb24gYmVpbmcgY2FsbGVkLiovXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gYXR0ZW51YXRvclNwZWNpZmllclxuICogQHJldHVybnMge1Byb21pc2U8QXR0ZW51YXRvcj59XG4gKi9cbmltcG9ydEF0dGVudWF0b3I9YXN5bmMoYXR0ZW51YXRvclNwZWNpZmllcik9PntcbmlmKCFhdHRlbnVhdG9yU3BlY2lmaWVyKXtcbmlmKCFkZWZhdWx0QXR0ZW51YXRvcil7XG50aHJvdyBFcnJvciggYE5vIGRlZmF1bHQgYXR0ZW51YXRvciBzcGVjaWZpZWQgaW4gcG9saWN5YCk7XG4gfVxuYXR0ZW51YXRvclNwZWNpZmllcj1kZWZhdWx0QXR0ZW51YXRvcjtcbiB9XG5jb25zdHtuYW1lc3BhY2V9PWF3YWl0IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0uaW1wb3J0KFxuYXR0ZW51YXRvclNwZWNpZmllcik7XG5cbnJldHVybiBuYW1lc3BhY2U7XG4gfTtcbiB9XG5cbnJldHVybntcbmltcG9ydDppbXBvcnRBdHRlbnVhdG9yfTtcblxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge0RlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gb3B0aW9ucy5hdHRlbnVhdG9yc1xuICogQHBhcmFtIHtBdHRlbnVhdGlvbkRlZmluaXRpb259IG9wdGlvbnMuYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucy5nbG9iYWxUaGlzXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucy5nbG9iYWxzXG4gKi8kaOKAjV9vbmNlLm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIobWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcik7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVHbG9iYWxUaGlzKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuZ2xvYmFsVGhpcyxcbmdsb2JhbHN9KVxue1xuY29uc3QgYXR0ZW51YXRlPWF3YWl0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnMsXG5HTE9CQUxfQVRURU5VQVRPUik7XG5cblxuLyogYXR0ZW51YXRlIGNhbiBlaXRoZXIgZGVmaW5lIHByb3BlcnRpZXMgb24gZ2xvYmFsVGhpcyBvbiBpdHMgb3duLCovXG4vKiBvciByZXR1cm4gYW4gb2JqZWN0IHdpdGggcHJvcGVydGllcyB0byB0cmFuc2ZlciBvbnRvIGdsb2JhbFRoaXMuKi9cbi8qIFRoZSBsYXR0ZXIgaXMgY29uc2lzdGVudCB3aXRoIGhvdyBtb2R1bGUgYXR0ZW51YXRvcnMgd29yayBzbyB0aGF0Ki9cbi8qIG9uZSBhdHRlbnVhdG9yIGltcGxlbWVudGF0aW9uIGNhbiBiZSB1c2VkIGZvciBib3RoIGlmIHVzZSBvZiovXG4vKiBkZWZpbmVQcm9wZXJ0eSBpcyBub3QgbmVlZGVkIGZvciBhdHRlbnVhdGluZyBnbG9iYWxzLiovXG5jb25zdCByZXN1bHQ9YXdhaXQgYXR0ZW51YXRlKGdsb2JhbHMsZ2xvYmFsVGhpcyk7XG5pZih0eXBlb2YgcmVzdWx0PT09J29iamVjdCcmJnJlc3VsdCE9PW51bGwpe1xuYXNzaWduKGdsb2JhbFRoaXMscmVzdWx0KTtcbiB9XG4gfVxuXG4vKipcbiAqIEZpbHRlcnMgYXZhaWxhYmxlIGdsb2JhbHMgYW5kIHJldHVybnMgYSBjb3B5IGFjY29yZGluZyB0byB0aGUgcG9saWN5XG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGdsb2JhbFRoaXNcbiAqIEBwYXJhbSB7b2JqZWN0fSBnbG9iYWxzXG4gKiBAcGFyYW0ge29iamVjdH0gcGFja2FnZVBvbGljeVxuICogQHBhcmFtIHtEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXJ9IGF0dGVudWF0b3JzXG4gKiBAcGFyYW0ge0FycmF5PFByb21pc2U+fSBwZW5kaW5nSm9ic1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXR0ZW51YXRlR2xvYmFscz0oXG5nbG9iYWxUaGlzLFxuZ2xvYmFscyxcbnBhY2thZ2VQb2xpY3ksXG5hdHRlbnVhdG9ycyxcbnBlbmRpbmdKb2JzLFxubmFtZT0nPHVua25vd24+Jyk9Plxue1xubGV0IGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dD0oKT0+e1xuZnJlZXplKGdsb2JhbFRoaXMpO1xuIH07XG5pZihwYWNrYWdlUG9saWN5JiZwYWNrYWdlUG9saWN5Lm5vR2xvYmFsRnJlZXplKXtcbmZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dD0oKT0+eyB9O1xuIH1cbmlmKCFwYWNrYWdlUG9saWN5fHxpc0FsbG93aW5nRXZlcnl0aGluZyhwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKXtcbnNlbGVjdGl2ZUNvcHkoZ2xvYmFscyxnbG9iYWxUaGlzKTtcbmZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xucmV0dXJuO1xuIH1cbmlmKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykpe1xuY29uc3QgYXR0ZW51YXRpb25EZWZpbml0aW9uPXBhY2thZ2VQb2xpY3kuZ2xvYmFscztcbmNvbnN0e2Rpc3BsYXlOYW1lfT1nZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oYXR0ZW51YXRpb25EZWZpbml0aW9uKTtcbmNvbnN0IGF0dGVudWF0aW9uUHJvbWlzZT1Qcm9taXNlLnJlc29sdmUoKS8qIGRlbGF5IHRvIG5leHQgdGljayB3aGlsZSBsaW5raW5nIGlzIHN5bmNocm9ub3VzbHkgZmluYWxpemVkKi8uXG50aGVuKCgpPT5cbmF0dGVudWF0ZUdsb2JhbFRoaXMoe1xuYXR0ZW51YXRvcnMsXG5hdHRlbnVhdGlvbkRlZmluaXRpb24sXG5nbG9iYWxUaGlzLFxuZ2xvYmFsc30pKS5cblxuXG50aGVuKGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCwoZXJyb3IpPT57XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbnRocm93IEVycm9yKFxuIGBFcnJvciB3aGlsZSBhdHRlbnVhdGluZyBnbG9iYWxzIGZvciAke3EobmFtZSl9IHdpdGggJHtxKFxuZGlzcGxheU5hbWUpXG4gfTogJHtxKGVycm9yLm1lc3NhZ2UpfWAvKiBUT0RPOiBjb25zaWRlciBhbiBvcHRpb24gdG8gZXhwb3NlIHN0YWNrdHJhY2UgZm9yIGVhc2Ugb2YgZGVidWdnaW5nKi8pO1xuXG4gfSk7XG5wZW5kaW5nSm9icy5wdXNoKGF0dGVudWF0aW9uUHJvbWlzZSk7XG5cbnJldHVybjtcbiB9XG5jb25zdCBsaXN0PWdldEdsb2JhbHNMaXN0KHBhY2thZ2VQb2xpY3kpO1xuc2VsZWN0aXZlQ29weShnbG9iYWxzLGdsb2JhbFRoaXMsbGlzdCk7XG5mcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbiB9O1xuXG4vKipcbiAqIFRocm93cyBpZiBpbXBvcnRpbmcgb2YgdGhlIHNwZWNpZmllciBpcyBub3QgYWxsb3dlZCBieSB0aGUgcG9saWN5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHNwZWNpZmllclxuICogQHBhcmFtIHtvYmplY3R9IGNvbXBhcnRtZW50RGVzY3JpcHRvclxuICogQHBhcmFtIHtvYmplY3R9IFtpbmZvXVxuICovJGjigI1fb25jZS5hdHRlbnVhdGVHbG9iYWxzKGF0dGVudWF0ZUdsb2JhbHMpO1xuY29uc3QgICAgICAgIGVuZm9yY2VNb2R1bGVQb2xpY3k9KHNwZWNpZmllcixjb21wYXJ0bWVudERlc2NyaXB0b3IsaW5mbyk9PntcbmNvbnN0e3BvbGljeSxtb2R1bGVzfT1jb21wYXJ0bWVudERlc2NyaXB0b3I7XG5pZighcG9saWN5KXtcbnJldHVybjtcbiB9XG5cbmlmKCFpbmZvLmV4aXQpe1xuaWYoIW1vZHVsZXNbc3BlY2lmaWVyXSl7XG50aHJvdyBFcnJvcihcbiBgSW1wb3J0aW5nICcke3NwZWNpZmllcn0nIHdhcyBub3QgYWxsb3dlZCBieSBwb2xpY3kgcGFja2FnZXM6JHtxKFxucG9saWN5LnBhY2thZ2VzKVxuIH1gKTtcblxuIH1cbnJldHVybjtcbiB9XG5cbmlmKCFwb2xpY3lMb29rdXBIZWxwZXIocG9saWN5LCdidWlsdGlucycsc3BlY2lmaWVyKSl7XG50aHJvdyBFcnJvcihcbiBgSW1wb3J0aW5nICcke3NwZWNpZmllcn0nIHdhcyBub3QgYWxsb3dlZCBieSBwb2xpY3kgJ2J1aWx0aW5zJzoke3EoXG5wb2xpY3kuYnVpbHRpbnMpXG4gfWApO1xuXG4gfVxuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRpb25zXG4gKiBAcGFyYW0ge0RlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gb3B0aW9ucy5hdHRlbnVhdG9yc1xuICogQHBhcmFtIHtBdHRlbnVhdGlvbkRlZmluaXRpb259IG9wdGlvbnMuYXR0ZW51YXRpb25EZWZpbml0aW9uXG4gKiBAcGFyYW0ge01vZHVsZUV4cG9ydHNOYW1lc3BhY2V9IG9wdGlvbnMub3JpZ2luYWxNb2R1bGVcbiAqIEByZXR1cm5zIHtNb2R1bGVFeHBvcnRzTmFtZXNwYWNlfVxuICovJGjigI1fb25jZS5lbmZvcmNlTW9kdWxlUG9saWN5KGVuZm9yY2VNb2R1bGVQb2xpY3kpO1xuZnVuY3Rpb24gYXR0ZW51YXRlTW9kdWxlKHtcbmF0dGVudWF0b3JzLFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxub3JpZ2luYWxNb2R1bGV9KVxue1xuY29uc3QgYXR0ZW51YXRpb25Db21wYXJ0bWVudD1uZXcgQ29tcGFydG1lbnQoXG57fSxcbnt9LFxue1xucmVzb2x2ZUhvb2s6KG1vZHVsZVNwZWNpZmllcik9Pm1vZHVsZVNwZWNpZmllcixcbmltcG9ydEhvb2s6YXN5bmMoKT0+e1xuY29uc3QgYXR0ZW51YXRlPWF3YWl0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uKFxuYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuYXR0ZW51YXRvcnMsXG5NT0RVTEVfQVRURU5VQVRPUik7XG5cbmNvbnN0IG5zPWF3YWl0IGF0dGVudWF0ZShvcmlnaW5hbE1vZHVsZSk7XG5jb25zdCBzdGF0aWNNb2R1bGVSZWNvcmQ9ZnJlZXplKHtcbmltcG9ydHM6W10sXG5leHBvcnRzOmtleXMobnMpLFxuZXhlY3V0ZToobW9kdWxlRXhwb3J0cyk9PntcbmFzc2lnbihtb2R1bGVFeHBvcnRzLG5zKTtcbiB9fSk7XG5cbnJldHVybiBzdGF0aWNNb2R1bGVSZWNvcmQ7XG4gfX0pO1xuXG5cbnJldHVybiBhdHRlbnVhdGlvbkNvbXBhcnRtZW50Lm1vZHVsZSgnLicpO1xuIH1cblxuLyoqXG4gKiBUaHJvd3MgaWYgaW1wb3J0aW5nIG9mIHRoZSBzcGVjaWZpZXIgaXMgbm90IGFsbG93ZWQgYnkgdGhlIHBvbGljeVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzcGVjaWZpZXIgLSBleGl0IG1vZHVsZSBuYW1lXG4gKiBAcGFyYW0ge29iamVjdH0gb3JpZ2luYWxNb2R1bGUgLSByZWZlcmVuY2UgdG8gdGhlIGV4aXQgbW9kdWxlXG4gKiBAcGFyYW0ge29iamVjdH0gcG9saWN5IC0gbG9jYWwgY29tcGFydG1lbnQgcG9saWN5XG4gKiBAcGFyYW0ge0RlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcn0gYXR0ZW51YXRvcnMgLSBhIGtleS12YWx1ZSB3aGVyZSBhdHRlbnVhdGlvbnMgY2FuIGJlIGZvdW5kXG4gKi9cbmNvbnN0ICAgICAgICBhdHRlbnVhdGVNb2R1bGVIb29rPShcbnNwZWNpZmllcixcbm9yaWdpbmFsTW9kdWxlLFxucG9saWN5LFxuYXR0ZW51YXRvcnMpPT5cbntcbmNvbnN0IHBvbGljeVZhbHVlPXBvbGljeUxvb2t1cEhlbHBlcihwb2xpY3ksJ2J1aWx0aW5zJyxzcGVjaWZpZXIpO1xuaWYoIXBvbGljeXx8cG9saWN5VmFsdWU9PT10cnVlKXtcbnJldHVybiBvcmlnaW5hbE1vZHVsZTtcbiB9XG5cbmlmKCFwb2xpY3lWYWx1ZSl7XG50aHJvdyBFcnJvcihcbiBgQXR0ZW51YXRpb24gZmFpbGVkICcke3NwZWNpZmllcn0nIHdhcyBub3QgaW4gcG9saWN5IGJ1aWx0aW5zOiR7cShcbnBvbGljeS5idWlsdGlucylcbiB9YCk7XG5cbiB9XG5cbnJldHVybiBhdHRlbnVhdGVNb2R1bGUoe1xuYXR0ZW51YXRvcnMsXG5hdHRlbnVhdGlvbkRlZmluaXRpb246cG9saWN5VmFsdWUsXG5vcmlnaW5hbE1vZHVsZX0pO1xuXG4gfTskaOKAjV9vbmNlLmF0dGVudWF0ZU1vZHVsZUhvb2soYXR0ZW51YXRlTW9kdWxlSG9vayk7XG5cbmNvbnN0IHBhZERpYWdub3Npcz0odGV4dCk9PiBgICgke3RleHR9KWA7XG4vKipcbiAqIFByb3ZpZGUgZGlnbm9zdGljIGluZm9ybWF0aW9uIGZvciBhIG1pc3NpbmcgY29tcGFydG1lbnQgZXJyb3JcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gIGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfSAgYXJncy5tb2R1bGVTcGVjaWZpZXJcbiAqIEBwYXJhbSB7b2JqZWN0fSAgYXJncy5jb21wYXJ0bWVudERlc2NyaXB0b3JcbiAqIEBwYXJhbSB7c3RyaW5nfSAgYXJncy5mb3JlaWduTW9kdWxlU3BlY2lmaWVyXG4gKiBAcGFyYW0ge3N0cmluZ30gIGFyZ3MuZm9yZWlnbkNvbXBhcnRtZW50TmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIGRpYWdub3NlTWlzc2luZ0NvbXBhcnRtZW50RXJyb3I9KHtcbm1vZHVsZVNwZWNpZmllcixcbmNvbXBhcnRtZW50RGVzY3JpcHRvcixcbmZvcmVpZ25Nb2R1bGVTcGVjaWZpZXIsXG5mb3JlaWduQ29tcGFydG1lbnROYW1lfSk9Plxue1xuY29uc3R7cG9saWN5LG5hbWUsc2NvcGVzfT1jb21wYXJ0bWVudERlc2NyaXB0b3I7XG5cbmlmKHBvbGljeSl7XG5pZighcG9saWN5LnBhY2thZ2VzKXtcbnJldHVybiBwYWREaWFnbm9zaXMoXG4gYFRoZXJlIHdlcmUgbm8gYWxsb3dlZCBwYWNrYWdlcyBzcGVjaWZpZWQgaW4gcG9saWN5IGZvciAke3EobmFtZSl9YCk7XG5cbiB9XG5pZihuYW1lPT09QVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpe1xucmV0dXJuIHBhZERpYWdub3NpcyhcbiBgQXR0ZW51YXRvciAke3EoXG5tb2R1bGVTcGVjaWZpZXIpXG4gfSB3YXMgaW1wb3J0ZWQgYnV0IHRoZXJlIGlzIG5vIHBvbGljeSByZXNvdXJjZXMgZW50cnkgZGVmaW5lZCBmb3IgaXQuYCk7XG5cbiB9XG5cbmNvbnN0IHNjb3BlTmFtZXM9ZW50cmllcyhzY29wZXMpLlxuZmlsdGVyKChbX25hbWUsc2NvcGVdKT0+c2NvcGUuY29tcGFydG1lbnQ9PT1mb3JlaWduQ29tcGFydG1lbnROYW1lKS5cbm1hcCgoW3Njb3BlTmFtZV0pPT5zY29wZU5hbWUpO1xuaWYoc2NvcGVOYW1lcy5sZW5ndGg9PT0xJiZzY29wZU5hbWVzWzBdPT09bW9kdWxlU3BlY2lmaWVyKXtcbnJldHVybiBwYWREaWFnbm9zaXMoXG4gYFBhY2thZ2UgJHtxKFxubW9kdWxlU3BlY2lmaWVyKVxuIH0gaXMgbWlzc2luZy4gQXJlIHlvdSBzdXJlIHRoZXJlIGlzIGFuIGVudHJ5IGluIHBvbGljeSByZXNvdXJjZXMgc3BlY2lmaWVkIGZvciBpdD9gKTtcblxuIH1lbHNle1xucmV0dXJuIHBhZERpYWdub3NpcyhcbiBgUGFja2FnZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gcmVzb2x2ZXMgdG8gJHtxKFxuZm9yZWlnbk1vZHVsZVNwZWNpZmllcilcbiB9IGluICR7cShcbmZvcmVpZ25Db21wYXJ0bWVudE5hbWUpXG4gfSB3aGljaCBzZWVtcyBkaXNhbGxvd2VkIGJ5IHBvbGljeS4gVGhlcmUgaXMgbGlrZWx5IGFuIG92ZXJyaWRlIGRlZmluZWQgdGhhdCBjYXVzZXMgYW5vdGhlciBwYWNrYWdlIHRvIGJlIGltcG9ydGVkIGFzICR7cShcbm1vZHVsZVNwZWNpZmllcilcbiB9LmApO1xuXG4gfVxuIH1cbi8qIE9taXQgZGlhZ25vc3RpY3Mgd2hlbiBwYXJlbnQgcGFja2FnZSBoYWQgbm8gcG9saWN5IC0gaXQgbWVhbnMgdGhlcmUgd2FzIG5vIHBvbGljeS4qL1xucmV0dXJuJyc7XG4gfTskaOKAjV9vbmNlLmRpYWdub3NlTWlzc2luZ0NvbXBhcnRtZW50RXJyb3IoZGlhZ25vc2VNaXNzaW5nQ29tcGFydG1lbnRFcnJvcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiXSwiZGV0ZWN0QXR0ZW51YXRvcnMiOlsiZGV0ZWN0QXR0ZW51YXRvcnMiXSwiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSI6WyJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5Il0sImdldFBvbGljeUZvclBhY2thZ2UiOlsiZ2V0UG9saWN5Rm9yUGFja2FnZSJdLCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIjpbIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwiYXR0ZW51YXRlR2xvYmFscyI6WyJhdHRlbnVhdGVHbG9iYWxzIl0sImVuZm9yY2VNb2R1bGVQb2xpY3kiOlsiZW5mb3JjZU1vZHVsZVBvbGljeSJdLCJhdHRlbnVhdGVNb2R1bGVIb29rIjpbImF0dGVudWF0ZU1vZHVsZUhvb2siXSwiZGlhZ25vc2VNaXNzaW5nQ29tcGFydG1lbnRFcnJvciI6WyJkaWFnbm9zZU1pc3NpbmdDb21wYXJ0bWVudEVycm9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEFxd72NAwAAjQMAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wb3dlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInVucGFja1JlYWRQb3dlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZEZufSBSZWFkRm4gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNhbm9uaWNhbEZufSBDYW5vbmljYWxGbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZFBvd2Vyc30gUmVhZFBvd2VycyAqL1xuXG4vKiogQHR5cGUge0Nhbm9uaWNhbEZufSAqL1xuY29uc3QgY2Fub25pY2FsU2hpbT1hc3luYyhwYXRoKT0+cGF0aDtcblxuLyoqXG4gKiBAcGFyYW0ge1JlYWRGbiB8IFJlYWRQb3dlcnN9IHBvd2Vyc1xuICogQHJldHVybnMge1JlYWRQb3dlcnN9XG4gKi9cbmNvbnN0ICAgICAgICB1bnBhY2tSZWFkUG93ZXJzPShwb3dlcnMpPT57XG5pZih0eXBlb2YgcG93ZXJzPT09J2Z1bmN0aW9uJyl7XG5yZXR1cm57XG5yZWFkOnBvd2VycyxcbmNhbm9uaWNhbDpjYW5vbmljYWxTaGltfTtcblxuIH1cbnJldHVybiBwb3dlcnM7XG4gfTskaOKAjV9vbmNlLnVucGFja1JlYWRQb3dlcnModW5wYWNrUmVhZFBvd2Vycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidW5wYWNrUmVhZFBvd2VycyI6WyJ1bnBhY2tSZWFkUG93ZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH4kbi3SEQAA0hEAACQAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgdHJhY2tUdXJuczskaOKAjV9pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsIFskaOKAjV9hID0+ICh0cmFja1R1cm5zID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXI9e1xuc2V0KF90YXJnZXQsX3Byb3AsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuaXNFeHRlbnNpYmxlKF90YXJnZXQpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5zZXRQcm90b3R5cGVPZihfdGFyZ2V0LF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmRlbGV0ZVByb3BlcnR5KF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIGZhbHNlO1xuIH19O1xuXG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQoX3RhcmdldCxwLHJlY2VpdmVyKXtcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbmlmKHRoaXMhPT1yZWNlaXZlcil7XG4vKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbmFzc2VydC5lcnJvcihcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtwfVwiIG1ldGhvZCBvZiBFKCR7cSh4KX0pYCkpO1xuXG5cbiB9XG5cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZCh4LHAsYXJncyk7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnQXJyYXk9W10pe1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24oeCxhcmdBcnJheSk7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVzZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKXtcbnJldHVybiBoYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldChfdGFyZ2V0LHAscmVjZWl2ZXIpe1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG50aGlzPT09cmVjZWl2ZXJ8fFxuRmFpbCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocCl9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKFxueClcbiB9KWA7XG5IYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHgscCxhcmdzKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKXtcbkhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seSh4LGFyZ3NBcnJheSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0sXG5oYXMoX3RhcmdldCxfcCl7XG4vKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9pbmRleCcpLkVQcm94eX1cbiAqL1xuZnVuY3Rpb24gICAgICAgICAgICAgICAgbWFrZUUoSGFuZGxlZFByb21pc2Upe1xuZnVuY3Rpb24gRSh4KXtcbmNvbnN0IGhhbmRsZXI9RVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKTtcbnJldHVybiBoYXJkZW4obmV3IFByb3h5KCgpPT57IH0saGFuZGxlcikpO1xuIH1cblxuY29uc3QgbWFrZUVHZXR0ZXJQcm94eT0oeCk9PlxubmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCkse1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhcyhfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiB0cnVlO1xuIH0sXG5nZXQoX3RhcmdldCxwcm9wKXtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5nZXQoeCxwcm9wKTtcbiB9fSk7XG5cblxuRS5nZXQ9bWFrZUVHZXR0ZXJQcm94eTtcbkUucmVzb2x2ZT1IYW5kbGVkUHJvbWlzZS5yZXNvbHZlO1xuRS5zZW5kT25seT0oeCk9PntcbmNvbnN0IGhhbmRsZXI9RXNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfTtcblxuRS53aGVuPSh4LG9uZnVsZmlsbGVkLG9ucmVqZWN0ZWQpPT57XG5jb25zdFtvbnN1Y2Nlc3Msb25mYWlsdXJlXT10cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSk7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKG9uc3VjY2VzcyxvbmZhaWx1cmUpO1xuIH07XG5cbnJldHVybiBoYXJkZW4oRSk7XG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIG1ha2VFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANwvtTx8CAAAfAgAAKgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoSGFuZGxlZFByb21pc2UpOyRo4oCNX29uY2UuRShFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoVgjP48QAACPEAAALgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLW5vY2hlY2sqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyogTk9URTogV2UgY2FuJ3QgaW1wb3J0IHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3QgaW4gc2NvcGUgYmVmb3JlIGxvY2tkb3duLiovXG4vKiBpbXBvcnQgeyBhc3NlcnQsIGRldGFpbHMgYXMgWCwgRmFpbCB9IGZyb20gJ0BhZ29yaWMvYXNzZXJ0JzsqL1xuXG4vKiBXQVJOSU5HOiBHbG9iYWwgTXV0YWJsZSBTdGF0ZSEqL1xuLyogVGhpcyBzdGF0ZSBpcyBjb21tdW5pY2F0ZWQgdG8gYGFzc2VydGAgdGhhdCBtYWtlcyBpdCBhdmFpbGFibGUgdG8gdGhlKi9cbi8qIGNhdXNhbCBjb25zb2xlLCB3aGljaCBhZmZlY3RzIHRoZSBjb25zb2xlIGxvZyBvdXRwdXQuIE5vcm1hbGx5IHdlKi9cbi8qIHJlZ2FyZCB0aGUgYWJpbGl0eSB0byBzZWUgY29uc29sZSBsb2cgb3V0cHV0IGFzIGEgbWV0YS1sZXZlbCBwcml2aWxlZ2UqL1xuLyogYW5hbG9nb3VzIHRvIHRoZSBhYmlsaXR5IHRvIGRlYnVnLiBBc2lkZSBmcm9tIHRoYXQsIHRoaXMgbW9kdWxlIHNob3VsZCovXG4vKiBub3QgaGF2ZSBhbnkgb2JzZXJ2YWJseSBtdXRhYmxlIHN0YXRlLiovXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuPTA7XG5sZXQgaGlkZGVuQ3VycmVudEV2ZW50PTA7XG5cbi8qIFRPRE8gVXNlIGVudmlyb25tZW50LW9wdGlvbnMuanMgY3VycmVudGx5IGluIHNlcy9zcmMgYWZ0ZXIgZmFjdG9yaW5nIGl0IG91dCovXG4vKiB0byBhIG5ldyBwYWNrYWdlLiovXG5jb25zdCBlbnY9KGdsb2JhbFRoaXMucHJvY2Vzc3x8e30pLmVudnx8e307XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFPShlbnYuREVCVUd8fCcnKS5zcGxpdCgnOicpLmluY2x1ZGVzKCd0cmFjay10dXJucycpO1xuXG5jb25zdCB2YWxpZE9wdGlvblZhbHVlcz1mcmVlemUoW3VuZGVmaW5lZCwnZW5hYmxlZCcsJ2Rpc2FibGVkJ10pO1xuXG4vKiBUcmFjay10dXJucyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBkaXNhYmxlZCBieSBhbiBlbnZpcm9ubWVudCovXG4vKiBvcHRpb24uKi9cbmNvbnN0IGVudk9wdGlvblZhbHVlPWVudi5UUkFDS19UVVJOUztcbmlmKCF2YWxpZE9wdGlvblZhbHVlcy5pbmNsdWRlcyhlbnZPcHRpb25WYWx1ZSkpe1xudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgdW5yZWNvZ25pemVkIFRSQUNLX1RVUk5TICR7SlNPTi5zdHJpbmdpZnkoZW52T3B0aW9uVmFsdWUpfWApO1xuXG4gfVxuY29uc3QgRU5BQkxFRD0oZW52T3B0aW9uVmFsdWV8fCdkaXNhYmxlZCcpPT09J2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvdXQgb2YgdHJhY2tUdXJucygpIHRvIGRpc2NvdXJhZ2UgdGhlKi9cbi8qIGNsb3N1cmVzIGZyb20gaG9sZGluZyBvbnRvICdhcmdzJyBvciAnZnVuYycgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LCovXG4vKiB3aGljaCB3ZSd2ZSBzZWVuIGNhdXNlIEhhbmRsZWRQcm9taXNlIGFyZ3VtZW50cyB0byBiZSByZXRhaW5lZCBmb3IqL1xuLyogYSBzdXJwcmlzaW5nbHkgbG9uZyB0aW1lLiovXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGU9KGRldGFpbHNOb3RlKT0+KHJlYXNvbik9PntcbmlmKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKHJlYXNvbixkZXRhaWxzTm90ZSk7XG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLHJlYXNvbik7XG4gfVxuIH07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbj1cbihmdW5jLHNlbmRpbmdFcnJvcixYKT0+XG4oLi4uYXJncyk9PntcbmhpZGRlblByaW9yRXJyb3I9c2VuZGluZ0Vycm9yO1xuaGlkZGVuQ3VycmVudFR1cm4rPTE7XG5oaWRkZW5DdXJyZW50RXZlbnQ9MDtcbnRyeXtcbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbmlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLGVycik7XG4gfVxudGhyb3cgZXJyO1xuIH1cbi8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG5jb25zdCBkZXRhaWxzTm90ZT1YIGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xucmV0dXJuIHJlc3VsdDtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9bmV3IEVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuIGZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSk7XG4gfTskaOKAjV9vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP0lSmYLDAAACwwAADUAAABAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuNC9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQsICduYW1lJywge3ZhbHVlOiBcIndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50XCJ9KTskaOKAjV9vbmNlLndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KTsgICBmdW5jdGlvbiAgICAgICAgd3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQoXG5PbGRDb21wYXJ0bWVudCxcbmluZXNjYXBhYmxlVHJhbnNmb3JtcyxcbmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcylcbntcbi8qIFRoaXMgaXMgdGhlIG5ldyBDb21wYXJ0bWVudCBjb25zdHJ1Y3Rvci4gV2UgbmFtZSBpdCBgQ29tcGFydG1lbnRgIHNvKi9cbi8qIHRoYXQgaXQncyAubmFtZSBwcm9wZXJ0eSBpcyBjb3JyZWN0LCBidXQgd2UgaG9sZCBpdCBpbiAnTmV3Q29tcGFydG1lbnQnKi9cbi8qIHNvIHRoYXQgbGludCBkb2Vzbid0IHRoaW5rIHdlJ3JlIHNoYWRvd2luZyB0aGUgb3JpZ2luYWwuKi9cbmNvbnN0IE5ld0NvbXBhcnRtZW50PWZ1bmN0aW9uIENvbXBhcnRtZW50KFxuZW5kb3dtZW50cyxcbm1vZHVsZXMsXG5vbGRPcHRpb25zPXt9KVxue1xuY29uc3R7dHJhbnNmb3JtczpvbGRUcmFuc2Zvcm1zPVtdLC4uLm90aGVyT3B0aW9uc309b2xkT3B0aW9ucztcbmNvbnN0IG5ld1RyYW5zZm9ybXM9Wy4uLm9sZFRyYW5zZm9ybXMsLi4uaW5lc2NhcGFibGVUcmFuc2Zvcm1zXTtcbmNvbnN0IG5ld09wdGlvbnM9e1xuLi4ub3RoZXJPcHRpb25zLFxudHJhbnNmb3JtczpuZXdUcmFuc2Zvcm1zfTtcblxuXG4vKiBUaGUgcmVhbCBDb21wYXJ0bWVudCBpcyBkZWZpbmVkIGFzIGEgY2xhc3MsIHNvICduZXcgQ29tcGFydG1lbnQoKScqL1xuLyogd29ya3MgYnV0IG5vdCAnQ29tcGFydG1lbnQoKScuIFdlIGNhbiBiZWhhdmUgdGhlIHNhbWUgd2F5LiBJdCB3b3VsZCBiZSovXG4vKiBuaWNlIHRvIGRlbGVnYXRlIHRoZSAndGhyb3cnIHRvIHRoZSBvcmlnaW5hbCBjb25zdHJ1Y3RvciBieSBrbm93aW5nKi9cbi8qIGNhbGxpbmcgaXQgdGhlIHdyb25nIHdheSwgYnV0IEkgZG9uJ3Qga25vdyBob3cgdG8gZG8gdGhhdC4qL1xuaWYobmV3LnRhcmdldD09PXVuZGVmaW5lZCl7XG4vKiBgbmV3Q29tcGFydG1lbnRgIHdhcyBjYWxsZWQgYXMgYSBmdW5jdGlvbiovXG50aHJvdyBFcnJvcignQ29tcGFydG1lbnQgbXVzdCBiZSBjYWxsZWQgYXMgYSBjb25zdHJ1Y3RvcicpO1xuIH1cblxuLyogSXQsIG9yIGEgc3ViY2xhc3MsIHdhcyBjYWxsZWQgYXMgYSBjb25zdHJ1Y3RvciovXG5cbmNvbnN0IGM9UmVmbGVjdC5jb25zdHJ1Y3QoXG5PbGRDb21wYXJ0bWVudCxcbltlbmRvd21lbnRzLG1vZHVsZXMsbmV3T3B0aW9uc10sXG5uZXcudGFyZ2V0KTtcblxuLyogVGhlIGNvbmZpbmVtZW50IGFwcGxpZXMgdG8gYWxsIGNvbXBhcnRtZW50cyB0b28uIFRoaXMgcmVsaWVzIHVwb24gdGhlKi9cbi8qIGNoaWxkJ3Mgbm9ybWFsIENvbXBhcnRtZW50IGJlaGF2aW5nIHRoZSBzYW1lIHdheSBhcyB0aGUgcGFyZW50J3MsKi9cbi8qIHdoaWNoIHdpbGwgY2Vhc2UgdG8gYmUgdGhlIGNhc2Ugc29vbiAodGhlaXIgbW9kdWxlIHRhYmxlcyBhcmUqL1xuLyogZGlmZmVyZW50KS4gVE9ETzogdXBkYXRlIHRoaXMgd2hlbiB0aGF0IGhhcHBlbnMsIHdlIG5lZWQgc29tZXRoaW5nKi9cbi8qIGxpa2UgYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50ID0gd3JhcChjLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQpLCBidXQqL1xuLyogdGhlcmUgYXJlIGRldGFpbHMgdG8gd29yayBvdXQuKi9cbmMuZ2xvYmFsVGhpcy5Db21wYXJ0bWVudD1OZXdDb21wYXJ0bWVudDtcblxuZm9yKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXMoaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzKSl7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoYy5nbG9iYWxUaGlzLHByb3Ase1xudmFsdWU6aW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzW3Byb3BdLFxud3JpdGFibGU6dHJ1ZSxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6dHJ1ZX0pO1xuXG4gfVxuXG5yZXR1cm4gYztcbiB9O1xuXG4vKiBlbnN1cmUgYChjIGlzaW5zdGFuY2UgQ29tcGFydG1lbnQpYCByZW1haW5zIHRydWUqL1xuTmV3Q29tcGFydG1lbnQucHJvdG90eXBlPU9sZENvbXBhcnRtZW50LnByb3RvdHlwZTtcblxuLyogU0VDVVJJVFkgTk9URTogaWYgdGhpcyB3ZXJlIHVzZWQgb3V0c2lkZSBvZiBTRVMsIHRoaXMgbWlnaHQgbGVhdmUqL1xuLyogYy5wcm90b3R5cGUuY29uc3RydWN0b3IgcG9pbnRpbmcgYXQgdGhlIG9yaWdpbmFsICh1bnRhbWVkKSBDb21wYXJ0bWVudCwqL1xuLyogd2hpY2ggd291bGQgYWxsb3cgYSBicmVhY2guIEtyaXMgc2F5cyB0aGlzIHdpbGwgYmUgaGFyZCB0byBmaXggdW50aWwgaGUqL1xuLyogcmV3cml0ZXMgdGhlIGNvbXBhcnRtZW50IHNoaW0sIHBvc3NpYmx5IGFzIGEgcGxhaW4gZnVuY3Rpb24gaW5zdGVhZCBvZiBhKi9cbi8qIGNsYXNzLiBVbmRlciBTRVMsIE9sZENvbXBhcnRtZW50LnByb3RvdHlwZS5jb25zdHJ1Y3RvciBpcyB0YW1lZCovXG5cbnJldHVybiBOZXdDb21wYXJ0bWVudDtcbiB9XG5cbi8qIHN3aW5nc2V0IHdvdWxkIGRvIHRoaXMgdG8gZWFjaCBkeW5hbWljIHZhdCovXG4vKiBjLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQgPSB3cmFwQ29tcGFydG1lbnQoYy5nbG9iYWxUaGlzLkNvbXBhcnRtZW50LCAuLik7Ki9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCI6WyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAxrMWAWRMAAFkTAAAnAAAAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY29tcGFydG1lbnQtd3JhcHBlci5qcyIsIkBlbmRvL2Jhc2U2NCIsIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEJ1bmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXJzZUFyY2hpdmUsZGVjb2RlQmFzZTY0LHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qc1wiLCBbW1wicGFyc2VBcmNoaXZlXCIsIFskaOKAjV9hID0+IChwYXJzZUFyY2hpdmUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vYmFzZTY0XCIsIFtbXCJkZWNvZGVCYXNlNjRcIiwgWyRo4oCNX2EgPT4gKGRlY29kZUJhc2U2NCA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvbXBhcnRtZW50LXdyYXBwZXIuanNcIiwgW1tcIndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50XCIsIFskaOKAjV9hID0+ICh3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpbXBvcnRCdW5kbGUsICduYW1lJywge3ZhbHVlOiBcImltcG9ydEJ1bmRsZVwifSk7JGjigI1fb25jZS5pbXBvcnRCdW5kbGUoaW1wb3J0QnVuZGxlKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiBpbXBvcnRCdW5kbGUgdGFrZXMgdGhlIG91dHB1dCBvZiBidW5kbGUtc291cmNlLCBhbmQgcmV0dXJucyBhIG5hbWVzcGFjZSovXG4vKiBvYmplY3QgKHdpdGggLmRlZmF1bHQsIGFuZCBtYXliZSBvdGhlciBwcm9wZXJ0aWVzIGZvciBuYW1lZCBleHBvcnRzKSovXG5cbmFzeW5jIGZ1bmN0aW9uICAgICAgICBpbXBvcnRCdW5kbGUoYnVuZGxlLG9wdGlvbnM9e30pe1xuY29uc3R7XG5maWxlUHJlZml4LFxuZW5kb3dtZW50czpvcHRFbmRvd21lbnRzPXt9LFxuLyogdHJhbnNmb3JtcyBhcmUgaW5kZWVkIF9fc2hpbVRyYW5zZm9ybXNfXywgaW50ZW5kZWQgdG8gYXBwbHkgdG8gYm90aCovXG4vKiBldmFsdWF0ZWQgcHJvZ3JhbXMgYW5kIG1vZHVsZXMgc2hpbW1lZCB0byBwcm9ncmFtcy4qL1xudHJhbnNmb3Jtcz1bXSxcbmluZXNjYXBhYmxlVHJhbnNmb3Jtcz1bXSxcbmluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcz17fX09XG5vcHRpb25zO1xuY29uc3QgZW5kb3dtZW50cz17XG5UZXh0RW5jb2RlcixcblRleHREZWNvZGVyLFxuVVJMOmdsb2JhbFRoaXMuVVJMLC8qIEFic2VudCBvbmx5IGluIFhTbmFwKi9cbkJhc2U2NDpnbG9iYWxUaGlzLkJhc2U2NCwvKiBQcmVzZW50IG9ubHkgaW4gWFNuYXAqL1xuYXRvYjpnbG9iYWxUaGlzLmF0b2IsXG5idG9hOmdsb2JhbFRoaXMuYnRvYSxcbi4uLm9wdEVuZG93bWVudHN9O1xuXG5cbmxldCBDb21wYXJ0bWVudFRvVXNlPUNvbXBhcnRtZW50O1xuaWYoXG5pbmVzY2FwYWJsZVRyYW5zZm9ybXMubGVuZ3RofHxcbk9iamVjdC5rZXlzKGluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcykubGVuZ3RoKVxue1xuLyogQHRzLWV4cGVjdC1lcnJvciBUUzIzMjIgbm8gbWF0Y2ggZm9yIHRoZSBzaWduYXR1cmUqL1xuQ29tcGFydG1lbnRUb1VzZT13cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudChcbkNvbXBhcnRtZW50LFxuaW5lc2NhcGFibGVUcmFuc2Zvcm1zLFxuaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzKTtcblxuIH1cblxuY29uc3R7bW9kdWxlRm9ybWF0fT1idW5kbGU7XG5pZihtb2R1bGVGb3JtYXQ9PT0nZW5kb1ppcEJhc2U2NCcpe1xuY29uc3R7ZW5kb1ppcEJhc2U2NH09YnVuZGxlO1xuY29uc3QgYnl0ZXM9ZGVjb2RlQmFzZTY0KGVuZG9aaXBCYXNlNjQpO1xuY29uc3QgYXJjaGl2ZT1hd2FpdCBwYXJzZUFyY2hpdmUoYnl0ZXMpO1xuLyogQ2FsbCBpbXBvcnQgYnkgcHJvcGVydHkgdG8gYnlwYXNzIFNFUyBjZW5zb3JpbmcgZm9yIGR5bmFtaWMgaW1wb3J0LiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZG90LW5vdGF0aW9uKi9cbmNvbnN0e25hbWVzcGFjZX09YXdhaXQgYXJjaGl2ZVsnaW1wb3J0J10oe1xuZ2xvYmFsczplbmRvd21lbnRzLFxuX19zaGltVHJhbnNmb3Jtc19fOnRyYW5zZm9ybXMsXG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTMjc0MCBtaXNzaW5nIHByb3BlcnRpZXMgZnJvbSB0eXBlKi9cbkNvbXBhcnRtZW50OkNvbXBhcnRtZW50VG9Vc2V9KTtcblxuLyogbmFtZXNwYWNlLmRlZmF1bHQgaGFzIHRoZSBkZWZhdWx0IGV4cG9ydCovXG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cblxubGV0IGM7XG5jb25zdHtzb3VyY2Usc291cmNlTWFwfT1idW5kbGU7XG5pZihtb2R1bGVGb3JtYXQ9PT0nZ2V0RXhwb3J0Jyl7XG4vKiBUaGUgJ2dldEV4cG9ydCcgZm9ybWF0IGlzIGEgc3RyaW5nIHdoaWNoIGRlZmluZXMgYSB3cmFwcGVyIGZ1bmN0aW9uKi9cbi8qIG5hbWVkIGBnZXRFeHBvcnQoKWAuIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSBgbW9kdWxlYCB0byB0aGUqL1xuLyogbGluZWFyaXplZCBzb3VyY2UgZmlsZSwgZXhlY3V0ZXMgdGhhdCBzb3VyY2UsIHRoZW4gcmV0dXJucyovXG4vKiBgbW9kdWxlLmV4cG9ydHNgLiBUbyBnZXQgdGhlIGZ1bmN0aW9uIG9iamVjdCBvdXQgb2YgYSBwcm9ncmFtLW1vZGUqL1xuLyogZXZhbHVhdGlvbiwgd2UgbXVzdCB3cmFwIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uIGluIHBhcmVudGhlc2VzKi9cbi8qIChtYWtpbmcgaXQgYW4gZXhwcmVzc2lvbikuIFdlIGFsc28gd2FudCB0byBhcHBlbmQgdGhlIGBzb3VyY2VNYXBgKi9cbi8qIGNvbW1lbnQgc28gYGV2YWx1YXRlYCBjYW4gYXR0YWNoIHVzZWZ1bCBkZWJ1ZyBpbmZvcm1hdGlvbi4gRmluYWxseSwgdG8qL1xuLyogZXh0cmFjdCB0aGUgbmFtZXNwYWNlIG9iamVjdCwgd2UgbmVlZCB0byBpbnZva2UgdGhpcyBmdW5jdGlvbi4qL1xuIH1lbHNlIGlmKG1vZHVsZUZvcm1hdD09PSduZXN0ZWRFdmFsdWF0ZScpe1xuLyogVGhlICduZXN0ZWRFdmFsdWF0ZScgZm9ybWF0IGlzIHNpbWlsYXIsIGV4Y2VwdCB0aGUgd3JhcHBlciBmdW5jdGlvbiovXG4vKiAobm93IG5hbWVkIGBnZXRFeHBvcnRXaXRoTmVzdGVkRXZhbHVhdGVgKSB3cmFwcyBtb3JlIHRoYW4gYSBzaW5nbGUqL1xuLyogbGluZWFyaXplZCBzdHJpbmcuIEVhY2ggc291cmNlIG1vZHVsZSBpcyBwcm9jZXNzZWQgKGNvbnZlcnRpbmcqL1xuLyogYGltcG9ydGAgaW50byBgcmVxdWlyZWApIGFuZCBhZGRlZCB0byBhIHRhYmxlIG5hbWVkIGBzb3VyY2VCdW5kbGVgLiovXG4vKiBFYWNoIG1vZHVsZSB3aWxsIGJlIGV2YWx1YXRlZCBzZXBhcmF0ZWx5IChzbyB0aGV5IGNhbiBnZXQgZGlzdGluY3QqL1xuLyogc291cmNlTWFwIHN0cmluZ3MpLCB1c2luZyBhIG1hbmRhdG9yeSBlbmRvd21lbnQgbmFtZWQqL1xuLyogYG5lc3RlZEV2YWx1YXRlYC4gVGhlIHdyYXBwZXIgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCB3aXRoKi9cbi8qIGBmaWxlUHJlZml4YCwgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSBzb3VyY2VNYXAgZm9yIHRoZSB0b3AtbGV2ZWwqL1xuLyogbW9kdWxlLiBUaGUgc291cmNlTWFwIG5hbWUgZm9yIG90aGVyIG1vZHVsZXMgd2lsbCBiZSBkZXJpdmVkIGZyb20qL1xuLyogYGZpbGVQcmVmaXhgIGFuZCB0aGUgcmVsYXRpdmUgaW1wb3J0IHBhdGggb2YgZWFjaCBtb2R1bGUuKi9cbmVuZG93bWVudHMubmVzdGVkRXZhbHVhdGU9KHNyYyk9PmMuZXZhbHVhdGUoc3JjKTtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCBtb2R1bGVGb3JtYXQgJyR7bW9kdWxlRm9ybWF0fSdgO1xuIH1cblxuYz1uZXcgQ29tcGFydG1lbnRUb1VzZShlbmRvd21lbnRzLHt9LHt0cmFuc2Zvcm1zfSk7XG5oYXJkZW4oYy5nbG9iYWxUaGlzKTtcbmNvbnN0IGFjdHVhbFNvdXJjZT0gYCgke3NvdXJjZX0pXFxuJHtzb3VyY2VNYXB8fCcnfWA7XG5jb25zdCBuYW1lc3BhY2U9Yy5ldmFsdWF0ZShhY3R1YWxTb3VyY2UpKGZpbGVQcmVmaXgpO1xuLyogbmFtZXNwYWNlLmRlZmF1bHQgaGFzIHRoZSBkZWZhdWx0IGV4cG9ydCovXG5yZXR1cm4gbmFtZXNwYWNlO1xuIH1cblxuLyogaW1wb3J0QnVuZGxlKGJ1bmRsZSwgeyBtZXRlcmluZzogeyBnZXRNZXRlciwgbWV0ZXJpbmdPcHRpb25zIH0gfSk7XG5pbXBvcnRCdW5kbGUoYnVuZGxlLCB7IHRyYW5zZm9ybXM6IFsgbWV0ZXJUcmFuc2Zvcm0gXSwgbGV4aWNhbHM6IHsgZ2V0TWV0ZXIgfSB9KTtcbmltcG9ydEJ1bmRsZShidW5kbGUsIHsgbWFuZGF0b3J5VHJhbnNmb3JtczogWyBtZXRlclRyYW5zZm9ybSBdLCBtYW5kYXRvcnlMZXhpY2FsczogeyBnZXRNZXRlciB9IH0pO1xuIC8vIHRoZW4gaW1wb3J0QnVuZGxlIGJ1aWxkcyB0aGUgQ29tcGFydG1lbnQgd3JhcHBlclxuIFhTOlxuIHhzLnNldE1ldGVyKCk7XG54cy5jYWxsV2l0aE1ldGVyKG1ldGVyLCBucy5kaXNwYXRjaCk7XG54cy5jYWxsV2l0aEtlZXBlcihrZWVwZXIsIG5zLmRpc3BhdGNoKTsgLy8ga2VlcGVyLmdldE1ldGVyKCkgLT4gbWV0ZXIsIHRoZW4gbnMuZGlzcGF0Y2goKVxuLy8ga2VlcGVyLnN0YXJ0Q3JhbmsobWV0YWRhdGEudHNoaXJ0c2l6ZSlcbi8vICAgLy8ga2VlcGVyIHNldHMgbWV0ZXIgdG8gc29tZSBmaXhlZCB2YWx1ZVxuLy8gaW5pdGlhbE1ldGVyID0ga2VlcGVyLmdldE1ldGVyKClcbi8vIG5zLmRpc3BhdGNoKCkgLy8gZHJhaW5zIGluaXRpYWxNZXRlclxuLy8gbWF5YmU6IGtlZXBlci5lbmRDcmFuaygpID8/P1xuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaW1wb3J0QnVuZGxlIjpbImltcG9ydEJ1bmRsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACljzr3SgcAAEoHAAAdAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL3JhbmtPcmRlci5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanNcIiwgW11dLFtcIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9yYW5rT3JkZXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6W1siZGVlcGx5RnVsZmlsbGVkIiwiZGVlcGx5RnVsZmlsbGVkIl1dLCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXV0sIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjpbWyJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiXSxbIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSJdLFsiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNFbmNvZGVkUmVtb3RhYmxlIl0sWyJ6ZXJvUGFkIiwiemVyb1BhZCJdLFsicmVjb3JkTmFtZXMiLCJyZWNvcmROYW1lcyJdLFsicmVjb3JkVmFsdWVzIiwicmVjb3JkVmFsdWVzIl1dLCIuL3NyYy9yYW5rT3JkZXIuanMiOltbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIl0sWyJjb21wYXJlUmFuayIsImNvbXBhcmVSYW5rIl0sWyJpc1JhbmtTb3J0ZWQiLCJpc1JhbmtTb3J0ZWQiXSxbInNvcnRCeVJhbmsiLCJzb3J0QnlSYW5rIl0sWyJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQW50aVJhbmsiXSxbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXSxbImdldFBhc3NTdHlsZUNvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiXSxbImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sWyJ1bmlvblJhbmtDb3ZlcnMiLCJ1bmlvblJhbmtDb3ZlcnMiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAA0IJnuUDQAAlA0AACsAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJkZWVwbHlGdWxmaWxsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxpc1Byb21pc2UsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5FUmVmPFQ+fSBFUmVmICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZnJvbUVudHJpZXN9PU9iamVjdDtcblxuLyoqXG4gKiBHaXZlbiBhIFBhc3NhYmxlIGB2YWxgIHdob3NlIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgbWF5IGNvbnRhaW4gbGVhZlxuICogcHJvbWlzZXMsIHJldHVybiBhIHByb21pc2UgZm9yIGEgcmVwbGFjZW1lbnQgUGFzc2FibGUsXG4gKiB3aGVyZSB0aGF0IHJlcGxhY2VtZW50IGlzICpkZWVwbHkgZnVsZmlsbGVkKiwgaS5lLiwgaXRzXG4gKiBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIGRvZXMgbm90IGNvbnRhaW4gYW55IHByb21pc2VzLlxuICpcbiAqIFRoaXMgaXMgYSBkZWVwIGZvcm0gb2YgYFByb21pc2UuYWxsYCBzcGVjaWFsaXplZCBmb3IgUGFzc2FibGVzLiBGb3IgZWFjaFxuICogZW5jb3VudGVyZWQgcHJvbWlzZSwgcmVwbGFjZSBpdCB3aXRoIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm0gb2ZcbiAqIGl0cyBmdWxmaWxsbWVudC5cbiAqIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgcmVqZWN0LCB0aGVuIHRoZSBwcm9taXNlIGZvciB0aGUgcmVwbGFjZW1lbnRcbiAqIHJlamVjdHMuIElmIGFueSBvZiB0aGUgcHJvbWlzZXMgbmV2ZXIgc2V0dGxlLCB0aGVuIHRoZSBwcm9taXNlIGZvclxuICogdGhlIHJlcGxhY2VtZW50IG5ldmVyIHNldHRsZXMuXG4gKlxuICogSWYgdGhlIHJlcGxhY2VtZW50IHdvdWxkIG5vdCBiZSBQYXNzYWJsZSwgaS5lLiwgaWYgYHZhbGAgaXMgbm90XG4gKiBQYXNzYWJsZSwgb3IgaWYgYW55IG9mIHRoZSB0cmFuc2l0aXZlIHByb21pc2VzIGZ1bGZpbGwgdG8gc29tZXRoaW5nXG4gKiB0aGF0IGlzIG5vdCBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSByZWplY3RzLlxuICpcbiAqIElmIGB2YWxgIG9yIGl0cyBwYXJ0cyBhcmUgbm9uLWtleSBQYXNzYWJsZXMgb25seSAqYmVjYXVzZSogdGhleSBjb250YWluc1xuICogcHJvbWlzZXMsIHRoZSBkZWVwbHkgZnVsZmlsbGVkIGZvcm1zIG9mIHZhbCBvciBpdHMgcGFydHMgbWF5IGJlIGtleXMuIFRoaXNcbiAqIGlzIGZvciB0aGUgaGlnaGVyIFwic3RvcmVcIiBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0byBkZXRlcm1pbmUsIGJlY2F1c2UgaXRcbiAqIGRlZmluZXMgdGhlIFwia2V5XCIgbm90aW9uIGluIHF1ZXN0aW9uLlxuICpcbiAqIC8vIFRPRE86IFRoYXQgaGlnaGVyIGxldmVsIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIG1pZ3JhdGVkIGZyb21cbiAqIC8vIGBAYWdvcmljL3N0b3JlYCB0byBgQGVuZG8vcGF0dGVybnNgLiBPbmNlIHRoYXQgaXMgZmFyIGVub3VnaCBhbG9uZyxcbiAqIC8vIHJldmlzZSB0aGUgYWJvdmUgY29tbWVudCB0byBtYXRjaC5cbiAqIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNDUxXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXNzYWJsZT59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWQ9YXN5bmModmFsKT0+e1xuaWYoIWlzT2JqZWN0KHZhbCkpe1xucmV0dXJuIHZhbDtcbiB9XG5pZihpc1Byb21pc2UodmFsKSl7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuY29uc3QgbmFtZXM9b3duS2V5cyh2YWwpO1xuY29uc3QgdmFsUHM9bmFtZXMubWFwKChuYW1lKT0+ZGVlcGx5RnVsZmlsbGVkKHZhbFtuYW1lXSkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5cbmhhcmRlbihmcm9tRW50cmllcyh2YWxzLm1hcCgoYyxpKT0+W25hbWVzW2ldLGNdKSkpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5jb25zdCB2YWxQcz12YWwubWFwKChwKT0+ZGVlcGx5RnVsZmlsbGVkKHApKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+aGFyZGVuKHZhbHMpKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyh2YWwpO1xucmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodmFsLnBheWxvYWQpLChwYXlsb2FkKT0+XG5tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKSk7XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgVW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9OyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADtyz4DkPwAA5D8AACoAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGFzc2VydFJlY29yZCxpc0Vycm9yTGlrZSxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvdmVyfSBSYW5rQ292ZXIgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtmcm9tRW50cmllcyxpc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCwgd2UgaGF2ZSBvbmx5XG4gKiBzdHJpbmctbmFtZWQgb3duIHByb3BlcnRpZXMuIGByZWNvcmROYW1lc2AgcmV0dXJucyB0aG9zZSBuYW1lICpyZXZlcnNlKlxuICogc29ydGVkLCBiZWNhdXNlIHRoYXQncyBob3cgcmVjb3JkcyBhcmUgY29tcGFyZWQsIGVuY29kZWQsIGFuZCBzb3J0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmROYW1lcz0ocmVjb3JkKT0+XG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjEwMDM2NTcyNDQqL1xuLyogY29tcGFyZXMgdHdvIHdheXMgb2YgcmV2ZXJzZSBzb3J0aW5nLCBhbmQgc2hvd3MgdGhhdCBgLnNvcnQoKS5yZXZlcnNlKClgKi9cbi8qIGlzIGN1cnJlbnRseSBmYXN0ZXIgb24gTW9kZGFibGUgWFMsIHdoaWxlIHRoZSBvdGhlciB3YXksKi9cbi8qIGAuc29ydChyZXZlcnNlQ29tcGFyYXRvcilgLCBpcyBmYXN0ZXIgb24gdjguIFdlIGN1cnJlbnRseSBjYXJlIG1vcmUgYWJvdXQqL1xuLyogWFMgcGVyZm9ybWFuY2UsIHNvIHdlIHJldmVyc2Ugc29ydCB1c2luZyBgLnNvcnQoKS5yZXZlcnNlKClgLiovXG5oYXJkZW4oLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJlY29yZCkuc29ydCgpLnJldmVyc2UoKSk7JGjigI1fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkIGFuZCBgbmFtZXNgIGlzIGByZWNvcmROYW1lcyhyZWNvcmQpYCxcbiAqIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBhcnJheSBvZiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZFZhbHVlcz0ocmVjb3JkLG5hbWVzKT0+XG5oYXJkZW4obmFtZXMubWFwKChuYW1lKT0+cmVjb3JkW25hbWVdKSk7JGjigI1fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gblxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICB6ZXJvUGFkPShuLHNpemUpPT57XG5jb25zdCBuU3RyPSBgJHtufWA7XG5hc3NlcnQoblN0ci5sZW5ndGg8PXNpemUpO1xuY29uc3Qgc3RyPSBgMDAwMDAwMDAwMDAwMDAwMDAwMDAke25TdHJ9YDtcbmNvbnN0IHJlc3VsdD1zdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGgtc2l6ZSk7XG5hc3NlcnQocmVzdWx0Lmxlbmd0aD09PXNpemUpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLyogVGhpcyBpcyB0aGUgSmF2YVNjcmlwdCBhbmFsb2cgdG8gYSBDIHVuaW9uOiBhIHdheSB0byBtYXAgYmV0d2VlbiBhIGZsb2F0IGFzIGEqL1xuLyogbnVtYmVyIGFuZCB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgZmxvYXQgYXMgYSBidWZmZXIgZnVsbCBvZiBieXRlcy4gIE5vdGUqL1xuLyogdGhhdCB0aGUgbXV0YXRpb24gb2Ygc3RhdGljIHN0YXRlIGhlcmUgbWFrZXMgdGhpcyBpbnZhbGlkIEplc3NpZSBjb2RlLCBidXQqL1xuLyogZG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgdGhlIG51Z2F0b3J5IGFuZCBncmF0dWl0b3VzIGFsbG9jYXRpb25zIHRoYXQgd291bGQqL1xuLyogaGFwcGVuIGV2ZXJ5IHRpbWUgeW91IGRvIGEgY29udmVyc2lvbiAtLSBhbmQgaW4gcHJhY3RpY2FsIHRlcm1zIGl0J3Mgc2FmZSovXG4vKiBiZWNhdXNlIHdlIHB1dCB0aGUgdmFsdWUgaW4gb25lIHNpZGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgdGFrZSBpdCBvdXQgdGhlKi9cbi8qIG90aGVyOyB0aGVyZSBpcyBubyBhY3R1YWwgc3RhdGUgcmV0YWluZWQgaW4gdGhlIGNsYXNzaWMgc2Vuc2UgYW5kIHRodXMgbm8qL1xuLyogcmUtZW50cmFuY3kgaXNzdWUuKi9cbmNvbnN0IGFzTnVtYmVyPW5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHM9bmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8qIEphdmFTY3JpcHQgbnVtYmVycyBhcmUgZW5jb2RlZCBieSBvdXRwdXR0aW5nIHRoZSBiYXNlLTE2Ki9cbi8qIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgSUVFRSBmbG9hdGluZyBwb2ludCovXG4vKiByZXByZXNlbnRhdGlvbi4gIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFsbCBiaXRzIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gYXJlKi9cbi8qIGNvbXBsZW1lbnRlZCBwcmlvciB0byB0aGUgYmFzZS0xNiBjb252ZXJzaW9uLCB3aGlsZSBmb3IgcG9zaXRpdmUgdmFsdWVzLCB0aGUqL1xuLyogc2lnbiBiaXQgaXMgY29tcGxlbWVudGVkLiAgVGhpcyBlbnN1cmVzIGJvdGggdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBiZWZvcmUqL1xuLyogcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGFjY29yZGluZyB0byB0aGVpciBuZWdhdGl2ZSovXG4vKiBtYWduaXR1ZGUgcmF0aGVyIHRoYW4gdGhlaXIgcG9zaXRpdmUgbWFnbml0dWRlLiAgVGhpcyByZXN1bHRzIGluIGFuIEFTQ0lJKi9cbi8qIGVuY29kaW5nIHdob3NlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtZXJpYyBzb3J0IG9yZGVyKi9cbi8qIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMuKi9cblxuLyogVE9ETyBDaG9vc2UgdGhlIHNhbWUgY2Fub25pY2FsIE5hTiBlbmNvZGluZyB0aGF0IGNvc21XYXNtIGFuZCBld2FzbSBjaG9zZS4qL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cz0nZmZmODAwMDAwMDAwMDAwMCc7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpbmFyeTY0PShuKT0+e1xuLyogTm9ybWFsaXplIC0wIHRvIDAgYW5kIE5hTiB0byBhIGNhbm9uaWNhbCBlbmNvZGluZyovXG5pZihpcyhuLC0wKSl7XG5uPTA7XG4gfWVsc2UgaWYoaXMobixOYU4pKXtcbnJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuIH1cbmFzTnVtYmVyWzBdPW47XG5sZXQgYml0cz1hc0JpdHNbMF07XG5pZihuPDApe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxucmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLDE2KX1gO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZUJpbmFyeTY0PShlbmNvZGVkKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdmJyl8fEZhaWwgYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBiaXRzPUJpZ0ludCggYDB4JHtlbmNvZGVkLnN1YnN0cmluZygxKX1gKTtcbmlmKGVuY29kZWRbMV08JzgnKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbmFzQml0c1swXT1iaXRzO1xuY29uc3QgcmVzdWx0PWFzTnVtYmVyWzBdO1xuIWlzKHJlc3VsdCwtMCl8fEZhaWwgYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtlbmNvZGVkfWA7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogRW5jb2RlIGEgSmF2YVNjcmlwdCBiaWdpbnQgdXNpbmcgYSB2YXJpYW50IG9mIEVsaWFzIGRlbHRhIGNvZGluZywgd2l0aCBhblxuICogaW5pdGlhbCBjb21wb25lbnQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2l0IGNvdW50IGFzIGEgdW5hcnkgc3RyaW5nLCBhXG4gKiBzZWNvbmQgY29tcG9uZW50IGZvciB0aGUgZGVjaW1hbCBkaWdpdCBjb3VudCwgYW5kIGEgdGhpcmQgY29tcG9uZW50IGZvciB0aGVcbiAqIGRlY2ltYWwgZGlnaXRzIHByZWNlZGVkIGJ5IGEgZ3JhdHVpdG91cyBzZXBhcmF0aW5nIGNvbG9uLlxuICogVG8gZW5zdXJlIHRoYXQgdGhlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBvZiBlbmNvZGVkIHZhbHVlcyBtYXRjaGVzIHRoZVxuICogbnVtZXJpYyBzb3J0IG9yZGVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMsIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bmFyeVxuICogcHJlZml4IGFyZSBkaWZmZXJlbnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyAodHlwZSBcIm5cIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mXG4gKiBcIiNcInMgW3doaWNoIHNvcnQgYmVmb3JlIGRlY2ltYWwgZGlnaXRzXSkgdnMuIHBvc2l0aXZlIGFuZCB6ZXJvIHZhbHVlcyAodHlwZVxuICogXCJwXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBcIn5cInMgW3doaWNoIHNvcnQgYWZ0ZXIgZGVjaW1hbCBkaWdpdHNdKSBhbmRcbiAqIGVhY2ggZGVjaW1hbCBkaWdpdCBvZiB0aGUgZW5jb2RpbmcgZm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBpdHNcbiAqIHRlbidzIGNvbXBsZW1lbnQgKHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzIG9mIHRoZSBzYW1lIHNjYWxlIHNvcnQgYnlcbiAqICpkZXNjZW5kaW5nKiBhYnNvbHV0ZSB2YWx1ZSkuXG4gKlxuICogQHBhcmFtIHtiaWdpbnR9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpZ0ludD0obik9PntcbmNvbnN0IGFicz1uPDBuPy1uOm47XG5jb25zdCBuRGlnaXRzPWFicy50b1N0cmluZygpLmxlbmd0aDtcbmNvbnN0IGxEaWdpdHM9bkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbmlmKG48MG4pe1xucmV0dXJuIGBuJHtcbi8qIEEgXCIjXCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nIycucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbigxMCoqbERpZ2l0cy1uRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsJzAnKVxuIH06JHtcbi8qIFRoZSB0ZW4ncyBjb21wbGVtZW50IG9mIHRoZSBkaWdpdHMuKi9cbigxMG4qKkJpZ0ludChuRGlnaXRzKStuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsJzAnKVxuIH1gO1xuIH1lbHNle1xucmV0dXJuIGBwJHtcbi8qIEEgXCJ+XCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4vKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4nficucmVwZWF0KGxEaWdpdHMtMSlcbiB9JHtcbi8qIFRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbm5EaWdpdHNcbiB9OiR7XG4vKiBUaGUgZGlnaXRzLiovXG5uXG4gfWA7XG4gfVxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmNvbnN0IGRlY29kZUJpZ0ludD0oZW5jb2RlZCk9PntcbmNvbnN0IHR5cGVQcmVmaXg9ZW5jb2RlZC5jaGFyQXQoMCk7LyogZmFzdGVyIHRoYW4gZW5jb2RlZFswXSovXG5sZXQgcmVtPWVuY29kZWQuc2xpY2UoMSk7XG50eXBlUHJlZml4PT09J3AnfHxcbnR5cGVQcmVmaXg9PT0nbid8fFxuRmFpbCBgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG5jb25zdCBsRGlnaXRzPXJlbS5zZWFyY2goL1swLTldLykrMTtcbmxEaWdpdHM+PTF8fEZhaWwgYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cy0xKTtcblxucmVtLmxlbmd0aD49bERpZ2l0c3x8RmFpbCBgQ29tcGxldGUgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuY29uc3Qgc25EaWdpdHM9cmVtLnNsaWNlKDAsbERpZ2l0cyk7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMpO1xuL15bMC05XSskLy50ZXN0KHNuRGlnaXRzKXx8RmFpbCBgRGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbkRpZ2l0cz1wYXJzZUludChzbkRpZ2l0cywxMCk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuMDpcIiBhbmQgXCJuMDA64oCmXCIgYW5kIFwibjkxOuKAplwiIHRocm91Z2ggXCJuOTk64oCmXCI/Ki9cbm5EaWdpdHM9MTAqKmxEaWdpdHMtbkRpZ2l0cztcbiB9XG5cbnJlbS5zdGFydHNXaXRoKCc6Jyl8fEZhaWwgYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5yZW09cmVtLnNsaWNlKDEpO1xucmVtLmxlbmd0aD09PW5EaWdpdHN8fFxuRmFpbCBgRml4ZWQtbGVuZ3RoIGRpZ2l0IHNlcXVlbmNlIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuPUJpZ0ludChyZW0pO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjk6MFwiIGFuZCBcIm44OjAwXCIgYW5kIFwibjg6OTFcIiB0aHJvdWdoIFwibjg6OTlcIj8qL1xubj0tKDEwbioqQmlnSW50KG5EaWdpdHMpLW4pO1xuIH1cblxucmV0dXJuIG47XG4gfTtcblxuLyogYCdcXHUwMDAwJ2AgaXMgdGhlIHRlcm1pbmF0b3IgYWZ0ZXIgZWxlbWVudHMuKi9cbi8qIGAnXFx1MDAwMSdgIGlzIHRoZSBiYWNrc2xhc2gtbGlrZSBlc2NhcGUgY2hhcmFjdGVyLCBmb3IqL1xuLyogZXNjYXBpbmcgYm90aCBvZiB0aGVzZSBjaGFyYWN0ZXJzLiovXG5cbmNvbnN0IGVuY29kZUFycmF5PShhcnJheSxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IGNoYXJzPVsnWyddO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpe1xuY29uc3QgZW5jPWVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuZm9yKGNvbnN0IGMgb2YgZW5jKXtcbmlmKGM9PT0nXFx1MDAwMCd8fGM9PT0nXFx1MDAwMScpe1xuY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuIH1cbmNoYXJzLnB1c2goYyk7XG4gfVxuY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuIH1cbnJldHVybiBjaGFycy5qb2luKCcnKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfSBkZWNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5jb25zdCBkZWNvZGVBcnJheT0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmVuY29kZWQuc3RhcnRzV2l0aCgnWycpfHxGYWlsIGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmNvbnN0IGVsZW1lbnRzPVtdO1xuY29uc3QgZWxlbUNoYXJzPVtdO1xuZm9yKGxldCBpPTE7aTxlbmNvZGVkLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGM9ZW5jb2RlZFtpXTtcbmlmKGM9PT0nXFx1MDAwMCcpe1xuY29uc3QgZW5jb2RlZEVsZW1lbnQ9ZWxlbUNoYXJzLmpvaW4oJycpO1xuZWxlbUNoYXJzLmxlbmd0aD0wO1xuY29uc3QgZWxlbWVudD1kZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMScpe1xuaSs9MTtcbmk8ZW5jb2RlZC5sZW5ndGh8fEZhaWwgYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7ZW5jb2RlZH1gO1xuY29uc3QgYzI9ZW5jb2RlZFtpXTtcbmMyPT09J1xcdTAwMDAnfHxcbmMyPT09J1xcdTAwMDEnfHxcbkZhaWwgYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjMn1gO1xuZWxlbUNoYXJzLnB1c2goYzIpO1xuIH1lbHNle1xuZWxlbUNoYXJzLnB1c2goYyk7XG4gfVxuIH1cbmVsZW1DaGFycy5sZW5ndGg9PT0wfHxGYWlsIGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2VuY29kZWR9YDtcbnJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlY29yZD0ocmVjb3JkLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgbmFtZXM9cmVjb3JkTmFtZXMocmVjb3JkKTtcbmNvbnN0IHZhbHVlcz1yZWNvcmRWYWx1ZXMocmVjb3JkLG5hbWVzKTtcbnJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcyx2YWx1ZXNdKSxlbmNvZGVQYXNzYWJsZSl9YDtcbiB9O1xuXG5jb25zdCBkZWNvZGVSZWNvcmQ9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5hc3NlcnQoZW5jb2RlZC5zdGFydHNXaXRoKCcoJykpO1xuY29uc3Qga2V5c3ZhbHM9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xua2V5c3ZhbHMubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFtrZXlzLHZhbHNdPWtleXN2YWxzO1xuXG5wYXNzU3R5bGVPZihrZXlzKT09PSdjb3B5QXJyYXknJiZcbnBhc3NTdHlsZU9mKHZhbHMpPT09J2NvcHlBcnJheScmJlxua2V5cy5sZW5ndGg9PT12YWxzLmxlbmd0aCYmXG5rZXlzLmV2ZXJ5KChrZXkpPT50eXBlb2Yga2V5PT09J3N0cmluZycpfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtlbmNvZGVkfWA7XG5jb25zdCBtYXBFbnRyaWVzPWtleXMubWFwKChrZXksaSk9PltrZXksdmFsc1tpXV0pO1xuY29uc3QgcmVjb3JkPWhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG5hc3NlcnRSZWNvcmQocmVjb3JkLCdkZWNvZGVkIHJlY29yZCcpO1xucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQ9KHRhZ2dlZCxlbmNvZGVQYXNzYWJsZSk9PlxuIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLHRhZ2dlZC5wYXlsb2FkXSksZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJzonKSk7XG5jb25zdCB0YWdwYXlsb2FkPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbnRhZ3BheWxvYWQubGVuZ3RoPT09Mnx8RmFpbCBgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtlbmNvZGVkfWA7XG5jb25zdFt0YWcscGF5bG9hZF09dGFncGF5bG9hZDtcbnBhc3NTdHlsZU9mKHRhZyk9PT0nc3RyaW5nJ3x8XG5GYWlsIGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLHBheWxvYWQpO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBzdHJpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlUGFzc2FibGU9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmVuY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5lbmNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbmVuY29kZU9wdGlvbnM7XG5cbmNvbnN0IGVuY29kZVBhc3NhYmxlPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG5yZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6e1xucmV0dXJuJ3YnO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4neic7XG4gfVxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gfVxuY2FzZSdzdHJpbmcnOntcbnJldHVybiBgcyR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOntcbnJldHVybiBgYiR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGUocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJ3InKXx8XG5GYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcInJcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCchJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiFcIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgnPycpfHxcbkZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBgeSR7bmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKX1gO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xucmV0dXJuIGVuY29kZVJlY29yZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlUGFzc2FibGU9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZT0ocmVtLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YCxcbmRlY29kZVByb21pc2U9KHByb20sXyk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWAsXG5kZWNvZGVFcnJvcj0oZXJyLF8pPT5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gfT1cbmRlY29kZU9wdGlvbnM7XG5cbmNvbnN0IGRlY29kZVBhc3NhYmxlPShlbmNvZGVkKT0+e1xuc3dpdGNoKGVuY29kZWQuY2hhckF0KDApKXtcbmNhc2Undic6e1xucmV0dXJuIG51bGw7XG4gfVxuY2FzZSd6Jzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnZic6e1xucmV0dXJuIGRlY29kZUJpbmFyeTY0KGVuY29kZWQpO1xuIH1cbmNhc2Uncyc6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpO1xuIH1cbmNhc2UnYic6e1xucmV0dXJuIGVuY29kZWQuc3Vic3RyaW5nKDEpIT09J2ZhbHNlJztcbiB9XG5jYXNlJ24nOlxuY2FzZSdwJzp7XG5yZXR1cm4gZGVjb2RlQmlnSW50KGVuY29kZWQpO1xuIH1cbmNhc2Uncic6e1xucmV0dXJuIGRlY29kZVJlbW90YWJsZShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJz8nOntcbnJldHVybiBkZWNvZGVQcm9taXNlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnISc6e1xucmV0dXJuIGRlY29kZUVycm9yKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UneSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGVkLnN1YnN0cmluZygxKSk7XG4gfVxuY2FzZSdbJzp7XG5yZXR1cm4gZGVjb2RlQXJyYXkoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZScoJzp7XG5yZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnOic6e1xucmV0dXJuIGRlY29kZVRhZ2dlZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGludmFsaWQgZGF0YWJhc2Uga2V5OiAke2VuY29kZWR9YDtcbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG5jb25zdCAgICAgICAgaXNFbmNvZGVkUmVtb3RhYmxlPShlbmNvZGVkKT0+ZW5jb2RlZC5jaGFyQXQoMCk9PT0ncic7JGjigI1fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGUge1JlY29yZDxQYXNzU3R5bGUsIHN0cmluZz59XG4gKiBUaGUgc2luZ2xlIHByZWZpeCBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQgZm9yIGVhY2ggUGFzc1N0eWxlIGNhdGVnb3J5LlxuICogYGJpZ2ludGAgaXMgYSB0d28gY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIGVhY2ggb2YgdGhvc2UgY2hhcmFjdGVyc1xuICogaW5kaXZpZHVhbGx5IGlzIGEgdmFsaWQgYmlnaW50IHByZWZpeC4gYG5gIGZvciBcIm5lZ2F0aXZlXCIgYW5kIGBwYCBmb3JcbiAqIFwicG9zaXRpdmVcIi4gVGhlIG9yZGVyaW5nIG9mIHRoZXNlIHByZWZpeGVzIGlzIHRoZSBzYW1lIGFzIHRoZVxuICogcmFua09yZGVyaW5nIG9mIHRoZWlyIHJlc3BlY3RpdmUgUGFzc1N0eWxlcy4gVGhpcyB0YWJsZSBpcyBpbXBvcnRlZCBieVxuICogcmFua09yZGVyLmpzIGZvciB0aGlzIHB1cnBvc2UuXG4gKlxuICogSW4gYWRkaXRpb24sIGB8YCBpcyB0aGUgcmVtb3RhYmxlLT5vcmRpbmFsIG1hcHBpbmcgcHJlZml4OlxuICogVGhpcyBpcyBub3QgdXNlZCBpbiBjb3ZlcnMgYnV0IGl0IGlzXG4gKiByZXNlcnZlZCBmcm9tIHRoZSBzYW1lIHNldCBvZiBzdHJpbmdzLiBOb3RlIHRoYXQgdGhlIHByZWZpeCBpcyA+IGFueVxuICogcHJlZml4IHVzZWQgYnkgYW55IGNvdmVyIHNvIHRoYXQgb3JkaW5hbCBtYXBwaW5nIGtleXMgYXJlIGFsd2F5cyBvdXRzaWRlXG4gKiB0aGUgcmFuZ2Ugb2YgdmFsaWQgY29sbGVjdGlvbiBlbnRyeSBrZXlzLlxuICovXG5jb25zdCAgICAgICAgcGFzc1N0eWxlUHJlZml4ZXM9e1xuZXJyb3I6JyEnLFxuY29weVJlY29yZDonKCcsXG50YWdnZWQ6JzonLFxucHJvbWlzZTonPycsXG5jb3B5QXJyYXk6J1snLFxuYm9vbGVhbjonYicsXG5udW1iZXI6J2YnLFxuYmlnaW50OiducCcsXG5yZW1vdGFibGU6J3InLFxuc3RyaW5nOidzJyxcbm51bGw6J3YnLFxuc3ltYm9sOid5JyxcbnVuZGVmaW5lZDoneid9OyRo4oCNX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xuXG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUHJlZml4ZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMRTp/D8PwAA/D8AACsAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJRQ0xBU1MiLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiLCJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsaXNPYmplY3QsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ1VuaW9ufSBFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbmRlZmluZVByb3BlcnRpZXMsXG5pcyxcbmVudHJpZXMsXG5mcm9tRW50cmllcyxcbmZyZWV6ZX09XG5PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogU3BlY2lhbCBwcm9wZXJ0eSBuYW1lIHRoYXQgaW5kaWNhdGVzIGFuIGVuY29kaW5nIHRoYXQgbmVlZHMgc3BlY2lhbFxuICogZGVjb2RpbmcuXG4gKi9cbmNvbnN0IFFDTEFTUz0nQHFjbGFzcyc7JGjigI1fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEByZXR1cm5zIHtlbmNvZGVkIGlzIEVuY29kaW5nVW5pb259XG4gKi9cbmNvbnN0IGhhc1FDbGFzcz0oZW5jb2RlZCk9Pmhhc093blByb3BlcnR5T2YoZW5jb2RlZCxRQ0xBU1MpO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBxY2xhc3NcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzPShlbmNvZGVkLHFjbGFzcyk9PlxuaXNPYmplY3QoZW5jb2RlZCkmJlxuIWlzQXJyYXkoZW5jb2RlZCkmJlxuaGFzUUNsYXNzKGVuY29kZWQpJiZcbmVuY29kZWRbUUNMQVNTXT09PXFjbGFzcztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb0NhcERhdGFPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IEVuY29kaW5nXG4gKiApID0+IEVuY29kaW5nfSBbZW5jb2RlRXJyb3JUb0NhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0ocmVtKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIpPT5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvQ2FwRGF0YU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IEVuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvQ2FwRGF0YT0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPWRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhPWRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGE9ZG9udEVuY29kZUVycm9yVG9DYXBEYXRhfT1cbmVuY29kZU9wdGlvbnM7XG5cbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRlbHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9DYXBEYXRhYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvQ2FwRGF0YWAgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGFzIFtRQ0xBU1NdIGNvbXBvc2l0ZXMuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdzdHJpbmcnOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJue1tRQ0xBU1NdOid1bmRlZmluZWQnfTtcbiB9XG5jYXNlJ251bWJlcic6e1xuLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm57W1FDTEFTU106J05hTid9O1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOidJbmZpbml0eSd9O1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonLUluZmluaXR5J307XG4gfVxuLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm57XG5bUUNMQVNTXTonYmlnaW50JyxcbmRpZ2l0czpTdHJpbmcocGFzc2FibGUpfTtcblxuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm57XG5bUUNMQVNTXTonc3ltYm9sJyxcbm5hbWV9O1xuXG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLFFDTEFTUykpe1xuLyogSGlsYmVydCBob3RlbCovXG5jb25zdHtbUUNMQVNTXTpxY2xhc3NWYWx1ZSwuLi5yZXN0fT1wYXNzYWJsZTtcbi8qKiBAdHlwZSB7RW5jb2Rpbmd9ICovXG5jb25zdCByZXN1bHQ9e1xuW1FDTEFTU106J2hpbGJlcnQnLFxub3JpZ2luYWw6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocWNsYXNzVmFsdWUpfTtcblxuaWYob3duS2V5cyhyZXN0KS5sZW5ndGg+PTEpe1xuLyogV2UgaGFyZGVuIHRoZSBlbnRpcmUgY2FwRGF0YSBlbmNvZGluZyBiZWZvcmUgd2UgcmV0dXJuIGl0LiovXG4vKiBgZW5jb2RlVG9DYXBEYXRhYCByZXF1aXJlcyB0aGF0IGl0cyBpbnB1dCBiZSBQYXNzYWJsZSwgYW5kKi9cbi8qIHRoZXJlZm9yZSBoYXJkZW5lZC4qL1xuLyogVGhlIGBmcmVlemVgIGhlcmUgaXMgbmVlZGVkIGFueXdheSwgYmVjYXVzZSB0aGUgYHJlc3RgIGlzKi9cbi8qIGZyZXNobHkgY29uc3RydWN0ZWQgYnkgdGhlIGAuLi5gIGFib3ZlLCBhbmQgd2UncmUgdXNpbmcgaXQqL1xuLyogYXMgaW1wdXQgaW4gYW5vdGhlciBjYWxsIHRvIGBlbmNvZGVUb0NhcERhdGFgLiovXG5yZXN1bHQucmVzdD1lbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W25hbWUsZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG5bUUNMQVNTXTondGFnZ2VkJyxcbnRhZzpnZXRUYWcocGFzc2FibGUpLFxucGF5bG9hZDplbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG5wYXNzYWJsZSxcbmVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcblxuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUylcbiB9ICR7cSgnc2xvdCcpfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nc2xvdCcpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ2Vycm9yJykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ2Vycm9yJylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbnJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVQcm9taXNlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0oc2xvdEVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGE9KGVycm9yRW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2hcbiAqIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvblxuICogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmVcbiAqIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuXG4gKlxuICogVGhpcyBzZWVtcyBsaWtlIHRoZSBiZXN0IHN0YXJ0aW5nIHBvaW50IHRvIGluY3JlbWVudGFsbHkgZXZvbHZlIHRvIGFuXG4gKiBBUEkgd2hlcmUgdGhlc2UgY2FuIHJlbGlhYmx5IGRpZmZlci5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzRcbiAqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbUNhcERhdGE9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhPWRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhfT1cbmRlY29kZU9wdGlvbnM7XG5cbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPT09ZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhfHxcbkZhaWwgYEFuIGltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uIGZvciBub3c6IElmIGVpdGhlciBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSBvciBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lOiAke3EoXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSlcbiB9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbi8qKlxuICogYGRlY29kZUZyb21DYXBEYXRhYCBtYXkgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBqc29uRW5jb2RlZGBcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvQ2FwRGF0YWBcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbUNhcERhdGFgIGNhbm5vdCByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbUNhcERhdGFgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30ganNvbkVuY29kZWQgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tQ2FwRGF0YT0oanNvbkVuY29kZWQpPT57XG5pZighaXNPYmplY3QoanNvbkVuY29kZWQpKXtcbi8qIHByaW1pdGl2ZXMgcGFzcyB0aHJvdWdoKi9cbnJldHVybiBqc29uRW5jb2RlZDtcbiB9XG5pZihpc0FycmF5KGpzb25FbmNvZGVkKSl7XG5yZXR1cm4ganNvbkVuY29kZWQubWFwKChlbmNvZGVkVmFsKT0+ZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCkpO1xuIH1lbHNlIGlmKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpe1xuY29uc3QgcWNsYXNzPWpzb25FbmNvZGVkW1FDTEFTU107XG50eXBlb2YgcWNsYXNzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCAke3EoUUNMQVNTKX0gdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuc3dpdGNoKHFjbGFzcyl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZSdJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtkaWdpdHN9PWpzb25FbmNvZGVkO1xudHlwZW9mIGRpZ2l0cz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbnJldHVybiBCaWdJbnQoZGlnaXRzKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogRGVwcmVjYXRlZCBxY2xhc3MuIFRPRE8gbWFrZSBjb25kaXRpb25hbCovXG4vKiBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRXZlbnR1YWxseSByZW1vdmUsIGJ1dCBhZnRlciBjb25maWRlbnQqL1xuLyogdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBzdXBwb3J0ZWQgc2VuZGVycy4qL1xuLyoqL1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbnJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e25hbWV9PWpzb25FbmNvZGVkO1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e3RhZyxwYXlsb2FkfT1qc29uRW5jb2RlZDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gfVxuY2FzZSdzbG90Jzp7XG4vKiBTZWUgbm90ZSBhYm92ZSBhYm91dCBob3cgdGhlIGN1cnJlbnQgZW5jb2RpbmcgY2Fubm90IHJlbGlhYmx5Ki9cbi8qIGRpc3Rpbmd1aXNoIHdoaWNoIHdlIHNob3VsZCBjYWxsLCBzbyBpbiB0aGUgbm9uLWRlZmF1bHQgY2FzZSovXG4vKiBib3RoIG11c3QgYmUgdGhlIHNhbWUgYW5kIGl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHdlIGNhbGwuKi9cbmNvbnN0IGRlY29kZWQ9ZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuLyogQkVXQVJFOiBjYXBkYXRhIGRvZXMgbm90IGNoZWNrIHRoYXQgYGRlY29kZWRgIGlzKi9cbi8qIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZSwgc2luY2UgdGhhdCB3b3VsZCBicmVhayBzb21lKi9cbi8qIGNhcGRhdGEgY2xpZW50cy4gV2UgYXJlIGRlcHJlY2F0aW5nIGNhcGRhdGEsIGFuZCB0aGVzZSBjbGllbnRzKi9cbi8qIHdpbGwgbmVlZCB0byB1cGRhdGUgYmVmb3JlIHN3aXRjaGluZyB0byBzbWFsbGNhcHMuKi9cbnJldHVybiBkZWNvZGVkO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGRlY29kZWQ9ZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG5pZihwYXNzU3R5bGVPZihkZWNvZGVkKT09PSdlcnJvcicpe1xucmV0dXJuIGRlY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbUNhcERhdGEgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke2RlY29kZWR9YDtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtvcmlnaW5hbCxyZXN0fT1qc29uRW5jb2RlZDtcbmhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ29yaWdpbmFsJyl8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7anNvbkVuY29kZWR9YDtcbi8qIERvbid0IGhhcmRlbiBzaW5jZSB3ZSdyZSBub3QgZG9uZSBtdXRhdGluZyBpdCovXG5jb25zdCByZXN1bHQ9e1tRQ0xBU1NdOmRlY29kZUZyb21DYXBEYXRhKG9yaWdpbmFsKX07XG5pZihoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdyZXN0Jykpe1xuY29uc3QgaXNOb25FbXB0eU9iamVjdD1cbnR5cGVvZiByZXN0PT09J29iamVjdCcmJlxucmVzdCE9PW51bGwmJlxub3duS2V5cyhyZXN0KS5sZW5ndGg+PTE7XG5pZighaXNOb25FbXB0eU9iamVjdCl7XG50aHJvdyBGYWlsIGBSZXN0IGVuY29kaW5nIG11c3QgYmUgYSBub24tZW1wdHkgb2JqZWN0OiAke3Jlc3R9YDtcbiB9XG5jb25zdCByZXN0T2JqPWRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuLyogVE9ETyByZWFsbHkgc2hvdWxkIGFzc2VydCB0aGF0IGBwYXNzU3R5bGVPZihyZXN0KWAgaXMqL1xuLyogYCdjb3B5UmVjb3JkJ2AgYnV0IHdlJ2QgaGF2ZSB0byBoYXJkZW4gaXQgYW5kIGl0IGlzIHRvbyovXG4vKiBlYXJseSB0byBkbyB0aGF0LiovXG4haGFzT3duUHJvcGVydHlPZihyZXN0T2JqLFFDTEFTUyl8fFxuRmFpbCBgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRoaXMgaXMgdGhlIGVycm9yIGNhc2Ugd2UncmUgdGVzdGluZyBmb3IqL1xuY2FzZSdpYmlkJzp7XG50aHJvdyBGYWlsIGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbnFjbGFzcylcbiB9YDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZXtcbmFzc2VydCh0eXBlb2YganNvbkVuY29kZWQ9PT0nb2JqZWN0JyYmanNvbkVuY29kZWQhPT1udWxsKTtcbmNvbnN0IGRlY29kZUVudHJ5PShbbmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgJHtxKG5hbWUpfSBvZiAke2pzb25FbmNvZGVkfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21DYXBEYXRhKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACzXvdrxTsAAMU7AAAtAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ30gU21hbGxjYXBzRW5jb2RpbmcgKlgvKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2RpbmdVbmlvbn0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqWC8qL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nICovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtpcyxlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IEJBTkc9JyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIPSctJy5jaGFyQ29kZUF0KDApO1xuXG4vKipcbiAqIEFuIGBlbmNvZGVUb1NtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYSBwYXNzYWJsZSBhbmQgcmV0dXJucyBhXG4gKiBKU09OLXJlcHJlc2VudGFibGUgb2JqZWN0IChpLmUuLCByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoXG4gKiBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXBsYWNlcnMgb3IgcmV2aXZlcnNcbiAqIHJldHVybnMgYW4gZXF1aXZhbGVudCBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBvYmplY3QgaWRlbnRpdHkpLlxuICogV2UgY2FsbCB0aGlzIHJlcHJlc2VudGF0aW9uIGEgU21hbGxjYXBzIEVuY29kaW5nLlxuICpcbiAqIEEgYGRlY29kZUZyb21TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGFzIGFyZ3VtZW50IHdoYXQgaXRcbiAqICphc3N1bWVzKiBpcyB0aGUgcmVzdWx0IG9mIGEgcGxhaW4gYEpTT04ucGFyc2VgIHdpdGggbm8gcmVzb2x2ZXIuIEl0IHRoZW5cbiAqIG11c3QgdmFsaWRhdGUgdGhhdCBpdCBpcyBhIHZhbGlkIFNtYWxsY2FwcyBFbmNvZGluZywgYW5kIGlmIGl0IGlzLFxuICogcmV0dXJuIGEgY29ycmVzcG9uZGluZyBwYXNzYWJsZS5cbiAqXG4gKiBTbWFsbGNhcHMgY29uc2lkZXJzIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gYCFgIChhc2NpaSBjb2RlIDMzLCBCQU5HKVxuICogYW5kIGAtYCAoYXNjaWkgY29kZSA0NSwgREFTSCkgdG8gYmUgc3BlY2lhbCBwcmVmaXhlcyBhbGxvd2luZ1xuICogcmVwcmVzZW50YXRpb24gb2YgSlNPTi1pbmNvbXBhdGlibGUgZGF0YSB1c2luZyBzdHJpbmdzLlxuICogVGhlc2UgY2hhcmFjdGVycywgaW4gb3JkZXIsIGFyZSBgIVwiIyQlJicoKSorLC1gXG4gKiBPZiB0aGVzZSwgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICogYCFgIC0gZXNjYXBlZCBzdHJpbmdcbiAqICAqIGArYCAtIG5vbi1uZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAtYCAtIG5lZ2F0aXZlIGJpZ2ludFxuICogICogYCNgIC0gbWFuaWZlc3QgY29uc3RhbnRcbiAqICAqIGAlYCAtIHN5bWJvbFxuICogICogYCRgIC0gcmVtb3RhYmxlXG4gKiAgKiBgJmAgLSBwcm9taXNlXG4gKlxuICogQWxsIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyAoYFwiJygpKixgKSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4gKlxuICogVGhlIG1hbmlmZXN0IGNvbnN0YW50cyB0aGF0IHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyBmb3IgdmFsdWVzOlxuICogICogYCN1bmRlZmluZWRgXG4gKiAgKiBgI05hTmBcbiAqICAqIGAjSW5maW5pdHlgXG4gKiAgKiBgIy1JbmZpbml0eWBcbiAqXG4gKiBhbmQgZm9yIHByb3BlcnR5IG5hbWVzIGFuYWxvZ291cyB0byBjYXBkYXRhIEBxY2xhc3M6XG4gKiAgKiBgI3RhZ2BcbiAqICAqIGAjZXJyb3JgXG4gKlxuICogQWxsIG90aGVyIGVuY29kZWQgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgI2AgYXJlIHJlc2VydmVkIGZvclxuICogZnV0dXJlIHVzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFN0clxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWw9KGVuY29kZWRTdHIpPT57XG5pZihlbmNvZGVkU3RyPT09Jycpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIGNoYXJDb2RlQXQoMCkgYW5kIG51bWJlciBjb21wYXJlIGlzIGEgYml0IGZhc3Rlci4qL1xuY29uc3QgY29kZT1lbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgeW9kYSovXG5yZXR1cm4gQkFORzw9Y29kZSYmY29kZTw9REFTSDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIpPT5cbkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIGVuY29kZU9wdGlvbnMgaXMgYWN0dWFsbHkgb3B0aW9uYWwsIGJ1dCBub3QgbWFya2VkIGFzIHN1Y2ggdG8gd29yayBhcm91bmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAyODZcbiAqXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9TbWFsbGNhcHM9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz1kb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz1kb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwc309XG5lbmNvZGVPcHRpb25zO1xuXG5jb25zdCBhc3NlcnRFbmNvZGVkRXJyb3I9KGVuY29kaW5nKT0+e1xudHlwZW9mIGVuY29kaW5nPT09J29iamVjdCcmJmhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpfHxcbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKFxuZW5jb2RpbmcpXG4gfWA7XG4vKiBBc3NlcnQgdGhhdCB0aGUgI2Vycm9yIHByb3BlcnR5IGRlY29kZXMgdG8gYSBzdHJpbmcuKi9cbmNvbnN0IG1lc3NhZ2U9ZW5jb2RpbmdbJyNlcnJvciddO1xudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJyYmKFxuIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSl8fG1lc3NhZ2Uuc3RhcnRzV2l0aCgnIScpKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIHN0cmluZyBtZXNzYWdlOiAke3EobWVzc2FnZSl9YDtcbiB9O1xuXG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtTbWFsbGNhcHNFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvU21hbGxjYXBzYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvU21hbGxjYXBzYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cj0ocGFzc2FibGUpPT57XG4vKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbi8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBpbnRvIHNtYWxsY2FwcyBzdHJpbmdzLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzp7XG4vKiBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmlmKHN0YXJ0c1NwZWNpYWwocGFzc2FibGUpKXtcbi8qIFN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGEgc3BlY2lhbCBjaGFyIGFyZSBxdW90ZWQgd2l0aCBgIWAuKi9cbi8qIFNpbmNlIGAhYCBpcyBpdHNlbGYgYSBzcGVjaWFsIGNoYXJhY3RlciwgdGhpcyB0cml2aWFsbHkgZG9lcyovXG4vKiB0aGUgSGlsYmVydCBob3RlbC4gQWxzbywgc2luY2UgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUqL1xuLyogYSBjb250aW51b3VzIHN1YnJhbmdlIG9mIGFzY2lpLCB0aGlzIHF1b3RpbmcgaXMgc29ydC1vcmRlciovXG4vKiBwcmVzZXJ2aW5nLiovXG5yZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gfVxuLyogQWxsIG90aGVyIHN0cmluZ3MgcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4nI3VuZGVmaW5lZCc7XG4gfVxuY2FzZSdudW1iZXInOntcbi8qIFNwZWNpYWwtY2FzZSBudW1iZXJzIHdpdGggbm8gZGlnaXQtYmFzZWQgcmVwcmVzZW50YXRpb24uKi9cbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJuJyNOYU4nO1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJuJyNJbmZpbml0eSc7XG4gfWVsc2UgaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJuJyMtSW5maW5pdHknO1xuIH1cbi8qIFBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGVsc2UsIHJlcGxhY2luZyAtMCB3aXRoIDAuKi9cbnJldHVybiBpcyhwYXNzYWJsZSwtMCk/MDpwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3Qgc3RyPVN0cmluZyhwYXNzYWJsZSk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7YmlnaW50fSAqL3Bhc3NhYmxlPDBuP3N0cjpgKyR7c3RyfWApO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qKiBAdHlwZSB7c3RyaW5nfSAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm4gYCUke25hbWV9YDtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4vKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbmNvbnN0IG5hbWVzPW93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbnJldHVybiBmcm9tRW50cmllcyhcbm5hbWVzLm1hcCgobmFtZSk9PltcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKV0pKTtcblxuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbicjdGFnJzplbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKGdldFRhZyhwYXNzYWJsZSkpLFxucGF5bG9hZDplbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5zdGFydHNXaXRoKCckJykpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5zdGFydHNXaXRoKCcmJykpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCImXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5hc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbmNvbnN0IHJlc3VsdD1oYXJkZW4oXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpKTtcblxuYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvU21hbGxjYXBzKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5oYXJkZW4obWFrZUVuY29kZVRvU21hbGxjYXBzKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VGcm9tU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7cShlbmNvZGluZyl9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogU21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21TbWFsbGNhcHM9KGRlY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9ZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwc309XG5kZWNvZGVPcHRpb25zO1xuXG4vKipcbiAqIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtYXkgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBlbmNvZGluZ2BcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvU21hbGxjYXBzYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBjYW5ub3QgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21TbWFsbGNhcHNgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtTbWFsbGNhcHNFbmNvZGluZ30gZW5jb2RpbmcgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PntcbnN3aXRjaCh0eXBlb2YgZW5jb2Rpbmcpe1xuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY2FzZSdzdHJpbmcnOntcbmlmKCFzdGFydHNTcGVjaWFsKGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuY29uc3QgYz1lbmNvZGluZy5jaGFyQXQoMCk7XG5zd2l0Y2goYyl7XG5jYXNlJyEnOntcbi8qIHVuLWhpbGJlcnQtaWZ5IHRoZSBzdHJpbmcqL1xucmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuIH1cbmNhc2UnJSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gfVxuY2FzZScjJzp7XG5zd2l0Y2goZW5jb2Rpbmcpe1xuY2FzZScjdW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnI05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJyNJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnIy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5rbm93biBjb25zdGFudCBcIiR7cShlbmNvZGluZyl9XCJgLFR5cGVFcnJvcik7XG4gfX1cblxuIH1cbmNhc2UnKyc6XG5jYXNlJy0nOntcbnJldHVybiBCaWdJbnQoZW5jb2RpbmcpO1xuIH1cbmNhc2UnJCc6e1xuY29uc3QgcmVzdWx0PWRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3JlbW90YWJsZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZScmJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3Byb21pc2UnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBTcGVjaWFsIGNoYXIgJHtxKFxuYylcbiB9IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlOiAke2VuY29kaW5nfWA7XG4gfX1cblxuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihlbmNvZGluZz09PW51bGwpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cblxuaWYoaXNBcnJheShlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nLm1hcCgodmFsKT0+ZGVjb2RlRnJvbVNtYWxsY2Fwcyh2YWwpKTtcbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyN0YWcnKSl7XG5jb25zdHsnI3RhZyc6dGFnLHBheWxvYWQsLi4ucmVzdH09ZW5jb2Rpbmc7XG50eXBlb2YgdGFnPT09J3N0cmluZyd8fFxuRmFpbCBgVmFsdWUgb2YgXCIjdGFnXCIsIHRoZSB0YWcsIG11c3QgYmUgYSBzdHJpbmc6ICR7ZW5jb2Rpbmd9YDtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGAjdGFnIHJlY29yZCB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShvd25LZXlzKHJlc3QpKX1gO1xucmV0dXJuIG1ha2VUYWdnZWQoXG5kZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG5kZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpKTtcblxuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJykpe1xuY29uc3QgcmVzdWx0PWRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbnBhc3NTdHlsZU9mKHJlc3VsdCk9PT0nZXJyb3InfHxcbkZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5cbmNvbnN0IGRlY29kZUVudHJ5PShbZW5jb2RlZE5hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgZW5jb2RlZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbmVuY29kZWROYW1lKVxuIH0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4hZW5jb2RlZE5hbWUuc3RhcnRzV2l0aCgnIycpfHxcbkZhaWwgYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuY29uc3QgbmFtZT1kZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG50eXBlb2YgZW5jb2RpbmcpXG4gfTogJHtlbmNvZGluZ31gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACEKS/awqAACsKgAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsUUNMQVNTOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9hID0+IChRQ0xBU1MgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2FwRGF0YTxUPn0gQ2FwRGF0YSAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtzdHJpbmdpZnk6cXVvdGV9PUpTT047XG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5kZW50ZXJcbiAqIEBwcm9wZXJ0eSB7KG9wZW5CcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gb3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7KHRva2VuOiBzdHJpbmcpID0+IG51bWJlcn0gbmV4dFxuICogQHByb3BlcnR5IHsoY2xvc2VCcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gY2xvc2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBkb25lXG4gKi9cblxuLyoqXG4gKiBHZW5lcm91cyB3aGl0ZXNwYWNlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyPSgpPT57XG5jb25zdCBzdHJpbmdzPVtdO1xubGV0IGxldmVsPTA7XG5sZXQgbmVlZFNwYWNlPWZhbHNlO1xuY29uc3QgbGluZT0oKT0+e1xubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywnICAnLnJlcGVhdChsZXZlbCkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+e1xubGV2ZWwrPTE7XG5pZihuZWVkU3BhY2Upe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gfSxcbmxpbmUsXG5uZXh0Oih0b2tlbik9PntcbmlmKG5lZWRTcGFjZSYmdG9rZW4hPT0nLCcpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPXRydWU7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmFzc2VydChsZXZlbD49MSk7XG5sZXZlbC09MTtcbmxpbmUoKTtcbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+e1xuYXNzZXJ0LmVxdWFsKGxldmVsLDApO1xucmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Ygb25lIHRva2VuIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlclxuICogb2YgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGlzIHBhdHRlcm4sIHRoZW4gdGhlIHR3byB0b2tlbnMgbXVzdCBiZVxuICogc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgdG8gcHJlc2VydmUgdGhlaXIgbWVhbmluZy4gT3RoZXJ3aXNlIHRoZVxuICogd2hpdGVzcGFjZSBpbiB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBUaGUgYDwhYCBhbmQgYC0+YCBjYXNlcyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGZvcm1hdGlvbiBvZiBhblxuICogaHRtbC1saWtlIGNvbW1lbnQuIEkgZG9uJ3QgdGhpbmsgdGhlIGRvdWJsZSBhbmdsZSBicmFja2V0cyBhcmUgYWN0dWFsbHlcbiAqIG5lZWRlZCBidXQgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgaXQgZW5vdWdoIHRvIHJlbW92ZSB0aGVtLlxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybj0vXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qKlxuICogTWluaW11bSB3aGl0ZXNwYWNlIG5lZWRlZCB0byBwcmVzZXZlIG1lYW5pbmcuXG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlcj0oKT0+e1xuLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbmNvbnN0IHN0cmluZ3M9W107XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+c3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KSxcbmxpbmU6KCk9PnN0cmluZ3MubGVuZ3RoLFxubmV4dDoodG9rZW4pPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSl7XG5jb25zdCBsYXN0PXN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV07XG5pZihsYXN0Lmxlbmd0aD49MSYmdG9rZW4ubGVuZ3RoPj0xKXtcbmNvbnN0IHBhaXI9IGAke2xhc3RbbGFzdC5sZW5ndGgtMV19JHt0b2tlblswXX1gO1xuaWYoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG4gfVxuIH1cbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEmJnN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV09PT0nLCcpe1xuc3RyaW5ncy5wb3AoKTtcbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PnN0cmluZ3Muam9pbignJyl9KTtcblxuIH07XG5cbmNvbnN0IGlkZW50UGF0dGVybj0vXlthLXpBLVpdXFx3KiQvO1xuaGFyZGVuKGlkZW50UGF0dGVybik7XG5jb25zdCBBdEF0UHJlZml4UGF0dGVybj0vXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGluZ1xuICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkSW5kZW50XG4gKiBAcGFyYW0ge2FueVtdfSBbc2xvdHNdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVUb0p1c3Rpbj0oZW5jb2Rpbmcsc2hvdWxkSW5kZW50PWZhbHNlLHNsb3RzPVtdKT0+e1xuLyoqXG4gKiBUaGUgZmlyc3QgcGFzcyBkb2VzIHNvbWUgaW5wdXQgdmFsaWRhdGlvbi5cbiAqIEl0cyBjb250cm9sIGZsb3cgc2hvdWxkIG1pcnJvciBgcmVjdXJgIGFzIGNsb3NlbHkgYXMgcG9zc2libGVcbiAqIGFuZCB0aGUgdHdvIHNob3VsZCBiZSBtYWludGFpbmVkIHRvZ2V0aGVyLiBUaGV5IG11c3QgdmlzaXQgZXZlcnl0aGluZ1xuICogaW4gdGhlIHNhbWUgb3JkZXIuXG4gKlxuICogVE9ETyBub3cgdGhhdCBpYmlkcyBhcmUgZ29uZSwgd2Ugc2hvdWxkIGZvbGQgdGhpcyBiYWNrIHRvZ2V0aGVyIGludG9cbiAqIG9uZSB2YWxpZGF0aW5nIHBhc3MuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IHByZXBhcmU9KHJhd1RyZWUpPT57XG5pZighaXNPYmplY3QocmF3VHJlZSkpe1xucmV0dXJuO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xudHlwZW9mIHFjbGFzcz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbnJldHVybjtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xudHlwZW9mIGRpZ2l0cz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbnJldHVybjtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xucmV0dXJuO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5yZXR1cm47XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZih0YWcsJ3N0cmluZycpO1xucHJlcGFyZShwYXlsb2FkKTtcbnJldHVybjtcbiB9XG5jYXNlJ3Nsb3QnOntcbmNvbnN0e2luZGV4LGlmYWNlfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5OYXQoaW5kZXgpO1xuaWYoaWZhY2UhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihpZmFjZSwnc3RyaW5nJyk7XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbidvcmlnaW5hbCdpbiByYXdUcmVlfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbnByZXBhcmUob3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5pZih0eXBlb2YgcmVzdCE9PSdvYmplY3QnKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGA7XG4gfVxuaWYocmVzdD09PW51bGwpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIG51bGxgO1xuIH1cbmlmKGlzQXJyYXkocmVzdCkpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiB9XG5pZihRQ0xBU1MgaW4gcmVzdCl7XG50aHJvdyBGYWlsIGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuIH1cbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xucHJlcGFyZShyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIG5hbWUpfWA7XG5nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpIT09dW5kZWZpbmVkfHxcbkZhaWwgYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gO1xucmV0dXJuO1xuIH1cblxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbnByZXBhcmUocmF3VHJlZVtpXSk7XG4gfVxuIH1lbHNle1xuY29uc3QgbmFtZXM9b3duS2V5cyhyYXdUcmVlKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gfVxucHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiB9XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VJbmRlbnRlcj1zaG91bGRJbmRlbnQ/bWFrZVllc0luZGVudGVyOm1ha2VOb0luZGVudGVyO1xubGV0IG91dD1tYWtlSW5kZW50ZXIoKTtcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFzcyByZWN1cnNpb24gYWZ0ZXIgdGhlIGZpcnN0IHBhc3MgYHByZXBhcmVgLlxuICogVGhlIGZpcnN0IHBhc3MgZGlkIHNvbWUgaW5wdXQgdmFsaWRhdGlvbiBzb1xuICogaGVyZSB3ZSBjYW4gc2FmZWx5IGFzc3VtZSBldmVyeXRoaW5nIHRob3NlIHRoaW5ncyBhcmUgdmFsaWRhdGVkLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IGRlY29kZT0ocmF3VHJlZSk9Pntcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gfTtcblxuY29uc3QgZGVjb2RlUHJvcGVydHk9KG5hbWUsdmFsdWUpPT57XG5vdXQubGluZSgpO1xuaWYobmFtZT09PSdfX3Byb3RvX18nKXtcbi8qIEphdmFTY3JpcHQgaW50ZXJwcmV0cyBge19fcHJvdG9fXzogeCwgLi4ufWAqL1xuLyogYXMgbWFraW5nIGFuIG9iamVjdCBpbmhlcml0aW5nIGZyb20gYHhgLCB3aGVyZWFzKi9cbi8qIGluIEpTT04gaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgbmFtZS4gUHJlc2VydmUgdGhlKi9cbi8qIEpTT04gbWVhbmluZy4qL1xub3V0Lm5leHQoIGBbXCJfX3Byb3RvX19cIl06YCk7XG4gfWVsc2UgaWYoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpe1xub3V0Lm5leHQoIGAke25hbWV9OmApO1xuIH1lbHNle1xub3V0Lm5leHQoIGAke3F1b3RlKG5hbWUpfTpgKTtcbiB9XG5kZWNvZGUodmFsdWUpO1xub3V0Lm5leHQoJywnKTtcbiB9O1xuXG4vKipcbiAqIE1vZGVsZWQgYWZ0ZXIgYGZ1bGxSZXZpdmVgIGluIG1hcnNoYWwuanNcbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByZWN1cj0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG4vKiBwcmltaXRpdmVzIGdldCBxdW90ZWQqL1xucmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YocWNsYXNzLCdzdHJpbmcnKTtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4vKiBTd2l0Y2hpbmcgb24gYGVuY29kZWRbUUNMQVNTXWAgKG9yIGFueXRoaW5nIGxlc3MgZGlyZWN0LCBsaWtlKi9cbi8qIGBxY2xhc3NgKSBkb2VzIG5vdCBkaXNjcmltaW5hdGUgcmF3VHJlZSBpbiB0eXBlc2NyaXB0QDQuMi4zIGFuZCovXG4vKiBlYXJsaWVyLiovXG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG4vKiBUaGVpciBxY2xhc3MgaXMgdGhlaXIgZXhwcmVzc2lvbiBzb3VyY2UuKi9cbnJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGRpZ2l0cywnc3RyaW5nJyk7XG5yZXR1cm4gb3V0Lm5leHQoIGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLyogVE9ETyBkZXByZWNhdGVkLiBFdmVudHVhbGx5IHJlbW92ZS4qL1xucmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5jb25zdCByZWdpc3RlcmVkTmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihyZWdpc3RlcmVkTmFtZT09PXVuZGVmaW5lZCl7XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuYXNzZXJ0KG1hdGNoIT09bnVsbCk7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5hc3NlcnQoU3ltYm9sW3N1ZmZpeF09PT1zeW0pO1xuYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLiR7c3VmZml4fWApO1xuIH1cbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC5mb3IoJHtxdW90ZShyZWdpc3RlcmVkTmFtZSl9KWApO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbm91dC5uZXh0KCBgbWFrZVRhZ2dlZCgke3F1b3RlKHRhZyl9LGApO1xuZGVjb2RlKHBheWxvYWQpO1xucmV0dXJuIG91dC5uZXh0KCcpJyk7XG4gfVxuXG5jYXNlJ3Nsb3QnOntcbmxldHtpZmFjZX09cmF3VHJlZTtcbmNvbnN0IGluZGV4PU51bWJlcihOYXQocmF3VHJlZS5pbmRleCkpO1xuY29uc3QgbmVzdGVkUmVuZGVyPShhcmcpPT57XG5jb25zdCBvbGRPdXQ9b3V0O1xudHJ5e1xub3V0PW1ha2VOb0luZGVudGVyKCk7XG5kZWNvZGUoYXJnKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH1maW5hbGx5e1xub3V0PW9sZE91dDtcbiB9XG4gfTtcbmlmKGluZGV4PHNsb3RzLmxlbmd0aCl7XG5jb25zdCBzbG90PW5lc3RlZFJlbmRlcihzbG90c1tpbmRleF0pO1xuaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdFRvVmFsKCR7c2xvdH0pYCk7XG4gfVxuaWZhY2U9bmVzdGVkUmVuZGVyKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3RUb1ZhbCgke3Nsb3R9LCR7aWZhY2V9KWApO1xuIH1lbHNlIGlmKGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0pYCk7XG4gfVxuaWZhY2U9bmVzdGVkUmVuZGVyKGlmYWNlKTtcbnJldHVybiBvdXQubmV4dCggYHNsb3QoJHtpbmRleH0sJHtpZmFjZX0pYCk7XG4gfVxuXG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG5vdXQub3BlbigneycpO1xuZGVjb2RlUHJvcGVydHkoUUNMQVNTLG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihyZXN0LCdvYmplY3QnKTtcbmFzc2VydChyZXN0IT09bnVsbCk7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbm5hbWUpXG4gfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgO1xuIH1cbmRlY29kZVByb3BlcnR5KG5hbWUscmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG5cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbnJldHVybiBvdXQubmV4dCggYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCdbXScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ1snKTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xub3V0LmxpbmUoKTtcbmRlY29kZShyYXdUcmVlW2ldKTtcbm91dC5uZXh0KCcsJyk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnXScpO1xuIH1cbiB9ZWxzZXtcbi8qIHJhd1RyZWUgaXMgYW4gYEVuY29kaW5nUmVjb3JkYCB3aGljaCBvbmx5IGhhcyBzdHJpbmcga2V5cywqL1xuLyogYnV0IHNpbmNlIG93bktleXMgaXMgbm90IGdlbmVyaWMsIGl0IGNhbid0IHByb3BhZ2F0ZSB0aGF0Ki9cbmNvbnN0IG5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyYXdUcmVlKTtcbmlmKG5hbWVzLmxlbmd0aD09PTApe1xucmV0dXJuIG91dC5uZXh0KCd7fScpO1xuIH1lbHNle1xub3V0Lm9wZW4oJ3snKTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmRlY29kZVByb3BlcnR5KG5hbWUscmF3VHJlZVtuYW1lXSk7XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cbiB9XG4gfTtcbnByZXBhcmUoZW5jb2RpbmcpO1xuZGVjb2RlKGVuY29kaW5nKTtcbnJldHVybiBvdXQuZG9uZSgpO1xuIH07JGjigI1fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABPT1RvcBgAA3AYAAC0AAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZU1hcnNoYWw7JGjigI1faW1wb3J0cyhbW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFZhbFRvU2xvdD0odmFsKT0+XG5GYWlsIGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWw9KHNsb3QsX2lmYWNlKT0+XG5GYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90cyAke3Nsb3R9YDtcblxuY29uc3QgYmFkQXJyYXlIYW5kbGVyPWhhcmRlbih7XG5nZXQ6KF90YXJnZXQsbmFtZSxfcmVjZWl2ZXIpPT57XG5pZihuYW1lPT09J2xlbmd0aCcpe1xucmV0dXJuIDA7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gfX0pO1xuXG5cbmNvbnN0IGJhZEFycmF5PWhhcmRlbihuZXcgUHJveHkoaGFyZGVuKFtdKSxiYWRBcnJheUhhbmRsZXIpKTtcblxuY29uc3R7c2VyaWFsaXplLHVuc2VyaWFsaXplfT1tYWtlTWFyc2hhbChcbmRvTm90Q29udmVydFZhbFRvU2xvdCxcbmRvTm90Q29udmVydFNsb3RUb1ZhbCxcbntcbmVycm9yVGFnZ2luZzonb2ZmJyxcbi8qIFRPRE8gZml4IHRlc3RzIHRvIHdvcmtzIHdpdGggc21hbGxjYXBzLiovXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidjYXBkYXRhJ30pO1xuXG5cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IHN0cmluZ2lmeT0odmFsKT0+c2VyaWFsaXplKHZhbCkuYm9keTskaOKAjV9vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBwYXJzZT0oc3RyKT0+XG51bnNlcmlhbGl6ZShcbmhhcmRlbih7XG5ib2R5OnN0cixcbnNsb3RzOmJhZEFycmF5fSkpOyRo4oCNX29uY2UucGFyc2UocGFyc2UpO1xuXG5cbmhhcmRlbihwYXJzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC+nmlK7DIAAOwyAAAjAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2VuY29kZVRvU21hbGxjYXBzLmpzIiwiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5T2YsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRo4oCNX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5NYWtlTWFyc2hhbE9wdGlvbnN9IE1ha2VNYXJzaGFsT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxTbG90Pn0gQ29udmVydFNsb3RUb1ZhbCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxTbG90Pn0gQ29udmVydFZhbFRvU2xvdCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVG9DYXBEYXRhPFNsb3Q+fSBUb0NhcERhdGEgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkZyb21DYXBEYXRhPFNsb3Q+fSBGcm9tQ2FwRGF0YSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIHtDb252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm49KHgpPT54O1xuLyoqIEB0eXBlIHtDb252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkZWZhdWx0U2xvdFRvVmFsRm49KHgsXyk9Png7XG5cbi8qKlxuICogQHRlbXBsYXRlIFNsb3RcbiAqIEBwYXJhbSB7Q29udmVydFZhbFRvU2xvdDxTbG90Pn0gW2NvbnZlcnRWYWxUb1Nsb3RdXG4gKiBAcGFyYW0ge0NvbnZlcnRTbG90VG9WYWw8U2xvdD59IFtjb252ZXJ0U2xvdFRvVmFsXVxuICogQHBhcmFtIHtNYWtlTWFyc2hhbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXJzaGFsPShcbmNvbnZlcnRWYWxUb1Nsb3Q9ZGVmYXVsdFZhbFRvU2xvdEZuLFxuY29udmVydFNsb3RUb1ZhbD1kZWZhdWx0U2xvdFRvVmFsRm4sXG57XG5lcnJvclRhZ2dpbmc9J29uJyxcbm1hcnNoYWxOYW1lPSdhbm9uLW1hcnNoYWwnLFxuLyogVE9ETyBUZW1wb3JhcnkgaGFjay4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc4MCovXG5lcnJvcklkTnVtPTEwMDAwLFxuLyogV2UgcHJlZmVyIHRoYXQgdGhlIGNhbGxlciBpbnN0ZWFkIGxvZyB0byBzb21ld2hlcmUgaGlkZGVuKi9cbi8qIHRvIGJlIHJldmVhbGVkIHdoZW4gY29ycmVsYXRpbmcgd2l0aCB0aGUgcmVjZWl2ZWQgZXJyb3IuKi9cbm1hcnNoYWxTYXZlRXJyb3I9KGVycik9PlxuY29uc29sZS5sb2coJ1RlbXBvcmFyeSBsb2dnaW5nIG9mIHNlbnQgZXJyb3InLGVyciksXG4vKiBEZWZhdWx0IHRvICdjYXBkYXRhJyBiZWNhdXNlIGl0IHdhcyBpbXBsZW1lbnRlZCBmaXJzdC4qL1xuLyogU29tZXRpbWVzLCBvbnRvZ2VueSBkb2VzIHJlY2FwaXR1bGF0ZSBwaHlsb2dlbnkgOykqL1xuc2VyaWFsaXplQm9keUZvcm1hdD0nY2FwZGF0YSd9PVxue30pPT5cbntcbmFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsJ3N0cmluZycpO1xuZXJyb3JUYWdnaW5nPT09J29uJ3x8XG5lcnJvclRhZ2dpbmc9PT0nb2ZmJ3x8XG5GYWlsIGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gO1xuY29uc3QgbmV4dEVycm9ySWQ9KCk9PntcbmVycm9ySWROdW0rPTE7XG5yZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1RvQ2FwRGF0YTxTbG90Pn1cbiAqL1xuY29uc3QgdG9DYXBEYXRhPShyb290KT0+e1xuY29uc3Qgc2xvdHM9W107XG4vKiBtYXBzIHZhbCAocHJvbWlzZSBvciByZW1vdGFibGUpIHRvIGluZGV4IG9mIHNsb3RzW10qL1xuY29uc3Qgc2xvdE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGUgfCBQcm9taXNlfSBwYXNzYWJsZVxuICogQHJldHVybnMge3tpbmRleDogbnVtYmVyLCByZXBlYXQ6IGJvb2xlYW59fVxuICovXG5jb25zdCBlbmNvZGVTbG90Q29tbW9uPShwYXNzYWJsZSk9PntcbmxldCBpbmRleD1zbG90TWFwLmdldChwYXNzYWJsZSk7XG5pZihpbmRleCE9PXVuZGVmaW5lZCl7XG4vKiBUT0RPIGFzc2VydCB0aGF0IGl0J3MgdGhlIHNhbWUgaWZhY2UgYXMgYmVmb3JlKi9cbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OnRydWV9KTtcbiB9XG5cbmluZGV4PXNsb3RzLmxlbmd0aDtcbmNvbnN0IHNsb3Q9Y29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG5zbG90cy5wdXNoKHNsb3QpO1xuc2xvdE1hcC5zZXQocGFzc2FibGUsaW5kZXgpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OmZhbHNlfSk7XG4gfTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiB1bmtub3dufSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yQ29tbW9uPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBtZXNzYWdlPWVuY29kZVJlY3VyKCBgJHtlcnIubWVzc2FnZX1gKTtcbmFzc2VydC50eXBlb2YobWVzc2FnZSwnc3RyaW5nJyk7XG5jb25zdCBuYW1lPWVuY29kZVJlY3VyKCBgJHtlcnIubmFtZX1gKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG4vKiBNdXN0IGVuY29kZSBgY2F1c2VgLCBgZXJyb3JzYC4qL1xuLyogbmVzdGVkIG5vbi1wYXNzYWJsZSBlcnJvcnMgbXVzdCBiZSBvayBmcm9tIGhlcmUuKi9cbmlmKGVycm9yVGFnZ2luZz09PSdvbicpe1xuLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4vKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4vKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4vKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4vKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbi8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG5jb25zdCBlcnJvcklkPWVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuYXNzZXJ0LnR5cGVvZihlcnJvcklkLCdzdHJpbmcnKTtcbmFzc2VydC5ub3RlKGVycixYIGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbm1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbnJldHVybiBoYXJkZW4oe2Vycm9ySWQsbWVzc2FnZSxuYW1lfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHttZXNzYWdlLG5hbWV9KTtcbiB9XG4gfTtcblxuaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdjYXBkYXRhJyl7XG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YT0ocGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGluZGV4fSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaWZhY2UsaW5kZXh9KTtcbiB9XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPSh2YWwsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHZhbCxnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gaXNFcnJvckxpa2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonZXJyb3InLC4uLmVyckRhdGF9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb0NhcERhdGE9bWFrZUVuY29kZVRvQ2FwRGF0YSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGF9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvQ2FwRGF0YShyb290KTtcbmNvbnN0IGJvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbmJvZHksXG5zbG90c30pO1xuXG4gfWVsc2UgaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdzbWFsbGNhcHMnKXtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzPShwcmVmaXgscGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuLyogVE9ETyBleHBsb3JlIHJlbW92aW5nIHRoaXMgc3BlY2lhbCBjYXNlKi9cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuIH1cbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW1vdGFibGUsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLHJlbW90YWJsZSxnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJyxwcm9taXNlKTtcblxuY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xuY29uc3R7bWVzc2FnZSwuLi5yZXN0fT1lcnJEYXRhO1xucmV0dXJuIGhhcmRlbih7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0fSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9bWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc30pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG5jb25zdCBzbWFsbGNhcHNCb2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG4vKiBWYWxpZCBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGEgdmFsaWQgc2lnbmFsKi9cbi8qIGluZGljYXRpbmcgc21hbGxjYXBzIGZvcm1hdC4qL1xuYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbnNsb3RzfSk7XG5cbiB9ZWxzZXtcbi8qIFRoZSBgdGhyb3dgIGlzIGEgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBBZGRlZCBmb3IgY29uZnVzZWQgbGludGVycy4qL1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuIH1cbiB9O1xuXG5jb25zdCBtYWtlRnVsbFJldml2ZT0oc2xvdHMpPT57XG4vKiogQHR5cGUge01hcDxudW1iZXIsIFBhc3NhYmxlPn0gKi9cbmNvbnN0IHZhbE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1JlbW90YWJsZSB8IFByb21pc2V9XG4gKi9cbmNvbnN0IGRlY29kZVNsb3RDb21tb249KHNsb3REYXRhKT0+e1xuY29uc3R7aWZhY2U9dW5kZWZpbmVkLGluZGV4LC4uLnJlc3R9PXNsb3REYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG5pZih2YWxNYXAuaGFzKGluZGV4KSl7XG5yZXR1cm4gdmFsTWFwLmdldChpbmRleCk7XG4gfVxuLyogVE9ETyBTRUNVUklUWSBIQVpBUkQ6IG11c3QgZW5mb2NlIHRoYXQgcmVtb3RhYmxlIHZzIHByb21pc2UqL1xuLyogaXMgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGVkIHN0cmluZy4qL1xuY29uc3Qgc2xvdD1zbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuY29uc3QgdmFsPWNvbnZlcnRTbG90VG9WYWwoc2xvdCxpZmFjZSk7XG52YWxNYXAuc2V0KGluZGV4LHZhbCk7XG5yZXR1cm4gdmFsO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fSBlcnJEYXRhXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuY29uc3QgZGVjb2RlRXJyb3JDb21tb249KGVyckRhdGEsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtlcnJvcklkPXVuZGVmaW5lZCxtZXNzYWdlLG5hbWUsLi4ucmVzdH09ZXJyRGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbi8qIFRPRE8gTXVzdCBkZWNvZGUgYGNhdXNlYCBhbmQgYGVycm9yc2AgcHJvcGVydGllcyovXG4vKiBjYXBEYXRhIGRvZXMgbm90IHRyYW5zZm9ybSBzdHJpbmdzLiBUaGUgY2FsbHMgdG8gYGRlY29kZVJlY3VyYCovXG4vKiBhcmUgZm9yIHJldXNlIGJ5IG90aGVyIGVuY29kaW5ncyB0aGF0IGRvLCBzdWNoIGFzIHNtYWxsY2Fwcy4qL1xuY29uc3QgZE5hbWU9ZGVjb2RlUmVjdXIobmFtZSk7XG5jb25zdCBkTWVzc2FnZT1kZWNvZGVSZWN1cihtZXNzYWdlKTtcbmNvbnN0IGRFcnJvcklkPWVycm9ySWQmJmRlY29kZVJlY3VyKGVycm9ySWQpO1xudHlwZW9mIGROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xudHlwZW9mIGRNZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSl8fEVycm9yO1xuLyogZXJyb3JJZCBpcyBhIGxhdGUgYWRkaXRpb24gc28gYmUgdG9sZXJhbnQgb2YgaXRzIGFic2VuY2UuKi9cbmNvbnN0IGVycm9yTmFtZT1cbmRFcnJvcklkPT09dW5kZWZpbmVkP1xuIGBSZW1vdGUke0VDLm5hbWV9YDpcbiBgUmVtb3RlJHtFQy5uYW1lfSgke2RFcnJvcklkfSlgO1xuY29uc3QgZXJyb3I9YXNzZXJ0LmVycm9yKGRNZXNzYWdlLEVDLHtlcnJvck5hbWV9KTtcbnJldHVybiBoYXJkZW4oZXJyb3IpO1xuIH07XG5cbi8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuLyogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uKi9cbi8qIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlKi9cbi8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzQqL1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHJhd1RyZWUsX2RlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5zbG90RGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhPShyYXdUcmVlLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5lcnJEYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21DYXBEYXRhPW1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGF9KTtcblxuXG5jb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHM9KHByZWZpeCk9Pntcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ0VuY29kaW5nXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gX2RlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlIHwgUHJvbWlzZX1cbiAqL1xucmV0dXJuKHN0cmluZ0VuY29kaW5nLF9kZWNvZGVSZWN1cik9PntcbmFzc2VydChzdHJpbmdFbmNvZGluZy5zdGFydHNXaXRoKHByZWZpeCkpO1xuLyogc2xvdHM6ICRzbG90SW5kZXguaWZhY2Ugb3IgJHNsb3RJbmRleCovXG5jb25zdCBpPXN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbmNvbnN0IGluZGV4PU51bWJlcihzdHJpbmdFbmNvZGluZy5zbGljZSgxLGk8MD91bmRlZmluZWQ6aSkpO1xuLyogaSA8IDAgbWVhbnMgdGhlcmUgd2FzIG5vIGlmYWNlIGluY2x1ZGVkLiovXG5jb25zdCBpZmFjZT1pPDA/dW5kZWZpbmVkOnN0cmluZ0VuY29kaW5nLnNsaWNlKGkrMSk7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7aWZhY2UsaW5kZXh9KTtcbiB9O1xuIH07XG5jb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJCcpO1xuY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCcmJyk7XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcsZGVjb2RlUmVjdXIpPT57XG5jb25zdHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3RFcnJEYXRhfT1lbmNvZGluZztcbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RFcnJEYXRhLCdtZXNzYWdlJyl8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oe21lc3NhZ2UsLi4ucmVzdEVyckRhdGF9LGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwc30pO1xuXG5cbnJldHVybiBoYXJkZW4oe3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtGcm9tQ2FwRGF0YTxTbG90Pn1cbiAqL1xuY29uc3QgZnJvbUNhcERhdGE9KGRhdGEpPT57XG5jb25zdHtib2R5LHNsb3RzfT1kYXRhO1xudHlwZW9mIGJvZHk9PT0nc3RyaW5nJ3x8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG5pc0FycmF5KGRhdGEuc2xvdHMpfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5zbG90cyBhcmUgbm90IEFycmF5KWA7XG5jb25zdHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfT1tYWtlRnVsbFJldml2ZShzbG90cyk7XG5sZXQgcmVzdWx0O1xuLyogSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhbiB1bmFtYmlndW91cyBzaWduYWwuKi9cbmlmKGJvZHkuc3RhcnRzV2l0aCgnIycpKXtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9Ym9keS5zbGljZSgxKTtcbmNvbnN0IGVuY29kaW5nPWhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuIH1lbHNle1xuY29uc3QgcmF3VHJlZT1oYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiB9XG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM3Ki9cbi8qIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpeGVkIG9uY2Ugd2UndmUgY29tcGxldGVkIHRoZSBzd2l0Y2gqL1xuLyogdG8gc21hbGxjYXBzLiovXG5hc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtcbnRvQ2FwRGF0YSxcbmZyb21DYXBEYXRhLFxuXG4vKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqL1xuLyoqIEBkZXByZWNhdGVkIHVzZSB0b0NhcERhdGEgKi9cbnNlcmlhbGl6ZTp0b0NhcERhdGEsXG4vKiogQGRlcHJlY2F0ZWQgdXNlIGZyb21DYXBEYXRhICovXG51bnNlcmlhbGl6ZTpmcm9tQ2FwRGF0YX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABXRGQKfkAAAH5AAAAlAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL3JhbmtPcmRlci5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVBhc3NhYmxlLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbIkZ1bGxSYW5rQ292ZXIiLCJhc3NlcnRSYW5rU29ydGVkIiwiY29tcGFyYXRvck1pcnJvckltYWdlIiwiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZVJhbmsiLCJjb3ZlcmVkRW50cmllcyIsImdldEluZGV4Q292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciIsImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpc1JhbmtTb3J0ZWQiLCJtYWtlQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Iiwic29ydEJ5UmFuayIsInVuaW9uUmFua0NvdmVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJwYXNzU3R5bGVQcmVmaXhlc1wiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlUHJlZml4ZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb3Zlcn0gUmFua0NvdmVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SYW5rQ29tcGFyaXNvbn0gUmFua0NvbXBhcmlzb24gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb21wYXJlfSBSYW5rQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxzZXRQcm90b3R5cGVPZixpc309T2JqZWN0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7W251bWJlciwgbnVtYmVyXX0gSW5kZXhDb3ZlclxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXF1YWxpdHkgY29tcGFyaXNvbiB1c2VkIGJ5IEphdmFTY3JpcHQncyBNYXAgYW5kIFNldFxuICogYWJzdHJhY3Rpb25zLCB3aGVyZSBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGFuZCAtMCBpcyB0aGUgc2FtZSBhc1xuICogMC4gTWFyc2hhbCBzZXJpYWxpemVzIC0wIGFzIHplcm8sIHNvIHRoZSBzZW1hbnRpY3Mgb2Ygb3VyIGRpc3RyaWJ1dGVkXG4gKiBvYmplY3Qgc3lzdGVtIGRvZXMgbm90IGRpc3Rpbmd1aXNoIDAgZnJvbSAtMC5cbiAqXG4gKiBgc2FtZVZhbHVlWmVyb2AgaXMgdGhlIEVjbWFTY3JpcHQgc3BlYyBuYW1lIGZvciB0aGlzIGVxdWFsaXR5IGNvbXBhcmlzb24sXG4gKiBidXQgVE9ETyB3ZSBuZWVkIGEgYmV0dGVyIG5hbWUgZm9yIHRoZSBBUEkuXG4gKlxuICogQHBhcmFtIHthbnl9IHhcbiAqIEBwYXJhbSB7YW55fSB5XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc2FtZVZhbHVlWmVybz0oeCx5KT0+eD09PXl8fGlzKHgseSk7XG5cbmNvbnN0IHRyaXZpYWxDb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnksIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xubGVmdDxyaWdodD8tMTpsZWZ0PT09cmlnaHQ/MDoxO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8UGFzc1N0eWxlLCB7IGluZGV4OiBudW1iZXIsIGNvdmVyOiBSYW5rQ292ZXIgfT59IFBhc3NTdHlsZVJhbmtzUmVjb3JkXG4gKi9cblxuY29uc3QgcGFzc1N0eWxlUmFua3M9LyoqIEB0eXBlIHtQYXNzU3R5bGVSYW5rc1JlY29yZH0gKi9cbmZyb21FbnRyaWVzKFxuZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbi8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LiovLlxuc29ydCgoW19sZWZ0U3R5bGUsbGVmdFByZWZpeGVzXSxbX3JpZ2h0U3R5bGUscmlnaHRQcmVmaXhlc10pPT57XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLHJpZ2h0UHJlZml4ZXMpO1xuIH0pLlxubWFwKChbcGFzc1N0eWxlLHByZWZpeGVzXSxpbmRleCk9Pntcbi8qIENvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhbnkgY2hhcmFjdGVyIGluIGBwcmVmaXhlc2AsKi9cbi8qIHZlcmlmeWluZyB0aGF0IGl0IGlzIHNvcnRlZCBzbyB0aGF0IGlzKi9cbi8qIGFsbCBzIHN1Y2ggdGhhdCBwcmVmaXhlcy5hdCgwKSDiiaQgcyA8IHN1Y2Nlc3NvcihwcmVmaXhlcy5hdCgtMSkpLiovXG5wcmVmaXhlcz09PVsuLi5wcmVmaXhlc10uc29ydCgpLmpvaW4oJycpfHxcbkZhaWwgYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG5jb25zdCBjb3Zlcj1bXG5wcmVmaXhlcy5jaGFyQXQoMCksXG5TdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoLTEpKzEpXTtcblxucmV0dXJuW3Bhc3NTdHlsZSx7aW5kZXgsY292ZXJ9XTtcbiB9KSk7XG5cblxuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKipcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRQYXNzU3R5bGVDb3Zlcj0ocGFzc1N0eWxlKT0+cGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaOKAjV9vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsV2Vha1NldDxQYXNzYWJsZVtdPj59XG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZD1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmU9fSBjb21wYXJlUmVtb3RhYmxlc1xuICogQW4gb3B0aW9uIHRvIGNyZWF0ZSBhIGNvbXBhcmF0b3IgaW4gd2hpY2ggYW4gaW50ZXJuYWwgb3JkZXIgaXNcbiAqIGFzc2lnbmVkIHRvIHJlbW90YWJsZXMuIFRoaXMgZGVmYXVsdHMgdG8gYSBjb21wYXJhdG9yIHRoYXRcbiAqIGFsd2F5cyByZXR1cm5zIGAwYCwgbWVhbmluZyB0aGF0IGFsbCByZW1vdGFibGVzIGFyZSB0aWVkXG4gKiBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyYXRvcktpdH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb21wYXJhdG9yS2l0PShjb21wYXJlUmVtb3RhYmxlcz0oX3gsX3kpPT4wKT0+e1xuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGNvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT57XG5pZihzYW1lVmFsdWVaZXJvKGxlZnQscmlnaHQpKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG5wYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxucGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgpO1xuXG4gfVxuLyogZXNsaW50LWRpc2FibGUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyAtLVxuICogV2Uga25vdyBgbGVmdGAgYW5kIGByaWdodGAgYXJlIGNvbXBhcmFibGUuXG4gKi9cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbi8qIEZvciBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIGFsbCBtZW1iZXJzIG9mIHRoYXQgcGFzc1N0eWxlIGFyZSB0aWVkKi9cbi8qIGZvciB0aGUgc2FtZSByYW5rLiovXG5yZXR1cm4gMDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOntcbi8qIFdpdGhpbiBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIHRoZSByYW5rIG9yZGVyaW5nIGFncmVlcyB3aXRoKi9cbi8qIEphdmFTY3JpcHQncyByZWxhdGlvbmFsIG9wZXJhdG9ycyBgPGAgYW5kIGA+YC4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGNvbXBhcmF0b3IoXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG5uYW1lRm9yUGFzc2FibGVTeW1ib2wocmlnaHQpKTtcblxuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBgTmFOYCdzIHJhbmsgaXMgYWZ0ZXIgYWxsIG90aGVyIG51bWJlcnMuKi9cbmlmKE51bWJlci5pc05hTihsZWZ0KSl7XG5hc3NlcnQoIU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIDE7XG4gfWVsc2UgaWYoTnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG5yZXR1cm4tMTtcbiB9XG4vKiBUaGUgcmFuayBvcmRlcmluZyBvZiBub24tTmFOIG51bWJlcnMgYWdyZWVzIHdpdGggSmF2YVNjcmlwdCdzKi9cbi8qIHJlbGF0aW9uYWwgb3BlcmF0b3JzICc8JyBhbmQgJz4nLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBpbnZlcnNlIHNvcnRlZCBvcmRlciBvZiBwcm9wZXJ0eSBuYW1lcywgdGhlbiovXG4vKiBsZXhpY29ncmFwaGljIGJ5IGNvcnJlc3BvbmRpbmcgdmFsdWVzIGluIHRoYXQgc2FtZSBpbnZlcnNlKi9cbi8qIG9yZGVyIG9mIHRoZWlyIHByb3BlcnR5IG5hbWVzLiBDb21wYXJpbmcgbmFtZXMgYnkgdGhlbXNlbHZlcyBmaXJzdCwqL1xuLyogYWxsIHJlY29yZHMgd2l0aCB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YgcHJvcGVydHkgbmFtZXMgc29ydCBuZXh0IHRvKi9cbi8qIGVhY2ggb3RoZXIgaW4gYSByYW5rLXNvcnQgb2YgY29weVJlY29yZHMuKi9cblxuLyogVGhlIGNvcHlSZWNvcmQgaW52YXJpYW50cyBlbmZvcmNlZCBieSBwYXNzU3R5bGVPZiBlbnN1cmUgdGhhdCovXG4vKiBhbGwgdGhlIHByb3BlcnR5IG5hbWVzIGFyZSBzdHJpbmdzLiBXZSBuZWVkIHRoZSByZXZlcnNlIHNvcnRlZCBvcmRlciovXG4vKiBvZiB0aGVzZSBuYW1lcywgd2hpY2ggd2UgdGhlbiBjb21wYXJlIGxleGljb2dyYXBoaWNhbGx5LiBUaGlzIGVuc3VyZXMqL1xuLyogdGhhdCBpZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFggYXJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiByZWNvcmQgWSwqL1xuLyogdGhlbiByZWNvcmQgWCB3aWxsIGhhdmUgYW4gZWFybGllciByYW5rIGFuZCBzb3J0IHRvIHRoZSBsZWZ0IG9mIFkuKi9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0TmFtZXMscmlnaHROYW1lcyk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IoXG5yZWNvcmRWYWx1ZXMobGVmdCxsZWZ0TmFtZXMpLFxucmVjb3JkVmFsdWVzKHJpZ2h0LHJpZ2h0TmFtZXMpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyYXRvcihsZWZ0W2ldLHJpZ2h0W2ldKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIHdlcmUgdGllZCwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuLyogSWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaGFzIGFuIGVhcmxpZXIgcmFuayB0aGFuIFkuKi9cbnJldHVybiBjb21wYXJhdG9yKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgYFtTeW1ib2wudG9TdHJpbmdUYWddYCB0aGVuIGAucGF5bG9hZGAuKi9cbmNvbnN0IGxhYmVsQ29tcD1jb21wYXJhdG9yKGdldFRhZyhsZWZ0KSxnZXRUYWcocmlnaHQpKTtcbmlmKGxhYmVsQ29tcCE9PTApe1xucmV0dXJuIGxhYmVsQ29tcDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQscmlnaHQucGF5bG9hZCk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gO1xuIH19XG5cbi8qIGVzbGludC1lbmFibGUgKi9cbiB9O1xuXG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgYW50aUNvbXBhcmF0b3I9KHgseSk9PmNvbXBhcmF0b3IoeSx4KTtcblxubWVtb09mU29ydGVkLnNldChjb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xubWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGNvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3IpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoYW50aUNvbXBhcmF0b3IsY29tcGFyYXRvcik7XG5cbnJldHVybiBoYXJkZW4oe2NvbXBhcmF0b3IsYW50aUNvbXBhcmF0b3J9KTtcbiB9O1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmU9fVxuICovJGjigI1fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG5jb25zdCAgICAgICAgY29tcGFyYXRvck1pcnJvckltYWdlPShjb21wYXJhdG9yKT0+XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLmdldChjb21wYXJhdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuY29uc3QgICAgICAgIGlzUmFua1NvcnRlZD0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuaWYoc3ViTWVtb09mU29ydGVkLmhhcyhwYXNzYWJsZXMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpPT09J2NvcHlBcnJheScpO1xuZm9yKGxldCBpPTE7aTxwYXNzYWJsZXMubGVuZ3RoO2krPTEpe1xuaWYoY29tcGFyZShwYXNzYWJsZXNbaS0xXSxwYXNzYWJsZXNbaV0pPj0xKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuc3ViTWVtb09mU29ydGVkLmFkZChwYXNzYWJsZXMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmlzUmFua1NvcnRlZChpc1JhbmtTb3J0ZWQpO1xuaGFyZGVuKGlzUmFua1NvcnRlZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFJhbmtTb3J0ZWQ9KHNvcnRlZCxjb21wYXJlKT0+XG5pc1JhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpfHxcbi8qIFRPRE8gYXNzZXJ0IG9uIGJ1ZyBjb3VsZCBsZWFkIHRvIGluZmluaXRlIHJlY3Vyc2lvbi4gRml4LiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuRmFpbCBgTXVzdCBiZSByYW5rIHNvcnRlZDogJHtzb3J0ZWR9IHZzICR7c29ydEJ5UmFuayhzb3J0ZWQsY29tcGFyZSl9YDskaOKAjV9vbmNlLmFzc2VydFJhbmtTb3J0ZWQoYXNzZXJ0UmFua1NvcnRlZCk7XG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qKlxuICogVE9ETyBTRUNVUklUWSBCVUc6IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDI2MFxuICogc29ydEJ5UmFuayBjdXJyZW50bHkgdXNlcyBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGRpcmVjdGx5LCBhbmRcbiAqIHNvIG9ubHkgd29ya3MgY29ycmVjdGx5IHdoZW4gZ2l2ZW4gYSBgY29tcGFyZWAgZnVuY3Rpb24gdGhhdCBjb25zaWRlcnNcbiAqIGB1bmRlZmluZWRgIHN0cmljdGx5IGJpZ2dlciAoYD5gKSB0aGFuIGV2ZXJ5dGhpbmcgZWxzZS4gVGhpcyBpc1xuICogYmVjYXVzZSBgQXJyYXkucHJvdG90eXBlLnNvcnRgIGJpemFycmVseSBtb3ZlcyBhbGwgYHVuZGVmaW5lZGBzIHRvXG4gKiB0aGUgZW5kIG9mIHRoZSBhcnJheSByZWdhcmRsZXNzLCB3aXRob3V0IGNvbnN1bHRpbmcgdGhlIGBjb21wYXJlYFxuICogZnVuY3Rpb24uIFRoaXMgaXMgYSBnZW51aW5lIGJ1ZyBmb3IgdXMgTk9XIGJlY2F1c2Ugc29tZXRpbWVzIHdlIHNvcnRcbiAqIGluIHJldmVyc2Ugb3JkZXIgYnkgcGFzc2luZyBhIHJldmVyc2VkIHJhbmsgY29tcGFyaXNvbiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFBhc3NhYmxlPn0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7UGFzc2FibGVbXX1cbiAqL1xuY29uc3QgICAgICAgIHNvcnRCeVJhbms9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuaWYoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKXtcbmhhcmRlbihwYXNzYWJsZXMpO1xuLyogQ2FsbGluZyBpc1JhbmtTb3J0ZWQgZ2l2ZXMgaXQgYSBjaGFuY2UgdG8gZ2V0IG1lbW9pemVkIGZvciovXG4vKiB0aGlzIGBjb21wYXJlYCBmdW5jdGlvbiBldmVuIGlmIGl0IHdhcyBhbHJlYWR5IG1lbW9pemVkIGZvciBhIGRpZmZlcmVudCovXG4vKiBgY29tcGFyZWAgZnVuY3Rpb24uKi9cbmlmKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsY29tcGFyZSkpe1xucmV0dXJuIHBhc3NhYmxlcztcbiB9XG4gfVxuY29uc3QgdW5zb3J0ZWQ9Wy4uLnBhc3NhYmxlc107XG51bnNvcnRlZC5mb3JFYWNoKGhhcmRlbik7XG5jb25zdCBzb3J0ZWQ9aGFyZGVuKHVuc29ydGVkLnNvcnQoY29tcGFyZSkpO1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbnN1Yk1lbW9PZlNvcnRlZC5hZGQoc29ydGVkKTtcbnJldHVybiBzb3J0ZWQ7XG4gfTskaOKAjV9vbmNlLnNvcnRCeVJhbmsoc29ydEJ5UmFuayk7XG5oYXJkZW4oc29ydEJ5UmFuayk7XG5cbi8qKlxuICogU2VlXG4gKiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaW5hcnlfc2VhcmNoX2FsZ29yaXRobSNQcm9jZWR1cmVfZm9yX2ZpbmRpbmdfdGhlX2xlZnRtb3N0X2VsZW1lbnRcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0ga2V5XG4gKiBAcGFyYW0geyhcImxlZnRNb3N0XCIgfCBcInJpZ2h0TW9zdFwiKT19IGJpYXNcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJhbmtTZWFyY2g9KHNvcnRlZCxjb21wYXJlLGtleSxiaWFzPSdsZWZ0TW9zdCcpPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmxldCBsZWZ0PTA7XG5sZXQgcmlnaHQ9c29ydGVkLmxlbmd0aDtcbndoaWxlKGxlZnQ8cmlnaHQpe1xuY29uc3QgbT1NYXRoLmZsb29yKChsZWZ0K3JpZ2h0KS8yKTtcbmNvbnN0IGNvbXA9Y29tcGFyZShzb3J0ZWRbbV0sa2V5KTtcbmlmKGNvbXA8PS0xfHxjb21wPT09MCYmYmlhcz09PSdyaWdodE1vc3QnKXtcbmxlZnQ9bSsxO1xuIH1lbHNle1xuYXNzZXJ0KGNvbXA+PTF8fGNvbXA9PT0wJiZiaWFzPT09J2xlZnRNb3N0Jyk7XG5yaWdodD1tO1xuIH1cbiB9XG5yZXR1cm4gYmlhcz09PSdsZWZ0TW9zdCc/bGVmdDpyaWdodC0xO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSByYW5rQ292ZXJcbiAqIEByZXR1cm5zIHtJbmRleENvdmVyfVxuICovXG5jb25zdCAgICAgICAgZ2V0SW5kZXhDb3Zlcj0oc29ydGVkLGNvbXBhcmUsW2xlZnRLZXkscmlnaHRLZXldKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5jb25zdCBsZWZ0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxsZWZ0S2V5LCdsZWZ0TW9zdCcpO1xuY29uc3QgcmlnaHRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLHJpZ2h0S2V5LCdyaWdodE1vc3QnKTtcbnJldHVybltsZWZ0SW5kZXgscmlnaHRJbmRleF07XG4gfTskaOKAjV9vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qKiBAdHlwZSB7UmFua0NvdmVyfSAqL1xuY29uc3QgICAgICAgIEZ1bGxSYW5rQ292ZXI9aGFyZGVuKFsnJywneyddKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtJbmRleENvdmVyfSBpbmRleENvdmVyXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn1cbiAqLyRo4oCNX29uY2UuRnVsbFJhbmtDb3ZlcihGdWxsUmFua0NvdmVyKTtcbmNvbnN0ICAgICAgICBjb3ZlcmVkRW50cmllcz0oc29ydGVkLFtsZWZ0SW5kZXgscmlnaHRJbmRleF0pPT57XG4vKiogQHR5cGUge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59ICovXG5jb25zdCBpdGVyYWJsZT1oYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPWxlZnRJbmRleDtcbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuaWYoaTw9cmlnaHRJbmRleCl7XG5jb25zdCBlbGVtZW50PXNvcnRlZFtpXTtcbmkrPTE7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTpbaSxlbGVtZW50XSxkb25lOmZhbHNlfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZTp1bmRlZmluZWQsZG9uZTp0cnVlfSk7XG4gfVxuIH19KTtcblxuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5jb3ZlcmVkRW50cmllcyhjb3ZlcmVkRW50cmllcyk7XG5oYXJkZW4oY292ZXJlZEVudHJpZXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWF4UmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik+PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgbWluUmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik8PTA/YTpiO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIHVuaW9uUmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgdW5pb25SYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1pblJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5tYXhSYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZSh1bmlvblJhbmtDb3ZlclBhaXIsWyd7JywnJ10pO1xuIH07JGjigI1fb25jZS51bmlvblJhbmtDb3ZlcnModW5pb25SYW5rQ292ZXJzKTtcbmhhcmRlbih1bmlvblJhbmtDb3ZlcnMpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UmFua0NvdmVyW119IGNvdmVyc1xuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGludGVyc2VjdFJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IGludGVyc2VjdFJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWF4UmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1pblJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKGludGVyc2VjdFJhbmtDb3ZlclBhaXIsWycnLCd7J10pO1xuIH07JGjigI1fb25jZS5pbnRlcnNlY3RSYW5rQ292ZXJzKGludGVyc2VjdFJhbmtDb3ZlcnMpO1xuXG5jb25zdCAgICAgICB7Y29tcGFyYXRvcjpjb21wYXJlUmFuayxhbnRpQ29tcGFyYXRvcjpjb21wYXJlQW50aVJhbmt9PVxubWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wYXJhdG9yIGtpdCBpbiB3aGljaCByZW1vdGFibGVzIGFyZSBmdWxseSBvcmRlcmVkXG4gKiBieSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZmlyc3Qgc2VlbiBieSAqdGhpcyogY29tcGFyYXRvciBraXQuXG4gKiBCRVdBUkU6IFRoaXMgaXMgb2JzZXJ2YWJsZSBtdXRhYmxlIHN0YXRlLCBzbyBzdWNoIGEgY29tcGFyYXRvciBraXRcbiAqIHNob3VsZCBuZXZlciBiZSBzaGFyZWQgYW1vbmcgc3Vic3lzdGVtcyB0aGF0IHNob3VsZCBub3QgYmUgYWJsZVxuICogdG8gY29tbXVuaWNhdGUuXG4gKlxuICogTm90ZSB0aGF0IHRoaXMgb3JkZXIgZG9lcyBub3QgbWVldCB0aGUgcmVxdWlyZW1lbnRzIGZvciBzdG9yZVxuICogb3JkZXJpbmcsIHNpbmNlIGl0IGhhcyBubyBtZW1vcnkgb2YgZGVsZXRlZCBrZXlzLlxuICpcbiAqIFRoZXNlIGZ1bGwgb3JkZXIgY29tcGFyYXRvciBraXQgaXMgc3RyaWN0bHkgbW9yZSBwcmVjaXNlIHRoYXQgdGhlXG4gKiByYW5rIG9yZGVyIGNvbXBhcmF0b3Iga2l0cyBhYm92ZS4gQXMgYSByZXN1bHQsIGFueSBhcnJheSB3aGljaCBpc1xuICogc29ydGVkIGJ5IHN1Y2ggYSBmdWxsIG9yZGVyIHdpbGwgcGFzcyB0aGUgaXNSYW5rU29ydGVkIHRlc3Qgd2l0aFxuICogYSBjb3JyZXNwb25kaW5nIHJhbmsgb3JkZXIuXG4gKlxuICogQW4gYXJyYXkgd2hpY2ggaXMgc29ydGVkIGJ5IGEgKmZyZXNoKiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIGkuZS4sXG4gKiBvbmUgdGhhdCBoYXMgbm90IHlldCBzZWVuIGFueSByZW1vdGFibGVzLCB3aWxsIG9mIGNvdXJzZSByZW1haW5cbiAqIHNvcnRlZCBieSBhY2NvcmRpbmcgdG8gKnRoYXQqIGZ1bGwgb3JkZXIgY29tcGFyYXRvci4gQW4gYXJyYXkgKm9mXG4gKiBzY2FsYXJzKiBzb3J0ZWQgYnkgYSBmcmVzaCBmdWxsIG9yZGVyIHdpbGwgcmVtYWluIHNvcnRlZCBldmVuXG4gKiBhY2NvcmRpbmcgdG8gYSBuZXcgZnJlc2ggZnVsbCBvcmRlciBjb21wYXJhdG9yLCBzaW5jZSBpdCB3aWxsIHNlZVxuICogdGhlIHJlbW90YWJsZXMgaW4gdGhlIHNhbWUgb3JkZXIgYWdhaW4uIFVuZm9ydHVuYXRlbHksIHRoaXMgaXNcbiAqIG5vdCB0cnVlIG9mIGFycmF5cyBvZiBwYXNzYWJsZXMgaW4gZ2VuZXJhbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsb25nTGl2ZWRcbiAqIEByZXR1cm5zIHtGdWxsQ29tcGFyYXRvcktpdH1cbiAqLyRo4oCNX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRo4oCNX29uY2UuY29tcGFyZUFudGlSYW5rKGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCAgICAgICAgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQ9KGxvbmdMaXZlZD1mYWxzZSk9PntcbmxldCBudW1TZWVuPTA7XG4vKiBXaGVuIGR5bmFtaWNhbGx5IGNyZWF0ZWQgd2l0aCBzaG9ydCBsaWZldGltZXMgKHRoZSBkZWZhdWx0KSBhIFdlYWtNYXAqL1xuLyogd291bGQgcGVyZm9ybSBwb29ybHksIGFuZCB0aGUgbGVhayBjcmVhdGVkIGJ5IGEgTWFwIG9ubHkgbGFzdHMgYXMgbG9uZyovXG4vKiBhcyB0aGUgTWFwLiovXG5jb25zdCBNYXBDb25zdHJ1Y3Rvcj1sb25nTGl2ZWQ/V2Vha01hcDpNYXA7XG5jb25zdCBzZWVuPW5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuY29uc3QgdGFnPShyKT0+e1xuaWYoc2Vlbi5oYXMocikpe1xucmV0dXJuIHNlZW4uZ2V0KHIpO1xuIH1cbm51bVNlZW4rPTE7XG5zZWVuLnNldChyLG51bVNlZW4pO1xucmV0dXJuIG51bVNlZW47XG4gfTtcbmNvbnN0IGNvbXBhcmVSZW1vdGFibGVzPSh4LHkpPT5jb21wYXJlUmFuayh0YWcoeCksdGFnKHkpKTtcbnJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbmhhcmRlbihtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACEAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJR6bvc8LAADPCwAAHgAAAEBlbmRvL25hdC12NC4xLjI3L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsICduYW1lJywge3ZhbHVlOiBcImlzTmF0XCJ9KTskaOKAjV9vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJOYXRcIn0pOyRo4oCNX29uY2UuTmF0KE5hdCk7ICAgLyogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuKi9cbi8qIENvcHlyaWdodCAoQykgMjAxOCBBZ29yaWMqL1xuLyoqL1xuLyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTsqL1xuLyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiovXG4vKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQqL1xuLyoqL1xuLyogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKi9cbi8qKi9cbi8qIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUqL1xuLyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLCovXG4vKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4qL1xuLyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCovXG4vKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4qL1xuXG4vKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIElzIGBhbGxlZ2VkTnVtYCBhIG51bWJlciBpbiB0aGUgW2NvbnRpZ3VvdXMgcmFuZ2Ugb2YgZXhhY3RseSBhbmRcbiAqIHVuYW1iaWd1b3VzbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqICBuYXR1cmFsIG51bWJlcnMgKG5vbi1uZWdhdGl2ZSBpbnRlZ2Vycyk/XG4gKlxuICogVG8gcXVhbGlmeSBgYWxsZWdlZE51bWAgbXVzdCBlaXRoZXIgYmUgYVxuICogbm9uLW5lZ2F0aXZlIGBiaWdpbnRgLCBvciBhIG5vbi1uZWdhdGl2ZSBgbnVtYmVyYCByZXByZXNlbnRpbmcgYW4gaW50ZWdlclxuICogd2l0aGluIHJhbmdlIG9mIFtpbnRlZ2VycyBzYWZlbHkgcmVwcmVzZW50YWJsZSBpblxuICogZmxvYXRpbmcgcG9pbnRdKGh0dHBzOi8vdGMzOS5lcy9lY21hMjYyLyNzZWMtbnVtYmVyLmlzc2FmZWludGVnZXIpLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5yZXR1cm4gYWxsZWdlZE51bT49MDtcbiB9XG5pZih0eXBlb2YgYWxsZWdlZE51bSE9PSdudW1iZXInKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbnJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSYmYWxsZWdlZE51bT49MDtcbiB9XG5cbi8qKlxuICogSWYgYGFsbGVnZWROdW1iZXJgIHBhc3NlcyB0aGUgYGlzTmF0YCB0ZXN0LCB0aGVuIHJldHVybiBpdCBhcyBhIGJpZ2ludC5cbiAqIE90aGVyd2lzZSB0aHJvdyBhbiBhcHByb3ByaWF0ZSBlcnJvci5cbiAqXG4gKiBJZiBgYWxsZWdlZE51bWAgaXMgbmVpdGhlciBhIGJpZ2ludCBub3IgYSBudW1iZXIsIGBOYXRgIHRocm93cyBhIGBUeXBlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpZiBpdCBpcyBub3QgYSBbc2FmZWx5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiBub24tbmVnYXRpdmUgaW50ZWdlciwgYE5hdGAgdGhyb3dzIGEgYFJhbmdlRXJyb3JgLlxuICogT3RoZXJ3aXNlLCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSBiaWdpbnQgaWYgbmVjZXNzYXJ5IGFuZCByZXR1cm5lZC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtiaWdpbnR9XG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBhbGxlZ2VkTnVtO1xuIH1cblxuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nbnVtYmVyJyl7XG5pZighTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuIH1cbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCk7XG5cbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABl8owafAgAAHwIAAAgAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZXJyb3IuanMiLCIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiRmFyIiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSIsImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJpc09iamVjdCIsImlzT2JqZWN0IiwiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2l0ZXItaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL2Vycm9yLmpzXCIsIFtdXSxbXCIuL3NyYy9yZW1vdGFibGUuanNcIiwgW11dLFtcIi4vc3JjL3N5bWJvbC5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlT2YuanNcIiwgW11dLFtcIi4vc3JjL21ha2VUYWdnZWQuanNcIiwgW11dLFtcIi4vc3JjL21ha2UtZmFyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOltbIm1hcEl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSxbImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiXV0sIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjpbWyJQQVNTX1NUWUxFIiwiUEFTU19TVFlMRSJdLFsiaXNPYmplY3QiLCJpc09iamVjdCJdLFsiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENoZWNrZXIiXSxbImdldFRhZyIsImdldFRhZyJdLFsiaGFzT3duUHJvcGVydHlPZiIsImhhc093blByb3BlcnR5T2YiXV0sIi4vc3JjL2Vycm9yLmpzIjpbWyJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLFsidG9QYXNzYWJsZUVycm9yIiwidG9QYXNzYWJsZUVycm9yIl0sWyJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIl1dLCIuL3NyYy9yZW1vdGFibGUuanMiOltbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXV0sIi4vc3JjL3N5bWJvbC5qcyI6W1siYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLFsiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiXSxbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLFsicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl1dLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6W1sicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdLFsiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSJdXSwiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6W1sibWFrZVRhZ2dlZCIsIm1ha2VUYWdnZWQiXV0sIi4vc3JjL21ha2UtZmFyLmpzIjpbWyJSZW1vdGFibGUiLCJSZW1vdGFibGUiXSxbIkZhciIsIkZhciJdLFsiVG9GYXJGdW5jdGlvbiIsIlRvRmFyRnVuY3Rpb24iXV0sIi4vc3JjL3R5cGVHdWFyZHMuanMiOltbImFzc2VydFJlY29yZCIsImFzc2VydFJlY29yZCJdLFsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5Il0sWyJhc3NlcnRSZW1vdGFibGUiLCJhc3NlcnRSZW1vdGFibGUiXSxbImlzUmVtb3RhYmxlIiwiaXNSZW1vdGFibGUiXSxbImlzUmVjb3JkIiwiaXNSZWNvcmQiXSxbImlzQ29weUFycmF5IiwiaXNDb3B5QXJyYXkiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN5GtqqTBwAAkwcAACgAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvY29weUFycmF5LmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5QXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5LHByb3RvdHlwZTphcnJheVByb3RvdHlwZX09QXJyYXk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjYW5CZVZhbGlkPShjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+XG5pc0FycmF5KGNhbmRpZGF0ZSl8fFxuISFjaGVjayYmY2hlY2soZmFsc2UsWCBgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlBcnJheUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5QXJyYXknLFxuXG5jYW5CZVZhbGlkLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk9PT1hcnJheVByb3RvdHlwZXx8XG5hc3NlcnQuZmFpbChYIGBNYWxmb3JtZWQgYXJyYXk6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFNpbmNlIHdlJ3JlIGFscmVhZHkgZW5zdXJlZCBjYW5kaWRhdGUgaXMgYW4gYXJyYXksIGl0IHNob3VsZCBub3QgYmUqL1xuLyogcG9zc2libGUgZm9yIHRoZSBmb2xsb3dpbmcgdGVzdCB0byBmYWlsKi9cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdsZW5ndGgnLGZhbHNlLGFzc2VydENoZWNrZXIpO1xuY29uc3QgbGVuPS8qKiBAdHlwZSB7dW5rbm93bltdfSAqL2NhbmRpZGF0ZS5sZW5ndGg7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLGksdHJ1ZSxhc3NlcnRDaGVja2VyKTtcbiB9XG4vKiArMSBmb3IgdGhlICdsZW5ndGgnIHByb3BlcnR5IGl0c2VsZi4qL1xub3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aD09PWxlbisxfHxcbmFzc2VydC5mYWlsKFggYEFycmF5cyBtdXN0IG5vdCBoYXZlIG5vbi1pbmRleGVzOiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5jYW5kaWRhdGUuZXZlcnkoKHYpPT4hIXBhc3NTdHlsZU9mUmVjdXIodikpO1xuIH19KTskaOKAjV9vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAg/XbLM8HAADPBwAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsdmFsdWVzLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5UmVjb3JkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlSZWNvcmQnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkhPT1vYmplY3RQcm90b3R5cGUpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cblxucmV0dXJuIG93bktleXMoY2FuZGlkYXRlKS5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuKHR5cGVvZiBrZXk9PT0nc3RyaW5nJ3x8XG4hIXJlamVjdCYmXG5yZWplY3QoXG5YIGBSZWNvcmRzIGNhbiBvbmx5IGhhdmUgc3RyaW5nLW5hbWVkIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWApKSYmKFxuXG4hY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcbi8qIFRPRE86IFVwZGF0ZSBtZXNzYWdlIG5vdyB0aGF0IHRoZXJlIGlzIG5vIHN1Y2ggdGhpbmcgYXMgXCJpbXBsaWNpdCBSZW1vdGFibGVcIi4qL1xuWCBgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSkpO1xuXG5cbiB9KTtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5Db3B5UmVjb3JkSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKXtcbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLG5hbWUsdHJ1ZSxhc3NlcnRDaGVja2VyKTtcbiB9XG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5mb3IoY29uc3QgdmFsIG9mIHZhbHVlcyhjYW5kaWRhdGUpKXtcbnBhc3NTdHlsZU9mUmVjdXIodmFsKTtcbiB9XG4gfX0pOyRo4oCNX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5UmVjb3JkSGVscGVyIjpbIkNvcHlSZWNvcmRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA06A4cZ0RAACdEQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwiaXNFcnJvckxpa2UiLCJ0b1Bhc3NhYmxlRXJyb3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogVE9ETzogTWFpbnRlbmFuY2UgaGF6YXJkOiBDb29yZGluYXRlIHdpdGggdGhlIGxpc3Qgb2YgZXJyb3JzIGluIHRoZSBTRVMqL1xuLyogd2hpbGVsaXN0LiBDdXJyZW50bHksIGJvdGggb21pdCBBZ2dyZWdhdGVFcnJvciwgd2hpY2ggaXMgbm93IHN0YW5kYXJkLiBCb3RoKi9cbi8qIG11c3QgZXZlbnR1YWxseSBpbmNsdWRlIGl0LiovXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycz1uZXcgTWFwKFtcblsnRXJyb3InLEVycm9yXSxcblsnRXZhbEVycm9yJyxFdmFsRXJyb3JdLFxuWydSYW5nZUVycm9yJyxSYW5nZUVycm9yXSxcblsnUmVmZXJlbmNlRXJyb3InLFJlZmVyZW5jZUVycm9yXSxcblsnU3ludGF4RXJyb3InLFN5bnRheEVycm9yXSxcblsnVHlwZUVycm9yJyxUeXBlRXJyb3JdLFxuWydVUklFcnJvcicsVVJJRXJyb3JdXSk7XG5cblxuY29uc3QgICAgICAgIGdldEVycm9yQ29uc3RydWN0b3I9KG5hbWUpPT5lcnJvckNvbnN0cnVjdG9ycy5nZXQobmFtZSk7JGjigI1fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZT0oY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG4vKiBUT0RPOiBOZWVkIGEgYmV0dGVyIHRlc3QgdGhhbiBpbnN0YW5jZW9mKi9cbnJldHVybihcbmNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yfHxcbnJlamVjdCYmcmVqZWN0KFggYEVycm9yIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcblxuLyoqXG4gKiBWYWxpZGF0aW5nIGVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlIHJhaXNlcyBhIHRlbnNpb24gYmV0d2VlbiBzZWN1cml0eVxuICogdnMgcHJlc2VydmluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBGb3IgZXJyb3JzLCB3ZSBuZWVkIHRvIHJlbWVtYmVyXG4gKiB0aGUgZXJyb3IgaXRzZWxmIGV4aXN0cyB0byBoZWxwIHVzIGRpYWdub3NlIGEgYnVnIHRoYXQncyBsaWtlbHkgbW9yZVxuICogcHJlc3NpbmcgdGhhbiBhIHZhbGlkaXR5IGJ1ZyBpbiB0aGUgZXJyb3IgaXRzZWxmLiBUaHVzLCB3aGVuZXZlciBpdCBpcyBzYWZlXG4gKiB0byBkbyBzbywgd2UgcHJlZmVyIHRvIGxldCB0aGUgZXJyb3ItbGlrZSB0ZXN0IHN1Y2NlZWQgYW5kIHRvIGNvdWNoIHRoZXNlXG4gKiBjb21wbGFpbnRzIGFzIG5vdGVzIG9uIHRoZSBlcnJvci5cbiAqXG4gKiBUbyByZXNvbHZlIHRoaXMsIHN1Y2ggYSBtYWxmb3JtZWQgZXJyb3Igb2JqZWN0IHdpbGwgc3RpbGwgcGFzc1xuICogYGlzRXJyb3JMaWtlYCBzbyBtYXJzaGFsIGNhbiB1c2UgdGhpcyBmb3IgdG9wIGxldmVsIGVycm9yIHRvIHJlcG9ydCBmcm9tLFxuICogZXZlbiBpZiBpdCB3b3VsZCBub3QgYWN0dWFsbHkgdmFsaWRhdGUuXG4gKiBJbnN0ZWFkLCB0aGUgZGlhZ25vc3RpY3MgdGhhdCBgYXNzZXJ0RXJyb3JgIHdvdWxkIGhhdmUgcmVwb3J0ZWQgYXJlXG4gKiBhdHRhY2hlZCBhcyBub3RlcyB0byB0aGUgbWFsZm9ybWVkIGVycm9yLiBUaHVzLCBhIG1hbGZvcm1lZFxuICogZXJyb3IgaXMgcGFzc2FibGUgYnkgaXRzZWxmLCBidXQgbm90IGFzIHBhcnQgb2YgYSBwYXNzYWJsZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNFcnJvckxpa2U9KGNhbmRpZGF0ZSk9PmNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjigI1fb25jZS5pc0Vycm9yTGlrZShpc0Vycm9yTGlrZSk7XG5oYXJkZW4oaXNFcnJvckxpa2UpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBFcnJvckhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidlcnJvcicsXG5cbmNhbkJlVmFsaWQ6Y2hlY2tFcnJvckxpa2UsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT57XG5FcnJvckhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG5jb25zdHtuYW1lfT1wcm90bztcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IobmFtZSk7XG5FQyYmRUMucHJvdG90eXBlPT09cHJvdG98fFxuRmFpbCBgRXJyb3JzIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGUgJHtjYW5kaWRhdGV9YDtcblxuY29uc3R7XG4vKiBNdXN0IGFsbG93IGBjYXVzZWAsIGBlcnJvcnNgKi9cbm1lc3NhZ2U6bURlc2MsXG4vKiBBbGxvdyBidXQgaWdub3JlIG9ubHkgZXh0cmFuZW91cyBvd24gYHN0YWNrYCBwcm9wZXJ0eS4qL1xuc3RhY2s6X29wdFN0YWNrRGVzYyxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5vd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPDF8fFxuRmFpbCBgUGFzc2VkIEVycm9yIGhhcyBleHRyYSB1bnBhc3NlZCBwcm9wZXJ0aWVzICR7cmVzdERlc2NzfWA7XG5pZihtRGVzYyl7XG50eXBlb2YgbURlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBiZSBhIHN0cmluZy12YWx1ZWQgZGF0YSBwcm9wZXJ0eS5gO1xuIW1EZXNjLmVudW1lcmFibGV8fFxuRmFpbCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3Qgbm90IGJlIGVudW1lcmFibGVgO1xuIH1cbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG4vKipcbiAqIFJldHVybiBhIG5ldyBwYXNzYWJsZSBlcnJvciB0aGF0IHByb3BhZ2F0ZXMgdGhlIGRpYWdub3N0aWMgaW5mbyBvZiB0aGVcbiAqIG9yaWdpbmFsLCBhbmQgaXMgbGlua2VkIHRvIHRoZSBvcmlnaW5hbCBhcyBhIG5vdGUuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi8kaOKAjV9vbmNlLkVycm9ySGVscGVyKEVycm9ySGVscGVyKTtcbmNvbnN0ICAgICAgICB0b1Bhc3NhYmxlRXJyb3I9KGVycik9PntcbmNvbnN0e25hbWUsbWVzc2FnZX09ZXJyO1xuXG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKCBgJHtuYW1lfWApfHxFcnJvcjtcbmNvbnN0IG5ld0Vycm9yPWhhcmRlbihuZXcgRUMoIGAke21lc3NhZ2V9YCkpO1xuLyogRXZlbiB0aGUgY2xlYW5lZCB1cCBlcnJvciBjb3B5LCBpZiBzZW50IHRvIHRoZSBjb25zb2xlLCBzaG91bGQqL1xuLyogY2F1c2UgaGlkZGVuIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gb2YgdGhlIG9yaWdpbmFsIGVycm9yKi9cbi8qIHRvIGJlIGxvZ2dlZC4qL1xuYXNzZXJ0Lm5vdGUobmV3RXJyb3IsWCBgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG5yZXR1cm4gbmV3RXJyb3I7XG4gfTskaOKAjV9vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIl0sImlzRXJyb3JMaWtlIjpbImlzRXJyb3JMaWtlIl0sIkVycm9ySGVscGVyIjpbIkVycm9ySGVscGVyIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASjtmg1UIAABVCAAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIi4vbWFrZS1mYXIuanNcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgYW5kXG4gKiBoYXZlIHRoZSBzYW1lIHRlcm1pbmF0aW9uIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWUgb3IgZmFpbHVyZVxuICogcmVhc29uLiBCdXQgdGhlIG5vbi1maW5hbCB2YWx1ZXMgYXJlIHRoZSBjb3JyZXNwb25kaW5nIG5vbi1maW5hbFxuICogdmFsdWVzIGZyb20gYGJhc2VJdGVyYXRvcmAgYXMgdHJhbnNmb3JtZWQgYnkgYGZ1bmNgLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFVcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IFV9IGZ1bmNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxVPn1cbiAqL1xuY29uc3QgICAgICAgIG1hcEl0ZXJhYmxlPShiYXNlSXRlcmFibGUsZnVuYyk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignbWFwcGVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdtYXBwZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0e3ZhbHVlOmJhc2VWYWx1ZSxkb25lfT1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3QgdmFsdWU9ZG9uZT9iYXNlVmFsdWU6ZnVuYyhiYXNlVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7dmFsdWUsZG9uZX0pO1xuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcblxuaGFyZGVuKG1hcEl0ZXJhYmxlKTtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhIHN1YnNldCBvZiB0aGUgbm9uLWZpbmFsIHZhbHVlcyBmcm9tIHRoZVxuICogYGJhc2VJdGVyYXRvcmAgLS0tIHRob3NlIGZvciB3aGljaCBgcHJlZCh2YWx1ZSlgIHdhcyB0cnV0aHkuIFRoZSByZXN1bHRcbiAqIGhhcyB0aGUgc2FtZSB0ZXJtaW5hdGlvbiBhcyB0aGUgYGJhc2VJdGVyYXRvcmAgLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZVxuICogb3IgZmFpbHVyZSByZWFzb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IGJhc2VJdGVyYWJsZVxuICogQHBhcmFtIHsodmFsdWU6IFQpID0+IGJvb2xlYW59IHByZWRcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIGZpbHRlckl0ZXJhYmxlPShiYXNlSXRlcmFibGUscHJlZCk9PlxuLyoqIEB0eXBlIHtJdGVyYWJsZTxVPn0gKi9cbkZhcignZmlsdGVyZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5mb3IoOzspe1xuY29uc3QgcmVzdWx0PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdHt2YWx1ZSxkb25lfT1yZXN1bHQ7XG5pZihkb25lfHxwcmVkKHZhbHVlKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UuZmlsdGVySXRlcmFibGUoZmlsdGVySXRlcmFibGUpO1xuXG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIl0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGJNZwNOGgAAThoAACcAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvbWFrZS1mYXIuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcImFzc2VydElmYWNlXCIsIFskaOKAjV9hID0+IChhc3NlcnRJZmFjZSA9ICRo4oCNX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIiwgWyRo4oCNX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjigI1fYSldXSxbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHRlbXBsYXRlIEwsUiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPEwsIFI+fSBSZW1vdGFibGVCcmFuZCAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5zZXRQcm90b3R5cGVPZixcbmNyZWF0ZSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5cbi8qKlxuICogTm93IHRoYXQgdGhlIHJlbW90YWJsZVByb3RvIGRvZXMgbm90IHByb3ZpZGUgaXRzIG93biBgdG9TdHJpbmdgIG1ldGhvZCxcbiAqIGVuc3VyZSBpdCBhbHdheXMgaW5oZXJpdHMgZnJvbSBzb21ldGhpbmcuIFRoZSBvcmlnaW5hbCBwcm90b3R5cGUgb2ZcbiAqIGByZW1vdGFibGVgIGlmIHRoZXJlIHdhcyBvbmUsIG9yIGBPYmplY3QucHJvdG90eXBlYCBvdGhlcndpc2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IHJlbW90YWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHJldHVybnMge29iamVjdH1cbiAqL1xuY29uc3QgbWFrZVJlbW90YWJsZVByb3RvPShyZW1vdGFibGUsaWZhY2UpPT57XG5sZXQgb2xkUHJvdG89Z2V0UHJvdG90eXBlT2YocmVtb3RhYmxlKTtcbmlmKHR5cGVvZiByZW1vdGFibGU9PT0nb2JqZWN0Jyl7XG5pZihvbGRQcm90bz09PW51bGwpe1xub2xkUHJvdG89b2JqZWN0UHJvdG90eXBlO1xuIH1cbm9sZFByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbkZhaWwgYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNlIGlmKHR5cGVvZiByZW1vdGFibGU9PT0nZnVuY3Rpb24nKXtcbm9sZFByb3RvIT09bnVsbHx8XG5GYWlsIGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbm9sZFByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuZ2V0UHJvdG90eXBlT2Yob2xkUHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuRmFpbCBgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9sZFByb3RvLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3JlbW90YWJsZSd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOmlmYWNlfX0pKTtcblxuXG4gfTtcblxuY29uc3QgYXNzZXJ0Q2FuQmVSZW1vdGFibGU9KGNhbmRpZGF0ZSk9PlxuUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBSZW1vdGFibGUuICBBZnRlciB0aGlzLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpXG4gKiByZXR1cm5zIGlmYWNlLlxuICpcbiAqIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvODA0XG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2U9J1JlbW90YWJsZSddIFRoZSBpbnRlcmZhY2Ugc3BlY2lmaWNhdGlvbiBmb3JcbiAqIHRoZSByZW1vdGFibGUuIEZvciBub3csIGEgc3RyaW5nIGlmYWNlIG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoXG4gKiBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIiwgdG8gc2VydmUgYXMgdGhlIGFsbGVnZWQgbmFtZS4gTW9yZVxuICogZ2VuZXJhbCBpZmFjZXMgYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIFRoaXMgaXMgdGVtcG9yYXJ5LiBXZSBpbmNsdWRlIHRoZVxuICogXCJBbGxlZ2VkXCIgb3IgXCJEZWJ1Z05hbWVcIiBhcyBhIHJlbWluZGVyIHRoYXQgd2UgZG8gbm90IHlldCBoYXZlIFN3aW5nU2V0XG4gKiBvciBDb21tcyBWYXRcbiAqIHN1cHBvcnQgZm9yIGVuc3VyaW5nIHRoaXMgaXMgYWNjb3JkaW5nIHRvIHRoZSB2YXQgaG9zdGluZyB0aGUgb2JqZWN0LlxuICogQ3VycmVudGx5LCBBbGljZSBjYW4gdGVsbCBCb2IgYWJvdXQgQ2Fyb2wsIHdoZXJlIFZhdEEgKG9uIEFsaWNlJ3MgYmVoYWxmKVxuICogbWlzcmVwcmVzZW50cyBDYXJvbCdzIGBpZmFjZWAuIFZhdEIgYW5kIHRoZXJlZm9yZSBCb2Igd2lsbCB0aGVuIHNlZVxuICogQ2Fyb2wncyBgaWZhY2VgIGFzIG1pc3JlcHJlc2VudGVkIGJ5IFZhdEEuXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gW3Byb3BzPXVuZGVmaW5lZF0gQ3VycmVudGx5IG1heSBvbmx5IGJlIHVuZGVmaW5lZC5cbiAqIFRoYXQgcGxhbiBpcyB0aGF0IG93bi1wcm9wZXJ0aWVzIGFyZSBjb3BpZWQgdG8gdGhlIHJlbW90YWJsZVxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlPXt9XSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICogQHJldHVybnMge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59IHJlbW90YWJsZSwgbW9kaWZpZWQgZm9yIGRlYnVnZ2FiaWxpdHlcbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZT0oXG5pZmFjZT0nUmVtb3RhYmxlJyxcbnByb3BzPXVuZGVmaW5lZCxcbnJlbW90YWJsZT0vKiogQHR5cGUge1R9ICove30pPT5cbntcbmFzc2VydElmYWNlKGlmYWNlKTtcbmFzc2VydChpZmFjZSk7XG4vKiBUT0RPOiBXaGVuIGlmYWNlIGlzIHJpY2hlciB0aGFuIGp1c3Qgc3RyaW5nLCB3ZSBuZWVkIHRvIGdldCB0aGUgYWxsZWdlZE5hbWUqL1xuLyogaW4gYSBkaWZmZXJlbnQgd2F5LiovXG5wcm9wcz09PXVuZGVmaW5lZHx8RmFpbCBgUmVtb3RhYmxlIHByb3BzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgJHtwcm9wc31gO1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIHRoYXQgdGhlIHVubW9kaWZpZWQgb2JqZWN0IGlzIGFibGUgdG8gYmVjb21lIGEgUmVtb3RhYmxlLiovXG5hc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgbWFya2VkLiovXG4hKFBBU1NfU1RZTEUgaW4gcmVtb3RhYmxlKXx8XG5GYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxucmVtb3RhYmxlW1BBU1NfU1RZTEVdKVxuIH1gO1xuLyogYGlzRnJvemVuYCBhbHdheXMgcmV0dXJucyB0cnVlIHdpdGggYSBmYWtlIGBoYXJkZW5gLCBidXQgd2Ugd2FudCB0aGF0IGNhc2UqL1xuLyogdG8gc3VjY2VlZCBhbnl3YXkuIEZha2luZyBgaGFyZGVuYCBpcyBvbmx5IGNvcnJlY3RuZXNzIHByZXNlcnZpbmcqL1xuLyogaWYgdGhlIGNvZGUgaW4gcXVlc3Rpb24gY29udGFpbnMgbm8gYnVncyB0aGF0IHRoZSByZWFsIGBoYXJkZW5gIHdvdWxkKi9cbi8qIGhhdmUgY2F1Z2h0LiovXG4vKiBAdHMtaWdub3JlIGBpc0Zha2VgIHB1cnBvc2VseSBub3QgaW4gdGhlIHR5cGUqL1xuaGFyZGVuLmlzRmFrZXx8XG4vKiBFbnN1cmUgdGhhdCB0aGUgcmVtb3RhYmxlIGlzbid0IGFscmVhZHkgZnJvemVuLiovXG4haXNGcm96ZW4ocmVtb3RhYmxlKXx8XG5GYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgZnJvemVuYDtcbmNvbnN0IHJlbW90YWJsZVByb3RvPW1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsaWZhY2UpO1xuXG4vKiBUYWtlIGEgc3RhdGljIGNvcHkgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgYXMgZGF0YSBwcm9wZXJ0aWVzLiovXG4vKiBjb25zdCBwcm9wRGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHsgLi4ucHJvcHMgfSk7Ki9cbmNvbnN0IG11dGF0ZUhhcmRlbkFuZENoZWNrPSh0YXJnZXQpPT57XG4vKiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcERlc2NzKTsqL1xuc2V0UHJvdG90eXBlT2YodGFyZ2V0LHJlbW90YWJsZVByb3RvKTtcbmhhcmRlbih0YXJnZXQpO1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUodGFyZ2V0KTtcbiB9O1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIGEgZnJlc2ggcmVtb3RhYmxlIHRvIHNlZSBpZiBvdXIgcnVsZXMgZml0LiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayh7fSk7XG5cbi8qIEFjdHVhbGx5IGZpbmlzaCB0aGUgbmV3IHJlbW90YWJsZS4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2socmVtb3RhYmxlKTtcblxuLyogQ09NTUlUVEVEISovXG4vKiBXZSdyZSBjb21taXR0ZWQsIHNvIGtlZXAgdGhlIGludGVyZmFjZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4qL1xuYXNzZXJ0KGlmYWNlIT09dW5kZWZpbmVkKTsvKiBUbyBtYWtlIFR5cGVTY3JpcHQgaGFwcHkqL1xucmV0dXJuICgvKiogQHR5cGUge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59ICovcmVtb3RhYmxlKTtcbiB9OyRo4oCNX29uY2UuUmVtb3RhYmxlKFJlbW90YWJsZSk7XG5oYXJkZW4oUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBBIGNvbmNpc2UgY29udmVuaWVuY2UgZm9yIHRoZSBtb3N0IGNvbW1vbiBgUmVtb3RhYmxlYCB1c2UuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgVGhpcyBuYW1lIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggYEFsbGVnZWQ6IGBcbiAqIGZvciBub3cgdG8gZm9ybSB0aGUgYFJlbW90YWJsZWAgYGlmYWNlYCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZT17fV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqL1xuY29uc3QgICAgICAgIEZhcj0oZmFyTmFtZSxyZW1vdGFibGU9dW5kZWZpbmVkKT0+e1xuY29uc3Qgcj1yZW1vdGFibGU9PT11bmRlZmluZWQ/LyoqIEB0eXBlIHtUfSAqL3t9OnJlbW90YWJsZTtcbnJldHVybiBSZW1vdGFibGUoIGBBbGxlZ2VkOiAke2Zhck5hbWV9YCx1bmRlZmluZWQscik7XG4gfTskaOKAjV9vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qKlxuICogQ29lcmNlIGBmdW5jYCB0byBhIGZhciBmdW5jdGlvbiB0aGF0IHByZXNlcnZlcyBpdHMgY2FsbCBiZWhhdmlvci5cbiAqIElmIGl0IGlzIGFscmVhZHkgYSBmYXIgZnVuY3Rpb24sIHJldHVybiBpdC4gT3RoZXJ3aXNlIG1ha2UgYW5kIHJldHVybiBhXG4gKiBuZXcgZmFyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIGFuZCBmb3J3YXJkcyBjYWxscyB0byBpdC4gVGhpc1xuICogd29ya3MgZXZlbiBpZiBgZnVuY2AgaXMgYWxyZWFkeSBmcm96ZW4uIGBUb0ZhckZ1bmN0aW9uYCBpcyB0byBiZSB1c2VkXG4gKiB3aGVuIHRoZSBmdW5jdGlvbiBjb21lcyBmcm9tIGVsc2V3aGVyZSB1bmRlciBsZXNzIGNvbnRyb2wuIEZvciBmdW5jdGlvbnNcbiAqIHlvdSBhdXRob3IgaW4gcGxhY2UsIGJldHRlciB0byB1c2UgYEZhcmAgb24gdGhlaXIgZnVuY3Rpb24gbGl0ZXJhbCBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSB0byBiZSB1c2VkIG9ubHkgaWYgYGZ1bmNgIGlzIG5vdCBhbHJlYWR5IGFcbiAqIGZhciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IGZ1bmNcbiAqL1xuY29uc3QgICAgICAgIFRvRmFyRnVuY3Rpb249KGZhck5hbWUsZnVuYyk9PntcbmlmKGdldEludGVyZmFjZU9mKGZ1bmMpIT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jO1xuIH1cbnJldHVybiBGYXIoZmFyTmFtZSwoLi4uYXJncyk9PmZ1bmMoLi4uYXJncykpO1xuIH07JGjigI1fb25jZS5Ub0ZhckZ1bmN0aW9uKFRvRmFyRnVuY3Rpb24pO1xuaGFyZGVuKFRvRmFyRnVuY3Rpb24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiRmFyIjpbIkZhciJdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAApF75R0EAAAdBAAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9tYWtlVGFnZ2VkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZVRhZ2dlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e2NyZWF0ZSxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICBtYWtlVGFnZ2VkPSh0YWcscGF5bG9hZCk9PntcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBUaGUgdGFnIG9mIGEgdGFnZ2VkIHJlY29yZCBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ31gO1xuYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2JqZWN0UHJvdG90eXBlLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3RhZ2dlZCd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOnRhZ30sXG5wYXlsb2FkOnt2YWx1ZTpwYXlsb2FkLGVudW1lcmFibGU6dHJ1ZX19KSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlVGFnZ2VkKG1ha2VUYWdnZWQpO1xuaGFyZGVuKG1ha2VUYWdnZWQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAZQCjG9RkAAPUZAAAwAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJQQVNTX1NUWUxFIiwiYXNzZXJ0Q2hlY2tlciIsImNhbkJlTWV0aG9kIiwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCIsImNoZWNrTm9ybWFsUHJvcGVydHkiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuZ2V0UHJvdG90eXBlT2YsXG5oYXNPd25Qcm9wZXJ0eTpvYmplY3RIYXNPd25Qcm9wZXJ0eSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e3RvU3RyaW5nVGFnOnRvU3RyaW5nVGFnU3ltYm9sfT1TeW1ib2w7XG5cbmNvbnN0IHR5cGVkQXJyYXlQcm90b3R5cGU9Z2V0UHJvdG90eXBlT2YoVWludDhBcnJheS5wcm90b3R5cGUpO1xuY29uc3QgdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG50eXBlZEFycmF5UHJvdG90eXBlLFxudG9TdHJpbmdUYWdTeW1ib2wpO1xuXG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9dHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYy5nZXQ7XG5hc3NlcnQodHlwZW9mIGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz09PSdmdW5jdGlvbicpO1xuXG5jb25zdCAgICAgICAgaGFzT3duUHJvcGVydHlPZj0ob2JqLHByb3ApPT5cbmFwcGx5KG9iamVjdEhhc093blByb3BlcnR5LG9iaixbcHJvcF0pOyRo4oCNX29uY2UuaGFzT3duUHJvcGVydHlPZihoYXNPd25Qcm9wZXJ0eU9mKTtcbmhhcmRlbihoYXNPd25Qcm9wZXJ0eU9mKTtcblxuY29uc3QgICAgICAgIGlzT2JqZWN0PSh2YWwpPT5PYmplY3QodmFsKT09PXZhbDskaOKAjV9vbmNlLmlzT2JqZWN0KGlzT2JqZWN0KTtcbmhhcmRlbihpc09iamVjdCk7XG5cbi8qKlxuICogRHVwbGljYXRlcyBwYWNrYWdlcy9zZXMvc3JjL21ha2UtaGFyZGVuZXIuanMgdG8gYXZvaWQgYSBkZXBlbmRlbmN5LlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gb2JqZWN0XG4gKi9cbmNvbnN0ICAgICAgICBpc1R5cGVkQXJyYXk9KG9iamVjdCk9Pntcbi8qIFRoZSBvYmplY3QgbXVzdCBwYXNzIGEgYnJhbmQgY2hlY2sgb3IgdG9TdHJpbmdUYWcgd2lsbCByZXR1cm4gdW5kZWZpbmVkLiovXG5jb25zdCB0YWc9YXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLG9iamVjdCxbXSk7XG5yZXR1cm4gdGFnIT09dW5kZWZpbmVkO1xuIH07JGjigI1fb25jZS5pc1R5cGVkQXJyYXkoaXNUeXBlZEFycmF5KTtcbmhhcmRlbihpc1R5cGVkQXJyYXkpO1xuXG5jb25zdCAgICAgICAgUEFTU19TVFlMRT1TeW1ib2wuZm9yKCdwYXNzU3R5bGUnKTtcblxuLyoqXG4gKiBGb3IgYSBmdW5jdGlvbiB0byBiZSBhIHZhbGlkIG1ldGhvZCwgaXQgbXVzdCBub3QgYmUgcGFzc2FibGUuXG4gKiBPdGhlcndpc2UsIHdlIHJpc2sgY29uZnVzaW5nIHBhc3MtYnktY29weSBkYXRhIGNhcnJ5aW5nXG4gKiBmYXIgZnVuY3Rpb25zIHdpdGggYXR0ZW1wdHMgYXQgZmFyIG9iamVjdHMgd2l0aCBtZXRob2RzLlxuICpcbiAqIFRPRE8gSEFaQVJEIEJlY2F1c2Ugd2UgY2hlY2sgdGhpcyBvbiB0aGUgd2F5IHRvIGhhcmRlbmluZyBhIHJlbW90YWJsZSxcbiAqIHdlIGNhbm5vdCB5ZXQgY2hlY2sgdGhhdCBgZnVuY2AgaXMgaGFyZGVuZWQuIEhvd2V2ZXIsIHdpdGhvdXRcbiAqIGRvaW5nIHNvLCBpdCdzIGluaGVyaXRhbmNlIG1pZ2h0IGNoYW5nZSBhZnRlciB0aGUgYFBBU1NfU1RZTEVgXG4gKiBjaGVjayBiZWxvdy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gZnVuY1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG5jb25zdCAgICAgICAgY2FuQmVNZXRob2Q9KGZ1bmMpPT5cbnR5cGVvZiBmdW5jPT09J2Z1bmN0aW9uJyYmIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRo4oCNX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLyoqXG4gKiBCZWxvdyB3ZSBoYXZlIGEgc2VyaWVzIG9mIHByZWRpY2F0ZSBmdW5jdGlvbnMgYW5kIHRoZWlyIChjdXJyaWVkKSBhc3NlcnRpb25cbiAqIGZ1bmN0aW9ucy4gVGhlIHNlbWFudGljcyBvZiB0aGUgYXNzZXJ0aW9uIGZ1bmN0aW9uIGlzIGp1c3QgdG8gYXNzZXJ0IHRoYXRcbiAqIHRoZSBjb3JyZXNwb25kaW5nIHByZWRpY2F0ZSBmdW5jdGlvbiB3b3VsZCBoYXZlIHJldHVybmVkIHRydWUuIEJ1dCBpdFxuICogcmVwcm9kdWNlcyB0aGUgaW50ZXJuYWwgdGVzdHMgc28gZmFpbHVyZXMgY2FuIGdpdmUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENoZWNrZXI9KGNvbmQsZGV0YWlscyk9PntcbmFzc2VydChjb25kLGRldGFpbHMpO1xucmV0dXJuIHRydWU7XG4gfTskaOKAjV9vbmNlLmFzc2VydENoZWNrZXIoYXNzZXJ0Q2hlY2tlcik7XG5oYXJkZW4oYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ2hlY2tzIGZvciB0aGUgcHJlc2VuY2UgYW5kIGVudW1lcmFiaWxpdHkgb2YgYW4gb3duIGRhdGEgcHJvcGVydHkuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfHN5bWJvbH0gcHJvcGVydHlOYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHNob3VsZEJlRW51bWVyYWJsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrTm9ybWFsUHJvcGVydHk9KFxuY2FuZGlkYXRlLFxucHJvcGVydHlOYW1lLFxuc2hvdWxkQmVFbnVtZXJhYmxlLFxuY2hlY2spPT5cbntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCBkZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUscHJvcGVydHlOYW1lKTtcbmlmKGRlc2M9PT11bmRlZmluZWQpe1xucmV0dXJuKFxucmVqZWN0JiZyZWplY3QoWCBgJHtxKHByb3BlcnR5TmFtZSl9IHByb3BlcnR5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5yZXR1cm4oXG4oaGFzT3duUHJvcGVydHlPZihkZXNjLCd2YWx1ZScpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBub3QgYmUgYW4gYWNjZXNzb3IgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5zaG91bGRCZUVudW1lcmFibGU/XG5kZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApOlxuXG4hZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EoXG5wcm9wZXJ0eU5hbWUpXG4gfSBtdXN0IG5vdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuY2hlY2tOb3JtYWxQcm9wZXJ0eShjaGVja05vcm1hbFByb3BlcnR5KTtcbmhhcmRlbihjaGVja05vcm1hbFByb3BlcnR5KTtcblxuY29uc3QgICAgICAgIGdldFRhZz0odGFnUmVjb3JkKT0+dGFnUmVjb3JkW1N5bWJvbC50b1N0cmluZ1RhZ107JGjigI1fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG5jb25zdCAgICAgICAgY2hlY2tQYXNzU3R5bGU9KG9iaixleHBlY3RlZFBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCBhY3R1YWw9b2JqW1BBU1NfU1RZTEVdO1xucmV0dXJuKFxuYWN0dWFsPT09ZXhwZWN0ZWRQYXNzU3R5bGV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShhY3R1YWwpfTogJHtvYmp9YCkpO1xuXG4gfTskaOKAjV9vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZD0oY2hlY2tQcm90byk9Pntcbi8qKlxuICogQHBhcmFtIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nIH19IHRhZ1JlY29yZFxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tUYWdSZWNvcmQ9KHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuKGlzT2JqZWN0KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkmJihcbmlzRnJvemVuKHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QoWCBgQSB0YWdSZWNvcmQgbXVzdCBiZSBmcm96ZW46ICR7dGFnUmVjb3JkfWApKSYmKFxuIWlzQXJyYXkodGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBbiBhcnJheSBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxQQVNTX1NUWUxFLGZhbHNlLGNoZWNrKSYmXG5jaGVja1Bhc3NTdHlsZSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKSYmXG5jaGVja05vcm1hbFByb3BlcnR5KHRhZ1JlY29yZCxTeW1ib2wudG9TdHJpbmdUYWcsZmFsc2UsY2hlY2spJiYoXG50eXBlb2YgZ2V0VGFnKHRhZ1JlY29yZCk9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgQSBbU3ltYm9sLnRvU3RyaW5nVGFnXS1uYW1lZCBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ1JlY29yZH1gKSkmJlxuXG5jaGVja1Byb3RvKHRhZ1JlY29yZCxnZXRQcm90b3R5cGVPZih0YWdSZWNvcmQpLGNoZWNrKSk7XG5cbiB9O1xucmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG4gfTtcblxuY29uc3QgICAgICAgIGNoZWNrVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soZmFsc2UsWCBgQSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tUYWdSZWNvcmQoY2hlY2tUYWdSZWNvcmQpO1xuXG5oYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuXG5jb25zdCAgICAgICAgY2hlY2tGdW5jdGlvblRhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbnByb3RvIT09bnVsbCYmZ2V0UHJvdG90eXBlT2YocHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhcbmZhbHNlLFxuWCBgRm9yIGZ1bmN0aW9ucywgYSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja0Z1bmN0aW9uVGFnUmVjb3JkKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xuXG5cbmhhcmRlbihjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sImNoZWNrTm9ybWFsUHJvcGVydHkiOlsiY2hlY2tOb3JtYWxQcm9wZXJ0eSJdLCJnZXRUYWciOlsiZ2V0VGFnIl0sImNoZWNrUGFzc1N0eWxlIjpbImNoZWNrUGFzc1N0eWxlIl0sImNoZWNrVGFnUmVjb3JkIjpbImNoZWNrVGFnUmVjb3JkIl0sImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiOlsiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAubrENgxsAAIMbAAAqAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3Bhc3NTdHlsZU9mLmpzeyJpbXBvcnRzIjpbIi4vY29weUFycmF5LmpzIiwiLi9jb3B5UmVjb3JkLmpzIiwiLi9lcnJvci5qcyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc2FmZS1wcm9taXNlLmpzIiwiLi9zeW1ib2wuanMiLCIuL3RhZ2dlZC5qcyIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGUiLCJwYXNzU3R5bGVPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsaXNPYmplY3QsaXNUeXBlZEFycmF5LFBBU1NfU1RZTEUsQ29weUFycmF5SGVscGVyLENvcHlSZWNvcmRIZWxwZXIsVGFnZ2VkSGVscGVyLEVycm9ySGVscGVyLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJpc1R5cGVkQXJyYXlcIiwgWyRo4oCNX2EgPT4gKGlzVHlwZWRBcnJheSA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlBcnJheS5qc1wiLCBbW1wiQ29weUFycmF5SGVscGVyXCIsIFskaOKAjV9hID0+IChDb3B5QXJyYXlIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5UmVjb3JkLmpzXCIsIFtbXCJDb3B5UmVjb3JkSGVscGVyXCIsIFskaOKAjV9hID0+IChDb3B5UmVjb3JkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vdGFnZ2VkLmpzXCIsIFtbXCJUYWdnZWRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLCBbJGjigI1fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiLi9zYWZlLXByb21pc2UuanNcIiwgW1tcImFzc2VydFNhZmVQcm9taXNlXCIsIFskaOKAjV9hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlT2Z9IFBhc3NTdHlsZU9mICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QcmltaXRpdmVTdHlsZX0gUHJpbWl0aXZlU3R5bGUgKi9cblxuLyoqIEB0eXBlZGVmIHtFeGNsdWRlPFBhc3NTdHlsZSwgUHJpbWl0aXZlU3R5bGUgfCBcInByb21pc2VcIj59IEhlbHBlclBhc3NTdHlsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNGcm96ZW59PU9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzXG4gKiBAcmV0dXJucyB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgUGFzc1N0eWxlSGVscGVyPiB9XG4gKi9cblxuY29uc3QgbWFrZUhlbHBlclRhYmxlPShwYXNzU3R5bGVIZWxwZXJzKT0+e1xuLyoqIEB0eXBlIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBhbnk+ICYge19fcHJvdG9fXzogbnVsbH19ICovXG5jb25zdCBIZWxwZXJUYWJsZT17XG5fX3Byb3RvX186bnVsbCxcbmNvcHlBcnJheTp1bmRlZmluZWQsXG5jb3B5UmVjb3JkOnVuZGVmaW5lZCxcbnRhZ2dlZDp1bmRlZmluZWQsXG5lcnJvcjp1bmRlZmluZWQsXG5yZW1vdGFibGU6dW5kZWZpbmVkfTtcblxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmNvbnN0e3N0eWxlTmFtZX09aGVscGVyO1xuc3R5bGVOYW1lIGluIEhlbHBlclRhYmxlfHxGYWlsIGBVbnJlY29nbml6ZWQgaGVscGVyOiAke3Eoc3R5bGVOYW1lKX1gO1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXT09PXVuZGVmaW5lZHx8XG5GYWlsIGBjb25mbGljdGluZyBoZWxwZXJzIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXT1oZWxwZXI7XG4gfVxuZm9yKGNvbnN0IHN0eWxlTmFtZSBvZiBvd25LZXlzKEhlbHBlclRhYmxlKSl7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdIT09dW5kZWZpbmVkfHxcbkZhaWwgYG1pc3NpbmcgaGVscGVyIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuIH1cblxucmV0dXJuIGhhcmRlbihIZWxwZXJUYWJsZSk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzIFRoZSBwYXNzU3R5bGVIZWxwZXJzIHRvIHJlZ2lzdGVyLFxuICogaW4gcHJpb3JpdHkgb3JkZXIuXG4gKiBOT1RFIFRoZXNlIG11c3QgYWxsIGJlIFwidHJ1c3RlZFwiLFxuICogY29tcGxldGUsIGFuZCBub24tY29sbGlkaW5nLiBgbWFrZVBhc3NTdHlsZU9mYCBtYXkgKmFzc3VtZSogdGhhdCBlYWNoIGhlbHBlclxuICogZG9lcyB3aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGRvLiBgbWFrZVBhc3NTdHlsZU9mYCBpcyBub3QgdHJ5aW5nIHRvIGRlZmVuZFxuICogaXRzZWxmIGFnYWluc3QgbWFsaWNpb3VzIGhlbHBlcnMsIHRob3VnaCBpdCBkb2VzIGRlZmVuZCBhZ2FpbnN0IHNvbWVcbiAqIGFjY2lkZW50cy5cbiAqIEByZXR1cm5zIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgbWFrZVBhc3NTdHlsZU9mPShwYXNzU3R5bGVIZWxwZXJzKT0+e1xuY29uc3QgSGVscGVyVGFibGU9bWFrZUhlbHBlclRhYmxlKHBhc3NTdHlsZUhlbHBlcnMpO1xuY29uc3QgcmVtb3RhYmxlSGVscGVyPUhlbHBlclRhYmxlLnJlbW90YWJsZTtcblxuLyoqXG4gKiBQdXJlbHkgZm9yIHBlcmZvcm1hbmNlLiBIb3dldmVyIGl0IGlzIG11dGFibGUgc3RhdGljIHN0YXRlLCBhbmRcbiAqIGl0IGRvZXMgaGF2ZSBzb21lIG9ic2VydmFiaWxpdHkgb24gcHJveGllcy4gVE9ETyBuZWVkIHRvIGFzc2Vzc1xuICogd2hldGhlciB0aGlzIGNyZWF0ZXMgYSBzdGF0aWMgY29tbXVuaWNhdGlvbnMgY2hhbm5lbC5cbiAqXG4gKiBwYXNzU3R5bGVPZiBkb2VzIGEgZnVsbCByZWN1cnNpdmUgd2FsayBvZiBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIGluIG9yZGVyIHRvIHZhbGlkYXRlIHRoYXQgdGhleSBhcmUgYWN5Y2xpYy4gSW4gYWRkaXRpb25cbiAqIGl0IGlzIHVzZWQgYnkgb3RoZXIgYWxnb3JpdGhtcyB0byByZWN1cnNpdmVseSB3YWxrIHRoZXNlIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgc28gd2l0aG91dCB0aGlzIGNhY2hlLCB0aGVzZSBhbGdvcml0aG1zIGNvdWxkIGJlXG4gKiBPKE4qKjIpIG9yIHdvcnNlLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwPFBhc3NhYmxlLCBQYXNzU3R5bGU+fVxuICovXG5jb25zdCBwYXNzU3R5bGVNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZj0ocGFzc2FibGUpPT57XG4vKiBFdmVuIHdoZW4gYSBXZWFrU2V0IGlzIGNvcnJlY3QsIHdoZW4gdGhlIHNldCBoYXMgYSBzaG9ydGVyIGxpZmV0aW1lKi9cbi8qIHRoYW4gaXRzIGtleXMsIHdlIHByZWZlciBhIFNldCBkdWUgdG8gZXhwZWN0ZWQgaW1wbGVtZW50YXRpb24qL1xuLyogdHJhZGVvZmZzLiovXG5jb25zdCBpblByb2dyZXNzPW5ldyBTZXQoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mUmVjdXI9KGlubmVyKT0+e1xuY29uc3QgaW5uZXJJc09iamVjdD1pc09iamVjdChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbmlmKHBhc3NTdHlsZU1lbW8uaGFzKGlubmVyKSl7XG4vKiBAdHMtaWdub3JlIFR5cGVTY3JpcHQgZG9lc24ndCBrbm93IHRoYXQgYGdldGAgYWZ0ZXIgYGhhc2AgaXMgc2FmZSovXG5yZXR1cm4gcGFzc1N0eWxlTWVtby5nZXQoaW5uZXIpO1xuIH1cbiFpblByb2dyZXNzLmhhcyhpbm5lcil8fFxuRmFpbCBgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG5pblByb2dyZXNzLmFkZChpbm5lcik7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xucGFzc1N0eWxlTWVtby5zZXQoaW5uZXIscGFzc1N0eWxlKTtcbmluUHJvZ3Jlc3MuZGVsZXRlKGlubmVyKTtcbiB9XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZkludGVybmFsPShpbm5lcik9PntcbmNvbnN0IHR5cGVzdHI9dHlwZW9mIGlubmVyO1xuc3dpdGNoKHR5cGVzdHIpe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm4gdHlwZXN0cjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2woaW5uZXIpO1xucmV0dXJuJ3N5bWJvbCc7XG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGlubmVyPT09bnVsbCl7XG5yZXR1cm4nbnVsbCc7XG4gfVxuaWYoIWlzRnJvemVuKGlubmVyKSl7XG5hc3NlcnQuZmFpbChcbi8qIFR5cGVkQXJyYXlzIGdldCBzcGVjaWFsIHRyZWF0bWVudCBpbiBoYXJkZW4oKSovXG4vKiBhbmQgYSBjb3JyZXNwb25kaW5nIHNwZWNpYWwgZXJyb3IgbWVzc2FnZSBoZXJlLiovXG5pc1R5cGVkQXJyYXkoaW5uZXIpP1xuWCBgQ2Fubm90IHBhc3MgbXV0YWJsZSB0eXBlZCBhcnJheXMgbGlrZSAke2lubmVyfS5gOlxuWCBgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWApO1xuXG4gfVxuaWYoaXNQcm9taXNlKGlubmVyKSl7XG5hc3NlcnRTYWZlUHJvbWlzZShpbm5lcik7XG5yZXR1cm4ncHJvbWlzZSc7XG4gfVxudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5jb25zdCBwYXNzU3R5bGVUYWc9aW5uZXJbUEFTU19TVFlMRV07XG5pZihwYXNzU3R5bGVUYWchPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihwYXNzU3R5bGVUYWcsJ3N0cmluZycpO1xuY29uc3QgaGVscGVyPUhlbHBlclRhYmxlW3Bhc3NTdHlsZVRhZ107XG5oZWxwZXIhPT11bmRlZmluZWR8fFxuRmFpbCBgVW5yZWNvZ25pemVkIFBhc3NTdHlsZTogJHtxKHBhc3NTdHlsZVRhZyl9YDtcbmhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybiAoLyoqIEB0eXBlIHtQYXNzU3R5bGV9ICovcGFzc1N0eWxlVGFnKTtcbiB9XG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuaWYoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKXtcbmhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybiBoZWxwZXIuc3R5bGVOYW1lO1xuIH1cbiB9XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5jYXNlJ2Z1bmN0aW9uJzp7XG5pc0Zyb3plbihpbm5lcil8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWA7XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgVW5yZWNvZ25pemVkIHR5cGVvZiAke3EodHlwZXN0cil9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9O1xuXG5yZXR1cm4gcGFzc1N0eWxlT2ZSZWN1cihwYXNzYWJsZSk7XG4gfTtcbnJldHVybiBoYXJkZW4ocGFzc1N0eWxlT2YpO1xuIH07XG5cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVPZj1tYWtlUGFzc1N0eWxlT2YoW1xuQ29weUFycmF5SGVscGVyLFxuQ29weVJlY29yZEhlbHBlcixcblRhZ2dlZEhlbHBlcixcbkVycm9ySGVscGVyLFxuUmVtb3RhYmxlSGVscGVyXSk7JGjigI1fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlPSh2YWwpPT57XG5wYXNzU3R5bGVPZih2YWwpOy8qIHRocm93cyBpZiB2YWwgaXMgbm90IGEgcGFzc2FibGUqL1xuIH07JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZShhc3NlcnRQYXNzYWJsZSk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABSxon3DIQAAwyEAACgAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImdldEludGVyZmFjZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsaGFzT3duUHJvcGVydHlPZixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNPYmplY3QsZ2V0VGFnOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5NYXJzaGFsR2V0SW50ZXJmYWNlT2Z9IE1hcnNoYWxHZXRJbnRlcmZhY2VPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGUsXG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tJZmFjZT0oaWZhY2UsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4odHlwZW9mIGlmYWNlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpJiYoXG5cbmlmYWNlPT09J1JlbW90YWJsZSd8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJyl8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRm9yIG5vdywgaWZhY2UgJHtxKFxuaWZhY2UpXG4gfSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aCBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIjsgdW5pbXBsZW1lbnRlZGApKSk7XG5cblxuIH07XG5cbi8qKlxuICogQW4gYGlmYWNlYCBtdXN0IGJlIHB1cmUuIFJpZ2h0IG5vdyBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aGljaCBpcyBwdXJlLlxuICogTGF0ZXIgd2UgZXhwZWN0IHRvIGluY2x1ZGUgc29tZSBvdGhlciB2YWx1ZXMgdGhhdCBxdWFsaWZ5IGFzIGBQdXJlRGF0YWAsXG4gKiB3aGljaCBpcyBhIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBlbmRpbmcgb25seSBpbiBwcmltaXRpdmVzIG9yXG4gKiBlbXB0eSBwYXNzLWJ5LWNvcHkgY29tcG9zaXRlcy4gTm8gcmVtb3RhYmxlcywgcHJvbWlzZXMsIG9yIGVycm9ycy5cbiAqIFdlICphc3N1bWUqIGZvciBub3cgdGhhdCB0aGUgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGNvbnRhaW5zIG5vXG4gKiBwcm94aWVzLlxuICpcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydElmYWNlPShpZmFjZSk9PmNoZWNrSWZhY2UoaWZhY2UsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0IHwgRnVuY3Rpb259IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2Y9KG9yaWdpbmFsLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlzT2JqZWN0KG9yaWdpbmFsKXx8XG5GYWlsIGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuLyogQSB2YWxpZCByZW1vdGFibGUgb2JqZWN0IG11c3QgaW5oZXJpdCBmcm9tIGEgXCJ0YWcgcmVjb3JkXCIgLS0gYSovXG4vKiBwbGFpbi1vYmplY3QgcHJvdG90eXBlIGNvbnNpc3Rpbmcgb2Ygb25seSovXG4vKiBhIGBQQVNTX1NUWUxFYCBwcm9wZXJ0eSB3aXRoIHZhbHVlIFwicmVtb3RhYmxlXCIgYW5kIGEgc3VpdGFibGUgYFN5bWJvbC50b1N0cmluZ1RhZ2AqL1xuLyogcHJvcGVydHkuIFRoZSByZW1vdGFibGUgY291bGQgaW5oZXJpdCBkaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLCBvciovXG4vKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4vKiBpbmhlcml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQuKi9cbi8qKi9cbi8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuLyogd2l0aCBQQVNTX1NUWUxFIGZyb20gSlNEb2MuKi9cbi8qKi9cbi8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4vKiBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nLCovXG4vKiB9fSovXG4vKiovXG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG5pZihwcm90bz09PW9iamVjdFByb3RvdHlwZXx8cHJvdG89PT1udWxsKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVtb3RhYmxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQ6ICR7cShvcmlnaW5hbCl9YCkpO1xuXG4gfVxuXG5pZih0eXBlb2Ygb3JpZ2luYWw9PT0nb2JqZWN0Jyl7XG5jb25zdCBwcm90b1Byb3RvPWdldFByb3RvdHlwZU9mKHByb3RvKTtcbmlmKHByb3RvUHJvdG8hPT1vYmplY3RQcm90b3R5cGUmJnByb3RvUHJvdG8hPT1udWxsKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sY2hlY2spO1xuIH1cbmlmKCFjaGVja1RhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9ZWxzZSBpZih0eXBlb2Ygb3JpZ2luYWw9PT0nZnVuY3Rpb24nKXtcbmlmKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOnt2YWx1ZTppZmFjZX0sXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbnJldHVybihcbihvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkmJlxuXG5jaGVja0lmYWNlKGlmYWNlLGNoZWNrKSk7XG5cbiB9O1xuXG4vKipcbiAqIEtlZXAgYSB3ZWFrIHNldCBvZiBjb25maXJtZWQgcmVtb3RhYmxlcyBmb3IgbWFyc2hhbCBwZXJmb3JtYW5jZVxuICogKHdpdGhvdXQgd2hpY2ggd2Ugd291bGQgaW5jdXIgYSByZWR1bmRhbnQgdmVyaWZpY2F0aW9uIGluXG4gKiBnZXRJbnRlcmZhY2VPZikuXG4gKiBXZSBkb24ndCByZW1lbWJlciByZWplY3Rpb25zIGJlY2F1c2UgdGhleSBhcmUgcG9zc2libGUgdG8gY29ycmVjdFxuICogd2l0aCBlLmcuIGBoYXJkZW5gLlxuICpcbiAqIEB0eXBlIHtXZWFrU2V0PFJlbW90YWJsZT59XG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXM9bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZT0odmFsLGNoZWNrKT0+e1xuaWYoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoIWlzRnJvemVuKHZhbCkpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YCk7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCByZXN1bHQ9Y2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKiBAdHlwZSB7TWFyc2hhbEdldEludGVyZmFjZU9mfSAqL1xuY29uc3QgICAgICAgIGdldEludGVyZmFjZU9mPSh2YWwpPT57XG5pZihcbiFpc09iamVjdCh2YWwpfHxcbnZhbFtQQVNTX1NUWUxFXSE9PSdyZW1vdGFibGUnfHxcbiFjaGVja1JlbW90YWJsZSh2YWwpKVxue1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm4gZ2V0VGFnKHZhbCk7XG4gfTskaOKAjV9vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGVIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZToncmVtb3RhYmxlJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5jb25zdCB2YWxpZFR5cGU9XG4oaXNPYmplY3QoY2FuZGlkYXRlKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKSYmKFxuIWlzQXJyYXkoY2FuZGlkYXRlKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG5pZighdmFsaWRUeXBlKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nb2JqZWN0Jyl7XG4vKiBFdmVyeSBvd24gcHJvcGVydHkgKHJlZ2FyZGxlc3Mgb2YgZW51bWVyYWJpbGl0eSkqL1xuLyogbXVzdCBoYXZlIGEgZnVuY3Rpb24gdmFsdWUuKi9cbnJldHVybiBvd25LZXlzKGRlc2NzKS5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuLyogVHlwZWNhc3QgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuKGhhc093blByb3BlcnR5T2YoZGVzY3NbLyoqIEB0eXBlIHtzdHJpbmd9ICova2V5XSwndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxua2V5PT09U3ltYm9sLnRvU3RyaW5nVGFnJiZjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLGNoZWNrKXx8XG4oY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmtleSE9PVBBU1NfU1RZTEV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpO1xuXG4gfSk7XG4gfWVsc2UgaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdmdW5jdGlvbicpe1xuLyogRmFyIGZ1bmN0aW9ucyBjYW5ub3QgYmUgbWV0aG9kcywgYW5kIGNhbm5vdCBoYXZlIG1ldGhvZHMuKi9cbi8qIFRoZXkgbXVzdCBoYXZlIGV4YWN0bHkgZXhwZWN0ZWQgYC5uYW1lYCBhbmQgYC5sZW5ndGhgIHByb3BlcnRpZXMqL1xuY29uc3R7XG5uYW1lOm5hbWVEZXNjLFxubGVuZ3RoOmxlbmd0aERlc2MsXG4vKiBAdHMtaWdub3JlIFRTIGRvZXNuJ3QgbGlrZSBzeW1ib2xzIGFzIGNvbXB1dGVkIGluZGV4ZXM/PyovXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp0b1N0cmluZ1RhZ0Rlc2MsXG4uLi5yZXN0RGVzY3N9PVxuZGVzY3M7XG5jb25zdCByZXN0S2V5cz1vd25LZXlzKHJlc3REZXNjcyk7XG5yZXR1cm4oXG4obmFtZURlc2MmJnR5cGVvZiBuYW1lRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5sZW5ndGhEZXNjJiZ0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZT09PSdudW1iZXInfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG50b1N0cmluZ1RhZ0Rlc2M9PT11bmRlZmluZWR8fFxuKHR5cGVvZiB0b1N0cmluZ1RhZ0Rlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiZcblxuY2hlY2tJZmFjZSh0b1N0cmluZ1RhZ0Rlc2MudmFsdWUsY2hlY2spKSYmKFxucmVzdEtleXMubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9ucyB1bmV4cGVjdGVkIHByb3BlcnRpZXMgYmVzaWRlcyAubmFtZSBhbmQgLmxlbmd0aCAke3Jlc3RLZXlzfWApKSk7XG5cblxuIH1cbnJldHVybiByZWplY3QmJnJlamVjdChYIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWApO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUpPT5jaGVja1JlbW90YWJsZShjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlciksXG5cbmV2ZXJ5OihfcGFzc2FibGUsX2ZuKT0+dHJ1ZX0pOyRo4oCNX29uY2UuUmVtb3RhYmxlSGVscGVyKFJlbW90YWJsZUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA14k6Kmg8AAJoPAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGFzc2VydENoZWNrZXIsaGFzT3duUHJvcGVydHlPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0Zyb3plbixnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2V9IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuY29uc3Qga2V5cz1vd25LZXlzKHByKTtcblxuaWYoa2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuY29uc3QgdW5rbm93bktleXM9a2V5cy5maWx0ZXIoXG4oa2V5KT0+dHlwZW9mIGtleSE9PSdzeW1ib2wnfHwhaGFzT3duUHJvcGVydHlPZihQcm9taXNlLnByb3RvdHlwZSxrZXkpKTtcblxuXG5pZih1bmtub3duS2V5cy5sZW5ndGghPT0wKXtcbnJldHVybiByZWplY3QoXG5YIGAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWApO1xuXG4gfVxuXG4vKipcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBhbHNvIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuY29uc3QgY2hlY2tTYWZlQXN5bmNIb29rc0tleT0oa2V5KT0+e1xuY29uc3QgdmFsPXByW2tleV07XG5pZih2YWw9PT11bmRlZmluZWR8fHR5cGVvZiB2YWw9PT0nbnVtYmVyJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihcbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmXG52YWwhPT1udWxsJiZcbmlzRnJvemVuKHZhbCkmJlxuZ2V0UHJvdG90eXBlT2YodmFsKT09PU9iamVjdC5wcm90b3R5cGUpXG57XG5jb25zdCBzdWJLZXlzPW93bktleXModmFsKTtcbmlmKHN1YktleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmlmKFxuc3ViS2V5cy5sZW5ndGg9PT0xJiZcbnN1YktleXNbMF09PT0nZGVzdHJveWVkJyYmXG52YWwuZGVzdHJveWVkPT09ZmFsc2UpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIHJlamVjdChcblggYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpcyAke3ZhbH1gKTtcblxuIH07XG5cbnJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZUFzeW5jSG9va3NLZXkpO1xuIH07XG5cbi8qKlxuICogVW5kZXIgSGFyZGVuZWQgSlMgYSBwcm9taXNlIGlzIFwic2FmZVwiIGlmIGl0cyBgdGhlbmAgbWV0aG9kIGNhbiBiZSBjYWxsZWRcbiAqIHN5bmNocm9ub3VzbHkgd2l0aG91dCBnaXZpbmcgdGhlIHByb21pc2UgYW4gb3Bwb3J0dW5pdHkgZm9yIGFcbiAqIHJlZW50cmFuY3kgYXR0YWNrIGR1cmluZyB0aGF0IGNhbGwuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85XG4gKiByYWlzZXMgdGhlIGlzc3VlIG9mIHRlc3RpbmcgdGhhdCBhIHNwZWNpbWVuIGlzIGEgc2FmZSBwcm9taXNlXG4gKiBzdWNoIHRoYXQgdGhlIHRlc3QgYWxzbyBkb2VzIG5vdCBnaXZlIHRoZSBzcGVjaW1lbiBhXG4gKiByZWVudHJhbmN5IG9wcG9ydHVuaXR5LiBUaGF0IGlzIHdlbGwgYmV5b25kIHRoZSBhbWJpdGlvbiBoZXJlLlxuICogVE9ETyBUaG91Z2ggaWYgd2UgZmlndXJlIG91dCBhIG5pY2Ugc29sdXRpb24sIGl0IG1pZ2h0IGJlIGdvb2QgdG9cbiAqIHVzZSBpdCBoZXJlIGFzIHdlbGwuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZT0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbnJldHVybihcbihpc0Zyb3plbihwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkpJiYoXG5pc1Byb21pc2UocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApKSYmKFxuZ2V0UHJvdG90eXBlT2YocHIpPT09UHJvbWlzZS5wcm90b3R5cGV8fFxucmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IGluaGVyaXQgZnJvbSBQcm9taXNlLnByb3RvdHlwZTogJHtxKFxuZ2V0UHJvdG90eXBlT2YocHIpKVxuIH1gKSkmJlxuXG5jaGVja1Byb21pc2VPd25LZXlzKC8qKiBAdHlwZSB7UHJvbWlzZX0gKi9wcixjaGVjaykpO1xuXG4gfTtcbmhhcmRlbihjaGVja1NhZmVQcm9taXNlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuY29uc3QgICAgICAgIGlzU2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwciwoeCk9PngpOyRo4oCNX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuY29uc3QgICAgICAgIGFzc2VydFNhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRTYWZlUHJvbWlzZShhc3NlcnRTYWZlUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMcf1VBHEgAARxIAACUAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvc3ltYm9sLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBjb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogVGhlIHdlbGwga25vd24gc3ltYm9scyBhcmUgc3RhdGljIHN5bWJvbCB2YWx1ZXMgb24gdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yLlxuICovXG5jb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcz1uZXcgTWFwKFxub3duS2V5cyhTeW1ib2wpLlxuZmlsdGVyKFxuKG5hbWUpPT50eXBlb2YgbmFtZT09PSdzdHJpbmcnJiZ0eXBlb2YgU3ltYm9sW25hbWVdPT09J3N5bWJvbCcpLlxuXG5maWx0ZXIoKG5hbWUpPT57XG4vKiBAdHMtZXhwZWN0LWVycm9yIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovXG4hbmFtZS5zdGFydHNXaXRoKCdAQCcpfHxcbkZhaWwgYERpZCBub3QgZXhwZWN0IFN5bWJvbCB0byBoYXZlIGEgc3ltYm9sLXZhbHVlZCBwcm9wZXJ0eSBuYW1lIHN0YXJ0aW5nIHdpdGggXCJAQFwiICR7cShcbm5hbWUpXG4gfWA7XG5yZXR1cm4gdHJ1ZTtcbiB9KVxuLyogQHRzLWlnbm9yZSBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqLy5cbm1hcCgobmFtZSk9PltTeW1ib2xbbmFtZV0sIGBAQCR7bmFtZX1gXSkpO1xuXG5cbi8qKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3ltXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUGFzc2FibGVTeW1ib2w9KHN5bSk9PlxudHlwZW9mIHN5bT09PSdzeW1ib2wnJiYoXG50eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pPT09J3N0cmluZyd8fHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaOKAjV9vbmNlLmlzUGFzc2FibGVTeW1ib2woaXNQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oaXNQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG5pc1Bhc3NhYmxlU3ltYm9sKHN5bSl8fFxuRmFpbCBgT25seSByZWdpc3RlcmVkIHN5bWJvbHMgb3Igd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZTogJHtxKHN5bSl9YDskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qKlxuICogSWYgYHN5bWAgaXMgYSBwYXNzYWJsZSBzeW1ib2wsIHJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpc1xuICogc3ltYm9sLiBJZiBgc3ltYCBpcyBhIG5vbi1wYXNzYWJsZSBzeW1ib2wsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLiBTaW5jZSB0aGUgcmVnaXN0cmF0aW9uIHN0cmluZyBvZiBhIHJlZ2lzdGVyZWQgc3ltYm9sIGNhbiBiZSBhbnlcbiAqIHN0cmluZywgaWYgd2Ugc2ltcGx5IHVzZWQgdGhhdCB0byBpZGVudGlmeSB0aG9zZSBzeW1ib2xzLCB0aGVyZSB3b3VsZCBub3RcbiAqIGJlIGFueSByZW1haW5pbmcgc3RyaW5ncyBsZWZ0IG92ZXIgdG8gaWRlbnRpZnkgdGhlIHdlbGwta25vd24gc3ltYm9scy5cbiAqIEluc3RlYWQsIHdlIHJlc2VydmUgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgXCJAQFwiYCBmb3IgcHVycG9zZXMgb2YgdGhpc1xuICogZW5jb2RpbmcuIFdlIGlkZW50aWZ5IGEgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhcyBgU3ltYm9sLml0ZXJhdG9yYFxuICogYnkgcHJlZml4aW5nIHRoZSBwcm9wZXJ0eSBuYW1lIHdpdGggYFwiQEBcImAsIHN1Y2ggYXMgYFwiQEBpdGVyYXRvclwiYC5cbiAqIEZvciByZWdpc3RlcmVkIHN5bWJvbHMgd2hvc2UgbmFtZSBoYXBwZW5zIHRvIGJlZ2luIHdpdGggYFwiQEBcImAsIHN1Y2hcbiAqIGFzIGBTeW1ib2wuZm9yKCdAQGl0ZXJhdG9yJylgIG9yIGBTeW1ib2wuZm9yKCdAQGZvbycpYCwgd2UgaWRlbnRpZnlcbiAqIHRoZW0gYnkgcHJlZml4aW5nIHRoZW0gd2l0aCBhbiBleHRyYSBgXCJAQFwiYCwgc3VjaCBhc1xuICogYFwiQEBAQGl0ZXJhdG9yXCJgIG9yIGBcIkBAQEBmb29cImAuIChUaGlzIGlzIHRoZSBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nXG4gKiB0ZWNobmlxdWUuKVxuICpcbiAqIEBwYXJhbSB7c3ltYm9sfSBzeW1cbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovXG5jb25zdCAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sPShzeW0pPT57XG5jb25zdCBuYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKG5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHdlbGxLbm93blN5bWJvbE5hbWVzLmdldChzeW0pO1xuIH1cbmlmKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gYEBAJHtuYW1lfWA7XG4gfVxucmV0dXJuIG5hbWU7XG4gfTskaOKAjV9vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIElmIGBuYW1lYCBpcyBhIHN0cmluZyB0aGF0IGNvdWxkIGhhdmUgYmVlbiBwcm9kdWNlZCBieVxuICogYG5hbWVGb3JQYXNzYWJsZVN5bWJvbGAsIHJldHVybiB0aGUgc3ltYm9sIGFyZ3VtZW50IGl0IHdhcyBwcm9kdWNlZCB0b1xuICogcmVwcmVzZW50LlxuICpcbiAqICAgIElmIGBuYW1lYCBkb2VzIG5vdCBiZWdpbiB3aXRoIGBcIkBAXCJgLCB0aGVuIGp1c3QgdGhlIGNvcnJlc3BvbmRpbmdcbiAqICAgICAgcmVnaXN0ZXJlZCBzeW1ib2wsIGBTeW1ib2wuZm9yKG5hbWUpYC5cbiAqICAgIElmIGBuYW1lYCBpcyBgXCJAQFwiYCBmb2xsb3dlZCBieSBhIHdlbGwga25vd24gc3ltYm9sJ3MgcHJvcGVydHkgbmFtZSBvblxuICogICAgICBgU3ltYm9sYCBzdWNoIGBcIkBAaXRlcmF0b3JcIiwgcmV0dXJuIHRoYXQgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhc1xuICogICAgICBgU3ltYm9sLml0ZXJhdG9yYFxuICogICAgSWYgYG5hbWVgIGJlZ2lucyB3aXRoIGBcIkBAQEBcImAgaXQgZW5jb2RlcyB0aGUgcmVnaXN0ZXJlZCBzeW1ib2wgd2hvc2VcbiAqICAgICAgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpbnN0ZWFkLlxuICogICAgT3RoZXJ3aXNlLCBpZiBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGl0IG1heSBlbmNvZGUgYSByZWdpc3RlcmVkIHN5bWJvbFxuICogICAgICBmcm9tIGEgZnV0dXJlIHZlcnNpb24gb2YgSmF2YVNjcmlwdCwgYnV0IGl0IGlzIG5vdCBvbmUgd2UgY2FuIGRlY29kZVxuICogICAgICB5ZXQsIHNvIHRocm93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7c3ltYm9sPX1cbiAqL1xuY29uc3QgICAgICAgIHBhc3NhYmxlU3ltYm9sRm9yTmFtZT0obmFtZSk9PntcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBtYXRjaD1BdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuaWYobWF0Y2gpe1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuaWYoc3VmZml4LnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiB9ZWxzZXtcbmNvbnN0IHN5bT1TeW1ib2xbc3VmZml4XTtcbmlmKHR5cGVvZiBzeW09PT0nc3ltYm9sJyl7XG5yZXR1cm4gc3ltO1xuIH1cbkZhaWwgYFJlc2VydmVkIGZvciB3ZWxsIGtub3duIHN5bWJvbCAke3Eoc3VmZml4KX06ICR7cShuYW1lKX1gO1xuIH1cbiB9XG5yZXR1cm4gU3ltYm9sLmZvcihuYW1lKTtcbiB9OyRo4oCNX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlU3ltYm9sIjpbImlzUGFzc2FibGVTeW1ib2wiXSwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACW8XPv9BwAA/QcAACUAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvdGFnZ2VkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJUYWdnZWRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjaGVja1RhZ1JlY29yZCxQQVNTX1NUWUxFLGNoZWNrTm9ybWFsUHJvcGVydHksY2hlY2tQYXNzU3R5bGU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXSxbXCJjaGVja1Bhc3NTdHlsZVwiLCBbJGjigI1fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgVGFnZ2VkSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3RhZ2dlZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwndGFnZ2VkJyxjaGVjayksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwndGFnZ2VkJyxhc3NlcnRDaGVja2VyKTtcblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOl9sYWJlbERlc2MsXG5wYXlsb2FkOl9wYXlsb2FkRGVzYywvKiB2YWx1ZSBjaGVja2VkIGJ5IHJlY3Vyc2l2ZSB3YWxrIGF0IHRoZSBlbmQqL1xuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbkZhaWwgYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbmNoZWNrTm9ybWFsUHJvcGVydHkoY2FuZGlkYXRlLCdwYXlsb2FkJyx0cnVlLGFzc2VydENoZWNrZXIpO1xuXG4vKiBSZWN1cnNpdmVseSB2YWxpZGF0ZSB0aGF0IGVhY2ggbWVtYmVyIGlzIHBhc3NhYmxlLiovXG5wYXNzU3R5bGVPZlJlY3VyKGNhbmRpZGF0ZS5wYXlsb2FkKTtcbiB9fSk7JGjigI1fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHqgfmgSDQAAEg0AACkAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBhcnJheSwgQUtBIGEgXCJjb3B5QXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFyclxuICogQHJldHVybnMge2FyciBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuY29uc3QgaXNDb3B5QXJyYXk9KGFycik9PnBhc3NTdHlsZU9mKGFycik9PT0nY29weUFycmF5JzskaOKAjV9vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBBS0EgYVxuICogXCJjb3B5UmVjb3JkXCIgaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHJldHVybnMge3JlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cbmNvbnN0IGlzUmVjb3JkPShyZWNvcmQpPT5wYXNzU3R5bGVPZihyZWNvcmQpPT09J2NvcHlSZWNvcmQnOyRo4oCNX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHJlbW90YWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtyZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5jb25zdCBpc1JlbW90YWJsZT0ocmVtb3RhYmxlKT0+cGFzc1N0eWxlT2YocmVtb3RhYmxlKT09PSdyZW1vdGFibGUnOyRo4oCNX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0QXJyYXlcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFycmF5XG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZkFycmF5XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBhcnJheSBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydEFycmF5fSAqL1xuY29uc3QgYXNzZXJ0Q29weUFycmF5PShhcnJheSxvcHROYW1lT2ZBcnJheT0nQWxsZWdlZCBhcnJheScpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YoYXJyYXkpO1xucGFzc1N0eWxlPT09J2NvcHlBcnJheSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJheX0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBhcnJheSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVjb3JkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVjb3JkfSAqL1xuY29uc3QgYXNzZXJ0UmVjb3JkPShyZWNvcmQsb3B0TmFtZU9mUmVjb3JkPSdBbGxlZ2VkIHJlY29yZCcpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVjb3JkKTtcbnBhc3NTdHlsZT09PSdjb3B5UmVjb3JkJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVjb3JkKX0gJHtyZWNvcmR9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZW1vdGFibGVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZW1vdGFibGVcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZW1vdGFibGV9ICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGU9KFxucmVtb3RhYmxlLFxub3B0TmFtZU9mUmVtb3RhYmxlPSdBbGxlZ2VkIHJlbW90YWJsZScpPT5cbntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZW1vdGFibGUpO1xucGFzc1N0eWxlPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAClK+n3AJAABwCQAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCxtZW1vUmFjZTskaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLCBbJGjigI1fYSA9PiAobWVtb1JhY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlUHJvbWlzZUtpdFwifSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywgJ25hbWUnLCB7dmFsdWU6IFwicmFjZVByb21pc2VzXCJ9KTskaOKAjV9vbmNlLnJhY2VQcm9taXNlcyhyYWNlUHJvbWlzZXMpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2U9Z2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZXx8UHJvbWlzZTtcblxuLyoqXG4gKiBtYWtlUHJvbWlzZUtpdCgpIGJ1aWxkcyBhIFByb21pc2Ugb2JqZWN0LCBhbmQgcmV0dXJucyBhIHJlY29yZFxuICogY29udGFpbmluZyB0aGUgcHJvbWlzZSBpdHNlbGYsIGFzIHdlbGwgYXMgc2VwYXJhdGUgZmFjZXRzIGZvciByZXNvbHZpbmdcbiAqIGFuZCByZWplY3RpbmcgaXQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3NyYy90eXBlcy5qcycpLlByb21pc2VLaXQ8VD59XG4gKi9cbmZ1bmN0aW9uICAgICAgICBtYWtlUHJvbWlzZUtpdCgpe1xuY29uc3R7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9PW1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpO1xuXG5jb25zdCBwcm9taXNlPW5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxucmV0dXJuIGhhcmRlbih7cHJvbWlzZSxyZXNvbHZlLHJlamVjdH0pO1xuIH1cbmhhcmRlbihtYWtlUHJvbWlzZUtpdCk7XG5cbi8qIE5COiBBbm90aGVyIGltcGxlbWVudGF0aW9uIGZvciBQcm9taXNlLnJhY2Ugd291bGQgYmUgdG8gdXNlIHRoZSByZWxlYXNpbmcgZXhlY3V0b3IsKi9cbi8qIEhvd2V2ZXIgd2hpbGUgaXQgd291bGQgbm8gbG9uZ2VyIGxlYWsgdGhlIHJhY2VkIHByb21pc2Ugb2JqZWN0cyB0aGVtc2VsdmVzLCBpdCB3b3VsZCovXG4vKiBzdGlsbCBsZWFrIHJlYWN0aW9ucyBvbiB0aGUgbm9uLXJlc29sdmVkIHByb21pc2VzIGNvbnRlbmRpbmcgZm9yIHRoZSByYWNlLiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gICAgICAgIHJhY2VQcm9taXNlcyh2YWx1ZXMpe1xucmV0dXJuIGhhcmRlbihtZW1vUmFjZS5jYWxsKEJlc3RQaXBlbGluYWJsZVByb21pc2UsdmFsdWVzKSk7XG4gfVxuaGFyZGVuKHJhY2VQcm9taXNlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACIfYGs3wIAAN8CAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzUHJvbWlzZSwgJ25hbWUnLCB7dmFsdWU6IFwiaXNQcm9taXNlXCJ9KTskaOKAjV9vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOyAgIC8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBtYXliZVByb21pc2UgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHttYXliZVByb21pc2UgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuZnVuY3Rpb24gICAgICAgIGlzUHJvbWlzZShtYXliZVByb21pc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpPT09bWF5YmVQcm9taXNlO1xuIH1cbmhhcmRlbihpc1Byb21pc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHadN674SAAC+EgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBJbml0aWFsIHZlcnNpb24gYXV0aG9yZWQgYnkgQnJpYW4gS2ltOlxuaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8xNzQ2OSNpc3N1ZWNvbW1lbnQtNjg1MjE2Nzc3XG4gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbiBBbnlvbmUgaXMgZnJlZSB0byBjb3B5LCBtb2RpZnksIHB1Ymxpc2gsIHVzZSwgY29tcGlsZSwgc2VsbCwgb3JcbmRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgZWl0aGVyIGluIHNvdXJjZSBjb2RlIGZvcm0gb3IgYXMgYSBjb21waWxlZFxuYmluYXJ5LCBmb3IgYW55IHB1cnBvc2UsIGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwsIGFuZCBieSBhbnlcbm1lYW5zLlxuIEluIGp1cmlzZGljdGlvbnMgdGhhdCByZWNvZ25pemUgY29weXJpZ2h0IGxhd3MsIHRoZSBhdXRob3Igb3IgYXV0aG9yc1xub2YgdGhpcyBzb2Z0d2FyZSBkZWRpY2F0ZSBhbnkgYW5kIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlXG5zb2Z0d2FyZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0XG5vZiB0aGUgcHVibGljIGF0IGxhcmdlIGFuZCB0byB0aGUgZGV0cmltZW50IG9mIG91ciBoZWlycyBhbmRcbnN1Y2Nlc3NvcnMuIFdlIGludGVuZCB0aGlzIGRlZGljYXRpb24gdG8gYmUgYW4gb3ZlcnQgYWN0IG9mXG5yZWxpbnF1aXNobWVudCBpbiBwZXJwZXR1aXR5IG9mIGFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXNcbnNvZnR3YXJlIHVuZGVyIGNvcHlyaWdodCBsYXcuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Jcbk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLFxuQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SXG5PVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byA8aHR0cDovL3VubGljZW5zZS5vcmcvPlxuKi9cblxuXG5cblxuXG5cblxuY29uc3QgaXNPYmplY3Q9KHZhbHVlKT0+T2JqZWN0KHZhbHVlKT09PXZhbHVlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWZlcnJlZFxuICogQHByb3BlcnR5IHsodmFsdWU/OiBYaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FUmVmPFQ+ICkgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHByb3BlcnR5IHsoZXJyPzogYW55ICkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IG5ldmVyXG4gKiAgfCB7c2V0dGxlZDogZmFsc2UsIGRlZmVycmVkczogU2V0PERlZmVycmVkPn1cbiAqICB8IHtzZXR0bGVkOiB0cnVlLCBkZWZlcnJlZHM/OiB1bmRlZmluZWR9XG4gKiB9IFByb21pc2VNZW1vUmVjb3JkXG4gKi9cblxuLyogS2V5cyBhcmUgdGhlIHZhbHVlcyBwYXNzZWQgdG8gcmFjZSwgdmFsdWVzIGFyZSBhIHJlY29yZCBvZiBkYXRhIGNvbnRhaW5pbmcgYSovXG4vKiBzZXQgb2YgZGVmZXJyZWRzIGFuZCB3aGV0aGVyIHRoZSB2YWx1ZSBoYXMgc2V0dGxlZC4qL1xuLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgUHJvbWlzZU1lbW9SZWNvcmQ+fSAqL1xuY29uc3Qga25vd25Qcm9taXNlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZU1lbW9SZWNvcmQgfCB1bmRlZmluZWR9IHJlY29yZFxuICogQHJldHVybnMge1NldDxEZWZlcnJlZD59XG4gKi9cbmNvbnN0IG1hcmtTZXR0bGVkPShyZWNvcmQpPT57XG5pZighcmVjb3JkfHxyZWNvcmQuc2V0dGxlZCl7XG5yZXR1cm4gbmV3IFNldCgpO1xuIH1cblxuY29uc3R7ZGVmZXJyZWRzfT1yZWNvcmQ7XG5PYmplY3QuYXNzaWduKHJlY29yZCx7XG5kZWZlcnJlZHM6dW5kZWZpbmVkLFxuc2V0dGxlZDp0cnVlfSk7XG5cbk9iamVjdC5mcmVlemUocmVjb3JkKTtcbnJldHVybiBkZWZlcnJlZHM7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZU1lbW9SZWNvcmR9XG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQ9KHZhbHVlKT0+e1xuaWYoIWlzT2JqZWN0KHZhbHVlKSl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIGEgcHJpbWl0aXZlLCBhdHRlbXB0aW5nIHRvIHVzZSBpdCBhcyBhIGtleSBpbiB0aGUqL1xuLyogd2Vha21hcCB3b3VsZCB0aHJvdyBhbiBlcnJvci4gTHVja2lseSwgaXQgaXMgc2FmZSB0byBjYWxsKi9cbi8qIGBQcm9taXNlLnJlc29sdmUoY29udGVuZGVyKS50aGVuYCBvbiBhIHByaW1pdGl2ZSB2YWx1ZSBtdWx0aXBsZSB0aW1lcyovXG4vKiBiZWNhdXNlIHRoZSBwcm9taXNlIGZ1bGZpbGxzIGltbWVkaWF0ZWx5LiBTbyB3ZSBmYWtlIGEgc2V0dGxlZCByZWNvcmQuKi9cbnJldHVybiBoYXJkZW4oe3NldHRsZWQ6dHJ1ZX0pO1xuIH1cblxubGV0IHJlY29yZD1rbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbmlmKCFyZWNvcmQpe1xucmVjb3JkPXtkZWZlcnJlZHM6bmV3IFNldCgpLHNldHRsZWQ6ZmFsc2V9O1xua25vd25Qcm9taXNlcy5zZXQodmFsdWUscmVjb3JkKTtcbi8qIFRoaXMgY2FsbCB0byBgdGhlbmAgaGFwcGVucyBvbmNlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHZhbHVlLiovXG5Qcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oXG4odmFsKT0+e1xuZm9yKGNvbnN0e3Jlc29sdmV9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZXNvbHZlKHZhbCk7XG4gfVxuIH0sXG4oZXJyKT0+e1xuZm9yKGNvbnN0e3JlamVjdH1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlamVjdChlcnIpO1xuIH1cbiB9KTtcblxuIH1cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3R7cmFjZX09e1xuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSBbUD1Qcm9taXNlQ29uc3RydWN0b3JdXG4gKiBAdGhpcyB7UH1cbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5yYWNlKHZhbHVlcyl7XG5sZXQgZGVmZXJyZWQ7XG4vKiogQHR5cGUge1RbXX0gKi9cbmNvbnN0IGNhY2hlZFZhbHVlcz1bXTtcbmNvbnN0IEM9dGhpcztcbmNvbnN0IHJlc3VsdD1uZXcgQygocmVzb2x2ZSxyZWplY3QpPT57XG5kZWZlcnJlZD17cmVzb2x2ZSxyZWplY3R9O1xuZm9yKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyl7XG5jYWNoZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG5jb25zdHtzZXR0bGVkLGRlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihzZXR0bGVkKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgc2V0dGxlZCAoaW5jbHVkaW5nIHByaW1pdGl2ZXMpLCBpdCBpcyBzYWZlKi9cbi8qIHRvIGNhbGwgYFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbmAgb24gaXQuKi9cbkMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLHJlamVjdCk7XG4gfWVsc2V7XG5kZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuXG4vKiBUaGUgZmluYWxseSBjYWxsYmFjayBleGVjdXRlcyB3aGVuIGFueSB2YWx1ZSBzZXR0bGVzLCBwcmV2ZW50aW5nIGFueSBvZiovXG4vKiB0aGUgdW5yZXNvbHZlZCB2YWx1ZXMgZnJvbSByZXRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIHJlc29sdmVkIHZhbHVlLiovXG5yZXR1cm4gcmVzdWx0LmZpbmFsbHkoKCk9PntcbmZvcihjb25zdCB2YWx1ZSBvZiBjYWNoZWRWYWx1ZXMpe1xuY29uc3R7ZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKGRlZmVycmVkcyl7XG5kZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuIH19OyRo4oCNX29uY2UucmFjZShyYWNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANNDsO5pBwAAaQcAADUAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvciBUaGUgcHJvbWlzZSBleGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKSBidWlsZHMgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIHdoaWNoIGRyb3AgcmVmZXJlbmNlc1xuICogdG8gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBnYXRoZXJlZCBmcm9tIGFuIGV4ZWN1dG9yIHRvIGJlIHVzZWQgd2l0aCBhXG4gKiBwcm9taXNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UGljazxYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPiwgJ3Jlc29sdmUnIHwgJ3JlamVjdCc+ICYgeyBleGVjdXRvcjogUHJvbWlzZUV4ZWN1dG9yPFQ+fX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKCh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVzb2x2ZTtcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgocmVhc29uOiB1bmtub3duKSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlamVjdDtcblxuLyoqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD59IHZhbHVlICovXG5jb25zdCByZXNvbHZlPSh2YWx1ZSk9PntcbmlmKGludGVybmFsUmVzb2x2ZSl7XG5pbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PW51bGwpO1xuIH1cbiB9O1xuXG4vKiogQHBhcmFtIHt1bmtub3dufSByZWFzb24gKi9cbmNvbnN0IHJlamVjdD0ocmVhc29uKT0+e1xuaWYoaW50ZXJuYWxSZWplY3Qpe1xuaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlamVjdD09PW51bGwpO1xuIH1cbiB9O1xuXG5jb25zdCBleGVjdXRvcj0ocmVzLHJlaik9PntcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT11bmRlZmluZWQmJmludGVybmFsUmVqZWN0PT09dW5kZWZpbmVkKTtcbmludGVybmFsUmVzb2x2ZT1yZXM7XG5pbnRlcm5hbFJlamVjdD1yZWo7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9KTtcbiB9OyRo4oCNX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACYAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACSDS/HdgIAAHYCAAAaAAAAQGVuZG8vemlwLXYwLjIuMzEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvcmVhZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy93cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIiwicmVhZFppcCIsIndyaXRlWmlwIiwid3JpdGVaaXAiXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL3JlYWRlci5qc1wiLCBbXV0sW1wiLi9zcmMvd3JpdGVyLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL3JlYWRlci5qcyI6W1siWmlwUmVhZGVyIiwiWmlwUmVhZGVyIl0sWyJyZWFkWmlwIiwicmVhZFppcCJdXSwiLi9zcmMvd3JpdGVyLmpzIjpbWyJaaXBXcml0ZXIiLCJaaXBXcml0ZXIiXSxbIndyaXRlWmlwIiwid3JpdGVaaXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJqQuw3XFwAA1xcAACYAAABAZW5kby96aXAtdjAuMi4zMS9zcmMvYnVmZmVyLXJlYWRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyUmVhZGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCdWZmZXJSZWFkZXJTdGF0ZVxuICogQHByb3BlcnR5IHtVaW50OEFycmF5fSBieXRlc1xuICogQHByb3BlcnR5IHtEYXRhVmlld30gZGF0YVxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxlbmd0aFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGluZGV4XG4gKiBAcHJvcGVydHkge251bWJlcn0gb2Zmc2V0XG4gKi9cblxuLyoqIEB0eXBlIHtXZWFrTWFwPEJ1ZmZlclJlYWRlciwgQnVmZmVyUmVhZGVyU3RhdGU+fSAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkcz1uZXcgV2Vha01hcCgpO1xuXG4vKiogQHR5cGUgeyhidWZmZXJSZWFkZXI6IEJ1ZmZlclJlYWRlcikgPT4gQnVmZmVyUmVhZGVyU3RhdGV9ICovXG5jb25zdCBwcml2YXRlRmllbGRzR2V0PXByaXZhdGVGaWVsZHMuZ2V0LmJpbmQocHJpdmF0ZUZpZWxkcyk7XG5cbmNsYXNzICAgICAgICBCdWZmZXJSZWFkZXJ7XG4vKipcbiAqIEBwYXJhbSB7QXJyYXlCdWZmZXJ9IGJ1ZmZlclxuICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcil7XG5jb25zdCBieXRlcz1uZXcgVWludDhBcnJheShidWZmZXIpO1xuY29uc3QgZGF0YT1uZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbnByaXZhdGVGaWVsZHMuc2V0KHRoaXMse1xuYnl0ZXMsXG5kYXRhLFxubGVuZ3RoOmJ5dGVzLmxlbmd0aCxcbmluZGV4OjAsXG5vZmZzZXQ6MH0pO1xuXG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgICBnZXQgbGVuZ3RoKCl7XG5yZXR1cm4gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKS5sZW5ndGg7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgIGdldCBpbmRleCgpe1xucmV0dXJuIHByaXZhdGVGaWVsZHNHZXQodGhpcykuaW5kZXg7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICovXG4gICAgICAgICBzZXQgaW5kZXgoaW5kZXgpe1xudGhpcy5zZWVrKGluZGV4KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICovXG4gICAgICAgICAgc2V0IG9mZnNldChvZmZzZXQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZihvZmZzZXQ+ZmllbGRzLmRhdGEuYnl0ZUxlbmd0aCl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzZXQgb2Zmc2V0IGJleW9uZCBsZW5ndGggb2YgdW5kZXJseWluZyBkYXRhJyk7XG4gfVxuaWYob2Zmc2V0PDApe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2V0IG5lZ2F0aXZlIG9mZnNldCcpO1xuIH1cbmZpZWxkcy5vZmZzZXQ9b2Zmc2V0O1xuZmllbGRzLmxlbmd0aD1maWVsZHMuZGF0YS5ieXRlTGVuZ3RoLWZpZWxkcy5vZmZzZXQ7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybnMge2Jvb2xlYW59IHdoZXRoZXIgdGhlIHJlYWQgaGVhZCBjYW4gbW92ZSB0byB0aGUgZ2l2ZW4gYWJzb2x1dGVcbiAqIGluZGV4LlxuICovXG4gICAgICAgY2FuU2VlayhpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnJldHVybiBpbmRleD49MCYmZmllbGRzLm9mZnNldCtpbmRleDw9ZmllbGRzLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IHRoZSBpbmRleCB0byBjaGVjay5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGJvdW5kcy5cbiAqL1xuICAgICAgICAgICAgIGFzc2VydENhblNlZWsoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZighdGhpcy5jYW5TZWVrKGluZGV4KSl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYEVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gJHtmaWVsZHMubGVuZ3RofSwgYXNrZWQgaW5kZXggJHtpbmRleH1gKTtcblxuIH1cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJucyB7bnVtYmVyfSBwcmlvciBpbmRleFxuICovXG4gICAgc2VlayhpbmRleCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmNvbnN0IHJlc3RvcmU9ZmllbGRzLmluZGV4O1xudGhpcy5hc3NlcnRDYW5TZWVrKGluZGV4KTtcbmZpZWxkcy5pbmRleD1pbmRleDtcbnJldHVybiByZXN0b3JlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICBwZWVrKHNpemUpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4vKiBDbGFtcCBzaXplLiovXG5zaXplPU1hdGgubWF4KDAsTWF0aC5taW4oZmllbGRzLmxlbmd0aC1maWVsZHMuaW5kZXgsc2l6ZSkpO1xuaWYoc2l6ZT09PTApe1xuLyogaW4gSUUxMCwgd2hlbiB1c2luZyBzdWJhcnJheShpZHgsIGlkeCksIHdlIGdldCB0aGUgYXJyYXkgWzB4MDBdIGluc3RlYWQgb2YgW10uKi9cbnJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiB9XG5jb25zdCByZXN1bHQ9ZmllbGRzLmJ5dGVzLnN1YmFycmF5KFxuZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXgsXG5maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleCtzaXplKTtcblxucmV0dXJuIHJlc3VsdDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICovXG4gICAgICAgY2FuUmVhZChvZmZzZXQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5yZXR1cm4gdGhpcy5jYW5TZWVrKGZpZWxkcy5pbmRleCtvZmZzZXQpO1xuIH1cblxuLyoqXG4gKiBDaGVjayB0aGF0IHRoZSBvZmZzZXQgd2lsbCBub3QgZ28gdG9vIGZhci5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IHRoZSBhZGRpdGlvbmFsIG9mZnNldCB0byBjaGVjay5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMuXG4gKi9cbiAgICAgICAgICAgICBhc3NlcnRDYW5SZWFkKG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuU2VlayhmaWVsZHMuaW5kZXgrb2Zmc2V0KTtcbiB9XG5cbi8qKlxuICogR2V0IHJhdyBkYXRhIHdpdGhvdXQgY29udmVyc2lvbiwgPHNpemU+IGJ5dGVzLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fSB0aGUgcmF3IGRhdGEuXG4gKi9cbiAgICByZWFkKHNpemUpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG50aGlzLmFzc2VydENhblJlYWQoc2l6ZSk7XG5jb25zdCByZXN1bHQ9dGhpcy5wZWVrKHNpemUpO1xuZmllbGRzLmluZGV4Kz1zaXplO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgcmVhZFVpbnQ4KCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuUmVhZCgxKTtcbmNvbnN0IGluZGV4PWZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4O1xuY29uc3QgdmFsdWU9ZmllbGRzLmRhdGEuZ2V0VWludDgoaW5kZXgpO1xuZmllbGRzLmluZGV4Kz0xO1xucmV0dXJuIHZhbHVlO1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICogQHBhcmFtIHtib29sZWFuPX0gbGl0dGxlRW5kaWFuXG4gKi9cbiAgICAgICAgICByZWFkVWludDE2KGxpdHRsZUVuZGlhbil7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuUmVhZCgyKTtcbmNvbnN0IGluZGV4PWZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4O1xuY29uc3QgdmFsdWU9ZmllbGRzLmRhdGEuZ2V0VWludDE2KGluZGV4LGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTI7XG5yZXR1cm4gdmFsdWU7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgIHJlYWRVaW50MzIobGl0dGxlRW5kaWFuKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5SZWFkKDQpO1xuY29uc3QgaW5kZXg9ZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXg7XG5jb25zdCB2YWx1ZT1maWVsZHMuZGF0YS5nZXRVaW50MzIoaW5kZXgsbGl0dGxlRW5kaWFuKTtcbmZpZWxkcy5pbmRleCs9NDtcbnJldHVybiB2YWx1ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICBieXRlQXQoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5yZXR1cm4gZmllbGRzLmJ5dGVzW2ZpZWxkcy5vZmZzZXQraW5kZXhdO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0XG4gKi9cbiAgICBza2lwKG9mZnNldCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuc2VlayhmaWVsZHMuaW5kZXgrb2Zmc2V0KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBleHBlY3RlZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgIGV4cGVjdChleHBlY3RlZCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmlmKCF0aGlzLm1hdGNoQXQoZmllbGRzLmluZGV4LGV4cGVjdGVkKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuZmllbGRzLmluZGV4Kz1leHBlY3RlZC5sZW5ndGg7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGV4cGVjdGVkXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIG1hdGNoQXQoaW5kZXgsZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZihpbmRleCtleHBlY3RlZC5sZW5ndGg+ZmllbGRzLmxlbmd0aHx8aW5kZXg8MCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuZm9yKGxldCBpPTA7aTxleHBlY3RlZC5sZW5ndGg7aSs9MSl7XG5pZihleHBlY3RlZFtpXSE9PXRoaXMuYnl0ZUF0KGluZGV4K2kpKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqL1xuICAgICAgYXNzZXJ0KGV4cGVjdGVkKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuaWYoIXRoaXMuZXhwZWN0KGV4cGVjdGVkKSl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYEV4cGVjdGVkICR7cShleHBlY3RlZCl9IGF0ICR7ZmllbGRzLmluZGV4fSwgZ290ICR7dGhpcy5wZWVrKFxuZXhwZWN0ZWQubGVuZ3RoKVxuIH1gKTtcblxuIH1cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBleHBlY3RlZFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICBmaW5kTGFzdChleHBlY3RlZCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmxldCBpbmRleD1maWVsZHMubGVuZ3RoLWV4cGVjdGVkLmxlbmd0aDtcbndoaWxlKGluZGV4Pj0wJiYhdGhpcy5tYXRjaEF0KGluZGV4LGV4cGVjdGVkKSl7XG5pbmRleC09MTtcbiB9XG5yZXR1cm4gaW5kZXg7XG4gfX0kaOKAjV9vbmNlLiBCdWZmZXJSZWFkZXIoQnVmZmVyUmVhZGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJSZWFkZXIiOlsiQnVmZmVyUmVhZGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH+1I7fpEAAA6RAAACYAAABAZW5kby96aXAtdjAuMi4zMS9zcmMvYnVmZmVyLXdyaXRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyV3JpdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxCdWZmZXJXcml0ZXIsIHtcbiAqICAgbGVuZ3RoOiBudW1iZXIsXG4gKiAgIGluZGV4OiBudW1iZXIsXG4gKiAgIGJ5dGVzOiBVaW50OEFycmF5LFxuICogICBkYXRhOiBEYXRhVmlldyxcbiAqICAgY2FwYWNpdHk6IG51bWJlcixcbiAqIH0+fVxuICovXG5jb25zdCBwcml2YXRlRmllbGRzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHNlbGZcbiAqL1xuY29uc3QgZ2V0UHJpdmF0ZUZpZWxkcz0oc2VsZik9PntcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzLmdldChzZWxmKTtcbmlmKCFmaWVsZHMpe1xudGhyb3cgbmV3IEVycm9yKCdCdWZmZXJXcml0ZXIgZmllbGRzIGFyZSBub3QgaW5pdGlhbGl6ZWQnKTtcbiB9XG5yZXR1cm4gZmllbGRzO1xuIH07XG5cbmNvbnN0IGFzc2VydE5hdE51bWJlcj0obik9PntcbmlmKE51bWJlci5pc1NhZmVJbnRlZ2VyKG4pJiYvKiogQHR5cGUge251bWJlcn0gKi9uPj0wKXtcbnJldHVybjtcbiB9XG50aHJvdyBUeXBlRXJyb3IoIGBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIGdvdCAke259YCk7XG4gfTtcblxuY2xhc3MgICAgICAgIEJ1ZmZlcldyaXRlcntcbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgIGdldCBsZW5ndGgoKXtcbnJldHVybiBnZXRQcml2YXRlRmllbGRzKHRoaXMpLmxlbmd0aDtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgICAgZ2V0IGluZGV4KCl7XG5yZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5pbmRleDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICAgICAgIHNldCBpbmRleChpbmRleCl7XG50aGlzLnNlZWsoaW5kZXgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcj19IGNhcGFjaXR5XG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoY2FwYWNpdHk9MTYpe1xuY29uc3QgYnl0ZXM9bmV3IFVpbnQ4QXJyYXkoY2FwYWNpdHkpO1xuY29uc3QgZGF0YT1uZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbnByaXZhdGVGaWVsZHMuc2V0KHRoaXMse1xuYnl0ZXMsXG5kYXRhLFxuaW5kZXg6MCxcbmxlbmd0aDowLFxuY2FwYWNpdHl9KTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gcmVxdWlyZWRcbiAqL1xuICAgICAgICAgICAgIGVuc3VyZUNhblNlZWsocmVxdWlyZWQpe1xuYXNzZXJ0TmF0TnVtYmVyKHJlcXVpcmVkKTtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xubGV0IGNhcGFjaXR5PWZpZWxkcy5jYXBhY2l0eTtcbndoaWxlKGNhcGFjaXR5PHJlcXVpcmVkKXtcbmNhcGFjaXR5Kj0yO1xuIH1cbmNvbnN0IGJ5dGVzPW5ldyBVaW50OEFycmF5KGNhcGFjaXR5KTtcbmNvbnN0IGRhdGE9bmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlcik7XG5ieXRlcy5zZXQoZmllbGRzLmJ5dGVzLnN1YmFycmF5KDAsZmllbGRzLmxlbmd0aCkpO1xuZmllbGRzLmJ5dGVzPWJ5dGVzO1xuZmllbGRzLmRhdGE9ZGF0YTtcbmZpZWxkcy5jYXBhY2l0eT1jYXBhY2l0eTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKi9cbiAgICBzZWVrKGluZGV4KXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5TZWVrKGluZGV4KTtcbmZpZWxkcy5pbmRleD1pbmRleDtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICovXG4gICAgICAgICAgICAgIGVuc3VyZUNhbldyaXRlKHNpemUpe1xuYXNzZXJ0TmF0TnVtYmVyKHNpemUpO1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhblNlZWsoZmllbGRzLmluZGV4K3NpemUpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKi9cbiAgICAgd3JpdGUoYnl0ZXMpe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKGJ5dGVzLmJ5dGVMZW5ndGgpO1xuZmllbGRzLmJ5dGVzLnNldChieXRlcyxmaWVsZHMuaW5kZXgpO1xuZmllbGRzLmluZGV4Kz1ieXRlcy5ieXRlTGVuZ3RoO1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydFxuICogQHBhcmFtIHtudW1iZXJ9IGVuZFxuICovXG4gICAgICAgICB3cml0ZUNvcHkoc3RhcnQsZW5kKXtcbmFzc2VydE5hdE51bWJlcihzdGFydCk7XG5hc3NlcnROYXROdW1iZXIoZW5kKTtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuY29uc3Qgc2l6ZT1lbmQtc3RhcnQ7XG50aGlzLmVuc3VyZUNhbldyaXRlKHNpemUpO1xuZmllbGRzLmJ5dGVzLmNvcHlXaXRoaW4oZmllbGRzLmluZGV4LHN0YXJ0LGVuZCk7XG5maWVsZHMuaW5kZXgrPXNpemU7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKi9cbiAgICAgICAgICB3cml0ZVVpbnQ4KHZhbHVlKXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5Xcml0ZSgxKTtcbmZpZWxkcy5kYXRhLnNldFVpbnQ4KGZpZWxkcy5pbmRleCx2YWx1ZSk7XG5maWVsZHMuaW5kZXgrPTE7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgICB3cml0ZVVpbnQxNih2YWx1ZSxsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKDIpO1xuY29uc3QgaW5kZXg9ZmllbGRzLmluZGV4O1xuZmllbGRzLmRhdGEuc2V0VWludDE2KGluZGV4LHZhbHVlLGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTI7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBsaXR0bGVFbmRpYW5cbiAqL1xuICAgICAgICAgICB3cml0ZVVpbnQzMih2YWx1ZSxsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG50aGlzLmVuc3VyZUNhbldyaXRlKDQpO1xuY29uc3QgaW5kZXg9ZmllbGRzLmluZGV4O1xuZmllbGRzLmRhdGEuc2V0VWludDMyKGluZGV4LHZhbHVlLGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTQ7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXI9fSBiZWdpblxuICogQHBhcmFtIHtudW1iZXI9fSBlbmRcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG4gICAgICAgIHN1YmFycmF5KGJlZ2luLGVuZCl7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnJldHVybiBmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCxmaWVsZHMubGVuZ3RoKS5zdWJhcnJheShiZWdpbixlbmQpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcj19IGJlZ2luXG4gKiBAcGFyYW0ge251bWJlcj19IGVuZFxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICAgc2xpY2UoYmVnaW4sZW5kKXtcbnJldHVybiB0aGlzLnN1YmFycmF5KGJlZ2luLGVuZCkuc2xpY2UoKTtcbiB9fSRo4oCNX29uY2UuIEJ1ZmZlcldyaXRlcihCdWZmZXJXcml0ZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJ1ZmZlcldyaXRlciI6WyJCdWZmZXJXcml0ZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoKCVXcMBAADDAQAAJAAAAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9jb21wcmVzc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiU1RPUkUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKiBTVE9SRSBpcyB0aGUgbWFnaWMgbnVtYmVyIGZvciBcIm5vdCBjb21wcmVzc2VkXCIuKi9cbmNvbnN0ICAgICAgICBTVE9SRT0wOyRo4oCNX29uY2UuU1RPUkUoU1RPUkUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlNUT1JFIjpbIlNUT1JFIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB/iuys/BQAAPwUAAB4AAABAZW5kby96aXAtdjAuMi4zMS9zcmMvY3JjMzIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImNyYzMyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNyYzMyLCAnbmFtZScsIHt2YWx1ZTogXCJjcmMzMlwifSk7JGjigI1fb25jZS5jcmMzMihjcmMzMik7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBgbWFrZVRhYmxlYCBhbmQgYGNyYzMyYCBjb21lIGZyb20gYHBha29gLCBmcm9tXG4gKiBwYWtvL2xpYi96bGliL2NyYzMyLmpzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgc2VlIHBha29cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vKiBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZSovXG4vKipcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fVxuICovXG5mdW5jdGlvbiBtYWtlVGFibGUoKXtcbmxldCBjO1xuY29uc3QgdGFibGU9W107XG5cbmZvcihsZXQgbj0wO248MjU2O24rPTEpe1xuYz1uO1xuZm9yKGxldCBrPTA7azw4O2srPTEpe1xuYz1jJjE/MHhlZGI4ODMyMF5jPj4+MTpjPj4+MTtcbiB9XG50YWJsZVtuXT1jO1xuIH1cblxucmV0dXJuIHRhYmxlO1xuIH1cblxuLyogSW5pdGlhbGl6ZSBhIHRhYmxlIG9mIDI1NiBzaWduZWQgMzIgYml0IGludGVnZXJzLiovXG5jb25zdCB0YWJsZT1tYWtlVGFibGUoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGJ5dGVzXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEBwYXJhbSB7bnVtYmVyfSBjcmNcbiAqL1xuZnVuY3Rpb24gICAgICAgIGNyYzMyKGJ5dGVzLGxlbmd0aD1ieXRlcy5sZW5ndGgsaW5kZXg9MCxjcmM9MCl7XG5jb25zdCBlbmQ9aW5kZXgrbGVuZ3RoO1xuXG5jcmNePS0xO1xuXG5mb3IobGV0IGk9aW5kZXg7aTxlbmQ7aSs9MSl7XG5jcmM9Y3JjPj4+OF50YWJsZVsoY3JjXmJ5dGVzW2ldKSYweGZmXTtcbiB9XG5cbnJldHVybihjcmNeLTEpPj4+MDtcbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY3JjMzIiOlsiY3JjMzIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAF8hS7iQ0AAAkNAAAJgAAAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9mb3JtYXQtcmVhZGVyLmpzeyJpbXBvcnRzIjpbIi4vY29tcHJlc3Npb24uanMiLCIuL2NyYzMyLmpzIiwiLi9zaWduYXR1cmUuanMiLCIuL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsicmVhZFppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBjcmMzMixzaWduYXR1cmUsY29tcHJlc3Npb247JGjigI1faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIiwgWyRo4oCNX2EgPT4gKGNyYzMyID0gJGjigI1fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChzaWduYXR1cmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoY29tcHJlc3Npb24gPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmVhZFppcCwgJ25hbWUnLCB7dmFsdWU6IFwicmVhZFppcFwifSk7JGjigI1fb25jZS5yZWFkWmlwKHJlYWRaaXApOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBxLCBhcyBpbiBxdW90ZSwgZm9yIHF1b3Rpbmcgc3RyaW5ncyBpbiBlcnJvcnMqL1xuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgTUFYX1ZBTFVFXzE2QklUUz02NTUzNTtcbmNvbnN0IE1BWF9WQUxVRV8zMkJJVFM9NDI5NDk2NzI5NTtcblxuY29uc3QgdGV4dERlY29kZXI9bmV3IFRleHREZWNvZGVyKCk7XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGJpdEZsYWdcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc0VuY3J5cHRlZChiaXRGbGFnKXtcbnJldHVybihiaXRGbGFnJjB4MDAwMSk9PT0weDAwMDE7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtEYXRlfVxuICogQHNlZSBodHRwOi8vd3d3LmRlbG9yaWUuY29tL2RqZ3BwL2RvYy9yYmludGVyL2l0LzY1LzE2Lmh0bWxcbiAqIEBzZWUgaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvcmJpbnRlci9pdC82Ni8xNi5odG1sXG4gKi9cbmZ1bmN0aW9uIHJlYWREb3NEYXRlVGltZShyZWFkZXIpe1xuY29uc3QgZG9zVGltZT1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbnJldHVybiBuZXcgRGF0ZShcbkRhdGUuVVRDKFxuKGRvc1RpbWU+PjI1JjB4N2YpKzE5ODAsLyogeWVhciovXG4oZG9zVGltZT4+MjEmMHgwZiktMSwvKiBtb250aCovXG5kb3NUaW1lPj4xNiYweDFmLC8qIGRheSovXG5kb3NUaW1lPj4xMSYweDFmLC8qIGhvdXIqL1xuZG9zVGltZT4+NSYweDNmLC8qIG1pbnV0ZSovXG4oZG9zVGltZSYweDFmKTw8MS8qIHNlY29uZCovKSk7XG5cblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7QXJjaGl2ZUhlYWRlcnN9XG4gKi9cbmZ1bmN0aW9uIHJlYWRIZWFkZXJzKHJlYWRlcil7XG5yZXR1cm57XG52ZXJzaW9uTmVlZGVkOnJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuYml0RmxhZzpyZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbmNvbXByZXNzaW9uTWV0aG9kOnJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuZGF0ZTpyZWFkRG9zRGF0ZVRpbWUocmVhZGVyKSxcbmNyYzMyOnJlYWRlci5yZWFkVWludDMyKHRydWUpLFxuY29tcHJlc3NlZExlbmd0aDpyZWFkZXIucmVhZFVpbnQzMih0cnVlKSxcbnVuY29tcHJlc3NlZExlbmd0aDpyZWFkZXIucmVhZFVpbnQzMih0cnVlKX07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0NlbnRyYWxGaWxlUmVjb3JkfVxuICovXG5mdW5jdGlvbiByZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKXtcbmNvbnN0IHZlcnNpb249cmVhZGVyLnJlYWRVaW50OCgpO1xuY29uc3QgbWFkZUJ5PXJlYWRlci5yZWFkVWludDgoKTtcbmNvbnN0IGhlYWRlcnM9cmVhZEhlYWRlcnMocmVhZGVyKTtcbmNvbnN0IG5hbWVMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBleHRyYUZpZWxkc0xlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGNvbW1lbnRMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBkaXNrTnVtYmVyU3RhcnQ9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZXh0ZXJuYWxGaWxlQXR0cmlidXRlcz1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbmNvbnN0IGZpbGVTdGFydD1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcblxuY29uc3QgbmFtZT1yZWFkZXIucmVhZChuYW1lTGVuZ3RoKTtcbi8qIFRPRE8gcmVhZCBleHRyYSBmaWVsZHMsIHBhcnRpY3VsYXJseSBaaXA2NCovXG5yZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5cbmlmKGhlYWRlcnMudW5jb21wcmVzc2VkTGVuZ3RoPT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuaWYoaGVhZGVycy5jb21wcmVzc2VkTGVuZ3RoPT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuaWYoZmlsZVN0YXJ0PT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuaWYoZGlza051bWJlclN0YXJ0PT09TUFYX1ZBTFVFXzMyQklUUyl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gfVxuXG5jb25zdCBjb21tZW50PXJlYWRlci5yZWFkKGNvbW1lbnRMZW5ndGgpO1xuXG5yZXR1cm57XG5uYW1lLFxudmVyc2lvbixcbm1hZGVCeSxcbi4uLmhlYWRlcnMsXG5kaXNrTnVtYmVyU3RhcnQsXG5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzLFxuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyxcbmZpbGVTdGFydCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEBwYXJhbSB7Q2VudHJhbERpcmVjdG9yeUxvY2F0b3J9IGxvY2F0b3JcbiAqIEByZXR1cm5zIHtBcnJheTxDZW50cmFsRmlsZVJlY29yZD59XG4gKi9cbmZ1bmN0aW9uIHJlYWRDZW50cmFsRGlyZWN0b3J5KHJlYWRlcixsb2NhdG9yKXtcbmNvbnN0e2NlbnRyYWxEaXJlY3RvcnlPZmZzZXQsY2VudHJhbERpcmVjdG9yeVJlY29yZHN9PWxvY2F0b3I7XG5yZWFkZXIuc2VlayhjZW50cmFsRGlyZWN0b3J5T2Zmc2V0KTtcblxuY29uc3QgZW50cmllcz1bXTtcbndoaWxlKHJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpKXtcbmNvbnN0IGVudHJ5PXJlYWRDZW50cmFsRmlsZUhlYWRlcihyZWFkZXIpO1xuZW50cmllcy5wdXNoKGVudHJ5KTtcbiB9XG5cbmlmKGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzIT09ZW50cmllcy5sZW5ndGgpe1xuLyogV2UgZXhwZWN0ZWQgc29tZSByZWNvcmRzIGJ1dCBjb3VsZG4ndCBmaW5kIEFOWS4qL1xuLyogVGhpcyBpcyByZWFsbHkgc3VzcGljaW91cywgYXMgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuKi9cbnRocm93IG5ldyBFcnJvcihcbiBgQ29ycnVwdGVkIHppcCBvciBidWc6IGV4cGVjdGVkICR7Y2VudHJhbERpcmVjdG9yeVJlY29yZHN9IHJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdCAke2VudHJpZXMubGVuZ3RofWApO1xuXG4gfVxuXG5yZXR1cm4gZW50cmllcztcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0xvY2FsRmlsZVJlY29yZH1cbiAqL1xuZnVuY3Rpb24gcmVhZEZpbGUocmVhZGVyKXtcbnJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbmNvbnN0IGhlYWRlcnM9cmVhZEhlYWRlcnMocmVhZGVyKTtcbmNvbnN0IG5hbWVMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBleHRyYUZpZWxkc0xlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IG5hbWU9cmVhZGVyLnJlYWQobmFtZUxlbmd0aCk7XG5yZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5jb25zdCBjb250ZW50PXJlYWRlci5yZWFkKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCk7XG5yZXR1cm57bmFtZSwuLi5oZWFkZXJzLGNvbnRlbnR9O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcGFyYW0ge0FycmF5PENlbnRyYWxGaWxlUmVjb3JkPn0gcmVjb3Jkc1xuICogQHJldHVybnMge0FycmF5PExvY2FsRmlsZVJlY29yZD59XG4gKi9cbmZ1bmN0aW9uIHJlYWRMb2NhbEZpbGVzKHJlYWRlcixyZWNvcmRzKXtcbmNvbnN0IGZpbGVzPVtdO1xuZm9yKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKXtcbnJlYWRlci5zZWVrKHJlY29yZC5maWxlU3RhcnQpO1xuY29uc3QgZmlsZT1yZWFkRmlsZShyZWFkZXIpO1xuZmlsZXMucHVzaChmaWxlKTtcbiB9XG5yZXR1cm4gZmlsZXM7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtDZW50cmFsRGlyZWN0b3J5TG9jYXRvcn1cbiAqL1xuZnVuY3Rpb24gcmVhZEJsb2NrRW5kT2ZDZW50cmFsKHJlYWRlcil7XG5pZighcmVhZGVyLmV4cGVjdChzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSl7XG50aHJvdyBuZXcgRXJyb3IoXG4nQ29ycnVwdCB6aXAgZmlsZSwgb3IgemlwIGZpbGUgY29udGFpbmluZyBhbiB1bnN1cHBvcnRlZCB2YXJpYWJsZS13aWR0aCBlbmQtb2YtYXJjaGl2ZSBjb21tZW50LCBvciBhbiB1bnN1cHBvcnRlZCB6aXAgZmlsZSB3aXRoIDY0IGJpdCBzaXplcycpO1xuXG4gfVxuY29uc3QgZGlza051bWJlcj1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVJlY29yZHNPblRoaXNEaXNrPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVJlY29yZHM9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5U2l6ZT1yZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQ9cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5jb25zdCBjb21tZW50TGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuLyogV2FybmluZzogdGhlIGVuY29kaW5nIGRlcGVuZHMgb2YgdGhlIHN5c3RlbSBsb2NhbGUuKi9cbi8qIE9uIGEgTGludXggbWFjaGluZSB3aXRoIExBTkc9ZW5fVVMudXRmOCwgdGhpcyBmaWVsZCBpcyB1dGY4IGVuY29kZWQuKi9cbi8qIE9uIGEgV2luZG93cyBtYWNoaW5lLCB0aGlzIGZpZWxkIGlzIGVuY29kZWQgd2l0aCB0aGUgbG9jYWxpemVkIFdpbmRvd3MqL1xuLyogY29kZSBwYWdlLiovXG5jb25zdCBjb21tZW50PXRleHREZWNvZGVyLmRlY29kZShyZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKSk7XG5yZXR1cm57XG5kaXNrTnVtYmVyLFxuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQsXG5jZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2ssXG5jZW50cmFsRGlyZWN0b3J5UmVjb3JkcyxcbmNlbnRyYWxEaXJlY3RvcnlTaXplLFxuY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtDZW50cmFsRGlyZWN0b3J5TG9jYXRvcn1cbiAqL1xuZnVuY3Rpb24gcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpe1xuLyogWmlwIGZpbGVzIGFyZSBwZXJtaXR0ZWQgdG8gaGF2ZSBhIHZhcmlhYmxlLXdpZHRoIGNvbW1lbnQgYXQgdGhlIGVuZCBvZiB0aGUqL1xuLyogXCJlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgcmVjb3JkXCIgYW5kIG1heSBoYXZlIHN1YnNlcXVlbnQgWmlwNjQgaGVhZGVycy4qL1xuLyogVGhlIHByZXNjcmliZWQgbWV0aG9kIG9mIGZpbmRpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUgXCJlbmQgb2YgY2VudHJhbCovXG4vKiBkaXJlY3RvcnkgcmVjb3JkXCIgaXMgdG8gc2VlayB0aGUgbWFnaWMgbnVtYmVyOiovXG4vKiovXG4vKiByZWFkZXIuZmluZExhc3Qoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7Ki9cbi8qKi9cbi8qIFRoaXMgaW50cm9kdWNlcyBhIG51bWJlciBvZiB1bmRlc2lyYWJsZSwgYXR0YWNrYWJsZSBhbWJpZ3VpdGllcyovXG4vKiBBZ29yaWMgaXMgbm90IGNvbWZvcnRhYmxlIHN1cHBvcnRpbmcsIHNvIHdlIGZvcmJpZCB0aGUgY29tbWVudCovXG4vKiBhbmQgNjQgYml0IHppcCBzdXBwb3J0IHNvIHdlIGNhbiBzZWVrIGEgcHJlZGljdGFibGUgbGVuZ3RoKi9cbi8qIGZyb20gdGhlIGVuZC4qL1xuY29uc3QgY2VudHJhbERpcmVjdG9yeUVuZD1yZWFkZXIubGVuZ3RoLTIyO1xuaWYoY2VudHJhbERpcmVjdG9yeUVuZDwwKXtcbnRocm93IG5ldyBFcnJvcignQ29ycnVwdGVkIHppcDogbm90IGVub3VnaCBjb250ZW50Jyk7XG4gfVxucmVhZGVyLnNlZWsoY2VudHJhbERpcmVjdG9yeUVuZCk7XG5jb25zdCBsb2NhdG9yPXJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpO1xuXG4vKiBFeGNlcnB0IGZyb20gdGhlIHppcCBzcGVjOiovXG4vKiA0KSAgSWYgb25lIG9mIHRoZSBmaWVsZHMgaW4gdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSovXG4vKiByZWNvcmQgaXMgdG9vIHNtYWxsIHRvIGhvbGQgcmVxdWlyZWQgZGF0YSwgdGhlIGZpZWxkKi9cbi8qIHNob3VsZCBiZSBzZXQgdG8gLTEgKDB4RkZGRiBvciAweEZGRkZGRkZGKSBhbmQgdGhlKi9cbi8qIFpJUDY0IGZvcm1hdCByZWNvcmQgc2hvdWxkIGJlIGNyZWF0ZWQuKi9cbi8qIDUpICBUaGUgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZCBhbmQgdGhlKi9cbi8qIFppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yIHJlY29yZCBtdXN0Ki9cbi8qIHJlc2lkZSBvbiB0aGUgc2FtZSBkaXNrIHdoZW4gc3BsaXR0aW5nIG9yIHNwYW5uaW5nKi9cbi8qIGFuIGFyY2hpdmUuKi9cbmNvbnN0IHppcDY0PVxubG9jYXRvci5kaXNrTnVtYmVyPT09TUFYX1ZBTFVFXzE2QklUU3x8XG5sb2NhdG9yLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0PT09TUFYX1ZBTFVFXzE2QklUU3x8XG5sb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzaz09PU1BWF9WQUxVRV8xNkJJVFN8fFxubG9jYXRvci5jZW50cmFsRGlyZWN0b3J5UmVjb3Jkcz09PU1BWF9WQUxVRV8xNkJJVFN8fFxubG9jYXRvci5jZW50cmFsRGlyZWN0b3J5U2l6ZT09PU1BWF9WQUxVRV8zMkJJVFN8fFxubG9jYXRvci5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0PT09TUFYX1ZBTFVFXzMyQklUUztcblxuaWYoemlwNjQpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cblxuY29uc3R7XG5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0LFxuY2VudHJhbERpcmVjdG9yeVNpemVcbi8qIHppcDY0RW5kT2ZDZW50cmFsU2l6ZSovfT1cbmxvY2F0b3I7XG5cbmNvbnN0IGV4cGVjdGVkQ2VudHJhbERpcmVjdG9yeUVuZD1cbmNlbnRyYWxEaXJlY3RvcnlPZmZzZXQrY2VudHJhbERpcmVjdG9yeVNpemU7XG5jb25zdCBleHRyYUJ5dGVzPWNlbnRyYWxEaXJlY3RvcnlFbmQtZXhwZWN0ZWRDZW50cmFsRGlyZWN0b3J5RW5kO1xuXG5yZWFkZXIub2Zmc2V0PWV4dHJhQnl0ZXM7XG5cbnJldHVybiBsb2NhdG9yO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0NlbnRyYWxGaWxlUmVjb3JkfSBjZW50cmFsUmVjb3JkXG4gKiBAcGFyYW0ge0xvY2FsRmlsZVJlY29yZH0gbG9jYWxSZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhcmNoaXZlTmFtZVxuICovXG5mdW5jdGlvbiBjaGVja1JlY29yZHMoY2VudHJhbFJlY29yZCxsb2NhbFJlY29yZCxhcmNoaXZlTmFtZSl7XG5jb25zdCBjZW50cmFsTmFtZT10ZXh0RGVjb2Rlci5kZWNvZGUoY2VudHJhbFJlY29yZC5uYW1lKTtcbmNvbnN0IGxvY2FsTmFtZT10ZXh0RGVjb2Rlci5kZWNvZGUobG9jYWxSZWNvcmQubmFtZSk7XG5cbi8qIEluIHNvbWUgemlwIGZpbGVzIGNyZWF0ZWQgb24gV2luZG93cywgdGhlIGZpbGVuYW1lIHN0b3JlZCBpbiB0aGUgY2VudHJhbCovXG4vKiBkaXIgY29udGFpbnMgXCJcXFwiIGluc3RlYWQgb2YgXCIvXCIuICBTdHJhbmdlbHksIHRoZSBmaWxlIG5hbWUgaW4gdGhlIGxvY2FsKi9cbi8qIGRpcmVjdG9yeSB1c2VzIFwiL1wiIGFzIHNwZWNpZmllZDoqL1xuLyogaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvRkFRLmh0bWwjYmFja3NsYXNoZXMgb3IgQVBQTk9URSM0LjQuMTcuMSwgXCJBbGwqL1xuLyogc2xhc2hlcyBNVVNUIGJlIGZvcndhcmQgc2xhc2hlcyAnLydcIikgYnV0IHRoZXJlIGFyZSBhIGxvdCBvZiBiYWQgemlwKi9cbi8qIGdlbmVyYXRvcnMuLi4gIFNlYXJjaCBcInVuemlwIG1pc21hdGNoaW5nIFwibG9jYWxcIiBmaWxlbmFtZSBjb250aW51aW5nIHdpdGgqL1xuLyogXCJjZW50cmFsXCIgZmlsZW5hbWUgdmVyc2lvblwiLiovXG4vKiovXG4vKiBUaGUgcmVhc29uaW5nIGFwcGVhcnMgdG8gYmUgdGhhdCB0aGUgY2VudHJhbCBkaXJlY3RvcnkgaXMgZm9yKi9cbi8qIHVzZXIgZGlzcGxheSBhbmQgbWF5IGRpZmZlciwgdGhvdWdoIHRoaXMgb3BlbnMgdGhlIHBvc3NpYmlsaXR5Ki9cbi8qIGZvciBzcG9vZmluZyBhdHRhY2tzLiovXG4vKiBodHRwOi8vc2VjbGlzdHMub3JnL2Z1bGxkaXNjbG9zdXJlLzIwMDkvU2VwLzM5NCovXG4vKiovXG4vKiBXZSBzdHJpa2UgYSBjb21wcm9taXNlOiB0aGUgY2VudHJhbCBkaXJlY3RvcnkgbmFtZSBtYXkgdmFyeSBmcm9tIHRoZSBsb2NhbCovXG4vKiBuYW1lIGV4YWN0bHkgYW5kIG9ubHkgYnkgZGlmZmVyZW50IHNsYXNoZXMuKi9cbmlmKGNlbnRyYWxOYW1lLnJlcGxhY2UoL1xcXFwvZywnLycpIT09bG9jYWxOYW1lKXtcbnRocm93IG5ldyBFcnJvcihcbiBgWmlwIGludGVncml0eSBlcnJvcjogY2VudHJhbCByZWNvcmQgZmlsZSBuYW1lICR7cShcbmNlbnRyYWxOYW1lKVxuIH0gbXVzdCBtYXRjaCBsb2NhbCBmaWxlIG5hbWUgJHtxKGxvY2FsTmFtZSl9IGluIGFyY2hpdmUgJHtxKFxuYXJjaGl2ZU5hbWUpXG4gfWApO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlXG4gKi9cbmZ1bmN0aW9uIGNoZWNrKHZhbHVlLG1lc3NhZ2Upe1xuaWYoIXZhbHVlKXtcbnRocm93IG5ldyBFcnJvcihcbiBgWmlwIGludGVncml0eSBlcnJvcjogJHttZXNzYWdlfSBmb3IgZmlsZSAke3EoXG5sb2NhbE5hbWUpXG4gfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTmFtZSl9YCk7XG5cbiB9XG4gfVxuXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQuYml0RmxhZz09PWxvY2FsUmVjb3JkLmJpdEZsYWcsXG4gYENlbnRyYWwgcmVjb3JkIGJpdCBmbGFnICR7Y2VudHJhbFJlY29yZC5iaXRGbGFnLnRvU3RyaW5nKFxuMTYpXG4gfSBtdXN0IG1hdGNoIGxvY2FsIHJlY29yZCBiaXQgZmxhZyAke2xvY2FsUmVjb3JkLmJpdEZsYWcudG9TdHJpbmcoMTYpfWApO1xuXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2Q9PT1sb2NhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCxcbiBgQ2VudHJhbCByZWNvcmQgY29tcHJlc3Npb24gbWV0aG9kICR7cShcbmNlbnRyYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QpXG4gfSBtdXN0IG1hdGNoIGxvY2FsIGNvbXByZXNzaW9uIG1ldGhvZCAke3EobG9jYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QpfWApO1xuXG4vKiBUT0RPIERhdGUgaW50ZWdyaXR5IGNoZWNrIHdvdWxkIGJlIGVhc2llciBvbiB0aGUgb3JpZ2luYWwgYnl0ZXMuKi9cbi8qIFBlcmhhcHMgZGVmZXIgZGVjb2RpbmcgdGhlIHVuZGVybHlpbmcgYnl0ZXMuKi9cbmNoZWNrKFxuY2VudHJhbFJlY29yZC5jcmMzMj09PWxvY2FsUmVjb3JkLmNyYzMyLFxuIGBDZW50cmFsIHJlY29yZCBDUkMtMzIgY2hlY2tzdW0gJHtjZW50cmFsUmVjb3JkLmNyYzMyfSBtdXN0IG1hdGNoIGxvY2FsIGNoZWNrc3VtICR7bG9jYWxSZWNvcmQuY3JjMzJ9YCk7XG5cbmNoZWNrKFxuY2VudHJhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RoPT09bG9jYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aCxcbiBgQ2VudHJhbCByZWNvcmQgY29tcHJlc3NlZCBzaXplICR7Y2VudHJhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RofSBtdXN0IG1hdGNoIGxvY2FsICR7bG9jYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aH1gKTtcblxuY2hlY2soXG5jZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aD09PWxvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aCxcbiBgQ2VudHJhbCByZWNvcmQgdW5jb21wcmVzc2VkIHNpemUgJHtjZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH1gKTtcblxuXG5jb25zdCBjaGVja3N1bT1jcmMzMihsb2NhbFJlY29yZC5jb250ZW50KTtcbmNoZWNrKFxuY2hlY2tzdW09PT1sb2NhbFJlY29yZC5jcmMzMixcbiBgQ1JDLTMyIGNoZWNrc3VtIG1pc21hdGNoLCB3YW50ZWQgJHtsb2NhbFJlY29yZC5jcmMzMn0gYnV0IGFjdHVhbCBjb250ZW50IGlzICR7Y2hlY2tzdW19YCk7XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXNcbiAqL1xuZnVuY3Rpb24gbW9kZUZvckV4dGVybmFsQXR0cmlidXRlcyhleHRlcm5hbEZpbGVBdHRyaWJ1dGVzKXtcbnJldHVybiBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzPj4xNiYweGZmZmY7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7Q2VudHJhbEZpbGVSZWNvcmR9IGNlbnRyYWxSZWNvcmRcbiAqIEBwYXJhbSB7TG9jYWxGaWxlUmVjb3JkfSBsb2NhbFJlY29yZFxuICogQHJldHVybnMge0NvbXByZXNzZWRGaWxlfVxuICovXG5mdW5jdGlvbiByZWNvcmRUb0ZpbGUoY2VudHJhbFJlY29yZCxsb2NhbFJlY29yZCl7XG5jb25zdCBtb2RlPW1vZGVGb3JFeHRlcm5hbEF0dHJpYnV0ZXMoY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzKTtcbnJldHVybntcbm5hbWU6Y2VudHJhbFJlY29yZC5uYW1lLFxubW9kZSxcbmRhdGU6Y2VudHJhbFJlY29yZC5kYXRlLFxuY3JjMzI6Y2VudHJhbFJlY29yZC5jcmMzMixcbmNvbXByZXNzaW9uTWV0aG9kOmNlbnRyYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QsXG5jb21wcmVzc2VkTGVuZ3RoOmNlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aCxcbnVuY29tcHJlc3NlZExlbmd0aDpjZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aCxcbmNvbnRlbnQ6bG9jYWxSZWNvcmQuY29udGVudCxcbmNvbW1lbnQ6Y2VudHJhbFJlY29yZC5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0NvbXByZXNzZWRGaWxlfSBmaWxlXG4gKiBAcmV0dXJucyB7VW5jb21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gZGVjb21wcmVzc0ZpbGUoZmlsZSl7XG5pZihmaWxlLmNvbXByZXNzaW9uTWV0aG9kIT09Y29tcHJlc3Npb24uU1RPUkUpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgZmluZCBkZWNvbXByZXNzb3IgZm9yIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG5maWxlLmNvbXByZXNzaW9uTWV0aG9kKVxuIH0gZm9yIGZpbGUgJHtmaWxlLm5hbWV9YCk7XG5cbiB9XG5yZXR1cm57XG5uYW1lOmZpbGUubmFtZSxcbm1vZGU6ZmlsZS5tb2RlLFxuZGF0ZTpmaWxlLmRhdGUsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VuY29tcHJlc3NlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtBcmNoaXZlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIGRlY29kZUZpbGUoZmlsZSl7XG5jb25zdCBuYW1lPXRleHREZWNvZGVyLmRlY29kZShmaWxlLm5hbWUpO1xuY29uc3QgY29tbWVudD10ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5jb21tZW50KTtcbnJldHVybntcbm5hbWUsXG50eXBlOidmaWxlJyxcbm1vZGU6ZmlsZS5tb2RlJjBvNzc3LFxuZGF0ZTpmaWxlLmRhdGUsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cbmZ1bmN0aW9uICAgICAgICByZWFkWmlwKHJlYWRlcixuYW1lPSc8dW5rbm93bj4nKXtcbmNvbnN0IGxvY2F0b3I9cmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpO1xuY29uc3QgY2VudHJhbFJlY29yZHM9cmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLGxvY2F0b3IpO1xuY29uc3QgbG9jYWxSZWNvcmRzPXJlYWRMb2NhbEZpbGVzKHJlYWRlcixjZW50cmFsUmVjb3Jkcyk7XG5jb25zdCBmaWxlcz1uZXcgTWFwKCk7XG5cbmZvcihsZXQgaT0wO2k8Y2VudHJhbFJlY29yZHMubGVuZ3RoO2krPTEpe1xuY29uc3QgY2VudHJhbFJlY29yZD1jZW50cmFsUmVjb3Jkc1tpXTtcbmNvbnN0IGxvY2FsUmVjb3JkPWxvY2FsUmVjb3Jkc1tpXTtcblxuY2hlY2tSZWNvcmRzKGNlbnRyYWxSZWNvcmQsbG9jYWxSZWNvcmQsbmFtZSk7XG5cbmlmKGlzRW5jcnlwdGVkKGNlbnRyYWxSZWNvcmQuYml0RmxhZykpe1xudGhyb3cgbmV3IEVycm9yKCdFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gfVxuXG5jb25zdCBpc0Rpcj0oY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzJjB4MDAxMCkhPT0wO1xuaWYoIWlzRGlyKXtcbmNvbnN0IGNvbXByZXNzZWRGaWxlPXJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLGxvY2FsUmVjb3JkKTtcbmNvbnN0IGRlY29tcHJlc3NlZEZpbGU9ZGVjb21wcmVzc0ZpbGUoY29tcHJlc3NlZEZpbGUpO1xuY29uc3QgZGVjb2RlZEZpbGU9ZGVjb2RlRmlsZShkZWNvbXByZXNzZWRGaWxlKTtcbmZpbGVzLnNldChkZWNvZGVkRmlsZS5uYW1lLGRlY29kZWRGaWxlKTtcbiB9XG4vKiBUT0RPIGhhbmRsZSBleHBsaWNpdCBkaXJlY3RvcnkgZW50cmllcyovXG4gfVxucmV0dXJuIGZpbGVzO1xuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3pN+N6UbAAClGwAAJgAAAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9mb3JtYXQtd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vY29tcHJlc3Npb24uanMiLCIuL2NyYzMyLmpzIiwiLi9zaWduYXR1cmUuanMiXSwiZXhwb3J0cyI6WyJ3cml0ZVppcCIsIndyaXRlWmlwUmVjb3JkcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBjcmMzMixzaWduYXR1cmUsY29tcHJlc3Npb247JGjigI1faW1wb3J0cyhbW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIiwgWyRo4oCNX2EgPT4gKGNyYzMyID0gJGjigI1fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChzaWduYXR1cmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoY29tcHJlc3Npb24gPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JpdGVaaXBSZWNvcmRzLCAnbmFtZScsIHt2YWx1ZTogXCJ3cml0ZVppcFJlY29yZHNcIn0pOyRo4oCNX29uY2Uud3JpdGVaaXBSZWNvcmRzKHdyaXRlWmlwUmVjb3Jkcyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwLCAnbmFtZScsIHt2YWx1ZTogXCJ3cml0ZVppcFwifSk7JGjigI1fb25jZS53cml0ZVppcCh3cml0ZVppcCk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCBVTklYPTM7XG5jb25zdCBVTklYX1ZFUlNJT049MzA7XG5cbmNvbnN0IHRleHRFbmNvZGVyPW5ldyBUZXh0RW5jb2RlcigpO1xuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7RGF0ZT99IGRhdGVcbiAqIEBzZWUgaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvcmJpbnRlci9pdC82NS8xNi5odG1sXG4gKiBAc2VlIGh0dHA6Ly93d3cuZGVsb3JpZS5jb20vZGpncHAvZG9jL3JiaW50ZXIvaXQvNjYvMTYuaHRtbFxuICovXG5mdW5jdGlvbiB3cml0ZURvc0RhdGVUaW1lKHdyaXRlcixkYXRlKXtcbmNvbnN0IGRvc1RpbWU9XG5kYXRlIT09dW5kZWZpbmVkJiZkYXRlIT09bnVsbD9cbihkYXRlLmdldFVUQ0Z1bGxZZWFyKCktMTk4MCYweDdmKTw8MjV8LyogeWVhciovXG5kYXRlLmdldFVUQ01vbnRoKCkrMTw8MjF8LyogbW9udGgqL1xuZGF0ZS5nZXRVVENEYXRlKCk8PDE2fC8qIGRheSovXG5kYXRlLmdldFVUQ0hvdXJzKCk8PDExfC8qIGhvdXIqL1xuZGF0ZS5nZXRVVENNaW51dGVzKCk8PDV8LyogbWludXRlKi9cbmRhdGUuZ2V0VVRDU2Vjb25kcygpPj4xLyogc2Vjb25kKi86XG4wOy8qIEVwb2NoIG9yaWdpbiBieSBkZWZhdWx0LiovXG53cml0ZXIud3JpdGVVaW50MzIoZG9zVGltZSx0cnVlKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtGaWxlUmVjb3JkfSBmaWxlXG4gKiBAcmV0dXJucyB7TG9jYWxGaWxlTG9jYXRvcn1cbiAqL1xuZnVuY3Rpb24gd3JpdGVGaWxlKHdyaXRlcixmaWxlKXtcbi8qIEhlYWRlciovXG5jb25zdCBmaWxlU3RhcnQ9d3JpdGVyLmluZGV4O1xud3JpdGVyLndyaXRlKHNpZ25hdHVyZS5MT0NBTF9GSUxFX0hFQURFUik7XG5jb25zdCBoZWFkZXJTdGFydD13cml0ZXIuaW5kZXg7XG4vKiBWZXJzaW9uIG5lZWRlZCB0byBleHRyYWN0Ki9cbndyaXRlci53cml0ZVVpbnQxNigxMCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmJpdEZsYWcsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCx0cnVlKTtcbndyaXRlRG9zRGF0ZVRpbWUod3JpdGVyLGZpbGUuZGF0ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS5jcmMzMix0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihmaWxlLmNvbXByZXNzZWRMZW5ndGgsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5uYW1lLmxlbmd0aCx0cnVlKTtcbmNvbnN0IGhlYWRlckVuZD13cml0ZXIubGVuZ3RoO1xuXG4vKiBUT0RPIGNvdW50IG9mIGV4dHJhIGZpZWxkcyBsZW5ndGgqL1xud3JpdGVyLndyaXRlVWludDE2KDAsdHJ1ZSk7XG53cml0ZXIud3JpdGUoZmlsZS5uYW1lKTtcbi8qIFRPRE8gd3JpdGUgZXh0cmEgZmllbGRzKi9cbndyaXRlci53cml0ZShmaWxlLmNvbnRlbnQpO1xuXG5yZXR1cm57XG5maWxlU3RhcnQsXG5oZWFkZXJTdGFydCxcbmhlYWRlckVuZH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtGaWxlUmVjb3JkfSBmaWxlXG4gKiBAcGFyYW0ge0xvY2FsRmlsZUxvY2F0b3J9IGxvY2F0b3JcbiAqL1xuZnVuY3Rpb24gd3JpdGVDZW50cmFsRmlsZUhlYWRlcih3cml0ZXIsZmlsZSxsb2NhdG9yKXtcbndyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9GSUxFX0hFQURFUik7XG53cml0ZXIud3JpdGVVaW50OChmaWxlLnZlcnNpb24pO1xud3JpdGVyLndyaXRlVWludDgoZmlsZS5tYWRlQnkpO1xud3JpdGVyLndyaXRlQ29weShsb2NhdG9yLmhlYWRlclN0YXJ0LGxvY2F0b3IuaGVhZGVyRW5kKTtcbi8qIFRPRE8gZXh0cmEgZmllbGRzIGxlbmd0aCovXG53cml0ZXIud3JpdGVVaW50MTYoMCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmNvbW1lbnQubGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuZGlza051bWJlclN0YXJ0LHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihmaWxlLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIobG9jYXRvci5maWxlU3RhcnQsdHJ1ZSk7XG53cml0ZXIud3JpdGUoZmlsZS5jZW50cmFsTmFtZSk7XG4vKiBUT0RPIGV4dHJhIGZpZWxkcyovXG53cml0ZXIud3JpdGUoZmlsZS5jb21tZW50KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJXcml0ZXJ9IHdyaXRlclxuICogQHBhcmFtIHtudW1iZXJ9IGVudHJpZXNDb3VudFxuICogQHBhcmFtIHtudW1iZXJ9IGNlbnRyYWxEaXJlY3RvcnlTdGFydFxuICogQHBhcmFtIHtudW1iZXJ9IGNlbnRyYWxEaXJlY3RvcnlMZW5ndGhcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gY29tbWVudEJ5dGVzXG4gKi9cbmZ1bmN0aW9uIHdyaXRlRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKFxud3JpdGVyLFxuZW50cmllc0NvdW50LFxuY2VudHJhbERpcmVjdG9yeVN0YXJ0LFxuY2VudHJhbERpcmVjdG9yeUxlbmd0aCxcbmNvbW1lbnRCeXRlcylcbntcbndyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbndyaXRlci53cml0ZVVpbnQxNigwLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KDAsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZW50cmllc0NvdW50LHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGVudHJpZXNDb3VudCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihjZW50cmFsRGlyZWN0b3J5TGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGNlbnRyYWxEaXJlY3RvcnlTdGFydCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihjb21tZW50Qnl0ZXMubGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlKGNvbW1lbnRCeXRlcyk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7QXJyYXk8RmlsZVJlY29yZD59IHJlY29yZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tZW50XG4gKi9cbmZ1bmN0aW9uICAgICAgICB3cml0ZVppcFJlY29yZHMod3JpdGVyLHJlY29yZHMsY29tbWVudD0nJyl7XG4vKiBXcml0ZSByZWNvcmRzIHdpdGggbG9jYWwgaGVhZGVycy4qL1xuY29uc3QgbG9jYXRvcnM9W107XG5mb3IobGV0IGk9MDtpPHJlY29yZHMubGVuZ3RoO2krPTEpe1xubG9jYXRvcnMucHVzaCh3cml0ZUZpbGUod3JpdGVyLHJlY29yZHNbaV0pKTtcbiB9XG5cbi8qIHdyaXRlQ2VudHJhbERpcmVjdG9yeSovXG5jb25zdCBjZW50cmFsRGlyZWN0b3J5U3RhcnQ9d3JpdGVyLmluZGV4O1xuZm9yKGxldCBpPTA7aTxsb2NhdG9ycy5sZW5ndGg7aSs9MSl7XG53cml0ZUNlbnRyYWxGaWxlSGVhZGVyKHdyaXRlcixyZWNvcmRzW2ldLGxvY2F0b3JzW2ldKTtcbiB9XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5TGVuZ3RoPXdyaXRlci5pbmRleC1jZW50cmFsRGlyZWN0b3J5U3RhcnQ7XG5cbmNvbnN0IGNvbW1lbnRCeXRlcz10ZXh0RW5jb2Rlci5lbmNvZGUoY29tbWVudCk7XG5cbi8qIFdyaXRlIGNlbnRyYWwgZGlyZWN0b3J5IGVuZC4qL1xud3JpdGVFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoXG53cml0ZXIsXG5yZWNvcmRzLmxlbmd0aCxcbmNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbmNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsXG5jb21tZW50Qnl0ZXMpO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkFyY2hpdmVkRmlsZX0gZmlsZVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5VbmNvbXByZXNzZWRGaWxlfVxuICovXG5mdW5jdGlvbiBlbmNvZGVGaWxlKGZpbGUpe1xuY29uc3QgbmFtZT10ZXh0RW5jb2Rlci5lbmNvZGUoZmlsZS5uYW1lLnJlcGxhY2UoL1xcXFwvZywnLycpKTtcbmNvbnN0IGNvbW1lbnQ9dGV4dEVuY29kZXIuZW5jb2RlKGZpbGUuY29tbWVudCk7XG5yZXR1cm57XG5uYW1lLFxubW9kZTpmaWxlLm1vZGUsXG5kYXRlOmZpbGUuZGF0ZSxcbmNvbnRlbnQ6ZmlsZS5jb250ZW50LFxuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVW5jb21wcmVzc2VkRmlsZX0gZmlsZVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NGaWxlV2l0aFN0b3JlKGZpbGUpe1xucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY3JjMzI6Y3JjMzIoZmlsZS5jb250ZW50KSxcbmNvbXByZXNzaW9uTWV0aG9kOmNvbXByZXNzaW9uLlNUT1JFLFxuY29tcHJlc3NlZExlbmd0aDpmaWxlLmNvbnRlbnQubGVuZ3RoLFxudW5jb21wcmVzc2VkTGVuZ3RoOmZpbGUuY29udGVudC5sZW5ndGgsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBDb21wdXRlcyBaaXAgZXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzIGZpZWxkIGZyb20gYSBVTklYIG1vZGUgZm9yIGEgZmlsZS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbW9kZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuZnVuY3Rpb24gZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhtb2RlKXtcbnJldHVybihtb2RlJjBvNzc3fDBvMTAwMDAwKTw8MTY7XG4gfVxuXG4vKiBUT0RPIEFkZCBzdXBwb3J0IGZvciBkaXJlY3RvcnkgcmVjb3Jkcy4qL1xuLyogLyoqKi9cbi8qICogQHBhcmFtIHtudW1iZXJ9IG1vZGUqL1xuLyogKiBAcmV0dXJuIHtudW1iZXJ9Ki9cbi8qICpYLyovXG4vKiBmdW5jdGlvbiBleHRlcm5hbERpcmVjdG9yeUF0dHJpYnV0ZXMobW9kZSkgeyovXG4vKiAvLyBUaGUgMHgxMCBpcyB0aGUgRE9TIGRpcmVjdG9yeSBhdHRyaWJ1dGUsIHdoaWNoIGlzIHNldCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtLiovXG4vKiByZXR1cm4gKChtb2RlICYgMG83NzcpIHwgMG80MDAwMCkgPDwgMTYgfCAweDEwOyovXG4vKiB9Ki9cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db21wcmVzc2VkRmlsZX0gZmlsZVxuICogQHJldHVybnMge0ZpbGVSZWNvcmR9XG4gKi9cbmZ1bmN0aW9uIG1ha2VGaWxlUmVjb3JkKGZpbGUpe1xucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5jZW50cmFsTmFtZTpmaWxlLm5hbWUsXG5tYWRlQnk6VU5JWCxcbnZlcnNpb246VU5JWF9WRVJTSU9OLFxudmVyc2lvbk5lZWRlZDowLC8qIFRPRE8gdGhpcyBpcyBwcm9iYWJseSB0b28gbGF4LiovXG5iaXRGbGFnOjAsXG5jb21wcmVzc2lvbk1ldGhvZDpjb21wcmVzc2lvbi5TVE9SRSxcbmRhdGU6ZmlsZS5kYXRlLFxuY3JjMzI6ZmlsZS5jcmMzMixcbmNvbXByZXNzZWRMZW5ndGg6ZmlsZS5jb21wcmVzc2VkTGVuZ3RoLFxudW5jb21wcmVzc2VkTGVuZ3RoOmZpbGUudW5jb21wcmVzc2VkTGVuZ3RoLFxuZGlza051bWJlclN0YXJ0OjAsXG5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzOjAsXG5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzOmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMoZmlsZS5tb2RlKSxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50LFxuY29udGVudDpmaWxlLmNvbnRlbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7QXJyYXk8WGltcG9ydCgnLi90eXBlcy5qcycpLkFyY2hpdmVkRmlsZT59IGZpbGVzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudFxuICovXG5mdW5jdGlvbiAgICAgICAgd3JpdGVaaXAod3JpdGVyLGZpbGVzLGNvbW1lbnQ9Jycpe1xuY29uc3QgZW5jb2RlZEZpbGVzPWZpbGVzLm1hcChlbmNvZGVGaWxlKTtcbmNvbnN0IGNvbXByZXNzZWRGaWxlcz1lbmNvZGVkRmlsZXMubWFwKGNvbXByZXNzRmlsZVdpdGhTdG9yZSk7XG4vKiBUT0RPIGNvbGxhdGUgZGlyZWN0b3J5UmVjb3JkcyBmcm9tIGZpbGUgYmFzZXMuKi9cbmNvbnN0IGZpbGVSZWNvcmRzPWNvbXByZXNzZWRGaWxlcy5tYXAobWFrZUZpbGVSZWNvcmQpO1xud3JpdGVaaXBSZWNvcmRzKHdyaXRlcixmaWxlUmVjb3Jkcyxjb21tZW50KTtcbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsid3JpdGVaaXBSZWNvcmRzIjpbIndyaXRlWmlwUmVjb3JkcyJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADnCVhiLAcAACwHAAAfAAAAQGVuZG8vemlwLXYwLjIuMzEvc3JjL3JlYWRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci1yZWFkZXIuanMiLCIuL2Zvcm1hdC1yZWFkZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBSZWFkZXIiLCJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEJ1ZmZlclJlYWRlcixyZWFkWmlwRm9ybWF0OyRo4oCNX2ltcG9ydHMoW1tcIi4vYnVmZmVyLXJlYWRlci5qc1wiLCBbW1wiQnVmZmVyUmVhZGVyXCIsIFskaOKAjV9hID0+IChCdWZmZXJSZWFkZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9mb3JtYXQtcmVhZGVyLmpzXCIsIFtbXCJyZWFkWmlwXCIsIFskaOKAjV9hID0+IChyZWFkWmlwRm9ybWF0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNsYXNzICAgICAgICBaaXBSZWFkZXJ7XG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZGF0YVxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLm5hbWVdXG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3IoZGF0YSxvcHRpb25zPXt9KXtcbmNvbnN0e25hbWU9Jzx1bmtub3duPid9PW9wdGlvbnM7XG5jb25zdCByZWFkZXI9bmV3IEJ1ZmZlclJlYWRlcihkYXRhKTtcbnRoaXMuZmlsZXM9cmVhZFppcEZvcm1hdChyZWFkZXIpO1xudGhpcy5uYW1lPW5hbWU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgIHJlYWQobmFtZSl7XG5jb25zdCBmaWxlPXRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuaWYoZmlsZT09PXVuZGVmaW5lZCl7XG50aHJvdyBuZXcgRXJyb3IoIGBDYW5ub3QgZmluZCBmaWxlICR7bmFtZX0gaW4gWmlwIGZpbGUgJHt0aGlzLm5hbWV9YCk7XG4gfVxucmV0dXJuIGZpbGUuY29udGVudDtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXJjaGl2ZWRTdGF0PX1cbiAqL1xuICAgIHN0YXQobmFtZSl7XG5jb25zdCBmaWxlPXRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuaWYoZmlsZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybntcbnR5cGU6ZmlsZS50eXBlLFxubW9kZTpmaWxlLm1vZGUsXG5kYXRlOmZpbGUuZGF0ZSxcbmNvbW1lbnQ6ZmlsZS5jb21tZW50fTtcblxuIH19XG5cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8WGltcG9ydCgnLi90eXBlcy5qcycpLkFyY2hpdmVSZWFkZXI+fVxuICovJGjigI1fb25jZS4gWmlwUmVhZGVyKFppcFJlYWRlcik7XG5jb25zdCAgICAgICAgcmVhZFppcD1hc3luYyhkYXRhLGxvY2F0aW9uKT0+e1xuY29uc3QgcmVhZGVyPW5ldyBaaXBSZWFkZXIoZGF0YSx7bmFtZTpsb2NhdGlvbn0pO1xuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZEZufSAqL1xuY29uc3QgcmVhZD1hc3luYyhwYXRoKT0+cmVhZGVyLnJlYWQocGF0aCk7XG5yZXR1cm57cmVhZH07XG4gfTskaOKAjV9vbmNlLnJlYWRaaXAocmVhZFppcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwUmVhZGVyIjpbIlppcFJlYWRlciJdLCJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEDREGrYGAAC2BgAAIgAAAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9zaWduYXR1cmUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkNFTlRSQUxfRElSRUNUT1JZX0VORCIsIkNFTlRSQUxfRklMRV9IRUFERVIiLCJEQVRBX0RFU0NSSVBUT1IiLCJMT0NBTF9GSUxFX0hFQURFUiIsIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCIsIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyogZXNsaW50IG5vLWJpdHdpc2U6IFtcIm9mZlwiXSAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG5mdW5jdGlvbiB1KHN0cmluZyl7XG5jb25zdCBhcnJheT1uZXcgVWludDhBcnJheShzdHJpbmcubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8c3RyaW5nLmxlbmd0aDtpKz0xKXtcbmFycmF5W2ldPXN0cmluZy5jaGFyQ29kZUF0KGkpJjB4ZmY7XG4gfVxucmV0dXJuIGFycmF5O1xuIH1cblxuY29uc3QgICAgICAgIExPQ0FMX0ZJTEVfSEVBREVSPXUoJ1BLXFx4MDNcXHgwNCcpOyRo4oCNX29uY2UuTE9DQUxfRklMRV9IRUFERVIoTE9DQUxfRklMRV9IRUFERVIpO1xuY29uc3QgICAgICAgIENFTlRSQUxfRklMRV9IRUFERVI9dSgnUEtcXHgwMVxceDAyJyk7JGjigI1fb25jZS5DRU5UUkFMX0ZJTEVfSEVBREVSKENFTlRSQUxfRklMRV9IRUFERVIpO1xuY29uc3QgICAgICAgIENFTlRSQUxfRElSRUNUT1JZX0VORD11KCdQS1xceDA1XFx4MDYnKTskaOKAjV9vbmNlLkNFTlRSQUxfRElSRUNUT1JZX0VORChDRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuY29uc3QgICAgICAgIFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1I9dSgnUEtcXHgwNlxceDA3Jyk7JGjigI1fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuY29uc3QgICAgICAgIFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORD11KCdQS1xceDA2XFx4MDYnKTskaOKAjV9vbmNlLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORChaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuY29uc3QgICAgICAgIERBVEFfREVTQ1JJUFRPUj11KCdQS1xceDA3XFx4MDgnKTskaOKAjV9vbmNlLkRBVEFfREVTQ1JJUFRPUihEQVRBX0RFU0NSSVBUT1IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkxPQ0FMX0ZJTEVfSEVBREVSIjpbIkxPQ0FMX0ZJTEVfSEVBREVSIl0sIkNFTlRSQUxfRklMRV9IRUFERVIiOlsiQ0VOVFJBTF9GSUxFX0hFQURFUiJdLCJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiOlsiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIl0sIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiOlsiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiJdLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiOlsiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIl0sIkRBVEFfREVTQ1JJUFRPUiI6WyJEQVRBX0RFU0NSSVBUT1IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAHgAAAEBlbmRvL3ppcC12MC4yLjMxL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACD2SsWWAcAAFgHAAAfAAAAQGVuZG8vemlwLXYwLjIuMzEvc3JjL3dyaXRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci13cml0ZXIuanMiLCIuL2Zvcm1hdC13cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBXcml0ZXIiLCJ3cml0ZVppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBCdWZmZXJXcml0ZXIsd3JpdGVaaXBGb3JtYXQ7JGjigI1faW1wb3J0cyhbW1wiLi9idWZmZXItd3JpdGVyLmpzXCIsIFtbXCJCdWZmZXJXcml0ZXJcIiwgWyRo4oCNX2EgPT4gKEJ1ZmZlcldyaXRlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2Zvcm1hdC13cml0ZXIuanNcIiwgW1tcIndyaXRlWmlwXCIsIFskaOKAjV9hID0+ICh3cml0ZVppcEZvcm1hdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jbGFzcyAgICAgICAgWmlwV3JpdGVye1xuLyoqXG4gKiBAcGFyYW0ge3tcbiAqICAgZGF0ZTogRGF0ZSxcbiAqIH19IG9wdGlvbnNcbiAqL1xuICAgICAgICAgICBjb25zdHJ1Y3RvcihvcHRpb25zPXtkYXRlOm5ldyBEYXRlKCl9KXtcbmNvbnN0e2RhdGV9PW9wdGlvbnM7XG4vKiogdHlwZSB7TWFwPHN0cmluZywgWkZpbGU+fSAqL1xudGhpcy5maWxlcz1uZXcgTWFwKCk7XG50aGlzLmRhdGU9ZGF0ZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gY29udGVudFxuICogQHBhcmFtIHt7XG4gKiAgIG1vZGU/OiBudW1iZXIsXG4gKiAgIGRhdGU/OiBEYXRlLFxuICogICBjb21tZW50Pzogc3RyaW5nLFxuICogfX0gW29wdGlvbnNdXG4gKi9cbiAgICAgd3JpdGUobmFtZSxjb250ZW50LG9wdGlvbnM9e30pe1xuY29uc3R7bW9kZT0wbzY0NCxkYXRlPXVuZGVmaW5lZCxjb21tZW50PScnfT1vcHRpb25zO1xuaWYoIWNvbnRlbnQpe1xudGhyb3cgbmV3IEVycm9yKCBgWmlwV3JpdGVyIHdyaXRlIHJlcXVpcmVzIGNvbnRlbnQgZm9yICR7bmFtZX1gKTtcbiB9XG50aGlzLmZpbGVzLnNldChuYW1lLHtcbm5hbWUsXG5tb2RlLFxuZGF0ZSxcbmNvbnRlbnQsXG5jb21tZW50fSk7XG5cbiB9XG5cbi8qKlxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICAgICAgc25hcHNob3QoKXtcbmNvbnN0IHdyaXRlcj1uZXcgQnVmZmVyV3JpdGVyKCk7XG53cml0ZVppcEZvcm1hdCh3cml0ZXIsQXJyYXkuZnJvbSh0aGlzLmZpbGVzLnZhbHVlcygpKSk7XG5yZXR1cm4gd3JpdGVyLnN1YmFycmF5KCk7XG4gfX1cblxuXG4vKipcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXJjaGl2ZVdyaXRlcn1cbiAqLyRo4oCNX29uY2UuIFppcFdyaXRlcihaaXBXcml0ZXIpO1xuY29uc3QgICAgICAgIHdyaXRlWmlwPSgpPT57XG5jb25zdCB3cml0ZXI9bmV3IFppcFdyaXRlcigpO1xuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuV3JpdGVGbn0gKi9cbmNvbnN0IHdyaXRlPWFzeW5jKHBhdGgsZGF0YSk9PntcbndyaXRlci53cml0ZShwYXRoLGRhdGEpO1xuIH07XG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbmFwc2hvdEZufSAqL1xuY29uc3Qgc25hcHNob3Q9YXN5bmMoKT0+d3JpdGVyLnNuYXBzaG90KCk7XG5yZXR1cm57d3JpdGUsc25hcHNob3R9O1xuIH07JGjigI1fb25jZS53cml0ZVppcCh3cml0ZVppcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwV3JpdGVyIjpbIlppcFdyaXRlciJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAADEDN1BLfQAAS30AABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAMLdTGB7BAAAewQAAC8AAAAAAAAAAAAAAKSBfX0AAEBhZ29yaWMvc3Bhd25lci12MC42LjktdTExLjAvc3JjL3ZhdC1zcGF3bmVkLmpzUEsBAh4DCgAAAAAAAAAAAPeeGjzrAgAA6wIAABwAAAAAAAAAAAAAAKSBRYIAAEBlbmRvL2Jhc2U2NC12MC4yLjMxL2F0b2IuanNQSwECHgMKAAAAAAAAAAAAeSSJm40DAACNAwAAHAAAAAAAAAAAAAAApIFqhQAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvYnRvYS5qc1BLAQIeAwoAAAAAAAAAAAB02udwlQEAAJUBAAAeAAAAAAAAAAAAAACkgTGJAABAZW5kby9iYXNlNjQtdjAuMi4zMS9kZWNvZGUuanNQSwECHgMKAAAAAAAAAAAAR0NulpUBAACVAQAAHgAAAAAAAAAAAAAApIECiwAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAAFdxbOCAAgAAgAIAAB0AAAAAAAAAAAAAAKSB04wAAEBlbmRvL2Jhc2U2NC12MC4yLjMxL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAACgOckADBAAAAwQAACIAAAAAAAAAAAAAAKSBjo8AAEBlbmRvL2Jhc2U2NC12MC4yLjMxL3NyYy9jb21tb24uanNQSwECHgMKAAAAAAAAAAAAku2UZHwJAAB8CQAAIgAAAAAAAAAAAAAApIHRkwAAQGVuZG8vYmFzZTY0LXYwLjIuMzEvc3JjL2RlY29kZS5qc1BLAQIeAwoAAAAAAAAAAAAan6AA5gcAAOYHAAAiAAAAAAAAAAAAAACkgY2dAABAZW5kby9iYXNlNjQtdjAuMi4zMS9zcmMvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAAPz0xDYEAgAABAIAADEAAAAAAAAAAAAAAKSBs6UAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvaW1wb3J0LWFyY2hpdmUuanNQSwECHgMKAAAAAAAAAAAAkOvpSnUxAAB1MQAANgAAAAAAAAAAAAAApIEGqAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvY29tcGFydG1lbnQtbWFwLmpzUEsBAh4DCgAAAAAAAAAAAGXmA7B8AwAAfAMAADAAAAAAAAAAAAAAAKSBz9kAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL2V4dGVuc2lvbi5qc1BLAQIeAwoAAAAAAAAAAACwzYs0zicAAM4nAAA1AAAAAAAAAAAAAACkgZndAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAADFQABzSQMAAEkDAAArAAAAAAAAAAAAAACkgboFAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9qc29uLmpzUEsBAh4DCgAAAAAAAAAAALqueymAOwAAgDsAACsAAAAAAAAAAAAAAKSBTAkBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL2xpbmsuanNQSwECHgMKAAAAAAAAAAAAOmXnMeQUAADkFAAAPAAAAAAAAAAAAAAApIEVRQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAABg7dpuBQAAbgUAADIAAAAAAAAAAAAAAKSBU1oBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL3BhcnNlLWJ5dGVzLmpzUEsBAh4DCgAAAAAAAAAAAHVKlkFOFgAAThYAAEYAAAAAAAAAAAAAAKSBEWABAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanNQSwECHgMKAAAAAAAAAAAAC91345EFAACRBQAAMQAAAAAAAAAAAAAApIHDdgEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcGFyc2UtanNvbi5qc1BLAQIeAwoAAAAAAAAAAADGORBhdwcAAHcHAAA0AAAAAAAAAAAAAACkgaN8AQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wYXJzZS1wcmUtY2pzLmpzUEsBAh4DCgAAAAAAAAAAAKuk9dWGBAAAhgQAADQAAAAAAAAAAAAAAKSBbIQBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL3BhcnNlLXByZS1tanMuanNQSwECHgMKAAAAAAAAAAAA5CIY3ysFAAArBQAAMQAAAAAAAAAAAAAApIFEiQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcGFyc2UtdGV4dC5qc1BLAQIeAwoAAAAAAAAAAACmnhiXUhgAAFIYAAA0AAAAAAAAAAAAAACkgb6OAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wb2xpY3ktZm9ybWF0LmpzUEsBAh4DCgAAAAAAAAAAAJqOx8Z4PAAAeDwAAC0AAAAAAAAAAAAAAKSBYqcBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL3BvbGljeS5qc1BLAQIeAwoAAAAAAAAAAABBcXe9jQMAAI0DAAAtAAAAAAAAAAAAAACkgSXkAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wb3dlcnMuanNQSwECHgMKAAAAAAAAAAAAfiRuLdIRAADSEQAAJAAAAAAAAAAAAAAApIH95wEAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yL3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAADcL7U8fAgAAHwIAACoAAAAAAAAAAAAAAKSBEfoBAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAAChWCM/jxAAAI8QAAAuAAAAAAAAAAAAAACkgXj8AQBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAP0lSmYLDAAACwwAADUAAAAAAAAAAAAAAKSBUw0CAEBlbmRvL2ltcG9ydC1idW5kbGUtdjAuMy40L3NyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzUEsBAh4DCgAAAAAAAAAAADGsxYBZEwAAWRMAACcAAAAAAAAAAAAAAKSBsRkCAEBlbmRvL2ltcG9ydC1idW5kbGUtdjAuMy40L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACljzr3SgcAAEoHAAAdAAAAAAAAAAAAAACkgU8tAgBAZW5kby9tYXJzaGFsLXYwLjguNS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAANCCZ7lA0AAJQNAAArAAAAAAAAAAAAAACkgdQ0AgBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAADtyz4DkPwAA5D8AACoAAAAAAAAAAAAAAKSBsUICAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAADEU6fw/D8AAPw/AAArAAAAAAAAAAAAAACkgd2CAgBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzUEsBAh4DCgAAAAAAAAAAALNe92vFOwAAxTsAAC0AAAAAAAAAAAAAAKSBIsMCAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc1BLAQIeAwoAAAAAAAAAAAAIQpL9rCoAAKwqAAAqAAAAAAAAAAAAAACkgTL/AgBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvbWFyc2hhbC1qdXN0aW4uanNQSwECHgMKAAAAAAAAAAAAE9PVG9wGAADcBgAALQAAAAAAAAAAAAAApIEmKgMAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAAL6eaUrsMgAA7DIAACMAAAAAAAAAAAAAAKSBTTEDAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAFdEZAp+QAAAfkAAACUAAAAAAAAAAAAAAKSBemQDAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAIQAAAAAAAAAAAAAApIE7pQMAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAACUem73PCwAAzwsAAB4AAAAAAAAAAAAAAKSBrqYDAEBlbmRvL25hdC12NC4xLjI3L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABl8owafAgAAHwIAAAgAAAAAAAAAAAAAACkgbmyAwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADeRraqkwcAAJMHAAAoAAAAAAAAAAAAAACkgXO7AwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAAIP12yzPBwAAzwcAACkAAAAAAAAAAAAAAKSBTMMDAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAANOgOHGdEQAAnREAACQAAAAAAAAAAAAAAKSBYssDAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9lcnJvci5qc1BLAQIeAwoAAAAAAAAAAABKO2aDVQgAAFUIAAArAAAAAAAAAAAAAACkgUHdAwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvaXRlci1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAGJNZwNOGgAAThoAACcAAAAAAAAAAAAAAKSB3+UDAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9tYWtlLWZhci5qc1BLAQIeAwoAAAAAAAAAAAACkXvlHQQAAB0EAAApAAAAAAAAAAAAAACkgXIABABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvbWFrZVRhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAAZQCjG9RkAAPUZAAAwAAAAAAAAAAAAAACkgdYEBABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAALm6xDYMbAACDGwAAKgAAAAAAAAAAAAAApIEZHwQAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAABSxon3DIQAAwyEAACgAAAAAAAAAAAAAAKSB5DoEAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAANeJOipoPAACaDwAAKwAAAAAAAAAAAAAApIHtXAQAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3NhZmUtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAADHH9VQRxIAAEcSAAAlAAAAAAAAAAAAAACkgdBsBABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvc3ltYm9sLmpzUEsBAh4DCgAAAAAAAAAAACW8XPv9BwAA/QcAACUAAAAAAAAAAAAAAKSBWn8EAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90YWdnZWQuanNQSwECHgMKAAAAAAAAAAAAeqB+aBINAAASDQAAKQAAAAAAAAAAAAAApIGahwQAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAJAAAAAAAAAAAAAAApIHzlAQAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAApSvp9wCQAAcAkAACIAAAAAAAAAAAAAAKSBaZYEAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAiH2BrN8CAADfAgAAKwAAAAAAAAAAAAAApIEZoAQAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAAdp03rvhIAAL4SAAAqAAAAAAAAAAAAAACkgUGjBABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9tZW1vLXJhY2UuanNQSwECHgMKAAAAAAAAAAAA00Ow7mkHAABpBwAANQAAAAAAAAAAAAAApIFHtgQAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAJgAAAAAAAAAAAAAApIEDvgQAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAkg0vx3YCAAB2AgAAGgAAAAAAAAAAAAAApIF7vwQAQGVuZG8vemlwLXYwLjIuMzEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAmpC7DdcXAADXFwAAJgAAAAAAAAAAAAAApIEpwgQAQGVuZG8vemlwLXYwLjIuMzEvc3JjL2J1ZmZlci1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAf7Ujt+kQAADpEAAAJgAAAAAAAAAAAAAApIFE2gQAQGVuZG8vemlwLXYwLjIuMzEvc3JjL2J1ZmZlci13cml0ZXIuanNQSwECHgMKAAAAAAAAAAAAoKCVXcMBAADDAQAAJAAAAAAAAAAAAAAApIFx6wQAQGVuZG8vemlwLXYwLjIuMzEvc3JjL2NvbXByZXNzaW9uLmpzUEsBAh4DCgAAAAAAAAAAAB/iuys/BQAAPwUAAB4AAAAAAAAAAAAAAKSBdu0EAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9jcmMzMi5qc1BLAQIeAwoAAAAAAAAAAAAXyFLuJDQAACQ0AAAmAAAAAAAAAAAAAACkgfHyBABAZW5kby96aXAtdjAuMi4zMS9zcmMvZm9ybWF0LXJlYWRlci5qc1BLAQIeAwoAAAAAAAAAAADek343pRsAAKUbAAAmAAAAAAAAAAAAAACkgVknBQBAZW5kby96aXAtdjAuMi4zMS9zcmMvZm9ybWF0LXdyaXRlci5qc1BLAQIeAwoAAAAAAAAAAADnCVhiLAcAACwHAAAfAAAAAAAAAAAAAACkgUJDBQBAZW5kby96aXAtdjAuMi4zMS9zcmMvcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAABA0RBq2BgAAtgYAACIAAAAAAAAAAAAAAKSBq0oFAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9zaWduYXR1cmUuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAHgAAAAAAAAAAAAAApIGhUQUAQGVuZG8vemlwLXYwLjIuMzEvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAIPZKxZYBwAAWAcAAB8AAAAAAAAAAAAAAKSBEVMFAEBlbmRvL3ppcC12MC4yLjMxL3NyYy93cml0ZXIuanNQSwUGAAAAAEkASQCeGAAAploFAAAA","endoZipBase64Sha512":"6db50910926c0e3c10e85adf10dc8b6cfbef14b91ae9cecbdf07c6846fdc6f14ad973543ce7fa0fb9474d608b79d14c9c98a39a65f4e4c2037b4e4345b0a4786"};