From 63009af2e0f5203e47f752695e40f8288eecc13f Mon Sep 17 00:00:00 2001 From: Chris Hibbert Date: Tue, 25 Jul 2023 09:57:04 -0700 Subject: [PATCH] chore: get it to work, and drop old instructions --- .../agoric-upgrade-11/actions.sh | 21 +++++-------------- .../zoe-full-upgrade/Zcf-upgrade-bundle.json | 5 ----- .../zoe-full-upgrade/Zoe-upgrade-bundle.json | 5 ----- .../prober-contract-bundle.json | 1 - 4 files changed, 5 insertions(+), 27 deletions(-) delete mode 100644 packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/zoe-full-upgrade/Zcf-upgrade-bundle.json delete mode 100644 packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/zoe-full-upgrade/Zoe-upgrade-bundle.json delete mode 100644 packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/zoe-full-upgrade/prober-contract-bundle.json diff --git a/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/actions.sh b/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/actions.sh index 54cce0f211a9..144b9a1d220e 100644 --- a/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/actions.sh +++ b/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/actions.sh @@ -7,7 +7,7 @@ upgrade11=./upgrade-test-scripts/agoric-upgrade-11 # Pre-steps: # * fill Wallets -# * install bundles +# * build and install bundles # * create instance of prober contract and run expecting no atomicRearrange # # Action: @@ -24,14 +24,14 @@ echo +++ checking Zoe/Zcf hashes +++ ZCF_HASH=`jq -r .endoZipBase64Sha512 /tmp/bundle-Zcf-upgrade.json` ZOE_HASH=`jq -r .endoZipBase64Sha512 /tmp/bundle-Zoe-upgrade.json` echo bundle-Zcf-upgrade.json $ZCF_HASH -grep $ZCF_HASH zoe-full-upgrade/zcf-upgrade-script.js || exit 1 +grep $ZCF_HASH $upgrade11/zoe-full-upgrade/zcf-upgrade-script.js || exit 1 echo bundle-Zoe-upgrade.json $ZOE_HASH -grep $ZOE_HASH zoe-full-upgrade/zcf-upgrade-script.js || exit 1 +grep $ZOE_HASH $upgrade11/zoe-full-upgrade/zcf-upgrade-script.js || exit 1 echo +++ prober hash +++ PROBER_HASH=`jq -r .endoZipBase64Sha512 /tmp/bundle-prober-contract.json` echo bundle-prober-contract.json $PROBER_HASH -grep $PROBER_HASH zoe-full-upgrade/run-prober-script.js || exit 1 +grep $PROBER_HASH $upgrade11/zoe-full-upgrade/run-prober-script.js || exit 1 echo +++++ fill wallet +++++ agd tx bank send validator $GOV1ADDR 12340000000${ATOM_DENOM} --from validator --chain-id agoriclocal --keyring-backend test --yes @@ -39,19 +39,8 @@ agops vaults open --wantMinted 10000 --giveCollateral 2000 > wantIST agops perf satisfaction --executeOffer wantIST --from gov1 --keyring-backend test -# This test needs bundles for Zoe, ZCF, and the prober to be installed in -# ./zoe-full-upgrade/, with names matching *bundle.json. The bundleIds for Zoe -# and ZCF must be updated in zcf-upgrade-script.js, while the prober's bundleId -# goes in run-prober.script. -# -# The bundles can be generated by running the test in -# vats/test/bootstrapTests/test-zcf-upgrade.js. The Zoe and ZCF bundle files are -# generated in ~/.agoric/cache, and their bundleIds are logged in the test. The -# prober bundle is generated by uncommenting `fs.writeFile(...)` in that test. - - echo +++++ install bundles +++++ -for f in $upgrade11/zoe-full-upgrade/*-bundle.json; do +for f in /tmp/bundle-{Z*-upgrade,prober-contract}.json; do echo installing $f agd tx swingset install-bundle "@$f" \ --from gov1 --keyring-backend=test --gas=auto \ diff --git a/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/zoe-full-upgrade/Zcf-upgrade-bundle.json b/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/zoe-full-upgrade/Zcf-upgrade-bundle.json deleted file mode 100644 index a0e191c5b659..000000000000 --- a/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/zoe-full-upgrade/Zcf-upgrade-bundle.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "moduleFormat": "endoZipBase64", - "endoZipBase64": "UEsDBAoAAAAAAAAAAACr0FgnqAwBAKgMAQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0cy12MC4xNS4xIiwKICAgICJtb2R1bGUiOiAiLi9zcmMvdmF0LXpvZS5qcyIKICB9LAogICJjb21wYXJ0bWVudHMiOiB7CiAgICAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2Fzc2VydCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hc3NlcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Fzc2VydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFhNjQ3NTkzZTlmY2RjNzUxMDkyMTBlMjY2YjhlN2E5YzBlOTlkMDEzNmY3M2I5OTJhMTVjNDZhOWU4N2QwMWM5Y2Q2ZjBhMmY4YWU1YTgwYzRiYmI1ZWIwY2FmMzVmNDJjMDQyOGU5Y2NmMjI5ODUzZDM1YzBlOTRlMmIzMjM3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkxMjFkMTVkY2IxMGY4NWY3N2I0MGQ0OGVlODdkNWQ1ZDc2ZjlkNDkwMmUwZThjN2Q4OGMzMTdjMGIyZmUzYTJiMGRlZWZmYTc4NzYyOTQxMThmZGY2NTFhZTRmYWM4NzM5MTc1NjkxNzI3ZGM3NDkyMzRjMTQ0NTI4NWE4NDVhIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEzNzc2ZTMyYjA0Mjc3NDU0OWNiZWJhYmZiNjIxZDZmOGVmOTJlMDNhZTdjMmQzMWQzMTg5NmFjMmVlY2VjOThkMWU5YjY5MjlhNGI1OTQ4MzQ2NzY4ZGI1MjFmZTIwNGFlZWRjZjVmZmYzNTlmZTJlNGNhMDVkNjNmNWE0OWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudE1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudE1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMjVkYTYwMDk1YmNhYjJhOGY2ZjM1ZTQ0ZThjYTNmMmYxZGUzYmRkYmQ0MmFiYTBkODJmNTg4MDA0NjM4ZGZhYTZiMjQxNzk1ZjU5ZjBjZjYxNDlkYzIyYWZjOGIyY2U1N2Y1NjYwMjgwNzY2N2I0ODc5YzJjN2E0ZjU1YjYyYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kaXNwbGF5SW5mby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGlzcGxheUluZm8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4N2ZkMzZhNjQyOTFkYmMzYjJiZDk0OTMzMGQ4Mzk3OTYzNGM2MTVjOGI5MGRlYTRlZDYzZmM0ZWZiNzZmMjYyOGI3ZTcyNzc4YWEzZTc0NzE0NTQxODlhODMzNWJlMmZiMmYyNGQxOTgxZDU0MDdjMWM1MjhlYWJjNmFiZjAyZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzM2E4MTQzNzhmNDFlMWI4ZTZiYzU2N2QzYmZkNGI0YTc4ZTg3ZTQ3YmE3ZjUxOWU5NTgwMjFlYTdmMGExMmFlOWFjOWY3NjZiNDcwNTI4ZDQ5ODhhNzY4ODE4ZjBiYWIxYTE0YWMwMTUxOTBkNTQzMWM4ZTU1YzFmMzNjNWNjZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlcktpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNlODkyYmYyYTUzOGYyZDVmYjVkMmYwYTJhNjY5Zjk0ZmFmMTZmZWU2N2I0ZGQwYWUxYzIyM2M5ZmM3NmU5YmYxNmZlNzc2OTg3NmVkNjI5YmQxZWFiZDRkZDIyYmJkN2E3YzhmNDg1NWM3NzIyYTNkNTRmOWY3MzE4NzZkYmZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZThiZThkYzM2MTRkYmUzNTdhMzhhZWYzZTg3NWExY2Y0NzMxNDhlNDliMzcxOGY4MGQ4Njc1Y2YzZjdhZjdkMDcyMzlhMWE3MDg0ZGU2YTdkNjY0MTIzYzYxYjk2MjU4OTZkMzM3OTE0MTRhYjRkMDUwYjZkNzZlMGU4MWIzNzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMTEzNjFjODgzY2RiODAyYzllMTk0YmNhYTE1YjU1ZWNiOTQ3ZjQ1YWQyMjQwNGYzYzk5Y2NjYzQ2ZmRjMDA2ZGI4YjZkMTZmOWY4OTNkYmZmYTNhMjM4ZGQwOGMwOTJiOTliODhkMDMzNWRlYjVkMWE0NGU3ZDdkNTI0ZDk2ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlOTJlNjA3MTNlODU1ZDYwNDQxZjhhNDg3YTE1ODlmN2NlOTk1Yjc5MmQ5Yjk3NDcxZTBjMTlmNGU2MmZhNjUyMjI5OTRkMGMxOTJhOThmOTgyZDQ0MGQwNjkzMzM4MmZjNGM0N2E2MTRkZDUzYzcyNTRhNGE2MTdkODY5YmYzMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NjQ4YmQ0NmRmOTljZDgwYTBmMDEyMWZkZDQ4YmI4N2VkOTYyNjkzNjA4ZmIxYTNhNGE2YzA5NGI1NzI5YTBkOTZmNDBmMGYyMWJkNzQ2MTZlOTJhNDFmYzdjYzVlMTE1ZTI3MWRiMWRmNzdhNjRiNGNhMjUxYjI0OWI1ZDFkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmZkN2Y5OWI4YmVjYTY5MzJmN2MzN2I2YTU0MjhmMTU3ZDE0YjM2NzNmNWIxODk1M2NkYjM4NTc5YThjZDQ2MTE5OTc1OTdkYjIzM2EzYzBkYTRiMDJhZTJhYTAyYjQ3YmU5MzM3ZDNmM2JjOTIyODRhYTZkZWU4ZjYxNjk1YjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudExlZGdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudExlZGdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI5MmM0YjUzNjY5MDlhZTFhMmVmMjk4MWI2ZmIwMzkyNzcyMGRiYmQxYTMyZTEwMzdhMGJjZmVhNDliMzA5Mjg1MTExZjEwZGIxMjAxYjA4ZmQzYWI3NWY5MDM0ZDg5OWM4ZmFjYWRjMDdmMGY1YTQ3NjZkYmUxMzgxNDBmYmExIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1cnNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdXJzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkN2RkYTZhODQxODBjNjhlNmQwOTcyYTY4ZGM4ZGViYjUxNWI5MmNlODBjMjE4ODE2ZTUzMWYyNGRhNjQ4ZjU1NWY2ZjZjMmRiYjgyMDBlOTQzNTlhZDYxYzA0NjAyNjlhNGQ0YzA2NWE5MDVkYTk0ZTA1N2QzYWY1NjI1ZTIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFuc2llbnROb3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImExMWIyYTZmMjlhZDQ5NmJiYWQwYzU5ODgyZGRjNDkwZjNlYmVjOTYwNmI1MWUwYjcwYmU1NTg1MTEyZDMyZTQ5ZWRhYjhlYzdhYTU3ZmYyYmQ3ZTQ2M2Y1ODdmZTY0YzA2YWM4ZDVjODYxMDIxZGI3NWRjMDM4YzNlNDRlNTU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlOGU2YjIwNWM5OTBkMjcwM2U2YTE4NGMxYTNkZjAxZThmNGVlYTk5MjdiZWIxMjAyMWFiNmQwZTE4MzUwODc1NTk2ZjU4MjhiNDBlMzc0YjUxZjVjZjdlZTYyNTkxZGJkMjVjMWI0NjliN2Q1OGM5MTE1ODg4YTNlYTVjZDQwMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTAyMWY1NGI5YWZjMDI1Y2EwZTkwZDJkYzJlMGJlZDJmYjA4YjA2M2M2ZDY4YTQ0YjFlYzJlYjc4MzkwNzY5NmMyZTRiM2NkODA1NjA1MWRjMTMxOGQ2YjQ1YWM1NzMxMmFmN2YzZjlkODQ0MmIyYmVmNDAyNzZhY2Y2MjQ0YzEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVybmFsIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvdmlydHVhbC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi92aXJ0dWFsLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0cmVhbSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgImFueWxvZ2dlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhbnlsb2dnZXItdjAuMjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYW55bG9nZ2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFpbi5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jYWxsYmFjay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2FsbGJhY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MGZjMDkyMDc3ZWI5ZDE0Y2FmNWZkNDUzMWI4MDQ0NzI3YmRhYTY1NTRjNGQyZmNhOGY3NmY5YjJkYmEyZGQ0YmEzOTA5YzUxNzM5ZjQwZmI5MDI5ODlmZGNhMGI1ZGU2NTJkOTZiZDJmOGI3N2NlNTA1OGE4ZDAyNWI4ZWM4YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb25maWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbmZpZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhMzE4ZTEzNzliZTdhODg3MmRkOGRhOWU3ZmFhMGQ3OTIwNWI1Yzg5OWM1NDEwZmI5MGE0YmM4OTViNzU4NTVjYzcyYTdhOWZkZTM1ZGEwYTA3NWQwNmNhNzdhNWYwMGRjOGI2YmI0MDA5Y2UzZjE5NDNkOWJkY2NjYmJjZDUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlYnVnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWJ1Zy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUwMDFlYWNhNGIzYjI0NDc5NmFmNzFhZDQ5OTFlYjA5ZjkwMGRhOGFkNDY4MDRjMjJiMDgxYTg2MTk0ZTQ2MWIxNTEyNDU1ZWYyM2E1ZmFiMTJlMzdmZDYzOWY1MDdmMTkyNTZiOGNlMTA1M2ZkY2Q4NzA5ZTIyYWZmNjNhYWYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdhMTJlM2I4NzlmYjM5NDU0MzhkODI3MTNhOTViZDc3MTI5NzQ4ZDcwZjk2MWQxNWVlZGNiMmE0YzQ1OGZjZmJiYjljNzA5ZTUwMWNlNzdlYjMzNTJiNmM4N2IzYmNjNzFiMDY1YWViZWU3MDIxYjg2NDY0MTQ0ZjY4MTE0YmVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MDFiZmVlMGVhOGNjN2ZiYzE3OTQzZmI3ODMxZGUyYWNjZjY0Zjg4OTRlMjZkOWE0ZDU5Y2Q4ZGMyY2JiOTE1OGYyYTczYTU1NTJiNjQ1ZDFiYWZjMmJlZjUzNTJmMWM1MmE0YzMxZmJlMzFhYjJkNzcwNDlkMzZlZmM2MTRiZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXRob2QtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldGhvZC10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjViMGVmZjM5YzkzNzAwMWU5MDlhN2I2YWE1ZmE2OWY3MWM2Y2ZmOGQyODRlNjQyMDQzNjczNWY0OTk1NTNmZTdmMTYzZDFlN2RlNjM2MTM4YjZlNjA3MmNmMzVmNWYwNzBlZmRkNmIxZGVjMjRjMTIxOGU1OTFjODRhZmMxZWI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMDQ3YjBkOTVmNTllZTNiNmYxMDQxNzhjZjczZmNiNmNjN2I1MmJjNTMxMjFhMTg4MzE1NWQxNGZjYzM2N2M1MDVhOTZiODI4M2M3ZmJhMTcwMmRjM2YyY2YzYjNlNzhjNjUyNTAyZDc5YWUzZjQ2NTY4NmMyYzkyOGJlZWQ2MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy91cGdyYWRlLWFwaS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdXBncmFkZS1hcGkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMDFlYjMzZDcyNGUxN2YwYTBiYjRmNzdhZjE3MzMyYWU1ZTZiOWM4YWVmODg3MmUyYTNkZjFhYmVlZDIwNTg0ODIyMTkyZTE2ZDljNDdiZDA4ZjdmZGMyZDE1NTA3NmRjMzVhYzA0ODMwNjA5MTRmZTZhMDgwMmFhYzRlZDRjMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy91dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YjExNGJiZTNhNDliMzlkOGY1ZDQ2ZmI2MDU1ZTM5YzFhZDAxMjk4Yjc0ZGI4NGMzOWZkMTkwMGVjYzQ5NWU5NTY4YjBhNDkwODY4NDYwNWFiMGZkOWY4MmI5NDdlN2YzMTQxYTg2OTk1YjQ2ZTZlMjlmYjM1MDg4MDI0NDFiYiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvbm90aWZpZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgwOWNiZWVjYjJiZGExN2Q1ZjVkZTVkNzg0NmIwMmU1YTIzZDdmNTRiOTAzZDQ4YTEwNGViMjYzZmNmMzUyOTlhY2VhNGEzZWIxZDU3Yzc1MGJkM2Y0ZmZhZjkyYmE5MjA3MGM1ZmJhNTI2ZmJkNDExNWIwYTk5ZDVkMGRlYTQ4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1Y2NhNGNjNjQ1Y2VlMTRlMTJhNDVmNjg4YTI3NTBmMjNjMmI4MTE0MDliZTdmMzY5ZmYwN2YxN2I5ZGEwMjM2NGE4ZTczZTBjMThhZDM0MzFjN2UwYzFhZTA5Zjk5ZGM4NDdkYjMyNWFmYmEwNjJiNjVlYTZlZGEwMjJhZTI1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZmNTY2YzZmMjAwN2YzZjc5MTMyNjE2MWNiZDIwNDE5NmI0NTkxZWVmMDk1Mjk2NDJhZjg0ZGYwYTNkYmQ3ZjczYzBmZDRlYjE2NmZhNGI3ZDk2NDRmN2VmMWQ2NzhmNzljZTkyN2VmNDU2Y2E3MDExNTdmMmExNTIyNjczYzMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQwM2U0NzUzZjU0ZTBjYjEyZTc5ZDNhZmRjMzVmOTBlNTg0YmRjMTlkYjk0NmU1ZTI4Nzg0ZGEwOGRjYWE2NmFlZGUzMDkzMDgzOWZmNjkwZDRiMDM2MWU2OGQ2MzY4Nzc5MjEzYTkzNjhmMDljYWUzMjBiNDFlMjFiMDg5MGI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC1ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLW5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTUxYzVlYWJjZTE3YjM3YTc0OGExYTUwMjA4NmFlYTBkNWE0MGY0M2FkODExYzM3YjczMGQwMDRjMDZjMDdhMzFhYzdkNTg3Yzk5NmI3Nzk1YjY2MjdlMTM5NDU2YjNlMGQ2YWMyYjUwMzc1NDQwOTM4NmIzNmMxNjliNTM0YzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGY0NmY4MWE2NDcwYjdlMWFhOWYyMmNmZWIyNzRjM2Q2ZDg3ZmNmNDkzMzE4ZTYwZGQxNDQ0YmNiYzVmZmYzYjhmMjhiOGI2NGU4ODZlM2VjZmEwNDQ3MzRiYTg0NWUwNDI1OTJiMmRlOGQwMTk5NmFkMGU4YTBiYWM5OWMwOGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYmMxMmJkZTYyYTQwZWU5ZTQ3OThlMDg4Mzc1MmY5YWI1YmQxYjg2ZGM3ZWIyOTFjZTI0NGUxYzZiNzgwYzgyMzA5Yzc1MjE2NzNhOGQyOGQzZjY1N2VlNzgyYWFmMmYwNjM5MTk5ZDYyMWRjN2U1ZGFhNGJmYjlkYzIxZDE5MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTYxOGZjNmY1ZTcxZTVlMWI3ZjA2NDUxOWU4YzVlNzk2NTBjNmRkZjU2MjkyN2EyNmEyZWY3NDVmNTRhNTYxZTczMzdhNTM2OTA2YzQwMWZmMjZhMjI2ZGJlMDA0NmFiM2Q2YTdmNjJkNjkzNTg4NTY1NDdiMWM3NWZjM2E0MmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdG9waWMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RvcGljLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTdhMGUwNGE0YWVmMzIyNTZkMjE4Yjg0YjI1MmRmODIxZDAyNWI5MGJhMWUzNzQ1NTdlNjM1OWJlYzBlMzIxNTAzODAzOGFmOWZkZjA2MTAxMTBiNzU4ODllODE0ZjdmYzBlNWMwODJkNTc4ZjQyNDMzMWUyNDYxZmU2Zjc3NDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtYW1iaWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZlMTdiOWRiNjczYzRhMTNmM2U3ZWY5YTBjYmNlZjE3OTI3ZjE2ZTE5M2M0MzgwOWM4YzZiYmFmNGI1NWU2ZDkwMTYwZDMyMmZjNzU5ZTk2NTA0NDVlOTM3NzIzYjE0ZWFkYTI5ZGI2MTczZDJiZGQ1YWZiOWEzNWMzOWY0NjNlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3N0b3JlLXYwLjkuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9zdG9yZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4byI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8vcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8vdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImV4cG9ydGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWFhNDYwYmJhNzY0NDQzZDVjYWZiMzNmNTIyNzkzYmJlMjllOGQyNGYyYzVlNzdjN2I2YTFlYzA0MTUwYWY4MDBjN2JmMWMwNWZlNTA0NTBkZmQyOThjY2Q5MmE3OTg2MDFiMWI0OGEyZmM0NGE5ZjliZGJiNjhlMDkwY2VhMjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTNjMjcwZTQxOTBhYjAxZGUxOGQ5NjQ4ZmMzZGE3OTNhNGM4OGNhZDY1YzJiZjJkNzU3YTJjMTM4MmMyZmQ2MGY5MDc1MDExMDI0YjQ3NjRiOGY4YTEzOWI4MWI0YmMxYzZlOTc3ZTE4ZmVjMzUzMzExYjQ3NmIzYWQ0NjgwNjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdhNjRmYWI5YWRhYTU1MTgxODhiODNiNmU0YmUyMTBiY2Q5NTcwYjg4MWU3YWFiZDY3OWNiOTdkYWY3N2FjOGY5MzcwYTQxNDAxODgwZDhlOTIzMDgzZGRkYTMwYjc1YmZjNDQzZjZkMTEwOTQ2YTViNzE5MmQ0MTA2NzU3NDQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFjYzliYjZmYWYyYzI4YzEyNjQ3OWQ0NzFkNTA3ZTg2ZTBhMjBmNzg5YjBjZjkzNWMyZjM0NGJkZDdlMTgwMDdmOWJjYzYzNWI3ZTEyMzI0NWNjYWE0ZTVkY2QzOWFkMmYyMDIwZmM2NDQ5YjNiYTNlOWRkMGRkMWNhZTlmYmYxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTE4ZDAyYjRlY2ZkYTkzMTE3Y2U5YWUzZjU3Y2FhNzdlYjJiYWZlM2E3M2ZkMGY2ODEyZjZlYWQyZjI1OGRlN2RmNTAzMDgxOWU3OTgxNzllMGM1Y2ZiZDAxY2IxMDQ5MTcyMWY5NTFhN2UyYWVmMDNiNmZiMmE4ODMzOGY5N2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2Mzk5YWFmNjY1NTk4ZDRhZmRjN2NhYTllNTY0YmVhODNhYzM4MWYzOTA1NzA3OGIzZGE2YTEyZmZlYWUxZDU1MWNmN2MyY2ZhMTFjMzY5YjcxYzc2OGNhOTdmZTA2OTg0NmNlMThiOWI3MTg3NmQ3ZjA1YzBiYTc1MDE3ZWFjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjYyMDZlZjY2YWI1MzgwYjc5YzI3Zjk5MWVjZWQ5NWM1MmYzY2FkOTZmODgyMWY5YjA0ZWQyNGY4Y2JkNzdmZDA3NzI1YzMwOGU5ZTI3MWJhMWY0ZDFiNTc0MTA4YjdlMTY2OGMwMjQwMzNhZGRhZWY1YzUwNzUzMDI4NGUyNWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYwYTM3MzI0ZmRhYzAwNWE0NmMzZDI4ZDMzNDA1ZjVjNmY4M2RmN2UwNTU2ZjBkYjNjODNkYjlmMjEzYjlkZjIyMmE5YzZhYmY1ZGE5N2VjMmUzODM0NGQzZjdmZTgwMzk0YjE4ZDBlYWI5NDEyOGE5NGRjYjM3OWNmNDdkODVhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGZlMTZhNmQ4MTI4YjUwYTI4YjM5Y2RmOTZhODdkMWIyMTJhNmJiZjA2Zjc1MjAyZjY4ZDVlNWE4YzA5MmIwYTJmZjVmYzRjZjg2MjM5ZDE0NGRlMTQ0NDVkZmU5ZThkNTYwNjhkOWNkNmRlNTBjNWQ3N2IzMWU0OTk1N2QzYzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTA4MWQ4NDQ2OTg0MmE1NjcyOWE1NWVlYjU0MTJjN2YyZmZjNWNiNjJlMzdmMGQzMzVjNTEzNmVhOGQ3OWI4Nzk4MjYwMDBkYTRlYmMwYmNmN2I3YjUzN2E3NzQ4MmExZTUwNDlmMDU1N2U0NjQxMDhjZmQ3NTMxYWE2YTQ0NDMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdGltZS12MC4zLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdGltZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NWRmZDRlYWI3MmE2YzhhODdlYjc4NjNlN2QxNmZkYTEwNzhkMDg4ZTQ4ZWQ1NTJiYmU3Y2FiYzVjZWQ5OGM5NjViODIwZGY0Nzg3Mjg1OTc0NWFmNzM0ODRkMWQ4YjIxNTM1YzZmZjFmYzRiNWU3NTRlNjYxMGQzZDFmMzc0NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90aW1lTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGltZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YjIxYzhmOTkzYTg5N2Y0NzllODgyZTM1NDA4MDRiOThlOTEyZDM2OWE4NjdjYzkwNDczNjc4MDkyNzFkYzE3OTEyYzFhOGQ3NjY0YjFhOTgzNjM3MGM2N2U3YmZhNGE1OWVmNGFmMDE5NjdmNTMwNDNlOTQ1ZGE1OWQ5YTFkMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjcyMjQxNzNiNmQ1MWZkMjllOThkM2VlZmNjYjk0MDUyNDcxMzU4N2FiODg0MjUyOThhOTJhMGM0YjFhZjcwNWViYTRmYTE5MjlhM2M3ZjBiMTRkOGY2YzNhMTM4N2U4N2YyNjJlZjI5OTM2ODk5OTYxZDM1ODY0NWYxZDhmYTgiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdC1kYXRhIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0M2MyOWEzODUxOGI2MDQ2MTVlMTJlZjRhZDY1MDNlOGJlNDQ1NDI0YWFkZmUzOTIxMGIyYWZhYTc2YWE4YWI2Y2NmZjI3ZTc3OTY1YWVkYjA1OWQ4MjU4MDRhNTA3NzUyNzY4YmVhOWJlYTA5NWU3M2E5OTI5YjAwNGU0NDQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQwN2M1M2NlYTJkZTcxNWUxOTZjNmJmYzczMzNlYWZlOGRhZTdmOGI3MmY2NzUzNTIzMzkxZWM4ZDU3Njc2MzI1OTYxMDY5NjUxYzM3M2MzNjRlMjYzY2ZmMmIxNTAyNDBmMDNmZDIwZDZkMDM4ZDY3NWU4ZmFkZjliZGFmZWI3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM2ZTFjOGVhOGNhYWRmZTkwNDQzZGQ1ZjNlMGM3M2UyZmRjYzg5MTQ0ODBkOTEyYTNmZTFlYzliZGY2MGFiYzY0YzYzNGZhYWY4ZjMzZTBkYTc5Nzc2ZWUxM2U5MzNkZDlmYTk0ZjM3NWNkZGUwYWQ3OTlhNWY4MGJjZjIzZDhmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3ZhdHMtdjAuMTUuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy92YXRzIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdmF0cy12MC4xNS4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdmF0cy12MC4xNS4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2dvdmVybmFuY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc2hhcmluZy1zZXJ2aWNlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc2hhcmluZy1zZXJ2aWNlLXYwLjIuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9zaGFyaW5nLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdHMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjE1LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy96b2VTZXJ2aWNlL3pvZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvdmlydHVhbC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi92aXJ0dWFsLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlYnVnLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvbGVnYWN5LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGVnYWN5LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcHJlLWJ1bmRsZS1zb3VyY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUtYnVuZGxlLXNvdXJjZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS1yZW1vdGluZy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS1yZW1vdGluZy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3Vuc2FmZS1mYXN0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdW5zYWZlLWZhc3QuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgImltcG9ydC1tZXRhLXJlc29sdmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiaW1wb3J0LW1ldGEtcmVzb2x2ZS12Mi4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFpbi5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtem9lLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtem9lLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTg0YmFhNzM2ZmNmODE4NGYxMmVkNDU3OTBjZWRjYWE2YzYyY2E1MTI0MTAyZTc0MzRmZjNmZDFhYTI4YWM2YTFhZTI4MzhkOTYzZDljYmViZmRmMDk0Y2EyNzU3MTE2NzgwYzkyYjEzODEyZjA2OTcwZDA4MzFmN2I0NDBiYjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9lLXYwLjI2LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zdWJzY3JpYmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2NhY2hlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9jYWNoZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NhcHRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NhcHRwLXYzLjEuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgInlhcmdzLXBhcnNlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJ5YXJncy1wYXJzZXItdjIxLjEuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVpbGQvbGliL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInlhcmdzLXBhcnNlci9icm93c2VyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInlhcmdzLXBhcnNlci12MjEuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9icm93c2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NsZWFuUHJvcG9zYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NsZWFuUHJvcG9zYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZjM5NTY2Y2RhMzNmZjUyYmY5MDViZDAyMTc1NzM0MjIyNjI3YTEzMjk5MzJiODI4MmJjYmYwZmFiNzZmYTgwZTIzNThiMTU2MDJhMGNjYzg5ZGVmMThlNjgzNTI4MDU3MjI2MjhlZmVkODBlYTY4NTEwMGFiNDNkNTMwYzhkNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTJhMmZlZTQ2Njc2NzU3NTNhYjg2ZmI4NmVlZTc3N2FjYTI3NGUwMDczMWRlYmYyN2Y2N2Y2Mzc4MDVlZjY1NjE2OWUwNjJkOWJmMTk4MGVkMTJkYzdjODI1YjljYTg2YzYyZThjYzkyZWI0MmQ3NWFjMTkwOTNmOGUyYTUzZTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5zdGFuY2VSZWNvcmRTdG9yYWdlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbnN0YW5jZVJlY29yZFN0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZGM1OTU3MzI4MjIwMjhmODczNDgxNGMzYjFlYzYyYmYzNDZkMGQ1YjgzOTM4Mjk1NGM2NWM2MTI0NDg4Mjc0MzFkZDAzNzUxNDBjMGZjOWY4MjBiODEyZjg3ODZiNjhlYTg3MGU1MmVhZGUzNzA5NmFmZGVhMTNiY2E0ZGRlNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbnRlcm5hbC10eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW50ZXJuYWwtdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZTFkYzEzMzVhOTJhNzEyZGM4YTJmNGY5NzBhNTU5MTI4ZDgyZGFlMDU2YmY5ODRhMmIzMTVjZThiYjRmNjUwZTgwNjBjZWM4Y2I5ZDNhYjNhZWNjMGNhM2E3Y2NhYjExZmFiZDFmMDI2NWYzNjY4OWY5Y2Q0NWY3N2U2MDY2MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlclJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg0NmU2MzMzZmMwZGNkZWFmNDk2NDIxYWQ3MTdjYTc2ZWQ5MmE0YzA5MWUzMGJjNDI2MmEyYzFjZDYwMTg1N2Q4MGViYjI4NzRiNWMyMDk4ZDkwNGZhZWU5MmM0OGJjZmY0MjJjNWUwNDBkY2ZkNDBmNmZmOGNhNWYxZTI5ODQ5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlclN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlclN0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZmI4OTQzMTY5MGRiMmIyNzk3YjNmMDYwZWI3ZTI2OWZkZjI0NGExYzMwMTllMDcwMTNhNWIxODY2ODYwN2Y2NmQ3MTA3Mjc5ODNlMmRlNjY5ZTU5N2NhODQ4ZmZmNTg4NjU2NzA2MjcxZTczYTNjZTNmZGFmNTQzZDkzYWJjYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlSGFuZGxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlSGFuZGxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDRkZTM5NTMzMDQwMTE5MDFkOTA1MTMyMDBiOTg2MGZkNWY1MmE5YzY5ZDFmNDIxMDg1MzVlODA1ZDE3MWEwMTYxMjFmZmNiYTQ4OTk5MTJkOTliZThmZDIyN2IyZTAyZGZjYWIxNGZmZGNhMjhiMmRiYzM4NTliMjcwYWRhNWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvb2JqQXJyYXlDb252ZXJzaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9vYmpBcnJheUNvbnZlcnNpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkY2Y5ODRjOWFhYmE0YjZlYzYwNGE3NmM0MDFmMGQ4MWIzZTU1ZTFiNGMxNjkyNDE5ZmQ5YjllMDg3NDM2ZjZkNmU3YjliMzhhODhkYjYzOWZiZTdlMWExYmY1NjI2NjM3OWRlZTQ3MTUxZWYzMGViNmNhYjA0YzlmNTk5NmU1NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDljYmY2NGYxZjA5ZWVlODIyNTY2MGI3ODMzNzY3ZTg3NTk2ZGRiMjExZGQxN2I5ZmU5MmQ3YWEwZjcwYTMyZmU0NGNiODljNzJhM2ZjNTkwYTMxYWFiNGI3MjZlNmI0YmE2NTZjMWI3ZDIzNWY0MmZjZTkwOTAwNzI4MGFhNTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWJjNzI5NmRkYWE0ZjdmNzQ5ZWJhYzNhMDY2ZmMxNTU0NDlhZjA3MGQwZjI0YTZhMTgxNmJlMTNhZDMyNDEzMWJkMjllMTE3MzVmZjkzYzliZTUxZTkzNzkwNjRiZjJlYjVhZjcxYTRhZWNjYmRlMWZkNDU2NGU0ZWFlNzAyOTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvem9lU2VydmljZS9jcmVhdGVaQ0ZWYXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2UvY3JlYXRlWkNGVmF0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDNjZTY3YTY1ZTBkOTJiM2U3ZTAzNGU5ZWFiYjExNzliNTc5NWRlZmY0NTA4OGVjZTliYjhhNzg2YjU0OTgyMzU4ZTk2ZjQxMmE0ZDU2ODY5ZGMwZDM2ODU0YmZjZWQ1NzA1MmZjMTE4YjAzOTllZThjM2ExMGVkZjliMTRkNTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvem9lU2VydmljZS9lc2Nyb3dTdG9yYWdlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy96b2VTZXJ2aWNlL2VzY3Jvd1N0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMmJhM2UzZTc3MmY0MTk1YmM5NTY3OTRmNjdiNGRhZjQ3YTEzNDVjZTU3MGIwZTRmMTg2MTU4NWVhMDQ3NDljNzZhMjM5MTlhYzA1MDYxNjZiOWVkMjRlNmE5OTczODg0ZjdkZTgzZTE2ZjdmNDA2MDI3MWI1MTNhZGU2OTYyNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy96b2VTZXJ2aWNlL2ZlZU1pbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2UvZmVlTWludC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY5ZDhhZDE0ZGY2ZDMyMmM1ZGI1ZmEwN2ZjYTNiNWVjYjg1NzU3MGVhZGIxZDAzZTkyNThlMmM4ZmRjMmYwY2YzOTI5YjA5NmQ1MGQwM2Y3NTkxOTcyYjk3NDUzYjY4YjJjNGVjOTE1ODllODBmMzM1YTFjODUzYWUwZWE3MDc4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3pvZVNlcnZpY2UvaW5zdGFsbGF0aW9uU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvem9lU2VydmljZS9pbnN0YWxsYXRpb25TdG9yYWdlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTdhYzMxMjk0YTBkZjdhODUyYTkwOWYwNmNjNDRhMDE0MTYyZjQ5NzVjZmUzM2VkMzhiNTQ5NWRmNDRlM2Y5ZjIxNGRkZmU4MGU3ZWM5NzUxY2M5MzU5ZGVkY2Y4YzA4NWQyYzM3MzI1ZjFkYTBmNDZjYWMxODQyZjYyNzllMWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvem9lU2VydmljZS9pbnN0YW5jZUFkbWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvem9lU2VydmljZS9pbnN0YW5jZUFkbWluU3RvcmFnZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgxY2IwMWFlMGM4NjczNGRlNjU2MDg3ZmU0YWUxZDZmMTU0MGQwNjUzOGM3Mzk1NTc3MWNmYWNmNDljNTRiNTU0N2VkM2NkZjNjZDJkYmNmMzI1NzRiYjRlMjI2ZGQ0YWVkMWIzMDJlODM3MWVlZTZmZGQ2NmMzNzUxNjAxZWQxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3pvZVNlcnZpY2UvaW50ZXJuYWwtdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2UvaW50ZXJuYWwtdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4Y2FlNGYwNWExOGIwODZhOWE2NjYyNTdjMGY0NDU4NjI4NTI0NGVjMmIwOGNmY2YyYzU0OTM3MjM0OWZlOTVkYzIzNTNiOTA1Mzc0ZGJkY2I1YzdjYjYxNWE2ZjczYmU3OGIyZjc4N2Q0ZTgxNjk3M2ExOTRjODE2Mzg2NmQxOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy96b2VTZXJ2aWNlL2ludml0YXRpb25RdWVyaWVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy96b2VTZXJ2aWNlL2ludml0YXRpb25RdWVyaWVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzI0ZThhZDJhNjMyYTlkMjc4ZGU3MWE4NmIwODg2ZWY4YTdhMWVhZjAzODdlY2IwN2VlNDI4NzExYjdkYmYwNzY1Yjg1ZjM4M2YwZGM4M2M4OTc5MmJjZTM2YjY1MjU2N2ViNmU1NDA3YmY2YjQwN2FkY2QwMmY4MGI5MjQwNmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvem9lU2VydmljZS9tYWtlSW52aXRhdGlvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvem9lU2VydmljZS9tYWtlSW52aXRhdGlvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA1ZjhkNDEyMTMxY2Q2NDI3YmM2MWRiNzVlMDQzNDllMmY4MWM4MTU2ZDE3ZTBmZDhiNzA5MDM3NDg2ZDY2NzFiOWQ1YjJjNWQwZDA3OWQ0YzcwNzJhZTRlZTZiOGQ4MzU2OWJiYjZhYjcyOTk2MDc0NTNmOTRiMzY4YTNkZTI3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3pvZVNlcnZpY2Uvb2ZmZXIvYnVybkludml0YXRpb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2Uvb2ZmZXIvYnVybkludml0YXRpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhM2QzM2U5ZTBiMGQ1NzEwYzg5NzY5NjU5OTQ2NjRmYjY4ZDVmNTRjYTRiZThhYTliMGE4MDFkODQxZTU0NThkMGYwMzI3MTBlZjQyOWI4MGQ1MzQxZWEwNTRlYzdhM2M5MjI0ZWYwZThiZTZjYjM5M2Y3ZDRjZjcwNTA4ZDhjMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy96b2VTZXJ2aWNlL29mZmVyL29mZmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy96b2VTZXJ2aWNlL29mZmVyL29mZmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNThhNGEyMzQzOTk5MTJiNDgwZjc1ZDMyNWQ4ZDEwNjY0ZjgxMTkxNTRmZGVjZWM3NDgwZDQ2MGNhZmEyMGU4MWY4NTJiNjFjNDg2MWY3ODBkYmEyZTM1N2EwNGFhZGNlZTcxZWNlZmFiMzExYmM1OGE3ZDQ0Y2QxYTEzYzI1MjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvem9lU2VydmljZS9zdGFydEluc3RhbmNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy96b2VTZXJ2aWNlL3N0YXJ0SW5zdGFuY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZWUwMTQ5YjQ1ZjZmYmRmNzA0Y2M2ZWQ0MGUwODQ1NTdhNDRhNzQzZjA5MGU1OTI0ZjI0OGJlYTAzYTk4YmMyMjQyNWQ2NGQzYTFmNTBmNTA0YTE4NjZmNGNkMDhiMWFhNWU2YjE2N2ZkMzVjY2YxYjlhYmVhMWIxNWMxNGVkYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy96b2VTZXJ2aWNlL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTc4OTBkN2M5ZjdkMDlkMjQyMzI0N2QyZTkzZWY2ZmFjNjg5YmVlODAxNjRkMzE2MzJiOTJiM2EyYTljZjgwNzE4ZmU4ODJlMzQzZDhlZGVhOGM3YjA0MGY4ZGJlMjVjNTljYzIxOTgyOTY5ZTBmZTZjZTdjMDA2OTgzMzU2OWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvem9lU2VydmljZS96b2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2Uvem9lLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTljMjRmZTZiMDdmMTk0ODZlZjA1MDc2MGRkZmE5NjUzODVkODRmN2ViZmFhOWRmNDUzY2Q1ZWQxZjFmYzRjOTJiODQyNjRlYTdkNzg5YzNiYTY0MjNlZTg1Y2M2NzZmYTMyN2NlODAwM2JlNzg5MDdiMDhkZWVkMTAzY2NiZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvem9lU2VydmljZS96b2VTZWF0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy96b2VTZXJ2aWNlL3pvZVNlYXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMjRkMjgyYzdlYjQzMTkzNTkyZDQwMjkxZjc0N2EyM2JlNTc5ZTAyODM4ZDg5MGRmMjI2N2Q4Zjc0MDE4M2Y5NTllOWRkNjIyYzQ4NjZiMzA4NTBmMjZmNWFhZTg0OTQ1MzQ2YjlhYzNjZGEwYmE5NzRkYzI3OTFlODA4YTZlNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy96b2VTZXJ2aWNlL3pvZVN0b3JhZ2VNYW5hZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy96b2VTZXJ2aWNlL3pvZVN0b3JhZ2VNYW5hZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzllNWQ2OGRjOTQzMzMwNDVmMjA3YTZiODgxMjQ2NjlkZWUyNjU2MGY3MjMyNTdjZmFkMmQ0YjhlZjM4Mzc5NzJkYmI1NzgzZjM3MjdkNzBjNDVmMzAwOGE0NTAzMDQ1NTc3MDExNzYyMzVjN2IzMjkwM2I1ZDliNjI4NmU2NDYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9uZS12MC4yLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9uZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvdmlydHVhbC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi92aXJ0dWFsLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YmUwMDFiZDZjZDI2MzVlNmFmZmU1N2M0Yjk3MzA1ODUyOGUzM2Q1ZjljMGNmYjI1YWI0Mzg0MzQ2ODYwNDQ3OTM3N2YzNmYyZGE2ZDE2NDc5Y2IxN2QzZjFjMjc4OTBjZGVjMTUzNGY1YWVhOTcyNzJlOWMyY2E5NzFhZDIwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NmZjYTA2ZWFmOWE0MjY0OTQ4YWM0MjNiYTBmYWY5OGFjYmY1NDU0MDIyNzM3OTYzNDhkZDQ3ZTNjMDJkYzQwNTc2NWViYTA3NTE5Mjc1Zjg5NDY1OTExM2JmYTE4ZTAzOWIwMTQzZTdmNDViZTM5MjI0MTIxODJlOGYzOTg1YiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNTM2ODQ4MjZjYjU2NjA5ZjYyYjdkNmI0ZGUzM2RhZDIyYzIwYWRhYTJlYjM4ODAwYzM2NGNlYzUwOTczODNlOTczZjA1OGIzMzVkNGU0YzQ4MDMwZTQyOGY3Yjk4ZGRhMmJmMjI4OGRiYTMwMDhhY2I1N2I0YWU3MjIwNjRjYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmUyODIwMmNlYjIzZTA2NGQ1ZGNjYmUwMjFhZTdkMWE1ZmRjY2MwMjM0MjcwZGM1NjI0ZmQ5MWRmMjM2ZjkwN2RjYzVkMjU0MzI2ZDFjZDMyYWM1MTE3NjAyZDJmYTIzOWU2ZjMyMDMzMjgyZmQ2N2UyNGYxYTdhNGRlOTU2MzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDc5ZDNhMjllYjdiZjNiYThhMzlmMmY4YWVmODUwYThhOWNmZTEwZjk1NzIzZDI3MWQ0NGUyMTIyYTJlOGQyZGU0OTQyNmMxYzRkNDhjYTU5YzhiYTZmZjBkZjkyOTk1NTI4ZDM0OWVlZmUxZDBkNTAzYmRmYTgxZjg0ZmVlNmUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V4by12MC4yLjIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V4byIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2IxOWMwZDc0Y2M1MDg4MjdiMGM5OGMzNDViZDU3NzU1MGU1ZWEyMTBhOTUxNTM3MDgyZDM5MDZkYmRiN2IwZjI4M2FjNzZiNzUxNDhmMjRkYzhmMjcyM2IyYjU0ODc2ODg4MGJlYmNiY2NiZjgyMGQwNjVhYzAxNWUzMTJmYzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLW1ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLW1ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFiNmRmMTdjZWM3MDYyMzdiODZlZmJlMGYzYTNiOWVjOGZlNTE2YzVlMDUxNjA3YjgxOWFlY2IyZTYwZDMyNzUzMDMzNWNlOTFmYWI3NzhmZjFmNTE0NWYwZGM3ODNjOGU2Mjc3YmU2NmVlODdiNmU2YjUwMDRhZTVmOGZjZmI1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODY2YmRjM2ViMzVlMGJkMTk4NzIzZDRhNTY5MDI0NjgyNmY0ZjBkNjhjMGQ3YzU0OGY0OTM4YWQzYzk1YjRjYmY4YjkxODMyNmE4NGJiMDBiNGIwNDgzZDc4NTQ2ZjY3NjBmYjM0YjZlNDc1ZWQyZWVjODA5Njg1MzJiNmRmM2IiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Zhci12MC4yLjE4IjogewogICAgICAibmFtZSI6ICJAZW5kby9mYXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjg3NDk3ZTNiZjY4YzUyNzlmMzZkNDBlMjhlNGE3NDM5NzE1ODQwMzFmNjQwZWU0OTcyZDkyNTVhMjllOTFiYWQxOGZkNDY5OWM0YmRjYjNiMzY4MmMxOTY1ZDc2YzI5OWQ0N2ZiNTgyZDI2MjhiZmZjNGZjYjdjMGYzZDZmMWMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjAuOC41IjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmVjMmY3NmJmZWUzN2Y0NGE4ZDNhZjI3YjI3ODY2YTdkMzNmNzg2OWVhODcyODVlNGZjZmYxYzNkMDc2NGMxYmMzYTVkYzE3NTMxYzcxZDMzZTFlYzY0Yjc1OTYwY2JhZjdmZWVlMDRiN2Q1Y2YzMDViYjgwNGQzMDVhNzgwYTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MzVhNjk2MmQ3MmQ5ZDI0MDUxYjk3NDk5MzIzMjcxOWVmNmQ5NjQ4YmFlZjM4MzIyYTYzNTg3MDExOGQ2ODJhM2M5NjYyYjEwMjA1NzVlMzhhYmFkMDZjZDU0M2NjMjFmZjEyZGVlNTFmYWEyNDdhNjM0OTZhN2Q3NzI4YzI3MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YTAyZWMxYjFiMTNlYzhlMWU3YmQ3NWZmMDdhMDNkZWVlNTE4OGZjZDYyMDFlNGI1YTBjYzRmYTRiNjE1NTNlZDBlMmI4MjRiOTEzMmM1ZWQ5ZmQ3MDkwMGJhYjE2ZmQzYzE0YTQ3MWIwMDNjMjVjZTI2MWFmNDIwMzMxYWU0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlhOGRkMmEyZmY4YWIwNWQ4MTI1ODk3ZjE3MmFhMGE5ZmE0Mjk2ZGFmODI5ZjQ2ODI2N2I1OTNkNDVhODZjMGU0Nzg4MjRkZDBhYmY1NWRmMThkODBmMTc5MDMyNjQ4NmE1M2M1MDBjZmQ3NTk3ZmQ3YmIzZmZjNTgwZjU0N2Y5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiMjMzYTVjNTYyMjIxMjRhYWI1ZGU0OWUyMWY3NmQ2N2I2ZTNjZjFkZTBmMjQ1ZjIxYjg2YmZiNDM2YzAyMGY1MGMwY2M1OTBhOTZhMGRiYWE5M2U2ZDM5NDM5NTU4MWZlNzY5MTQ5MDAzNDc1NDc1ODgyZTIyM2E2NzAzNDVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJiODJkNTk1ZDJhZmQ1ZDljMDJjNWNiZTAyZTdmN2M5NjA4N2M2MGNkMDkwOTFiOTk3ODJiZDhhN2MxMjZiMjM5MjYyZTk4ZDBmNDYwYTQ4OTgxYjVjZjM1MTFiN2I3OGNkMGYwMDFiMmZhMGU1ZTkzODE0MzVkYTE2ZGIxNjdjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZkNjMyZDY0Zjc2MzlkYjI3OTAwNzZmN2Y1OTMxYjQ1Y2NlMmQ4NDM4N2NkYTJjNzhjOTFhNDIyOWY4MTYzNDQxNzZiYjQ3MDA4ZTE5NzcwNGY2YjdkYWFmZDI3NDNkZWI0NWFkMDZjNWJjNmI4OGMwMzhkZjBlNmRmYmEyN2YzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMjYxNDcwNzE0ZDY1ZDMzY2U2YzhkZmQ5ZGI0Y2NiZmNhNGJjODhiMzE5OTliZjAxOTdiOTViZDAyNzNmY2FlYzM5YzRlODY2NjlmOTc3MGJhNzEyYjBiNWI2Y2QyMzIzZDViYzRiYTJmNTBjN2JlMWQ1NzM3ZmU5YTQ3ZjYwMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVmMDg2YTYwY2QwZjM5ZDcyNjBiODdmOWJhMjAwMDcyYjE5ZmFjYzc0YmNjMGE2Mjc2Y2QwYjEwZmEzOWQ5MWM5ZmU3ZTM3OThjNzgwMDhhMGZhMWIyN2NlYzQ1NjIzZTVhMmFhZTgxYzU0NTYwMzBkZDE0NzViODk1MWYxMmI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjQuMS4yNyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MjUwODJmNGM4Y2E2YWE3ZWNmYWI5MGFjMTE2NWFmZDU4YzcwMGMwNWZiNDZjMzgwYThlYTQyN2QwY2I3YzAyYWRiMTMzNjM1MGI3MzQ0ZjY5MjU2MWMyYTk4ZmEyN2ZkZGQxOTRjM2E2MTM1NWZmZDgyYjRmNzM3ZWJhOTQ5OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Bhc3Mtc3R5bGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGliL2VzbS9hdmEtZmFzdC1jaGVjay5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4xLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzZiNzMyMDNiM2FjMWU3NjAxMDg3MmYxNjY0NTdkNTU1MzI4ZjQ1OWNmNTBhNTcyZmZhMDEwNDFlYzA5MzNhN2Y1NzkxNzBhY2UwYjZlNzZhZjc5MmUxMmJiYmUxYWY1NWJkNmQyYzY4YzRlZjExYjQwZGRhOTRlZmRjNjFiNzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMzhiYjYwZjc4NTRiNGE3YjYxYTFmZDMzYjI0YTdlOWQwNThkYTc5MGU2ZjBhMjk2NDQzZjcwOWYyMDZmZWY3MzE1MGI3ZTJkZWQ3OTljNjM5YjU4ODQ4ZGM0NWE0ZjNmY2FhOTlhMGYxZTcyNWEyYWQ5YTQzZGNlNjkwODM5MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTRiODEyNWQwOWQ3M2IwMjVjODM5ZjYyNTFkY2MwNmE1M2RjZDI1YWU5MThjOTczZTM2MDE2MTE2MzA4YTQ4YzE4MzBhZDMzODczZDliOGVlZTA2YWQ1MGI4MjlkNDUwMzZlOGM0ODYwMzYzOWUyYTU0ODJlZTJiYTljZGQzMGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzRlNjI3MjdjY2E4Y2YzYzJiNWEzYTc4YTViMjc5ZjM2NzkzYTM4ZDM2NzE4MTUyYWNhNWIxZTE4NjY2NWIzMDYzOGRkMTI0YTFiYjhjYzk0NGMxMTFhNzEyNjg2YjQ0ZDBmN2NhYWI0ZjJmNWYwMjczYTA0ZjQyNzZmMjczOGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NzZlYmYzNGU3M2QwNTAzOTM3NDdlOWVhZjM1ZDk3MDdhMTkwNWQ0Y2MxYzUxMGE0ZjE5ZTE1ZmMzNTBlY2IxZGI0OWIyZjUxZjg0ZmFhZWNiOWI2N2FmNTQ4YWNjMmU1MTJmYWIyZmExNjEwYjM2OGRkMWExNzllYTBmMzM0ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOGVlZGEzNmRlZGNhYmNlZmZhOWYyNmU2MzUyNWU2ODg3MWEzMmNiZWRjZDdjMWFkNmI2ZDU5NDM2NmIyNzI0OGMxZDQzNmUxZjlkY2YzYjA5NzEwN2UzODAxZDIyOTgxNDQ1YzhjMzMyY2JkMDUzMDA3NTk5ZGU1MzJiYWYxMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmQwZTRiYzZlNDdlM2Y2NDc5NDZlMWE0YjlhMGNlYTY0N2MzNTMwN2U5NTUzZTU4ZjNjMTMyMTYxODM2YjlkM2I4YzdlNzAxYjNlNjg2MDcxYjYwMWY0YjBiODAyMzMyNmY5YmE0ODdhZWM4MDI1MmM5NWNhYWQ4ZmQ5OTYxNDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDk1YWVkODc0YjQ5NTc2NDhmMGU1NWM4Yzc1OTJkYzdlMWI2NTMwNzllMjU4NjU5NWJkY2Y4OTM3ZjcyMmMyYmU4NjdhZGNhMTYzZDA0MDQzMjUxMDY2MTMwZTAyZGRjOGNiNzY2M2NmOGQ4NzY0YjEwYmY2YTI2YTk2MjRmMTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2MwYzc4YjA2ZmZmMmIxNzVkODQzYTliMTNmZjg3Mzk3MGM2YzJlZWIyZTBhMmEyMDdlOWFjYjI1YTliMGE2MjFkNGVjOGQyMWUwY2NhODgzZDIwMTFiZmVlMDdmN2RiNzI4ZTJlYzBiNDViMjRkMjU4ZWNiZmUwZGVlMDAzNTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTg0MmZlODI1MWQ0ZTA5NmYxM2NiZTVlYmY3ZTBiMzBjNmI1MzBhMDBiMzRmYTA3YmU4MDRkNWQ3YjQwMGEwMmIyNmZmNDI2OGIxNGRkODc3ZTk2ZTFhZTMzYWQwOGVmMmFiODgxMjk2MzJkNjI4NzU5NTJlYWZkMDE3MjExYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjliNzM0MWY4OWVmN2RhYTVhM2EwMTgwZTFiZmY3MWM1MmQwODg3MWViMGFmY2U1Nzc0NzAzZDk1MTgyZGQwYzAyYzA1MDgzM2VmNjE5OWJmMzEyYWM1YzAyZGJlNDUyM2U0ZDhhMGYxOTY5MTI1ZWM3NzU5NmNjYjc2NTAzZmM1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjk5MTliNzhkMDczNjljNjdjYmU2OGU4NjgwYjJjOTE5ZDYwOWQyZGJjYmIyMWQyYzgwY2ZmMjYyYTM2NDUzNDdhNTMwZTczOTFkNDFlNzhhNDQ4ZDc1MTgzMjZhMWNlM2VjYjljOTlkMTYzNDM5MDE2Mzk2NTQ5MmFkZTA0OWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMzlmMzA1YmM3OWYxZGI5YTZjZmJmOTUyNTE5MjViMmVlNTZiZDI5YmIxNTU3ZjI0NDY5OGZjMjM1ZDBhZjllNzI3YWM1NzIwMjI2ZTMyZGM4MGZjOGFmMzYxN2IwYTRkNTNjZTc3MmU3MDNlMjVmZjBiOWViZWQ3NGM3NTczOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTQxNzBjNGUxNmQ1Mzc5NWE4NDc5ZDBjMWE3OWQxOWIxOTBkOTIyZTE2MzAxZTdhMGJiOGI4MTZkM2M0OWJkMjVmZTBiODRlODc5ZGE3ODBjM2ZjMDY0MWFkNjljYzU3ZGQxZTc5NWVjZTdlOGJiMjgxMmY3NDMwNThhZmYwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGF0dGVybnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjMTEwNTVmY2E1ODRhZjRkNDczOTljNTRiYzUwZDgxYWE2OGM2MDNhNTUwYmY2OWEwOWIyN2M4OWY2ODVlOTc0NDU0NWE3NTNhZDVlOGZlMzMzMWFkYmQ5ZDRkY2ExNDNhNTg3ZGQ2MDkzNGZiNDFjODJmNGExZTllYjFkZTUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZTcyYTVkY2Q2NGUxZDdkMjU0NWNlMzBjYzM3MDI0ODQzOTBjOWQ1Y2RkYjlkMDVjZWEzMzZlODhlZThlOTMzYmMzMTUwM2M0YzI1YzM3ZTBhMWNhYzhjZGUzMWNiYmY0NzgxODY0ZDBkODlkNzFmZWU1ODRmNTliMDE5MzQyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDJkMzcyODdhMmVhYzlmNDFjYzQ0YTkyMDFmOTlkZjIyMWE2NzZhNDdjZTc5ZDgwNjBiN2M1NjdjMmU2M2Y3ZGViZDkyNmZmZTM1MjIzZWE3ZjM1OWZmNmE5YjMwYTgzNjhhMzk2YWI2ZGRmYzRiOGIxMjI2NDFmODVjOWI4ZTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZGU0ZjgyZjJjNGQ0OWRiM2E5ODE0YmRiY2YxZWM2NGQ3MWQ4ZmFkNTIxZTExMGU2ODEyZDNiMzczZWQ5MjhiODYxZDc1ZjA3YTY3ZTNjZjRjM2ZlZDZhZGU0NTU3YmJmNGFkOTQ1NzM1YTIzOGRlZGRkMDUzYzA5MzJlNmEwNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRlYWI3ZWMyODRjYWRlMWIwNGRmNGYzYmU2ODZjMTcyYjA0MzkxZjBlZWQ4NTQ4ZTQ5ZjkzMWIzYzJjNGM1MTgzZTg0MTFlZTY1YTBiOWI2ZGZiNWZkZjFhZGI4ZTRhMzYxMjUwYWUwMTkxZTJlYzYwYzU4MTQxOGU4Y2E1MDQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGI5ODkyYjNhMjViZjZiYWQzMjM1ZDZhMzc2NTZmMTFhNDNlNDRhMzhmZThkNWM4ZTQzNWIxZjA5Y2JmMmI0MmY2YWQ2NDk0NDY0ZDU3YWQxOTQ3Zjc4YzhhMTAxOTZiYmQ4ZjUwYjY0ZTI1MTA2NzYzZWRhOTNkZTI3YWRlYmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YjFiNDE3YzZkZDkzMmRiODFmOWRhMTE0YzAyMGM3ZDAyNzhiZjEyYmE4YzQ2MDdmZjQwYWJjNWUzMDE1OTUxZGNkZmJhMmUwMWEwMTUzZjRkMGZmOWEzNzU0ZWJjMDA0NjA3N2Y3YTg0MjMxN2IzMWJiN2EzZjFjYjBmYzkyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMyNzZjNmZiYzYzYjViYmY4M2FjZjBlOTkzMTdlOTAzNWZmMzhkMDRhN2I2MWIyOWY4MDAzNTM4NTAxZmVjZGYyYmU5OTc2YWRmOWUyMmE5MDA5YWI0ZjUxMWI5OGU3ZWZjNjQ5ZmE3M2UyYTlhYzMyMzYzY2NkZThhYWE1MTNhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjExNGIzYTQwNDM4MjJmOGZiZmQyMmFiNjAxOWNjMWE3ZTYwYWRjZjdhNTdkNzBkMjdlOGVmMWMxMTIyNjI3NWY3ZTMxMzc2ZDg0MzZhMTQ3OTk4Y2E5YTA0NjA3NjkyMWQzNjcyZWM5MWRmNmQ2ZjMyMTEwNWJjZGFiM2Q2NzMwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOWZmZTU1YTMxMDM3M2E0NTdhYTlkMDc3MTYxMTg1MDU0ZWIzNmY4MzUzMjhmY2ExNGVmZDExNDUxYzYxNTAyYTEyMGI4M2M3NDgyMDRmYTA4NzdhZmM3MDUyZWIyMmE0ZDdiMGUxYjBiNjE4ZGI5MDIxN2Q2ZThjZTc3YTI5MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTgxNGRkMTQzZGZmNzNkZTNlZTRjMWYwNzcwN2U1NzdjYWFjYWEzYWJmNGIwNTkwY2RlZGUxMGI5MTk5YTkyZDc5N2YwYzExYmI3MzgyOTVjNDlmMWU3ZWY5MGYzZDExNmUyOGU3NGMwODY3MzRlYmNhOGJjZGExZGM5MzlkNDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZWE1NWZhMmNjMWI3MzZlMDJiYjgzMjI0NmRjYzZmY2Q0YTBhMWViYzI0MWUzODFlZjZmNjRiZDhlYzQ2YTE1ZDNmNzk3ZWMyMmEzNWM5YzVjOTUxNDI0ZTM5ZmQ2YTY4N2NkYjQxNTVjOGRiNzFmNmVmZTdkM2ZlOTdlOTQ1YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NWU4MzM2Y2JjNDFjZDJmNjMxMTc3YzA2MTA5Y2YzZjhiNTE4MTRjYjMzZTIyMDgyYzhlOWVlZTA3MmVjNDg5MTlkMDhkNDNkMjlkNTY1NTE4MjZjODk1MTM1ODM1NGQ2OGU1YWEwOTZjNmFhNTY2MTM0OWUwZmExMDgxNmY3OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vc3RyZWFtLXYwLjMuMjUiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3N0cmVhbSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MC4zLjI1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdHJlYW0vcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MC4zLjI1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMDk0MTMyY2I5YWNlN2YyYWE4ZmIyNGE4NWE4NjBkNDhkZDdjM2U1NDQwMDFmZWNmZWQwYTk3ZGMxYTM3YzJmZTNkM2QxYzBlNDQwOTkwYTg2MGU1ZjQzZTdlNmI1N2UzYTBlMTQ2MDI0YjA1ZDk4ODMwNmM2ZjkwNjhiNWEyZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiamVzc2llLmpzLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiamVzc2llLmpzIiwKICAgICAgImxhYmVsIjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAxZGNiZTM0ZjRjMjI0ZDZkNmZmZGRlY2IzZGU1YmRmMmZmMzEzODY2N2Y1NmY0OTk1NTY5ZjBjMmQ5ZmNlM2I0ZGVjNDMzZjBkNDU2YTE4Yjk1ZDdmM2YyMzdjMTE5NmM0ODdiYzQ0ZTQ0NmYyOTVjZjYzZDJkNTgzZDc4ODg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMjEyNGJjY2M4NDYwMTkwMDYxZjRjZGJkOGRmNDliZDcyM2QxYzY1NWFiOTlkMDI2NzZmOGExMTFhMGY3NGU0NzYyY2FjNDNlY2RlZWI4NWQyOTNmMzdjODJlYmMyNWZjNGUwNTJjOTkyMzc4YmM3ZWJlMTBlNjgxY2Q4MzAzNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5YTk1ZDFkYmNjOGY0YmU4MTQyMDRmNjgzMmMxZWFjMzA2MjFmY2NiMDMyOGMwZWM0MWVhNWEwMzkxNDk5OGM4ZWZmOTAxOWVmZjY1YWQ2NjI4OWMwMTU5MTgxZDliNDlkYjJjZDk2ZjNmYjU5ZTIxYWRiODRkOWE0YzBlODk3ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmY3MTYzNzgyZjY3MmY2Mjg0NDkyNWI2YmI0ZmQ5ZDAxN2I4YjY0MmZmMzM2NDRmMjU5ZWUwMDdlMmJiNWE4MWIyNGJmZTA2NDE3NDA1YjA1MDUxOWZiNTNjMjBhODNmMjlkZTEyZjgzYzNiOWQ2OTZjZjdmODRlOThkZTUxMTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MzU3YmJmNmIxMWJiY2JjYTNiOTU5YzVlZTFhZWE0ZmFlYzM0ZmUzNDZiODM4MTk0MDJlOTNkZmJiZGU3ZmY4ZmRjZTM5ZTFmNjA4ZGJiNzY1NDBhODFjYTQ5OGVmZDQ2OTI5ZjQxZTc4OWUyOWJiNmRhZjY3YWQzYzE3NWE1ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9hc3luYy10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MGJmMTIxYTdhNTY5NTE0YzJlMGMxYWE1MWQxNmUzZTBkMTNhYzVlYWY5MDE1M2ExYzI1N2M2OWFjYmFjYWIwZjRhMmRjNjE1MDNiMzM3MmViMGE5ODA2YTYxNTI2NTFmNzAxOWEzN2JlOTJkZTg0ZDhhMjI1NWU3ZjMzMTA3MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWUxNDQ5MGNlNTNhZjQyYmU1MjQ2YzcxNjkyODgzNDY2ZjcxNGU4OTgyNGM3MzNiYzQzM2VhMjk1YjIyMjljZDRmN2MzYjhiYTAyYzY5OTdjNzJmZjAyNzk0YTEyNjdlOWU1ZTRmMTNhMjVkYzQ2YmRlNGRmZTUyM2NkZTU1NDgiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAAA5ilYCOwsAADsLAAAjAAAAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy9hc3NlcnQuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhaWwiLCJOb25OdWxsaXNoIiwiYW4iLCJhc3NlcnQiLCJkZXRhaWxzIiwiaWRlbnRDaGVja2VyIiwibWFrZUFzc2VydCIsInEiLCJxdW90ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGFuLCAnbmFtZScsIHt2YWx1ZTogXCJhblwifSk7JGjigI1fb25jZS5hbihhbik7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge0Fzc2VydH0gKi9cbmNvbnN0IGdsb2JhbEFzc2VydD1nbG9iYWxUaGlzLmFzc2VydDskaOKAjV9vbmNlLmdsb2JhbEFzc2VydChnbG9iYWxBc3NlcnQpO1xuXG5pZihnbG9iYWxBc3NlcnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBhZ29yaWMvYXNzZXJ0LCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0LCBpbXBvcnQgJ3NlcycgYmVmb3JlICdAYWdvcmljL2Fzc2VydCdgKTtcblxuIH1cblxuY29uc3QgbWlzc2luZz0vKiogQHR5cGUge2NvbnN0fSAqL1tcbidmYWlsJyxcbidlcXVhbCcsXG4ndHlwZW9mJyxcbidzdHJpbmcnLFxuJ25vdGUnLFxuJ2RldGFpbHMnLFxuJ0ZhaWwnLFxuJ3F1b3RlJyxcbidtYWtlQXNzZXJ0J10uXG5maWx0ZXIoKG5hbWUpPT5nbG9iYWxBc3NlcnRbbmFtZV09PT11bmRlZmluZWQpO1xuaWYobWlzc2luZy5sZW5ndGg+MCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbicsICcpXG4gfWApO1xuXG4gfVxuXG5jb25zdHtkZXRhaWxzLEZhaWwscXVvdGUsbWFrZUFzc2VydH09Z2xvYmFsQXNzZXJ0OyRo4oCNX29uY2UuZGV0YWlscyhkZXRhaWxzKTskaOKAjV9vbmNlLkZhaWwoRmFpbCk7JGjigI1fb25jZS5xdW90ZShxdW90ZSk7JGjigI1fb25jZS5tYWtlQXNzZXJ0KG1ha2VBc3NlcnQpO1xuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIE5vbk51bGxpc2g9KHZhbCxvcHREZXRhaWxzPSBgdW5leHBlY3RlZCAke3F1b3RlKHZhbCl9YCk9PntcbmlmKHZhbCE9bnVsbCl7XG4vKiBUaGlzIGAhPSBudWxsYCBpZGlvbSBjaGVja3MgdGhhdCBgdmFsYCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuKi9cbnJldHVybiB2YWw7XG4gfVxuYXNzZXJ0LmZhaWwob3B0RGV0YWlscyk7XG4gfTskaOKAjV9vbmNlLk5vbk51bGxpc2goTm9uTnVsbGlzaCk7XG5oYXJkZW4oTm9uTnVsbGlzaCk7XG5cbi8qKlxuICogUHJlcGVuZCB0aGUgY29ycmVjdCBpbmRlZmluaXRlIGFydGljbGUgb250byBhIG5vdW4sIHR5cGljYWxseSBhIHR5cGVvZiByZXN1bHRcbiAqIGUuZy4sIFwiYW4gT2JqZWN0XCIgdnMuIFwiYSBOdW1iZXJcIlxuICpcbiAqIEBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBub3VuIHRvIHByZXBlbmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBub3VuIHByZXBlbmRlZCB3aXRoIGEvYW5cbiAqL1xuZnVuY3Rpb24gYW4oc3RyKXtcbnN0cj0gYCR7c3RyfWA7XG5pZihzdHIubGVuZ3RoPj0xJiYnYWVpb3VBRUlPVScuaW5jbHVkZXMoc3RyWzBdKSl7XG5yZXR1cm4gYGFuICR7c3RyfWA7XG4gfVxucmV0dXJuIGBhICR7c3RyfWA7XG4gfVxuZnJlZXplKGFuKTtcblxuXG4vKipcbiAqIEluIHRoZSBgYXNzZXJ0Rm9vYC9gaXNGb29gL2BjaGVja0Zvb2AgcGF0dGVybiwgYGNoZWNrRm9vYCBoYXMgYSBgY2hlY2tgXG4gKiBwYXJhbWV0ZXIgb2YgdHlwZSBgQ2hlY2tlcmAuIGBhc3NlcnRGb29gIGNhbGxzIGBjaGVja0Zvb2AgcGFzc2VzXG4gKiBgYXNzZXJ0Q2hlY2tlcmAgYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpc0Zvb2AgcGFzc2VzIGBpZGVudENoZWNrZXJgXG4gKiBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlkZW50Q2hlY2tlcmAgYWN0cyBwcmVjaXNlbHkgbGlrZSBhblxuICogaWRlbnRpdHkgZnVuY3Rpb24sIGJ1dCBpcyB0eXBlZCBhcyBhIGBDaGVja2VyYCB0byBpbmRpY2F0ZSBpdHNcbiAqIGludGVuZGVkIHVzZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGlkZW50Q2hlY2tlcj0oY29uZCxfZGV0YWlscyk9PmNvbmQ7JGjigI1fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydCI6WyJnbG9iYWxBc3NlcnQiXSwiZGV0YWlscyI6WyJkZXRhaWxzIl0sIkZhaWwiOlsiRmFpbCJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sIm1ha2VBc3NlcnQiOlsibWFrZUFzc2VydCJdLCJhbiI6WyJhbiJdLCJOb25OdWxsaXNoIjpbIk5vbk51bGxpc2giXSwiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAFuYfs2i4AANouAAAiAAAAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBCYXNlZCBvbiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9IRUFEL3BhY2thZ2VzL3Nlcy9zcmMvZXJyb3IvdHlwZXMuanMqL1xuLyogQ29vcmRpbmF0ZSBlZGl0cyB1bnRpbCB3ZSByZWZhY3RvciB0byBhdm9pZCB0aGlzIGR1cGxpY2F0aW9uKi9cbi8qIEF0IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc3NCovXG4vKiBpcyBhIHJlY29yZCBvZiBhIGZhaWxlZCBhdHRlbXB0IHRvIHJlbW92ZSB0aGlzIGR1cGxpY2F0aW9uLiovXG5cbi8qKlxuICogQGNhbGxiYWNrIEJhc2VBc3NlcnRcbiAqIFRoZSBgYXNzZXJ0YCBmdW5jdGlvbiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIHsqfSBmbGFnIFRoZSB0cnV0aHkvZmFsc3kgdmFsdWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHthc3NlcnRzIGZsYWd9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBc3NlcnRNYWtlRXJyb3JPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vycm9yTmFtZV1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRNYWtlRXJyb3JcbiAqXG4gKiBUaGUgYGFzc2VydC5lcnJvcmAgbWV0aG9kLCByZWNvcmRpbmcgZGV0YWlscyBmb3IgdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcuXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBbRXJyb3JDb25zdHJ1Y3Rvcl0gQW4gb3B0aW9uYWwgYWx0ZXJuYXRlIGVycm9yXG4gKiBjb25zdHJ1Y3RvciB0byB1c2UuXG4gKiBAcGFyYW0ge0Fzc2VydE1ha2VFcnJvck9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEZhaWxcbiAqXG4gKiBUaGUgYGFzc2VydC5mYWlsYCBtZXRob2QuXG4gKlxuICogRmFpbCBhbiBhc3NlcnRpb24sIHJlY29yZGluZyBmdWxsIGRldGFpbHMgdG8gdGhlIGNvbnNvbGUgYW5kXG4gKiByYWlzaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBpbiB3aGljaCBgZGV0YWlsc2Agc3Vic3RpdHV0aW9uIHZhbHVlc1xuICogaGF2ZSBiZWVuIG1hc2tlZC5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggdGhlIG5vZGVqcyBhc3NlcnRpb24gbGlicmFyeS5cbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRFcXVhbFxuICogVGhlIGBhc3NlcnQuZXF1YWxgIG1ldGhvZFxuICpcbiAqIEFzc2VydCB0aGF0IHR3byB2YWx1ZXMgbXVzdCBiZSBgT2JqZWN0LmlzYC5cbiAqIEBwYXJhbSB7Kn0gYWN0dWFsIFRoZSB2YWx1ZSB3ZSByZWNlaXZlZFxuICogQHBhcmFtIHsqfSBleHBlY3RlZCBXaGF0IHdlIHdhbnRlZFxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc10gVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyogVHlwZSBhbGwgdGhlIG92ZXJsb2FkcyBvZiB0aGUgYXNzZXJ0VHlwZW9mIGZ1bmN0aW9uLiovXG4vKiBUaGVyZSBtYXkgZXZlbnR1YWxseSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgYnV0Ki9cbi8qIHRoZW1zIHRoZSBicmVha3Mgd2l0aCBUeXBlc2NyaXB0IDQuMC4qL1xuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mQmlnaW50XG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2JpZ2ludCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYmlnaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJvb2xlYW5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYm9vbGVhbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYm9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZGdW5jdGlvblxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydmdW5jdGlvbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgRnVuY3Rpb259XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mTnVtYmVyXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J251bWJlcid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgbnVtYmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk9iamVjdFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydvYmplY3QnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIFJlY29yZDxhbnksIGFueT4gfCBudWxsfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZlN0cmluZ1xuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydzdHJpbmcnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN0cmluZ31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZTeW1ib2xcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnc3ltYm9sJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzeW1ib2x9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3VuZGVmaW5lZCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgdW5kZWZpbmVkfVxuICovXG5cbi8qKlxuICogVGhlIGBhc3NlcnQudHlwZW9mYCBtZXRob2RcbiAqXG4gKiBAdHlwZWRlZiB7QXNzZXJ0VHlwZW9mQmlnaW50ICYgQXNzZXJ0VHlwZW9mQm9vbGVhbiAmIEFzc2VydFR5cGVvZkZ1bmN0aW9uICYgQXNzZXJ0VHlwZW9mTnVtYmVyICYgQXNzZXJ0VHlwZW9mT2JqZWN0ICYgQXNzZXJ0VHlwZW9mU3RyaW5nICYgQXNzZXJ0VHlwZW9mU3ltYm9sICYgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkfSBBc3NlcnRUeXBlb2ZcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRTdHJpbmdcbiAqIFRoZSBgYXNzZXJ0LnN0cmluZ2AgbWV0aG9kLlxuICpcbiAqIGBhc3NlcnQuc3RyaW5nKHYpYCBpcyBlcXVpdmFsZW50IHRvIGBhc3NlcnQudHlwZW9mKHYsICdzdHJpbmcnKWAuIFdlXG4gKiBzcGVjaWFsIGNhc2UgdGhpcyBvbmUgYmVjYXVzZSBpdCBpcyB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQuXG4gKlxuICogQXNzZXJ0IGFuIGV4cGVjdGVkIHR5cGVvZiByZXN1bHQuXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW4gVGhlIHZhbHVlIHRvIGdldCB0aGUgdHlwZW9mXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgc3RyaW5nfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydE5vdGVcbiAqIFRoZSBgYXNzZXJ0Lm5vdGVgIG1ldGhvZC5cbiAqXG4gKiBBbm5vdGF0ZSBhbiBlcnJvciB3aXRoIGRldGFpbHMsIHBvdGVudGlhbGx5IHRvIGJlIHVzZWQgYnkgYW5cbiAqIGF1Z21lbnRlZCBjb25zb2xlIHN1Y2ggYXMgdGhlIGNhdXNhbCBjb25zb2xlIG9mIGBjb25zb2xlLmpzYCwgdG9cbiAqIHByb3ZpZGUgZXh0cmEgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGxvZ2dlZCBlcnJvcnMuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqIEBwYXJhbSB7RGV0YWlsc30gZGV0YWlsc05vdGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e319IERldGFpbHNUb2tlblxuICogQSBjYWxsIHRvIHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCBtYWtlcyBhbmQgcmV0dXJucyBhIGZyZXNoIGRldGFpbHNcbiAqIHRva2VuLCB3aGljaCBpcyBhIGZyb3plbiBlbXB0eSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhhdFxuICogYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgZXhwcmVzc2lvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCBEZXRhaWxzVG9rZW59IERldGFpbHNcbiAqIEVpdGhlciBhIHBsYWluIHN0cmluZywgb3IgbWFkZSBieSB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgdGFnLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RyaW5nYWJsZVBheWxvYWRcbiAqIEhvbGRzIHRoZSBwYXlsb2FkIHBhc3NlZCB0byBxdW90ZSBzbyB0aGF0IGl0cyBwcmludGVkIGZvcm0gaXMgdmlzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSB0b1N0cmluZyBIb3cgdG8gcHJpbnQgdGhlIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIFRvIFwiZGVjbGFzc2lmeVwiIGFuZCBxdW90ZSBhIHN1YnN0aXR1dGlvbiB2YWx1ZSB1c2VkIGluIGFcbiAqIGBgYCBkZXRhaWxzYC4uLmAgYGBgIHRlbXBsYXRlIGxpdGVyYWwsIGVuY2xvc2UgdGhhdCBzdWJzdGl0dXRpb24gZXhwcmVzc2lvblxuICogaW4gYSBjYWxsIHRvIGBxdW90ZWAuIFRoaXMgbWFrZXMgdGhlIHZhbHVlIGFwcGVhciBxdW90ZWRcbiAqIChhcyBpZiB3aXRoIGBKU09OLnN0cmluZ2lmeWApIGluIHRoZSBtZXNzYWdlIG9mIHRoZSB0aHJvd24gZXJyb3IuIFRoZVxuICogcGF5bG9hZCBpdHNlbGYgaXMgc3RpbGwgcGFzc2VkIHVucXVvdGVkIHRvIHRoZSBjb25zb2xlIGFzIGl0IHdvdWxkIGJlXG4gKiB3aXRob3V0IGBxdW90ZWAuXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgd2lsbCByZXZlYWwgdGhlIGV4cGVjdGVkIHNreSBjb2xvciwgYnV0IG5vdCB0aGVcbiAqIGFjdHVhbCBpbmNvcnJlY3Qgc2t5IGNvbG9yLCBpbiB0aGUgdGhyb3duIGVycm9yJ3MgbWVzc2FnZTpcbiAqIGBgYGpzXG4gKiBza3kuY29sb3IgPT09IGV4cGVjdGVkQ29sb3IgfHwgRmFpbGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cXVvdGUoZXhwZWN0ZWRDb2xvcil9YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBub3JtYWwgY29udmVudGlvbiBpcyB0byBsb2NhbGx5IHJlbmFtZSBgZGV0YWlsc2AgdG8gYFhgIGFuZCBgcXVvdGVgIHRvIGBxYFxuICogbGlrZSBgY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSB9ID0gYXNzZXJ0O2AsIHNvIHRoZSBhYm92ZSBleGFtcGxlIHdvdWxkIHRoZW4gYmVcbiAqIGBgYGpzXG4gKiBza3kuY29sb3IgPT09IGV4cGVjdGVkQ29sb3IgfHwgRmFpbGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cShleHBlY3RlZENvbG9yKX1gO1xuICogYGBgXG4gKlxuICogQGNhbGxiYWNrIEFzc2VydFF1b3RlXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgV2hhdCB0byBkZWNsYXNzaWZ5XG4gKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gW3NwYWNlc11cbiAqIEByZXR1cm5zIHtTdHJpbmdhYmxlUGF5bG9hZH0gVGhlIGRlY2xhc3NpZmllZCBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFpc2VcbiAqXG4gKiBUbyBtYWtlIGFuIGBhc3NlcnRgIHdoaWNoIHRlcm1pbmF0ZXMgc29tZSBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvblxuICogbGlrZSBhIHRyYW5zYWN0aW9uLCB2YXQsIG9yIHByb2Nlc3MsIGNhbGwgYG1ha2VBc3NlcnRgIHdpdGggYSBgUmFpc2VgXG4gKiBjYWxsYmFjaywgd2hlcmUgdGhhdCBjYWxsYmFjayBhY3R1YWxseSBwZXJmb3JtcyB0aGF0IGxhcmdlciB0ZXJtaW5hdGlvbi5cbiAqIElmIHBvc3NpYmxlLCB0aGUgY2FsbGJhY2sgc2hvdWxkIGFsc28gcmVwb3J0IGl0cyBgcmVhc29uYCBwYXJhbWV0ZXIgYXNcbiAqIHRoZSBhbGxlZ2VkIHJlYXNvbiBmb3IgdGhlIHRlcm1pbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IHJlYXNvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VBc3NlcnRcbiAqXG4gKiBNYWtlcyBhbmQgcmV0dXJucyBhbiBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3QgdGhhdCBzaGFyZXMgdGhlIGJvb2trZWVwaW5nXG4gKiBzdGF0ZSBkZWZpbmVkIGJ5IHRoaXMgbW9kdWxlIHdpdGggb3RoZXIgYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0cyBtYWRlIGJ5XG4gKiBgbWFrZUFzc2VydGAuIFRoaXMgc3RhdGUgaXMgcGVyLW1vZHVsZS1pbnN0YW5jZSBhbmQgaXMgZXhwb3NlZCBieSB0aGVcbiAqIGBsb2dnZWRFcnJvckhhbmRsZXJgIGFib3ZlLiBXZSByZWZlciB0byBgYXNzZXJ0YCBhcyBhIFwiZnVuY3Rpb24gb2JqZWN0XCJcbiAqIGJlY2F1c2UgaXQgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBhcyBhIGZ1bmN0aW9uLCBidXQgYWxzbyBoYXMgbWV0aG9kcyB0aGF0XG4gKiBjYW4gYmUgY2FsbGVkLlxuICpcbiAqIElmIGBvcHRSYWlzZWAgaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5lZCBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3Qgd2lsbCBjYWxsXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgYmVmb3JlIHRocm93aW5nIHRoZSBlcnJvci4gVGhpcyBlbmFibGVzIGBvcHRSYWlzZWAgdG9cbiAqIGVuZ2FnZSBpbiBldmVuIG1vcmUgdmlvbGVudCB0ZXJtaW5hdGlvbiBiZWhhdmlvciwgbGlrZSB0ZXJtaW5hdGluZyB0aGUgdmF0LFxuICogdGhhdCBwcmV2ZW50cyBleGVjdXRpb24gZnJvbSByZWFjaGluZyB0aGUgZm9sbG93aW5nIHRocm93LiBIb3dldmVyLCBpZlxuICogYG9wdFJhaXNlYCByZXR1cm5zIG5vcm1hbGx5LCB3aGljaCB3b3VsZCBiZSB1bnVzdWFsLCB0aGUgdGhyb3cgZm9sbG93aW5nXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgd291bGQgc3RpbGwgaGFwcGVuLlxuICpcbiAqIEBwYXJhbSB7UmFpc2V9IFtvcHRSYWlzZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VucmVkYWN0ZWRdXG4gKiBAcmV0dXJucyB7QXNzZXJ0fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyh0ZW1wbGF0ZTogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmdbXSwgLi4uYXJnczogYW55KSA9PiBEZXRhaWxzVG9rZW59IERldGFpbHNUYWdcbiAqXG4gKiBVc2UgdGhlIGBkZXRhaWxzYCBmdW5jdGlvbiBhcyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIHRvIGNyZWF0ZVxuICogaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZXMuIFRoZSBhc3NlcnRpb24gZnVuY3Rpb25zIHRha2Ugc3VjaCBtZXNzYWdlc1xuICogYXMgb3B0aW9uYWwgYXJndW1lbnRzOlxuICogYGBganNcbiAqIGFzc2VydChza3kuaXNCbHVlKCksIGRldGFpbHNgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImApO1xuICogYGBgXG4gKiBvciBmb2xsb3dpbmcgdGhlIG5vcm1hbCBjb252ZW50aW9uIHRvIGxvY2FsbHkgcmVuYW1lIGBkZXRhaWxzYCB0byBgWGBcbiAqIGFuZCBgcXVvdGVgIHRvIGBxYCBsaWtlIGBjb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxIH0gPSBhc3NlcnQ7YDpcbiAqIGBgYGpzXG4gKiBhc3NlcnQoc2t5LmlzQmx1ZSgpLCBYYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgXCJibHVlXCJgKTtcbiAqIGBgYFxuICogSG93ZXZlciwgbm90ZSB0aGF0IGluIG1vc3QgY2FzZXMgaXQgaXMgcHJlZmVyYWJsZSB0byBpbnN0ZWFkIHVzZSB0aGUgYEZhaWxgXG4gKiB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyAod2hpY2ggaGFzIHRoZSBzYW1lIGlucHV0IHNpZ25hdHVyZSBhcyBgZGV0YWlsc2BcbiAqIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYW5kIHRocm93cyBhbiBlcnJvcik6XG4gKiBgYGBqc1xuICogc2t5LmlzQmx1ZSgpIHx8IEZhaWxgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImA7XG4gKiBgYGBcbiAqXG4gKiBUaGUgZGV0YWlscyB0ZW1wbGF0ZSB0YWcgcmV0dXJucyBhIGBEZXRhaWxzVG9rZW5gIG9iamVjdCB0aGF0IGNhbiBwcmludFxuICogaXRzZWxmIHdpdGggdGhlIGZvcm1hdHRlZCBtZXNzYWdlIGluIHR3byB3YXlzLlxuICogSXQgd2lsbCByZXBvcnQgZnVsbCBkZXRhaWxzIHRvIHRoZSBjb25zb2xlLCBidXRcbiAqIG1hc2sgZW1iZWRkZWQgc3Vic3RpdHV0aW9uIHZhbHVlcyB3aXRoIHRoZWlyIHR5cGVvZiBpbmZvcm1hdGlvbiBpbiB0aGUgdGhyb3duIGVycm9yXG4gKiB0byBwcmV2ZW50IHJldmVhbGluZyBzZWNyZXRzIHVwIHRoZSBleGNlcHRpb25hbCBwYXRoLiBJbiB0aGUgZXhhbXBsZVxuICogYWJvdmUsIHRoZSB0aHJvd24gZXJyb3IgbWF5IHJldmVhbCBvbmx5IHRoYXQgYHNreS5jb2xvcmAgaXMgYSBzdHJpbmcsXG4gKiB3aGVyZWFzIHRoZSBzYW1lIGRpYWdub3N0aWMgcHJpbnRlZCB0byB0aGUgY29uc29sZSByZXZlYWxzIHRoYXQgdGhlXG4gKiBza3kgd2FzIGdyZWVuLiBUaGlzIG1hc2tpbmcgY2FuIGJlIGRpc2FibGVkIGZvciBhbiBpbmRpdmlkdWFsIHN1YnN0aXR1dGlvbiB2YWx1ZVxuICogdXNpbmcgYHF1b3RlYC5cbiAqXG4gKiBUaGUgYHJhd2AgcHJvcGVydHkgb2YgYW4gaW5wdXQgdGVtcGxhdGUgYXJyYXkgaXMgaWdub3JlZCwgc28gYSBzaW1wbGVcbiAqIGFycmF5IG9mIHN0cmluZ3MgbWF5IGJlIHByb3ZpZGVkIGRpcmVjdGx5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyh0ZW1wbGF0ZTogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmdbXSwgLi4uYXJnczogYW55KSA9PiBuZXZlcn0gRmFpbFRhZ1xuICpcbiAqIFVzZSB0aGUgYEZhaWxgIGZ1bmN0aW9uIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdG8gZWZmaWNpZW50bHlcbiAqIGNyZWF0ZSBhbmQgdGhyb3cgYSBgZGV0YWlsc2Atc3R5bGUgZXJyb3Igb25seSB3aGVuIGEgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQuXG4gKiBgYGBqc1xuICogY29uZGl0aW9uIHx8IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqIGBgYFxuICogVGhpcyBhdm9pZHMgdGhlIG92ZXJoZWFkIG9mIGNyZWF0aW5nIHVzdWFsbHktdW5uZWNlc3NhcnkgZXJyb3JzIGxpa2VcbiAqIGBgYGpzXG4gKiBhc3NlcnQoY29uZGl0aW9uLCBkZXRhaWxzYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiB3aGlsZSBpbXByb3ZpbmcgcmVhZGFiaWxpdHkgb3ZlciBhbHRlcm5hdGl2ZXMgbGlrZVxuICogYGBganNcbiAqIGNvbmRpdGlvbiB8fCBhc3NlcnQuZmFpbChkZXRhaWxzYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKlxuICogSG93ZXZlciwgZHVlIHRvIGN1cnJlbnQgd2Vha25lc3MgaW4gVHlwZVNjcmlwdCwgc3RhdGljIHJlYXNvbmluZ1xuICogaXMgbGVzcyBwb3dlcmZ1bCB3aXRoIHRoZSBgfHxgIHBhdHRlcm5zIHRoYW4gd2l0aCBhbiBgYXNzZXJ0YCBjYWxsLlxuICogVW50aWwvdW5sZXNzIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTE0MjYgaXMgZml4ZWQsXG4gKiBmb3IgYHx8YC1zdHlsZSBhc3NlcnRpb25zIHdoZXJlIHRoaXMgbG9zcyBvZiBzdGF0aWMgcmVhc29uaW5nIGlzIGEgcHJvYmxlbSxcbiAqIGluc3RlYWQgZXhwcmVzcyB0aGUgYXNzZXJ0aW9uIGFzXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmRpdGlvbikge1xuICogICAgIEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKiBvciwgaWYgbmVlZGVkLFxuICogYGBganNcbiAqICAgaWYgKCFjb25kaXRpb24pIHtcbiAqICAgICAvLyBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cywgYnV0IGl0IGltcHJvdmVzIHN0YXRpYyBhbmFseXNpc1xuICogICAgIHRocm93IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKi9cblxuLyoqXG4gKiBhc3NlcnQgdGhhdCBleHByIGlzIHRydXRoeSwgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWxzIHRvIGRlc2NyaWJlXG4gKiB0aGUgYXNzZXJ0aW9uLiBJdCBpcyBhIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsIGxpa2VcbiAqIGBgYGpzXG4gKiBhc3NlcnQoZXhwciwgZGV0YWlsc2AuLi4uYCk7YFxuICogYGBgXG4gKlxuICogVGhlIGxpdGVyYWwgcG9ydGlvbnMgb2YgdGhlIHRlbXBsYXRlIGFyZSBhc3N1bWVkIG5vbi1zZW5zaXRpdmUsIGFzXG4gKiBhcmUgdGhlIGB0eXBlb2ZgIHR5cGVzIG9mIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzLiBUaGVzZSBhcmVcbiAqIGFzc2VtYmxlZCBpbnRvIHRoZSB0aHJvd24gZXJyb3IgbWVzc2FnZS4gVGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGVcbiAqIHN1YnN0aXR1dGlvbiB2YWx1ZXMgYXJlIGFzc3VtZWQgc2Vuc2l0aXZlLCB0byBiZSByZXZlYWxlZCB0b1xuICogdGhlIGNvbnNvbGUgb25seS4gV2UgYXNzdW1lIG9ubHkgdGhlIHZpcnR1YWwgcGxhdGZvcm0ncyBvd25lciBjYW4gcmVhZFxuICogd2hhdCBpcyB3cml0dGVuIHRvIHRoZSBjb25zb2xlLCB3aGVyZSB0aGUgb3duZXIgaXMgaW4gYSBwcml2aWxlZ2VkXG4gKiBwb3NpdGlvbiBvdmVyIGNvbXB1dGF0aW9uIHJ1bm5pbmcgb24gdGhhdCBwbGF0Zm9ybS5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggdGhlIG5vZGVqcyBhc3NlcnRpb24gbGlicmFyeS5cbiAqXG4gKiBAdHlwZWRlZiB7IEJhc2VBc3NlcnQgJiB7XG4gKiAgIHR5cGVvZjogQXNzZXJ0VHlwZW9mLFxuICogICBlcnJvcjogQXNzZXJ0TWFrZUVycm9yLFxuICogICBmYWlsOiBBc3NlcnRGYWlsLFxuICogICBlcXVhbDogQXNzZXJ0RXF1YWwsXG4gKiAgIHN0cmluZzogQXNzZXJ0U3RyaW5nLFxuICogICBub3RlOiBBc3NlcnROb3RlLFxuICogICBkZXRhaWxzOiBEZXRhaWxzVGFnLFxuICogICBGYWlsOiBGYWlsVGFnLFxuICogICBxdW90ZTogQXNzZXJ0UXVvdGUsXG4gKiAgIG1ha2VBc3NlcnQ6IE1ha2VBc3NlcnQsXG4gKiB9IH0gQXNzZXJ0XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAq4ojpmwBAABsAQAAIAAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAU/WFv0Y3AABGNwAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzeyJpbXBvcnRzIjpbIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZW1vdGFibGUgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1wiLCBbW1wibmF0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKG5hdE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcInNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChzZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5U2V0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlCYWdNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAoY29weUJhZ01hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIENvbnN0YW50cyBmb3IgdGhlIGtpbmRzIG9mIGFzc2V0cyB3ZSBzdXBwb3J0LlxuICpcbiAqIEB0eXBlIHt7IE5BVDogJ25hdCcsIFNFVDogJ3NldCcsIENPUFlfU0VUOiAnY29weVNldCcsIENPUFlfQkFHOiAnY29weUJhZycgfX1cbiAqL1xuY29uc3QgQXNzZXRLaW5kPWhhcmRlbih7XG5OQVQ6J25hdCcsXG5TRVQ6J3NldCcsXG5DT1BZX1NFVDonY29weVNldCcsXG5DT1BZX0JBRzonY29weUJhZyd9KTskaOKAjV9vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuXG5jb25zdCBhc3NldEtpbmROYW1lcz1oYXJkZW4oT2JqZWN0LnZhbHVlcyhBc3NldEtpbmQpLnNvcnQoKSk7XG5cbi8qKlxuICogQHBhcmFtIHtBc3NldEtpbmR9IGFsbGVnZWRBS1xuICovXG5jb25zdCBhc3NlcnRBc3NldEtpbmQ9KGFsbGVnZWRBSyk9PntcbmFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSyl8fFxuRmFpbCBgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKipcbiAqIEFtb3VudHMgZGVzY3JpYmUgZGlnaXRhbCBhc3NldHMuIEZyb20gYW4gYW1vdW50LCB5b3UgY2FuIGxlYXJuIHRoZVxuICogYnJhbmQgb2YgZGlnaXRhbCBhc3NldCBhcyB3ZWxsIGFzIFwiaG93IG11Y2hcIiBvciBcImhvdyBtYW55XCIuIEFtb3VudHNcbiAqIGhhdmUgdHdvIHBhcnRzOiBhIGJyYW5kIChsb29zZWx5IHNwZWFraW5nLCB0aGUgdHlwZSBvZiBkaWdpdGFsXG4gKiBhc3NldCkgYW5kIHRoZSB2YWx1ZSAodGhlIGFuc3dlciB0byBcImhvdyBtdWNoXCIpLiBGb3IgZXhhbXBsZSwgaW5cbiAqIHRoZSBwaHJhc2UgXCI1IGJ1Y2tzXCIsIFwiYnVja3NcIiB0YWtlcyB0aGUgcm9sZSBvZiB0aGUgYnJhbmQgYW5kIHRoZVxuICogdmFsdWUgaXMgNS4gQW1vdW50cyBjYW4gZGVzY3JpYmUgZnVuZ2libGUgYW5kIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiBhc3NldHMuIEFtb3VudHMgYXJlIHBhc3MtYnktY29weSBhbmQgY2FuIGJlIG1hZGUgYnkgYW5kIHNlbnQgdG9cbiAqIGFueW9uZS5cbiAqXG4gKiBUaGUgaXNzdWVyIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBvZiB0aGUgYW1vdW50IGluIHBheW1lbnRzXG4gKiBhbmQgcHVyc2VzLiBUaGUgaXNzdWVyIG11c3QgYmUgYWJsZSB0byBkbyB0aGluZ3Mgc3VjaCBhcyBhZGRcbiAqIGRpZ2l0YWwgYXNzZXRzIHRvIGEgcHVyc2UgYW5kIHdpdGhkcmF3IGRpZ2l0YWwgYXNzZXRzIGZyb20gYSBwdXJzZS5cbiAqIFRvIGRvIHNvLCBpdCBtdXN0IGtub3cgaG93IHRvIGFkZCBhbmQgc3VidHJhY3QgZGlnaXRhbCBhc3NldHMuXG4gKiBSYXRoZXIgdGhhbiBoYXJkLWNvZGluZyBhIHBhcnRpY3VsYXIgc29sdXRpb24sIHdlIGNob3NlIHRvXG4gKiBwYXJhbWV0ZXJpemUgdGhlIGlzc3VlciB3aXRoIGEgY29sbGVjdGlvbiBvZiBwb2x5bW9ycGhpYyBmdW5jdGlvbnMsXG4gKiB3aGljaCB3ZSBjYWxsIGBBbW91bnRNYXRoYC4gVGhlc2UgbWF0aCBmdW5jdGlvbnMgaW5jbHVkZSBjb25jZXB0c1xuICogbGlrZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uXG4gKlxuICogV2UgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb25mdXNpb24gYXMgdG8gd2hhdCBraW5kIG9mXG4gKiBhc3NldCB3ZSBhcmUgdXNpbmcuIFRodXMsIEFtb3VudE1hdGggaW5jbHVkZXMgY2hlY2tzIG9mIHRoZVxuICogYGJyYW5kYCwgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0LiBJZlxuICogdGhlIHdyb25nIGJyYW5kIGlzIHVzZWQgaW4gQW1vdW50TWF0aCwgYW4gZXJyb3IgaXMgdGhyb3duIGFuZCB0aGVcbiAqIG9wZXJhdGlvbiBkb2VzIG5vdCBzdWNjZWVkLlxuICpcbiAqIEFtb3VudE1hdGggdXNlcyBtYXRoSGVscGVycyB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLCBidXQgdGhlbiBhZGRzXG4gKiB0aGUgYnJhbmQgdG8gdGhlIHJlc3VsdC4gVGhlIGZ1bmN0aW9uIGB2YWx1ZWAgZ2V0cyB0aGUgdmFsdWUgZnJvbVxuICogdGhlIGFtb3VudCBieSByZW1vdmluZyB0aGUgYnJhbmQgKGFtb3VudCAtPiB2YWx1ZSksIGFuZCB0aGVcbiAqIGZ1bmN0aW9uIGBtYWtlYCBhZGRzIHRoZSBicmFuZCB0byBwcm9kdWNlIGFuIGFtb3VudCAodmFsdWUgLT5cbiAqIGFtb3VudCkuIFRoZSBmdW5jdGlvbiBgY29lcmNlYCB0YWtlcyBhbiBhbW91bnQgYW5kIGNoZWNrcyBpdCxcbiAqIHJldHVybmluZyBhbiBhbW91bnQgKGFtb3VudCAtPiBhbW91bnQpLlxuICpcbiAqIEVhY2ggaXNzdWVyIG9mIGRpZ2l0YWwgYXNzZXRzIGhhcyBhbiBhc3NvY2lhdGVkIGJyYW5kIGluIGFcbiAqIG9uZS10by1vbmUgbWFwcGluZy4gSW4gdW50cnVzdGVkIGNvbnRleHRzLCBzdWNoIGFzIGluIGFuYWx5emluZ1xuICogcGF5bWVudHMgYW5kIGFtb3VudHMsIHdlIGNhbiBnZXQgdGhlIGJyYW5kIGFuZCBmaW5kIHRoZSBpc3N1ZXJcbiAqIHdoaWNoIG1hdGNoZXMgdGhlIGJyYW5kLiBUaGUgaXNzdWVyIGFuZCB0aGUgYnJhbmQgbXV0dWFsbHkgdmFsaWRhdGVcbiAqIGVhY2ggb3RoZXIuXG4gKi9cblxuY29uc3QgaGVscGVycz17XG5uYXQ6bmF0TWF0aEhlbHBlcnMsXG5zZXQ6c2V0TWF0aEhlbHBlcnMsXG5jb3B5U2V0OmNvcHlTZXRNYXRoSGVscGVycyxcbmNvcHlCYWc6Y29weUJhZ01hdGhIZWxwZXJzfTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlIHsodmFsdWU6IFYpID0+IEFzc2V0S2luZEZvclZhbHVlPFY+fVxuICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZD0odmFsdWUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsdWUpO1xuaWYocGFzc1N0eWxlPT09J2JpZ2ludCcpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiduYXQnO1xuIH1cbmlmKHBhc3NTdHlsZT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nc2V0JztcbiB9XG5pZihtYXRjaGVzKHZhbHVlLE0uc2V0KCkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nY29weVNldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLmJhZygpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlCYWcnO1xuIH1cbi8qIFRPRE8gVGhpcyBpc24ndCBxdWl0ZSB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSwgaW4gY2FzZSB2YWx1ZVBhc3NTdHlsZSovXG4vKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbi8qIG9iamVjdCBpdCBpcy4qL1xuLyogQWxzbywgdGhpcyBraW5kIG9mIG1hbnVhbCBsaXN0aW5nIGlzIGEgbWFpbnRlbmFuY2UgaGF6YXJkIHdlKi9cbi8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cbnRocm93IEZhaWwgYHZhbHVlICR7dmFsdWV9IG11c3QgYmUgYSBiaWdpbnQsIGNvcHlTZXQsIGNvcHlCYWcsIG9yIGFuIGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHZhbHVlIGlzIGEgdmFsaWQgQW1vdW50TWF0aCBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaGVscGVycy5cbiAqXG4gKiBNYWRlIGF2YWlsYWJsZSBvbmx5IGZvciB0ZXN0aW5nLCBidXQgaXQgaXMgaGFybWxlc3MgZm9yIG90aGVyIHVzZXMuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHBhcmFtIHtWfSB2YWx1ZVxuICogQHJldHVybnMge01hdGhIZWxwZXJzPFY+fVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0VmFsdWVHZXRIZWxwZXJzPSh2YWx1ZSk9PlxuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbmhlbHBlcnNbYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpXTtcblxuLyoqIEB0eXBlIHsoYWxsZWdlZEJyYW5kOiBCcmFuZCwgYnJhbmQ/OiBCcmFuZCkgPT4gdm9pZH0gKi8kaOKAjV9vbmNlLmFzc2VydFZhbHVlR2V0SGVscGVycyhhc3NlcnRWYWx1ZUdldEhlbHBlcnMpO1xuY29uc3Qgb3B0aW9uYWxCcmFuZENoZWNrPShhbGxlZ2VkQnJhbmQsYnJhbmQpPT57XG5pZihicmFuZCE9PXVuZGVmaW5lZCl7XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hbGxlZ2VkQnJhbmQ9PT1icmFuZHx8XG5GYWlsIGBhbW91bnQncyBicmFuZCAke3EoYWxsZWdlZEJyYW5kKX0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBicmFuZCAke3EoXG5icmFuZClcbiB9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPiB8IHVuZGVmaW5lZH0gYnJhbmRcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczwqPn1cbiAqL1xuY29uc3QgY2hlY2tMUkFuZEdldEhlbHBlcnM9KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0UmVjb3JkKGxlZnRBbW91bnQsJ2xlZnRBbW91bnQnKTtcbmFzc2VydFJlY29yZChyaWdodEFtb3VudCwncmlnaHRBbW91bnQnKTtcbmNvbnN0e3ZhbHVlOmxlZnRWYWx1ZSxicmFuZDpsZWZ0QnJhbmR9PWxlZnRBbW91bnQ7XG5jb25zdHt2YWx1ZTpyaWdodFZhbHVlLGJyYW5kOnJpZ2h0QnJhbmR9PXJpZ2h0QW1vdW50O1xuYXNzZXJ0UmVtb3RhYmxlKGxlZnRCcmFuZCwnbGVmdEJyYW5kJyk7XG5hc3NlcnRSZW1vdGFibGUocmlnaHRCcmFuZCwncmlnaHRCcmFuZCcpO1xub3B0aW9uYWxCcmFuZENoZWNrKGxlZnRCcmFuZCxicmFuZCk7XG5vcHRpb25hbEJyYW5kQ2hlY2socmlnaHRCcmFuZCxicmFuZCk7XG5sZWZ0QnJhbmQ9PT1yaWdodEJyYW5kfHxcbkZhaWwgYEJyYW5kcyBpbiBsZWZ0ICR7cShsZWZ0QnJhbmQpfSBhbmQgcmlnaHQgJHtxKFxucmlnaHRCcmFuZClcbiB9IHNob3VsZCBtYXRjaCBidXQgZG8gbm90YDtcbmNvbnN0IGxlZnRIZWxwZXJzPWFzc2VydFZhbHVlR2V0SGVscGVycyhsZWZ0VmFsdWUpO1xuY29uc3QgcmlnaHRIZWxwZXJzPWFzc2VydFZhbHVlR2V0SGVscGVycyhyaWdodFZhbHVlKTtcbmxlZnRIZWxwZXJzPT09cmlnaHRIZWxwZXJzfHxcbkZhaWwgYFRoZSBsZWZ0ICR7bGVmdEFtb3VudH0gYW5kIHJpZ2h0IGFtb3VudCAke3JpZ2h0QW1vdW50fSBoYWQgZGlmZmVyZW50IGFzc2V0S2luZHNgO1xucmV0dXJuIGxlZnRIZWxwZXJzO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7TWF0aEhlbHBlcnM8QXNzZXRWYWx1ZUZvcktpbmQ8Sz4+fSBoXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcmV0dXJucyB7W0ssIEtdfVxuICovXG5jb25zdCBjb2VyY2VMUj0oaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KT0+e1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBhcmJpdHJhcnkgc3VidHlwZSovXG5yZXR1cm5baC5kb0NvZXJjZShsZWZ0QW1vdW50LnZhbHVlKSxoLmRvQ29lcmNlKHJpZ2h0QW1vdW50LnZhbHVlKV07XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZVxuICogcmlnaHRBbW91bnQuIFRoZSBub3Rpb24gb2YgXCJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cIiBkZXBlbmRzXG4gKiBvbiB0aGUga2luZCBvZiBhbW91bnQsIGFzIGRlZmluZWQgYnkgdGhlIE1hdGhIZWxwZXJzLiBGb3IgZXhhbXBsZSxcbiAqIHdoZXRoZXIgcmVjdGFuZ2xlIEEgaXMgZ3JlYXRlciB0aGFuIHJlY3RhbmdsZSBCIGRlcGVuZHMgb24gd2hldGhlciByZWN0YW5nbGVcbiAqIEEgaW5jbHVkZXMgcmVjdGFuZ2xlIEIgYXMgZGVmaW5lZCBieSB0aGUgbG9naWMgaW4gTWF0aEhlbHBlcnMuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc0dURT0obGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0dURSguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9O1xuXG4vKipcbiAqIExvZ2ljIGZvciBtYW5pcHVsYXRpbmcgYW1vdW50cy5cbiAqXG4gKiBBbW91bnRzIGFyZSB0aGUgY2Fub25pY2FsIGRlc2NyaXB0aW9uIG9mIHRyYWRhYmxlIGdvb2RzLiBUaGV5IGFyZSBtYW5pcHVsYXRlZFxuICogYnkgaXNzdWVycyBhbmQgbWludHMsIGFuZCByZXByZXNlbnQgdGhlIGdvb2RzIGFuZCBjdXJyZW5jeSBjYXJyaWVkIGJ5IHB1cnNlc1xuICogYW5kXG4gKiBwYXltZW50cy4gVGhleSBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgdGhpbmdzIGxpa2UgY3VycmVuY3ksIHN0b2NrLCBhbmQgdGhlXG4gKiBhYnN0cmFjdCByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgZXhjaGFuZ2UuXG4gKi9cbmNvbnN0IEFtb3VudE1hdGg9e1xuLyoqXG4gKiBNYWtlIGFuIGFtb3VudCBmcm9tIGEgdmFsdWUgYnkgYWRkaW5nIHRoZSBicmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59IGFsbGVnZWRWYWx1ZVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuLyogYWxsZWdlZFZhbHVlIGhhcyBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZm9yIHR5cGUgd2lkZW5pbmcsIHRvIHByZXZlbnQgViBiZWluZyBib3VuZCB0byBhIGEgbGl0ZXJhbCBsaWtlIDFuKi9cbm1ha2U6KGJyYW5kLGFsbGVnZWRWYWx1ZSk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmNvbnN0IGg9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFsbGVnZWRWYWx1ZSk7XG5jb25zdCB2YWx1ZT1oLmRvQ29lcmNlKGFsbGVnZWRWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIE1ha2Ugc3VyZSB0aGlzIGFtb3VudCBpcyB2YWxpZCBlbm91Z2gsIGFuZCByZXR1cm4gYSBjb3JyZXNwb25kaW5nXG4gKiB2YWxpZCBhbW91bnQgaWYgc28uXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYWxsZWdlZEFtb3VudFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuY29lcmNlOihicmFuZCxhbGxlZ2VkQW1vdW50KT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0UmVjb3JkKGFsbGVnZWRBbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQ6YWxsZWdlZEJyYW5kLHZhbHVlOmFsbGVnZWRWYWx1ZX09YWxsZWdlZEFtb3VudDtcbmJyYW5kPT09YWxsZWdlZEJyYW5kfHxcbkZhaWwgYFRoZSBicmFuZCBpbiB0aGUgYWxsZWdlZEFtb3VudCAke2FsbGVnZWRBbW91bnR9IGluICdjb2VyY2UnIGRpZG4ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIGJyYW5kICR7YnJhbmR9LmA7XG4vKiBXaWxsIHRocm93IG9uIGluYXBwcm9wcmlhdGUgdmFsdWUqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCxhbGxlZ2VkVmFsdWUpO1xuIH0sXG4vKipcbiAqIEV4dHJhY3QgYW5kIHJldHVybiB0aGUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59XG4gKi9cbmdldFZhbHVlOihicmFuZCxhbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbW91bnQpLnZhbHVlLFxuLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LiBUaGlzIGlzIHRoZVxuICogaWRlbnRpdHkgZWxlbWVudCBmb3IgTWF0aEhlbHBlcnMuYWRkIGFuZCBNYXRIZWxwZXJzLnN1YnRyYWN0LlxuICpcbiAqIEB0eXBlIHt7XG4gKiAgIChicmFuZDogQnJhbmQpOiBBbW91bnQ8J25hdCc+O1xuICogICA8SyBleHRlbmRzIEFzc2V0S2luZD4oYnJhbmQ6IEJyYW5kLCBhc3NldEtpbmQ6IEspOiBBbW91bnQ8Sz47XG4gKiB9fVxuICovXG5tYWtlRW1wdHk6KGJyYW5kLGFzc2V0S2luZD0vKiogQHR5cGUge2NvbnN0fSAqLyduYXQnKT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5jb25zdCB2YWx1ZT1oZWxwZXJzW2Fzc2V0S2luZF0uZG9NYWtlRW1wdHkoKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudCwgdXNpbmcgYW5vdGhlclxuICogYW1vdW50IGFzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGJyYW5kIGFuZCBhc3NldEtpbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1ha2VFbXB0eUZyb21BbW91bnQ6KGFtb3VudCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQsdmFsdWV9PWFtb3VudDtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5jb25zdCBhc3NldEtpbmQ9YXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgQW1vdW50IGlzIGVtcHR5LiBPdGhlcndpc2UgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzRW1wdHk6KGFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZX09YW1vdW50O1xuYXNzZXJ0UmVtb3RhYmxlKGFsbGVnZWRCcmFuZCwnYnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhhbGxlZ2VkQnJhbmQsYnJhbmQpO1xuY29uc3QgaD1hc3NlcnRWYWx1ZUdldEhlbHBlcnModmFsdWUpO1xucmV0dXJuIGguZG9Jc0VtcHR5KGguZG9Db2VyY2UodmFsdWUpKTtcbiB9LFxuaXNHVEUsXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBlcXVhbHMgdGhlIHJpZ2h0QW1vdW50LiBXZSBhc3N1bWVcbiAqIHRoYXQgaWYgaXNHVEUgaXMgdHJ1ZSBpbiBib3RoIGRpcmVjdGlvbnMsIGlzRXF1YWwgaXMgYWxzbyB0cnVlXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0VxdWFsOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5yZXR1cm4gaC5kb0lzRXF1YWwoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgdW5pb24gb2YgYm90aCBsZWZ0QW1vdW50IGFuZCByaWdodEFtb3VudC5cbiAqXG4gKiBGb3IgZnVuZ2libGUgYW1vdW50IHRoaXMgbWVhbnMgYWRkaW5nIHRoZSB2YWx1ZXMuIEZvciBvdGhlciBraW5kcyBvZlxuICogYW1vdW50LCBpdCB1c3VhbGx5IG1lYW5zIGluY2x1ZGluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gYm90aFxuICogbGVmdCBhbmQgcmlnaHQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbmFkZDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb0FkZCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSBsZWZ0QW1vdW50IG1pbnVzIHRoZSByaWdodEFtb3VudFxuICogKGkuZS4gZXZlcnl0aGluZyBpbiB0aGUgbGVmdEFtb3VudCB0aGF0IGlzIG5vdCBpbiB0aGVcbiAqIHJpZ2h0QW1vdW50KS4gSWYgbGVmdEFtb3VudCBkb2Vzbid0IGluY2x1ZGUgcmlnaHRBbW91bnRcbiAqIChzdWJ0cmFjdGlvbiByZXN1bHRzIGluIGEgbmVnYXRpdmUpLCB0aHJvdyAgYW4gZXJyb3IuIEJlY2F1c2UgdGhlXG4gKiBsZWZ0IGFtb3VudCBtdXN0IGluY2x1ZGUgdGhlIHJpZ2h0IGFtb3VudCwgdGhpcyBpcyBOT1QgZXF1aXZhbGVudFxuICogdG8gc2V0IHN1YnRyYWN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5zdWJ0cmFjdDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb1N1YnRyYWN0KC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQ6bGVmdEFtb3VudC5icmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbiB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5taW46KHgseSxicmFuZD11bmRlZmluZWQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5pc0dURSh4LHksYnJhbmQpP1xueTpcbmlzR1RFKHkseCxicmFuZCk/XG54OlxuRmFpbCBgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYCxcbi8qKlxuICogUmV0dXJucyB0aGUgbWF4IHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHlcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1heDooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbmlzR1RFKHgseSxicmFuZCk/XG54OlxuaXNHVEUoeSx4KT9cbnk6XG5GYWlsIGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgfTskaOKAjV9vbmNlLkFtb3VudE1hdGgoQW1vdW50TWF0aCk7XG5cbmhhcmRlbihBbW91bnRNYXRoKTtcblxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKi9cbmNvbnN0IGdldEFzc2V0S2luZD0oYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHt2YWx1ZX09YW1vdW50O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuIH07JGjigI1fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFzc2V0S2luZCI6WyJBc3NldEtpbmQiXSwiYXNzZXJ0QXNzZXRLaW5kIjpbImFzc2VydEFzc2V0S2luZCJdLCJBbW91bnRNYXRoIjpbIkFtb3VudE1hdGgiXSwiZ2V0QXNzZXRLaW5kIjpbImdldEFzc2V0S2luZCJdLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiOlsiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEqUAO3VBQAA1QUAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29lcmNlRGlzcGxheUluZm8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFpbCxtdXN0TWF0Y2gsRGlzcGxheUluZm9TaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkRpc3BsYXlJbmZvU2hhcGVcIiwgWyRo4oCNX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGFsbGVnZWREaXNwbGF5SW5mb1xuICogQHBhcmFtIHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHJldHVybnMge0Rpc3BsYXlJbmZvfVxuICovXG5jb25zdCAgICAgICAgY29lcmNlRGlzcGxheUluZm89KGFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmQpPT57XG5tdXN0TWF0Y2goYWxsZWdlZERpc3BsYXlJbmZvLERpc3BsYXlJbmZvU2hhcGUsJ2Rpc3BsYXlJbmZvJyk7XG5cbmlmKGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQhPT11bmRlZmluZWQpe1xuYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZD09PWFzc2V0S2luZHx8XG5GYWlsIGBkaXNwbGF5SW5mby5hc3NldEtpbmQgd2FzIHByZXNlbnQgKCR7YWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZH0pIGFuZCBkaWQgbm90IG1hdGNoIHRoZSBhc3NldEtpbmQgYXJndW1lbnQgKCR7YXNzZXRLaW5kfSlgO1xuIH1cbmNvbnN0IGRpc3BsYXlJbmZvPWhhcmRlbih7Li4uYWxsZWdlZERpc3BsYXlJbmZvLGFzc2V0S2luZH0pO1xuXG5pZihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzIT09dW5kZWZpbmVkKXtcbk51bWJlci5pc1NhZmVJbnRlZ2VyKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMpfHxcbkZhaWwgYGRlY2ltYWxQbGFjZXMgJHtkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzfSBpcyBub3QgYSBzYWZlIGludGVnZXJgO1xuIH1cblxucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH07JGjigI1fb25jZS5jb2VyY2VEaXNwbGF5SW5mbyhjb2VyY2VEaXNwbGF5SW5mbyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29lcmNlRGlzcGxheUluZm8iOlsiY29lcmNlRGlzcGxheUluZm8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQzB73OgBAADoAQAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA1XcEomCAAAJggAAAlAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2lzc3VlcktpdC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbImhhc0lzc3VlciIsIm1ha2VEdXJhYmxlSXNzdWVyS2l0IiwibWFrZUlzc3VlcktpdCIsInByZXBhcmVJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LGFzc2VydFBhdHRlcm4sbWFrZVNjYWxhckJpZ01hcFN0b3JlLEFzc2V0S2luZCxhc3NlcnRBc3NldEtpbmQsY29lcmNlRGlzcGxheUluZm8scHJlcGFyZVBheW1lbnRMZWRnZXI7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0QXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChhc3NlcnRBc3NldEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9kaXNwbGF5SW5mby5qc1wiLCBbW1wiY29lcmNlRGlzcGxheUluZm9cIiwgWyRo4oCNX2EgPT4gKGNvZXJjZURpc3BsYXlJbmZvID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudExlZGdlci5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRMZWRnZXJcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVQYXltZW50TGVkZ2VyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kXG4gKiBAcHJvcGVydHkge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmQ8Sz59IGlzc3VlclJlY29yZFxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3Qgc2V0dXBJc3N1ZXJLaXQ9KFxue25hbWUsYXNzZXRLaW5kLGRpc3BsYXlJbmZvLGVsZW1lbnRTaGFwZX0sXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5hc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcblxuLyogQWRkIGFzc2V0S2luZCB0byBkaXNwbGF5SW5mbywgb3Igb3ZlcnJpZGUgaWYgcHJlc2VudCovXG5jb25zdCBjbGVhbkRpc3BsYXlJbmZvPWNvZXJjZURpc3BsYXlJbmZvKGRpc3BsYXlJbmZvLGFzc2V0S2luZCk7XG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwnZnVuY3Rpb24nKTtcbiB9XG5cbmlmKGVsZW1lbnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gfVxuXG4vKiBBdHRlbnVhdGUgdGhlIHBvd2VyZnVsIGF1dGhvcml0eSB0byBtaW50IGFuZCBjaGFuZ2UgYmFsYW5jZXMqL1xuLyoqIEB0eXBlIHtQYXltZW50TGVkZ2VyPEs+fSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuY29uc3R7aXNzdWVyLG1pbnQsYnJhbmQsbWludFJlY292ZXJ5UHVyc2V9PXByZXBhcmVQYXltZW50TGVkZ2VyKFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5jbGVhbkRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5icmFuZCxcbmlzc3Vlcixcbm1pbnQsXG5taW50UmVjb3ZlcnlQdXJzZSxcbmRpc3BsYXlJbmZvOmNsZWFuRGlzcGxheUluZm99KTtcblxuIH07XG5oYXJkZW4oc2V0dXBJc3N1ZXJLaXQpO1xuXG4vKiogVGhlIGtleSBhdCB3aGljaCB0aGUgaXNzdWVyIHJlY29yZCBpcyBzdG9yZWQuICovXG5jb25zdCBJTlNUQU5DRV9LRVk9J2lzc3Vlcic7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgaXNzdWVyUmVjb3JkPWlzc3VlckJhZ2dhZ2UuZ2V0KElOU1RBTkNFX0tFWSk7XG5yZXR1cm4gc2V0dXBJc3N1ZXJLaXQoaXNzdWVyUmVjb3JkLGlzc3VlckJhZ2dhZ2Usb3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVJc3N1ZXJLaXQocHJlcGFyZUlzc3VlcktpdCk7XG5oYXJkZW4ocHJlcGFyZUlzc3VlcktpdCk7XG5cbi8qKlxuICogRG9lcyBiYWdnYWdlIGFscmVhZHkgaGF2ZSBhbiBpc3N1ZXIgZnJvbSBwcmVwYXJlSXNzdWVyS2l0KCk/XG4gKiBUaGF0IGlzOiBkb2VzIGl0IGhhdmUgdGhlIHJlbGV2YW50IGtleXMgZGVmaW5lZD9cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuY29uc3QgICAgICAgIGhhc0lzc3Vlcj0oYmFnZ2FnZSk9PmJhZ2dhZ2UuaGFzKElOU1RBTkNFX0tFWSk7XG5cbi8qKlxuICogQHR5cGVkZWYge1BhcnRpYWw8e2VsZW1lbnRTaGFwZTogUGF0dGVybn0+fSBJc3N1ZXJPcHRpb25zUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldCBkZXNjcmlwdGlvbnMuXG4gKiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS5cbiAqIEZvciBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXRcbiAqIGl0IGlzIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmdcbiAqIHRvIHRoYXQgaXNzdWVyIGFuZCBicmFuZC5cbiAqXG4gKiBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVyc1xuICogZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9QXNzZXRLaW5kLk5BVF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm89e31dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi8kaOKAjV9vbmNlLmhhc0lzc3VlcihoYXNJc3N1ZXIpO1xuY29uc3QgICAgICAgIG1ha2VEdXJhYmxlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBpc3N1ZXJEYXRhPWhhcmRlbih7bmFtZSxhc3NldEtpbmQsZGlzcGxheUluZm8sZWxlbWVudFNoYXBlfSk7XG5pc3N1ZXJCYWdnYWdlLmluaXQoSU5TVEFOQ0VfS0VZLGlzc3VlckRhdGEpO1xucmV0dXJuIHNldHVwSXNzdWVyS2l0KGlzc3VlckRhdGEsaXNzdWVyQmFnZ2FnZSxvcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcbiB9OyRo4oCNX29uY2UubWFrZUR1cmFibGVJc3N1ZXJLaXQobWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9J25hdCddXG4gKiBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0IGRlc2NyaXB0aW9ucy5cbiAqIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLlxuICogRm9yIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dFxuICogaXQgaXMgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZ1xuICogdG8gdGhhdCBpc3N1ZXIgYW5kIGJyYW5kLlxuICpcbiAqIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzXG4gKiBmcm9tIHRoZSBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZVxuICogZGVmYXVsdCwgaXMgdXNlZCBmb3IgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9J25hdCddXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvPXt9XVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUlzc3VlcktpdD0oXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG5cbm1ha2VEdXJhYmxlSXNzdWVyS2l0KFxubWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLHtkdXJhYmxlOnRydWV9KSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG57ZWxlbWVudFNoYXBlfSk7JGjigI1fb25jZS5tYWtlSXNzdWVyS2l0KG1ha2VJc3N1ZXJLaXQpO1xuXG5oYXJkZW4obWFrZUlzc3VlcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZUlzc3VlcktpdCI6WyJwcmVwYXJlSXNzdWVyS2l0Il0sImhhc0lzc3VlciI6WyJoYXNJc3N1ZXIiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwibWFrZUlzc3VlcktpdCI6WyJtYWtlSXNzdWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIDIbu6zBQAAswUAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5QmFnLG11c3RNYXRjaCxNLGdldENvcHlCYWdFbnRyaWVzLGJhZ0lzU3VwZXJiYWcsYmFnVW5pb24sYmFnRGlzam9pbnRTdWJ0cmFjdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9hID0+IChtYWtlQ29weUJhZyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRo4oCNX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fYSA9PiAoYmFnSXNTdXBlcmJhZyA9ICRo4oCNX2EpXV0sW1wiYmFnVW5pb25cIiwgWyRo4oCNX2EgPT4gKGJhZ1VuaW9uID0gJGjigI1fYSldXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChiYWdEaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weUJhZ30gKi9cbmNvbnN0IGVtcHR5PW1ha2VDb3B5QmFnKFtdKTtcblxuLyoqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weUJhZz59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5QmFnTWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihiYWcpPT57XG5tdXN0TWF0Y2goYmFnLE0uYmFnKCksJ2JhZyBvZiBhbW91bnQnKTtcbnJldHVybiBiYWc7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooYmFnKT0+Z2V0Q29weUJhZ0VudHJpZXMoYmFnKS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpiYWdJc1N1cGVyYmFnLFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6YmFnVW5pb24sXG5kb1N1YnRyYWN0OmJhZ0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLmNvcHlCYWdNYXRoSGVscGVycyhjb3B5QmFnTWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlCYWdNYXRoSGVscGVycyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAcediPccFAADHBQAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQga2V5RVEsbWFrZUNvcHlTZXQsbXVzdE1hdGNoLE0sZ2V0Q29weVNldEtleXMsc2V0SXNTdXBlcnNldCxzZXREaXNqb2ludFVuaW9uLHNldERpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaOKAjV9hKV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2EgPT4gKHNldElzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50VW5pb25cIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50VW5pb24gPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50U3VidHJhY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtDb3B5U2V0fSAqL1xuY29uc3QgZW1wdHk9bWFrZUNvcHlTZXQoW10pO1xuXG4vKipcbiAqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5U2V0Pn1cbiAqL1xuY29uc3QgICAgICAgIGNvcHlTZXRNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KHNldCk9Pntcbm11c3RNYXRjaChzZXQsTS5zZXQoKSwnc2V0IG9mIGFtb3VudCcpO1xucmV0dXJuIHNldDtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihzZXQpPT5nZXRDb3B5U2V0S2V5cyhzZXQpLmxlbmd0aD09PTAsXG5kb0lzR1RFOnNldElzU3VwZXJzZXQsXG5kb0lzRXF1YWw6a2V5RVEsXG5kb0FkZDpzZXREaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDpzZXREaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5U2V0TWF0aEhlbHBlcnMiOlsiY29weVNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP/csPsqBgAAKgYAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm5hdE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxpc05hdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXSxbXCJpc05hdFwiLCBbJGjigI1fYSA9PiAoaXNOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5jb25zdCBlbXB0eT0wbjtcblxuLyoqXG4gKiBGdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB1c2UgdGhlIG5hdE1hdGhIZWxwZXJzIHRvIG1hbmFnZSBiYWxhbmNlcyAtXG4gKiB0aGUgb3BlcmF0aW9ucyBhcmUgbWVyZWx5IGFyaXRobWV0aWMgb24gbmF0dXJhbCwgbm9uLW5lZ2F0aXZlXG4gKiBudW1iZXJzLlxuICpcbiAqIE5hdHVyYWwgbnVtYmVycyBhcmUgdXNlZCBmb3IgZnVuZ2libGUgZXJpZ2h0cyBzdWNoIGFzIG1vbmV5IGJlY2F1c2VcbiAqIHJvdW5kaW5nIGlzc3VlcyBtYWtlIGZsb2F0cyBwcm9ibGVtYXRpYy4gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGJlXG4gKiBkb25lIHdpdGggdGhlIHNtYWxsZXN0IHdob2xlIHVuaXQgc3VjaCB0aGF0IHRoZSBgbmF0TWF0aEhlbHBlcnNgIG5ldmVyXG4gKiBkZWFscyB3aXRoIGZyYWN0aW9uYWwgcGFydHMuXG4gKlxuICogQHR5cGUge01hdGhIZWxwZXJzPE5hdFZhbHVlPn1cbiAqL1xuY29uc3QgICAgICAgIG5hdE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobmF0KT0+e1xuLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuYXNzZXJ0LnR5cGVvZihuYXQsJ2JpZ2ludCcpO1xuaXNOYXQobmF0KXx8RmFpbCBgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmA7XG5yZXR1cm4gTmF0KG5hdCk7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eToobmF0KT0+bmF0PT09ZW1wdHksXG5kb0lzR1RFOihsZWZ0LHJpZ2h0KT0+bGVmdD49cmlnaHQsXG5kb0lzRXF1YWw6KGxlZnQscmlnaHQpPT5sZWZ0PT09cmlnaHQsXG4vKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuZG9BZGQ6KGxlZnQscmlnaHQpPT5sZWZ0K3JpZ2h0LFxuZG9TdWJ0cmFjdDoobGVmdCxyaWdodCk9Pk5hdChsZWZ0LXJpZ2h0KX0pOyRo4oCNX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACaZmC+fBwAAnwcAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsic2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0S2V5LGVsZW1lbnRzSXNTdXBlcnNldCxlbGVtZW50c0Rpc2pvaW50VW5pb24sZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LGNvZXJjZVRvRWxlbWVudHMsZWxlbWVudHNDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChlbGVtZW50c0lzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY29lcmNlVG9FbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIE9wZXJhdGlvbnMgZm9yIGFycmF5cyB3aXRoIHVuaXF1ZSBvYmplY3RzIGlkZW50aWZ5aW5nIGFuZCBwcm92aWRpbmcqL1xuLyogaW5mb3JtYXRpb24gYWJvdXQgZGlnaXRhbCBhc3NldHMuIFVzZWQgZm9yIFpvZSBpbnZpdGVzLiovXG4vKiogQHR5cGUge1NldFZhbHVlfSAqL1xuY29uc3QgZW1wdHk9aGFyZGVuKFtdKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlIGFycmF5LWJhc2VkIFNldE1hdGggd2l0aCBDb3B5U2V0LWJhc2VkIENvcHlTZXRNYXRoXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8U2V0VmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgc2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihsaXN0KT0+e1xubGlzdD1jb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuLyogQXNzZXJ0IHRoYXQgbGlzdCBjb250YWlucyBvbmx5Ki9cbi8qICogcGFzcy1ieS1jb3B5IHByaW1pdGl2ZXMsKi9cbi8qICogcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnMgY29udGFpbmluZyBrZXlzLCovXG4vKiAqIHJlbW90YWJsZXMuKi9cbmFzc2VydEtleShsaXN0KTtcbnJldHVybiBsaXN0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGxpc3QpPT5wYXNzU3R5bGVPZihsaXN0KT09PSdjb3B5QXJyYXknJiZsaXN0Lmxlbmd0aD09PTAsXG5kb0lzR1RFOmVsZW1lbnRzSXNTdXBlcnNldCxcbmRvSXNFcXVhbDooeCx5KT0+ZWxlbWVudHNDb21wYXJlKHgseSk9PT0wLFxuZG9BZGQ6ZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDplbGVtZW50c0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLnNldE1hdGhIZWxwZXJzKHNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRNYXRoSGVscGVycyI6WyJzZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACwOKgfpQQAAKUEAAAjAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHByZXBhcmVFeG9DbGFzczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBQYXltZW50SVxuICogQHJldHVybnMgeygpID0+IFBheW1lbnQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUGF5bWVudEtpbmQ9KGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk9PntcbmNvbnN0IG1ha2VQYXltZW50PXByZXBhcmVFeG9DbGFzcyhcbmlzc3VlckJhZ2dhZ2UsXG4gYCR7bmFtZX0gcGF5bWVudGAsXG5QYXltZW50SSxcbmluaXRFbXB0eSxcbntcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH19KTtcblxuXG5yZXR1cm4gbWFrZVBheW1lbnQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50S2luZChwcmVwYXJlUGF5bWVudEtpbmQpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRLaW5kIjpbInByZXBhcmVQYXltZW50S2luZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAP1+ju6zEAAOsxAAApAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9wYXltZW50LmpzIiwiLi9wdXJzZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLG11c3RNYXRjaCxNLGtleUVRLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByZXBhcmVFeG8scHJvdmlkZSxBbW91bnRNYXRoLHByZXBhcmVQYXltZW50S2luZCxwcmVwYXJlUHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9cIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG8gPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRLaW5kXCIsIFskaOKAjV9hID0+IChwcmVwYXJlUGF5bWVudEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1wicHJlcGFyZVB1cnNlS2luZFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVB1cnNlS2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLCBbJGjigI1fYSA9PiAoQnJhbmRJID0gJGjigI1fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLCBbJGjigI1fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKi9cbmNvbnN0IGFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZT0oYnJhbmQsYXNzZXRLaW5kLGVsZW1lbnRTaGFwZSk9PntcbmxldCB2YWx1ZVNoYXBlO1xuc3dpdGNoKGFzc2V0S2luZCl7XG5jYXNlJ25hdCc6e1xudmFsdWVTaGFwZT1NLm5hdCgpO1xuZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkfHxcbkZhaWwgYEZ1bmdpYmxlIGFzc2V0cyBjYW5ub3QgaGF2ZSBhbiBlbGVtZW50U2hhcGU6ICR7cShlbGVtZW50U2hhcGUpfWA7XG5icmVhaztcbiB9XG5jYXNlJ3NldCc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmFycmF5T2YoTS5hbmQoTS5rZXkoKSxlbGVtZW50U2hhcGUpKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlTZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uc2V0KCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYmFnKCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uYmFnT2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbkZhaWwgYHVuZXhwZWN0ZWQgYXNzZXQga2luZCAke3EoYXNzZXRLaW5kKX1gO1xuIH19XG5cblxuY29uc3QgYW1vdW50U2hhcGU9aGFyZGVuKHtcbmJyYW5kLC8qIG1hdGNoZXMgb25seSB0aGlzIGV4YWN0IGJyYW5kKi9cbnZhbHVlOnZhbHVlU2hhcGV9KTtcblxucmV0dXJuIGFtb3VudFNoYXBlO1xuIH07XG5cbi8qKlxuICogTWFrZSB0aGUgcGF5bWVudExlZGdlciwgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGJhbGFuY2VzIG9mXG4gKiBwYXltZW50cy4gQWxsIG1pbnRpbmcgYW5kIHRyYW5zZmVyIGF1dGhvcml0eSBvcmlnaW5hdGVzIGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge0Rpc3BsYXlJbmZvPEs+fSBkaXNwbGF5SW5mb1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdXG4gKiBAcmV0dXJucyB7UGF5bWVudExlZGdlcjxLPn1cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVQYXltZW50TGVkZ2VyPShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5lbGVtZW50U2hhcGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuLyoqIEB0eXBlIHtCcmFuZDxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIGNhbGxXaGVuKi9cbmNvbnN0IGJyYW5kPXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gYnJhbmRgLEJyYW5kSSx7XG5pc015SXNzdWVyKGFsbGVnZWRJc3N1ZXIpe1xuLyogQnJhbmRJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBhbGxlZ2VkSXNzdWVyYCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gYWxsZWdlZElzc3Vlcj09PWlzc3VlcjtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG4vKiBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuKi9cbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbmdldEFtb3VudFNoYXBlKCl7XG5yZXR1cm4gYW1vdW50U2hhcGU7XG4gfX0pO1xuXG5cbmNvbnN0IGFtb3VudFNoYXBlPWFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZShcbmJyYW5kLFxuYXNzZXRLaW5kLFxuZWxlbWVudFNoYXBlKTtcblxuXG5jb25zdHtJc3N1ZXJJLE1pbnRJLFBheW1lbnRJLFB1cnNlSUtpdH09bWFrZUlzc3VlckludGVyZmFjZXMoXG5icmFuZCxcbmFzc2V0S2luZCxcbmFtb3VudFNoYXBlKTtcblxuXG5jb25zdCBtYWtlUGF5bWVudD1wcmVwYXJlUGF5bWVudEtpbmQoaXNzdWVyQmFnZ2FnZSxuYW1lLGJyYW5kLFBheW1lbnRJKTtcblxuLyoqIEB0eXBlIHtTaHV0ZG93bldpdGhGYWlsdXJlfSAqL1xuY29uc3Qgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZT0ocmVhc29uKT0+e1xuLyogVE9ETyBUaGlzIHNob3VsZCBhbHNvIGRlc3Ryb3kgbGVkZ2VyIHN0YXRlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0Ki9cbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xudHJ5e1xub3B0U2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pO1xuIH1jYXRjaChlcnJJblNodXRkb3duKXtcbmFzc2VydC5ub3RlKGVyckluU2h1dGRvd24sWCBgQ2F1c2VkIGJ5OiAke3JlYXNvbn1gKTtcbnRocm93IGVyckluU2h1dGRvd247XG4gfVxuIH1cbnRocm93IHJlYXNvbjtcbiB9O1xuXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBBbW91bnQ+fSAqL1xuY29uc3QgcGF5bWVudExlZGdlcj1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShcbmlzc3VlckJhZ2dhZ2UsXG4ncGF5bWVudExlZGdlcicsXG57dmFsdWVTaGFwZTphbW91bnRTaGFwZX0pO1xuXG5cbi8qKlxuICogQSB3aXRoZHJhd24gbGl2ZSBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjb3Zlcnkgc2V0IG9mXG4gKiB0aGUgcHVyc2UgaXQgd2FzIHdpdGhkcmF3biBmcm9tLiBMZXQncyBjYWxsIHRoZXNlIFwicmVjb3ZlcmFibGVcIlxuICogcGF5bWVudHMuIEFsbCByZWNvdmVyYWJsZSBwYXltZW50cyBhcmUgbGl2ZSwgYnV0IG5vdCBhbGwgbGl2ZVxuICogcGF5bWVudHMgYXJlIHJlY292ZXJhYmxlLiBXZSBkbyB0aGUgYm9va2tlZXBpbmcgZm9yIHBheW1lbnQgcmVjb3ZlcnlcbiAqIHdpdGggdGhpcyB3ZWFrbWFwIGZyb20gcmVjb3ZlcmFibGUgcGF5bWVudHMgdG8gdGhlIHJlY292ZXJ5IHNldCB0aGV5IGFyZVxuICogaW4uXG4gKiBBIGJ1bmNoIG9mIGludGVyZXN0aW5nIGludmFyaWFudHMgaGVyZTpcbiAqICAgICogRXZlcnkgcGF5bWVudCB0aGF0IGlzIGEga2V5IGluIHRoZSBvdXRlciBgcGF5bWVudFJlY292ZXJ5U2V0c2BcbiAqICAgICAgd2Vha01hcCBpcyBhbHNvIGluIHRoZSByZWNvdmVyeSBzZXQgaW5kZXhlZCBieSB0aGF0IHBheW1lbnQuXG4gKiAgICAqIEltcGxpZWQgYnkgdGhlIGFib3ZlIGJ1dCB3b3J0aCBzdGF0aW5nOiB0aGUgcGF5bWVudCBpcyBvbmx5XG4gKiAgICAgIGluIGF0IG1vc3Qgb25lIHJlY292ZXJ5IHNldC5cbiAqICAgICogQSByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBzdWNoIHBheW1lbnRzLlxuICogICAgKiBFdmVyeSBwdXJzZSBpcyBhc3NvY2lhdGVkIHdpdGggZXhhY3RseSBvbmUgcmVjb3Zlcnkgc2V0IHVuaXF1ZSB0b1xuICogICAgICBpdC5cbiAqICAgICogQSBwdXJzZSdzIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tXG4gKiAgICAgIHRoYXQgcHVyc2UgYW5kIG5vdCB5ZXQgY29uc3VtZWQuXG4gKlxuICogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBTZXRTdG9yZTxQYXltZW50Pj59XG4gKi9cbmNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHM9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRSZWNvdmVyeVNldHMnKTtcblxuXG4vKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgaW5pdFBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmluaXRgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gW29wdFJlY292ZXJ5U2V0XVxuICovXG5jb25zdCBpbml0UGF5bWVudD0ocGF5bWVudCxhbW91bnQsb3B0UmVjb3ZlcnlTZXQ9dW5kZWZpbmVkKT0+e1xuaWYob3B0UmVjb3ZlcnlTZXQhPT11bmRlZmluZWQpe1xub3B0UmVjb3ZlcnlTZXQuYWRkKHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5pbml0KHBheW1lbnQsb3B0UmVjb3ZlcnlTZXQpO1xuIH1cbnBheW1lbnRMZWRnZXIuaW5pdChwYXltZW50LGFtb3VudCk7XG4gfTtcblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGRlbGV0ZVBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmRlbGV0ZWAuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKi9cbmNvbnN0IGRlbGV0ZVBheW1lbnQ9KHBheW1lbnQpPT57XG5wYXltZW50TGVkZ2VyLmRlbGV0ZShwYXltZW50KTtcbmlmKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKXtcbmNvbnN0IHJlY292ZXJ5U2V0PXBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG5yZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gfVxuIH07XG5cbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IGFkZD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguYWRkKGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBBbW91bnQgfSAqL1xuY29uc3Qgc3VidHJhY3Q9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLnN1YnRyYWN0KGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsoYWxsZWdlZEFtb3VudDogQW1vdW50KSA9PiBBbW91bnR9ICovXG5jb25zdCBjb2VyY2U9KGFsbGVnZWRBbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbGxlZ2VkQW1vdW50KTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gYm9vbGVhbiB9ICovXG5cbi8qKlxuICogTWV0aG9kcyBsaWtlIGRlcG9zaXQoKSBoYXZlIGFuIG9wdGlvbmFsIHNlY29uZCBwYXJhbWV0ZXJcbiAqIGBvcHRBbW91bnRTaGFwZWBcbiAqIHdoaWNoLCBpZiBwcmVzZW50LCBpcyBzdXBwb3NlZCB0byBtYXRjaCB0aGUgYmFsYW5jZSBvZiB0aGVcbiAqIHBheW1lbnQuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGRvZXMgdGhhdCBjaGVjay5cbiAqXG4gKiBOb3RlOiBgb3B0QW1vdW50U2hhcGVgIGlzIHVzZXItc3VwcGxpZWQgd2l0aCBubyBwcmV2aW91cyB2YWxpZGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBwYXltZW50QmFsYW5jZVxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgYXNzZXJ0QW1vdW50Q29uc2lzdGVudD0ocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpPT57XG5pZihvcHRBbW91bnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2gocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUsJ2Ftb3VudCcpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydExpdmVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5oYXMocGF5bWVudCl8fFxuRmFpbCBgJHtwYXltZW50fSB3YXMgbm90IGEgbGl2ZSBwYXltZW50IGZvciBicmFuZCAke3EoXG5icmFuZClcbiB9LiBJdCBjb3VsZCBiZSBhIHVzZWQtdXAgcGF5bWVudCwgYSBwYXltZW50IGZvciBhbm90aGVyIGJyYW5kLCBvciBpdCBtaWdodCBub3QgYmUgYSBwYXltZW50IGF0IGFsbC5gO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2UuZGVwb3NpdFxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSBkZXBvc2l0XG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtQYXltZW50fSBzcmNQYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cbmNvbnN0IGRlcG9zaXRJbnRlcm5hbD0oXG5jdXJyZW50QmFsYW5jZSxcbnVwZGF0ZVB1cnNlQmFsYW5jZSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZT11bmRlZmluZWQpPT5cbntcbiFpc1Byb21pc2Uoc3JjUGF5bWVudCl8fFxuYXNzZXJ0LmZhaWwoXG4gYGRlcG9zaXQgZG9lcyBub3QgYWNjZXB0IHByb21pc2VzIGFzIGZpcnN0IGFyZ3VtZW50LiBJbnN0ZWFkIG9mIHBhc3NpbmcgdGhlIHByb21pc2UgKGRlcG9zaXQocGF5bWVudFByb21pc2UpKSwgY29uc2lkZXIgdW53cmFwcGluZyB0aGUgcHJvbWlzZSBmaXJzdDogRS53aGVuKHBheW1lbnRQcm9taXNlLCAoYWN0dWFsUGF5bWVudCA9PiBkZXBvc2l0KGFjdHVhbFBheW1lbnQpKWAsXG5UeXBlRXJyb3IpO1xuXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChzcmNQYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG5jb25zdCBuZXdQdXJzZUJhbGFuY2U9YWRkKHNyY1BheW1lbnRCYWxhbmNlLGN1cnJlbnRCYWxhbmNlKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG4vKiBNb3ZlIHRoZSBhc3NldHMgaW4gYHNyY1BheW1lbnRgIGludG8gdGhpcyBwdXJzZSwgdXNpbmcgdXAgdGhlKi9cbi8qIHNvdXJjZSBwYXltZW50LCBzdWNoIHRoYXQgdG90YWwgYXNzZXRzIGFyZSBjb25zZXJ2ZWQuKi9cbmRlbGV0ZVBheW1lbnQoc3JjUGF5bWVudCk7XG51cGRhdGVQdXJzZUJhbGFuY2UobmV3UHVyc2VCYWxhbmNlKTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gfTtcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBwdXJzZSBjb2RlIHRvIGltcGxlbWVudCBwdXJzZS53aXRoZHJhd1xuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSB3aXRoZHJhd2FsXG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAtIHRoZSBhbW91bnQgdG8gYmUgd2l0aGRyYXduXG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSByZWNvdmVyeVNldFxuICogQHJldHVybnMge1BheW1lbnR9XG4gKi9cbmNvbnN0IHdpdGhkcmF3SW50ZXJuYWw9KFxuY3VycmVudEJhbGFuY2UsXG51cGRhdGVQdXJzZUJhbGFuY2UsXG5hbW91bnQsXG5yZWNvdmVyeVNldCk9Plxue1xuYW1vdW50PWNvZXJjZShhbW91bnQpO1xuQW1vdW50TWF0aC5pc0dURShjdXJyZW50QmFsYW5jZSxhbW91bnQpfHxcbkZhaWwgYFdpdGhkcmF3YWwgb2YgJHthbW91bnR9IGZhaWxlZCBiZWNhdXNlIHRoZSBwdXJzZSBvbmx5IGNvbnRhaW5lZCAke2N1cnJlbnRCYWxhbmNlfWA7XG5jb25zdCBuZXdQdXJzZUJhbGFuY2U9c3VidHJhY3QoY3VycmVudEJhbGFuY2UsYW1vdW50KTtcblxuY29uc3QgcGF5bWVudD1tYWtlUGF5bWVudCgpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5UIE1vdmUgdGhlIHdpdGhkcmF3biBhc3NldHMgZnJvbSB0aGlzIHB1cnNlIGludG8qL1xuLyogcGF5bWVudC4gVG90YWwgYXNzZXRzIG11c3QgcmVtYWluIGNvbnNlcnZlZC4qL1xudXBkYXRlUHVyc2VCYWxhbmNlKG5ld1B1cnNlQmFsYW5jZSk7XG5pbml0UGF5bWVudChwYXltZW50LGFtb3VudCxyZWNvdmVyeVNldCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnQ7XG4gfTtcblxuY29uc3QgbWFrZUVtcHR5UHVyc2U9cHJlcGFyZVB1cnNlS2luZChcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5oYXJkZW4oe1xuZGVwb3NpdEludGVybmFsLFxud2l0aGRyYXdJbnRlcm5hbH0pKTtcblxuXG5cbi8qKiBAdHlwZSB7SXNzdWVyPEs+fSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IGR1ZSB0byBjYWxsV2hlbiBkaXNjcmVwYW5jeSovXG5jb25zdCBpc3N1ZXI9cHJlcGFyZUV4byhpc3N1ZXJCYWdnYWdlLCBgJHtuYW1lfSBpc3N1ZXJgLElzc3Vlckkse1xuZ2V0QnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG5nZXRBc3NldEtpbmQoKXtcbnJldHVybiBhc3NldEtpbmQ7XG4gfSxcbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbm1ha2VFbXB0eVB1cnNlKCl7XG5yZXR1cm4gbWFrZUVtcHR5UHVyc2UoKTtcbiB9LFxuLyoqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudCBhd2FpdGVkIGJ5IGNhbGxXaGVuICovXG5pc0xpdmUocGF5bWVudCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gcGF5bWVudExlZGdlci5oYXMocGF5bWVudCk7XG4gfSxcbi8qKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlbiAqL1xuZ2V0QW1vdW50T2YocGF5bWVudCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbnJldHVybiBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiB9LFxuLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlblxuICogQHBhcmFtIHtQYXR0ZXJufSBvcHRBbW91bnRTaGFwZVxuICovXG5idXJuKHBheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xuY29uc3QgcGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVC4qL1xuZGVsZXRlUGF5bWVudChwYXltZW50KTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gcGF5bWVudEJhbGFuY2U7XG4gfX0pO1xuXG5cbi8qKlxuICogUHJvdmlkZXMgZm9yIHRoZSByZWNvdmVyeSBvZiBuZXdseSBtaW50ZWQgYnV0IG5vdC15ZXQtZGVwb3NpdGVkIHBheW1lbnRzLlxuICpcbiAqIEJlY2F1c2UgdGhlIGBtaW50UmVjb3ZlcnlQdXJzZWAgaXMgcGxhY2VkIGluIGJhZ2dhZ2UsIGV2ZW4gaWYgdGhlXG4gKiBjYWxsZXIgb2YgYG1ha2VJc3N1ZXJLaXRgIGRyb3BzIGl0IG9uIHRoZSBmbG9vciwgaXQgY2FuIHN0aWxsIGJlXG4gKiByZWNvdmVyZWQgaW4gYW4gZW1lcmdlbmN5IHVwZ3JhZGUuXG4gKlxuICogQHR5cGUge1B1cnNlPEs+fVxuICovXG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZT1wcm92aWRlKGlzc3VlckJhZ2dhZ2UsJ21pbnRSZWNvdmVyeVB1cnNlJywoKT0+XG5tYWtlRW1wdHlQdXJzZSgpKTtcblxuXG4vKiogQHR5cGUge01pbnQ8Sz59ICovXG5jb25zdCBtaW50PXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gbWludGAsTWludEkse1xuZ2V0SXNzdWVyKCl7XG5yZXR1cm4gaXNzdWVyO1xuIH0sXG5taW50UGF5bWVudChuZXdBbW91bnQpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjaGVja2VkIGNhc3QqL1xubmV3QW1vdW50PWNvZXJjZShuZXdBbW91bnQpO1xubXVzdE1hdGNoKG5ld0Ftb3VudCxhbW91bnRTaGFwZSwnbWludGVkIGFtb3VudCcpO1xuLyogYHJhd1BheW1lbnRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHJlY292ZXJ5IHNldCwgYW5kKi9cbi8qIHNvIG11c3Qgbm90IGVzY2FwZS4qL1xuY29uc3QgcmF3UGF5bWVudD1tYWtlUGF5bWVudCgpO1xuaW5pdFBheW1lbnQocmF3UGF5bWVudCxuZXdBbW91bnQsdW5kZWZpbmVkKTtcblxuY29uc3QgbWludFJlY292ZXJ5UHVyc2VCZWZvcmU9bWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xubWludFJlY292ZXJ5UHVyc2UuZGVwb3NpdChyYXdQYXltZW50LG5ld0Ftb3VudCk7XG5jb25zdCBwYXltZW50PW1pbnRSZWNvdmVyeVB1cnNlLndpdGhkcmF3KG5ld0Ftb3VudCk7XG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyPW1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbmFzc2VydChrZXlFUShtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSxtaW50UmVjb3ZlcnlQdXJzZUFmdGVyKSk7XG5yZXR1cm4gcGF5bWVudDtcbiB9fSk7XG5cblxuY29uc3QgaXNzdWVyS2l0PWhhcmRlbih7aXNzdWVyLG1pbnQsYnJhbmQsbWludFJlY292ZXJ5UHVyc2V9KTtcbnJldHVybiBpc3N1ZXJLaXQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50TGVkZ2VyKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudExlZGdlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRMZWRnZXIiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAokVFQsAPAADADwAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUHVyc2VLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0scHJlcGFyZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxBbW91bnRNYXRoLG1ha2VUcmFuc2llbnROb3RpZmllcktpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiLi90cmFuc2llbnROb3RpZmllci5qc1wiLCBbW1wibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgcHJlcGFyZVB1cnNlS2luZD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxucHVyc2VNZXRob2RzKT0+XG57XG5jb25zdCBhbW91bnRTaGFwZT1icmFuZC5nZXRBbW91bnRTaGFwZSgpO1xuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3R7cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZTp1cGRhdGVCYWxhbmNlfT1tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQoKTtcblxuY29uc3QgdXBkYXRlUHVyc2VCYWxhbmNlPShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UscHVyc2UpPT57XG5zdGF0ZS5jdXJyZW50QmFsYW5jZT1uZXdQdXJzZUJhbGFuY2U7XG51cGRhdGVCYWxhbmNlKHB1cnNlLHB1cnNlLmdldEN1cnJlbnRBbW91bnQoKSk7XG4gfTtcblxuLyogLSBUaGlzIGtpbmQgaXMgYSBwYWlyIG9mIHB1cnNlIGFuZCBkZXBvc2l0RmFjZXQgdGhhdCBoYXZlIGEgMToxKi9cbi8qIGNvcnJlc3BvbmRlbmNlLiovXG4vKiAtIFRoZXkgYXJlIHZpcnR1YWxpemVkIHRvZ2V0aGVyIHRvIHNoYXJlIGEgc2luZ2xlIHN0YXRlIHJlY29yZC4qL1xuLyogLSBBbiBhbHRlcm5hdGl2ZSBkZXNpZ24gY29uc2lkZXJlZCB3YXMgdG8gaGF2ZSB0aGlzIHJldHVybiBhIFB1cnNlIGFsb25lKi9cbi8qIHRoYXQgY3JlYXRlZCBkZXBvc2l0RmFjZXQgYXMgbmVlZGVkLiBCdXQgdGhpcyBhcHByb2FjaCBlbnN1cmVzIGEgY29uc3RhbnQqL1xuLyogaWRlbnRpdHkgZm9yIHRoZSBmYWNldCBhbmQgZXhlcmNpc2VzIHRoZSBtdWx0aS1mYWNldGVkIG9iamVjdCBzdHlsZS4qL1xuY29uc3R7ZGVwb3NpdEludGVybmFsLHdpdGhkcmF3SW50ZXJuYWx9PXB1cnNlTWV0aG9kcztcbmNvbnN0IG1ha2VQdXJzZUtpdD1wcmVwYXJlRXhvQ2xhc3NLaXQoXG5pc3N1ZXJCYWdnYWdlLFxuIGAke25hbWV9IFB1cnNlYCxcblB1cnNlSUtpdCxcbigpPT57XG5jb25zdCBjdXJyZW50QmFsYW5jZT1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuXG4vKiogQHR5cGUge1NldFN0b3JlPFBheW1lbnQ+fSAqL1xuY29uc3QgcmVjb3ZlcnlTZXQ9bWFrZVNjYWxhckJpZ1NldFN0b3JlKCdyZWNvdmVyeSBzZXQnLHtcbmR1cmFibGU6dHJ1ZX0pO1xuXG5cbnJldHVybntcbmN1cnJlbnRCYWxhbmNlLFxucmVjb3ZlcnlTZXR9O1xuXG4gfSxcbntcbnB1cnNlOntcbmRlcG9zaXQoc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbi8qIFNlZSB0aGUgY29tbWVudHMgb24gUHVyc2VJLmRlcG9zaXQgaW4gdHlwZUd1YXJkcy5qcyovXG5jb25zdHtzdGF0ZX09dGhpcztcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBkZXBvc2l0LiovXG5yZXR1cm4gZGVwb3NpdEludGVybmFsKFxuc3RhdGUuY3VycmVudEJhbGFuY2UsXG4obmV3UHVyc2VCYWxhbmNlKT0+XG51cGRhdGVQdXJzZUJhbGFuY2Uoc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHRoaXMuZmFjZXRzLnB1cnNlKSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZSk7XG5cbiB9LFxud2l0aGRyYXcoYW1vdW50KXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIHdpdGhkcmF3LiovXG5yZXR1cm4gd2l0aGRyYXdJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5hbW91bnQsXG5zdGF0ZS5yZWNvdmVyeVNldCk7XG5cbiB9LFxuZ2V0Q3VycmVudEFtb3VudCgpe1xucmV0dXJuIHRoaXMuc3RhdGUuY3VycmVudEJhbGFuY2U7XG4gfSxcbmdldEN1cnJlbnRBbW91bnROb3RpZmllcigpe1xucmV0dXJuIHByb3ZpZGVOb3RpZmllcih0aGlzLmZhY2V0cy5wdXJzZSk7XG4gfSxcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZ2V0RGVwb3NpdEZhY2V0KCl7XG5yZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuIH0sXG5cbmdldFJlY292ZXJ5U2V0KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5yZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuIH0sXG5yZWNvdmVyQWxsKCl7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5sZXQgYW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5mb3IoY29uc3QgcGF5bWVudCBvZiBzdGF0ZS5yZWNvdmVyeVNldC5rZXlzKCkpe1xuLyogVGhpcyBkb2VzIGNhdXNlIGRlbGV0aW9ucyBmcm9tIHRoZSBzZXQgd2hpbGUgaXRlcmF0aW5nLCovXG4vKiBidXQgdGhpcyBzcGVjaWFsIGNhc2UgaXMgYWxsb3dlZC4qL1xuY29uc3QgZGVsdGE9ZmFjZXRzLnB1cnNlLmRlcG9zaXQocGF5bWVudCk7XG5hbW91bnQ9QW1vdW50TWF0aC5hZGQoYW1vdW50LGRlbHRhLGJyYW5kKTtcbiB9XG5zdGF0ZS5yZWNvdmVyeVNldC5nZXRTaXplKCk9PT0wfHxcbkZhaWwgYGludGVybmFsOiBSZW1haW5pbmcgdW5yZWNvdmVyZWQgcGF5bWVudHM6ICR7ZmFjZXRzLnB1cnNlLmdldFJlY292ZXJ5U2V0KCl9YDtcbnJldHVybiBhbW91bnQ7XG4gfX0sXG5cbmRlcG9zaXRGYWNldDp7XG5yZWNlaXZlKC4uLmFyZ3Mpe1xucmV0dXJuIHRoaXMuZmFjZXRzLnB1cnNlLmRlcG9zaXQoLi4uYXJncyk7XG4gfX19LFxuXG5cbntcbnN0YXRlU2hhcGU6e1xuY3VycmVudEJhbGFuY2U6YW1vdW50U2hhcGUsXG5yZWNvdmVyeVNldDpNLnJlbW90YWJsZSgncmVjb3ZlcnlTZXQnKX19KTtcblxuXG5cbnJldHVybigpPT5tYWtlUHVyc2VLaXQoKS5wdXJzZTtcbiB9OyRo4oCNX29uY2UucHJlcGFyZVB1cnNlS2luZChwcmVwYXJlUHVyc2VLaW5kKTtcbmhhcmRlbihwcmVwYXJlUHVyc2VLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUHVyc2VLaW5kIjpbInByZXBhcmVQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALkljqRQGAAAUBgAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3QgICAgICAgIG1ha2VUcmFuc2llbnROb3RpZmllcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UHVyc2UsIE5vdGlmaWVyUmVjb3JkPGFueT4+fSAqL1xuY29uc3QgdHJhbnNpZW50Tm90aWZlcktpdHM9bWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShcbid0cmFuc2llbnROb3RpZmVyS2l0cycpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcktpdD0oa2V5KT0+XG5wcm92aWRlTGF6eSh0cmFuc2llbnROb3RpZmVyS2l0cyxrZXksKCk9PlxubWFrZU5vdGlmaWVyS2l0KGtleS5nZXRDdXJyZW50QW1vdW50KCkpKTtcblxuXG5jb25zdCBwcm92aWRlTm90aWZpZXI9KGtleSk9PnByb3ZpZGVOb3RpZmllcktpdChrZXkpLm5vdGlmaWVyO1xuY29uc3QgdXBkYXRlPShrZXksbmV3VmFsdWUpPT57XG5pZih0cmFuc2llbnROb3RpZmVyS2l0cy5oYXMoa2V5KSl7XG5jb25zdHt1cGRhdGVyfT10cmFuc2llbnROb3RpZmVyS2l0cy5nZXQoa2V5KTtcbnVwZGF0ZXIudXBkYXRlU3RhdGUobmV3VmFsdWUpO1xuIH1cbiB9O1xuXG5yZXR1cm57cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZX07XG4gfTskaOKAjV9vbmNlLm1ha2VUcmFuc2llbnROb3RpZmllcktpdChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xuaGFyZGVuKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAo7p4+EicAABInAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIkFtb3VudFNoYXBlIiwiQXNzZXRLaW5kU2hhcGUiLCJCcmFuZEkiLCJCcmFuZFNoYXBlIiwiRGVwb3NpdEZhY2V0U2hhcGUiLCJEaXNwbGF5SW5mb1NoYXBlIiwiSXNzdWVyS2l0U2hhcGUiLCJJc3N1ZXJTaGFwZSIsIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyIsIk1pbnRTaGFwZSIsIk5vdGlmaWVyU2hhcGUiLCJQYXltZW50U2hhcGUiLCJQdXJzZVNoYXBlIiwiUmF0aW9TaGFwZSIsImlzQ29weUJhZ1ZhbHVlIiwiaXNDb3B5U2V0VmFsdWUiLCJpc05hdFZhbHVlIiwiaXNTZXRWYWx1ZSIsIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0sbWF0Y2hlczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCAgICAgICAgQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgnQnJhbmQnKTskaOKAjV9vbmNlLkJyYW5kU2hhcGUoQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgSXNzdWVyU2hhcGU9TS5yZW1vdGFibGUoJ0lzc3VlcicpOyRo4oCNX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuY29uc3QgICAgICAgIFBheW1lbnRTaGFwZT1NLnJlbW90YWJsZSgnUGF5bWVudCcpOyRo4oCNX29uY2UuUGF5bWVudFNoYXBlKFBheW1lbnRTaGFwZSk7XG5jb25zdCAgICAgICAgUHVyc2VTaGFwZT1NLnJlbW90YWJsZSgnUHVyc2UnKTskaOKAjV9vbmNlLlB1cnNlU2hhcGUoUHVyc2VTaGFwZSk7XG5jb25zdCAgICAgICAgRGVwb3NpdEZhY2V0U2hhcGU9TS5yZW1vdGFibGUoJ0RlcG9zaXRGYWNldCcpOyRo4oCNX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuY29uc3QgICAgICAgIE5vdGlmaWVyU2hhcGU9TS5yZW1vdGFibGUoJ05vdGlmaWVyJyk7JGjigI1fb25jZS5Ob3RpZmllclNoYXBlKE5vdGlmaWVyU2hhcGUpO1xuY29uc3QgICAgICAgIE1pbnRTaGFwZT1NLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBOYXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzXG4gKiBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGF0IG1hbnkgdW5pdHMgb2YgdGhlXG4gKiBmdW5naWJsZSBhc3NldCByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudC4gVGhlIGJyYW5kIG9mIHRoYXQgYW1vdW50XG4gKiBzaG91bGQgaW5kZWVkIHJlcHJlc2VudCBhIGtpbmQgb2YgYXNzZXQgY29uc2lzdGluZyBvZiBhIGNvdW50YWJsZVxuICogc2V0IG9mIGZ1bmdpYmxlIHVuaXRzLlxuICovJGjigI1fb25jZS5NaW50U2hhcGUoTWludFNoYXBlKTtcbmNvbnN0IE5hdFZhbHVlU2hhcGU9TS5uYXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weVNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weVNldCwgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIG5vbi1mdW5naWJsZVxuICogaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZSBub24tZnVuZ2libGUgYXNzZXQgY2xhc3NcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBhbW91bnQgaXRzZWxmIHJlcHJlc2VudHNcbiAqIHRoZSBzZXQgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlciBpdGVtc1xuICogZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlXG4gKiB0aGF0IHdlIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0XG4gKiB0aGUgY29kZSB0aGF0IGhvbGRzIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoYXQgYnJhbmQsIG9ubHkgbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0c1xuICogb2YgdGhhdCBhc3NldCBjbGFzcyBhcyBkZWZpbmVkIGJ5IGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyXG4gKiBhbiBhbW91bnQgZXhwcmVzc2luZywgZm9yIGV4YW1wbGUsIHRoYXQgdGhleSBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXRcbiAqIHdpbGwgbmV2ZXIgYmUgbWludGVkLiBUaGF0IHdhbnQgd2lsbCBuZXZlciBiZSBzYXRpc2ZpZWQuXG4gKiBcIllvdSBjYW4ndCBhbHdheXMgZ2V0Li4uXCJcbiAqL1xuY29uc3QgQ29weVNldFZhbHVlU2hhcGU9TS5zZXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgU2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QXJyYXkgb2YgcGFzc2FibGUgS2V5cy4gVGhpcyByZXByZXNlbnRhdGlvbiBpcyBkZXByZWNhdGVkLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogQ29weVNldFZhbHVlcy5cbiAqL1xuY29uc3QgU2V0VmFsdWVTaGFwZT1NLmFycmF5T2YoTS5rZXkoKSk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlCYWdWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlCYWcsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgYmFnIChtdWx0aXNldCkgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIHNlbWktZnVuZ2libGVcbiAqIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCwgZnJvbSB0aGUgc2VtaS1mdW5naWJsZSBhc3NldCBjbGFzc1xuICogcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGtleVxuICogYXBwZWFycyBpbiB0aGUgYmFnIGlzIHRoZSBudW1iZXIgb2YgZnVuZ2libGUgdW5pdHMgb2YgdGhhdCBrZXkuXG4gKiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzXG4gKiB0aGUgYmFnIG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXNcbiAqIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZVxuICogdGhhdCB3ZSBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdFxuICogdGhlIGNvZGUgdGhhdCBob2xkcyB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGF0IGJyYW5kLCBvbmx5IG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHNcbiAqIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieSBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlclxuICogYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXkgXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0XG4gKiB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmUgc2F0aXNmaWVkLlxuICogXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlCYWdWYWx1ZVNoYXBlPU0uYmFnKCk7XG5cbmNvbnN0IEFtb3VudFZhbHVlU2hhcGU9TS5vcihcbk5hdFZhbHVlU2hhcGUsXG5Db3B5U2V0VmFsdWVTaGFwZSxcblNldFZhbHVlU2hhcGUsXG5Db3B5QmFnVmFsdWVTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZDpCcmFuZFNoYXBlLFxudmFsdWU6QW1vdW50VmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuQW1vdW50U2hhcGUoQW1vdW50U2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBSYXRpb1NoYXBlPWhhcmRlbih7XG5udW1lcmF0b3I6QW1vdW50U2hhcGUsXG5kZW5vbWluYXRvcjpBbW91bnRTaGFwZX0pO1xuXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgTmF0IGJpZ2ludC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFhpbXBvcnQoJy4vdHlwZXMuanMnKS5OYXRWYWx1ZX1cbiAqLyRo4oCNX29uY2UuUmF0aW9TaGFwZShSYXRpb1NoYXBlKTtcbmNvbnN0ICAgICAgICBpc05hdFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsTmF0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc05hdFZhbHVlKGlzTmF0VmFsdWUpO1xuaGFyZGVuKGlzTmF0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlTZXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlTZXR9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLENvcHlTZXRWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzQ29weVNldFZhbHVlKGlzQ29weVNldFZhbHVlKTtcbmhhcmRlbihpc0NvcHlTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgcGFzcyBieSBjb3B5IGFycmF5IHN0cnVjdHVyZS4gRG9lcyBub3RcbiAqIGNoZWNrIGZvciBkdXBsaWNhdGVzLiBUbyBjaGVjayBmb3IgZHVwbGljYXRlcywgdXNlIHNldE1hdGhIZWxwZXJzLmNvZXJjZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqIENvcHlTZXRWYWx1ZXMuXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFNldFZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLFNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNTZXRWYWx1ZShpc1NldFZhbHVlKTtcbmhhcmRlbihpc1NldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5QmFnXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5QmFnfVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnVmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5QmFnVmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vKiBPbmUgR09PR09MdGggc2hvdWxkIGJlIGVub3VnaCBkZWNpbWFsIHBsYWNlcyBmb3IgYW55Ym9keS4qL1xuY29uc3QgICAgICAgIE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUz0xMDA7JGjigI1fb25jZS5NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKTtcblxuY29uc3QgICAgICAgIEFzc2V0S2luZFNoYXBlPU0ub3IoJ25hdCcsJ3NldCcsJ2NvcHlTZXQnLCdjb3B5QmFnJyk7JGjigI1fb25jZS5Bc3NldEtpbmRTaGFwZShBc3NldEtpbmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBEaXNwbGF5SW5mb1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57fSxcbntcbmRlY2ltYWxQbGFjZXM6TS5hbmQoXG5NLmd0ZSgtTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbk0ubHRlKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUykpLFxuXG5hc3NldEtpbmQ6QXNzZXRLaW5kU2hhcGV9LFxuXG57XG4vKiBJbmNsdWRpbmcgdGhpcyBlbXB0eSBgcmVzdGAgZW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciovXG4vKiBwcm9wZXJ0aWVzIGJleW9uZCB0aG9zZSBpbiB0aGUgYGJhc2VgIHJlY29yZC4qL30pOyRo4oCNX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBJc3N1ZXJLaXRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbm1pbnQ6TWludFNoYXBlLFxubWludFJlY292ZXJ5UHVyc2U6UHVyc2VTaGFwZSxcbmlzc3VlcjpJc3N1ZXJTaGFwZSxcbmRpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9KTtcblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovJGjigI1fb25jZS5Jc3N1ZXJLaXRTaGFwZShJc3N1ZXJLaXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEk9TS5pbnRlcmZhY2UoJ0JyYW5kJyx7XG5pc015SXNzdWVyOk0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5nZXRBbW91bnRTaGFwZTpNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBbYnJhbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Fzc2V0S2luZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYW1vdW50U2hhcGVdXG4gKi8kaOKAjV9vbmNlLkJyYW5kSShCcmFuZEkpO1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJJbnRlcmZhY2VzPShcbmJyYW5kU2hhcGU9QnJhbmRTaGFwZSxcbmFzc2V0S2luZFNoYXBlPUFzc2V0S2luZFNoYXBlLFxuYW1vdW50U2hhcGU9QW1vdW50U2hhcGUpPT5cbntcbmNvbnN0IElzc3Vlckk9TS5pbnRlcmZhY2UoJ0lzc3Vlcicse1xuZ2V0QnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEFsbGVnZWROYW1lOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXRBc3NldEtpbmQ6TS5jYWxsKCkucmV0dXJucyhhc3NldEtpbmRTaGFwZSksXG5nZXREaXNwbGF5SW5mbzpNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxubWFrZUVtcHR5UHVyc2U6TS5jYWxsKCkucmV0dXJucyhQdXJzZVNoYXBlKSxcblxuaXNMaXZlOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldEFtb3VudE9mOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmJ1cm46TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLlxub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBNaW50ST1NLmludGVyZmFjZSgnTWludCcse1xuZ2V0SXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxubWludFBheW1lbnQ6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSl9KTtcblxuXG5jb25zdCBQYXltZW50ST1NLmludGVyZmFjZSgnUGF5bWVudCcse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSl9KTtcblxuXG5jb25zdCBQdXJzZUk9TS5pbnRlcmZhY2UoJ1B1cnNlJyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnQ6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXI6TS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBSYXRoZXIsIHRoZSBzZW1hbnRpY3Mgb2YgYGRlcG9zaXRgIHJlcXVpcmUgaXQgdG8gcHJvdmlkZSBpdHMqL1xuLyogY2FsbGVycyB3aXRoIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGBkZXBvc2l0YCBtZXNzYWdlcyBhcmUqL1xuLyogcHJvY2Vzc2VkIHdpdGhvdXQgZnVydGhlciBkZWxheSBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuKi9cbi8qIFB1cnNlSSB0aGVyZWZvcmUgcmVxdWlyZXMgdGhhdCB0aGUgYHNyY1BheW1lbnRgIGFyZ3VtZW50IGFscmVhZHkqL1xuLyogYmUgYSByZW1vdGFibGUsIG5vdCBhIHByb21pc2UuKi9cbi8qIFB1cnNlSSBvbmx5IGNhbGxzIHRoaXMgcmF3IG1ldGhvZCBhZnRlciB2YWxpZGF0aW5nIHRoYXQqL1xuLyogYHNyY1BheW1lbnRgIGlzIGEgcmVtb3RhYmxlLCBsZWF2aW5nIGl0Ki9cbi8qIHRvIHRoaXMgcmF3IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgcmVtb3RhYmxlIGlzIGFjdHVhbGx5Ki9cbi8qIGEgbGl2ZSBwYXltZW50IG9mIHRoZSBjb3JyZWN0IGJyYW5kIHdpdGggc3VmZmljaWVudCBmdW5kcy4qL1xuZGVwb3NpdDpNLmNhbGwoUGF5bWVudFNoYXBlKS5vcHRpb25hbChNLnBhdHRlcm4oKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXREZXBvc2l0RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG53aXRoZHJhdzpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmdldFJlY292ZXJ5U2V0Ok0uY2FsbCgpLnJldHVybnMoTS5zZXRPZihQYXltZW50U2hhcGUpKSxcbnJlY292ZXJBbGw6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBEZXBvc2l0RmFjZXRJPU0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLHtcbnJlY2VpdmU6UHVyc2VJLm1ldGhvZEd1YXJkcy5kZXBvc2l0fSk7XG5cblxuY29uc3QgUHVyc2VJS2l0PWhhcmRlbih7XG5wdXJzZTpQdXJzZUksXG5kZXBvc2l0RmFjZXQ6RGVwb3NpdEZhY2V0SX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuSXNzdWVySSxcbk1pbnRJLFxuUGF5bWVudEksXG5QdXJzZUlLaXR9KTtcblxuIH07JGjigI1fb25jZS5tYWtlSXNzdWVySW50ZXJmYWNlcyhtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG5oYXJkZW4obWFrZUlzc3VlckludGVyZmFjZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyYW5kU2hhcGUiOlsiQnJhbmRTaGFwZSJdLCJJc3N1ZXJTaGFwZSI6WyJJc3N1ZXJTaGFwZSJdLCJQYXltZW50U2hhcGUiOlsiUGF5bWVudFNoYXBlIl0sIlB1cnNlU2hhcGUiOlsiUHVyc2VTaGFwZSJdLCJEZXBvc2l0RmFjZXRTaGFwZSI6WyJEZXBvc2l0RmFjZXRTaGFwZSJdLCJOb3RpZmllclNoYXBlIjpbIk5vdGlmaWVyU2hhcGUiXSwiTWludFNoYXBlIjpbIk1pbnRTaGFwZSJdLCJBbW91bnRTaGFwZSI6WyJBbW91bnRTaGFwZSJdLCJSYXRpb1NoYXBlIjpbIlJhdGlvU2hhcGUiXSwiaXNOYXRWYWx1ZSI6WyJpc05hdFZhbHVlIl0sImlzQ29weVNldFZhbHVlIjpbImlzQ29weVNldFZhbHVlIl0sImlzU2V0VmFsdWUiOlsiaXNTZXRWYWx1ZSJdLCJpc0NvcHlCYWdWYWx1ZSI6WyJpc0NvcHlCYWdWYWx1ZSJdLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiOlsiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIl0sIkFzc2V0S2luZFNoYXBlIjpbIkFzc2V0S2luZFNoYXBlIl0sIkRpc3BsYXlJbmZvU2hhcGUiOlsiRGlzcGxheUluZm9TaGFwZSJdLCJJc3N1ZXJLaXRTaGFwZSI6WyJJc3N1ZXJLaXRTaGFwZSJdLCJCcmFuZEkiOlsiQnJhbmRJIl0sIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIjpbIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACzPqVFwPwAAcD8AACkAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbW91bnRcbiAqIEFtb3VudHMgYXJlIGRlc2NyaXB0aW9ucyBvZiBkaWdpdGFsIGFzc2V0cywgYW5zd2VyaW5nIHRoZSBxdWVzdGlvbnNcbiAqIFwiaG93IG11Y2hcIiBhbmQgXCJvZiB3aGF0IGtpbmRcIi4gQW1vdW50cyBhcmUgdmFsdWVzIGxhYmVsZWQgd2l0aCBhIGJyYW5kLlxuICogQW1vdW50TWF0aCBleGVjdXRlcyB0aGUgbG9naWMgb2YgaG93IGFtb3VudHMgYXJlIGNoYW5nZWQgd2hlbiBkaWdpdGFsXG4gKiBhc3NldHMgYXJlIG1lcmdlZCwgc2VwYXJhdGVkLCBvciBvdGhlcndpc2UgbWFuaXB1bGF0ZWQuIEZvclxuICogZXhhbXBsZSwgYSBkZXBvc2l0IG9mIDIgYnVja3MgaW50byBhIHB1cnNlIHRoYXQgYWxyZWFkeSBoYXMgMyBidWNrc1xuICogZ2l2ZXMgYSBuZXcgcHVyc2UgYmFsYW5jZSBvZiA1IGJ1Y2tzLiBBbiBlbXB0eSBwdXJzZSBoYXMgMCBidWNrcy4gQW1vdW50TWF0aFxuICogcmVsaWVzIGhlYXZpbHkgb24gcG9seW1vcnBoaWMgTWF0aEhlbHBlcnMsIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHVuYnJhbmRlZFxuICogcG9ydGlvbi5cbiAqXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtBc3NldFZhbHVlRm9yS2luZDxLPn0gdmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtOYXRWYWx1ZSB8IFNldFZhbHVlIHwgQ29weVNldCB8IENvcHlCYWd9IEFtb3VudFZhbHVlXG4gKiBBbiBgQW1vdW50VmFsdWVgIGRlc2NyaWJlcyBhIHNldCBvciBxdWFudGl0eSBvZiBhc3NldHMgdGhhdCBjYW4gYmUgb3duZWQgb3JcbiAqIHNoYXJlZC5cbiAqXG4gKiBBIGZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQgdG8gcmVwcmVzZW50IGEgcXVhbnRpdHlcbiAqIG9mIHRoYXQgbWFueSBhc3NldHMuXG4gKlxuICogQSBub24tZnVuZ2libGUgYEFtb3VudFZhbHVlYCB1c2VzIGFuIGFycmF5IG9yIENvcHlTZXQgb2YgYEtleWBzIHRvIHJlcHJlc2VudFxuICogYSBzZXQgb2Ygd2hhdGV2ZXIgYXNzZXQgZWFjaCBrZXkgcmVwcmVzZW50cy4gQSBgS2V5YCBpcyBhIHBhc3NhYmxlIHZhbHVlXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIGVsZW1lbnQgaW4gYSBzZXQgKFNldFN0b3JlIG9yIENvcHlTZXQpIG9yIGFzIHRoZVxuICoga2V5IGluIGEgbWFwIChNYXBTdG9yZSBvciBDb3B5TWFwKS5cbiAqXG4gKiBgU2V0VmFsdWVgIGlzIGZvciB0aGUgZGVwcmVjYXRlZCBzZXQgcmVwcmVzZW50YXRpb24sIHVzaW5nIGFuIGFycmF5IGRpcmVjdGx5XG4gKiB0byByZXByZXNlbnQgdGhlIGFycmF5IG9mIGl0cyBlbGVtZW50cy4gYENvcHlTZXRgIGlzIHRoZSBwcm9wZXJcbiAqIHJlcHJlc2VudGF0aW9uIHVzaW5nIGEgQ29weVNldC5cbiAqXG4gKiBBIHNlbWktZnVuZ2libGUgYENvcHlCYWdgIGlzIHJlcHJlc2VudGVkIGFzIGFcbiAqIGBDb3B5QmFnYCBvZiBgS2V5YCBvYmplY3RzLiBcIkJhZ1wiIGlzIHN5bm9ueW1vdXMgd2l0aCBNdWx0aVNldCwgd2hlcmUgYW5cbiAqIGVsZW1lbnQgb2YgYSBiYWcgY2FuIGJlIHByZXNlbnQgb25jZSBvciBtb3JlIHRpbWVzLCBpLmUuLCBzb21lIHBvc2l0aXZlXG4gKiBiaWdpbnQgbnVtYmVyIG9mIHRpbWVzLCByZXByZXNlbnRpbmcgdGhhdCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgcmVwcmVzZW50ZWRcbiAqIGJ5IHRoYXQga2V5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyduYXQnIHwgJ3NldCcgfCAnY29weVNldCcgfCAnY29weUJhZycgfSBBc3NldEtpbmRcbiAqXG4gKiBTZWUgZG9jLWNvbW1lbnQgZm9yIGBBbW91bnRWYWx1ZWAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHR5cGVkZWYge0sgZXh0ZW5kcyAnbmF0JyA/IE5hdFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnc2V0JyA/IFNldFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnY29weVNldCcgPyBDb3B5U2V0OlxuICogSyBleHRlbmRzICdjb3B5QmFnJyA/IENvcHlCYWcgOlxuICogbmV2ZXJcbiAqIH0gQXNzZXRWYWx1ZUZvcktpbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtWIGV4dGVuZHMgTmF0VmFsdWUgPyAnbmF0JyA6XG4gKiAgViBleHRlbmRzIFNldFZhbHVlID8gJ3NldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5U2V0ID8gJ2NvcHlTZXQnIDpcbiAqICBWIGV4dGVuZHMgQ29weUJhZyA/ICdjb3B5QmFnJyA6XG4gKiAgbmV2ZXJ9IEFzc2V0S2luZEZvclZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gRGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVjaW1hbFBsYWNlc10gVGVsbHMgdGhlIGRpc3BsYXkgc29mdHdhcmUgaG93XG4gKiAgIG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gbW92ZSB0aGUgZGVjaW1hbCBvdmVyIHRvIHRoZSBsZWZ0LCBvciBpblxuICogICBvdGhlciB3b3Jkcywgd2hpY2ggcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gd2hvbGUgbnVtYmVycy4gV2VcbiAqICAgcmVxdWlyZSBmdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB0byBiZSByZXByZXNlbnRlZCBpbiBpbnRlZ2VycywgaW5cbiAqICAgdGhlIHNtYWxsZXN0IHVuaXQgKGkuZS4gVVNEIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIG1pbGwsIGFcbiAqICAgdGhvdXNhbmR0aCBvZiBhIGRvbGxhci4gSW4gdGhhdCBjYXNlLCBgZGVjaW1hbFBsYWNlc2Agd291bGQgYmVcbiAqICAgMy4pIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwsIGFuZCBmb3Igbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqICAgYXNzZXRzLCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4gVGhlIGRlY2ltYWxQbGFjZXMgcHJvcGVydHlcbiAqICAgc2hvdWxkIGJlIHVzZWQgZm9yICpkaXNwbGF5IHB1cnBvc2VzIG9ubHkqLiBBbnkgb3RoZXIgdXNlIGlzIGFuXG4gKiAgIGFudGktcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kIC0gdGhlIGtpbmQgb2YgYXNzZXQsIGVpdGhlclxuICogICBBc3NldEtpbmQuTkFUIChmdW5naWJsZSkgb3JcbiAqICAgQXNzZXRLaW5kLlNFVCBvciBBc3NldEtpbmQuQ09QWV9TRVQgKG5vbi1mdW5naWJsZSlcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcmFuZFxuICogVGhlIGJyYW5kIGlkZW50aWZpZXMgdGhlIGtpbmQgb2YgaXNzdWVyLCBhbmQgaGFzIGEgZnVuY3Rpb24gdG8gZ2V0IHRoZVxuICogYWxsZWdlZCBuYW1lIGZvciB0aGUga2luZCBvZiBhc3NldCBkZXNjcmliZWQuIFRoZSBhbGxlZ2VkIG5hbWUgKHN1Y2hcbiAqIGFzICdCVEMnIG9yICdtb29sYScpIGlzIHByb3ZpZGVkIGJ5IHRoZSBtYWtlciBvZiB0aGUgaXNzdWVyIGFuZCBzaG91bGRcbiAqIG5vdCBiZSB0cnVzdGVkIGFzIGFjY3VyYXRlLlxuICpcbiAqIEV2ZXJ5IGFtb3VudCBjcmVhdGVkIGJ5IGEgcGFydGljdWxhciBBbW91bnRNYXRoIHdpbGwgc2hhcmUgdGhlIHNhbWUgYnJhbmQsXG4gKiBidXQgcmVjaXBpZW50cyBjYW5ub3QgcmVseSBvbiB0aGUgYnJhbmQgdG8gdmVyaWZ5IHRoYXQgYSBwdXJwb3J0ZWQgYW1vdW50XG4gKiByZXByZXNlbnRzIHRoZSBpc3N1ZXIgdGhleSBpbnRlbmRlZCwgc2luY2UgdGhlIHNhbWUgYnJhbmQgY2FuIGJlIHJldXNlZCBieVxuICogYSBtaXNiZWhhdmluZyBpc3N1ZXIuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZElzc3VlcjogRVJlZjxJc3N1ZXI+KSA9PiBQcm9taXNlPGJvb2xlYW4+fSBpc015SXNzdWVyXG4gKiBTaG91bGQgYmUgdXNlZCB3aXRoIGBpc3N1ZXIuZ2V0QnJhbmRgIHRvIGVuc3VyZSBhbiBpc3N1ZXIgYW5kIGJyYW5kIG1hdGNoLlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldEFsbGVnZWROYW1lXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvPEs+fSBnZXREaXNwbGF5SW5mb1xuICogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHByb3BlcnR5IHsoKSA9PiBQYXR0ZXJufSBnZXRBbW91bnRTaGFwZVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJc3N1ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVySXNMaXZlXG4gKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIHBheW1lbnQgY29udGludWVzIHRvIGV4aXN0LlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyR2V0QW1vdW50T2ZcbiAqXG4gKiBHZXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudC4gQmVjYXVzZSB0aGVcbiAqIHBheW1lbnQgaXMgbm90IHRydXN0ZWQsIHdlIGNhbm5vdCBjYWxsIGEgbWV0aG9kIG9uIGl0IGRpcmVjdGx5LCBhbmRcbiAqIG11c3QgdXNlIHRoZSBpc3N1ZXIgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlckJ1cm5cbiAqXG4gKiBCdXJuIGFsbCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50LiBgb3B0QW1vdW50YCBpcyBvcHRpb25hbC4gSWYgYG9wdEFtb3VudGAgaXMgcHJlc2VudCwgdGhlXG4gKiBjb2RlIHdpbGwgaW5zaXN0IHRoYXQgdGhlIGFtb3VudCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50IGlzIGVxdWFsIHRvIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nXG4gKiBwYXltZW50IGFuZCBvdGhlciBjb25mdXNpb24uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJDbGFpbVxuICpcbiAqIFRyYW5zZmVyIGFsbCBkaWdpdGFsIGFzc2V0cyBmcm9tIHRoZSBwYXltZW50IHRvIGEgbmV3IHBheW1lbnQgYW5kXG4gKiBkZWxldGUgdGhlIG9yaWdpbmFsLiBgb3B0QW1vdW50YCBpcyBvcHRpb25hbC4gSWYgYG9wdEFtb3VudGAgaXNcbiAqIHByZXNlbnQsIHRoZSBjb2RlIHdpbGwgaW5zaXN0IHRoYXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpblxuICogdGhlIHBheW1lbnQgaXMgZXF1YWwgdG8gYG9wdEFtb3VudGAsIHRvIHByZXZlbnQgc2VuZGluZyB0aGUgd3JvbmdcbiAqIHBheW1lbnQgYW5kIG90aGVyIGNvbmZ1c2lvbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJDb21iaW5lXG4gKlxuICogQ29tYmluZSBtdWx0aXBsZSBwYXltZW50cyBpbnRvIG9uZSBwYXltZW50LlxuICpcbiAqIElmIGFueSBvZiB0aGUgcGF5bWVudHMgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZFxuICogdXBvbiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+PltdfSBwYXltZW50c0FycmF5XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gW29wdFRvdGFsQW1vdW50XVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlclNwbGl0XG4gKlxuICogU3BsaXQgYSBzaW5nbGUgcGF5bWVudCBpbnRvIHR3byBwYXltZW50cyxcbiAqIEEgYW5kIEIsIGFjY29yZGluZyB0byB0aGUgcGF5bWVudEFtb3VudEEgcGFzc2VkIGluLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBwYXltZW50QW1vdW50QVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPltdPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJTcGxpdE1hbnlcbiAqXG4gKiBTcGxpdCBhIHNpbmdsZSBwYXltZW50IGludG8gbWFueSBwYXltZW50cywgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnRzXG4gKiBwYXNzZWQgaW4uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnRbXX0gYW1vdW50c1xuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFtdPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJcbiAqXG4gKiBUaGUgaXNzdWVyIGNhbm5vdCBtaW50IGEgbmV3IGFtb3VudCwgYnV0IGl0IGNhbiBjcmVhdGUgZW1wdHkgcHVyc2VzXG4gKiBhbmQgcGF5bWVudHMuIFRoZSBpc3N1ZXIgY2FuIGFsc28gdHJhbnNmb3JtIHBheW1lbnRzIChzcGxpdHRpbmdcbiAqIHBheW1lbnRzLCBjb21iaW5pbmcgcGF5bWVudHMsIGJ1cm5pbmcgcGF5bWVudHMsIGFuZCBjbGFpbWluZ1xuICogcGF5bWVudHMgZXhjbHVzaXZlbHkpLiBUaGUgaXNzdWVyIHNob3VsZCBiZSBnb3R0ZW4gZnJvbSBhIHRydXN0ZWRcbiAqIHNvdXJjZSBhbmQgdGhlbiByZWxpZWQgdXBvbiBhcyB0aGUgZGVjaWRlciBvZiB3aGV0aGVyIGFuIHVudHJ1c3RlZFxuICogcGF5bWVudCBpcyB2YWxpZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRCcmFuZCBHZXQgdGhlIEJyYW5kIGZvciB0aGlzIElzc3Vlci4gVGhlXG4gKiBCcmFuZCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCBhbmQgaXMgc2hhcmVkIGJ5IHRoZVxuICogbWludCwgdGhlIGlzc3VlciwgYW5kIGFueSBwdXJzZXMgYW5kIHBheW1lbnRzIG9mIHRoaXMgcGFydGljdWxhclxuICoga2luZC4gVGhlIGJyYW5kIGlzIG5vdCBjbG9zZWx5IGhlbGQsIHNvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZVxuICogdHJ1c3RlZCB0byBpZGVudGlmeSBhbiBpc3N1ZXIgYWxvbmUuIEZha2UgZGlnaXRhbCBhc3NldHMgYW5kIGFtb3VudFxuICogY2FuIHVzZSBhbm90aGVyIGlzc3VlcidzIGJyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRBbGxlZ2VkTmFtZSBHZXQgdGhlIGFsbGVnZWROYW1lIGZvclxuICogdGhpcyBtaW50L2lzc3VlclxuICogQHByb3BlcnR5IHsoKSA9PiBBc3NldEtpbmR9IGdldEFzc2V0S2luZCBHZXQgdGhlIGtpbmQgb2ZcbiAqIE1hdGhIZWxwZXJzIHVzZWQgYnkgdGhpcyBJc3N1ZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvPEs+fSBnZXREaXNwbGF5SW5mbyBHaXZlIGluZm9ybWF0aW9uIHRvIFVJXG4gKiAgb24gaG93IHRvIGRpc3BsYXkgYW1vdW50cyBmb3IgdGhpcyBpc3N1ZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IFB1cnNlPEs+fSBtYWtlRW1wdHlQdXJzZSBNYWtlIGFuIGVtcHR5IHB1cnNlIG9mIHRoaXNcbiAqIGJyYW5kLlxuICogQHByb3BlcnR5IHtJc3N1ZXJJc0xpdmV9IGlzTGl2ZVxuICogQHByb3BlcnR5IHtJc3N1ZXJHZXRBbW91bnRPZjxLPn0gZ2V0QW1vdW50T2ZcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyQnVybn0gYnVyblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW1lbnRMZWRnZXJcbiAqIEBwcm9wZXJ0eSB7TWludDxLPn0gbWludFxuICogQHByb3BlcnR5IHtQdXJzZTxLPn0gbWludFJlY292ZXJ5UHVyc2VcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyS2l0XG4gKiBAcHJvcGVydHkge01pbnQ8Sz59IG1pbnRcbiAqIEBwcm9wZXJ0eSB7UHVyc2U8Sz59IG1pbnRSZWNvdmVyeVB1cnNlXG4gKiBAcHJvcGVydHkge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZGl0aW9uYWxEaXNwbGF5SW5mb1xuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVjaW1hbFBsYWNlc10gVGVsbHMgdGhlIGRpc3BsYXkgc29mdHdhcmUgaG93XG4gKiAgIG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gbW92ZSB0aGUgZGVjaW1hbCBvdmVyIHRvIHRoZSBsZWZ0LCBvciBpblxuICogICBvdGhlciB3b3Jkcywgd2hpY2ggcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gd2hvbGUgbnVtYmVycy4gV2VcbiAqICAgcmVxdWlyZSBmdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB0byBiZSByZXByZXNlbnRlZCBpbiBpbnRlZ2VycywgaW5cbiAqICAgdGhlIHNtYWxsZXN0IHVuaXQgKGkuZS4gVVNEIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIG1pbGwsIGFcbiAqICAgdGhvdXNhbmR0aCBvZiBhIGRvbGxhci4gSW4gdGhhdCBjYXNlLCBgZGVjaW1hbFBsYWNlc2Agd291bGQgYmVcbiAqICAgMy4pIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwsIGFuZCBmb3Igbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqICAgYXNzZXRzLCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4gVGhlIGRlY2ltYWxQbGFjZXMgcHJvcGVydHlcbiAqICAgc2hvdWxkIGJlIHVzZWQgZm9yICpkaXNwbGF5IHB1cnBvc2VzIG9ubHkqLiBBbnkgb3RoZXIgdXNlIGlzIGFuXG4gKiAgIGFudGktcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7QXNzZXRLaW5kfSBbYXNzZXRLaW5kXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuU2h1dGRvd25XaXRoRmFpbHVyZX0gU2h1dGRvd25XaXRoRmFpbHVyZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1pbnRcbiAqIEhvbGRpbmcgYSBNaW50IGNhcnJpZXMgdGhlIHJpZ2h0IHRvIGlzc3VlIG5ldyBkaWdpdGFsIGFzc2V0cy4gVGhlc2VcbiAqIGFzc2V0cyBhbGwgaGF2ZSB0aGUgc2FtZSBraW5kLCB3aGljaCBpcyBjYWxsZWQgYSBCcmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlcjxLPn0gZ2V0SXNzdWVyIEdldHMgdGhlIElzc3VlciBmb3IgdGhpcyBtaW50LlxuICogQHByb3BlcnR5IHsobmV3QW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IG1pbnRQYXltZW50XG4gKiBDcmVhdGVzIGEgbmV3IFBheW1lbnQgY29udGFpbmluZyBuZXdseSBtaW50ZWQgYW1vdW50LlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIERlcG9zaXRGYWNldFJlY2VpdmVcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVwb3NpdEZhY2V0XG4gKiBAcHJvcGVydHkge0RlcG9zaXRGYWNldFJlY2VpdmV9IHJlY2VpdmVcbiAqIERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG8gdGhlIHB1cnNlIHRoYXQgbWFkZSB0aGlzIGZhY2V0LFxuICogcmV0dXJuaW5nIHRoZSBhbW91bnQuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgb3B0QW1vdW50YCBkb2VzIG5vdCBlcXVhbCB0aGVcbiAqIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudCwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogSWYgcGF5bWVudCBpcyBhIHByb21pc2UsIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBQdXJzZURlcG9zaXRcbiAqIEBwYXJhbSB7UGF5bWVudDxLPn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1cnNlXG4gKiBQdXJzZXMgaG9sZCBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgb2YgdGhlIHNhbWUgYnJhbmQsIGJ1dCB1bmxpa2UgUGF5bWVudHMsXG4gKiB0aGV5IGFyZSBub3QgbWVhbnQgdG8gYmUgc2VudCB0byBvdGhlcnMuIFRvIHRyYW5zZmVyIGRpZ2l0YWwgYXNzZXRzLCBhXG4gKiBQYXltZW50IHNob3VsZCBiZSB3aXRoZHJhd24gZnJvbSBhIFB1cnNlLiBUaGUgYW1vdW50IG9mIGRpZ2l0YWxcbiAqIGFzc2V0cyBpbiBhIHB1cnNlIGNhbiBjaGFuZ2UgdGhyb3VnaCB0aGUgYWN0aW9uIG9mIGRlcG9zaXQoKSBhbmQgd2l0aGRyYXcoKS5cbiAqXG4gKiBUaGUgcHJpbWFyeSB1c2UgZm9yIFB1cnNlcyBhbmQgUGF5bWVudHMgaXMgZm9yIGN1cnJlbmN5LWxpa2UgYW5kIGdvb2RzLWxpa2VcbiAqIGRpZ2l0YWwgYXNzZXRzLCBidXQgdGhleSBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlcHJlc2VudCBvdGhlciBraW5kcyBvZiByaWdodHMsXG4gKiBzdWNoIGFzIHRoZSByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgY29udHJhY3QuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QWxsZWdlZEJyYW5kIEdldCB0aGUgYWxsZWdlZCBCcmFuZCBmb3IgdGhpcyBQdXJzZVxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSBnZXRDdXJyZW50QW1vdW50XG4gKiBHZXQgdGhlIGFtb3VudCBjb250YWluZWQgaW4gdGhpcyBwdXJzZS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IExhdGVzdFRvcGljPEFtb3VudDxLPj59IGdldEN1cnJlbnRBbW91bnROb3RpZmllclxuICogR2V0IGEgbG9zc3kgbm90aWZpZXIgZm9yIGNoYW5nZXMgdG8gdGhpcyBwdXJzZSdzIGJhbGFuY2UuXG4gKlxuICogQHByb3BlcnR5IHtQdXJzZURlcG9zaXQ8Sz59IGRlcG9zaXRcbiAqIERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG8gdGhpcyBwdXJzZSwgcmV0dXJuaW5nIHRoZVxuICogYW1vdW50LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgYG9wdEFtb3VudGAgZG9lcyBub3QgZXF1YWwgdGhlXG4gKiBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIElmIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IERlcG9zaXRGYWNldH0gZ2V0RGVwb3NpdEZhY2V0XG4gKiBSZXR1cm4gYW4gb2JqZWN0IHdob3NlIGByZWNlaXZlYCBtZXRob2QgZGVwb3NpdHMgdG8gdGhlIGN1cnJlbnQgUHVyc2UuXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IHdpdGhkcmF3XG4gKiBXaXRoZHJhdyBhbW91bnQgZnJvbSB0aGlzIHB1cnNlIGludG8gYSBuZXcgUGF5bWVudC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IENvcHlTZXQ8UGF5bWVudDxLPj59IGdldFJlY292ZXJ5U2V0XG4gKiBUaGUgc2V0IG9mIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tIHRoaXMgcHVyc2UgdGhhdCBhcmUgc3RpbGwgbGl2ZS4gVGhlc2VcbiAqIGFyZSB0aGUgcGF5bWVudHMgdGhhdCBjYW4gc3RpbGwgYmUgcmVjb3ZlcmVkIGluIGVtZXJnZW5jaWVzIGJ5LCBmb3IgZXhhbXBsZSxcbiAqIGRlcG9zaXRpbmcgaW50byB0aGlzIHB1cnNlLiBTdWNoIGEgZGVwb3NpdCBhY3Rpb24gaXMgbGlrZSBjYW5jZWxpbmcgYW5cbiAqIG91dHN0YW5kaW5nIGNoZWNrIGJlY2F1c2UgeW91J3JlIHRpcmVkIG9mIHdhaXRpbmcgZm9yIGl0LiBPbmNlIHlvdXJcbiAqIGNhbmNlbGxhdGlvbiBpcyBhY2tub3dsZWRnZWQsIHlvdSBjYW4gc3BlbmQgdGhlIGFzc2V0cyBhdCBzdGFrZSBvbiBvdGhlclxuICogdGhpbmdzLiBBZnRlcndhcmRzLCBpZiB0aGUgcmVjaXBpZW50IG9mIHRoZSBvcmlnaW5hbCBjaGVjayBmaW5hbGx5IGdldHNcbiAqIGFyb3VuZCB0byBkZXBvc2l0aW5nIGl0LCB0aGVpciBkZXBvc2l0IGZhaWxzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSByZWNvdmVyQWxsXG4gKiBGb3IgdXNlIGluIGVtZXJnZW5jaWVzLCBzdWNoIGFzIGNvbWluZyBiYWNrIGZyb20gYSB0cmF1bWF0aWMgY3Jhc2ggYW5kXG4gKiB1cGdyYWRlLiBUaGlzIGRlcG9zaXRzIGFsbCB0aGUgcGF5bWVudHMgaW4gdGhpcyBwdXJzZSdzIHJlY292ZXJ5IHNldFxuICogaW50byB0aGUgcHVyc2UgaXRzZWxmLCByZXR1cm5pbmcgdGhlIHRvdGFsIGFtb3VudCBvZiBhc3NldHMgcmVjb3ZlcmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW1lbnRcbiAqIFBheW1lbnRzIGhvbGQgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIG9mIHRoZSBzYW1lIGJyYW5kIGluIHRyYW5zaXQuIFBheW1lbnRzXG4gKiBjYW4gYmUgZGVwb3NpdGVkIGluIHB1cnNlcywgc3BsaXQgaW50byBtdWx0aXBsZSBwYXltZW50cywgY29tYmluZWQsIGFuZFxuICogY2xhaW1lZCAoZ2V0dGluZyBhbiBleGNsdXNpdmUgcGF5bWVudCkuIFBheW1lbnRzIGFyZSBsaW5lYXIsIG1lYW5pbmdcbiAqIHRoYXQgZWl0aGVyIGEgcGF5bWVudCBoYXMgdGhlIHNhbWUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGl0XG4gKiBzdGFydGVkIHdpdGgsIG9yIGl0IGlzIHVzZWQgdXAgZW50aXJlbHkuIEl0IGlzIGltcG9zc2libGUgdG8gcGFydGlhbGx5IHVzZSBhXG4gKiBwYXltZW50LlxuICpcbiAqIFBheW1lbnRzIGFyZSBvZnRlbiByZWNlaXZlZCBmcm9tIG90aGVyIGFjdG9ycyBhbmQgdGhlcmVmb3JlIHNob3VsZFxuICogbm90IGJlIHRydXN0ZWQgdGhlbXNlbHZlcy4gVG8gZ2V0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gYSBwYXltZW50LFxuICogdXNlIHRoZSB0cnVzdGVkIGlzc3VlcjogaXNzdWVyLmdldEFtb3VudE9mKHBheW1lbnQpLFxuICpcbiAqIFBheW1lbnRzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gUHVyc2VzIGJ5IGdldHRpbmcgYSB0cnVzdGVkIGlzc3VlciBhbmRcbiAqIGNhbGxpbmcgYGlzc3Vlci5tYWtlRW1wdHlQdXJzZSgpYCB0byBjcmVhdGUgYSBwdXJzZSwgdGhlblxuICogYHB1cnNlLmRlcG9zaXQocGF5bWVudClgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEFsbGVnZWRCcmFuZFxuICogR2V0IHRoZSBhbGxlZ2VkQnJhbmQsIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCB0aGlzXG4gKiBwYXltZW50IHB1cnBvcnRzIHRvIGJlLCBhbmQgd2hpY2ggaXNzdWVyIHRvIHVzZS4gQmVjYXVzZSBwYXltZW50c1xuICogYXJlIG5vdCB0cnVzdGVkLCBhbnkgbWV0aG9kIGNhbGxzIG9uIHBheW1lbnRzIHNob3VsZCBiZSB0cmVhdGVkXG4gKiB3aXRoIHN1c3BpY2lvbiBhbmQgdmVyaWZpZWQgZWxzZXdoZXJlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0aEhlbHBlcnNcbiAqIEFsbCBvZiB0aGUgZGlmZmVyZW5jZSBpbiBob3cgZGlnaXRhbCBhc3NldCBhbW91bnQgYXJlIG1hbmlwdWxhdGVkIGNhbiBiZVxuICogcmVkdWNlZCB0byB0aGUgYmVoYXZpb3Igb2YgdGhlIG1hdGggb24gdmFsdWVzLiBXZSBleHRyYWN0IHRoaXNcbiAqIGN1c3RvbSBsb2dpYyBpbnRvIG1hdGhIZWxwZXJzLiBNYXRoSGVscGVycyBhcmUgYWJvdXQgdmFsdWVcbiAqIGFyaXRobWV0aWMsIHdoZXJlYXMgQW1vdW50TWF0aCBpcyBhYm91dCBhbW91bnRzLCB3aGljaCBhcmUgdGhlXG4gKiB2YWx1ZXMgbGFiZWxlZCB3aXRoIGEgYnJhbmQuIEFtb3VudE1hdGggdXNlIG1hdGhIZWxwZXJzIHRvIGRvIHRoZWlyIHZhbHVlXG4gKiBhcml0aG1ldGljLCBhbmQgdGhlbiBicmFuZCB0aGUgcmVzdWx0cywgbWFraW5nIGEgbmV3IGFtb3VudC5cbiAqXG4gKiBUaGUgTWF0aEhlbHBlcnMgYXJlIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBvbmx5IGZyb20gQW1vdW50TWF0aCwgYW5kIHNvXG4gKiBhbGwgbWV0aG9kcyBidXQgY29lcmNlIGNhbiBhc3N1bWUgdGhlaXIgaW5wdXRzIGFyZSB2YWxpZC4gVGhleSBvbmx5XG4gKiBuZWVkIHRvIGRvIG91dHB1dCB2YWxpZGF0aW9uLCBhbmQgb25seSB3aGVuIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgb2ZcbiAqIGludmFsaWQgb3V0cHV0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRWYWx1ZTogVikgPT4gVn0gZG9Db2VyY2VcbiAqIENoZWNrIHRoZSBraW5kIG9mIHRoaXMgdmFsdWUgYW5kIHRocm93IGlmIGl0IGlzIG5vdCB0aGVcbiAqIGV4cGVjdGVkIGtpbmQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBWfSBkb01ha2VFbXB0eVxuICogR2V0IHRoZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGlkZW50aXR5IGVsZW1lbnQgKG9mdGVuIDAgb3IgYW5cbiAqIGVtcHR5IGFycmF5KVxuICpcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlOiBWKSA9PiBib29sZWFufSBkb0lzRW1wdHlcbiAqIElzIHRoZSB2YWx1ZSB0aGUgaWRlbnRpdHkgZWxlbWVudD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0dURVxuICogSXMgdGhlIGxlZnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSByaWdodD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0VxdWFsXG4gKiBEb2VzIGxlZnQgZXF1YWwgcmlnaHQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IFZ9IGRvQWRkXG4gKiBSZXR1cm4gdGhlIGxlZnQgY29tYmluZWQgd2l0aCB0aGUgcmlnaHQuXG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IFZ9IGRvU3VidHJhY3RcbiAqIFJldHVybiB3aGF0IHJlbWFpbnMgYWZ0ZXIgcmVtb3ZpbmcgdGhlIHJpZ2h0IGZyb20gdGhlIGxlZnQuIElmXG4gKiBzb21ldGhpbmcgaW4gdGhlIHJpZ2h0IHdhcyBub3QgaW4gdGhlIGxlZnQsIHdlIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2JpZ2ludH0gTmF0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcnJheTxLZXk+fSBTZXRWYWx1ZVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG3bYQpeKAAAXigAACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2FsbGJhY2suanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImNhbGxFIiwiY2FsbFN5bmMiLCJpc0NhbGxiYWNrIiwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siLCJtYWtlTWV0aG9kQ2FsbGJhY2siLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siLCJtYWtlU3luY01ldGhvZENhbGxiYWNrIiwicHJlcGFyZUF0dGVudWF0b3IiLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxpc09iamVjdCxpc1Bhc3NhYmxlU3ltYm9sOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImlzUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGlzUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdHtmcm9tRW50cmllc309T2JqZWN0O1xuXG5jb25zdHtvd25LZXlzOnJhd093bktleXN9PVJlZmxlY3Q7XG5jb25zdCBvd25LZXlzPVxuLyoqIEB0eXBlIHs8VCBleHRlbmRzIFByb3BlcnR5S2V5PihvYmo6IHtbSyBpbiBUXT86IHVua25vd259KSA9PiBUW119ICovXG5yYXdPd25LZXlzO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogUGFyYW1ldGVyczxSZXR1cm5UeXBlPHByZXBhcmVBdHRlbnVhdG9yPj4pID0+IEZhcmFibGU8VD59IE1ha2VBdHRlbnVhdG9yXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYmFjazxJPn0gQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlN5bmNDYWxsYmFjazxJPn0gU3luY0NhbGxiYWNrXG4gKi9cblxuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+ICYgVH0gRmFyYWJsZSAqL1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0ga2V5XG4gKiBAcmV0dXJucyB7a2V5IGlzIFByb3BlcnR5S2V5fSBGSVhNRTogc2hvdWxkIGJlIGp1c3QgYFByb3BlcnR5S2V5YCBidXQgVFNcbiAqIGNvbXBsYWlucyBpdCBjYW4ndCBiZSB1c2VkIGFzIGFuIGluZGV4IHR5cGUuXG4gKi9cbmNvbnN0IGlzUHJvcGVydHlLZXk9KGtleSk9PntcbnN3aXRjaCh0eXBlb2Yga2V5KXtcbmNhc2Unc3RyaW5nJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2Unc3ltYm9sJzpcbnJldHVybiB0cnVlO1xuZGVmYXVsdDpcbnJldHVybiBmYWxzZTt9XG5cbiB9O1xuXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgY2FsbCBhIGNhbGxiYWNrLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAcGFyYW0ge1N5bmNDYWxsYmFjazxJPn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICogQHJldHVybnMge1JldHVyblR5cGU8ST59XG4gKi9cbmNvbnN0ICAgICAgICBjYWxsU3luYz0oY2FsbGJhY2ssLi4uYXJncyk9PntcbmNvbnN0e3RhcmdldCxtZXRob2ROYW1lLGJvdW5kfT1jYWxsYmFjaztcbmlmKG1ldGhvZE5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHRhcmdldCguLi5ib3VuZCwuLi5hcmdzKTtcbiB9XG5yZXR1cm4gdGFyZ2V0W21ldGhvZE5hbWVdKC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH07JGjigI1fb25jZS5jYWxsU3luYyhjYWxsU3luYyk7XG5oYXJkZW4oY2FsbFN5bmMpO1xuXG4vKipcbiAqIEV2ZW50dWFsIHNlbmQgdG8gYSBjYWxsYmFjay5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHBhcmFtIHtDYWxsYmFjazxJPn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPEk+Pj59XG4gKi9cbmNvbnN0ICAgICAgICBjYWxsRT0oY2FsbGJhY2ssLi4uYXJncyk9PntcbmNvbnN0e3RhcmdldCxtZXRob2ROYW1lLGJvdW5kfT1jYWxsYmFjaztcbmlmKG1ldGhvZE5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIEUodGFyZ2V0KSguLi5ib3VuZCwuLi5hcmdzKTtcbiB9XG5yZXR1cm4gRSh0YXJnZXQpW21ldGhvZE5hbWVdKC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH07JGjigI1fb25jZS5jYWxsRShjYWxsRSk7XG5oYXJkZW4oY2FsbEUpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST59IFtUPUldXG4gKiBAdGVtcGxhdGUge3Vua25vd25bXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge1N5bmNDYWxsYmFjazxJPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjaz0odGFyZ2V0LC4uLmJvdW5kKT0+e1xudHlwZW9mIHRhcmdldD09PSdmdW5jdGlvbid8fFxuRmFpbCBgc3luYyBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uOiAke3RhcmdldH1gO1xuLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuY29uc3QgY2I9aGFyZGVuKHt0YXJnZXQsYm91bmQsaXNTeW5jOnRydWV9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovY2IpO1xuIH07JGjigI1fb25jZS5tYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sobWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxcbiAqICAgKC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPlxuICogPn0gW1Q9WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxJPl1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bltdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7Q2FsbGJhY2s8ST59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRnVuY3Rpb25DYWxsYmFjaz0odGFyZ2V0LC4uLmJvdW5kKT0+e1xuaXNPYmplY3QodGFyZ2V0KXx8XG5GYWlsIGBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uIHByZXNlbmNlOiAke3RhcmdldH1gO1xuLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuY29uc3QgY2I9aGFyZGVuKHt0YXJnZXQsYm91bmR9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtDYWxsYmFjazxJPn0gKi9jYik7XG4gfTskaOKAjV9vbmNlLm1ha2VGdW5jdGlvbkNhbGxiYWNrKG1ha2VGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIG5lYXIgbWV0aG9kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge3tcbiAqICAgW3ggaW4gUF06ICguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST5cbiAqIH19IFtUPXsgW3ggaW4gUF06IEkgfV1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bltdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3luY01ldGhvZENhbGxiYWNrPSh0YXJnZXQsbWV0aG9kTmFtZSwuLi5ib3VuZCk9PntcbmlzT2JqZWN0KHRhcmdldCl8fFxuRmFpbCBgc3luYyBtZXRob2QgY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0OiAke3RhcmdldH1gO1xudHlwZW9mIG1ldGhvZE5hbWU9PT0nc3RyaW5nJ3x8XG5pc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpfHxcbkZhaWwgYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmQsaXNTeW5jOnRydWV9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovY2IpO1xuIH07JGjigI1fb25jZS5tYWtlU3luY01ldGhvZENhbGxiYWNrKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgbWV0aG9kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8e1xuICogICBbeCBpbiBQXTogKC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPlxuICogfT59IFtUPVhpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8eyBbeCBpbiBQXTogSSB9Pl1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bltdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtDYWxsYmFjazxJPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNZXRob2RDYWxsYmFjaz0odGFyZ2V0LG1ldGhvZE5hbWUsLi4uYm91bmQpPT57XG5pc09iamVjdCh0YXJnZXQpfHxGYWlsIGBtZXRob2QgY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0OiAke3RhcmdldH1gO1xudHlwZW9mIG1ldGhvZE5hbWU9PT0nc3RyaW5nJ3x8XG5pc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpfHxcbkZhaWwgYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtDYWxsYmFjazxJPn0gKi9jYik7XG4gfTskaOKAjV9vbmNlLm1ha2VNZXRob2RDYWxsYmFjayhtYWtlTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VNZXRob2RDYWxsYmFjayk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Y2FsbGJhY2sgaXMgQ2FsbGJhY2s8YW55Pn1cbiAqL1xuY29uc3QgICAgICAgIGlzQ2FsbGJhY2s9KGNhbGxiYWNrKT0+e1xuaWYoIWlzT2JqZWN0KGNhbGxiYWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9PWNhbGxiYWNrO1xucmV0dXJuKFxuaXNPYmplY3QodGFyZ2V0KSYmKFxubWV0aG9kTmFtZT09PXVuZGVmaW5lZHx8XG50eXBlb2YgbWV0aG9kTmFtZT09PSdzdHJpbmcnfHxcbmlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkpJiZcbkFycmF5LmlzQXJyYXkoYm91bmQpKTtcblxuIH07JGjigI1fb25jZS5pc0NhbGxiYWNrKGlzQ2FsbGJhY2spO1xuaGFyZGVuKGlzQ2FsbGJhY2spO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciBjbGFzcyB3aG9zZSBtZXRob2RzIGNhbiBiZSByZWRpcmVjdGVkIHZpYSBjYWxsYmFja3MuXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gTVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3pvbmUnKS5ab25lfSB6b25lIFRoZSB6b25lIGluIHdoaWNoIHRvIGFsbG9jYXRlIGF0dGVudWF0b3JzLlxuICogQHBhcmFtIHtNW119IG1ldGhvZE5hbWVzIE1ldGhvZHMgdG8gZm9yd2FyZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBbb3B0cy5pbnRlcmZhY2VHdWFyZF0gQW4gaW50ZXJmYWNlIGd1YXJkIGZvciB0aGVcbiAqIG5ldyBhdHRlbnVhdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLnRhZ10gQSB0YWcgZm9yIHRoZSBuZXcgYXR0ZW51YXRvciBleG9DbGFzcy5cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVBdHRlbnVhdG9yPShcbnpvbmUsXG5tZXRob2ROYW1lcyxcbntpbnRlcmZhY2VHdWFyZCx0YWc9J0F0dGVudWF0b3InfT17fSk9Plxue1xuLyoqXG4gKiBAdHlwZWRlZiB7KHRoaXM6IGFueSwgLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IE1ldGhvZFxuICogQHR5cGVkZWYge3sgW0sgaW4gTV0/OiBDYWxsYmFjazxhbnk+IHwgbnVsbH19IE92ZXJyaWRlc1xuICogQHR5cGVkZWYge3sgW0sgaW4gTV06ICh0aGlzOiBhbnksIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55IH19IE1ldGhvZHNcbiAqL1xuY29uc3QgbWV0aG9kcz0vKiogQHR5cGUge01ldGhvZHN9ICovXG5mcm9tRW50cmllcyhcbm1ldGhvZE5hbWVzLm1hcCgoa2V5KT0+e1xuLyogT25seSBhbGxvdyB0aGUgYFByb3BlcnR5S2V5YCB0eXBlIGZvciB0aGUgdGFyZ2V0IG1ldGhvZCBrZXkuKi9cbmlmKCFpc1Byb3BlcnR5S2V5KGtleSkpe1xudGhyb3cgRmFpbCBga2V5ICR7cShrZXkpfSBpcyBub3QgYSBQcm9wZXJ0eUtleWA7XG4gfVxuXG5jb25zdCBtPS8qKiBAdHlwZSB7TWV0aG9kc30gKi97XG4vKiBFeHBsaWNpdGx5IHVzZSBjb25jaXNlIG1ldGhvZCBzeW50YXggdG8gcHJlc2VydmUgYHRoaXNgIGJ1dCBwcmV2ZW50Ki9cbi8qIGNvbnN0cnVjdG9yIGJlaGF2aW9yLiovXG4vKiogQHR5cGUge01ldGhvZH0gKi9cbltrZXldKC4uLmFyZ3Mpe1xuLyogU3VwcG9ydCBib3RoIHN5bmNocm9ub3VzIGFuZCBhc3luYyBjYWxsYmFja3MuKi9cbmNvbnN0IGNiPXRoaXMuc3RhdGUuY2JzW2tleV07XG5pZighY2Ipe1xuY29uc3QgZXJyPWFzc2VydC5lcnJvcihcbiBgdW5pbXBsZW1lbnRlZCAke3EodGFnKX0gbWV0aG9kICR7cShrZXkpfWApO1xuXG5pZih0aGlzLnN0YXRlLmlzU3luYyl7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gfVxuaWYoY2IuaXNTeW5jKXtcbnJldHVybiBjYWxsU3luYyhjYiwuLi5hcmdzKTtcbiB9XG5yZXR1cm4gY2FsbEUoY2IsLi4uYXJncyk7XG4gfX1bXG5rZXldO1xucmV0dXJuICgvKiogQHR5cGUge2NvbnN0fSAqL1trZXksbV0pO1xuIH0pKTtcblxuXG5cbi8qKlxuICogQ3JlYXRlIGFuIGV4byBvYmplY3Qgd2hvc2UgYmVoYXZpb3IgaXMgY29tcG9zZWQgZnJvbSBhIGRlZmF1bHQgdGFyZ2V0XG4gKiBhbmQvb3IgaW5kaXZpZHVhbCBtZXRob2Qgb3ZlcnJpZGUgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge3Vua25vd259IFtvcHRzLnRhcmdldF0gVGhlIHRhcmdldCBmb3IgYW55IG1ldGhvZHMgdGhhdFxuICogd2VyZW4ndCBzcGVjaWZpZWQgaW4gYG9wdHMub3ZlcnJpZGVzYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaXNTeW5jPWZhbHNlXSBXaGV0aGVyIHRoZSB0YXJnZXQgc2hvdWxkIGJlIHRyZWF0ZWRcbiAqIGFzIHN5bmNocm9ub3VzbHkgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtPdmVycmlkZXN9IFtvcHRzLm92ZXJyaWRlc10gU2V0IGluZGl2aWR1YWxcbiAqIGNhbGxiYWNrcyBmb3IgbWV0aG9kcyAod2hvc2UgbmFtZXMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZVxuICogYHByZXBhcmVBdHRlbnVhdG9yYCBvciBgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yYCBjYWxsKS4gIE51bGxpc2ggb3ZlcnJpZGVzXG4gKiBtZWFuIHRvIHRocm93LlxuICovXG5jb25zdCBtYWtlQXR0ZW51YXRvcj16b25lLmV4b0NsYXNzKFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge2FueX0gW29wdHMudGFyZ2V0XVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pc1N5bmM9ZmFsc2VdXG4gKiBAcGFyYW0ge092ZXJyaWRlc30gW29wdHMub3ZlcnJpZGVzXVxuICovXG4oe1xudGFyZ2V0PW51bGwsXG5pc1N5bmM9ZmFsc2UsXG5vdmVycmlkZXM9LyoqIEB0eXBlIHtPdmVycmlkZXN9ICove319KT0+XG57XG5jb25zdCBjYnM9LyoqIEB0eXBlIHtPdmVycmlkZXN9ICove307XG5cbmNvbnN0IHJlbWFpbmluZz1uZXcgU2V0KG1ldGhvZE5hbWVzKTtcbmZvcihjb25zdCBrZXkgb2Ygb3duS2V5cyhvdmVycmlkZXMpKXtcbnJlbWFpbmluZy5oYXMoa2V5KXx8XG5GYWlsIGAke3EodGFnKX0gb3ZlcnJpZGVzWyR7cShrZXkpfV0gbm90IGFsbG93ZWQgYnkgbWV0aG9kTmFtZXNgO1xuXG5yZW1haW5pbmcuZGVsZXRlKGtleSk7XG5jb25zdCBjYj1vdmVycmlkZXNba2V5XTtcbmNiPT1udWxsfHxcbmlzQ2FsbGJhY2soY2IpfHxcbkZhaWwgYCR7cSh0YWcpfSBvdmVycmlkZXNbJHtxKGtleSl9XSBpcyBub3QgYSBjYWxsYmFjazsgZ290ICR7Y2J9YDtcbmNic1trZXldPWNiO1xuIH1cbmZvcihjb25zdCBrZXkgb2YgcmVtYWluaW5nKXtcbmlmKGlzU3luYyl7XG5jYnNba2V5XT1tYWtlU3luY01ldGhvZENhbGxiYWNrKHRhcmdldCxrZXkpO1xuIH1lbHNle1xuY2JzW2tleV09bWFrZU1ldGhvZENhbGxiYWNrKHRhcmdldCxrZXkpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtjYnMsaXNTeW5jfSk7XG4gfSxcbi8qKiBAdHlwZSB7TWV0aG9kc30gKi9tZXRob2RzKTtcblxucmV0dXJuIG1ha2VBdHRlbnVhdG9yO1xuIH07JGjigI1fb25jZS5wcmVwYXJlQXR0ZW51YXRvcihwcmVwYXJlQXR0ZW51YXRvcik7XG5oYXJkZW4ocHJlcGFyZUF0dGVudWF0b3IpO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciB3aG9zZSBtZXRob2ROYW1lcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpbnRlcmZhY2VHdWFyZC5cbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvem9uZScpLlpvbmV9IHpvbmVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdHNdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMudGFnXVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yPSh6b25lLGludGVyZmFjZUd1YXJkLG9wdHM9e30pPT57XG5jb25zdHttZXRob2RHdWFyZHN9PWludGVyZmFjZUd1YXJkO1xuY29uc3QgbWV0aG9kTmFtZXM9b3duS2V5cyhtZXRob2RHdWFyZHMpO1xuY29uc3QgbWFrZUF0dGVudWF0b3I9cHJlcGFyZUF0dGVudWF0b3Ioem9uZSxtZXRob2ROYW1lcyx7XG4uLi5vcHRzLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxucmV0dXJuICgvKiogQHR5cGUge01ha2VBdHRlbnVhdG9yPGFueT59ICovbWFrZUF0dGVudWF0b3IpO1xuIH07JGjigI1fb25jZS5wcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IocHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGxTeW5jIjpbImNhbGxTeW5jIl0sImNhbGxFIjpbImNhbGxFIl0sIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayI6WyJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siXSwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siOlsibWFrZUZ1bmN0aW9uQ2FsbGJhY2siXSwibWFrZVN5bmNNZXRob2RDYWxsYmFjayI6WyJtYWtlU3luY01ldGhvZENhbGxiYWNrIl0sIm1ha2VNZXRob2RDYWxsYmFjayI6WyJtYWtlTWV0aG9kQ2FsbGJhY2siXSwiaXNDYWxsYmFjayI6WyJpc0NhbGxiYWNrIl0sInByZXBhcmVBdHRlbnVhdG9yIjpbInByZXBhcmVBdHRlbnVhdG9yIl0sInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciI6WyJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqo/dRiIGAAAiBgAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiVkJhbmtBY2NvdW50IiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBAamVzc2llLWNoZWNrKi9cblxuLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwIGFuZCBvdXIgbGF4IHBhY2thZ2VcbiAqIGRlcGVuZGVuY3kgZ3JhcGgsIHNvbWV0aW1lcyByYXRpb25hbCBwbGFjZW1lbnRzIGNhdXNlIHR5cGUgcmVzb2x1dGlvbiBlcnJvcnMuXG4gKlxuICogU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZSBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZHMgdXNlZCBieSB0aGUgYnJpZGdlIGRldmljZS5cbiAqL1xuY29uc3QgICAgICAgIEJyaWRnZUlkPXtcbkJBTks6J2JhbmsnLFxuQ09SRTonY29yZScsXG5ESUJDOidkaWJjJyxcblNUT1JBR0U6J3N0b3JhZ2UnLFxuUFJPVklTSU9OOidwcm92aXNpb24nLFxuUFJPVklTSU9OX1NNQVJUX1dBTExFVDoncHJvdmlzaW9uV2FsbGV0JyxcbldBTExFVDond2FsbGV0J307JGjigI1fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5cbmhhcmRlbihCcmlkZ2VJZCk7XG5cbmNvbnN0ICAgICAgICBXYWxsZXROYW1lPXtcbmRlcG9zaXRGYWNldDonZGVwb3NpdEZhY2V0J307JGjigI1fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuXG5oYXJkZW4oV2FsbGV0TmFtZSk7XG5cbi8qIGRlZmluZWQgaW4gZ29sYW5nL2Nvc21vcy94L3ZiYW5rKi9cbmNvbnN0ICAgICAgICBWQmFua0FjY291bnQ9e1xucmVzZXJ2ZTp7XG5tb2R1bGU6J3ZiYW5rL3Jlc2VydmUnLFxuYWRkcmVzczonYWdvcmljMWFlMGxtdHpsZ3JjbmxhOXhqa3BhYXJxNWQ1ZGZlejYzaDNudWNsJ30sXG5cbnByb3Zpc2lvbjp7XG5tb2R1bGU6J3ZiYW5rL3Byb3Zpc2lvbicsXG5hZGRyZXNzOidhZ29yaWMxbWVnenl0ZzY1Y3lyZ3pzNmZ2enhncmNxdnd3bDd1Z3B0NjIzNDYnfX07JGjigI1fb25jZS5WQmFua0FjY291bnQoVkJhbmtBY2NvdW50KTtcblxuXG5oYXJkZW4oVkJhbmtBY2NvdW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmlkZ2VJZCI6WyJCcmlkZ2VJZCJdLCJXYWxsZXROYW1lIjpbIldhbGxldE5hbWUiXSwiVkJhbmtBY2NvdW50IjpbIlZCYW5rQWNjb3VudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAXyTOAyAQAAMgEAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVHJhY2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbmxldCBkZWJ1Z0luc3RhbmNlPTE7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8ICd2ZXJib3NlJ30gZW5hYmxlXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlVHJhY2VyPShuYW1lLGVuYWJsZT10cnVlKT0+e1xuZGVidWdJbnN0YW5jZSs9MTtcbmxldCBkZWJ1Z0NvdW50PTE7XG5jb25zdCBrZXk9IGAtLS0tLSAke25hbWV9LiR7ZGVidWdJbnN0YW5jZX0gYDtcbi8qIHRoZSBjYXNlcyBiZWxvdyBkZWZpbmUgYSBuYW1lZCB2YXJpYWJsZSB0byBwcm92aWRlIGJldHRlciBkZWJ1ZyBpbmZvKi9cbnN3aXRjaChlbmFibGUpe1xuY2FzZSBmYWxzZTp7XG5jb25zdCBsb2dEaXNhYmxlZD0oLi4uX2FyZ3MpPT57IH07XG5yZXR1cm4gbG9nRGlzYWJsZWQ7XG4gfVxuY2FzZSd2ZXJib3NlJzp7XG5jb25zdCBpbmZvVGljaz0ob3B0TG9nLC4uLmFyZ3MpPT57XG5pZihvcHRMb2cubG9nKXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gaW5mb1RpY2s7XG4gfVxuZGVmYXVsdDp7XG5jb25zdCBkZWJ1Z1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5vcHRMb2cubG9nKGtleSxkZWJ1Z0NvdW50Kz0xLC4uLmFyZ3MpO1xuIH1lbHNle1xuY29uc29sZS5pbmZvKGtleSxkZWJ1Z0NvdW50Kz0xLG9wdExvZywuLi5hcmdzKTtcbiB9XG4gfTtcbnJldHVybiBkZWJ1Z1RpY2s7XG4gfX1cblxuIH07JGjigI1fb25jZS5tYWtlVHJhY2VyKG1ha2VUcmFjZXIpO1xuaGFyZGVuKG1ha2VUcmFjZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFjZXIiOlsibWFrZVRyYWNlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABuFZifQwIAAEMCAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi91dGlscy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi91dGlscy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vY29uZmlnLmpzXCIsIFtdXSxbXCIuL2RlYnVnLmpzXCIsIFtdXSxbXCIuL3V0aWxzLmpzXCIsIFtdXSxbXCIuL21ldGhvZC10b29scy5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAApAbjWfikAAH4pAAAvAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanN7ImltcG9ydHMiOlsiLi9jYWxsYmFjay5qcyIsIkBhZ29yaWMvem9uZSIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbImFzc2VydENhcERhdGEiLCJhc3NlcnRQYXRoU2VnbWVudCIsImlzU3RyZWFtQ2VsbCIsIm1ha2VDaGFpblN0b3JhZ2VSb290IiwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSIsIm1ha2VTdG9yYWdlTm9kZUNoaWxkIiwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxNLGhlYXBab25lLGNiOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvbmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImhlYXBab25lXCIsIFskaOKAjV9hID0+IChoZWFwWm9uZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NhbGxiYWNrLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChjYiA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlQ2hhaW5TdG9yYWdlUm9vdCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZUNoYWluU3RvcmFnZVJvb3RcIn0pOyRo4oCNX29uY2UubWFrZUNoYWluU3RvcmFnZVJvb3QobWFrZUNoYWluU3RvcmFnZVJvb3QpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlU3RvcmFnZU5vZGVDaGlsZCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZVN0b3JhZ2VOb2RlQ2hpbGRcIn0pOyRo4oCNX29uY2UubWFrZVN0b3JhZ2VOb2RlQ2hpbGQobWFrZVN0b3JhZ2VOb2RlQ2hpbGQpOyAgIFxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykubWFrZU1hcnNoYWw+fSBNYXJzaGFsbGVyICovXG4vKiogQHR5cGVkZWYge1BpY2s8TWFyc2hhbGxlciwgJ2Zyb21DYXBEYXRhJz59IFVuc2VyaWFsaXplciAqL1xuXG4vKipcbiAqIERlZmluZWQgYnkgdnN0b3JhZ2VTdG9yZUtleSBpbiB2c3RvcmFnZS5nb1xuICpcbiAqIEB0eXBlZGVmIFZTdG9yYWdlS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVTdWJrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhUHJlZml4Qnl0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9EYXRhVmFsdWVdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIFN0cmVhbUNlbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBibG9ja0hlaWdodCBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbmF0dXJhbCBudW1iZXJcbiAqIEBwcm9wZXJ0eSB7VFtdfSB2YWx1ZXNcbiAqL1xuXG4vKipcbiAqIFRoaXMgcmVwcmVzZW50cyBhIG5vZGUgaW4gYW4gSUFWTCB0cmVlLlxuICpcbiAqIFRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgeC92c3RvcmFnZSwgYW4gQWdvcmljIGV4dGVuc2lvbiBvZiB0aGUgQ29zbW9zIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuY29uc3QgQ2hhaW5TdG9yYWdlTm9kZUk9TS5pbnRlcmZhY2UoJ1N0b3JhZ2VOb2RlJyx7XG5zZXRWYWx1ZTpNLmNhbGxXaGVuKE0uc3RyaW5nKCkpLnJldHVybnMoKSxcbmdldFBhdGg6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldFN0b3JlS2V5Ok0uY2FsbFdoZW4oKS5yZXR1cm5zKE0ucmVjb3JkKCkpLFxubWFrZUNoaWxkTm9kZTpNLmNhbGwoTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnNwbGl0UmVjb3JkKHt9LHtzZXF1ZW5jZTpNLmJvb2xlYW4oKX0se30pKS5cbnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJykpfSk7XG5cblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGVyZmVjdCBoZXVyaXN0aWMgdG8gbmF2aWdhdGUgdGhlIG1pZ3JhdGlvbiBmcm9tIHZhbHVlIGNlbGxzIHRvXG4gKiBzdHJlYW0gY2VsbHMuXG4gKiBBdCB0aW1lIG9mIHdyaXRpbmcsIG5vIGxlZ2FjeSBjZWxscyBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIGEgc3RyZWFtIGNlbGwsXG4gKiBhbmQgd2UgZG8gbm90IGludGVuZCB0byBjcmVhdGUgYW55IG1vcmUgbGVnYWN5IHZhbHVlIGNlbGxzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBjZWxsXG4gKiBAcmV0dXJucyB7Y2VsbCBpcyBTdHJlYW1DZWxsfVxuICovXG5jb25zdCAgICAgICAgaXNTdHJlYW1DZWxsPShjZWxsKT0+XG5jZWxsJiZcbnR5cGVvZiBjZWxsPT09J29iamVjdCcmJlxuQXJyYXkuaXNBcnJheShjZWxsLnZhbHVlcykmJlxudHlwZW9mIGNlbGwuYmxvY2tIZWlnaHQ9PT0nc3RyaW5nJyYmXG4vXjAkfF5bMS05XVswLTldKiQvLnRlc3QoY2VsbC5ibG9ja0hlaWdodCk7JGjigI1fb25jZS5pc1N0cmVhbUNlbGwoaXNTdHJlYW1DZWxsKTtcbmhhcmRlbihpc1N0cmVhbUNlbGwpO1xuXG4vKiBUT0RPOiBDb25zb2xpZGF0ZSB3aXRoIGBpbnNpc3RDYXBEYXRhYCBmdW5jdGlvbnMgZnJvbSBzd2luZ3NldC1saXZlc2xvdHMsKi9cbi8qIHN3aW5nc2V0LXhzbmFwLXN1cGVydmlzb3IsIGV0Yy4qL1xuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGRhdGFcbiAqIEByZXR1cm5zIHthc3NlcnRzIGRhdGEgaXMgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNhcERhdGE8c3RyaW5nPn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENhcERhdGE9KGRhdGEpPT57XG5hc3NlcnQudHlwZW9mKGRhdGEsJ29iamVjdCcpO1xuYXNzZXJ0KGRhdGEpO1xuYXNzZXJ0LnR5cGVvZihkYXRhLmJvZHksJ3N0cmluZycpO1xuYXNzZXJ0KEFycmF5LmlzQXJyYXkoZGF0YS5zbG90cykpO1xuLyogWFhYIGNoZWNrIHRoYXQgdGhlIC5zbG90cyBhcnJheSBlbGVtZW50cyBhcmUgYWN0dWFsbHkgc3RyaW5ncyovXG4gfTskaOKAjV9vbmNlLmFzc2VydENhcERhdGEoYXNzZXJ0Q2FwRGF0YSk7XG5oYXJkZW4oYXNzZXJ0Q2FwRGF0YSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGUgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKiBUT0RPOiBGb3JtYWxpemUgc2VnbWVudCBjb25zdHJhaW50cy4qL1xuLyogTXVzdCBiZSBub25lbXB0eSBhbmQgZGlzYWxsb3cgKHVuZXNjYXBlZCkgYC5gLCBhbmQgZm9yIHNpbXBsaWNpdHkqL1xuLyogKGFuZCBmdXR1cmUgcG9zc2liaWxpdHkgb2YgZS5nLiBlc2NhcGluZykgd2UgY3VycmVudGx5IGxpbWl0IHRvKi9cbi8qIEFTQ0lJIGFscGhhbnVtZXJpYyBwbHVzIHVuZGVyc2NvcmUgYW5kIGRhc2guKi9cbmNvbnN0IHBhdGhTZWdtZW50UGF0dGVybj0vXlthLXpBLVowLTlfLV17MSwxMDB9JC87XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZykgPT4gdm9pZH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQYXRoU2VnbWVudD0obmFtZSk9PntcbnBhdGhTZWdtZW50UGF0dGVybi50ZXN0KG5hbWUpfHxcbkZhaWwgYFBhdGggc2VnbWVudCBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgMSB0byAxMDAgY2hhcmFjdGVycyBsaW1pdGVkIHRvIEFTQ0lJIGFscGhhbnVtZXJpY3MsIHVuZGVyc2NvcmVzLCBhbmQvb3IgZGFzaGVzOiAke25hbWV9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGF0aFNlZ21lbnQoYXNzZXJ0UGF0aFNlZ21lbnQpO1xuaGFyZGVuKGFzc2VydFBhdGhTZWdtZW50KTtcblxuLyoqXG4gKiBNdXN0IG1hdGNoIHRoZSBzd2l0Y2ggaW4gdnN0b3JhZ2UuZ28gdXNpbmcgYHZzdG9yYWdlTWVzc2FnZWAgdHlwZVxuICpcbiAqIEB0eXBlZGVmIHsgJ2dldCcgfCAnZ2V0U3RvcmVLZXknIHwgJ2hhcycgfCAnY2hpbGRyZW4nIHwgJ2VudHJpZXMnIHwgJ3ZhbHVlcycgfCdzaXplJyB9IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kXG4gKiBAdHlwZWRlZiB7ICdzZXQnIHwgJ3NldFdpdGhvdXROb3RpZnknIHwgJ2FwcGVuZCcgfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2RcbiAqIEB0eXBlZGVmIHtTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZCB8IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZCB9IFN0b3JhZ2VNZXNzYWdlTWV0aG9kXG4gKiBAdHlwZWRlZiB7IFtwYXRoOiBzdHJpbmddIH0gU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VBcmdzXG4gKiBAdHlwZWRlZiB7IFtwYXRoOiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nIHwgbnVsbF0gfSBTdG9yYWdlRW50cnlcbiAqIEB0eXBlZGVmIHsgU3RvcmFnZUVudHJ5W10gfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VBcmdzXG4gKiBAdHlwZWRlZiB7e1xuICogICBtZXRob2Q6IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kO1xuICogICBhcmdzOiBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZUFyZ3M7XG4gKiAgfSB8IHtcbiAqICAgbWV0aG9kOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2Q7XG4gKiAgIGFyZ3M6IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZUFyZ3M7XG4gKiB9fSBTdG9yYWdlTWVzc2FnZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3pvbmUnKS5ab25lfSB6b25lXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZT0oem9uZSk9Pntcbi8qKlxuICogQ3JlYXRlIGEgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgc3RvcmFnZSBpbnRlcmZhY2UgYW5kIHBhdGguXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2NhbGxiYWNrJykuQ2FsbGJhY2s8KG1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlKSA9PiBhbnk+fSBtZXNzZW5nZXIgYSBjYWxsYmFja1xuICogZm9yIHNlbmRpbmcgYSBzdG9yYWdlTWVzc2FnZSBvYmplY3QgdG8gdGhlIHN0b3JhZ2UgaW1wbGVtZW50YXRpb25cbiAqIChjZi4gZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VxdWVuY2VdIHNldCB2YWx1ZXMgd2l0aCBgYXBwZW5kYCBtZXNzYWdlcyByYXRoZXIgdGhhbiBgc2V0YCBtZXNzYWdlc1xuICogc28gdGhlIGJhY2tpbmcgaW1wbGVtZW50YXRpb24gZW1wbG95cyBhIHdyYXBwaW5nIHN0cnVjdHVyZSB0aGF0XG4gKiBwcmVzZXJ2ZXMgZWFjaCB2YWx1ZSBzZXQgd2l0aGluIGEgc2luZ2xlIGJsb2NrLlxuICogQ2hpbGQgbm9kZXMgZGVmYXVsdCB0byBpbmhlcml0aW5nIHRoaXMgb3B0aW9uIGZyb20gdGhlaXIgcGFyZW50LlxuICogQHJldHVybnMge1N0b3JhZ2VOb2RlfVxuICovXG5jb25zdCBtYWtlQ2hhaW5TdG9yYWdlTm9kZT16b25lLmV4b0NsYXNzKFxuJ0NoYWluU3RvcmFnZU5vZGUnLFxuQ2hhaW5TdG9yYWdlTm9kZUksXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9jYWxsYmFjaycpLkNhbGxiYWNrPChtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55Pn0gbWVzc2VuZ2VyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW5jZV1cbiAqL1xuKG1lc3NlbmdlcixwYXRoLHtzZXF1ZW5jZT1mYWxzZX09e30pPT57XG5hc3NlcnQudHlwZW9mKHBhdGgsJ3N0cmluZycpO1xuYXNzZXJ0LnR5cGVvZihzZXF1ZW5jZSwnYm9vbGVhbicpO1xucmV0dXJuIGhhcmRlbih7cGF0aCxtZXNzZW5nZXIsc2VxdWVuY2V9KTtcbiB9LFxue1xuZ2V0UGF0aCgpe1xucmV0dXJuIHRoaXMuc3RhdGUucGF0aDtcbiB9LFxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UGF0aFxuICogQHR5cGUgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fVxuICovXG4gICAgICBhc3luYyBnZXRTdG9yZUtleSgpe1xuY29uc3R7cGF0aCxtZXNzZW5nZXJ9PXRoaXMuc3RhdGU7XG5yZXR1cm4gY2IuY2FsbEUobWVzc2VuZ2VyLHtcbm1ldGhvZDonZ2V0U3RvcmVLZXknLFxuYXJnczpbcGF0aF19KTtcblxuIH0sXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIGNoaWxkTm9kZU9wdGlvbnM/OiB7c2VxdWVuY2U/OiBib29sZWFufSkgPT4gU3RvcmFnZU5vZGV9ICovXG5tYWtlQ2hpbGROb2RlKG5hbWUsY2hpbGROb2RlT3B0aW9ucz17fSl7XG5jb25zdHtzZXF1ZW5jZSxwYXRoLG1lc3Nlbmdlcn09dGhpcy5zdGF0ZTtcbmFzc2VydFBhdGhTZWdtZW50KG5hbWUpO1xuY29uc3QgbWVyZ2VkT3B0aW9ucz17c2VxdWVuY2UsLi4uY2hpbGROb2RlT3B0aW9uc307XG5yZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGUoXG5tZXNzZW5nZXIsXG4gYCR7cGF0aH0uJHtuYW1lfWAsXG5tZXJnZWRPcHRpb25zKTtcblxuIH0sXG4vKiogQHR5cGUgeyh2YWx1ZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSAqL1xuICAgICAgYXN5bmMgc2V0VmFsdWUodmFsdWUpe1xuY29uc3R7c2VxdWVuY2UscGF0aCxtZXNzZW5nZXJ9PXRoaXMuc3RhdGU7XG5hc3NlcnQudHlwZW9mKHZhbHVlLCdzdHJpbmcnKTtcbi8qKiBAdHlwZSB7U3RvcmFnZUVudHJ5fSAqL1xubGV0IGVudHJ5O1xuaWYoIXNlcXVlbmNlJiYhdmFsdWUpe1xuZW50cnk9W3BhdGhdO1xuIH1lbHNle1xuZW50cnk9W3BhdGgsdmFsdWVdO1xuIH1cbmF3YWl0IGNiLmNhbGxFKG1lc3Nlbmdlcix7XG5tZXRob2Q6c2VxdWVuY2U/J2FwcGVuZCc6J3NldCcsXG5hcmdzOltlbnRyeV19KTtcblxuIH1cbi8qIFBvc3NpYmxlIGV4dGVuc2lvbnM6Ki9cbi8qICogZ2V0VmFsdWUoKSovXG4vKiAqIGdldENoaWxkTmFtZXMoKSBhbmQvb3IgbWFrZUNoaWxkTm9kZXMoKSovXG4vKiAqIGdldE5hbWUoKSovXG4vKiAqIHJlY3Vyc2l2ZSBkZWxldGUqL1xuLyogKiBiYXRjaCBvcGVyYXRpb25zKi9cbi8qICogbG9jYWwgYnVmZmVyaW5nICh3aXRoIGVuZC1vZi1ibG9jayBjb21taXQpKi99KTtcblxuXG5yZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGU7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKTtcblxuY29uc3QgbWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlPXByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKGhlYXBab25lKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBoZWFwLWJhc2VkIHJvb3Qgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgZnVuY3Rpb24gYW5kIHJvb3QgcGF0aC5cbiAqXG4gKiBAcGFyYW0geyhtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55fSBoYW5kbGVTdG9yYWdlTWVzc2FnZSBhIGZ1bmN0aW9uIGZvclxuICogc2VuZGluZyBhIHN0b3JhZ2VNZXNzYWdlIG9iamVjdCB0byB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvblxuICogKGNmLiBnb2xhbmcvY29zbW9zL3gvdnN0b3JhZ2UvdnN0b3JhZ2UuZ28pXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9vdFBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcm9vdE9wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyb290T3B0aW9ucy5zZXF1ZW5jZV0gZW1wbG95IGEgd3JhcHBpbmcgc3RydWN0dXJlIHRoYXRcbiAqIHByZXNlcnZlcyBlYWNoIHZhbHVlIHNldCB3aXRoaW4gYSBzaW5nbGUgYmxvY2ssIGFuZCBkZWZhdWx0IGNoaWxkIG5vZGVzXG4gKiB0byBkbyB0aGUgc2FtZVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZUNoYWluU3RvcmFnZVJvb3QoXG5oYW5kbGVTdG9yYWdlTWVzc2FnZSxcbnJvb3RQYXRoLFxucm9vdE9wdGlvbnM9e30pXG57XG5jb25zdCBtZXNzZW5nZXI9Y2IubWFrZUZ1bmN0aW9uQ2FsbGJhY2soaGFuZGxlU3RvcmFnZU1lc3NhZ2UpO1xuXG4vKiBVc2UgdGhlIGhlYXBab25lIGRpcmVjdGx5LiovXG5jb25zdCByb290Tm9kZT1tYWtlSGVhcENoYWluU3RvcmFnZU5vZGUobWVzc2VuZ2VyLHJvb3RQYXRoLHJvb3RPcHRpb25zKTtcbnJldHVybiByb290Tm9kZTtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge1N0b3JhZ2VOb2RlfSBhbiBvYmplY3QgdGhhdCBjb25maXJtcyB0byBTdG9yYWdlTm9kZSBBUEkgYnV0IGRvZXMgbm90IHN0b3JlIGFueXdoZXJlLlxuICovXG5jb25zdCBtYWtlTnVsbFN0b3JhZ2VOb2RlPSgpPT57XG4vKiBYWFggcmUtdXNlIFwiQ2hhaW5TdG9yYWdlXCIgbWV0aG9kcyBhYm92ZSB3aGljaCBkb24ndCBhY3R1YWxseSBkZXBlbmQgb24gY2hhaW5zKi9cbnJldHVybiBtYWtlQ2hhaW5TdG9yYWdlUm9vdCgoKT0+bnVsbCwnbnVsbCcpO1xuIH07XG5cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHJldHVybmluZyBhIHN0b3JhZ2Ugbm9kZSBhdCBvciB1bmRlciBpdHMgaW5wdXQsXG4gKiBmYWxsaW5nIGJhY2sgdG8gYW4gaW5lcnQgb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgaW50ZXJmYWNlIChidXQgaW5jb21wbGV0ZVxuICogYmVoYXZpb3IpIHdoZW4gdGhhdCBpcyB1bmF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8U3RvcmFnZU5vZGU/Pn0gc3RvcmFnZU5vZGVSZWZcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGlsZE5hbWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFN0b3JhZ2VOb2RlPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gICAgICAgIG1ha2VTdG9yYWdlTm9kZUNoaWxkKHN0b3JhZ2VOb2RlUmVmLGNoaWxkTmFtZSl7XG5jb25zdCBleGlzdGluZ1N0b3JhZ2VOb2RlPWF3YWl0IHN0b3JhZ2VOb2RlUmVmO1xuY29uc3Qgc3RvcmFnZU5vZGU9ZXhpc3RpbmdTdG9yYWdlTm9kZXx8bWFrZU51bGxTdG9yYWdlTm9kZSgpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGROYW1lKTtcbiB9XG5oYXJkZW4obWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG4vKiBUT0RPIGZpbmQgYSBiZXR0ZXIgbW9kdWxlIGZvciB0aGlzKi9cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMgeyh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXJpYWxpemVUb1N0b3JhZ2U9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5yZXR1cm4gYXN5bmModmFsdWUpPT57XG5jb25zdCBtYXJzaGFsbGVkPWF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbHVlKTtcbmNvbnN0IHNlcmlhbGl6ZWQ9SlNPTi5zdHJpbmdpZnkobWFyc2hhbGxlZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShtYWtlU2VyaWFsaXplVG9TdG9yYWdlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1N0cmVhbUNlbGwiOlsiaXNTdHJlYW1DZWxsIl0sImFzc2VydENhcERhdGEiOlsiYXNzZXJ0Q2FwRGF0YSJdLCJhc3NlcnRQYXRoU2VnbWVudCI6WyJhc3NlcnRQYXRoU2VnbWVudCJdLCJwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSI6WyJwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSJdLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCI6WyJtYWtlQ2hhaW5TdG9yYWdlUm9vdCJdLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCI6WyJtYWtlU3RvcmFnZU5vZGVDaGlsZCJdLCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIjpbIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAou7IgN4QAADeEAAAKwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRob2QtdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImJpbmRBbGxNZXRob2RzIiwiZ2V0TWV0aG9kTmFtZXMiLCJnZXRTdHJpbmdNZXRob2ROYW1lcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc09iamVjdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKipcbiAqIEBmaWxlIG1ldGhvZC10b29scyB1c2UgZHluYW1pYyBwcm9wZXJ0eSBsb29rdXAsIHdoaWNoIGlzIG5vdCBKZXNzaWUtY29tcGF0aWJsZVxuICovXG5cbmNvbnN0e2dldFByb3RvdHlwZU9mLGNyZWF0ZSxmcm9tRW50cmllcyxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcbmNvbnN0e293bktleXMsYXBwbHl9PVJlZmxlY3Q7XG5cbi8qKlxuICogUHJpb3JpdGl6ZSBzeW1ib2xzIGFzIGVhcmxpZXIgdGhhbiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYVxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkPShhLGIpPT57XG5pZih0eXBlb2YgYT09PXR5cGVvZiBiKXtcbmNvbnN0IGxlZnQ9U3RyaW5nKGEpO1xuY29uc3QgcmlnaHQ9U3RyaW5nKGIpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbnJldHVybiBsZWZ0PHJpZ2h0Py0xOmxlZnQ+cmlnaHQ/MTowO1xuIH1cbmlmKHR5cGVvZiBhPT09J3N5bWJvbCcpe1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N0cmluZycpO1xucmV0dXJuLTE7XG4gfVxuYXNzZXJ0KHR5cGVvZiBhPT09J3N0cmluZycpO1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N5bWJvbCcpO1xucmV0dXJuIDE7XG4gfTtcblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggdGhlIGBnZXRNZXRob2ROYW1lc2AgaW4gYEBlbmRvL2V2ZW50dWFsLXNlbmRgXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gS1xuICogQHBhcmFtIHtSZWNvcmQ8SywgYW55Pn0gdmFsXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0TWV0aG9kTmFtZXM9KHZhbCk9PntcbmxldCBsYXllcj12YWw7XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7LyogU2V0IHRvIGRlZHVwbGljYXRlKi9cbndoaWxlKGxheWVyIT09bnVsbCYmbGF5ZXIhPT1PYmplY3QucHJvdG90eXBlKXtcbi8qIGJlIHRvbGVyYW50IG9mIG5vbi1vYmplY3RzKi9cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuY29uc3Qgb3duTmFtZXM9LyoqIEB0eXBlIHtLW119ICovb3duS2V5cyhkZXNjcyk7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25OYW1lcyl7XG4vKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4vKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTskaOKAjV9vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBgZ2V0TWV0aG9kTmFtZXNgIGNvbnRhaW5pbmcgb25seSBzdHJpbmcgbmFtZXMsIHdpdGhvdXQgc3ltYm9sc1xuICpcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IEtcbiAqIEBwYXJhbSB7UmVjb3JkPEssIGFueT59IHZhbFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0U3RyaW5nTWV0aG9kTmFtZXM9KHZhbCk9PlxuLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbmdldE1ldGhvZE5hbWVzKHZhbCkuZmlsdGVyKChuYW1lKT0+dHlwZW9mIG5hbWU9PT0nc3RyaW5nJyk7XG5cblxuLyoqXG4gKiBUT0RPIFRoaXMgZnVuY3Rpb24gZXhpc3RzIG9ubHkgdG8gZWFzZSB0aGVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU5NzAgdHJhbnNpdGlvbiwgZnJvbSBhbGwgbWV0aG9kc1xuICogYmVpbmcgb3duIHByb3BlcnRpZXMgdG8gbWV0aG9kcyBiZWluZyBpbmhlcml0ZWQgZnJvbSBhIGNvbW1vbiBwcm90b3R5cGUuXG4gKiBUaGlzIHRyYW5zaXRpb24gYnJlYWtzIHR3byBwYXR0ZXJucyB1c2VkIGluIHByaW9yIGNvZGU6IGF1dG9iaW5kaW5nLFxuICogYW5kIGVudW1lcmF0aW5nIG1ldGhvZHMgYnkgZW51bWVyYXRpbmcgb3duIHByb3BlcnRpZXMuIEZvciBib3RoLCB0aGVcbiAqIHByZWZlcnJlZCByZXBhaXJzIGFyZVxuICogICAgKiBhdXRvYmluZGluZzogUmVwbGFjZSwgZm9yIGV4YW1wbGUsXG4gKiAgICAgIGBmb28ob2JqLm1ldGhvZClgIHdpdGggYGZvbyhhcmcgPT4gYG9iai5tZXRob2QoYXJnKSlgLiBJT1csIHN0b3AgcmVseWluZ1xuICogICAgICBvbiBleHByZXNzaW9ucyBsaWtlIGBvYmoubWV0aG9kYCB0byBleHRyYWN0IGEgbWV0aG9kIHN0aWxsIGJvdW5kIHRvIHRoZVxuICogICAgICBzdGF0ZSBvZiBgb2JqYCBiZWNhdXNlLCBmb3IgdmlydHVhbCBhbmQgZHVyYWJsZSBvYmplY3RzLFxuICogICAgICB0aGV5IG5vIGxvbmdlciB3aWxsIGFmdGVyICM1OTcwLlxuICogICAgKiBtZXRob2QgZW51bWVyYXRpb246IFJlcGxhY2UsIGZvciBleGFtcGxlXG4gKiAgICAgIGBSZWZsZWN0Lm93bktleXMob2JqKWAgd2l0aCBgZ2V0TWV0aG9kTmFtZXMob2JqKWAuXG4gKlxuICogT25jZSBhbGwgcHJvYmxlbWF0aWMgY2FzZXMgaGF2ZSBiZWVuIGNvbnZlcnRlZCBpbiB0aGlzIG1hbm5lciwgdGhpc1xuICogYGJpbmRBbGxNZXRob2RzYCBoYWNrIGNhbiBhbmQgVE9ETyBzaG91bGQgYmUgZGVsZXRlZC4gSG93ZXZlciwgd2UgY3VycmVudGx5XG4gKiBoYXZlIG5vIHJlbGlhYmxlIHN0YXRpYyB3YXkgdG8gdHJhY2sgZG93biBhbmQgZml4IGFsbCBhdXRvYmluZGluZyBzaXRlcy5cbiAqIEZvciB0aG9zZSBvYmplY3RzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gZnVsbHkgcmVwYWlyZWQgYnkgdGhlIGFib3ZlIHR3b1xuICogdGVjaG5pcXVlcywgYGJpbmRBbGxNZXRob2RzYCBjcmVhdGVzIGFuIG9iamVjdCB0aGF0IGFjdHMgbXVjaCBsaWtlIHRoZVxuICogcHJlLSM1OTcwIG9iamVjdHMsIHdpdGggYWxsIHRoZWlyIG1ldGhvZHMgYXMgaW5zdGFuY2UtYm91bmQgb3duIHByb3BlcnRpZXMuXG4gKiBJdCBkb2VzIHRoaXMgYnkgbWFraW5nIGEgbmV3IG9iamVjdCBpbmhlcml0aW5nIGZyb20gYG9iamAgd2hlcmUgdGhlIG5ld1xuICogb2JqZWN0IGhhcyBib3VuZCBvd24gbWV0aG9kcyBvdmVycmlkZGluZyBhbGwgdGhlIG1ldGhvZHMgaXQgd291bGQgaGF2ZVxuICogaW5oZXJpdGVkIGZyb20gYG9iamAuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIGFueT59IFRcbiAqIEBwYXJhbSB7VH0gb2JqXG4gKiBAcmV0dXJucyB7VH1cbiAqLyRo4oCNX29uY2UuZ2V0U3RyaW5nTWV0aG9kTmFtZXMoZ2V0U3RyaW5nTWV0aG9kTmFtZXMpO1xuY29uc3QgICAgICAgIGJpbmRBbGxNZXRob2RzPShvYmopPT5cbmhhcmRlbihcbmNyZWF0ZShcbm9iaixcbmZyb21FbnRyaWVzKFxuZ2V0TWV0aG9kTmFtZXMob2JqKS5tYXAoKG5hbWUpPT5bXG5uYW1lLFxue1xudmFsdWU6KC8qKiBAdHlwZSB7dW5rbm93bltdfSAqLy4uLmFyZ3MpPT5cbmFwcGx5KG9ialtuYW1lXSxvYmosYXJncyksXG5lbnVtZXJhYmxlOnRydWV9XSkpKSk7JGjigI1fb25jZS5iaW5kQWxsTWV0aG9kcyhiaW5kQWxsTWV0aG9kcyk7XG5cblxuXG5cblxuaGFyZGVuKGJpbmRBbGxNZXRob2RzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJnZXRTdHJpbmdNZXRob2ROYW1lcyI6WyJnZXRTdHJpbmdNZXRob2ROYW1lcyJdLCJiaW5kQWxsTWV0aG9kcyI6WyJiaW5kQWxsTWV0aG9kcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABUOfoRLQIAAC0CAAApAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJTdG9yYWdlTm9kZVNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE07JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0ICAgICAgICBTdG9yYWdlTm9kZVNoYXBlPU0ucmVtb3RhYmxlKCdTdG9yYWdlTm9kZScpOyRo4oCNX29uY2UuU3RvcmFnZU5vZGVTaGFwZShTdG9yYWdlTm9kZVNoYXBlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTdG9yYWdlTm9kZVNoYXBlIjpbIlN0b3JhZ2VOb2RlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3saijCsHAAArBwAAKgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91cGdyYWRlLWFwaS5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiIsIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc09iamVjdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogQHR5cGVkZWYge3sgbmFtZTogc3RyaW5nLCB1cGdyYWRlTWVzc2FnZTogc3RyaW5nLCBpbmNhcm5hdGlvbk51bWJlcjogbnVtYmVyIH19IERpc2Nvbm5lY3Rpb25PYmplY3RcbiAqL1xuXG4vKipcbiAqIE1ha2VzIGFuIEVycm9yLWxpa2Ugb2JqZWN0IGZvciB1c2UgYXMgdGhlIHJlamVjdGlvbiB2YWx1ZSBvZiBwcm9taXNlc1xuICogYWJhbmRvbmVkIGJ5IHVwZ3JhZGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVwZ3JhZGVNZXNzYWdlXG4gKiBAcGFyYW0ge251bWJlcn0gdG9JbmNhcm5hdGlvbk51bWJlclxuICogQHJldHVybnMge0Rpc2Nvbm5lY3Rpb25PYmplY3R9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb249KHVwZ3JhZGVNZXNzYWdlLHRvSW5jYXJuYXRpb25OdW1iZXIpPT5cbmhhcmRlbih7XG5uYW1lOid2YXRVcGdyYWRlZCcsXG51cGdyYWRlTWVzc2FnZSxcbmluY2FybmF0aW9uTnVtYmVyOnRvSW5jYXJuYXRpb25OdW1iZXJ9KTskaOKAjV9vbmNlLm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbihtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuXG5oYXJkZW4obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuLyogVE9ETzogU2ltcGxpZnkgb25jZSB3ZSBoYXZlIEBlbmRvL3BhdHRlcm5zIChvciBqdXN0IGV4cG9ydCB0aGUgc2hhcGUpLiovXG4vKiBjb25zdCB1cGdyYWRlRGlzY29ubmVjdGlvblNoYXBlID0gaGFyZGVuKHsqL1xuLyogbmFtZTogJ3ZhdFVwZ3JhZGVkJywqL1xuLyogdXBncmFkZU1lc3NhZ2U6IE0uc3RyaW5nKCksKi9cbi8qIGluY2FybmF0aW9uTnVtYmVyOiBNLm51bWJlcigpLCovXG4vKiB9KTsqL1xuLyogY29uc3QgaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9IGVyciA9PiBtYXRjaGVzKGVyciwgdXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSk7Ki9cbi8qKlxuICogQHBhcmFtIHthbnl9IGVyclxuICogQHJldHVybnMge2VyciBpcyBEaXNjb25uZWN0aW9uT2JqZWN0fVxuICovXG5jb25zdCAgICAgICAgaXNVcGdyYWRlRGlzY29ubmVjdGlvbj0oZXJyKT0+XG5pc09iamVjdChlcnIpJiZcbmVyci5uYW1lPT09J3ZhdFVwZ3JhZGVkJyYmXG50eXBlb2YgZXJyLnVwZ3JhZGVNZXNzYWdlPT09J3N0cmluZycmJlxudHlwZW9mIGVyci5pbmNhcm5hdGlvbk51bWJlcj09PSdudW1iZXInOyRo4oCNX29uY2UuaXNVcGdyYWRlRGlzY29ubmVjdGlvbihpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKTtcbmhhcmRlbihpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIl0sImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACi6bGS4zwAAOM8AAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3V0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3N0cmVhbSIsImplc3NpZS5qcyJdLCJleHBvcnRzIjpbIkJBU0lTX1BPSU5UUyIsIlByb21pc2VBbGxPckVycm9ycyIsImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiLCJhbGxWYWx1ZXMiLCJhcHBseUxhYmVsaW5nRXJyb3IiLCJhc3NlcnRBbGxEZWZpbmVkIiwiZGVlcGx5RnVsZmlsbGVkT2JqZWN0IiwiZm9yZXZlciIsImZyb21VbmlxdWVFbnRyaWVzIiwibGlzdERpZmZlcmVuY2UiLCJtYWtlQWdncmVnYXRlRXJyb3IiLCJtYWtlTWVhc3VyZVNlY29uZHMiLCJvYmplY3RNYXAiLCJzeW5jaHJvbml6ZWRUZWUiLCJ0aHJvd0xhYmVsZWQiLCJ1bnRpbFRydWUiLCJ3aGlsZVRydWUiLCJ6aXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxkZWVwbHlGdWxmaWxsZWQsaXNPYmplY3QsaXNQcm9taXNlLG1ha2VQcm9taXNlS2l0LG1ha2VRdWV1ZSxhc3luY0dlbmVyYXRlLG1ha2VTZXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLCBbJGjigI1fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXSxbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vc3RyZWFtXCIsIFtbXCJtYWtlUXVldWVcIiwgWyRo4oCNX2EgPT4gKG1ha2VRdWV1ZSA9ICRo4oCNX2EpXV1dXSxbXCJqZXNzaWUuanNcIiwgW1tcImFzeW5jR2VuZXJhdGVcIiwgWyRo4oCNX2EgPT4gKGFzeW5jR2VuZXJhdGUgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLGtleXMsdmFsdWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0ICAgICAgICBCQVNJU19QT0lOVFM9MTBfMDAwbjtcblxuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxUPn0gRVJlZjxUPiAqL1xuXG4vKipcbiAqIFRocm93cyBpZiBtdWx0aXBsZSBlbnRyaWVzIHVzZSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lLiBPdGhlcndpc2UgYWN0c1xuICogbGlrZSBgT2JqZWN0LmZyb21FbnRyaWVzYCBidXQgaGFyZGVucyB0aGUgcmVzdWx0LlxuICogVXNlIGl0IHRvIHByb3RlY3QgZnJvbSBwcm9wZXJ0eSBuYW1lcyBjb21wdXRlZCBmcm9tIHVzZXItcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLFZdPn0gYWxsRW50cmllc1xuICogQHJldHVybnMge3tbazogS106IFZ9fVxuICovJGjigI1fb25jZS5CQVNJU19QT0lOVFMoQkFTSVNfUE9JTlRTKTtcbmNvbnN0ICAgICAgICBmcm9tVW5pcXVlRW50cmllcz0oYWxsRW50cmllcyk9PntcbmNvbnN0IGVudHJpZXNBcnJheT1bLi4uYWxsRW50cmllc107XG5jb25zdCByZXN1bHQ9aGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuaWYob3duS2V5cyhyZXN1bHQpLmxlbmd0aD09PWVudHJpZXNBcnJheS5sZW5ndGgpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jb25zdCBuYW1lcz1tYWtlU2V0KCk7XG5mb3IoY29uc3RbbmFtZSxfXW9mIGVudHJpZXNBcnJheSl7XG5pZihuYW1lcy5oYXMobmFtZSkpe1xuRmFpbCBgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiB9XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xuIH07JGjigI1fb25jZS5mcm9tVW5pcXVlRW50cmllcyhmcm9tVW5pcXVlRW50cmllcyk7XG5oYXJkZW4oZnJvbVVuaXF1ZUVudHJpZXMpO1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZlxuICogYW4gYXJyYXkgdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsXG4gKiBgb2JqZWN0TWFwYCB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgc3RyaW5nLW5hbWVkIG93biBlbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBUeXBpY2FsIHVzYWdlIGFwcGxpZXMgYG9iamVjdE1hcGAgdG8gYSBDb3B5UmVjb3JkLCBpLmUuLFxuICogYW4gb2JqZWN0IGZvciB3aGljaCBgcGFzc1N0eWxlT2Yob3JpZ2luYWwpID09PSAnY29weVJlY29yZCdgLiBGb3IgdGhlc2UsXG4gKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgZWRnZSBjYXNlcyBhcmlzZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgQ29weVJlY29yZFxuICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnR5IG5hbWVzLCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBtYXBwZWQgZm9ybSBvZlxuICogdGhlIG9yaWdpbmFsJ3MgdmFsdWVzLlxuICpcbiAqIFdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBhIENvcHlSZWNvcmQsIHNvbWUgZWRnZSBjYXNlcyB0byBiZSBhd2FyZSBvZlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogT25seSB0aGUgc3RyaW5nLW5hbWVkIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsXG4gKiAgICAgIGFyZSBtYXBwZWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIGBPYmplY3QuZW50cmllc2BcbiAqICAgICAgd2lsbCBjYXVzZSBpdHMgYGdldHRlcmAgdG8gYmUgY2FsbGVkIGFuZCB3aWxsIHVzZSB0aGUgcmVzdWx0aW5nXG4gKiAgICAgIHZhbHVlLlxuICogICAgKiBObyBtYXR0ZXIgd2hldGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgd2FzIGFuIGFjY2Vzc29yLCB3cml0YWJsZSxcbiAqICAgICAgb3IgY29uZmlndXJhYmxlLCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiAgICAgIG5vbi13cml0YWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgZGF0YSBwcm9wZXJ0aWVzLlxuICogICAgKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IG1heSBoYXZlIGluaGVyaXRlZCBmcm9tLCBhbmRcbiAqICAgICAgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgc3BlY2lhbCBraW5kIG9mIG9iamVjdCBzdWNoIGFzIGFuIGFycmF5LFxuICogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IGluaGVyaXRpbmcgZGlyZWN0bHlcbiAqICAgICAgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYW5kIHdob3NlIHN0YXRlIGlzIG9ubHkgdGhlc2UgbmV3IG1hcHBlZFxuICogICAgICBvd24gcHJvcGVydGllcy5cbiAqXG4gKiBXaXRoIHRoZXNlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIG5vdCBhIENvcHlSZWNvcmQsXG4gKiBpZiBhbGwgdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogYSBDb3B5UmVjb3JkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gT1xuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHRlbXBsYXRlIFIgbWFwIHJlc3VsdFxuICogQHBhcmFtIHsodmFsdWU6IE9ba2V5b2YgT10sIGtleToga2V5b2YgTykgPT4gUn0gbWFwRm5cbiAqIEByZXR1cm5zIHt7IFtQIGluIGtleW9mIE9dOiBSfX1cbiAqL1xuY29uc3QgICAgICAgIG9iamVjdE1hcD0ob3JpZ2luYWwsbWFwRm4pPT57XG5jb25zdCBlbnRzPWVudHJpZXMob3JpZ2luYWwpO1xuY29uc3QgbWFwRW50cz1lbnRzLm1hcCgoW2ssdl0pPT5bayxtYXBGbih2LGspXSk7XG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKTtcbiB9OyRo4oCNX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IGxlZnROYW1lc1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSByaWdodE5hbWVzXG4gKi9cbmNvbnN0ICAgICAgICBsaXN0RGlmZmVyZW5jZT0obGVmdE5hbWVzLHJpZ2h0TmFtZXMpPT57XG5jb25zdCByaWdodFNldD1tYWtlU2V0KHJpZ2h0TmFtZXMpO1xucmV0dXJuIGxlZnROYW1lcy5maWx0ZXIoKG5hbWUpPT4hcmlnaHRTZXQuaGFzKG5hbWUpKTtcbiB9OyRo4oCNX29uY2UubGlzdERpZmZlcmVuY2UobGlzdERpZmZlcmVuY2UpO1xuaGFyZGVuKGxpc3REaWZmZXJlbmNlKTtcblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBpbm5lckVyclxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBsYWJlbFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBbRXJyb3JDb25zdHJ1Y3Rvcl1cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuY29uc3QgICAgICAgIHRocm93TGFiZWxlZD0oaW5uZXJFcnIsbGFiZWwsRXJyb3JDb25zdHJ1Y3Rvcj11bmRlZmluZWQpPT57XG5pZih0eXBlb2YgbGFiZWw9PT0nbnVtYmVyJyl7XG5sYWJlbD0gYFske2xhYmVsfV1gO1xuIH1cbmNvbnN0IG91dGVyRXJyPWFzc2VydC5lcnJvcihcbiBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLFxuRXJyb3JDb25zdHJ1Y3Rvcik7XG5cbmFzc2VydC5ub3RlKG91dGVyRXJyLFggYENhdXNlZCBieSAke2lubmVyRXJyfWApO1xudGhyb3cgb3V0ZXJFcnI7XG4gfTskaOKAjV9vbmNlLnRocm93TGFiZWxlZCh0aHJvd0xhYmVsZWQpO1xuaGFyZGVuKHRocm93TGFiZWxlZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEEsUlxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBSfSBmdW5jXG4gKiBAcGFyYW0ge0FbXX0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Un1cbiAqL1xuY29uc3QgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcj0oZnVuYyxhcmdzLGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGxhYmVsPT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jKC4uLmFyZ3MpO1xuIH1cbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbnRocm93TGFiZWxlZChlcnIsbGFiZWwpO1xuIH1cbmlmKGlzUHJvbWlzZShyZXN1bHQpKXtcbi8qIElmIHJlc3VsdCBpcyBhIHJlamVjdGVkIHByb21pc2UsIHRoaXMgd2lsbCByZXR1cm4gYSBwcm9taXNlIHdpdGggYSovXG4vKiBkaWZmZXJlbnQgcmVqZWN0aW9uIHJlYXNvbi4gQnV0IHRoaXMgY29uZnVzZXMgVHlwZVNjcmlwdCBiZWNhdXNlIGl0IHR5cGVzKi9cbi8qIHRoYXQgY2FzZSBhcyBgUHJvbWlzZTxuZXZlcj5gIHdoaWNoIGlzIGNvb2wgZm9yIGEgcHJvbWlzZSB0aGF0IHdpbGwgbmV2ZXIqL1xuLyogZnVsZmlsbC4gIEJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IHRoaXMgd2lsbCBvbmx5IGhhcHBlbiovXG4vKiB3aGVuIGByZXN1bHRgIHdhcyBhIHJlamVjdGVkIHByb21pc2UuIEluIG9ubHkgdGhpcyBjYXNlIGBSYCBzaG91bGQqL1xuLyogYWxyZWFkeSBhbGxvdyBgUHJvbWlzZTxuZXZlcj5gIGFzIGEgc3VidHlwZS4qL1xuLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuY29uc3QgcmVsYWJlbGVkPUUud2hlbihyZXN1bHQsdW5kZWZpbmVkLChyZWFzb24pPT5cbnRocm93TGFiZWxlZChyZWFzb24sbGFiZWwpKTtcblxucmV0dXJuICgvKiogQHR5cGUge1J9ICovcmVsYWJlbGVkKTtcbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH07JGjigI1fb25jZS5hcHBseUxhYmVsaW5nRXJyb3IoYXBwbHlMYWJlbGluZ0Vycm9yKTtcbmhhcmRlbihhcHBseUxhYmVsaW5nRXJyb3IpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1tLZXlUeXBlIGluIGtleW9mIFRdOiBUW0tleVR5cGVdfSAmIHt9fSBTaW1wbGlmeVxuICogZmxhdHRlbiB0aGUgdHlwZSBvdXRwdXQgdG8gaW1wcm92ZSB0eXBlIGhpbnRzIHNob3duIGluIGVkaXRvcnNcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2Uvc2ltcGxpZnkuZC50c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHR5cGVkZWYge3sgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBDYWxsYWJsZSA/IFRbS10gOiBEZWVwbHlBd2FpdGVkPFRbS10+IH19IERlZXBseUF3YWl0ZWRPYmplY3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzIFByb21pc2VMaWtlPGFueT4gPyBBd2FpdGVkPFQ+IDogVCBleHRlbmRzIHt9ID8gU2ltcGxpZnk8RGVlcGx5QXdhaXRlZE9iamVjdDxUPj4gOiBBd2FpdGVkPFQ+fSBEZWVwbHlBd2FpdGVkXG4gKi9cblxuLyoqXG4gKiBBIG1vcmUgY29uc3RyYWluZWQgdmVyc2lvbiBvZiB7ZGVlcGx5RnVsZmlsbGVkfSBmb3IgdHlwZSBzYWZldHkgdW50aWxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTI1N1xuICogVXNlZnVsIGluIHN0YXJ0aW5nIGNvbnRyYWN0cyB0aGF0IG5lZWQgYWxsIHRlcm1zIHRvIGJlIGZ1bGZpbGxlZFxuICogaW4gb3JkZXIgdG8gYmUgZHVyYWJsZS5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyB7fT4odW5mdWxmaWxsZWRUZXJtczogVCkgPT4gUHJvbWlzZTxEZWVwbHlBd2FpdGVkPFQ+Pn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZE9iamVjdD1hc3luYyhvYmopPT57XG5pc09iamVjdChvYmopfHxGYWlsIGBwYXJhbSBtdXN0IGJlIGFuIG9iamVjdGA7XG5yZXR1cm4gZGVlcGx5RnVsZmlsbGVkKG9iaik7XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB1c2VzIGEgbWlsbGlzZWNvbmQtYmFzZWQgdGltZS1zaW5jZS1lcG9jaCBjYXBhYmlsaXR5XG4gKiAoc3VjaCBhcyBgcGVyZm9ybWFuY2Uubm93YCkgdG8gbWVhc3VyZSBleGVjdXRpb24gdGltZSBvZiBhbiBhc3luYyBmdW5jdGlvblxuICogYW5kIHJlcG9ydCB0aGUgcmVzdWx0IGluIHNlY29uZHMgdG8gbWF0Y2ggb3VyIHRlbGVtZXRyeSBzdGFuZGFyZC5cbiAqXG4gKiBAcGFyYW0ge3R5cGVvZiBYaW1wb3J0KCdwZXJmX2hvb2tzJykucGVyZm9ybWFuY2Uubm93fSBjdXJyZW50VGltZU1pbGxpc2VjXG4gKiBAcmV0dXJucyB7PFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KSA9PiBQcm9taXNlPHsgcmVzdWx0OiBULCBkdXJhdGlvbjogbnVtYmVyIH0+fVxuICovJGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWRPYmplY3QoZGVlcGx5RnVsZmlsbGVkT2JqZWN0KTtcbmNvbnN0ICAgICAgICBtYWtlTWVhc3VyZVNlY29uZHM9KGN1cnJlbnRUaW1lTWlsbGlzZWMpPT57XG4vKiogQHBhcmFtIHsoKSA9PiBhbnl9IGZuICovXG5jb25zdCBtZWFzdXJlU2Vjb25kcz1hc3luYyhmbik9PntcbmNvbnN0IHQwPWN1cnJlbnRUaW1lTWlsbGlzZWMoKTtcbmNvbnN0IHJlc3VsdD1hd2FpdCBmbigpO1xuY29uc3QgZHVyYXRpb25NaWxsaXNlYz1jdXJyZW50VGltZU1pbGxpc2VjKCktdDA7XG5yZXR1cm57cmVzdWx0LGR1cmF0aW9uOmR1cmF0aW9uTWlsbGlzZWMvMTAwMH07XG4gfTtcbnJldHVybiBtZWFzdXJlU2Vjb25kcztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3JbXX0gZXJyb3JzXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdXG4gKi8kaOKAjV9vbmNlLm1ha2VNZWFzdXJlU2Vjb25kcyhtYWtlTWVhc3VyZVNlY29uZHMpO1xuY29uc3QgICAgICAgIG1ha2VBZ2dyZWdhdGVFcnJvcj0oZXJyb3JzLG1lc3NhZ2UpPT57XG5jb25zdCBlcnI9RXJyb3IobWVzc2FnZSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhlcnIse1xubmFtZTp7XG52YWx1ZTonQWdncmVnYXRlRXJyb3InfSxcblxuZXJyb3JzOntcbnZhbHVlOmVycm9yc319KTtcblxuXG5yZXR1cm4gZXJyO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7cmVhZG9ubHkgKFQgfCBQcm9taXNlTGlrZTxUPilbXX0gaXRlbXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFRbXT59XG4gKi8kaOKAjV9vbmNlLm1ha2VBZ2dyZWdhdGVFcnJvcihtYWtlQWdncmVnYXRlRXJyb3IpO1xuY29uc3QgICAgICAgIFByb21pc2VBbGxPckVycm9ycz1hc3luYyhpdGVtcyk9PntcbnJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoaXRlbXMpLnRoZW4oKHJlc3VsdHMpPT57XG5jb25zdCBlcnJvcnM9LyoqIEB0eXBlIHtQcm9taXNlUmVqZWN0ZWRSZXN1bHRbXX0gKi9cbnJlc3VsdHMuZmlsdGVyKCh7c3RhdHVzfSk9PnN0YXR1cz09PSdyZWplY3RlZCcpLlxubWFwKChyZXN1bHQpPT5yZXN1bHQucmVhc29uKTtcbmlmKCFlcnJvcnMubGVuZ3RoKXtcbnJldHVybiAoLyoqIEB0eXBlIHtQcm9taXNlRnVsZmlsbGVkUmVzdWx0PFQ+W119ICovcmVzdWx0cy5tYXAoXG4ocmVzdWx0KT0+cmVzdWx0LnZhbHVlKSk7XG5cbiB9ZWxzZSBpZihlcnJvcnMubGVuZ3RoPT09MSl7XG50aHJvdyBlcnJvcnNbMF07XG4gfWVsc2V7XG50aHJvdyBtYWtlQWdncmVnYXRlRXJyb3IoZXJyb3JzKTtcbiB9XG4gfSk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7PFQ+KFxuICogICB0cmllcjogKCkgPT4gUHJvbWlzZTxUPixcbiAqICBmaW5hbGl6ZXI6IChlcnJvcj86IHVua25vd24pID0+IFByb21pc2U8dm9pZD4sXG4gKiApID0+IFByb21pc2U8VD59XG4gKi8kaOKAjV9vbmNlLlByb21pc2VBbGxPckVycm9ycyhQcm9taXNlQWxsT3JFcnJvcnMpO2NvbnN0IGFnZ3JlZ2F0ZVRyeUZpbmFsbHk9YXN5bmModHJpZXIsZmluYWxpemVyKT0+XG50cmllcigpLnRoZW4oXG5hc3luYyhyZXN1bHQpPT5maW5hbGl6ZXIoKS50aGVuKCgpPT5yZXN1bHQpLFxuYXN5bmModHJ5RXJyb3IpPT5cbmZpbmFsaXplcih0cnlFcnJvcikuXG50aGVuKFxuKCk9PnRyeUVycm9yLFxuKGZpbmFsaXplRXJyb3IpPT5tYWtlQWdncmVnYXRlRXJyb3IoW3RyeUVycm9yLGZpbmFsaXplRXJyb3JdKSkuXG5cbnRoZW4oKGVycm9yKT0+UHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG5cblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUXG4gKiBAdHlwZWRlZiB7e1tQIGluIGtleW9mIFRdOiBFeGNsdWRlPFRbUF0sIHVuZGVmaW5lZD47fX0gQWxsRGVmaW5lZFxuICovXG5cbi8qKlxuICogQ29uY2lzZSB3YXkgdG8gY2hlY2sgdmFsdWVzIGFyZSBhdmFpbGFibGUgZnJvbSBvYmplY3QgbGl0ZXJhbCBzaG9ydGhhbmQuXG4gKiBUaHJvd3MgZXJyb3IgbWVzc2FnZSB0byBzcGVjaWZ5IHRoZSBtaXNzaW5nIHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUXG4gKiBAcGFyYW0ge1R9IG9ialxuICogQHRocm93cyBpZiBhbnkgdmFsdWUgaW4gdGhlIG9iamVjdCBlbnRyaWVzIGlzIG5vdCBkZWZpbmVkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBvYmogaXMgQWxsRGVmaW5lZDxUPn1cbiAqLyRo4oCNX29uY2UuYWdncmVnYXRlVHJ5RmluYWxseShhZ2dyZWdhdGVUcnlGaW5hbGx5KTtcblxuY29uc3QgICAgICAgIGFzc2VydEFsbERlZmluZWQ9KG9iaik9PntcbmNvbnN0IG1pc3Npbmc9W107XG5mb3IoY29uc3Rba2V5LHZhbF1vZiBPYmplY3QuZW50cmllcyhvYmopKXtcbmlmKHZhbD09PXVuZGVmaW5lZCl7XG5taXNzaW5nLnB1c2goa2V5KTtcbiB9XG4gfVxuaWYobWlzc2luZy5sZW5ndGg+MCl7XG5GYWlsIGBtaXNzaW5nICR7cShtaXNzaW5nKX1gO1xuIH1cbiB9O1xuXG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PHVuZGVmaW5lZCwgbmV2ZXI+fSAqLyRo4oCNX29uY2UuYXNzZXJ0QWxsRGVmaW5lZChhc3NlcnRBbGxEZWZpbmVkKTtcbmNvbnN0IG5vdERvbmU9aGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOnVuZGVmaW5lZH0pO1xuXG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PG5ldmVyLCB2b2lkPn0gKi9cbmNvbnN0IGFsd2F5c0RvbmU9aGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG5cbmNvbnN0ICAgICAgICBmb3JldmVyPWFzeW5jR2VuZXJhdGUoKCk9Pm5vdERvbmUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFR9IHByb2R1Y2VcbiAqIFRoZSB2YWx1ZSBvZiBgYXdhaXQgcHJvZHVjZSgpYCBpcyB1c2VkIGZvciBpdHMgdHJ1dGhpbmVzcyB2cyBmYWxzaW5lc3MuXG4gKiBJT1csIGl0IGlzIGNvZXJjZWQgdG8gYSBib29sZWFuIHNvIHRoZSBjYWxsZXIgbmVlZCBub3QgYm90aGVyIGRvaW5nIHRoaXNcbiAqIHRoZW1zZWx2ZXMuXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxBd2FpdGVkPFQ+Pn1cbiAqLyRo4oCNX29uY2UuZm9yZXZlcihmb3JldmVyKTtcbmNvbnN0ICAgICAgICB3aGlsZVRydWU9KHByb2R1Y2UpPT5cbmFzeW5jR2VuZXJhdGUoYXN5bmMoKT0+e1xuY29uc3QgdmFsdWU9YXdhaXQgcHJvZHVjZSgpO1xuaWYoIXZhbHVlKXtcbnJldHVybiBhbHdheXNEb25lO1xuIH1cbnJldHVybiBoYXJkZW4oe1xuZG9uZTpmYWxzZSxcbnZhbHVlfSk7XG5cbiB9KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUfSBwcm9kdWNlXG4gKiBUaGUgdmFsdWUgb2YgYGF3YWl0IHByb2R1Y2UoKWAgaXMgdXNlZCBmb3IgaXRzIHRydXRoaW5lc3MgdnMgZmFsc2luZXNzLlxuICogSU9XLCBpdCBpcyBjb2VyY2VkIHRvIGEgYm9vbGVhbiBzbyB0aGUgY2FsbGVyIG5lZWQgbm90IGJvdGhlciBkb2luZyB0aGlzXG4gKiB0aGVtc2VsdmVzLlxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8QXdhaXRlZDxUPj59XG4gKi8kaOKAjV9vbmNlLndoaWxlVHJ1ZSh3aGlsZVRydWUpO1xuY29uc3QgICAgICAgIHVudGlsVHJ1ZT0ocHJvZHVjZSk9PlxuYXN5bmNHZW5lcmF0ZShhc3luYygpPT57XG5jb25zdCB2YWx1ZT1hd2FpdCBwcm9kdWNlKCk7XG5pZih2YWx1ZSl7XG5yZXR1cm4gaGFyZGVuKHtcbmRvbmU6dHJ1ZSxcbnZhbHVlfSk7XG5cbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmRvbmU6ZmFsc2UsXG52YWx1ZX0pO1xuXG4gfSk7XG5cbi8qKiBAdHlwZSB7IDxYLCBZPih4czogWFtdLCB5czogWVtdKSA9PiBbWCwgWV1bXX0gKi8kaOKAjV9vbmNlLnVudGlsVHJ1ZSh1bnRpbFRydWUpO1xuY29uc3QgICAgICAgIHppcD0oeHMseXMpPT5oYXJkZW4oeHMubWFwKCh4LGkpPT5beCx5c1sraV1dKSk7XG5cbi8qKiBAdHlwZSB7IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgRVJlZjxhbnk+Pj4ob2JqOiBUKSA9PiBQcm9taXNlPHsgW0sgaW4ga2V5b2YgVF06IEF3YWl0ZWQ8VFtLXT59PiB9ICovJGjigI1fb25jZS56aXAoemlwKTtcbmNvbnN0ICAgICAgICBhbGxWYWx1ZXM9YXN5bmMob2JqKT0+e1xuY29uc3QgcmVzb2x2ZWQ9YXdhaXQgUHJvbWlzZS5hbGwodmFsdWVzKG9iaikpO1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiBoYXJkZW4oZnJvbUVudHJpZXMoemlwKGtleXMob2JqKSxyZXNvbHZlZCkpKTtcbiB9O1xuXG4vKipcbiAqIEEgdGVlIGltcGxlbWVudGF0aW9uIHdoZXJlIGFsbCByZWFkZXJzIGFyZSBzeW5jaHJvbml6ZWQgd2l0aCBlYWNoIG90aGVyLlxuICogVGhleSBhbGwgY29uc3VtZSB0aGUgc291cmNlIHN0cmVhbSBpbiBsb2Nrc3RlcCwgYW5kIGFueSBvbmUgcmV0dXJuaW5nIG9yXG4gKiB0aHJvd2luZyBlYXJseSB3aWxsIGFmZmVjdCB0aGUgb3RoZXJzLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtBc3luY0l0ZXJhdG9yPFQsIHZvaWQsIHZvaWQ+fSBzb3VyY2VTdHJlYW1cbiAqIEBwYXJhbSB7bnVtYmVyfSByZWFkZXJDb3VudFxuICovJGjigI1fb25jZS5hbGxWYWx1ZXMoYWxsVmFsdWVzKTtcbmNvbnN0ICAgICAgICBzeW5jaHJvbml6ZWRUZWU9KHNvdXJjZVN0cmVhbSxyZWFkZXJDb3VudCk9Pntcbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXR1cm5SZXN1bHQ8dm9pZD4gfCB1bmRlZmluZWR9ICovXG5sZXQgZG9uZVJlc3VsdDtcblxuLyoqIEB0eXBlZGVmIHtJdGVyYXRvclJlc3VsdDwodmFsdWU6IFByb21pc2VMaWtlPEl0ZXJhdG9yUmVzdWx0PFQ+PikgPT4gdm9pZD59IFF1ZXVlUGF5bG9hZCAqL1xuLyoqIEB0eXBlIHtYaW1wb3J0KCdAZW5kby9zdHJlYW0nKS5Bc3luY1F1ZXVlPFF1ZXVlUGF5bG9hZD5bXX0gKi9cbmNvbnN0IHF1ZXVlcz1bXTtcblxuLyoqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSAqL1xuY29uc3QgcHVsbE5leHQ9YXN5bmMoKT0+e1xuY29uc3QgcmVxdWVzdHM9YXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHF1ZXVlcy5tYXAoKHF1ZXVlKT0+cXVldWUuZ2V0KCkpKTtcbmNvbnN0IHJlamVjdGlvbnM9W107XG4vKiogQHR5cGUge0FycmF5PCh2YWx1ZTogUHJvbWlzZUxpa2U8SXRlcmF0b3JSZXN1bHQ8VD4+KSA9PiB2b2lkPn0gKi9cbmNvbnN0IHJlc29sdmVycz1bXTtcbmxldCBkb25lPWZhbHNlO1xuZm9yKGNvbnN0IHNldHRsZWRSZXN1bHQgb2YgcmVxdWVzdHMpe1xuaWYoc2V0dGxlZFJlc3VsdC5zdGF0dXM9PT0ncmVqZWN0ZWQnKXtcbnJlamVjdGlvbnMucHVzaChzZXR0bGVkUmVzdWx0LnJlYXNvbik7XG4gfWVsc2V7XG5kb25lfHw9ISFzZXR0bGVkUmVzdWx0LnZhbHVlLmRvbmU7XG5yZXNvbHZlcnMucHVzaChzZXR0bGVkUmVzdWx0LnZhbHVlLnZhbHVlKTtcbiB9XG4gfVxuLyoqIEB0eXBlIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+Pn0gKi9cbmxldCByZXN1bHQ7XG5pZihkb25lUmVzdWx0KXtcbnJlc3VsdD1Qcm9taXNlLnJlc29sdmUoZG9uZVJlc3VsdCk7XG4gfWVsc2UgaWYocmVqZWN0aW9ucy5sZW5ndGgpe1xuY29uc3QgZXJyb3I9YXNzZXJ0LmVycm9yKGFzc2VydC5kZXRhaWxzIGBUZWVkIHN0cmVhbSB0aHJld2ApO1xuYXNzZXJ0Lm5vdGUoZXJyb3IsYXNzZXJ0LmRldGFpbHMgYFRlZWQgcmVqZWN0aW9uczogJHtyZWplY3Rpb25zfWApO1xucmVzdWx0PVxuc291cmNlU3RyZWFtLnRocm93Py4oZXJyb3IpfHxcblByb21pc2UucmVzb2x2ZShzb3VyY2VTdHJlYW0ucmV0dXJuPy4oKSkudGhlbigoKT0+XG5Qcm9taXNlLnJlamVjdChlcnJvcikpO1xuXG4gfWVsc2UgaWYoZG9uZSl7XG5yZXN1bHQ9XG5zb3VyY2VTdHJlYW0ucmV0dXJuPy4oKXx8XG5Qcm9taXNlLnJlc29sdmUoe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcbiB9ZWxzZXtcbnJlc3VsdD1zb3VyY2VTdHJlYW0ubmV4dCgpO1xuIH1cbnJlc3VsdC50aGVuKFxuKHIpPT57XG5pZihyLmRvbmUpe1xuZG9uZVJlc3VsdD1yO1xuIH1cbiB9LFxuKCk9PntcbmRvbmVSZXN1bHQ9e2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9O1xuIH0pO1xuXG5yZXNvbHZlcnMuZm9yRWFjaCgocmVzb2x2ZSk9PnJlc29sdmUocmVzdWx0KSk7XG5yZXR1cm4gcHVsbE5leHQoKTtcbiB9O1xuXG5jb25zdCByZWFkZXJzPUFycmF5LmZyb20oe2xlbmd0aDpyZWFkZXJDb3VudH0pLm1hcCgoKT0+e1xuLyoqIEB0eXBlIHtYaW1wb3J0KCdAZW5kby9zdHJlYW0nKS5Bc3luY1F1ZXVlPFF1ZXVlUGF5bG9hZD59ICovXG5jb25zdCBxdWV1ZT1tYWtlUXVldWUoKTtcbnF1ZXVlcy5wdXNoKHF1ZXVlKTtcblxuLyoqIEB0eXBlIHtBc3luY0dlbmVyYXRvcjxULCB2b2lkLCB2b2lkPn0gKi9cbmNvbnN0IHJlYWRlcj1oYXJkZW4oe1xuICAgICAgYXN5bmMgbmV4dCgpe1xuLyoqIEB0eXBlIHtYaW1wb3J0KCdAZW5kby9wcm9taXNlLWtpdCcpLlByb21pc2VLaXQ8SXRlcmF0b3JSZXN1bHQ8VD4+fSAqL1xuY29uc3R7cHJvbWlzZSxyZXNvbHZlfT1tYWtlUHJvbWlzZUtpdCgpO1xucXVldWUucHV0KHt2YWx1ZTpyZXNvbHZlLGRvbmU6ZmFsc2V9KTtcbnJldHVybiBwcm9taXNlO1xuIH0sXG4gICAgICBhc3luYyByZXR1cm4oKXtcbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlS2l0PEl0ZXJhdG9yUmVzdWx0PFQ+Pn0gKi9cbmNvbnN0e3Byb21pc2UscmVzb2x2ZX09bWFrZVByb21pc2VLaXQoKTtcbnF1ZXVlLnB1dCh7dmFsdWU6cmVzb2x2ZSxkb25lOnRydWV9KTtcbnJldHVybiBwcm9taXNlO1xuIH0sXG4gICAgICBhc3luYyB0aHJvdyhyZWFzb24pe1xuY29uc3QgcmVqZWN0aW9uPVByb21pc2UucmVqZWN0KHJlYXNvbik7XG5xdWV1ZS5wdXQocmVqZWN0aW9uKTtcbnJldHVybiByZWplY3Rpb247XG4gfSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe1xucmV0dXJuIHJlYWRlcjtcbiB9fSk7XG5cbnJldHVybiByZWFkZXI7XG4gfSk7XG5cbnZvaWQgcHVsbE5leHQoKTtcbnJldHVybiByZWFkZXJzO1xuIH07JGjigI1fb25jZS5zeW5jaHJvbml6ZWRUZWUoc3luY2hyb25pemVkVGVlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCQVNJU19QT0lOVFMiOlsiQkFTSVNfUE9JTlRTIl0sImZyb21VbmlxdWVFbnRyaWVzIjpbImZyb21VbmlxdWVFbnRyaWVzIl0sIm9iamVjdE1hcCI6WyJvYmplY3RNYXAiXSwibGlzdERpZmZlcmVuY2UiOlsibGlzdERpZmZlcmVuY2UiXSwidGhyb3dMYWJlbGVkIjpbInRocm93TGFiZWxlZCJdLCJhcHBseUxhYmVsaW5nRXJyb3IiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIl0sImRlZXBseUZ1bGZpbGxlZE9iamVjdCI6WyJkZWVwbHlGdWxmaWxsZWRPYmplY3QiXSwibWFrZU1lYXN1cmVTZWNvbmRzIjpbIm1ha2VNZWFzdXJlU2Vjb25kcyJdLCJtYWtlQWdncmVnYXRlRXJyb3IiOlsibWFrZUFnZ3JlZ2F0ZUVycm9yIl0sIlByb21pc2VBbGxPckVycm9ycyI6WyJQcm9taXNlQWxsT3JFcnJvcnMiXSwiYWdncmVnYXRlVHJ5RmluYWxseSI6WyJhZ2dyZWdhdGVUcnlGaW5hbGx5Il0sImFzc2VydEFsbERlZmluZWQiOlsiYXNzZXJ0QWxsRGVmaW5lZCJdLCJmb3JldmVyIjpbImZvcmV2ZXIiXSwid2hpbGVUcnVlIjpbIndoaWxlVHJ1ZSJdLCJ1bnRpbFRydWUiOlsidW50aWxUcnVlIl0sInppcCI6WyJ6aXAiXSwiYWxsVmFsdWVzIjpbImFsbFZhbHVlcyJdLCJzeW5jaHJvbml6ZWRUZWUiOlsic3luY2hyb25pemVkVGVlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGfQxYrVEgAA1RIAADMAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanN7ImltcG9ydHMiOlsiLi9zdWJzY3JpYmUuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxzdWJzY3JpYmVMYXRlc3Q7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVMYXRlc3RcIiwgWyRo4oCNX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgc3Vic2NyaWJlTGF0ZXN0YCBmcm9tIGBAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qc2AgaW5zdGVhZC5cbiAqXG4gKiBBZGFwdG9yIGZyb20gYSBub3RpZmllclAgdG8gYW4gYXN5bmMgaXRlcmFibGUuXG4gKiBUaGUgbm90aWZpZXJQIGNhbiBiZSBhbnkgb2JqZWN0IHRoYXQgaGFzIGFuIGV2ZW50dWFsbHkgaW52b2NhYmxlXG4gKiBgZ2V0VXBkYXRlU2luY2VgIG1ldGhvZCB0aGF0IGJlaGF2ZXMgYWNjb3JkaW5nIHRvIHRoZSBub3RpZmllclxuICogc3BlYy4gVGhpcyBjYW4gYmUgYSBub3RpZmllciwgYSBwcm9taXNlIGZvciBhIGxvY2FsIG9yIHJlbW90ZVxuICogbm90aWZpZXIsIG9yIGEgcHJlc2VuY2Ugb2YgYSByZW1vdGUgbm90aWZpZXIuXG4gKlxuICogSXQgaXMgYWxzbyB1c2VkIGludGVybmFsbHkgYnkgbm90aWZpZXIuanMgc28gdGhhdCBhIG5vdGlmaWVyIGl0c2VsZiBpcyBhblxuICogYXN5bmMgaXRlcmFibGUuXG4gKlxuICogQW4gYXN5bmMgaXRlcmFibGUgaXMgYW4gb2JqZWN0IHdpdGggYSBgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpYCBtZXRob2RcbiAqIHRoYXQgcmV0dXJucyBhbiBhc3luYyBpdGVyYXRvci4gVGhlIGFzeW5jIGl0ZXJhdG9yIHdlIHJldHVybiBoZXJlIGhhcyBvbmx5XG4gKiBhIGBuZXh0KClgIG1ldGhvZCwgd2l0aG91dCB0aGUgb3B0aW9uYWwgYHJldHVybmAgYW5kIGB0aHJvd2AgbWV0aG9kcy4gVGhlXG4gKiBvbWl0dGVkIG1ldGhvZHMsIGlmIHByZXNlbnQsIHdvdWxkIGJlIHVzZWQgYnkgdGhlIGZvci9hd2FpdC9vZiBsb29wIHRvXG4gKiBpbmZvcm0gdGhlIGl0ZXJhdG9yIG9mIGVhcmx5IHRlcm1pbmF0aW9uLiBCdXQgdGhpcyBhZGFwdG9yIHdvdWxkIG5vdCBkb1xuICogYW55dGhpbmcgdXNlZnVsIGluIHJlYWN0aW9uIHRvIHRoaXMgbm90aWZpY2F0aW9uLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhdG9yJ3MgYG5leHQoKWAgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIGZvciBhbiBpdGVyYXRpb25cbiAqIHJlc3VsdC4gQW4gaXRlcmF0aW9uIHJlc3VsdCBpcyBhIHJlY29yZCB3aXRoIGB2YWx1ZWAgYW5kIGBkb25lYCBwcm9wZXJ0aWVzLlxuICpcbiAqIFRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIG9uIHRoZSBub3RpZmllciBwcm90b2NvbCBpcyB0byBoYXZlIGEgbG9zc3lcbiAqIGFkYXB0b3IsIHdoZXJlIGludGVybWVkaWF0ZSByZXN1bHRzIGNhbiBiZSBtaXNzZWQgaW4gZmF2b3Igb2YgbW9yZSByZWNlbnRcbiAqIHJlc3VsdHMgd2hpY2ggYXJlIHRoZXJlZm9yZSBsZXNzIHN0YWxlLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvZG9jdW1lbnRhdGlvbi9ibG9iL0hFQUQvbWFpbi9ndWlkZXMvanMtcHJvZ3JhbW1pbmcvbm90aWZpZXJzLm1kXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxCYXNlTm90aWZpZXI8VD4+fSBub3RpZmllclBcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcj1zdWJzY3JpYmVMYXRlc3Q7XG5cbi8qKlxuICogVGhpcyBhZHZhbmNlcyBgYXN5bmNJdGVyYXRvclBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRvcmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYXRvcjxUPj59IGFzeW5jSXRlcmF0b3JQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2UubWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIobWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRvcj0oYXN5bmNJdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5yZXR1cm4gbmV3IFByb21pc2UoKGFjayxvYnNlcnZlckVycm9yKT0+e1xuY29uc3QgcmVjdXI9KCk9PntcbkUud2hlbihcbkUoYXN5bmNJdGVyYXRvclApLm5leHQoKSxcbih7dmFsdWUsZG9uZX0pPT57XG5pZihkb25lKXtcbml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoKHZhbHVlKTtcbmFjayh1bmRlZmluZWQpO1xuIH1lbHNle1xuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUmJlxuaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUodmFsdWUpO1xucmVjdXIoKTtcbiB9XG4gfSxcbihyZWFzb24pPT57XG5pdGVyYXRpb25PYnNlcnZlci5mYWlsJiZpdGVyYXRpb25PYnNlcnZlci5mYWlsKHJlYXNvbik7XG5hY2sodW5kZWZpbmVkKTtcbiB9KS5cbmNhdGNoKG9ic2VydmVyRXJyb3IpO1xuIH07XG5yZWN1cigpO1xuIH0pO1xuIH07XG5cbi8qKlxuICogVGhpcyByZWFkcyBmcm9tIGBhc3luY0l0ZXJhYmxlUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdGlvbmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdG9yKG9ic2VydmVJdGVyYXRvcik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZUl0ZXJhdGlvbj0oYXN5bmNJdGVyYWJsZVAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5yZXR1cm4gb2JzZXJ2ZUl0ZXJhdG9yKGl0ZXJhdG9yUCxpdGVyYXRpb25PYnNlcnZlcik7XG4gfTtcblxuLyoqXG4gKiBBcyB1cGRhdGVzIGNvbWUgaW4gZnJvbSB0aGUgcG9zc2libHkgcmVtb3RlIGBub3RpZmllclBgLCB1cGRhdGVcbiAqIHRoZSBsb2NhbCBgdXBkYXRlcmAuIFNpbmNlIHRoZSB1cGRhdGVzIGNvbWUgZnJvbSBhIG5vdGlmaWVyLCB0aGV5XG4gKiBhcmUgbG9zc3ksIGkuZS4sIG9uY2UgYSBtb3JlIHJlY2VudCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQsIGxlc3MgcmVjZW50XG4gKiBzdGF0ZXMgYXJlIGFzc3VtZWQgaXJyZWxldmFudCBhbmQgZHJvcHBlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRo4oCNX29uY2Uub2JzZXJ2ZUl0ZXJhdGlvbihvYnNlcnZlSXRlcmF0aW9uKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlTm90aWZpZXI9KG5vdGlmaWVyUCxpdGVyYXRpb25PYnNlcnZlcik9Plxub2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpYmVMYXRlc3Qobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7JGjigI1fb25jZS5vYnNlcnZlTm90aWZpZXIob2JzZXJ2ZU5vdGlmaWVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdLCJvYnNlcnZlSXRlcmF0b3IiOlsib2JzZXJ2ZUl0ZXJhdG9yIl0sIm9ic2VydmVJdGVyYXRpb24iOlsib2JzZXJ2ZUl0ZXJhdGlvbiJdLCJvYnNlcnZlTm90aWZpZXIiOlsib2JzZXJ2ZU5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALC+L08cBwAAHAcAACQAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vbm90aWZpZXIuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdG9yZWQtbm90aWZpZXIuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL3N1YnNjcmliZXIuanMiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXJLaXQiLCJtYWtlTm90aWZpZXJLaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVJdGVyYXRvciIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInN1YnNjcmliZUxhdGVzdCIsInN1YnNjcmliZUxhdGVzdCJdLCJyZWV4cG9ydHMiOlsiLi9zdG9yZWQtbm90aWZpZXIuanMiLCIuL3N0b3Jlc3ViLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW11dLFtcIi4vbm90aWZpZXIuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbXV0sW1wiLi9zdG9yZXN1Yi5qc1wiLCBbXV0sW1wiLi9zdG9yZWQtbm90aWZpZXIuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9wdWJsaXNoLWtpdC5qcyI6W1sibWFrZVB1Ymxpc2hLaXQiLCJtYWtlUHVibGlzaEtpdCJdLFsicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Il0sWyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIiwiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSJdLFsiSXRlcmFibGVFYWNoVG9waWNJIiwiSXRlcmFibGVFYWNoVG9waWNJIl0sWyJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIl0sWyJTdWJzY3JpYmVyU2hhcGUiLCJTdWJzY3JpYmVyU2hhcGUiXV0sIi4vc3Vic2NyaWJlLmpzIjpbWyJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlRWFjaCJdLFsic3Vic2NyaWJlTGF0ZXN0Iiwic3Vic2NyaWJlTGF0ZXN0Il1dLCIuL25vdGlmaWVyLmpzIjpbWyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXIiXSxbIm1ha2VOb3RpZmllcktpdCIsIm1ha2VOb3RpZmllcktpdCJdLFsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdLFsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdXSwiLi9zdWJzY3JpYmVyLmpzIjpbWyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbiJdLFsibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXV0sIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOltbIm9ic2VydmVOb3RpZmllciIsIm9ic2VydmVOb3RpZmllciJdLFsib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZUl0ZXJhdG9yIl0sWyJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdGlvbiJdLFsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8rAIZVoYAABaGAAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9ub3RpZmllci5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LEUsRmFyLG1ha2VQdWJsaXNoS2l0LHN1YnNjcmliZUxhdGVzdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSBzaGFyYWJsZUludGVybmFsc1BcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllcj0oc2hhcmFibGVJbnRlcm5hbHNQKT0+e1xuLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLnN1YnNjcmliZUxhdGVzdChzaGFyYWJsZUludGVybmFsc1ApLFxuZ2V0VXBkYXRlU2luY2U6YXN5bmModXBkYXRlQ291bnQpPT5cbkUoc2hhcmFibGVJbnRlcm5hbHNQKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIE5vdGlmaWVyIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBOb3RpZmllciB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlTm90aWZpZXJgIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogTm90aWZpZXIgYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOmFzeW5jKCk9PnNoYXJhYmxlSW50ZXJuYWxzUCxcbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFVzZWQgb25seSBieSBgbWFrZUNhc3RpbmdTcGVjRnJvbVJlZmAuICBJbnN0ZWFkIHRoYXQgZnVuY3Rpb24gc2hvdWxkIHVzZVxuICogdGhlIGBTdG9yZWRGYWNldGAgQVBJLlxuICovXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtub3RpZmllcn0pfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqLyRo4oCNX29uY2UubWFrZU5vdGlmaWVyKG1ha2VOb3RpZmllcik7XG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXI9KHN1YnNjcmliZXIpPT57XG4vKipcbiAqIEB0eXBlIHtMYXRlc3RUb3BpYzxUPn1cbiAqL1xuY29uc3QgYmFzZU5vdGlmaWVyPWhhcmRlbih7XG5nZXRVcGRhdGVTaW5jZToodXBkYXRlQ291bnQ9dW5kZWZpbmVkKT0+XG5FKHN1YnNjcmliZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KX0pO1xuXG5cbi8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcn0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5cbi8qKlxuICogUHJvZHVjZXMgYSBwYWlyIG9mIG9iamVjdHMsIHdoaWNoIGFsbG93IGEgc2VydmljZSB0byBwcm9kdWNlIGEgc3RyZWFtIG9mXG4gKiB1cGRhdGUgcHJvbWlzZXMuXG4gKlxuICogVGhlIGluaXRpYWwgc3RhdGUgYXJndW1lbnQgaGFzIHRvIGJlIHRydWx5IG9wdGlvbmFsIGV2ZW4gdGhvdWdoIGl0IGNhblxuICogYmUgYW55IGZpcnN0IGNsYXNzIHZhbHVlIGluY2x1ZGluZyBgdW5kZWZpbmVkYC4gV2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGVcbiAqIHByZXNlbmNlIHZzIHRoZSBhYnNlbmNlIG9mIGl0LCB3aGljaCB3ZSBjYW5ub3QgZG8gd2l0aCB0aGUgb3B0aW9uYWwgYXJndW1lbnRcbiAqIHN5bnRheC4gUmF0aGVyIHdlIHVzZSB0aGUgYXJpdHkgb2YgdGhlIGBpbml0aWFsU3RhdGVBcnJgIGFycmF5LlxuICpcbiAqIElmIG5vIGluaXRpYWwgc3RhdGUgaXMgcHJvdmlkZWQgdG8gYG1ha2VOb3RpZmllcktpdGAsIHRoZW4gaXQgc3RhcnRzIHdpdGhvdXRcbiAqIGFuIGluaXRpYWwgc3RhdGUuIEl0cyBpbml0aWFsIHN0YXRlIHdpbGwgaW5zdGVhZCBiZSB0aGUgc3RhdGUgb2YgdGhlIGZpcnN0XG4gKiB1cGRhdGUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W10gfCBbVF19IGluaXRpYWxTdGF0ZUFyciB0aGUgZmlyc3Qgc3RhdGUgdG8gYmUgcmV0dXJuZWQgKHR5cGVkIGFzIHJlc3QgYXJyYXkgdG8gcGVybWl0IGB1bmRlZmluZWRgKVxuICogQHJldHVybnMge05vdGlmaWVyUmVjb3JkPFQ+fSB0aGUgbm90aWZpZXIgYW5kIHVwZGF0ZXJcbiAqL1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllcktpdD0oLi4uaW5pdGlhbFN0YXRlQXJyKT0+e1xuLyoqIEB0eXBlIHtQdWJsaXNoS2l0PFQ+fSAqL1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PW1ha2VQdWJsaXNoS2l0KCk7XG5cbmNvbnN0IG5vdGlmaWVyPW1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKHN1YnNjcmliZXIpO1xuXG5jb25zdCB1cGRhdGVyPUZhcigndXBkYXRlcicse1xudXBkYXRlU3RhdGU6KHN0YXRlKT0+cHVibGlzaGVyLnB1Ymxpc2goc3RhdGUpLFxuZmluaXNoOihjb21wbGV0aW9uKT0+cHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbmZhaWw6KHJlYXNvbik9PnB1Ymxpc2hlci5mYWlsKHJlYXNvbil9KTtcblxuXG5hc3NlcnQoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aDw9MSwndG9vIG1hbnkgYXJndW1lbnRzJyk7XG5pZihpbml0aWFsU3RhdGVBcnIubGVuZ3RoPT09MSl7XG51cGRhdGVyLnVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZUFyclswXSk7XG4gfVxuXG4vKiBub3RpZmllciBmYWNldCBpcyBzZXBhcmF0ZSBzbyBpdCBjYW4gYmUgaGFuZGVkIG91dCB3aGlsZSB1cGRhdGVyKi9cbi8qIGlzIHRpZ2h0bHkgaGVsZCovXG5yZXR1cm4gaGFyZGVuKHtub3RpZmllcix1cGRhdGVyfSk7XG4gfTtcblxuLyoqXG4gKiBBZGFwdG9yIGZyb20gYXN5bmMgaXRlcmFibGUgdG8gbm90aWZpZXIuXG4gKlxuICogQGRlcHJlY2F0ZWQgVGhlIHJlc3VsdGluZyBub3RpZmllciBpcyBsb3NzbGVzcywgd2hpY2ggaXMgbm90IGRlc2lyYWJsZS5cbiAqIFByZWZlciBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciwgYW5kIHJlZmVyIHRvXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzU0MTMgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81Njk1IGZvciBjb250ZXh0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VOb3RpZmllcktpdChtYWtlTm90aWZpZXJLaXQpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlPShhc3luY0l0ZXJhYmxlUCk9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IG9wdE5leHRQcm9taXNlO1xubGV0IGN1cnJlbnRVcGRhdGVDb3VudD0wbjtcbi8qKiBAdHlwZSB7RVJlZjxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBjdXJyZW50UmVzcG9uc2U7XG5sZXQgZmluYWw9ZmFsc2U7XG5cbi8qKlxuICogQHR5cGUge0xhdGVzdFRvcGljPFQ+fVxuICovXG5jb25zdCBiYXNlTm90aWZpZXI9RmFyKCdiYXNlTm90aWZpZXInLHtcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PS0xbil7XG5pZih1cGRhdGVDb3VudDxjdXJyZW50VXBkYXRlQ291bnQpe1xuaWYoY3VycmVudFJlc3BvbnNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG4gfWVsc2UgaWYodXBkYXRlQ291bnQhPT1jdXJyZW50VXBkYXRlQ291bnQpe1xudGhyb3cgRXJyb3IoXG4nZ2V0VXBkYXRlU2luY2UgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHVwZGF0ZUNvdW50LicpO1xuXG4gfVxuXG4vKiBSZXR1cm4gYSBmaW5hbCByZXNwb25zZSBpZiB3ZSBoYXZlIG9uZSwgb3RoZXJ3aXNlIGEgcHJvbWlzZSBmb3IgdGhlIG5leHQgc3RhdGUuKi9cbmlmKGZpbmFsKXtcbmFzc2VydChjdXJyZW50UmVzcG9uc2UhPT11bmRlZmluZWQpO1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuIH1cbmlmKCFvcHROZXh0UHJvbWlzZSl7XG5jb25zdCBuZXh0SXRlclJlc3VsdFA9RShpdGVyYXRvclApLm5leHQoKTtcbm9wdE5leHRQcm9taXNlPUUud2hlbihcbm5leHRJdGVyUmVzdWx0UCxcbih7ZG9uZSx2YWx1ZX0pPT57XG5hc3NlcnQoIWZpbmFsKTtcbmlmKGRvbmUpe1xuZmluYWw9dHJ1ZTtcbiB9XG5jdXJyZW50VXBkYXRlQ291bnQrPTFuO1xuY3VycmVudFJlc3BvbnNlPWhhcmRlbih7XG52YWx1ZSxcbnVwZGF0ZUNvdW50OmRvbmU/dW5kZWZpbmVkOmN1cnJlbnRVcGRhdGVDb3VudH0pO1xuXG5vcHROZXh0UHJvbWlzZT11bmRlZmluZWQ7XG5yZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuIH0sXG4oX3JlYXNvbik9PntcbmZpbmFsPXRydWU7XG5jdXJyZW50UmVzcG9uc2U9XG4vKiogQHR5cGUge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pn0gKi9cbm5leHRJdGVyUmVzdWx0UDtcbm9wdE5leHRQcm9taXNlPXVuZGVmaW5lZDtcbnJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gfSk7XG5cbiB9XG5yZXR1cm4gb3B0TmV4dFByb21pc2U7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4vKiBEb24ndCBsZWFrIHRoZSBvcmlnaW5hbCBhc3luY0l0ZXJhYmxlUCBzaW5jZSBpdCBtYXkgYmUgcmVtb3RlIGFuZCB3ZSBhbHNvKi9cbi8qIHdhbnQgdGhlIHNhbWUgc2VtYW50aWNzIGZvciB0aGlzIGV4cG9zZWQgaXRlcmFibGUgYW5kIHRoZSBiYXNlTm90aWZpZXIuKi9cbi4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuLi4uYmFzZU5vdGlmaWVyfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9OyRo4oCNX29uY2UubWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUobWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTm90aWZpZXIiOlsibWFrZU5vdGlmaWVyIl0sIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIjpbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl0sIm1ha2VOb3RpZmllcktpdCI6WyJtYWtlTm90aWZpZXJLaXQiXSwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiOlsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1zgTloA4AACAOAAAKgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9wdWJsaXNoLWtpdC5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZmFyIiwiQGVuZG8vcGF0dGVybnMiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIlVwZGF0ZUNvdW50U2hhcGUiLCJtYWtlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInB1Ymxpc2hLaXRJS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGNhbkJlRHVyYWJsZSxwcmVwYXJlRXhvQ2xhc3NLaXQsRSxGYXIsTSxtYWtlUHJvbWlzZUtpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIiwgWyRo4oCNX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3Qgc2luaz0oKT0+eyB9O1xuY29uc3QgbWFrZVF1aWV0UmVqZWN0aW9uPShyZWFzb24pPT57XG5jb25zdCByZWplY3Rpb249aGFyZGVuKFByb21pc2UucmVqZWN0KHJlYXNvbikpO1xudm9pZCBFLndoZW4ocmVqZWN0aW9uLHNpbmssc2luayk7XG5yZXR1cm4gcmVqZWN0aW9uO1xuIH07XG5jb25zdCB0b29GYXJSZWplY3Rpb249bWFrZVF1aWV0UmVqZWN0aW9uKFxuaGFyZGVuKG5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKSk7XG5cblxuY29uc3QgICAgICAgIFB1Ymxpc2hlckk9TS5pbnRlcmZhY2UoJ1B1Ymxpc2hlcicse1xucHVibGlzaDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZmluaXNoOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCl9KTtcblxuXG4vKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBOb3RpZmllciBgZ2V0VXBkYXRlU2luY2VgLiovJGjigI1fb25jZS5QdWJsaXNoZXJJKFB1Ymxpc2hlckkpO1xuY29uc3QgICAgICAgIFVwZGF0ZUNvdW50U2hhcGU9TS5vcihNLmJpZ2ludCgpLE0ubnVtYmVyKCkpOyRo4oCNX29uY2UuVXBkYXRlQ291bnRTaGFwZShVcGRhdGVDb3VudFNoYXBlKTtcbmNvbnN0ICAgICAgICBTdWJzY3JpYmVyST1NLmludGVyZmFjZSgnU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6TS5jYWxsKCkub3B0aW9uYWwoTS5iaWdpbnQoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRVcGRhdGVTaW5jZTpNLmNhbGwoKS5vcHRpb25hbChVcGRhdGVDb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pOyRo4oCNX29uY2UuU3Vic2NyaWJlckkoU3Vic2NyaWJlckkpO1xuXG5jb25zdCAgICAgICAgcHVibGlzaEtpdElLaXQ9aGFyZGVuKHtcbnB1Ymxpc2hlcjpQdWJsaXNoZXJJLFxuc3Vic2NyaWJlcjpTdWJzY3JpYmVySX0pOyRo4oCNX29uY2UucHVibGlzaEtpdElLaXQocHVibGlzaEtpdElLaXQpO1xuXG5cbmNvbnN0ICAgICAgICBGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlPU0uaW50ZXJmYWNlKFxuJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyxcbntcbmZvcms6TS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06TS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSwvKiBvb3BzOiByZWN1cnNpdmUgdHlwZSovXG5uZXh0Ok0uY2FsbFdoZW4oKS5yZXR1cm5zKE0uYW55KCkpfSk7JGjigI1fb25jZS5Gb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlKEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIEl0ZXJhYmxlRWFjaFRvcGljST1NLmludGVyZmFjZSgnSXRlcmFibGVFYWNoVG9waWMnLHtcbnN1YnNjcmliZUFmdGVyOlN1YnNjcmliZXJJLm1ldGhvZEd1YXJkcy5zdWJzY3JpYmVBZnRlcixcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06TS5jYWxsKCkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicpKX0pOyRo4oCNX29uY2UuSXRlcmFibGVFYWNoVG9waWNJKEl0ZXJhYmxlRWFjaFRvcGljSSk7XG5cblxuXG5jb25zdCAgICAgICAgSXRlcmFibGVMYXRlc3RUb3BpY0k9TS5pbnRlcmZhY2UoJ0l0ZXJhYmxlTGF0ZXN0VG9waWMnLHtcbmdldFVwZGF0ZVNpbmNlOlN1YnNjcmliZXJJLm1ldGhvZEd1YXJkcy5nZXRVcGRhdGVTaW5jZSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06TS5jYWxsKCkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicpKX0pO1xuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gQXJnXG4gKiBAdGVtcGxhdGUgUmV0XG4gKiBAcGFyYW0geyhhcmc6IEFyZykgPT4gUmV0fSBmblxuICogQHJldHVybnMgeyhhcmc6IEFyZykgPT4gUmV0fVxuICovJGjigI1fb25jZS5JdGVyYWJsZUxhdGVzdFRvcGljSShJdGVyYWJsZUxhdGVzdFRvcGljSSk7XG5jb25zdCB3ZWFrTWVtb2l6ZVVuYXJ5PShmbik9PntcbmNvbnN0IGNhY2hlPW5ldyBXZWFrTWFwKCk7XG5yZXR1cm4oYXJnKT0+e1xuLyoqIEB0eXBlIHtvYmplY3R9ICovXG5jb25zdCBvYXJnPWFyZztcbmlmKGNhY2hlLmhhcyhvYXJnKSl7XG5yZXR1cm4gY2FjaGUuZ2V0KG9hcmcpO1xuIH1cbmNvbnN0IHJlc3VsdD1mbihhcmcpO1xuY2FjaGUuc2V0KG9hcmcscmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1B1YmxpY2F0aW9uUmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtVcGRhdGVSZWNvcmQ8VD59XG4gKi9cbmNvbnN0IG1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQ9KHJlY29yZCk9PntcbmNvbnN0e1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnR9PVxucmVjb3JkO1xuaWYoZG9uZSl7XG4vKiBGaW5hbCByZXN1bHRzIGhhdmUgdW5kZWZpbmVkIHVwZGF0ZUNvdW50LiovXG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSx1cGRhdGVDb3VudDp1bmRlZmluZWR9KTtcbiB9XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSx1cGRhdGVDb3VudDpwdWJsaXNoQ291bnR9KTtcbiB9O1xuXG4vKipcbiAqIE1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UHVibGlzaEtpdDxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VQdWJsaXNoS2l0PSgpPT57XG4vKiogQHR5cGUge1Byb21pc2U8UHVibGljYXRpb25SZWNvcmQ8VD4+fSAqL1xubGV0IHRhaWxQO1xuLyoqIEB0eXBlIHt1bmRlZmluZWQgfCAoKHZhbHVlOiBFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+PikgPT4gdm9pZCl9ICovXG5sZXQgdGFpbFI7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG5cbmxldCBjdXJyZW50UHVibGlzaENvdW50PTBuO1xubGV0IGN1cnJlbnRQPXRhaWxQO1xuY29uc3QgYWR2YW5jZUN1cnJlbnQ9KGRvbmUsdmFsdWUscmVqZWN0aW9uKT0+e1xuaWYodGFpbFI9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuXG5jdXJyZW50UHVibGlzaENvdW50Kz0xbjtcbmN1cnJlbnRQPXRhaWxQO1xuY29uc3QgcmVzb2x2ZUN1cnJlbnQ9dGFpbFI7XG5cbmlmKGRvbmUpe1xudGFpbFA9dG9vRmFyUmVqZWN0aW9uO1xudGFpbFI9dW5kZWZpbmVkO1xuIH1lbHNle1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xuIH1cblxuaWYocmVqZWN0aW9uKXtcbnJlc29sdmVDdXJyZW50KHJlamVjdGlvbik7XG4gfWVsc2V7XG5yZXNvbHZlQ3VycmVudChcbmhhcmRlbih7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudDpjdXJyZW50UHVibGlzaENvdW50LFxudGFpbDp0YWlsUH0pKTtcblxuXG4gfVxuIH07XG5cbmNvbnN0IG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZD13ZWFrTWVtb2l6ZVVuYXJ5KFxubWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZCk7XG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGUge1N1YnNjcmliZXI8VD59XG4gKi9cbmNvbnN0IHN1YnNjcmliZXI9RmFyKCdTdWJzY3JpYmVyJyx7XG5zdWJzY3JpYmVBZnRlcjoocHVibGlzaENvdW50PS0xbik9PntcbmFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCdiaWdpbnQnKTtcbmlmKHB1Ymxpc2hDb3VudD09PWN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIHRhaWxQO1xuIH1lbHNlIGlmKHB1Ymxpc2hDb3VudDxjdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiBjdXJyZW50UDtcbiB9ZWxzZXtcbnRocm93IEVycm9yKFxuJ3N1YnNjcmliZUFmdGVyIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCBwdWJsaXNoQ291bnQuJyk7XG5cbiB9XG4gfSxcbmdldFVwZGF0ZVNpbmNlOih1cGRhdGVDb3VudCk9PntcbmlmKHVwZGF0ZUNvdW50PT09dW5kZWZpbmVkKXtcbnJldHVybiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCkudGhlbihtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQpO1xuIH1cbnVwZGF0ZUNvdW50PUJpZ0ludCh1cGRhdGVDb3VudCk7XG5yZXR1cm4oXG5zdWJzY3JpYmVyXG4vKiBgc3Vic2NyaWJlQWZ0ZXJgIG1heSByZXNvbHZlIHdpdGggdGhlIHVwZGF0ZSByZWNvcmQgbnVtYmVyZWQqL1xuLyogYHVwZGF0ZUNvdW50ICsgMWAsIGV2ZW4gaWYgc2V2ZXJhbCB1cGRhdGVzIGFyZSBwdWJsaXNoZWQgaW4gdGhlKi9cbi8qIHNhbWUgY3JhbmsuLi4qLy5cbnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuLyogLi4uIHNvIHdlIHBvbGwgdGhlIGxhdGVzdCBwdWJsaXNoZWQgdXBkYXRlLCB3aXRob3V0IHdhaXRpbmcgZm9yIGFueSovXG4vKiBmdXJ0aGVyIG9uZXMuKi8uXG50aGVuKCgpPT5zdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKCkpKTtcblxuIH19KTtcblxuXG4vKiogQHR5cGUge1B1Ymxpc2hlcjxUPn0gKi9cbmNvbnN0IHB1Ymxpc2hlcj1GYXIoJ1B1Ymxpc2hlcicse1xucHVibGlzaDoodmFsdWUpPT57XG5hZHZhbmNlQ3VycmVudChmYWxzZSx2YWx1ZSk7XG4gfSxcbmZpbmlzaDooZmluYWxWYWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KHRydWUsZmluYWxWYWx1ZSk7XG4gfSxcbmZhaWw6KHJlYXNvbik9PntcbmFkdmFuY2VDdXJyZW50KHRydWUsdW5kZWZpbmVkLG1ha2VRdWlldFJlamVjdGlvbihyZWFzb24pKTtcbiB9fSk7XG5cbnJldHVybiBoYXJkZW4oe3B1Ymxpc2hlcixzdWJzY3JpYmVyfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VQdWJsaXNoS2l0KG1ha2VQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlUHVibGlzaEtpdCk7XG5cbmNvbnN0IER1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZT1oYXJkZW4oe1xudmFsdWVEdXJhYmlsaXR5Ok0uYW55KCksXG5wdWJsaXNoQ291bnQ6TS5hbnkoKSxcbnN0YXR1czpNLmFueSgpLFxuaGFzVmFsdWU6TS5hbnkoKSxcbnZhbHVlOk0uYW55KCl9KTtcblxuXG4vKiBUT0RPOiBNb3ZlIGR1cmFibGUgcHVibGlzaCBraXQgdG8gYSBuZXcgZmlsZT8qL1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHkgJiAnbWFuZGF0b3J5J30gW29wdGlvbnMudmFsdWVEdXJhYmlsaXR5PSdtYW5kYXRvcnknXVxuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9XG4gKi9cbmNvbnN0IGluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlPShvcHRpb25zPXt9KT0+e1xuY29uc3R7dmFsdWVEdXJhYmlsaXR5PSdtYW5kYXRvcnknfT1vcHRpb25zO1xuYXNzZXJ0LmVxdWFsKHZhbHVlRHVyYWJpbGl0eSwnbWFuZGF0b3J5Jyk7XG5yZXR1cm57XG4vKiBjb25maWd1cmF0aW9uKi9cbnZhbHVlRHVyYWJpbGl0eSxcblxuLyogbGlmZWN5Y2xlIHByb2dyZXNzKi9cbnB1Ymxpc2hDb3VudDowbixcbnN0YXR1czonbGl2ZScsLyogfCAnZmluaXNoZWQnIHwgJ2ZhaWxlZCcqL1xuXG4vKiBwZXJzaXN0ZWQgcmVzdWx0IGRhdGEqL1xuLyogTm90ZSB0aGF0IGluIGFkZGl0aW9uIHRvIG5vbi10ZXJtaW5hbCB2YWx1ZXMgZnJvbSBgcHVibGlzaGAsKi9cbi8qIHZhbHVlIGFsc28gaG9sZHMgdGhlIHRlcm1pbmFsIHZhbHVlIGZyb20gYGZpbmlzaGAgb3IgYGZhaWxgLiovXG5oYXNWYWx1ZTpmYWxzZSxcbnZhbHVlOnVuZGVmaW5lZH07XG5cbiB9O1xuXG4vKiBXZSBuZWVkIHRoZSBXZWFrTWFwIGtleSBmb3IgYSBraXQgdG8gYmUgYSB2cmVmLWJlYXJpbmcgb2JqZWN0Ki9cbi8qIGluIGl0cyBjb2hvcnQsIGFuZCBoYXZlIGFyYml0cmFyaWx5IGNob3NlbiB0aGUgcHVibGlzaGVyIGZhY2V0LiovXG4vKiogQHR5cGVkZWYge1B1Ymxpc2hlcjwqPn0gRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXkgKi9cbi8qKlxuICogQHBhcmFtIHtQdWJsaXNoS2l0PCo+fSBmYWNldHNcbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleX1cbiAqL1xuY29uc3QgZ2V0RXBoZW1lcmFsS2V5PShmYWNldHMpPT5mYWNldHMucHVibGlzaGVyO1xuXG4vKipcbiAqIEB0eXBlZGVmIER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YVxuICogQHByb3BlcnR5IHtQcm9taXNlPCo+IHwgdW5kZWZpbmVkfSBjdXJyZW50UCBUaGUgY3VycmVudC1yZXN1bHQgcHJvbWlzZVxuICogICAodW5kZWZpbmVkIHVubGVzcyByZXNvbHZlZCB3aXRoIHVucmVjb3ZlcmFibGUgZXBoZW1lcmFsIGRhdGEpXG4gKiBAcHJvcGVydHkge1Byb21pc2U8Kj59IHRhaWxQIFRoZSBuZXh0LXJlc3VsdCBwcm9taXNlXG4gKiBAcHJvcGVydHkgeygodmFsdWU6IGFueSkgPT4gdm9pZCkgfCB1bmRlZmluZWR9IHRhaWxSIFRoZSBuZXh0LXJlc3VsdCByZXNvbHZlclxuICogICAodW5kZWZpbmVkIHdoZW4gdGhlIHB1Ymxpc2gga2l0IGhhcyB0ZXJtaW5hdGVkKVxuICovXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleSwgRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPn0gKi9cbmNvbnN0IGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YT1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQtcmVzdWx0IHByb21pc2UgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZHVyYWJsZVxuICogcHVibGlzaCBraXQsIHJlY3JlYXRlZCB1bmxlc3Mgd2UgYWxyZWFkeSBoYXZlIG9uZSB3aXRoIHJldGFpbmVkXG4gKiBlcGhlbWVyYWwgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9IHN0YXRlXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHBhcmFtIHtQcm9taXNlPCo+fSB0YWlsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTwqPn1cbiAqL1xuY29uc3QgcHJvdmlkZUN1cnJlbnRQPShzdGF0ZSxmYWNldHMsdGFpbCk9PntcbmNvbnN0IGVwaGVtZXJhbEtleT1nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbmNvbnN0IGZvdW5kRGF0YT1kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG5jb25zdCBjdXJyZW50UD1mb3VuZERhdGEmJmZvdW5kRGF0YS5jdXJyZW50UDtcbmlmKGN1cnJlbnRQKXtcbnJldHVybiBjdXJyZW50UDtcbiB9XG5cbmNvbnN0e3B1Ymxpc2hDb3VudCxzdGF0dXMsaGFzVmFsdWUsdmFsdWV9PXN0YXRlO1xuaWYoIWhhc1ZhbHVlKXtcbmFzc2VydChzdGF0dXM9PT0nbGl2ZScpO1xucmV0dXJuIHRhaWw7XG4gfVxuaWYoc3RhdHVzPT09J2xpdmUnfHxzdGF0dXM9PT0nZmluaXNoZWQnKXtcbmNvbnN0IGNlbGw9aGFyZGVuKHtcbmhlYWQ6e3ZhbHVlLGRvbmU6c3RhdHVzIT09J2xpdmUnfSxcbnB1Ymxpc2hDb3VudCxcbnRhaWx9KTtcblxucmV0dXJuIEUucmVzb2x2ZShjZWxsKTtcbiB9ZWxzZSBpZihzdGF0dXM9PT0nZmFpbGVkJyl7XG5yZXR1cm4gbWFrZVF1aWV0UmVqZWN0aW9uKHZhbHVlKTtcbiB9ZWxzZXtcbnRocm93IEZhaWwgYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gfVxuIH07XG5cbi8qKlxuICogUmV0dXJucyB0aGUgbmV4dC1yZXN1bHQgcHJvbWlzZSBhbmQgcmVzb2x2ZXIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW5cbiAqIGR1cmFibGUgcHVibGlzaCBraXQuXG4gKiBUaGVzZSBhcmUgbG9zdCBvbiB1cGdyYWRlIGJ1dCByZWNyZWF0ZWQgb24tZGVtYW5kLCBwcmVzZXJ2aW5nIHRoZVxuICogdmFsdWUgaW4gKGJ1dCBub3QgdGhlIGlkZW50aXR5IG9mKSB0aGUgY3VycmVudCB7IHZhbHVlLCBkb25lIH0gcmVzdWx0XG4gKiB3aGVuIHBvc3NpYmxlLCB3aGljaCBpcyBhbHdheXMgdGhlIGNhc2Ugd2hlbiB0aGF0IHZhbHVlIGlzIHRlcm1pbmFsXG4gKiAoaS5lLiwgZnJvbSBgZmluaXNoYCBvciBgZmFpbGApIG9yIHdoZW4gdGhlIGR1cmFibGUgcHVibGlzaCBraXQgaXNcbiAqIGNvbmZpZ3VyZWQgd2l0aCBgdmFsdWVEdXJhYmlsaXR5OiAnbWFuZGF0b3J5J2AuXG4gKlxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfSBzdGF0ZVxuICogQHBhcmFtIHtQdWJsaXNoS2l0PCo+fSBmYWNldHNcbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGF9XG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE9KHN0YXRlLGZhY2V0cyk9PntcbmNvbnN0IGVwaGVtZXJhbEtleT1nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbmNvbnN0IGZvdW5kRGF0YT1kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG5pZihmb3VuZERhdGEpe1xucmV0dXJuIGZvdW5kRGF0YTtcbiB9XG5cbmNvbnN0e3N0YXR1c309c3RhdGU7XG5sZXQgdGFpbFA7XG5sZXQgdGFpbFI7XG5pZihzdGF0dXM9PT0nbGl2ZScpe1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xudm9pZCBFLndoZW4odGFpbFAsc2luayxzaW5rKTtcbiB9ZWxzZSBpZihzdGF0dXM9PT0nZmluaXNoZWQnfHxzdGF0dXM9PT0nZmFpbGVkJyl7XG50YWlsUD10b29GYXJSZWplY3Rpb247XG4gfWVsc2V7XG50aHJvdyBGYWlsIGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuIH1cbi8qIGN1cnJlbnRQIGlzIG5vdCBlcGhlbWVyYWwgd2hlbiByZXN0b3JpbmcgZnJvbSBwZXJzaXN0ZWQgc3RhdGUuKi9cbmNvbnN0IG9iaj1oYXJkZW4oe2N1cnJlbnRQOnVuZGVmaW5lZCx0YWlsUCx0YWlsUn0pO1xuZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChlcGhlbWVyYWxLZXksb2JqKTtcbnJldHVybiBvYmo7XG4gfTtcblxuLyoqXG4gKiBFeHRlbmRzIHRoZSBzZXF1ZW5jZSBvZiByZXN1bHRzLlxuICpcbiAqIEBwYXJhbSB7e3N0YXRlOiBEdXJhYmxlUHVibGlzaEtpdFN0YXRlLCBmYWNldHM6IFB1Ymxpc2hLaXQ8Kj59fSBjb250ZXh0XG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVsnc3RhdHVzJ119IFt0YXJnZXRTdGF0dXNdXG4gKi9cbmNvbnN0IGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdD0oY29udGV4dCx2YWx1ZSx0YXJnZXRTdGF0dXM9J2xpdmUnKT0+e1xuY29uc3R7c3RhdGUsZmFjZXRzfT1jb250ZXh0O1xuY29uc3R7dmFsdWVEdXJhYmlsaXR5LHN0YXR1c309c3RhdGU7XG5pZihzdGF0dXMhPT0nbGl2ZScpe1xudGhyb3cgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuY29uc3QgZG9uZT10YXJnZXRTdGF0dXMhPT0nbGl2ZSc7XG5pZihkb25lfHx2YWx1ZUR1cmFiaWxpdHk9PT0nbWFuZGF0b3J5Jyl7XG5jYW5CZUR1cmFibGUodmFsdWUpfHxGYWlsIGBDYW5ub3QgYWNjZXB0IG5vbi1kdXJhYmxlIHZhbHVlOiAke3ZhbHVlfWA7XG4gfVxuY29uc3R7dGFpbFA6b2xkVGFpbFAsdGFpbFI6cmVzb2x2ZU9sZFRhaWx9PVxucHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShzdGF0ZSxmYWNldHMpO1xuYXNzZXJ0LnR5cGVvZihyZXNvbHZlT2xkVGFpbCwnZnVuY3Rpb24nKTtcblxuY29uc3QgcHVibGlzaENvdW50PXN0YXRlLnB1Ymxpc2hDb3VudCsxbjtcbnN0YXRlLnB1Ymxpc2hDb3VudD1wdWJsaXNoQ291bnQ7XG5cbmxldCB0YWlsUDtcbmxldCB0YWlsUjtcbmlmKGRvbmUpe1xuc3RhdGUuc3RhdHVzPXRhcmdldFN0YXR1cztcbnRhaWxQPXRvb0ZhclJlamVjdGlvbjtcbnRhaWxSPXVuZGVmaW5lZDtcbiB9ZWxzZXtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcbnZvaWQgRS53aGVuKHRhaWxQLHNpbmssc2luayk7XG4gfVxuXG5sZXQgY3VycmVudFA7XG5pZih0YXJnZXRTdGF0dXM9PT0nZmFpbGVkJyl7XG5zdGF0ZS5oYXNWYWx1ZT10cnVlO1xuc3RhdGUudmFsdWU9dmFsdWU7XG5jb25zdCByZWplY3Rpb249bWFrZVF1aWV0UmVqZWN0aW9uKHZhbHVlKTtcbnJlc29sdmVPbGRUYWlsKHJlamVjdGlvbik7XG4gfWVsc2V7XG4vKiBQZXJzaXN0IGEgdGVybWluYWwgdmFsdWUsIG9yIGEgbm9uLXRlcm1pbmFsIHZhbHVlKi9cbi8qIGlmIGNvbmZpZ3VyZWQgYXMgJ21hbmRhdG9yeScgb3IgJ29wcG9ydHVuaXN0aWMnLiovXG5pZihkb25lfHx2YWx1ZUR1cmFiaWxpdHkhPT0naWdub3JlZCcmJmNhbkJlRHVyYWJsZSh2YWx1ZSkpe1xuc3RhdGUuaGFzVmFsdWU9dHJ1ZTtcbnN0YXRlLnZhbHVlPXZhbHVlO1xuIH1lbHNle1xuc3RhdGUuaGFzVmFsdWU9ZmFsc2U7XG5zdGF0ZS52YWx1ZT11bmRlZmluZWQ7XG4vKiBSZXRhaW4gYW55IHByb21pc2Ugd2l0aCBub24tZHVyYWJsZSByZXNvbHV0aW9uLiovXG5jdXJyZW50UD1vbGRUYWlsUDtcbiB9XG5cbnJlc29sdmVPbGRUYWlsKFxuaGFyZGVuKHtcbmhlYWQ6e3ZhbHVlLGRvbmV9LFxucHVibGlzaENvdW50LFxudGFpbDp0YWlsUH0pKTtcblxuXG4gfVxuXG5kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KFxuZ2V0RXBoZW1lcmFsS2V5KGZhY2V0cyksXG5oYXJkZW4oe2N1cnJlbnRQLHRhaWxQLHRhaWxSfSkpO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4uLy4uL3ZhdC1kYXRhL3NyYy90eXBlcy5qcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0PShiYWdnYWdlLGtpbmROYW1lKT0+e1xuLyogVE9ETzogT25jZSB3ZSB1bmlmeSB3aXRoIG1ha2VQdWJsaXNoS2l0LCB3ZSB3aWxsIHVzZSBhIFpvbmUtY29tcGF0aWJsZSB3ZWFrKi9cbi8qIG1hcCBmb3IgbWVtb2l6YXRpb24uKi9cbmNvbnN0IG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZD1tYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkO1xuXG4vKipcbiAqIEByZXR1cm5zIHsoKSA9PiBQdWJsaXNoS2l0PCo+fVxuICovXG5yZXR1cm4gcHJlcGFyZUV4b0NsYXNzS2l0KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxucHVibGlzaEtpdElLaXQsXG5pbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSxcbntcbi8qIFRoZSBwdWJsaXNoZXIgZmFjZXQgb2YgYSBkdXJhYmxlIHB1Ymxpc2gga2l0Ki9cbi8qIGFjY2VwdHMgbmV3IHZhbHVlcy4qL1xucHVibGlzaGVyOntcbnB1Ymxpc2godmFsdWUpe1xuYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsdmFsdWUpO1xuIH0sXG5maW5pc2goZmluYWxWYWx1ZSl7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyxmaW5hbFZhbHVlLCdmaW5pc2hlZCcpO1xuIH0sXG5mYWlsKHJlYXNvbil7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyxyZWFzb24sJ2ZhaWxlZCcpO1xuIH19LFxuXG5cbi8qIFRoZSBzdWJzY3JpYmVyIGZhY2V0IG9mIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCovXG4vKiBwcm9wYWdhdGVzIHZhbHVlcy4qL1xuc3Vic2NyaWJlcjp7XG5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQ9LTFuKXtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcbmNvbnN0e3B1Ymxpc2hDb3VudDpjdXJyZW50UHVibGlzaENvdW50fT1zdGF0ZTtcbmNvbnN0e2N1cnJlbnRQLHRhaWxQfT1wcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKFxuc3RhdGUsXG5mYWNldHMpO1xuXG5pZihwdWJsaXNoQ291bnQ9PT1jdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiB0YWlsUDtcbiB9ZWxzZSBpZihwdWJsaXNoQ291bnQ8Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gY3VycmVudFB8fHByb3ZpZGVDdXJyZW50UChzdGF0ZSxmYWNldHMsdGFpbFApO1xuIH1lbHNle1xudGhyb3cgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9LFxuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpe1xuY29uc3R7XG5mYWNldHM6e3N1YnNjcmliZXJ9fT1cbnRoaXM7XG5pZih1cGRhdGVDb3VudD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLnRoZW4obWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkKTtcbiB9XG51cGRhdGVDb3VudD1CaWdJbnQodXBkYXRlQ291bnQpO1xucmV0dXJuKFxuc3Vic2NyaWJlclxuLyogYHN1YnNjcmliZUFmdGVyYCBtYXkgcmVzb2x2ZSB3aXRoIHRoZSB1cGRhdGUgcmVjb3JkIG51bWJlcmVkKi9cbi8qIGB1cGRhdGVDb3VudCArIDFgLCBldmVuIGlmIHNldmVyYWwgdXBkYXRlcyBhcmUgcHVibGlzaGVkIGluIHRoZSovXG4vKiBzYW1lIGNyYW5rLi4uKi8uXG5zdWJzY3JpYmVBZnRlcih1cGRhdGVDb3VudClcbi8qIC4uLiBzbyB3ZSBwb2xsIHRoZSBsYXRlc3QgcHVibGlzaGVkIHVwZGF0ZSwgd2l0aG91dCB3YWl0aW5nIGZvciBhbnkqL1xuLyogZnVydGhlciBvbmVzLiovLlxudGhlbigoKT0+c3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpKSk7XG5cbiB9fX0sXG5cblxue1xuc3RhdGVTaGFwZTpEdXJhYmxlUHVibGlzaEtpdFN0YXRlU2hhcGV9KTtcblxuXG4gfTskaOKAjV9vbmNlLnByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5cbmNvbnN0ICAgICAgICBTdWJzY3JpYmVyU2hhcGU9TS5yZW1vdGFibGUoJ1N1YnNjcmliZXInKTskaOKAjV9vbmNlLlN1YnNjcmliZXJTaGFwZShTdWJzY3JpYmVyU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlB1Ymxpc2hlckkiOlsiUHVibGlzaGVySSJdLCJVcGRhdGVDb3VudFNoYXBlIjpbIlVwZGF0ZUNvdW50U2hhcGUiXSwiU3Vic2NyaWJlckkiOlsiU3Vic2NyaWJlckkiXSwicHVibGlzaEtpdElLaXQiOlsicHVibGlzaEtpdElLaXQiXSwiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSI6WyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIl0sIkl0ZXJhYmxlRWFjaFRvcGljSSI6WyJJdGVyYWJsZUVhY2hUb3BpY0kiXSwiSXRlcmFibGVMYXRlc3RUb3BpY0kiOlsiSXRlcmFibGVMYXRlc3RUb3BpY0kiXSwibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiXSwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IjpbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAL4BMCSDCgAAgwoAAC4AAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VTdG9yZWROb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UsRSxGYXIsb2JzZXJ2ZU5vdGlmaWVyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLCBbJGjigI1fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QmFzZU5vdGlmaWVyPFQ+ICYgT21pdDxTdG9yZWRGYWNldCwgJ2dldFN0b3JlS2V5Jz59IFN0b3JlZE5vdGlmaWVyXG4gKi9cblxuLyoqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgbm8gZnVydGhlciB3cml0ZXMgdG8gaXQgd2lsbFxuICogYmUgYXR0ZW1wdGVkIChidXQgcmVzdWx0cyB3aWxsIHJlbWFpbiBhdmFpbGFibGUgZnJvbSB0aGUgc3Vic2NyaWJlcikuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZE5vdGlmaWVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPE5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWROb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWROb3RpZmllcj0obm90aWZpZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmFzc2VydEFsbERlZmluZWQoe25vdGlmaWVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXJ9KTtcblxuY29uc3QgbWFyc2hhbGxUb1N0b3JhZ2U9bWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKTtcblxub2JzZXJ2ZU5vdGlmaWVyKG5vdGlmaWVyLHtcbnVwZGF0ZVN0YXRlKHZhbHVlKXtcbm1hcnNoYWxsVG9TdG9yYWdlKHZhbHVlKS5jYXRjaCgocmVhc29uKT0+XG5jb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBmYWlsZWQgdG8gdXBkYXRlU3RhdGUnLHJlYXNvbikpO1xuXG4gfSxcbmZhaWwocmVhc29uKXtcbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byBpdGVyYXRlJyxyZWFzb24pO1xuIH19KS5cbmNhdGNoKChyZWFzb24pPT57XG5jb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBoYWx0ZWQgaXRlcmF0aW9uJyxyZWFzb24pO1xuIH0pO1xuXG4vKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xuZnJvbUNhcERhdGE6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpfSk7XG5cblxuLyoqIEB0eXBlIHtTdG9yZWROb3RpZmllcjxUPn0gKi9cbmNvbnN0IHN0b3JlZE5vdGlmaWVyPUZhcignU3RvcmVkTm90aWZpZXInLHtcbmdldFVwZGF0ZVNpbmNlOih1cGRhdGVDb3VudCk9PkUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbmdldFBhdGg6KCk9PkUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyfSk7XG5cbnJldHVybiBzdG9yZWROb3RpZmllcjtcbiB9OyRo4oCNX29uY2UubWFrZVN0b3JlZE5vdGlmaWVyKG1ha2VTdG9yZWROb3RpZmllcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN0b3JlZE5vdGlmaWVyIjpbIm1ha2VTdG9yZWROb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAEVEtx1SEAANUhAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3Jlc3ViLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL3N1YnNjcmliZXIuanMiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiLCJtYWtlU3RvcmVkUHVibGlzaEtpdCIsIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiLCJtYWtlU3RvcmVkU3Vic2NyaWJlciIsIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsbWFrZU1hcnNoYWwsYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLG9ic2VydmVJdGVyYXRpb24sbWFrZVB1Ymxpc2hLaXQsbWFrZVN1YnNjcmlwdGlvbktpdCxzdWJzY3JpYmVFYWNoOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLCBbJGjigI1fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlSXRlcmF0aW9uXCIsIFskaOKAjV9hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjigI1fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25LaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VTdWJzY3JpcHRpb25LaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIiwgWyRo4oCNX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIE5COiBkb2VzIG5vdCB5ZXQgc3Vydml2ZSB1cGdyYWRlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjg5M1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7KHY6IFQpID0+IHZvaWR9IGNvbnN1bWVWYWx1ZVxuICovXG5jb25zdCAgICAgICAgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkPWFzeW5jKHN1YnNjcmliZXIsY29uc3VtZVZhbHVlKT0+e1xuLyogV2Ugb3Blbi1jb2RlIHRoZSBmb3ItYXdhaXQtb2YgaW1wbGVtZW50YXRpb24gcmF0aGVyIHRoYW4gdXNpbmcgdGhhdCBzeW50YXgqL1xuLyogZGlyZWN0bHkgYmVjYXVzZSB3ZSB3YW50IHRvIHJ1biB0aGUgY29uc3VtZXIgb24gdGhlIGRvbmUgdmFsdWUgYXMgd2VsbC4qL1xuY29uc3QgaXRlcmF0b3I9c3Vic2NyaWJlRWFjaChzdWJzY3JpYmVyKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxubGV0IGZpbmlzaGVkPWZhbHNlO1xuYXdhaXQgbnVsbDtcbndoaWxlKCFmaW5pc2hlZCl7XG5jb25zdHt2YWx1ZSxkb25lfT1hd2FpdCBpdGVyYXRvci5uZXh0KCk7XG5hd2FpdCBjb25zdW1lVmFsdWUodmFsdWUpO1xuZmluaXNoZWQ9ISFkb25lO1xuIH1cbiB9O1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaWJlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBtYWtlTWFyc2hhbD4+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaWJlcjxUPn1cbiAqLyRo4oCNX29uY2UuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKGZvckVhY2hQdWJsaWNhdGlvblJlY29yZCk7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFN1YnNjcmliZXI9KHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmFzc2VydEFsbERlZmluZWQoe3N1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcn0pO1xuXG5jb25zdCBtYXJzaGFsbFRvU3RvcmFnZT1tYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpO1xuXG4vKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChzdWJzY3JpYmVyLG1hcnNoYWxsVG9TdG9yYWdlKS5jYXRjaCgoZXJyKT0+e1xuLyogVE9ETzogSG93IHNob3VsZCB3ZSBoYW5kbGUgYW5kL29yIHN1cmZhY2UgdGhpcyBmYWlsdXJlPyovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81NzY2I2Rpc2N1c3Npb25fcjkyMjQ5ODA4OCovXG5jb25zb2xlLmVycm9yKCdTdG9yZWRTdWJzY3JpYmVyIGZhaWxlZCB0byBpdGVyYXRlJyxlcnIpO1xuIH0pO1xuXG4vKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xuZnJvbUNhcERhdGE6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpfSk7XG5cblxuLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpYmVyJyx7XG5zdWJzY3JpYmVBZnRlcjoocHVibGlzaENvdW50KT0+c3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+c3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG5nZXRQYXRoOigpPT5FKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG5nZXRTdG9yZUtleTooKT0+RShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyfSk7XG5cbnJldHVybiBzdG9yZXN1YjtcbiB9O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBtYWtlU3RvcmVkU3Vic2NyaWJlclxuICpcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCB0aGUgaXRlcmF0aW9uIHdpbGwgYmUgdGVybWluYXRlZC5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPFJldHVyblR5cGU8dHlwZW9mIG1ha2VNYXJzaGFsPj59IFttYXJzaGFsbGVyXVxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFN1YnNjcmliZXIobWFrZVN0b3JlZFN1YnNjcmliZXIpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRTdWJzY3JpcHRpb249KFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyPW1ha2VNYXJzaGFsKHVuZGVmaW5lZCx1bmRlZmluZWQse1xubWFyc2hhbFNhdmVFcnJvcjooKT0+eyB9LFxuc2VyaWFsaXplQm9keUZvcm1hdDonc21hbGxjYXBzJ30pKT0+XG5cbntcbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG5mcm9tQ2FwRGF0YTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSl9KTtcblxuXG4vKiBBYm9ydCB0aGUgaXRlcmF0aW9uIG9uIHRoZSBuZXh0IG9ic2VydmF0aW9uIGlmIHRoZSBwdWJsaXNoZXIgZXZlciBmYWlscy4qL1xubGV0IHB1Ymxpc2hGYWlsZWQ9ZmFsc2U7XG5sZXQgcHVibGlzaEV4Y2VwdGlvbjtcblxuY29uc3QgZmFpbD0oZXJyKT0+e1xucHVibGlzaEZhaWxlZD10cnVlO1xucHVibGlzaEV4Y2VwdGlvbj1lcnI7XG4gfTtcblxuLyogTXVzdCAqbm90KiBiZSBhbiBhc3luYyBmdW5jdGlvbiwgYmVjYXVzZSBpdCBzb21ldGltZXMgbXVzdCB0aHJvdyB0byBhYm9ydCovXG4vKiB0aGUgaXRlcmF0aW9uLiovXG5jb25zdCBwdWJsaXNoVmFsdWU9KG9iaik9PntcbmFzc2VydChzdG9yYWdlTm9kZSk7XG5pZihwdWJsaXNoRmFpbGVkKXtcbi8qIFRvIHByb3Blcmx5IGFib3J0IHRoZSBpdGVyYXRpb24sIHRoaXMgbXVzdCBiZSBhIHN5bmNocm9ub3VzIGV4Y2VwdGlvbi4qL1xudGhyb3cgcHVibGlzaEV4Y2VwdGlvbjtcbiB9XG5cbi8qIFB1Ymxpc2ggdGhlIHZhbHVlLCBjYXB0dXJpbmcgYW55IGVycm9yLiovXG5FKG1hcnNoYWxsZXIpLlxudG9DYXBEYXRhKG9iaikuXG50aGVuKChzZXJpYWxpemVkKT0+e1xuY29uc3QgZW5jb2RlZD1KU09OLnN0cmluZ2lmeShzZXJpYWxpemVkKTtcbnJldHVybiBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShlbmNvZGVkKTtcbiB9KS5cbmNhdGNoKGZhaWwpO1xuIH07XG5cbmlmKHN0b3JhZ2VOb2RlKXtcbi8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xub2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpcHRpb24se1xudXBkYXRlU3RhdGU6cHVibGlzaFZhbHVlLFxuZmluaXNoOnB1Ymxpc2hWYWx1ZX0pLlxuY2F0Y2goZmFpbCk7XG4gfVxuXG4vKiogQHR5cGUge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gKi9cbmNvbnN0IHN0b3Jlc3ViPUZhcignU3RvcmVkU3Vic2NyaXB0aW9uJyx7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGdldFN0b3JlS2V5IHR5cGUgZG9lcyBub3QgaGF2ZSBgc3Vic2NyaXB0aW9uYCovXG5nZXRTdG9yZUtleTphc3luYygpPT57XG5pZighc3RvcmFnZU5vZGUpe1xucmV0dXJuIGhhcmRlbih7c3Vic2NyaXB0aW9ufSk7XG4gfVxuY29uc3Qgc3RvcmVLZXk9YXdhaXQgRShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKTtcbnJldHVybiBoYXJkZW4oey4uLnN0b3JlS2V5LHN1YnNjcmlwdGlvbn0pO1xuIH0sXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcixcbmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzOigpPT5cbnN1YnNjcmlwdGlvbi5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFscygpLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+c3Vic2NyaXB0aW9uW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpLFxuc3Vic2NyaWJlQWZ0ZXI6KHB1Ymxpc2hDb3VudCk9PnN1YnNjcmlwdGlvbi5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpfSk7XG5cbnJldHVybiBzdG9yZXN1YjtcbiB9OyRo4oCNX29uY2UubWFrZVN0b3JlZFN1YnNjcmlwdGlvbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgU3RvcmVkUHVibGlzaEtpdFxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZFB1Ymxpc2hlcktpdFxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpcHRpb248VD59IHN1YnNjcmliZXJcbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHB1Ymxpc2hlclxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgaW5jb21wYXRpYmxlIHdpdGggZHVyYWJpbGl0eTsgaW5zdGVhZCBoYW5kbGUgdnN0b3JhZ2UgZXBoZW1lcmFsbHkgb24gYSBkdXJhYmxlIFB1Ymxpc2hLaXRcbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gW21hcnNoYWxsZXJdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NoaWxkUGF0aF1cbiAqIEByZXR1cm5zIHtTdG9yZWRQdWJsaXNoZXJLaXQ8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkUHVibGlzaGVyS2l0PShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyLGNoaWxkUGF0aCk9PntcbmNvbnN0e3B1YmxpY2F0aW9uLHN1YnNjcmlwdGlvbn09bWFrZVN1YnNjcmlwdGlvbktpdCgpO1xuXG5pZihzdG9yYWdlTm9kZSYmY2hpbGRQYXRoKXtcbnN0b3JhZ2VOb2RlPUUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGRQYXRoKTtcbiB9XG5cbi8qIHdyYXAgdGhlIHN1YnNjcmlwdGlvbiB0byB0ZWUgZXZlbnRzIHRvIHN0b3JhZ2UsIHJlcGVhdGluZyB0byB0aGlzIGBzdWJzY3JpYmVyYCovXG5jb25zdCBzdWJzY3JpYmVyPW1ha2VTdG9yZWRTdWJzY3JpcHRpb24oXG5zdWJzY3JpcHRpb24sXG5zdG9yYWdlTm9kZSxcbm1hcnNoYWxsZXIpO1xuXG5cbnJldHVybntcbnB1Ymxpc2hlcjpwdWJsaWNhdGlvbixcbnN1YnNjcmliZXJ9O1xuXG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbmNvbXBhdGlibGUgd2l0aCBkdXJhYmlsaXR5OyBpbnN0ZWFkIGhhbmRsZSB2c3RvcmFnZSBlcGhlbWVyYWxseSBvbiBhIGR1cmFibGUgUHVibGlzaEtpdFxuICpcbiAqIExpa2UgbWFrZVB1Ymxpc2hLaXQgdGhpcyBtYWtlcyBhIGB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9YCBwYWlyIGZvciBkb2luZyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIgc3VwcG9ydGluZyBib3RoIFwiZWFjaFwiIGFuZCBcImxhdGVzdFwiIGl0ZXJhdGlvblxuICogb2YgcHVibGlzaGVkIHZhbHVlcy5cbiAqXG4gKiBXaGF0J3MgZGlmZmVyZW50IGlzIGBzdWJzY3JpYmVyYCB0ZWVzIHJlY29yZHMsIHdyaXRpbmcgb3V0IHRvIHN0b3JhZ2VOb2RlLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hLaXQ8VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQobWFrZVN0b3JlZFB1Ymxpc2hlcktpdCk7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFB1Ymxpc2hLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxucmV0dXJue1xucHVibGlzaGVyLFxuLyogd3JhcCB0aGUgc3Vic2NyaWJlciB0byB0ZWUgZXZlbnRzIHRvIHN0b3JhZ2UqL1xuc3Vic2NyaWJlcjptYWtlU3RvcmVkU3Vic2NyaWJlcihzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpfTtcblxuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkUHVibGlzaEtpdChtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCI6WyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiXSwibWFrZVN0b3JlZFN1YnNjcmliZXIiOlsibWFrZVN0b3JlZFN1YnNjcmliZXIiXSwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiI6WyJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCJdLCJtYWtlU3RvcmVkUHVibGlzaEtpdCI6WyJtYWtlU3RvcmVkUHVibGlzaEtpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADa3wmHIiQAACIkAAAoAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZS5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJzdWJzY3JpYmUiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLGlzT2JqZWN0LGlzVXBncmFkZURpc2Nvbm5lY3Rpb247JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanNcIiwgW1tcImlzVXBncmFkZURpc2Nvbm5lY3Rpb25cIiwgWyRo4oCNX2EgPT4gKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5jb25zdCBzaW5rPSgpPT57IH07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHByb21pc2UgcmV0dXJuZWQgYnkgYSBmdW5jdGlvbiBmb3IgcmVqZWN0aW9uIGJ5IHZhdCB1cGdyYWRlLFxuICogYW5kIHJlZmV0Y2ggdXBvbiBlbmNvdW50ZXJpbmcgdGhhdCBjb25kaXRpb24uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gRVJlZjxUPn0gZ2V0dGVyXG4gKiBAcGFyYW0ge0VSZWY8VD5bXX0gW3NlZWRdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUPn1cbiAqL1xuY29uc3QgcmVjb25uZWN0QXNOZWVkZWQ9YXN5bmMoZ2V0dGVyLHNlZWQ9W10pPT57XG5sZXQgZGlzY29ubmVjdGlvbjtcbmxldCBsYXN0VmVyc2lvbj0tSW5maW5pdHk7XG4vKiBFbmQgc3luY2hyb25vdXMgcHJlbHVkZS4qL1xuYXdhaXQgbnVsbDtcbmZvcihsZXQgaT0wOztpKz0xKXtcbnRyeXtcbmNvbnN0IHJlc3VsdFA9aTxzZWVkLmxlbmd0aD9zZWVkW2ldOmdldHRlcigpO1xuY29uc3QgcmVzdWx0PWF3YWl0IHJlc3VsdFA7XG5yZXR1cm4gcmVzdWx0O1xuIH1jYXRjaChlcnIpe1xuaWYoaXNVcGdyYWRlRGlzY29ubmVjdGlvbihlcnIpKXtcbmlmKCFkaXNjb25uZWN0aW9uKXtcbmRpc2Nvbm5lY3Rpb249ZXJyO1xuIH1cbmNvbnN0e2luY2FybmF0aW9uTnVtYmVyOnZlcnNpb259PWVycjtcbmlmKHZlcnNpb24+bGFzdFZlcnNpb24pe1xuLyogV2UgZG9uJ3QgZXhwZWN0IGFub3RoZXIgdXBncmFkZSBpbiBiZXR3ZWVuIHJlY2VpdmluZyovXG4vKiBhIGRpc2Nvbm5lY3Rpb24gYW5kIHJlLXJlcXVlc3RpbmcgYW4gdXBkYXRlLCBidXQgbXVzdCovXG4vKiBuZXZlcnRoZWxlc3MgYmUgcHJlcGFyZWQgZm9yIHRoYXQuKi9cbmxhc3RWZXJzaW9uPXZlcnNpb247XG5jb250aW51ZTtcbiB9XG4gfVxuLyogaWYgYGVycmAgaXMgYW4gKEVycm9yKSBvYmplY3QsIHdlIGNhbiB0cnkgdG8gYXNzb2NpYXRlIGl0IHdpdGgqL1xuLyogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRpc2Nvbm5lY3Rpb24gdGhhdCBwcm9tcHRlZCB0aGUgcmVxdWVzdCovXG4vKiBmb3Igd2hpY2ggaXQgaXMgYSByZXN1bHQuKi9cbmlmKGlzT2JqZWN0KGVycikmJmRpc2Nvbm5lY3Rpb24mJmRpc2Nvbm5lY3Rpb24hPT1lcnIpe1xudHJ5e1xuYXNzZXJ0Lm5vdGUoXG5lcnIsXG5YIGBBdHRlbXB0aW5nIHRvIHJlY292ZXIgZnJvbSBkaXNjb25uZWN0aW9uOiAke2Rpc2Nvbm5lY3Rpb259YCk7XG5cbiB9Y2F0Y2goX2Vycil7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZW1wdHkqL1xuIH1cbiB9XG50aHJvdyBlcnI7XG4gfVxuIH1cbiB9O1xuXG4vKipcbiAqIENyZWF0ZSBhIG5lYXIgaXRlcmFibGUgdGhhdCBjb3JyZXNwb25kcyB0byBhIHBvdGVudGlhbGx5IGZhciBvbmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VD4+fSBpdFBcbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZT0oaXRQKT0+XG5GYXIoJ0FzeW5jSXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbmNvbnN0IGl0PUUoaXRQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbmNvbnN0IHNlbGY9RmFyKCdBc3luY0l0ZXJhYmxlSXRlcmF0b3InLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnNlbGYsXG5uZXh0OmFzeW5jKCk9PkUoaXQpLm5leHQoKX0pO1xuXG5yZXR1cm4gc2VsZjtcbiB9fSk7XG5cblxuLyoqXG4gKiBBc3luY3Jvbm91c2x5IGl0ZXJhdGVzIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGEgUHVibGljYXRpb25SZWNvcmQgY2hhaW4gYXMgdGhleVxuICogYXBwZWFyLiAgVGhpcyBpdGVyYXRpb24gbXVzdCBkcm9wIHBhcnRzIG9mIHB1YmxpY2F0aW9uIHJlY29yZHMgdGhhdCBhcmUgbm9cbiAqIGxvbmdlciBuZWVkZWQgc28gdGhleSBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICogQHBhcmFtIHtFUmVmPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gbmV4dENlbGxQXG4gKiAgIFB1YmxpY2F0aW9uUmVjb3JkIGNvcnJlc3BvbmRpbmcgd2l0aCB0aGUgZmlyc3QgaXRlcmF0aW9uIHJlc3VsdFxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovJGjigI1fb25jZS5zdWJzY3JpYmUoc3Vic2NyaWJlKTtcbmNvbnN0IG1ha2VFYWNoSXRlcmF0b3I9KHRvcGljLG5leHRDZWxsUCk9Pntcbi8qIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uLCBzdGFydCB3aXRoKi9cbi8qIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwNDEyMjI1MC9odHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1zdHJhd21hbjpjb25jdXJyZW5jeSNpbmZpbml0ZV9xdWV1ZSovXG5jb25zdCBzZWxmPUZhcignRWFjaEl0ZXJhdG9yJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zZWxmLFxubmV4dDooKT0+e1xuY29uc3R7XG5oZWFkOnJlc3VsdFAsXG5wdWJsaXNoQ291bnQ6cHVibGlzaENvdW50UCxcbnRhaWw6dGFpbFB9PVxuRS5nZXQobmV4dENlbGxQKTtcblxuLyogSWYgdGFpbFAgaXMgYnJva2VuIGJ5IHVwZ3JhZGUsIHdlIHdpbGwgbmVlZCB0byByZS1yZXF1ZXN0IGl0Ki9cbi8qIGRpcmVjdGx5IGZyb20gYHRvcGljYC4qL1xuY29uc3QgZ2V0U3VjY2Vzc29yPWFzeW5jKCk9PntcbmNvbnN0IHB1Ymxpc2hDb3VudD1hd2FpdCBwdWJsaXNoQ291bnRQO1xuYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsJ2JpZ2ludCcpO1xuY29uc3Qgc3VjY2Vzc29yPWF3YWl0IEUodG9waWMpLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCk7XG5jb25zdCBuZXdQdWJsaXNoQ291bnQ9c3VjY2Vzc29yLnB1Ymxpc2hDb3VudDtcbmlmKG5ld1B1Ymxpc2hDb3VudCE9PXB1Ymxpc2hDb3VudCsxbil7XG5GYWlsIGBlYWNoSXRlcmF0b3IgYnJva2VuIGJ5IGdhcCBmcm9tIHB1Ymxpc2hDb3VudCAke3B1Ymxpc2hDb3VudH0gdG8gJHtuZXdQdWJsaXNoQ291bnR9YDtcbiB9XG5yZXR1cm4gc3VjY2Vzc29yO1xuIH07XG5cbi8qIFJlcGxhY2UgbmV4dENlbGxQIG9uIGV2ZXJ5IGNhbGwgdG8gbmV4dCgpIHNvIHRoaW5ncyB3b3JrIGV2ZW4qL1xuLyogd2l0aCBhbiBlYWdlciBjb25zdW1lciB0aGF0IGRvZXNuJ3Qgd2FpdCBmb3IgcmVzdWx0cyB0byBzZXR0bGUuKi9cbm5leHRDZWxsUD1yZWNvbm5lY3RBc05lZWRlZChnZXRTdWNjZXNzb3IsW3RhaWxQXSk7XG5cbi8qIEF2b2lkIHVuaGFuZGxlZCByZWplY3Rpb24gd2FybmluZ3MgaGVyZSBpZiB0aGUgcHJldmlvdXMgY2VsbCB3YXMgcmVqZWN0ZWQgb3IqL1xuLyogdGhlcmUgaXMgbm8gZnVydGhlciByZXF1ZXN0IG9mIHRoaXMgaXRlcmF0b3IuKi9cbi8qIGB0YWlsUGAgaXMgaGFuZGxlZCBpbnNpZGUgYHJlY29ubmVjdEFzTmVlZGVkYCBhbmQgYHJlc3VsdFBgIGlzIHRoZSBjYWxsZXIncyovXG4vKiBjb25jZXJuLCBsZWF2aW5nIG9ubHkgYHB1Ymxpc2hDb3VudFBgIGFuZCB0aGUgbmV3IGBuZXh0Q2VsbFBgLiovXG52b2lkIEUud2hlbihwdWJsaXNoQ291bnRQLHNpbmssc2luayk7XG52b2lkIEUud2hlbihuZXh0Q2VsbFAsc2luayxzaW5rKTtcbnJldHVybiByZXN1bHRQO1xuIH0sXG5mb3JrOigpPT5tYWtlRWFjaEl0ZXJhdG9yKHRvcGljLG5leHRDZWxsUCl9KTtcblxucmV0dXJuIHNlbGY7XG4gfTtcblxuLyoqXG4gKiBHaXZlbiBhIGxvY2FsIG9yIHJlbW90ZSBzdWJzY3JpYmVyLCByZXR1cm5zIGEgbG9jYWwgQXN5bmNJdGVyYWJsZSB3aGljaFxuICogcHJvdmlkZXMgXCJwcmVmaXggbG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwicHJlZml4IGxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgZXZlcnl0aGluZyBwdWJsaXNoZWQgYmVmb3JlXG4gKiB5b3UgYXNrIHRoZSByZXR1cm5lZCBpdGVyYWJsZSBmb3IgYW4gaXRlcmF0b3IuIEJ1dCB0aGUgcmV0dXJuZWQgaXRlcmF0b3JcbiAqIHdpbGwgZW51bWVyYXRlIGVhY2ggdGhpbmcgcHVibGlzaGVkIGZyb20gdGhhdCBpdGVyYXRvcidzIHN0YXJ0aW5nIHBvaW50XG4gKiB1cCB0byBhIGRpc2Nvbm5lY3Rpb24gcmVzdWx0IGluZGljYXRpbmcgdXBncmFkZSBvZiB0aGUgcHJvZHVjZXJcbiAqICh3aGljaCBicmVha3MgdGhlIGdhcC1mcmVlIGd1YXJhbnRlZSBhbmQgdGhlcmVmb3JlIHRlcm1pbmF0ZXMgYW55IGFjdGl2ZVxuICogaXRlcmF0b3Igd2hpbGUgc3RpbGwgc3VwcG9ydGluZyBjcmVhdGlvbiBvZiBuZXcgaXRlcmF0b3JzKS5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUVhY2g9KHRvcGljKT0+e1xuY29uc3QgaXRlcmFibGU9RmFyKCdFYWNoSXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbmNvbnN0IGZpcnN0Q2VsbFA9cmVjb25uZWN0QXNOZWVkZWQoKCk9PkUodG9waWMpLnN1YnNjcmliZUFmdGVyKCkpO1xucmV0dXJuIG1ha2VFYWNoSXRlcmF0b3IodG9waWMsZmlyc3RDZWxsUCk7XG4gfX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLnN1YnNjcmliZUVhY2goc3Vic2NyaWJlRWFjaCk7XG5oYXJkZW4oc3Vic2NyaWJlRWFjaCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKiBAcGFyYW0ge2JpZ2ludH0gW2xvY2FsVXBkYXRlQ291bnRdXG4gKiBAcGFyYW0ge0l0ZXJhdG9yUmV0dXJuUmVzdWx0PFQ+fSBbdGVybWluYWxSZXN1bHRdXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVD59XG4gKi9cbmNvbnN0IGNsb25lTGF0ZXN0SXRlcmF0b3I9KHRvcGljLGxvY2FsVXBkYXRlQ291bnQsdGVybWluYWxSZXN1bHQpPT57XG5sZXQgbXV0ZXg9UHJvbWlzZS5yZXNvbHZlKCk7XG5cbi8qKlxuICogUmVxdWVzdCB0aGUgbmV4dCB1cGRhdGUgcmVjb3JkIGZyb20gdGhlIHRvcGljLCB1cGRhdGluZyBvdXIgbG9jYWwgc3RhdGUsXG4gKiBhbmQgY29udmVydCBpdCB0byBhbiBpdGVyYXRvciByZXN1bHQuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVD4+fVxuICovXG5jb25zdCBtYXliZVJlcXVlc3ROZXh0UmVzdWx0PWFzeW5jKCk9PntcbmlmKHRlcm1pbmFsUmVzdWx0KXtcbi8qIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdG9waWMsIGp1c3Qga2VlcCByZXR1cm5pbmcgdGhlIGxhc3QgcmVzdWx0Ki9cbi8qIHdpdGhvdXQgZnVydGhlciByZXF1ZXN0cy4qL1xucmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuIH1cblxuLyogU2VuZCB0aGUgbmV4dCByZXF1ZXN0IG5vdywgc2tpcHBpbmcgcGFzdCBpbnRlcm1lZGlhdGUgdXBkYXRlcyovXG4vKiBhbmQgdXBncmFkZSBkaXNjb25uZWN0aW9ucy4qL1xuY29uc3R7dmFsdWUsdXBkYXRlQ291bnR9PWF3YWl0IHJlY29ubmVjdEFzTmVlZGVkKCgpPT5cbkUodG9waWMpLmdldFVwZGF0ZVNpbmNlKGxvY2FsVXBkYXRlQ291bnQpKTtcblxuLyogTWFrZSBzdXJlIHRoZSBuZXh0IHJlcXVlc3QgaXMgZm9yIGEgZnJlc2hlciB2YWx1ZS4qL1xubG9jYWxVcGRhdGVDb3VudD11cGRhdGVDb3VudDtcblxuLyogTWFrZSBhbiBJdGVyYXRvclJlc3VsdC4qL1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xudGVybWluYWxSZXN1bHQ9aGFyZGVuKHtkb25lOnRydWUsdmFsdWV9KTtcbnJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfTtcblxuY29uc3Qgc2VsZj1GYXIoJ0xhdGVzdEl0ZXJhdG9yJyx7XG5mb3JrOigpPT5jbG9uZUxhdGVzdEl0ZXJhdG9yKHRvcGljLGxvY2FsVXBkYXRlQ291bnQsdGVybWluYWxSZXN1bHQpLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+c2VsZixcbm5leHQ6YXN5bmMoKT0+e1xuLyogSW4gdGhpcyBhZGFwdG9yLCBvbmNlIGBuZXh0KClgIGlzIGNhbGxlZCBhbmQgcmV0dXJucyBhbiB1bnJlc29sdmVkKi9cbi8qIHByb21pc2UsIGZ1cnRoZXIgYG5leHQoKWAgY2FsbHMgd2lsbCBhbHNvIHJldHVybiB1bnJlc29sdmVkIHByb21pc2VzKi9cbi8qIGJ1dCBlYWNoIGNhbGwgd2lsbCBub3QgdHJpZ2dlciBhbm90aGVyIGB0b3BpY2AgcmVxdWVzdCB1bnRpbCB0aGUgcHJpb3IqL1xuLyogb25lIGhhcyBzZXR0bGVkLiovXG4vKiovXG4vKiBUaGlzIGxpbmVhciBxdWV1ZWluZyBiZWhhdmlvciBpcyBvbmx5IG5lZWRlZCBmb3IgY29kZSB0aGF0IHVzZXMgdGhlKi9cbi8qIGFzeW5jIGl0ZXJhdG9yIHByb3RvY29sIGV4cGxpY2l0bHkuIFdoZW4gdGhpcyBhc3luYyBpdGVyYXRvciBpcyovXG4vKiBjb25zdW1lZCBieSBhIGZvci9hd2FpdC9vZiBsb29wLCBgbmV4dCgpYCB3aWxsIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZSovXG4vKiBwcm9taXNlIGZvciB0aGUgcHJldmlvdXMgaXRlcmF0aW9uIHJlc3VsdCBoYXMgZnVsZmlsbGVkLiBJZiBpdCBmdWxmaWxscyovXG4vKiB3aXRoIGBkb25lOiB0cnVlYCwgdGhlIGZvci9hd2FpdC9vZiBsb29wIHdpbGwgbmV2ZXIgY2FsbCBgbmV4dCgpYCovXG4vKiBhZ2Fpbi4qL1xuLyoqL1xuLyogU2VlKi9cbi8qIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDE2LzEwL2FzeW5jaHJvbm91cy1pdGVyYXRpb24uaHRtbCNxdWV1aW5nLW5leHQoKS1pbnZvY2F0aW9ucyovXG4vKiBmb3IgYW4gZXhwbGljaXQgdXNlIHRoYXQgc2VuZHMgYG5leHQoKWAgd2l0aG91dCB3YWl0aW5nLiovXG5cbmlmKHRlcm1pbmFsUmVzdWx0KXtcbi8qIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdG9waWMsIGp1c3Qga2VlcCByZXR1cm5pbmcgdGhlIGxhc3QqL1xuLyogcmVzdWx0LiovXG5yZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gfVxuXG4vKiBCRUdJTiBDUklUSUNBTCBTRUNUSU9OIC0gc3luY2hyb25vdXNseSBlbnF1ZXVlIGFuZCByZWFzc2lnbiBgbXV0ZXhgKi9cbi8qKi9cbi8qIFVzZSBgbXV0ZXhgIHRvIGVuc3VyZSB0aGF0IHdlIGhhdmUgbm8gbW9yZSB0aGFuIGEgc2luZ2xlIHJlcXVlc3QgaW4qL1xuLyogZmxpZ2h0LiovXG5jb25zdCBuZXh0UmVzdWx0PW11dGV4LnRoZW4obWF5YmVSZXF1ZXN0TmV4dFJlc3VsdCk7XG5tdXRleD1uZXh0UmVzdWx0LnRoZW4oc2luayxzaW5rKTtcbi8qIEVORCBDUklUSUNBTCBTRUNUSU9OKi9cblxucmV0dXJuIG5leHRSZXN1bHQ7XG4gfX0pO1xuXG5yZXR1cm4gc2VsZjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovXG5jb25zdCBtYWtlTGF0ZXN0SXRlcmF0b3I9KHRvcGljKT0+Y2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyk7XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwibG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwibG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBhbnkgcHVibGlzaGVkIHN0YXRlIGlmIGEgbW9yZVxuICogcmVjZW50IHB1Ymxpc2hlZCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCBieSB1cGdyYWRlIG9mIHRoZSBwcm9kdWNlcixcbiAqIGl0IHdpbGwgYmUgcmUtcmVxdWVzdGVkLiBBbGwgb3RoZXIgdGVybWluYWwgdmFsdWVzIHdpbGwgYmUgbG9zc2xlc3NseVxuICogcHJvcGFnYXRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gdG9waWNcbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUxhdGVzdD0odG9waWMpPT57XG5jb25zdCBpdGVyYWJsZT1GYXIoJ0xhdGVzdEl0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5tYWtlTGF0ZXN0SXRlcmF0b3IodG9waWMpfSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2Uuc3Vic2NyaWJlTGF0ZXN0KHN1YnNjcmliZUxhdGVzdCk7XG5oYXJkZW4oc3Vic2NyaWJlTGF0ZXN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdWJzY3JpYmUiOlsic3Vic2NyaWJlIl0sInN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACeyOyPFCwAAxQsAACkAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlci5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL3RvcGljLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsc3Vic2NyaWJlRWFjaCxtYWtlUHVibGlzaEtpdCxtYWtlUGlubmVkSGlzdG9yeVRvcGljOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIiwgWyRo4oCNX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaOKAjV9hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vdG9waWMuanNcIiwgW1tcIm1ha2VQaW5uZWRIaXN0b3J5VG9waWNcIiwgWyRo4oCNX2EgPT4gKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICogQHJldHVybnMge1N1YnNjcmlwdGlvbjxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbj0odG9waWMpPT57XG5jb25zdCBzdWJzY3JpcHRpb249RmFyKCdTdWJzY3JpcHRpb24nLHtcbi4uLnN1YnNjcmliZUVhY2godG9waWMpLFxuc3Vic2NyaWJlQWZ0ZXI6YXN5bmMocHVibGlzaENvdW50KT0+RSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgU3Vic2NyaXB0aW9uIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBTdWJzY3JpcHRpb24gdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZVN1YnNjcmlwdGlvbmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBTdWJzY3JpcHRpb24gYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczphc3luYygpPT50b3BpYyxcblxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7c3Vic2NyaXB0aW9ufSl9KTtcblxucmV0dXJuIHN1YnNjcmlwdGlvbjtcbiB9OyRo4oCNX29uY2UubWFrZVN1YnNjcmlwdGlvbihtYWtlU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uKTtcblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFByb2R1Y2VycyBzaG91bGQgdXNlXG4gKiBgYGBqc1xuICogY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VQdWJsaXNoS2l0KCk7XG4gKiBjb25zdCB0b3BpYyA9IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG4gKiBgYGBcbiAqIGluc3RlYWQsIHdoaWNoIG1ha2VzIGl0IGNsZWFyZXIgdGhhdCBhbGwgdGhlIHN1YnNjcmliZXIncyBoaXN0b3J5IGlzXG4gKiByZXRhaW5lZCwgcHJldmVudGluZyBHQy4gIFBvdGVudGlhbGx5IHJlbW90ZSBjb25zdW1lcnMgdXNlXG4gKiBgYGBqc1xuICogZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBzdWJzY3JpYmVFYWNoKHRvcGljKSkgeyAuLi4gfVxuICogYGBgXG4gKlxuICogTWFrZXMgYSBgeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH1gIGZvciBkb2luZyBsb3NzbGVzcyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb25SZWNvcmQ8VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb25LaXQ9KCk9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG4vKiBUaGUgcHVibGlzaCBraXQgc3Vic2NyaWJlciBpcyBwcmVmaXgtbG9zc3ksIHNvIG1ha2luZyAqdGhpcyogc3Vic2NyaWJlciBjb21wbGV0ZWx5Ki9cbi8qIGxvc3NsZXNzIGZyb20gaW5pdGlhbGlzYXRpb24gcmVxdWlyZXMgcGlubmluZyB0aGUgZm9ybWVyJ3MgaGlzdG9yeS4qL1xuXG5jb25zdCBwaW5uZWRIaXN0b3J5VG9waWM9bWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhzdWJzY3JpYmVyKTtcbmNvbnN0IHN1YnNjcmlwdGlvbj1tYWtlU3Vic2NyaXB0aW9uKHBpbm5lZEhpc3RvcnlUb3BpYyk7XG5cbi8qKiBAdHlwZSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59ICovXG5jb25zdCBwdWJsaWNhdGlvbj1GYXIoJ3B1YmxpY2F0aW9uJyx7XG51cGRhdGVTdGF0ZToobm9uRmluYWxWYWx1ZSk9PnB1Ymxpc2hlci5wdWJsaXNoKG5vbkZpbmFsVmFsdWUpLFxuZmluaXNoOihjb21wbGV0aW9uKT0+cHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbmZhaWw6KHJlYXNvbik9PnB1Ymxpc2hlci5mYWlsKHJlYXNvbil9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtwdWJsaWNhdGlvbixzdWJzY3JpcHRpb259KTtcbiB9OyRo4oCNX29uY2UubWFrZVN1YnNjcmlwdGlvbktpdChtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3Vic2NyaXB0aW9uIjpbIm1ha2VTdWJzY3JpcHRpb24iXSwibWFrZVN1YnNjcmlwdGlvbktpdCI6WyJtYWtlU3Vic2NyaXB0aW9uS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACGBFnIMBgAADAYAACQAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdG9waWMuanN7ImltcG9ydHMiOlsiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgQSBwaW5uZWQtaGlzdG9yeSB0b3BpYyBwcmVzZXJ2ZXMgYWxsIG9mIGl0cyBwdWJsaXNoZWQgdmFsdWVzIGluXG4gKiBtZW1vcnkuICBVc2UgYSBwcmVmaXgtbG9zc3kgbWFrZVB1Ymxpc2hLaXQgaW5zdGVhZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFYWNoVG9waWM8VD4gJiBMYXRlc3RUb3BpYzxUPn0gdG9waWMgbmVlZHMgdG8gYmUgbmVhciBpbiBvcmRlciB0b1xuICogcHJlc2VydmUgc3Vic2NyaXB0aW9uIHRpbWluZ3MuICBUT0RPOiBkcm9wIExhdGVzdFRvcGljPFQ+IHJlcXVpcmVtZW50XG4gKiBAcmV0dXJucyB7RWFjaFRvcGljPFQ+ICYgTGF0ZXN0VG9waWM8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUGlubmVkSGlzdG9yeVRvcGljPSh0b3BpYyk9Pntcbi8qIFN1Y2ggbG9zc2xlc3NuZXNzIGluaGliaXRzIEdDLCB3aGljaCBpcyB3aHkgd2UncmUgbW92aW5nIGF3YXkgZnJvbSBpdC4qL1xuXG4vKiBXZSBuZWVkIHRvIHRha2UgYW4gaW1tZWRpYXRlIHNuYXBzaG90IG9mIHRoZSB0b3BpYydzIGN1cnJlbnQgc3RhdGUuKi9cbmNvbnN0IHBpbm5lZFB1Ykxpc3Q9dG9waWMuc3Vic2NyaWJlQWZ0ZXIoKTtcblxucmV0dXJuIEZhcignUGlubmVkSGlzdG9yeVRvcGljJyx7XG5zdWJzY3JpYmVBZnRlcjphc3luYyhwdWJsaXNoQ291bnQ9LTFuKT0+e1xuaWYocHVibGlzaENvdW50PT09LTFuKXtcbnJldHVybiBwaW5uZWRQdWJMaXN0O1xuIH1cbnJldHVybiB0b3BpYy5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuIH0sXG5nZXRVcGRhdGVTaW5jZTphc3luYyh1cGRhdGVDb3VudD11bmRlZmluZWQpPT57XG4vKiBUT0RPOiBCdWlsZCB0aGlzIG91dCBvZiBFYWNoVG9waWM8VD4uKi9cbnJldHVybiB0b3BpYy5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VQaW5uZWRIaXN0b3J5VG9waWMobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG5oYXJkZW4obWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPhRDxM/MAAAPzAAACwAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxUPn0gRVJlZlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wcm9taXNlLWtpdCcpLlByb21pc2VLaXQ8VD59IFByb21pc2VLaXRcbiAqL1xuXG4vKipcbiAqIERlcHJlY2F0ZWQuIFVzZSBQcm9taXNlS2l0IGluc3RlYWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wcm9taXNlLWtpdCcpLlByb21pc2VSZWNvcmQ8VD59IFByb21pc2VSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgW1RSZXR1cm49YW55XVxuICogQHRlbXBsYXRlIFtUTmV4dD11bmRlZmluZWRdXG4gKiBAdHlwZWRlZiB7QXN5bmNJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD4gJiB7XG4gKiAgIGZvcmsoKTogRm9ya2FibGVBc3luY0l0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PlxuICogfX0gRm9ya2FibGVBc3luY0l0ZXJhdG9yIEFuIEFzeW5jSXRlcmF0b3IgdGhhdCBjYW4gYmUgZm9ya2VkIGF0IGEgZ2l2ZW4gcG9zaXRpb25cbiAqIGludG8gbXVsdGlwbGUgaW5kZXBlbmRlbnQgRm9ya2FibGVBc3luY0l0ZXJhdG9ycyBzdGFydGluZyBmcm9tIHRoYXQgcG9zaXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtUUmV0dXJuPWFueV1cbiAqIEB0ZW1wbGF0ZSBbVE5leHQ9dW5kZWZpbmVkXVxuICogQHR5cGVkZWYge3sgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+IH19IEFzeW5jSXRlcmFibGVPbmx5XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtUUmV0dXJuPWFueV1cbiAqIEB0ZW1wbGF0ZSBbVE5leHQ9dW5kZWZpbmVkXVxuICogQHR5cGVkZWYge3tcbiAqICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD4sXG4gKiAgIGZvcmsoKTogRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+IH0gJlxuICogICBGb3JrYWJsZUFzeW5jSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+XG4gKiB9IEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtUUmV0dXJuPWFueV1cbiAqIEB0ZW1wbGF0ZSBbVE5leHQ9dW5kZWZpbmVkXVxuICogQHR5cGVkZWYge3tcbiAqICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gRm9ya2FibGVBc3luY0l0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PlxuICogfX0gRm9ya2FibGVBc3luY0l0ZXJhYmxlXG4gKiBBbiBBc3luY0l0ZXJhYmxlIHRoYXQgcHJvZHVjZXMgRm9ya2FibGVBc3luY0l0ZXJhdG9ycy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJdGVyYXRpb25PYnNlcnZlcjxUPlxuICogQSB2YWxpZCBzZXF1ZW5jZSBvZiBjYWxscyB0byB0aGUgbWV0aG9kcyBvZiBhbiBgSXRlcmF0aW9uT2JzZXJ2ZXJgXG4gKiByZXByZXNlbnRzIGFuIGl0ZXJhdGlvbi4gQSB2YWxpZCBzZXF1ZW5jZSBjb25zaXN0cyBvZiBhbnkgbnVtYmVyIG9mIGNhbGxzXG4gKiB0byBgdXBkYXRlU3RhdGVgIHdpdGggdGhlIHN1Y2Nlc3NpdmUgbm9uLWZpbmFsIHZhbHVlcywgZm9sbG93ZWQgYnkgYVxuICogZmluYWwgY2FsbCB0byBlaXRoZXIgYGZpbmlzaGAgd2l0aCBhIHN1Y2Nlc3NmdWwgYGNvbXBsZXRpb25gIHZhbHVlXG4gKiBvciBgZmFpbGAgd2l0aCB0aGUgYWxsZWdlZCBgcmVhc29uYCBmb3IgZmFpbHVyZS4gQWZ0ZXIgYXQgbW9zdCBvbmVcbiAqIHRlcm1pbmF0aW5nIGNhbGxzLCBubyBmdXJ0aGVyIGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYXJlIHZhbGlkIGFuZCBtdXN0IGJlXG4gKiByZWplY3RlZC5cbiAqIEBwcm9wZXJ0eSB7KG5vbkZpbmFsVmFsdWU6IFQpID0+IHZvaWR9IHVwZGF0ZVN0YXRlXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBUKSA9PiB2b2lkfSBmaW5pc2hcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogdW5rbm93bikgPT4gdm9pZH0gZmFpbFxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGljYXRpb25SZWNvcmRcbiAqIFdpbGwgYmUgc2hhcmVkIGJldHdlZW4gbWFjaGluZXMsIHNvIGl0IG11c3QgYmUgc2FmZSB0byBleHBvc2UuIEJ1dCBzb2Z0d2FyZVxuICogb3V0c2lkZSB0aGUgY3VycmVudCBwYWNrYWdlIHNob3VsZCBjb25zaWRlciBpdCBvcGFxdWUsIG5vdCBkZXBlbmRpbmcgb24gaXRzXG4gKiBpbnRlcm5hbCBzdHJ1Y3R1cmUuXG4gKiBAcHJvcGVydHkge0l0ZXJhdG9yUmVzdWx0PFQ+fSBoZWFkXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gcHVibGlzaENvdW50IHN0YXJ0cyBhdCAxIGZvciB0aGUgZmlyc3QgcmVzdWx0XG4gKiAgIGFuZCBhZHZhbmNlcyBieSAxIGZvciBlYWNoIHN1YnNlcXVlbnQgcmVzdWx0XG4gKiBAcHJvcGVydHkge1Byb21pc2U8UHVibGljYXRpb25SZWNvcmQ8VD4+fSB0YWlsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gRWFjaFRvcGljXG4gKiBAcHJvcGVydHkgeyhwdWJsaXNoQ291bnQ/OiBiaWdpbnQpID0+IFByb21pc2U8UHVibGljYXRpb25SZWNvcmQ8VD4+fSBzdWJzY3JpYmVBZnRlclxuICogUmV0dXJucyBhIHByb21pc2UgZm9yIGEgXCJjdXJyZW50XCIgUHVibGljYXRpb25SZWNvcmQgKHJlZmVyZW5jaW5nIGl0c1xuICogaW1tZWRpYXRlIHN1Y2Nlc3NvciB2aWEgYSBgdGFpbGAgcHJvbWlzZSkgdGhhdCBpcyBsYXRlciB0aGFuIHRoZVxuICogcHJvdmlkZWQgcHVibGlzaENvdW50LlxuICogVXNlZCB0byBtYWtlIGZvcndhcmQtbG9zc2xlc3MgKFwiZWFjaFwiKSBpdGVyYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0ZvcmthYmxlQXN5bmNJdGVyYWJsZTxULCBUPiAmIEVhY2hUb3BpYzxUPn0gSXRlcmFibGVFYWNoVG9waWNcbiAqIEFuIEVhY2hUb3BpYyB3aXRoIGRlZmF1bHQgYXN5bmNJdGVyYWJsZSBiZWhhdmlvdXIuXG4gKlxuICogTk9URTogdGhlIHB1YmxpY2F0aW9uIHJlY29yZHMgYW5kIGl0ZXJhdG9ycyByZXR1cm5lZCBieSB0aGlzIG9iamVjdCBhcmVcbiAqIGVwaGVtZXJhbCBhbmQgd2lsbCBiZSBzZXZlcmVkIGR1cmluZyB1cGdyYWRlLiAgQSBjYWxsZXIgc2hvdWxkIHVzZVxuICogYHN1YnNjcmliZUVhY2hgIHRvIHdyYXAgdGhpcyB0b3BpYyBpbiBhIGxvY2FsIGl0ZXJhYmxlIHdoaWNoIGF1dG9tYXRpY2FsbHlcbiAqIGF0dGVtcHRzIHRvIHJlY29ubmVjdCB1cG9uIGJlaW5nIHNldmVyZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0FzeW5jSXRlcmFibGVPbmx5PFQsIFQ+ICYgTGF0ZXN0VG9waWM8VD59IEl0ZXJhYmxlTGF0ZXN0VG9waWNcbiAqIEEgTGF0ZXN0VG9waWMgd2l0aCBkZWZhdWx0IGFzeW5jSXRlcmFibGUgYmVoYXZpb3VyLlxuICpcbiAqIE5PVEU6IHRoZSBpdGVyYXRvcnMgcmV0dXJuZWQgYnkgdGhpcyBvYmplY3QgYXJlIGVwaGVtZXJhbCBhbmQgd2lsbCBiZSBzZXZlcmVkXG4gKiBkdXJpbmcgdXBncmFkZS4gIEEgY2FsbGVyIHNob3VsZCB1c2UgYHN1YnNjcmliZUxhdGVzdGAgdG8gd3JhcCB0aGlzIHRvcGljIGluXG4gKiBhIGxvY2FsIGl0ZXJhYmxlIHdoaWNoIGF1dG9tYXRpY2FsbHkgYXR0ZW1wdHMgdG8gcmVjb25uZWN0IHVwb24gYmVpbmdcbiAqIHNldmVyZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTGF0ZXN0VG9waWNcbiAqIEBwcm9wZXJ0eSB7KHVwZGF0ZUNvdW50PzogYmlnaW50IHwgbnVtYmVyKSA9PiBQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59IGdldFVwZGF0ZVNpbmNlXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gdXBkYXRlIHJlY29yZCBhcyBvZiBhbiB1cGRhdGUgY291bnQuXG4gKiBJZiB0aGUgYHVwZGF0ZUNvdW50YCBhcmd1bWVudCBpcyBvbWl0dGVkIG9yIGRpZmZlcnMgZnJvbSB0aGUgY3VycmVudCB1cGRhdGUgY291bnQsXG4gKiB0aGUgcHJvbWlzZSBwcm9tcHRseSByZXNvbHZlcyB0byB0aGUgY3VycmVudCByZWNvcmQuXG4gKiBPdGhlcndpc2UsIGFmdGVyIHRoZSBuZXh0IHN0YXRlIGNoYW5nZSwgdGhlIHByb21pc2UgcmVzb2x2ZXMgdG8gdGhlIHJlc3VsdGluZyByZWNvcmQuXG4gKiBUaGlzIGlzIGFuIGF0dGVudWF0ZWQgZm9ybSBvZiBgc3Vic2NyaWJlQWZ0ZXJgIHdob3NlIHJldHVybiB2YWx1ZSBzdGFuZHMgYWxvbmUgYW5kXG4gKiBkb2VzIG5vdCBhbGxvdyBjb25zdW1lcnMgdG8gcGluIGEgY2hhaW4gb2YgaGlzdG9yaWNhbCBQdWJsaWNhdGlvblJlY29yZHMuXG4gKiBVc2VkIHRvIG1ha2UgbG9zc3kgKFwibGF0ZXN0XCIpIGl0ZXJhdG9ycy5cbiAqIE5PVEU6IFVzZSBvZiBgbnVtYmVyYCBhcyBhbiBgdXBkYXRlQ291bnRgIGlzIGRlcHJlY2F0ZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0xhdGVzdFRvcGljPFQ+fSBCYXNlTm90aWZpZXIgVGhpcyB0eXBlIGlzIGRlcHJlY2F0ZWQgYnV0IGlzIHN0aWxsXG4gKiB1c2VkIGV4dGVybmFsbHkuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0xhdGVzdFRvcGljPFQ+ICYgRWFjaFRvcGljPFQ+fSBTdWJzY3JpYmVyXG4gKiBBIHN0cmVhbSBvZiByZXN1bHRzIHRoYXQgYWxsb3dzIGNvbnN1bWVycyB0byBjb25maWd1cmVcbiAqIGZvcndhcmQtbG9zc2xlc3MgXCJlYWNoXCIgaXRlcmF0aW9uIHdpdGggYHN1YnNjcmliZUVhY2hgIGFuZFxuICogbG9zc3kgXCJsYXRlc3RcIiBpdGVyYXRpb24gd2l0aCBgc3Vic2NyaWJlTGF0ZXN0YC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaXNoZXJcbiAqIEEgdmFsaWQgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gdGhlIG1ldGhvZHMgb2YgYW4gYEl0ZXJhdGlvbk9ic2VydmVyYFxuICogcmVwcmVzZW50cyBhbiBpdGVyYXRpb24uIEEgdmFsaWQgc2VxdWVuY2UgY29uc2lzdHMgb2YgYW55IG51bWJlciBvZiBjYWxsc1xuICogdG8gYHB1Ymxpc2hgIHdpdGggdGhlIHN1Y2Nlc3NpdmUgbm9uLWZpbmFsIHZhbHVlcywgZm9sbG93ZWQgYnkgYVxuICogZmluYWwgY2FsbCB0byBlaXRoZXIgYGZpbmlzaGAgd2l0aCBhIHN1Y2Nlc3NmdWwgYGNvbXBsZXRpb25gIHZhbHVlXG4gKiBvciBgZmFpbGAgd2l0aCB0aGUgYWxsZWdlZCBgcmVhc29uYCBmb3IgZmFpbHVyZS4gQWZ0ZXIgYXQgbW9zdCBvbmVcbiAqIHRlcm1pbmF0aW5nIGNhbGxzLCBubyBmdXJ0aGVyIGNhbGxzIHRvIHRoZXNlIG1ldGhvZHMgYXJlIHZhbGlkIGFuZCBtdXN0IGJlXG4gKiByZWplY3RlZC5cbiAqIEBwcm9wZXJ0eSB7KG5vbkZpbmFsVmFsdWU6IFQpID0+IHZvaWR9IHB1Ymxpc2hcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IFQpID0+IHZvaWR9IGZpbmlzaFxuICogQHByb3BlcnR5IHsocmVhc29uOiBhbnkpID0+IHZvaWR9IGZhaWxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7UGFydGlhbDxQdWJsaXNoZXI8VD4+fSBQdWJsaXNoT2JzZXJ2ZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaXNoS2l0PFQ+XG4gKiBAcHJvcGVydHkge1B1Ymxpc2hlcjxUPn0gcHVibGlzaGVyXG4gKiBAcHJvcGVydHkge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRQdWJsaXNoS2l0PFQ+XG4gKiBAcHJvcGVydHkge1B1Ymxpc2hlcjxUPn0gcHVibGlzaGVyXG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYgeydtYW5kYXRvcnknIHwgJ29wcG9ydHVuaXN0aWMnIHwgJ2lnbm9yZWQnfSBEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eVxuICpcbiAqIER1cmFiaWxpdHkgY29uZmlndXJlcyBjb25zdHJhaW50cyBvbiBub24tdGVybWluYWwgdmFsdWVzIHRoYXQgY2FuIGJlXG4gKiBwdWJsaXNoZWQgdG8gYSBkdXJhYmxlIHB1Ymxpc2gga2l0ICh0ZXJtaW5hbCB2YWx1ZXMgc2VudCB0byBmaW5pc2ggb3IgZmFpbFxuICogbXVzdCBhbHdheXMgYmUgZHVyYWJsZSkuXG4gKiAtICdtYW5kYXRvcnknIG1lYW5zIHRoYXQgZWFjaCB2YWx1ZSBtdXN0IGJlIGR1cmFibGUsIHNvIGl0IGNhbiBiZSByZXN0b3JlZFxuICogICBvbiB1cGdyYWRlLlxuICogLSAnb3Bwb3J0dW5pc3RpYycgbWVhbnMgdGhhdCBhIGR1cmFibGUgdmFsdWUgaXMgcGVyc2lzdGVkIGZvciBwb3N0LXVwZ3JhZGVcbiAqICAgcmVzdG9yYXRpb24sIGJ1dCBhIG5vbi1kdXJhYmxlIHZhbHVlIGlzIHN0aWxsIGFjY2VwdGVkIChhbmQgd2lsbCByZXN1bHQgaW5cbiAqICAgdmFsdWVsZXNzIHJlc3RvcmF0aW9uKS5cbiAqIC0gJ2lnbm9yZWQnIG1lYW5zIHRoYXQgYSB2YWx1ZSBpcyBub3QgcGVyc2lzdGVkIGZvciByZXN0b3JhdGlvbiBldmVuIGlmIGl0XG4gKiAgIGlzIGR1cmFibGUuXG4gKlxuICogJ21hbmRhdG9yeScgaXMgdGhlIG9ubHkgY3VycmVudGx5LXN1cHBvcnRlZCB2YWx1ZSwgYW5kIG90aGVycyBtdXN0IG5vdCBiZVxuICogZW5hYmxlZCB3aXRob3V0IHRlc3QgY292ZXJhZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEdXJhYmxlUHVibGlzaEtpdFN0YXRlXG4gKlxuICogQHByb3BlcnR5IHtEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eX0gdmFsdWVEdXJhYmlsaXR5XG4gKlxuICogQHByb3BlcnR5IHtiaWdpbnR9IHB1Ymxpc2hDb3VudFxuICpcbiAqIEBwcm9wZXJ0eSB7J2xpdmUnIHwgJ2ZpbmlzaGVkJyB8ICdmYWlsZWQnfSBzdGF0dXNcbiAqXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGhhc1ZhbHVlXG4gKiBoYXNWYWx1ZSBpbmRpY2F0ZXMgdGhlIHByZXNlbmNlIG9mIHZhbHVlLiBJdCBzdGFydHMgb2ZmIGZhbHNlLFxuICogYW5kIGNhbiBiZSByZXNldCB0byBmYWxzZSB3aGVuIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCBpcyByZXN0b3JlZCBhbmRcbiAqIHRoZSBwcmV2aW91cyB2YWx1ZSB3YXMgbm90IGR1cmFibGUsIG9yIG5vbi10ZXJtaW5hbCBhbmQgdmFsdWVEdXJhYmxpdHkgaXMgJ2lnbm9yZWQnLlxuICpcbiAqIEBwcm9wZXJ0eSB7YW55fSB2YWx1ZVxuICogdmFsdWUgaG9sZHMgZWl0aGVyIGEgbm9uLXRlcm1pbmFsIHZhbHVlIGZyb20gYHB1Ymxpc2hgIG9yIGEgdGVybWluYWwgdmFsdWVcbiAqIGZyb20gYGZpbmlzaGAgb3IgYGZhaWxgLCBkZXBlbmRpbmcgdXBvbiB0aGUgdmFsdWUgaW4gc3RhdHVzLlxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gVXBkYXRlUmVjb3JkPFQ+XG4gKiBAcHJvcGVydHkge1R9IHZhbHVlIGlzIHdoYXRldmVyIHN0YXRlIHRoZSBzZXJ2aWNlIHdhbnRzIHRvIHB1Ymxpc2hcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBbdXBkYXRlQ291bnRdIGlzIGEgdmFsdWUgdGhhdCBpZGVudGlmaWVzIHRoZSB1cGRhdGUuICBGb3JcbiAqIHRoZSBsYXN0IHVwZGF0ZSwgaXQgaXMgYHVuZGVmaW5lZGAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0Jhc2VOb3RpZmllcjxUPn0gTm90aWZpZXJJbnRlcm5hbHMgV2lsbCBiZSBzaGFyZWQgYmV0d2VlbiBtYWNoaW5lcyxcbiAqIHNvIGl0IG11c3QgYmUgc2FmZSB0byBleHBvc2UuIEJ1dCBvdGhlciBzb2Z0d2FyZSBzaG91bGQgYXZvaWQgZGVwZW5kaW5nIG9uXG4gKiBpdHMgaW50ZXJuYWwgc3RydWN0dXJlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtOb3RpZmllckludGVybmFsczxUPiAmXG4gKiAgIEZvcmthYmxlQXN5bmNJdGVyYWJsZTxULCBUPiAmXG4gKiAgIFNoYXJhYmxlTm90aWZpZXI8VD5cbiAqIH0gTm90aWZpZXI8VD4gYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IHRoZSBjdXJyZW50IHN0YXRlIG9yIHVwZGF0ZXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaGFyYWJsZU5vdGlmaWVyXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Tm90aWZpZXJJbnRlcm5hbHM8VD4+fSBnZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzXG4gKiBVc2VkIHRvIHJlcGxpY2F0ZSB0aGUgbXVsdGljYXN0IHZhbHVlcyBhdCBvdGhlciBzaXRlcy4gVG8gbWFudWFsbHkgY3JlYXRlIGFcbiAqIGxvY2FsIHJlcHJlc2VudGF0aXZlIG9mIGEgTm90aWZpY2F0aW9uLCBkb1xuICogYGBganNcbiAqIGxvY2FsSXRlcmFibGUgPVxuICogICBtYWtlTm90aWZpZXIoRShyZW1vdGVJdGVyYWJsZSkuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFscygpKTtcbiAqIGBgYFxuICogVGhlIHJlc3VsdGluZyBgbG9jYWxJdGVyYWJsZWAgYWxzbyBzdXBwb3J0cyBzdWNoIHJlbW90ZSB1c2UsIGFuZFxuICogd2lsbCByZXR1cm4gYWNjZXNzIHRvIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vdGlmaWVyUmVjb3JkPFQ+IHRoZSBwcm9kdWNlZCBub3RpZmllci91cGRhdGVyIHBhaXJcbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHVwZGF0ZXIgdGhlIChjbG9zZWx5LWhlbGQpIG5vdGlmaWVyIHByb2R1Y2VyXG4gKiBAcHJvcGVydHkge05vdGlmaWVyPFQ+fSBub3RpZmllciB0aGUgKHdpZGVseS1oZWxkKSBub3RpZmllciBjb25zdW1lclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0l0ZXJhYmxlRWFjaFRvcGljPFQ+ICYgRWFjaFRvcGljPFQ+ICZcbiAqICAgU2hhcmFibGVTdWJzY3JpcHRpb248VD59IFN1YnNjcmlwdGlvbjxUPlxuICogQSBmb3JtIG9mIEFzeW5jSXRlcmFibGUgc3VwcG9ydGluZyBkaXN0cmlidXRlZCBhbmQgbXVsdGljYXN0IHVzYWdlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNoYXJhYmxlU3Vic2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8RWFjaFRvcGljPFQ+Pn0gZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBTdWJzY3JpcHRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VTdWJzY3JpcHRpb24oRShyZW1vdGVJdGVyYWJsZSkuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdWJzY3JpcHRpb25SZWNvcmQ8VD5cbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHB1YmxpY2F0aW9uXG4gKiBAcHJvcGVydHkge1N1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaXB0aW9uXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHRlbXBsYXRlIFtTbG90PXVua25vd25dIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuTWFyc2hhbDxTbG90Pn0gTWFyc2hhbGxlciAqL1xuLyoqIEB0eXBlZGVmIHtQaWNrPE1hcnNoYWxsZXIsICdmcm9tQ2FwRGF0YSc+fSBVbnNlcmlhbGl6ZXIgKi9cblxuLyoqXG4gKiBEZWZpbmVkIGJ5IHZzdG9yYWdlU3RvcmVLZXkgaW4gdnN0b3JhZ2UuZ29cbiAqXG4gKiBAdHlwZWRlZiBWU3RvcmFnZUtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlU3Via2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YVByZWZpeEJ5dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vRGF0YVZhbHVlXVxuICovXG5cbi8qKlxuICogVGhpcyByZXByZXNlbnRzIGEgbm9kZSBpbiBhbiBJQVZMIHRyZWUuXG4gKlxuICogVGhlIGFjdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB4L3ZzdG9yYWdlLCBhbiBBZ29yaWMgZXh0ZW5zaW9uIG9mIHRoZSBDb3Ntb3MgU0RLLlxuICpcbiAqIFZzdG9yYWdlIGlzIGEgaGllcmFyY2hpY2FsIGV4dGVybmFsbHktcmVhY2hhYmxlIHN0b3JhZ2Ugc3RydWN0dXJlIHRoYXRcbiAqIGlkZW50aWZpZXMgY2hpbGRyZW4gYnkgcmVzdHJpY3RlZCBBU0NJSSBuYW1lIGFuZCBpcyBhc3NvY2lhdGVkIHdpdGggYXJiaXRyYXJ5XG4gKiBzdHJpbmctdmFsdWVkIGRhdGEgZm9yIGVhY2ggbm9kZSwgZGVmYXVsdGluZyB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JhZ2VOb2RlXG4gKiBAcHJvcGVydHkgeyhkYXRhOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD59IHNldFZhbHVlIHB1Ymxpc2hlcyBzb21lIGRhdGEgKGFwcGVuZCB0byB0aGUgbm9kZSlcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeyhzdWJQYXRoOiBzdHJpbmcsIG9wdGlvbnM/OiB7c2VxdWVuY2U/OiBib29sZWFufSkgPT4gU3RvcmFnZU5vZGV9IG1ha2VDaGlsZE5vZGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZEZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8c3RyaW5nPn0gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHtTdG9yYWdlTm9kZVsnZ2V0U3RvcmVLZXknXX0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoKSA9PiBVbnNlcmlhbGl6ZXJ9IGdldFVuc2VyaWFsaXplciBnZXQgdGhlIHVuc2VyaWFsaXplciBmb3IgdGhlIHN0b3JlZCBkYXRhXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgU3RvcmVkU3Vic2NyaWJlclxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtTdWJzY3JpcHRpb248VD4gJiB7XG4gKiAgIGdldFN0b3JlS2V5OiAoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5ICYgeyBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjxUPiB9PixcbiAqICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiBVbnNlcmlhbGl6ZXIsXG4gKiB9fSBTdG9yZWRTdWJzY3JpcHRpb25cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaWJlcjxUPiAmIFN0b3JlZEZhY2V0fSBTdG9yZWRTdWJzY3JpYmVyXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPmJcNlwBAABcAQAAIAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADEo+BIIwwAACMMAAAhAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLCJAZW5kby9leG8iLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiLCJpc0NvcHlNYXAiLCJpc0NvcHlNYXAiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbXV0sW1wiQGVuZG8vZXhvXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qc1wiLCBbXV0sW1wiLi9sZWdhY3kvbGVnYWN5TWFwLmpzXCIsIFtdXSxbXCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBlbmRvL3BhdHRlcm5zIjpbWyJpc0tleSIsImlzS2V5Il0sWyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiXSxbImFzc2VydFNjYWxhcktleSIsImFzc2VydFNjYWxhcktleSJdLFsibWFrZUNvcHlTZXQiLCJtYWtlQ29weVNldCJdLFsiZ2V0Q29weVNldEtleXMiLCJnZXRDb3B5U2V0S2V5cyJdLFsibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZyJdLFsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLFsiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5QmFnRW50cmllcyJdLFsibWFrZUNvcHlNYXAiLCJtYWtlQ29weU1hcCJdLFsiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyJdLFsiY29lcmNlVG9FbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiXSxbImNvZXJjZVRvQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyJdLFsiY29tcGFyZUtleXMiLCJjb21wYXJlS2V5cyJdLFsia2V5TFQiLCJrZXlMVCJdLFsia2V5TFRFIiwia2V5TFRFIl0sWyJrZXlFUSIsImtleUVRIl0sWyJrZXlHVEUiLCJrZXlHVEUiXSxbImtleUdUIiwia2V5R1QiXSxbImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzSXNTdXBlcnNldCJdLFsiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50Il0sWyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0NvbXBhcmUiXSxbImVsZW1lbnRzVW5pb24iLCJlbGVtZW50c1VuaW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSxbImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSxbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLFsic2V0SXNTdXBlcnNldCIsInNldElzU3VwZXJzZXQiXSxbInNldElzRGlzam9pbnQiLCJzZXRJc0Rpc2pvaW50Il0sWyJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSJdLFsic2V0VW5pb24iLCJzZXRVbmlvbiJdLFsic2V0RGlzam9pbnRVbmlvbiIsInNldERpc2pvaW50VW5pb24iXSxbInNldEludGVyc2VjdGlvbiIsInNldEludGVyc2VjdGlvbiJdLFsic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50U3VidHJhY3QiXSxbImJhZ0lzU3VwZXJiYWciLCJiYWdJc1N1cGVyYmFnIl0sWyJiYWdDb21wYXJlIiwiYmFnQ29tcGFyZSJdLFsiYmFnVW5pb24iLCJiYWdVbmlvbiJdLFsiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSW50ZXJzZWN0aW9uIl0sWyJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnRGlzam9pbnRTdWJ0cmFjdCJdLFsiTSIsIk0iXSxbImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciJdLFsiaXNQYXR0ZXJuIiwiaXNQYXR0ZXJuIl0sWyJhc3NlcnRQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiJdLFsibWF0Y2hlcyIsIm1hdGNoZXMiXSxbIm11c3RNYXRjaCIsIm11c3RNYXRjaCJdXSwiQGVuZG8vZXhvIjpbWyJpbml0RW1wdHkiLCJpbml0RW1wdHkiXSxbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiXSxbImRlZmluZUV4b0NsYXNzS2l0IiwiZGVmaW5lRXhvQ2xhc3NLaXQiXSxbIm1ha2VFeG8iLCJtYWtlRXhvIl1dLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6W1sibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6W1sibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6W1sicHJvdmlkZUxhenkiLCJwcm92aWRlTGF6eSJdLFsiaXNDb3B5TWFwIiwiaXNDb3B5TWFwIl0sWyJpc0NvcHlTZXQiLCJpc0NvcHlTZXQiXV0sIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyI6W1sibWFrZUxlZ2FjeU1hcCIsIm1ha2VMZWdhY3lNYXAiXV0sIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOltbIm1ha2VMZWdhY3lXZWFrTWFwIiwibWFrZUxlZ2FjeVdlYWtNYXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOKvgH1GCwAARgsAACwAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy5qcyIsIkBhZ29yaWMvYXNzZXJ0Il0sImV4cG9ydHMiOlsibWFrZUxlZ2FjeU1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBxLEZhaWw7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuXG4vKipcbiAqIFRoaXMgbW9kdWxlIGFuZCBpdHMgZnJhdGVybmFsIHNpYmxpbmcgbGVnYWN5V2Vha01hcCBleGlzdCBvbmx5IHRvXG4gKiBlYXNlIGEgdHJhbnNpdGlvbiB0byB0aGUgbW9kZXJuIGBzdG9yZWAgc3lzdGVtLCBhcmUgZGVwcmVjYXRlZCxcbiAqIGFuZCB3aWxsIGV2ZW50dWFsbHkgZGlzYXBwZWFyLiBUaGV5IGFyZSBuZWVkZWQgZm9yIG5vdyB0byBzdXBwb3J0XG4gKiBzb21lIG9mIHRoZSB1c2VzIG9mIHRoZSBvbGQgYmVoYXZpb3IgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aFxuICogdGhlIG5ldy4gVGhlIGNvbnN0cmFpbnQgaW1wb3NlZCBieSB0aGUgbmV3IGlzIHRoYXQgb25seSBwYXNzYWJsZXMgY2FuXG4gKiBiZSB1c2VkIGFzIHZhbHVlcywgYW5kIG9ubHkga2V5cyAocm91Z2hseSwgc3RydWN0dXJlcywgYWthIGNvbXBhcmFibGVzKVxuICogY2FuIGJlIHVzZWQgYXMgdmFsdWVzLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC8zNTY3XG4gKiBUT0RPIE9uY2UgdGhhdCBQUiBpcyBtZXJnZWQsIGxpbmsgdG8gdGhlIGRvY3VtZW50cyByYXRoZXIgdGhhbiB0aGUgUFJzLlxuICpcbiAqIEVhY2ggb2YgdGhlc2Ugbm9uLWNvbmZvcm1pbmcgdXNlcyBzaG91bGQgYmUgbWFya2VkIHdpdGggYVxuICogYGBganNcbiAqIC8vIExlZ2FjeSBiZWNhdXNlLi4uXG4gKiBgYGBcbiAqIGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgcHJvYmxlbSBpbmhpYml0aW5nIGNvbnZlcnNpb24gdG8gdGhlIG5ld1xuICogc3lzdGVtLiBTb21lIG9mIHRoZXNlIHByb2JsZW1zIGFzIG9mIHRoaXMgd3JpdGluZzpcbiAqICAgICogQSBwcm9taXNlS2l0IHVzZWQgYXMgYSB2YWx1ZSwgZXZlbiB0aG91Z2ggYSBwcm9taXNlS2l0IGlzIG5vdFxuICogICAgICBhIHBhc3NhYmxlLiBTb2x1dGlvbnMgYXJlIHRvIG1ha2UgaXQgYSBwYXNzYWJsZSwgb3IgdG8gY29udmVydFxuICogICAgICB0aGUgY29udGFpbmVyIGJhY2sgdG8gYSBjb252ZW50aW9uYWwgSmF2YVNjcmlwdCBNYXAuXG4gKiAgICAqIEEgbXV0YWJsZSBhcnJheSB1c2VkIGFzIGEgdmFsdWUsIHRoYXQgaXMgc3Vic2VxdWVudGx5IG11dGF0ZWQuXG4gKiAgICAgIEZyZWV6aW5nIHRoZSBhcnJheSB3b3VsZG4ndCB3b3JrIG9mIGNvdXJzZSBiZWNhdXNlIGl0IHdvdWxkIGJyZWFrXG4gKiAgICAgIHRoZSBzdWJzZXF1ZW50IG11dGF0aW9uLiBVc2luZyBhIGZhciBvYmplY3Qgd3JhcHBpbmcgYW4gYXJyYXkgd291bGRcbiAqICAgICAgbGlrZWx5IHdvcmsgZmluZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBzd2l0Y2ggdG8gU2NhbGFyTWFwIGlmIHBvc3NpYmxlLCBNYXAgb3RoZXJ3aXNlXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHJldHVybnMge0xlZ2FjeU1hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUxlZ2FjeU1hcD0odGFnPSdrZXknKT0+e1xuY29uc3QgbT1uZXcgTWFwKCk7XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIW0uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxubS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIG1hcC4qL1xucmV0dXJuIG0uaGFzKGtleSk7XG4gfSxcbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xubS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbnJldHVybiBtLmdldChrZXkpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xubS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbm0uZGVsZXRlKGtleSk7XG4gfSxcbmtleXM6KCk9Pm0ua2V5cygpLFxudmFsdWVzOigpPT5tLnZhbHVlcygpLFxuZW50cmllczooKT0+bS5lbnRyaWVzKCksXG5nZXRTaXplOigpPT5tLnNpemUsXG5jbGVhcjooKT0+bS5jbGVhcigpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUxlZ2FjeU1hcChtYWtlTGVnYWN5TWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5TWFwKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5TWFwIjpbIm1ha2VMZWdhY3lNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApoNNtMIGAADCBgAAMAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy5qcyIsIkBhZ29yaWMvYXNzZXJ0Il0sImV4cG9ydHMiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcSxGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cbi8qKlxuICogU2VlIGRvY2NvbW1lbnQgaW4gdGhlIGNsb3NlbHkgcmVsYXRlZCBgbGVnYWN5TWFwLmpzYCBtb2R1bGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhcldlYWtNYXAgaWYgcG9zc2libGUsIFdlYWtNYXAgb3RoZXJ3aXNlXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHJldHVybnMge0xlZ2FjeVdlYWtNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VMZWdhY3lXZWFrTWFwPSh0YWc9J2tleScpPT57XG4vKiogQHR5cGUge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59ICovXG5jb25zdCB3bT1uZXcgV2Vha01hcCgpO1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiF3bS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG53bS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIG1hcC4qL1xucmV0dXJuIHdtLmhhcyhrZXkpO1xuIH0sXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbndtLnNldChrZXksdmFsdWUpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xucmV0dXJuICgvKiogQHR5cGUge1Z9ICovd20uZ2V0KGtleSkpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xud20uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG53bS5kZWxldGUoa2V5KTtcbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUxlZ2FjeVdlYWtNYXAobWFrZUxlZ2FjeVdlYWtNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lXZWFrTWFwKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5V2Vha01hcCI6WyJtYWtlTGVnYWN5V2Vha01hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACaA7rXFhYAABYWAAAxAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyIuL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsYXNzZXJ0UGFzc2FibGUsZmlsdGVySXRlcmFibGUsbWFwSXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5TWFwLG1hdGNoZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4sbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRo4oCNX2EpXV0sW1wibWFwSXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKG1hcEl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5TWFwXCIsIFskaOKAjV9hID0+IChtYWtlQ29weU1hcCA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzXCIsIFskaOKAjV9hID0+IChtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7TWFwPEssVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXVxuICogQHJldHVybnMge01hcFN0b3JlPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFwU3RvcmVNZXRob2RzPShcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG50YWc9J2tleScpPT5cbntcbmNvbnN0e2Fzc2VydFVwZGF0ZU9uQWRkLGFzc2VydFVwZGF0ZU9uRGVsZXRlLGl0ZXJhYmxlS2V5c309XG5tYWtlQ3VycmVudEtleXNLaXQoXG4oKT0+anNtYXAua2V5cygpLFxuKGspPT5qc21hcC5oYXMoayksXG5jb21wYXJlUmFuayxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUsXG50YWcpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaXRlcmFibGVLZXlzO1xuIH1cbmNvbnN0IGZpbHRlcj0oayk9PntcbmlmKGtleVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGssa2V5UGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIFVzZXMgdGhlIGN1cnJlbnQganNtYXAgdmFsdWUsIHNpbmNlIHRoZSBpdGVyYXRhdG9yIHN1cnZpdmVzIGAuc2V0YCovXG5pZih2YWx1ZVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGpzbWFwLmdldChrKSx2YWx1ZVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xucmV0dXJuIGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cyxmaWx0ZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxWPn1cbiAqL1xuY29uc3QgdmFsdWVzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSwoayk9Pi8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoaykpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W0ssVl0+fVxuICovXG5jb25zdCBlbnRyaWVzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSwoayk9PltcbmssXG4vKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGspXSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG4uLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuLyoqIEB0eXBlIHsoazogSywgdjogVikgPT4gdm9pZH0gKi9hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxudGFnKSxcblxua2V5cyxcbnZhbHVlcyxcbmVudHJpZXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYWtlQ29weU1hcChlbnRyaWVzKGtleVBhdHQsdmFsdWVQYXR0KSksXG5cbmdldFNpemU6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZD9cbmpzbWFwLnNpemU6XG5bLi4ua2V5cyhrZXlQYXR0LHZhbHVlUGF0dCldLmxlbmd0aCxcblxuY2xlYXI6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQpe1xuanNtYXAuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpKXtcbmpzbWFwLmRlbGV0ZShrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhZGRpbmcgYSBuZXcga2V5IChpbml0KSBhbmQgdXBkYXRpbmcgb3JcbiAqIHJlZmVyZW5jaW5nIGEga2V5IChnZXQsIHNldCwgZGVsZXRlKS5cbiAqXG4gKiBgaW5pdGAgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gYEdldGAsXG4gKiBgc2V0YCBhbmQgYGRlbGV0ZWAgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogbWFwIGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVNYXBzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRoZSBjb2x1bW4gbmFtZSBmb3IgdGhlIGtleVxuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge01hcFN0b3JlPEssVj59XG4gKi8kaOKAjV9vbmNlLm1ha2VNYXBTdG9yZU1ldGhvZHMobWFrZU1hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhck1hcFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWQsdmFsdWVTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc21hcD1uZXcgTWFwKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHZhbHVlLHZhbHVlU2hhcGUsJ21hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCdtYXBTdG9yZSBrZXknKTtcbiB9XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIE1hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZU1hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhck1hcFN0b3JlKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhck1hcFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACdA5YgQQ8AAEEPAAAxAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsZmlsdGVySXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5U2V0LG1hdGNoZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4sbWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjigI1fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJhc3NlcnRTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge1NldDxLPn0ganNzZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IGFzc2VydEtleU9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge1NldFN0b3JlPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVNldFN0b3JlTWV0aG9kcz0oXG5qc3NldCxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0e2Fzc2VydFVwZGF0ZU9uQWRkLGFzc2VydFVwZGF0ZU9uRGVsZXRlLGl0ZXJhYmxlS2V5c309XG5tYWtlQ3VycmVudEtleXNLaXQoXG4oKT0+anNzZXQua2V5cygpLFxuKGspPT5qc3NldC5oYXMoayksXG5jb21wYXJlUmFuayxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlLFxua2V5TmFtZSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPEs+fVxuICovXG5jb25zdCBrZXlzPShrZXlQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZD9cbml0ZXJhYmxlS2V5czpcbmZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cywoayk9Pm1hdGNoZXMoayxrZXlQYXR0KSk7XG5cbnJldHVybiBoYXJkZW4oe1xuLi4ubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMoXG5qc3NldCxcbmFzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG5rZXlOYW1lKSxcblxuXG5rZXlzLFxuXG52YWx1ZXM6a2V5cyxcblxuc25hcHNob3Q6KGtleVBhdHQ9dW5kZWZpbmVkKT0+bWFrZUNvcHlTZXQoa2V5cyhrZXlQYXR0KSksXG5cbmdldFNpemU6KGtleVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkP2pzc2V0LnNpemU6Wy4uLmtleXMoa2V5UGF0dCldLmxlbmd0aCxcblxuY2xlYXI6KGtleVBhdHQ9dW5kZWZpbmVkKT0+e1xuaWYoa2V5UGF0dD09PXVuZGVmaW5lZCl7XG5qc3NldC5jbGVhcigpO1xuIH1cbmZvcihjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0KSl7XG5qc3NldC5kZWxldGUoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gYWRkaW5nIGEgbmV3IGtleSAoaW5pdCkgYW5kIHVwZGF0aW5nIG9yXG4gKiByZWZlcmVuY2luZyBhIGtleSAoZ2V0LCBzZXQsIGRlbGV0ZSkuXG4gKlxuICogYGluaXRgIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuIGBHZXRgLFxuICogYHNldGAgYW5kIGBkZWxldGVgIGFyZSBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIGFscmVhZHkgZXhpc3QuXG4gKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIHNldCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlU2V0cyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1NldFN0b3JlPEs+fVxuICovJGjigI1fb25jZS5tYWtlU2V0U3RvcmVNZXRob2RzKG1ha2VTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJTZXRTdG9yZT0oXG50YWc9J2tleScsXG57a2V5U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNzZXQ9bmV3IFNldCgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLZXlPa1RvQWRkPShrZXkpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xuXG5hc3NlcnRTY2FsYXJLZXkoa2V5KTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaChrZXksa2V5U2hhcGUsJ3NldFN0b3JlIGtleScpO1xuIH1cbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFNldFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVNldFN0b3JlTWV0aG9kcyhqc3NldCxhc3NlcnRLZXlPa1RvQWRkLHVuZGVmaW5lZCx0YWcpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhclNldFN0b3JlKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhclNldFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB+ReLJdxMAAHcTAAA1AAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiLi9zdG9yZS11dGlscy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsYXNzZXJ0UGFzc2FibGUscGFzc1N0eWxlT2YsZ2V0Q29weU1hcEVudHJpZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4saXNDb3B5TWFwOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiZ2V0Q29weU1hcEVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlNYXBFbnRyaWVzID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJpc0NvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKGlzQ29weU1hcCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge1dlYWtNYXBTdG9yZTxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuXG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxuanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiBqc21hcC5oYXMoa2V5KTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrZXkpKTtcbiB9LFxuXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbmFzc2VydEtWT2tUb0FkZChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNtYXAuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihlbnRyaWVzKT0+e1xuaWYodHlwZW9mIGVudHJpZXNbU3ltYm9sLml0ZXJhdG9yXSE9PSdmdW5jdGlvbicpe1xuaWYoT2JqZWN0LmlzRnJvemVuKGVudHJpZXMpJiZpc0NvcHlNYXAoZW50cmllcykpe1xuZW50cmllcz1nZXRDb3B5TWFwRW50cmllcyhlbnRyaWVzKTtcbiB9ZWxzZXtcbkZhaWwgYHByb3ZpZGVkIGRhdGEgc291cmNlIGlzIG5vdCBpdGVyYWJsZTogJHtlbnRyaWVzfWA7XG4gfVxuIH1cbmZvcihjb25zdFtrZXksdmFsdWVdb2YvKiogQHR5cGUge0l0ZXJhYmxlPFtLLCBWXT59ICovZW50cmllcyl7XG4vKiBEb24ndCBhc3NlcnQgdGhhdCB0aGUga2V5IGVpdGhlciBkb2VzIG9yIGRvZXMgbm90IGV4aXN0LiovXG5hc3NlcnRLVk9rVG9BZGQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBtYXBTdG9yZSBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXM6XG4gKiBwcmltaXRpdmVzIG9yIHJlbW90YWJsZXMuXG4gKiBPdGhlciBtYXBTdG9yZXMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrTWFwIGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrTWFwIGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0XG4gKiBpdCBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBtYXAuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGVcbiAqIHJlbW90YWJsZXMsIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgcmVhcHBlYXIuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrTWFwU3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZCx2YWx1ZVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzbWFwPW5ldyhsb25nTGl2ZWQ/V2Vha01hcDpNYXApKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHZhbHVlLHZhbHVlU2hhcGUsJ3dlYWtNYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrTWFwU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnd2Vha01hcFN0b3JlIGtleScpO1xuIH1cbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgV2Vha01hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUobWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOhKxGEPDwAADw8AADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixwYXNzU3R5bGVPZixnZXRDb3B5U2V0S2V5cyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlTZXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJpc0NvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKGlzQ29weVNldCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7V2Vha1NldDxLICYgb2JqZWN0Pn0ganNzZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IGFzc2VydEtleU9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzPShcbmpzc2V0LFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbmpzc2V0LmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgc2V0LiovXG5yZXR1cm4ganNzZXQuaGFzKGtleSk7XG4gfSxcblxuYWRkOihrZXkpPT57XG5hc3NlcnRLZXlPa1RvQWRkKGtleSk7XG5qc3NldC5hZGQoa2V5KTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmlmKGFzc2VydEtleU9rVG9EZWxldGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuIH1cbmpzc2V0LmRlbGV0ZShrZXkpO1xuIH0sXG5cbmFkZEFsbDooa2V5cyk9PntcbmlmKHR5cGVvZiBrZXlzW1N5bWJvbC5pdGVyYXRvcl0hPT0nZnVuY3Rpb24nKXtcbmlmKE9iamVjdC5pc0Zyb3plbihrZXlzKSYmaXNDb3B5U2V0KGtleXMpKXtcbmtleXM9Z2V0Q29weVNldEtleXMoa2V5cyk7XG4gfWVsc2V7XG5GYWlsIGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7a2V5c31gO1xuIH1cbiB9XG5mb3IoY29uc3Qga2V5IG9mLyoqIEB0eXBlIHtJdGVyYWJsZTxLPn0gKi9rZXlzKXtcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha1NldCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha1NldCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogc2V0LiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIGFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi8kaOKAjV9vbmNlLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyV2Vha1NldFN0b3JlPShcbnRhZz0na2V5Jyxcbntsb25nTGl2ZWQ9dHJ1ZSxrZXlTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc3NldD1uZXcobG9uZ0xpdmVkP1dlYWtTZXQ6U2V0KSgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLZXlPa1RvQWRkPShrZXkpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xucGFzc1N0eWxlT2Yoa2V5KT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha1N0b3JlczogJHtrZXl9YDtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaChrZXksa2V5U2hhcGUsJ3dlYWtTZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhqc3NldCxhc3NlcnRLZXlPa1RvQWRkLHVuZGVmaW5lZCx0YWcpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhcldlYWtTZXRTdG9yZShtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAstdjCJ0ZAACdGQAALgAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiYXBwZW5kVG9TdG9yZWRBcnJheSIsImlzQ29weU1hcCIsImlzQ29weVNldCIsIm1ha2VBdG9taWNQcm92aWRlciIsIm1ha2VDdXJyZW50S2V5c0tpdCIsInByb3ZpZGVMYXp5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixNLG1hdGNoZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBTaG91bGQgYmVoYXZlIGlkZW50aWNhbGx5IHRvIHRoZSBvbmUgaW4gYEBlbmRvL3BhdHRlcm5zYCwgYnV0XG4gKiByZWltcGxlbWVudGVkIGZvciBub3cgYmVjYXVzZSBgQGVuZG8vcGF0dGVybnNgIGZvcmdvdCB0byBleHBvcnQgdGhpcyBvbmUuXG4gKiBUaGlzIG9uZSBpcyBzaW1wbGUgZW5vdWdoIHRoYXQgSSBwcmVmZXIgYSByZWltcGxlbWVudGF0aW9uIHRvIGEgZGVlcCBpbXBvcnQuXG4gKiBUT0RPOiBVbmRhdGUgYEBlbmRvL3BhdHRlcm5zYCB0byBleHBvcnQgdGhlIG9yaWdpbmFsLCBhbmQgZGVsZXRlIHRoZVxuICogcmVpbXBsZW1lbnRhdGlvbiBoZXJlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHtzIGlzIENvcHlTZXR9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXQ9KHMpPT5tYXRjaGVzKHMsTS5zZXQoKSk7XG5cbi8qKlxuICogU2hvdWxkIGJlaGF2ZSBpZGVudGljYWxseSB0byB0aGUgb25lIGluIGBAZW5kby9wYXR0ZXJuc2AsIGJ1dFxuICogcmVpbXBsZW1lbnRlZCBmb3Igbm93IGJlY2F1c2UgYEBlbmRvL3BhdHRlcm5zYCBmb3Jnb3QgdG8gZXhwb3J0IHRoaXMgb25lLlxuICogVGhpcyBvbmUgaXMgc2ltcGxlIGVub3VnaCB0aGF0IEkgcHJlZmVyIGEgcmVpbXBsZW1lbnRhdGlvbiB0byBhIGRlZXAgaW1wb3J0LlxuICogVE9ETzogVW5kYXRlIGBAZW5kby9wYXR0ZXJuc2AgdG8gZXhwb3J0IHRoZSBvcmlnaW5hbCwgYW5kIGRlbGV0ZSB0aGVcbiAqIHJlaW1wbGVtZW50YXRpb24gaGVyZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7bSBpcyBDb3B5TWFwfVxuICovJGjigI1fb25jZS5pc0NvcHlTZXQoaXNDb3B5U2V0KTtcbmNvbnN0ICAgICAgICBpc0NvcHlNYXA9KG0pPT5tYXRjaGVzKG0sTS5tYXAoKSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gQ3VycmVudEtleXNLaXRcbiAqIEBwcm9wZXJ0eSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkFkZFxuICogQHByb3BlcnR5IHsoazogSykgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25EZWxldGVcbiAqIEBwcm9wZXJ0eSB7SXRlcmFibGU8Sz59IGl0ZXJhYmxlS2V5c1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHsoKSA9PiBJdGVyYWJsZTxLPn0gZ2V0UmF3S2V5c1xuICogQHBhcmFtIHsoazogSykgPT4gYm9vbGVhbn0gY2hlY2tIYXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtDdXJyZW50S2V5c0tpdDxLLFY+fVxuICovJGjigI1fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmNvbnN0ICAgICAgICBtYWtlQ3VycmVudEtleXNLaXQ9KFxuZ2V0UmF3S2V5cyxcbmNoZWNrSGFzLFxuY29tcGFyZSxcbmFzc2VydE9rVG9BZGQsXG5hc3NlcnRPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmxldCB1cGRhdGVDb3VudD0wO1xubGV0IHNvcnRlZEtleXNNZW1vO1xuXG5jb25zdCBhc3NlcnRVcGRhdGVPbkFkZD0oayx2PXVuZGVmaW5lZCk9PntcbmFzc2VydE9rVG9BZGQoayx2KTtcbnVwZGF0ZUNvdW50Kz0xO1xuc29ydGVkS2V5c01lbW89dW5kZWZpbmVkO1xuIH07XG5cbmNvbnN0IGFzc2VydFVwZGF0ZU9uRGVsZXRlPShrKT0+YXNzZXJ0T2tUb0RlbGV0ZSYmYXNzZXJ0T2tUb0RlbGV0ZShrKTtcblxuY29uc3QgZ2V0U29ydGVkS2V5cz0oKT0+e1xuaWYoc29ydGVkS2V5c01lbW89PT11bmRlZmluZWQpe1xuc29ydGVkS2V5c01lbW89aGFyZGVuKFsuLi5nZXRSYXdLZXlzKCldLnNvcnQoY29tcGFyZSkpO1xuIH1cbnJldHVybiBzb3J0ZWRLZXlzTWVtbztcbiB9O1xuXG5jb25zdCBpdGVyYWJsZUtleXM9RmFyKCdJdGVyYWJsZSBvZiBrZXlzJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgZ2VuZXJhdGlvbj11cGRhdGVDb3VudDtcbmdldFNvcnRlZEtleXMoKTtcbmNvbnN0IGxlbj1zb3J0ZWRLZXlzTWVtby5sZW5ndGg7XG5sZXQgaT0wO1xucmV0dXJuIEZhcignSXRlcmF0b3Igb2Yga2V5cycse1xubmV4dDooKT0+e1xuZ2VuZXJhdGlvbj09PXVwZGF0ZUNvdW50fHxGYWlsIGBTdG9yZSAke3Eoa2V5TmFtZSl9IGN1cnNvciBzdGFsZWA7XG4vKiBJZiB0aGV5J3JlIGVxdWFsLCB0aGVuIHRoZSBzb3J0ZWRLZXlNZW1vIGlzIHRoZSBzYW1lIG9uZSovXG4vKiB3ZSBzdGFydGVkIHdpdGguKi9cbmZvcig7Oyl7XG5pZihpPGxlbil7XG5jb25zdCB2YWx1ZT1zb3J0ZWRLZXlzTWVtb1tpXTtcbmkrPTE7XG5pZihjaGVja0hhcyh2YWx1ZSkpe1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcbiB9XG4gfVxuIH19KTtcblxuIH19KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmFzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG5pdGVyYWJsZUtleXN9KTtcblxuIH07JGjigI1fb25jZS5tYWtlQ3VycmVudEtleXNLaXQobWFrZUN1cnJlbnRLZXlzS2l0KTtcbmhhcmRlbihtYWtlQ3VycmVudEtleXNLaXQpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVMYXp5YCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuXG4gKiBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSxcbiAqIGNhbGwgYG1ha2VWYWx1ZShrZXkpYCwgcmVtZW1iZXIgaXQgYXMgdGhlIHZhbHVlIGZvclxuICogdGhhdCBrZXksIGFuZCByZXR1cm4gaXQuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SyxWPn0gbWFwU3RvcmVcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFZ9IG1ha2VWYWx1ZVxuICogQHJldHVybnMge1Z9XG4gKi9cbmNvbnN0ICAgICAgICBwcm92aWRlTGF6eT0obWFwU3RvcmUsa2V5LG1ha2VWYWx1ZSk9PntcbmlmKCFtYXBTdG9yZS5oYXMoa2V5KSl7XG5tYXBTdG9yZS5pbml0KGtleSxtYWtlVmFsdWUoa2V5KSk7XG4gfVxucmV0dXJuIG1hcFN0b3JlLmdldChrZXkpO1xuIH07JGjigI1fb25jZS5wcm92aWRlTGF6eShwcm92aWRlTGF6eSk7XG5oYXJkZW4ocHJvdmlkZUxhenkpO1xuXG4vKipcbiAqIEhlbHBlciBmb3IgdXNlIGNhc2VzIGluIHdoaWNoIHRoZSBtYWtlciBmdW5jdGlvbiBpcyBhc3luYy5cbiAqIEZvciB0d28gcHJvdmlkZUxhenkgY2FsbHMgd2l0aCB0aGUgc2FtZSBrZXksIG9uZSBtYXkgYmUgbWFraW5nIHdoZW4gdGhlXG4gKiBvdGhlciBjYWxsIHN0YXJ0cyBhbmQgaXQgd291bGQgbWFrZSBhZ2Fpbi5cbiAqIChUaGVuIHRoZXJlJ2QgYmUgYSBjb2xsaXNpb24gd2hlbiB0aGUgc2Vjb25kIHRyaWVzIHRvIHN0b3JlXG4gKiB0aGUga2V5LikgVGhpcyBwcmV2ZW50cyB0aGF0IHJhY2UgY29uZGl0aW9uIGJ5IGltbWVkaWF0ZWx5IHN0b3JpbmcgYSBQcm9taXNlXG4gKiBmb3IgdGhlIG1ha2VyIGluIGFuIGVwaGVtZXJhbCBzdG9yZS5cbiAqXG4gKiBXaGVuIHRoZSBgc3RvcmVgIGFyZ3VtZW50IGlzIGR1cmFibGUgc3RvcmFnZSwgbm90ZSB0aGF0IGl0J3MgcG9zc2libGUgZm9yXG4gKiB0ZXJtaW5hdGlvbiB0byBoYXBwZW4gYWZ0ZXIgdGhlIG1ha2UgY29tcGxldGVzIGFuZCBiZWZvcmUgaXQgcmVhY2hlcyBkdXJhYmxlXG4gKiBzdG9yYWdlLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SywgVj59IHN0b3JlXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQXRvbWljUHJvdmlkZXI9KHN0b3JlKT0+e1xuLyoqIEB0eXBlIHtNYXA8SywgUHJvbWlzZTxWPj59ICovXG5jb25zdCBwZW5kaW5nPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBDYWxsIGBwcm92aWRlQXN5bmNgIHRvIGdldCBvciBtYWtlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSxcbiAqIHdoZW4gdGhlIG1ha2VyIGlzIGFzeW5jaHJvbm91cy5cbiAqIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yXG4gKiB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBQcm9taXNlPFY+fSBtYWtlVmFsdWUgbWFrZSB0aGUgdmFsdWUgZm9yIHRoZSBzdG9yZVxuICogaWYgaXQgaGFzbid0IGJlZW4gbWFkZSB5ZXQgb3IgdGhlIGxhc3QgbWFrZSBmYWlsZWRcbiAqIEBwYXJhbSB7KGtleTogSywgdmFsdWU6IFYpID0+IFByb21pc2U8dm9pZD59IFtmaW5pc2hWYWx1ZV0gcnVucyBleGFjdGx5XG4gKiBvbmNlIGFmdGVyIGEgbmV3IHZhbHVlIGlzIGFkZGVkIHRvIHRoZSBzdG9yZVxuICogQHJldHVybnMge1Byb21pc2U8Vj59XG4gKi9cbmNvbnN0IHByb3ZpZGVBc3luYz0oa2V5LG1ha2VWYWx1ZSxmaW5pc2hWYWx1ZSk9PntcbmlmKHN0b3JlLmhhcyhrZXkpKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoc3RvcmUuZ2V0KGtleSkpO1xuIH1cbmlmKCFwZW5kaW5nLmhhcyhrZXkpKXtcbmNvbnN0IHZhbFA9bWFrZVZhbHVlKGtleSkuXG50aGVuKCh2KT0+e1xuc3RvcmUuaW5pdChrZXksdik7XG5yZXR1cm4gdjtcbiB9KS5cbnRoZW4oKHYpPT57XG5pZihmaW5pc2hWYWx1ZSl7XG5yZXR1cm4gZmluaXNoVmFsdWUoa2V5LHYpLnRoZW4oKCk9PnYpO1xuIH1cbnJldHVybiB2O1xuIH0pLlxuZmluYWxseSgoKT0+e1xucGVuZGluZy5kZWxldGUoa2V5KTtcbiB9KTtcbnBlbmRpbmcuc2V0KGtleSx2YWxQKTtcbiB9XG5jb25zdCB2YWxQPXBlbmRpbmcuZ2V0KGtleSk7XG5hc3NlcnQodmFsUCk7XG5yZXR1cm4gdmFsUDtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtwcm92aWRlQXN5bmN9KTtcbiB9OyRo4oCNX29uY2UubWFrZUF0b21pY1Byb3ZpZGVyKG1ha2VBdG9taWNQcm92aWRlcik7XG5oYXJkZW4obWFrZUF0b21pY1Byb3ZpZGVyKTtcbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgbWFrZUF0b21pY1Byb3ZpZGVyPEssIFY+Pn0gQXRvbWljUHJvdmlkZXI8SywgVj5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLCBWXG4gKiBAcGFyYW0ge01hcFN0b3JlPEssIFZbXT59IG1hcFN0b3JlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHtWfSBpdGVtXG4gKi9cbmNvbnN0ICAgICAgICBhcHBlbmRUb1N0b3JlZEFycmF5PShtYXBTdG9yZSxrZXksaXRlbSk9PntcbmlmKG1hcFN0b3JlLmhhcyhrZXkpKXtcbmNvbnN0IGV4dGFudD1tYXBTdG9yZS5nZXQoa2V5KTtcbm1hcFN0b3JlLnNldChrZXksaGFyZGVuKFsuLi5leHRhbnQsaXRlbV0pKTtcbiB9ZWxzZXtcbm1hcFN0b3JlLmluaXQoa2V5LGhhcmRlbihbaXRlbV0pKTtcbiB9XG4gfTskaOKAjV9vbmNlLmFwcGVuZFRvU3RvcmVkQXJyYXkoYXBwZW5kVG9TdG9yZWRBcnJheSk7XG5oYXJkZW4oYXBwZW5kVG9TdG9yZWRBcnJheSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5U2V0IjpbImlzQ29weVNldCJdLCJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIl0sIm1ha2VDdXJyZW50S2V5c0tpdCI6WyJtYWtlQ3VycmVudEtleXNLaXQiXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiXSwibWFrZUF0b21pY1Byb3ZpZGVyIjpbIm1ha2VBdG9taWNQcm92aWRlciJdLCJhcHBlbmRUb1N0b3JlZEFycmF5IjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxQCsglgqAABYKgAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlUYWdnZWR9IENvcHlUYWdnZWQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlcicpLlJhbmtDb21wYXJlfSBSYW5rQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXInKS5SYW5rQ29tcGFyaXNvbn0gUmFua0NvbXBhcmlzb24gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuLyogUGxhY2Vob2xkZXIgcmVkdW5kYW50IHR5cGVzLCB0byBiZSBpbXBvcnRlZCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZC4qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXNzYWJsZX0gS2V5XG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXNzYWJsZX0gUGF0dGVyblxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XVxuICogQHR5cGVkZWYge0NvcHlUYWdnZWQgJiB7XG4gKiAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiAnY29weVNldCcsXG4gKiAgIHBheWxvYWQ6IEFycmF5PEs+LFxuICogfX0gQ29weVNldFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XVxuICogQHR5cGVkZWYge0NvcHlUYWdnZWQgJiB7XG4gKiAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiAnY29weUJhZycsXG4gKiAgIHBheWxvYWQ6IEFycmF5PFtLLCBiaWdpbnRdPixcbiAqIH19IENvcHlCYWdcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV1cbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtWPVBhc3NhYmxlXVxuICogQHR5cGVkZWYge0NvcHlUYWdnZWQgJiB7XG4gKiAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiAnY29weU1hcCcsXG4gKiAgIHBheWxvYWQ6IHsga2V5czogQXJyYXk8Sz4sIHZhbHVlczogQXJyYXk8Vj4gfSxcbiAqIH19IENvcHlNYXBcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR3VhcmRNYWtlcnNcbiAqIEBwcm9wZXJ0eSB7PE0gZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PihpbnRlcmZhY2VOYW1lOiBzdHJpbmcsXG4gKiAgICAgICAgICAgICBtZXRob2RHdWFyZHM6IE0sXG4gKiAgICAgICAgICAgICBvcHRpb25zPzoge3Nsb3BweT86IGJvb2xlYW59XG4gKiApID0+IEludGVyZmFjZUd1YXJkfSBpbnRlcmZhY2VcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICpcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbCBHdWFyZCBhIHN5bmNocm9ub3VzIGNhbGxcbiAqXG4gKiBAcHJvcGVydHkgeyguLi5hcmdHdWFyZHM6IEFyZ0d1YXJkW10pID0+IE1ldGhvZEd1YXJkTWFrZXJ9IGNhbGxXaGVuIEd1YXJkIGFuIGFzeW5jIGNhbGxcbiAqXG4gKiBAcHJvcGVydHkgeyhhcmdHdWFyZDogQXJnR3VhcmQpID0+IEFyZ0d1YXJkfSBhd2FpdCBHdWFyZCBhbiBhd2FpdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBNZXRob2RcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqIGtsYXNzOiAnSW50ZXJmYWNlJyxcbiAqIGludGVyZmFjZU5hbWU6IHN0cmluZyxcbiAqIG1ldGhvZEd1YXJkczogUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgTWV0aG9kR3VhcmQ+XG4gKiBzbG9wcHk/OiBib29sZWFuXG4gKiB9fSBJbnRlcmZhY2VHdWFyZFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7YW55fSBNZXRob2RHdWFyZE1ha2VyXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7IGtsYXNzOiAnbWV0aG9kR3VhcmQnLCBjYWxsS2luZDogJ3N5bmMnIHwgJ2FzeW5jJywgcmV0dXJuR3VhcmQ6IHVua25vd24gfX0gTWV0aG9kR3VhcmRcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2FueX0gQXJnR3VhcmRcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZU9wdGlvbnNcbiAqIE9mIHRoZSBkaW1lbnNpb25zIG9uIHdoaWNoIEtleWVkU3RvcmVzIGNhbiBkaWZmZXIsIHdlIG9ubHkgcmVwcmVzZW50IGEgZmV3XG4gKiBvZiB0aGVtIGFzIHN0YW5kYXJkIG9wdGlvbnMuIEEgZ2l2ZW4gc3RvcmUgbWFrZXIgc2hvdWxkIGRvY3VtZW50IHdoaWNoXG4gKiBvcHRpb25zIGl0IHN1cHBvcnRzLCBhcyB3ZWxsIGFzIGl0cyBwb3NpdGlvbnMgb24gZGltZW5zaW9ucyBmb3Igd2hpY2ggaXRcbiAqIGRvZXMgbm90IHN1cHBvcnQgb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvbmdMaXZlZD10cnVlXSBXaGljaCB3YXkgdG8gb3B0aW1pemUgYSB3ZWFrIHN0b3JlLiBUcnVlIG1lYW5zXG4gKiB0aGF0IHdlIGV4cGVjdCB0aGlzIHdlYWsgc3RvcmUgdG8gb3V0bGl2ZSBtb3N0IG9mIGl0cyBrZXlzLCBpbiB3aGljaFxuICogY2FzZSB3ZSBpbnRlcm5hbGx5IG1heSB1c2UgYSBKYXZhU2NyaXB0IGBXZWFrTWFwYC4gT3RoZXJ3aXNlIHdlIGludGVybmFsbHlcbiAqIG1heSB1c2UgYSBKYXZhU2NyaXB0IGBNYXBgLlxuICogRGVmYXVsdHMgdG8gdHJ1ZSwgc28gcGxlYXNlIG1hcmsgc2hvcnQgbGl2ZWQgc3RvcmVzIGV4cGxpY2l0bHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkdXJhYmxlPWZhbHNlXSAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RvcmUgc3Vydml2ZSB0ZXJtaW5hdGlvblxuICogICBvZiBpdHMgY29udGFpbmluZyBwcm9jZXNzLCBhbGxvd2luZyBmb3IgcmVzdGFydCBvciB1cGdyYWRlIGJ1dCBhdCB0aGUgY29zdFxuICogICBvZiBmb3JiaWRkaW5nIHN0b3JhZ2Ugb2YgcmVmZXJlbmNlcyB0byBlcGhlbWVyYWwgZGF0YS4gIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFrZUR1cmFibGU9ZmFsc2VdICBUaGlzIHN0b3JlIHByZXRlbmRzIHRvIGJlIGEgZHVyYWJsZSBzdG9yZVxuICogICBidXQgZG9lcyBub3QgZW5mb3JjZSB0aGF0IHRoZSB0aGluZ3Mgc3RvcmVkIGluIGl0IGFjdHVhbGx5IGJlIHRoZW1zZWx2ZXNcbiAqICAgZHVyYWJsZSAod2hlcmVhcyBhbiBhY3R1YWwgZHVyYWJsZSBzdG9yZSB3b3VsZCBmb3JiaWQgc3RvcmFnZSBvZiBzdWNoXG4gKiAgIGl0ZW1zKS4gIFRoaXMgaXMgaW4gc2VydmljZSBvZiBhbGxvd2luZyBpbmNyZW1lbnRhbCB0cmFuc2l0aW9uIHRvIHVzZSBvZlxuICogICBkdXJhYmxlIHN0b3JlcywgdG8gZW5hYmxlIG5vcm1hbCBvcGVyYXRpb24gYW5kIHRlc3Rpbmcgd2hlbiBzb21lIHN0dWZmXG4gKiAgIGludGVuZGVkIHRvIGV2ZW50dWFsbHkgYmUgZHVyYWJsZSBoYXMgbm90IHlldCBiZWVuIG1hZGUgZHVyYWJsZS4gIEEgc3RvcmVcbiAqICAgbWFya2VkIGFzIGZha2VEdXJhYmxlIHdpbGwgYXBwZWFyIHRvIG9wZXJhdGUgbm9ybWFsbHkgYnV0IGFueSBhdHRlbXB0IHRvXG4gKiAgIHVwZ3JhZGUgaXRzIGNvbnRhaW5pbmcgdmF0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yLlxuICogQHByb3BlcnR5IHtQYXR0ZXJufSBba2V5U2hhcGVdXG4gKiBAcHJvcGVydHkge1BhdHRlcm59IFt2YWx1ZVNoYXBlXVxuICovXG5cbi8qKlxuICogTW9zdCBzdG9yZSBtZXRob2RzIGFyZSBpbiBvbmUgb2YgdGhyZWUgY2F0ZWdvcmllc1xuICogICAqIGxvb2t1cCBtZXRob2RzIChgaGFzYCxgZ2V0YClcbiAqICAgKiB1cGRhdGUgbWV0aG9kcyAoYGFkZGAsYGluaXRgLGBzZXRgLGBkZWxldGVgLGBhZGRBbGxgKVxuICogICAqIHF1ZXJ5IG1ldGhvZHMgKGBzbmFwc2hvdGAsYGtleXNgLGB2YWx1ZXNgLGBlbnRyaWVzYCxgZ2V0U2l6ZWApXG4gKiAgICogcXVlcnktdXBkYXRlIG1ldGhvZHMgKGBjbGVhcmApXG4gKlxuICogV2Vha1N0b3JlcyBoYXZlIHRoZSBsb29rdXAgYW5kIHVwZGF0ZSBtZXRob2RzIGJ1dCBub3QgdGhlIHF1ZXJ5XG4gKiBvciBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqIE5vbi13ZWFrIFN0b3JlcyBhcmUgbGlrZSB0aGVpciBjb3JyZXNwb25kaW5nIFdlYWtTdG9yZXMsIGJ1dCB3aXRoIHRoZVxuICogYWRkaXRpb25hbCBxdWVyeSBhbmQgcXVlcnktdXBkYXRlIG1ldGhvZHMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleSAmIG9iamVjdH0gW0s9S2V5XVxuICogQHR5cGVkZWYge29iamVjdH0gV2Vha1NldFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGFkZFxuICogQWRkIHRoZSBrZXkgdG8gdGhlIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4gRG8gbm90aGluZyBzaWxlbnRseSBpZlxuICogYWxyZWFkeSB0aGVyZS5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXM6IENvcHlTZXQ8Sz4gfCBJdGVyYWJsZTxLPikgPT4gdm9pZH0gYWRkQWxsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XVxuICogQHR5cGVkZWYge29iamVjdH0gU2V0U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkXG4gKiBBZGQgdGhlIGtleSB0byB0aGUgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiBEbyBub3RoaW5nIHNpbGVudGx5IGlmXG4gKiBhbHJlYWR5IHRoZXJlLlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogQ29weVNldDxLPiB8IEl0ZXJhYmxlPEs+KSA9PiB2b2lkfSBhZGRBbGxcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBDb3B5U2V0PEs+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleSAmIG9iamVjdH0gW0s9S2V5XVxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gW1Y9UGFzc2FibGVdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXZWFrTWFwU3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhlbnRyaWVzOiBDb3B5TWFwPEssVj4gfCBJdGVyYWJsZTxbSyxWXT4pID0+IHZvaWR9IGFkZEFsbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV1cbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtWPVBhc3NhYmxlXVxuICogQHR5cGVkZWYge29iamVjdH0gTWFwU3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBtYXBcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhlbnRyaWVzOiBDb3B5TWFwPEssVj4gfCBJdGVyYWJsZTxbSyxWXT4pID0+IHZvaWR9IGFkZEFsbFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Vj59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICB2YWx1ZVBhdHQ/OiBQYXR0ZXJuXG4gKiApID0+IEl0ZXJhYmxlPFtLLFZdPn0gZW50cmllc1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IENvcHlNYXA8SyxWPn0gc25hcHNob3RcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBudW1iZXJ9IGdldFNpemVcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiB2b2lkfSBjbGVhclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gRGVwcmVjYXRlZCBMZWdhY3kgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lXZWFrTWFwXG4gKiBMZWdhY3lXZWFrTWFwIGlzIGRlcHJlY2F0ZWQuIFVzZSBXZWFrTWFwU3RvcmUgaW5zdGVhZCBpZiBwb3NzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHNcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0XG4gKiBkb2Vzbid0IGFscmVhZHkgZXhpc3RcbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMZWdhY3lNYXBcbiAqIExlZ2FjeU1hcCBpcyBkZXByZWNhdGVkLiBVc2UgTWFwU3RvcmUgaW5zdGVhZCBpZiBwb3NzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHNcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gVn0gZ2V0XG4gKiBSZXR1cm4gYSB2YWx1ZSBmb3IgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IGluaXRcbiAqIEluaXRpYWxpemUgdGhlIGtleSBvbmx5IGlmIGl0XG4gKiBkb2Vzbid0IGFscmVhZHkgZXhpc3RcbiAqIEBwcm9wZXJ0eSB7KGtleTogSywgdmFsdWU6IFYpID0+IHZvaWR9IHNldFxuICogU2V0IHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeygpID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeygpID0+IEl0ZXJhYmxlPFY+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8W0ssVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeygpID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBjbGVhclxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACGYIdi/AQAAvwEAABwAAABAYWdvcmljL3RpbWUtdjAuMy4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3RpbWVNYXRoLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL3RpbWVNYXRoLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3RpbWVNYXRoLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADAQDfmqCIAAKgiAAAjAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdGltZU1hdGguanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIlRpbWVNYXRoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG11c3RNYXRjaCxOYXQsUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsVGltZXN0YW1wUmVjb3JkU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiVGltZXN0YW1wUmVjb3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFJlY29yZFNoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcbi8qKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5UaW1lckJyYW5kfSBUaW1lckJyYW5kXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVzdGFtcH0gVGltZXN0YW1wXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlJlbGF0aXZlVGltZX0gUmVsYXRpdmVUaW1lXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlJlbGF0aXZlVGltZVZhbHVlfSBSZWxhdGl2ZVRpbWVWYWx1ZVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5UaW1lc3RhbXBWYWx1ZX0gVGltZXN0YW1wVmFsdWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuVGltZU1hdGhUeXBlfSBUaW1lTWF0aFR5cGVcbiAqXG4gKi9cblxuLyoqXG4gKiBgYWdyZWVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUuXG4gKlxuICogQHBhcmFtIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfSBsZWZ0QnJhbmRcbiAqIEBwYXJhbSB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH0gcmlnaHRCcmFuZFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGFncmVlZFRpbWVyQnJhbmQ9KGxlZnRCcmFuZCxyaWdodEJyYW5kKT0+e1xuaWYobGVmdEJyYW5kPT09dW5kZWZpbmVkKXtcbmlmKHJpZ2h0QnJhbmQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9ZWxzZXtcbnJldHVybiByaWdodEJyYW5kO1xuIH1cbiB9ZWxzZSBpZihyaWdodEJyYW5kPT09dW5kZWZpbmVkKXtcbnJldHVybiBsZWZ0QnJhbmQ7XG4gfWVsc2V7XG5sZWZ0QnJhbmQ9PT1yaWdodEJyYW5kfHxcbkZhaWwgYFRpbWVyQnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0QnJhbmQpfSB2cyAke3EocmlnaHRCcmFuZCl9YDtcbnJldHVybiBsZWZ0QnJhbmQ7XG4gfVxuIH07XG5cbi8qKlxuICogYHNoYXJlZFRpbWVyQnJhbmRgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgaW1wbGVtZW50cyB0aGVcbiAqIHRyYW5zaXRpb25hbCBicmFuZCBjaGVja2luZyBhbmQgY29udGFpZ2lvbiBsb2dpYyBleHBsYWluZWQgaW4gdGhlIGBUaW1lTWF0aGBcbiAqIGNvbW1lbnQuIEl0IGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBiaW5hcnkgb3BlcmF0b3JzIHRoYXQgc2hvdWxkIGZvbGxvd1xuICogdGhpcyBsb2dpYy4gSXQgZG9lcyB0aGUgZXJyb3IgY2hlY2tpbmcgYmV0d2VlbiB0aGUgb3BlcmFuZHMsIGFuZCByZXR1cm5zXG4gKiB0aGUgYnJhbmQsIGlmIGFueSwgdGhhdCBzaG91bGQgbGFiZWwgdGhlIHJlc3VsdGluZyB0aW1lIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSBsZWZ0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gcmlnaHRcbiAqIEByZXR1cm5zIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBzaGFyZWRUaW1lckJyYW5kPShsZWZ0LHJpZ2h0KT0+e1xuY29uc3QgbGVmdEJyYW5kPXR5cGVvZiBsZWZ0PT09J2JpZ2ludCc/dW5kZWZpbmVkOmxlZnQudGltZXJCcmFuZDtcbmNvbnN0IHJpZ2h0QnJhbmQ9dHlwZW9mIHJpZ2h0PT09J2JpZ2ludCc/dW5kZWZpbmVkOnJpZ2h0LnRpbWVyQnJhbmQ7XG5yZXR1cm4gYWdyZWVkVGltZXJCcmFuZChsZWZ0QnJhbmQscmlnaHRCcmFuZCk7XG4gfTtcblxuLyoqXG4gKiBgYWJzTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFRpbWVzdGFtcGBcbiAqIHJhdGhlciB0aGFuIGEgYFJlbGF0aXZlVGltZWAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtUaW1lc3RhbXBWYWx1ZX0gYWJzVmFsdWVcbiAqIEByZXR1cm5zIHtUaW1lc3RhbXB9XG4gKi9cbmNvbnN0IGFic0xpa2U9KGxlZnQscmlnaHQsYWJzVmFsdWUpPT57XG5OYXQoYWJzVmFsdWUpO1xuY29uc3QgdGltZXJCcmFuZD1zaGFyZWRUaW1lckJyYW5kKGxlZnQscmlnaHQpO1xuaWYodGltZXJCcmFuZCl7XG5yZXR1cm4gaGFyZGVuKHtcbnRpbWVyQnJhbmQsXG5hYnNWYWx1ZX0pO1xuXG4gfWVsc2V7XG5yZXR1cm4gYWJzVmFsdWU7XG4gfVxuIH07XG5cbi8qKlxuICogYHJlbExpa2VgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeVxuICogb3BlcmF0b3JzIGluIHRoZSBjYXNlIHdoZXJlIHRoZSByZXR1cm5lZCB0aW1lIHNob3VsZCBiZSBhIGBSZWxhdGl2ZVRpbWVgXG4gKiByYXRoZXIgdGhhbiBhIGBUaW1lc3RhbXBgLlxuICpcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSBsZWZ0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gcmlnaHRcbiAqIEBwYXJhbSB7UmVsYXRpdmVUaW1lVmFsdWV9IHJlbFZhbHVlXG4gKiBAcmV0dXJucyB7UmVsYXRpdmVUaW1lfVxuICovXG5jb25zdCByZWxMaWtlPShsZWZ0LHJpZ2h0LHJlbFZhbHVlKT0+e1xuTmF0KHJlbFZhbHVlKTtcbmNvbnN0IHRpbWVyQnJhbmQ9c2hhcmVkVGltZXJCcmFuZChsZWZ0LHJpZ2h0KTtcbmlmKHRpbWVyQnJhbmQpe1xucmV0dXJuIGhhcmRlbih7XG50aW1lckJyYW5kLFxucmVsVmFsdWV9KTtcblxuIH1lbHNle1xucmV0dXJuIHJlbFZhbHVlO1xuIH1cbiB9O1xuXG4vKiBGb3IgYWxsIHRoZSBmb2xsb3dpbmcgdGltZSBvcGVyYXRvcnMsIHRoZWlyIGRvY3VtZW50YXRpb24gaXMgaW4qL1xuLyogdGhlIGBUaW1lTWF0aFR5cGVgLCBzaW5jZSB0aGF0IGlzIHRoZSBkb2N1bWVudGF0aW9uIHRoYXQgc2hvd3MgdXAqL1xuLyogaW4gdGhlIElERS4gV2VsbCwgYXQgbGVhc3QgdGhlIHZzY29kZSBJREUuKi9cblxuY29uc3QgYWJzVmFsdWU9KGFicyk9PntcbmlmKHR5cGVvZiBhYnM9PT0nYmlnaW50Jyl7XG5yZXR1cm4gTmF0KGFicyk7XG4gfVxubXVzdE1hdGNoKGFicyxUaW1lc3RhbXBSZWNvcmRTaGFwZSwndGltZXN0YW1wJyk7XG5yZXR1cm4gTmF0KGFicy5hYnNWYWx1ZSk7XG4gfTtcblxuY29uc3QgcmVsVmFsdWU9KHJlbCk9PntcbmlmKHR5cGVvZiByZWw9PT0nYmlnaW50Jyl7XG5yZXR1cm4gTmF0KHJlbCk7XG4gfVxubXVzdE1hdGNoKHJlbCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSwncmVsYXRpdmUnKTtcbnJldHVybiBOYXQocmVsLnJlbFZhbHVlKTtcbiB9O1xuXG5jb25zdCBtYWtlVGltZXN0YW1wUmVjb3JkPShhYnMsdGltZXJCcmFuZCk9PlxuaGFyZGVuKHthYnNWYWx1ZTphYnMsdGltZXJCcmFuZH0pO1xuY29uc3QgbWFrZVJlbGF0aXZlVGltZVJlY29yZD0ocmVsLHRpbWVyQnJhbmQpPT5cbmhhcmRlbih7cmVsVmFsdWU6cmVsLHRpbWVyQnJhbmR9KTtcblxuY29uc3QgY29lcmNlVGltZXN0YW1wUmVjb3JkPSh0cyxicmFuZCk9PntcbmJyYW5kfHxGYWlsIGBtdXN0IGhhdmUgYSBicmFuZGA7XG5pZih0eXBlb2YgdHM9PT0nbnVtYmVyJyl7XG50cz1OYXQodHMpO1xuIH1cbmlmKHR5cGVvZiB0cz09PSdiaWdpbnQnKXtcbnJldHVybiBtYWtlVGltZXN0YW1wUmVjb3JkKHRzLGJyYW5kKTtcbiB9ZWxzZXtcbmNvbnN0e3RpbWVyQnJhbmR9PXRzO1xubXVzdE1hdGNoKHRzLFRpbWVzdGFtcFJlY29yZFNoYXBlLCd0aW1lc3RhbXAnKTtcbmFncmVlZFRpbWVyQnJhbmQodGltZXJCcmFuZCxicmFuZCk7XG5yZXR1cm4gdHM7XG4gfVxuIH07XG5cbmNvbnN0IGNvZXJjZVJlbGF0aXZlVGltZVJlY29yZD0ocnQsYnJhbmQpPT57XG5icmFuZHx8RmFpbCBgbXVzdCBoYXZlIGEgYnJhbmRgO1xuaWYodHlwZW9mIHJ0PT09J251bWJlcicpe1xucnQ9TmF0KHJ0KTtcbiB9XG5pZih0eXBlb2YgcnQ9PT0nYmlnaW50Jyl7XG5yZXR1cm4gbWFrZVJlbGF0aXZlVGltZVJlY29yZChydCxicmFuZCk7XG4gfWVsc2V7XG5jb25zdHt0aW1lckJyYW5kfT1ydDtcbm11c3RNYXRjaChydCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSwncmVsYXRpdmVUaW1lJyk7XG5hZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsYnJhbmQpO1xucmV0dXJuIHJ0O1xuIH1cbiB9O1xuXG5jb25zdCBhZGRBYnNSZWw9KGFicyxyZWwpPT5cbmFic0xpa2UoYWJzLHJlbCxhYnNWYWx1ZShhYnMpK3JlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBhZGRSZWxSZWw9KHJlbDEscmVsMik9PlxucmVsTGlrZShyZWwxLHJlbDIscmVsVmFsdWUocmVsMSkrcmVsVmFsdWUocmVsMikpO1xuXG5jb25zdCBzdWJ0cmFjdEFic0Ficz0oYWJzMSxhYnMyKT0+XG5yZWxMaWtlKGFiczEsYWJzMixhYnNWYWx1ZShhYnMxKS1hYnNWYWx1ZShhYnMyKSk7XG5cbmNvbnN0IGNsYW1wZWRTdWJ0cmFjdEFic0Ficz0oYWJzMSxhYnMyKT0+e1xuY29uc3QgdmFsMT1hYnNWYWx1ZShhYnMxKTtcbmNvbnN0IHZhbDI9YWJzVmFsdWUoYWJzMik7XG5yZXR1cm4gcmVsTGlrZShhYnMxLGFiczIsdmFsMT52YWwyP3ZhbDEtdmFsMjowbik7XG4gfTtcblxuY29uc3Qgc3VidHJhY3RBYnNSZWw9KGFicyxyZWwpPT5cbmFic0xpa2UoYWJzLHJlbCxhYnNWYWx1ZShhYnMpLXJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBzdWJ0cmFjdFJlbFJlbD0ocmVsMSxyZWwyKT0+XG5yZWxMaWtlKHJlbDEscmVsMixyZWxWYWx1ZShyZWwxKS1yZWxWYWx1ZShyZWwyKSk7XG5cbmNvbnN0IGlzUmVsWmVybz0ocmVsKT0+cmVsVmFsdWUocmVsKT09PTBuO1xuXG5jb25zdCBtdWx0aXBseVJlbE5hdD0ocmVsLG5hdCk9PnJlbExpa2UocmVsLG5hdCxyZWxWYWx1ZShyZWwpKm5hdCk7XG5cbmNvbnN0IGRpdmlkZVJlbE5hdD0ocmVsLG5hdCk9PnJlbExpa2UocmVsLG5hdCxyZWxWYWx1ZShyZWwpL25hdCk7XG5cbmNvbnN0IGRpdmlkZVJlbFJlbD0ocmVsMSxyZWwyKT0+e1xuc2hhcmVkVGltZXJCcmFuZChyZWwxLHJlbDIpOy8qIGp1c3QgZXJyb3IgY2hlY2sqL1xucmV0dXJuIHJlbFZhbHVlKHJlbDEpL3JlbFZhbHVlKHJlbDIpO1xuIH07XG5cbmNvbnN0IG1vZEFic1JlbD0oYWJzLHN0ZXApPT5cbnJlbExpa2UoYWJzLHN0ZXAsYWJzVmFsdWUoYWJzKSVyZWxWYWx1ZShzdGVwKSk7XG5cbmNvbnN0IG1vZFJlbFJlbD0ocmVsLHN0ZXApPT5cbnJlbExpa2UocmVsLHN0ZXAscmVsVmFsdWUocmVsKSVyZWxWYWx1ZShzdGVwKSk7XG5cbi8qKlxuICogYGNvbXBhcmVWYWx1ZXNgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgdXNlZCB0byBpbXBsZW1lbnRcbiAqIHRoZSB0aW1lIGNvbXBhcmlzb24gb3BlcmF0b3JzLlxuICpcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSBsZWZ0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gcmlnaHRcbiAqIEBwYXJhbSB7YmlnaW50fSB2MVxuICogQHBhcmFtIHtiaWdpbnR9IHYyXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cbmNvbnN0IGNvbXBhcmVWYWx1ZXM9KGxlZnQscmlnaHQsdjEsdjIpPT57XG5zaGFyZWRUaW1lckJyYW5kKGxlZnQscmlnaHQpO1xuaWYodjE8djIpe1xucmV0dXJuLTE7XG4gfWVsc2UgaWYodjE9PT12Mil7XG5yZXR1cm4gMDtcbiB9ZWxzZXtcbmFzc2VydCh2MT52Mik7XG5yZXR1cm4gMTtcbiB9XG4gfTtcblxuLyoqXG4gKiBUaGUgYFRpbWVNYXRoYCBvYmplY3QgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdG8gZG8gYXJpdGhtZXRpYyBvbiBsYWJlbGVkXG4gKiB0aW1lIHZhbHVlcywgbXVjaCBsaWtlIGBBbW91bnRNYXRoYCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBkbyBhcml0aG1ldGljXG4gKiBvbiBsYWJlbGVkIGFzc2V0L21vbmV5IHZhbHVlcy4gQm90aCBjaGVjayBmb3IgY29uc2lzdGVuY3kgb2YgbGFiZWxzOiBhXG4gKiBiaW5hcnkgb3BlcmF0aW9uIG9uIHR3byBsYWJlbGVkIG9iamVjdHMgZW5zdXJlcyB0aGF0IHRoZSBib3RoIGNhcnJ5XG4gKiB0aGUgc2FtZSBsYWJlbC4gSWYgdGhleSBwcm9kdWNlIGFub3RoZXIgb2JqZWN0IGZyb20gdGhlIHNhbWUgZG9tYWluLCBpdFxuICogd2lsbCBjYXJyeSB0aGUgc2FtZSBsYWJlbC4gSWYgdGhlIG9wZXJhbmRzIGhhdmUgaW5jb21wYXRpYmxlIGxhYmVscyxcbiAqIGFuIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBVbmxpa2UgYW1vdW50IGFyaXRobWV0aWMsIHRpbWUgYXJpdGhtZXRpYyBkZWFscyBpbiB0d28ga2luZHMgb2YgdGltZSBvYmplY3RzOlxuICogVGltZXN0YW1wcywgd2hpY2ggcmVwcmVzZW50IGFic29sdXRlIHRpbWUsIGFuZCBSZWxhdGl2ZVRpbWUsIHdoaWNoIHJlcHJlc2VudHNcbiAqIHRoZSBkdXJhdGlvbiBiZXR3ZWVuIHR3byBhYnNvbHV0ZSB0aW1lcy4gQm90aCBraW5kcyBvZiB0aW1lIG9iamVjdFxuICogYXJlIGxhYmVsZWQgYnkgYSBgVGltZXJCcmFuZGAuIEZvciBhIFRpbWVzdGFtcCBvYmplY3QsIHRoZSB2YWx1ZSBpc1xuICogYSBiaWdpbnQgaW4gYW4gYGFic1ZhbHVlYCBwcm9wZXJ0eS4gRm9yIGEgUmVsYXRpdmVUaW1lIG9iamVjdCwgdGhlIHZhbHVlXG4gKiBpcyBhIGJpZ2ludCBpbiBhIGByZWxWYWx1ZWAgcHJvcGVydHkuIFRodXMgd2UgaGF2ZSBhIHJ1bnRpbWUgc2FmZXR5IGNoZWNrXG4gKiB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBjb25mdXNlZCB0aGUgdHdvLCBldmVuIGlmIHdlIGhhdmUgbWFuYWdlZCB0byBmb29sXG4gKiB0aGUgKHVuc291bmQpIHN0YXRpYyB0eXBlIHN5c3RlbS5cbiAqXG4gKiBBcyBhIHRyYW5zaXRpb25hbCBtZWFzdXJlLCBjdXJyZW50bHkgbWFueSBUaW1lc3RhbXBzIGFuZCBSZWxhdGl2ZVRpbWVzIGFyZVxuICogc3RpbGwgcmVwcmVzZW50ZWQgYnkgdW5sYWJlbGVkIGJpZ2ludHMuIER1cmluZyB0aGlzIHRyYW5zaXRpb25hbCBwZXJpb2QsXG4gKiB3ZSBhbGxvdyB0aGlzLCBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5LiBGb3IgYSBub3JtYWwgYmluYXJ5XG4gKiBvcGVyYXRpb24sIGlmIGJvdGggaW5wdXRzIGFyZSBsYWJlbGVkLCB0aGVuIHdlIGRvIHRoZSBmdWxsIGNoZWNraW5nIGFzXG4gKiBleHBsYWluZWQgYWJvdmUgYW5kIHJldHVybiBhIGxhYmVsZWQgcmVzdWx0LiBJZiBib3RoIGlucHV0cyBhcmUgdW5sYWJlbGVkXG4gKiBiaWdpbnRzLCB3ZSAqYXNzdW1lKiB0aGF0IHRoZXkgaW5kaWNhdGUgYSB0aW1lIG9mIHRoZSByaWdodCBraW5kXG4gKiAoVGltZXN0YW1wIHZzIFJlbGF0aXZlVGltZSkgYW5kIHRpbWVyIGJyYW5kLiBTaW5jZSB3ZSBkb24ndCBrbm93IHdoYXRcbiAqIGJyYW5kIHdhcyBpbnRlbmRlZCwgd2UgY2FuIG9ubHkgcmV0dXJuIHlldCBhbm90aGVyIHVubGFiZWxlZCBiaWdpbnQuXG4gKlxuICogSWYgb25lIG9wZXJhbmQgaXMgbGFiZWxlZCBhbmQgdGhlIG90aGVyIGlzIG5vdCwgd2UgY2hlY2sgdGhlIGxhYmVsZWQgb3BlcmFuZCxcbiAqICphc3N1bWUqIHRoZSB1bmxhYmVsZWQgYmlnaW50IHJlcHJlc2VudHMgdGhlIHZhbHVlIG5lZWRlZCBmb3IgdGhlIG90aGVyXG4gKiBvcGVyYW5kLCBhbmQgcmV0dXJuIGEgbGFiZWxlZCB0aW1lIG9iamVjdCB3aXRoIHRoZSBicmFuZCBvZiB0aGUgbGFiZWxlZFxuICogb3BlcmFuZC5cbiAqXG4gKiBAdHlwZSB7VGltZU1hdGhUeXBlfVxuICovXG5jb25zdCAgICAgICAgVGltZU1hdGg9aGFyZGVuKHtcbmFic1ZhbHVlLFxucmVsVmFsdWUsXG5jb2VyY2VUaW1lc3RhbXBSZWNvcmQsXG5jb2VyY2VSZWxhdGl2ZVRpbWVSZWNvcmQsXG5hZGRBYnNSZWwsXG5hZGRSZWxSZWwsXG5zdWJ0cmFjdEFic0FicyxcbmNsYW1wZWRTdWJ0cmFjdEFic0FicyxcbnN1YnRyYWN0QWJzUmVsLFxuc3VidHJhY3RSZWxSZWwsXG5pc1JlbFplcm8sXG5tdWx0aXBseVJlbE5hdCxcbmRpdmlkZVJlbE5hdCxcbmRpdmlkZVJlbFJlbCxcbm1vZEFic1JlbCxcbm1vZFJlbFJlbCxcbmNvbXBhcmVBYnM6KGFiczEsYWJzMik9PlxuY29tcGFyZVZhbHVlcyhhYnMxLGFiczIsYWJzVmFsdWUoYWJzMSksYWJzVmFsdWUoYWJzMikpLFxuY29tcGFyZVJlbDoocmVsMSxyZWwyKT0+XG5jb21wYXJlVmFsdWVzKHJlbDEscmVsMixyZWxWYWx1ZShyZWwxKSxyZWxWYWx1ZShyZWwyKSl9KTskaOKAjV9vbmNlLlRpbWVNYXRoKFRpbWVNYXRoKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUaW1lTWF0aCI6WyJUaW1lTWF0aCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABusx6qpwcAAKcHAAAlAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiLCJSZWxhdGl2ZVRpbWVTaGFwZSIsIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiLCJUaW1lckJyYW5kU2hhcGUiLCJUaW1lclNlcnZpY2VTaGFwZSIsIlRpbWVzdGFtcFJlY29yZFNoYXBlIiwiVGltZXN0YW1wU2hhcGUiLCJUaW1lc3RhbXBWYWx1ZVNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE07JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5jb25zdCAgICAgICAgVGltZXJCcmFuZFNoYXBlPU0ucmVtb3RhYmxlKCdUaW1lckJyYW5kJyk7JGjigI1fb25jZS5UaW1lckJyYW5kU2hhcGUoVGltZXJCcmFuZFNoYXBlKTtcbmNvbnN0ICAgICAgICBUaW1lc3RhbXBWYWx1ZVNoYXBlPU0ubmF0KCk7JGjigI1fb25jZS5UaW1lc3RhbXBWYWx1ZVNoYXBlKFRpbWVzdGFtcFZhbHVlU2hhcGUpO1xuY29uc3QgICAgICAgIFJlbGF0aXZlVGltZVZhbHVlU2hhcGU9TS5uYXQoKTsvKiBTaG91bGQgd2UgYWxsb3cgbmVnYXRpdmVzPyovJGjigI1fb25jZS5SZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKFJlbGF0aXZlVGltZVZhbHVlU2hhcGUpO1xuXG5jb25zdCAgICAgICAgVGltZXN0YW1wUmVjb3JkU2hhcGU9aGFyZGVuKHtcbnRpbWVyQnJhbmQ6VGltZXJCcmFuZFNoYXBlLFxuYWJzVmFsdWU6VGltZXN0YW1wVmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuVGltZXN0YW1wUmVjb3JkU2hhcGUoVGltZXN0YW1wUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZT1oYXJkZW4oe1xudGltZXJCcmFuZDpUaW1lckJyYW5kU2hhcGUsXG5yZWxWYWx1ZTpSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlfSk7JGjigI1fb25jZS5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZShSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFRpbWVzdGFtcFNoYXBlPU0ub3IoVGltZXN0YW1wUmVjb3JkU2hhcGUsVGltZXN0YW1wVmFsdWVTaGFwZSk7JGjigI1fb25jZS5UaW1lc3RhbXBTaGFwZShUaW1lc3RhbXBTaGFwZSk7XG5jb25zdCAgICAgICAgUmVsYXRpdmVUaW1lU2hhcGU9TS5vcihcblJlbGF0aXZlVGltZVJlY29yZFNoYXBlLFxuUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSk7JGjigI1fb25jZS5SZWxhdGl2ZVRpbWVTaGFwZShSZWxhdGl2ZVRpbWVTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFRpbWVyU2VydmljZVNoYXBlPU0ucmVtb3RhYmxlKCdUaW1lclNlcnZpY2UnKTskaOKAjV9vbmNlLlRpbWVyU2VydmljZVNoYXBlKFRpbWVyU2VydmljZVNoYXBlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUaW1lckJyYW5kU2hhcGUiOlsiVGltZXJCcmFuZFNoYXBlIl0sIlRpbWVzdGFtcFZhbHVlU2hhcGUiOlsiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIjpbIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiXSwiVGltZXN0YW1wUmVjb3JkU2hhcGUiOlsiVGltZXN0YW1wUmVjb3JkU2hhcGUiXSwiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiOlsiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiXSwiVGltZXN0YW1wU2hhcGUiOlsiVGltZXN0YW1wU2hhcGUiXSwiUmVsYXRpdmVUaW1lU2hhcGUiOlsiUmVsYXRpdmVUaW1lU2hhcGUiXSwiVGltZXJTZXJ2aWNlU2hhcGUiOlsiVGltZXJTZXJ2aWNlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMsy0EiUpAAAlKQAAKAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9leG8tdXRpbHMuanN7ImltcG9ydHMiOlsiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJpZ25vcmVDb250ZXh0IiwibWFrZUV4b1V0aWxzIiwicHJlcGFyZUV4byIsInByZXBhcmVFeG9DbGFzcyIsInByZXBhcmVFeG9DbGFzc0tpdCIsInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmRNdWx0aSIsInByZXBhcmVTaW5nbGV0b24iLCJwcm92aWRlS2luZEhhbmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpbml0RW1wdHkscHJvdmlkZSxnbG9iYWxWYXREYXRhOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLCBbJGjigI1fYSA9PiAoaW5pdEVtcHR5ID0gJGjigI1fYSldXV1dLFtcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW1tcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dLFtcIlZhdERhdGFcIiwgWyRo4oCNX2EgPT4gKGdsb2JhbFZhdERhdGEgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiogQHRlbXBsYXRlIEwsUiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPEwsIFI+fSBSZW1vdGFibGVCcmFuZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFQ+fSBFUmVmICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5CYWdnYWdlfSBCYWdnYWdlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EZWZpbmVLaW5kT3B0aW9uczxUPn0gRGVmaW5lS2luZE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLktpbmRGYWNldDxUPn0gS2luZEZhY2V0ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5LaW5kRmFjZXRzPFQ+fSBLaW5kRmFjZXRzICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EdXJhYmxlS2luZEhhbmRsZX0gRHVyYWJsZUtpbmRIYW5kbGUgKi9cblxuLyoqXG4gKiBNYWtlIGEgdmVyc2lvbiBvZiB0aGUgYXJndW1lbnQgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGtpbmQgY29udGV4dCBidXRcbiAqIGlnbm9yZXMgaXQuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMgRnVuY3Rpb24+KGZuOiBUKSA9PiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGx1c0NvbnRleHQ8bmV2ZXIsIFQ+fVxuICovXG5jb25zdCAgICAgICAgaWdub3JlQ29udGV4dD1cbihmbik9PlxuKF9jb250ZXh0LC4uLmFyZ3MpPT5cbmZuKC4uLmFyZ3MpOyRo4oCNX29uY2UuaWdub3JlQ29udGV4dChpZ25vcmVDb250ZXh0KTtcbmhhcmRlbihpZ25vcmVDb250ZXh0KTtcblxuLyogVE9ETzogRmluZCBhIGdvb2QgaG9tZSBmb3IgdGhpcyBmdW5jdGlvbiB1c2VkIGJ5IEBhZ29yaWMvdmF0LWRhdGEgYW5kIHRlc3RpbmcgY29kZSovXG5jb25zdCAgICAgICAgbWFrZUV4b1V0aWxzPShWYXREYXRhKT0+e1xuY29uc3R7XG5kZWZpbmVLaW5kLFxuZGVmaW5lS2luZE11bHRpLFxuZGVmaW5lRHVyYWJsZUtpbmQsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpLFxubWFrZUtpbmRIYW5kbGV9PVxuVmF0RGF0YTtcblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHJldHVybnMge0R1cmFibGVLaW5kSGFuZGxlfVxuICovXG5jb25zdCBwcm92aWRlS2luZEhhbmRsZT0oYmFnZ2FnZSxraW5kTmFtZSk9PlxucHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fa2luZEhhbmRsZWAsKCk9Pm1ha2VLaW5kSGFuZGxlKGtpbmROYW1lKSk7XG5oYXJkZW4ocHJvdmlkZUtpbmRIYW5kbGUpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvQ2xhc3MgaW5zdGVhZFxuICogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QcmVwYXJlS2luZH1cbiAqL1xuY29uc3QgcHJlcGFyZUtpbmQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpO1xuXG5oYXJkZW4ocHJlcGFyZUtpbmQpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvQ2xhc3NLaXQgaW5zdGVhZFxuICogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QcmVwYXJlS2luZE11bHRpfVxuICovXG5jb25zdCBwcmVwYXJlS2luZE11bHRpPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpO1xuXG5oYXJkZW4ocHJlcGFyZUtpbmRNdWx0aSk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgVCBiZWhhdmlvclxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHtcbiAqICAgc2VsZjogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgc2VsZjogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3M9KHRhZyxpbnRlcmZhY2VHdWFyZCxpbml0LG1ldGhvZHMsb3B0aW9ucyk9PlxuZGVmaW5lS2luZCh0YWcsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7XG4gKiAgIGZhY2V0czogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgZmFjZXRzOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0IGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKT0+XG5cbmRlZmluZUtpbmRNdWx0aSh0YWcsaW5pdCxmYWNldHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZDppbnRlcmZhY2VHdWFyZEtpdH0pO1xuXG5oYXJkZW4oZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IFQgbWV0aG9kc1xuICogQHBhcmFtIHtEdXJhYmxlS2luZEhhbmRsZX0ga2luZEhhbmRsZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHtcbiAqICAgc2VsZjogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgc2VsZjogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVEdXJhYmxlRXhvQ2xhc3M9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kKGtpbmRIYW5kbGUsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7XG4gKiAgIGZhY2V0czogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgZmFjZXRzOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdD0oXG5raW5kSGFuZGxlLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGtpbmRIYW5kbGUsaW5pdCxmYWNldHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZDppbnRlcmZhY2VHdWFyZEtpdH0pO1xuXG5oYXJkZW4oZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IFQgbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7XG4gKiAgIHNlbGY6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIHNlbGY6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgcHJlcGFyZUV4b0NsYXNzPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxuaGFyZGVuKHByZXBhcmVFeG9DbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8e1xuICogICBmYWNldHM6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIGZhY2V0czogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBwcmVwYXJlRXhvQ2xhc3NLaXQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKTtcblxuaGFyZGVuKHByZXBhcmVFeG9DbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7TX0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IE0gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMge00gJiBSZW1vdGFibGVCcmFuZDx7fSwgTT59XG4gKi9cbmNvbnN0IHByZXBhcmVFeG89KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cbntcbmNvbnN0IG1ha2VTaW5nbGV0b249cHJlcGFyZUV4b0NsYXNzKFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cblxucmV0dXJuIHByb3ZpZGUoYmFnZ2FnZSwgYCR7a2luZE5hbWV9X3NpbmdsZXRvbmAsKCk9Pm1ha2VTaW5nbGV0b24oKSk7XG4gfTtcbmhhcmRlbihwcmVwYXJlRXhvKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBNIG1ldGhvZHNcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvIGluc3RlYWQuXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtNfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogTSB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7TSAmIFJlbW90YWJsZUJyYW5kPHt9LCBNPn1cbiAqL1xuY29uc3QgcHJlcGFyZVNpbmdsZXRvbj0oYmFnZ2FnZSxraW5kTmFtZSxtZXRob2RzLG9wdGlvbnM9dW5kZWZpbmVkKT0+XG5wcmVwYXJlRXhvKGJhZ2dhZ2Usa2luZE5hbWUsdW5kZWZpbmVkLG1ldGhvZHMsb3B0aW9ucyk7XG5oYXJkZW4ocHJlcGFyZVNpbmdsZXRvbik7XG5cbnJldHVybiBoYXJkZW4oe1xuZGVmaW5lVmlydHVhbEV4b0NsYXNzLFxuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0LFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4b0NsYXNzLFxucHJlcGFyZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4byxcbnByZXBhcmVTaW5nbGV0b24sXG5cbnByb3ZpZGVLaW5kSGFuZGxlLFxucHJlcGFyZUtpbmQsXG5wcmVwYXJlS2luZE11bHRpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUV4b1V0aWxzKG1ha2VFeG9VdGlscyk7XG5cbmNvbnN0IGdsb2JhbEV4b1V0aWxzPW1ha2VFeG9VdGlscyhnbG9iYWxWYXREYXRhKTtcblxuY29uc3QgICAgICAge1xuZGVmaW5lVmlydHVhbEV4b0NsYXNzLFxuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0LFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4b0NsYXNzLFxucHJlcGFyZUV4b0NsYXNzS2l0LFxucHJlcGFyZUV4byxcbnByZXBhcmVTaW5nbGV0b259PVxuZ2xvYmFsRXhvVXRpbHM7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIEV4b3MvRXhvQ2xhc3NlcyBpbnN0ZWFkIG9mIEtpbmRzXG4gKi8kaOKAjV9vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzcyhkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpOyRo4oCNX29uY2UuZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MoZGVmaW5lRHVyYWJsZUV4b0NsYXNzKTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpOyRo4oCNX29uY2UucHJlcGFyZUV4b0NsYXNzKHByZXBhcmVFeG9DbGFzcyk7JGjigI1fb25jZS5wcmVwYXJlRXhvQ2xhc3NLaXQocHJlcGFyZUV4b0NsYXNzS2l0KTskaOKAjV9vbmNlLnByZXBhcmVFeG8ocHJlcGFyZUV4byk7JGjigI1fb25jZS5wcmVwYXJlU2luZ2xldG9uKHByZXBhcmVTaW5nbGV0b24pO1xuY29uc3QgICAgICAge3Byb3ZpZGVLaW5kSGFuZGxlLHByZXBhcmVLaW5kLHByZXBhcmVLaW5kTXVsdGl9PVxuZ2xvYmFsRXhvVXRpbHM7JGjigI1fb25jZS5wcm92aWRlS2luZEhhbmRsZShwcm92aWRlS2luZEhhbmRsZSk7JGjigI1fb25jZS5wcmVwYXJlS2luZChwcmVwYXJlS2luZCk7JGjigI1fb25jZS5wcmVwYXJlS2luZE11bHRpKHByZXBhcmVLaW5kTXVsdGkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCJdLCJtYWtlRXhvVXRpbHMiOlsibWFrZUV4b1V0aWxzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4b0NsYXNzIjpbInByZXBhcmVFeG9DbGFzcyJdLCJwcmVwYXJlRXhvQ2xhc3NLaXQiOlsicHJlcGFyZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG8iOlsicHJlcGFyZUV4byJdLCJwcmVwYXJlU2luZ2xldG9uIjpbInByZXBhcmVTaW5nbGV0b24iXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwicHJlcGFyZUtpbmQiOlsicHJlcGFyZUtpbmQiXSwicHJlcGFyZUtpbmRNdWx0aSI6WyJwcmVwYXJlS2luZE11bHRpIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADvjPYiSCAAAkggAACQAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9leG8tdXRpbHMuanMiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW11dLFtcIi4vdmF0LWRhdGEtYmluZGluZ3MuanNcIiwgW11dLFtcIi4vZXhvLXV0aWxzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvc3RvcmUiOltbIk0iLCJNIl0sWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjpbWyJtYWtlS2luZEhhbmRsZSIsIm1ha2VLaW5kSGFuZGxlIl0sWyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSxbIndhdGNoUHJvbWlzZSIsIndhdGNoUHJvbWlzZSJdLFsibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLFsiY2FuQmVEdXJhYmxlIiwiY2FuQmVEdXJhYmxlIl0sWyJwaWNrRmFjZXQiLCJwaWNrRmFjZXQiXSxbInBhcnRpYWxBc3NpZ24iLCJwYXJ0aWFsQXNzaWduIl0sWyJwcm92aWRlIiwicHJvdmlkZSJdLFsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl0sWyJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZCJdLFsiZGVmaW5lS2luZE11bHRpIiwiZGVmaW5lS2luZE11bHRpIl0sWyJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kIl0sWyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdXSwiLi9leG8tdXRpbHMuanMiOltbImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLFsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSxbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLFsicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzIl0sWyJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvIl0sWyJwcmVwYXJlU2luZ2xldG9uIiwicHJlcGFyZVNpbmdsZXRvbiJdLFsiaWdub3JlQ29udGV4dCIsImlnbm9yZUNvbnRleHQiXSxbInByb3ZpZGVLaW5kSGFuZGxlIiwicHJvdmlkZUtpbmRIYW5kbGUiXSxbInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmQiXSxbInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlS2luZE11bHRpIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADe9I8gUygAAFMoAAAwAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIlZhdERhdGEiLCJjYW5CZUR1cmFibGUiLCJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kTXVsdGkiLCJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZE11bHRpIiwibWFrZUtpbmRIYW5kbGUiLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTdG9yZVV0aWxzIiwicGFydGlhbEFzc2lnbiIsInBpY2tGYWNldCIsInByb3ZpZGUiLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJ3YXRjaFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFpbCxwcm92aWRlTGF6eTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzJykuVmF0RGF0YX0gKi9cbmxldCBWYXREYXRhR2xvYmFsO1xuaWYoJ1ZhdERhdGEnaW4gZ2xvYmFsVGhpcyl7XG5nbG9iYWxUaGlzLlZhdERhdGF8fEZhaWwgYFZhdERhdGEgZGVmaW5lZCBpbiBnbG9iYWwgYXMgbnVsbCBvciB1bmRlZmluZWRgO1xuVmF0RGF0YUdsb2JhbD1nbG9iYWxUaGlzLlZhdERhdGE7XG4gfWVsc2V7XG4vKiBYWFggdGhpcyBtb2R1bGUgaGFzIGJlZW4ga25vd24gdG8gZ2V0IGltcG9ydGVkICh0cmFuc2l0aXZlbHkpIGluIGNhc2VzIHRoYXQqL1xuLyogbmV2ZXIgdXNlIGl0IHNvIHdlIG1ha2UgYSB2ZXJzaW9uIHRoYXQgd2lsbCBzYXRpc2Z5IG1vZHVsZSByZXNvbHV0aW9uIGJ1dCovXG4vKiBmYWlsIGF0IHJ1bnRpbWUuKi9cbmNvbnN0IHVudmFpbGFibGU9KCk9PkZhaWwgYFZhdERhdGEgdW5hdmFpbGFibGVgO1xuVmF0RGF0YUdsb2JhbD17XG5kZWZpbmVLaW5kOnVudmFpbGFibGUsXG5kZWZpbmVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kOnVudmFpbGFibGUsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpOnVudmFpbGFibGUsXG5tYWtlS2luZEhhbmRsZTp1bnZhaWxhYmxlLFxucHJvdmlkZVByb21pc2VXYXRjaGVyOnVudmFpbGFibGUsXG53YXRjaFByb21pc2U6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ1NldFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlOnVudmFpbGFibGUsXG5jYW5CZUR1cmFibGU6dW52YWlsYWJsZX07XG5cbiB9XG5cbmNvbnN0IFZhdERhdGFFeHBvcnQ9VmF0RGF0YUdsb2JhbDskaOKAjV9vbmNlLlZhdERhdGFFeHBvcnQoVmF0RGF0YUV4cG9ydCk7XG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRXhvcy9FeG9DbGFzc2VzIGluc3RlYWQgb2YgS2luZHNcbiAqL1xuY29uc3QgICAgICAge1xuZGVmaW5lS2luZCxcbmRlZmluZUtpbmRNdWx0aSxcbmRlZmluZUR1cmFibGVLaW5kLFxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aX09XG5WYXREYXRhR2xvYmFsOyRo4oCNX29uY2UuZGVmaW5lS2luZChkZWZpbmVLaW5kKTskaOKAjV9vbmNlLmRlZmluZUtpbmRNdWx0aShkZWZpbmVLaW5kTXVsdGkpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUtpbmQoZGVmaW5lRHVyYWJsZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShkZWZpbmVEdXJhYmxlS2luZE11bHRpKTtcblxuY29uc3QgICAgICAge1xubWFrZUtpbmRIYW5kbGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXIsXG53YXRjaFByb21pc2UsXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxubWFrZVNjYWxhckJpZ1NldFN0b3JlLFxubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSxcbmNhbkJlRHVyYWJsZX09XG5WYXREYXRhR2xvYmFsO1xuXG4vKipcbiAqIFdoZW4gbWFraW5nIGEgbXVsdGktZmFjZXQga2luZCwgaXQncyBjb21tb24gdG8gcGljayBvbmUgZmFjZXQgdG8gZXhwb3NlLiBFLmcuLFxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gKGEsIGIsIGMsIGQpID0+IG1ha2VGb29CYXNlKGEsIGIsIGMsIGQpLnNlbGY7XG4gKlxuICogVGhpcyBoZWxwZXIgcmVkdWNlcyB0aGUgZHVwbGljYXRpb246XG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSBwaWNrRmFjZXQobWFrZUZvb0Jhc2UsICdzZWxmJyk7XG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMnKS5QaWNrRmFjZXR9XG4gKi8kaOKAjV9vbmNlLm1ha2VLaW5kSGFuZGxlKG1ha2VLaW5kSGFuZGxlKTskaOKAjV9vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRo4oCNX29uY2Uud2F0Y2hQcm9taXNlKHdhdGNoUHJvbWlzZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobWFrZVNjYWxhckJpZ01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnU2V0U3RvcmUobWFrZVNjYWxhckJpZ1NldFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUobWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSk7JGjigI1fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbmNvbnN0ICAgICAgICBwaWNrRmFjZXQ9XG4obWFrZXIsZmFjZXROYW1lKT0+XG4oLi4uYXJncyk9PlxubWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaOKAjV9vbmNlLnBpY2tGYWNldChwaWNrRmFjZXQpO1xuaGFyZGVuKHBpY2tGYWNldCk7XG5cbi8qKlxuICogQXNzaWduIHRoZSB2YWx1ZXMgb2YgYWxsIG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGZyb20gdGhlIHNvdXJjZVxuICogb2JqZWN0IHRvIHRoZWlyIGtleXMgaW4gdGhlIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7UGFydGlhbDxUPn0gc291cmNlXG4gKi9cbmNvbnN0ICAgICAgICBwYXJ0aWFsQXNzaWduPSh0YXJnZXQsc291cmNlKT0+e1xuT2JqZWN0LmFzc2lnbih0YXJnZXQsc291cmNlKTtcbiB9OyRo4oCNX29uY2UucGFydGlhbEFzc2lnbihwYXJ0aWFsQXNzaWduKTtcbmhhcmRlbihwYXJ0aWFsQXNzaWduKTtcblxuLyogWFhYIGNvcGllZCBmcm9tIEBhZ29yaWMvc3RvcmUgdHlwZXMqL1xuLyogVU5USUwgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NTYwKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVPcHRpb25zXG4gKiBPZiB0aGUgZGltZW5zaW9ucyBvbiB3aGljaCBLZXllZFN0b3JlcyBjYW4gZGlmZmVyLCB3ZSBvbmx5IHJlcHJlc2VudCBhIGZld1xuICogb2YgdGhlbSBhcyBzdGFuZGFyZCBvcHRpb25zLiBBIGdpdmVuIHN0b3JlIG1ha2VyIHNob3VsZCBkb2N1bWVudCB3aGljaFxuICogb3B0aW9ucyBpdCBzdXBwb3J0cywgYXMgd2VsbCBhcyBpdHMgcG9zaXRpb25zIG9uIGRpbWVuc2lvbnMgZm9yIHdoaWNoIGl0XG4gKiBkb2VzIG5vdCBzdXBwb3J0IG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb25nTGl2ZWQ9dHJ1ZV0gV2hpY2ggd2F5IHRvIG9wdGltaXplIGEgd2VhayBzdG9yZS4gVHJ1ZSBtZWFuc1xuICogdGhhdCB3ZSBleHBlY3QgdGhpcyB3ZWFrIHN0b3JlIHRvIG91dGxpdmUgbW9zdCBvZiBpdHMga2V5cywgaW4gd2hpY2hcbiAqIGNhc2Ugd2UgaW50ZXJuYWxseSBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgV2Vha01hcGAuIE90aGVyd2lzZSB3ZSBpbnRlcm5hbGx5XG4gKiBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgTWFwYC5cbiAqIERlZmF1bHRzIHRvIHRydWUsIHNvIHBsZWFzZSBtYXJrIHNob3J0IGxpdmVkIHN0b3JlcyBleHBsaWNpdGx5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZHVyYWJsZT1mYWxzZV0gIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JlIHN1cnZpdmUgdGVybWluYXRpb25cbiAqICAgb2YgaXRzIGNvbnRhaW5pbmcgcHJvY2VzcywgYWxsb3dpbmcgZm9yIHJlc3RhcnQgb3IgdXBncmFkZSBidXQgYXQgdGhlIGNvc3RcbiAqICAgb2YgZm9yYmlkZGluZyBzdG9yYWdlIG9mIHJlZmVyZW5jZXMgdG8gZXBoZW1lcmFsIGRhdGEuICBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Zha2VEdXJhYmxlPWZhbHNlXSAgVGhpcyBzdG9yZSBwcmV0ZW5kcyB0byBiZSBhIGR1cmFibGUgc3RvcmVcbiAqICAgYnV0IGRvZXMgbm90IGVuZm9yY2UgdGhhdCB0aGUgdGhpbmdzIHN0b3JlZCBpbiBpdCBhY3R1YWxseSBiZSB0aGVtc2VsdmVzXG4gKiAgIGR1cmFibGUgKHdoZXJlYXMgYW4gYWN0dWFsIGR1cmFibGUgc3RvcmUgd291bGQgZm9yYmlkIHN0b3JhZ2Ugb2Ygc3VjaFxuICogICBpdGVtcykuICBUaGlzIGlzIGluIHNlcnZpY2Ugb2YgYWxsb3dpbmcgaW5jcmVtZW50YWwgdHJhbnNpdGlvbiB0byB1c2Ugb2ZcbiAqICAgZHVyYWJsZSBzdG9yZXMsIHRvIGVuYWJsZSBub3JtYWwgb3BlcmF0aW9uIGFuZCB0ZXN0aW5nIHdoZW4gc29tZSBzdHVmZlxuICogICBpbnRlbmRlZCB0byBldmVudHVhbGx5IGJlIGR1cmFibGUgaGFzIG5vdCB5ZXQgYmVlbiBtYWRlIGR1cmFibGUuICBBIHN0b3JlXG4gKiAgIG1hcmtlZCBhcyBmYWtlRHVyYWJsZSB3aWxsIGFwcGVhciB0byBvcGVyYXRlIG5vcm1hbGx5IGJ1dCBhbnkgYXR0ZW1wdCB0b1xuICogICB1cGdyYWRlIGl0cyBjb250YWluaW5nIHZhdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi90eXBlcycpLlBhdHRlcm59IFtrZXlTaGFwZV1cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi90eXBlcycpLlBhdHRlcm59IFt2YWx1ZVNoYXBlXVxuICovXG4vKipcbiAqIFVubGlrZSBgcHJvdmlkZUxhenlgLCBgcHJvdmlkZWAgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2VcbiAqIHdpdGhpbiBhbnkgdmF0IGluY2FybmF0aW9uIHdpdGggYSBnaXZlbiBgYmFnZ2FnZWAsYGtleWAgcGFpci5cbiAqXG4gKiBgcHJvdmlkZWAgc2hvdWxkIG9ubHkgdG8gYmUgdXNlZCB0byBwb3B1bGF0ZSBiYWdnYWdlLFxuICogd2hlcmUgdGhlIHRvdGFsIG51bWJlciBvZiBjYWxscyB0byBgcHJvdmlkZWAgbXVzdCBiZVxuICogbG93IGNhcmRpbmFsaXR5LCBzaW5jZSB3ZSBrZWVwIHRoZSBib29ra2VlcGluZyB0byBkZXRlY3QgY29sbGlzaW9uc1xuICogaW4gbm9ybWFsIGxhbmd1YWdlLWhlYXAgbWVtb3J5LiBBbGwgdGhlIG90aGVyIGJhZ2dhZ2Utb3JpZW50ZWRcbiAqIGBwcm92aWRlKmAgYW5kIGBwcmVwYXJlKmAgZnVuY3Rpb25zIGNhbGwgYHByb3ZpZGVgLFxuICogYW5kIHNvIGltcG9zZSB0aGUgc2FtZSBjb25zdHJhaW50cy4gVGhpcyBpcyBjb25zaXN0ZW50IHdpdGhcbiAqIG91ciBleHBlY3RlZCBkdXJhYmlsaXR5IHBhdHRlcm5zOiBXaGF0IHdlIHN0b3JlIGluIGJhZ2dhZ2UgYXJlXG4gKiAgICAqIGtpbmRIYW5kbGVzLCB3aGljaCBhcmUgcGVyIGtpbmQsIHdoaWNoIG11c3QgYmUgbG93IGNhcmRpbmFsaXR5XG4gKiAgICAqIGRhdGEgXCJ2YXJpYWJsZXNcIiBmb3IgcmVlc3RhYmxpc2hpbmcgdGhlIGxleGljYWwgc2NvcGUsIGVzcGVjaWFsbHlcbiAqICAgICAgb2Ygc2luZ2xldG9uc1xuICogICAgKiBuYW1lZCBub24tYmFnZ2FnZSBjb2xsZWN0aW9ucyBhdCB0aGUgbGVhdmVzIG9mIHRoZSBiYWdnYWdlIHRyZWUuXG4gKlxuICogV2hhdCBpcyBleHBlY3RlZCB0byBiZSBoaWdoIGNhcmRpbmFsaXR5IGFyZSB0aGUgaW5zdGFuY2VzIG9mIHRoZSBraW5kcyxcbiAqIGFuZCB0aGUgbWVtYmVycyBvZiB0aGUgbm9uLWJhZ2dnYWdlIGNvbGxlY3Rpb25zLlxuICpcbiAqIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTg3NSA6XG4gKiBJbXBsZW1lbnQgZGV2ZWxvcG1lbnQtdGltZSBpbnN0cnVtZW50YXRpb24gdG8gZGV0ZWN0IHdoZW5cbiAqIGBwcm92aWRlYCB2aW9sYXRlcyB0aGUgYWJvdmUgcHJlc2NyaXB0aW9uLCBhbmQgaXMgY2FsbGVkIG1vcmVcbiAqIHRoYW4gb25jZSBpbiB0aGUgc2FtZSB2YXQgaW5jYXJuYXRpb24gd2l0aCB0aGUgc2FtZVxuICogYmFnZ2FnZSxrZXkgcGFpci5cbiAqL1xuXG5jb25zdCAgICAgICAgcHJvdmlkZT1cbi8qIFhYWCBjYXN0IGJlY2F1c2UgcHJvdmlkZUxhenkgaXMgYGFueWAgZHVlIHRvIGJyb2tlbiB0eXBlIGltcG9ydCovXG4vKiogQHR5cGUgezxLLCBWPihiYWdnYWdlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZSwga2V5OiBLLCBtYWtlVmFsdWU6IChrZXk6IEspID0+IFYpID0+IFZ9ICovXG5wcm92aWRlTGF6eTtcblxuXG4vKiBUT0RPOiBGaW5kIGEgZ29vZCBob21lIGZvciB0aGlzIGZ1bmN0aW9uIHVzZWQgYnkgQGFnb3JpYy92YXQtZGF0YSBhbmQgdGVzdGluZyBjb2RlKi9cbi8qKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEvc3JjL3R5cGVzJykuVmF0RGF0YX0gVmF0RGF0YSAqLyRo4oCNX29uY2UucHJvdmlkZShwcm92aWRlKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVVdGlscz0oVmF0RGF0YSk9PntcbmNvbnN0e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbm1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlfT1cblZhdERhdGE7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lLG9wdGlvbnM9e30pPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5cbm1ha2VTY2FsYXJCaWdNYXBTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUpO1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPbWl0PFN0b3JlT3B0aW9ucywgJ2R1cmFibGUnPn0gb3B0aW9uc1xuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZVNldFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1NldFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZVV0aWxzKG1ha2VTdG9yZVV0aWxzKTtcblxuY29uc3QgZ2xvYmFsU3RvcmVVdGlscz1tYWtlU3RvcmVVdGlscyhWYXREYXRhR2xvYmFsKTtcbmNvbnN0ICAgICAgIHtcbnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZX09XG5nbG9iYWxTdG9yZVV0aWxzOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVNYXBTdG9yZShwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVmF0RGF0YSI6WyJWYXREYXRhRXhwb3J0Il0sImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCJdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIl0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIl0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdLCJtYWtlS2luZEhhbmRsZSI6WyJtYWtlS2luZEhhbmRsZSJdLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiOlsicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXSwibWFrZVNjYWxhckJpZ01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSwiY2FuQmVEdXJhYmxlIjpbImNhbkJlRHVyYWJsZSJdLCJwaWNrRmFjZXQiOlsicGlja0ZhY2V0Il0sInBhcnRpYWxBc3NpZ24iOlsicGFydGlhbEFzc2lnbiJdLCJwcm92aWRlIjpbInByb3ZpZGUiXSwibWFrZVN0b3JlVXRpbHMiOlsibWFrZVN0b3JlVXRpbHMiXSwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAN22wXigcAAIoHAAAjAAAAQGFnb3JpYy92YXRzLXYwLjE1LjEvc3JjL3ZhdC16b2UuanN7ImltcG9ydHMiOlsiQGFnb3JpYy96b2UiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJidWlsZFJvb3RPYmplY3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLG1ha2VEdXJhYmxlWm9lS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy96b2VcIiwgW1tcIm1ha2VEdXJhYmxlWm9lS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRHVyYWJsZVpvZUtpdCA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShidWlsZFJvb3RPYmplY3QsICduYW1lJywge3ZhbHVlOiBcImJ1aWxkUm9vdE9iamVjdFwifSk7JGjigI1fb25jZS5idWlsZFJvb3RPYmplY3QoYnVpbGRSb290T2JqZWN0KTsgICBcblxuXG5jb25zdCBCVUlMRF9QQVJBTVNfS0VZPSdidWlsZFpvZVBhcmFtcyc7XG5cbmZ1bmN0aW9uICAgICAgICBidWlsZFJvb3RPYmplY3QodmF0UG93ZXJzLF92YXRQYXJhbXMsem9lQmFnZ2FnZSl7XG5jb25zdCBzaHV0ZG93blpvZVZhdD12YXRQb3dlcnMuZXhpdFZhdFdpdGhGYWlsdXJlO1xuXG5sZXQgem9lQ29uZmlnRmFjZXQ7XG5cbmlmKHpvZUJhZ2dhZ2UuaGFzKEJVSUxEX1BBUkFNU19LRVkpKXtcbmNvbnN0e2ZlZUlzc3VlckNvbmZpZyx6Y2ZTcGVjfT16b2VCYWdnYWdlLmdldChCVUlMRF9QQVJBTVNfS0VZKTtcbi8qIFRoZSByZXR1cm4gdmFsdWUgaXMgYHsgem9lU2VydmljZSwgem9lQ29uZmlnRmFjZXQsIGZlZU1pbnRBY2Nlc3MgfWAuIFRoaXMqL1xuLyogY2FsbCBvbmx5IG5lZWRzIHpvZUNvbmZpZ0ZhY2V0IGJlY2F1c2UgdGhlIG90aGVycyBoYXZlIGJlZW4gcmV0dXJuZWQuKi9cbi8qIHpvZUNvbmZpZ0ZhY2V0IHdhcyBhZGRlZCBhZnRlciB0aGUgZmlyc3QgcmVsZWFzZSBvZiBab2Ugb24tY2hhaW4uKi9cbih7em9lQ29uZmlnRmFjZXR9PW1ha2VEdXJhYmxlWm9lS2l0KHtcbi8qIEZvciBub3cgWm9lIHdpbGwgcmV3aXJlIHZhdEFkbWluU3ZjIG9uIGl0cyBvd24qL1xuc2h1dGRvd25ab2VWYXQsXG5mZWVJc3N1ZXJDb25maWcsXG56Y2ZTcGVjLFxuem9lQmFnZ2FnZX0pKTtcblxuIH1cblxucmV0dXJuIEZhcigncm9vdCcse1xuYnVpbGRab2U6YXN5bmMoYWRtaW5WYXQsZmVlSXNzdWVyQ29uZmlnLHpjZkJ1bmRsZU5hbWUpPT57XG5hc3NlcnQoemNmQnVuZGxlTmFtZSwgYHZhdC16b2UgcmVxdWlyZXMgemNmQnVuZGxlTmFtZWApO1xuXG5jb25zdCB2YXRBZG1pblN2Yz1hd2FpdCBhZG1pblZhdDtcblxuLyoqIEB0eXBlIHtaQ0ZTcGVjfSAqL1xuY29uc3QgemNmU3BlYz17bmFtZTp6Y2ZCdW5kbGVOYW1lfTtcblxuem9lQmFnZ2FnZS5pbml0KFxuQlVJTERfUEFSQU1TX0tFWSxcbmhhcmRlbih7dmF0QWRtaW5TdmMsZmVlSXNzdWVyQ29uZmlnLHpjZlNwZWN9KSk7XG5cblxuY29uc3R7em9lU2VydmljZSxmZWVNaW50QWNjZXNzfT1tYWtlRHVyYWJsZVpvZUtpdCh7XG52YXRBZG1pblN2YyxcbnNodXRkb3duWm9lVmF0LFxuZmVlSXNzdWVyQ29uZmlnLFxuemNmU3BlYyxcbnpvZUJhZ2dhZ2V9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbnpvZVNlcnZpY2UsXG5mZWVNaW50QWNjZXNzfSk7XG5cbiB9LFxuZ2V0Wm9lQ29uZmlnRmFjZXQ6KCk9PnpvZUNvbmZpZ0ZhY2V0fSk7XG5cbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYnVpbGRSb290T2JqZWN0IjpbImJ1aWxkUm9vdE9iamVjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABxjbziQBwAAEAcAAAoAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY2xlYW5Qcm9wb3NhbC5qc3siaW1wb3J0cyI6WyIuL2ludGVybmFsLXR5cGVzLmpzIiwiLi9vYmpBcnJheUNvbnZlcnNpb24uanMiLCIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiTUFYX0tFWVdPUkRfTEVOR1RIIiwiYXNzZXJ0S2V5d29yZE5hbWUiLCJjbGVhbktleXdvcmRzIiwiY2xlYW5Qcm9wb3NhbCIsImNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQiLCJjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQscSxGYWlsLEFtb3VudE1hdGgsZ2V0QXNzZXRLaW5kLGFzc2VydFJlY29yZCxhc3NlcnRLZXksYXNzZXJ0UGF0dGVybixtdXN0TWF0Y2gsaXNLZXksRnVsbFByb3Bvc2FsU2hhcGUsYXJyYXlUb09iajskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXSxbXCJnZXRBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKGdldEFzc2V0S2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImlzS2V5XCIsIFskaOKAjV9hID0+IChpc0tleSA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkZ1bGxQcm9wb3NhbFNoYXBlXCIsIFskaOKAjV9hID0+IChGdWxsUHJvcG9zYWxTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCIuL29iakFycmF5Q29udmVyc2lvbi5qc1wiLCBbW1wiYXJyYXlUb09ialwiLCBbJGjigI1fYSA9PiAoYXJyYXlUb09iaiA9ICRo4oCNX2EpXV1dXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbmNvbnN0ICAgICAgICBNQVhfS0VZV09SRF9MRU5HVEg9MTAwOyRo4oCNX29uY2UuTUFYX0tFWVdPUkRfTEVOR1RIKE1BWF9LRVlXT1JEX0xFTkdUSCk7XG5cbmNvbnN0IGZpcnN0Q2FwQVNDSUk9L15bQS1aXVthLXpBLVowLTlfJF0qJC87XG5cbi8qIFdlIGFkb3B0IHNpbXBsZSByZXF1aXJlbWVudHMgb24ga2V5d29yZHMgc28gdGhhdCB0aGV5IGRvIG5vdCBhY2NpZGVudGFsbHkqL1xuLyogY29uZmxpY3Qgd2l0aCBleGlzdGluZyBwcm9wZXJ0eSBuYW1lcy4qL1xuLyogV2UgcmVxdWlyZSBrZXl3b3JkcyB0byBiZSBzdHJpbmdzLCBhc2NpaSBpZGVudGlmaWVycyBiZWdpbm5pbmcgd2l0aCBhbiovXG4vKiB1cHBlciBjYXNlIGxldHRlciwgYW5kIGRpc3RpbmN0IGZyb20gdGhlIHN0cmluZ2lmaWVkIGZvcm0gb2YgYW55IG51bWJlci4qL1xuLyoqL1xuLyogT2YgbnVtYmVycywgb25seSBOYU4gYW5kIEluZmluaXR5LCB3aGVuIHN0cmluZ2lmaWVkIHRvIGEgcHJvcGVydHkgbmFtZSwqL1xuLyogcHJvZHVjZSBhbiBhc2NpaSBpZGVudGlmaWVyIGJlZ2lubmluZyB3aXRoIGFuIHVwcGVyIGNhc2UgbGV0dGVyLiovXG4vKiBXaXRoIHRoaXMgcnVsZSwgYSBjb21wdXRlZCBpbmRleGluZyBleHByZXNzaW9uIGxpa2UgYGFbK2ldYCBjYW5ub3QqL1xuLyogbG9va3VwIGEga2V5d29yZC1uYW1lZCBwcm9wZXJ0eSBubyBtYXR0ZXIgd2hhdCBgaWAgaXMuKi9cbmNvbnN0ICAgICAgICBhc3NlcnRLZXl3b3JkTmFtZT0oa2V5d29yZCk9PntcbmFzc2VydC50eXBlb2Yoa2V5d29yZCwnc3RyaW5nJyk7XG5rZXl3b3JkLmxlbmd0aDw9TUFYX0tFWVdPUkRfTEVOR1RIfHxcbkZhaWwgYGtleXdvcmQgJHtxKGtleXdvcmQpfSBleGNlZWRlZCBtYXhpbXVtIGxlbmd0aCAke3EoXG5NQVhfS0VZV09SRF9MRU5HVEgpXG4gfSBjaGFyYWN0ZXJzOyBnb3QgJHtrZXl3b3JkLmxlbmd0aH1gO1xuZmlyc3RDYXBBU0NJSS50ZXN0KGtleXdvcmQpfHxcbkZhaWwgYGtleXdvcmQgJHtxKFxua2V5d29yZClcbiB9IG11c3QgYmUgYW4gYXNjaWkgaWRlbnRpZmllciBzdGFydGluZyB3aXRoIHVwcGVyIGNhc2UuYDtcbmtleXdvcmQhPT0nTmFOJyYma2V5d29yZCE9PSdJbmZpbml0eSd8fFxuRmFpbCBga2V5d29yZCAke3Eoa2V5d29yZCl9IG11c3Qgbm90IGJlIGEgbnVtYmVyJ3MgbmFtZWA7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3tbbmFtZTogc3RyaW5nXTogYW55fX0gdW5jbGVhbktleXdvcmRSZWNvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0S2V5d29yZE5hbWUoYXNzZXJ0S2V5d29yZE5hbWUpO1xuY29uc3QgICAgICAgIGNsZWFuS2V5d29yZHM9KHVuY2xlYW5LZXl3b3JkUmVjb3JkKT0+e1xuaGFyZGVuKHVuY2xlYW5LZXl3b3JkUmVjb3JkKTtcbmFzc2VydFJlY29yZCh1bmNsZWFuS2V5d29yZFJlY29yZCwna2V5d29yZFJlY29yZCcpO1xuY29uc3Qga2V5d29yZHM9b3duS2V5cyh1bmNsZWFuS2V5d29yZFJlY29yZCk7XG5cbi8qIEFzc2VydCBhbGwgbmFtZXMgYXJlIGFzY2lpIGlkZW50aWZpZXJzIHN0YXJ0aW5nIHdpdGgqL1xuLyogYW4gdXBwZXIgY2FzZSBsZXR0ZXIuKi9cbmtleXdvcmRzLmZvckVhY2goYXNzZXJ0S2V5d29yZE5hbWUpO1xuXG5yZXR1cm4gKC8qKiBAdHlwZSB7c3RyaW5nW119ICova2V5d29yZHMpO1xuIH07JGjigI1fb25jZS5jbGVhbktleXdvcmRzKGNsZWFuS2V5d29yZHMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQ9KFxuYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG5nZXRBc3NldEtpbmRCeUJyYW5kKT0+XG57XG5jb25zdCBrZXl3b3Jkcz1jbGVhbktleXdvcmRzKGFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkKTtcblxuY29uc3QgYW1vdW50cz1PYmplY3QudmFsdWVzKGFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkKTtcbi8qIENoZWNrIHRoYXQgZWFjaCB2YWx1ZSBjYW4gYmUgY29lcmNlZCB1c2luZyB0aGUgQW1vdW50TWF0aCovXG4vKiBpbmRpY2F0ZWQgYnkgYnJhbmQuIGBBbW91bnRNYXRoLmNvZXJjZWAgdGhyb3dzIGlmIGNvZXJjaW9uIGZhaWxzLiovXG5jb25zdCBjb2VyY2VkQW1vdW50cz1hbW91bnRzLm1hcCgoYW1vdW50KT0+e1xuaWYoaXNLZXkoYW1vdW50KSl7XG5jb25zdCBicmFuZEFzc2V0S2luZD1nZXRBc3NldEtpbmRCeUJyYW5kKGFtb3VudC5icmFuZCk7XG5jb25zdCBhc3NldEtpbmQ9Z2V0QXNzZXRLaW5kKGFtb3VudCk7XG4vKiBUT0RPOiByZXBsYWNlIHRoaXMgYXNzZXJ0aW9uIHdpdGggYSBjaGVjayBvZiB0aGUgYXNzZXRLaW5kKi9cbi8qIHByb3BlcnR5IG9uIHRoZSBicmFuZCwgd2hlbiB0aGF0IGV4aXN0cy4qL1xuYXNzZXRLaW5kPT09YnJhbmRBc3NldEtpbmR8fFxuRmFpbCBgVGhlIGFtb3VudCAke2Ftb3VudH0gZGlkIG5vdCBoYXZlIHRoZSBhc3NldEtpbmQgb2YgdGhlIGJyYW5kICR7YnJhbmRBc3NldEtpbmR9YDtcbnJldHVybiBBbW91bnRNYXRoLmNvZXJjZShhbW91bnQuYnJhbmQsYW1vdW50KTtcbiB9ZWxzZXtcbmFzc2VydFBhdHRlcm4oYW1vdW50KTtcbnJldHVybiBhbW91bnQ7XG4gfVxuIH0pO1xuXG4vKiBSZWNyZWF0ZSB0aGUgYW1vdW50S2V5d29yZFJlY29yZCB3aXRoIGNvZXJjZWRBbW91bnRzLiovXG5yZXR1cm4gaGFyZGVuKGFycmF5VG9PYmooY29lcmNlZEFtb3VudHMsa2V5d29yZHMpKTtcbiB9OyRo4oCNX29uY2UuY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQoY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQpO1xuXG5jb25zdCAgICAgICAgY29lcmNlQW1vdW50S2V5d29yZFJlY29yZD0oXG5hbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCxcbmdldEFzc2V0S2luZEJ5QnJhbmQpPT5cbntcbmNvbnN0IHJlc3VsdD1jb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZChcbmFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkLFxuZ2V0QXNzZXRLaW5kQnlCcmFuZCk7XG5cbmFzc2VydEtleShyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEp1c3QgY2hlY2tzIHJlc2lkdWFsIGlzc3VlcyBhZnRlciBtYXRjaGluZyBQcm9wb3NhbFNoYXBlLlxuICogT25seSBrbm93biByZXNpZHVhbCBpc3N1ZSBpcyB2ZXJpZnlpbmcgdGhhdCBpdCBvbmx5IGhhcyBvbmUgb2YgdGhlXG4gKiBvcHRpb25hbCBwcm9wZXJ0aWVzLlxuICpcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqLyRo4oCNX29uY2UuY29lcmNlQW1vdW50S2V5d29yZFJlY29yZChjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKTtcbmNvbnN0IGFzc2VydEV4aXQ9KGV4aXQpPT5cbm93bktleXMoZXhpdCkubGVuZ3RoPT09MXx8RmFpbCBgZXhpdCAke2V4aXR9IHNob3VsZCBvbmx5IGhhdmUgb25lIGtleWA7XG5cbi8qKlxuICogY2hlY2sgdGhhdCBrZXl3b3JkIGlzIG5vdCBpbiBib3RoICd3YW50JyBhbmQgJ2dpdmUnLlxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmRbXCJ3YW50XCJdfSB3YW50XG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkW1wiZ2l2ZVwiXX0gZ2l2ZVxuICovXG5jb25zdCBhc3NlcnRLZXl3b3JkTm90SW5Cb3RoPSh3YW50LGdpdmUpPT57XG5jb25zdCB3YW50S2V5d29yZFNldD1uZXcgU2V0KG93bktleXMod2FudCkpO1xuY29uc3QgZ2l2ZUtleXdvcmRzPW93bktleXMoZ2l2ZSk7XG5cbmdpdmVLZXl3b3Jkcy5mb3JFYWNoKChrZXl3b3JkKT0+e1xuIXdhbnRLZXl3b3JkU2V0LmhhcyhrZXl3b3JkKXx8XG5GYWlsIGBhIGtleXdvcmQgY2Fubm90IGJlIGluIGJvdGggJ3dhbnQnIGFuZCAnZ2l2ZSdgO1xuIH0pO1xuIH07XG5cbi8qKlxuICogY2xlYW5Qcm9wb3NhbCBjaGVja3MgdGhlIGtleXMgYW5kIHZhbHVlcyBvZiB0aGUgcHJvcG9zYWwsIGluY2x1ZGluZ1xuICogdGhlIGtleXMgYW5kIHZhbHVlcyBvZiB0aGUgaW50ZXJuYWwgb2JqZWN0cy4gVGhlIHByb3Bvc2FsIG1heSBoYXZlXG4gKiB0aGUgZm9sbG93aW5nIGtleXM6IGBnaXZlYCwgYHdhbnRgLCBhbmQgYGV4aXRgLiBUaGVzZSBrZXlzIG1heSBiZVxuICogb21pdHRlZCBpbiB0aGUgYHByb3Bvc2FsYCBhcmd1bWVudCBwYXNzZWQgdG8gY2xlYW5Qcm9wb3NhbCwgYnV0XG4gKiBhbnl0aGluZyBvdGhlciB0aGFuIHRoZXNlIGtleXMgaXMgbm90IGFsbG93ZWQuIFRoZSB2YWx1ZXMgb2YgYGdpdmVgXG4gKiBhbmQgYHdhbnRgIG11c3QgYmUgXCJhbW91bnRLZXl3b3JkUmVjb3Jkc1wiLCBtZWFuaW5nIHRoYXQgdGhlIGtleXNcbiAqIG11c3QgYmUga2V5d29yZHMgYW5kIHRoZSB2YWx1ZXMgbXVzdCBiZSBhbW91bnRzLiBUaGUgdmFsdWUgb2ZcbiAqIGBleGl0YCwgaWYgcHJlc2VudCwgbXVzdCBiZSBhIHJlY29yZCBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczpcbiAqIGB7IHdhaXZlZDogbnVsbCB9YCBgeyBvbkRlbWFuZDogbnVsbCB9YCBgeyBhZnRlckRlYWRsaW5lOiB7IHRpbWVyXG4gKiA6VGltZXIsIGRlYWRsaW5lIDpiaWdpbnQgfSB9XG4gKlxuICogQHBhcmFtIHtQcm9wb3NhbH0gcHJvcG9zYWxcbiAqIEBwYXJhbSB7R2V0QXNzZXRLaW5kQnlCcmFuZH0gZ2V0QXNzZXRLaW5kQnlCcmFuZFxuICogQHJldHVybnMge1Byb3Bvc2FsUmVjb3JkfVxuICovXG5jb25zdCAgICAgICAgY2xlYW5Qcm9wb3NhbD0ocHJvcG9zYWwsZ2V0QXNzZXRLaW5kQnlCcmFuZCk9PntcbmFzc2VydFJlY29yZChwcm9wb3NhbCwncHJvcG9zYWwnKTtcbi8qIFdlIGZpbGwgaW4gdGhlIGRlZmF1bHQgdmFsdWVzIGlmIHRoZSBrZXlzIGFyZSBhYnNlbnQgb3IgdW5kZWZpbmVkLiovXG5jb25zdHtcbndhbnQ9aGFyZGVuKHt9KSxcbmdpdmU9aGFyZGVuKHt9KSxcbmV4aXQ9aGFyZGVuKHtvbkRlbWFuZDpudWxsfSksXG4uLi5yZXN0fT1cbnByb3Bvc2FsO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYCR7cHJvcG9zYWx9IC0gTXVzdCBvbmx5IGhhdmUgd2FudDosIGdpdmU6LCBleGl0OiBwcm9wZXJ0aWVzOiAke3Jlc3R9YDtcblxuY29uc3QgY2xlYW5lZFdhbnQ9Y29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQoXG53YW50LFxuZ2V0QXNzZXRLaW5kQnlCcmFuZCk7XG5cbmNvbnN0IGNsZWFuZWRHaXZlPWNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQoZ2l2ZSxnZXRBc3NldEtpbmRCeUJyYW5kKTtcblxuY29uc3QgY2xlYW5lZFByb3Bvc2FsPWhhcmRlbih7XG53YW50OmNsZWFuZWRXYW50LFxuZ2l2ZTpjbGVhbmVkR2l2ZSxcbmV4aXR9KTtcblxubXVzdE1hdGNoKGNsZWFuZWRQcm9wb3NhbCxGdWxsUHJvcG9zYWxTaGFwZSwncHJvcG9zYWwnKTtcbmFzc2VydEV4aXQoZXhpdCk7XG5hc3NlcnRLZXl3b3JkTm90SW5Cb3RoKGNsZWFuZWRXYW50LGNsZWFuZWRHaXZlKTtcbnJldHVybiBjbGVhbmVkUHJvcG9zYWw7XG4gfTskaOKAjV9vbmNlLmNsZWFuUHJvcG9zYWwoY2xlYW5Qcm9wb3NhbCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiTUFYX0tFWVdPUkRfTEVOR1RIIjpbIk1BWF9LRVlXT1JEX0xFTkdUSCJdLCJhc3NlcnRLZXl3b3JkTmFtZSI6WyJhc3NlcnRLZXl3b3JkTmFtZSJdLCJjbGVhbktleXdvcmRzIjpbImNsZWFuS2V5d29yZHMiXSwiY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQiOlsiY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQiXSwiY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCI6WyJjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkIl0sImNsZWFuUHJvcG9zYWwiOlsiY2xlYW5Qcm9wb3NhbCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACaqDlCvBAAALwQAAA0AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiXSwiZXhwb3J0cyI6WyJpc09mZmVyU2FmZSIsInNhdGlzZmllc1dhbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50TWF0aDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNPZmZlclNhZmUsICduYW1lJywge3ZhbHVlOiBcImlzT2ZmZXJTYWZlXCJ9KTskaOKAjV9vbmNlLmlzT2ZmZXJTYWZlKGlzT2ZmZXJTYWZlKTsgICBcblxuLyoqXG4gKiBIZWxwZXIgdG8gcGVyZm9ybSBzYXRpc2ZpZXNXYW50IGFuZCBzYXRpc2ZpZXNHaXZlLiBJc1xuICogYWxsb2NhdGlvbkFtb3VudCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcmVxdWlyZWRBbW91bnQgZm9yIGV2ZXJ5XG4gKiBrZXl3b3JkIG9mIGdpdmVPcldhbnQ/XG4gKlxuICogVG8gcHJlcGFyZSBmb3IgbXVsdGlwbGVzLCBzYXRpc2ZpZXNXYW50IGFuZCBzYXRpc2ZpZXNHaXZlIHJldHVybiAwIG9yIDEuXG4gKiBpc09mZmVyU2FmZSB3aWxsIHN0aWxsIGJlIGJvb2xlYW4uIFdoZW4gd2UgaGF2ZSBNdWx0aXBsZXMsIHNhdGlzZmllc1dhbnQgYW5kXG4gKiBzYXRpc2ZpZXNHaXZlIHdpbGwgdGVsbCBob3cgbWFueSB0aW1lcyB0aGUgb2ZmZXIgd2FzIG1hdGNoZWQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBnaXZlT3JXYW50XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb25cbiAqIEByZXR1cm5zIHswfDF9XG4gKi9cbmNvbnN0IHNhdGlzZmllc0ludGVybmFsPShnaXZlT3JXYW50PXt9LGFsbG9jYXRpb24pPT57XG5jb25zdCBpc0dURUJ5S2V5d29yZD0oW2tleXdvcmQscmVxdWlyZWRBbW91bnRdKT0+e1xuLyogSWYgdGhlcmUgaXMgbm8gYWxsb2NhdGlvbiBmb3IgYSBrZXl3b3JkLCB3ZSBrbm93IHRoZSBnaXZlT3JXYW50Ki9cbi8qIGlzIG5vdCBzYXRpc2ZpZWQgd2l0aG91dCBjaGVja2luZyBmdXJ0aGVyLiovXG5pZihhbGxvY2F0aW9uW2tleXdvcmRdPT09dW5kZWZpbmVkKXtcbnJldHVybiAwO1xuIH1cbmNvbnN0IGFsbG9jYXRpb25BbW91bnQ9YWxsb2NhdGlvbltrZXl3b3JkXTtcbnJldHVybiBBbW91bnRNYXRoLmlzR1RFKGFsbG9jYXRpb25BbW91bnQscmVxdWlyZWRBbW91bnQpPzE6MDtcbiB9O1xucmV0dXJuIE9iamVjdC5lbnRyaWVzKGdpdmVPcldhbnQpLmV2ZXJ5KGlzR1RFQnlLZXl3b3JkKT8xOjA7XG4gfTtcblxuLyoqXG4gKiBGb3IgdGhpcyBhbGxvY2F0aW9uIHRvIHNhdGlzZnkgd2hhdCB0aGUgdXNlciB3YW50ZWQsIHRoZWlyXG4gKiBhbGxvY2F0ZWQgYW1vdW50cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBwcm9wb3NhbC53YW50LlxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovXG5jb25zdCBzYXRpc2ZpZXNXYW50PShwcm9wb3NhbCxhbGxvY2F0aW9uKT0+XG5zYXRpc2ZpZXNJbnRlcm5hbChwcm9wb3NhbC53YW50LGFsbG9jYXRpb24pO1xuXG4vKipcbiAqIEZvciB0aGlzIGFsbG9jYXRpb24gdG8gY291bnQgYXMgYSBmdWxsIHJlZnVuZCwgdGhlIGFsbG9jYXRlZFxuICogYW1vdW50cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB3aGF0IHdhcyBvcmlnaW5hbGx5XG4gKiBvZmZlcmVkIChwcm9wb3NhbC5naXZlKS5cbiAqXG4gKiBAcGFyYW0gIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWwgLSB0aGUgcnVsZXMgdGhhdCBhY2NvbXBhbmllZCB0aGVcbiAqIGVzY3JvdyBvZiBwYXltZW50cyB0aGF0IGRpY3RhdGUgd2hhdCB0aGUgdXNlciBleHBlY3RlZCB0byBnZXQgYmFja1xuICogZnJvbSBab2UuIEEgcHJvcG9zYWwgaXMgYSByZWNvcmQgd2l0aCBrZXlzIGBnaXZlYCwgYHdhbnRgLCBhbmRcbiAqIGBleGl0YC4gYGdpdmVgIGFuZCBgd2FudGAgYXJlIHJlY29yZHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZFxuICogYW1vdW50cyBhcyB2YWx1ZXMuIFRoZSBwcm9wb3NhbCBpcyBhIHVzZXIncyB1bmRlcnN0YW5kaW5nIG9mIHRoZVxuICogY29udHJhY3QgdGhhdCB0aGV5IGFyZSBlbnRlcmluZyB3aGVuIHRoZXkgbWFrZSBhbiBvZmZlci5cbiAqIEBwYXJhbSAge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovJGjigI1fb25jZS5zYXRpc2ZpZXNXYW50KHNhdGlzZmllc1dhbnQpO1xuY29uc3Qgc2F0aXNmaWVzR2l2ZT0ocHJvcG9zYWwsYWxsb2NhdGlvbik9Plxuc2F0aXNmaWVzSW50ZXJuYWwocHJvcG9zYWwuZ2l2ZSxhbGxvY2F0aW9uKTtcblxuLyoqXG4gKiBgaXNPZmZlclNhZmVgIGNoZWNrcyBvZmZlciBzYWZldHkgZm9yIGEgc2luZ2xlIG9mZmVyLlxuICpcbiAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gY2hlY2tzIHdoZXRoZXIgd2UgZnVsbHkgc2F0aXNmeVxuICogYHByb3Bvc2FsLmdpdmVgIChnaXZpbmcgYSByZWZ1bmQpIG9yIHdoZXRoZXIgd2UgZnVsbHkgc2F0aXNmeVxuICogYHByb3Bvc2FsLndhbnRgLiBCb3RoIGNhbiBiZSBmdWxseSBzYXRpc2ZpZWQuXG4gKlxuICogQHBhcmFtICB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0gIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqL1xuZnVuY3Rpb24gaXNPZmZlclNhZmUocHJvcG9zYWwsYWxsb2NhdGlvbil7XG5yZXR1cm4oXG5zYXRpc2ZpZXNHaXZlKHByb3Bvc2FsLGFsbG9jYXRpb24pPjB8fFxuc2F0aXNmaWVzV2FudChwcm9wb3NhbCxhbGxvY2F0aW9uKT4wKTtcblxuIH1cblxuaGFyZGVuKGlzT2ZmZXJTYWZlKTtcbmhhcmRlbihzYXRpc2ZpZXNXYW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzYXRpc2ZpZXNXYW50IjpbInNhdGlzZmllc1dhbnQiXSwiaXNPZmZlclNhZmUiOlsiaXNPZmZlclNhZmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApH1jNjMRAAAzEQAAMAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2luc3RhbmNlUmVjb3JkU3RvcmFnZS5qc3siaW1wb3J0cyI6WyIuL2NsZWFuUHJvcG9zYWwuanMiLCIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsibWFrZUluc3RhbmNlUmVjb3JkU3RvcmFnZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwcm92aWRlLHByZXBhcmVFeG9DbGFzcyxNLGFzc2VydEtleXdvcmROYW1lLEJyYW5kS2V5d29yZFJlY29yZFNoYXBlLEluc3RhbGxhdGlvblNoYXBlLEluc3RhbmNlUmVjb3JkU2hhcGUsSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlLElzc3VlclJlY29yZFNoYXBlLEtleXdvcmRTaGFwZSxUZXJtc1NoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9DbGFzc1wiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIi4vY2xlYW5Qcm9wb3NhbC5qc1wiLCBbW1wiYXNzZXJ0S2V5d29yZE5hbWVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleXdvcmROYW1lID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJJbnN0YWxsYXRpb25TaGFwZVwiLCBbJGjigI1fYSA9PiAoSW5zdGFsbGF0aW9uU2hhcGUgPSAkaOKAjV9hKV1dLFtcIkluc3RhbmNlUmVjb3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEluc3RhbmNlUmVjb3JkU2hhcGUgPSAkaOKAjV9hKV1dLFtcIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJJc3N1ZXJSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoSXNzdWVyUmVjb3JkU2hhcGUgPSAkaOKAjV9hKV1dLFtcIktleXdvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoS2V5d29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJUZXJtc1NoYXBlXCIsIFskaOKAjV9hID0+IChUZXJtc1NoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogVGhlIEluc3RhbmNlUmVjb3JkIHN0b3JlcyB0aGUgaW5zdGFsbGF0aW9uLCBjdXN0b21UZXJtcywgaXNzdWVycyxcbiAqIGFuZCBicmFuZHMgZm9yIGEgcGFydGljdWxhciBab2UgY29udHJhY3QgaW5zdGFuY2UuIFRoZSBpbnN0YWxsYXRpb25cbiAqIGFuZCBjdXN0b21UZXJtcyBhcmUgbmV2ZXIgY2hhbmdlZCwgYnV0IG5ldyBpc3N1ZXJzIChhbmQgdGhlaXJcbiAqIG1hdGNoaW5nIGJyYW5kcykgbWF5IGJlIGFkZGVkIGJ5IHRoZSBjb250cmFjdCBjb2RlLiBUaHVzLCBhblxuICogSW5zdGFuY2VSZWNvcmQgbWF5IGJlIG91dGRhdGVkIGF0IGFueSBwYXJ0aWN1bGFyIHBvaW50LiBUaGlzIGNsYXNzXG4gKiBtYW5hZ2VzIHRoZSBjcmVhdGlvbiBhbmQgdXBkYXRpbmcgb2YgYW4gSW5zdGFuY2VSZWNvcmQgYW5kIHByb3ZpZGVzXG4gKiBmdW5jdGlvbnMgZm9yIGdldHRpbmcgdGhlIGxhdGVzdCBkYXRhLlxuICovXG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHJldHVybnMgeyhpcjogSW5zdGFuY2VSZWNvcmQpID0+IEluc3RhbmNlU3RhdGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSW5zdGFuY2VSZWNvcmRTdG9yYWdlPShiYWdnYWdlKT0+e1xucHJvdmlkZShiYWdnYWdlLCdpbnN0YW5jZVJlY29yZCcsKCk9PnVuZGVmaW5lZCk7XG5cbmNvbnN0IGFzc2VydEluc3RhbnRpYXRlZD0oaW5zdGFuY2VSZWNvcmQpPT57XG5pbnN0YW5jZVJlY29yZCE9PSd1bmRlZmluZWQnfHxcbkZhaWwgYGluc3RhbmNlUmVjb3JkIGhhcyBub3QgYmVlbiBpbnN0YW50aWF0ZWRgO1xuIH07XG5cbmNvbnN0IEluc3RhbmNlUmVjb3JkST1NLmludGVyZmFjZSgnSW5zdGFuY2VSZWNvcmQnLHtcbmFkZElzc3VlcjpNLmNhbGwoS2V5d29yZFNoYXBlLElzc3VlclJlY29yZFNoYXBlKS5yZXR1cm5zKCksXG5nZXRJbnN0YW5jZVJlY29yZDpNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlUmVjb3JkU2hhcGUpLFxuZ2V0VGVybXM6TS5jYWxsKCkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbmdldEluc3RhbGxhdGlvbjpNLmNhbGwoKS5yZXR1cm5zKEluc3RhbGxhdGlvblNoYXBlKSxcbmdldElzc3VlcnM6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0QnJhbmRzOk0uY2FsbCgpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuYXNzZXJ0VW5pcXVlS2V5d29yZDpNLmNhbGwoS2V5d29yZFNoYXBlKS5yZXR1cm5zKCl9KTtcblxuXG5jb25zdCBtYWtlSW5zdGFuY2VSZWNvcmQ9cHJlcGFyZUV4b0NsYXNzKFxuYmFnZ2FnZSxcbidJbnN0YW5jZVJlY29yZCcsXG5JbnN0YW5jZVJlY29yZEksXG4ocmVjb3JkKT0+aGFyZGVuKHtpbnN0YW5jZVJlY29yZDpyZWNvcmR9KSxcbntcbmFkZElzc3VlcihrZXl3b3JkLGlzc3VlclJlY29yZCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbiFvd25LZXlzKGlzc3VlclJlY29yZCkuaW5jbHVkZXMoa2V5d29yZCl8fFxuRmFpbCBgY29uZmxpY3RpbmcgZGVmaW5pdGlvbiBvZiAke3Eoa2V5d29yZCl9YDtcblxuYXNzZXJ0SW5zdGFudGlhdGVkKHN0YXRlLmluc3RhbmNlUmVjb3JkKTtcbmNvbnN0IGluc3RhbmNlUmVjb3JkPXN0YXRlLmluc3RhbmNlUmVjb3JkO1xuY29uc3QgbmV4dEluc3RhbmNlUmVjb3JkPWhhcmRlbih7XG4uLi5pbnN0YW5jZVJlY29yZCxcbnRlcm1zOntcbi4uLmluc3RhbmNlUmVjb3JkLnRlcm1zLFxuaXNzdWVyczp7XG4uLi5pbnN0YW5jZVJlY29yZC50ZXJtcy5pc3N1ZXJzLFxuW2tleXdvcmRdOmlzc3VlclJlY29yZC5pc3N1ZXJ9LFxuXG5icmFuZHM6e1xuLi4uaW5zdGFuY2VSZWNvcmQudGVybXMuYnJhbmRzLFxuW2tleXdvcmRdOmlzc3VlclJlY29yZC5icmFuZH19fSk7XG5cblxuXG5zdGF0ZS5pbnN0YW5jZVJlY29yZD1uZXh0SW5zdGFuY2VSZWNvcmQ7XG4gfSxcbmdldEluc3RhbmNlUmVjb3JkKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbmFzc2VydEluc3RhbnRpYXRlZChzdGF0ZS5pbnN0YW5jZVJlY29yZCk7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VSZWNvcmQ7XG4gfSxcbmdldFRlcm1zKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbmFzc2VydEluc3RhbnRpYXRlZChzdGF0ZS5pbnN0YW5jZVJlY29yZCk7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VSZWNvcmQudGVybXM7XG4gfSxcbmdldEluc3RhbGxhdGlvbigpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5hc3NlcnRJbnN0YW50aWF0ZWQoc3RhdGUuaW5zdGFuY2VSZWNvcmQpO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlUmVjb3JkLmluc3RhbGxhdGlvbjtcbiB9LFxuZ2V0SXNzdWVycygpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5hc3NlcnRJbnN0YW50aWF0ZWQoc3RhdGUuaW5zdGFuY2VSZWNvcmQpO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlUmVjb3JkLnRlcm1zLmlzc3VlcnM7XG4gfSxcbmdldEJyYW5kcygpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5hc3NlcnRJbnN0YW50aWF0ZWQoc3RhdGUuaW5zdGFuY2VSZWNvcmQpO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlUmVjb3JkLnRlcm1zLmJyYW5kcztcbiB9LFxuYXNzZXJ0VW5pcXVlS2V5d29yZChrZXl3b3JkKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuYXNzZXJ0SW5zdGFudGlhdGVkKHN0YXRlLmluc3RhbmNlUmVjb3JkKTtcbmFzc2VydEtleXdvcmROYW1lKGtleXdvcmQpO1xuIW93bktleXMoc3RhdGUuaW5zdGFuY2VSZWNvcmQudGVybXMuaXNzdWVycykuaW5jbHVkZXMoa2V5d29yZCl8fFxuRmFpbCBga2V5d29yZCAke3Eoa2V5d29yZCl9IG11c3QgYmUgdW5pcXVlYDtcbiB9fSk7XG5cblxuXG5yZXR1cm4gbWFrZUluc3RhbmNlUmVjb3JkO1xuIH07JGjigI1fb25jZS5tYWtlSW5zdGFuY2VSZWNvcmRTdG9yYWdlKG1ha2VJbnN0YW5jZVJlY29yZFN0b3JhZ2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VJbnN0YW5jZVJlY29yZFN0b3JhZ2UiOlsibWFrZUluc3RhbmNlUmVjb3JkU3RvcmFnZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABtMTtZuScAALknAAApAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvaW50ZXJuYWwtdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAamVzc2llLWNoZWNrKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWF0RGF0YVxuICogQHByb3BlcnR5IHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWxcbiAqIEBwcm9wZXJ0eSB7QWxsb2NhdGlvbn0gaW5pdGlhbEFsbG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7U2VhdEhhbmRsZX0gc2VhdEhhbmRsZVxuICogQHByb3BlcnR5IHtvYmplY3R9IFtvZmZlckFyZ3NdXG4gKi9cblxuLyoqXG4gKiBHaXZlbiBhbiBhbGxvY2F0aW9uLCB3aXRoZHJhdyBwYXltZW50cyB0byBjcmVhdGUgYSBwYXlvdXRcbiAqXG4gKiBAY2FsbGJhY2sgV2l0aGRyYXdQYXltZW50c1xuICogQHBhcmFtIHtBbGxvY2F0aW9ufSBhbGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7UGF5bWVudFBLZXl3b3JkUmVjb3JkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgV2l0aGRyYXdGYWNldFxuICogQHByb3BlcnR5IHsoYWxsb2NhdGlvbjpBbGxvY2F0aW9uKSA9PiBQYXltZW50UEtleXdvcmRSZWNvcmR9IHdpdGhkcmF3UGF5bWVudHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluc3RhbmNlQWRtaW5IZWxwZXJcbiAqIEBwcm9wZXJ0eSB7KHpvZVNlYXRBZG1pbjogWm9lU2VhdEFkbWluKSA9PiB2b2lkfSBleGl0Wm9lU2VhdEFkbWluXG4gKiBAcHJvcGVydHkgeyh6b2VTZWF0QWRtaW46IFpvZVNlYXRBZG1pbikgPT4gYm9vbGVhbn0gaGFzRXhpdGVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBab2VTZWF0QWRtaW5LaXRcbiAqIEBwcm9wZXJ0eSB7VXNlclNlYXR9IHVzZXJTZWF0XG4gKiBAcHJvcGVydHkge1pvZVNlYXRBZG1pbn0gem9lU2VhdEFkbWluXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZVpvZVNlYXRBZG1pbktpdFxuICogTWFrZSB0aGUgWm9lIHNlYXQgYWRtaW4sIHVzZXIgc2VhdCBhbmQgYSBub3RpZmllclxuICogQHBhcmFtIHtBbGxvY2F0aW9ufSBpbml0aWFsQWxsb2NhdGlvblxuICogQHBhcmFtIHtJbnN0YW5jZUFkbWluSGVscGVyfSBpbnN0YW5jZUFkbWluSGVscGVyXG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbFxuICogQHBhcmFtIHtXaXRoZHJhd0ZhY2V0fSB3aXRoZHJhd0ZhY2V0XG4gKiBAcGFyYW0ge0VSZWY8RXhpdE9iaj59IGV4aXRPYmpcbiAqIEBwYXJhbSB7RVJlZjx1bmtub3duPn0gW29mZmVyUmVzdWx0XVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHJldHVybnMge1pvZVNlYXRBZG1pbktpdH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBab2VTZWF0QWRtaW5FeGl0XG4gKiBAcGFyYW0ge0NvbXBsZXRpb259IFtjb21wbGV0aW9uXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBab2VTZWF0QWRtaW5cbiAqIEBwcm9wZXJ0eSB7KGFsbG9jYXRpb246IEFsbG9jYXRpb24pID0+IHZvaWR9IHJlcGxhY2VBbGxvY2F0aW9uXG4gKiBAcHJvcGVydHkge1pvZVNlYXRBZG1pbkV4aXR9IGV4aXRcbiAqIEBwcm9wZXJ0eSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gZmFpbCBjYWxsZWQgd2l0aCB0aGUgcmVhc29uXG4gKiBmb3IgY2FsbGluZyBmYWlsIG9uIHRoaXMgc2VhdCwgd2hlcmUgcmVhc29uIGlzIG5vcm1hbGx5IGFuIGluc3RhbmNlb2YgRXJyb3IuXG4gKiBAcHJvcGVydHkgeygpID0+IFN1YnNjcmliZXI8QW1vdW50S2V5d29yZFJlY29yZD59IGdldEV4aXRTdWJzY3JpYmVyXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgeyhicmFuZDogQnJhbmQpID0+IEFzc2V0S2luZH0gR2V0QXNzZXRLaW5kXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBIYW5kbGVPZmZlclJlc3VsdFxuICogQHByb3BlcnR5IHtQcm9taXNlPHVua25vd24+fSBvZmZlclJlc3VsdFByb21pc2VcbiAqIEBwcm9wZXJ0eSB7RXhpdE9ian0gZXhpdE9ialxuICovXG5cbi8qKlxuICogVGhlIHNlYXRIYW5kbGUgbWF5IGJlIGNyZWF0ZWQgaW4gZWl0aGVyIHRoZSBab2Ugb3IgWkNGIHZhdCxcbiAqIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBzZWF0IGNvbWVzIGZyb20gYSBub3JtYWwgb2ZmZXIgb3IgYVxuICogcmVxdWVzdCBieSB0aGUgY29udHJhY3QgZm9yIGFuIFwiZW1wdHlcIiBzZWF0LlxuICpcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluc3RhbmNlQWRtaW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gYXNzZXJ0QWNjZXB0aW5nT2ZmZXJzXG4gKiBAcHJvcGVydHkgeyhpbnZpdGF0aW9uSGFuZGxlOiBJbnZpdGF0aW9uSGFuZGxlLFxuICogICAgIGluaXRpYWxBbGxvY2F0aW9uOiBBbGxvY2F0aW9uLFxuICogICAgIHByb3Bvc2FsOiBQcm9wb3NhbFJlY29yZCxcbiAqICAgICBvZmZlckFyZ3M/OiBvYmplY3QsXG4gKiApID0+IFVzZXJTZWF0IH0gbWFrZVVzZXJTZWF0XG4gKiBAcHJvcGVydHkge01ha2VOb0VzY3Jvd1NlYXR9IG1ha2VOb0VzY3Jvd1NlYXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldEluc3RhbmNlXG4gKiBAcHJvcGVydHkgeygpID0+IG9iamVjdH0gZ2V0UHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXNzdWVyS2V5d29yZFJlY29yZH0gZ2V0SXNzdWVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZEtleXdvcmRSZWNvcmR9IGdldEJyYW5kc1xuICogQHByb3BlcnR5IHsoKSA9PiBvYmplY3R9IGdldFRlcm1zXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ1tdfSBnZXRPZmZlckZpbHRlclxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YWxsYXRpb259IGdldEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogQ29tcGxldGlvbikgPT4gdm9pZH0gZXhpdEFsbFNlYXRzXG4gKiBAcHJvcGVydHkge1NodXRkb3duV2l0aEZhaWx1cmV9IGZhaWxBbGxTZWF0c1xuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBzdG9wQWNjZXB0aW5nT2ZmZXJzXG4gKiBAcHJvcGVydHkgeyhzdHJpbmc6IHN0cmluZykgPT4gYm9vbGVhbn0gaXNCbG9ja2VkXG4gKiBAcHJvcGVydHkgeyhoYW5kbGVPZmZlck9iajogSGFuZGxlT2ZmZXJPYmosIHB1YmxpY0ZhY2V0OiB1bmtub3duKSA9PiB2b2lkfSBpbml0RGVsYXllZFN0YXRlXG4gKiBAcHJvcGVydHkgeyhzdHJpbmdzOiBzdHJpbmdbXSkgPT4gdm9pZH0gc2V0T2ZmZXJGaWx0ZXJcbiAqL1xuXG4vKipcbiAqIFRoZSBzZWF0SGFuZGxlIG1heSBiZSBjcmVhdGVkIGluIGVpdGhlciB0aGUgWm9lIG9yIFpDRiB2YXQsXG4gKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgc2VhdCBjb21lcyBmcm9tIGEgbm9ybWFsIG9mZmVyIG9yIGFcbiAqIHJlcXVlc3QgYnkgdGhlIGNvbnRyYWN0IGZvciBhbiBcImVtcHR5XCIgc2VhdC5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBIYW5kbGVPZmZlck9ialxuICogQHByb3BlcnR5IHsoaW52aXRhdGlvbkhhbmRsZTogSW52aXRhdGlvbkhhbmRsZSxcbiAqICAgICAgICAgICAgIHNlYXREYXRhOiBTZWF0RGF0YSxcbiAqICAgICAgICAgICAgKSA9PiBIYW5kbGVPZmZlclJlc3VsdH0gaGFuZGxlT2ZmZXJcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBab2VJbnN0YW5jZUFkbWluTWFrZUludml0YXRpb25cbiAqIEBwYXJhbSB7SW52aXRhdGlvbkhhbmRsZX0gaW52aXRhdGlvbkhhbmRsZVxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtjdXN0b21EZXRhaWxzXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbcHJvcG9zYWxTaGFwZV1cbiAqIEByZXR1cm5zIHtJbnZpdGF0aW9ufVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWm9lSW5zdGFuY2VBZG1pblxuICogQHByb3BlcnR5IHtab2VJbnN0YW5jZUFkbWluTWFrZUludml0YXRpb259IG1ha2VJbnZpdGF0aW9uXG4gKiBAcHJvcGVydHkgeyhpc3N1ZXJQOiBFUmVmPElzc3Vlcj4sXG4gKiAgICAgICAgICAgICBrZXl3b3JkOiBLZXl3b3JkXG4gKiAgICAgICAgICAgICkgPT4gUHJvbWlzZTxJc3N1ZXJSZWNvcmQ+fSBzYXZlSXNzdWVyXG4gKiBAcHJvcGVydHkge01ha2Vab2VNaW50fSBtYWtlWm9lTWludFxuICogQHByb3BlcnR5IHtSZWdpc3RlckZlZU1pbnR9IHJlZ2lzdGVyRmVlTWludFxuICogQHByb3BlcnR5IHtNYWtlTm9Fc2Nyb3dTZWF0fSBtYWtlTm9Fc2Nyb3dTZWF0XG4gKiBAcHJvcGVydHkge1JlcGxhY2VBbGxvY2F0aW9uc30gcmVwbGFjZUFsbG9jYXRpb25zXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBDb21wbGV0aW9uKSA9PiB2b2lkfSBleGl0QWxsU2VhdHNcbiAqIEBwcm9wZXJ0eSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gZmFpbEFsbFNlYXRzXG4gKiBAcHJvcGVydHkgeyhzZWF0SGFuZGxlOiBTZWF0SGFuZGxlLCBjb21wbGV0aW9uOiBDb21wbGV0aW9uKSA9PiB2b2lkfSBleGl0U2VhdFxuICogQHByb3BlcnR5IHsoc2VhdEhhbmRsZTogU2VhdEhhbmRsZSwgcmVhc29uOiBFcnJvcikgPT4gdm9pZH0gZmFpbFNlYXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gc3RvcEFjY2VwdGluZ09mZmVyc1xuICogQHByb3BlcnR5IHsoc3RyaW5nczogQXJyYXk8c3RyaW5nPikgPT4gdm9pZH0gc2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQXJyYXk8c3RyaW5nPn0gZ2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KHNlYXRIYW5kbGU6IFNlYXRIYW5kbGUpID0+IFN1YnNjcmliZXI8QW1vdW50S2V5d29yZFJlY29yZD59IGdldEV4aXRTdWJzY3JpYmVyXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmVnaXN0ZXJGZWVNaW50XG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmQgLSB0aGUga2V5d29yZCB0byB1c2UgZm9yIHRoZSBpc3N1ZXJcbiAqIEBwYXJhbSB7RmVlTWludEFjY2Vzc30gYWxsZWdlZEZlZU1pbnRBY2Nlc3MgLSBhbiBvYmplY3QgdGhhdFxuICogcHVycG9ydHMgdG8gYmUgdGhlIG9iamVjdCB0aGF0IGFsbG93cyBhY2Nlc3MgdG8gdGhlIGZlZU1pbnRcbiAqIEByZXR1cm5zIHtab2VNaW50PCduYXQnPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBXcmFwSXNzdWVyS2l0V2l0aFpvZU1pbnRcbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZCAtIHRoZSBrZXl3b3JkIHRvIHVzZSBmb3IgdGhlIGlzc3VlclxuICogQHBhcmFtIHtJc3N1ZXJLaXR9IGxvY2FsSXNzdWVyS2l0IC0gYW4gaXNzdWVyIGtpdCB0aGF0IG9yaWdpbmF0ZXNcbiAqIHdpdGhpbiBab2VcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlWm9lTWludFxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gW2Fzc2V0S2luZF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm9dXG4gKiBAcGFyYW0ge0lzc3Vlck9wdGlvbnNSZWNvcmR9IFtvcHRpb25zXVxuICogQHJldHVybnMge1pvZU1pbnR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZU5vRXNjcm93U2VhdFxuICogQHBhcmFtIHtBbGxvY2F0aW9ufSBpbml0aWFsQWxsb2NhdGlvblxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWxcbiAqIEBwYXJhbSB7RXhpdE9ian0gZXhpdE9ialxuICogQHBhcmFtIHtTZWF0SGFuZGxlfSBzZWF0SGFuZGxlXG4gKiBAcmV0dXJucyB7VXNlclNlYXR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmVwbGFjZUFsbG9jYXRpb25zXG4gKiBAcGFyYW0ge1NlYXRIYW5kbGVBbGxvY2F0aW9uW119IHNlYXRIYW5kbGVBbGxvY2F0aW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VhdEhhbmRsZUFsbG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7U2VhdEhhbmRsZX0gc2VhdEhhbmRsZVxuICogQHByb3BlcnR5IHtBbGxvY2F0aW9ufSBhbGxvY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gWm9lTWludFxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJSZWNvcmQ8Sz59IGdldElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHsodG90YWxUb01pbnQ6IEFtb3VudDxLPikgPT4gdm9pZH0gbWludEFuZEVzY3Jvd1xuICogQHByb3BlcnR5IHsodG90YWxUb0J1cm46IEFtb3VudDxLPikgPT4gdm9pZH0gd2l0aGRyYXdBbmRCdXJuXG4gKiBOb3RlIHRoYXQgdGhlIGJ1cm5pbmcgaXMgYXN5bmNocm9ub3VzLCBhbmQgc28gbWF5IG5vdCBoYXZlIGhhcHBlbmVkIGJ5XG4gKiB0aGUgdGltZSB3aXRoZHJhd0FuZEJ1cm4gcmV0dXJucy4gV2UgcmVseSBvbiBvdXIgb3RoZXIgYm9va2tlZXBpbmcgc28gdGhhdFxuICogdGhlc2UgYXNzZXRzIGFyZSBhc3N1bWVkIGJ1cm5lZCBlbHNld2hlcmUsIHNvIG5vIG9uZSB3aWxsIHRyeSB0byBhY2Nlc3NcbiAqIHRoZW0gZXZlbiBiZWZvcmUgdGhleSBhcmUgYWN0dWFsbHkgYnVybmVkLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWkNGUm9vdFxuICogQHByb3BlcnR5IHtTdGFydFpjZn0gc3RhcnRaY2ZcbiAqIEBwcm9wZXJ0eSB7UmVzdGFydENvbnRyYWN0fSByZXN0YXJ0Q29udHJhY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEV4ZWN1dGVDb250cmFjdFJlc3VsdFxuICogQHByb3BlcnR5IHtvYmplY3R9IGNyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtQcm9taXNlPEludml0YXRpb24+fSBjcmVhdG9ySW52aXRhdGlvblxuICogQHByb3BlcnR5IHtvYmplY3R9IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge0hhbmRsZU9mZmVyT2JqfSBoYW5kbGVPZmZlck9ialxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFN0YXJ0WmNmXG4gKiBAcGFyYW0ge0VSZWY8Wm9lSW5zdGFuY2VBZG1pbj59IHpvZUluc3RhbmNlQWRtaW5cbiAqIEBwYXJhbSB7SW5zdGFuY2VSZWNvcmR9IGluc3RhbmNlUmVjb3JkRnJvbVpvZVxuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmRzfSBpc3N1ZXJTdG9yYWdlRnJvbVpvZVxuICogQHBhcmFtIHtvYmplY3R9IFtwcml2YXRlQXJnc11cbiAqIEByZXR1cm5zIHtQcm9taXNlPEV4ZWN1dGVDb250cmFjdFJlc3VsdD59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmVzdGFydENvbnRyYWN0XG4gKiBAcGFyYW0ge29iamVjdH0gW3ByaXZhdGVBcmdzXVxuICogQHJldHVybnMge1Byb21pc2U8RXhlY3V0ZVVwZ3JhZGVhYmxlQ29udHJhY3RSZXN1bHQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VFeGl0T2JqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbFxuICogQHBhcmFtIHtaQ0ZTZWF0fSB6b2VTZWF0QWRtaW5cbiAqIEByZXR1cm5zIHtFeGl0T2JqfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRXhpdE9ialxuICogQHByb3BlcnR5IHsoKSA9PiB2b2lkfSBleGl0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SGFuZGxlPCdTZWF0Jz59IFNlYXRIYW5kbGVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRBc3NldEtpbmRCeUJyYW5kXG4gKiBHZXQgdGhlIGFzc2V0S2luZCBmb3IgYSBicmFuZCBrbm93biBieSBab2VcbiAqXG4gKiBUbyBiZSBkZWxldGVkIHdoZW4gYnJhbmRzIGhhdmUgYSBwcm9wZXJ0eSBmb3IgYXNzZXRLaW5kXG4gKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEByZXR1cm5zIHtBc3NldEtpbmR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7QXJyYXk8SXNzdWVyUmVjb3JkPn0gSXNzdWVyUmVjb3Jkc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VaQ0ZTZWF0XG4gKiBAcGFyYW0ge1NlYXREYXRhfSBzZWF0RGF0YVxuICogQHJldHVybnMge1pDRlNlYXR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgRHJvcEFsbFJlZmVyZW5jZXNcbiAqXG4gKiBEcm9wcyBhbGwgb2YgdGhlIHJlZmVyZW5jZXMgaW4gdGhlIHNlYXQtcmVsYXRlZCB3ZWFrU3RvcmVzIGJ5XG4gKiBkcm9wcGluZyB0aGUgc3RvcmVzXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpjZlNlYXRNYW5hZ2VyXG4gKiBAcHJvcGVydHkge01ha2VaQ0ZTZWF0fSBtYWtlWkNGU2VhdFxuICogQHByb3BlcnR5IHtSZWFsbG9jYXRlfSByZWFsbG9jYXRlXG4gKiBAcHJvcGVydHkge0Ryb3BBbGxSZWZlcmVuY2VzfSBkcm9wQWxsUmVmZXJlbmNlc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWmNmTWludFJlYWxsb2NhdG9yXG4gKiBAcHJvcGVydHkgeyh6Y2ZTZWF0OiBaQ0ZTZWF0LCBuZXdBbGxvY2F0aW9uOiBBbGxvY2F0aW9uKSA9PiB2b2lkfSByZWFsbG9jYXRlXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ3JlYXRlU2VhdE1hbmFnZXJcbiAqXG4gKiBUaGUgU2VhdE1hbmFnZXIgaG9sZHMgdGhlIGFjdGl2ZSB6Y2ZTZWF0cyBhbmQgY2FuIHJlYWxsb2NhdGUgYW5kXG4gKiBtYWtlIG5ldyB6Y2ZTZWF0cy5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lSW5zdGFuY2VBZG1pbj59IHpvZUluc3RhbmNlQWRtaW5cbiAqIEBwYXJhbSB7R2V0QXNzZXRLaW5kQnlCcmFuZH0gZ2V0QXNzZXRLaW5kQnlCcmFuZFxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBzaHV0ZG93bldpdGhGYWlsdXJlXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSB6Y2ZCYWdnYWdlXG4gKiBAcmV0dXJucyB7eyBzZWF0TWFuYWdlcjogWmNmU2VhdE1hbmFnZXIsIHpjZk1pbnRSZWFsbG9jYXRvcjogWmNmTWludFJlYWxsb2NhdG9yIH19XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFuY2VTdGF0ZUFkZElzc3VlclxuICpcbiAqIEFkZCBhbiBpc3N1ZXIgYW5kIGl0cyBrZXl3b3JkIHRvIHRoZSBpbnN0YW5jZVJlY29yZCBmb3IgdGhlXG4gKiBjb250cmFjdCBpbnN0YW5jZVxuICpcbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZFxuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmR9IGlzc3VlclJlY29yZFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFuY2VTdGF0ZUdldFRlcm1zXG4gKiBAcmV0dXJucyB7QW55VGVybXN9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFuY2VTdGF0ZUdldEluc3RhbGxhdGlvblxuICogQHJldHVybnMge0luc3RhbGxhdGlvbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YW5jZVJlY29yZEdldElzc3VlcnNcbiAqIEByZXR1cm5zIHtJc3N1ZXJLZXl3b3JkUmVjb3JkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEluc3RhbmNlUmVjb3JkR2V0QnJhbmRzXG4gKiBAcmV0dXJucyB7QnJhbmRLZXl3b3JkUmVjb3JkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5zdGFuY2VTdGF0ZVxuICogQHByb3BlcnR5IHtJbnN0YW5jZVN0YXRlQWRkSXNzdWVyfSBhZGRJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7R2V0SW5zdGFuY2VSZWNvcmR9IGdldEluc3RhbmNlUmVjb3JkXG4gKiBAcHJvcGVydHkge0luc3RhbmNlU3RhdGVHZXRUZXJtc30gZ2V0VGVybXNcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VTdGF0ZUdldEluc3RhbGxhdGlvbn0gZ2V0SW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkge0luc3RhbmNlUmVjb3JkR2V0SXNzdWVyc30gZ2V0SXNzdWVyc1xuICogQHByb3BlcnR5IHtJbnN0YW5jZVJlY29yZEdldEJyYW5kc30gZ2V0QnJhbmRzXG4gKiBAcHJvcGVydHkgeyhrZXl3b3JkOiBLZXl3b3JkKSA9PiB2b2lkfSBhc3NlcnRVbmlxdWVLZXl3b3JkXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5zdGFuY2VSZWNvcmRcbiAqIEByZXR1cm5zIHtJbnN0YW5jZVJlY29yZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJTdG9yYWdlR2V0SXNzdWVyUmVjb3Jkc1xuICogQHBhcmFtIHtJc3N1ZXJbXX0gaXNzdWVyc1xuICogQHJldHVybnMge0lzc3VlclJlY29yZHN9XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJozPqyYFAAAmBQAAJwAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2lzc3VlclJlY29yZC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbImFzc2VydEZ1bGxJc3N1ZXJSZWNvcmQiLCJtYWtlSXNzdWVyUmVjb3JkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhaWw7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKipcbiAqIFB1dCB0b2dldGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaXNzdWVyIGluIGEgc3RhbmRhcmQgZm9ybWF0IHRoYXRcbiAqIGlzIHN5bmNocm9ub3VzbHkgYWNjZXNzaWJsZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwYXJhbSB7RGlzcGxheUluZm88Sz59IGRpc3BsYXlJbmZvXG4gKiBAcmV0dXJucyB7SXNzdWVyUmVjb3JkPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUlzc3VlclJlY29yZD0oYnJhbmQsaXNzdWVyLGRpc3BsYXlJbmZvKT0+XG5oYXJkZW4oe1xuYnJhbmQsXG5pc3N1ZXIsXG5hc3NldEtpbmQ6ZGlzcGxheUluZm8uYXNzZXRLaW5kLFxuZGlzcGxheUluZm99KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7SXNzdWVyUmVjb3JkfSBpc3N1ZXJSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIGlzc3VlclJlY29yZCBpcyBSZXF1aXJlZDxJc3N1ZXJSZWNvcmQ+fVxuICovJGjigI1fb25jZS5tYWtlSXNzdWVyUmVjb3JkKG1ha2VJc3N1ZXJSZWNvcmQpO1xuY29uc3QgICAgICAgIGFzc2VydEZ1bGxJc3N1ZXJSZWNvcmQ9KGlzc3VlclJlY29yZCk9PntcbmlmKCFpc3N1ZXJSZWNvcmQuZGlzcGxheUluZm8pe1xudGhyb3cgRmFpbCBgZnVsbCBJc3N1ZXJSZWNvcmQgcmVxdWlyZXMgZGlzcGxheUluZm9gO1xuIH1cbiB9OyRo4oCNX29uY2UuYXNzZXJ0RnVsbElzc3VlclJlY29yZChhc3NlcnRGdWxsSXNzdWVyUmVjb3JkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSXNzdWVyUmVjb3JkIjpbIm1ha2VJc3N1ZXJSZWNvcmQiXSwiYXNzZXJ0RnVsbElzc3VlclJlY29yZCI6WyJhc3NlcnRGdWxsSXNzdWVyUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACvUFeJJHQAASR0AACgAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9pc3N1ZXJTdG9yYWdlLmpzeyJpbXBvcnRzIjpbIi4vY2xlYW5Qcm9wb3NhbC5qcyIsIi4vaXNzdWVyUmVjb3JkLmpzIiwiLi9vYmpBcnJheUNvbnZlcnNpb24uanMiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbInByb3ZpZGVJc3N1ZXJTdG9yYWdlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLEUsYXJyYXlUb09iaixjbGVhbktleXdvcmRzLG1ha2VJc3N1ZXJSZWNvcmQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9vYmpBcnJheUNvbnZlcnNpb24uanNcIiwgW1tcImFycmF5VG9PYmpcIiwgWyRo4oCNX2EgPT4gKGFycmF5VG9PYmogPSAkaOKAjV9hKV1dXV0sW1wiLi9jbGVhblByb3Bvc2FsLmpzXCIsIFtbXCJjbGVhbktleXdvcmRzXCIsIFskaOKAjV9hID0+IChjbGVhbktleXdvcmRzID0gJGjigI1fYSldXV1dLFtcIi4vaXNzdWVyUmVjb3JkLmpzXCIsIFtbXCJtYWtlSXNzdWVyUmVjb3JkXCIsIFskaOKAjV9hID0+IChtYWtlSXNzdWVyUmVjb3JkID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0IFNUT1JBR0VfSU5TVEFOVElBVEVEX0tFWT0nSXNzdWVyU3RvcmFnZUluc3RhbnRpYXRlZCc7XG5cbi8qKlxuICogTWFrZSB0aGUgSXNzdWVyIFN0b3JhZ2UuXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gemNmQmFnZ2FnZVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUlzc3VlclN0b3JhZ2U9KHpjZkJhZ2dhZ2UpPT57XG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxCcmFuZCxJc3N1ZXJSZWNvcmQ+fSAqL1xuY29uc3QgYnJhbmRUb0lzc3VlclJlY29yZD1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShcbnpjZkJhZ2dhZ2UsXG4nYnJhbmRUb0lzc3VlclJlY29yZCcpO1xuXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxJc3N1ZXIsSXNzdWVyUmVjb3JkPn0gKi9cbmNvbnN0IGlzc3VlclRvSXNzdWVyUmVjb3JkPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuemNmQmFnZ2FnZSxcbidpc3N1ZXJUb0lzc3VlclJlY29yZCcpO1xuXG5cbmxldCBpbnN0YW50aWF0ZWQ9emNmQmFnZ2FnZS5oYXMoU1RPUkFHRV9JTlNUQU5USUFURURfS0VZKTtcbmNvbnN0IGFzc2VydEluc3RhbnRpYXRlZD0oKT0+e1xuaW5zdGFudGlhdGVkfHxGYWlsIGBpc3N1ZXJTdG9yYWdlIGhhcyBub3QgYmVlbiBpbnN0YW50aWF0ZWRgO1xuIH07XG5cbi8qKlxuICogSWYgd2UgYWxyZWFkeSBrbm93IHRoZSBlbnRpcmUgaXNzdWVyIHJlY29yZCwgc3VjaCBhcyBmb3IgYVxuICogWkNGTWludCBpc3N1ZXIsIG9yIGZvciBhbiBpc3N1ZXIgdGhhdCBab2UgaGFzIHRvbGQgdXMgYWJvdXQsXG4gKiBzdG9yZSB0aGUgaXNzdWVyUmVjb3JkIGRpcmVjdGx5LlxuICpcbiAqIEEgbm90ZSBvbiBjaGVja2luZyB0aGF0IHRoZSBpc3N1ZXIgYW5kIGJyYW5kIG1hdGNoOiBCZWNhdXNlIG9mXG4gKiBob3cgd2UgdXNlIGBzdG9yZUlzc3VlclJlY29yZGAsIHRoZSBpc3N1ZXIgYW5kIGJyYW5kIGluIHRoZVxuICogYGlzc3VlclJlY29yZGAgcGFyYW1ldGVyIGFyZSBndWFyYW50ZWVkIHRvIG1hdGNoLCBhbmQgd2UgZG8gbm90XG4gKiBuZWVkIHRvIGRvIGFub3RoZXIgYXN5bmNocm9ub3VzIGNhbGwuXG4gKlxuICogV2UgdXNlIGBzdG9yZUlzc3VlclJlY29yZGAgaW4gNCBjYXNlczogMSkgWm9lTWludCByZWNvcmRzLCAyKVxuICogWkNGTWludCByZWNvcmRzLCAzKSB3aXRoaW4gYHN0b3JlSXNzdWVyYCwgYW5kIDQpIHN0b3JpbmcgYW5cbiAqIGlzc3VlciByZWNvcmQgaW4gWkNGIHRoYXQgd2Ugb2J0YWluZWQgZnJvbSBab2UgdGhhdCBvcmlnaW5hbGx5XG4gKiB3ZW50IHRocm91Z2ggYHN0b3JlSXNzdWVyYC4gSW4gWm9lTWludHMgKHJlcGFja2FnZWQgYXMgWkNGTWludHMpLFxuICogd2UgY3JlYXRlIHRoZSBpc3N1ZXJzIGFuZCBicmFuZHMgb3Vyc2VsdmVzIHVzaW5nIEVSVFAgZGlyZWN0bHksXG4gKiBzbyB3ZSBrbm93IHRoZXkgYXJlIG5vdCBtYWxpY2lvdXMgYW5kIHRoYXQgdGhlIGlzc3VlcnMgYW5kIGJyYW5kc1xuICogbWF0Y2guIEluIHRoZSBsYXN0IHR3byBjYXNlcywgd2UgZ28gdGhyb3VnaCB0aGVcbiAqIGJyYW5kLWlzc3Vlci1tYXRjaCBjaGVjayBpbiBgc3RvcmVJc3N1ZXJgLlxuICpcbiAqIFRoZSByZWFzb24gd2h5IHdlIG5lZWQgdGhlIGBoYXNgIGNoZWNrIGJlbG93IGlzIGZvciB0aGUgNHRoIGNhc2VcbiAqIGFib3ZlLCBpbiB3aGljaCB3ZSBzdG9yZSBhbiBpc3N1ZXIgcmVjb3JkIGluIFpDRiB0aGF0IHdlIG9idGFpbmVkXG4gKiBmcm9tIFpvZS4gYFdlYWtNYXBTdG9yZS5pbml0YCBlcnJvcnMgaWYgdGhlIGtleSBpcyBhbHJlYWR5IHByZXNlbnQsXG4gKiBhbmQgYmVjYXVzZSBhbiBpc3N1ZXIgY2FuIGJlIHVzZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIHNhbWVcbiAqIGNvbnRyYWN0LCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBhcmVuJ3QgdHJ5aW5nIHRvIGBpbml0YCB0d2ljZS5cbiAqIElmIHRoZSBpc3N1ZXIgYW5kIGl0cyByZWNvcmQgYXJlIGFscmVhZHkgcHJlc2VudCwgd2UgZG8gbm90IG5lZWRcbiAqIHRvIGFkZCB0aGUgaXNzdWVyIGFnYWluIGluIFpDRi5cbiAqXG4gKlxuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmR9IGlzc3VlclJlY29yZFxuICogQHJldHVybnMge0lzc3VlclJlY29yZH1cbiAqL1xuY29uc3Qgc3RvcmVJc3N1ZXJSZWNvcmQ9KGlzc3VlclJlY29yZCk9PntcbmFzc2VydEluc3RhbnRpYXRlZCgpO1xuY29uc3R7YnJhbmQsaXNzdWVyfT1pc3N1ZXJSZWNvcmQ7XG5pZihpc3N1ZXJUb0lzc3VlclJlY29yZC5oYXMoaXNzdWVyKSl7XG5yZXR1cm4gaXNzdWVyVG9Jc3N1ZXJSZWNvcmQuZ2V0KGlzc3Vlcik7XG4gfVxuXG5icmFuZFRvSXNzdWVyUmVjb3JkLmluaXQoYnJhbmQsaXNzdWVyUmVjb3JkKTtcbmlzc3VlclRvSXNzdWVyUmVjb3JkLmluaXQoaXNzdWVyLGlzc3VlclJlY29yZCk7XG5yZXR1cm4gaXNzdWVyVG9Jc3N1ZXJSZWNvcmQuZ2V0KGlzc3Vlcik7XG4gfTtcblxuY29uc3QgZ2V0QnlCcmFuZD0oYnJhbmQpPT57XG5hc3NlcnRJbnN0YW50aWF0ZWQoKTtcbnJldHVybiBicmFuZFRvSXNzdWVyUmVjb3JkLmdldChicmFuZCk7XG4gfTtcblxuLyoqXG4gKiBJZiB0aGUgaXNzdWVyIGlzIGFscmVhZHkgc3RvcmVkLCByZXR1cm4gdGhlIGlzc3VlclJlY29yZC5cbiAqIE90aGVyd2lzZSwgbWFrZSBhbmQgc2F2ZSB0aGUgaXNzdWVyUmVjb3JkLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxJc3N1ZXI+fSBpc3N1ZXJQXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJc3N1ZXJSZWNvcmQ+fVxuICovXG5jb25zdCBzdG9yZUlzc3Vlcj1hc3luYyhpc3N1ZXJQKT0+e1xuYXNzZXJ0SW5zdGFudGlhdGVkKCk7XG5jb25zdCBicmFuZFA9RShpc3N1ZXJQKS5nZXRCcmFuZCgpO1xuY29uc3QgYnJhbmRJc3N1ZXJNYXRjaFA9RShicmFuZFApLmlzTXlJc3N1ZXIoaXNzdWVyUCk7XG5jb25zdCBkaXNwbGF5SW5mb1A9RShicmFuZFApLmdldERpc3BsYXlJbmZvKCk7XG4vKiogQHR5cGUge1tJc3N1ZXIsQnJhbmQsYm9vbGVhbixEaXNwbGF5SW5mb119ICovXG5jb25zdFtpc3N1ZXIsYnJhbmQsYnJhbmRJc3N1ZXJNYXRjaCxkaXNwbGF5SW5mb109YXdhaXQgUHJvbWlzZS5hbGwoW1xuaXNzdWVyUCxcbmJyYW5kUCxcbmJyYW5kSXNzdWVyTWF0Y2hQLFxuZGlzcGxheUluZm9QXSk7XG5cbi8qIEFXQUlUIC8vLy8vKi9cblxuaWYoaXNzdWVyVG9Jc3N1ZXJSZWNvcmQuaGFzKGlzc3Vlcikpe1xucmV0dXJuIGlzc3VlclRvSXNzdWVyUmVjb3JkLmdldChpc3N1ZXIpO1xuIH1cbi8qIEEgbWFsaWNpb3VzIGlzc3VlciBtYXkgdXNlIGFub3RoZXIgaXNzdWVyJ3MgdmFsaWQgYnJhbmQuKi9cbi8qIFRoZXJlZm9yZSwgd2UgbXVzdCBjaGVjayB0aGF0IHRoZSBicmFuZCByZWNvZ25pemVzIHRoZSBpc3N1ZXIqL1xuLyogYXMgaXRzIG93biBhbmQgdmljZSB2ZXJzYS4gSG93ZXZlciwgd2Ugb25seSBuZWVkIHRvIGNoZWNrIHRoaXMqL1xuLyogb25jZSBwZXIgaXNzdWVyIHBlciBab2VTZXJ2aWNlLCBhbmQgd2UgZG8gbm90IG5lZWQgdG8gY2hlY2sqL1xuLyogdGhpcyBmb3IgaXNzdWVycyB0aGF0IHRoZSBab2VTZXJ2aWNlIGNyZWF0ZXMsIHN1Y2ggYXMgaXNzdWVycyovXG4vKiBtYWRlIHdpdGggWkNGTWludHMuKi9cblxuLyogSW4gdGhlIGNhc2Ugb2YgYSBtYWxpY2lvdXMgaXNzdWVyIHVzaW5nIGFub3RoZXIgaXNzdWVyJ3MgYnJhbmQsKi9cbi8qIHRoZSBsaW5lIGJlbG93IHdpbGwgdGhyb3cgaW4gYWxsIGNhc2VzLiBIb3dldmVyLCBpbiB0aGUgY2FzZSBvZiovXG4vKiBhIG1hbGljaW91cyBpc3N1ZXIgdXNpbmcgYSAqbWFsaWNpb3VzKiBicmFuZCwgdGhlIG1hbGljaW91cyovXG4vKiBpc3N1ZXIgYW5kIGJyYW5kIG1heSBjb29yZGluYXRlIHRvIGNoYW5nZSB0aGVpciBhbnN3ZXJzLiBBdCovXG4vKiB0aGlzIHBvaW50LCBab2UgaGFzIGRvbmUgYWxsIGl0IGNvdWxkLiBab2UgZG9lcyBub3QgcHJldmVudCBvciovXG4vKiBpbnRlbmQgdG8gcHJldmVudCBpc3N1ZXIgbWlzYmVoYXZpb3IgaW4gZ2VuZXJhbCwgc28gdGhlIHVzZXIqL1xuLyogKm11c3QqIHJlbHkgb24gdGhlIGdvb2QgYmVoYXZpb3Igb2YgdGhlIGlzc3VlcnMgdXNlZCBpbiB0aGUqL1xuLyogc21hcnQgY29udHJhY3RzIHRoZXkgdXNlLiovXG5icmFuZElzc3Vlck1hdGNofHxGYWlsIGBpc3N1ZXIgd2FzIHVzaW5nIGEgYnJhbmQgd2hpY2ggd2FzIG5vdCBpdHMgb3duYDtcbmNvbnN0IGlzc3VlclJlY29yZD1tYWtlSXNzdWVyUmVjb3JkKGJyYW5kLGlzc3VlcixkaXNwbGF5SW5mbyk7XG5zdG9yZUlzc3VlclJlY29yZChpc3N1ZXJSZWNvcmQpO1xucmV0dXJuIGdldEJ5QnJhbmQoYnJhbmQpO1xuIH07XG5cbmNvbnN0IHN0b3JlSXNzdWVycz0oaXNzdWVycyk9PntcbmFzc2VydEluc3RhbnRpYXRlZCgpO1xucmV0dXJuIFByb21pc2UuYWxsKGlzc3VlcnMubWFwKHN0b3JlSXNzdWVyKSk7XG4gfTtcblxuLyoqIEB0eXBlIHtHZXRBc3NldEtpbmRCeUJyYW5kfSAqL1xuY29uc3QgZ2V0QXNzZXRLaW5kQnlCcmFuZD0oYnJhbmQpPT57XG5hc3NlcnRJbnN0YW50aWF0ZWQoKTtcbnJldHVybiBnZXRCeUJyYW5kKGJyYW5kKS5hc3NldEtpbmQ7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtJc3N1ZXJLZXl3b3JkUmVjb3JkfSB1bmNsZWFuSXNzdWVyS2V5d29yZFJlY29yZFxuICogQHJldHVybnMge1Byb21pc2U8eyBpc3N1ZXJzOiBJc3N1ZXJLZXl3b3JkUmVjb3JkLFxuICogICAgICAgICAgICAgICAgICAgICBicmFuZHM6IEJyYW5kS2V5d29yZFJlY29yZCB9Pn1cbiAqL1xuY29uc3Qgc3RvcmVJc3N1ZXJLZXl3b3JkUmVjb3JkPWFzeW5jKHVuY2xlYW5Jc3N1ZXJLZXl3b3JkUmVjb3JkKT0+e1xuYXNzZXJ0SW5zdGFudGlhdGVkKCk7XG5jb25zdCBrZXl3b3Jkcz1jbGVhbktleXdvcmRzKHVuY2xlYW5Jc3N1ZXJLZXl3b3JkUmVjb3JkKTtcbmNvbnN0IGlzc3VlclBzPWtleXdvcmRzLm1hcChcbihrZXl3b3JkKT0+dW5jbGVhbklzc3VlcktleXdvcmRSZWNvcmRba2V5d29yZF0pO1xuXG4vKiBUaGUgaXNzdWVycyBtYXkgbm90IGhhdmUgYmVlbiBzZWVuIGJlZm9yZSwgc28gd2UgbXVzdCB3YWl0IGZvciB0aGUqL1xuLyogaXNzdWVyIHJlY29yZHMgdG8gYmUgYXZhaWxhYmxlIHN5bmNocm9ub3VzbHkqL1xuY29uc3QgaXNzdWVyUmVjb3Jkcz1hd2FpdCBzdG9yZUlzc3VlcnMoaXNzdWVyUHMpO1xuLyogQVdBSVQgLy8vKi9cblxuY29uc3QgaXNzdWVycz1hcnJheVRvT2JqKFxuaXNzdWVyUmVjb3Jkcy5tYXAoKHJlY29yZCk9PnJlY29yZC5pc3N1ZXIpLFxua2V5d29yZHMpO1xuXG5jb25zdCBicmFuZHM9YXJyYXlUb09iaihcbmlzc3VlclJlY29yZHMubWFwKChyZWNvcmQpPT5yZWNvcmQuYnJhbmQpLFxua2V5d29yZHMpO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuaXNzdWVycyxcbmJyYW5kc30pO1xuXG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHJldHVybnMge0JyYW5kPEs+fVxuICovXG5jb25zdCBnZXRCcmFuZEZvcklzc3Vlcj0oaXNzdWVyKT0+e1xuYXNzZXJ0SW5zdGFudGlhdGVkKCk7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuIGlzc3VlclRvSXNzdWVyUmVjb3JkLmdldChpc3N1ZXIpLmJyYW5kO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcmV0dXJucyB7SXNzdWVyPEs+fVxuICovXG5jb25zdCBnZXRJc3N1ZXJGb3JCcmFuZD0oYnJhbmQpPT57XG5hc3NlcnRJbnN0YW50aWF0ZWQoKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4gYnJhbmRUb0lzc3VlclJlY29yZC5nZXQoYnJhbmQpLmlzc3VlcjtcbiB9O1xuXG4vKiogQHR5cGUge0lzc3VlclN0b3JhZ2VHZXRJc3N1ZXJSZWNvcmRzfSAqL1xuY29uc3QgZ2V0SXNzdWVyUmVjb3Jkcz0oaXNzdWVycyk9PntcbmFzc2VydEluc3RhbnRpYXRlZCgpO1xucmV0dXJuIGlzc3VlcnMubWFwKGlzc3VlclRvSXNzdWVyUmVjb3JkLmdldCk7XG4gfTtcblxuY29uc3QgaW5zdGFudGlhdGU9KGlzc3VlclJlY29yZHM9W10pPT57XG5pZighemNmQmFnZ2FnZS5oYXMoU1RPUkFHRV9JTlNUQU5USUFURURfS0VZKSl7XG56Y2ZCYWdnYWdlLmluaXQoU1RPUkFHRV9JTlNUQU5USUFURURfS0VZLHRydWUpO1xuaW5zdGFudGlhdGVkPXRydWU7XG5pc3N1ZXJSZWNvcmRzLmZvckVhY2goc3RvcmVJc3N1ZXJSZWNvcmQpO1xuIH1cbiB9O1xuXG5yZXR1cm57XG5zdG9yZUlzc3VlcktleXdvcmRSZWNvcmQsXG5zdG9yZUlzc3VlcixcbnN0b3JlSXNzdWVyUmVjb3JkLFxuZ2V0QXNzZXRLaW5kQnlCcmFuZCxcbmdldEJyYW5kRm9ySXNzdWVyLFxuZ2V0SXNzdWVyRm9yQnJhbmQsXG5nZXRJc3N1ZXJSZWNvcmRzLFxuaW5zdGFudGlhdGV9O1xuXG4gfTskaOKAjV9vbmNlLnByb3ZpZGVJc3N1ZXJTdG9yYWdlKHByb3ZpZGVJc3N1ZXJTdG9yYWdlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcm92aWRlSXNzdWVyU3RvcmFnZSI6WyJwcm92aWRlSXNzdWVyU3RvcmFnZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACgpBY1VggAAFYIAAAlAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvbWFrZUhhbmRsZS5qc3siaW1wb3J0cyI6WyIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUhhbmRsZSIsIm1ha2VIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LGluaXRFbXB0eSxtYWtlRXhvLHByZXBhcmVFeG9DbGFzcyxIYW5kbGVJOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV0sW1wibWFrZUV4b1wiLCBbJGjigI1fYSA9PiAobWFrZUV4byA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkhhbmRsZUlcIiwgWyRo4oCNX2EgPT4gKEhhbmRsZUkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IEhcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtIfSBoYW5kbGVUeXBlXG4gKiBAcmV0dXJucyB7SCBleHRlbmRzICdJbnN0YW5jZScgPyAoKSA9PiBJbnN0YW5jZSA6ICgpID0+IEhhbmRsZTxIPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUR1cmFibGVIYW5kbGU9KGJhZ2dhZ2UsaGFuZGxlVHlwZSk9PntcbnR5cGVvZiBoYW5kbGVUeXBlPT09J3N0cmluZyd8fEZhaWwgYGhhbmRsZVR5cGUgbXVzdCBiZSBhIHN0cmluZ2A7XG5jb25zdCBtYWtlSGFuZGxlPXByZXBhcmVFeG9DbGFzcyhcbmJhZ2dhZ2UsXG4gYCR7aGFuZGxlVHlwZX1IYW5kbGVgLFxuSGFuZGxlSSxcbmluaXRFbXB0eSxcbnt9KTtcblxuLyogQHRzLWV4cGVjdC1lcnJvciBCaXQgYnkgb3VyIG93biBvcGFxdWUgdHlwZXMuKi9cbnJldHVybiAoLyoqIEB0eXBlIHsoKSA9PiBIYW5kbGU8SD59ICovbWFrZUhhbmRsZSk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVIYW5kbGUoZGVmaW5lRHVyYWJsZUhhbmRsZSk7XG5oYXJkZW4oZGVmaW5lRHVyYWJsZUhhbmRsZSk7XG5cbi8qKlxuICogQ3JlYXRlIGFuIG9wYXF1ZSBoYW5kbGUgb2JqZWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBIXG4gKiBAcGFyYW0ge0h9IGhhbmRsZVR5cGUgdGhlIHN0cmluZyBsaXRlcmFsIHR5cGUgb2YgdGhlIGhhbmRsZVxuICogQHJldHVybnMge0ggZXh0ZW5kcyAnSW5zdGFuY2UnID8gSW5zdGFuY2UgOiBIYW5kbGU8SD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSGFuZGxlPShoYW5kbGVUeXBlKT0+e1xudHlwZW9mIGhhbmRsZVR5cGU9PT0nc3RyaW5nJ3x8RmFpbCBgaGFuZGxlVHlwZSBtdXN0IGJlIGEgc3RyaW5nYDtcbi8qIFJldHVybiB0aGUgaW50ZXJzZWN0aW9uIHR5cGUgKHJlYWxseSBqdXN0IGFuIGVtcHR5IG9iamVjdCkuKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgQml0IGJ5IG91ciBvd24gb3BhcXVlIHR5cGVzLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7SGFuZGxlPEg+fSAqL21ha2VFeG8oYCR7aGFuZGxlVHlwZX1IYW5kbGVgLEhhbmRsZUkse30pKTtcbiB9OyRo4oCNX29uY2UubWFrZUhhbmRsZShtYWtlSGFuZGxlKTtcbmhhcmRlbihtYWtlSGFuZGxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZpbmVEdXJhYmxlSGFuZGxlIjpbImRlZmluZUR1cmFibGVIYW5kbGUiXSwibWFrZUhhbmRsZSI6WyJtYWtlSGFuZGxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMb6lweiBQAAogUAAC0AAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9vYmpBcnJheUNvbnZlcnNpb24uanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJhcnJheVRvT2JqIiwiYXNzZXJ0U3Vic2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxGYWlsLHE7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogQHR5cGVkZWYge2JpZ2ludHxib29sZWFufG51bGx8bnVtYmVyfHN0cmluZ3xzeW1ib2x8dW5kZWZpbmVkfSBQcmltaXRpdmVcbiAqIEB0eXBlZGVmIHtzdHJpbmd8bnVtYmVyfHN5bWJvbH0gUHJvcGVydHlOYW1lXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eU5hbWV9IFVcbiAqIEBwYXJhbSB7VFtdfSBhcnJheVxuICogQHBhcmFtIHtVW119IGtleXNcbiAqL1xuY29uc3QgICAgICAgIGFycmF5VG9PYmo9KGFycmF5LGtleXMpPT57XG5hcnJheS5sZW5ndGg9PT1rZXlzLmxlbmd0aHx8RmFpbCBgYXJyYXkgYW5kIGtleXMgbXVzdCBiZSBvZiBlcXVhbCBsZW5ndGhgO1xuY29uc3Qgb2JqPVxuLyoqIEB0eXBlIHtSZWNvcmQ8VSwgVD59ICovXG57fTtcbmtleXMuZm9yRWFjaCgoa2V5LGkpPT5vYmpba2V5XT1hcnJheVtpXSk7XG5yZXR1cm4gaGFyZGVuKG9iaik7XG4gfTtcblxuLyoqXG4gKiBBc3NlcnQgYWxsIHZhbHVlcyBmcm9tIGBwYXJ0YCBhcHBlYXIgaW4gYHdob2xlYC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSB3aG9sZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGFydFxuICovJGjigI1fb25jZS5hcnJheVRvT2JqKGFycmF5VG9PYmopO1xuY29uc3QgICAgICAgIGFzc2VydFN1YnNldD0od2hvbGUscGFydCk9PntcbnBhcnQuZm9yRWFjaCgoa2V5KT0+e1xuYXNzZXJ0LnR5cGVvZihrZXksJ3N0cmluZycpO1xud2hvbGUuaW5jbHVkZXMoa2V5KXx8XG5GYWlsIGBrZXkgJHtxKGtleSl9IHdhcyBub3Qgb25lIG9mIHRoZSBleHBlY3RlZCBrZXlzICR7cSh3aG9sZSl9YDtcbiB9KTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0U3Vic2V0KGFzc2VydFN1YnNldCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXJyYXlUb09iaiI6WyJhcnJheVRvT2JqIl0sImFzc2VydFN1YnNldCI6WyJhc3NlcnRTdWJzZXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5bEJzNtDAADbQwAAJQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3RpbWUiXSwiZXhwb3J0cyI6WyJBZG1pbkZhY2V0SSIsIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSIsIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiLCJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSIsIkJ1bmRsZUNhcFNoYXBlIiwiQnVuZGxlU2hhcGUiLCJFeGl0T2JqZWN0SSIsIkV4aXRPYmplY3RTaGFwZSIsIkZlZU1pbnRBY2Nlc3NTaGFwZSIsIkZ1bGxQcm9wb3NhbFNoYXBlIiwiSGFuZGxlSSIsIkhhbmRsZU9mZmVySSIsIkluc3RhbGxhdGlvblNoYXBlIiwiSW5zdGFuY2VBZG1pbkkiLCJJbnN0YW5jZUFkbWluU2hhcGUiLCJJbnN0YW5jZUhhbmRsZVNoYXBlIiwiSW5zdGFuY2VSZWNvcmRTaGFwZSIsIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0IiwiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSIsIkludml0YXRpb25IYW5kbGVTaGFwZSIsIkludml0YXRpb25TaGFwZSIsIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSIsIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJSZWNvcmRTaGFwZSIsIktleXdvcmRTaGFwZSIsIk9mZmVySGFuZGxlckkiLCJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSIsIlByaWNlUXVvdGVTaGFwZSIsIlByb3Bvc2FsU2hhcGUiLCJTZWF0RGF0YVNoYXBlIiwiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiLCJTZWF0U2hhcGUiLCJUZXJtc1NoYXBlIiwiVGltZXJTaGFwZSIsIlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlIiwiWmNmTWludEkiLCJab2VNaW50SSIsIlpvZU1pbnRTaGFwZSIsIlpvZVNlcnZpY2VJIiwiWm9lU3RvcmFnZU1hbmFnZXJJS2l0IiwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiLCJpc09uRGVtYW5kRXhpdFJ1bGUiLCJpc1dhaXZlZEV4aXRSdWxlIiwibWFrZUhhbmRsZVNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudFNoYXBlLEFzc2V0S2luZFNoYXBlLEJyYW5kU2hhcGUsRGlzcGxheUluZm9TaGFwZSxJc3N1ZXJLaXRTaGFwZSxJc3N1ZXJTaGFwZSxQYXltZW50U2hhcGUsU3Vic2NyaWJlclNoYXBlLE0sVGltZXN0YW1wU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQW1vdW50U2hhcGUgPSAkaOKAjV9hKV1dLFtcIkFzc2V0S2luZFNoYXBlXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiQnJhbmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQnJhbmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiRGlzcGxheUluZm9TaGFwZVwiLCBbJGjigI1fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRo4oCNX2EpXV0sW1wiSXNzdWVyS2l0U2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlcktpdFNoYXBlID0gJGjigI1fYSldXSxbXCJJc3N1ZXJTaGFwZVwiLCBbJGjigI1fYSA9PiAoSXNzdWVyU2hhcGUgPSAkaOKAjV9hKV1dLFtcIlBheW1lbnRTaGFwZVwiLCBbJGjigI1fYSA9PiAoUGF5bWVudFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIlN1YnNjcmliZXJTaGFwZVwiLCBbJGjigI1fYSA9PiAoU3Vic2NyaWJlclNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBTaGFwZVwiLCBbJGjigI1fYSA9PiAoVGltZXN0YW1wU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBrZXl3b3JkcyBoYXZlIGFuIGluaXRpYWwgY2FwKi9cbmNvbnN0ICAgICAgICBLZXl3b3JkU2hhcGU9TS5zdHJpbmcoKTskaOKAjV9vbmNlLktleXdvcmRTaGFwZShLZXl3b3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgSW52aXRhdGlvbkhhbmRsZVNoYXBlPU0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uSGFuZGxlJyk7JGjigI1fb25jZS5JbnZpdGF0aW9uSGFuZGxlU2hhcGUoSW52aXRhdGlvbkhhbmRsZVNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uU2hhcGU9TS5yZW1vdGFibGUoJ0ludml0YXRpb24nKTskaOKAjV9vbmNlLkludml0YXRpb25TaGFwZShJbnZpdGF0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbmNlSGFuZGxlU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbmNlSGFuZGxlJyk7JGjigI1fb25jZS5JbnN0YW5jZUhhbmRsZVNoYXBlKEluc3RhbmNlSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbGxhdGlvblNoYXBlPU0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKTskaOKAjV9vbmNlLkluc3RhbGxhdGlvblNoYXBlKEluc3RhbGxhdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBTZWF0U2hhcGU9TS5yZW1vdGFibGUoJ1NlYXQnKTskaOKAjV9vbmNlLlNlYXRTaGFwZShTZWF0U2hhcGUpO1xuXG5jb25zdCAgICAgICAgQW1vdW50S2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLEFtb3VudFNoYXBlKTskaOKAjV9vbmNlLkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZShBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuY29uc3QgICAgICAgIEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihcbktleXdvcmRTaGFwZSxcbk0ucGF0dGVybigpKTskaOKAjV9vbmNlLkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUoQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKFxuS2V5d29yZFNoYXBlLFxuTS5lcmVmKFBheW1lbnRTaGFwZSkpOyRo4oCNX29uY2UuUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUoUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLElzc3VlclNoYXBlKTskaOKAjV9vbmNlLklzc3VlcktleXdvcmRSZWNvcmRTaGFwZShJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpO1xuY29uc3QgICAgICAgIElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihcbktleXdvcmRTaGFwZSxcbk0uZXJlZihJc3N1ZXJTaGFwZSkpOyRo4oCNX29uY2UuSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZShJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIEJyYW5kS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLEJyYW5kU2hhcGUpOyRo4oCNX29uY2UuQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgSXNzdWVyUmVjb3JkU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbmJyYW5kOkJyYW5kU2hhcGUsXG5pc3N1ZXI6SXNzdWVyU2hhcGUsXG5hc3NldEtpbmQ6QXNzZXRLaW5kU2hhcGV9LFxuXG57ZGlzcGxheUluZm86RGlzcGxheUluZm9TaGFwZX0pOyRo4oCNX29uY2UuSXNzdWVyUmVjb3JkU2hhcGUoSXNzdWVyUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUZXJtc1NoYXBlPWhhcmRlbih7XG5pc3N1ZXJzOklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSxcbmJyYW5kczpCcmFuZEtleXdvcmRSZWNvcmRTaGFwZX0pOyRo4oCNX29uY2UuVGVybXNTaGFwZShUZXJtc1NoYXBlKTtcblxuXG5jb25zdCAgICAgICAgSW5zdGFuY2VSZWNvcmRTaGFwZT1oYXJkZW4oe1xuaW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvblNoYXBlLFxuaW5zdGFuY2U6SW5zdGFuY2VIYW5kbGVTaGFwZSxcbnRlcm1zOk0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSl9KTskaOKAjV9vbmNlLkluc3RhbmNlUmVjb3JkU2hhcGUoSW5zdGFuY2VSZWNvcmRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEhhbmRsZUk9TS5pbnRlcmZhY2UoJ0hhbmRsZScse30pOyRo4oCNX29uY2UuSGFuZGxlSShIYW5kbGVJKTtcblxuY29uc3QgICAgICAgIG1ha2VIYW5kbGVTaGFwZT0obmFtZSk9Pk0ucmVtb3RhYmxlKCBgJHtuYW1lfUhhbmRsZWApOyRo4oCNX29uY2UubWFrZUhhbmRsZVNoYXBlKG1ha2VIYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgVGltZXJTaGFwZT1tYWtlSGFuZGxlU2hhcGUoJ3RpbWVyJyk7XG5cbi8qKlxuICogQWZ0ZXIgZGVmYXVsdHMgYXJlIGZpbGxlZCBpblxuICpcbiAqIEBzZWUge1Byb3Bvc2FsUmVjb3JkfSB0eXBlXG4gKi8kaOKAjV9vbmNlLlRpbWVyU2hhcGUoVGltZXJTaGFwZSk7XG5jb25zdCAgICAgICAgRnVsbFByb3Bvc2FsU2hhcGU9aGFyZGVuKHtcbndhbnQ6QW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSxcbmdpdmU6QW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuLyogVG8gYWNjZXB0IG9ubHkgb25lLCB3ZSBjb3VsZCB1c2UgTS5vciByYXRoZXIgdGhhbiBNLnNwbGl0UmVjb3JkLCovXG4vKiBidXQgdGhlIGVycm9yIG1lc3NhZ2VzIHdvdWxkIGhhdmUgYmVlbiB3b3JzZS4gUmF0aGVyLCovXG4vKiBjbGVhblByb3Bvc2FsJ3MgYXNzZXJ0RXhpdCBjaGVja3MgdGhhdCB0aGVyZSdzIGV4YWN0bHkgb25lLiovXG5leGl0Ok0uc3BsaXRSZWNvcmQoXG57fSxcbntcbm9uRGVtYW5kOm51bGwsXG53YWl2ZWQ6bnVsbCxcbmFmdGVyRGVhZGxpbmU6e1xudGltZXI6TS5lcmVmKFRpbWVyU2hhcGUpLFxuZGVhZGxpbmU6VGltZXN0YW1wU2hhcGV9fSxcblxuXG57fSl9KTtcblxuXG4vKiogQHNlZSB7UHJvcG9zYWx9IHR5cGUgKi8kaOKAjV9vbmNlLkZ1bGxQcm9wb3NhbFNoYXBlKEZ1bGxQcm9wb3NhbFNoYXBlKTtcbmNvbnN0ICAgICAgICBQcm9wb3NhbFNoYXBlPU0uc3BsaXRSZWNvcmQoe30sRnVsbFByb3Bvc2FsU2hhcGUse30pOyRo4oCNX29uY2UuUHJvcG9zYWxTaGFwZShQcm9wb3NhbFNoYXBlKTtcblxuY29uc3QgICAgICAgIGlzT25EZW1hbmRFeGl0UnVsZT0oZXhpdCk9PntcbmNvbnN0W2V4aXRLZXldPU9iamVjdC5rZXlzKGV4aXQpO1xucmV0dXJuIGV4aXRLZXk9PT0nb25EZW1hbmQnO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgV2FpdmVkRXhpdFJ1bGV9XG4gKi8kaOKAjV9vbmNlLmlzT25EZW1hbmRFeGl0UnVsZShpc09uRGVtYW5kRXhpdFJ1bGUpO1xuY29uc3QgICAgICAgIGlzV2FpdmVkRXhpdFJ1bGU9KGV4aXQpPT57XG5jb25zdFtleGl0S2V5XT1PYmplY3Qua2V5cyhleGl0KTtcbnJldHVybiBleGl0S2V5PT09J3dhaXZlZCc7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKiBAcmV0dXJucyB7ZXhpdCBpcyBBZnRlckRlYWRsaW5lRXhpdFJ1bGV9XG4gKi8kaOKAjV9vbmNlLmlzV2FpdmVkRXhpdFJ1bGUoaXNXYWl2ZWRFeGl0UnVsZSk7XG5jb25zdCAgICAgICAgaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGU9KGV4aXQpPT57XG5jb25zdFtleGl0S2V5XT1PYmplY3Qua2V5cyhleGl0KTtcbnJldHVybiBleGl0S2V5PT09J2FmdGVyRGVhZGxpbmUnO1xuIH07JGjigI1fb25jZS5pc0FmdGVyRGVhZGxpbmVFeGl0UnVsZShpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSk7XG5cbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uRWxlbWVudFNoYXBlPU0uc3BsaXRSZWNvcmQoe1xuZGVzY3JpcHRpb246TS5zdHJpbmcoKSxcbmhhbmRsZTpJbnZpdGF0aW9uSGFuZGxlU2hhcGUsXG5pbnN0YW5jZTpJbnN0YW5jZUhhbmRsZVNoYXBlLFxuaW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvblNoYXBlfSk7JGjigI1fb25jZS5JbnZpdGF0aW9uRWxlbWVudFNoYXBlKEludml0YXRpb25FbGVtZW50U2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBPZmZlckhhbmRsZXJJPU0uaW50ZXJmYWNlKCdPZmZlckhhbmRsZXInLHtcbmhhbmRsZTpNLmNhbGwoU2VhdFNoYXBlKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0uc3RyaW5nKCkpfSk7JGjigI1fb25jZS5PZmZlckhhbmRsZXJJKE9mZmVySGFuZGxlckkpO1xuXG5cbmNvbnN0ICAgICAgICBTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZT1NLmFycmF5T2YoXG5oYXJkZW4oe1xuc2VhdEhhbmRsZTpTZWF0U2hhcGUsXG5hbGxvY2F0aW9uOkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZX0pKTskaOKAjV9vbmNlLlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBab2VNaW50U2hhcGU9TS5yZW1vdGFibGUoJ1pvZU1pbnQnKTskaOKAjV9vbmNlLlpvZU1pbnRTaGFwZShab2VNaW50U2hhcGUpO1xuY29uc3QgICAgICAgIFpvZU1pbnRJPU0uaW50ZXJmYWNlKCdab2VNaW50Jyx7XG5nZXRJc3N1ZXJSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJSZWNvcmRTaGFwZSksXG5taW50QW5kRXNjcm93Ok0uY2FsbChBbW91bnRTaGFwZSkucmV0dXJucygpLFxud2l0aGRyYXdBbmRCdXJuOk0uY2FsbChBbW91bnRTaGFwZSkucmV0dXJucygpfSk7JGjigI1fb25jZS5ab2VNaW50SShab2VNaW50SSk7XG5cblxuY29uc3QgICAgICAgIFpjZk1pbnRJPU0uaW50ZXJmYWNlKCdaY2ZNaW50Jyx7XG5nZXRJc3N1ZXJSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJSZWNvcmRTaGFwZSksXG5taW50R2FpbnM6TS5jYWxsKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSkuXG5vcHRpb25hbChNLnJlbW90YWJsZSgnemNmU2VhdCcpKS5cbnJldHVybnMoTS5yZW1vdGFibGUoJ3pjZlNlYXQnKSksXG5idXJuTG9zc2VzOk0uY2FsbChcbkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbk0ucmVtb3RhYmxlKCd6Y2ZTZWF0JykpLlxucmV0dXJucygpfSk7JGjigI1fb25jZS5aY2ZNaW50SShaY2ZNaW50SSk7XG5cblxuY29uc3QgICAgICAgIEZlZU1pbnRBY2Nlc3NTaGFwZT1NLnJlbW90YWJsZSgnRmVlTWludEFjY2VzcycpOyRo4oCNX29uY2UuRmVlTWludEFjY2Vzc1NoYXBlKEZlZU1pbnRBY2Nlc3NTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBFeGl0T2JqZWN0ST1NLmludGVyZmFjZSgnRXhpdCBPYmplY3QnLHtcbmV4aXQ6TS5jYWxsKCkucmV0dXJucygpfSk7JGjigI1fb25jZS5FeGl0T2JqZWN0SShFeGl0T2JqZWN0SSk7XG5cblxuY29uc3QgICAgICAgIEV4aXRPYmplY3RTaGFwZT1NLnJlbW90YWJsZSgnRXhpdE9iaicpOyRo4oCNX29uY2UuRXhpdE9iamVjdFNoYXBlKEV4aXRPYmplY3RTaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VBZG1pblNoYXBlPU0ucmVtb3RhYmxlKCdJbnN0YW5jZUFkbWluJyk7JGjigI1fb25jZS5JbnN0YW5jZUFkbWluU2hhcGUoSW5zdGFuY2VBZG1pblNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnN0YW5jZUFkbWluST1NLmludGVyZmFjZSgnSW5zdGFuY2VBZG1pbicse1xubWFrZUludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSxNLnN0cmluZygpKS5cbm9wdGlvbmFsKE0ucmVjb3JkKCksTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhJbnZpdGF0aW9uU2hhcGUpLFxuc2F2ZUlzc3VlcjpNLmNhbGxXaGVuKE0uYXdhaXQoSXNzdWVyU2hhcGUpLEtleXdvcmRTaGFwZSkucmV0dXJucyhcbklzc3VlclJlY29yZFNoYXBlKSxcblxubWFrZU5vRXNjcm93U2VhdDpNLmNhbGwoXG5BbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5Qcm9wb3NhbFNoYXBlLFxuRXhpdE9iamVjdFNoYXBlLFxuU2VhdFNoYXBlKS5cbnJldHVybnMoU2VhdFNoYXBlKSxcbmV4aXRBbGxTZWF0czpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZmFpbEFsbFNlYXRzOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5leGl0U2VhdDpNLmNhbGwoU2VhdFNoYXBlLE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWxTZWF0Ok0uY2FsbChTZWF0U2hhcGUsTS5hbnkoKSkucmV0dXJucygpLFxubWFrZVpvZU1pbnQ6TS5jYWxsKEtleXdvcmRTaGFwZSkuXG5vcHRpb25hbChcbkFzc2V0S2luZFNoYXBlLFxuRGlzcGxheUluZm9TaGFwZSxcbk0uc3BsaXRSZWNvcmQoaGFyZGVuKHt9KSxoYXJkZW4oe2VsZW1lbnRTaGFwZTpNLnBhdHRlcm4oKX0pKSkuXG5cbnJldHVybnMoTS5yZW1vdGFibGUoJ3pvZU1pbnQnKSksXG5yZWdpc3RlckZlZU1pbnQ6TS5jYWxsKEtleXdvcmRTaGFwZSxGZWVNaW50QWNjZXNzU2hhcGUpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnZmVlTWludCcpKSxcblxucmVwbGFjZUFsbG9jYXRpb25zOk0uY2FsbChTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSkucmV0dXJucygpLFxuc3RvcEFjY2VwdGluZ09mZmVyczpNLmNhbGwoKS5yZXR1cm5zKCksXG5zZXRPZmZlckZpbHRlcjpNLmNhbGwoTS5hcnJheU9mKE0uc3RyaW5nKCkpKS5yZXR1cm5zKCksXG5nZXRPZmZlckZpbHRlcjpNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG5nZXRFeGl0U3Vic2NyaWJlcjpNLmNhbGwoU2VhdFNoYXBlKS5yZXR1cm5zKFN1YnNjcmliZXJTaGFwZSksXG5pc0Jsb2NrZWQ6TS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5ib29sZWFuKCkpfSk7JGjigI1fb25jZS5JbnN0YW5jZUFkbWluSShJbnN0YW5jZUFkbWluSSk7XG5cblxuY29uc3QgICAgICAgIEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0PWhhcmRlbih7XG5pbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyOk0uaW50ZXJmYWNlKCdJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyJyx7XG5nZXRUZXJtczpNLmNhbGwoKS5yZXR1cm5zKE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSkpLFxuZ2V0SXNzdWVyczpNLmNhbGwoKS5yZXR1cm5zKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG5nZXRCcmFuZHM6TS5jYWxsKCkucmV0dXJucyhCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKCkucmV0dXJucyhJbnN0YWxsYXRpb25TaGFwZSksXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuXG5zYXZlSXNzdWVyOk0uY2FsbChJc3N1ZXJTaGFwZSxLZXl3b3JkU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxubWFrZVpvZU1pbnQ6TS5jYWxsKEtleXdvcmRTaGFwZSkuXG5vcHRpb25hbChcbkFzc2V0S2luZFNoYXBlLFxuRGlzcGxheUluZm9TaGFwZSxcbk0uc3BsaXRSZWNvcmQoaGFyZGVuKHt9KSxoYXJkZW4oe2VsZW1lbnRTaGFwZTpNLnBhdHRlcm4oKX0pKSkuXG5cbnJldHVybnMoTS5lcmVmKFpvZU1pbnRTaGFwZSkpLFxucmVnaXN0ZXJGZWVNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUsRmVlTWludEFjY2Vzc1NoYXBlKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKSksXG5cbmdldEluc3RhbmNlUmVjb3JkOk0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VSZWNvcmRTaGFwZSksXG5nZXRJc3N1ZXJSZWNvcmRzOk0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKElzc3VlclJlY29yZFNoYXBlKSksXG5nZXRXaXRoZHJhd0ZhY2V0Ok0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ1dpdGhkcmF3RmFjZXQnKSksXG5pbml0SW5zdGFuY2VBZG1pbjpNLmNhbGwoXG5JbnN0YW5jZUhhbmRsZVNoYXBlLFxuTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmRlbGV0ZUluc3RhbmNlQWRtaW46TS5jYWxsKEluc3RhbmNlQWRtaW5JKS5yZXR1cm5zKCksXG5tYWtlSW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLE0uc3RyaW5nKCkpLlxub3B0aW9uYWwoTS5yZWNvcmQoKSxNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG5nZXRSb290Ok0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG5nZXRBZG1pbk5vZGU6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnYWRtaW5Ob2RlJykpfSksXG5cbndpdGhkcmF3RmFjZXQ6TS5pbnRlcmZhY2UoJ1dpdGhkcmF3RmFjZXQnLHtcbndpdGhkcmF3UGF5bWVudHM6TS5jYWxsKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcblBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKX0pLFxuXG5cbmhlbHBlcnM6TS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXIgaGVscGVyJyx7XG53cmFwSXNzdWVyS2l0V2l0aFpvZU1pbnQ6TS5jYWxsKFxuS2V5d29yZFNoYXBlLFxuSXNzdWVyS2l0U2hhcGUsXG5NLnJlbW90YWJsZSgnYWRtaW5Ob2RlJykpLlxucmV0dXJucyhab2VNaW50U2hhcGUpfSl9KTskaOKAjV9vbmNlLkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuXG5cbmNvbnN0ICAgICAgICBCdW5kbGVDYXBTaGFwZT1NLnJlbW90YWJsZSgnYnVuZGxlQ2FwJyk7JGjigI1fb25jZS5CdW5kbGVDYXBTaGFwZShCdW5kbGVDYXBTaGFwZSk7XG5jb25zdCAgICAgICAgQnVuZGxlU2hhcGU9TS5hbmQoXG5NLnNwbGl0UmVjb3JkKHttb2R1bGVGb3JtYXQ6TS5hbnkoKX0pLFxuTS5yZWNvcmRPZihNLnN0cmluZygpLE0uc3RyaW5nKHtzdHJpbmdMZW5ndGhMaW1pdDpJbmZpbml0eX0pKSk7JGjigI1fb25jZS5CdW5kbGVTaGFwZShCdW5kbGVTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlPU0uc3BsaXRSZWNvcmQoXG5oYXJkZW4oe1xuaW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvblNoYXBlfSksXG5cbmhhcmRlbih7XG5idW5kbGU6TS5yZWNvcmRPZihNLnN0cmluZygpLE0uc3RyaW5nKHtzdHJpbmdMZW5ndGhMaW1pdDpJbmZpbml0eX0pKSxcbmJ1bmRsZUNhcDpCdW5kbGVDYXBTaGFwZSxcbmJ1bmRsZUlEOk0uc3RyaW5nKCl9KSxcblxuaGFyZGVuKHt9KSk7JGjigI1fb25jZS5VbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZShVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFpvZVN0b3JhZ2VNYW5hZ2VySUtpdD1oYXJkZW4oe1xuem9lU2VydmljZURhdGFBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UgZGF0YUFjY2Vzcycse1xuZ2V0VGVybXM6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG5nZXRJc3N1ZXJzOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG5nZXRCcmFuZHM6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0SW5zdGFsbGF0aW9uOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0uc3RyaW5nKCkpKSxcblxuaW5zdGFsbEJ1bmRsZTpNLmNhbGwoTS5vcihJbnN0YW5jZUhhbmRsZVNoYXBlLEJ1bmRsZVNoYXBlKSkucmV0dXJucyhcbk0ucHJvbWlzZSgpKSxcblxuaW5zdGFsbEJ1bmRsZUlEOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblxuZ2V0UHVibGljRmFjZXQ6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JykpKSxcblxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLm9wdChNLnBhdHRlcm4oKSkpfSksXG5cblxubWFrZU9mZmVyQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIG1ha2VPZmZlciBhY2Nlc3MnLHtcbmdldEFzc2V0S2luZEJ5QnJhbmQ6TS5jYWxsKEJyYW5kU2hhcGUpLnJldHVybnMoQXNzZXRLaW5kU2hhcGUpLFxuZ2V0SW5zdGFuY2VBZG1pbjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdpbnN0YW5jZUFkbWluJykpLFxuXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5vcHQoTS5wYXR0ZXJuKCkpKSxcblxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbmRlcG9zaXRQYXltZW50czpNLmNhbGwoUHJvcG9zYWxTaGFwZSxQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcbk0ucHJvbWlzZSgpKX0pLFxuXG5cbnN0YXJ0SW5zdGFuY2VBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2Ugc3RhcnRJbnN0YW5jZSBhY2Nlc3MnLHtcbm1ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyOk0uY2FsbChcbk0uYW55KCksXG5JbnN0YWxsYXRpb25TaGFwZSxcbk0uYW55KCksXG5Jc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLFxuTS5vcihJbnN0YW5jZUhhbmRsZVNoYXBlLEJ1bmRsZVNoYXBlKSxcbk0ub3IoQnVuZGxlQ2FwU2hhcGUsQnVuZGxlU2hhcGUpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxudW53cmFwSW5zdGFsbGF0aW9uOk0uY2FsbFdoZW4oTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSkucmV0dXJucyhcblVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlKX0pLFxuXG5cbmludml0YXRpb25Jc3N1ZXJBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgaW52aXRhdGlvbklzc3Vlcicse1xuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKX0pfSk7JGjigI1fb25jZS5ab2VTdG9yYWdlTWFuYWdlcklLaXQoWm9lU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuXG5cbmNvbnN0ICAgICAgICBab2VTZXJ2aWNlST1NLmludGVyZmFjZSgnWm9lU2VydmljZScse1xuaW5zdGFsbDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5pbnN0YWxsQnVuZGxlSUQ6TS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuc3RhcnRJbnN0YW5jZTpNLmNhbGwoTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSkuXG5vcHRpb25hbChJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCksTS5hbnkoKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm9mZmVyOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkuXG5vcHRpb25hbChQcm9wb3NhbFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG5cbmdldE9mZmVyRmlsdGVyOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0uYXJyYXlPZihNLnN0cmluZygpKSksXG5cbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRGZWVJc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRCcmFuZHM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuXG5nZXRJc3N1ZXJzOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG5cbmdldFB1YmxpY0ZhY2V0Ok0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpKSxcblxuZ2V0VGVybXM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2U6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSkpLFxuXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0uc3RyaW5nKCkpKSxcblxuXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEluc3RhbmNlOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRDb25maWd1cmF0aW9uOk0uY2FsbCgpLnJldHVybnMoe1xuZmVlSXNzdWVyQ29uZmlnOntcbm5hbWU6TS5zdHJpbmcoKSxcbmFzc2V0S2luZDonbmF0JyxcbmRpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9fSksXG5cblxuZ2V0SW52aXRhdGlvbkRldGFpbHM6TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ub3B0KFByb3Bvc2FsU2hhcGUpKX0pOyRo4oCNX29uY2UuWm9lU2VydmljZUkoWm9lU2VydmljZUkpO1xuXG5cblxuY29uc3QgICAgICAgIEFkbWluRmFjZXRJPU0uaW50ZXJmYWNlKCdaY2ZBZG1pbkZhY2V0Jyx7XG5nZXRWYXRTaHV0ZG93blByb21pc2U6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5yZXN0YXJ0Q29udHJhY3Q6TS5jYWxsKCkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG51cGdyYWRlQ29udHJhY3Q6TS5jYWxsKE0uc3RyaW5nKCkpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7JGjigI1fb25jZS5BZG1pbkZhY2V0SShBZG1pbkZhY2V0SSk7XG5cblxuY29uc3QgICAgICAgIFNlYXREYXRhU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbnByb3Bvc2FsOlByb3Bvc2FsU2hhcGUsXG5pbml0aWFsQWxsb2NhdGlvbjpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5zZWF0SGFuZGxlOlNlYXRTaGFwZX0sXG5cbntcbm9mZmVyQXJnczpNLmFueSgpfSk7JGjigI1fb25jZS5TZWF0RGF0YVNoYXBlKFNlYXREYXRhU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIEhhbmRsZU9mZmVyST1NLmludGVyZmFjZSgnSGFuZGxlT2ZmZXInLHtcbmhhbmRsZU9mZmVyOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsU2VhdERhdGFTaGFwZSkucmV0dXJucyh7XG5vZmZlclJlc3VsdFByb21pc2U6TS5wcm9taXNlKCksXG5leGl0T2JqOkV4aXRPYmplY3RTaGFwZX0pfSk7JGjigI1fb25jZS5IYW5kbGVPZmZlckkoSGFuZGxlT2ZmZXJJKTtcblxuXG5cbmNvbnN0ICAgICAgICBQcmljZVF1b3RlU2hhcGU9aGFyZGVuKHtcbnF1b3RlQW1vdW50OkFtb3VudFNoYXBlLFxucXVvdGVQYXltZW50Ok0uZXJlZihQYXltZW50U2hhcGUpfSk7JGjigI1fb25jZS5QcmljZVF1b3RlU2hhcGUoUHJpY2VRdW90ZVNoYXBlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJLZXl3b3JkU2hhcGUiOlsiS2V5d29yZFNoYXBlIl0sIkludml0YXRpb25IYW5kbGVTaGFwZSI6WyJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiXSwiSW52aXRhdGlvblNoYXBlIjpbIkludml0YXRpb25TaGFwZSJdLCJJbnN0YW5jZUhhbmRsZVNoYXBlIjpbIkluc3RhbmNlSGFuZGxlU2hhcGUiXSwiSW5zdGFsbGF0aW9uU2hhcGUiOlsiSW5zdGFsbGF0aW9uU2hhcGUiXSwiU2VhdFNoYXBlIjpbIlNlYXRTaGFwZSJdLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIl0sIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSJdLCJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSI6WyJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSJdLCJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSI6WyJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJSZWNvcmRTaGFwZSI6WyJJc3N1ZXJSZWNvcmRTaGFwZSJdLCJUZXJtc1NoYXBlIjpbIlRlcm1zU2hhcGUiXSwiSW5zdGFuY2VSZWNvcmRTaGFwZSI6WyJJbnN0YW5jZVJlY29yZFNoYXBlIl0sIkhhbmRsZUkiOlsiSGFuZGxlSSJdLCJtYWtlSGFuZGxlU2hhcGUiOlsibWFrZUhhbmRsZVNoYXBlIl0sIlRpbWVyU2hhcGUiOlsiVGltZXJTaGFwZSJdLCJGdWxsUHJvcG9zYWxTaGFwZSI6WyJGdWxsUHJvcG9zYWxTaGFwZSJdLCJQcm9wb3NhbFNoYXBlIjpbIlByb3Bvc2FsU2hhcGUiXSwiaXNPbkRlbWFuZEV4aXRSdWxlIjpbImlzT25EZW1hbmRFeGl0UnVsZSJdLCJpc1dhaXZlZEV4aXRSdWxlIjpbImlzV2FpdmVkRXhpdFJ1bGUiXSwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiOlsiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiXSwiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSI6WyJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIl0sIk9mZmVySGFuZGxlckkiOlsiT2ZmZXJIYW5kbGVySSJdLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSI6WyJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSJdLCJab2VNaW50U2hhcGUiOlsiWm9lTWludFNoYXBlIl0sIlpvZU1pbnRJIjpbIlpvZU1pbnRJIl0sIlpjZk1pbnRJIjpbIlpjZk1pbnRJIl0sIkZlZU1pbnRBY2Nlc3NTaGFwZSI6WyJGZWVNaW50QWNjZXNzU2hhcGUiXSwiRXhpdE9iamVjdEkiOlsiRXhpdE9iamVjdEkiXSwiRXhpdE9iamVjdFNoYXBlIjpbIkV4aXRPYmplY3RTaGFwZSJdLCJJbnN0YW5jZUFkbWluU2hhcGUiOlsiSW5zdGFuY2VBZG1pblNoYXBlIl0sIkluc3RhbmNlQWRtaW5JIjpbIkluc3RhbmNlQWRtaW5JIl0sIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0IjpbIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0Il0sIkJ1bmRsZUNhcFNoYXBlIjpbIkJ1bmRsZUNhcFNoYXBlIl0sIkJ1bmRsZVNoYXBlIjpbIkJ1bmRsZVNoYXBlIl0sIlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlIjpbIlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlIl0sIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJab2VTdG9yYWdlTWFuYWdlcklLaXQiXSwiWm9lU2VydmljZUkiOlsiWm9lU2VydmljZUkiXSwiQWRtaW5GYWNldEkiOlsiQWRtaW5GYWNldEkiXSwiU2VhdERhdGFTaGFwZSI6WyJTZWF0RGF0YVNoYXBlIl0sIkhhbmRsZU9mZmVySSI6WyJIYW5kbGVPZmZlckkiXSwiUHJpY2VRdW90ZVNoYXBlIjpbIlByaWNlUXVvdGVTaGFwZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADpDQFrlgcAAJYHAAAgAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAamVzc2llLWNoZWNrKi9cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSCAtIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVcbiAqIEB0eXBlZGVmIHtIICYgWGltcG9ydChcIkBlbmRvL21hcnNoYWxcIikuUmVtb3RhYmxlfSBIYW5kbGUgQSB0eXBlIGNvbnN0cnVjdG9yIGZvciBhbiBvcGFxdWUgdHlwZVxuICogaWRlbnRpZmllZCBieSB0aGUgSCBzdHJpbmcuIFRoaXMgdXNlcyBhbiBpbnRlcnNlY3Rpb24gdHlwZVxuICogKCdNeUhhbmRsZScgJiB7fSkgdG8gdGFnIHRoZSBoYW5kbGUncyB0eXBlIGV2ZW4gdGhvdWdoIHRoZSBhY3R1YWxcbiAqIHZhbHVlIGlzIGp1c3QgYW4gZW1wdHkgb2JqZWN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2V5d29yZFxuICogQHR5cGVkZWYge0hhbmRsZTwnSW52aXRhdGlvbic+fSBJbnZpdGF0aW9uSGFuZGxlIC0gYW4gb3BhcXVlIGhhbmRsZSBmb3IgYW4gaW52aXRhdGlvblxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBJc3N1ZXI8YW55Pj59IElzc3VlcktleXdvcmRSZWNvcmRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgRVJlZjxJc3N1ZXI8YW55Pj4+fSBJc3N1ZXJQS2V5d29yZFJlY29yZFxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBCcmFuZDxhbnk+Pn0gQnJhbmRLZXl3b3JkUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdGFuZGFyZFRlcm1zXG4gKiBAcHJvcGVydHkge0lzc3VlcktleXdvcmRSZWNvcmR9IGlzc3VlcnMgLSByZWNvcmQgd2l0aFxuICoga2V5d29yZHMga2V5cywgaXNzdWVyIHZhbHVlc1xuICogQHByb3BlcnR5IHtCcmFuZEtleXdvcmRSZWNvcmR9IGJyYW5kcyAtIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBrZXlzLCBicmFuZCB2YWx1ZXNcbiAqXG4gKiBAdHlwZWRlZiB7U3RhbmRhcmRUZXJtcyAmIFJlY29yZDxzdHJpbmcsIGFueT59IEFueVRlcm1zXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5zdGFuY2VSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbGF0aW9ufSBpbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydChcIi4vem9lU2VydmljZS91dGlscy5qc1wiKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtBbnlUZXJtc30gdGVybXMgLSBjb250cmFjdCBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtLfSBhc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7RGlzcGxheUluZm88Sz59IFtkaXNwbGF5SW5mb11cbiAqXG4gKiBAdHlwZWRlZiB7QW1vdW50S2V5d29yZFJlY29yZH0gQWxsb2NhdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtSPXVua25vd25dIE9mZmVyIHJlc3VsdFxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtBPW5ldmVyXSBPZmZlciBhcmdzXG4gKiBAdHlwZWRlZiB7UGF5bWVudDwnc2V0Jz59IEludml0YXRpb25cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB2iIPO2gMAANoDAAAyAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9jcmVhdGVaQ0ZWYXQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbImdldFpjZkJ1bmRsZUNhcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgZ2V0WmNmQnVuZGxlQ2FwPSh6Y2ZTcGVjLHZhdEFkbWluU3ZjKT0+e1xubGV0IHpjZkJ1bmRsZUNhcFA7XG5pZih6Y2ZTcGVjLmJ1bmRsZUNhcCl7XG56Y2ZCdW5kbGVDYXBQPXpjZlNwZWMuYnVuZGxlQ2FwO1xuIH1lbHNlIGlmKHpjZlNwZWMubmFtZSl7XG56Y2ZCdW5kbGVDYXBQPUUodmF0QWRtaW5TdmMpLmdldE5hbWVkQnVuZGxlQ2FwKHpjZlNwZWMubmFtZSk7XG4gfWVsc2UgaWYoemNmU3BlYy5pZCl7XG56Y2ZCdW5kbGVDYXBQPUUodmF0QWRtaW5TdmMpLmdldEJ1bmRsZUNhcCh6Y2ZTcGVjLmlkKTtcbiB9ZWxzZXtcbmNvbnN0IGtleXM9T2JqZWN0LmtleXMoemNmU3BlYykuam9pbignLCcpO1xuRmFpbCBgc2V0dXBDcmVhdGVaQ0ZWYXQ6IGJhZCB6Y2ZTcGVjLCBoYXMga2V5cyAnJHtxKGtleXMpfSdgO1xuIH1cblxucmV0dXJuIHpjZkJ1bmRsZUNhcFA7XG4gfTskaOKAjV9vbmNlLmdldFpjZkJ1bmRsZUNhcChnZXRaY2ZCdW5kbGVDYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldFpjZkJ1bmRsZUNhcCI6WyJnZXRaY2ZCdW5kbGVDYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAp26XTvsSAAD7EgAAMwAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvZXNjcm93U3RvcmFnZS5qc3siaW1wb3J0cyI6WyIuLi9jbGVhblByb3Bvc2FsLmpzIiwiLi4vb2JqQXJyYXlDb252ZXJzaW9uLmpzIiwiLi9pbnRlcm5hbC10eXBlcy5qcyIsIi4vdHlwZXMuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbInByb3ZpZGVFc2Nyb3dTdG9yYWdlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudE1hdGgsRSxxLEZhaWwsb2JqZWN0TWFwLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLGNsZWFuS2V5d29yZHMsYXJyYXlUb09iajskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9pbnRlcm5hbC10eXBlcy5qc1wiLCBbXV0sW1wiLi4vY2xlYW5Qcm9wb3NhbC5qc1wiLCBbW1wiY2xlYW5LZXl3b3Jkc1wiLCBbJGjigI1fYSA9PiAoY2xlYW5LZXl3b3JkcyA9ICRo4oCNX2EpXV1dXSxbXCIuLi9vYmpBcnJheUNvbnZlcnNpb24uanNcIiwgW1tcImFycmF5VG9PYmpcIiwgWyRo4oCNX2EgPT4gKGFycmF5VG9PYmogPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIFN0b3JlIHRoZSBwb29sIHB1cnNlcyB3aG9zZSBwdXJwb3NlIGlzIHRvIGVzY3JvdyBhc3NldHMsIHdpdGggb25lXG4gKiBwdXJzZSBwZXIgYnJhbmQuXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUVzY3Jvd1N0b3JhZ2U9KGJhZ2dhZ2UpPT57XG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxCcmFuZCwgRVJlZjxQdXJzZT4+fSAqL1xuY29uc3QgYnJhbmRUb1B1cnNlPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKGJhZ2dhZ2UsJ2JyYW5kVG9QdXJzZScpO1xuXG4vKiogQHR5cGUge0NyZWF0ZVB1cnNlfSAqL1xuY29uc3QgY3JlYXRlUHVyc2U9KGlzc3VlcixicmFuZCk9PntcbmlmKGJyYW5kVG9QdXJzZS5oYXMoYnJhbmQpKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIEUud2hlbihcbkUoaXNzdWVyKS5tYWtlRW1wdHlQdXJzZSgpLFxuKHB1cnNlKT0+e1xuLyogQ2hlY2sgYWdhaW4gYWZ0ZXIgdGhlIHByb21pc2UgcmVzb2x2ZXMqL1xuaWYoIWJyYW5kVG9QdXJzZS5oYXMoYnJhbmQpKXtcbmJyYW5kVG9QdXJzZS5pbml0KGJyYW5kLHB1cnNlKTtcbiB9XG4gfSxcbihlcnIpPT5cbkZhaWwgYEEgcHVyc2UgY291bGQgbm90IGJlIGNyZWF0ZWQgZm9yIGJyYW5kICR7YnJhbmR9IGJlY2F1c2U6ICR7ZXJyfWApO1xuXG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7UHJvdmlkZUxvY2FsUHVyc2V9XG4gKi9cbmNvbnN0IHByb3ZpZGVMb2NhbFB1cnNlPShpc3N1ZXIsYnJhbmQpPT57XG5pZihicmFuZFRvUHVyc2UuaGFzKGJyYW5kKSl7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UHVyc2V9ICovYnJhbmRUb1B1cnNlLmdldChicmFuZCkpO1xuIH1lbHNle1xuY29uc3QgbG9jYWxQdXJzZT1pc3N1ZXIubWFrZUVtcHR5UHVyc2UoKTtcbmJyYW5kVG9QdXJzZS5pbml0KGJyYW5kLGxvY2FsUHVyc2UpO1xucmV0dXJuIGxvY2FsUHVyc2U7XG4gfVxuIH07XG5cbi8qKiBAdHlwZSB7V2l0aGRyYXdQYXltZW50c30gKi9cbmNvbnN0IHdpdGhkcmF3UGF5bWVudHM9KGFsbG9jYXRpb24pPT5cbm9iamVjdE1hcChhbGxvY2F0aW9uLChhbW91bnQpPT5cbkUoYnJhbmRUb1B1cnNlLmdldChhbW91bnQuYnJhbmQpKS53aXRoZHJhdyhhbW91bnQpKTtcblxuXG4vKipcbiAqXG4gKiAgT25seSB1c2VkIGludGVybmFsbHkuIEFjdHVhbGx5IGRlcG9zaXQgYSBwYXltZW50IG9yIHByb21pc2UgZm9yIHBheW1lbnQuXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50UFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHJldHVybnMge1Byb21pc2U8QW1vdW50Pn1cbiAqL1xuY29uc3QgZG9EZXBvc2l0UGF5bWVudD0ocGF5bWVudFAsYW1vdW50KT0+e1xuY29uc3QgcHVyc2U9YnJhbmRUb1B1cnNlLmdldChhbW91bnQuYnJhbmQpO1xucmV0dXJuIEUud2hlbihwYXltZW50UCwocGF5bWVudCk9PkUocHVyc2UpLmRlcG9zaXQocGF5bWVudCxhbW91bnQpKTtcbiB9O1xuXG4vKiBQcm9wb3NhbCBpcyBjbGVhbmVkLCBidXQgcGF5bWVudHMgYXJlIG5vdCovXG5cbi8qKiBAdHlwZSB7RGVwb3NpdFBheW1lbnRzfSAqL1xuY29uc3QgZGVwb3NpdFBheW1lbnRzPWFzeW5jKHByb3Bvc2FsLHBheW1lbnRzKT0+e1xuY29uc3R7Z2l2ZSx3YW50fT1wcm9wb3NhbDtcbmNvbnN0IGdpdmVLZXl3b3Jkcz1PYmplY3Qua2V5cyhnaXZlKTtcbmNvbnN0IHdhbnRLZXl3b3Jkcz1PYmplY3Qua2V5cyh3YW50KTtcbmNvbnN0IHBheW1lbnRLZXl3b3Jkcz1jbGVhbktleXdvcmRzKHBheW1lbnRzKTtcblxuLyogQXNzZXJ0IHRoYXQgYWxsIG9mIHRoZSBwYXltZW50IGtleXdvcmRzIGFyZSBwcmVzZW50IGluIHRoZSBnaXZlKi9cbi8qIGtleXdvcmRzLiBQcm9wb3NhbC5naXZlIGtleXdvcmRzIHRoYXQgZG8gbm90IGhhdmUgbWF0Y2hpbmcgcGF5bWVudHMgd2lsbCovXG4vKiBiZSBjYXVnaHQgaW4gdGhlIGRlcG9zaXQgc3RlcC4qL1xucGF5bWVudEtleXdvcmRzLmZvckVhY2goKGtleXdvcmQpPT57XG5naXZlS2V5d29yZHMuaW5jbHVkZXMoa2V5d29yZCl8fFxuRmFpbCBgVGhlICR7cShcbmtleXdvcmQpXG4gfSBrZXl3b3JkIGluIHRoZSBwYXltZW50S2V5d29yZFJlY29yZCB3YXMgbm90IGEga2V5d29yZCBpbiBwcm9wb3NhbC5naXZlLCB3aGljaCBoYWQga2V5d29yZHM6ICR7cShcbmdpdmVLZXl3b3JkcylcbiB9YDtcbiB9KTtcblxuY29uc3QgcHJvcG9zYWxLZXl3b3Jkcz1oYXJkZW4oWy4uLmdpdmVLZXl3b3JkcywuLi53YW50S2V5d29yZHNdKTtcblxuLyogSWYgYW55IG9mIHRoZXNlIGRlcG9zaXRzIGhhbmcgb3IgZmFpbCwgdGhlbiBkZXBvc2l0UGF5bWVudHMqL1xuLyogaGFuZ3Mgb3IgZmFpbHMsIHRoZSBvZmZlciBkb2VzIG5vdCBzdWNjZWVkLCBhbmQgYW55IGZ1bmRzIHRoYXQqL1xuLyogd2VyZSBkZXBvc2l0ZWQgaW50byB0aGUgcG9vbCBwdXJzZXMgYXJlIGxvc3QuIFdlIGhhdmUgYSB0aWNrZXQqL1xuLyogZm9yIGdpdmluZyB0aGUgdXNlciBhIHJlZnVuZCBvZiB3aGF0IHdhcyBhbHJlYWR5IGRlcG9zaXRlZCwgYW5kKi9cbi8qIG9mZmVyIHNhZmV0eSBhbmQgcGF5b3V0IGxpdmVuZXNzIGFyZSBzdGlsbCBtZWFuaW5nZnVsIGFzIGxvbmcqL1xuLyogYXMgaXNzdWVycyBhcmUgd2VsbC1iZWhhdmVkLiBGb3IgbW9yZSwgc2VlKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMTI3MSovXG5jb25zdCBhbW91bnRzRGVwb3NpdGVkPWF3YWl0IFByb21pc2UuYWxsKFxuZ2l2ZUtleXdvcmRzLm1hcCgoa2V5d29yZCk9PntcbnBheW1lbnRzW2tleXdvcmRdIT09dW5kZWZpbmVkfHxcbkZhaWwgYFRoZSAke3EoXG5rZXl3b3JkKVxuIH0ga2V5d29yZCBpbiBwcm9wb3NhbC5naXZlIGRpZCBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIHBheW1lbnQgaW4gdGhlIHBheW1lbnRLZXl3b3JkUmVjb3JkLCB3aGljaCBoYWQga2V5d29yZHM6ICR7cShcbnBheW1lbnRLZXl3b3JkcylcbiB9YDtcbnJldHVybiBkb0RlcG9zaXRQYXltZW50KHBheW1lbnRzW2tleXdvcmRdLGdpdmVba2V5d29yZF0pO1xuIH0pKTtcblxuXG5jb25zdCBlbXB0eUFtb3VudHNGb3JXYW50S2V5d29yZHM9d2FudEtleXdvcmRzLm1hcCgoa2V5d29yZCk9PlxuQW1vdW50TWF0aC5tYWtlRW1wdHlGcm9tQW1vdW50KHdhbnRba2V5d29yZF0pKTtcblxuXG5jb25zdCBpbml0aWFsQWxsb2NhdGlvbj1hcnJheVRvT2JqKFxuWy4uLmFtb3VudHNEZXBvc2l0ZWQsLi4uZW1wdHlBbW91bnRzRm9yV2FudEtleXdvcmRzXSxcbnByb3Bvc2FsS2V5d29yZHMpO1xuXG5cbnJldHVybiBpbml0aWFsQWxsb2NhdGlvbjtcbiB9O1xuXG5yZXR1cm57XG5jcmVhdGVQdXJzZSwvKiBjcmVhdGVQdXJzZSBkb2VzIG5vdCByZXR1cm4gYSBwdXJzZSovXG5wcm92aWRlTG9jYWxQdXJzZSxcbndpdGhkcmF3UGF5bWVudHMsXG5kZXBvc2l0UGF5bWVudHN9O1xuXG4gfTskaOKAjV9vbmNlLnByb3ZpZGVFc2Nyb3dTdG9yYWdlKHByb3ZpZGVFc2Nyb3dTdG9yYWdlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcm92aWRlRXNjcm93U3RvcmFnZSI6WyJwcm92aWRlRXNjcm93U3RvcmFnZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABn+nblGQ0AABkNAAAtAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9mZWVNaW50LmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbImRlZmF1bHRGZWVJc3N1ZXJDb25maWciLCJwcmVwYXJlRmVlTWludCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlRHVyYWJsZUlzc3VlcktpdCxBc3NldEtpbmQscHJlcGFyZUlzc3VlcktpdCxJc3N1ZXJTaGFwZSxCcmFuZFNoYXBlLGluaXRFbXB0eSxNLHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUscHJvdmlkZSxwcmVwYXJlRXhvQ2xhc3NLaXQsRmVlTWludEFjY2Vzc1NoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wibWFrZUR1cmFibGVJc3N1ZXJLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VEdXJhYmxlSXNzdWVyS2l0ID0gJGjigI1fYSldXSxbXCJBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZCA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUlzc3VlcktpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUlzc3VlcktpdCA9ICRo4oCNX2EpXV0sW1wiSXNzdWVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlclNoYXBlID0gJGjigI1fYSldXSxbXCJCcmFuZFNoYXBlXCIsIFskaOKAjV9hID0+IChCcmFuZFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLCBbJGjigI1fYSA9PiAoaW5pdEVtcHR5ID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByb3ZpZGVEdXJhYmxlTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIkZlZU1pbnRBY2Nlc3NTaGFwZVwiLCBbJGjigI1fYSA9PiAoRmVlTWludEFjY2Vzc1NoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCBGRUVfTUlOVF9LSVQ9J0ZlZU1pbnRLaXQnO1xuXG5jb25zdCAgICAgICAgZGVmYXVsdEZlZUlzc3VlckNvbmZpZz1oYXJkZW4oXG4vKiogQHR5cGUge2NvbnN0fSAqL3tcbm5hbWU6J1pERUZBVUxUJyxcbmFzc2V0S2luZDpBc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm86aGFyZGVuKHtkZWNpbWFsUGxhY2VzOjYsYXNzZXRLaW5kOkFzc2V0S2luZC5OQVR9KX0pO1xuXG5cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSB6b2VCYWdnYWdlXG4gKiBAcGFyYW0ge0ZlZUlzc3VlckNvbmZpZ30gZmVlSXNzdWVyQ29uZmlnXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IHNodXRkb3duWm9lVmF0XG4gKi8kaOKAjV9vbmNlLmRlZmF1bHRGZWVJc3N1ZXJDb25maWcoZGVmYXVsdEZlZUlzc3VlckNvbmZpZyk7XG5jb25zdCBwcmVwYXJlRmVlTWludD0oem9lQmFnZ2FnZSxmZWVJc3N1ZXJDb25maWcsc2h1dGRvd25ab2VWYXQpPT57XG5jb25zdCBtaW50QmFnZ2FnZT1wcm92aWRlRHVyYWJsZU1hcFN0b3JlKHpvZUJhZ2dhZ2UsJ21pbnRCYWdnYWdlJyk7XG5pZighbWludEJhZ2dhZ2UuaGFzKEZFRV9NSU5UX0tJVCkpe1xuLyoqIEB0eXBlIHtJc3N1ZXJLaXR9ICovXG5jb25zdCBmZWVJc3N1ZXJLaXQ9bWFrZUR1cmFibGVJc3N1ZXJLaXQoXG5taW50QmFnZ2FnZSxcbmZlZUlzc3VlckNvbmZpZy5uYW1lLFxuZmVlSXNzdWVyQ29uZmlnLmFzc2V0S2luZCxcbmZlZUlzc3VlckNvbmZpZy5kaXNwbGF5SW5mbyxcbnNodXRkb3duWm9lVmF0KTtcblxubWludEJhZ2dhZ2UuaW5pdChGRUVfTUlOVF9LSVQsZmVlSXNzdWVyS2l0KTtcbiB9ZWxzZXtcbnByZXBhcmVJc3N1ZXJLaXQobWludEJhZ2dhZ2Usc2h1dGRvd25ab2VWYXQpO1xuIH1cblxuY29uc3QgRmVlTWludElLaXQ9aGFyZGVuKHtcbmZlZU1pbnQ6TS5pbnRlcmZhY2UoJ0ZlZU1pbnQnLHtcbmdldEZlZUlzc3VlcktpdDpNLmNhbGwoRmVlTWludEFjY2Vzc1NoYXBlKS5yZXR1cm5zKE0ucmVjb3JkKCkpLFxuZ2V0RmVlSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuZ2V0RmVlQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhCcmFuZFNoYXBlKX0pLFxuXG5mZWVNaW50QWNjZXNzOk0uaW50ZXJmYWNlKCdGZWVNaW50QWNjZXNzJyx7fSl9KTtcblxuXG5jb25zdCBtYWtlRmVlTWludEtpdD1wcmVwYXJlRXhvQ2xhc3NLaXQoXG5taW50QmFnZ2FnZSxcbidGZWVNaW50JyxcbkZlZU1pbnRJS2l0LFxuaW5pdEVtcHR5LFxue1xuZmVlTWludDp7XG5nZXRGZWVJc3N1ZXJLaXQoYWxsZWdlZEZlZU1pbnRBY2Nlc3Mpe1xuY29uc3R7ZmFjZXRzfT10aGlzO1xuZmFjZXRzLmZlZU1pbnRBY2Nlc3M9PT1hbGxlZ2VkRmVlTWludEFjY2Vzc3x8XG5GYWlsIGBUaGUgb2JqZWN0IHJlcHJlc2VudGluZyBhY2Nlc3MgdG8gdGhlIGZlZSBicmFuZCBtaW50IHdhcyBub3QgcHJvdmlkZWRgO1xucmV0dXJuIG1pbnRCYWdnYWdlLmdldChGRUVfTUlOVF9LSVQpO1xuIH0sXG5nZXRGZWVJc3N1ZXIoKXtcbnJldHVybiBtaW50QmFnZ2FnZS5nZXQoRkVFX01JTlRfS0lUKS5pc3N1ZXI7XG4gfSxcbmdldEZlZUJyYW5kKCl7XG5yZXR1cm4gbWludEJhZ2dhZ2UuZ2V0KEZFRV9NSU5UX0tJVCkuYnJhbmQ7XG4gfX0sXG5cbi8qIGZlZU1pbnRBY2Nlc3MgaXMgYW4gb3BhcXVlIGR1cmFibGUgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmlnaHQgdG8gZ2V0Ki9cbi8qIHRoZSBmZWUgbWludC4qL1xuZmVlTWludEFjY2Vzczp7fX0pO1xuXG5cblxucmV0dXJuIHByb3ZpZGUoem9lQmFnZ2FnZSwndGhlRmVlTWludCcsKCk9Pm1ha2VGZWVNaW50S2l0KCkpO1xuIH07JGjigI1fb25jZS5wcmVwYXJlRmVlTWludChwcmVwYXJlRmVlTWludCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZUZlZU1pbnQiOlsicHJlcGFyZUZlZU1pbnQiXSwiZGVmYXVsdEZlZUlzc3VlckNvbmZpZyI6WyJkZWZhdWx0RmVlSXNzdWVyQ29uZmlnIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGUx2WjnFwAA5xcAADkAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL2luc3RhbGxhdGlvblN0b3JhZ2UuanN7ImltcG9ydHMiOlsiLi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbIm1ha2VJbnN0YWxsYXRpb25TdG9yYWdlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxNLHByZXBhcmVFeG8scHJlcGFyZUtpbmQscHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsSW5zdGFsbGF0aW9uU2hhcGUsSW5zdGFuY2VIYW5kbGVTaGFwZSxVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUV4b1wiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4byA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUtpbmRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVLaW5kID0gJGjigI1fYSldXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiSW5zdGFsbGF0aW9uU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEluc3RhbGxhdGlvblNoYXBlID0gJGjigI1fYSldXSxbXCJJbnN0YW5jZUhhbmRsZVNoYXBlXCIsIFskaOKAjV9hID0+IChJbnN0YW5jZUhhbmRsZVNoYXBlID0gJGjigI1fYSldXSxbXCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZVwiLCBbJGjigI1fYSA9PiAoVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKiogQHR5cGVkZWYgeyBYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLkJ1bmRsZUNhcH0gQnVuZGxlQ2FwICovXG4vKiogQHR5cGVkZWYgeyBYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLkJ1bmRsZUlEfSBCdW5kbGVJRCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG4vKipcbiAqIEBwYXJhbSB7R2V0QnVuZGxlQ2FwRm9ySUR9IGdldEJ1bmRsZUNhcEZvcklEXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IHpvZUJhZ2dhZ2VcbiAqL1xuY29uc3QgICAgICAgIG1ha2VJbnN0YWxsYXRpb25TdG9yYWdlPShnZXRCdW5kbGVDYXBGb3JJRCx6b2VCYWdnYWdlKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8SW5zdGFsbGF0aW9uLCB7IGJ1bmRsZUNhcDogQnVuZGxlQ2FwLCBidW5kbGVJRDogQnVuZGxlSUQgfT59ICovXG5jb25zdCBpbnN0YWxsYXRpb25zQnVuZGxlQ2FwPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuem9lQmFnZ2FnZSxcbidpbnN0YWxsYXRpb25zQnVuZGxlQ2FwJyk7XG5cbi8qKiBAdHlwZSB7V2Vha01hcFN0b3JlPEluc3RhbGxhdGlvbiwgU291cmNlQnVuZGxlPn0gKi9cbmNvbnN0IGluc3RhbGxhdGlvbnNCdW5kbGU9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG56b2VCYWdnYWdlLFxuJ2luc3RhbGxhdGlvbnNCdW5kbGUnKTtcblxuXG5jb25zdCBtYWtlQnVuZGxlSURJbnN0YWxsYXRpb249cHJlcGFyZUtpbmQoXG56b2VCYWdnYWdlLFxuJ0J1bmRsZUlESW5zdGFsbGF0aW9uJyxcbihidW5kbGVMYWJlbCk9Pih7YnVuZGxlTGFiZWx9KSxcbntcbmdldEJ1bmRsZTooX2NvbnRleHQpPT5GYWlsIGBidW5kbGVJRC1iYXNlZCBJbnN0YWxsYXRpb25gLFxuZ2V0QnVuZGxlTGFiZWw6KHtzdGF0ZTp7YnVuZGxlTGFiZWx9fSk9PmJ1bmRsZUxhYmVsfSk7XG5cblxuXG5jb25zdCBtYWtlQnVuZGxlSW5zdGFsbGF0aW9uPXByZXBhcmVLaW5kKFxuem9lQmFnZ2FnZSxcbidCdW5kbGVJbnN0YWxsYXRpb24nLFxuKGJ1bmRsZSxidW5kbGVMYWJlbCk9Pih7YnVuZGxlLGJ1bmRsZUxhYmVsfSksXG57XG5nZXRCdW5kbGU6KHtzdGF0ZTp7YnVuZGxlfX0pPT5idW5kbGUsXG5nZXRCdW5kbGVMYWJlbDooe3N0YXRlOntidW5kbGVMYWJlbH19KT0+YnVuZGxlTGFiZWx9KTtcblxuXG5cbi8qKlxuICogQ3JlYXRlIGFuIGluc3RhbGxhdGlvbiBmcm9tIGEgYnVuZGxlIElEIG9yIGEgZnVsbCBidW5kbGUuIElmIHdlIGFyZVxuICogZ2l2ZW4gYSBidW5kbGUgSUQsIHdhaXQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgYnVuZGxlIHRvIGJlIHJlY2VpdmVkXG4gKiBieSB0aGUgc3dpbmdzZXQga2VybmVsLCB0aGVuIHN0b3JlIGl0cyBidW5kbGVjYXAuIFRoZSBjb2RlIGlzIGN1cnJlbnRseVxuICogZXZhbHVhdGVkIGVhY2ggdGltZSBpdCBpcyB1c2VkIHRvIG1ha2UgYSBuZXcgaW5zdGFuY2Ugb2YgYSBjb250cmFjdC5cbiAqIFdoZW4gU3dpbmdTZXQgc3VwcG9ydHMgenlnb3RlcywgdGhlIGNvZGUgd2lsbCBiZSBldmFsdWF0ZWQgb25jZSB3aGVuXG4gKiBjcmVhdGluZyBhIHpjZlp5Z290ZSwgdGhlbiB0aGUgc3RhcnQoKSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWVcbiAqIGFuIGluc3RhbmNlIGlzIHN0YXJ0ZWQuXG4gKi9cblxuLyoqIEB0eXBlIHtJbnN0YWxsQnVuZGxlfSAqL1xuY29uc3QgaW5zdGFsbFNvdXJjZUJ1bmRsZT1hc3luYyhidW5kbGUsYnVuZGxlTGFiZWwpPT57XG50eXBlb2YgYnVuZGxlPT09J29iamVjdCd8fEZhaWwgYGEgYnVuZGxlIG11c3QgYmUgcHJvdmlkZWRgO1xuLyoqIEB0eXBlIHtJbnN0YWxsYXRpb259ICovXG5idW5kbGV8fEZhaWwgYGEgYnVuZGxlIG11c3QgYmUgcHJvdmlkZWRgO1xuLyoqIEB0eXBlIHtJbnN0YWxsYXRpb259ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuY29uc3QgaW5zdGFsbGF0aW9uPW1ha2VCdW5kbGVJbnN0YWxsYXRpb24oYnVuZGxlLGJ1bmRsZUxhYmVsKTtcbmluc3RhbGxhdGlvbnNCdW5kbGUuaW5pdChpbnN0YWxsYXRpb24sYnVuZGxlKTtcbnJldHVybiBpbnN0YWxsYXRpb247XG4gfTtcblxuY29uc3QgSW5zdGFsbGF0aW9uU3RvcmFnZUk9TS5pbnRlcmZhY2UoJ0luc3RhbGxhdGlvblN0b3JhZ2UnLHtcbmluc3RhbGxCdW5kbGU6TS5jYWxsKFxuTS5vcihcbkluc3RhbmNlSGFuZGxlU2hhcGUsXG5NLnJlY29yZE9mKE0uc3RyaW5nKCksTS5zdHJpbmcoe3N0cmluZ0xlbmd0aExpbWl0OkluZmluaXR5fSkpKSkuXG5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxuaW5zdGFsbEJ1bmRsZUlEOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnVud3JhcEluc3RhbGxhdGlvbjpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKFxuVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUpLFxuXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbGxhdGlvblNoYXBlKSkucmV0dXJucyhcbk0uZXJlZihNLnN0cmluZygpKSl9KTtcblxuXG5cbmNvbnN0IGluc3RhbGxhdGlvblN0b3JhZ2U9cHJlcGFyZUV4byhcbnpvZUJhZ2dhZ2UsXG4nSW5zdGFsbGF0aW9uU3RvcmFnZScsXG5JbnN0YWxsYXRpb25TdG9yYWdlSSxcbntcbiAgICAgIGFzeW5jIGluc3RhbGxCdW5kbGUoYWxsZWdlZEJ1bmRsZSxidW5kbGVMYWJlbCl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTIGRvZXNuJ3QgdW5kZXJzdGFuZCBjb250ZXh0Ki9cbmNvbnN0e3NlbGZ9PXRoaXM7XG4vKiBCdW5kbGUgaXMgYSB2ZXJ5IG9wZW4tZW5kZWQgdHlwZSBhbmQgd2UgbXVzdCBkZWNpZGUgaGVyZSB3aGV0aGVyIHRvKi9cbi8qIHRyZWF0IGl0IGFzIGVpdGhlciBhIEhhc2hCdW5kbGUgb3IgU291cmNlQnVuZGxlLiBTbyB3ZSBoYXZlIHRvKi9cbi8qIGluc3BlY3QgaXQuKi9cbnR5cGVvZiBhbGxlZ2VkQnVuZGxlPT09J29iamVjdCd8fEZhaWwgYGEgYnVuZGxlIG11c3QgYmUgcHJvdmlkZWRgO1xuYWxsZWdlZEJ1bmRsZSE9PW51bGx8fEZhaWwgYGEgYnVuZGxlIG11c3QgYmUgcHJvdmlkZWRgO1xuY29uc3R7bW9kdWxlRm9ybWF0fT1hbGxlZ2VkQnVuZGxlO1xuaWYobW9kdWxlRm9ybWF0PT09J2VuZG9aaXBCYXNlNjRTaGE1MTInKXtcbmNvbnN0e2VuZG9aaXBCYXNlNjRTaGE1MTJ9PWFsbGVnZWRCdW5kbGU7XG50eXBlb2YgZW5kb1ppcEJhc2U2NFNoYTUxMj09PSdzdHJpbmcnfHxcbkZhaWwgYGJ1bmRsZSBlbmRvWmlwQmFzZTY0U2hhNTEyIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoXG5lbmRvWmlwQmFzZTY0U2hhNTEyKVxuIH1gO1xucmV0dXJuIHNlbGYuaW5zdGFsbEJ1bmRsZUlEKCBgYjEtJHtlbmRvWmlwQmFzZTY0U2hhNTEyfWAsYnVuZGxlTGFiZWwpO1xuIH1cbnJldHVybiBpbnN0YWxsU291cmNlQnVuZGxlKGFsbGVnZWRCdW5kbGUsYnVuZGxlTGFiZWwpO1xuIH0sXG4gICAgICBhc3luYyBpbnN0YWxsQnVuZGxlSUQoYnVuZGxlSUQsYnVuZGxlTGFiZWw9YnVuZGxlSUQuc2xpY2UoMCw5KSl7XG50eXBlb2YgYnVuZGxlSUQ9PT0nc3RyaW5nJ3x8RmFpbCBgYSBidW5kbGUgSUQgbXVzdCBiZSBwcm92aWRlZGA7XG50eXBlb2YgYnVuZGxlTGFiZWw9PT0nc3RyaW5nJ3x8XG5GYWlsIGBhIGJ1bmRsZSBsYWJlbCBtdXN0IGJlIGEgc3RyaW5nYDtcblxuLyogdGhpcyB3YWl0cyB1bnRpbCBzb21lb25lIHRlbGxzIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRvIHN0b3JlIHRoZSovXG4vKiBidW5kbGUgaW50byB0aGUga2VybmVsLCB3aXRoIGNvbnRyb2xsZXIudmFsaWRhdGVBbmRJbnN0YWxsQnVuZGxlKCkqL1xuY29uc3QgYnVuZGxlQ2FwPWF3YWl0IGdldEJ1bmRsZUNhcEZvcklEKGJ1bmRsZUlEKTtcbi8qIEFXQUlUKi9cblxuLyoqIEB0eXBlIHtJbnN0YWxsYXRpb259ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuY29uc3QgaW5zdGFsbGF0aW9uPW1ha2VCdW5kbGVJREluc3RhbGxhdGlvbihidW5kbGVMYWJlbCk7XG5pbnN0YWxsYXRpb25zQnVuZGxlQ2FwLmluaXQoXG5pbnN0YWxsYXRpb24sXG5oYXJkZW4oe2J1bmRsZUNhcCxidW5kbGVJRH0pKTtcblxucmV0dXJuIGluc3RhbGxhdGlvbjtcbiB9LFxudW53cmFwSW5zdGFsbGF0aW9uKGluc3RhbGxhdGlvbil7XG5pZihpbnN0YWxsYXRpb25zQnVuZGxlQ2FwLmhhcyhpbnN0YWxsYXRpb24pKXtcbmNvbnN0e2J1bmRsZUNhcCxidW5kbGVJRH09XG5pbnN0YWxsYXRpb25zQnVuZGxlQ2FwLmdldChpbnN0YWxsYXRpb24pO1xucmV0dXJue2J1bmRsZUNhcCxidW5kbGVJRCxpbnN0YWxsYXRpb259O1xuIH1lbHNlIGlmKGluc3RhbGxhdGlvbnNCdW5kbGUuaGFzKGluc3RhbGxhdGlvbikpe1xuY29uc3QgYnVuZGxlPWluc3RhbGxhdGlvbnNCdW5kbGUuZ2V0KGluc3RhbGxhdGlvbik7XG5yZXR1cm57YnVuZGxlLGluc3RhbGxhdGlvbn07XG4gfWVsc2V7XG50aHJvdyBGYWlsIGAke2luc3RhbGxhdGlvbn0gd2FzIG5vdCBhIHZhbGlkIGluc3RhbGxhdGlvbmA7XG4gfVxuIH0sXG4gICAgICBhc3luYyBnZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb24oYWxsZWdlZEluc3RhbGxhdGlvbil7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFRTIGRvZXNuJ3QgdW5kZXJzdGFuZCBjb250ZXh0Ki9cbmNvbnN0e3NlbGZ9PXRoaXM7XG5jb25zdHtidW5kbGVJRH09YXdhaXQgc2VsZi51bndyYXBJbnN0YWxsYXRpb24oYWxsZWdlZEluc3RhbGxhdGlvbik7XG4vKiBBV0FJVCovXG5idW5kbGVJRHx8RmFpbCBgaW5zdGFsbGF0aW9uIGRvZXMgbm90IGhhdmUgYSBidW5kbGUgSURgO1xucmV0dXJuIGJ1bmRsZUlEO1xuIH19KTtcblxuXG5cbnJldHVybiBpbnN0YWxsYXRpb25TdG9yYWdlO1xuIH07JGjigI1fb25jZS5tYWtlSW5zdGFsbGF0aW9uU3RvcmFnZShtYWtlSW5zdGFsbGF0aW9uU3RvcmFnZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUluc3RhbGxhdGlvblN0b3JhZ2UiOlsibWFrZUluc3RhbGxhdGlvblN0b3JhZ2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAp6GYtC0oAAAtKAAAOgAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvaW5zdGFuY2VBZG1pblN0b3JhZ2UuanN7ImltcG9ydHMiOlsiLi4vbWFrZUhhbmRsZS5qcyIsIi4uL3R5cGVHdWFyZHMuanMiLCIuL3pvZVNlYXQuanMiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbIm1ha2VJbnN0YW5jZUFkbWluTWFrZXIiLCJtYWtlSW5zdGFuY2VBZG1pblN0b3JhZ2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgY2FuQmVEdXJhYmxlLG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxwcmVwYXJlS2luZE11bHRpLHByZXBhcmVFeG9DbGFzc0tpdCxNLHByb3ZpZGUsRSxkZWZpbmVEdXJhYmxlSGFuZGxlLEJyYW5kS2V5d29yZFJlY29yZFNoYXBlLEluc3RhbmNlQWRtaW5TaGFwZSxJbnN0YW5jZUhhbmRsZVNoYXBlLElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSxtYWtlWm9lU2VhdEFkbWluRmFjdG9yeTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIiwgWyRo4oCNX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhckJpZ1NldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnU2V0U3RvcmUgPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUtpbmRNdWx0aVwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUtpbmRNdWx0aSA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9tYWtlSGFuZGxlLmpzXCIsIFtbXCJkZWZpbmVEdXJhYmxlSGFuZGxlXCIsIFskaOKAjV9hID0+IChkZWZpbmVEdXJhYmxlSGFuZGxlID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiSW5zdGFuY2VBZG1pblNoYXBlXCIsIFskaOKAjV9hID0+IChJbnN0YW5jZUFkbWluU2hhcGUgPSAkaOKAjV9hKV1dLFtcIkluc3RhbmNlSGFuZGxlU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEluc3RhbmNlSGFuZGxlU2hhcGUgPSAkaOKAjV9hKV1dLFtcIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlID0gJGjigI1fYSldXV1dLFtcIi4vem9lU2VhdC5qc1wiLCBbW1wibWFrZVpvZVNlYXRBZG1pbkZhY3RvcnlcIiwgWyRo4oCNX2EgPT4gKG1ha2Vab2VTZWF0QWRtaW5GYWN0b3J5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAZmlsZSBUd28gb2JqZWN0cyBhcmUgZGVmaW5lZCBoZXJlLCBib3RoIGNhbGxlZCBJbnN0YW5jZUFkbWluU29tZXRoaW5nLlxuICogSW5zdGFuY2VBZG1pblN0b3JhZ2UgaXMgYSBjb250YWluZXIgZm9yIGluZGl2aWR1YWwgSW5zdGFuY2VBZG1pbnMuIEVhY2hcbiAqIEluc3RhbmNlQWRtaW4gaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBjb250cmFjdCBpbnN0YW5jZSwgYW5kIGlzIHVzZWRcbiAqIGJ5IGJvdGggWm9lIGFuZCBaQ0YgdG8gcmVjb3JkIGFuZCBhY2Nlc3MgdGhlIGluc3RhbmNlIHN0YXRlLiBzdGFydEluc3RhbmNlXG4gKiBhbHNvIGRlZmluZXMgem9lSW5zdGFuY2VBZG1pbiwgd2hpY2ggaXMgYSBmYWNldCB0aGF0IGlzIHBhc3NlZCB0byBzdGFydFpjZigpXG4gKiB0aGF0IHdyYXBzIGFjY2VzcyB0byBhIHpvZUluc3RhbmNlQWRtaW4gYW5kIG90aGVyIHN0b3Jlcy5cbiAqL1xuXG5jb25zdCBJbnN0YW5jZUFkbWluU3RvcmFnZUlLaXQ9aGFyZGVuKHtcbmFjY2Vzc29yOk0uaW50ZXJmYWNlKCdJbnN0YW5jZUFkbWluU3RvcmFnZScse1xuZ2V0UHVibGljRmFjZXQ6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoKSksXG5cbmdldEJyYW5kczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSksXG5nZXRJc3N1ZXJzOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG5nZXRUZXJtczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLnJlY29yZCgpKSxcbmdldE9mZmVyRmlsdGVyOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5yZW1vdGFibGUoKSksXG5nZXRJbnN0YW5jZUFkbWluOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKEluc3RhbmNlQWRtaW5TaGFwZSl9KSxcblxudXBkYXRlcjpNLmludGVyZmFjZSgnSW5zdGFuY2VBZG1pbiB1cGRhdGVyJyx7XG5pbml0SW5zdGFuY2VBZG1pbjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSxJbnN0YW5jZUFkbWluU2hhcGUpLnJldHVybnMoXG5NLnByb21pc2UoKSksXG5cbmRlbGV0ZUluc3RhbmNlQWRtaW46TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoKX0pfSk7XG5cblxuXG4vKiogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gYmFnZ2FnZSAqL1xuY29uc3QgICAgICAgIG1ha2VJbnN0YW5jZUFkbWluU3RvcmFnZT0oYmFnZ2FnZSk9PntcbmNvbnN0IG1ha2VJQVM9cHJlcGFyZUV4b0NsYXNzS2l0KFxuYmFnZ2FnZSxcbidJbnN0YW5jZUFkbWluJyxcbkluc3RhbmNlQWRtaW5TdG9yYWdlSUtpdCxcbigpPT4oe1xuaW5zdGFuY2VUb0luc3RhbmNlQWRtaW46cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5iYWdnYWdlLFxuJ2luc3RhbmNlVG9JbnN0YW5jZUFkbWluJyl9KSxcblxuXG57XG4vKiBab2VTdG9yYWdlTWFuYWdlciB1c2VzIHRoZSBhY2Nlc3NvciBmYWNldCB0byBnZXQgaW5mbyBhYm91dCBpbnN0YW5jZXMqL1xuYWNjZXNzb3I6e1xuZ2V0UHVibGljRmFjZXQoaW5zdGFuY2Upe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5jb25zdCBpYT1zdGF0ZS5pbnN0YW5jZVRvSW5zdGFuY2VBZG1pbi5nZXQoaW5zdGFuY2UpO1xucmV0dXJuIGlhLmdldFB1YmxpY0ZhY2V0KCk7XG4gfSxcbmdldEJyYW5kcyhpbnN0YW5jZSl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVRvSW5zdGFuY2VBZG1pbi5nZXQoaW5zdGFuY2UpLmdldEJyYW5kcygpO1xuIH0sXG5nZXRJc3N1ZXJzKGluc3RhbmNlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlVG9JbnN0YW5jZUFkbWluLmdldChpbnN0YW5jZSkuZ2V0SXNzdWVycygpO1xuIH0sXG5nZXRUZXJtcyhpbnN0YW5jZSl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVRvSW5zdGFuY2VBZG1pbi5nZXQoaW5zdGFuY2UpLmdldFRlcm1zKCk7XG4gfSxcbmdldE9mZmVyRmlsdGVyKGluc3RhbmNlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlVG9JbnN0YW5jZUFkbWluLmdldChpbnN0YW5jZSkuZ2V0T2ZmZXJGaWx0ZXIoKTtcbiB9LFxuZ2V0SW5zdGFsbGF0aW9uKGluc3RhbmNlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlVG9JbnN0YW5jZUFkbWluLmdldChpbnN0YW5jZSkuZ2V0SW5zdGFsbGF0aW9uKCk7XG4gfSxcbmdldEluc3RhbmNlQWRtaW4oaW5zdGFuY2Upe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VUb0luc3RhbmNlQWRtaW4uZ2V0KGluc3RhbmNlKTtcbiB9fSxcblxuLyogVGhlIHVwZGF0ZXIgZmFjZXQgaXMgb25seSB1c2VkIGluc2lkZSB0aGUgaW5zdGFuY2VTdG9yYWdlTWFuYWdlciovXG51cGRhdGVyOntcbiAgICAgIGFzeW5jIGluaXRJbnN0YW5jZUFkbWluKGluc3RhbmNlLGluc3RhbmNlQWRtaW4pe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VUb0luc3RhbmNlQWRtaW4uaW5pdChpbnN0YW5jZSxpbnN0YW5jZUFkbWluKTtcbiB9LFxuZGVsZXRlSW5zdGFuY2VBZG1pbihpbnN0YW5jZSl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVRvSW5zdGFuY2VBZG1pbi5kZWxldGUoaW5zdGFuY2UpO1xuIH19fSk7XG5cblxuXG5yZXR1cm4gcHJvdmlkZShiYWdnYWdlLCd0aGVJbnN0YW5jZUFkbWluU3RvcmFnZScsKCk9Pm1ha2VJQVMoKSk7XG4gfTskaOKAjV9vbmNlLm1ha2VJbnN0YW5jZUFkbWluU3RvcmFnZShtYWtlSW5zdGFuY2VBZG1pblN0b3JhZ2UpO1xuaGFyZGVuKG1ha2VJbnN0YW5jZUFkbWluU3RvcmFnZSk7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gem9lQmFnZ2FnZVxuICogQHBhcmFtIHtSZXR1cm5UeXBlPG1ha2Vab2VTZWF0QWRtaW5GYWN0b3J5Pn0gbWFrZVpvZVNlYXRBZG1pbktpdFxuICovXG5jb25zdCBtYWtlSW5zdGFuY2VBZG1pbkJlaGF2aW9yPSh6b2VCYWdnYWdlLG1ha2Vab2VTZWF0QWRtaW5LaXQpPT57XG5jb25zdCBtYWtlU2VhdEhhbmRsZT1kZWZpbmVEdXJhYmxlSGFuZGxlKHpvZUJhZ2dhZ2UsJ1NlYXQnKTtcblxucmV0dXJuIGhhcmRlbih7XG5nZXRQdWJsaWNGYWNldDooe3N0YXRlfSk9PnN0YXRlLnB1YmxpY0ZhY2V0LFxuZ2V0VGVybXM6KHtzdGF0ZX0pPT5zdGF0ZS56b2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyLmdldFRlcm1zKCksXG5nZXRJc3N1ZXJzOih7c3RhdGV9KT0+c3RhdGUuem9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlci5nZXRJc3N1ZXJzKCksXG5nZXRCcmFuZHM6KHtzdGF0ZX0pPT5zdGF0ZS56b2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyLmdldEJyYW5kcygpLFxuXG4vKiBpbnN0YW5jZUFkbWluIGlzIGNyZWF0ZWQgZWFybHkgaW4gc3RhcnRJbnN0YW5jZS4gaW5pdERlbGF5ZWRTdGF0ZSBpcyovXG4vKiBjYWxsZWQgYWZ0ZXIgc3RhcnRaY2YsIGJ1dCBiZWZvcmUgdGhlIGNvbnRyYWN0IGZhY2V0cyBhcmUgbWFkZSBhdmFpbGFibGUuKi9cbmluaXREZWxheWVkU3RhdGU6KHtzdGF0ZX0saGFuZGxlT2ZmZXJPYmoscHVibGljRmFjZXQpPT57XG5zdGF0ZS5oYW5kbGVPZmZlck9iaj1oYW5kbGVPZmZlck9iajtcbmNhbkJlRHVyYWJsZShwdWJsaWNGYWNldCl8fEZhaWwgYHB1YmxpY0ZhY2V0IG11c3QgYmUgZHVyYWJsZWA7XG5zdGF0ZS5wdWJsaWNGYWNldD1wdWJsaWNGYWNldDtcbiB9LFxuZ2V0SW5zdGFsbGF0aW9uOih7c3RhdGV9KT0+XG5zdGF0ZS56b2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyLmdldEluc3RhbGxhdGlvbigpLFxuZ2V0SW5zdGFuY2U6KHtzdGF0ZX0pPT5zdGF0ZS5pbnN0YW5jZUhhbmRsZSxcbmFzc2VydEFjY2VwdGluZ09mZmVyczooe3N0YXRlfSk9PntcbnN0YXRlLmFjY2VwdGluZ09mZmVyc3x8RmFpbCBgTm8gZnVydGhlciBvZmZlcnMgYXJlIGFjY2VwdGVkYDtcbiB9LFxuZXhpdEFsbFNlYXRzOih7c3RhdGV9LGNvbXBsZXRpb24pPT57XG5zdGF0ZS5hY2NlcHRpbmdPZmZlcnM9ZmFsc2U7XG5BcnJheS5mcm9tKHN0YXRlLnpvZVNlYXRBZG1pbnMua2V5cygpKS5mb3JFYWNoKCh6b2VTZWF0QWRtaW4pPT5cbnpvZVNlYXRBZG1pbi5leGl0KGNvbXBsZXRpb24pKTtcblxuIH0sXG5mYWlsQWxsU2VhdHM6KHtzdGF0ZX0scmVhc29uKT0+e1xuc3RhdGUuYWNjZXB0aW5nT2ZmZXJzPWZhbHNlO1xuQXJyYXkuZnJvbShzdGF0ZS56b2VTZWF0QWRtaW5zLmtleXMoKSkuZm9yRWFjaCgoem9lU2VhdEFkbWluKT0+XG56b2VTZWF0QWRtaW4uZmFpbChyZWFzb24pKTtcblxuIH0sXG5zdG9wQWNjZXB0aW5nT2ZmZXJzOih7c3RhdGV9KT0+e1xuc3RhdGUuYWNjZXB0aW5nT2ZmZXJzPWZhbHNlO1xuIH0sXG5tYWtlVXNlclNlYXQ6KFxue3N0YXRlLGZhY2V0czp7aGVscGVyfX0sXG5pbnZpdGF0aW9uSGFuZGxlLFxuaW5pdGlhbEFsbG9jYXRpb24sXG5wcm9wb3NhbCxcbm9mZmVyQXJncz11bmRlZmluZWQpPT5cbntcbmNvbnN0e3VzZXJTZWF0LHpvZVNlYXRBZG1pbn09bWFrZVpvZVNlYXRBZG1pbktpdChcbmluaXRpYWxBbGxvY2F0aW9uLFxucHJvcG9zYWwsXG5oZWxwZXIsXG5zdGF0ZS56b2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyLmdldFdpdGhkcmF3RmFjZXQoKSk7XG5cblxuY29uc3Qgc2VhdEhhbmRsZT1tYWtlU2VhdEhhbmRsZSgpO1xuc3RhdGUuc2VhdEhhbmRsZVRvWm9lU2VhdEFkbWluLmluaXQoc2VhdEhhbmRsZSx6b2VTZWF0QWRtaW4pO1xuXG5jb25zdCBzZWF0RGF0YT1oYXJkZW4oe1xucHJvcG9zYWwsXG5pbml0aWFsQWxsb2NhdGlvbixcbnNlYXRIYW5kbGUsXG5vZmZlckFyZ3N9KTtcblxuXG5zdGF0ZS56b2VTZWF0QWRtaW5zLmFkZCh6b2VTZWF0QWRtaW4pO1xuc3RhdGUuaGFuZGxlT2ZmZXJPYmp8fEZhaWwgYGluY29tcGxldGUgc2V0dXAgb2Ygem9lIHNlYXRgO1xuRS53aGVuKFxuRShzdGF0ZS5oYW5kbGVPZmZlck9iaikuaGFuZGxlT2ZmZXIoaW52aXRhdGlvbkhhbmRsZSxzZWF0RGF0YSksXG4vKiogQHBhcmFtIHtIYW5kbGVPZmZlclJlc3VsdH0gcmVzdWx0ICovXG4ocmVzdWx0KT0+em9lU2VhdEFkbWluLnJlc29sdmVFeGl0QW5kUmVzdWx0KHJlc3VsdCksXG4oZXJyKT0+e1xuLyogbm90aGluZyBmb3IgWm9lIHRvIGRvIGlmIHRoZSB0ZXJtaW5hdGlvbiBmYWlscyovXG52b2lkIEUoc3RhdGUuYWRtaW5Ob2RlKS50ZXJtaW5hdGVXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH0pO1xuXG5cbi8qIHJldHVybiB0aGUgdXNlclNlYXQgYmVmb3JlIHRoZSBvZmZlckhhbmRsZXIgaXMgY2FsbGVkKi9cbnJldHVybiB1c2VyU2VhdDtcbiB9LFxubWFrZU5vRXNjcm93U2VhdDooXG57c3RhdGUsZmFjZXRzOntoZWxwZXJ9fSxcbmluaXRpYWxBbGxvY2F0aW9uLFxucHJvcG9zYWwsXG5leGl0T2JqLFxuc2VhdEhhbmRsZSk9Plxue1xuY29uc3R7dXNlclNlYXQsem9lU2VhdEFkbWlufT1tYWtlWm9lU2VhdEFkbWluS2l0KFxuaW5pdGlhbEFsbG9jYXRpb24sXG5wcm9wb3NhbCxcbmhlbHBlcixcbnN0YXRlLnpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIuZ2V0V2l0aGRyYXdGYWNldCgpLFxuZXhpdE9iaixcbnRydWUpO1xuXG5cbnN0YXRlLnpvZVNlYXRBZG1pbnMuYWRkKHpvZVNlYXRBZG1pbik7XG5zdGF0ZS5zZWF0SGFuZGxlVG9ab2VTZWF0QWRtaW4uaW5pdChzZWF0SGFuZGxlLHpvZVNlYXRBZG1pbik7XG5yZXR1cm4gdXNlclNlYXQ7XG4gfSxcbmdldE9mZmVyRmlsdGVyOih7c3RhdGV9KT0+c3RhdGUub2ZmZXJGaWx0ZXJTdHJpbmdzLFxuc2V0T2ZmZXJGaWx0ZXI6KHtzdGF0ZX0sc3RyaW5ncyk9PntcbkFycmF5LmlzQXJyYXkoc3RyaW5ncyl8fEZhaWwgYCR7cShzdHJpbmdzKX0gbXVzdCBiZSBhbiBBcnJheWA7XG5jb25zdCBwcm9wb3NlZFN0cmluZ3M9aGFyZGVuKFsuLi5zdHJpbmdzXSk7XG5wcm9wb3NlZFN0cmluZ3MuZXZlcnkoKHMpPT50eXBlb2Ygcz09PSdzdHJpbmcnKXx8XG5GYWlsIGBCbG9ja2VkIHN0cmluZ3MgKCR7cShcbnByb3Bvc2VkU3RyaW5ncylcbiB9KSBtdXN0IGJlIGFuIEFycmF5IG9mIHN0cmluZ3MuYDtcblxuc3RhdGUub2ZmZXJGaWx0ZXJTdHJpbmdzPXByb3Bvc2VkU3RyaW5ncztcbiB9LFxuLyogSWYgYW55IG9mZmVyIGZpbHRlciBzdHJpbmcgbWF0Y2hlcyB0aGUgaW5wdXQgc3RyaW5nLCBkb24ndCBwcm9jZXNzIHRoZSovXG4vKiBpbnZpdGF0aW9uLiBPZmZlciBmaWx0ZXIgc3RyaW5ncyB0aGF0IGVuZCBpbiAnOicgbWF0Y2ggaWYgdGhleSBhcmUgYSovXG4vKiBwcmVmaXggb2YgdGhlIGlucHV0IHN0cmluZzsgb3RoZXJzIG11c3QgbWF0Y2ggaXQgZXhhY3RseS4qL1xuaXNCbG9ja2VkOih7c3RhdGV9LHN0cmluZyk9PntcbnJldHVybiBzdGF0ZS5vZmZlckZpbHRlclN0cmluZ3Muc29tZSgoZmlsdGVyU3RyaW5nKT0+e1xucmV0dXJuKFxuZmlsdGVyU3RyaW5nPT09c3RyaW5nfHxcbmZpbHRlclN0cmluZy5lbmRzV2l0aCgnOicpJiZzdHJpbmcuc3RhcnRzV2l0aChmaWx0ZXJTdHJpbmcpKTtcblxuIH0pO1xuIH19KTtcblxuIH07XG5cbmNvbnN0IGhlbHBlckJlaGF2aW9yPXtcbmV4aXRab2VTZWF0QWRtaW46KHtzdGF0ZX0sem9lU2VhdEFkbWluKT0+XG5zdGF0ZS56b2VTZWF0QWRtaW5zLmRlbGV0ZSh6b2VTZWF0QWRtaW4pLFxuaGFzRXhpdGVkOih7c3RhdGV9LHpvZVNlYXRBZG1pbik9PlxuIXN0YXRlLnpvZVNlYXRBZG1pbnMuaGFzKHpvZVNlYXRBZG1pbil9O1xuXG5cbi8qKlxuICogQHR5cGVkZWYge1JlYWRvbmx5PHtcbiAqICAgcHVibGljRmFjZXQ6IHVua25vd24sXG4gKiAgIGhhbmRsZXJPZmZlck9iajogdW5rbm93bixcbiAqIH0+fSBJbW11dGFibGVTdGF0ZVxuICogQHR5cGVkZWYge3tcbiAqICAgb2ZmZXJGaWx0ZXJTdHJpbmdzOiBzdHJpbmdbXSxcbiAqIH19IE11dGFibGVTdGF0ZVxuICogQHR5cGVkZWYge011dGFibGVTdGF0ZSAmIEltbXV0YWJsZVN0YXRlfSBTdGF0ZVxuICogQHR5cGVkZWYge3tcbiAqICAgc3RhdGU6IFN0YXRlLFxuICogfX0gTWV0aG9kQ29udGV4dFxuICovXG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gem9lQmFnZ2FnZVxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8U2VhdEhhbmRsZSwgWm9lU2VhdEFkbWluPn0gc2VhdEhhbmRsZVRvWm9lU2VhdEFkbWluXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSW5zdGFuY2VBZG1pbk1ha2VyPShcbnpvZUJhZ2dhZ2UsXG5zZWF0SGFuZGxlVG9ab2VTZWF0QWRtaW4pPT5cbntcbmNvbnN0IG1ha2Vab2VTZWF0QWRtaW5LaXQ9bWFrZVpvZVNlYXRBZG1pbkZhY3Rvcnkoem9lQmFnZ2FnZSk7XG5jb25zdCBtYWtlSW5zdGFuY2VBZG1pbk11bHRpPXByZXBhcmVLaW5kTXVsdGkoXG56b2VCYWdnYWdlLFxuJ2luc3RhbmNlQWRtaW4nLFxuKGluc3RhbmNlSGFuZGxlLHpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIsYWRtaW5Ob2RlKT0+e1xuY29uc3QgcmV0VmFsPXtcbm9mZmVyRmlsdGVyU3RyaW5nczpoYXJkZW4oW10pLFxucHVibGljRmFjZXQ6dW5kZWZpbmVkLFxuaGFuZGxlT2ZmZXJPYmo6dW5kZWZpbmVkLFxuem9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcixcbnNlYXRIYW5kbGVUb1pvZVNlYXRBZG1pbixcbmluc3RhbmNlSGFuZGxlLFxuYWNjZXB0aW5nT2ZmZXJzOnRydWUsXG56b2VTZWF0QWRtaW5zOm1ha2VTY2FsYXJCaWdTZXRTdG9yZSgnem9lU2VhdEFkbWlucycse1xuZHVyYWJsZTp0cnVlfSksXG5cbmFkbWluTm9kZX07XG5cbnJldHVybiByZXRWYWw7XG4gfSxcbntcbmluc3RhbmNlQWRtaW46bWFrZUluc3RhbmNlQWRtaW5CZWhhdmlvcih6b2VCYWdnYWdlLG1ha2Vab2VTZWF0QWRtaW5LaXQpLFxuaGVscGVyOmhlbHBlckJlaGF2aW9yfSk7XG5cblxuXG5yZXR1cm4oaW5zdGFuY2VIYW5kbGUsem9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcixhZG1pbk5vZGUpPT57XG5jb25zdCBpbnN0YW5jZUFkbWluPW1ha2VJbnN0YW5jZUFkbWluTXVsdGkoXG5pbnN0YW5jZUhhbmRsZSxcbnpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIsXG5hZG1pbk5vZGUpLlxuaW5zdGFuY2VBZG1pbjtcbnJldHVybiBpbnN0YW5jZUFkbWluO1xuIH07XG4gfTskaOKAjV9vbmNlLm1ha2VJbnN0YW5jZUFkbWluTWFrZXIobWFrZUluc3RhbmNlQWRtaW5NYWtlcik7XG5cbmhhcmRlbihtYWtlSW5zdGFuY2VBZG1pbk1ha2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSW5zdGFuY2VBZG1pblN0b3JhZ2UiOlsibWFrZUluc3RhbmNlQWRtaW5TdG9yYWdlIl0sIm1ha2VJbnN0YW5jZUFkbWluTWFrZXIiOlsibWFrZUluc3RhbmNlQWRtaW5NYWtlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA/cyV5dxQAAHcUAAA0AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9pbnRlcm5hbC10eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKipcbiAqIENyZWF0ZSBhIHB1cnNlIGZvciBhIG5ldyBpc3N1ZXJcbiAqXG4gKiBAY2FsbGJhY2sgQ3JlYXRlUHVyc2VcbiAqIEBwYXJhbSB7SXNzdWVyfSBpc3N1ZXJcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcmV0dXJucyB7RVJlZjx2b2lkPn1cbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBhIHB1cnNlIGZvciBhIG5ldywgbG9jYWwgaXNzdWVyLiBVc2VkIG9ubHkgZm9yIFpDRk1pbnQgaXNzdWVycy5cbiAqXG4gKiBOb3RlOiBpbiB0aGUgY2FzZSBvZiB0aGUgZmVlTWludCwgaXQgbWF5IGhhdmUgYmVlbiByZWdpc3RlcmVkXG4gKiBiZWZvcmUgd2l0aCBgZmVlTWludEFjY2Vzc2AuIEluIHRoYXQgY2FzZSwgd2UgZG8gbm90IGNyZWF0ZSBhIG5ld1xuICogcHVyc2UsIGJ1dCByZXVzZSB0aGUgZXhpc3RpbmcgcHVyc2UuXG4gKlxuICogQGNhbGxiYWNrIFByb3ZpZGVMb2NhbFB1cnNlXG4gKiBAcGFyYW0ge0lzc3Vlcn0gaXNzdWVyXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHJldHVybnMge1B1cnNlfVxuICovXG5cbi8qKlxuICogRGVwb3NpdHMgcGF5bWVudHMgb3IgcHJvbWlzZXMgZm9yIHBheW1lbnRzIGFjY29yZGluZyB0byB0aGVcbiAqIGBnaXZlYCBwcm9wZXJ0eSBvZiB0aGUgcHJvcG9zYWwuIFVzaW5nIHRoZSBwcm9wb3NhbCwgY3JlYXRlcyBhblxuICogaW5pdGlhbCBhbGxvY2F0aW9uIGluY2x1ZGluZyB0aGUgYW1vdW50IGRlcG9zaXRlZCBmb3IgYGdpdmVgXG4gKiBrZXl3b3JkcyBhbmQgYW4gZW1wdHkgYW1vdW50IGZvciBgd2FudGAga2V5d29yZHMuXG4gKlxuICogQGNhbGxiYWNrIERlcG9zaXRQYXltZW50c1xuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWxcbiAqIEBwYXJhbSB7UGF5bWVudFBLZXl3b3JkUmVjb3JkfSBwYXltZW50c1xuICogQHJldHVybnMge1Byb21pc2U8QWxsb2NhdGlvbj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSW5pdEluc3RhbmNlQWRtaW5cbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlXG4gKiBAcGFyYW0ge0luc3RhbmNlQWRtaW59IEluc3RhbmNlQWRtaW5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluc3RhbmNlQWRtaW5cbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7SW5zdGFuY2VBZG1pbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBEZWxldGVJbnN0YW5jZUFkbWluXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVW53cmFwSW5zdGFsbGF0aW9uXG4gKlxuICogQXNzZXJ0IHRoZSBpbnN0YWxsYXRpb24gaXMga25vd24sIGFuZCByZXR1cm4gdGhlIGJ1bmRsZS9idW5kbGVjYXAgYW5kXG4gKiBpbnN0YWxsYXRpb25cbiAqXG4gKiBAcGFyYW0ge0VSZWY8SW5zdGFsbGF0aW9uPn0gaW5zdGFsbGF0aW9uUFxuICogQHJldHVybnMge0VSZWY8e1xuICogICBidW5kbGU/OiBTb3VyY2VCdW5kbGUsXG4gKiAgIGJ1bmRsZUNhcD86IEJ1bmRsZUNhcCxcbiAqICAgYnVuZGxlSUQ/OiBCdW5kbGVJRCxcbiAqICAgaW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvblxuICogfT59IFhYWCBub3QgcmVhbGx5IGFuIEVSZWY7IHRoZSBpbXBsZW1lbnRpb24gaXMgc3luYyBhbmQgdGhlIEFQSSBpcyBhIHByb21pc2UgYmVjYXVzZSBvZiBjYWxsV2hlblxuICovXG4vKiBUT0RPIHJlbW92ZSBvciBhdXRvbWF0ZSBFUmVmIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNzExMCovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldElzc3VlclJlY29yZHNcbiAqIEByZXR1cm5zIHtJc3N1ZXJSZWNvcmRzfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlclxuICogQHByb3BlcnR5IHtJbnN0YW5jZVN0YXRlR2V0VGVybXN9IGdldFRlcm1zXG4gKiBAcHJvcGVydHkge0luc3RhbmNlUmVjb3JkR2V0SXNzdWVyc30gZ2V0SXNzdWVyc1xuICogQHByb3BlcnR5IHtJbnN0YW5jZVJlY29yZEdldEJyYW5kc30gZ2V0QnJhbmRzXG4gKiBAcHJvcGVydHkge1NhdmVJc3N1ZXJ9IHNhdmVJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7TWFrZVpvZU1pbnR9IG1ha2Vab2VNaW50XG4gKiBAcHJvcGVydHkge1JlZ2lzdGVyRmVlTWludH0gcmVnaXN0ZXJGZWVNaW50XG4gKiBAcHJvcGVydHkge0dldEluc3RhbmNlUmVjb3JkfSBnZXRJbnN0YW5jZVJlY29yZFxuICogQHByb3BlcnR5IHtHZXRJc3N1ZXJSZWNvcmRzfSBnZXRJc3N1ZXJSZWNvcmRzXG4gKiBAcHJvcGVydHkge0luaXRJbnN0YW5jZUFkbWlufSBpbml0SW5zdGFuY2VBZG1pblxuICogQHByb3BlcnR5IHtEZWxldGVJbnN0YW5jZUFkbWlufSBkZWxldGVJbnN0YW5jZUFkbWluXG4gKiBAcHJvcGVydHkge1pvZUluc3RhbmNlQWRtaW5NYWtlSW52aXRhdGlvbn0gbWFrZUludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXNzdWVyfSBnZXRJbnZpdGF0aW9uSXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IG9iamVjdH0gZ2V0Um9vdCBvZiBDcmVhdGVWYXRSZXN1bHRzXG4gKiBAcHJvcGVydHkgeygpID0+IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuVmF0QWRtaW5GYWNldH0gZ2V0QWRtaW5Ob2RlIG9mIENyZWF0ZVZhdFJlc3VsdHNcbiAqL1xuXG4vKipcbiAqIENyZWF0ZSBhIHN0b3JhZ2UgbWFuYWdlciBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRyYWN0IGluc3RhbmNlLiBUaGVcbiAqIFpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIgZW5jYXBzdWxhdGVzIGFjY2VzcyB0byB0aGVcbiAqIGlzc3VlclN0b3JhZ2UgYW5kIGVzY3Jvd1N0b3JhZ2UgZnJvbSBab2UsIGFuZCBzdG9yZXMgdGhlXG4gKiBpbnN0YW5jZS1zcGVjaWZpYyB0ZXJtc1xuICpcbiAqIEBjYWxsYmFjayBNYWtlWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlclxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gaW5zdGFuY2VCYWdnYWdlXG4gKiBAcGFyYW0ge0luc3RhbGxhdGlvbn0gaW5zdGFsbGF0aW9uXG4gKiBAcGFyYW0ge29iamVjdH0gY3VzdG9tVGVybXNcbiAqIEBwYXJhbSB7SXNzdWVyS2V5d29yZFJlY29yZH0gdW5jbGVhbklzc3VlcktleXdvcmRSZWNvcmRcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlXG4gKiBAcGFyYW0ge0J1bmRsZUNhcH0gY29udHJhY3RCdW5kbGVDYXBcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0YW5jZUxhYmVsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRCdW5kbGVDYXBGb3JJRFxuICogQHBhcmFtIHtCdW5kbGVJRH0gaWRcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1bmRsZUNhcD59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb25cbiAqIEBwYXJhbSB7SW52aXRhdGlvbkhhbmRsZX0gaW52aXRhdGlvbkhhbmRsZVxuICogQHJldHVybnMge1BhdHRlcm4gfCB1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBab2VTdG9yYWdlTWFuYWdlclxuICogQHByb3BlcnR5IHtNYWtlWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcn0gbWFrZVpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXJcbiAqIEBwcm9wZXJ0eSB7R2V0QXNzZXRLaW5kQnlCcmFuZH0gZ2V0QXNzZXRLaW5kQnlCcmFuZFxuICogQHByb3BlcnR5IHtEZXBvc2l0UGF5bWVudHN9IGRlcG9zaXRQYXltZW50c1xuICogQHByb3BlcnR5IHtJc3N1ZXI8J3NldCc+fSBpbnZpdGF0aW9uSXNzdWVyXG4gKiBAcHJvcGVydHkge0luc3RhbGxCdW5kbGV9IGluc3RhbGxCdW5kbGVcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbEJ1bmRsZUlEfSBpbnN0YWxsQnVuZGxlSURcbiAqIEBwcm9wZXJ0eSB7R2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9ufSBnZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi91dGlscy5qcycpLkdldFB1YmxpY0ZhY2V0fSBnZXRQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHtHZXRCcmFuZHN9IGdldEJyYW5kc1xuICogQHByb3BlcnR5IHtHZXRJc3N1ZXJzfSBnZXRJc3N1ZXJzXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdXRpbHMnKS5HZXRUZXJtc30gZ2V0VGVybXNcbiAqIEBwcm9wZXJ0eSB7R2V0T2ZmZXJGaWx0ZXJ9IGdldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkge1NldE9mZmVyRmlsdGVyfSBzZXRPZmZlckZpbHRlclxuICogQHByb3BlcnR5IHtHZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZX0gZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7R2V0SW5zdGFuY2VBZG1pbn0gZ2V0SW5zdGFuY2VBZG1pblxuICogQHByb3BlcnR5IHtVbndyYXBJbnN0YWxsYXRpb259IHVud3JhcEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHtHZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbn0gZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb25cbiAqL1xuXG4vKipcbiAqIFVzZSBWYXRBZG1pblN2YyB0byBjcmVhdGUgYSBuZXcgdmF0LCBidXQgb25seSB3aXRoIHRoZSBjb2RlIG9mIHRoZVxuICogWkNGIGJ1bmRsZVxuICpcbiAqIEBjYWxsYmFjayBDcmVhdGVaQ0ZWYXRcbiAqIEBwYXJhbSB7QnVuZGxlQ2FwfSBjb250cmFjdEJ1bmRsZUNhcFxuICogQHBhcmFtIHtzdHJpbmd9IGNvbnRyYWN0TGFiZWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuQ3JlYXRlVmF0UmVzdWx0cz59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0RmVlSXNzdWVyS2l0XG4gKiBAcGFyYW0ge0ZlZU1pbnRBY2Nlc3N9IGZlZU1pbnRBY2Nlc3NcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8J25hdCc+fVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACppN6+RBQAAkQUAADcAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL2ludml0YXRpb25RdWVyaWVzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbIm1ha2VJbnZpdGF0aW9uUXVlcnlGbnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LFgsRTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcImRldGFpbHNcIiwgWyRo4oCNX2EgPT4gKFggPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdCAgICAgICAgbWFrZUludml0YXRpb25RdWVyeUZucz0oaW52aXRhdGlvbklzc3Vlcik9Pntcbi8qKiBAdHlwZSB7R2V0SW52aXRhdGlvbkRldGFpbHN9ICovXG5jb25zdCBnZXRJbnZpdGF0aW9uRGV0YWlscz1hc3luYyhpbnZpdGF0aW9uUCk9PntcbmNvbnN0IG9uUmVqZWN0ZWQ9KHJlYXNvbik9PntcbmNvbnN0IGVycj1hc3NlcnQuZXJyb3IoXG5YIGBBIFpvZSBpbnZpdGF0aW9uIGlzIHJlcXVpcmVkLCBub3QgJHtpbnZpdGF0aW9uUH1gKTtcblxuYXNzZXJ0Lm5vdGUoZXJyLFggYER1ZSB0byAke3JlYXNvbn1gKTtcbnRocm93IGVycjtcbiB9O1xucmV0dXJuIEUuZ2V0KFxuRS5nZXQoRShpbnZpdGF0aW9uSXNzdWVyKS5nZXRBbW91bnRPZihpbnZpdGF0aW9uUCkuY2F0Y2gob25SZWplY3RlZCkpLlxudmFsdWUpW1xuMF07XG4gfTtcblxuLyoqIEB0eXBlIHtHZXRJbnN0YW5jZX0gKi9cbmNvbnN0IGdldEluc3RhbmNlPShpbnZpdGF0aW9uKT0+XG5FLmdldChnZXRJbnZpdGF0aW9uRGV0YWlscyhpbnZpdGF0aW9uKSkuaW5zdGFuY2U7XG5cbi8qKiBAdHlwZSB7R2V0SW5zdGFsbGF0aW9ufSAqL1xuY29uc3QgZ2V0SW5zdGFsbGF0aW9uPShpbnZpdGF0aW9uKT0+XG5FLmdldChnZXRJbnZpdGF0aW9uRGV0YWlscyhpbnZpdGF0aW9uKSkuaW5zdGFsbGF0aW9uO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmdldEluc3RhbmNlLFxuZ2V0SW5zdGFsbGF0aW9uLFxuZ2V0SW52aXRhdGlvbkRldGFpbHN9KTtcblxuIH07JGjigI1fb25jZS5tYWtlSW52aXRhdGlvblF1ZXJ5Rm5zKG1ha2VJbnZpdGF0aW9uUXVlcnlGbnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VJbnZpdGF0aW9uUXVlcnlGbnMiOlsibWFrZUludml0YXRpb25RdWVyeUZucyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABktc5UPgcAAD4HAAA0AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9tYWtlSW52aXRhdGlvbi5qc3siaW1wb3J0cyI6WyIuLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbInByZXBhcmVJbnZpdGF0aW9uS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsQXNzZXRLaW5kLG1ha2VEdXJhYmxlSXNzdWVyS2l0LHByZXBhcmVJc3N1ZXJLaXQsSW52aXRhdGlvbkVsZW1lbnRTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmQgPSAkaOKAjV9hKV1dLFtcIm1ha2VEdXJhYmxlSXNzdWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRHVyYWJsZUlzc3VlcktpdCA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUlzc3VlcktpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUlzc3VlcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJJbnZpdGF0aW9uRWxlbWVudFNoYXBlXCIsIFskaOKAjV9hID0+IChJbnZpdGF0aW9uRWxlbWVudFNoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCBaT0VfSU5WSVRBVElPTl9LSVQ9J1pvZUludml0YXRpb25LaXQnO1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZSB8IHVuZGVmaW5lZH0gc2h1dGRvd25ab2VWYXRcbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVJbnZpdGF0aW9uS2l0PShiYWdnYWdlLHNodXRkb3duWm9lVmF0PXVuZGVmaW5lZCk9Pntcbi8qKiBAdHlwZSB7SXNzdWVyS2l0PCdzZXQnPiB8IHVuZGVmaW5lZH0gKi9cbmxldCBpbnZpdGF0aW9uS2l0O1xuXG5jb25zdCBpbnZpdGF0aW9uS2l0QmFnZ2FnZT1wcm92aWRlRHVyYWJsZU1hcFN0b3JlKFxuYmFnZ2FnZSxcblpPRV9JTlZJVEFUSU9OX0tJVCk7XG5cbmlmKCFpbnZpdGF0aW9uS2l0QmFnZ2FnZS5oYXMoWk9FX0lOVklUQVRJT05fS0lUKSl7XG5pbnZpdGF0aW9uS2l0PW1ha2VEdXJhYmxlSXNzdWVyS2l0KFxuaW52aXRhdGlvbktpdEJhZ2dhZ2UsXG4nWm9lIEludml0YXRpb24nLFxuQXNzZXRLaW5kLlNFVCxcbnVuZGVmaW5lZCxcbnNodXRkb3duWm9lVmF0LFxue2VsZW1lbnRTaGFwZTpJbnZpdGF0aW9uRWxlbWVudFNoYXBlfSk7XG5cbmludml0YXRpb25LaXRCYWdnYWdlLmluaXQoWk9FX0lOVklUQVRJT05fS0lULGludml0YXRpb25LaXQpO1xuIH1lbHNle1xuaW52aXRhdGlvbktpdD1wcmVwYXJlSXNzdWVyS2l0KGludml0YXRpb25LaXRCYWdnYWdlKTtcbiB9XG5cbnJldHVybiBoYXJkZW4oe1xuaW52aXRhdGlvbklzc3VlcjppbnZpdGF0aW9uS2l0Lmlzc3Vlcixcbmludml0YXRpb25LaXR9KTtcblxuIH07JGjigI1fb25jZS5wcmVwYXJlSW52aXRhdGlvbktpdChwcmVwYXJlSW52aXRhdGlvbktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZUludml0YXRpb25LaXQiOlsicHJlcGFyZUludml0YXRpb25LaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjvVUmqkGAACpBgAAOgAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2Uvb2ZmZXIvYnVybkludml0YXRpb24uanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsiYnVybkludml0YXRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFpbCxhc3NlcnQsWCxFOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXSxbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV0sW1wiZGV0YWlsc1wiLCBbJGjigI1fYSA9PiAoWCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKlxuICogQnVybiB0aGUgaW52aXRhdGlvbiwgYXNzZXJ0IHRoYXQgb25seSBvbmUgaW52aXRhdGlvbiB3YXMgYnVybmVkLFxuICogYW5kIGV4dHJhY3QgYW5kIHJldHVybiB0aGUgaW5zdGFuY2VIYW5kbGUgYW5kIGludml0YXRpb25IYW5kbGVcbiAqXG4gKiBAcGFyYW0ge0lzc3Vlcn0gaW52aXRhdGlvbklzc3VlclxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBpbnZpdGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx7XG4gKiAgIGluc3RhbmNlSGFuZGxlOiBJbnN0YW5jZSxcbiAqICAgaW52aXRhdGlvbkhhbmRsZTogSW52aXRhdGlvbkhhbmRsZSxcbiAqIH0+fVxuICovXG5jb25zdCAgICAgICAgYnVybkludml0YXRpb249KGludml0YXRpb25Jc3N1ZXIsaW52aXRhdGlvbik9PntcbmNvbnN0IGhhbmRsZVJlamVjdGVkPShyZWFzb24pPT57XG5jb25zdCBlcnI9YXNzZXJ0LmVycm9yKFxuWCBgQSBab2UgaW52aXRhdGlvbiBpcyByZXF1aXJlZCwgbm90ICR7aW52aXRhdGlvbn1gKTtcblxuYXNzZXJ0Lm5vdGUoZXJyLFggYER1ZSB0byAke3JlYXNvbn1gKTtcbnRocm93IGVycjtcbiB9O1xuY29uc3QgaGFuZGxlRnVsZmlsbGVkPShpbnZpdGF0aW9uQW1vdW50KT0+e1xuY29uc3QgaW52aXRhdGlvblZhbHVlPWludml0YXRpb25BbW91bnQudmFsdWU7XG5hc3NlcnQoQXJyYXkuaXNBcnJheShpbnZpdGF0aW9uVmFsdWUpKTtcbmludml0YXRpb25WYWx1ZS5sZW5ndGg9PT0xfHxcbkZhaWwgYE9ubHkgb25lIGludml0YXRpb24gY2FuIGJlIHJlZGVlbWVkIGF0IGEgdGltZWA7XG5jb25zdFt7aW5zdGFuY2U6aW5zdGFuY2VIYW5kbGUsaGFuZGxlOmludml0YXRpb25IYW5kbGV9XT1cbmludml0YXRpb25WYWx1ZTtcbnJldHVybiBoYXJkZW4oe1xuaW5zdGFuY2VIYW5kbGUsXG5pbnZpdGF0aW9uSGFuZGxlfSk7XG5cbiB9O1xuXG5yZXR1cm4gRS53aGVuKFxuaW52aXRhdGlvbklzc3Vlci5idXJuKGludml0YXRpb24pLFxuaGFuZGxlRnVsZmlsbGVkLFxuaGFuZGxlUmVqZWN0ZWQpO1xuXG4gfTskaOKAjV9vbmNlLmJ1cm5JbnZpdGF0aW9uKGJ1cm5JbnZpdGF0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJidXJuSW52aXRhdGlvbiI6WyJidXJuSW52aXRhdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADGHEpOUQsAAFELAAAxAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9vZmZlci9vZmZlci5qc3siaW1wb3J0cyI6WyIuLi8uLi9jbGVhblByb3Bvc2FsLmpzIiwiLi4vaW50ZXJuYWwtdHlwZXMuanMiLCIuLi9pbnZpdGF0aW9uUXVlcmllcy5qcyIsIi4vYnVybkludml0YXRpb24uanMiLCJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZU9mZmVyTWV0aG9kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLG11c3RNYXRjaCxFLGNsZWFuUHJvcG9zYWwsYnVybkludml0YXRpb24sbWFrZUludml0YXRpb25RdWVyeUZuczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuLi8uLi9jbGVhblByb3Bvc2FsLmpzXCIsIFtbXCJjbGVhblByb3Bvc2FsXCIsIFskaOKAjV9hID0+IChjbGVhblByb3Bvc2FsID0gJGjigI1fYSldXV1dLFtcIi4vYnVybkludml0YXRpb24uanNcIiwgW1tcImJ1cm5JbnZpdGF0aW9uXCIsIFskaOKAjV9hID0+IChidXJuSW52aXRhdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9pbnZpdGF0aW9uUXVlcmllcy5qc1wiLCBbW1wibWFrZUludml0YXRpb25RdWVyeUZuc1wiLCBbJGjigI1fYSA9PiAobWFrZUludml0YXRpb25RdWVyeUZucyA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanNcIiwgW11dLFtcIi4uL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3QgICAgICAgIG1ha2VPZmZlck1ldGhvZD0ob2ZmZXJEYXRhQWNjZXNzKT0+e1xuLyoqIEB0eXBlIHtPZmZlcn0gKi9cbmNvbnN0IG9mZmVyPWFzeW5jKFxuaW52aXRhdGlvbixcbnVuY2xlYW5Qcm9wb3NhbD1oYXJkZW4oe30pLFxucGF5bWVudEtleXdvcmRSZWNvcmQ9aGFyZGVuKHt9KSxcbm9mZmVyQXJncz11bmRlZmluZWQpPT5cbntcbmNvbnN0IGludml0YXRpb25Jc3N1ZXI9b2ZmZXJEYXRhQWNjZXNzLmdldEludml0YXRpb25Jc3N1ZXIoKTtcbmNvbnN0IHF1ZXJ5PW1ha2VJbnZpdGF0aW9uUXVlcnlGbnMoaW52aXRhdGlvbklzc3Vlcik7XG5jb25zdHtpbnN0YW5jZSxkZXNjcmlwdGlvbn09YXdhaXQgcXVlcnkuZ2V0SW52aXRhdGlvbkRldGFpbHMoXG5pbnZpdGF0aW9uKTtcblxuLyogQVdBSVQgLy8vKi9cblxuY29uc3QgaW5zdGFuY2VBZG1pbj1hd2FpdCBvZmZlckRhdGFBY2Nlc3MuZ2V0SW5zdGFuY2VBZG1pbihpbnN0YW5jZSk7XG4vKiBBV0FJVCAvLy8qL1xuIWluc3RhbmNlQWRtaW4uaXNCbG9ja2VkKGRlc2NyaXB0aW9uKXx8XG5GYWlsIGBub3QgYWNjZXB0aW5nIG9mZmVyIHdpdGggZGVzY3JpcHRpb24gJHtxKGRlc2NyaXB0aW9uKX1gO1xuY29uc3R7aW52aXRhdGlvbkhhbmRsZX09YXdhaXQgYnVybkludml0YXRpb24oXG5pbnZpdGF0aW9uSXNzdWVyLFxuaW52aXRhdGlvbik7XG5cbi8qIEFXQUlUIC8vLyovXG5cbmluc3RhbmNlQWRtaW4uYXNzZXJ0QWNjZXB0aW5nT2ZmZXJzKCk7XG5cbmNvbnN0IGdldEFzc2V0S2luZEJ5QnJhbmQ9KGJyYW5kKT0+e1xucmV0dXJuIG9mZmVyRGF0YUFjY2Vzcy5nZXRBc3NldEtpbmRCeUJyYW5kKGJyYW5kKTtcbiB9O1xuXG5jb25zdCBwcm9wb3NhbD1jbGVhblByb3Bvc2FsKHVuY2xlYW5Qcm9wb3NhbCxnZXRBc3NldEtpbmRCeUJyYW5kKTtcbmNvbnN0IHByb3Bvc2FsU2hhcGU9XG5vZmZlckRhdGFBY2Nlc3MuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb24oaW52aXRhdGlvbkhhbmRsZSk7XG5pZihwcm9wb3NhbFNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaChwcm9wb3NhbCxwcm9wb3NhbFNoYXBlLCBgJHtxKGRlc2NyaXB0aW9uKX0gcHJvcG9zYWxgKTtcbiB9XG5cbmlmKG9mZmVyQXJncyE9PXVuZGVmaW5lZCl7XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2Yob2ZmZXJBcmdzKTtcbnBhc3NTdHlsZT09PSdjb3B5UmVjb3JkJ3x8XG5GYWlsIGBvZmZlckFyZ3MgbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIGJ1dCBpbnN0ZWFkIHdhcyBhICR7cShcbnBhc3NTdHlsZSlcbiB9OiAke29mZmVyQXJnc31gO1xuIH1cblxucmV0dXJuIEUud2hlbihcbm9mZmVyRGF0YUFjY2Vzcy5kZXBvc2l0UGF5bWVudHMocHJvcG9zYWwscGF5bWVudEtleXdvcmRSZWNvcmQpLFxuKGluaXRpYWxBbGxvY2F0aW9uKT0+XG5pbnN0YW5jZUFkbWluLm1ha2VVc2VyU2VhdChcbmludml0YXRpb25IYW5kbGUsXG5pbml0aWFsQWxsb2NhdGlvbixcbnByb3Bvc2FsLFxub2ZmZXJBcmdzKSk7XG5cblxuIH07XG5cbnJldHVybiBvZmZlcjtcbiB9OyRo4oCNX29uY2UubWFrZU9mZmVyTWV0aG9kKG1ha2VPZmZlck1ldGhvZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU9mZmVyTWV0aG9kIjpbIm1ha2VPZmZlck1ldGhvZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACP4La6giYAAIImAAAzAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9zdGFydEluc3RhbmNlLmpzeyJpbXBvcnRzIjpbIi4uL21ha2VIYW5kbGUuanMiLCIuLi90eXBlR3VhcmRzLmpzIiwiLi9pbnN0YW5jZUFkbWluU3RvcmFnZS5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlU3RhcnRJbnN0YW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLHBhc3NTdHlsZU9mLE0sbWFrZVNjYWxhckJpZ01hcFN0b3JlLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByZXBhcmVFeG9DbGFzcyxpbml0RW1wdHksZGVmaW5lRHVyYWJsZUhhbmRsZSxtYWtlSW5zdGFuY2VBZG1pbk1ha2VyLEFkbWluRmFjZXRJLEluc3RhbmNlQWRtaW5JOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9DbGFzc1wiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLCBbJGjigI1fYSA9PiAoaW5pdEVtcHR5ID0gJGjigI1fYSldXV1dLFtcIi4uL21ha2VIYW5kbGUuanNcIiwgW1tcImRlZmluZUR1cmFibGVIYW5kbGVcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUR1cmFibGVIYW5kbGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9pbnN0YW5jZUFkbWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZUluc3RhbmNlQWRtaW5NYWtlclwiLCBbJGjigI1fYSA9PiAobWFrZUluc3RhbmNlQWRtaW5NYWtlciA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJBZG1pbkZhY2V0SVwiLCBbJGjigI1fYSA9PiAoQWRtaW5GYWNldEkgPSAkaOKAjV9hKV1dLFtcIkluc3RhbmNlQWRtaW5JXCIsIFskaOKAjV9hID0+IChJbnN0YW5jZUFkbWluSSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG4vKiogQHR5cGVkZWYgeyBYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLkJ1bmRsZUNhcH0gQnVuZGxlQ2FwICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEBwYXJhbSB7UGljazxab2VTdG9yYWdlTWFuYWdlciwgJ21ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyJyB8ICd1bndyYXBJbnN0YWxsYXRpb24nPn0gc3RhcnRJbnN0YW5jZUFjY2Vzc1xuICogQHBhcmFtIHsoKSA9PiBFUmVmPEJ1bmRsZUNhcD59IGdldFpjZkJ1bmRsZUNhcFBcbiAqIEBwYXJhbSB7KGlkOiBzdHJpbmcpID0+IEJ1bmRsZUNhcH0gZ2V0QnVuZGxlQ2FwQnlJZE5vd1xuICogQHBhcmFtIHtCYWdnYWdlfSB6b2VCYWdnYWdlXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi91dGlscycpLlN0YXJ0SW5zdGFuY2V9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RhcnRJbnN0YW5jZT0oXG5zdGFydEluc3RhbmNlQWNjZXNzLFxuZ2V0WmNmQnVuZGxlQ2FwUCxcbmdldEJ1bmRsZUNhcEJ5SWROb3csXG56b2VCYWdnYWdlKT0+XG57XG5jb25zdCBtYWtlSW5zdGFuY2VIYW5kbGU9ZGVmaW5lRHVyYWJsZUhhbmRsZSh6b2VCYWdnYWdlLCdJbnN0YW5jZScpO1xuXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxTZWF0SGFuZGxlLCBab2VTZWF0QWRtaW4+fSAqL1xuY29uc3Qgc2VhdEhhbmRsZVRvWm9lU2VhdEFkbWluPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuem9lQmFnZ2FnZSxcbidzZWF0SGFuZGxlVG9ab2VTZWF0QWRtaW4nKTtcblxuXG5jb25zdCBpbnN0YW5jZUFkbWluTWFrZXI9bWFrZUluc3RhbmNlQWRtaW5NYWtlcihcbnpvZUJhZ2dhZ2UsXG5zZWF0SGFuZGxlVG9ab2VTZWF0QWRtaW4pO1xuXG5cbmNvbnN0IGdldEZyZXNoWmNmQnVuZGxlQ2FwPWFzeW5jKCk9PntcbmNvbnN0IHNldHRsZWRCdW5kbGVDYXA9YXdhaXQgZ2V0WmNmQnVuZGxlQ2FwUCgpO1xuc2V0dGxlZEJ1bmRsZUNhcCE9PXVuZGVmaW5lZHx8RmFpbCBgdGhlIFpDRiBidW5kbGUgY2FwIHdhcyBicm9rZW5gO1xucmV0dXJuIHNldHRsZWRCdW5kbGVDYXA7XG4gfTtcblxuY29uc3QgSW5zdGFuY2VBZG1pblN0YXRlU2hhcGU9aGFyZGVuKHtcbmluc3RhbmNlU3RvcmFnZTpNLnJlbW90YWJsZSgnWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcicpLFxuaW5zdGFuY2VBZG1pbjpNLnJlbW90YWJsZSgnSW5zdGFuY2VBZG1pbicpLFxuc2VhdEhhbmRsZVRvU2VhdEFkbWluOk0ucmVtb3RhYmxlKCksXG5hZG1pbk5vZGU6TS5yZW1vdGFibGUoJ2FkbWluTm9kZScpfSk7XG5cblxuY29uc3QgbWFrZVpvZUluc3RhbmNlQWRtaW49cHJlcGFyZUV4b0NsYXNzKFxuem9lQmFnZ2FnZSxcbid6b2VJbnN0YW5jZUFkbWluJyxcbkluc3RhbmNlQWRtaW5JLFxuLyoqXG4gKlxuICogQHBhcmFtIHtab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyfSBpbnN0YW5jZVN0b3JhZ2VcbiAqIEBwYXJhbSB7SW5zdGFuY2VBZG1pbn0gaW5zdGFuY2VBZG1pblxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8U2VhdEhhbmRsZSwgWm9lU2VhdEFkbWluPn0gc2VhdEhhbmRsZVRvU2VhdEFkbWluXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuVmF0QWRtaW5GYWNldH0gYWRtaW5Ob2RlXG4gKi9cbihpbnN0YW5jZVN0b3JhZ2UsaW5zdGFuY2VBZG1pbixzZWF0SGFuZGxlVG9TZWF0QWRtaW4sYWRtaW5Ob2RlKT0+KHtcbmluc3RhbmNlU3RvcmFnZSxcbmluc3RhbmNlQWRtaW4sXG5zZWF0SGFuZGxlVG9TZWF0QWRtaW4sXG5hZG1pbk5vZGV9KSxcblxue1xubWFrZUludml0YXRpb24oaGFuZGxlLGRlc2MsY3VzdG9tRGV0YWlscyxwcm9wb3NhbFNoYXBlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlU3RvcmFnZS5tYWtlSW52aXRhdGlvbihcbmhhbmRsZSxcbmRlc2MsXG5jdXN0b21EZXRhaWxzLFxucHJvcG9zYWxTaGFwZSk7XG5cbiB9LFxuLyogY2hlY2tzIG9mIGtleXdvcmQgZG9uZSBvbiB6Y2Ygc2lkZSovXG5zYXZlSXNzdWVyKGlzc3VlcixrZXl3b3JkKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlU3RvcmFnZS5zYXZlSXNzdWVyKGlzc3VlcixrZXl3b3JkKTtcbiB9LFxuLyogQSBTZWF0IHJlcXVlc3RlZCBieSB0aGUgY29udHJhY3Qgd2l0aG91dCBhbnkgcGF5bWVudHMgdG8gZXNjcm93Ki9cbm1ha2VOb0VzY3Jvd1NlYXQoaW5pdGlhbEFsbG9jYXRpb25zLHByb3Bvc2FsLGV4aXRPYmosc2VhdEhhbmRsZSl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZUFkbWluLm1ha2VOb0VzY3Jvd1NlYXQoXG5pbml0aWFsQWxsb2NhdGlvbnMsXG5wcm9wb3NhbCxcbmV4aXRPYmosXG5zZWF0SGFuZGxlKTtcblxuIH0sXG5leGl0QWxsU2VhdHMoY29tcGxldGlvbil7XG5jb25zdHtzdGF0ZX09dGhpcztcbnN0YXRlLmluc3RhbmNlQWRtaW4uZXhpdEFsbFNlYXRzKGNvbXBsZXRpb24pO1xuIH0sXG5mYWlsQWxsU2VhdHMocmVhc29uKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlQWRtaW4uZmFpbEFsbFNlYXRzKHJlYXNvbik7XG4gfSxcbmV4aXRTZWF0KHNlYXRIYW5kbGUsY29tcGxldGlvbil7XG5jb25zdHtzdGF0ZX09dGhpcztcbnN0YXRlLnNlYXRIYW5kbGVUb1NlYXRBZG1pbi5nZXQoc2VhdEhhbmRsZSkuZXhpdChjb21wbGV0aW9uKTtcbiB9LFxuZmFpbFNlYXQoc2VhdEhhbmRsZSxyZWFzb24pe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5zdGF0ZS5zZWF0SGFuZGxlVG9TZWF0QWRtaW4uZ2V0KHNlYXRIYW5kbGUpLmZhaWwocmVhc29uKTtcbiB9LFxubWFrZVpvZU1pbnQoa2V5d29yZCxhc3NldEtpbmQsZGlzcGxheUluZm8sb3B0aW9ucyl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVN0b3JhZ2UubWFrZVpvZU1pbnQoXG5rZXl3b3JkLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5vcHRpb25zKTtcblxuIH0sXG5yZWdpc3RlckZlZU1pbnQoa2V5d29yZCxmZWVNaW50QWNjZXNzKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlU3RvcmFnZS5yZWdpc3RlckZlZU1pbnQoa2V5d29yZCxmZWVNaW50QWNjZXNzKTtcbiB9LFxucmVwbGFjZUFsbG9jYXRpb25zKHNlYXRIYW5kbGVBbGxvY2F0aW9ucyl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnRyeXtcbnNlYXRIYW5kbGVBbGxvY2F0aW9ucy5mb3JFYWNoKCh7c2VhdEhhbmRsZSxhbGxvY2F0aW9ufSk9PntcbmNvbnN0IHpvZVNlYXRBZG1pbj1zdGF0ZS5zZWF0SGFuZGxlVG9TZWF0QWRtaW4uZ2V0KHNlYXRIYW5kbGUpO1xuem9lU2VhdEFkbWluLnJlcGxhY2VBbGxvY2F0aW9uKGFsbG9jYXRpb24pO1xuIH0pO1xuIH1jYXRjaChlcnIpe1xuLyogbm90aGluZyBmb3IgWm9lIHRvIGRvIGlmIHRoZSB0ZXJtaW5hdGlvbiBmYWlscyovXG52b2lkIEUoc3RhdGUuYWRtaW5Ob2RlKS50ZXJtaW5hdGVXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbiB9LFxuc3RvcEFjY2VwdGluZ09mZmVycygpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VBZG1pbi5zdG9wQWNjZXB0aW5nT2ZmZXJzKCk7XG4gfSxcbnNldE9mZmVyRmlsdGVyKHN0cmluZ3Mpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5zdGF0ZS5pbnN0YW5jZUFkbWluLnNldE9mZmVyRmlsdGVyKHN0cmluZ3MpO1xuIH0sXG5nZXRPZmZlckZpbHRlcigpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VBZG1pbi5nZXRPZmZlckZpbHRlcigpO1xuIH0sXG5nZXRFeGl0U3Vic2NyaWJlcihzZWF0SGFuZGxlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLnNlYXRIYW5kbGVUb1NlYXRBZG1pbi5nZXQoc2VhdEhhbmRsZSkuZ2V0RXhpdFN1YnNjcmliZXIoKTtcbiB9LFxuaXNCbG9ja2VkKHN0cmluZyl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZUFkbWluLmlzQmxvY2tlZChzdHJpbmcpO1xuIH19LFxuXG57XG5zdGF0ZVNoYXBlOkluc3RhbmNlQWRtaW5TdGF0ZVNoYXBlfSk7XG5cblxuXG5jb25zdCBwcmVwYXJlRW1wdHlGYWNldD0oZmFjZXROYW1lKT0+XG5wcmVwYXJlRXhvQ2xhc3MoXG56b2VCYWdnYWdlLFxuZmFjZXROYW1lLFxuTS5pbnRlcmZhY2UoZmFjZXROYW1lLHt9KSxcbmluaXRFbXB0eSxcbnt9KTtcblxuY29uc3QgbWFrZUVtcHR5Q3JlYXRvckZhY2V0PXByZXBhcmVFbXB0eUZhY2V0KCdlbXB0eUNyZWF0b3JGYWNldCcpO1xuY29uc3QgbWFrZUVtcHR5UHVibGljRmFjZXQ9cHJlcGFyZUVtcHR5RmFjZXQoJ2VtcHR5UHVibGljRmFjZXQnKTtcblxuY29uc3QgbWFrZUFkbWluRmFjZXQ9cHJlcGFyZUV4b0NsYXNzKFxuem9lQmFnZ2FnZSxcbidhZG1pbkZhY2V0JyxcbkFkbWluRmFjZXRJLFxuLyoqXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLlZhdEFkbWluRmFjZXR9IGFkbWluTm9kZVxuICogQHBhcmFtIHsqfSBjb250cmFjdEJ1bmRsZUNhcFxuICovXG4oYWRtaW5Ob2RlLGNvbnRyYWN0QnVuZGxlQ2FwKT0+KHtcbmFkbWluTm9kZSxcbmNvbnRyYWN0QnVuZGxlQ2FwfSksXG5cbntcbmdldFZhdFNodXRkb3duUHJvbWlzZSgpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5cbnJldHVybiBFKHN0YXRlLmFkbWluTm9kZSkuZG9uZSgpO1xuIH0sXG5yZXN0YXJ0Q29udHJhY3QobmV3UHJpdmF0ZUFyZ3M9dW5kZWZpbmVkKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuXG5jb25zdCB2YXRQYXJhbWV0ZXJzPXtcbmNvbnRyYWN0QnVuZGxlQ2FwOnN0YXRlLmNvbnRyYWN0QnVuZGxlQ2FwLFxucHJpdmF0ZUFyZ3M6bmV3UHJpdmF0ZUFyZ3N9O1xuXG5cbnJldHVybiBFLndoZW4oZ2V0RnJlc2haY2ZCdW5kbGVDYXAoKSwoYkNhcCk9PlxuRShzdGF0ZS5hZG1pbk5vZGUpLnVwZ3JhZGUoYkNhcCx7dmF0UGFyYW1ldGVyc30pKTtcblxuIH0sXG4gICAgICBhc3luYyB1cGdyYWRlQ29udHJhY3QoY29udHJhY3RCdW5kbGVJZCxuZXdQcml2YXRlQXJncz11bmRlZmluZWQpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5cbmNvbnN0IG5ld0NvbnRyYWN0QnVuZGxlQ2FwPWF3YWl0IGdldEJ1bmRsZUNhcEJ5SWROb3coXG5jb250cmFjdEJ1bmRsZUlkKTtcblxuY29uc3QgdmF0UGFyYW1ldGVycz17XG5jb250cmFjdEJ1bmRsZUNhcDpuZXdDb250cmFjdEJ1bmRsZUNhcCxcbnByaXZhdGVBcmdzOm5ld1ByaXZhdGVBcmdzfTtcblxucmV0dXJuIEUud2hlbihnZXRGcmVzaFpjZkJ1bmRsZUNhcCgpLChiQ2FwKT0+XG5FKHN0YXRlLmFkbWluTm9kZSkudXBncmFkZShiQ2FwLHt2YXRQYXJhbWV0ZXJzfSkpO1xuXG4gfX0pO1xuXG5cblxuY29uc3Qgc3RhcnRJbnN0YW5jZT1hc3luYyhcbmluc3RhbGxhdGlvblAsXG51bmNsZWFuSXNzdWVyS2V5d29yZFJlY29yZD1oYXJkZW4oe30pLFxuY3VzdG9tVGVybXM9aGFyZGVuKHt9KSxcbnByaXZhdGVBcmdzPXVuZGVmaW5lZCxcbmluc3RhbmNlTGFiZWw9JycpPT5cbntcbmNvbnN0e2luc3RhbGxhdGlvbixidW5kbGUsYnVuZGxlQ2FwfT1hd2FpdCBFKFxuc3RhcnRJbnN0YW5jZUFjY2VzcykuXG51bndyYXBJbnN0YWxsYXRpb24oaW5zdGFsbGF0aW9uUCk7XG4vKiBBV0FJVCAvLy8qL1xuXG5jb25zdCBjb250cmFjdEJ1bmRsZUNhcD1idW5kbGV8fGJ1bmRsZUNhcDtcbmFzc2VydChjb250cmFjdEJ1bmRsZUNhcCk7XG5cbmlmKHByaXZhdGVBcmdzIT09dW5kZWZpbmVkKXtcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwcml2YXRlQXJncyk7XG5wYXNzU3R5bGU9PT0nY29weVJlY29yZCd8fFxuRmFpbCBgcHJpdmF0ZUFyZ3MgbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIGJ1dCBpbnN0ZWFkIHdhcyBhICR7cShcbnBhc3NTdHlsZSlcbiB9OiAke3ByaXZhdGVBcmdzfWA7XG4gfVxuXG5jb25zdCBpbnN0YW5jZUhhbmRsZT1tYWtlSW5zdGFuY2VIYW5kbGUoKTtcblxuY29uc3QgaW5zdGFuY2VCYWdnYWdlPW1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnaW5zdGFuY2VCYWdnYWdlJyx7XG5kdXJhYmxlOnRydWV9KTtcblxuXG5jb25zdCB6b2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyPWF3YWl0IEUoXG5zdGFydEluc3RhbmNlQWNjZXNzKS5cbm1ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyKFxuaW5zdGFuY2VCYWdnYWdlLFxuaW5zdGFsbGF0aW9uLFxuY3VzdG9tVGVybXMsXG51bmNsZWFuSXNzdWVyS2V5d29yZFJlY29yZCxcbmluc3RhbmNlSGFuZGxlLFxuY29udHJhY3RCdW5kbGVDYXAsXG5pbnN0YW5jZUxhYmVsKTtcblxuLyogQVdBSVQgLy8vKi9cblxuY29uc3QgYWRtaW5Ob2RlPXpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIuZ2V0QWRtaW5Ob2RlKCk7XG4vKiogQHR5cGUge1pDRlJvb3R9ICovXG5jb25zdCB6Y2ZSb290PXpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIuZ2V0Um9vdCgpO1xuXG4vKiogQHR5cGUge0luc3RhbmNlQWRtaW59ICovXG5jb25zdCBpbnN0YW5jZUFkbWluPWluc3RhbmNlQWRtaW5NYWtlcihcbmluc3RhbmNlSGFuZGxlLFxuem9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcixcbmFkbWluTm9kZSk7XG5cbnpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIuaW5pdEluc3RhbmNlQWRtaW4oaW5zdGFuY2VIYW5kbGUsaW5zdGFuY2VBZG1pbik7XG5cbkUud2hlbihcbkUoYWRtaW5Ob2RlKS5kb25lKCksXG4oY29tcGxldGlvbik9Pntcbmluc3RhbmNlQWRtaW4uZXhpdEFsbFNlYXRzKGNvbXBsZXRpb24pO1xuIH0sXG4ocmVhc29uKT0+aW5zdGFuY2VBZG1pbi5mYWlsQWxsU2VhdHMocmVhc29uKSk7XG5cblxuLyoqIEB0eXBlIHtab2VJbnN0YW5jZUFkbWlufSAqL1xuY29uc3Qgem9lSW5zdGFuY2VBZG1pbkZvclpjZj1tYWtlWm9lSW5zdGFuY2VBZG1pbihcbnpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXIsXG5pbnN0YW5jZUFkbWluLFxuc2VhdEhhbmRsZVRvWm9lU2VhdEFkbWluLFxuYWRtaW5Ob2RlKTtcblxuXG4vKiBBdCB0aGlzIHBvaW50LCB0aGUgY29udHJhY3Qgd2lsbCBzdGFydCBleGVjdXRpbmcuIEFsbCBtdXN0IGJlIHJlYWR5Ki9cblxuY29uc3R7XG5jcmVhdG9yRmFjZXQ9bWFrZUVtcHR5Q3JlYXRvckZhY2V0KCksXG5wdWJsaWNGYWNldD1tYWtlRW1wdHlQdWJsaWNGYWNldCgpLFxuY3JlYXRvckludml0YXRpb246Y3JlYXRvckludml0YXRpb25QLFxuaGFuZGxlT2ZmZXJPYmp9PVxuYXdhaXQgRSh6Y2ZSb290KS5zdGFydFpjZihcbnpvZUluc3RhbmNlQWRtaW5Gb3JaY2YsXG56b2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyLmdldEluc3RhbmNlUmVjb3JkKCksXG56b2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyLmdldElzc3VlclJlY29yZHMoKSxcbnByaXZhdGVBcmdzKTtcblxuXG5pbnN0YW5jZUFkbWluLmluaXREZWxheWVkU3RhdGUoaGFuZGxlT2ZmZXJPYmoscHVibGljRmFjZXQpO1xuXG4vKiBjcmVhdG9ySW52aXRhdGlvbiBjYW4gYmUgdW5kZWZpbmVkLCBidXQgaWYgaXQgaXMgZGVmaW5lZCwqL1xuLyogbGV0J3MgbWFrZSBzdXJlIGl0IGlzIGFuIGludml0YXRpb24uKi9cbnJldHVybiBFLndoZW4oXG5Qcm9taXNlLmFsbChbXG5jcmVhdG9ySW52aXRhdGlvblAsXG5jcmVhdG9ySW52aXRhdGlvblAhPT11bmRlZmluZWQmJlxuem9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlci5cbmdldEludml0YXRpb25Jc3N1ZXIoKS5cbmlzTGl2ZShjcmVhdG9ySW52aXRhdGlvblApXSksXG5cbihbY3JlYXRvckludml0YXRpb24saXNMaXZlUmVzdWx0XSk9PntcbmNyZWF0b3JJbnZpdGF0aW9uPT09dW5kZWZpbmVkfHxcbmlzTGl2ZVJlc3VsdHx8XG5GYWlsIGBUaGUgY29udHJhY3QgZGlkIG5vdCBjb3JyZWN0bHkgcmV0dXJuIGEgY3JlYXRvckludml0YXRpb25gO1xuXG5jb25zdCBhZG1pbkZhY2V0PW1ha2VBZG1pbkZhY2V0KGFkbWluTm9kZSxjb250cmFjdEJ1bmRsZUNhcCk7XG5cbi8qIEFjdHVhbGx5IHJldHVybmVkIHRvIHRoZSB1c2VyLiovXG5yZXR1cm4gaGFyZGVuKHtcbmNyZWF0b3JGYWNldCxcblxuLyogVE9ETyAoIzU3NzUpIGRlcHJlY2F0ZSB0aGlzIHJldHVybiB2YWx1ZSBmcm9tIGNvbnRyYWN0cy4qL1xuY3JlYXRvckludml0YXRpb24sXG5pbnN0YW5jZTppbnN0YW5jZUhhbmRsZSxcbnB1YmxpY0ZhY2V0LFxuYWRtaW5GYWNldH0pO1xuXG4gfSk7XG5cbiB9O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiBoYXJkZW4oc3RhcnRJbnN0YW5jZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VTdGFydEluc3RhbmNlKG1ha2VTdGFydEluc3RhbmNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RhcnRJbnN0YW5jZSI6WyJtYWtlU3RhcnRJbnN0YW5jZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABqVac+LC0AACwtAAArAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZVNlcnZpY2VcbiAqXG4gKiBab2UgcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIGRlcGxveWluZyBhbmQgd29ya2luZyB3aXRoIHNtYXJ0XG4gKiBjb250cmFjdHMuIEl0IGlzIGFjY2Vzc2VkIGFzIGEgbG9uZy1saXZlZCBhbmQgd2VsbC10cnVzdGVkIHNlcnZpY2VcbiAqIHRoYXQgZW5mb3JjZXMgb2ZmZXIgc2FmZXR5IGZvciB0aGUgY29udHJhY3RzIHRoYXQgdXNlIGl0LiBab2UgaGFzIGFcbiAqIHNpbmdsZSBgaW52aXRhdGlvbklzc3VlcmAgZm9yIHRoZSBlbnRpcmV0eSBvZiBpdHMgbGlmZXRpbWUuIEJ5XG4gKiBoYXZpbmcgYSByZWZlcmVuY2UgdG8gWm9lLCBhIHVzZXIgY2FuIGdldCB0aGUgYGludml0YXRpb25Jc3N1ZXJgXG4gKiBhbmQgdGh1cyB2YWxpZGF0ZSBhbnkgYGludml0YXRpb25gIHRoZXkgcmVjZWl2ZSBmcm9tIHNvbWVvbmUgZWxzZS5cbiAqXG4gKiBab2UgaGFzIHR3byBkaWZmZXJlbnQgZmFjZXRzOiB0aGUgcHVibGljIFpvZSBzZXJ2aWNlIGFuZCB0aGVcbiAqIGNvbnRyYWN0IGZhY2V0IChaQ0YpLiBFYWNoIGNvbnRyYWN0IGluc3RhbmNlIGhhcyBhIGNvcHkgb2YgWkNGXG4gKiB3aXRoaW4gaXRzIHZhdC4gVGhlIGNvbnRyYWN0IGFuZCBaQ0YgbmV2ZXIgaGF2ZSBkaXJlY3QgYWNjZXNzIHRvXG4gKiB0aGUgdXNlcnMnIHBheW1lbnRzIG9yIHRoZSBab2UgcHVyc2VzLlxuICpcbiAqIEBwcm9wZXJ0eSB7R2V0SW52aXRhdGlvbklzc3Vlcn0gZ2V0SW52aXRhdGlvbklzc3VlclxuICpcbiAqIFpvZSBoYXMgYSBzaW5nbGUgYGludml0YXRpb25Jc3N1ZXJgIGZvciB0aGUgZW50aXJldHkgb2YgaXRzXG4gKiBsaWZldGltZS4gQnkgaGF2aW5nIGEgcmVmZXJlbmNlIHRvIFpvZSwgYSB1c2VyIGNhbiBnZXQgdGhlXG4gKiBgaW52aXRhdGlvbklzc3VlcmAgYW5kIHRodXMgdmFsaWRhdGUgYW55IGBpbnZpdGF0aW9uYCB0aGV5IHJlY2VpdmVcbiAqIGZyb20gc29tZW9uZSBlbHNlLiBUaGUgbWludCBhc3NvY2lhdGVkIHdpdGggdGhlIGludml0YXRpb25Jc3N1ZXJcbiAqIGNyZWF0ZXMgdGhlIEVSVFAgcGF5bWVudHMgdGhhdCByZXByZXNlbnQgdGhlIHJpZ2h0IHRvIGludGVyYWN0IHdpdGhcbiAqIGEgc21hcnQgY29udHJhY3QgaW4gcGFydGljdWxhciB3YXlzLlxuICpcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbEJ1bmRsZX0gaW5zdGFsbFxuICogQHByb3BlcnR5IHtJbnN0YWxsQnVuZGxlSUR9IGluc3RhbGxCdW5kbGVJRFxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3V0aWxzJykuU3RhcnRJbnN0YW5jZX0gc3RhcnRJbnN0YW5jZVxuICogQHByb3BlcnR5IHtPZmZlcn0gb2ZmZXJcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi91dGlscycpLkdldFB1YmxpY0ZhY2V0fSBnZXRQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHtHZXRJc3N1ZXJzfSBnZXRJc3N1ZXJzXG4gKiBAcHJvcGVydHkge0dldEJyYW5kc30gZ2V0QnJhbmRzXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdXRpbHMnKS5HZXRUZXJtc30gZ2V0VGVybXNcbiAqIEBwcm9wZXJ0eSB7R2V0T2ZmZXJGaWx0ZXJ9IGdldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkge0dldEluc3RhbGxhdGlvbkZvckluc3RhbmNlfSBnZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZVxuICogQHByb3BlcnR5IHtHZXRJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7R2V0SW5zdGFsbGF0aW9ufSBnZXRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7R2V0SW52aXRhdGlvbkRldGFpbHN9IGdldEludml0YXRpb25EZXRhaWxzXG4gKiBSZXR1cm4gYW4gb2JqZWN0IHdpdGggdGhlIGluc3RhbmNlLCBpbnN0YWxsYXRpb24sIGRlc2NyaXB0aW9uLCBpbnZpdGF0aW9uXG4gKiBoYW5kbGUsIGFuZCBhbnkgY3VzdG9tIHByb3BlcnRpZXMgc3BlY2lmaWMgdG8gdGhlIGNvbnRyYWN0LlxuICogQHByb3BlcnR5IHtHZXRGZWVJc3N1ZXJ9IGdldEZlZUlzc3VlclxuICogQHByb3BlcnR5IHtHZXRDb25maWd1cmF0aW9ufSBnZXRDb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge0dldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbn0gZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkgeyhpbnZpdGF0aW9uSGFuZGxlOiBJbnZpdGF0aW9uSGFuZGxlKSA9PiBQYXR0ZXJuIHwgdW5kZWZpbmVkfSBnZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEludml0YXRpb25Jc3N1ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPElzc3Vlcjwnc2V0Jz4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEZlZUlzc3VlclxuICogQHJldHVybnMge1Byb21pc2U8SXNzdWVyPCduYXQnPj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0Q29uZmlndXJhdGlvblxuICogQHJldHVybnMge3tcbiAqICAgZmVlSXNzdWVyQ29uZmlnOiBGZWVJc3N1ZXJDb25maWcsXG4gKiB9fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldElzc3VlcnNcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJc3N1ZXJLZXl3b3JkUmVjb3JkPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRCcmFuZHNcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxCcmFuZEtleXdvcmRSZWNvcmQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldE9mZmVyRmlsdGVyXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNldE9mZmVyRmlsdGVyXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gc3RyaW5nc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHJldHVybnMge1Byb21pc2U8SW5zdGFsbGF0aW9uPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnN0YW5jZVxuICogQHBhcmFtIHtFUmVmPEludml0YXRpb24+fSBpbnZpdGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5zdGFsbGF0aW9uXG4gKiBAcGFyYW0ge0VSZWY8SW52aXRhdGlvbj59IGludml0YXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbGxhdGlvbj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW52aXRhdGlvbkRldGFpbHNcbiAqIEBwYXJhbSB7RVJlZjxJbnZpdGF0aW9uPn0gaW52aXRhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8SW52aXRhdGlvbkRldGFpbHM+fVxuICovXG5cbi8qIFRPRE8gcmVtb3ZlIHN1cHBvcnQgZm9yIHNvdXJjZSBidW5kbGVzLCBsZWF2aW5nIG9ubHkgc3VwcG9ydCBmb3IgaGFzaCBidW5kbGVzLiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ1NjUqL1xuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFsbEJ1bmRsZVxuICpcbiAqIENyZWF0ZSBhbiBpbnN0YWxsYXRpb24gYnkgc2FmZWx5IGV2YWx1YXRpbmcgdGhlIGNvZGUgYW5kXG4gKiByZWdpc3RlcmluZyBpdCB3aXRoIFpvZS4gUmV0dXJucyBhbiBpbnN0YWxsYXRpb24uXG4gKlxuICogQHBhcmFtIHtCdW5kbGUgfCBTb3VyY2VCdW5kbGV9IGJ1bmRsZVxuICogQHBhcmFtIHtzdHJpbmd9IFtidW5kbGVMYWJlbF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbGxhdGlvbj59XG4gKi9cblxuLyogVE9ETyBjb25zb2xpZGF0ZSBpbnN0YWxsQnVuZGxlSUQgaW50byBpbnN0YWxsLiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ5NzQqL1xuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFsbEJ1bmRsZUlEXG4gKlxuICogQ3JlYXRlIGFuIGluc3RhbGxhdGlvbiBmcm9tIGEgQnVuZGxlIElELiBSZXR1cm5zIGFuIGluc3RhbGxhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0J1bmRsZUlEfSBidW5kbGVJRFxuICogQHBhcmFtIHtzdHJpbmd9IFtidW5kbGVMYWJlbF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbGxhdGlvbj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uXG4gKlxuICogVmVyaWZ5IHRoYXQgYW4gYWxsZWdlZCBJbnN0YWxsYXRpb24gaXMgcmVhbCwgYW5kIHJldHVybiB0aGUgQnVuZGxlIElEIGl0XG4gKiB3aWxsIHVzZSBmb3IgY29udHJhY3QgY29kZS5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8SW5zdGFsbGF0aW9uPn0gYWxsZWdlZEluc3RhbGxhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8QnVuZGxlSUQ+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgezxBcmdzLCBSZXN1bHQ+KFxuICogICBpbnZpdGF0aW9uOiBFUmVmPEludml0YXRpb248UmVzdWx0LCBBcmdzPj4sXG4gKiAgIHByb3Bvc2FsPzogUHJvcG9zYWwsXG4gKiAgIHBheW1lbnRLZXl3b3JkUmVjb3JkPzogUGF5bWVudFBLZXl3b3JkUmVjb3JkLFxuICogICBvZmZlckFyZ3M/OiBBcmdzLFxuICogICApID0+IFByb21pc2U8VXNlclNlYXQ8UmVzdWx0Pj5cbiAqIH0gT2ZmZXJcbiAqXG4gKiBUbyByZWRlZW0gYW4gaW52aXRhdGlvbiwgdGhlIHVzZXIgbm9ybWFsbHkgcHJvdmlkZXMgYSBwcm9wb3NhbCAodGhlaXJcbiAqIHJ1bGVzIGZvciB0aGUgb2ZmZXIpIGFzIHdlbGwgYXMgcGF5bWVudHMgdG8gYmUgZXNjcm93ZWQgYnkgWm9lLiAgSWZcbiAqIGVpdGhlciB0aGUgcHJvcG9zYWwgb3IgcGF5bWVudHMgd291bGQgYmUgZW1wdHksIGluZGljYXRlIHRoaXMgYnlcbiAqIG9taXR0aW5nIHRoYXQgYXJndW1lbnQgb3IgcGFzc2luZyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIHBhc3NpbmcgYW5cbiAqIGVtcHR5IHJlY29yZC5cbiAqXG4gKiBUaGUgcHJvcG9zYWwgaGFzIHRocmVlIHBhcnRzOiBgd2FudGAgYW5kIGBnaXZlYCBhcmUgdXNlZCBieSBab2UgdG9cbiAqIGVuZm9yY2Ugb2ZmZXIgc2FmZXR5LCBhbmQgYGV4aXRgIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGFydGljdWxhclxuICogcGF5b3V0LWxpdmVuZXNzIHBvbGljeSB0aGF0IFpvZSBjYW4gZ3VhcmFudGVlLiBgd2FudGAgYW5kIGBnaXZlYFxuICogYXJlIG9iamVjdHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy5cbiAqIGBwYXltZW50S2V5d29yZFJlY29yZGAgaXMgYSByZWNvcmQgd2l0aCBrZXl3b3JkcyBhcyBrZXlzLCBhbmQgdGhlXG4gKiB2YWx1ZXMgYXJlIHRoZSBhY3R1YWwgcGF5bWVudHMgdG8gYmUgZXNjcm93ZWQuIEEgcGF5bWVudCBpc1xuICogZXhwZWN0ZWQgZm9yIGV2ZXJ5IHJ1bGUgdW5kZXIgYGdpdmVgLlxuICovXG5cbi8qKlxuICogWm9lIHVzZXMgc2VhdHMgdG8gYWNjZXNzIG9yIG1hbmlwdWxhdGUgb2ZmZXJzLiBUaGV5IGxldCBjb250cmFjdHMgYW5kIHVzZXJzXG4gKiBpbnRlcmFjdCB3aXRoIHRoZW0uIFpvZSBoYXMgdHdvIGtpbmRzIG9mIHNlYXRzLiBaQ0ZTZWF0cyBhcmUgdXNlZCB3aXRoaW5cbiAqIGNvbnRyYWN0cyBhbmQgd2l0aCB6Y2YgbWV0aG9kcy4gVXNlclNlYXRzIHJlcHJlc2VudCBvZmZlcnMgZXh0ZXJuYWwgdG8gWm9lXG4gKiBhbmQgdGhlIGNvbnRyYWN0LiBUaGUgcGFydHkgd2hvIGV4ZXJjaXNlcyBhbiBpbnZpdGF0aW9uIGFuZCBzZW5kcyB0aGUgb2ZmZXIoKVxuICogbWVzc2FnZSB0byBab2UgZ2V0cyBhIFVzZXJTZWF0IHRoYXQgY2FuIGNoZWNrIHBheW91dHMnIHN0YXR1cyBvciByZXRyaWV2ZSB0aGVcbiAqIHJlc3VsdCBvZiBwcm9jZXNzaW5nIHRoZSBvZmZlciBpbiB0aGUgY29udHJhY3QuIFRoaXMgdmFyaWVzLCBidXQgZXhhbXBsZXMgYXJlXG4gKiBhIHN0cmluZyBhbmQgYW4gaW52aXRhdGlvbiBmb3IgYW5vdGhlciBzZWF0LlxuICpcbiAqIEFsc28sIGEgVXNlclNlYXQgY2FuIGJlIGhhbmRlZCB0byBhbiBhZ2VudCBvdXRzaWRlIFpvZSBhbmQgdGhlIGNvbnRyYWN0LFxuICogbGV0dGluZyB0aGVtIHF1ZXJ5IG9yIG1vbml0b3IgdGhlIGN1cnJlbnQgc3RhdGUsIGFjY2VzcyB0aGUgcGF5b3V0cyBhbmRcbiAqIHJlc3VsdCwgYW5kLCBpZiBpdCdzIGFsbG93ZWQgZm9yIHRoaXMgc2VhdCwgY2FsbCB0cnlFeGl0KCkuXG4gKlxuICogU2luY2UgYW55b25lIGNhbiBhdHRlbXB0IHRvIGV4aXQgdGhlIHNlYXQgaWYgdGhleSBoYXZlIGEgcmVmZXJlbmNlIHRvIGl0LCB5b3VcbiAqIHNob3VsZCBvbmx5IHNoYXJlIGEgVXNlclNlYXQgd2l0aCB0cnVzdGVkIHBhcnRpZXMuXG4gKlxuICogVXNlclNlYXQgaW5jbHVkZXMgcXVlcmllcyBmb3IgdGhlIGFzc29jaWF0ZWQgb2ZmZXIncyBjdXJyZW50IHN0YXRlIGFuZCBhblxuICogb3BlcmF0aW9uIHRvIHJlcXVlc3QgdGhhdCB0aGUgb2ZmZXIgZXhpdCwgYXMgZm9sbG93czpcbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MuYWdvcmljLmNvbS96b2UvYXBpL3pvZS5odG1sI3VzZXJzZWF0LW9iamVjdH19XG4gKiBAdGVtcGxhdGUge29iamVjdH0gW09SPXVua25vd25dXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVc2VyU2VhdFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFByb3Bvc2FsUmVjb3JkPn0gZ2V0UHJvcG9zYWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQYXltZW50UEtleXdvcmRSZWNvcmQ+fSBnZXRQYXlvdXRzXG4gKiByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYSBLZXl3b3JkUGF5bWVudFJlY29yZCBjb250YWluaW5nIGFsbCB0aGUgcGF5b3V0cyBmcm9tXG4gKiB0aGlzIHNlYXQuIFRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZSBhZnRlciB0aGUgc2VhdCBoYXMgZXhpdGVkLlxuICogQHByb3BlcnR5IHsoa2V5d29yZDogS2V5d29yZCkgPT4gUHJvbWlzZTxQYXltZW50PGFueT4+fSBnZXRQYXlvdXRcbiAqIHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgUGF5bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRpY2F0ZWQga2V5d29yZC5cbiAqIFRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZSBhZnRlciB0aGUgc2VhdCBoYXMgZXhpdGVkLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPE9SPn0gZ2V0T2ZmZXJSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gW3RyeUV4aXRdXG4gKiBOb3RlOiBPbmx5IHdvcmtzIGlmIHRoZSBzZWF0J3MgYHByb3Bvc2FsYCBoYXMgYW4gYE9uRGVtYW5kYCBgZXhpdGAgY2xhdXNlLiBab2Unc1xuICogb2ZmZXItc2FmZXR5IGd1YXJhbnRlZSBhcHBsaWVzIG5vIG1hdHRlciBob3cgYSBzZWF0J3MgaW50ZXJhY3Rpb24gd2l0aCBhXG4gKiBjb250cmFjdCBlbmRzLiBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgdGhlIHBhcnRpY2lwYW50IG1pZ2h0IGJlIGFibGUgdG9cbiAqIGNhbGwgYHRyeUV4aXQoKWAsIG9yIHRoZSBjb250cmFjdCBtaWdodCBkbyBzb21ldGhpbmcgZXhwbGljaXRseS4gT24gZXhpdGluZyxcbiAqIHRoZSBzZWF0IGhvbGRlciBnZXRzIGl0cyBjdXJyZW50IGBhbGxvY2F0aW9uYCBhbmQgdGhlIGBzZWF0YCBjYW4gbm8gbG9uZ2VyXG4gKiBpbnRlcmFjdCB3aXRoIHRoZSBjb250cmFjdC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxib29sZWFuPn0gaGFzRXhpdGVkXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlYXQgaGFzIGV4aXRlZCwgZmFsc2UgaWYgaXQgaXMgc3RpbGwgYWN0aXZlLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPDB8MT59IG51bVdhbnRzU2F0aXNmaWVkIHJldHVybnMgMSBpZiB0aGUgcHJvcG9zYWwnc1xuICogd2FudCBjbGF1c2Ugd2FzIHNhdGlzZmllZCBieSB0aGUgZmluYWwgYWxsb2NhdGlvbiwgb3RoZXJ3aXNlIDAuIFRoaXMgaXNcbiAqIG51bWVyaWMgdG8gc3VwcG9ydCBhIHBsYW5uZWQgZW5oYW5jZW1lbnQgY2FsbGVkIFwibXVsdGlwbGVzXCIgd2hpY2ggd2lsbCBhbGxvd1xuICogdGhlIHJldHVybiB2YWx1ZSB0byBiZSBhbnkgbm9uLW5lZ2F0aXZlIG51bWJlci4gVGhlIHByb21pc2Ugd2lsbCByZXNvbHZlXG4gKiBhZnRlciB0aGUgc2VhdCBoYXMgZXhpdGVkLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFsbG9jYXRpb24+fSBnZXRGaW5hbEFsbG9jYXRpb25cbiAqIHJldHVybiBhIHByb21pc2UgZm9yIHRoZSBmaW5hbCBhbGxvY2F0aW9uLiBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlXG4gKiBzZWF0IGhhcyBleGl0ZWQuXG4gKiBAcHJvcGVydHkgeygpID0+IFN1YnNjcmliZXI8Q29tcGxldGlvbj59IGdldEV4aXRTdWJzY3JpYmVyIHJldHVybnMgYSBzdWJzY3JpYmVyIHRoYXRcbiAqIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgc2VhdCBoYXMgZXhpdGVkIG9yIGZhaWxlZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPFByb3Bvc2FsUmVjb3JkPn0gUHJvcG9zYWxcbiAqXG4gKiBAdHlwZWRlZiB7e2dpdmU6IEFtb3VudEtleXdvcmRSZWNvcmQsXG4gKiAgICAgICAgICAgIHdhbnQ6IEFtb3VudEtleXdvcmRSZWNvcmQsXG4gKiAgICAgICAgICAgIGV4aXQ6IEV4aXRSdWxlXG4gKiAgICAgICAgICAgfX0gUHJvcG9zYWxSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgQW1vdW50PGFueT4+fSBBbW91bnRLZXl3b3JkUmVjb3JkXG4gKlxuICogVGhlIGtleXMgYXJlIGtleXdvcmRzLCBhbmQgdGhlIHZhbHVlcyBhcmUgYW1vdW50cy4gRm9yIGV4YW1wbGU6XG4gKiB7IEFzc2V0OiBBbW91bnRNYXRoLm1ha2UoYXNzZXRCcmFuZCwgNW4pLCBQcmljZTpcbiAqIEFtb3VudE1hdGgubWFrZShwcmljZUJyYW5kLCA5bikgfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gV2FrZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gd2FrZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXB9IERlYWRsaW5lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUaW1lclxuICogQHByb3BlcnR5IHsoZGVhZGxpbmU6IERlYWRsaW5lLCB3YWtlclA6IEVSZWY8V2FrZXI+KSA9PiB2b2lkfSBzZXRXYWtldXBcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE9uRGVtYW5kRXhpdFJ1bGVcbiAqIEBwcm9wZXJ0eSB7bnVsbH0gb25EZW1hbmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdhaXZlZEV4aXRSdWxlXG4gKiBAcHJvcGVydHkge251bGx9IHdhaXZlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWZ0ZXJEZWFkbGluZUV4aXRSdWxlXG4gKiBAcHJvcGVydHkge3t0aW1lcjpUaW1lciwgZGVhZGxpbmU6RGVhZGxpbmV9fSBhZnRlckRlYWRsaW5lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T25EZW1hbmRFeGl0UnVsZSB8IFdhaXZlZEV4aXRSdWxlIHwgQWZ0ZXJEZWFkbGluZUV4aXRSdWxlfSBFeGl0UnVsZVxuICpcbiAqIFRoZSBwb3NzaWJsZSBrZXlzIGFyZSAnd2FpdmVkJywgJ29uRGVtYW5kJywgYW5kICdhZnRlckRlYWRsaW5lJy5cbiAqIGB0aW1lcmAgYW5kIGBkZWFkbGluZWAgb25seSBhcmUgdXNlZCBmb3IgdGhlIGBhZnRlckRlYWRsaW5lYCBrZXkuXG4gKiBUaGUgcG9zc2libGUgcmVjb3JkcyBhcmU6XG4gKiBgeyB3YWl2ZWQ6IG51bGwgfWBcbiAqIGB7IG9uRGVtYW5kOiBudWxsIH1gXG4gKiBgeyBhZnRlckRlYWRsaW5lOiB7IHRpbWVyIDpUaW1lcjxEZWFkbGluZT4sIGRlYWRsaW5lIDpEZWFkbGluZSB9IH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gSW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLlZhdEFkbWluU3ZjfSBWYXRBZG1pblN2Y1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tidW5kbGVDYXA6IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuQnVuZGxlQ2FwIH0gfCB7bmFtZTogc3RyaW5nfSB8IHtpZDogQnVuZGxlSUR9fSBaQ0ZTcGVjXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgYW55Pn0gU291cmNlQnVuZGxlXG4gKiBPcGFxdWUgdHlwZSBmb3IgYSBKU09OYWJsZSBzb3VyY2UgYnVuZGxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsRVJlZjxQYXltZW50PGFueT4+Pn0gUGF5bWVudFBLZXl3b3JkUmVjb3JkXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsUGF5bWVudDxhbnk+Pn0gUGF5bWVudEtleXdvcmRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEludml0YXRpb25EZXRhaWxzXG4gKiBAcHJvcGVydHkge0luc3RhbGxhdGlvbn0gaW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtJbnZpdGF0aW9uSGFuZGxlfSBoYW5kbGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbY3VzdG9tRGV0YWlsc11cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbU0Y9YW55XSBjb250cmFjdCBzdGFydCBmdW5jdGlvblxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YWxsYXRpb248U0Y+fSBJbnN0YWxsYXRpb25cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SW5zdGFsbGF0aW9ufSBJXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbGxhdGlvblN0YXJ0PEk+fSBJbnN0YWxsYXRpb25TdGFydFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmVlSXNzdWVyQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHByb3BlcnR5IHtEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZUZlZXNDb25maWdcbiAqIEBwcm9wZXJ0eSB7TmF0VmFsdWV9IGdldFB1YmxpY0ZhY2V0RmVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SGFuZGxlPCdmZWVNaW50QWNjZXNzJz59IEZlZU1pbnRBY2Nlc3NcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAoVxhlTyMAAE8jAAApAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS96b2UuanN7ImltcG9ydHMiOlsiLi4vaW50ZXJuYWwtdHlwZXMuanMiLCIuLi90eXBlR3VhcmRzLmpzIiwiLi9jcmVhdGVaQ0ZWYXQuanMiLCIuL2ZlZU1pbnQuanMiLCIuL2ludml0YXRpb25RdWVyaWVzLmpzIiwiLi9vZmZlci9vZmZlci5qcyIsIi4vc3RhcnRJbnN0YW5jZS5qcyIsIi4vem9lU3RvcmFnZU1hbmFnZXIuanMiLCJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VEdXJhYmxlWm9lS2l0IiwibWFrZVpvZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixtYWtlU2NhbGFyQmlnTWFwU3RvcmUscHJlcGFyZUV4byxNLG1ha2Vab2VTdG9yYWdlTWFuYWdlcixtYWtlU3RhcnRJbnN0YW5jZSxtYWtlT2ZmZXJNZXRob2QsbWFrZUludml0YXRpb25RdWVyeUZucyxnZXRaY2ZCdW5kbGVDYXAsZGVmYXVsdEZlZUlzc3VlckNvbmZpZyxwcmVwYXJlRmVlTWludCxab2VTZXJ2aWNlSTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanNcIiwgW11dLFtcIi4uL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiLi96b2VTdG9yYWdlTWFuYWdlci5qc1wiLCBbW1wibWFrZVpvZVN0b3JhZ2VNYW5hZ2VyXCIsIFskaOKAjV9hID0+IChtYWtlWm9lU3RvcmFnZU1hbmFnZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdGFydEluc3RhbmNlLmpzXCIsIFtbXCJtYWtlU3RhcnRJbnN0YW5jZVwiLCBbJGjigI1fYSA9PiAobWFrZVN0YXJ0SW5zdGFuY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9vZmZlci9vZmZlci5qc1wiLCBbW1wibWFrZU9mZmVyTWV0aG9kXCIsIFskaOKAjV9hID0+IChtYWtlT2ZmZXJNZXRob2QgPSAkaOKAjV9hKV1dXV0sW1wiLi9pbnZpdGF0aW9uUXVlcmllcy5qc1wiLCBbW1wibWFrZUludml0YXRpb25RdWVyeUZuc1wiLCBbJGjigI1fYSA9PiAobWFrZUludml0YXRpb25RdWVyeUZucyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NyZWF0ZVpDRlZhdC5qc1wiLCBbW1wiZ2V0WmNmQnVuZGxlQ2FwXCIsIFskaOKAjV9hID0+IChnZXRaY2ZCdW5kbGVDYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi9mZWVNaW50LmpzXCIsIFtbXCJkZWZhdWx0RmVlSXNzdWVyQ29uZmlnXCIsIFskaOKAjV9hID0+IChkZWZhdWx0RmVlSXNzdWVyQ29uZmlnID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRmVlTWludFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUZlZU1pbnQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiWm9lU2VydmljZUlcIiwgWyRo4oCNX2EgPT4gKFpvZVNlcnZpY2VJID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQ3JlYXRlIGEgZHVyYWJsZSBpbnN0YW5jZSBvZiBab2UuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gb3B0aW9ucy56b2VCYWdnYWdlIC0gdGhlIGJhZ2dhZ2UgZm9yIFpvZSBkdXJhYmlsaXR5LiBNdXN0IGJlIHByb3ZpZGVkIGJ5IGNhbGxlclxuICogQHBhcmFtIHtQcm9taXNlPFZhdEFkbWluU3ZjPiB8IFZhdEFkbWluU3ZjfSBbb3B0aW9ucy52YXRBZG1pblN2Y10gLSBUaGUgdmF0QWRtaW4gU2VydmljZSwgd2hpY2ggY2FycmllcyB0aGVcbiAqIHBvd2VyIHRvIGNyZWF0ZSBhIG5ldyB2YXQuIElmIGl0J3Mgbm90IGF2YWlsYWJsZSB3aGVuIG1ha2Vab2UoKSBpcyBjYWxsZWQsIGl0XG4gKiBtdXN0IGJlIHByb3ZpZGVkIGxhdGVyIHVzaW5nIHNldFZhdEFkbWluU2VydmljZSgpLlxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0aW9ucy5zaHV0ZG93blpvZVZhdF0gLSBhIGZ1bmN0aW9uIHRvXG4gKiBzaHV0ZG93biB0aGUgWm9lIFZhdC4gVGhpcyBmdW5jdGlvbiBuZWVkcyB0byB1c2UgdGhlIHZhdFBvd2Vyc1xuICogYXZhaWxhYmxlIHRvIGEgdmF0LlxuICogQHBhcmFtIHtGZWVJc3N1ZXJDb25maWd9IFtvcHRpb25zLmZlZUlzc3VlckNvbmZpZ11cbiAqIEBwYXJhbSB7WkNGU3BlY30gW29wdGlvbnMuemNmU3BlY10gLSBQb2ludGVyIHRvIHRoZSBjb250cmFjdCBmYWNldCBidW5kbGUuXG4gKi9cbmNvbnN0IG1ha2VEdXJhYmxlWm9lS2l0PSh7XG56b2VCYWdnYWdlLFxudmF0QWRtaW5TdmMsXG5zaHV0ZG93blpvZVZhdD0oKT0+eyB9LFxuZmVlSXNzdWVyQ29uZmlnPWRlZmF1bHRGZWVJc3N1ZXJDb25maWcsXG56Y2ZTcGVjPXtuYW1lOid6Y2YnfX0pPT5cbntcbi8qKiBAdHlwZSB7QnVuZGxlQ2FwfSAqL1xubGV0IHpjZkJ1bmRsZUNhcDtcblxuY29uc3Qgc2F2ZUJ1bmRsZUNhcD0oKT0+e1xuRS53aGVuKFxuUHJvbWlzZS5hbGwoW3ZhdEFkbWluU3ZjLGdldFpjZkJ1bmRsZUNhcCh6Y2ZTcGVjLHZhdEFkbWluU3ZjKV0pLFxuKFt2YXRBZG1pblNlcnZpY2UsYnVuZGxlQ2FwXSk9PntcbnpjZkJ1bmRsZUNhcD1idW5kbGVDYXA7XG5cbnpvZUJhZ2dhZ2UuaW5pdCgndmF0QWRtaW5TdmMnLHZhdEFkbWluU2VydmljZSk7XG56b2VCYWdnYWdlLmluaXQoJ3pjZkJ1bmRsZUNhcCcsemNmQnVuZGxlQ2FwKTtcbiB9KTtcblxuIH07XG5cbmNvbnN0IHNldFZhdEFkbWluU2VydmljZT1GYXIoJ3NldFZhdEFkbWluU2VydmljZScsKGxhdGVWYXRBZG1pblN2Yyk9PntcbnZhdEFkbWluU3ZjPWxhdGVWYXRBZG1pblN2YztcbnNhdmVCdW5kbGVDYXAoKTtcbiB9KTtcblxuaWYodmF0QWRtaW5TdmMpe1xuc2F2ZUJ1bmRsZUNhcCgpO1xuIH1lbHNlIGlmKHpvZUJhZ2dhZ2UuaGFzKCd6Y2ZCdW5kbGVDYXAnKSl7XG56Y2ZCdW5kbGVDYXA9em9lQmFnZ2FnZS5nZXQoJ3pjZkJ1bmRsZUNhcCcpO1xuLyogaW4gdGhpcyBjYXNlLCBpdCdsbCBiZSBrbm93biB0byBoYXZlIGJlZW4gcmVzb2x2ZWQsIGJ1dCB0aGF0J3MgZmluZSovXG52YXRBZG1pblN2Yz16b2VCYWdnYWdlLmdldCgndmF0QWRtaW5TdmMnKTtcbiB9XG5cbmNvbnN0IGZlZU1pbnRLaXQ9cHJlcGFyZUZlZU1pbnQoXG56b2VCYWdnYWdlLFxuZmVlSXNzdWVyQ29uZmlnLFxuc2h1dGRvd25ab2VWYXQpO1xuXG5cbi8qIGd1YXJhbnRlZSB0aGF0IHZhdEFkbWluU3ZjUCBoYXMgYmVlbiBkZWZpbmVkLiovXG5jb25zdCBnZXRBY3R1YWxWYXRBZG1pblN2Y1A9KCk9PntcbmlmKCF2YXRBZG1pblN2Yyl7XG50aHJvdyBGYWlsIGBjcmVhdGVaQ0ZWYXQgZGlkIG5vdCBnZXQgYnVuZGxlQ2FwYDtcbiB9XG5yZXR1cm4gdmF0QWRtaW5TdmM7XG4gfTtcblxuLyoqIEB0eXBlIHtHZXRCdW5kbGVDYXBGb3JJRH0gKi9cbmNvbnN0IGdldEJ1bmRsZUNhcEZvcklEPShidW5kbGVJRCk9PntcbnJldHVybiBFKGdldEFjdHVhbFZhdEFkbWluU3ZjUCgpKS53YWl0Rm9yQnVuZGxlQ2FwKGJ1bmRsZUlEKTtcbiB9O1xuXG5jb25zdCBnZXRCdW5kbGVDYXBCeUlkTm93PShpZCk9PntcbnJldHVybiBFKGdldEFjdHVhbFZhdEFkbWluU3ZjUCgpKS5nZXRCdW5kbGVDYXAoaWQpO1xuIH07XG5cbi8qIFRoaXMgbWV0aG9kIGNvbnRhaW5zIHRoZSBwb3dlciB0byBjcmVhdGUgYSBuZXcgWkNGIFZhdCwgYW5kIG11c3QqL1xuLyogYmUgY2xvc2VseSBoZWxkLiB2YXRBZG1pblN2YyBpcyBldmVuIG1vcmUgcG93ZXJmdWwgLSBhbnkgdmF0IGNhbiovXG4vKiBiZSBjcmVhdGVkLiBXZSBzZXZlcmVseSByZXN0cmljdCBhY2Nlc3MgdG8gdmF0QWRtaW5TdmMgZm9yIHRoaXMgcmVhc29uLiovXG5jb25zdCBjcmVhdGVaQ0ZWYXQ9KGNvbnRyYWN0QnVuZGxlQ2FwLGNvbnRyYWN0TGFiZWwpPT57XG56Y2ZCdW5kbGVDYXB8fEZhaWwgYGNyZWF0ZVpDRlZhdCBkaWQgbm90IGdldCBidW5kbGVDYXBgO1xuY29uc3QgbmFtZT1cbmNvbnRyYWN0TGFiZWwmJlxudHlwZW9mIGNvbnRyYWN0TGFiZWw9PT0nc3RyaW5nJyYmXG5jb250cmFjdExhYmVsLmxlbmd0aD4wP1xuIGB6Y2YtJHtjb250cmFjdExhYmVsfWA6XG4nemNmJztcblxucmV0dXJuIEUoZ2V0QWN0dWFsVmF0QWRtaW5TdmNQKCkpLmNyZWF0ZVZhdChcbnpjZkJ1bmRsZUNhcCxcbmhhcmRlbih7XG5uYW1lLFxudmF0UGFyYW1ldGVyczp7XG5jb250cmFjdEJ1bmRsZUNhcCxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG56b2VTZXJ2aWNlLFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmludml0YXRpb25Jc3N1ZXI6aW52aXRhdGlvbklzc3VlckFjY2Vzcy5nZXRJbnZpdGF0aW9uSXNzdWVyKCl9fSkpO1xuXG5cblxuIH07XG5cbi8qIFRoZSBab2VTdG9yYWdlTWFuYWdlciBjb21wb3NlcyBhbmQgY29uc29saWRhdGVzIGNhcGFiaWxpdGllcyovXG4vKiBuZWVkZWQgYnkgWm9lIGFjY29yZGluZyB0byBQT0xBLiovXG5jb25zdHtcbnpvZVNlcnZpY2VEYXRhQWNjZXNzOmRhdGFBY2Nlc3MsXG5tYWtlT2ZmZXJBY2Nlc3MsXG5zdGFydEluc3RhbmNlQWNjZXNzLFxuaW52aXRhdGlvbklzc3VlckFjY2Vzc309XG5tYWtlWm9lU3RvcmFnZU1hbmFnZXIoXG5jcmVhdGVaQ0ZWYXQsXG5nZXRCdW5kbGVDYXBGb3JJRCxcbnNodXRkb3duWm9lVmF0LFxuZmVlTWludEtpdC5mZWVNaW50LFxuem9lQmFnZ2FnZSk7XG5cblxuLyogUGFzcyB0aGUgY2FwYWJpbGl0aWVzIG5lY2Vzc2FyeSB0byBjcmVhdGUgRSh6b2UpLnN0YXJ0SW5zdGFuY2UqL1xuY29uc3Qgc3RhcnRJbnN0YW5jZT1tYWtlU3RhcnRJbnN0YW5jZShcbnN0YXJ0SW5zdGFuY2VBY2Nlc3MsXG4oKT0+emNmQnVuZGxlQ2FwLFxuZ2V0QnVuZGxlQ2FwQnlJZE5vdyxcbnpvZUJhZ2dhZ2UpO1xuXG5cbi8qIFBhc3MgdGhlIGNhcGFiaWxpdGllcyBuZWNlc3NhcnkgdG8gY3JlYXRlIEUoem9lKS5vZmZlciovXG5jb25zdCBvZmZlcj1tYWtlT2ZmZXJNZXRob2QobWFrZU9mZmVyQWNjZXNzKTtcblxuLyogTWFrZSB0aGUgbWV0aG9kcyB0aGF0IGFsbG93IHVzZXJzIHRvIGVhc2lseSBhbmQgY3JlZGlibHkgZ2V0Ki9cbi8qIGluZm9ybWF0aW9uIGFib3V0IHRoZWlyIGludml0YXRpb25zLiovXG5cbmNvbnN0IGludml0YXRpb25Jc3N1ZXI9aW52aXRhdGlvbklzc3VlckFjY2Vzcy5nZXRJbnZpdGF0aW9uSXNzdWVyKCk7XG5jb25zdHtnZXRJbnN0YW5jZSxnZXRJbnN0YWxsYXRpb24sZ2V0SW52aXRhdGlvbkRldGFpbHN9PVxubWFrZUludml0YXRpb25RdWVyeUZucyhpbnZpdGF0aW9uSXNzdWVyKTtcblxuY29uc3QgZ2V0Q29uZmlndXJhdGlvbj0oKT0+e1xucmV0dXJuIGhhcmRlbih7XG5mZWVJc3N1ZXJDb25maWd9KTtcblxuIH07XG5cbmNvbnN0IFpvZUNvbmZpZ0k9TS5pbnRlcmZhY2UoJ1pvZUNvbmZpZ0ZhY2V0Jyx7XG51cGRhdGVaY2ZCdW5kbGVJZDpNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucygpfSk7XG5cblxuY29uc3Qgem9lQ29uZmlnRmFjZXQ9cHJlcGFyZUV4byh6b2VCYWdnYWdlLCdab2VDb25maWdGYWNldCcsWm9lQ29uZmlnSSx7XG51cGRhdGVaY2ZCdW5kbGVJZChidW5kbGVJZCl7XG5FLndoZW4oXG5nZXRaY2ZCdW5kbGVDYXAoe2lkOmJ1bmRsZUlkfSx2YXRBZG1pblN2YyksXG4oYnVuZGxlQ2FwKT0+e1xuemNmQnVuZGxlQ2FwPWJ1bmRsZUNhcDtcbiB9LFxuKGUpPT57XG5jb25zb2xlLmVycm9yKCBgJ/CfmqggdW5hYmxlIHRvIHVwZGF0ZSBaQ0YgQnVuZGxlOiBgLGUpO1xudGhyb3cgZTtcbiB9KTtcblxuIH19KTtcblxuXG4vKiogQHR5cGUge1pvZVNlcnZpY2V9ICovXG5jb25zdCB6b2VTZXJ2aWNlPXByZXBhcmVFeG8oem9lQmFnZ2FnZSwnWm9lU2VydmljZScsWm9lU2VydmljZUkse1xuaW5zdGFsbChidW5kbGVJZCxidW5kbGVMYWJlbCl7XG5yZXR1cm4gZGF0YUFjY2Vzcy5pbnN0YWxsQnVuZGxlKGJ1bmRsZUlkLGJ1bmRsZUxhYmVsKTtcbiB9LFxuaW5zdGFsbEJ1bmRsZUlEKGJ1bmRsZUlkLGJ1bmRsZUxhYmVsKXtcbnJldHVybiBkYXRhQWNjZXNzLmluc3RhbGxCdW5kbGVJRChidW5kbGVJZCxidW5kbGVMYWJlbCk7XG4gfSxcbnN0YXJ0SW5zdGFuY2UsXG5vZmZlcixcblxuLyogVGhlIGZ1bmN0aW9ucyBiZWxvdyBhcmUgZ2V0dGVycyBvbmx5IGFuZCBoYXZlIG5vIGltcGFjdCBvbiovXG4vKiBzdGF0ZSB3aXRoaW4gWm9lKi9cbmdldE9mZmVyRmlsdGVyKGluc3RhbmNlKXtcbnJldHVybiBkYXRhQWNjZXNzLmdldE9mZmVyRmlsdGVyKGluc3RhbmNlKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0SW52aXRhdGlvbklzc3Vlcigpe1xucmV0dXJuIGRhdGFBY2Nlc3MuZ2V0SW52aXRhdGlvbklzc3VlcigpO1xuIH0sXG4gICAgICBhc3luYyBnZXRGZWVJc3N1ZXIoKXtcbnJldHVybiBmZWVNaW50S2l0LmZlZU1pbnQuZ2V0RmVlSXNzdWVyKCk7XG4gfSxcblxuZ2V0QnJhbmRzKGluc3RhbmNlKXtcbnJldHVybiBkYXRhQWNjZXNzLmdldEJyYW5kcyhpbnN0YW5jZSk7XG4gfSxcbmdldElzc3VlcnMoaW5zdGFuY2Upe1xucmV0dXJuIGRhdGFBY2Nlc3MuZ2V0SXNzdWVycyhpbnN0YW5jZSk7XG4gfSxcbmdldFB1YmxpY0ZhY2V0KGluc3RhbmNlKXtcbnJldHVybiBkYXRhQWNjZXNzLmdldFB1YmxpY0ZhY2V0KGluc3RhbmNlKTtcbiB9LFxuZ2V0VGVybXMoaW5zdGFuY2Upe1xucmV0dXJuIGRhdGFBY2Nlc3MuZ2V0VGVybXMoaW5zdGFuY2UpO1xuIH0sXG5nZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZShpbnN0YW5jZSl7XG5yZXR1cm4gZGF0YUFjY2Vzcy5nZXRJbnN0YWxsYXRpb24oaW5zdGFuY2UpO1xuIH0sXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb24oaW5zdGFsbGF0aW9uKXtcbnJldHVybiBkYXRhQWNjZXNzLmdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbihpbnN0YWxsYXRpb24pO1xuIH0sXG5nZXRJbnN0YWxsYXRpb24sXG5cbmdldEluc3RhbmNlKGludml0YXRpb24pe1xucmV0dXJuIGdldEluc3RhbmNlKGludml0YXRpb24pO1xuIH0sXG5nZXRDb25maWd1cmF0aW9uLFxuZ2V0SW52aXRhdGlvbkRldGFpbHMsXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbihpbnZpdGF0aW9uKXtcbnJldHVybiBkYXRhQWNjZXNzLmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uKGludml0YXRpb24pO1xuIH19KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbnpvZVNlcnZpY2UsXG56b2VDb25maWdGYWNldCxcbi8qKiBAdHlwZSB7RmVlTWludEFjY2Vzc30gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5mZWVNaW50QWNjZXNzOmZlZU1pbnRLaXQuZmVlTWludEFjY2VzcyxcbnNldFZhdEFkbWluU2VydmljZX0pO1xuXG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFpvZS5cbiAqXG4gKiBUaGlzIHdpbGwgZmFpbCB1cGdyYWRlcyBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiB0ZXN0cyB0aHJvdWdoIHRoZSBoZWxwZXJcbiAqIGBtYWtlWm9lS2l0Rm9yVGVzdGAuXG4gKlxuICogQHBhcmFtIHtQcm9taXNlPFZhdEFkbWluU3ZjPiB8IFZhdEFkbWluU3ZjfSBbdmF0QWRtaW5TdmNdIC0gVGhlIHZhdEFkbWluIFNlcnZpY2UsIHdoaWNoIGNhcnJpZXMgdGhlXG4gKiBwb3dlciB0byBjcmVhdGUgYSBuZXcgdmF0LiBJZiBpdCdzIG5vdCBhdmFpbGFibGUgd2hlbiBtYWtlWm9lKCkgaXMgY2FsbGVkLCBpdFxuICogbXVzdCBiZSBwcm92aWRlZCBsYXRlciB1c2luZyBzZXRWYXRBZG1pblNlcnZpY2UoKS5cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW3NodXRkb3duWm9lVmF0XSAtIGEgZnVuY3Rpb24gdG9cbiAqIHNodXRkb3duIHRoZSBab2UgVmF0LiBUaGlzIGZ1bmN0aW9uIG5lZWRzIHRvIHVzZSB0aGUgdmF0UG93ZXJzXG4gKiBhdmFpbGFibGUgdG8gYSB2YXQuXG4gKiBAcGFyYW0ge0ZlZUlzc3VlckNvbmZpZ30gW2ZlZUlzc3VlckNvbmZpZ11cbiAqIEBwYXJhbSB7WkNGU3BlY30gW3pjZlNwZWNdIC0gUG9pbnRlciB0byB0aGUgY29udHJhY3QgZmFjZXQgYnVuZGxlLlxuICovJGjigI1fb25jZS5tYWtlRHVyYWJsZVpvZUtpdChtYWtlRHVyYWJsZVpvZUtpdCk7XG5jb25zdCBtYWtlWm9lS2l0PSh2YXRBZG1pblN2YyxzaHV0ZG93blpvZVZhdCxmZWVJc3N1ZXJDb25maWcsemNmU3BlYyk9PlxubWFrZUR1cmFibGVab2VLaXQoe1xudmF0QWRtaW5TdmMsXG5zaHV0ZG93blpvZVZhdCxcbmZlZUlzc3VlckNvbmZpZyxcbnpjZlNwZWMsXG56b2VCYWdnYWdlOm1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZmFrZSB6b2UgYmFnZ2FnZScse2R1cmFibGU6dHJ1ZX0pfSk7JGjigI1fb25jZS5tYWtlWm9lS2l0KG1ha2Vab2VLaXQpO1xuXG5oYXJkZW4obWFrZVpvZUtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUR1cmFibGVab2VLaXQiOlsibWFrZUR1cmFibGVab2VLaXQiXSwibWFrZVpvZUtpdCI6WyJtYWtlWm9lS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFFwr9DYKgAA2CoAAC0AAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL3pvZVNlYXQuanN7ImltcG9ydHMiOlsiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsIi4uL2ludGVybmFsLXR5cGVzLmpzIiwiLi4vdHlwZUd1YXJkcy5qcyIsIi4uL3R5cGVzLmpzIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZVpvZVNlYXRBZG1pbkZhY3RvcnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0LFN1YnNjcmliZXJTaGFwZSxFLE0scHJlcGFyZUV4b0NsYXNzS2l0LGRlZXBseUZ1bGZpbGxlZCxtYWtlUHJvbWlzZUtpdCxzYXRpc2ZpZXNXYW50LEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxLZXl3b3JkU2hhcGUsRXhpdE9iamVjdFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0ID0gJGjigI1fYSldXSxbXCJTdWJzY3JpYmVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLCBbJGjigI1fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc1wiLCBbW1wic2F0aXNmaWVzV2FudFwiLCBbJGjigI1fYSA9PiAoc2F0aXNmaWVzV2FudCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy5qc1wiLCBbXV0sW1wiLi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJLZXl3b3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEtleXdvcmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiRXhpdE9iamVjdFNoYXBlXCIsIFskaOKAjV9hID0+IChFeGl0T2JqZWN0U2hhcGUgPSAkaOKAjV9hKV1dLFtcIlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCBab2VTZWF0SUtpdD1oYXJkZW4oe1xuem9lU2VhdEFkbWluOk0uaW50ZXJmYWNlKCdab2VTZWF0QWRtaW4nLHtcbnJlcGxhY2VBbGxvY2F0aW9uOk0uY2FsbChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoKSxcbmV4aXQ6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWw6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbnJlc29sdmVFeGl0QW5kUmVzdWx0Ok0uY2FsbCh7XG5vZmZlclJlc3VsdFByb21pc2U6TS5wcm9taXNlKCksXG5leGl0T2JqOkV4aXRPYmplY3RTaGFwZX0pLlxucmV0dXJucygpLFxuZ2V0RXhpdFN1YnNjcmliZXI6TS5jYWxsKCkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuLyogVGhlIHJldHVybiBwcm9taXNlIGlzIGVtcHR5LCBidXQgZG9FeGl0IHJlbGllcyBvbiBzZXR0bGVtZW50IGFzIGEgc2lnbmFsKi9cbi8qIHRoYXQgdGhlIHBheW91dHMgaGF2ZSBzZXR0bGVkLiBUaGUgZXhpdCBwdWJsaXNoZXIgaXMgbm90aWZpZWQgYWZ0ZXIgdGhhdC4qL1xuZmluYWxQYXlvdXRzOk0uY2FsbChNLmVyZWYoUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpKS5yZXR1cm5zKFxuTS5wcm9taXNlKCkpfSksXG5cblxudXNlclNlYXQ6TS5pbnRlcmZhY2UoJ1VzZXJTZWF0Jyx7XG5nZXRQcm9wb3NhbDpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldFBheW91dHM6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRQYXlvdXQ6TS5jYWxsKEtleXdvcmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRPZmZlclJlc3VsdDpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmhhc0V4aXRlZDpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnRyeUV4aXQ6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5udW1XYW50c1NhdGlzZmllZDpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEZpbmFsQWxsb2NhdGlvbjpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEV4aXRTdWJzY3JpYmVyOk0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSl9KX0pO1xuXG5cblxuY29uc3QgYXNzZXJ0SGFzTm90RXhpdGVkPShjLG1zZyk9PntcbiFjLnN0YXRlLmluc3RhbmNlQWRtaW5IZWxwZXIuaGFzRXhpdGVkKGMuZmFjZXRzLnpvZVNlYXRBZG1pbil8fFxuYXNzZXJ0KCFjLnN0YXRlLmluc3RhbmNlQWRtaW5IZWxwZXIuaGFzRXhpdGVkKGMuZmFjZXRzLnpvZVNlYXRBZG1pbiksbXNnKTtcbiB9O1xuXG4vKipcbiAqIG1ha2Vab2VTZWF0QWRtaW5GYWN0b3J5IHJldHVybnMgYSBtYWtlciBmb3IgYW4gb2JqZWN0IHRoYXQgbWFuYWdlcyB0aGUgc3RhdGVcbiAqIG9mIGEgc2VhdCBwYXJ0aWNpcGF0aW5nIGluIGEgWm9lIGNvbnRyYWN0IGFuZCByZXR1cm4gaXRzIHR3byBmYWNldHMuXG4gKlxuICogVGhlIFVzZXJTZWF0IGlzIHN1aXRhYmxlIHRvIGJlIGhhbmRlZCB0byBhbiBhZ2VudCBvdXRzaWRlIHpvZSBhbmQgdGhlXG4gKiBjb250cmFjdCBhbmQgYWxsb3dzIHRoZW0gdG8gcXVlcnkgb3IgbW9uaXRvciB0aGUgY3VycmVudCBzdGF0ZSwgYWNjZXNzIHRoZVxuICogcGF5b3V0cyBhbmQgcmVzdWx0LCBhbmQgY2FsbCBleGl0KCkgaWYgdGhhdCdzIGFsbG93ZWQgZm9yIHRoaXMgc2VhdC5cbiAqXG4gKiBUaGUgem9lU2VhdEFkbWluIGlzIHBhc3NlZCBieSBab2UgdG8gdGhlIENvbnRyYWN0RmFjZXQgKHpjZiksIHRvIGFsbG93IHpjZiB0b1xuICogcXVlcnkgb3IgdXBkYXRlIHRoZSBhbGxvY2F0aW9uIG9yIGV4aXQgdGhlIHNlYXQgY2xlYW5seS5cbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlWm9lU2VhdEFkbWluRmFjdG9yeT0oYmFnZ2FnZSk9PntcbmNvbnN0IG1ha2VEdXJhYmxlUHVibGlzaEtpdD1wcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQoXG5iYWdnYWdlLFxuJ3pvZSBTZWF0IHB1Ymxpc2hlcicpO1xuXG5cbmNvbnN0IGRvRXhpdD0oXG56b2VTZWF0QWRtaW4sXG5jdXJyZW50QWxsb2NhdGlvbixcbndpdGhkcmF3RmFjZXQsXG5pbnN0YW5jZUFkbWluSGVscGVyKT0+XG57XG4vKiogQHR5cGUge1BheW1lbnRQS2V5d29yZFJlY29yZH0gKi9cbmNvbnN0IHBheW91dHM9d2l0aGRyYXdGYWNldC53aXRoZHJhd1BheW1lbnRzKGN1cnJlbnRBbGxvY2F0aW9uKTtcbnJldHVybiBFLndoZW4oXG56b2VTZWF0QWRtaW4uZmluYWxQYXlvdXRzKHBheW91dHMpLFxuKCk9Pmluc3RhbmNlQWRtaW5IZWxwZXIuZXhpdFpvZVNlYXRBZG1pbih6b2VTZWF0QWRtaW4pLFxuKCk9Pmluc3RhbmNlQWRtaW5IZWxwZXIuZXhpdFpvZVNlYXRBZG1pbih6b2VTZWF0QWRtaW4pKTtcblxuIH07XG5cbi8qIFRoZXJlIGlzIGEgcmFjZSBiZXR3ZWVuIHJlc29sdmVFeGl0QW5kUmVzdWx0KCkgYW5kIGdldE9mZmVyUmVzdWx0KCkgdGhhdCovXG4vKiBjYW4gYmUgbGltaXRlZCB0byB3aGVuIHRoZSBhZG1pbkZhY3RvcnkgaXMgcGFnZWQgaW4uIElmIHN0YXRlLm9mZmVyUmVzdWx0Ki9cbi8qIGlzIGRlZmluZWQsIGdldE9mZmVyUmVzdWx0IHdpbGwgcmV0dXJuIGl0LiBJZiBpdCdzIG5vdCBkZWZpbmVkIHdoZW4qL1xuLyogZ2V0T2ZmZXJSZXN1bHQgaXMgY2FsbGVkLCBjcmVhdGUgYSBwcm9taXNlS2l0LCByZXR1cm4gdGhlIHByb21pc2UgYW5kIHN0b3JlKi9cbi8qIHRoZSBraXQgaGVyZS4gV2hlbiByZXNvbHZlRXhpdEFuZFJlc3VsdCgpIGlzIGNhbGxlZCwgaXQgc2F2ZXMqL1xuLyogc3RhdGUub2ZmZXJSZXN1bHQgYW5kIHJlc29sdmVzIHRoZSBwcm9taXNlIGlmIGl0IGV4aXN0cywgdGhlbiByZW1vdmVzIHRoZSovXG4vKiB0YWJsZSBlbnRyeS4qL1xuLyoqXG4gKiBAdHlwZWRlZiB7V2Vha01hcDxaQ0ZTZWF0LCB1bmtub3duPn1cbiAqL1xuY29uc3QgZXBoZW1lcmFsT2ZmZXJSZXN1bHRTdG9yZT1uZXcgV2Vha01hcCgpO1xuXG5yZXR1cm4gcHJlcGFyZUV4b0NsYXNzS2l0KFxuYmFnZ2FnZSxcbidab2VTZWF0S2l0JyxcblpvZVNlYXRJS2l0LFxuLyoqXG4gKlxuICogQHBhcmFtIHtBbGxvY2F0aW9ufSBpbml0aWFsQWxsb2NhdGlvblxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWxcbiAqIEBwYXJhbSB7SW5zdGFuY2VBZG1pbkhlbHBlcn0gaW5zdGFuY2VBZG1pbkhlbHBlclxuICogQHBhcmFtIHtXaXRoZHJhd0ZhY2V0fSB3aXRoZHJhd0ZhY2V0XG4gKiBAcGFyYW0ge0VSZWY8RXhpdE9iaj59IFtleGl0T2JqXVxuICogQHBhcmFtIHtib29sZWFufSBbb2ZmZXJSZXN1bHRJc1VuZGVmaW5lZF1cbiAqL1xuKFxuaW5pdGlhbEFsbG9jYXRpb24sXG5wcm9wb3NhbCxcbmluc3RhbmNlQWRtaW5IZWxwZXIsXG53aXRoZHJhd0ZhY2V0LFxuZXhpdE9iaj11bmRlZmluZWQsXG4vKiBlbXB0eVNlYXRLaXRzIHN0YXJ0IHdpdGggb2ZmZXJSZXN1bHQgdmFsaWRseSB1bmRlZmluZWQ7IG90aGVycyBjYW4gc2V0Ki9cbi8qIGl0IHRvIGFueXRoaW5nIChpbmNsdWRpbmcgdW5kZWZpbmVkKSBpbiByZXNvbHZlRXhpdEFuZFJlc3VsdCgpKi9cbm9mZmVyUmVzdWx0SXNVbmRlZmluZWQ9ZmFsc2UpPT5cbntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlRHVyYWJsZVB1Ymxpc2hLaXQoKTtcbnJldHVybntcbmN1cnJlbnRBbGxvY2F0aW9uOmluaXRpYWxBbGxvY2F0aW9uLFxucHJvcG9zYWwsXG5leGl0T2JqLFxub2ZmZXJSZXN1bHQ6dW5kZWZpbmVkLFxub2ZmZXJSZXN1bHRTdG9yZWQ6b2ZmZXJSZXN1bHRJc1VuZGVmaW5lZCxcbmluc3RhbmNlQWRtaW5IZWxwZXIsXG53aXRoZHJhd0ZhY2V0LFxucHVibGlzaGVyLFxuc3Vic2NyaWJlcixcbnBheW91dHM6aGFyZGVuKHt9KSxcbmV4aXRpbmc6ZmFsc2V9O1xuXG4gfSxcbntcbnpvZVNlYXRBZG1pbjp7XG5yZXBsYWNlQWxsb2NhdGlvbihyZXBsYWNlbWVudEFsbG9jYXRpb24pe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5hc3NlcnRIYXNOb3RFeGl0ZWQoXG50aGlzLFxuJ0Nhbm5vdCByZXBsYWNlIGFsbG9jYXRpb24uIFNlYXQgaGFzIGFscmVhZHkgZXhpdGVkJyk7XG5cbmhhcmRlbihyZXBsYWNlbWVudEFsbG9jYXRpb24pO1xuLyogTWVyZ2luZyBoYXBwZW5zIGluIFpDRiwgc28gcmVwbGFjZW1lbnRBbGxvY2F0aW9uIGNhbiovXG4vKiByZXBsYWNlIHRoZSBvbGQgYWxsb2NhdGlvbiBlbnRpcmVseS4qL1xuXG5zdGF0ZS5jdXJyZW50QWxsb2NhdGlvbj1yZXBsYWNlbWVudEFsbG9jYXRpb247XG4gfSxcbmV4aXQoY29tcGxldGlvbil7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG4vKiBTaW5jZSB0aGlzIG1ldGhvZCBkb2Vzbid0IHdhaXQsIHdlIGNvdWxkIHJlLWVudGVyIHZpYSBleGl0QWxsU2VhdHMuKi9cbi8qIElmIHRoYXQgaGFwcGVucywgd2Ugc2hvdWxkbid0IHJlLWRvIGFueSBvZiB0aGUgd29yay4qL1xuaWYoc3RhdGUuZXhpdGluZyl7XG5yZXR1cm47XG4gfVxuYXNzZXJ0SGFzTm90RXhpdGVkKHRoaXMsJ0Nhbm5vdCBleGl0IHNlYXQuIFNlYXQgaGFzIGFscmVhZHkgZXhpdGVkJyk7XG5cbnN0YXRlLmV4aXRpbmc9dHJ1ZTtcbkUud2hlbihcbmRvRXhpdChcbmZhY2V0cy56b2VTZWF0QWRtaW4sXG5zdGF0ZS5jdXJyZW50QWxsb2NhdGlvbixcbnN0YXRlLndpdGhkcmF3RmFjZXQsXG5zdGF0ZS5pbnN0YW5jZUFkbWluSGVscGVyKSxcblxuKCk9PnN0YXRlLnB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbikpO1xuXG4gfSxcbmZhaWwocmVhc29uKXtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcbi8qIFNpbmNlIHRoaXMgbWV0aG9kIGRvZXNuJ3Qgd2FpdCwgd2UgY291bGQgcmUtZW50ZXIgdmlhIGZhaWxBbGxTZWF0cy4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGRuJ3QgcmUtZG8gYW55IG9mIHRoZSB3b3JrLiovXG5pZihzdGF0ZS5leGl0aW5nKXtcbnJldHVybjtcbiB9XG5cbmFzc2VydEhhc05vdEV4aXRlZCh0aGlzLCdDYW5ub3QgZmFpbCBzZWF0LiBTZWF0IGhhcyBhbHJlYWR5IGV4aXRlZCcpO1xuXG5zdGF0ZS5leGl0aW5nPXRydWU7XG5FLndoZW4oXG5kb0V4aXQoXG5mYWNldHMuem9lU2VhdEFkbWluLFxuc3RhdGUuY3VycmVudEFsbG9jYXRpb24sXG5zdGF0ZS53aXRoZHJhd0ZhY2V0LFxuc3RhdGUuaW5zdGFuY2VBZG1pbkhlbHBlciksXG5cbigpPT5zdGF0ZS5wdWJsaXNoZXIuZmFpbChyZWFzb24pLFxuKCk9PnN0YXRlLnB1Ymxpc2hlci5mYWlsKHJlYXNvbikpO1xuXG4gfSxcbi8qIGNhbGxlZCBvbmx5IGZvciBzZWF0cyByZXN1bHRpbmcgZnJvbSBvZmZlcnMuKi9cbi8qKiBAcGFyYW0ge0hhbmRsZU9mZmVyUmVzdWx0fSByZXN1bHQgKi9cbnJlc29sdmVFeGl0QW5kUmVzdWx0KHtvZmZlclJlc3VsdFByb21pc2UsZXhpdE9ian0pe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xuXG4hc3RhdGUub2ZmZXJSZXN1bHRTdG9yZWR8fFxuRmFpbCBgb2ZmZXJSZXN1bHRTdG9yZWQgYmVmb3JlIG9mZmVyUmVzdWx0UHJvbWlzZWA7XG5cbmlmKCFlcGhlbWVyYWxPZmZlclJlc3VsdFN0b3JlLmhhcyhmYWNldHMudXNlclNlYXQpKXtcbi8qIHRoaXMgd2FzIGNhbGxlZCBiZWZvcmUgZ2V0T2ZmZXJSZXN1bHQqL1xuY29uc3Qga2l0PW1ha2VQcm9taXNlS2l0KCk7XG5raXQucmVzb2x2ZShvZmZlclJlc3VsdFByb21pc2UpO1xuZXBoZW1lcmFsT2ZmZXJSZXN1bHRTdG9yZS5zZXQoZmFjZXRzLnVzZXJTZWF0LGtpdCk7XG4gfVxuXG5jb25zdCBwS2l0PWVwaGVtZXJhbE9mZmVyUmVzdWx0U3RvcmUuZ2V0KGZhY2V0cy51c2VyU2VhdCk7XG5FLndoZW4oXG5vZmZlclJlc3VsdFByb21pc2UsXG4ob2ZmZXJSZXN1bHQpPT57XG4vKiBSZXNvbHZlIHRoZSBlcGhlbWVyYWwgcHJvbWlzZSBmb3Igb2ZmZXJSZXN1bHQqL1xucEtpdC5yZXNvbHZlKG9mZmVyUmVzdWx0KTtcbi8qIE5vdyB3ZSB3YW50IHRvIHN0b3JlIHRoZSBvZmZlclJlc3VsdCBpbiBgc3RhdGVgIHRvIGdldCBpdCBvZmYgdGhlIGhlYXAsKi9cbi8qIGJ1dCB3ZSBuZWVkIHRvIGhhbmRsZSB0aHJlZSBjYXNlczoqL1xuLyogMS4gYWxyZWFkeSBkdXJhYmxlLiAoVGhpcyBpbmNsdWRlcyBiZWluZyBhIHJlbW90ZSBwcmVzZW5jZS4pKi9cbi8qIDIuIGhhcyBwcm9taXNlcyBmb3IgZHVyYWJsZSBvYmplY3RzLiovXG4vKiAzLiBub3QgZHVyYWJsZSBldmVuIGFmdGVyIHJlc29sdmluZyBwcm9taXNlcy4qL1xuLyogRm9yICMxIHdlIGNhbiBhc3NpZ24gZGlyZWN0bHksIGJ1dCB3ZSBkZWVwbHkgYXdhaXQgdG8gYWxzbyBoYW5kbGUgIzIuKi9cbnZvaWQgRS53aGVuKFxuZGVlcGx5RnVsZmlsbGVkKG9mZmVyUmVzdWx0KSxcbihmdWxmaWxsZWRPZmZlclJlc3VsdCk9PntcbnRyeXtcbi8qIEluIGNhc2VzIDEtMiB0aGlzIGFzc2lnbm1lbnQgd2lsbCBzdWNjZWVkLiovXG5zdGF0ZS5vZmZlclJlc3VsdD1mdWxmaWxsZWRPZmZlclJlc3VsdDtcbi8qIElmIGl0IGRvZXNuJ3QsIHRoZW4gdGhlc2UgbGluZXMgd29uJ3QgYmUgcmVhY2hlZCBzbyB0aGUqL1xuLyogZmxhZyB3aWxsIHN0YXkgZmFsc2UgYW5kIHRoZSBwcm9taXNlIHdpbGwgc3RheSBpbiB0aGUgaGVhcCovXG5zdGF0ZS5vZmZlclJlc3VsdFN0b3JlZD10cnVlO1xuZXBoZW1lcmFsT2ZmZXJSZXN1bHRTdG9yZS5kZWxldGUoZmFjZXRzLnVzZXJTZWF0KTtcbiB9Y2F0Y2goZXJyKXtcbmNvbnNvbGUud2FybihcbiBgbm9uLWR1cmFibGUgb2ZmZXIgcmVzdWx0IHdpbGwgYmUgbG9zdCB1cG9uIHpvZSB2YXQgdGVybWluYXRpb246ICR7b2ZmZXJSZXN1bHR9YCk7XG5cbiB9XG4gfVxuLyogbm8gcmVqZWN0aW9uIGhhbmRsZXIgYmVjYXVzZSBhbiBvZmZlciByZXN1bHQgY29udGFpbmluZyBwcm9taXNlcyB0aGF0IHJlamVjdCovXG4vKiBpcyB3aXRoaW4gc3BlYyovKTtcblxuIH0sXG4oZSk9PntcbnBLaXQucmVqZWN0KGUpO1xuLyogTkI6IGxlYXZlIHRoZSByZWplY3RlZCBwcm9taXNlIGluIHRoZSBlcGhlbWVyYWxPZmZlclJlc3VsdFN0b3JlKi9cbi8qIGJlY2F1c2UgaXQgY2FuJ3QgZ28gaW4gZHVyYWJsZSBzdGF0ZSovXG4gfSk7XG5cblxuc3RhdGUuZXhpdE9iaj1leGl0T2JqO1xuIH0sXG5nZXRFeGl0U3Vic2NyaWJlcigpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuc3Vic2NyaWJlcjtcbiB9LFxuICAgICAgYXN5bmMgZmluYWxQYXlvdXRzKHBheW1lbnRzKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuXG5jb25zdCBzZXR0bGVkUGF5b3V0cz1hd2FpdCBkZWVwbHlGdWxmaWxsZWQocGF5bWVudHMpO1xuc3RhdGUucGF5b3V0cz1zZXR0bGVkUGF5b3V0cztcbiB9fSxcblxudXNlclNlYXQ6e1xuICAgICAgYXN5bmMgZ2V0UHJvcG9zYWwoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLnByb3Bvc2FsO1xuIH0sXG4gICAgICBhc3luYyBnZXRQYXlvdXRzKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcblxucmV0dXJuIEUud2hlbihcbnN0YXRlLnN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKSxcbigpPT5zdGF0ZS5wYXlvdXRzLFxuKCk9PnN0YXRlLnBheW91dHMpO1xuXG4gfSxcbiAgICAgIGFzeW5jIGdldFBheW91dChrZXl3b3JkKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuXG4vKiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCkgb25seSB0cmlnZ2VycyBhZnRlciBwdWJsaXNoZXIuZmluaXNoKCkqL1xuLyogaW4gZXhpdCgpIG9yIHB1Ymxpc2hlci5mYWlsKCkgaW4gZmFpbCgpLiBCb3RoIG9mIHRob3NlIHdhaXQgZm9yKi9cbi8qIGRvRXhpdCgpLCB3aGljaCBlbnN1cmVzIHRoYXQgZmluYWxQYXlvdXRzKCkgaGFzIHNldCBzdGF0ZS5wYXlvdXRzLiovXG5yZXR1cm4gRS53aGVuKFxuc3RhdGUuc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLFxuKCk9PnN0YXRlLnBheW91dHNba2V5d29yZF0sXG4oKT0+c3RhdGUucGF5b3V0c1trZXl3b3JkXSk7XG5cbiB9LFxuXG4gICAgICBhc3luYyBnZXRPZmZlclJlc3VsdCgpe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xuXG5pZihzdGF0ZS5vZmZlclJlc3VsdFN0b3JlZCl7XG5yZXR1cm4gc3RhdGUub2ZmZXJSZXN1bHQ7XG4gfVxuXG5pZihlcGhlbWVyYWxPZmZlclJlc3VsdFN0b3JlLmhhcyhmYWNldHMudXNlclNlYXQpKXtcbnJldHVybiBlcGhlbWVyYWxPZmZlclJlc3VsdFN0b3JlLmdldChmYWNldHMudXNlclNlYXQpLnByb21pc2U7XG4gfVxuXG5jb25zdCBraXQ9bWFrZVByb21pc2VLaXQoKTtcbmVwaGVtZXJhbE9mZmVyUmVzdWx0U3RvcmUuc2V0KGZhY2V0cy51c2VyU2VhdCxraXQpO1xucmV0dXJuIGtpdC5wcm9taXNlO1xuIH0sXG4gICAgICBhc3luYyBoYXNFeGl0ZWQoKXtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcblxucmV0dXJuKFxuc3RhdGUuZXhpdGluZ3x8XG5zdGF0ZS5pbnN0YW5jZUFkbWluSGVscGVyLmhhc0V4aXRlZChmYWNldHMuem9lU2VhdEFkbWluKSk7XG5cbiB9LFxuICAgICAgYXN5bmMgdHJ5RXhpdCgpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5pZighc3RhdGUuZXhpdE9iailcbnRocm93IEZhaWwgYGV4aXRPYmogbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgdXNlYDtcbmFzc2VydEhhc05vdEV4aXRlZCh0aGlzLCdDYW5ub3QgZXhpdDsgc2VhdCBoYXMgYWxyZWFkeSBleGl0ZWQnKTtcblxucmV0dXJuIEUoc3RhdGUuZXhpdE9iaikuZXhpdCgpO1xuIH0sXG4gICAgICBhc3luYyBudW1XYW50c1NhdGlzZmllZCgpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gRS53aGVuKFxuc3RhdGUuc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLFxuKCk9PnNhdGlzZmllc1dhbnQoc3RhdGUucHJvcG9zYWwsc3RhdGUuY3VycmVudEFsbG9jYXRpb24pLFxuKCk9PnNhdGlzZmllc1dhbnQoc3RhdGUucHJvcG9zYWwsc3RhdGUuY3VycmVudEFsbG9jYXRpb24pKTtcblxuIH0sXG5nZXRFeGl0U3Vic2NyaWJlcigpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuc3Vic2NyaWJlcjtcbiB9LFxuZ2V0RmluYWxBbGxvY2F0aW9uKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBFLndoZW4oXG5zdGF0ZS5zdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCksXG4oKT0+c3RhdGUuY3VycmVudEFsbG9jYXRpb24sXG4oKT0+c3RhdGUuY3VycmVudEFsbG9jYXRpb24pO1xuXG4gfX19KTtcblxuXG5cbiB9OyRo4oCNX29uY2UubWFrZVpvZVNlYXRBZG1pbkZhY3RvcnkobWFrZVpvZVNlYXRBZG1pbkZhY3RvcnkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2Vab2VTZWF0QWRtaW5GYWN0b3J5IjpbIm1ha2Vab2VTZWF0QWRtaW5GYWN0b3J5Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJFGVsUiOgAAIjoAADcAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL3pvZVN0b3JhZ2VNYW5hZ2VyLmpzeyJpbXBvcnRzIjpbIi4uL2luc3RhbmNlUmVjb3JkU3RvcmFnZS5qcyIsIi4uL2lzc3VlclJlY29yZC5qcyIsIi4uL2lzc3VlclN0b3JhZ2UuanMiLCIuLi90eXBlR3VhcmRzLmpzIiwiLi9lc2Nyb3dTdG9yYWdlLmpzIiwiLi9pbnN0YWxsYXRpb25TdG9yYWdlLmpzIiwiLi9pbnN0YW5jZUFkbWluU3RvcmFnZS5qcyIsIi4vaW50ZXJuYWwtdHlwZXMuanMiLCIuL21ha2VJbnZpdGF0aW9uLmpzIiwiLi90eXBlcy5qcyIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlWm9lU3RvcmFnZU1hbmFnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxBc3NldEtpbmQsbWFrZUR1cmFibGVJc3N1ZXJLaXQsQW1vdW50TWF0aCxwcmVwYXJlSXNzdWVyS2l0LG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxwcmVwYXJlRXhvQ2xhc3NLaXQscHJlcGFyZUV4b0NsYXNzLHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUscHJvdmlkZUlzc3VlclN0b3JhZ2UsbWFrZUluc3RhbmNlUmVjb3JkU3RvcmFnZSxtYWtlSXNzdWVyUmVjb3JkLHByb3ZpZGVFc2Nyb3dTdG9yYWdlLHByZXBhcmVJbnZpdGF0aW9uS2l0LG1ha2VJbnN0YW5jZUFkbWluU3RvcmFnZSxtYWtlSW5zdGFsbGF0aW9uU3RvcmFnZSxJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCxab2VNaW50SSxab2VTdG9yYWdlTWFuYWdlcklLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmQgPSAkaOKAjV9hKV1dLFtcIm1ha2VEdXJhYmxlSXNzdWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRHVyYWJsZUlzc3VlcktpdCA9ICRo4oCNX2EpXV0sW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUlzc3VlcktpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUlzc3VlcktpdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVEdXJhYmxlU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vaXNzdWVyU3RvcmFnZS5qc1wiLCBbW1wicHJvdmlkZUlzc3VlclN0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVJc3N1ZXJTdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIi4uL2luc3RhbmNlUmVjb3JkU3RvcmFnZS5qc1wiLCBbW1wibWFrZUluc3RhbmNlUmVjb3JkU3RvcmFnZVwiLCBbJGjigI1fYSA9PiAobWFrZUluc3RhbmNlUmVjb3JkU3RvcmFnZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9pc3N1ZXJSZWNvcmQuanNcIiwgW1tcIm1ha2VJc3N1ZXJSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKG1ha2VJc3N1ZXJSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9lc2Nyb3dTdG9yYWdlLmpzXCIsIFtbXCJwcm92aWRlRXNjcm93U3RvcmFnZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUVzY3Jvd1N0b3JhZ2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYWtlSW52aXRhdGlvbi5qc1wiLCBbW1wicHJlcGFyZUludml0YXRpb25LaXRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVJbnZpdGF0aW9uS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vaW5zdGFuY2VBZG1pblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VJbnN0YW5jZUFkbWluU3RvcmFnZVwiLCBbJGjigI1fYSA9PiAobWFrZUluc3RhbmNlQWRtaW5TdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIi4vaW5zdGFsbGF0aW9uU3RvcmFnZS5qc1wiLCBbW1wibWFrZUluc3RhbGxhdGlvblN0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VJbnN0YWxsYXRpb25TdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMuanNcIiwgW11dLFtcIi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0XCIsIFskaOKAjV9hID0+IChJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCA9ICRo4oCNX2EpXV0sW1wiWm9lTWludElcIiwgWyRo4oCNX2EgPT4gKFpvZU1pbnRJID0gJGjigI1fYSldXSxbXCJab2VTdG9yYWdlTWFuYWdlcklLaXRcIiwgWyRo4oCNX2EgPT4gKFpvZVN0b3JhZ2VNYW5hZ2VySUtpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIFRoZSBab2UgU3RvcmFnZSBNYW5hZ2VyIGVuY2Fwc3VsYXRlcyBhbmQgY29tcG9zZXMgaW1wb3J0YW50XG4gKiBjYXBhYmlsaXRpZXMsIHN1Y2ggYXMgdGhlIGFiaWxpdHkgdG8gY3JlYXRlIGEgbmV3IHB1cnNlIGFuZCBkZXBvc2l0XG4gKiBhbmQgd2l0aGRyYXcgaW50byBhIHB1cnNlLCBhY2NvcmRpbmcgdG8gdGhlIFByaW5jaXBsZSBvZiBMZWFzdFxuICogQXV0aG9yaXR5LiBUaGUgY29kZSBmb3IgdGhlc2UgY2FwYWJpbGl0aWVzIGlzIGltcG9ydGVkIGZyb20gc21hbGxlclxuICogZmlsZXMgd2hpY2ggc2hvdWxkIGhhdmUgdW5pdCB0ZXN0cy4gQWZ0ZXIgY29tcG9zaW5nLCBab2UgU3RvcmFnZVxuICogTWFuYWdlciBkaXZpZGVzIHVwIHRoZSByZXN1bHRpbmcgY2FwYWJpbGl0aWVzIGJldHdlZW4gdGhvc2UgbmVlZGVkXG4gKiBieSBhIG5ldyBjb250cmFjdCBpbnN0YW5jZSAocmV0dXJuZWQgYXMgdGhlIHJlc3VsdCBvZlxuICogYG1ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyYCkgYW5kIHRob3NlIG5lZWRlZCBmb3Igb3RoZXIgcHVycG9zZXMuXG4gKlxuICogQHBhcmFtIHtDcmVhdGVaQ0ZWYXR9IGNyZWF0ZVpDRlZhdCAtIHRoZSBhYmlsaXR5IHRvIGNyZWF0ZSBhIG5ld1xuICogWkNGIFZhdFxuICogQHBhcmFtIHtHZXRCdW5kbGVDYXBGb3JJRH0gZ2V0QnVuZGxlQ2FwRm9ySURcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gc2h1dGRvd25ab2VWYXRcbiAqIEBwYXJhbSB7e1xuICogICAgZ2V0RmVlSXNzdWVyS2l0OiBHZXRGZWVJc3N1ZXJLaXQsXG4gKiAgICBnZXRGZWVJc3N1ZXI6ICgpID0+IElzc3VlcixcbiAqICAgIGdldEZlZUJyYW5kOiAoKSA9PiBCcmFuZCxcbiAqIH19IGZlZU1pbnRcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gem9lQmFnZ2FnZVxuICovXG5jb25zdCAgICAgICAgbWFrZVpvZVN0b3JhZ2VNYW5hZ2VyPShcbmNyZWF0ZVpDRlZhdCxcbmdldEJ1bmRsZUNhcEZvcklELFxuc2h1dGRvd25ab2VWYXQsXG5mZWVNaW50LFxuem9lQmFnZ2FnZSk9Plxue1xuLyogaXNzdWVyU3RvcmFnZSBjb250YWlucyB0aGUgaXNzdWVycyB0aGF0IHRoZSBab2VTZXJ2aWNlIGtub3dzKi9cbi8qIGFib3V0LCBhcyB3ZWxsIGFzIGluZm9ybWF0aW9uIGFib3V0IHRoZW0gc3VjaCBhcyB0aGVpciBicmFuZCwqL1xuLyogYXNzZXRLaW5kLCBhbmQgZGlzcGxheUluZm8qL1xuY29uc3QgaXNzdWVyU3RvcmFnZT1wcm92aWRlSXNzdWVyU3RvcmFnZSh6b2VCYWdnYWdlKTtcbmlzc3VlclN0b3JhZ2UuaW5zdGFudGlhdGUoKTtcblxuLyogRXNjcm93U3RvcmFnZSBob2xkcyB0aGUgcHVyc2VzIHRoYXQgWm9lIHVzZXMgZm9yIGVzY3Jvdy4gVGhpcyovXG4vKiBvYmplY3Qgc2hvdWxkIGJlIGNsb3NlbHkgaGVsZCBhbmQgdHJhY2tlZDogYWxsIG9mIHRoZSBkaWdpdGFsKi9cbi8qIGFzc2V0cyB0aGF0IHVzZXJzIGVzY3JvdyBhcmUgY29udGFpbmVkIHdpdGhpbiB0aGVzZSBwdXJzZXMuKi9cbmNvbnN0IGVzY3Jvd1N0b3JhZ2U9cHJvdmlkZUVzY3Jvd1N0b3JhZ2Uoem9lQmFnZ2FnZSk7XG5cbi8qIEFkZCBhIHB1cnNlIGZvciBlc2Nyb3dpbmcgdXNlciBmdW5kcyAobm90IGZvciBmZWVzKS4gQ3JlYXRlIHRoZSovXG4vKiBsb2NhbCwgbm9uLXJlbW90ZSBlc2Nyb3cgcHVyc2UgZm9yIHRoZSBmZWUgbWludCBpbW1lZGlhdGVseS4qL1xuLyogV2l0aG91dCB0aGlzIHN0ZXAsIHJlZ2lzdHJhdGlvbiBvZiB0aGUgZmVlSXNzdWVyIGluIGEgY29udHJhY3QqL1xuLyogd291bGQgdHJlYXQgdGhlIGZlZUlzc3VlciBhcyBpZiBpdCBpcyByZW1vdGUsIGNyZWF0aW5nIGEgcHJvbWlzZSovXG4vKiBmb3IgYSBwdXJzZSB3aXRoIEUoaXNzdWVyKS5tYWtlRW1wdHlQdXJzZSgpLiBXZSBuZWVkIGEgbG9jYWwqL1xuLyogcHVyc2UsIHNvIHdlIGNhbm5vdCBhbGxvdyB0aGF0IHRvIGhhcHBlbi4qL1xuXG5lc2Nyb3dTdG9yYWdlLnByb3ZpZGVMb2NhbFB1cnNlKFxuZmVlTWludC5nZXRGZWVJc3N1ZXIoKSxcbmZlZU1pbnQuZ2V0RmVlQnJhbmQoKSk7XG5cblxuY29uc3QgcHJvcG9zYWxTaGFwZXM9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG56b2VCYWdnYWdlLFxuJ3Byb3Bvc2FsIHNoYXBlcycpO1xuXG5cbi8qIEluIG9yZGVyIHRvIHBhcnRpY2lwYXRlIGluIGEgY29udHJhY3QsIHVzZXJzIG11c3QgaGF2ZSBpbnZpdGF0aW9ucywgd2hpY2gqL1xuLyogYXJlIEVSVFAgcGF5bWVudHMgbWFkZSBieSBab2UuIFRoaXMgaW52aXRhdGlvbktpdCBtdXN0IGJlIGNsb3NlbHkgaGVsZCBhbmQqL1xuLyogdXNlZCBvbmx5IGJ5IHRoZSBtYWtlSW52aXRhdGlvbigpIG1ldGhvZC4qL1xuY29uc3R7aW52aXRhdGlvbklzc3VlcixpbnZpdGF0aW9uS2l0fT1wcmVwYXJlSW52aXRhdGlvbktpdChcbnpvZUJhZ2dhZ2UsXG5zaHV0ZG93blpvZVZhdCk7XG5cblxuLyogRXZlcnkgbmV3IGluc3RhbmNlIG9mIGEgY29udHJhY3QgY3JlYXRlcyBhIGNvcnJlc3BvbmRpbmcqL1xuLyogXCJ6b2VJbnN0YW5jZUFkbWluXCIgLSBhbiBhZG1pbiBmYWNldCB3aXRoaW4gdGhlIFpvZSBTZXJ2aWNlIGZvciovXG4vKiB0aGF0IHBhcnRpY3VsYXIgaW5zdGFuY2UuIFRoaXMgY29kZSBtYW5hZ2VzIHRoZSBzdG9yYWdlIG9mIHRob3NlKi9cbi8qIGluc3RhbmNlQWRtaW5zKi9cbmNvbnN0IGluc3RhbmNlQWRtaW5TdG9yYWdlPW1ha2VJbnN0YW5jZUFkbWluU3RvcmFnZSh6b2VCYWdnYWdlKTtcblxuLyogWm9lIHN0b3JlcyBcImluc3RhbGxhdGlvbnNcIiAtIGlkZW50aWZpYWJsZSBidW5kbGVzIG9mIGNvbnRyYWN0Ki9cbi8qIGNvZGUgdGhhdCBjYW4gYmUgcmV1c2VkIHRvIGNyZWF0ZSBuZXcgY29udHJhY3QgaW5zdGFuY2VzKi9cbmNvbnN0IGluc3RhbGxhdGlvblN0b3JhZ2U9bWFrZUluc3RhbGxhdGlvblN0b3JhZ2UoXG5nZXRCdW5kbGVDYXBGb3JJRCxcbnpvZUJhZ2dhZ2UpO1xuXG5cbmNvbnN0IGdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uPShpbnZpdGF0aW9uSGFuZGxlKT0+e1xuaWYocHJvcG9zYWxTaGFwZXMuaGFzKGludml0YXRpb25IYW5kbGUpKXtcbnJldHVybiBwcm9wb3NhbFNoYXBlcy5nZXQoaW52aXRhdGlvbkhhbmRsZSk7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuXG5jb25zdCB6b2VNaW50QmFnZ2FnZVNldD1wcm92aWRlRHVyYWJsZVNldFN0b3JlKFxuem9lQmFnZ2FnZSxcbid6b2VNaW50QmFnZ2FnZVNldCcpO1xuXG5mb3IoY29uc3QgaXNzdWVyQmFnZ2FnZSBvZiB6b2VNaW50QmFnZ2FnZVNldC52YWx1ZXMoKSl7XG5wcmVwYXJlSXNzdWVyS2l0KGlzc3VlckJhZ2dhZ2UpO1xuIH1cblxuY29uc3QgbWFrZVpvZU1pbnQ9cHJlcGFyZUV4b0NsYXNzKFxuem9lQmFnZ2FnZSxcbidab2VNaW50JyxcblpvZU1pbnRJLFxuKGxvY2FsTWludCxsb2NhbFBvb2xlZFB1cnNlLGFkbWluTm9kZSxsb2NhbElzc3VlclJlY29yZCk9Pih7XG5sb2NhbE1pbnQsXG5sb2NhbFBvb2xlZFB1cnNlLFxuYWRtaW5Ob2RlLFxubG9jYWxJc3N1ZXJSZWNvcmR9KSxcblxue1xuZ2V0SXNzdWVyUmVjb3JkKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5sb2NhbElzc3VlclJlY29yZDtcbiB9LFxubWludEFuZEVzY3Jvdyh0b3RhbFRvTWludCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbmNvbnN0IHBheW1lbnQ9c3RhdGUubG9jYWxNaW50Lm1pbnRQYXltZW50KHRvdGFsVG9NaW50KTtcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBkZXBvc2l0LiovXG5zdGF0ZS5sb2NhbFBvb2xlZFB1cnNlLmRlcG9zaXQocGF5bWVudCx0b3RhbFRvTWludCk7XG4gfSxcbndpdGhkcmF3QW5kQnVybih0b3RhbFRvQnVybil7XG5jb25zdHtzdGF0ZX09dGhpcztcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG5jb25zdCBwYXltZW50PXN0YXRlLmxvY2FsUG9vbGVkUHVyc2Uud2l0aGRyYXcodG90YWxUb0J1cm4pO1xuLyogTm90ZSByZWR1bmRhbnQgQ09NTUlUIFBPSU5UIHdpdGhpbiBidXJuLiovXG5zdGF0ZS5sb2NhbElzc3VlclJlY29yZC5pc3N1ZXIuYnVybihwYXltZW50LHRvdGFsVG9CdXJuKTtcbiB9Y2F0Y2goZXJyKXtcbi8qIG5vdGhpbmcgZm9yIFpvZSB0byBkbyBpZiB0aGUgdGVybWluYXRpb24gZmFpbHMqL1xudm9pZCBFKHN0YXRlLmFkbWluTm9kZSkudGVybWluYXRlV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG4gfX0pO1xuXG5cblxuY29uc3QgbWFrZUluc3RhbmNlU3RvcmFnZU1hbmFnZXI9cHJlcGFyZUV4b0NsYXNzS2l0KFxuem9lQmFnZ2FnZSxcbidJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyJyxcbkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0LFxuKGluc3RhbmNlUmVjb3JkLGFkbWluTm9kZSxyb290LGZ1bmN0aW9ucyk9PlxuaGFyZGVuKHtcbmluc3RhbmNlU3RhdGU6aW5zdGFuY2VSZWNvcmQsXG5hZG1pbk5vZGUsXG5yb290LFxuZnVuY3Rpb25zfSksXG5cbntcbmluc3RhbmNlU3RvcmFnZU1hbmFnZXI6e1xuZ2V0VGVybXMoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlU3RhdGUuZ2V0VGVybXMoKTtcbiB9LFxuZ2V0SXNzdWVycygpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VTdGF0ZS5nZXRJc3N1ZXJzKCk7XG4gfSxcbmdldEJyYW5kcygpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VTdGF0ZS5nZXRCcmFuZHMoKTtcbiB9LFxuZ2V0SW5zdGFsbGF0aW9uKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVN0YXRlLmdldEluc3RhbGxhdGlvbigpO1xuIH0sXG4gICAgICBhc3luYyBzYXZlSXNzdWVyKGlzc3VlclAsa2V5d29yZCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbmNvbnN0IGlzc3VlclJlY29yZD1hd2FpdCBpc3N1ZXJTdG9yYWdlLnN0b3JlSXNzdWVyKGlzc3VlclApO1xuYXdhaXQgZXNjcm93U3RvcmFnZS5jcmVhdGVQdXJzZShcbmlzc3VlclJlY29yZC5pc3N1ZXIsXG5pc3N1ZXJSZWNvcmQuYnJhbmQpO1xuXG5zdGF0ZS5pbnN0YW5jZVN0YXRlLmFkZElzc3VlcihrZXl3b3JkLGlzc3VlclJlY29yZCk7XG5yZXR1cm4gaXNzdWVyUmVjb3JkO1xuIH0sXG5tYWtlWm9lTWludChcbmtleXdvcmQsXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KVxue1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xuLyogTG9jYWwgaW5kaWNhdGVzIG9uZSB0aGF0IHpvZSBpdHNlbGYgbWFrZXMgZnJvbSB2ZXR0ZWQgY29kZSwqL1xuLyogYW5kIHNvIGNhbiBiZSBhc3N1bWVkIGNvcnJlY3QgYW5kIGZyZXNoIGJ5IHpvZS4qL1xuY29uc3QgaXNzdWVyQmFnZ2FnZT1tYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ0lzc3VlckJhZ2dhZ2UnLHtcbmR1cmFibGU6dHJ1ZX0pO1xuXG5jb25zdCBsb2NhbElzc3VlcktpdD1tYWtlRHVyYWJsZUlzc3VlcktpdChcbmlzc3VlckJhZ2dhZ2UsXG5rZXl3b3JkLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG4ocmVhc29uKT0+RShzdGF0ZS5hZG1pbk5vZGUpLnRlcm1pbmF0ZVdpdGhGYWlsdXJlKHJlYXNvbiksXG57ZWxlbWVudFNoYXBlfSk7XG5cbnpvZU1pbnRCYWdnYWdlU2V0LmFkZChpc3N1ZXJCYWdnYWdlKTtcbnJldHVybiBmYWNldHMuaGVscGVycy53cmFwSXNzdWVyS2l0V2l0aFpvZU1pbnQoXG5rZXl3b3JkLFxubG9jYWxJc3N1ZXJLaXQsXG5zdGF0ZS5hZG1pbk5vZGUpO1xuXG4gfSxcbnJlZ2lzdGVyRmVlTWludChrZXl3b3JkLGFsbGVnZWRGZWVNaW50QWNjZXNzKXtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcbmNvbnN0IGZlZUlzc3VlcktpdD1mZWVNaW50LmdldEZlZUlzc3VlcktpdChhbGxlZ2VkRmVlTWludEFjY2Vzcyk7XG5yZXR1cm4gZmFjZXRzLmhlbHBlcnMud3JhcElzc3VlcktpdFdpdGhab2VNaW50KFxua2V5d29yZCxcbmZlZUlzc3VlcktpdCxcbnN0YXRlLmFkbWluTm9kZSk7XG5cbiB9LFxuZ2V0SW5zdGFuY2VSZWNvcmQoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlU3RhdGUuZ2V0SW5zdGFuY2VSZWNvcmQoKTtcbiB9LFxuZ2V0SXNzdWVyUmVjb3Jkcygpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gaXNzdWVyU3RvcmFnZS5nZXRJc3N1ZXJSZWNvcmRzKFxuLyogdGhlIGlzc3VlclN0b3JhZ2UgaXMgYSB3ZWFrU3RvcmUsIHNvIHdlIGNhbm5vdCBpdGVyYXRlIG92ZXIqL1xuLyogaXQgZGlyZWN0bHkuIEFkZGl0aW9uYWxseSwgd2Ugb25seSB3YW50IHRvIGV4cG9ydCB0aGUqL1xuLyogaXNzdWVycyB1c2VkIGluIHRoaXMgY29udHJhY3QgaW5zdGFuY2Ugc3BlY2lmaWNhbGx5LCBub3QqL1xuLyogYWxsIGlzc3VlcnMuKi9cbk9iamVjdC52YWx1ZXMoXG5zdGF0ZS5pbnN0YW5jZVN0YXRlLmdldEluc3RhbmNlUmVjb3JkKCkudGVybXMuaXNzdWVycykpO1xuXG5cbiB9LFxuaW5pdEluc3RhbmNlQWRtaW4oaW5zdGFuY2VIYW5kbGUsaW5zdGFuY2VBZG1pbil7XG5yZXR1cm4gaW5zdGFuY2VBZG1pblN0b3JhZ2UudXBkYXRlci5pbml0SW5zdGFuY2VBZG1pbihcbmluc3RhbmNlSGFuZGxlLFxuaW5zdGFuY2VBZG1pbik7XG5cbiB9LFxuZGVsZXRlSW5zdGFuY2VBZG1pbihpKXtcbmluc3RhbmNlQWRtaW5TdG9yYWdlLnVwZGF0ZXIuZGVsZXRlSW5zdGFuY2VBZG1pbihpKTtcbiB9LFxubWFrZUludml0YXRpb24oXG5oYW5kbGUsXG5kZXNjLFxuY3VzdG9tRGV0YWlscz11bmRlZmluZWQsXG5wcm9wb3NhbFNoYXBlPXVuZGVmaW5lZClcbntcbmNvbnN0e3N0YXRlfT10aGlzO1xuXG5jb25zdCBleHRyYVByb3BlcnRpZXM9XG50eXBlb2YgY3VzdG9tRGV0YWlscz09PSdvYmplY3QnJiZcbm93bktleXMoY3VzdG9tRGV0YWlscykubGVuZ3RoPj0xP1xuaGFyZGVuKHtjdXN0b21EZXRhaWxzfSk6XG5oYXJkZW4oe30pO1xuY29uc3QgaW52aXRhdGlvbkFtb3VudD1BbW91bnRNYXRoLm1ha2UoXG5pbnZpdGF0aW9uS2l0LmJyYW5kLFxuaGFyZGVuKFtcbntcbi4uLmV4dHJhUHJvcGVydGllcyxcbmRlc2NyaXB0aW9uOmRlc2MsXG5oYW5kbGUsXG5pbnN0YW5jZTpzdGF0ZS5pbnN0YW5jZVN0YXRlLmdldEluc3RhbmNlUmVjb3JkKCkuaW5zdGFuY2UsXG5pbnN0YWxsYXRpb246XG5zdGF0ZS5pbnN0YW5jZVN0YXRlLmdldEluc3RhbmNlUmVjb3JkKCkuaW5zdGFsbGF0aW9ufV0pKTtcblxuXG5cbmlmKHByb3Bvc2FsU2hhcGUhPT11bmRlZmluZWQpe1xucHJvcG9zYWxTaGFwZXMuaW5pdChoYW5kbGUscHJvcG9zYWxTaGFwZSk7XG4gfVxucmV0dXJuIGludml0YXRpb25LaXQubWludC5taW50UGF5bWVudChpbnZpdGF0aW9uQW1vdW50KTtcbiB9LFxuZ2V0SW52aXRhdGlvbklzc3Vlcigpe1xucmV0dXJuIGludml0YXRpb25Jc3N1ZXI7XG4gfSxcbmdldFJvb3QoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLnJvb3Q7XG4gfSxcbmdldFdpdGhkcmF3RmFjZXQoKXtcbmNvbnN0e2ZhY2V0c309dGhpcztcbnJldHVybiBmYWNldHMud2l0aGRyYXdGYWNldDtcbiB9LFxuZ2V0QWRtaW5Ob2RlKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5hZG1pbk5vZGU7XG4gfX0sXG5cbi8qIEdvZXMgdG8gdGhlIFpvZSBzZWF0LCB3aGljaCBpc24ndCByZXN0cmljdGVkIGluIGhvdyBtdWNoIHRvIHdpdGhkcmF3Ki9cbndpdGhkcmF3RmFjZXQ6e1xud2l0aGRyYXdQYXltZW50cyhhbW91bnRzKXtcbnJldHVybiBlc2Nyb3dTdG9yYWdlLndpdGhkcmF3UGF5bWVudHMoYW1vdW50cyk7XG4gfX0sXG5cbmhlbHBlcnM6e1xud3JhcElzc3VlcktpdFdpdGhab2VNaW50KGtleXdvcmQsbG9jYWxJc3N1ZXJLaXQsYWRtaW5Ob2RlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuY29uc3R7XG5taW50OmxvY2FsTWludCxcbmlzc3Vlcjpsb2NhbElzc3VlcixcbmJyYW5kOmxvY2FsQnJhbmQsXG5kaXNwbGF5SW5mbzpsb2NhbERpc3BsYXlJbmZvfT1cbmxvY2FsSXNzdWVyS2l0O1xuXG5jb25zdCBsb2NhbElzc3VlclJlY29yZD1tYWtlSXNzdWVyUmVjb3JkKFxubG9jYWxCcmFuZCxcbmxvY2FsSXNzdWVyLFxubG9jYWxEaXNwbGF5SW5mbyk7XG5cbmlzc3VlclN0b3JhZ2Uuc3RvcmVJc3N1ZXJSZWNvcmQobG9jYWxJc3N1ZXJSZWNvcmQpO1xuY29uc3QgbG9jYWxQb29sZWRQdXJzZT1lc2Nyb3dTdG9yYWdlLnByb3ZpZGVMb2NhbFB1cnNlKFxubG9jYWxJc3N1ZXJSZWNvcmQuaXNzdWVyLFxubG9jYWxJc3N1ZXJSZWNvcmQuYnJhbmQpO1xuXG5zdGF0ZS5pbnN0YW5jZVN0YXRlLmFkZElzc3VlcihrZXl3b3JkLGxvY2FsSXNzdWVyUmVjb3JkKTtcbi8qKiBAdHlwZSB7Wm9lTWludH0gKi9cbnJldHVybiBtYWtlWm9lTWludChcbmxvY2FsTWludCxcbmxvY2FsUG9vbGVkUHVyc2UsXG5hZG1pbk5vZGUsXG5sb2NhbElzc3VlclJlY29yZCk7XG5cbiB9fX0pO1xuXG5cblxuY29uc3QgbWFrZUluc3RhbmNlUmVjb3JkPW1ha2VJbnN0YW5jZVJlY29yZFN0b3JhZ2Uoem9lQmFnZ2FnZSk7XG5cbi8qKiBAdHlwZSB7TWFrZVpvZUluc3RhbmNlU3RvcmFnZU1hbmFnZXJ9ICovXG5jb25zdCBtYWtlWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcj1hc3luYyhcbmluc3RhbmNlQmFnZ2FnZSxcbmluc3RhbGxhdGlvbixcbmN1c3RvbVRlcm1zLFxudW5jbGVhbklzc3VlcktleXdvcmRSZWNvcmQsXG5pbnN0YW5jZSxcbmNvbnRyYWN0QnVuZGxlQ2FwLFxuaW5zdGFuY2VMYWJlbCk9Plxue1xuLyogQ2xlYW4gdGhlIGlzc3VlcktleXdvcmRSZWNvcmQgd2UgcmVjZWl2ZSBpbiBgc3RhcnRJbnN0YW5jZWAqL1xuLyogZnJvbSB0aGUgdXNlciwgYW5kIHNhdmUgdGhlIGlzc3VlcnMgaW4gWm9lIGlmIHRoZXkgYXJlIG5vdCovXG4vKiBhbHJlYWR5IHN0b3JlZCB0aGVyZSovXG5jb25zdHtpc3N1ZXJzLGJyYW5kc309YXdhaXQgaXNzdWVyU3RvcmFnZS5zdG9yZUlzc3VlcktleXdvcmRSZWNvcmQoXG51bmNsZWFuSXNzdWVyS2V5d29yZFJlY29yZCk7XG5cblxuLyogQ3JlYXRlIHB1cnNlcyBmb3IgdGhlIGlzc3VlcnMgaWYgdGhleSBkbyBub3QgYWxyZWFkeSBleGlzdCovXG5hd2FpdCBQcm9taXNlLmFsbChcbk9iamVjdC5lbnRyaWVzKGlzc3VlcnMpLm1hcCgoW2tleXdvcmQsaXNzdWVyXSk9PlxuZXNjcm93U3RvcmFnZS5jcmVhdGVQdXJzZShpc3N1ZXIsYnJhbmRzW2tleXdvcmRdKSkpO1xuXG5cblxuLyogVGhlIGluc3RhbmNlUmVjb3JkIGlzIHdoYXQgdGhlIGNvbnRyYWN0IGNvZGUgaXMgcGFyYW1ldGVyaXplZCovXG4vKiB3aXRoOiB0aGUgcGFydGljdWxhciB0ZXJtcywgaXNzdWVycywgYW5kIGJyYW5kcyB1c2VkIGluIGEqL1xuLyogY29udHJhY3QgaW5zdGFuY2UgYmFzZWQgb24gdGhlIGluc3RhbGxhdGlvbi4gQSB1c2VyIGNhbiBxdWVyeSovXG4vKiBab2UgdG8gZmluZCBvdXQgdGhlIGluc3RhbGxhdGlvbiwgdGVybXMsIGlzc3VlcnMsIGFuZCBicmFuZHMqL1xuLyogZm9yIGEgY29udHJhY3QgaW5zdGFuY2UuIENvbnRyYWN0IGNvZGUgaGFzIHNpbWlsYXIgcXVlcnkqL1xuLyogY2FwYWJpbGl0aWVzIGZyb20gdGhlIFpDRiBzaWRlLiovXG5cbmNvbnN0IGluc3RhbmNlUmVjb3JkPW1ha2VJbnN0YW5jZVJlY29yZChcbmhhcmRlbih7XG5pbnN0YWxsYXRpb24sXG5pbnN0YW5jZSxcbnRlcm1zOntcbi4uLmN1c3RvbVRlcm1zLFxuaXNzdWVycyxcbmJyYW5kc319KSk7XG5cblxuXG5cbmNvbnN0IGJ1bmRsZUxhYmVsPWluc3RhbGxhdGlvbi5nZXRCdW5kbGVMYWJlbCgpO1xuY29uc3QgY29udHJhY3RMYWJlbD1pbnN0YW5jZUxhYmVsP1xuIGAke2J1bmRsZUxhYmVsfS0ke2luc3RhbmNlTGFiZWx9YDpcbmJ1bmRsZUxhYmVsO1xuXG5jb25zdHtyb290LGFkbWluTm9kZX09YXdhaXQgY3JlYXRlWkNGVmF0KFxuY29udHJhY3RCdW5kbGVDYXAsXG5jb250cmFjdExhYmVsKTtcblxucmV0dXJuIG1ha2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyKGluc3RhbmNlUmVjb3JkLGFkbWluTm9kZSxyb290KS5cbmluc3RhbmNlU3RvcmFnZU1hbmFnZXI7XG4gfTtcblxuY29uc3QgZ2V0SW52aXRhdGlvbklzc3Vlcj0oKT0+aW52aXRhdGlvbklzc3VlcjtcblxuY29uc3QgbWFrZVN0b3JhZ2VNYW5hZ2VyPXByZXBhcmVFeG9DbGFzc0tpdChcbnpvZUJhZ2dhZ2UsXG4nWm9lU3RvcmFnZU1hbmFnZXInLFxuWm9lU3RvcmFnZU1hbmFnZXJJS2l0LFxuKGluc3RhbmNlQWRtaW5zKT0+KHtpbnN0YW5jZUFkbWluc30pLFxue1xuem9lU2VydmljZURhdGFBY2Nlc3M6e1xuZ2V0SW52aXRhdGlvbklzc3VlcixcbmdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbihhbGxlZ2VkSW5zdGFsbGF0aW9uKXtcbnJldHVybiBpbnN0YWxsYXRpb25TdG9yYWdlLmdldEJ1bmRsZUlERnJvbUluc3RhbGxhdGlvbihcbmFsbGVnZWRJbnN0YWxsYXRpb24pO1xuXG4gfSxcbmdldFB1YmxpY0ZhY2V0KGluc3RhbmNlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlQWRtaW5zLmdldFB1YmxpY0ZhY2V0KGluc3RhbmNlKTtcbiB9LFxuZ2V0QnJhbmRzKGluc3RhbmNlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlQWRtaW5zLmdldEJyYW5kcyhpbnN0YW5jZSk7XG4gfSxcbmdldElzc3VlcnMoaW5zdGFuY2Upe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VBZG1pbnMuZ2V0SXNzdWVycyhpbnN0YW5jZSk7XG4gfSxcbmdldE9mZmVyRmlsdGVyKGluc3RhbmNlKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlQWRtaW5zLmdldE9mZmVyRmlsdGVyKGluc3RhbmNlKTtcbiB9LFxuZ2V0VGVybXMoaW5zdGFuY2Upe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VBZG1pbnMuZ2V0VGVybXMoaW5zdGFuY2UpO1xuIH0sXG5nZXRJbnN0YWxsYXRpb24oaW5zdGFuY2Upe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VBZG1pbnMuZ2V0SW5zdGFsbGF0aW9uKGluc3RhbmNlKTtcbiB9LFxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb24sXG5pbnN0YWxsQnVuZGxlOihhbGxlZ2VkQnVuZGxlLGJ1bmRsZUxhYmVsKT0+e1xucmV0dXJuIGluc3RhbGxhdGlvblN0b3JhZ2UuaW5zdGFsbEJ1bmRsZShhbGxlZ2VkQnVuZGxlLGJ1bmRsZUxhYmVsKTtcbiB9LFxuaW5zdGFsbEJ1bmRsZUlEKGJ1bmRsZUlELGJ1bmRsZUxhYmVsKXtcbnJldHVybiBpbnN0YWxsYXRpb25TdG9yYWdlLmluc3RhbGxCdW5kbGVJRChidW5kbGVJRCxidW5kbGVMYWJlbCk7XG4gfX0sXG5cbm1ha2VPZmZlckFjY2Vzczp7XG5nZXRBc3NldEtpbmRCeUJyYW5kOmlzc3VlclN0b3JhZ2UuZ2V0QXNzZXRLaW5kQnlCcmFuZCxcbmdldEluc3RhbmNlQWRtaW4oaW5zdGFuY2Upe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUuaW5zdGFuY2VBZG1pbnMuZ2V0SW5zdGFuY2VBZG1pbihpbnN0YW5jZSk7XG4gfSxcbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uLFxuZ2V0SW52aXRhdGlvbklzc3VlcixcbmRlcG9zaXRQYXltZW50cyhwcm9wb3NhbCxwYXltZW50cyl7XG5yZXR1cm4gZXNjcm93U3RvcmFnZS5kZXBvc2l0UGF5bWVudHMocHJvcG9zYWwscGF5bWVudHMpO1xuIH19LFxuXG5zdGFydEluc3RhbmNlQWNjZXNzOntcbm1ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyLFxuLyoqIEB0eXBlIHtVbndyYXBJbnN0YWxsYXRpb259ICovXG51bndyYXBJbnN0YWxsYXRpb24oaW5zdGFsbGF0aW9uKXtcbnJldHVybiBpbnN0YWxsYXRpb25TdG9yYWdlLnVud3JhcEluc3RhbGxhdGlvbihpbnN0YWxsYXRpb24pO1xuIH19LFxuXG5pbnZpdGF0aW9uSXNzdWVyQWNjZXNzOntcbmdldEludml0YXRpb25Jc3N1ZXJ9fSk7XG5cblxuXG5cbnJldHVybiBtYWtlU3RvcmFnZU1hbmFnZXIoaW5zdGFuY2VBZG1pblN0b3JhZ2UuYWNjZXNzb3IpO1xuIH07JGjigI1fb25jZS5tYWtlWm9lU3RvcmFnZU1hbmFnZXIobWFrZVpvZVN0b3JhZ2VNYW5hZ2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlWm9lU3RvcmFnZU1hbmFnZXIiOlsibWFrZVpvZVN0b3JhZ2VNYW5hZ2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALfCvHviBgAA4gYAAB8AAABAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9oZWFwLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJNIiwiaGVhcFpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUV4byxkZWZpbmVFeG9DbGFzcyxkZWZpbmVFeG9DbGFzc0tpdCxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhclNldFN0b3JlLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxNLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlRXhvXCIsIFskaOKAjV9hID0+IChtYWtlRXhvID0gJGjigI1fYSldXSxbXCJkZWZpbmVFeG9DbGFzc1wiLCBbJGjigI1fYSA9PiAoZGVmaW5lRXhvQ2xhc3MgPSAkaOKAjV9hKV1dLFtcImRlZmluZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChkZWZpbmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhclNldFN0b3JlID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyV2Vha1NldFN0b3JlID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSksJGjigI1fbGl2ZVtcIk1cIl1dXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0eXBlIHtYaW1wb3J0KCcuJykuU3RvcmVzfVxuICovXG5jb25zdCBoZWFwU3RvcmVzPUZhcignaGVhcFN0b3Jlcycse1xuZGV0YWNoZWQ6KCk9PmhlYXBTdG9yZXMsXG5pc1N0b3JhYmxlOihfc3BlY2ltZW4pPT50cnVlLFxuXG5zZXRTdG9yZTptYWtlU2NhbGFyU2V0U3RvcmUsXG5tYXBTdG9yZTptYWtlU2NhbGFyTWFwU3RvcmUsXG53ZWFrTWFwU3RvcmU6bWFrZVNjYWxhcldlYWtNYXBTdG9yZSxcbndlYWtTZXRTdG9yZTptYWtlU2NhbGFyV2Vha1NldFN0b3JlfSk7XG5cblxuLyoqXG4gKiBBIGhlYXAgKGluLW1lbW9yeSkgem9uZSB0aGF0IHVzZXMgdGhlIGRlZmF1bHQgZXhvIGFuZCBzdG9yZSBpbXBsZW1lbnRhdGlvbnMuXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4nKS5ab25lfVxuICovXG5jb25zdCAgICAgICAgaGVhcFpvbmU9RmFyKCdoZWFwWm9uZScse1xuZXhvQ2xhc3M6ZGVmaW5lRXhvQ2xhc3MsXG5leG9DbGFzc0tpdDpkZWZpbmVFeG9DbGFzc0tpdCxcbmV4bzptYWtlRXhvLFxuc3ViWm9uZTooX2xhYmVsLF9vcHRpb25zKT0+aGVhcFpvbmUsXG4uLi5oZWFwU3RvcmVzfSk7JGjigI1fb25jZS5oZWFwWm9uZShoZWFwWm9uZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiTSI6WyJNIixmYWxzZV19LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGVhcFpvbmUiOlsiaGVhcFpvbmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2PQZMI8JAACPCQAAIAAAAEBhZ29yaWMvem9uZS12MC4yLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vaGVhcC5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2hlYXAuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUV4byxkZWZpbmVFeG9DbGFzcyxkZWZpbmVFeG9DbGFzc0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlRXhvXCIsIFskaOKAjV9hID0+IChtYWtlRXhvID0gJGjigI1fYSldXSxbXCJkZWZpbmVFeG9DbGFzc1wiLCBbJGjigI1fYSA9PiAoZGVmaW5lRXhvQ2xhc3MgPSAkaOKAjV9hKV1dLFtcImRlZmluZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChkZWZpbmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlYXAuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuLyogUmVmZXJlbmNlcyB0byBhbGxvdyB0aGUgYmVsb3cgdHlwZW9mcyB0byBzdWNjZWVkLiovXG5tYWtlRXhvO1xuZGVmaW5lRXhvQ2xhc3M7XG5kZWZpbmVFeG9DbGFzc0tpdDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7RXhvWm9uZSAmIFN0b3Jlc30gWm9uZSBBIGJhZyBvZiBtZXRob2RzIGZvciBjcmVhdGluZyBkZWZlbnNpYmxlIG9iamVjdHMgYW5kXG4gKiBjb2xsZWN0aW9ucyB3aXRoIHRoZSBzYW1lIGFsbG9jYXRpb24gc2VtYW50aWNzIChlcGhlbWVyYWwsIHBlcnNpc3RlbnQsIGV0YylcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEV4b1pvbmVcbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIG1ha2VFeG99IGV4byBjcmVhdGUgYSBzaW5nbGV0b24gZXhvLW9iamVjdCBpbnN0YW5jZSBib3VuZCB0byB0aGlzIHpvbmVcbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGRlZmluZUV4b0NsYXNzfSBleG9DbGFzcyBjcmVhdGUgYSBtYWtlciBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBleG8tb2JqZWN0cyBib3VuZCB0byB0aGlzIHpvbmVcbiAqIEBwcm9wZXJ0eSB7dHlwZW9mIGRlZmluZUV4b0NsYXNzS2l0fSBleG9DbGFzc0tpdCBjcmVhdGUgYSBcImtpdFwiIG1ha2VyIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgcmVjb3JkIG9mIGV4by1vYmplY3RzIHNoYXJpbmcgdGhlIHNhbWUgc3RhdGVcbiAqIEBwcm9wZXJ0eSB7KGxhYmVsOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yZU9wdGlvbnMpID0+IFpvbmV9IHN1YlpvbmUgY3JlYXRlIGEgbmV3IFpvbmUgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHVudHJ1c3RlZCBjb25zdW1lcnMgd2l0aG91dCBleHBvc2luZyB0aGUgc3RvcmFnZSBvZiB0aGUgcGFyZW50IHpvbmVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3Jlc1xuICogQHByb3BlcnR5IHsoKSA9PiBTdG9yZXN9IGRldGFjaGVkIG9idGFpbiBzdG9yZSBwcm92aWRlcnMgd2hpY2ggYXJlIGRldGFjaGVkICh0aGUgc3RvcmVzIGFyZSBhbm9ueW1vdXMgcmF0aGVyIHRoYW4gYm91bmQgdG8gYGxhYmVsYCBpbiB0aGUgem9uZSlcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiB1bmtub3duKSA9PiBib29sZWFufSBpc1N0b3JhYmxlIHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaW1lbiBjYW4gYmUgc3RvcmVkIGluIHRoZSB6b25lLCB3aGV0aGVyIGFzIGV4by1vYmplY3Qgc3RhdGUgb3IgaW4gYSBzdG9yZVxuICogQHByb3BlcnR5IHs8SyxWPihsYWJlbDogc3RyaW5nLCBvcHRpb25zPzogU3RvcmVPcHRpb25zKSA9PiBNYXBTdG9yZTxLLCBWPn0gbWFwU3RvcmUgcHJvdmlkZSBhIE1hcC1saWtlIHN0b3JlIG5hbWVkIGBsYWJlbGAgaW4gdGhlIHpvbmVcbiAqIEBwcm9wZXJ0eSB7PEs+KGxhYmVsOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yZU9wdGlvbnMpID0+IFNldFN0b3JlPEs+fSBzZXRTdG9yZSBwcm92aWRlIGEgU2V0LWxpa2Ugc3RvcmUgbmFtZWQgYGxhYmVsYCBpbiB0aGUgem9uZVxuICogQHByb3BlcnR5IHs8SyxWPihcbiAqICAgbGFiZWw6IHN0cmluZywgb3B0aW9ucz86IFN0b3JlT3B0aW9ucykgPT4gV2Vha01hcFN0b3JlPEssIFY+XG4gKiB9IHdlYWtNYXBTdG9yZSBwcm92aWRlIGEgV2Vha01hcC1saWtlIHN0b3JlIG5hbWVkIGBsYWJlbGAgaW4gdGhlIHpvbmVcbiAqIEBwcm9wZXJ0eSB7PEs+KFxuICogICBsYWJlbDogc3RyaW5nLCBvcHRpb25zPzogU3RvcmVPcHRpb25zKSA9PiBXZWFrU2V0U3RvcmU8Sz5cbiAqIH0gd2Vha1NldFN0b3JlIHByb3ZpZGUgYSBXZWFrU2V0LWxpa2Ugc3RvcmUgbmFtZWQgYGxhYmVsYCBpbiB0aGUgem9uZVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH4kbi3SEQAA0hEAACQAAABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgdHJhY2tUdXJuczskaOKAjV9pbXBvcnRzKFtbXCIuL3RyYWNrLXR1cm5zLmpzXCIsIFtbXCJ0cmFja1R1cm5zXCIsIFskaOKAjV9hID0+ICh0cmFja1R1cm5zID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXI9e1xuc2V0KF90YXJnZXQsX3Byb3AsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuaXNFeHRlbnNpYmxlKF90YXJnZXQpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5zZXRQcm90b3R5cGVPZihfdGFyZ2V0LF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmRlbGV0ZVByb3BlcnR5KF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIGZhbHNlO1xuIH19O1xuXG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQoX3RhcmdldCxwLHJlY2VpdmVyKXtcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbmlmKHRoaXMhPT1yZWNlaXZlcil7XG4vKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbmFzc2VydC5lcnJvcihcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtwfVwiIG1ldGhvZCBvZiBFKCR7cSh4KX0pYCkpO1xuXG5cbiB9XG5cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZCh4LHAsYXJncyk7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnQXJyYXk9W10pe1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24oeCxhcmdBcnJheSk7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVzZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKXtcbnJldHVybiBoYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldChfdGFyZ2V0LHAscmVjZWl2ZXIpe1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG50aGlzPT09cmVjZWl2ZXJ8fFxuRmFpbCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocCl9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKFxueClcbiB9KWA7XG5IYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHgscCxhcmdzKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKXtcbkhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seSh4LGFyZ3NBcnJheSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0sXG5oYXMoX3RhcmdldCxfcCl7XG4vKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9pbmRleCcpLkVQcm94eX1cbiAqL1xuZnVuY3Rpb24gICAgICAgICAgICAgICAgbWFrZUUoSGFuZGxlZFByb21pc2Upe1xuZnVuY3Rpb24gRSh4KXtcbmNvbnN0IGhhbmRsZXI9RVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKTtcbnJldHVybiBoYXJkZW4obmV3IFByb3h5KCgpPT57IH0saGFuZGxlcikpO1xuIH1cblxuY29uc3QgbWFrZUVHZXR0ZXJQcm94eT0oeCk9PlxubmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCkse1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhcyhfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiB0cnVlO1xuIH0sXG5nZXQoX3RhcmdldCxwcm9wKXtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5nZXQoeCxwcm9wKTtcbiB9fSk7XG5cblxuRS5nZXQ9bWFrZUVHZXR0ZXJQcm94eTtcbkUucmVzb2x2ZT1IYW5kbGVkUHJvbWlzZS5yZXNvbHZlO1xuRS5zZW5kT25seT0oeCk9PntcbmNvbnN0IGhhbmRsZXI9RXNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfTtcblxuRS53aGVuPSh4LG9uZnVsZmlsbGVkLG9ucmVqZWN0ZWQpPT57XG5jb25zdFtvbnN1Y2Nlc3Msb25mYWlsdXJlXT10cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSk7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKG9uc3VjY2VzcyxvbmZhaWx1cmUpO1xuIH07XG5cbnJldHVybiBoYXJkZW4oRSk7XG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIG1ha2VFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANwvtTx8CAAAfAgAAKgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoSGFuZGxlZFByb21pc2UpOyRo4oCNX29uY2UuRShFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoVgjP48QAACPEAAALgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLW5vY2hlY2sqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyogTk9URTogV2UgY2FuJ3QgaW1wb3J0IHRoZXNlIGJlY2F1c2UgdGhleSdyZSBub3QgaW4gc2NvcGUgYmVmb3JlIGxvY2tkb3duLiovXG4vKiBpbXBvcnQgeyBhc3NlcnQsIGRldGFpbHMgYXMgWCwgRmFpbCB9IGZyb20gJ0BhZ29yaWMvYXNzZXJ0JzsqL1xuXG4vKiBXQVJOSU5HOiBHbG9iYWwgTXV0YWJsZSBTdGF0ZSEqL1xuLyogVGhpcyBzdGF0ZSBpcyBjb21tdW5pY2F0ZWQgdG8gYGFzc2VydGAgdGhhdCBtYWtlcyBpdCBhdmFpbGFibGUgdG8gdGhlKi9cbi8qIGNhdXNhbCBjb25zb2xlLCB3aGljaCBhZmZlY3RzIHRoZSBjb25zb2xlIGxvZyBvdXRwdXQuIE5vcm1hbGx5IHdlKi9cbi8qIHJlZ2FyZCB0aGUgYWJpbGl0eSB0byBzZWUgY29uc29sZSBsb2cgb3V0cHV0IGFzIGEgbWV0YS1sZXZlbCBwcml2aWxlZ2UqL1xuLyogYW5hbG9nb3VzIHRvIHRoZSBhYmlsaXR5IHRvIGRlYnVnLiBBc2lkZSBmcm9tIHRoYXQsIHRoaXMgbW9kdWxlIHNob3VsZCovXG4vKiBub3QgaGF2ZSBhbnkgb2JzZXJ2YWJseSBtdXRhYmxlIHN0YXRlLiovXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuPTA7XG5sZXQgaGlkZGVuQ3VycmVudEV2ZW50PTA7XG5cbi8qIFRPRE8gVXNlIGVudmlyb25tZW50LW9wdGlvbnMuanMgY3VycmVudGx5IGluIHNlcy9zcmMgYWZ0ZXIgZmFjdG9yaW5nIGl0IG91dCovXG4vKiB0byBhIG5ldyBwYWNrYWdlLiovXG5jb25zdCBlbnY9KGdsb2JhbFRoaXMucHJvY2Vzc3x8e30pLmVudnx8e307XG5cbi8qIFR1cm4gb24gaWYgeW91IHNlZW0gdG8gYmUgbG9zaW5nIGVycm9yIGxvZ2dpbmcgYXQgdGhlIHRvcCBvZiB0aGUgZXZlbnQgbG9vcCovXG5jb25zdCBWRVJCT1NFPShlbnYuREVCVUd8fCcnKS5zcGxpdCgnOicpLmluY2x1ZGVzKCd0cmFjay10dXJucycpO1xuXG5jb25zdCB2YWxpZE9wdGlvblZhbHVlcz1mcmVlemUoW3VuZGVmaW5lZCwnZW5hYmxlZCcsJ2Rpc2FibGVkJ10pO1xuXG4vKiBUcmFjay10dXJucyBpcyBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBkaXNhYmxlZCBieSBhbiBlbnZpcm9ubWVudCovXG4vKiBvcHRpb24uKi9cbmNvbnN0IGVudk9wdGlvblZhbHVlPWVudi5UUkFDS19UVVJOUztcbmlmKCF2YWxpZE9wdGlvblZhbHVlcy5pbmNsdWRlcyhlbnZPcHRpb25WYWx1ZSkpe1xudGhyb3cgbmV3IFR5cGVFcnJvcihcbiBgdW5yZWNvZ25pemVkIFRSQUNLX1RVUk5TICR7SlNPTi5zdHJpbmdpZnkoZW52T3B0aW9uVmFsdWUpfWApO1xuXG4gfVxuY29uc3QgRU5BQkxFRD0oZW52T3B0aW9uVmFsdWV8fCdkaXNhYmxlZCcpPT09J2VuYWJsZWQnO1xuXG4vKiBXZSBob2lzdCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBvdXQgb2YgdHJhY2tUdXJucygpIHRvIGRpc2NvdXJhZ2UgdGhlKi9cbi8qIGNsb3N1cmVzIGZyb20gaG9sZGluZyBvbnRvICdhcmdzJyBvciAnZnVuYycgbG9uZ2VyIHRoYW4gbmVjZXNzYXJ5LCovXG4vKiB3aGljaCB3ZSd2ZSBzZWVuIGNhdXNlIEhhbmRsZWRQcm9taXNlIGFyZ3VtZW50cyB0byBiZSByZXRhaW5lZCBmb3IqL1xuLyogYSBzdXJwcmlzaW5nbHkgbG9uZyB0aW1lLiovXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGU9KGRldGFpbHNOb3RlKT0+KHJlYXNvbik9PntcbmlmKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKHJlYXNvbixkZXRhaWxzTm90ZSk7XG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnUkVKRUNURUQgYXQgdG9wIG9mIGV2ZW50IGxvb3AnLHJlYXNvbik7XG4gfVxuIH07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbj1cbihmdW5jLHNlbmRpbmdFcnJvcixYKT0+XG4oLi4uYXJncyk9PntcbmhpZGRlblByaW9yRXJyb3I9c2VuZGluZ0Vycm9yO1xuaGlkZGVuQ3VycmVudFR1cm4rPTE7XG5oaWRkZW5DdXJyZW50RXZlbnQ9MDtcbnRyeXtcbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbmlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLGVycik7XG4gfVxudGhyb3cgZXJyO1xuIH1cbi8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG5jb25zdCBkZXRhaWxzTm90ZT1YIGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xucmV0dXJuIHJlc3VsdDtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9bmV3IEVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuIGZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSk7XG4gfTskaOKAjV9vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADpSrU0cAgAAHAIAABkAAABAZW5kby9leG8tdjAuMi4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2V4by1tYWtlcnMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZXhvLW1ha2Vycy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9leG8tbWFrZXJzLmpzIjpbWyJpbml0RW1wdHkiLCJpbml0RW1wdHkiXSxbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiXSxbImRlZmluZUV4b0NsYXNzS2l0IiwiZGVmaW5lRXhvQ2xhc3NLaXQiXSxbIm1ha2VFeG8iLCJtYWtlRXhvIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADGt+tWYxgAAGMYAAAiAAAAQGVuZG8vZXhvLXYwLjIuMi9zcmMvZXhvLW1ha2Vycy5qc3siaW1wb3J0cyI6WyIuL2V4by10b29scy5qcyIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzc0tpdCIsImluaXRFbXB0eSIsIm1ha2VFeG8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgb2JqZWN0TWFwLGRlZmVuZFByb3RvdHlwZSxkZWZlbmRQcm90b3R5cGVLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXV1dLFtcIi4vZXhvLXRvb2xzLmpzXCIsIFtbXCJkZWZlbmRQcm90b3R5cGVcIiwgWyRo4oCNX2EgPT4gKGRlZmVuZFByb3RvdHlwZSA9ICRo4oCNX2EpXV0sW1wiZGVmZW5kUHJvdG90eXBlS2l0XCIsIFskaOKAjV9hID0+IChkZWZlbmRQcm90b3R5cGVLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtjcmVhdGUsc2VhbCxmcmVlemUsZGVmaW5lUHJvcGVydHl9PU9iamVjdDtcblxuLyogVE9ETyBVc2UgZW52aXJvbm1lbnQtb3B0aW9ucy5qcyBjdXJyZW50bHkgaW4gc2VzL3NyYyBhZnRlciBmYWN0b3JpbmcgaXQgb3V0Ki9cbi8qIHRvIGEgbmV3IHBhY2thZ2UuKi9cbmNvbnN0IGVudj0oZ2xvYmFsVGhpcy5wcm9jZXNzfHx7fSkuZW52fHx7fTtcblxuLyogVHVybiBvbiB0byBnaXZlIGVhY2ggZXhvIGluc3RhbmNlIGl0cyBvd24gdG9TdHJpbmdUYWcgdmFsdWUuKi9cbmNvbnN0IExBQkVMX0lOU1RBTkNFUz0oZW52LkRFQlVHfHwnJykuXG5zcGxpdCgnLCcpLlxuaW5jbHVkZXMoJ2xhYmVsLWluc3RhbmNlcycpO1xuXG5jb25zdCBtYWtlU2VsZj0ocHJvdG8saW5zdGFuY2VDb3VudCk9PntcbmNvbnN0IHNlbGY9Y3JlYXRlKHByb3RvKTtcbmlmKExBQkVMX0lOU1RBTkNFUyl7XG5kZWZpbmVQcm9wZXJ0eShzZWxmLFN5bWJvbC50b1N0cmluZ1RhZyx7XG52YWx1ZTogYCR7cHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXX0jJHtpbnN0YW5jZUNvdW50fWAsXG53cml0YWJsZTpmYWxzZSxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6ZmFsc2V9KTtcblxuIH1cbnJldHVybiBoYXJkZW4oc2VsZik7XG4gfTtcblxuY29uc3QgZW1wdHlSZWNvcmQ9aGFyZGVuKHt9KTtcblxuLyoqXG4gKiBXaGVuIGNhbGxpbmcgYGRlZmluZUR1cmFibGVLaW5kYCBhbmRcbiAqIGl0cyBzaWJsaW5ncywgdXNlZCBhcyB0aGUgYGluaXRgIGZ1bmN0aW9uIGFyZ3VtZW50IHRvIGluZGljYXRlIHRoYXQgdGhlXG4gKiBzdGF0ZSByZWNvcmQgb2YgdGhlICh2aXJ0dWFsL2R1cmFibGUpIGluc3RhbmNlcyBvZiB0aGUga2luZC9leG9DbGFzc1xuICogc2hvdWxkIGJlIGVtcHR5LCBhbmQgdGhhdCB0aGUgcmV0dXJuZWQgbWFrZXIgZnVuY3Rpb24gc2hvdWxkIGhhdmUgemVyb1xuICogcGFyYW1ldGVycy5cbiAqXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbmNvbnN0ICAgICAgICBpbml0RW1wdHk9KCk9PmVtcHR5UmVjb3JkO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2V4by10b29scy5qcycpLkZhY2V0TmFtZX0gRmFjZXROYW1lXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9leG8tdG9vbHMuanMnKS5NZXRob2RzfSBNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1MgPSBhbnldXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IFtNID0gYW55XVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vZXhvLXRvb2xzLmpzJykuQ2xhc3NDb250ZXh0fSBDbGFzc0NvbnRleHRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUyA9IGFueV1cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPEZhY2V0TmFtZSwgTWV0aG9kcz59IFtGID0gYW55XVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vZXhvLXRvb2xzLmpzJykuS2l0Q29udGV4dH0gS2l0Q29udGV4dFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tbbmFtZTogc3RyaW5nXTogWGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5QYXR0ZXJufX0gU3RhdGVTaGFwZVxuICogSXQgbG9va3MgbGlrZSBhIGNvcHlSZWNvcmQgcGF0dGVybiwgYnV0IHRoZSBpbnRlcnByZXRhdGlvbiBpcyBkaWZmZXJlbnQuXG4gKiBFYWNoIHByb3BlcnR5IGlzIGRpc3RpbmN0LCBpcyBjaGVja2VkIGFuZCBjaGFuZ2VkIHNlcGFyYXRlbHkuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgQ1xuICogQHR5cGVkZWYge29iamVjdH0gRmFyQ2xhc3NPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhjb250ZXh0OiBDKSA9PiB2b2lkfSBbZmluaXNoXVxuICogQHByb3BlcnR5IHtTdGF0ZVNoYXBlfSBbc3RhdGVTaGFwZV1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge00gJiBUaGlzVHlwZTx7IHNlbGY6IE0sIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxDbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPiwgTT4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKE0gJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIE0+KX1cbiAqLyRo4oCNX29uY2UuaW5pdEVtcHR5KGluaXRFbXB0eSk7XG5jb25zdCAgICAgICAgZGVmaW5lRXhvQ2xhc3M9KHRhZyxpbnRlcmZhY2VHdWFyZCxpbml0LG1ldGhvZHMsb3B0aW9ucyk9PntcbmNvbnN0e2ZpbmlzaD11bmRlZmluZWR9PW9wdGlvbnN8fHt9O1xuLyoqIEB0eXBlIHtXZWFrTWFwPE0sQ2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sIE0+Pn0gKi9cbmNvbnN0IGNvbnRleHRNYXA9bmV3IFdlYWtNYXAoKTtcbmNvbnN0IHByb3RvPWRlZmVuZFByb3RvdHlwZShcbnRhZyxcbihzZWxmKT0+LyoqIEB0eXBlIHthbnl9ICovY29udGV4dE1hcC5nZXQoc2VsZiksXG5tZXRob2RzLFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkKTtcblxubGV0IGluc3RhbmNlQ291bnQ9MDtcbi8qKlxuICogQHBhcmFtICB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICovXG5jb25zdCBtYWtlSW5zdGFuY2U9KC4uLmFyZ3MpPT57XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuaW5zdGFuY2VDb3VudCs9MTtcbi8qKiBAdHlwZSB7TX0gKi9cbmNvbnN0IHNlbGY9bWFrZVNlbGYocHJvdG8saW5zdGFuY2VDb3VudCk7XG5cbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbi8qKiBAdHlwZSB7Q2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sTT59ICovXG5jb25zdCBjb250ZXh0PWZyZWV6ZSh7c3RhdGUsc2VsZn0pO1xuY29udGV4dE1hcC5zZXQoc2VsZixjb250ZXh0KTtcbmlmKGZpbmlzaCl7XG5maW5pc2goY29udGV4dCk7XG4gfVxucmV0dXJuICgvKiogQHR5cGUge00gJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIE0+fSAqL1xuc2VsZik7XG5cbiB9O1xucmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2UpO1xuIH07JGjigI1fb25jZS5kZWZpbmVFeG9DbGFzcyhkZWZpbmVFeG9DbGFzcyk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3MpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gRiBmYWNldCBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtGICYgVGhpc1R5cGU8eyBmYWNldHM6IEYsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+IH0gbWV0aG9kc0tpdFxuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8S2l0Q29udGV4dDxSZXR1cm5UeXBlPEk+LEY+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEZ9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVFeG9DbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5tZXRob2RzS2l0LFxub3B0aW9ucyk9Plxue1xuY29uc3R7ZmluaXNoPXVuZGVmaW5lZH09b3B0aW9uc3x8e307XG5jb25zdCBjb250ZXh0TWFwS2l0PW9iamVjdE1hcChtZXRob2RzS2l0LCgpPT5uZXcgV2Vha01hcCgpKTtcbmNvbnN0IGdldENvbnRleHRLaXQ9b2JqZWN0TWFwKFxubWV0aG9kc0tpdCxcbihfdixuYW1lKT0+KGZhY2V0KT0+Y29udGV4dE1hcEtpdFtuYW1lXS5nZXQoZmFjZXQpKTtcblxuY29uc3QgcHJvdG90eXBlS2l0PWRlZmVuZFByb3RvdHlwZUtpdChcbnRhZyxcbmdldENvbnRleHRLaXQsXG5tZXRob2RzS2l0LFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0KTtcblxubGV0IGluc3RhbmNlQ291bnQ9MDtcbi8qKlxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKi9cbmNvbnN0IG1ha2VJbnN0YW5jZUtpdD0oLi4uYXJncyk9Pntcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbmNvbnN0IHN0YXRlPXNlYWwoaW5pdCguLi5hcmdzKSk7XG4vKiBEb24ndCBmcmVlemUgY29udGV4dCB1bnRpbCB3ZSBhZGQgZmFjZXRzKi9cbi8qKiBAdHlwZSB7S2l0Q29udGV4dDxSZXR1cm5UeXBlPEk+LEY+fSAqL1xuY29uc3QgY29udGV4dD17c3RhdGUsZmFjZXRzOnt9fTtcbmluc3RhbmNlQ291bnQrPTE7XG5jb25zdCBmYWNldHM9b2JqZWN0TWFwKHByb3RvdHlwZUtpdCwocHJvdG8sZmFjZXROYW1lKT0+e1xuY29uc3Qgc2VsZj1tYWtlU2VsZihwcm90byxpbnN0YW5jZUNvdW50KTtcbmNvbnRleHRNYXBLaXRbZmFjZXROYW1lXS5zZXQoc2VsZixjb250ZXh0KTtcbnJldHVybiBzZWxmO1xuIH0pO1xuY29udGV4dC5mYWNldHM9ZmFjZXRzO1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuZnJlZXplKGNvbnRleHQpO1xuaWYoZmluaXNoKXtcbmZpbmlzaChjb250ZXh0KTtcbiB9XG5yZXR1cm4gY29udGV4dC5mYWNldHM7XG4gfTtcbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlS2l0KTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lRXhvQ2xhc3NLaXQoZGVmaW5lRXhvQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmQgQ0FWRUFUOiBzdGF0aWMgdHlwaW5nIGRvZXMgbm90IHlldCBzdXBwb3J0IGBjYWxsV2hlbmAgdHJhbnNmb3JtYXRpb25cbiAqIEBwYXJhbSB7VH0gbWV0aG9kc1xuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8Q2xhc3NDb250ZXh0PHt9LFQ+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRXhvPSh0YWcsaW50ZXJmYWNlR3VhcmQsbWV0aG9kcyxvcHRpb25zPXVuZGVmaW5lZCk9PntcbmNvbnN0IG1ha2VJbnN0YW5jZT1kZWZpbmVFeG9DbGFzcyhcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuaW5pdEVtcHR5LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5yZXR1cm4gbWFrZUluc3RhbmNlKCk7XG4gfTskaOKAjV9vbmNlLm1ha2VFeG8obWFrZUV4byk7XG5oYXJkZW4obWFrZUV4byk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaW5pdEVtcHR5IjpbImluaXRFbXB0eSJdLCJkZWZpbmVFeG9DbGFzcyI6WyJkZWZpbmVFeG9DbGFzcyJdLCJkZWZpbmVFeG9DbGFzc0tpdCI6WyJkZWZpbmVFeG9DbGFzc0tpdCJdLCJtYWtlRXhvIjpbIm1ha2VFeG8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMbCt8nEmAABxJgAAIQAAAEBlbmRvL2V4by12MC4yLjIvc3JjL2V4by10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImRlZmVuZFByb3RvdHlwZSIsImRlZmVuZFByb3RvdHlwZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixsaXN0RGlmZmVyZW5jZSxvYmplY3RNYXAsbXVzdE1hdGNoLE07JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibGlzdERpZmZlcmVuY2VcIiwgWyRo4oCNX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjigI1fYSldXSxbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuTWV0aG9kfSBNZXRob2QgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5NZXRob2RHdWFyZH0gTWV0aG9kR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZH0gSW50ZXJmYWNlR3VhcmQgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHthcHBseSxvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZGVmaW5lUHJvcGVydGllc309T2JqZWN0O1xuXG4vKipcbiAqIEEgbWV0aG9kIGd1YXJkLCBmb3IgaW5jbHVzaW9uIGluIGFuIGludGVyZmFjZSBndWFyZCwgdGhhdCBlbmZvcmNlcyBvbmx5IHRoYXRcbiAqIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NhYmxlIGFuZCB0aGF0IHRoZSByZXN1bHQgaXMgcGFzc2FibGUuIChJbiBmYXIgY2xhc3NlcyxcbiAqIFwiYW55XCIgbWVhbnMgYW55ICpwYXNzYWJsZSouKSBUaGlzIGlzIHRoZSBsZWFzdCBwb3NzaWJsZSBlbmZvcmNlbWVudCBmb3IgYVxuICogbWV0aG9kIGd1YXJkLCBhbmQgaXMgaW1wbGllZCBieSBhbGwgb3RoZXIgbWV0aG9kIGd1YXJkcy5cbiAqL1xuY29uc3QgTWluTWV0aG9kR3VhcmQ9TS5jYWxsKCkucmVzdChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpO1xuXG5jb25zdCBkZWZlbmRTeW5jQXJncz0oYXJncyxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e2FyZ0d1YXJkcyxvcHRpb25hbEFyZ0d1YXJkcyxyZXN0QXJnR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3QgcGFyYW1zUGF0dGVybj1NLnNwbGl0QXJyYXkoXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCk7XG5cbm11c3RNYXRjaChoYXJkZW4oYXJncykscGFyYW1zUGF0dGVybixsYWJlbCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcmV0dXJucyB7TWV0aG9kfVxuICovXG5jb25zdCBkZWZlbmRTeW5jTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtyZXR1cm5HdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdHtzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbnN5bmNNZXRob2QoLi4uYXJncyl7XG5kZWZlbmRTeW5jQXJncyhoYXJkZW4oYXJncyksbWV0aG9kR3VhcmQsbGFiZWwpO1xuY29uc3QgcmVzdWx0PWFwcGx5KG1ldGhvZCx0aGlzLGFyZ3MpO1xubXVzdE1hdGNoKGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9fTtcblxucmV0dXJuIHN5bmNNZXRob2Q7XG4gfTtcblxuY29uc3QgaXNBd2FpdEFyZ0d1YXJkPShhcmdHdWFyZCk9PlxuYXJnR3VhcmQmJnR5cGVvZiBhcmdHdWFyZD09PSdvYmplY3QnJiZhcmdHdWFyZC5rbGFzcz09PSdhd2FpdEFyZyc7XG5cbmNvbnN0IGRlc3luYz0obWV0aG9kR3VhcmQpPT57XG5jb25zdHthcmdHdWFyZHMsb3B0aW9uYWxBcmdHdWFyZHM9W10scmVzdEFyZ0d1YXJkfT1tZXRob2RHdWFyZDtcbiFpc0F3YWl0QXJnR3VhcmQocmVzdEFyZ0d1YXJkKXx8XG5GYWlsIGBSZXN0IGFyZ3MgbWF5IG5vdCBiZSBhd2FpdGVkOiAke3Jlc3RBcmdHdWFyZH1gO1xuY29uc3QgcmF3QXJnR3VhcmRzPVsuLi5hcmdHdWFyZHMsLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG5jb25zdCBhd2FpdEluZGV4ZXM9W107XG5mb3IobGV0IGk9MDtpPHJhd0FyZ0d1YXJkcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBhcmdHdWFyZD1yYXdBcmdHdWFyZHNbaV07XG5pZihpc0F3YWl0QXJnR3VhcmQoYXJnR3VhcmQpKXtcbnJhd0FyZ0d1YXJkc1tpXT1hcmdHdWFyZC5hcmdHdWFyZDtcbmF3YWl0SW5kZXhlcy5wdXNoKGkpO1xuIH1cbiB9XG5yZXR1cm57XG5hd2FpdEluZGV4ZXMsXG5yYXdNZXRob2RHdWFyZDp7XG5hcmdHdWFyZHM6cmF3QXJnR3VhcmRzLnNsaWNlKDAsYXJnR3VhcmRzLmxlbmd0aCksXG5vcHRpb25hbEFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG5yZXN0QXJnR3VhcmR9fTtcblxuXG4gfTtcblxuY29uc3QgZGVmZW5kQXN5bmNNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0e2F3YWl0SW5kZXhlcyxyYXdNZXRob2RHdWFyZH09ZGVzeW5jKG1ldGhvZEd1YXJkKTtcbmNvbnN0e2FzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbmFzeW5jTWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgYXdhaXRMaXN0PWF3YWl0SW5kZXhlcy5tYXAoKGkpPT5hcmdzW2ldKTtcbmNvbnN0IHA9UHJvbWlzZS5hbGwoYXdhaXRMaXN0KTtcbmNvbnN0IHJhd0FyZ3M9Wy4uLmFyZ3NdO1xuY29uc3QgcmVzdWx0UD1FLndoZW4ocCwoYXdhaXRlZEFyZ3MpPT57XG5mb3IobGV0IGo9MDtqPGF3YWl0SW5kZXhlcy5sZW5ndGg7ais9MSl7XG5yYXdBcmdzW2F3YWl0SW5kZXhlc1tqXV09YXdhaXRlZEFyZ3Nbal07XG4gfVxuZGVmZW5kU3luY0FyZ3MocmF3QXJncyxyYXdNZXRob2RHdWFyZCxsYWJlbCk7XG5yZXR1cm4gYXBwbHkobWV0aG9kLHRoaXMscmF3QXJncyk7XG4gfSk7XG5yZXR1cm4gRS53aGVuKHJlc3VsdFAsKHJlc3VsdCk9Pntcbm11c3RNYXRjaChoYXJkZW4ocmVzdWx0KSxyZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbnJldHVybiByZXN1bHQ7XG4gfSk7XG4gfX07XG5cbnJldHVybiBhc3luY01ldGhvZDtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKi9cbmNvbnN0IGRlZmVuZE1ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7a2xhc3MsY2FsbEtpbmR9PW1ldGhvZEd1YXJkO1xuYXNzZXJ0KGtsYXNzPT09J21ldGhvZEd1YXJkJyk7XG5pZihjYWxsS2luZD09PSdzeW5jJyl7XG5yZXR1cm4gZGVmZW5kU3luY01ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpO1xuIH1lbHNle1xuYXNzZXJ0KGNhbGxLaW5kPT09J2FzeW5jJyk7XG5yZXR1cm4gZGVmZW5kQXN5bmNNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBGYWNldE5hbWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBbTSA9IGFueV1cbiAqIEB0eXBlZGVmIHt7IHN0YXRlOiBTLCBzZWxmOiBNIH19IENsYXNzQ29udGV4dFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gW0YgPSBhbnldXG4gKiBAdHlwZWRlZiB7eyBzdGF0ZTogUywgZmFjZXRzOiBGIH19IEtpdENvbnRleHRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoZmFjZXQ6IGFueSkgPT4gS2l0Q29udGV4dH0gS2l0Q29udGV4dFByb3ZpZGVyXG4gKiBAdHlwZWRlZiB7KChyZXByZXNlbnRhdGl2ZTogYW55KSA9PiBDbGFzc0NvbnRleHQpIHwgS2l0Q29udGV4dFByb3ZpZGVyfSBDb250ZXh0UHJvdmlkZXJcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RUYWdcbiAqIEBwYXJhbSB7Q29udGV4dFByb3ZpZGVyfSBjb250ZXh0UHJvdmlkZXJcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gW21ldGhvZEd1YXJkXVxuICovXG5jb25zdCBiaW5kTWV0aG9kPShcbm1ldGhvZFRhZyxcbmNvbnRleHRQcm92aWRlcixcbmJlaGF2aW9yTWV0aG9kLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5tZXRob2RHdWFyZD11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YoYmVoYXZpb3JNZXRob2QsJ2Z1bmN0aW9uJyk7XG5cbmNvbnN0IGdldENvbnRleHQ9KHNlbGYpPT57XG5jb25zdCBjb250ZXh0PWNvbnRleHRQcm92aWRlcihzZWxmKTtcbmNvbnRleHR8fFxuRmFpbCBgJHtxKG1ldGhvZFRhZyl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtzZWxmfWA7XG5yZXR1cm4gY29udGV4dDtcbiB9O1xuXG4vKiBWaW9sYXRpbmcgYWxsIEplc3NpZSBydWxlcyB0byBjcmVhdGUgcmVwcmVzZW50YXRpdmVzIHRoYXQgaW5oZXJpdCovXG4vKiBtZXRob2RzIGZyb20gYSBzaGFyZWQgcHJvdG90eXBlLiBUaGUgYm91bmQgbWV0aG9kIHRoZXJlZm9yZSBuZWVkcyovXG4vKiB0byBtZW50aW9uIGB0aGlzYC4gV2UgZGVmaW5lIGl0IHVzaW5nIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4vKiBzbyB0aGF0IGl0IHdpbGwgYmUgYHRoaXNgIHNlbnNpdGl2ZSBidXQgbm90IGNvbnN0cnVjdGFibGUuKi9cbi8qKi9cbi8qIFdlIG5vcm1hbGx5IGNvbnNpZGVyIGB0aGlzYCB1bnNhZmUgYmVjYXVzZSBvZiB0aGUgaGF6YXJkIG9mIGEqL1xuLyogbWV0aG9kIG9mIG9uZSBhYnN0cmFjdGlvbiBiZWluZyBhcHBsaWVkIHRvIGFuIGluc3RhbmNlIG9mKi9cbi8qIGFub3RoZXIgYWJzdHJhY3Rpb24uIFRvIHByZXZlbnQgdGhhdCBhdHRhY2ssIHRoZSBib3VuZCBtZXRob2QqL1xuLyogY2hlY2tzIHRoYXQgaXRzIGB0aGlzYCBpcyBpbiB0aGUgbWFwIGluIHdoaWNoIGl0cyByZXByZXNlbnRhdGl2ZXMqL1xuLyogYXJlIHJlZ2lzdGVyZWQuKi9cbmxldHttZXRob2R9PXRoaXNmdWxNZXRob2RzP1xue1xubWV0aG9kKC4uLmFyZ3Mpe1xudGhpc3x8XG5GYWlsIGB0aGlzZnVsIG1ldGhvZCAke21ldGhvZFRhZ30gY2FsbGVkIHdpdGhvdXQgJ3RoaXMnIG9iamVjdGA7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsY29udGV4dCxhcmdzKTtcbiB9fTpcblxue1xubWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgY29udGV4dD1nZXRDb250ZXh0KHRoaXMpO1xucmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLG51bGwsW2NvbnRleHQsLi4uYXJnc10pO1xuIH19O1xuXG5pZihtZXRob2RHdWFyZCl7XG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1lbHNlIGlmKHRoaXNmdWxNZXRob2RzKXtcbi8qIEZvciBmYXIgY2xhc3NlcyBlbnN1cmUgdGhhdCBpbnB1dHMgYW5kIG91dHB1dHMgYXJlIHBhc3NhYmxlLiovXG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxNaW5NZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1cbmRlZmluZVByb3BlcnRpZXMobWV0aG9kLHtcbm5hbWU6e3ZhbHVlOm1ldGhvZFRhZ30sXG5sZW5ndGg6e1xudmFsdWU6dGhpc2Z1bE1ldGhvZHM/YmVoYXZpb3JNZXRob2QubGVuZ3RoOmJlaGF2aW9yTWV0aG9kLmxlbmd0aC0xfX0pO1xuXG5cbnJldHVybiBtZXRob2Q7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0NvbnRleHRQcm92aWRlcn0gY29udGV4dFByb3ZpZGVyXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBbaW50ZXJmYWNlR3VhcmRdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBkZWZlbmRQcm90b3R5cGU9KFxudGFnLFxuY29udGV4dFByb3ZpZGVyLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5pbnRlcmZhY2VHdWFyZD11bmRlZmluZWQpPT5cbntcbmNvbnN0IHByb3RvdHlwZT17fTtcbmNvbnN0IG1ldGhvZE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzKS5maWx0ZXIoXG4vKiBCeSBpZ25vcmluZyBhbnkgbWV0aG9kIG5hbWVkIFwiY29uc3RydWN0b3JcIiwgd2UgY2FuIHVzZSBhKi9cbi8qIGNsYXNzLnByb3RvdHlwZSBhcyBhIGJlaGF2aW9yTWV0aG9kcy4qL1xuKG5hbWUpPT5uYW1lIT09J2NvbnN0cnVjdG9yJyk7XG5cbmxldCBtZXRob2RHdWFyZHM7XG5pZihpbnRlcmZhY2VHdWFyZCl7XG5jb25zdHtcbmtsYXNzLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkczptZyxcbnNsb3BweT1mYWxzZX09XG5pbnRlcmZhY2VHdWFyZDtcbm1ldGhvZEd1YXJkcz1tZztcbmFzc2VydC5lcXVhbChrbGFzcywnSW50ZXJmYWNlJyk7XG5hc3NlcnQudHlwZW9mKGludGVyZmFjZU5hbWUsJ3N0cmluZycpO1xue1xuY29uc3QgbWV0aG9kR3VhcmROYW1lcz1vd25LZXlzKG1ldGhvZEd1YXJkcyk7XG5jb25zdCB1bmltcGxlbWVudGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsbWV0aG9kTmFtZXMpO1xudW5pbXBsZW1lbnRlZC5sZW5ndGg9PT0wfHxcbkZhaWwgYG1ldGhvZHMgJHtxKHVuaW1wbGVtZW50ZWQpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmlmKCFzbG9wcHkpe1xuY29uc3QgdW5ndWFyZGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLG1ldGhvZEd1YXJkTmFtZXMpO1xudW5ndWFyZGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5ndWFyZGVkKX0gbm90IGd1YXJkZWQgYnkgJHtxKGludGVyZmFjZU5hbWUpfWA7XG4gfVxuIH1cbiB9XG5mb3IoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcyl7XG5wcm90b3R5cGVbcHJvcF09YmluZE1ldGhvZChcbiBgSW4gJHtxKHByb3ApfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuY29udGV4dFByb3ZpZGVyLFxuYmVoYXZpb3JNZXRob2RzW3Byb3BdLFxudGhpc2Z1bE1ldGhvZHMsXG4vKiBUT0RPIHNvbWUgdG9vbCBkb2VzIG5vdCB5ZXQgdW5kZXJzdGFuZCB0aGUgYD8uW2Agc3ludGF4Ki9cbm1ldGhvZEd1YXJkcyYmbWV0aG9kR3VhcmRzW3Byb3BdKTtcblxuIH1cblxucmV0dXJuIEZhcih0YWcsLyoqIEB0eXBlIHtUfSAqL3Byb3RvdHlwZSk7XG4gfTskaOKAjV9vbmNlLmRlZmVuZFByb3RvdHlwZShkZWZlbmRQcm90b3R5cGUpO1xuaGFyZGVuKGRlZmVuZFByb3RvdHlwZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtSZWNvcmQ8RmFjZXROYW1lLCBLaXRDb250ZXh0UHJvdmlkZXI+fSBjb250ZXh0UHJvdmlkZXJLaXRcbiAqIEBwYXJhbSB7UmVjb3JkPEZhY2V0TmFtZSwgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBiZWhhdmlvck1ldGhvZHNLaXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBJbnRlcmZhY2VHdWFyZD59IFtpbnRlcmZhY2VHdWFyZEtpdF1cbiAqL1xuY29uc3QgICAgICAgIGRlZmVuZFByb3RvdHlwZUtpdD0oXG50YWcsXG5jb250ZXh0UHJvdmlkZXJLaXQsXG5iZWhhdmlvck1ldGhvZHNLaXQsXG50aGlzZnVsTWV0aG9kcz1mYWxzZSxcbmludGVyZmFjZUd1YXJkS2l0PXVuZGVmaW5lZCk9Plxue1xuY29uc3QgZmFjZXROYW1lcz1vd25LZXlzKGJlaGF2aW9yTWV0aG9kc0tpdCkuc29ydCgpO1xuZmFjZXROYW1lcy5sZW5ndGg+MXx8RmFpbCBgQSBtdWx0aS1mYWNldCBvYmplY3QgbXVzdCBoYXZlIG11bHRpcGxlIGZhY2V0c2A7XG5pZihpbnRlcmZhY2VHdWFyZEtpdCl7XG5jb25zdCBpbnRlcmZhY2VOYW1lcz1vd25LZXlzKGludGVyZmFjZUd1YXJkS2l0KTtcbmNvbnN0IGV4dHJhSW50ZXJmYWNlTmFtZXM9bGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcyxpbnRlcmZhY2VOYW1lcyk7XG5leHRyYUludGVyZmFjZU5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgSW50ZXJmYWNlcyAke3EoZXh0cmFJbnRlcmZhY2VOYW1lcyl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuY29uc3QgZXh0cmFGYWNldE5hbWVzPWxpc3REaWZmZXJlbmNlKGludGVyZmFjZU5hbWVzLGZhY2V0TmFtZXMpO1xuZXh0cmFGYWNldE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbm90IGd1YXJkZWQgYnkgaW50ZXJmYWNlc2A7XG4gfVxuY29uc3QgY29udGV4dE1hcE5hbWVzPW93bktleXMoY29udGV4dFByb3ZpZGVyS2l0KTtcbmNvbnN0IGV4dHJhQ29udGV4dE5hbWVzPWxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsY29udGV4dE1hcE5hbWVzKTtcbmV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoY29udGV4dE1hcE5hbWVzLGZhY2V0TmFtZXMpO1xuZXh0cmFGYWNldE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbWlzc2luZyBjb250ZXh0c2A7XG5yZXR1cm4gb2JqZWN0TWFwKGJlaGF2aW9yTWV0aG9kc0tpdCwoYmVoYXZpb3JNZXRob2RzLGZhY2V0TmFtZSk9PlxuZGVmZW5kUHJvdG90eXBlKFxuIGAke3RhZ30gJHtmYWNldE5hbWV9YCxcbmNvbnRleHRQcm92aWRlcktpdFtmYWNldE5hbWVdLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHMsXG5pbnRlcmZhY2VHdWFyZEtpdCYmaW50ZXJmYWNlR3VhcmRLaXRbZmFjZXROYW1lXSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuZGVmZW5kUHJvdG90eXBlS2l0KGRlZmVuZFByb3RvdHlwZUtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEEMM5RAAgAAQAIAAB4AAABAZW5kby9mYXItdjAuMi4xOC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIixudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBlbmRvL2V2ZW50dWFsLXNlbmQiOltbIkUiLCJFIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJGYXIiLCJGYXIiXSxbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXSxbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKWPOvdKBwAASgcAAB0AAABAZW5kby9tYXJzaGFsLXYwLjguNS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsInBhcnNlIiwicGFyc2UiLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjpbWyJkZWVwbHlGdWxmaWxsZWQiLCJkZWVwbHlGdWxmaWxsZWQiXV0sIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6W1siUUNMQVNTIiwiUUNMQVNTIl1dLCIuL3NyYy9tYXJzaGFsLmpzIjpbWyJtYWtlTWFyc2hhbCIsIm1ha2VNYXJzaGFsIl1dLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6W1sic3RyaW5naWZ5Iiwic3RyaW5naWZ5Il0sWyJwYXJzZSIsInBhcnNlIl1dLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6W1siZGVjb2RlVG9KdXN0aW4iLCJkZWNvZGVUb0p1c3RpbiJdXSwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOltbIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSJdLFsibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIl0sWyJpc0VuY29kZWRSZW1vdGFibGUiLCJpc0VuY29kZWRSZW1vdGFibGUiXSxbInplcm9QYWQiLCJ6ZXJvUGFkIl0sWyJyZWNvcmROYW1lcyIsInJlY29yZE5hbWVzIl0sWyJyZWNvcmRWYWx1ZXMiLCJyZWNvcmRWYWx1ZXMiXV0sIi4vc3JjL3JhbmtPcmRlci5qcyI6W1siYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiXSxbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiXSxbImlzUmFua1NvcnRlZCIsImlzUmFua1NvcnRlZCJdLFsic29ydEJ5UmFuayIsInNvcnRCeVJhbmsiXSxbImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVBbnRpUmFuayJdLFsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdLFsiZ2V0UGFzc1N0eWxlQ292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciJdLFsiaW50ZXJzZWN0UmFua0NvdmVycyIsImludGVyc2VjdFJhbmtDb3ZlcnMiXSxbInVuaW9uUmFua0NvdmVycyIsInVuaW9uUmFua0NvdmVycyJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADQgme5QNAACUDQAAKwAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9kZWVwbHlGdWxmaWxsZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGlzUHJvbWlzZSxnZXRUYWcsaXNPYmplY3QsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWYgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtmcm9tRW50cmllc309T2JqZWN0O1xuXG4vKipcbiAqIEdpdmVuIGEgUGFzc2FibGUgYHZhbGAgd2hvc2UgcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBtYXkgY29udGFpbiBsZWFmXG4gKiBwcm9taXNlcywgcmV0dXJuIGEgcHJvbWlzZSBmb3IgYSByZXBsYWNlbWVudCBQYXNzYWJsZSxcbiAqIHdoZXJlIHRoYXQgcmVwbGFjZW1lbnQgaXMgKmRlZXBseSBmdWxmaWxsZWQqLCBpLmUuLCBpdHNcbiAqIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiBhbnkgcHJvbWlzZXMuXG4gKlxuICogVGhpcyBpcyBhIGRlZXAgZm9ybSBvZiBgUHJvbWlzZS5hbGxgIHNwZWNpYWxpemVkIGZvciBQYXNzYWJsZXMuIEZvciBlYWNoXG4gKiBlbmNvdW50ZXJlZCBwcm9taXNlLCByZXBsYWNlIGl0IHdpdGggdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybSBvZlxuICogaXRzIGZ1bGZpbGxtZW50LlxuICogSWYgYW55IG9mIHRoZSBwcm9taXNlcyByZWplY3QsIHRoZW4gdGhlIHByb21pc2UgZm9yIHRoZSByZXBsYWNlbWVudFxuICogcmVqZWN0cy4gSWYgYW55IG9mIHRoZSBwcm9taXNlcyBuZXZlciBzZXR0bGUsIHRoZW4gdGhlIHByb21pc2UgZm9yXG4gKiB0aGUgcmVwbGFjZW1lbnQgbmV2ZXIgc2V0dGxlcy5cbiAqXG4gKiBJZiB0aGUgcmVwbGFjZW1lbnQgd291bGQgbm90IGJlIFBhc3NhYmxlLCBpLmUuLCBpZiBgdmFsYCBpcyBub3RcbiAqIFBhc3NhYmxlLCBvciBpZiBhbnkgb2YgdGhlIHRyYW5zaXRpdmUgcHJvbWlzZXMgZnVsZmlsbCB0byBzb21ldGhpbmdcbiAqIHRoYXQgaXMgbm90IFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIHJlamVjdHMuXG4gKlxuICogSWYgYHZhbGAgb3IgaXRzIHBhcnRzIGFyZSBub24ta2V5IFBhc3NhYmxlcyBvbmx5ICpiZWNhdXNlKiB0aGV5IGNvbnRhaW5zXG4gKiBwcm9taXNlcywgdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybXMgb2YgdmFsIG9yIGl0cyBwYXJ0cyBtYXkgYmUga2V5cy4gVGhpc1xuICogaXMgZm9yIHRoZSBoaWdoZXIgXCJzdG9yZVwiIGxldmVsIG9mIGFic3RyYWN0aW9uIHRvIGRldGVybWluZSwgYmVjYXVzZSBpdFxuICogZGVmaW5lcyB0aGUgXCJrZXlcIiBub3Rpb24gaW4gcXVlc3Rpb24uXG4gKlxuICogLy8gVE9ETzogVGhhdCBoaWdoZXIgbGV2ZWwgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgYmVpbmcgbWlncmF0ZWQgZnJvbVxuICogLy8gYEBhZ29yaWMvc3RvcmVgIHRvIGBAZW5kby9wYXR0ZXJuc2AuIE9uY2UgdGhhdCBpcyBmYXIgZW5vdWdoIGFsb25nLFxuICogLy8gcmV2aXNlIHRoZSBhYm92ZSBjb21tZW50IHRvIG1hdGNoLlxuICogLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE0NTFcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBhc3NhYmxlPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZD1hc3luYyh2YWwpPT57XG5pZighaXNPYmplY3QodmFsKSl7XG5yZXR1cm4gdmFsO1xuIH1cbmlmKGlzUHJvbWlzZSh2YWwpKXtcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzp7XG5jb25zdCBuYW1lcz1vd25LZXlzKHZhbCk7XG5jb25zdCB2YWxQcz1uYW1lcy5tYXAoKG5hbWUpPT5kZWVwbHlGdWxmaWxsZWQodmFsW25hbWVdKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PlxuaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLGkpPT5bbmFtZXNbaV0sY10pKSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbmNvbnN0IHZhbFBzPXZhbC5tYXAoKHApPT5kZWVwbHlGdWxmaWxsZWQocCkpO1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5oYXJkZW4odmFscykpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5yZXR1cm4gRS53aGVuKGRlZXBseUZ1bGZpbGxlZCh2YWwucGF5bG9hZCksKHBheWxvYWQpPT5cbm1ha2VUYWdnZWQodGFnLHBheWxvYWQpKTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gdmFsO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gRS53aGVuKHZhbCwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07JGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWQoZGVlcGx5RnVsZmlsbGVkKTtcbmhhcmRlbihkZWVwbHlGdWxmaWxsZWQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAO3LPgOQ/AADkPwAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9lbmNvZGVQYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwicGFzc1N0eWxlUHJlZml4ZXMiLCJyZWNvcmROYW1lcyIsInJlY29yZFZhbHVlcyIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLGlzRXJyb3JMaWtlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SYW5rQ292ZXJ9IFJhbmtDb3ZlciAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2Zyb21FbnRyaWVzLGlzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIEFzc3VtaW5nIHRoYXQgYHJlY29yZGAgaXMgYSBDb3B5UmVjb3JkLCB3ZSBoYXZlIG9ubHlcbiAqIHN0cmluZy1uYW1lZCBvd24gcHJvcGVydGllcy4gYHJlY29yZE5hbWVzYCByZXR1cm5zIHRob3NlIG5hbWUgKnJldmVyc2UqXG4gKiBzb3J0ZWQsIGJlY2F1c2UgdGhhdCdzIGhvdyByZWNvcmRzIGFyZSBjb21wYXJlZCwgZW5jb2RlZCwgYW5kIHNvcnRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuY29uc3QgICAgICAgIHJlY29yZE5hbWVzPShyZWNvcmQpPT5cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNjAjZGlzY3Vzc2lvbl9yMTAwMzY1NzI0NCovXG4vKiBjb21wYXJlcyB0d28gd2F5cyBvZiByZXZlcnNlIHNvcnRpbmcsIGFuZCBzaG93cyB0aGF0IGAuc29ydCgpLnJldmVyc2UoKWAqL1xuLyogaXMgY3VycmVudGx5IGZhc3RlciBvbiBNb2RkYWJsZSBYUywgd2hpbGUgdGhlIG90aGVyIHdheSwqL1xuLyogYC5zb3J0KHJldmVyc2VDb21wYXJhdG9yKWAsIGlzIGZhc3RlciBvbiB2OC4gV2UgY3VycmVudGx5IGNhcmUgbW9yZSBhYm91dCovXG4vKiBYUyBwZXJmb3JtYW5jZSwgc28gd2UgcmV2ZXJzZSBzb3J0IHVzaW5nIGAuc29ydCgpLnJldmVyc2UoKWAuKi9cbmhhcmRlbigvKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmVjb3JkKS5zb3J0KCkucmV2ZXJzZSgpKTskaOKAjV9vbmNlLnJlY29yZE5hbWVzKHJlY29yZE5hbWVzKTtcbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQgYW5kIGBuYW1lc2AgaXMgYHJlY29yZE5hbWVzKHJlY29yZClgLFxuICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkVmFsdWVzPShyZWNvcmQsbmFtZXMpPT5cbmhhcmRlbihuYW1lcy5tYXAoKG5hbWUpPT5yZWNvcmRbbmFtZV0pKTskaOKAjV9vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBuXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIHplcm9QYWQ9KG4sc2l6ZSk9PntcbmNvbnN0IG5TdHI9IGAke259YDtcbmFzc2VydChuU3RyLmxlbmd0aDw9c2l6ZSk7XG5jb25zdCBzdHI9IGAwMDAwMDAwMDAwMDAwMDAwMDAwMCR7blN0cn1gO1xuY29uc3QgcmVzdWx0PXN0ci5zdWJzdHJpbmcoc3RyLmxlbmd0aC1zaXplKTtcbmFzc2VydChyZXN1bHQubGVuZ3RoPT09c2l6ZSk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vKiBUaGlzIGlzIHRoZSBKYXZhU2NyaXB0IGFuYWxvZyB0byBhIEMgdW5pb246IGEgd2F5IHRvIG1hcCBiZXR3ZWVuIGEgZmxvYXQgYXMgYSovXG4vKiBudW1iZXIgYW5kIHRoZSBiaXRzIHRoYXQgcmVwcmVzZW50IHRoZSBmbG9hdCBhcyBhIGJ1ZmZlciBmdWxsIG9mIGJ5dGVzLiAgTm90ZSovXG4vKiB0aGF0IHRoZSBtdXRhdGlvbiBvZiBzdGF0aWMgc3RhdGUgaGVyZSBtYWtlcyB0aGlzIGludmFsaWQgSmVzc2llIGNvZGUsIGJ1dCovXG4vKiBkb2luZyBpdCB0aGlzIHdheSBzYXZlcyB0aGUgbnVnYXRvcnkgYW5kIGdyYXR1aXRvdXMgYWxsb2NhdGlvbnMgdGhhdCB3b3VsZCovXG4vKiBoYXBwZW4gZXZlcnkgdGltZSB5b3UgZG8gYSBjb252ZXJzaW9uIC0tIGFuZCBpbiBwcmFjdGljYWwgdGVybXMgaXQncyBzYWZlKi9cbi8qIGJlY2F1c2Ugd2UgcHV0IHRoZSB2YWx1ZSBpbiBvbmUgc2lkZSBhbmQgdGhlbiBpbW1lZGlhdGVseSB0YWtlIGl0IG91dCB0aGUqL1xuLyogb3RoZXI7IHRoZXJlIGlzIG5vIGFjdHVhbCBzdGF0ZSByZXRhaW5lZCBpbiB0aGUgY2xhc3NpYyBzZW5zZSBhbmQgdGh1cyBubyovXG4vKiByZS1lbnRyYW5jeSBpc3N1ZS4qL1xuY29uc3QgYXNOdW1iZXI9bmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cz1uZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLyogSmF2YVNjcmlwdCBudW1iZXJzIGFyZSBlbmNvZGVkIGJ5IG91dHB1dHRpbmcgdGhlIGJhc2UtMTYqL1xuLyogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBJRUVFIGZsb2F0aW5nIHBvaW50Ki9cbi8qIHJlcHJlc2VudGF0aW9uLiAgRm9yIG5lZ2F0aXZlIHZhbHVlcywgYWxsIGJpdHMgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBhcmUqL1xuLyogY29tcGxlbWVudGVkIHByaW9yIHRvIHRoZSBiYXNlLTE2IGNvbnZlcnNpb24sIHdoaWxlIGZvciBwb3NpdGl2ZSB2YWx1ZXMsIHRoZSovXG4vKiBzaWduIGJpdCBpcyBjb21wbGVtZW50ZWQuICBUaGlzIGVuc3VyZXMgYm90aCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGJlZm9yZSovXG4vKiBwb3NpdGl2ZSB2YWx1ZXMgYW5kIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYWNjb3JkaW5nIHRvIHRoZWlyIG5lZ2F0aXZlKi9cbi8qIG1hZ25pdHVkZSByYXRoZXIgdGhhbiB0aGVpciBwb3NpdGl2ZSBtYWduaXR1ZGUuICBUaGlzIHJlc3VsdHMgaW4gYW4gQVNDSUkqL1xuLyogZW5jb2Rpbmcgd2hvc2UgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1lcmljIHNvcnQgb3JkZXIqL1xuLyogb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycy4qL1xuXG4vKiBUT0RPIENob29zZSB0aGUgc2FtZSBjYW5vbmljYWwgTmFOIGVuY29kaW5nIHRoYXQgY29zbVdhc20gYW5kIGV3YXNtIGNob3NlLiovXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzPSdmZmY4MDAwMDAwMDAwMDAwJztcblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmluYXJ5NjQ9KG4pPT57XG4vKiBOb3JtYWxpemUgLTAgdG8gMCBhbmQgTmFOIHRvIGEgY2Fub25pY2FsIGVuY29kaW5nKi9cbmlmKGlzKG4sLTApKXtcbm49MDtcbiB9ZWxzZSBpZihpcyhuLE5hTikpe1xucmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gfVxuYXNOdW1iZXJbMF09bjtcbmxldCBiaXRzPWFzQml0c1swXTtcbmlmKG48MCl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5yZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksMTYpfWA7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlQmluYXJ5NjQ9KGVuY29kZWQpPT57XG5lbmNvZGVkLnN0YXJ0c1dpdGgoJ2YnKXx8RmFpbCBgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IGJpdHM9QmlnSW50KCBgMHgke2VuY29kZWQuc3Vic3RyaW5nKDEpfWApO1xuaWYoZW5jb2RlZFsxXTwnOCcpe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxuYXNCaXRzWzBdPWJpdHM7XG5jb25zdCByZXN1bHQ9YXNOdW1iZXJbMF07XG4haXMocmVzdWx0LC0wKXx8RmFpbCBgVW5leHBlY3RlZCBuZWdhdGl2ZSB6ZXJvOiAke2VuY29kZWR9YDtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBFbmNvZGUgYSBKYXZhU2NyaXB0IGJpZ2ludCB1c2luZyBhIHZhcmlhbnQgb2YgRWxpYXMgZGVsdGEgY29kaW5nLCB3aXRoIGFuXG4gKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGFcbiAqIHNlY29uZCBjb21wb25lbnQgZm9yIHRoZSBkZWNpbWFsIGRpZ2l0IGNvdW50LCBhbmQgYSB0aGlyZCBjb21wb25lbnQgZm9yIHRoZVxuICogZGVjaW1hbCBkaWdpdHMgcHJlY2VkZWQgYnkgYSBncmF0dWl0b3VzIHNlcGFyYXRpbmcgY29sb24uXG4gKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlXG4gKiBudW1lcmljIHNvcnQgb3JkZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycywgdGhlIGNoYXJhY3RlcnMgb2YgdGhlIHVuYXJ5XG4gKiBwcmVmaXggYXJlIGRpZmZlcmVudCBmb3IgbmVnYXRpdmUgdmFsdWVzICh0eXBlIFwiblwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2ZcbiAqIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlXG4gKiBcInBcIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mIFwiflwicyBbd2hpY2ggc29ydCBhZnRlciBkZWNpbWFsIGRpZ2l0c10pIGFuZFxuICogZWFjaCBkZWNpbWFsIGRpZ2l0IG9mIHRoZSBlbmNvZGluZyBmb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpcyByZXBsYWNlZCB3aXRoIGl0c1xuICogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieVxuICogKmRlc2NlbmRpbmcqIGFic29sdXRlIHZhbHVlKS5cbiAqXG4gKiBAcGFyYW0ge2JpZ2ludH0gblxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQmlnSW50PShuKT0+e1xuY29uc3QgYWJzPW48MG4/LW46bjtcbmNvbnN0IG5EaWdpdHM9YWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuY29uc3QgbERpZ2l0cz1uRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuaWYobjwwbil7XG5yZXR1cm4gYG4ke1xuLyogQSBcIiNcIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbicjJy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuKDEwKipsRGlnaXRzLW5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywnMCcpXG4gfToke1xuLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGRpZ2l0cy4qL1xuKDEwbioqQmlnSW50KG5EaWdpdHMpK24pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywnMCcpXG4gfWA7XG4gfWVsc2V7XG5yZXR1cm4gYHAke1xuLyogQSBcIn5cIiBmb3IgZWFjaCBkaWdpdCBiZXlvbmQgdGhlIGZpcnN0Ki9cbi8qIGluIHRoZSBkZWNpbWFsICpjb3VudCogb2YgZGVjaW1hbCBkaWdpdHMuKi9cbid+Jy5yZXBlYXQobERpZ2l0cy0xKVxuIH0ke1xuLyogVGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xubkRpZ2l0c1xuIH06JHtcbi8qIFRoZSBkaWdpdHMuKi9cbm5cbiB9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuY29uc3QgZGVjb2RlQmlnSW50PShlbmNvZGVkKT0+e1xuY29uc3QgdHlwZVByZWZpeD1lbmNvZGVkLmNoYXJBdCgwKTsvKiBmYXN0ZXIgdGhhbiBlbmNvZGVkWzBdKi9cbmxldCByZW09ZW5jb2RlZC5zbGljZSgxKTtcbnR5cGVQcmVmaXg9PT0ncCd8fFxudHlwZVByZWZpeD09PSduJ3x8XG5GYWlsIGBFbmNvZGVkIGJpZ2ludCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbmNvbnN0IGxEaWdpdHM9cmVtLnNlYXJjaCgvWzAtOV0vKSsxO1xubERpZ2l0cz49MXx8RmFpbCBgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xucmVtPXJlbS5zbGljZShsRGlnaXRzLTEpO1xuXG5yZW0ubGVuZ3RoPj1sRGlnaXRzfHxGYWlsIGBDb21wbGV0ZSBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5jb25zdCBzbkRpZ2l0cz1yZW0uc2xpY2UoMCxsRGlnaXRzKTtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cyk7XG4vXlswLTldKyQvLnRlc3Qoc25EaWdpdHMpfHxGYWlsIGBEZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuRGlnaXRzPXBhcnNlSW50KHNuRGlnaXRzLDEwKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuLyogbGlrZSBcIm4wOlwiIGFuZCBcIm4wMDrigKZcIiBhbmQgXCJuOTE64oCmXCIgdGhyb3VnaCBcIm45OTrigKZcIj8qL1xubkRpZ2l0cz0xMCoqbERpZ2l0cy1uRGlnaXRzO1xuIH1cblxucmVtLnN0YXJ0c1dpdGgoJzonKXx8RmFpbCBgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbnJlbT1yZW0uc2xpY2UoMSk7XG5yZW0ubGVuZ3RoPT09bkRpZ2l0c3x8XG5GYWlsIGBGaXhlZC1sZW5ndGggZGlnaXQgc2VxdWVuY2UgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG49QmlnSW50KHJlbSk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuOTowXCIgYW5kIFwibjg6MDBcIiBhbmQgXCJuODo5MVwiIHRocm91Z2ggXCJuODo5OVwiPyovXG5uPS0oMTBuKipCaWdJbnQobkRpZ2l0cyktbik7XG4gfVxuXG5yZXR1cm4gbjtcbiB9O1xuXG4vKiBgJ1xcdTAwMDAnYCBpcyB0aGUgdGVybWluYXRvciBhZnRlciBlbGVtZW50cy4qL1xuLyogYCdcXHUwMDAxJ2AgaXMgdGhlIGJhY2tzbGFzaC1saWtlIGVzY2FwZSBjaGFyYWN0ZXIsIGZvciovXG4vKiBlc2NhcGluZyBib3RoIG9mIHRoZXNlIGNoYXJhY3RlcnMuKi9cblxuY29uc3QgZW5jb2RlQXJyYXk9KGFycmF5LGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgY2hhcnM9WydbJ107XG5mb3IoY29uc3QgZWxlbWVudCBvZiBhcnJheSl7XG5jb25zdCBlbmM9ZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG5mb3IoY29uc3QgYyBvZiBlbmMpe1xuaWYoYz09PSdcXHUwMDAwJ3x8Yz09PSdcXHUwMDAxJyl7XG5jaGFycy5wdXNoKCdcXHUwMDAxJyk7XG4gfVxuY2hhcnMucHVzaChjKTtcbiB9XG5jaGFycy5wdXNoKCdcXHUwMDAwJyk7XG4gfVxucmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9IGRlY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKi9cbmNvbnN0IGRlY29kZUFycmF5PShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdbJyl8fEZhaWwgYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuY29uc3QgZWxlbWVudHM9W107XG5jb25zdCBlbGVtQ2hhcnM9W107XG5mb3IobGV0IGk9MTtpPGVuY29kZWQubGVuZ3RoO2krPTEpe1xuY29uc3QgYz1lbmNvZGVkW2ldO1xuaWYoYz09PSdcXHUwMDAwJyl7XG5jb25zdCBlbmNvZGVkRWxlbWVudD1lbGVtQ2hhcnMuam9pbignJyk7XG5lbGVtQ2hhcnMubGVuZ3RoPTA7XG5jb25zdCBlbGVtZW50PWRlY29kZVBhc3NhYmxlKGVuY29kZWRFbGVtZW50KTtcbmVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gfWVsc2UgaWYoYz09PSdcXHUwMDAxJyl7XG5pKz0xO1xuaTxlbmNvZGVkLmxlbmd0aHx8RmFpbCBgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtlbmNvZGVkfWA7XG5jb25zdCBjMj1lbmNvZGVkW2ldO1xuYzI9PT0nXFx1MDAwMCd8fFxuYzI9PT0nXFx1MDAwMSd8fFxuRmFpbCBgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2MyfWA7XG5lbGVtQ2hhcnMucHVzaChjMik7XG4gfWVsc2V7XG5lbGVtQ2hhcnMucHVzaChjKTtcbiB9XG4gfVxuZWxlbUNoYXJzLmxlbmd0aD09PTB8fEZhaWwgYGVuY29kaW5nIHRlcm1pbmF0ZWQgZWFybHk6ICR7ZW5jb2RlZH1gO1xucmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVjb3JkPShyZWNvcmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBuYW1lcz1yZWNvcmROYW1lcyhyZWNvcmQpO1xuY29uc3QgdmFsdWVzPXJlY29yZFZhbHVlcyhyZWNvcmQsbmFtZXMpO1xucmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLHZhbHVlc10pLGVuY29kZVBhc3NhYmxlKX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZVJlY29yZD0oZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk9PntcbmFzc2VydChlbmNvZGVkLnN0YXJ0c1dpdGgoJygnKSk7XG5jb25zdCBrZXlzdmFscz1kZWNvZGVBcnJheShlbmNvZGVkLnN1YnN0cmluZygxKSxkZWNvZGVQYXNzYWJsZSk7XG5rZXlzdmFscy5sZW5ndGg9PT0yfHxGYWlsIGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2VuY29kZWR9YDtcbmNvbnN0W2tleXMsdmFsc109a2V5c3ZhbHM7XG5cbnBhc3NTdHlsZU9mKGtleXMpPT09J2NvcHlBcnJheScmJlxucGFzc1N0eWxlT2YodmFscyk9PT0nY29weUFycmF5JyYmXG5rZXlzLmxlbmd0aD09PXZhbHMubGVuZ3RoJiZcbmtleXMuZXZlcnkoKGtleSk9PnR5cGVvZiBrZXk9PT0nc3RyaW5nJyl8fFxuRmFpbCBgbm90IGEgdmFsaWQgcmVjb3JkIGVuY29kaW5nOiAke2VuY29kZWR9YDtcbmNvbnN0IG1hcEVudHJpZXM9a2V5cy5tYXAoKGtleSxpKT0+W2tleSx2YWxzW2ldXSk7XG5jb25zdCByZWNvcmQ9aGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbmFzc2VydFJlY29yZChyZWNvcmQsJ2RlY29kZWQgcmVjb3JkJyk7XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0IGVuY29kZVRhZ2dlZD0odGFnZ2VkLGVuY29kZVBhc3NhYmxlKT0+XG4gYDoke2VuY29kZUFycmF5KGhhcmRlbihbZ2V0VGFnKHRhZ2dlZCksdGFnZ2VkLnBheWxvYWRdKSxlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnOicpKTtcbmNvbnN0IHRhZ3BheWxvYWQ9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xudGFncGF5bG9hZC5sZW5ndGg9PT0yfHxGYWlsIGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2VuY29kZWR9YDtcbmNvbnN0W3RhZyxwYXlsb2FkXT10YWdwYXlsb2FkO1xucGFzc1N0eWxlT2YodGFnKT09PSdzdHJpbmcnfHxcbkZhaWwgYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtlbmNvZGVkfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcscGF5bG9hZCk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlRXJyb3JdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZU9wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVQYXNzYWJsZT0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlPShyZW0sXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gLFxuZW5jb2RlUHJvbWlzZT0ocHJvbSxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YCxcbmVuY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWB9PVxuZW5jb2RlT3B0aW9ucztcblxuY29uc3QgZW5jb2RlUGFzc2FibGU9KHBhc3NhYmxlKT0+e1xuaWYoaXNFcnJvckxpa2UocGFzc2FibGUpKXtcbnJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4ndic7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybid6JztcbiB9XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kZUJpbmFyeTY0KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xucmV0dXJuIGBzJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYm9vbGVhbic6e1xucmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgncicpfHxcbkZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3IocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJyEnKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCc/Jyl8fFxuRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiP1wiOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xucmV0dXJuIGB5JHtuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpfWA7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBlbmNvZGVBcnJheShwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5yZXR1cm4gZW5jb2RlUmVjb3JkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJuIGVuY29kZVRhZ2dlZChwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBhICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbGxlY3Rpb24gcGFzc2FibGVgO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVQYXNzYWJsZShtYWtlRW5jb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUHJvbWlzZX0gW2RlY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVQYXNzYWJsZT0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlPShyZW0sXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gLFxuZGVjb2RlUHJvbWlzZT0ocHJvbSxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YCxcbmRlY29kZUVycm9yPShlcnIsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWB9PVxuZGVjb2RlT3B0aW9ucztcblxuY29uc3QgZGVjb2RlUGFzc2FibGU9KGVuY29kZWQpPT57XG5zd2l0Y2goZW5jb2RlZC5jaGFyQXQoMCkpe1xuY2FzZSd2Jzp7XG5yZXR1cm4gbnVsbDtcbiB9XG5jYXNlJ3onOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdmJzp7XG5yZXR1cm4gZGVjb2RlQmluYXJ5NjQoZW5jb2RlZCk7XG4gfVxuY2FzZSdzJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSk7XG4gfVxuY2FzZSdiJzp7XG5yZXR1cm4gZW5jb2RlZC5zdWJzdHJpbmcoMSkhPT0nZmFsc2UnO1xuIH1cbmNhc2Unbic6XG5jYXNlJ3AnOntcbnJldHVybiBkZWNvZGVCaWdJbnQoZW5jb2RlZCk7XG4gfVxuY2FzZSdyJzp7XG5yZXR1cm4gZGVjb2RlUmVtb3RhYmxlKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnPyc6e1xucmV0dXJuIGRlY29kZVByb21pc2UoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSchJzp7XG5yZXR1cm4gZGVjb2RlRXJyb3IoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSd5Jzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kZWQuc3Vic3RyaW5nKDEpKTtcbiB9XG5jYXNlJ1snOntcbnJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJygnOntcbnJldHVybiBkZWNvZGVSZWNvcmQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSc6Jzp7XG5yZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7ZW5jb2RlZH1gO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVQYXNzYWJsZShtYWtlRGVjb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5cbmNvbnN0ICAgICAgICBpc0VuY29kZWRSZW1vdGFibGU9KGVuY29kZWQpPT5lbmNvZGVkLmNoYXJBdCgwKT09PSdyJzskaOKAjV9vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZSB7UmVjb3JkPFBhc3NTdHlsZSwgc3RyaW5nPn1cbiAqIFRoZSBzaW5nbGUgcHJlZml4IGNoYXJhY3RlcnMgdG8gYmUgdXNlZCBmb3IgZWFjaCBQYXNzU3R5bGUgY2F0ZWdvcnkuXG4gKiBgYmlnaW50YCBpcyBhIHR3byBjaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2UgZWFjaCBvZiB0aG9zZSBjaGFyYWN0ZXJzXG4gKiBpbmRpdmlkdWFsbHkgaXMgYSB2YWxpZCBiaWdpbnQgcHJlZml4LiBgbmAgZm9yIFwibmVnYXRpdmVcIiBhbmQgYHBgIGZvclxuICogXCJwb3NpdGl2ZVwiLiBUaGUgb3JkZXJpbmcgb2YgdGhlc2UgcHJlZml4ZXMgaXMgdGhlIHNhbWUgYXMgdGhlXG4gKiByYW5rT3JkZXJpbmcgb2YgdGhlaXIgcmVzcGVjdGl2ZSBQYXNzU3R5bGVzLiBUaGlzIHRhYmxlIGlzIGltcG9ydGVkIGJ5XG4gKiByYW5rT3JkZXIuanMgZm9yIHRoaXMgcHVycG9zZS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgYHxgIGlzIHRoZSByZW1vdGFibGUtPm9yZGluYWwgbWFwcGluZyBwcmVmaXg6XG4gKiBUaGlzIGlzIG5vdCB1c2VkIGluIGNvdmVycyBidXQgaXQgaXNcbiAqIHJlc2VydmVkIGZyb20gdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIE5vdGUgdGhhdCB0aGUgcHJlZml4IGlzID4gYW55XG4gKiBwcmVmaXggdXNlZCBieSBhbnkgY292ZXIgc28gdGhhdCBvcmRpbmFsIG1hcHBpbmcga2V5cyBhcmUgYWx3YXlzIG91dHNpZGVcbiAqIHRoZSByYW5nZSBvZiB2YWxpZCBjb2xsZWN0aW9uIGVudHJ5IGtleXMuXG4gKi9cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVQcmVmaXhlcz17XG5lcnJvcjonIScsXG5jb3B5UmVjb3JkOicoJyxcbnRhZ2dlZDonOicsXG5wcm9taXNlOic/JyxcbmNvcHlBcnJheTonWycsXG5ib29sZWFuOidiJyxcbm51bWJlcjonZicsXG5iaWdpbnQ6J25wJyxcbnJlbW90YWJsZToncicsXG5zdHJpbmc6J3MnLFxubnVsbDondicsXG5zeW1ib2w6J3knLFxudW5kZWZpbmVkOid6J307JGjigI1fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVQcmVmaXhlcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVQcmVmaXhlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVjb3JkTmFtZXMiOlsicmVjb3JkTmFtZXMiXSwicmVjb3JkVmFsdWVzIjpbInJlY29yZFZhbHVlcyJdLCJ6ZXJvUGFkIjpbInplcm9QYWQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxFOn8Pw/AAD8PwAAKwAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxpc09iamVjdCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRo4oCNX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nVW5pb259IEVuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuZGVmaW5lUHJvcGVydGllcyxcbmlzLFxuZW50cmllcyxcbmZyb21FbnRyaWVzLFxuZnJlZXplfT1cbk9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBTcGVjaWFsIHByb3BlcnR5IG5hbWUgdGhhdCBpbmRpY2F0ZXMgYW4gZW5jb2RpbmcgdGhhdCBuZWVkcyBzcGVjaWFsXG4gKiBkZWNvZGluZy5cbiAqL1xuY29uc3QgUUNMQVNTPSdAcWNsYXNzJzskaOKAjV9vbmNlLlFDTEFTUyhRQ0xBU1MpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2VuY29kZWQgaXMgRW5jb2RpbmdVbmlvbn1cbiAqL1xuY29uc3QgaGFzUUNsYXNzPShlbmNvZGVkKT0+aGFzT3duUHJvcGVydHlPZihlbmNvZGVkLFFDTEFTUyk7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RlZFxuICogQHBhcmFtIHtzdHJpbmd9IHFjbGFzc1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHFjbGFzc01hdGNoZXM9KGVuY29kZWQscWNsYXNzKT0+XG5pc09iamVjdChlbmNvZGVkKSYmXG4haXNBcnJheShlbmNvZGVkKSYmXG5oYXNRQ2xhc3MoZW5jb2RlZCkmJlxuZW5jb2RlZFtRQ0xBU1NdPT09cWNsYXNzO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvQ2FwRGF0YU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmdcbiAqICkgPT4gRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPShyZW0pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycik9PkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9DYXBEYXRhT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9DYXBEYXRhPShlbmNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9ZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGE9ZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YT1kb250RW5jb2RlRXJyb3JUb0NhcERhdGF9PVxuZW5jb2RlT3B0aW9ucztcblxuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb0NhcERhdGFgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9DYXBEYXRhYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgYXMgW1FDTEFTU10gY29tcG9zaXRlcy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ3N0cmluZyc6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm57W1FDTEFTU106J3VuZGVmaW5lZCd9O1xuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybntbUUNMQVNTXTonTmFOJ307XG4gfWVsc2UgaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106J0luZmluaXR5J307XG4gfWVsc2UgaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOictSW5maW5pdHknfTtcbiB9XG4vKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG5yZXR1cm4gaXMocGFzc2FibGUsLTApPzA6cGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybntcbltRQ0xBU1NdOidiaWdpbnQnLFxuZGlnaXRzOlN0cmluZyhwYXNzYWJsZSl9O1xuXG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybntcbltRQ0xBU1NdOidzeW1ib2wnLFxubmFtZX07XG5cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGhhc093blByb3BlcnR5T2YocGFzc2FibGUsUUNMQVNTKSl7XG4vKiBIaWxiZXJ0IGhvdGVsKi9cbmNvbnN0e1tRQ0xBU1NdOnFjbGFzc1ZhbHVlLC4uLnJlc3R9PXBhc3NhYmxlO1xuLyoqIEB0eXBlIHtFbmNvZGluZ30gKi9cbmNvbnN0IHJlc3VsdD17XG5bUUNMQVNTXTonaGlsYmVydCcsXG5vcmlnaW5hbDplbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSl9O1xuXG5pZihvd25LZXlzKHJlc3QpLmxlbmd0aD49MSl7XG4vKiBXZSBoYXJkZW4gdGhlIGVudGlyZSBjYXBEYXRhIGVuY29kaW5nIGJlZm9yZSB3ZSByZXR1cm4gaXQuKi9cbi8qIGBlbmNvZGVUb0NhcERhdGFgIHJlcXVpcmVzIHRoYXQgaXRzIGlucHV0IGJlIFBhc3NhYmxlLCBhbmQqL1xuLyogdGhlcmVmb3JlIGhhcmRlbmVkLiovXG4vKiBUaGUgYGZyZWV6ZWAgaGVyZSBpcyBuZWVkZWQgYW55d2F5LCBiZWNhdXNlIHRoZSBgcmVzdGAgaXMqL1xuLyogZnJlc2hseSBjb25zdHJ1Y3RlZCBieSB0aGUgYC4uLmAgYWJvdmUsIGFuZCB3ZSdyZSB1c2luZyBpdCovXG4vKiBhcyBpbXB1dCBpbiBhbm90aGVyIGNhbGwgdG8gYGVuY29kZVRvQ2FwRGF0YWAuKi9cbnJlc3VsdC5yZXN0PWVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gfVxuY2FzZSd0YWdnZWQnOntcbnJldHVybntcbltRQ0xBU1NdOid0YWdnZWQnLFxudGFnOmdldFRhZyhwYXNzYWJsZSksXG5wYXlsb2FkOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpfTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YShcbnBhc3NhYmxlLFxuZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuXG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTKVxuIH0gJHtxKCdzbG90Jyl9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cik7XG5pZihxY2xhc3NNYXRjaGVzKGVuY29kZWQsJ3Nsb3QnKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidzbG90JylcbiB9OiAke2VuY29kZWR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBlbmNvZGVkPWVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnZXJyb3InKSl7XG5yZXR1cm4gZW5jb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MsXG4nZXJyb3InKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xucmV0dXJuIGhhcmRlbihlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSxlbmNvZGVUb0NhcERhdGFSZWN1cikpO1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gKFByb21pc2V8UmVtb3RhYmxlKX0gW2RlY29kZVByb21pc2VGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbUNhcERhdGFdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShzbG90RW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0oZXJyb3JFbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJvckVuY29kaW5nfWA7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaFxuICogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uXG4gKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZVxuICogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS5cbiAqXG4gKiBUaGlzIHNlZW1zIGxpa2UgdGhlIGJlc3Qgc3RhcnRpbmcgcG9pbnQgdG8gaW5jcmVtZW50YWxseSBldm9sdmUgdG8gYW5cbiAqIEFQSSB3aGVyZSB0aGVzZSBjYW4gcmVsaWFibHkgZGlmZmVyLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNFxuICpcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IEVuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tQ2FwRGF0YT0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGE9ZG9udERlY29kZUVycm9yRnJvbUNhcERhdGF9PVxuZGVjb2RlT3B0aW9ucztcblxuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9PT1kZWNvZGVQcm9taXNlRnJvbUNhcERhdGF8fFxuRmFpbCBgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKVxuIH0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuLyoqXG4gKiBgZGVjb2RlRnJvbUNhcERhdGFgIG1heSByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGpzb25FbmNvZGVkYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9DYXBEYXRhYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tQ2FwRGF0YWAgY2Fubm90IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBqc29uRW5jb2RlZCBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21DYXBEYXRhPShqc29uRW5jb2RlZCk9PntcbmlmKCFpc09iamVjdChqc29uRW5jb2RlZCkpe1xuLyogcHJpbWl0aXZlcyBwYXNzIHRocm91Z2gqL1xucmV0dXJuIGpzb25FbmNvZGVkO1xuIH1cbmlmKGlzQXJyYXkoanNvbkVuY29kZWQpKXtcbnJldHVybiBqc29uRW5jb2RlZC5tYXAoKGVuY29kZWRWYWwpPT5kZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gfWVsc2UgaWYoaGFzUUNsYXNzKGpzb25FbmNvZGVkKSl7XG5jb25zdCBxY2xhc3M9anNvbkVuY29kZWRbUUNMQVNTXTtcbnR5cGVvZiBxY2xhc3M9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG5zd2l0Y2gocWNsYXNzKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZSctSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e2RpZ2l0c309anNvbkVuY29kZWQ7XG50eXBlb2YgZGlnaXRzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xucmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBEZXByZWNhdGVkIHFjbGFzcy4gVE9ETyBtYWtlIGNvbmRpdGlvbmFsKi9cbi8qIG9uIGVudmlyb25tZW50IHZhcmlhYmxlLiBFdmVudHVhbGx5IHJlbW92ZSwgYnV0IGFmdGVyIGNvbmZpZGVudCovXG4vKiB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHN1cHBvcnRlZCBzZW5kZXJzLiovXG4vKiovXG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xucmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7bmFtZX09anNvbkVuY29kZWQ7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7dGFnLHBheWxvYWR9PWpzb25FbmNvZGVkO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLGRlY29kZUZyb21DYXBEYXRhKHBheWxvYWQpKTtcbiB9XG5jYXNlJ3Nsb3QnOntcbi8qIFNlZSBub3RlIGFib3ZlIGFib3V0IGhvdyB0aGUgY3VycmVudCBlbmNvZGluZyBjYW5ub3QgcmVsaWFibHkqL1xuLyogZGlzdGluZ3Vpc2ggd2hpY2ggd2Ugc2hvdWxkIGNhbGwsIHNvIGluIHRoZSBub24tZGVmYXVsdCBjYXNlKi9cbi8qIGJvdGggbXVzdCBiZSB0aGUgc2FtZSBhbmQgaXQgZG9lc24ndCBtYXR0ZXIgd2hpY2ggd2UgY2FsbC4qL1xuY29uc3QgZGVjb2RlZD1kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG4vKiBCRVdBUkU6IGNhcGRhdGEgZG9lcyBub3QgY2hlY2sgdGhhdCBgZGVjb2RlZGAgaXMqL1xuLyogYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLCBzaW5jZSB0aGF0IHdvdWxkIGJyZWFrIHNvbWUqL1xuLyogY2FwZGF0YSBjbGllbnRzLiBXZSBhcmUgZGVwcmVjYXRpbmcgY2FwZGF0YSwgYW5kIHRoZXNlIGNsaWVudHMqL1xuLyogd2lsbCBuZWVkIHRvIHVwZGF0ZSBiZWZvcmUgc3dpdGNoaW5nIHRvIHNtYWxsY2Fwcy4qL1xucmV0dXJuIGRlY29kZWQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZGVjb2RlZD1kZWNvZGVFcnJvckZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbmlmKHBhc3NTdHlsZU9mKGRlY29kZWQpPT09J2Vycm9yJyl7XG5yZXR1cm4gZGVjb2RlZDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e29yaWdpbmFsLHJlc3R9PWpzb25FbmNvZGVkO1xuaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwnb3JpZ2luYWwnKXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuLyogRG9uJ3QgaGFyZGVuIHNpbmNlIHdlJ3JlIG5vdCBkb25lIG11dGF0aW5nIGl0Ki9cbmNvbnN0IHJlc3VsdD17W1FDTEFTU106ZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpfTtcbmlmKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ3Jlc3QnKSl7XG5jb25zdCBpc05vbkVtcHR5T2JqZWN0PVxudHlwZW9mIHJlc3Q9PT0nb2JqZWN0JyYmXG5yZXN0IT09bnVsbCYmXG5vd25LZXlzKHJlc3QpLmxlbmd0aD49MTtcbmlmKCFpc05vbkVtcHR5T2JqZWN0KXtcbnRocm93IEZhaWwgYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuIH1cbmNvbnN0IHJlc3RPYmo9ZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4vKiBUT0RPIHJlYWxseSBzaG91bGQgYXNzZXJ0IHRoYXQgYHBhc3NTdHlsZU9mKHJlc3QpYCBpcyovXG4vKiBgJ2NvcHlSZWNvcmQnYCBidXQgd2UnZCBoYXZlIHRvIGhhcmRlbiBpdCBhbmQgaXQgaXMgdG9vKi9cbi8qIGVhcmx5IHRvIGRvIHRoYXQuKi9cbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RPYmosUUNMQVNTKXx8XG5GYWlsIGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG5kZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHJlc3RPYmopKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBpcyB0aGUgZXJyb3IgY2FzZSB3ZSdyZSB0ZXN0aW5nIGZvciovXG5jYXNlJ2liaWQnOntcbnRocm93IEZhaWwgYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxucWNsYXNzKVxuIH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNle1xuYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZD09PSdvYmplY3QnJiZqc29uRW5jb2RlZCE9PW51bGwpO1xuY29uc3QgZGVjb2RlRW50cnk9KFtuYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGpzb25FbmNvZGVkKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbUNhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJRQ0xBU1MiOlsiUUNMQVNTIl0sIm1ha2VFbmNvZGVUb0NhcERhdGEiOlsibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiOlsibWFrZURlY29kZUZyb21DYXBEYXRhIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALNe92vFOwAAxTsAAC0AAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIiwibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImlzRXJyb3JMaWtlXCIsIFskaOKAjV9hID0+IChpc0Vycm9yTGlrZSA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG4vKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nfSBTbWFsbGNhcHNFbmNvZGluZyAqWC8qL1xuLyogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ1VuaW9ufSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICpYLyovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZ1VuaW9uICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2lzLGVudHJpZXMsZnJvbUVudHJpZXN9PU9iamVjdDtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3QgQkFORz0nIScuY2hhckNvZGVBdCgwKTtcbmNvbnN0IERBU0g9Jy0nLmNoYXJDb2RlQXQoMCk7XG5cbi8qKlxuICogQW4gYGVuY29kZVRvU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhIHBhc3NhYmxlIGFuZCByZXR1cm5zIGFcbiAqIEpTT04tcmVwcmVzZW50YWJsZSBvYmplY3QgKGkuZS4sIHJvdW5kLXRyaXBwaW5nIGl0IHRocm91Z2hcbiAqIGBKU09OLnN0cmluZ2lmeWAgYW5kIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlcGxhY2VycyBvciByZXZpdmVyc1xuICogcmV0dXJucyBhbiBlcXVpdmFsZW50IHN0cnVjdHVyZSBleGNlcHQgZm9yIG9iamVjdCBpZGVudGl0eSkuXG4gKiBXZSBjYWxsIHRoaXMgcmVwcmVzZW50YXRpb24gYSBTbWFsbGNhcHMgRW5jb2RpbmcuXG4gKlxuICogQSBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYXMgYXJndW1lbnQgd2hhdCBpdFxuICogKmFzc3VtZXMqIGlzIHRoZSByZXN1bHQgb2YgYSBwbGFpbiBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXNvbHZlci4gSXQgdGhlblxuICogbXVzdCB2YWxpZGF0ZSB0aGF0IGl0IGlzIGEgdmFsaWQgU21hbGxjYXBzIEVuY29kaW5nLCBhbmQgaWYgaXQgaXMsXG4gKiByZXR1cm4gYSBjb3JyZXNwb25kaW5nIHBhc3NhYmxlLlxuICpcbiAqIFNtYWxsY2FwcyBjb25zaWRlcnMgdGhlIGNoYXJhY3RlcnMgYmV0d2VlbiBgIWAgKGFzY2lpIGNvZGUgMzMsIEJBTkcpXG4gKiBhbmQgYC1gIChhc2NpaSBjb2RlIDQ1LCBEQVNIKSB0byBiZSBzcGVjaWFsIHByZWZpeGVzIGFsbG93aW5nXG4gKiByZXByZXNlbnRhdGlvbiBvZiBKU09OLWluY29tcGF0aWJsZSBkYXRhIHVzaW5nIHN0cmluZ3MuXG4gKiBUaGVzZSBjaGFyYWN0ZXJzLCBpbiBvcmRlciwgYXJlIGAhXCIjJCUmJygpKissLWBcbiAqIE9mIHRoZXNlLCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgKiBgIWAgLSBlc2NhcGVkIHN0cmluZ1xuICogICogYCtgIC0gbm9uLW5lZ2F0aXZlIGJpZ2ludFxuICogICogYC1gIC0gbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgI2AgLSBtYW5pZmVzdCBjb25zdGFudFxuICogICogYCVgIC0gc3ltYm9sXG4gKiAgKiBgJGAgLSByZW1vdGFibGVcbiAqICAqIGAmYCAtIHByb21pc2VcbiAqXG4gKiBBbGwgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIChgXCInKCkqLGApIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS5cbiAqXG4gKiBUaGUgbWFuaWZlc3QgY29uc3RhbnRzIHRoYXQgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIGZvciB2YWx1ZXM6XG4gKiAgKiBgI3VuZGVmaW5lZGBcbiAqICAqIGAjTmFOYFxuICogICogYCNJbmZpbml0eWBcbiAqICAqIGAjLUluZmluaXR5YFxuICpcbiAqIGFuZCBmb3IgcHJvcGVydHkgbmFtZXMgYW5hbG9nb3VzIHRvIGNhcGRhdGEgQHFjbGFzczpcbiAqICAqIGAjdGFnYFxuICogICogYCNlcnJvcmBcbiAqXG4gKiBBbGwgb3RoZXIgZW5jb2RlZCBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGAjYCBhcmUgcmVzZXJ2ZWQgZm9yXG4gKiBmdXR1cmUgdXNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkU3RyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3Qgc3RhcnRzU3BlY2lhbD0oZW5jb2RlZFN0cik9PntcbmlmKGVuY29kZWRTdHI9PT0nJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuLyogY2hhckNvZGVBdCgwKSBhbmQgbnVtYmVyIGNvbXBhcmUgaXMgYSBiaXQgZmFzdGVyLiovXG5jb25zdCBjb2RlPWVuY29kZWRTdHIuY2hhckNvZGVBdCgwKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB5b2RhKi9cbnJldHVybiBCQU5HPD1jb2RlJiZjb2RlPD1EQVNIO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGUsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZUVycm9yVG9TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW0pPT5cbkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9tKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHM9KGVycik9PlxuRmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7cShlcnIpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnN9IFtlbmNvZGVPcHRpb25zXVxuICogZW5jb2RlT3B0aW9ucyBpcyBhY3R1YWxseSBvcHRpb25hbCwgYnV0IG5vdCBtYXJrZWQgYXMgc3VjaCB0byB3b3JrIGFyb3VuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MDI4NlxuICpcbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb1NtYWxsY2Fwcz0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzPWRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzfT1cbmVuY29kZU9wdGlvbnM7XG5cbmNvbnN0IGFzc2VydEVuY29kZWRFcnJvcj0oZW5jb2RpbmcpPT57XG50eXBlb2YgZW5jb2Rpbmc9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG5lbmNvZGluZylcbiB9YDtcbi8qIEFzc2VydCB0aGF0IHRoZSAjZXJyb3IgcHJvcGVydHkgZGVjb2RlcyB0byBhIHN0cmluZy4qL1xuY29uc3QgbWVzc2FnZT1lbmNvZGluZ1snI2Vycm9yJ107XG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnJiYoXG4hc3RhcnRzU3BlY2lhbChtZXNzYWdlKXx8bWVzc2FnZS5zdGFydHNXaXRoKCchJykpfHxcbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuIH07XG5cbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRlbHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHJldHVybnMge1NtYWxsY2Fwc0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9TbWFsbGNhcHNgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9TbWFsbGNhcHNgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyPShwYXNzYWJsZSk9Pntcbi8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGludG8gc21hbGxjYXBzIHN0cmluZ3MuKi9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOntcbi8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoc3RhcnRzU3BlY2lhbChwYXNzYWJsZSkpe1xuLyogU3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYSBzcGVjaWFsIGNoYXIgYXJlIHF1b3RlZCB3aXRoIGAhYC4qL1xuLyogU2luY2UgYCFgIGlzIGl0c2VsZiBhIHNwZWNpYWwgY2hhcmFjdGVyLCB0aGlzIHRyaXZpYWxseSBkb2VzKi9cbi8qIHRoZSBIaWxiZXJ0IGhvdGVsLiBBbHNvLCBzaW5jZSB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJzIGFyZSovXG4vKiBhIGNvbnRpbnVvdXMgc3VicmFuZ2Ugb2YgYXNjaWksIHRoaXMgcXVvdGluZyBpcyBzb3J0LW9yZGVyKi9cbi8qIHByZXNlcnZpbmcuKi9cbnJldHVybiBgISR7cGFzc2FibGV9YDtcbiB9XG4vKiBBbGwgb3RoZXIgc3RyaW5ncyBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybicjdW5kZWZpbmVkJztcbiB9XG5jYXNlJ251bWJlcic6e1xuLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm4nI05hTic7XG4gfWVsc2UgaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm4nI0luZmluaXR5JztcbiB9ZWxzZSBpZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm4nIy1JbmZpbml0eSc7XG4gfVxuLyogUGFzcyB0aHJvdWdoIGV2ZXJ5dGhpbmcgZWxzZSwgcmVwbGFjaW5nIC0wIHdpdGggMC4qL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdCBzdHI9U3RyaW5nKHBhc3NhYmxlKTtcbnJldHVybiAoLyoqIEB0eXBlIHtiaWdpbnR9ICovcGFzc2FibGU8MG4/c3RyOmArJHtzdHJ9YCk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyoqIEB0eXBlIHtzdHJpbmd9ICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybiBgJSR7bmFtZX1gO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogQ3VycmVudGx5IGNvcHlSZWNvcmQgYWxsb3dzIG9ubHkgc3RyaW5nIGtleXMgc28gdGhpcyB3aWxsKi9cbi8qIHdvcmsuIElmIHdlIGFsbG93IHNvcnRhYmxlIHN5bWJvbCBrZXlzLCB0aGlzIHdpbGwgbmVlZCB0byovXG4vKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W1xuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuJyN0YWcnOmVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG5wYXlsb2FkOmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyQnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJFwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LnN0YXJ0c1dpdGgoJyYnKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbmFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSB0byBhY2NvbW1vZGF0ZSBlcnJvcnMgdGhhdCBhcmUgbm90Ki9cbi8qIHZhbGlkIFBhc3NhYmxlcy4gRm9yIGV4YW1wbGUsIGJlY2F1c2UgdGhleSdyZSBub3QgZnJvemVuLiovXG4vKiBUaGUgc3BlY2lhbCBjYXNlIGNhbiBvbmx5IGV2ZXIgYXBwbHkgYXQgdGhlIHJvb3QsIGFuZCB0aGVyZWZvcmUqL1xuLyogb3V0c2lkZSB0aGUgcmVjdXJzaW9uLCBzaW5jZSBhbiBlcnJvciBjb3VsZCBvbmx5IGJlIGRlZXBlciBpbiovXG4vKiBhIHBhc3NhYmxlIHN0cnVjdHVyZSBpZiBpdCB3ZXJlIHBhc3NhYmxlLiovXG4vKiovXG4vKiBXZSBwdWxsIG91dCB0aGlzIHNwZWNpYWwgY2FzZSBiZWNhdXNlLCBmb3IgdGhlc2UgZXJyb3JzLCB3ZSdyZSBtdWNoKi9cbi8qIG1vcmUgaW50ZXJlc3RlZCBpbiByZXBvcnRpbmcgd2hhdGV2ZXIgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiB0aGV5Ki9cbi8qIGNhcnJ5IHRoYW4gd2UgYXJlIGFib3V0IHJlcG9ydGluZyBwcm9ibGVtcyBlbmNvdW50ZXJlZCBpbiByZXBvcnRpbmcqL1xuLyogdGhpcyBpbmZvcm1hdGlvbi4qL1xuY29uc3QgcmVzdWx0PWhhcmRlbihcbmVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cikpO1xuXG5hc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcz0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfT1cbmRlY29kZU9wdGlvbnM7XG5cbi8qKlxuICogYGRlY29kZUZyb21TbWFsbGNhcHNgIG1heSByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGVuY29kaW5nYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9TbWFsbGNhcHNgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21TbWFsbGNhcHNgIGNhbm5vdCByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge1NtYWxsY2Fwc0VuY29kaW5nfSBlbmNvZGluZyBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+e1xuc3dpdGNoKHR5cGVvZiBlbmNvZGluZyl7XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGluZztcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5jb25zdCBjPWVuY29kaW5nLmNoYXJBdCgwKTtcbnN3aXRjaChjKXtcbmNhc2UnISc6e1xuLyogdW4taGlsYmVydC1pZnkgdGhlIHN0cmluZyovXG5yZXR1cm4gZW5jb2Rpbmcuc2xpY2UoMSk7XG4gfVxuY2FzZSclJzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kaW5nLnNsaWNlKDEpKTtcbiB9XG5jYXNlJyMnOntcbnN3aXRjaChlbmNvZGluZyl7XG5jYXNlJyN1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZScjTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnI0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZScjLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfVxuY2FzZScrJzpcbmNhc2UnLSc6e1xucmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gfVxuY2FzZSckJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncmVtb3RhYmxlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSByZW1vdGFibGU6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJyYnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbmlmKHBhc3NTdHlsZU9mKHJlc3VsdCkhPT0ncHJvbWlzZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFNwZWNpYWwgY2hhciAke3EoXG5jKVxuIH0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6ICR7ZW5jb2Rpbmd9YDtcbiB9fVxuXG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGVuY29kaW5nPT09bnVsbCl7XG5yZXR1cm4gZW5jb2Rpbmc7XG4gfVxuXG5pZihpc0FycmF5KGVuY29kaW5nKSl7XG5yZXR1cm4gZW5jb2RpbmcubWFwKCh2YWwpPT5kZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI3RhZycpKXtcbmNvbnN0eycjdGFnJzp0YWcscGF5bG9hZCwuLi5yZXN0fT1lbmNvZGluZztcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG5yZXR1cm4gbWFrZVRhZ2dlZChcbmRlY29kZUZyb21TbWFsbGNhcHModGFnKSxcbmRlY29kZUZyb21TbWFsbGNhcHMocGF5bG9hZCkpO1xuXG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjZXJyb3InKSl7XG5jb25zdCByZXN1bHQ9ZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxucGFzc1N0eWxlT2YocmVzdWx0KT09PSdlcnJvcid8fFxuRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cblxuY29uc3QgZGVjb2RlRW50cnk9KFtlbmNvZGVkTmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBlbmNvZGVkTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5IG5hbWUgJHtxKFxuZW5jb2RlZE5hbWUpXG4gfSBvZiAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiFlbmNvZGVkTmFtZS5zdGFydHNXaXRoKCcjJyl8fFxuRmFpbCBgVW5yZWNvZ25pemVkIHJlY29yZCB0eXBlICR7cShlbmNvZGVkTmFtZSl9OiAke2VuY29kaW5nfWA7XG5jb25zdCBuYW1lPWRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZE5hbWUpO1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBEZWNvZGVkIHByb3BlcnR5IG5hbWUgJHtuYW1lfSBmcm9tICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkVmFsKV07XG4gfTtcbmNvbnN0IGRlY29kZWRFbnRyaWVzPWVudHJpZXMoZW5jb2RpbmcpLm1hcChkZWNvZGVFbnRyeSk7XG5yZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogdW5yZWNvZ25pemVkIEpTT04gdHlwZW9mICR7cShcbnR5cGVvZiBlbmNvZGluZylcbiB9OiAke2VuY29kaW5nfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVuY29kZVRvU21hbGxjYXBzIjpbIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAIQpL9rCoAAKwqAAAqAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL21hcnNoYWwtanVzdGluLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImRlY29kZVRvSnVzdGluIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxnZXRFcnJvckNvbnN0cnVjdG9yLGlzT2JqZWN0LHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxRQ0xBU1M7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaOKAjV9hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIiwgWyRo4oCNX2EgPT4gKFFDTEFTUyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DYXBEYXRhPFQ+fSBDYXBEYXRhICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3N0cmluZ2lmeTpxdW90ZX09SlNPTjtcbmNvbnN0e3F1b3RlOnEsZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbmRlbnRlclxuICogQHByb3BlcnR5IHsob3BlbkJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBvcGVuXG4gKiBAcHJvcGVydHkgeygpID0+IG51bWJlcn0gbGluZVxuICogQHByb3BlcnR5IHsodG9rZW46IHN0cmluZykgPT4gbnVtYmVyfSBuZXh0XG4gKiBAcHJvcGVydHkgeyhjbG9zZUJyYWNrZXQ6IHN0cmluZykgPT4gbnVtYmVyfSBjbG9zZVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGRvbmVcbiAqL1xuXG4vKipcbiAqIEdlbmVyb3VzIHdoaXRlc3BhY2UgZm9yIHJlYWRhYmlsaXR5XG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlWWVzSW5kZW50ZXI9KCk9PntcbmNvbnN0IHN0cmluZ3M9W107XG5sZXQgbGV2ZWw9MDtcbmxldCBuZWVkU3BhY2U9ZmFsc2U7XG5jb25zdCBsaW5lPSgpPT57XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKCdcXG4nLCcgICcucmVwZWF0KGxldmVsKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT57XG5sZXZlbCs9MTtcbmlmKG5lZWRTcGFjZSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KTtcbiB9LFxubGluZSxcbm5leHQ6KHRva2VuKT0+e1xuaWYobmVlZFNwYWNlJiZ0b2tlbiE9PScsJyl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9dHJ1ZTtcbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuYXNzZXJ0KGxldmVsPj0xKTtcbmxldmVsLT0xO1xubGluZSgpO1xucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT57XG5hc3NlcnQuZXF1YWwobGV2ZWwsMCk7XG5yZXR1cm4gc3RyaW5ncy5qb2luKCcnKTtcbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIElmIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBvbmUgdG9rZW4gdG9nZXRoZXIgd2l0aCB0aGUgZmlyc3QgY2hhcmFjdGVyXG4gKiBvZiB0aGUgbmV4dCB0b2tlbiBtYXRjaGVzIHRoaXMgcGF0dGVybiwgdGhlbiB0aGUgdHdvIHRva2VucyBtdXN0IGJlXG4gKiBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZSB0byBwcmVzZXJ2ZSB0aGVpciBtZWFuaW5nLiBPdGhlcndpc2UgdGhlXG4gKiB3aGl0ZXNwYWNlIGluIHVubmVjZXNzYXJ5LlxuICpcbiAqIFRoZSBgPCFgIGFuZCBgLT5gIGNhc2VzIHByZXZlbnQgdGhlIGFjY2lkZW50YWwgZm9ybWF0aW9uIG9mIGFuXG4gKiBodG1sLWxpa2UgY29tbWVudC4gSSBkb24ndCB0aGluayB0aGUgZG91YmxlIGFuZ2xlIGJyYWNrZXRzIGFyZSBhY3R1YWxseVxuICogbmVlZGVkIGJ1dCBJIGhhdmVuJ3QgdGhvdWdodCBhYm91dCBpdCBlbm91Z2ggdG8gcmVtb3ZlIHRoZW0uXG4gKi9cbmNvbnN0IGJhZFBhaXJQYXR0ZXJuPS9eKD86XFx3XFx3fDw8fD4+fFxcK1xcK3wtLXw8IXwtPikkLztcblxuLyoqXG4gKiBNaW5pbXVtIHdoaXRlc3BhY2UgbmVlZGVkIHRvIHByZXNldmUgbWVhbmluZy5cbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyPSgpPT57XG4vKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuY29uc3Qgc3RyaW5ncz1bXTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT5zdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpLFxubGluZTooKT0+c3RyaW5ncy5sZW5ndGgsXG5uZXh0Oih0b2tlbik9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xKXtcbmNvbnN0IGxhc3Q9c3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXTtcbmlmKGxhc3QubGVuZ3RoPj0xJiZ0b2tlbi5sZW5ndGg+PTEpe1xuY29uc3QgcGFpcj0gYCR7bGFzdFtsYXN0Lmxlbmd0aC0xXX0ke3Rva2VuWzBdfWA7XG5pZihiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbiB9XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSYmc3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXT09PScsJyl7XG5zdHJpbmdzLnBvcCgpO1xuIH1cbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+c3RyaW5ncy5qb2luKCcnKX0pO1xuXG4gfTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuPS9eW2EtekEtWl1cXHcqJC87XG5oYXJkZW4oaWRlbnRQYXR0ZXJuKTtcbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuPS9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGVuY29kaW5nXG4gKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGRJbmRlbnRcbiAqIEBwYXJhbSB7YW55W119IFtzbG90c11cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGRlY29kZVRvSnVzdGluPShlbmNvZGluZyxzaG91bGRJbmRlbnQ9ZmFsc2Usc2xvdHM9W10pPT57XG4vKipcbiAqIFRoZSBmaXJzdCBwYXNzIGRvZXMgc29tZSBpbnB1dCB2YWxpZGF0aW9uLlxuICogSXRzIGNvbnRyb2wgZmxvdyBzaG91bGQgbWlycm9yIGByZWN1cmAgYXMgY2xvc2VseSBhcyBwb3NzaWJsZVxuICogYW5kIHRoZSB0d28gc2hvdWxkIGJlIG1haW50YWluZWQgdG9nZXRoZXIuIFRoZXkgbXVzdCB2aXNpdCBldmVyeXRoaW5nXG4gKiBpbiB0aGUgc2FtZSBvcmRlci5cbiAqXG4gKiBUT0RPIG5vdyB0aGF0IGliaWRzIGFyZSBnb25lLCB3ZSBzaG91bGQgZm9sZCB0aGlzIGJhY2sgdG9nZXRoZXIgaW50b1xuICogb25lIHZhbGlkYXRpbmcgcGFzcy5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgcHJlcGFyZT0ocmF3VHJlZSk9PntcbmlmKCFpc09iamVjdChyYXdUcmVlKSl7XG5yZXR1cm47XG4gfVxuLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG50eXBlb2YgcWNsYXNzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdOYU4nOlxuY2FzZSdJbmZpbml0eSc6XG5jYXNlJy1JbmZpbml0eSc6e1xucmV0dXJuO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG50eXBlb2YgZGlnaXRzPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xucmV0dXJuO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG5yZXR1cm47XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbnJldHVybjtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKHRhZywnc3RyaW5nJyk7XG5wcmVwYXJlKHBheWxvYWQpO1xucmV0dXJuO1xuIH1cbmNhc2Unc2xvdCc6e1xuY29uc3R7aW5kZXgsaWZhY2V9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGluZGV4LCdudW1iZXInKTtcbk5hdChpbmRleCk7XG5pZihpZmFjZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKGlmYWNlLCdzdHJpbmcnKTtcbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xuJ29yaWdpbmFsJ2luIHJhd1RyZWV8fFxuRmFpbCBgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xucHJlcGFyZShvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmlmKHR5cGVvZiByZXN0IT09J29iamVjdCcpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0YDtcbiB9XG5pZihyZXN0PT09bnVsbCl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gfVxuaWYoaXNBcnJheShyZXN0KSl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgYW4gYXJyYXlgO1xuIH1cbmlmKFFDTEFTUyBpbiByZXN0KXtcbnRocm93IEZhaWwgYFJlc3QgZW5jb2RpbmcgJHtyZXN0fSBtdXN0IG5vdCBjb250YWluICR7cShRQ0xBU1MpfWA7XG4gfVxuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG5wcmVwYXJlKHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm47XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgbmFtZSl9YDtcbmdldEVycm9yQ29uc3RydWN0b3IobmFtZSkhPT11bmRlZmluZWR8fFxuRmFpbCBgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWA7XG5yZXR1cm47XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xucHJlcGFyZShyYXdUcmVlW2ldKTtcbiB9XG4gfWVsc2V7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJhd1RyZWUpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiB9XG5wcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuIH1cbiB9XG4gfTtcblxuY29uc3QgbWFrZUluZGVudGVyPXNob3VsZEluZGVudD9tYWtlWWVzSW5kZW50ZXI6bWFrZU5vSW5kZW50ZXI7XG5sZXQgb3V0PW1ha2VJbmRlbnRlcigpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIHJlY3Vyc2lvbiBhZnRlciB0aGUgZmlyc3QgcGFzcyBgcHJlcGFyZWAuXG4gKiBUaGUgZmlyc3QgcGFzcyBkaWQgc29tZSBpbnB1dCB2YWxpZGF0aW9uIHNvXG4gKiBoZXJlIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGV2ZXJ5dGhpbmcgdGhvc2UgdGhpbmdzIGFyZSB2YWxpZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlPShyYXdUcmVlKT0+e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiByZWN1cihyYXdUcmVlKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVQcm9wZXJ0eT0obmFtZSx2YWx1ZSk9Pntcbm91dC5saW5lKCk7XG5pZihuYW1lPT09J19fcHJvdG9fXycpe1xuLyogSmF2YVNjcmlwdCBpbnRlcnByZXRzIGB7X19wcm90b19fOiB4LCAuLi59YCovXG4vKiBhcyBtYWtpbmcgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgeGAsIHdoZXJlYXMqL1xuLyogaW4gSlNPTiBpdCBpcyBzaW1wbHkgYSBwcm9wZXJ0eSBuYW1lLiBQcmVzZXJ2ZSB0aGUqL1xuLyogSlNPTiBtZWFuaW5nLiovXG5vdXQubmV4dCggYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiB9ZWxzZSBpZihpZGVudFBhdHRlcm4udGVzdChuYW1lKSl7XG5vdXQubmV4dCggYCR7bmFtZX06YCk7XG4gfWVsc2V7XG5vdXQubmV4dCggYCR7cXVvdGUobmFtZSl9OmApO1xuIH1cbmRlY29kZSh2YWx1ZSk7XG5vdXQubmV4dCgnLCcpO1xuIH07XG5cbi8qKlxuICogTW9kZWxlZCBhZnRlciBgZnVsbFJldml2ZWAgaW4gbWFyc2hhbC5qc1xuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJlY3VyPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbi8qIHByaW1pdGl2ZXMgZ2V0IHF1b3RlZCovXG5yZXR1cm4gb3V0Lm5leHQocXVvdGUocmF3VHJlZSkpO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihxY2xhc3MsJ3N0cmluZycpO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbi8qIFN3aXRjaGluZyBvbiBgZW5jb2RlZFtRQ0xBU1NdYCAob3IgYW55dGhpbmcgbGVzcyBkaXJlY3QsIGxpa2UqL1xuLyogYHFjbGFzc2ApIGRvZXMgbm90IGRpc2NyaW1pbmF0ZSByYXdUcmVlIGluIHR5cGVzY3JpcHRANC4yLjMgYW5kKi9cbi8qIGVhcmxpZXIuKi9cbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbi8qIFRoZWlyIHFjbGFzcyBpcyB0aGVpciBleHByZXNzaW9uIHNvdXJjZS4qL1xucmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoZGlnaXRzLCdzdHJpbmcnKTtcbnJldHVybiBvdXQubmV4dCggYCR7QmlnSW50KGRpZ2l0cyl9bmApO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBUT0RPIGRlcHJlY2F0ZWQuIEV2ZW50dWFsbHkgcmVtb3ZlLiovXG5yZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuY29uc3Qgc3ltPXBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbmFzc2VydC50eXBlb2Yoc3ltLCdzeW1ib2wnKTtcbmNvbnN0IHJlZ2lzdGVyZWROYW1lPVN5bWJvbC5rZXlGb3Ioc3ltKTtcbmlmKHJlZ2lzdGVyZWROYW1lPT09dW5kZWZpbmVkKXtcbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5hc3NlcnQobWF0Y2ghPT1udWxsKTtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmFzc2VydChTeW1ib2xbc3VmZml4XT09PXN5bSk7XG5hc3NlcnQoaWRlbnRQYXR0ZXJuLnRlc3Qoc3VmZml4KSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gfVxucmV0dXJuIG91dC5uZXh0KCBgU3ltYm9sLmZvcigke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xub3V0Lm5leHQoIGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX0sYCk7XG5kZWNvZGUocGF5bG9hZCk7XG5yZXR1cm4gb3V0Lm5leHQoJyknKTtcbiB9XG5cbmNhc2Unc2xvdCc6e1xubGV0e2lmYWNlfT1yYXdUcmVlO1xuY29uc3QgaW5kZXg9TnVtYmVyKE5hdChyYXdUcmVlLmluZGV4KSk7XG5jb25zdCBuZXN0ZWRSZW5kZXI9KGFyZyk9PntcbmNvbnN0IG9sZE91dD1vdXQ7XG50cnl7XG5vdXQ9bWFrZU5vSW5kZW50ZXIoKTtcbmRlY29kZShhcmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfWZpbmFsbHl7XG5vdXQ9b2xkT3V0O1xuIH1cbiB9O1xuaWYoaW5kZXg8c2xvdHMubGVuZ3RoKXtcbmNvbnN0IHNsb3Q9bmVzdGVkUmVuZGVyKHNsb3RzW2luZGV4XSk7XG5pZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90VG9WYWwoJHtzbG90fSlgKTtcbiB9XG5pZmFjZT1uZXN0ZWRSZW5kZXIoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdFRvVmFsKCR7c2xvdH0sJHtpZmFjZX0pYCk7XG4gfWVsc2UgaWYoaWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSlgKTtcbiB9XG5pZmFjZT1uZXN0ZWRSZW5kZXIoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSwke2lmYWNlfSlgKTtcbiB9XG5cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbm91dC5vcGVuKCd7Jyk7XG5kZWNvZGVQcm9wZXJ0eShRQ0xBU1Msb3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5hc3NlcnQudHlwZW9mKHJlc3QsJ29iamVjdCcpO1xuYXNzZXJ0KHJlc3QhPT1udWxsKTtcbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYFByb3BlcnR5IG5hbWUgJHtxKFxubmFtZSlcbiB9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gfVxuZGVjb2RlUHJvcGVydHkobmFtZSxyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cblxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xucmV0dXJuIG91dC5uZXh0KCBgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gfWVsc2V7XG5vdXQub3BlbignWycpO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5vdXQubGluZSgpO1xuZGVjb2RlKHJhd1RyZWVbaV0pO1xub3V0Lm5leHQoJywnKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gfVxuIH1lbHNle1xuLyogcmF3VHJlZSBpcyBhbiBgRW5jb2RpbmdSZWNvcmRgIHdoaWNoIG9ubHkgaGFzIHN0cmluZyBrZXlzLCovXG4vKiBidXQgc2luY2Ugb3duS2V5cyBpcyBub3QgZ2VuZXJpYywgaXQgY2FuJ3QgcHJvcGFnYXRlIHRoYXQqL1xuY29uc3QgbmFtZXM9LyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJhd1RyZWUpO1xuaWYobmFtZXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ3t9Jyk7XG4gfWVsc2V7XG5vdXQub3BlbigneycpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuZGVjb2RlUHJvcGVydHkobmFtZSxyYXdUcmVlW25hbWVdKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuIH1cbiB9O1xucHJlcGFyZShlbmNvZGluZyk7XG5kZWNvZGUoZW5jb2RpbmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfTskaOKAjV9vbmNlLmRlY29kZVRvSnVzdGluKGRlY29kZVRvSnVzdGluKTtcbmhhcmRlbihkZWNvZGVUb0p1c3Rpbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAE9PVG9wGAADcBgAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlTWFyc2hhbDskaOKAjV9pbXBvcnRzKFtbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90PSh2YWwpPT5cbkZhaWwgYE1hcnNoYWwncyBzdHJpbmdpZnkgcmVqZWN0cyBwcmVzZW5jZXMgYW5kIHByb21pc2VzICR7dmFsfWA7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbD0oc2xvdCxfaWZhY2UpPT5cbkZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXI9aGFyZGVuKHtcbmdldDooX3RhcmdldCxuYW1lLF9yZWNlaXZlcik9PntcbmlmKG5hbWU9PT0nbGVuZ3RoJyl7XG5yZXR1cm4gMDtcbiB9XG4vKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG50aHJvdyBGYWlsIGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90IHBvc2l0aW9ucyAke25hbWV9YDtcbiB9fSk7XG5cblxuY29uc3QgYmFkQXJyYXk9aGFyZGVuKG5ldyBQcm94eShoYXJkZW4oW10pLGJhZEFycmF5SGFuZGxlcikpO1xuXG5jb25zdHtzZXJpYWxpemUsdW5zZXJpYWxpemV9PW1ha2VNYXJzaGFsKFxuZG9Ob3RDb252ZXJ0VmFsVG9TbG90LFxuZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxue1xuZXJyb3JUYWdnaW5nOidvZmYnLFxuLyogVE9ETyBmaXggdGVzdHMgdG8gd29ya3Mgd2l0aCBzbWFsbGNhcHMuKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J2NhcGRhdGEnfSk7XG5cblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc3RyaW5naWZ5PSh2YWwpPT5zZXJpYWxpemUodmFsKS5ib2R5OyRo4oCNX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IHBhcnNlPShzdHIpPT5cbnVuc2VyaWFsaXplKFxuaGFyZGVuKHtcbmJvZHk6c3RyLFxuc2xvdHM6YmFkQXJyYXl9KSk7JGjigI1fb25jZS5wYXJzZShwYXJzZSk7XG5cblxuaGFyZGVuKHBhcnNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdpZnkiOlsic3RyaW5naWZ5Il0sInBhcnNlIjpbInBhcnNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAL6eaUrsMgAA7DIAACMAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiLCJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsaGFzT3duUHJvcGVydHlPZixRQ0xBU1MsbWFrZUVuY29kZVRvQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbUNhcERhdGEsbWFrZURlY29kZUZyb21TbWFsbGNhcHMsbWFrZUVuY29kZVRvU21hbGxjYXBzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjigI1fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLk1ha2VNYXJzaGFsT3B0aW9uc30gTWFrZU1hcnNoYWxPcHRpb25zICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBDb252ZXJ0U2xvdFRvVmFsICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBDb252ZXJ0VmFsVG9TbG90ICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Ub0NhcERhdGE8U2xvdD59IFRvQ2FwRGF0YSAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRnJvbUNhcERhdGE8U2xvdD59IEZyb21DYXBEYXRhICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUge0NvbnZlcnRWYWxUb1Nsb3Q8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbj0oeCk9Png7XG4vKiogQHR5cGUge0NvbnZlcnRTbG90VG9WYWw8YW55Pn0gKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbj0oeCxfKT0+eDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgU2xvdFxuICogQHBhcmFtIHtDb252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBbY29udmVydFZhbFRvU2xvdF1cbiAqIEBwYXJhbSB7Q29udmVydFNsb3RUb1ZhbDxTbG90Pn0gW2NvbnZlcnRTbG90VG9WYWxdXG4gKiBAcGFyYW0ge01ha2VNYXJzaGFsT3B0aW9uc30gb3B0aW9uc1xuICovXG5jb25zdCAgICAgICAgbWFrZU1hcnNoYWw9KFxuY29udmVydFZhbFRvU2xvdD1kZWZhdWx0VmFsVG9TbG90Rm4sXG5jb252ZXJ0U2xvdFRvVmFsPWRlZmF1bHRTbG90VG9WYWxGbixcbntcbmVycm9yVGFnZ2luZz0nb24nLFxubWFyc2hhbE5hbWU9J2Fub24tbWFyc2hhbCcsXG4vKiBUT0RPIFRlbXBvcmFyeSBoYWNrLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzgwKi9cbmVycm9ySWROdW09MTAwMDAsXG4vKiBXZSBwcmVmZXIgdGhhdCB0aGUgY2FsbGVyIGluc3RlYWQgbG9nIHRvIHNvbWV3aGVyZSBoaWRkZW4qL1xuLyogdG8gYmUgcmV2ZWFsZWQgd2hlbiBjb3JyZWxhdGluZyB3aXRoIHRoZSByZWNlaXZlZCBlcnJvci4qL1xubWFyc2hhbFNhdmVFcnJvcj0oZXJyKT0+XG5jb25zb2xlLmxvZygnVGVtcG9yYXJ5IGxvZ2dpbmcgb2Ygc2VudCBlcnJvcicsZXJyKSxcbi8qIERlZmF1bHQgdG8gJ2NhcGRhdGEnIGJlY2F1c2UgaXQgd2FzIGltcGxlbWVudGVkIGZpcnN0LiovXG4vKiBTb21ldGltZXMsIG9udG9nZW55IGRvZXMgcmVjYXBpdHVsYXRlIHBoeWxvZ2VueSA7KSovXG5zZXJpYWxpemVCb2R5Rm9ybWF0PSdjYXBkYXRhJ309XG57fSk9Plxue1xuYXNzZXJ0LnR5cGVvZihtYXJzaGFsTmFtZSwnc3RyaW5nJyk7XG5lcnJvclRhZ2dpbmc9PT0nb24nfHxcbmVycm9yVGFnZ2luZz09PSdvZmYnfHxcbkZhaWwgYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG5jb25zdCBuZXh0RXJyb3JJZD0oKT0+e1xuZXJyb3JJZE51bSs9MTtcbnJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7VG9DYXBEYXRhPFNsb3Q+fVxuICovXG5jb25zdCB0b0NhcERhdGE9KHJvb3QpPT57XG5jb25zdCBzbG90cz1bXTtcbi8qIG1hcHMgdmFsIChwcm9taXNlIG9yIHJlbW90YWJsZSkgdG8gaW5kZXggb2Ygc2xvdHNbXSovXG5jb25zdCBzbG90TWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZSB8IFByb21pc2V9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7e2luZGV4OiBudW1iZXIsIHJlcGVhdDogYm9vbGVhbn19XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RDb21tb249KHBhc3NhYmxlKT0+e1xubGV0IGluZGV4PXNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbmlmKGluZGV4IT09dW5kZWZpbmVkKXtcbi8qIFRPRE8gYXNzZXJ0IHRoYXQgaXQncyB0aGUgc2FtZSBpZmFjZSBhcyBiZWZvcmUqL1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6dHJ1ZX0pO1xuIH1cblxuaW5kZXg9c2xvdHMubGVuZ3RoO1xuY29uc3Qgc2xvdD1jb252ZXJ0VmFsVG9TbG90KHBhc3NhYmxlKTtcbnNsb3RzLnB1c2goc2xvdCk7XG5zbG90TWFwLnNldChwYXNzYWJsZSxpbmRleCk7XG5yZXR1cm4gaGFyZGVuKHtpbmRleCxyZXBlYXQ6ZmFsc2V9KTtcbiB9O1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIGlzRXJyb3JMaWtlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHVua25vd259IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX1cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JDb21tb249KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IG1lc3NhZ2U9ZW5jb2RlUmVjdXIoIGAke2Vyci5tZXNzYWdlfWApO1xuYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCdzdHJpbmcnKTtcbmNvbnN0IG5hbWU9ZW5jb2RlUmVjdXIoIGAke2Vyci5uYW1lfWApO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbi8qIE11c3QgZW5jb2RlIGBjYXVzZWAsIGBlcnJvcnNgLiovXG4vKiBuZXN0ZWQgbm9uLXBhc3NhYmxlIGVycm9ycyBtdXN0IGJlIG9rIGZyb20gaGVyZS4qL1xuaWYoZXJyb3JUYWdnaW5nPT09J29uJyl7XG4vKiBXZSBkZWxpYmVyYXRlbHkgZG8gbm90IHNoYXJlIHRoZSBzdGFjaywgYnV0IGl0IHdvdWxkKi9cbi8qIGJlIHVzZWZ1bCB0byBsb2cgdGhlIHN0YWNrIGxvY2FsbHkgc28gc29tZW9uZSB3aG8gaGFzKi9cbi8qIHByaXZpbGVnZWQgYWNjZXNzIHRvIHRoZSB0aHJvd2luZyBWYXQgY2FuIGNvcnJlbGF0ZSovXG4vKiB0aGUgcHJvYmxlbSB3aXRoIHRoZSByZW1vdGUgVmF0IHRoYXQgZ2V0cyB0aGlzKi9cbi8qIHN1bW1hcnkuIElmIHdlIGRvIHRoYXQsIHdlIGNvdWxkIGFsbG9jYXRlIHNvbWUgcmFuZG9tKi9cbi8qIGlkZW50aWZpZXIgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIG1lc3NhZ2UsIHRvIGhlbHAqL1xuLyogd2l0aCB0aGUgY29ycmVsYXRpb24uKi9cbmNvbnN0IGVycm9ySWQ9ZW5jb2RlUmVjdXIobmV4dEVycm9ySWQoKSk7XG5hc3NlcnQudHlwZW9mKGVycm9ySWQsJ3N0cmluZycpO1xuYXNzZXJ0Lm5vdGUoZXJyLFggYFNlbnQgYXMgJHtlcnJvcklkfWApO1xubWFyc2hhbFNhdmVFcnJvcihlcnIpO1xucmV0dXJuIGhhcmRlbih7ZXJyb3JJZCxtZXNzYWdlLG5hbWV9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe21lc3NhZ2UsbmFtZX0pO1xuIH1cbiB9O1xuXG5pZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J2NhcGRhdGEnKXtcbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhPShwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaW5kZXh9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpZmFjZSxpbmRleH0pO1xuIH1cbiB9O1xuXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHZhbCxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEodmFsLGdldEludGVyZmFjZU9mKHZhbCkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9DYXBEYXRhPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YShwcm9taXNlKTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBpc0Vycm9yTGlrZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ30gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidlcnJvcicsLi4uZXJyRGF0YX0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT1tYWtlRW5jb2RlVG9DYXBEYXRhKHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9DYXBEYXRhKHJvb3QpO1xuY29uc3QgYm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuYm9keSxcbnNsb3RzfSk7XG5cbiB9ZWxzZSBpZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J3NtYWxsY2Fwcycpe1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVTbG90VG9TbWFsbGNhcHM9KHByZWZpeCxwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4vKiBUT0RPIGV4cGxvcmUgcmVtb3ZpbmcgdGhpcyBzcGVjaWFsIGNhc2UqL1xuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gfVxucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbW90YWJsZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcscmVtb3RhYmxlLGdldEludGVyZmFjZU9mKHJlbW90YWJsZSkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyYnLHByb21pc2UpO1xuXG5jb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5jb25zdHttZXNzYWdlLC4uLnJlc3R9PWVyckRhdGE7XG5yZXR1cm4gaGFyZGVuKHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3R9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz1tYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbi8qIFZhbGlkIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYSB2YWxpZCBzaWduYWwqL1xuLyogaW5kaWNhdGluZyBzbWFsbGNhcHMgZm9ybWF0LiovXG5ib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuc2xvdHN9KTtcblxuIH1lbHNle1xuLyogVGhlIGB0aHJvd2AgaXMgYSBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEFkZGVkIGZvciBjb25mdXNlZCBsaW50ZXJzLiovXG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VGdWxsUmV2aXZlPShzbG90cyk9Pntcbi8qKiBAdHlwZSB7TWFwPG51bWJlciwgUGFzc2FibGU+fSAqL1xuY29uc3QgdmFsTWFwPW5ldyBNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge3tpZmFjZT86IHN0cmluZywgaW5kZXg6IG51bWJlcn19IHNsb3REYXRhXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlIHwgUHJvbWlzZX1cbiAqL1xuY29uc3QgZGVjb2RlU2xvdENvbW1vbj0oc2xvdERhdGEpPT57XG5jb25zdHtpZmFjZT11bmRlZmluZWQsaW5kZXgsLi4ucmVzdH09c2xvdERhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbmlmKHZhbE1hcC5oYXMoaW5kZXgpKXtcbnJldHVybiB2YWxNYXAuZ2V0KGluZGV4KTtcbiB9XG4vKiBUT0RPIFNFQ1VSSVRZIEhBWkFSRDogbXVzdCBlbmZvY2UgdGhhdCByZW1vdGFibGUgdnMgcHJvbWlzZSovXG4vKiBpcyBhY2NvcmRpbmcgdG8gdGhlIGVuY29kZWQgc3RyaW5nLiovXG5jb25zdCBzbG90PXNsb3RzW051bWJlcihOYXQoaW5kZXgpKV07XG5jb25zdCB2YWw9Y29udmVydFNsb3RUb1ZhbChzbG90LGlmYWNlKTtcbnZhbE1hcC5zZXQoaW5kZXgsdmFsKTtcbnJldHVybiB2YWw7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319IGVyckRhdGFcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBkZWNvZGVSZWN1clxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5jb25zdCBkZWNvZGVFcnJvckNvbW1vbj0oZXJyRGF0YSxkZWNvZGVSZWN1cik9PntcbmNvbnN0e2Vycm9ySWQ9dW5kZWZpbmVkLG1lc3NhZ2UsbmFtZSwuLi5yZXN0fT1lcnJEYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuLyogVE9ETyBNdXN0IGRlY29kZSBgY2F1c2VgIGFuZCBgZXJyb3JzYCBwcm9wZXJ0aWVzKi9cbi8qIGNhcERhdGEgZG9lcyBub3QgdHJhbnNmb3JtIHN0cmluZ3MuIFRoZSBjYWxscyB0byBgZGVjb2RlUmVjdXJgKi9cbi8qIGFyZSBmb3IgcmV1c2UgYnkgb3RoZXIgZW5jb2RpbmdzIHRoYXQgZG8sIHN1Y2ggYXMgc21hbGxjYXBzLiovXG5jb25zdCBkTmFtZT1kZWNvZGVSZWN1cihuYW1lKTtcbmNvbnN0IGRNZXNzYWdlPWRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuY29uc3QgZEVycm9ySWQ9ZXJyb3JJZCYmZGVjb2RlUmVjdXIoZXJyb3JJZCk7XG50eXBlb2YgZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG50eXBlb2YgZE1lc3NhZ2U9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgZE1lc3NhZ2UpfWA7XG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKGROYW1lKXx8RXJyb3I7XG4vKiBlcnJvcklkIGlzIGEgbGF0ZSBhZGRpdGlvbiBzbyBiZSB0b2xlcmFudCBvZiBpdHMgYWJzZW5jZS4qL1xuY29uc3QgZXJyb3JOYW1lPVxuZEVycm9ySWQ9PT11bmRlZmluZWQ/XG4gYFJlbW90ZSR7RUMubmFtZX1gOlxuIGBSZW1vdGUke0VDLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG5jb25zdCBlcnJvcj1hc3NlcnQuZXJyb3IoZE1lc3NhZ2UsRUMse2Vycm9yTmFtZX0pO1xucmV0dXJuIGhhcmRlbihlcnJvcik7XG4gfTtcblxuLyogVGhlIGN1cnJlbnQgZW5jb2RpbmcgZG9lcyBub3QgZ2l2ZSB0aGUgZGVjb2RlciBlbm91Z2ggaW50byB0byBkaXN0aW5ndWlzaCovXG4vKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb24qL1xuLyogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUqL1xuLyogcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNCovXG5jb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0ocmF3VHJlZSxfZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLnNsb3REYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuIH07XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGE9KHJhd1RyZWUsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLmVyckRhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbUNhcERhdGE9bWFrZURlY29kZUZyb21DYXBEYXRhKHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2Fwcz0ocHJlZml4KT0+e1xuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nRW5jb2RpbmdcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBfZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtSZW1vdGFibGUgfCBQcm9taXNlfVxuICovXG5yZXR1cm4oc3RyaW5nRW5jb2RpbmcsX2RlY29kZVJlY3VyKT0+e1xuYXNzZXJ0KHN0cmluZ0VuY29kaW5nLnN0YXJ0c1dpdGgocHJlZml4KSk7XG4vKiBzbG90czogJHNsb3RJbmRleC5pZmFjZSBvciAkc2xvdEluZGV4Ki9cbmNvbnN0IGk9c3RyaW5nRW5jb2RpbmcuaW5kZXhPZignLicpO1xuY29uc3QgaW5kZXg9TnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsaTwwP3VuZGVmaW5lZDppKSk7XG4vKiBpIDwgMCBtZWFucyB0aGVyZSB3YXMgbm8gaWZhY2UgaW5jbHVkZWQuKi9cbmNvbnN0IGlmYWNlPWk8MD91bmRlZmluZWQ6c3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSsxKTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHtpZmFjZSxpbmRleH0pO1xuIH07XG4gfTtcbmNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG5jb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyxkZWNvZGVSZWN1cik9PntcbmNvbnN0eycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdEVyckRhdGF9PWVuY29kaW5nO1xuIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsJ21lc3NhZ2UnKXx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX0sZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHM9bWFrZURlY29kZUZyb21TbWFsbGNhcHMoe1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbmRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc30pO1xuIH07XG5cbi8qKlxuICogQHR5cGUge0Zyb21DYXBEYXRhPFNsb3Q+fVxuICovXG5jb25zdCBmcm9tQ2FwRGF0YT0oZGF0YSk9PntcbmNvbnN0e2JvZHksc2xvdHN9PWRhdGE7XG50eXBlb2YgYm9keT09PSdzdHJpbmcnfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5ib2R5IGlzICR7Ym9keX0sIG5vdCBzdHJpbmcpYDtcbmlzQXJyYXkoZGF0YS5zbG90cyl8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbmNvbnN0e3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9PW1ha2VGdWxsUmV2aXZlKHNsb3RzKTtcbmxldCByZXN1bHQ7XG4vKiBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGFuIHVuYW1iaWd1b3VzIHNpZ25hbC4qL1xuaWYoYm9keS5zdGFydHNXaXRoKCcjJykpe1xuY29uc3Qgc21hbGxjYXBzQm9keT1ib2R5LnNsaWNlKDEpO1xuY29uc3QgZW5jb2Rpbmc9aGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tU21hbGxjYXBzKGVuY29kaW5nKSk7XG4gfWVsc2V7XG5jb25zdCByYXdUcmVlPWhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbUNhcERhdGEocmF3VHJlZSkpO1xuIH1cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzcqL1xuLyogd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZml4ZWQgb25jZSB3ZSd2ZSBjb21wbGV0ZWQgdGhlIHN3aXRjaCovXG4vKiB0byBzbWFsbGNhcHMuKi9cbmFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbnJldHVybiBoYXJkZW4oe1xudG9DYXBEYXRhLFxuZnJvbUNhcERhdGEsXG5cbi8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSovXG4vKiogQGRlcHJlY2F0ZWQgdXNlIHRvQ2FwRGF0YSAqL1xuc2VyaWFsaXplOnRvQ2FwRGF0YSxcbi8qKiBAZGVwcmVjYXRlZCB1c2UgZnJvbUNhcERhdGEgKi9cbnVuc2VyaWFsaXplOmZyb21DYXBEYXRhfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZU1hcnNoYWwobWFrZU1hcnNoYWwpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFdEZAp+QAAAfkAAACUAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlUGFzc2FibGUuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGdldFRhZyxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvdmVyfSBSYW5rQ292ZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb21wYXJpc29ufSBSYW5rQ29tcGFyaXNvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzLHNldFByb3RvdHlwZU9mLGlzfT1PYmplY3Q7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFua0NvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGdWxsQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbbnVtYmVyLCBudW1iZXJdfSBJbmRleENvdmVyXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIHVzZWQgYnkgSmF2YVNjcmlwdCdzIE1hcCBhbmQgU2V0XG4gKiBhYnN0cmFjdGlvbnMsIHdoZXJlIE5hTiBpcyB0aGUgc2FtZSBhcyBOYU4gYW5kIC0wIGlzIHRoZSBzYW1lIGFzXG4gKiAwLiBNYXJzaGFsIHNlcmlhbGl6ZXMgLTAgYXMgemVybywgc28gdGhlIHNlbWFudGljcyBvZiBvdXIgZGlzdHJpYnV0ZWRcbiAqIG9iamVjdCBzeXN0ZW0gZG9lcyBub3QgZGlzdGluZ3Vpc2ggMCBmcm9tIC0wLlxuICpcbiAqIGBzYW1lVmFsdWVaZXJvYCBpcyB0aGUgRWNtYVNjcmlwdCBzcGVjIG5hbWUgZm9yIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbixcbiAqIGJ1dCBUT0RPIHdlIG5lZWQgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIEFQSS5cbiAqXG4gKiBAcGFyYW0ge2FueX0geFxuICogQHBhcmFtIHthbnl9IHlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvPSh4LHkpPT54PT09eXx8aXMoeCx5KTtcblxuY29uc3QgdHJpdmlhbENvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSwgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG5sZWZ0PHJpZ2h0Py0xOmxlZnQ9PT1yaWdodD8wOjE7XG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxQYXNzU3R5bGUsIHsgaW5kZXg6IG51bWJlciwgY292ZXI6IFJhbmtDb3ZlciB9Pn0gUGFzc1N0eWxlUmFua3NSZWNvcmRcbiAqL1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcz0vKiogQHR5cGUge1Bhc3NTdHlsZVJhbmtzUmVjb3JkfSAqL1xuZnJvbUVudHJpZXMoXG5lbnRyaWVzKHBhc3NTdHlsZVByZWZpeGVzKVxuLyogU29ydCBlbnRyaWVzIGJ5IGFzY2VuZGluZyBwcmVmaXguKi8uXG5zb3J0KChbX2xlZnRTdHlsZSxsZWZ0UHJlZml4ZXNdLFtfcmlnaHRTdHlsZSxyaWdodFByZWZpeGVzXSk9PntcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0UHJlZml4ZXMscmlnaHRQcmVmaXhlcyk7XG4gfSkuXG5tYXAoKFtwYXNzU3R5bGUscHJlZml4ZXNdLGluZGV4KT0+e1xuLyogQ292ZXIgYWxsIHN0cmluZ3MgdGhhdCBzdGFydCB3aXRoIGFueSBjaGFyYWN0ZXIgaW4gYHByZWZpeGVzYCwqL1xuLyogdmVyaWZ5aW5nIHRoYXQgaXQgaXMgc29ydGVkIHNvIHRoYXQgaXMqL1xuLyogYWxsIHMgc3VjaCB0aGF0IHByZWZpeGVzLmF0KDApIOKJpCBzIDwgc3VjY2Vzc29yKHByZWZpeGVzLmF0KC0xKSkuKi9cbnByZWZpeGVzPT09Wy4uLnByZWZpeGVzXS5zb3J0KCkuam9pbignJyl8fFxuRmFpbCBgdW5zb3J0ZWQgcHJlZml4ZXMgZm9yIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7cShwcmVmaXhlcyl9YDtcbmNvbnN0IGNvdmVyPVtcbnByZWZpeGVzLmNoYXJBdCgwKSxcblN0cmluZy5mcm9tQ2hhckNvZGUocHJlZml4ZXMuY2hhckNvZGVBdChwcmVmaXhlcy5sZW5ndGgtMSkrMSldO1xuXG5yZXR1cm5bcGFzc1N0eWxlLHtpbmRleCxjb3Zlcn1dO1xuIH0pKTtcblxuXG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qKlxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKlxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldFBhc3NTdHlsZUNvdmVyPShwYXNzU3R5bGUpPT5wYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRo4oCNX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxXZWFrU2V0PFBhc3NhYmxlW10+Pn1cbiAqL1xuY29uc3QgbWVtb09mU29ydGVkPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsUmFua0NvbXBhcmU+fVxuICovXG5jb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZT19IGNvbXBhcmVSZW1vdGFibGVzXG4gKiBBbiBvcHRpb24gdG8gY3JlYXRlIGEgY29tcGFyYXRvciBpbiB3aGljaCBhbiBpbnRlcm5hbCBvcmRlciBpc1xuICogYXNzaWduZWQgdG8gcmVtb3RhYmxlcy4gVGhpcyBkZWZhdWx0cyB0byBhIGNvbXBhcmF0b3IgdGhhdFxuICogYWx3YXlzIHJldHVybnMgYDBgLCBtZWFuaW5nIHRoYXQgYWxsIHJlbW90YWJsZXMgYXJlIHRpZWRcbiAqIGZvciB0aGUgc2FtZSByYW5rLlxuICogQHJldHVybnMge1JhbmtDb21wYXJhdG9yS2l0fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvbXBhcmF0b3JLaXQ9KGNvbXBhcmVSZW1vdGFibGVzPShfeCxfeSk9PjApPT57XG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgY29tcGFyYXRvcj0obGVmdCxyaWdodCk9PntcbmlmKHNhbWVWYWx1ZVplcm8obGVmdCxyaWdodCkpe1xucmV0dXJuIDA7XG4gfVxuY29uc3QgbGVmdFN0eWxlPXBhc3NTdHlsZU9mKGxlZnQpO1xuY29uc3QgcmlnaHRTdHlsZT1wYXNzU3R5bGVPZihyaWdodCk7XG5pZihsZWZ0U3R5bGUhPT1yaWdodFN0eWxlKXtcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihcbnBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG5wYXNzU3R5bGVSYW5rc1tyaWdodFN0eWxlXS5pbmRleCk7XG5cbiB9XG4vKiBlc2xpbnQtZGlzYWJsZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzIC0tXG4gKiBXZSBrbm93IGBsZWZ0YCBhbmQgYHJpZ2h0YCBhcmUgY29tcGFyYWJsZS5cbiAqL1xuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3JlbW90YWJsZSc6e1xucmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xuLyogRm9yIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgYWxsIG1lbWJlcnMgb2YgdGhhdCBwYXNzU3R5bGUgYXJlIHRpZWQqL1xuLyogZm9yIHRoZSBzYW1lIHJhbmsuKi9cbnJldHVybiAwO1xuIH1cbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6e1xuLyogV2l0aGluIGVhY2ggb2YgdGhlc2UgcGFzc1N0eWxlcywgdGhlIHJhbmsgb3JkZXJpbmcgYWdyZWVzIHdpdGgqL1xuLyogSmF2YVNjcmlwdCdzIHJlbGF0aW9uYWwgb3BlcmF0b3JzIGA8YCBhbmQgYD5gLiovXG5pZihsZWZ0PHJpZ2h0KXtcbnJldHVybi0xO1xuIH1lbHNle1xuYXNzZXJ0KGxlZnQ+cmlnaHQpO1xucmV0dXJuIDE7XG4gfVxuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gY29tcGFyYXRvcihcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbm5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCkpO1xuXG4gfVxuY2FzZSdudW1iZXInOntcbi8qIGBOYU5gJ3MgcmFuayBpcyBhZnRlciBhbGwgb3RoZXIgbnVtYmVycy4qL1xuaWYoTnVtYmVyLmlzTmFOKGxlZnQpKXtcbmFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbnJldHVybi0xO1xuIH1cbi8qIFRoZSByYW5rIG9yZGVyaW5nIG9mIG5vbi1OYU4gbnVtYmVycyBhZ3JlZXMgd2l0aCBKYXZhU2NyaXB0J3MqL1xuLyogcmVsYXRpb25hbCBvcGVyYXRvcnMgJzwnIGFuZCAnPicuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGludmVyc2Ugc29ydGVkIG9yZGVyIG9mIHByb3BlcnR5IG5hbWVzLCB0aGVuKi9cbi8qIGxleGljb2dyYXBoaWMgYnkgY29ycmVzcG9uZGluZyB2YWx1ZXMgaW4gdGhhdCBzYW1lIGludmVyc2UqL1xuLyogb3JkZXIgb2YgdGhlaXIgcHJvcGVydHkgbmFtZXMuIENvbXBhcmluZyBuYW1lcyBieSB0aGVtc2VsdmVzIGZpcnN0LCovXG4vKiBhbGwgcmVjb3JkcyB3aXRoIHRoZSBleGFjdCBzYW1lIHNldCBvZiBwcm9wZXJ0eSBuYW1lcyBzb3J0IG5leHQgdG8qL1xuLyogZWFjaCBvdGhlciBpbiBhIHJhbmstc29ydCBvZiBjb3B5UmVjb3Jkcy4qL1xuXG4vKiBUaGUgY29weVJlY29yZCBpbnZhcmlhbnRzIGVuZm9yY2VkIGJ5IHBhc3NTdHlsZU9mIGVuc3VyZSB0aGF0Ki9cbi8qIGFsbCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIHN0cmluZ3MuIFdlIG5lZWQgdGhlIHJldmVyc2Ugc29ydGVkIG9yZGVyKi9cbi8qIG9mIHRoZXNlIG5hbWVzLCB3aGljaCB3ZSB0aGVuIGNvbXBhcmUgbGV4aWNvZ3JhcGhpY2FsbHkuIFRoaXMgZW5zdXJlcyovXG4vKiB0aGF0IGlmIHRoZSBuYW1lcyBvZiByZWNvcmQgWCBhcmUgYSBzdWJzZXQgb2YgdGhlIG5hbWVzIG9mIHJlY29yZCBZLCovXG4vKiB0aGVuIHJlY29yZCBYIHdpbGwgaGF2ZSBhbiBlYXJsaWVyIHJhbmsgYW5kIHNvcnQgdG8gdGhlIGxlZnQgb2YgWS4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnROYW1lcyxyaWdodE5hbWVzKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gY29tcGFyYXRvcihcbnJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyksXG5yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcykpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMqL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgd2VyZSB0aWVkLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBJZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBoYXMgYW4gZWFybGllciByYW5rIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBgW1N5bWJvbC50b1N0cmluZ1RhZ11gIHRoZW4gYC5wYXlsb2FkYC4qL1xuY29uc3QgbGFiZWxDb21wPWNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLGdldFRhZyhyaWdodCkpO1xuaWYobGFiZWxDb21wIT09MCl7XG5yZXR1cm4gbGFiZWxDb21wO1xuIH1cbnJldHVybiBjb21wYXJhdG9yKGxlZnQucGF5bG9hZCxyaWdodC5wYXlsb2FkKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gfX1cblxuLyogZXNsaW50LWVuYWJsZSAqL1xuIH07XG5cbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBhbnRpQ29tcGFyYXRvcj0oeCx5KT0+Y29tcGFyYXRvcih5LHgpO1xuXG5tZW1vT2ZTb3J0ZWQuc2V0KGNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5tZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xuY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoY29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcik7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvcixjb21wYXJhdG9yKTtcblxucmV0dXJuIGhhcmRlbih7Y29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcn0pO1xuIH07XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyZT19XG4gKi8kaOKAjV9vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbmNvbnN0ICAgICAgICBjb21wYXJhdG9yTWlycm9ySW1hZ2U9KGNvbXBhcmF0b3IpPT5cbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGFzc2FibGVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuY29tcGFyYXRvck1pcnJvckltYWdlKGNvbXBhcmF0b3JNaXJyb3JJbWFnZSk7XG5jb25zdCAgICAgICAgaXNSYW5rU29ydGVkPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5pZihzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpe1xucmV0dXJuIHRydWU7XG4gfVxuYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcyk9PT0nY29weUFycmF5Jyk7XG5mb3IobGV0IGk9MTtpPHBhc3NhYmxlcy5sZW5ndGg7aSs9MSl7XG5pZihjb21wYXJlKHBhc3NhYmxlc1tpLTFdLHBhc3NhYmxlc1tpXSk+PTEpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UmFua1NvcnRlZD0oc29ydGVkLGNvbXBhcmUpPT5cbmlzUmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSl8fFxuLyogVE9ETyBhc3NlcnQgb24gYnVnIGNvdWxkIGxlYWQgdG8gaW5maW5pdGUgcmVjdXJzaW9uLiBGaXguKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5GYWlsIGBNdXN0IGJlIHJhbmsgc29ydGVkOiAke3NvcnRlZH0gdnMgJHtzb3J0QnlSYW5rKHNvcnRlZCxjb21wYXJlKX1gOyRo4oCNX29uY2UuYXNzZXJ0UmFua1NvcnRlZChhc3NlcnRSYW5rU29ydGVkKTtcbmhhcmRlbihhc3NlcnRSYW5rU29ydGVkKTtcblxuLyoqXG4gKiBUT0RPIFNFQ1VSSVRZIEJVRzogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MjYwXG4gKiBzb3J0QnlSYW5rIGN1cnJlbnRseSB1c2VzIGBBcnJheS5wcm90b3R5cGUuc29ydGAgZGlyZWN0bHksIGFuZFxuICogc28gb25seSB3b3JrcyBjb3JyZWN0bHkgd2hlbiBnaXZlbiBhIGBjb21wYXJlYCBmdW5jdGlvbiB0aGF0IGNvbnNpZGVyc1xuICogYHVuZGVmaW5lZGAgc3RyaWN0bHkgYmlnZ2VyIChgPmApIHRoYW4gZXZlcnl0aGluZyBlbHNlLiBUaGlzIGlzXG4gKiBiZWNhdXNlIGBBcnJheS5wcm90b3R5cGUuc29ydGAgYml6YXJyZWx5IG1vdmVzIGFsbCBgdW5kZWZpbmVkYHMgdG9cbiAqIHRoZSBlbmQgb2YgdGhlIGFycmF5IHJlZ2FyZGxlc3MsIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgYGNvbXBhcmVgXG4gKiBmdW5jdGlvbi4gVGhpcyBpcyBhIGdlbnVpbmUgYnVnIGZvciB1cyBOT1cgYmVjYXVzZSBzb21ldGltZXMgd2Ugc29ydFxuICogaW4gcmV2ZXJzZSBvcmRlciBieSBwYXNzaW5nIGEgcmV2ZXJzZWQgcmFuayBjb21wYXJpc29uIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7SXRlcmFibGU8UGFzc2FibGU+fSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtQYXNzYWJsZVtdfVxuICovXG5jb25zdCAgICAgICAgc29ydEJ5UmFuaz0ocGFzc2FibGVzLGNvbXBhcmUpPT57XG5pZihBcnJheS5pc0FycmF5KHBhc3NhYmxlcykpe1xuaGFyZGVuKHBhc3NhYmxlcyk7XG4vKiBDYWxsaW5nIGlzUmFua1NvcnRlZCBnaXZlcyBpdCBhIGNoYW5jZSB0byBnZXQgbWVtb2l6ZWQgZm9yKi9cbi8qIHRoaXMgYGNvbXBhcmVgIGZ1bmN0aW9uIGV2ZW4gaWYgaXQgd2FzIGFscmVhZHkgbWVtb2l6ZWQgZm9yIGEgZGlmZmVyZW50Ki9cbi8qIGBjb21wYXJlYCBmdW5jdGlvbi4qL1xuaWYoaXNSYW5rU29ydGVkKHBhc3NhYmxlcyxjb21wYXJlKSl7XG5yZXR1cm4gcGFzc2FibGVzO1xuIH1cbiB9XG5jb25zdCB1bnNvcnRlZD1bLi4ucGFzc2FibGVzXTtcbnVuc29ydGVkLmZvckVhY2goaGFyZGVuKTtcbmNvbnN0IHNvcnRlZD1oYXJkZW4odW5zb3J0ZWQuc29ydChjb21wYXJlKSk7XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuc3ViTWVtb09mU29ydGVkLmFkZChzb3J0ZWQpO1xucmV0dXJuIHNvcnRlZDtcbiB9OyRo4oCNX29uY2Uuc29ydEJ5UmFuayhzb3J0QnlSYW5rKTtcbmhhcmRlbihzb3J0QnlSYW5rKTtcblxuLyoqXG4gKiBTZWVcbiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpbmFyeV9zZWFyY2hfYWxnb3JpdGhtI1Byb2NlZHVyZV9mb3JfZmluZGluZ190aGVfbGVmdG1vc3RfZWxlbWVudFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBrZXlcbiAqIEBwYXJhbSB7KFwibGVmdE1vc3RcIiB8IFwicmlnaHRNb3N0XCIpPX0gYmlhc1xuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmFua1NlYXJjaD0oc29ydGVkLGNvbXBhcmUsa2V5LGJpYXM9J2xlZnRNb3N0Jyk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xubGV0IGxlZnQ9MDtcbmxldCByaWdodD1zb3J0ZWQubGVuZ3RoO1xud2hpbGUobGVmdDxyaWdodCl7XG5jb25zdCBtPU1hdGguZmxvb3IoKGxlZnQrcmlnaHQpLzIpO1xuY29uc3QgY29tcD1jb21wYXJlKHNvcnRlZFttXSxrZXkpO1xuaWYoY29tcDw9LTF8fGNvbXA9PT0wJiZiaWFzPT09J3JpZ2h0TW9zdCcpe1xubGVmdD1tKzE7XG4gfWVsc2V7XG5hc3NlcnQoY29tcD49MXx8Y29tcD09PTAmJmJpYXM9PT0nbGVmdE1vc3QnKTtcbnJpZ2h0PW07XG4gfVxuIH1cbnJldHVybiBiaWFzPT09J2xlZnRNb3N0Jz9sZWZ0OnJpZ2h0LTE7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IHJhbmtDb3ZlclxuICogQHJldHVybnMge0luZGV4Q292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBnZXRJbmRleENvdmVyPShzb3J0ZWQsY29tcGFyZSxbbGVmdEtleSxyaWdodEtleV0pPT57XG5hc3NlcnRSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKTtcbmNvbnN0IGxlZnRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLGxlZnRLZXksJ2xlZnRNb3N0Jyk7XG5jb25zdCByaWdodEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUscmlnaHRLZXksJ3JpZ2h0TW9zdCcpO1xucmV0dXJuW2xlZnRJbmRleCxyaWdodEluZGV4XTtcbiB9OyRo4oCNX29uY2UuZ2V0SW5kZXhDb3ZlcihnZXRJbmRleENvdmVyKTtcbmhhcmRlbihnZXRJbmRleENvdmVyKTtcblxuLyoqIEB0eXBlIHtSYW5rQ292ZXJ9ICovXG5jb25zdCAgICAgICAgRnVsbFJhbmtDb3Zlcj1oYXJkZW4oWycnLCd7J10pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge0luZGV4Q292ZXJ9IGluZGV4Q292ZXJcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fVxuICovJGjigI1fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuY29uc3QgICAgICAgIGNvdmVyZWRFbnRyaWVzPShzb3J0ZWQsW2xlZnRJbmRleCxyaWdodEluZGV4XSk9Pntcbi8qKiBAdHlwZSB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn0gKi9cbmNvbnN0IGl0ZXJhYmxlPWhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xubGV0IGk9bGVmdEluZGV4O1xucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG5pZihpPD1yaWdodEluZGV4KXtcbmNvbnN0IGVsZW1lbnQ9c29ydGVkW2ldO1xuaSs9MTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlOltpLGVsZW1lbnRdLGRvbmU6ZmFsc2V9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe3ZhbHVlOnVuZGVmaW5lZCxkb25lOnRydWV9KTtcbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLmNvdmVyZWRFbnRyaWVzKGNvdmVyZWRFbnRyaWVzKTtcbmhhcmRlbihjb3ZlcmVkRW50cmllcyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBtYXhSYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKT49MD9hOmI7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBtaW5SYW5rPShjb21wYXJlLGEsYik9PmNvbXBhcmUoYSxiKTw9MD9hOmI7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgdW5pb25SYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCB1bmlvblJhbmtDb3ZlclBhaXI9KFtsZWZ0QSxyaWdodEFdLFtsZWZ0QixyaWdodEJdKT0+W1xubWluUmFuayhjb21wYXJlLGxlZnRBLGxlZnRCKSxcbm1heFJhbmsoY29tcGFyZSxyaWdodEEscmlnaHRCKV07XG5cbnJldHVybiBjb3ZlcnMucmVkdWNlKHVuaW9uUmFua0NvdmVyUGFpcixbJ3snLCcnXSk7XG4gfTskaOKAjV9vbmNlLnVuaW9uUmFua0NvdmVycyh1bmlvblJhbmtDb3ZlcnMpO1xuaGFyZGVuKHVuaW9uUmFua0NvdmVycyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgaW50ZXJzZWN0UmFua0NvdmVycz0oY29tcGFyZSxjb3ZlcnMpPT57XG4vKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgaW50ZXJzZWN0UmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5tYXhSYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWluUmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UoaW50ZXJzZWN0UmFua0NvdmVyUGFpcixbJycsJ3snXSk7XG4gfTskaOKAjV9vbmNlLmludGVyc2VjdFJhbmtDb3ZlcnMoaW50ZXJzZWN0UmFua0NvdmVycyk7XG5cbmNvbnN0ICAgICAgIHtjb21wYXJhdG9yOmNvbXBhcmVSYW5rLGFudGlDb21wYXJhdG9yOmNvbXBhcmVBbnRpUmFua309XG5tYWtlQ29tcGFyYXRvcktpdCgpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNvbXBhcmF0b3Iga2l0IGluIHdoaWNoIHJlbW90YWJsZXMgYXJlIGZ1bGx5IG9yZGVyZWRcbiAqIGJ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBmaXJzdCBzZWVuIGJ5ICp0aGlzKiBjb21wYXJhdG9yIGtpdC5cbiAqIEJFV0FSRTogVGhpcyBpcyBvYnNlcnZhYmxlIG11dGFibGUgc3RhdGUsIHNvIHN1Y2ggYSBjb21wYXJhdG9yIGtpdFxuICogc2hvdWxkIG5ldmVyIGJlIHNoYXJlZCBhbW9uZyBzdWJzeXN0ZW1zIHRoYXQgc2hvdWxkIG5vdCBiZSBhYmxlXG4gKiB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBvcmRlciBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgZm9yIHN0b3JlXG4gKiBvcmRlcmluZywgc2luY2UgaXQgaGFzIG5vIG1lbW9yeSBvZiBkZWxldGVkIGtleXMuXG4gKlxuICogVGhlc2UgZnVsbCBvcmRlciBjb21wYXJhdG9yIGtpdCBpcyBzdHJpY3RseSBtb3JlIHByZWNpc2UgdGhhdCB0aGVcbiAqIHJhbmsgb3JkZXIgY29tcGFyYXRvciBraXRzIGFib3ZlLiBBcyBhIHJlc3VsdCwgYW55IGFycmF5IHdoaWNoIGlzXG4gKiBzb3J0ZWQgYnkgc3VjaCBhIGZ1bGwgb3JkZXIgd2lsbCBwYXNzIHRoZSBpc1JhbmtTb3J0ZWQgdGVzdCB3aXRoXG4gKiBhIGNvcnJlc3BvbmRpbmcgcmFuayBvcmRlci5cbiAqXG4gKiBBbiBhcnJheSB3aGljaCBpcyBzb3J0ZWQgYnkgYSAqZnJlc2gqIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgaS5lLixcbiAqIG9uZSB0aGF0IGhhcyBub3QgeWV0IHNlZW4gYW55IHJlbW90YWJsZXMsIHdpbGwgb2YgY291cnNlIHJlbWFpblxuICogc29ydGVkIGJ5IGFjY29yZGluZyB0byAqdGhhdCogZnVsbCBvcmRlciBjb21wYXJhdG9yLiBBbiBhcnJheSAqb2ZcbiAqIHNjYWxhcnMqIHNvcnRlZCBieSBhIGZyZXNoIGZ1bGwgb3JkZXIgd2lsbCByZW1haW4gc29ydGVkIGV2ZW5cbiAqIGFjY29yZGluZyB0byBhIG5ldyBmcmVzaCBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIHNpbmNlIGl0IHdpbGwgc2VlXG4gKiB0aGUgcmVtb3RhYmxlcyBpbiB0aGUgc2FtZSBvcmRlciBhZ2Fpbi4gVW5mb3J0dW5hdGVseSwgdGhpcyBpc1xuICogbm90IHRydWUgb2YgYXJyYXlzIG9mIHBhc3NhYmxlcyBpbiBnZW5lcmFsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxvbmdMaXZlZFxuICogQHJldHVybnMge0Z1bGxDb21wYXJhdG9yS2l0fVxuICovJGjigI1fb25jZS5jb21wYXJlUmFuayhjb21wYXJlUmFuayk7JGjigI1fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0ICAgICAgICBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdD0obG9uZ0xpdmVkPWZhbHNlKT0+e1xubGV0IG51bVNlZW49MDtcbi8qIFdoZW4gZHluYW1pY2FsbHkgY3JlYXRlZCB3aXRoIHNob3J0IGxpZmV0aW1lcyAodGhlIGRlZmF1bHQpIGEgV2Vha01hcCovXG4vKiB3b3VsZCBwZXJmb3JtIHBvb3JseSwgYW5kIHRoZSBsZWFrIGNyZWF0ZWQgYnkgYSBNYXAgb25seSBsYXN0cyBhcyBsb25nKi9cbi8qIGFzIHRoZSBNYXAuKi9cbmNvbnN0IE1hcENvbnN0cnVjdG9yPWxvbmdMaXZlZD9XZWFrTWFwOk1hcDtcbmNvbnN0IHNlZW49bmV3IE1hcENvbnN0cnVjdG9yKCk7XG5jb25zdCB0YWc9KHIpPT57XG5pZihzZWVuLmhhcyhyKSl7XG5yZXR1cm4gc2Vlbi5nZXQocik7XG4gfVxubnVtU2Vlbis9MTtcbnNlZW4uc2V0KHIsbnVtU2Vlbik7XG5yZXR1cm4gbnVtU2VlbjtcbiB9O1xuY29uc3QgY29tcGFyZVJlbW90YWJsZXM9KHgseSk9PmNvbXBhcmVSYW5rKHRhZyh4KSx0YWcoeSkpO1xucmV0dXJuIG1ha2VDb21wYXJhdG9yS2l0KGNvbXBhcmVSZW1vdGFibGVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xuaGFyZGVuKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRQYXNzU3R5bGVDb3ZlciI6WyJnZXRQYXNzU3R5bGVDb3ZlciJdLCJtYWtlQ29tcGFyYXRvcktpdCI6WyJtYWtlQ29tcGFyYXRvcktpdCJdLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiOlsiY29tcGFyYXRvck1pcnJvckltYWdlIl0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiXSwiYXNzZXJ0UmFua1NvcnRlZCI6WyJhc3NlcnRSYW5rU29ydGVkIl0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayJdLCJnZXRJbmRleENvdmVyIjpbImdldEluZGV4Q292ZXIiXSwiRnVsbFJhbmtDb3ZlciI6WyJGdWxsUmFua0NvdmVyIl0sImNvdmVyZWRFbnRyaWVzIjpbImNvdmVyZWRFbnRyaWVzIl0sInVuaW9uUmFua0NvdmVycyI6WyJ1bmlvblJhbmtDb3ZlcnMiXSwiaW50ZXJzZWN0UmFua0NvdmVycyI6WyJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIl0sImNvbXBhcmVBbnRpUmFuayI6WyJjb21wYXJlQW50aVJhbmsiXSwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiOlsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAIQAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAlHpu9zwsAAM8LAAAeAAAAQGVuZG8vbmF0LXY0LjEuMjcvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRo4oCNX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsICduYW1lJywge3ZhbHVlOiBcIk5hdFwifSk7JGjigI1fb25jZS5OYXQoTmF0KTsgICAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbnJldHVybiBhbGxlZ2VkTnVtPj0wO1xuIH1cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtIT09J251bWJlcicpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxucmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pJiZhbGxlZ2VkTnVtPj0wO1xuIH1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIGFsbGVnZWROdW07XG4gfVxuXG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdudW1iZXInKXtcbmlmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gfVxuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gfVxuXG50aHJvdyBuZXcgVHlwZUVycm9yKFxuIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgKTtcblxuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGXyjBp8CAAAfAgAACAAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lcnJvci5qcyIsIi4vc3JjL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL21ha2UtZmFyLmpzIiwiLi9zcmMvbWFrZVRhZ2dlZC5qcyIsIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9yZW1vdGFibGUuanMiLCIuL3NyYy9zeW1ib2wuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImlzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvaXRlci1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXJyb3IuanNcIiwgW11dLFtcIi4vc3JjL3JlbW90YWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvc3ltYm9sLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2l0ZXItaGVscGVycy5qcyI6W1sibWFwSXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLFsiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSJdXSwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOltbIlBBU1NfU1RZTEUiLCJQQVNTX1NUWUxFIl0sWyJpc09iamVjdCIsImlzT2JqZWN0Il0sWyJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q2hlY2tlciJdLFsiZ2V0VGFnIiwiZ2V0VGFnIl0sWyJoYXNPd25Qcm9wZXJ0eU9mIiwiaGFzT3duUHJvcGVydHlPZiJdXSwiLi9zcmMvZXJyb3IuanMiOltbImdldEVycm9yQ29uc3RydWN0b3IiLCJnZXRFcnJvckNvbnN0cnVjdG9yIl0sWyJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSxbImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiXV0sIi4vc3JjL3JlbW90YWJsZS5qcyI6W1siZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdXSwiLi9zcmMvc3ltYm9sLmpzIjpbWyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sWyJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCJdLFsibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sWyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXV0sIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjpbWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl0sWyJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIl1dLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIjpbWyJtYWtlVGFnZ2VkIiwibWFrZVRhZ2dlZCJdXSwiLi9zcmMvbWFrZS1mYXIuanMiOltbIlJlbW90YWJsZSIsIlJlbW90YWJsZSJdLFsiRmFyIiwiRmFyIl0sWyJUb0ZhckZ1bmN0aW9uIiwiVG9GYXJGdW5jdGlvbiJdXSwiLi9zcmMvdHlwZUd1YXJkcy5qcyI6W1siYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVjb3JkIl0sWyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiXSxbImFzc2VydFJlbW90YWJsZSIsImFzc2VydFJlbW90YWJsZSJdLFsiaXNSZW1vdGFibGUiLCJpc1JlbW90YWJsZSJdLFsiaXNSZWNvcmQiLCJpc1JlY29yZCJdLFsiaXNDb3B5QXJyYXkiLCJpc0NvcHlBcnJheSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3ka2qpMHAACTBwAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXkscHJvdG90eXBlOmFycmF5UHJvdG90eXBlfT1BcnJheTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNhbkJlVmFsaWQ9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT5cbmlzQXJyYXkoY2FuZGlkYXRlKXx8XG4hIWNoZWNrJiZjaGVjayhmYWxzZSxYIGBBcnJheSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCk7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weUFycmF5SGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2NvcHlBcnJheScsXG5cbmNhbkJlVmFsaWQsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKT09PWFycmF5UHJvdG90eXBlfHxcbmFzc2VydC5mYWlsKFggYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogU2luY2Ugd2UncmUgYWxyZWFkeSBlbnN1cmVkIGNhbmRpZGF0ZSBpcyBhbiBhcnJheSwgaXQgc2hvdWxkIG5vdCBiZSovXG4vKiBwb3NzaWJsZSBmb3IgdGhlIGZvbGxvd2luZyB0ZXN0IHRvIGZhaWwqL1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ2xlbmd0aCcsZmFsc2UsYXNzZXJ0Q2hlY2tlcik7XG5jb25zdCBsZW49LyoqIEB0eXBlIHt1bmtub3duW119ICovY2FuZGlkYXRlLmxlbmd0aDtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsaSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qICsxIGZvciB0aGUgJ2xlbmd0aCcgcHJvcGVydHkgaXRzZWxmLiovXG5vd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoPT09bGVuKzF8fFxuYXNzZXJ0LmZhaWwoWCBgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmNhbmRpZGF0ZS5ldmVyeSgodik9PiEhcGFzc1N0eWxlT2ZSZWN1cih2KSk7XG4gfX0pOyRo4oCNX29uY2UuQ29weUFycmF5SGVscGVyKENvcHlBcnJheUhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACD9dsszwcAAM8HAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlSZWNvcmRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxjaGVja05vcm1hbFByb3BlcnR5OyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaOKAjV9hID0+IChjYW5CZU1ldGhvZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtnZXRQcm90b3R5cGVPZix2YWx1ZXMscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIENvcHlSZWNvcmRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weVJlY29yZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSE9PW9iamVjdFByb3RvdHlwZSl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxuXG5yZXR1cm4gb3duS2V5cyhjYW5kaWRhdGUpLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4odHlwZW9mIGtleT09PSdzdHJpbmcnfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcblggYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbiFjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuLyogVE9ETzogVXBkYXRlIG1lc3NhZ2Ugbm93IHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBcImltcGxpY2l0IFJlbW90YWJsZVwiLiovXG5YIGBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH0pO1xuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbkNvcHlSZWNvcmRIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsbmFtZSx0cnVlLGFzc2VydENoZWNrZXIpO1xuIH1cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbmZvcihjb25zdCB2YWwgb2YgdmFsdWVzKGNhbmRpZGF0ZSkpe1xucGFzc1N0eWxlT2ZSZWN1cih2YWwpO1xuIH1cbiB9fSk7JGjigI1fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADToDhxnREAAJ0RAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2Vycm9yLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJFcnJvckhlbHBlciIsImdldEVycm9yQ29uc3RydWN0b3IiLCJpc0Vycm9yTGlrZSIsInRvUGFzc2FibGVFcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiBUT0RPOiBNYWludGVuYW5jZSBoYXphcmQ6IENvb3JkaW5hdGUgd2l0aCB0aGUgbGlzdCBvZiBlcnJvcnMgaW4gdGhlIFNFUyovXG4vKiB3aGlsZWxpc3QuIEN1cnJlbnRseSwgYm90aCBvbWl0IEFnZ3JlZ2F0ZUVycm9yLCB3aGljaCBpcyBub3cgc3RhbmRhcmQuIEJvdGgqL1xuLyogbXVzdCBldmVudHVhbGx5IGluY2x1ZGUgaXQuKi9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzPW5ldyBNYXAoW1xuWydFcnJvcicsRXJyb3JdLFxuWydFdmFsRXJyb3InLEV2YWxFcnJvcl0sXG5bJ1JhbmdlRXJyb3InLFJhbmdlRXJyb3JdLFxuWydSZWZlcmVuY2VFcnJvcicsUmVmZXJlbmNlRXJyb3JdLFxuWydTeW50YXhFcnJvcicsU3ludGF4RXJyb3JdLFxuWydUeXBlRXJyb3InLFR5cGVFcnJvcl0sXG5bJ1VSSUVycm9yJyxVUklFcnJvcl1dKTtcblxuXG5jb25zdCAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3Rvcj0obmFtZSk9PmVycm9yQ29uc3RydWN0b3JzLmdldChuYW1lKTskaOKAjV9vbmNlLmdldEVycm9yQ29uc3RydWN0b3IoZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5oYXJkZW4oZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrRXJyb3JMaWtlPShjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbi8qIFRPRE86IE5lZWQgYSBiZXR0ZXIgdGVzdCB0aGFuIGluc3RhbmNlb2YqL1xucmV0dXJuKFxuY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3J8fFxucmVqZWN0JiZyZWplY3QoWCBgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH07XG5oYXJkZW4oY2hlY2tFcnJvckxpa2UpO1xuXG4vKipcbiAqIFZhbGlkYXRpbmcgZXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUgcmFpc2VzIGEgdGVuc2lvbiBiZXR3ZWVuIHNlY3VyaXR5XG4gKiB2cyBwcmVzZXJ2aW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIEZvciBlcnJvcnMsIHdlIG5lZWQgdG8gcmVtZW1iZXJcbiAqIHRoZSBlcnJvciBpdHNlbGYgZXhpc3RzIHRvIGhlbHAgdXMgZGlhZ25vc2UgYSBidWcgdGhhdCdzIGxpa2VseSBtb3JlXG4gKiBwcmVzc2luZyB0aGFuIGEgdmFsaWRpdHkgYnVnIGluIHRoZSBlcnJvciBpdHNlbGYuIFRodXMsIHdoZW5ldmVyIGl0IGlzIHNhZmVcbiAqIHRvIGRvIHNvLCB3ZSBwcmVmZXIgdG8gbGV0IHRoZSBlcnJvci1saWtlIHRlc3Qgc3VjY2VlZCBhbmQgdG8gY291Y2ggdGhlc2VcbiAqIGNvbXBsYWludHMgYXMgbm90ZXMgb24gdGhlIGVycm9yLlxuICpcbiAqIFRvIHJlc29sdmUgdGhpcywgc3VjaCBhIG1hbGZvcm1lZCBlcnJvciBvYmplY3Qgd2lsbCBzdGlsbCBwYXNzXG4gKiBgaXNFcnJvckxpa2VgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3AgbGV2ZWwgZXJyb3IgdG8gcmVwb3J0IGZyb20sXG4gKiBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc0Vycm9yTGlrZT0oY2FuZGlkYXRlKT0+Y2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlKTskaOKAjV9vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIEVycm9ySGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J2Vycm9yJyxcblxuY2FuQmVWYWxpZDpjaGVja0Vycm9yTGlrZSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PntcbkVycm9ySGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbmNvbnN0e25hbWV9PXByb3RvO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbkVDJiZFQy5wcm90b3R5cGU9PT1wcm90b3x8XG5GYWlsIGBFcnJvcnMgbXVzdCBpbmhlcml0IGZyb20gYW4gZXJyb3IgY2xhc3MgLnByb3RvdHlwZSAke2NhbmRpZGF0ZX1gO1xuXG5jb25zdHtcbi8qIE11c3QgYWxsb3cgYGNhdXNlYCwgYGVycm9yc2AqL1xubWVzc2FnZTptRGVzYyxcbi8qIEFsbG93IGJ1dCBpZ25vcmUgb25seSBleHRyYW5lb3VzIG93biBgc3RhY2tgIHByb3BlcnR5LiovXG5zdGFjazpfb3B0U3RhY2tEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbm93bktleXMocmVzdERlc2NzKS5sZW5ndGg8MXx8XG5GYWlsIGBQYXNzZWQgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnRpZXMgJHtyZXN0RGVzY3N9YDtcbmlmKG1EZXNjKXtcbnR5cGVvZiBtRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IGJlIGEgc3RyaW5nLXZhbHVlZCBkYXRhIHByb3BlcnR5LmA7XG4hbURlc2MuZW51bWVyYWJsZXx8XG5GYWlsIGBQYXNzZWQgRXJyb3IgXCJtZXNzYWdlXCIgJHttRGVzY30gbXVzdCBub3QgYmUgZW51bWVyYWJsZWA7XG4gfVxucmV0dXJuIHRydWU7XG4gfX0pO1xuXG5cbi8qKlxuICogUmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpYyBpbmZvIG9mIHRoZVxuICogb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqLyRo4oCNX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xuY29uc3QgICAgICAgIHRvUGFzc2FibGVFcnJvcj0oZXJyKT0+e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1lcnI7XG5cbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoIGAke25hbWV9YCl8fEVycm9yO1xuY29uc3QgbmV3RXJyb3I9aGFyZGVuKG5ldyBFQyggYCR7bWVzc2FnZX1gKSk7XG4vKiBFdmVuIHRoZSBjbGVhbmVkIHVwIGVycm9yIGNvcHksIGlmIHNlbnQgdG8gdGhlIGNvbnNvbGUsIHNob3VsZCovXG4vKiBjYXVzZSBoaWRkZW4gZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBvZiB0aGUgb3JpZ2luYWwgZXJyb3IqL1xuLyogdG8gYmUgbG9nZ2VkLiovXG5hc3NlcnQubm90ZShuZXdFcnJvcixYIGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbnJldHVybiBuZXdFcnJvcjtcbiB9OyRo4oCNX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABKO2aDVQgAAFUIAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCBhbmRcbiAqIGhhdmUgdGhlIHNhbWUgdGVybWluYXRpb24gLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZSBvciBmYWlsdXJlXG4gKiByZWFzb24uIEJ1dCB0aGUgbm9uLWZpbmFsIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbm9uLWZpbmFsXG4gKiB2YWx1ZXMgZnJvbSBgYmFzZUl0ZXJhdG9yYCBhcyB0cmFuc2Zvcm1lZCBieSBgZnVuY2AuXG4gKlxuICogQHRlbXBsYXRlIFQsVVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gVX0gZnVuY1xuICogQHJldHVybnMge0l0ZXJhYmxlPFU+fVxuICovXG5jb25zdCAgICAgICAgbWFwSXRlcmFibGU9KGJhc2VJdGVyYWJsZSxmdW5jKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdtYXBwZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuY29uc3R7dmFsdWU6YmFzZVZhbHVlLGRvbmV9PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdCB2YWx1ZT1kb25lP2Jhc2VWYWx1ZTpmdW5jKGJhc2VWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSxkb25lfSk7XG4gfX0pO1xuXG4gfX0pOyRo4oCNX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuXG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGEgc3Vic2V0IG9mIHRoZSBub24tZmluYWwgdmFsdWVzIGZyb20gdGhlXG4gKiBgYmFzZUl0ZXJhdG9yYCAtLS0gdGhvc2UgZm9yIHdoaWNoIGBwcmVkKHZhbHVlKWAgd2FzIHRydXRoeS4gVGhlIHJlc3VsdFxuICogaGFzIHRoZSBzYW1lIHRlcm1pbmF0aW9uIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlXG4gKiBvciBmYWlsdXJlIHJlYXNvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gYm9vbGVhbn0gcHJlZFxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgZmlsdGVySXRlcmFibGU9KGJhc2VJdGVyYWJsZSxwcmVkKT0+XG4vKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignZmlsdGVyZWQgaXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmZvcig7Oyl7XG5jb25zdCByZXN1bHQ9YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0e3ZhbHVlLGRvbmV9PXJlc3VsdDtcbmlmKGRvbmV8fHByZWQodmFsdWUpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5cbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYk1nA04aAABOGgAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxhc3NlcnRJZmFjZSxnZXRJbnRlcmZhY2VPZixSZW1vdGFibGVIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydElmYWNlID0gJGjigI1fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaOKAjV9hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjigI1fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbnNldFByb3RvdHlwZU9mLFxuY3JlYXRlLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcblxuLyoqXG4gKiBOb3cgdGhhdCB0aGUgcmVtb3RhYmxlUHJvdG8gZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIGB0b1N0cmluZ2AgbWV0aG9kLFxuICogZW5zdXJlIGl0IGFsd2F5cyBpbmhlcml0cyBmcm9tIHNvbWV0aGluZy4gVGhlIG9yaWdpbmFsIHByb3RvdHlwZSBvZlxuICogYHJlbW90YWJsZWAgaWYgdGhlcmUgd2FzIG9uZSwgb3IgYE9iamVjdC5wcm90b3R5cGVgIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG89KHJlbW90YWJsZSxpZmFjZSk9PntcbmxldCBvbGRQcm90bz1nZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuaWYodHlwZW9mIHJlbW90YWJsZT09PSdvYmplY3QnKXtcbmlmKG9sZFByb3RvPT09bnVsbCl7XG5vbGRQcm90bz1vYmplY3RQcm90b3R5cGU7XG4gfVxub2xkUHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuRmFpbCBgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2UgaWYodHlwZW9mIHJlbW90YWJsZT09PSdmdW5jdGlvbicpe1xub2xkUHJvdG8hPT1udWxsfHxcbkZhaWwgYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xub2xkUHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5nZXRQcm90b3R5cGVPZihvbGRQcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG5GYWlsIGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNle1xuRmFpbCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuIH1cbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2xkUHJvdG8se1xuW1BBU1NfU1RZTEVdOnt2YWx1ZToncmVtb3RhYmxlJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6aWZhY2V9fSkpO1xuXG5cbiB9O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZT0oY2FuZGlkYXRlKT0+XG5SZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qKlxuICogQ3JlYXRlIGFuZCByZWdpc3RlciBhIFJlbW90YWJsZS4gIEFmdGVyIHRoaXMsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSlcbiAqIHJldHVybnMgaWZhY2UuXG4gKlxuICogLy8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy84MDRcbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZT0nUmVtb3RhYmxlJ10gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvclxuICogdGhlIHJlbW90YWJsZS4gRm9yIG5vdywgYSBzdHJpbmcgaWZhY2UgbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGhcbiAqIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiLCB0byBzZXJ2ZSBhcyB0aGUgYWxsZWdlZCBuYW1lLiBNb3JlXG4gKiBnZW5lcmFsIGlmYWNlcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZC4gVGhpcyBpcyB0ZW1wb3JhcnkuIFdlIGluY2x1ZGUgdGhlXG4gKiBcIkFsbGVnZWRcIiBvciBcIkRlYnVnTmFtZVwiIGFzIGEgcmVtaW5kZXIgdGhhdCB3ZSBkbyBub3QgeWV0IGhhdmUgU3dpbmdTZXRcbiAqIG9yIENvbW1zIFZhdFxuICogc3VwcG9ydCBmb3IgZW5zdXJpbmcgdGhpcyBpcyBhY2NvcmRpbmcgdG8gdGhlIHZhdCBob3N0aW5nIHRoZSBvYmplY3QuXG4gKiBDdXJyZW50bHksIEFsaWNlIGNhbiB0ZWxsIEJvYiBhYm91dCBDYXJvbCwgd2hlcmUgVmF0QSAob24gQWxpY2UncyBiZWhhbGYpXG4gKiBtaXNyZXByZXNlbnRzIENhcm9sJ3MgYGlmYWNlYC4gVmF0QiBhbmQgdGhlcmVmb3JlIEJvYiB3aWxsIHRoZW4gc2VlXG4gKiBDYXJvbCdzIGBpZmFjZWAgYXMgbWlzcmVwcmVzZW50ZWQgYnkgVmF0QS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSBbcHJvcHM9dW5kZWZpbmVkXSBDdXJyZW50bHkgbWF5IG9ubHkgYmUgdW5kZWZpbmVkLlxuICogVGhhdCBwbGFuIGlzIHRoYXQgb3duLXByb3BlcnRpZXMgYXJlIGNvcGllZCB0byB0aGUgcmVtb3RhYmxlXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGU9e31dIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gcmVtb3RhYmxlLCBtb2RpZmllZCBmb3IgZGVidWdnYWJpbGl0eVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlPShcbmlmYWNlPSdSZW1vdGFibGUnLFxucHJvcHM9dW5kZWZpbmVkLFxucmVtb3RhYmxlPS8qKiBAdHlwZSB7VH0gKi97fSk9Plxue1xuYXNzZXJ0SWZhY2UoaWZhY2UpO1xuYXNzZXJ0KGlmYWNlKTtcbi8qIFRPRE86IFdoZW4gaWZhY2UgaXMgcmljaGVyIHRoYW4ganVzdCBzdHJpbmcsIHdlIG5lZWQgdG8gZ2V0IHRoZSBhbGxlZ2VkTmFtZSovXG4vKiBpbiBhIGRpZmZlcmVudCB3YXkuKi9cbnByb3BzPT09dW5kZWZpbmVkfHxGYWlsIGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgdGhhdCB0aGUgdW5tb2RpZmllZCBvYmplY3QgaXMgYWJsZSB0byBiZWNvbWUgYSBSZW1vdGFibGUuKi9cbmFzc2VydENhbkJlUmVtb3RhYmxlKHJlbW90YWJsZSk7XG5cbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBtYXJrZWQuKi9cbiEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG5yZW1vdGFibGVbUEFTU19TVFlMRV0pXG4gfWA7XG4vKiBgaXNGcm96ZW5gIGFsd2F5cyByZXR1cm5zIHRydWUgd2l0aCBhIGZha2UgYGhhcmRlbmAsIGJ1dCB3ZSB3YW50IHRoYXQgY2FzZSovXG4vKiB0byBzdWNjZWVkIGFueXdheS4gRmFraW5nIGBoYXJkZW5gIGlzIG9ubHkgY29ycmVjdG5lc3MgcHJlc2VydmluZyovXG4vKiBpZiB0aGUgY29kZSBpbiBxdWVzdGlvbiBjb250YWlucyBubyBidWdzIHRoYXQgdGhlIHJlYWwgYGhhcmRlbmAgd291bGQqL1xuLyogaGF2ZSBjYXVnaHQuKi9cbi8qIEB0cy1pZ25vcmUgYGlzRmFrZWAgcHVycG9zZWx5IG5vdCBpbiB0aGUgdHlwZSovXG5oYXJkZW4uaXNGYWtlfHxcbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBmcm96ZW4uKi9cbiFpc0Zyb3plbihyZW1vdGFibGUpfHxcbkZhaWwgYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuY29uc3QgcmVtb3RhYmxlUHJvdG89bWFrZVJlbW90YWJsZVByb3RvKHJlbW90YWJsZSxpZmFjZSk7XG5cbi8qIFRha2UgYSBzdGF0aWMgY29weSBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBhcyBkYXRhIHByb3BlcnRpZXMuKi9cbi8qIGNvbnN0IHByb3BEZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoeyAuLi5wcm9wcyB9KTsqL1xuY29uc3QgbXV0YXRlSGFyZGVuQW5kQ2hlY2s9KHRhcmdldCk9Pntcbi8qIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wRGVzY3MpOyovXG5zZXRQcm90b3R5cGVPZih0YXJnZXQscmVtb3RhYmxlUHJvdG8pO1xuaGFyZGVuKHRhcmdldCk7XG5hc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuIH07XG5cbi8qIEZhaWwgZmFzdDogY2hlY2sgYSBmcmVzaCByZW1vdGFibGUgdG8gc2VlIGlmIG91ciBydWxlcyBmaXQuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuLyogQWN0dWFsbHkgZmluaXNoIHRoZSBuZXcgcmVtb3RhYmxlLiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4vKiBDT01NSVRURUQhKi9cbi8qIFdlJ3JlIGNvbW1pdHRlZCwgc28ga2VlcCB0aGUgaW50ZXJmYWNlIGZvciBmdXR1cmUgcmVmZXJlbmNlLiovXG5hc3NlcnQoaWZhY2UhPT11bmRlZmluZWQpOy8qIFRvIG1ha2UgVHlwZVNjcmlwdCBoYXBweSovXG5yZXR1cm4gKC8qKiBAdHlwZSB7VCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPn0gKi9yZW1vdGFibGUpO1xuIH07JGjigI1fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKipcbiAqIEEgY29uY2lzZSBjb252ZW5pZW5jZSBmb3IgdGhlIG1vc3QgY29tbW9uIGBSZW1vdGFibGVgIHVzZS5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZmFyTmFtZSBUaGlzIG5hbWUgd2lsbCBiZSBwcmVwZW5kZWQgd2l0aCBgQWxsZWdlZDogYFxuICogZm9yIG5vdyB0byBmb3JtIHRoZSBgUmVtb3RhYmxlYCBgaWZhY2VgIGFyZ3VtZW50LlxuICogQHBhcmFtIHtUfSBbcmVtb3RhYmxlPXt9XSBUaGUgb2JqZWN0IHVzZWQgYXMgdGhlIHJlbW90YWJsZVxuICovXG5jb25zdCAgICAgICAgRmFyPShmYXJOYW1lLHJlbW90YWJsZT11bmRlZmluZWQpPT57XG5jb25zdCByPXJlbW90YWJsZT09PXVuZGVmaW5lZD8vKiogQHR5cGUge1R9ICove306cmVtb3RhYmxlO1xucmV0dXJuIFJlbW90YWJsZSggYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLHVuZGVmaW5lZCxyKTtcbiB9OyRo4oCNX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLyoqXG4gKiBDb2VyY2UgYGZ1bmNgIHRvIGEgZmFyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIGl0cyBjYWxsIGJlaGF2aW9yLlxuICogSWYgaXQgaXMgYWxyZWFkeSBhIGZhciBmdW5jdGlvbiwgcmV0dXJuIGl0LiBPdGhlcndpc2UgbWFrZSBhbmQgcmV0dXJuIGFcbiAqIG5ldyBmYXIgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgYW5kIGZvcndhcmRzIGNhbGxzIHRvIGl0LiBUaGlzXG4gKiB3b3JrcyBldmVuIGlmIGBmdW5jYCBpcyBhbHJlYWR5IGZyb3plbi4gYFRvRmFyRnVuY3Rpb25gIGlzIHRvIGJlIHVzZWRcbiAqIHdoZW4gdGhlIGZ1bmN0aW9uIGNvbWVzIGZyb20gZWxzZXdoZXJlIHVuZGVyIGxlc3MgY29udHJvbC4gRm9yIGZ1bmN0aW9uc1xuICogeW91IGF1dGhvciBpbiBwbGFjZSwgYmV0dGVyIHRvIHVzZSBgRmFyYCBvbiB0aGVpciBmdW5jdGlvbiBsaXRlcmFsIGRpcmVjdGx5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIHRvIGJlIHVzZWQgb25seSBpZiBgZnVuY2AgaXMgbm90IGFscmVhZHkgYVxuICogZmFyIGZ1bmN0aW9uLlxuICogQHBhcmFtIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gZnVuY1xuICovXG5jb25zdCAgICAgICAgVG9GYXJGdW5jdGlvbj0oZmFyTmFtZSxmdW5jKT0+e1xuaWYoZ2V0SW50ZXJmYWNlT2YoZnVuYykhPT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmM7XG4gfVxucmV0dXJuIEZhcihmYXJOYW1lLCguLi5hcmdzKT0+ZnVuYyguLi5hcmdzKSk7XG4gfTskaOKAjV9vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAACkXvlHQQAAB0EAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7Y3JlYXRlLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuY29uc3QgICAgICAgIG1ha2VUYWdnZWQ9KHRhZyxwYXlsb2FkKT0+e1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG5hc3NlcnRQYXNzYWJsZShoYXJkZW4ocGF5bG9hZCkpO1xucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvYmplY3RQcm90b3R5cGUse1xuW1BBU1NfU1RZTEVdOnt2YWx1ZTondGFnZ2VkJ30sXG5bU3ltYm9sLnRvU3RyaW5nVGFnXTp7dmFsdWU6dGFnfSxcbnBheWxvYWQ6e3ZhbHVlOnBheWxvYWQsZW51bWVyYWJsZTp0cnVlfX0pKTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABlAKMb1GQAA9RkAADAAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2FuQmVNZXRob2QiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tOb3JtYWxQcm9wZXJ0eSIsImNoZWNrUGFzc1N0eWxlIiwiY2hlY2tUYWdSZWNvcmQiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtwcm90b3R5cGU6ZnVuY3Rpb25Qcm90b3R5cGV9PUZ1bmN0aW9uO1xuY29uc3R7XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG5nZXRQcm90b3R5cGVPZixcbmhhc093blByb3BlcnR5Om9iamVjdEhhc093blByb3BlcnR5LFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1cbk9iamVjdDtcbmNvbnN0e2FwcGx5fT1SZWZsZWN0O1xuY29uc3R7dG9TdHJpbmdUYWc6dG9TdHJpbmdUYWdTeW1ib2x9PVN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZT1nZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbnR5cGVkQXJyYXlQcm90b3R5cGUsXG50b1N0cmluZ1RhZ1N5bWJvbCk7XG5cbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz10eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPT09J2Z1bmN0aW9uJyk7XG5cbmNvbnN0ICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mPShvYmoscHJvcCk9PlxuYXBwbHkob2JqZWN0SGFzT3duUHJvcGVydHksb2JqLFtwcm9wXSk7JGjigI1fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuaGFyZGVuKGhhc093blByb3BlcnR5T2YpO1xuXG5jb25zdCAgICAgICAgaXNPYmplY3Q9KHZhbCk9Pk9iamVjdCh2YWwpPT09dmFsOyRo4oCNX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLyoqXG4gKiBEdXBsaWNhdGVzIHBhY2thZ2VzL3Nlcy9zcmMvbWFrZS1oYXJkZW5lci5qcyB0byBhdm9pZCBhIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmplY3RcbiAqL1xuY29uc3QgICAgICAgIGlzVHlwZWRBcnJheT0ob2JqZWN0KT0+e1xuLyogVGhlIG9iamVjdCBtdXN0IHBhc3MgYSBicmFuZCBjaGVjayBvciB0b1N0cmluZ1RhZyB3aWxsIHJldHVybiB1bmRlZmluZWQuKi9cbmNvbnN0IHRhZz1hcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsb2JqZWN0LFtdKTtcbnJldHVybiB0YWchPT11bmRlZmluZWQ7XG4gfTskaOKAjV9vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbmNvbnN0ICAgICAgICBQQVNTX1NUWUxFPVN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpO1xuXG4vKipcbiAqIEZvciBhIGZ1bmN0aW9uIHRvIGJlIGEgdmFsaWQgbWV0aG9kLCBpdCBtdXN0IG5vdCBiZSBwYXNzYWJsZS5cbiAqIE90aGVyd2lzZSwgd2UgcmlzayBjb25mdXNpbmcgcGFzcy1ieS1jb3B5IGRhdGEgY2FycnlpbmdcbiAqIGZhciBmdW5jdGlvbnMgd2l0aCBhdHRlbXB0cyBhdCBmYXIgb2JqZWN0cyB3aXRoIG1ldGhvZHMuXG4gKlxuICogVE9ETyBIQVpBUkQgQmVjYXVzZSB3ZSBjaGVjayB0aGlzIG9uIHRoZSB3YXkgdG8gaGFyZGVuaW5nIGEgcmVtb3RhYmxlLFxuICogd2UgY2Fubm90IHlldCBjaGVjayB0aGF0IGBmdW5jYCBpcyBoYXJkZW5lZC4gSG93ZXZlciwgd2l0aG91dFxuICogZG9pbmcgc28sIGl0J3MgaW5oZXJpdGFuY2UgbWlnaHQgY2hhbmdlIGFmdGVyIHRoZSBgUEFTU19TVFlMRWBcbiAqIGNoZWNrIGJlbG93LlxuICpcbiAqIEBwYXJhbSB7YW55fSBmdW5jXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbmNvbnN0ICAgICAgICBjYW5CZU1ldGhvZD0oZnVuYyk9PlxudHlwZW9mIGZ1bmM9PT0nZnVuY3Rpb24nJiYhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjigI1fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKipcbiAqIEJlbG93IHdlIGhhdmUgYSBzZXJpZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBhbmQgdGhlaXIgKGN1cnJpZWQpIGFzc2VydGlvblxuICogZnVuY3Rpb25zLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBhc3NlcnRpb24gZnVuY3Rpb24gaXMganVzdCB0byBhc3NlcnQgdGhhdFxuICogdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGljYXRlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZS4gQnV0IGl0XG4gKiByZXByb2R1Y2VzIHRoZSBpbnRlcm5hbCB0ZXN0cyBzbyBmYWlsdXJlcyBjYW4gZ2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q2hlY2tlcj0oY29uZCxkZXRhaWxzKT0+e1xuYXNzZXJ0KGNvbmQsZGV0YWlscyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDaGVja3MgZm9yIHRoZSBwcmVzZW5jZSBhbmQgZW51bWVyYWJpbGl0eSBvZiBhbiBvd24gZGF0YSBwcm9wZXJ0eS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBwcm9wZXJ0eU5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkQmVFbnVtZXJhYmxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tOb3JtYWxQcm9wZXJ0eT0oXG5jYW5kaWRhdGUsXG5wcm9wZXJ0eU5hbWUsXG5zaG91bGRCZUVudW1lcmFibGUsXG5jaGVjayk9Plxue1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGRlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNhbmRpZGF0ZSxwcm9wZXJ0eU5hbWUpO1xuaWYoZGVzYz09PXVuZGVmaW5lZCl7XG5yZXR1cm4oXG5yZWplY3QmJnJlamVjdChYIGAke3EocHJvcGVydHlOYW1lKX0gcHJvcGVydHkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cbnJldHVybihcbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2MsJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShwcm9wZXJ0eU5hbWUpfSBtdXN0IG5vdCBiZSBhbiBhY2Nlc3NvciBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnNob3VsZEJlRW51bWVyYWJsZT9cbmRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCk6XG5cbiFkZXNjLmVudW1lcmFibGV8fFxucmVqZWN0JiZcbnJlamVjdChcblggYCR7cShcbnByb3BlcnR5TmFtZSlcbiB9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSk7XG5cblxuIH07JGjigI1fb25jZS5jaGVja05vcm1hbFByb3BlcnR5KGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuaGFyZGVuKGNoZWNrTm9ybWFsUHJvcGVydHkpO1xuXG5jb25zdCAgICAgICAgZ2V0VGFnPSh0YWdSZWNvcmQpPT50YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaOKAjV9vbmNlLmdldFRhZyhnZXRUYWcpO1xuaGFyZGVuKGdldFRhZyk7XG5cbmNvbnN0ICAgICAgICBjaGVja1Bhc3NTdHlsZT0ob2JqLGV4cGVjdGVkUGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IGFjdHVhbD1vYmpbUEFTU19TVFlMRV07XG5yZXR1cm4oXG5hY3R1YWw9PT1leHBlY3RlZFBhc3NTdHlsZXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKGFjdHVhbCl9OiAke29ian1gKSk7XG5cbiB9OyRo4oCNX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkPShjaGVja1Byb3RvKT0+e1xuLyoqXG4gKiBAcGFyYW0ge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcgfX0gdGFnUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1RhZ1JlY29yZD0odGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4oaXNPYmplY3QodGFnUmVjb3JkKXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSYmKFxuaXNGcm96ZW4odGFnUmVjb3JkKXx8XG5yZWplY3QmJnJlamVjdChYIGBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpJiYoXG4haXNBcnJheSh0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFBBU1NfU1RZTEUsZmFsc2UsY2hlY2spJiZcbmNoZWNrUGFzc1N0eWxlKHRhZ1JlY29yZCxwYXNzU3R5bGUsY2hlY2spJiZcbmNoZWNrTm9ybWFsUHJvcGVydHkodGFnUmVjb3JkLFN5bWJvbC50b1N0cmluZ1RhZyxmYWxzZSxjaGVjaykmJihcbnR5cGVvZiBnZXRUYWcodGFnUmVjb3JkKT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBBIFtTeW1ib2wudG9TdHJpbmdUYWddLW5hbWVkIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnUmVjb3JkfWApKSYmXG5cbmNoZWNrUHJvdG8odGFnUmVjb3JkLGdldFByb3RvdHlwZU9mKHRhZ1JlY29yZCksY2hlY2spKTtcblxuIH07XG5yZXR1cm4gaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbiB9O1xuXG5jb25zdCAgICAgICAgY2hlY2tUYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxuISFjaGVjayYmXG5jaGVjayhmYWxzZSxYIGBBIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke3ZhbH1gKSk7JGjigI1fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5cbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbmNvbnN0ICAgICAgICBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxucHJvdG8hPT1udWxsJiZnZXRQcm90b3R5cGVPZihwcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKFxuZmFsc2UsXG5YIGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5cblxuaGFyZGVuKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiJdLCJpc09iamVjdCI6WyJpc09iamVjdCJdLCJpc1R5cGVkQXJyYXkiOlsiaXNUeXBlZEFycmF5Il0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSJdLCJjYW5CZU1ldGhvZCI6WyJjYW5CZU1ldGhvZCJdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiXSwiY2hlY2tOb3JtYWxQcm9wZXJ0eSI6WyJjaGVja05vcm1hbFByb3BlcnR5Il0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC5usQ2DGwAAgxsAACoAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiLi9jb3B5QXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL2Vycm9yLmpzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIiwiLi9zYWZlLXByb21pc2UuanMiLCIuL3N5bWJvbC5qcyIsIi4vdGFnZ2VkLmpzIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZSIsInBhc3NTdHlsZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxDb3B5QXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsRXJyb3JIZWxwZXIsUmVtb3RhYmxlSGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImlzVHlwZWRBcnJheVwiLCBbJGjigI1fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVPZn0gUGFzc1N0eWxlT2YgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByaW1pdGl2ZVN0eWxlfSBQcmltaXRpdmVTdHlsZSAqL1xuXG4vKiogQHR5cGVkZWYge0V4Y2x1ZGU8UGFzc1N0eWxlLCBQcmltaXRpdmVTdHlsZSB8IFwicHJvbWlzZVwiPn0gSGVscGVyUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0Zyb3plbn09T2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8SGVscGVyUGFzc1N0eWxlLCBQYXNzU3R5bGVIZWxwZXI+IH1cbiAqL1xuXG5jb25zdCBtYWtlSGVscGVyVGFibGU9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG4vKiogQHR5cGUge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIGFueT4gJiB7X19wcm90b19fOiBudWxsfX0gKi9cbmNvbnN0IEhlbHBlclRhYmxlPXtcbl9fcHJvdG9fXzpudWxsLFxuY29weUFycmF5OnVuZGVmaW5lZCxcbmNvcHlSZWNvcmQ6dW5kZWZpbmVkLFxudGFnZ2VkOnVuZGVmaW5lZCxcbmVycm9yOnVuZGVmaW5lZCxcbnJlbW90YWJsZTp1bmRlZmluZWR9O1xuXG5mb3IoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpe1xuY29uc3R7c3R5bGVOYW1lfT1oZWxwZXI7XG5zdHlsZU5hbWUgaW4gSGVscGVyVGFibGV8fEZhaWwgYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPT09dW5kZWZpbmVkfHxcbkZhaWwgYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdPWhlbHBlcjtcbiB9XG5mb3IoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKXtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV0hPT11bmRlZmluZWR8fFxuRmFpbCBgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gfVxuXG5yZXR1cm4gaGFyZGVuKEhlbHBlclRhYmxlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc1N0eWxlSGVscGVyW119IHBhc3NTdHlsZUhlbHBlcnMgVGhlIHBhc3NTdHlsZUhlbHBlcnMgdG8gcmVnaXN0ZXIsXG4gKiBpbiBwcmlvcml0eSBvcmRlci5cbiAqIE5PVEUgVGhlc2UgbXVzdCBhbGwgYmUgXCJ0cnVzdGVkXCIsXG4gKiBjb21wbGV0ZSwgYW5kIG5vbi1jb2xsaWRpbmcuIGBtYWtlUGFzc1N0eWxlT2ZgIG1heSAqYXNzdW1lKiB0aGF0IGVhY2ggaGVscGVyXG4gKiBkb2VzIHdoYXQgaXQgaXMgc3VwcG9zZWQgdG8gZG8uIGBtYWtlUGFzc1N0eWxlT2ZgIGlzIG5vdCB0cnlpbmcgdG8gZGVmZW5kXG4gKiBpdHNlbGYgYWdhaW5zdCBtYWxpY2lvdXMgaGVscGVycywgdGhvdWdoIGl0IGRvZXMgZGVmZW5kIGFnYWluc3Qgc29tZVxuICogYWNjaWRlbnRzLlxuICogQHJldHVybnMge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2Y9KHBhc3NTdHlsZUhlbHBlcnMpPT57XG5jb25zdCBIZWxwZXJUYWJsZT1tYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG5jb25zdCByZW1vdGFibGVIZWxwZXI9SGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4vKipcbiAqIFB1cmVseSBmb3IgcGVyZm9ybWFuY2UuIEhvd2V2ZXIgaXQgaXMgbXV0YWJsZSBzdGF0aWMgc3RhdGUsIGFuZFxuICogaXQgZG9lcyBoYXZlIHNvbWUgb2JzZXJ2YWJpbGl0eSBvbiBwcm94aWVzLiBUT0RPIG5lZWQgdG8gYXNzZXNzXG4gKiB3aGV0aGVyIHRoaXMgY3JlYXRlcyBhIHN0YXRpYyBjb21tdW5pY2F0aW9ucyBjaGFubmVsLlxuICpcbiAqIHBhc3NTdHlsZU9mIGRvZXMgYSBmdWxsIHJlY3Vyc2l2ZSB3YWxrIG9mIHBhc3MtYnktY29weVxuICogc3RydWN0dXJlcywgaW4gb3JkZXIgdG8gdmFsaWRhdGUgdGhhdCB0aGV5IGFyZSBhY3ljbGljLiBJbiBhZGRpdGlvblxuICogaXQgaXMgdXNlZCBieSBvdGhlciBhbGdvcml0aG1zIHRvIHJlY3Vyc2l2ZWx5IHdhbGsgdGhlc2UgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBzbyB3aXRob3V0IHRoaXMgY2FjaGUsIHRoZXNlIGFsZ29yaXRobXMgY291bGQgYmVcbiAqIE8oTioqMikgb3Igd29yc2UuXG4gKlxuICogQHR5cGUge1dlYWtNYXA8UGFzc2FibGUsIFBhc3NTdHlsZT59XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU1lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mPShwYXNzYWJsZSk9Pntcbi8qIEV2ZW4gd2hlbiBhIFdlYWtTZXQgaXMgY29ycmVjdCwgd2hlbiB0aGUgc2V0IGhhcyBhIHNob3J0ZXIgbGlmZXRpbWUqL1xuLyogdGhhbiBpdHMga2V5cywgd2UgcHJlZmVyIGEgU2V0IGR1ZSB0byBleHBlY3RlZCBpbXBsZW1lbnRhdGlvbiovXG4vKiB0cmFkZW9mZnMuKi9cbmNvbnN0IGluUHJvZ3Jlc3M9bmV3IFNldCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZSZWN1cj0oaW5uZXIpPT57XG5jb25zdCBpbm5lcklzT2JqZWN0PWlzT2JqZWN0KGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xuaWYocGFzc1N0eWxlTWVtby5oYXMoaW5uZXIpKXtcbi8qIEB0cy1pZ25vcmUgVHlwZVNjcmlwdCBkb2Vzbid0IGtub3cgdGhhdCBgZ2V0YCBhZnRlciBgaGFzYCBpcyBzYWZlKi9cbnJldHVybiBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gfVxuIWluUHJvZ3Jlc3MuaGFzKGlubmVyKXx8XG5GYWlsIGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbmluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5wYXNzU3R5bGVNZW1vLnNldChpbm5lcixwYXNzU3R5bGUpO1xuaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuIH1cbnJldHVybiBwYXNzU3R5bGU7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWw9KGlubmVyKT0+e1xuY29uc3QgdHlwZXN0cj10eXBlb2YgaW5uZXI7XG5zd2l0Y2godHlwZXN0cil7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOntcbnJldHVybiB0eXBlc3RyO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG5yZXR1cm4nc3ltYm9sJztcbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoaW5uZXI9PT1udWxsKXtcbnJldHVybidudWxsJztcbiB9XG5pZighaXNGcm96ZW4oaW5uZXIpKXtcbmFzc2VydC5mYWlsKFxuLyogVHlwZWRBcnJheXMgZ2V0IHNwZWNpYWwgdHJlYXRtZW50IGluIGhhcmRlbigpKi9cbi8qIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3BlY2lhbCBlcnJvciBtZXNzYWdlIGhlcmUuKi9cbmlzVHlwZWRBcnJheShpbm5lcik/XG5YIGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmA6XG5YIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCk7XG5cbiB9XG5pZihpc1Byb21pc2UoaW5uZXIpKXtcbmFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbnJldHVybidwcm9taXNlJztcbiB9XG50eXBlb2YgaW5uZXIudGhlbiE9PSdmdW5jdGlvbid8fFxuRmFpbCBgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbmNvbnN0IHBhc3NTdHlsZVRhZz1pbm5lcltQQVNTX1NUWUxFXTtcbmlmKHBhc3NTdHlsZVRhZyE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywnc3RyaW5nJyk7XG5jb25zdCBoZWxwZXI9SGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbmhlbHBlciE9PXVuZGVmaW5lZHx8XG5GYWlsIGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuICgvKiogQHR5cGUge1Bhc3NTdHlsZX0gKi9wYXNzU3R5bGVUYWcpO1xuIH1cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5pZihoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpe1xuaGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gfVxuIH1cbnJlbW90YWJsZUhlbHBlci5hc3NlcnRWYWxpZChpbm5lcixwYXNzU3R5bGVPZlJlY3VyKTtcbnJldHVybidyZW1vdGFibGUnO1xuIH1cbmNhc2UnZnVuY3Rpb24nOntcbmlzRnJvemVuKGlubmVyKXx8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07XG5cbnJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiB9O1xucmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG4gfTtcblxuY29uc3QgICAgICAgIHBhc3NTdHlsZU9mPW1ha2VQYXNzU3R5bGVPZihbXG5Db3B5QXJyYXlIZWxwZXIsXG5Db3B5UmVjb3JkSGVscGVyLFxuVGFnZ2VkSGVscGVyLFxuRXJyb3JIZWxwZXIsXG5SZW1vdGFibGVIZWxwZXJdKTskaOKAjV9vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGU9KHZhbCk9PntcbnBhc3NTdHlsZU9mKHZhbCk7LyogdGhyb3dzIGlmIHZhbCBpcyBub3QgYSBwYXNzYWJsZSovXG4gfTskaOKAjV9vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFLGifcMhAADDIQAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiZ2V0SW50ZXJmYWNlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxoYXNPd25Qcm9wZXJ0eU9mLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc09iamVjdCxnZXRUYWc7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkludGVyZmFjZVNwZWN9IEludGVyZmFjZVNwZWMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLk1hcnNoYWxHZXRJbnRlcmZhY2VPZn0gTWFyc2hhbEdldEludGVyZmFjZU9mICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZSxcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PVxuT2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja0lmYWNlPShpZmFjZSxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5yZXR1cm4oXG4vKiBUT0RPIG90aGVyIHBvc3NpYmxlIGlmYWNlcywgb25jZSB3ZSBoYXZlIHRoaXJkIHBhcnR5IHZlcmFjaXR5Ki9cbih0eXBlb2YgaWZhY2U9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkmJihcblxuaWZhY2U9PT0nUmVtb3RhYmxlJ3x8XG5pZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKXx8XG5pZmFjZS5zdGFydHNXaXRoKCdEZWJ1Z05hbWU6ICcpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGb3Igbm93LCBpZmFjZSAke3EoXG5pZmFjZSlcbiB9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiOyB1bmltcGxlbWVudGVkYCkpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBBbiBgaWZhY2VgIG11c3QgYmUgcHVyZS4gUmlnaHQgbm93IGl0IG11c3QgYmUgYSBzdHJpbmcsIHdoaWNoIGlzIHB1cmUuXG4gKiBMYXRlciB3ZSBleHBlY3QgdG8gaW5jbHVkZSBzb21lIG90aGVyIHZhbHVlcyB0aGF0IHF1YWxpZnkgYXMgYFB1cmVEYXRhYCxcbiAqIHdoaWNoIGlzIGEgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGVuZGluZyBvbmx5IGluIHByaW1pdGl2ZXMgb3JcbiAqIGVtcHR5IHBhc3MtYnktY29weSBjb21wb3NpdGVzLiBObyByZW1vdGFibGVzLCBwcm9taXNlcywgb3IgZXJyb3JzLlxuICogV2UgKmFzc3VtZSogZm9yIG5vdyB0aGF0IHRoZSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgY29udGFpbnMgbm9cbiAqIHByb3hpZXMuXG4gKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0SWZhY2U9KGlmYWNlKT0+Y2hlY2tJZmFjZShpZmFjZSxhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydElmYWNlKGFzc2VydElmYWNlKTtcbmhhcmRlbihhc3NlcnRJZmFjZSk7XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3QgfCBGdW5jdGlvbn0gb3JpZ2luYWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlUHJvdG9PZj0ob3JpZ2luYWwsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaXNPYmplY3Qob3JpZ2luYWwpfHxcbkZhaWwgYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4vKiBBIHZhbGlkIHJlbW90YWJsZSBvYmplY3QgbXVzdCBpbmhlcml0IGZyb20gYSBcInRhZyByZWNvcmRcIiAtLSBhKi9cbi8qIHBsYWluLW9iamVjdCBwcm90b3R5cGUgY29uc2lzdGluZyBvZiBvbmx5Ki9cbi8qIGEgYFBBU1NfU1RZTEVgIHByb3BlcnR5IHdpdGggdmFsdWUgXCJyZW1vdGFibGVcIiBhbmQgYSBzdWl0YWJsZSBgU3ltYm9sLnRvU3RyaW5nVGFnYCovXG4vKiBwcm9wZXJ0eS4gVGhlIHJlbW90YWJsZSBjb3VsZCBpbmhlcml0IGRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQsIG9yKi9cbi8qIGl0IGNvdWxkIGluaGVyaXQgZnJvbSBhbm90aGVyIHZhbGlkIHJlbW90YWJsZSwgdGhhdCB0aGVyZWZvcmUgaXRzZWxmKi9cbi8qIGluaGVyaXRzIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZC4qL1xuLyoqL1xuLyogVE9ETzogSXQgd291bGQgYmUgbmljZSB0byB0eXBlZGVmIHRoaXMgc2hhcGUsIGJ1dCB3ZSBjYW4ndCBkZWNsYXJlIGEgdHlwZSovXG4vKiB3aXRoIFBBU1NfU1RZTEUgZnJvbSBKU0RvYy4qL1xuLyoqL1xuLyogQHR5cGUge3sgW1BBU1NfU1RZTEVdOiBzdHJpbmcsKi9cbi8qIFtTeW1ib2wudG9TdHJpbmdUYWddOiBzdHJpbmcsKi9cbi8qIH19Ki9cbi8qKi9cbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbmlmKHByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxwcm90bz09PW51bGwpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBSZW1vdGFibGVzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZDogJHtxKG9yaWdpbmFsKX1gKSk7XG5cbiB9XG5cbmlmKHR5cGVvZiBvcmlnaW5hbD09PSdvYmplY3QnKXtcbmNvbnN0IHByb3RvUHJvdG89Z2V0UHJvdG90eXBlT2YocHJvdG8pO1xuaWYocHJvdG9Qcm90byE9PW9iamVjdFByb3RvdHlwZSYmcHJvdG9Qcm90byE9PW51bGwpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiBjaGVja1JlbW90YWJsZShwcm90byxjaGVjayk7XG4gfVxuaWYoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1lbHNlIGlmKHR5cGVvZiBvcmlnaW5hbD09PSdmdW5jdGlvbicpe1xuaWYoIWNoZWNrRnVuY3Rpb25UYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06e3ZhbHVlOmlmYWNlfSxcbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHByb3RvKTtcblxucmV0dXJuKFxuKG93bktleXMocmVzdERlc2NzKS5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApKSYmXG5cbmNoZWNrSWZhY2UoaWZhY2UsY2hlY2spKTtcblxuIH07XG5cbi8qKlxuICogS2VlcCBhIHdlYWsgc2V0IG9mIGNvbmZpcm1lZCByZW1vdGFibGVzIGZvciBtYXJzaGFsIHBlcmZvcm1hbmNlXG4gKiAod2l0aG91dCB3aGljaCB3ZSB3b3VsZCBpbmN1ciBhIHJlZHVuZGFudCB2ZXJpZmljYXRpb24gaW5cbiAqIGdldEludGVyZmFjZU9mKS5cbiAqIFdlIGRvbid0IHJlbWVtYmVyIHJlamVjdGlvbnMgYmVjYXVzZSB0aGV5IGFyZSBwb3NzaWJsZSB0byBjb3JyZWN0XG4gKiB3aXRoIGUuZy4gYGhhcmRlbmAuXG4gKlxuICogQHR5cGUge1dlYWtTZXQ8UmVtb3RhYmxlPn1cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmVtb3RhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlPSh2YWwsY2hlY2spPT57XG5pZihjb25maXJtZWRSZW1vdGFibGVzLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZighaXNGcm96ZW4odmFsKSl7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gKTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHJlc3VsdD1jaGVja1JlbW90YWJsZVByb3RvT2YodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb25maXJtZWRSZW1vdGFibGVzLmFkZCh2YWwpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqIEB0eXBlIHtNYXJzaGFsR2V0SW50ZXJmYWNlT2Z9ICovXG5jb25zdCAgICAgICAgZ2V0SW50ZXJmYWNlT2Y9KHZhbCk9PntcbmlmKFxuIWlzT2JqZWN0KHZhbCl8fFxudmFsW1BBU1NfU1RZTEVdIT09J3JlbW90YWJsZSd8fFxuIWNoZWNrUmVtb3RhYmxlKHZhbCkpXG57XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBnZXRUYWcodmFsKTtcbiB9OyRo4oCNX29uY2UuZ2V0SW50ZXJmYWNlT2YoZ2V0SW50ZXJmYWNlT2YpO1xuaGFyZGVuKGdldEludGVyZmFjZU9mKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFJlbW90YWJsZUhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidyZW1vdGFibGUnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmNvbnN0IHZhbGlkVHlwZT1cbihpc09iamVjdChjYW5kaWRhdGUpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpJiYoXG4haXNBcnJheShjYW5kaWRhdGUpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBhcnJheXMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcbmlmKCF2YWxpZFR5cGUpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdvYmplY3QnKXtcbi8qIEV2ZXJ5IG93biBwcm9wZXJ0eSAocmVnYXJkbGVzcyBvZiBlbnVtZXJhYmlsaXR5KSovXG4vKiBtdXN0IGhhdmUgYSBmdW5jdGlvbiB2YWx1ZS4qL1xucmV0dXJuIG93bktleXMoZGVzY3MpLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4vKiBUeXBlY2FzdCBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4oaGFzT3duUHJvcGVydHlPZihkZXNjc1svKiogQHR5cGUge3N0cmluZ30gKi9rZXldLCd2YWx1ZScpfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBhY2Nlc3NvcnMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5rZXk9PT1TeW1ib2wudG9TdHJpbmdUYWcmJmNoZWNrSWZhY2UoY2FuZGlkYXRlW2tleV0sY2hlY2spfHxcbihjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIG5vbi1tZXRob2RzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxua2V5IT09UEFTU19TVFlMRXx8XG5yZWplY3QmJlxucmVqZWN0KFggYEEgcGFzcy1ieS1yZW1vdGUgY2Fubm90IHNoYWRvdyAke3EoUEFTU19TVFlMRSl9YCkpKSk7XG5cbiB9KTtcbiB9ZWxzZSBpZih0eXBlb2YgY2FuZGlkYXRlPT09J2Z1bmN0aW9uJyl7XG4vKiBGYXIgZnVuY3Rpb25zIGNhbm5vdCBiZSBtZXRob2RzLCBhbmQgY2Fubm90IGhhdmUgbWV0aG9kcy4qL1xuLyogVGhleSBtdXN0IGhhdmUgZXhhY3RseSBleHBlY3RlZCBgLm5hbWVgIGFuZCBgLmxlbmd0aGAgcHJvcGVydGllcyovXG5jb25zdHtcbm5hbWU6bmFtZURlc2MsXG5sZW5ndGg6bGVuZ3RoRGVzYyxcbi8qIEB0cy1pZ25vcmUgVFMgZG9lc24ndCBsaWtlIHN5bWJvbHMgYXMgY29tcHV0ZWQgaW5kZXhlcz8/Ki9cbltTeW1ib2wudG9TdHJpbmdUYWddOnRvU3RyaW5nVGFnRGVzYyxcbi4uLnJlc3REZXNjc309XG5kZXNjcztcbmNvbnN0IHJlc3RLZXlzPW93bktleXMocmVzdERlc2NzKTtcbnJldHVybihcbihuYW1lRGVzYyYmdHlwZW9mIG5hbWVEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChYIGBGYXIgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkmJihcbmxlbmd0aERlc2MmJnR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlPT09J251bWJlcid8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbiBsZW5ndGggbXVzdCBiZSBhIG51bWJlciwgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbnRvU3RyaW5nVGFnRGVzYz09PXVuZGVmaW5lZHx8XG4odHlwZW9mIHRvU3RyaW5nVGFnRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkmJlxuXG5jaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSxjaGVjaykpJiYoXG5yZXN0S2V5cy5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpKTtcblxuXG4gfVxucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYHVucmVjb2duaXplZCB0eXBlb2YgJHtjYW5kaWRhdGV9YCk7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PmNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKSxcblxuZXZlcnk6KF9wYXNzYWJsZSxfZm4pPT50cnVlfSk7JGjigI1fb25jZS5SZW1vdGFibGVIZWxwZXIoUmVtb3RhYmxlSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJZmFjZSI6WyJhc3NlcnRJZmFjZSJdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiJdLCJSZW1vdGFibGVIZWxwZXIiOlsiUmVtb3RhYmxlSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADXiToqaDwAAmg8AACsAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvc2FmZS1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFzc2VydFNhZmVQcm9taXNlIiwiaXNTYWZlUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc1Byb21pc2UsYXNzZXJ0Q2hlY2tlcixoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2lzRnJvemVuLGdldFByb3RvdHlwZU9mfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZX0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXM9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscyk7XG5jb25zdCBrZXlzPW93bktleXMocHIpO1xuXG5pZihrZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5jb25zdCB1bmtub3duS2V5cz1rZXlzLmZpbHRlcihcbihrZXkpPT50eXBlb2Yga2V5IT09J3N5bWJvbCd8fCFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLGtleSkpO1xuXG5cbmlmKHVua25vd25LZXlzLmxlbmd0aCE9PTApe1xucmV0dXJuIHJlamVjdChcblggYCR7cHJ9IC0gTXVzdCBub3QgaGF2ZSBhbnkgb3duIHByb3BlcnRpZXM6ICR7cSh1bmtub3duS2V5cyl9YCk7XG5cbiB9XG5cbi8qKlxuICogQXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLCBOb2RlJ3MgYXN5bmNfaG9va3MgY29udGFpbnMgdGhlXG4gKiBmb2xsb3dpbmcgY29kZSwgd2hpY2ggd2UgY2FuIGFsc28gc2FmZWx5IHRvbGVyYXRlXG4gKlxuICogYGBganNcbiAqIGZ1bmN0aW9uIGRlc3Ryb3lUcmFja2luZyhwcm9taXNlLCBwYXJlbnQpIHtcbiAqIHRyYWNrUHJvbWlzZShwcm9taXNlLCBwYXJlbnQpO1xuICogICBjb25zdCBhc3luY0lkID0gcHJvbWlzZVthc3luY19pZF9zeW1ib2xdO1xuICogICBjb25zdCBkZXN0cm95ZWQgPSB7IGRlc3Ryb3llZDogZmFsc2UgfTtcbiAqICAgcHJvbWlzZVtkZXN0cm95ZWRTeW1ib2xdID0gZGVzdHJveWVkO1xuICogICByZWdpc3RlckRlc3Ryb3lIb29rKHByb21pc2UsIGFzeW5jSWQsIGRlc3Ryb3llZCk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGtleVxuICovXG5jb25zdCBjaGVja1NhZmVBc3luY0hvb2tzS2V5PShrZXkpPT57XG5jb25zdCB2YWw9cHJba2V5XTtcbmlmKHZhbD09PXVuZGVmaW5lZHx8dHlwZW9mIHZhbD09PSdudW1iZXInKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKFxudHlwZW9mIHZhbD09PSdvYmplY3QnJiZcbnZhbCE9PW51bGwmJlxuaXNGcm96ZW4odmFsKSYmXG5nZXRQcm90b3R5cGVPZih2YWwpPT09T2JqZWN0LnByb3RvdHlwZSlcbntcbmNvbnN0IHN1YktleXM9b3duS2V5cyh2YWwpO1xuaWYoc3ViS2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuaWYoXG5zdWJLZXlzLmxlbmd0aD09PTEmJlxuc3ViS2V5c1swXT09PSdkZXN0cm95ZWQnJiZcbnZhbC5kZXN0cm95ZWQ9PT1mYWxzZSlcbntcbnJldHVybiB0cnVlO1xuIH1cbiB9XG5yZXR1cm4gcmVqZWN0KFxuWCBgVW5leHBlY3RlZCBOb2RlIGFzeW5jX2hvb2tzIGFkZGl0aW9ucyB0byBwcm9taXNlOiAke3ByfS4ke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGlzICR7dmFsfWApO1xuXG4gfTtcblxucmV0dXJuIGtleXMuZXZlcnkoY2hlY2tTYWZlQXN5bmNIb29rc0tleSk7XG4gfTtcblxuLyoqXG4gKiBVbmRlciBIYXJkZW5lZCBKUyBhIHByb21pc2UgaXMgXCJzYWZlXCIgaWYgaXRzIGB0aGVuYCBtZXRob2QgY2FuIGJlIGNhbGxlZFxuICogc3luY2hyb25vdXNseSB3aXRob3V0IGdpdmluZyB0aGUgcHJvbWlzZSBhbiBvcHBvcnR1bml0eSBmb3IgYVxuICogcmVlbnRyYW5jeSBhdHRhY2sgZHVyaW5nIHRoYXQgY2FsbC5cbiAqXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzlcbiAqIHJhaXNlcyB0aGUgaXNzdWUgb2YgdGVzdGluZyB0aGF0IGEgc3BlY2ltZW4gaXMgYSBzYWZlIHByb21pc2VcbiAqIHN1Y2ggdGhhdCB0aGUgdGVzdCBhbHNvIGRvZXMgbm90IGdpdmUgdGhlIHNwZWNpbWVuIGFcbiAqIHJlZW50cmFuY3kgb3Bwb3J0dW5pdHkuIFRoYXQgaXMgd2VsbCBiZXlvbmQgdGhlIGFtYml0aW9uIGhlcmUuXG4gKiBUT0RPIFRob3VnaCBpZiB3ZSBmaWd1cmUgb3V0IGEgbmljZSBzb2x1dGlvbiwgaXQgbWlnaHQgYmUgZ29vZCB0b1xuICogdXNlIGl0IGhlcmUgYXMgd2VsbC5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xucmV0dXJuKFxuKGlzRnJvemVuKHByKXx8cmVqZWN0KFggYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSkmJihcbmlzUHJvbWlzZShwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkpJiYoXG5nZXRQcm90b3R5cGVPZihwcik9PT1Qcm9taXNlLnByb3RvdHlwZXx8XG5yZWplY3QoXG5YIGAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG5nZXRQcm90b3R5cGVPZihwcikpXG4gfWApKSYmXG5cbmNoZWNrUHJvbWlzZU93bktleXMoLyoqIEB0eXBlIHtQcm9taXNlfSAqL3ByLGNoZWNrKSk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5jb25zdCAgICAgICAgaXNTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLCh4KT0+eCk7JGjigI1fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0U2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwcixhc3NlcnRDaGVja2VyKTskaOKAjV9vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1NhZmVQcm9taXNlIjpbImlzU2FmZVByb21pc2UiXSwiYXNzZXJ0U2FmZVByb21pc2UiOlsiYXNzZXJ0U2FmZVByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxx/VUEcSAABHEgAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9zeW1ib2wuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIGNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBUaGUgd2VsbCBrbm93biBzeW1ib2xzIGFyZSBzdGF0aWMgc3ltYm9sIHZhbHVlcyBvbiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzPW5ldyBNYXAoXG5vd25LZXlzKFN5bWJvbCkuXG5maWx0ZXIoXG4obmFtZSk9PnR5cGVvZiBuYW1lPT09J3N0cmluZycmJnR5cGVvZiBTeW1ib2xbbmFtZV09PT0nc3ltYm9sJykuXG5cbmZpbHRlcigobmFtZSk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiFuYW1lLnN0YXJ0c1dpdGgoJ0BAJyl8fFxuRmFpbCBgRGlkIG5vdCBleHBlY3QgU3ltYm9sIHRvIGhhdmUgYSBzeW1ib2wtdmFsdWVkIHByb3BlcnR5IG5hbWUgc3RhcnRpbmcgd2l0aCBcIkBAXCIgJHtxKFxubmFtZSlcbiB9YDtcbnJldHVybiB0cnVlO1xuIH0pXG4vKiBAdHMtaWdub3JlIEl0IGRvZXNuJ3Qga25vdyBuYW1lIGNhbm5vdCBiZSBhIHN5bWJvbCovLlxubWFwKChuYW1lKT0+W1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSk7XG5cblxuLyoqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzeW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZVN5bWJvbD0oc3ltKT0+XG50eXBlb2Ygc3ltPT09J3N5bWJvbCcmJihcbnR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSk9PT0nc3RyaW5nJ3x8d2VsbEtub3duU3ltYm9sTmFtZXMuaGFzKHN5bSkpOyRo4oCNX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sPShzeW0pPT5cbmlzUGFzc2FibGVTeW1ib2woc3ltKXx8XG5GYWlsIGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGVTeW1ib2woYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcblxuLyoqXG4gKiBJZiBgc3ltYCBpcyBhIHBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGEgc3RyaW5nIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzXG4gKiBzeW1ib2wuIElmIGBzeW1gIGlzIGEgbm9uLXBhc3NhYmxlIHN5bWJvbCwgcmV0dXJuIGB1bmRlZmluZWRgLlxuICpcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuIFNpbmNlIHRoZSByZWdpc3RyYXRpb24gc3RyaW5nIG9mIGEgcmVnaXN0ZXJlZCBzeW1ib2wgY2FuIGJlIGFueVxuICogc3RyaW5nLCBpZiB3ZSBzaW1wbHkgdXNlZCB0aGF0IHRvIGlkZW50aWZ5IHRob3NlIHN5bWJvbHMsIHRoZXJlIHdvdWxkIG5vdFxuICogYmUgYW55IHJlbWFpbmluZyBzdHJpbmdzIGxlZnQgb3ZlciB0byBpZGVudGlmeSB0aGUgd2VsbC1rbm93biBzeW1ib2xzLlxuICogSW5zdGVhZCwgd2UgcmVzZXJ2ZSBzdHJpbmdzIGJlZ2lubmluZyB3aXRoIGBcIkBAXCJgIGZvciBwdXJwb3NlcyBvZiB0aGlzXG4gKiBlbmNvZGluZy4gV2UgaWRlbnRpZnkgYSB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiBieSBwcmVmaXhpbmcgdGhlIHByb3BlcnR5IG5hbWUgd2l0aCBgXCJAQFwiYCwgc3VjaCBhcyBgXCJAQGl0ZXJhdG9yXCJgLlxuICogRm9yIHJlZ2lzdGVyZWQgc3ltYm9scyB3aG9zZSBuYW1lIGhhcHBlbnMgdG8gYmVnaW4gd2l0aCBgXCJAQFwiYCwgc3VjaFxuICogYXMgYFN5bWJvbC5mb3IoJ0BAaXRlcmF0b3InKWAgb3IgYFN5bWJvbC5mb3IoJ0BAZm9vJylgLCB3ZSBpZGVudGlmeVxuICogdGhlbSBieSBwcmVmaXhpbmcgdGhlbSB3aXRoIGFuIGV4dHJhIGBcIkBAXCJgLCBzdWNoIGFzXG4gKiBgXCJAQEBAaXRlcmF0b3JcImAgb3IgYFwiQEBAQGZvb1wiYC4gKFRoaXMgaXMgdGhlIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmdcbiAqIHRlY2huaXF1ZS4pXG4gKlxuICogQHBhcmFtIHtzeW1ib2x9IHN5bVxuICogQHJldHVybnMge3N0cmluZz19XG4gKi9cbmNvbnN0ICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2w9KHN5bSk9PntcbmNvbnN0IG5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYobmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gfVxuaWYobmFtZS5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBgQEAke25hbWV9YDtcbiB9XG5yZXR1cm4gbmFtZTtcbiB9OyRo4oCNX29uY2UubmFtZUZvclBhc3NhYmxlU3ltYm9sKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4obmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogSWYgYG5hbWVgIGlzIGEgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5XG4gKiBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCwgcmV0dXJuIHRoZSBzeW1ib2wgYXJndW1lbnQgaXQgd2FzIHByb2R1Y2VkIHRvXG4gKiByZXByZXNlbnQuXG4gKlxuICogICAgSWYgYG5hbWVgIGRvZXMgbm90IGJlZ2luIHdpdGggYFwiQEBcImAsIHRoZW4ganVzdCB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICByZWdpc3RlcmVkIHN5bWJvbCwgYFN5bWJvbC5mb3IobmFtZSlgLlxuICogICAgSWYgYG5hbWVgIGlzIGBcIkBAXCJgIGZvbGxvd2VkIGJ5IGEgd2VsbCBrbm93biBzeW1ib2wncyBwcm9wZXJ0eSBuYW1lIG9uXG4gKiAgICAgIGBTeW1ib2xgIHN1Y2ggYFwiQEBpdGVyYXRvclwiLCByZXR1cm4gdGhhdCB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzXG4gKiAgICAgIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiAgICBJZiBgbmFtZWAgYmVnaW5zIHdpdGggYFwiQEBAQFwiYCBpdCBlbmNvZGVzIHRoZSByZWdpc3RlcmVkIHN5bWJvbCB3aG9zZVxuICogICAgICBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGluc3RlYWQuXG4gKiAgICBPdGhlcndpc2UsIGlmIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaXQgbWF5IGVuY29kZSBhIHJlZ2lzdGVyZWQgc3ltYm9sXG4gKiAgICAgIGZyb20gYSBmdXR1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0LCBidXQgaXQgaXMgbm90IG9uZSB3ZSBjYW4gZGVjb2RlXG4gKiAgICAgIHlldCwgc28gdGhyb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2w9fVxuICovXG5jb25zdCAgICAgICAgcGFzc2FibGVTeW1ib2xGb3JOYW1lPShuYW1lKT0+e1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5pZihtYXRjaCl7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5pZihzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuIH1lbHNle1xuY29uc3Qgc3ltPVN5bWJvbFtzdWZmaXhdO1xuaWYodHlwZW9mIHN5bT09PSdzeW1ib2wnKXtcbnJldHVybiBzeW07XG4gfVxuRmFpbCBgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gfVxuIH1cbnJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xuIH07JGjigI1fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJbxc+/0HAAD9BwAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90YWdnZWQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsY2hlY2tOb3JtYWxQcm9wZXJ0eSxjaGVja1Bhc3NTdHlsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsIFskaOKAjV9hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBUYWdnZWRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTondGFnZ2VkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PlxuY2hlY2tQYXNzU3R5bGUoY2FuZGlkYXRlLCd0YWdnZWQnLGNoZWNrKSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2hlY2tUYWdSZWNvcmQoY2FuZGlkYXRlLCd0YWdnZWQnLGFzc2VydENoZWNrZXIpO1xuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06X2xhYmVsRGVzYyxcbnBheWxvYWQ6X3BheWxvYWREZXNjLC8qIHZhbHVlIGNoZWNrZWQgYnkgcmVjdXJzaXZlIHdhbGsgYXQgdGhlIGVuZCovXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xub3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxuRmFpbCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ3BheWxvYWQnLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbnBhc3NTdHlsZU9mUmVjdXIoY2FuZGlkYXRlLnBheWxvYWQpO1xuIH19KTskaOKAjV9vbmNlLlRhZ2dlZEhlbHBlcihUYWdnZWRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAeqB+aBINAAASDQAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZU9iamVjdH0gUmVtb3RhYmxlICovXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBBS0EgYSBcImNvcHlBcnJheVwiXG4gKiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyXG4gKiBAcmV0dXJucyB7YXJyIGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5jb25zdCBpc0NvcHlBcnJheT0oYXJyKT0+cGFzc1N0eWxlT2YoYXJyKT09PSdjb3B5QXJyYXknOyRo4oCNX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQsIEFLQSBhXG4gKiBcImNvcHlSZWNvcmRcIiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcmV0dXJucyB7cmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuY29uc3QgaXNSZWNvcmQ9KHJlY29yZCk9PnBhc3NTdHlsZU9mKHJlY29yZCk9PT0nY29weVJlY29yZCc7JGjigI1fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcmVtb3RhYmxlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHJldHVybnMge3JlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cbmNvbnN0IGlzUmVtb3RhYmxlPShyZW1vdGFibGUpPT5wYXNzU3R5bGVPZihyZW1vdGFibGUpPT09J3JlbW90YWJsZSc7JGjigI1fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRBcnJheVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0QXJyYXl9ICovXG5jb25zdCBhc3NlcnRDb3B5QXJyYXk9KGFycmF5LG9wdE5hbWVPZkFycmF5PSdBbGxlZ2VkIGFycmF5Jyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihhcnJheSk7XG5wYXNzU3R5bGU9PT0nY29weUFycmF5J3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2FycmF5fSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZWNvcmR9ICovXG5jb25zdCBhc3NlcnRSZWNvcmQ9KHJlY29yZCxvcHROYW1lT2ZSZWNvcmQ9J0FsbGVnZWQgcmVjb3JkJyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZWNvcmQpO1xucGFzc1N0eWxlPT09J2NvcHlSZWNvcmQnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZWNvcmQpfSAke3JlY29yZH0gbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlbW90YWJsZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlbW90YWJsZVxuICogQHJldHVybnMge2Fzc2VydHMgcmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlbW90YWJsZX0gKi9cbmNvbnN0IGFzc2VydFJlbW90YWJsZT0oXG5yZW1vdGFibGUsXG5vcHROYW1lT2ZSZW1vdGFibGU9J0FsbGVnZWQgcmVtb3RhYmxlJyk9Plxue1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlbW90YWJsZSk7XG5wYXNzU3R5bGU9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACwnEJ+4goAAOIKAAAeAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIiwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIiwiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy91dGlscy5qcyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIiwia2V5TFQiLCJrZXlMVCIsIm9iamVjdE1hcCIsIm9iamVjdE1hcCIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMva2V5cy9jaGVja0tleS5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5U2V0LmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvcHlCYWcuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW11dLFtcIi4vc3JjL3V0aWxzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjpbWyJpc0tleSIsImlzS2V5Il0sWyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiXSxbImFzc2VydFNjYWxhcktleSIsImFzc2VydFNjYWxhcktleSJdLFsibWFrZUNvcHlTZXQiLCJtYWtlQ29weVNldCJdLFsiZ2V0Q29weVNldEtleXMiLCJnZXRDb3B5U2V0S2V5cyJdLFsibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZyJdLFsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLFsiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5QmFnRW50cmllcyJdLFsibWFrZUNvcHlNYXAiLCJtYWtlQ29weU1hcCJdLFsiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjpbWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdXSwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjpbWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXV0sIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOltbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl1dLCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiOltbImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzSXNTdXBlcnNldCJdLFsiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50Il0sWyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0NvbXBhcmUiXSxbImVsZW1lbnRzVW5pb24iLCJlbGVtZW50c1VuaW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSxbImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSxbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLFsic2V0SXNTdXBlcnNldCIsInNldElzU3VwZXJzZXQiXSxbInNldElzRGlzam9pbnQiLCJzZXRJc0Rpc2pvaW50Il0sWyJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSJdLFsic2V0VW5pb24iLCJzZXRVbmlvbiJdLFsic2V0RGlzam9pbnRVbmlvbiIsInNldERpc2pvaW50VW5pb24iXSxbInNldEludGVyc2VjdGlvbiIsInNldEludGVyc2VjdGlvbiJdLFsic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50U3VidHJhY3QiXV0sIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6W1siYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOltbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJtdXN0TWF0Y2giLCJtdXN0TWF0Y2giXV0sIi4vc3JjL3V0aWxzLmpzIjpbWyJsaXN0RGlmZmVyZW5jZSIsImxpc3REaWZmZXJlbmNlIl0sWyJvYmplY3RNYXAiLCJvYmplY3RNYXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMsXGeCkRgAApEYAACoAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY2hlY2tLZXkuanN7ImltcG9ydHMiOlsiLi4vdXRpbHMuanMiLCIuL2NvcHlCYWcuanMiLCIuL2NvcHlTZXQuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUJhZyIsImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0S2V5IiwiYXNzZXJ0UHJpbWl0aXZlS2V5IiwiYXNzZXJ0U2NhbGFyS2V5IiwiY2hlY2tDb3B5QmFnIiwiY2hlY2tDb3B5TWFwIiwiY2hlY2tDb3B5U2V0IiwiY2hlY2tLZXkiLCJjaGVja1NjYWxhcktleSIsImNvcHlNYXBLZXlTZXQiLCJldmVyeUNvcHlCYWdFbnRyeSIsImV2ZXJ5Q29weU1hcEtleSIsImV2ZXJ5Q29weU1hcFZhbHVlIiwiZXZlcnlDb3B5U2V0S2V5IiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBLZXlzIiwiZ2V0Q29weU1hcFZhbHVlcyIsImdldENvcHlTZXRLZXlzIiwiaXNDb3B5QmFnIiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwiaXNLZXkiLCJpc1ByaW1pdGl2ZUtleSIsImlzU2NhbGFyS2V5IiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixhc3NlcnRQYXNzYWJsZSxGYXIsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssaWRlbnRDaGVja2VyLGNoZWNrRWxlbWVudHMsbWFrZVNldE9mRWxlbWVudHMsY2hlY2tCYWdFbnRyaWVzLG1ha2VCYWdPZkVudHJpZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL3V0aWxzLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoY2hlY2tCYWdFbnRyaWVzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXlDb21wYXJpc29ufSBLZXlDb21wYXJpc29uICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5fSBLZXkgKi9cbi8qKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5QmFnPEs+fSBDb3B5QmFnICovXG4vKiogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV0gQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ29weVNldDxLPn0gQ29weVNldCAqL1xuLyoqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtWPVBhc3NhYmxlXSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5TWFwPEssIFY+fSBDb3B5TWFwICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyZX0gS2V5Q29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8gUHJpbWl0aXZlIGFuZCBTY2FsYXIga2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQcmltaXRpdmVLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzT2JqZWN0KHZhbCkpe1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSAke3EodHlwZW9mIHZhbCl9IGNhbm5vdCBiZSBhIHByaW1pdGl2ZTogJHt2YWx9YCkpO1xuXG4gfVxuLyogVE9ETyBUaGVyZSBpcyBub3QgeWV0IGEgY2hlY2tQYXNzYWJsZSwgYnV0IHBlcmhhcHMgdGhlcmUgc2hvdWxkIGJlLiovXG4vKiBJZiB0aGF0IGhhcHBlbnMsIHdlIHNob3VsZCBjYWxsIGl0IGhlcmUgaW5zdGVhZC4qL1xuYXNzZXJ0UGFzc2FibGUodmFsKTtcbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzUHJpbWl0aXZlS2V5PSh2YWwpPT5jaGVja1ByaW1pdGl2ZUtleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzUHJpbWl0aXZlS2V5KGlzUHJpbWl0aXZlS2V5KTtcbmhhcmRlbihpc1ByaW1pdGl2ZUtleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFByaW1pdGl2ZUtleT0odmFsKT0+e1xuY2hlY2tQcmltaXRpdmVLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRQcmltaXRpdmVLZXkoYXNzZXJ0UHJpbWl0aXZlS2V5KTtcbmhhcmRlbihhc3NlcnRQcmltaXRpdmVLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja1NjYWxhcktleT0odmFsLGNoZWNrKT0+e1xuaWYoaXNQcmltaXRpdmVLZXkodmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbmlmKHBhc3NTdHlsZT09PSdyZW1vdGFibGUnKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBzY2FsYXIga2V5OiAke3ZhbH1gKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmNoZWNrU2NhbGFyS2V5KGNoZWNrU2NhbGFyS2V5KTtcbmNvbnN0ICAgICAgICBpc1NjYWxhcktleT0odmFsKT0+Y2hlY2tTY2FsYXJLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc1NjYWxhcktleShpc1NjYWxhcktleSk7XG5oYXJkZW4oaXNTY2FsYXJLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRTY2FsYXJLZXk9KHZhbCk9PntcbmNoZWNrU2NhbGFyS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0U2NhbGFyS2V5KGFzc2VydFNjYWxhcktleSk7XG5oYXJkZW4oYXNzZXJ0U2NhbGFyS2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8S2V5Pn0gKi9cbmNvbnN0IGtleU1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tLZXk9KHZhbCxjaGVjayk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihrZXlNZW1vLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCByZXN1bHQ9Y2hlY2tLZXlJbnRlcm5hbCh2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbi8qIERvbid0IGNhY2hlIHRoZSB1bmRlZmluZWQgY2FzZXMsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQgYWdhaW4qL1xuLyogd2l0aCBgYXNzZXJ0Q2hlY2tlcmAgaXQnbGwgdGhyb3cgYSBkaWFnbm9zdGljIGFnYWluKi9cbmtleU1lbW8uYWRkKHZhbCk7XG4gfVxuLyogTm90ZSB0aGF0IHdlIGRvIG5vdCBtZW1vaXplIGEgbmVnYXRpdmUganVkZ2VtZW50LCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkKi9cbi8qIGFnYWluIHdpdGggYSBjaGVja2VyLCBpdCB3aWxsIHN0aWxsIHByb2R1Y2UgYSB1c2VmdWwgZGlhZ25vc3RpYy4qL1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tLZXkoY2hlY2tLZXkpO1xuaGFyZGVuKGNoZWNrS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNLZXk9KHZhbCk9PmNoZWNrS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNLZXkoaXNLZXkpO1xuaGFyZGVuKGlzS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge0tleX0gdmFsXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRLZXk9KHZhbCk9PntcbmNoZWNrS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0S2V5KGFzc2VydEtleSk7XG5oYXJkZW4oYXNzZXJ0S2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5U2V0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlTZXQgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5U2V0Pn0gKi9cbmNvbnN0IGNvcHlTZXRNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlTZXQ9KHMsY2hlY2spPT57XG5pZihjb3B5U2V0TWVtby5oYXMocykpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVzdWx0PVxuKHBhc3NTdHlsZU9mKHMpPT09J3RhZ2dlZCcmJmdldFRhZyhzKT09PSdjb3B5U2V0J3x8XG5jaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5U2V0OiAke3N9YCkpJiZcbmNoZWNrRWxlbWVudHMocy5wYXlsb2FkLGNoZWNrKSYmXG5jaGVja0tleShzLnBheWxvYWQsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvcHlTZXRNZW1vLmFkZChzKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlTZXQoY2hlY2tDb3B5U2V0KTtcbmhhcmRlbihjaGVja0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHtzIGlzIENvcHlTZXR9XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlTZXR9ICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0PShzKT0+Y2hlY2tDb3B5U2V0KHMsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHMgaXMgQ29weVNldH1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlTZXR9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weVNldD0ocyk9PntcbmNoZWNrQ29weVNldChzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5U2V0KGFzc2VydENvcHlTZXQpO1xuaGFyZGVuKGFzc2VydENvcHlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5U2V0S2V5cz0ocyk9PntcbmFzc2VydENvcHlTZXQocyk7XG5yZXR1cm4gcy5wYXlsb2FkO1xuIH07JGjigI1fb25jZS5nZXRDb3B5U2V0S2V5cyhnZXRDb3B5U2V0S2V5cyk7XG5oYXJkZW4oZ2V0Q29weVNldEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5U2V0S2V5PShzLGZuKT0+XG5nZXRDb3B5U2V0S2V5cyhzKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlTZXRLZXkoZXZlcnlDb3B5U2V0S2V5KTtcbmhhcmRlbihldmVyeUNvcHlTZXRLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weVNldD0oZWxlbWVudEl0ZXIpPT57XG5jb25zdCByZXN1bHQ9bWFrZVNldE9mRWxlbWVudHMoZWxlbWVudEl0ZXIpO1xuYXNzZXJ0Q29weVNldChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlTZXQobWFrZUNvcHlTZXQpO1xuaGFyZGVuKG1ha2VDb3B5U2V0KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5QmFnIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlCYWcgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5QmFnPn0gKi9cbmNvbnN0IGNvcHlCYWdNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlCYWc9KGIsY2hlY2spPT57XG5pZihjb3B5QmFnTWVtby5oYXMoYikpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVzdWx0PVxuKHBhc3NTdHlsZU9mKGIpPT09J3RhZ2dlZCcmJmdldFRhZyhiKT09PSdjb3B5QmFnJ3x8XG5jaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5QmFnOiAke2J9YCkpJiZcbmNoZWNrQmFnRW50cmllcyhiLnBheWxvYWQsY2hlY2spJiZcbmNoZWNrS2V5KGIucGF5bG9hZCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29weUJhZ01lbW8uYWRkKGIpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrQ29weUJhZyhjaGVja0NvcHlCYWcpO1xuaGFyZGVuKGNoZWNrQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIElzQ29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2IgaXMgQ29weUJhZ31cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlCYWc9KGIpPT5jaGVja0NvcHlCYWcoYixpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5QmFnKGlzQ29weUJhZyk7XG5oYXJkZW4oaXNDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weUJhZ1xuICogQHBhcmFtIHtQYXNzYWJsZX0gYlxuICogQHJldHVybnMge2Fzc2VydHMgYiBpcyBDb3B5QmFnfVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5QmFnPShiKT0+e1xuY2hlY2tDb3B5QmFnKGIsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlCYWcoYXNzZXJ0Q29weUJhZyk7XG5oYXJkZW4oYXNzZXJ0Q29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHJldHVybnMge0NvcHlCYWc8Sz5bJ3BheWxvYWQnXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlCYWdFbnRyaWVzPShiKT0+e1xuYXNzZXJ0Q29weUJhZyhiKTtcbnJldHVybiBiLnBheWxvYWQ7XG4gfTskaOKAjV9vbmNlLmdldENvcHlCYWdFbnRyaWVzKGdldENvcHlCYWdFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5QmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHBhcmFtIHsoZW50cnk6IFtLLCBiaWdpbnRdLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlCYWdFbnRyeT0oYixmbik9PlxuZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LGluZGV4KT0+Zm4oZW50cnksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weUJhZz0oYmFnRW50cnlJdGVyKT0+e1xuY29uc3QgcmVzdWx0PW1ha2VCYWdPZkVudHJpZXMoYmFnRW50cnlJdGVyKTtcbmFzc2VydENvcHlCYWcocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5QmFnKG1ha2VDb3B5QmFnKTtcbmhhcmRlbihtYWtlQ29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzPShlbGVtZW50SXRlcik9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuY29uc3Qgc29ydGVkPXNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsZnVsbENvbXBhcmUpO1xuLyoqIEB0eXBlIHtbSyxiaWdpbnRdW119ICovXG5jb25zdCBlbnRyaWVzPVtdO1xuZm9yKGxldCBpPTA7aTxzb3J0ZWQubGVuZ3RoOyl7XG5jb25zdCBrPXNvcnRlZFtpXTtcbmxldCBqPWkrMTtcbndoaWxlKGo8c29ydGVkLmxlbmd0aCYmZnVsbENvbXBhcmUoayxzb3J0ZWRbal0pPT09MCl7XG5qKz0xO1xuIH1cbmVudHJpZXMucHVzaChbayxCaWdJbnQoai1pKV0pO1xuaT1qO1xuIH1cbnJldHVybiBtYWtlQ29weUJhZyhlbnRyaWVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlCYWdGcm9tRWxlbWVudHMobWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5TWFwIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlNYXAncyBrZXlzIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weU1hcD59ICovXG5jb25zdCBjb3B5TWFwTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5TWFwPShtLGNoZWNrKT0+e1xuaWYoY29weU1hcE1lbW8uaGFzKG0pKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKCEocGFzc1N0eWxlT2YobSk9PT0ndGFnZ2VkJyYmZ2V0VGFnKG0pPT09J2NvcHlNYXAnKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgTm90IGEgY29weU1hcDogJHttfWApO1xuIH1cbmNvbnN0e3BheWxvYWR9PW07XG5pZihwYXNzU3R5bGVPZihwYXlsb2FkKSE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IGJlIGEgcmVjb3JkOiAke219YCk7XG4gfVxuY29uc3R7a2V5cyx2YWx1ZXMsLi4ucmVzdH09cGF5bG9hZDtcbmNvbnN0IHJlc3VsdD1cbihvd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBvbmx5IGhhdmUgLmtleXMgYW5kIC52YWx1ZXM6ICR7bX1gKSkmJlxuXG5jaGVja0VsZW1lbnRzKGtleXMsY2hlY2spJiZcbmNoZWNrS2V5KGtleXMsY2hlY2spJiYoXG5wYXNzU3R5bGVPZih2YWx1ZXMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgQSBjb3B5TWFwJ3MgLnZhbHVlcyBtdXN0IGJlIGEgY29weUFycmF5OiAke219YCkpJiYoXG5rZXlzLmxlbmd0aD09PXZhbHVlcy5sZW5ndGh8fFxuY2hlY2soXG5mYWxzZSxcblggYEEgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXMgYW5kIHZhbHVlczogJHttfWApKTtcblxuaWYocmVzdWx0KXtcbmNvcHlNYXBNZW1vLmFkZChtKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlNYXAoY2hlY2tDb3B5TWFwKTtcbmhhcmRlbihjaGVja0NvcHlNYXApO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHttIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlNYXB9ICovXG5jb25zdCAgICAgICAgaXNDb3B5TWFwPShtKT0+Y2hlY2tDb3B5TWFwKG0saWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuaGFyZGVuKGlzQ29weU1hcCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlNYXBcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHthc3NlcnRzIG0gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlNYXB9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weU1hcD0obSk9PntcbmNoZWNrQ29weU1hcChtLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5TWFwKGFzc2VydENvcHlNYXApO1xuaGFyZGVuKGFzc2VydENvcHlNYXApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0tbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBLZXlzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQua2V5cztcbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcEtleXMoZ2V0Q29weU1hcEtleXMpO1xuaGFyZGVuKGdldENvcHlNYXBLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtWW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwVmFsdWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQudmFsdWVzO1xuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwVmFsdWVzKGdldENvcHlNYXBWYWx1ZXMpO1xuaGFyZGVuKGdldENvcHlNYXBWYWx1ZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBFbnRyaWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbmNvbnN0e1xucGF5bG9hZDp7a2V5cyx2YWx1ZXN9fT1cbm07XG5jb25zdHtsZW5ndGh9PS8qKiBAdHlwZSB7QXJyYXl9ICova2V5cztcbnJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmF0b3InLHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8W0ssVl0sdm9pZD59ICovXG5sZXQgcmVzdWx0O1xuaWYoaTxsZW5ndGgpe1xucmVzdWx0PWhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTpba2V5c1tpXSx2YWx1ZXNbaV1dfSk7XG5pKz0xO1xucmV0dXJuIHJlc3VsdDtcbiB9ZWxzZXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH19KTtcblxuIH19KTtcblxuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlNYXBLZXk9KG0sZm4pPT5cbmdldENvcHlNYXBLZXlzKG0pLmV2ZXJ5KChrZXksaW5kZXgpPT5mbihrZXksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weU1hcEtleShldmVyeUNvcHlNYXBLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyh2YWx1ZTogViwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwVmFsdWU9KG0sZm4pPT5cbmdldENvcHlNYXBWYWx1ZXMobSkuZXZlcnkoKHZhbHVlLGluZGV4KT0+Zm4odmFsdWUsaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weU1hcFZhbHVlKGV2ZXJ5Q29weU1hcFZhbHVlKTtcbmhhcmRlbihldmVyeUNvcHlNYXBWYWx1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIGNvcHlNYXBLZXlTZXQ9KG0pPT5cbi8qIEEgY29weU1hcCdzIGtleXMgYXJlIGFscmVhZHkgaW4gdGhlIGludGVybmFsIGZvcm0gdXNlZCBieSBjb3B5U2V0cy4qL1xubWFrZVRhZ2dlZCgnY29weVNldCcsbS5wYXlsb2FkLmtleXMpOyRo4oCNX29uY2UuY29weU1hcEtleVNldChjb3B5TWFwS2V5U2V0KTtcbmhhcmRlbihjb3B5TWFwS2V5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgVl0+fSBlbnRyaWVzXG4gKiBAcmV0dXJucyB7Q29weU1hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlNYXA9KGVudHJpZXMpPT57XG4vKiBUaGlzIGlzIHdlaXJkLCBidXQgcmV2ZXJzZSByYW5rIHNvcnRpbmcgdGhlIGVudHJpZXMgaXMgYSBnb29kIGZpcnN0IHN0ZXAqL1xuLyogZm9yIGdldHRpbmcgdGhlIHJhbmsgc29ydGVkIGtleXMgdG9nZXRoZXIgd2l0aCB0aGUgdmFsdWVzKi9cbi8qIG9yZ2FuaXplZCBieSB0aG9zZSBrZXlzLiBBbHNvLCBhbW9uZyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoKi9cbi8qIGtleXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MsIHRob3NlIGFyZSByYW5rIHNvcnRlZC4qL1xuLyogVE9ETyBUaGlzKi9cbi8qIGNvdWxkIHNvbHZlIHRoZSBjb3B5TWFwIGNvdmVyIGlzc3VlIGV4cGxhaW5lZCBpbiBwYXR0ZXJuTWF0Y2hlcnMuanMuKi9cbi8qIEJ1dCBvbmx5IGlmIHdlIGluY2x1ZGUgdGhpcyBjcml0ZXJpYSBpbiBvdXIgdmFsaWRhdGlvbiBvZiBjb3B5TWFwcywqL1xuLyogd2hpY2ggd2UgY3VycmVudGx5IGRvIG5vdC4qL1xuY29uc3Qgc29ydGVkRW50cmllcz1zb3J0QnlSYW5rKGVudHJpZXMsY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0IGtleXM9c29ydGVkRW50cmllcy5tYXAoKFtrLF92XSk9PmspO1xuY29uc3QgdmFsdWVzPXNvcnRlZEVudHJpZXMubWFwKChbX2ssdl0pPT52KTtcbmNvbnN0IHJlc3VsdD1tYWtlVGFnZ2VkKCdjb3B5TWFwJyx7a2V5cyx2YWx1ZXN9KTtcbmFzc2VydENvcHlNYXAocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5TWFwKG1ha2VDb3B5TWFwKTtcbmhhcmRlbihtYWtlQ29weU1hcCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIFJlY3VyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0tleUludGVybmFsPSh2YWwsY2hlY2spPT57XG5jb25zdCBjaGVja0l0PShjaGlsZCk9PmNoZWNrS2V5KGNoaWxkLGNoZWNrKTtcblxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuLyogQSBjb3B5UmVjb3JkIGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiBPYmplY3QudmFsdWVzKHZhbCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEga2V5IGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSBrZXlzKi9cbnJldHVybiB2YWwuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHZhbCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4oXG5jaGVja0NvcHlNYXAodmFsLGNoZWNrKSYmXG4vKiBGb3IgYSBjb3B5TWFwIHRvIGJlIGEga2V5LCBhbGwgaXRzIGtleXMgYW5kIHZhbHVlcyBtdXN0Ki9cbi8qIGJlIGtleXMuIEtleXMgYWxyZWFkeSBjaGVja2VkIGJ5IGBjaGVja0NvcHlNYXBgIHNpbmNlKi9cbi8qIHRoYXQncyBhIGNvcHlNYXAgcmVxdWlyZW1lbnQgaW4gZ2VuZXJhbC4qL1xuZXZlcnlDb3B5TWFwVmFsdWUodmFsLGNoZWNrSXQpKTtcblxuIH1cbmRlZmF1bHQ6e1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHt2YWx9YCkpO1xuXG4gfX1cblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG4vKiBBbGwgcmVtb3RhYmxlcyBhcmUga2V5cy4qL1xucmV0dXJuIHRydWU7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBrZXlgKTtcbiB9XG5kZWZhdWx0Ontcbi8qIFVuZXhwZWN0ZWQgdGFncyBhcmUganVzdCBub24ta2V5cywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbi8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3ZhbH1gO1xuIH19XG5cbiB9O1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJpbWl0aXZlS2V5IjpbImlzUHJpbWl0aXZlS2V5Il0sImFzc2VydFByaW1pdGl2ZUtleSI6WyJhc3NlcnRQcmltaXRpdmVLZXkiXSwiY2hlY2tTY2FsYXJLZXkiOlsiY2hlY2tTY2FsYXJLZXkiXSwiaXNTY2FsYXJLZXkiOlsiaXNTY2FsYXJLZXkiXSwiYXNzZXJ0U2NhbGFyS2V5IjpbImFzc2VydFNjYWxhcktleSJdLCJjaGVja0tleSI6WyJjaGVja0tleSJdLCJpc0tleSI6WyJpc0tleSJdLCJhc3NlcnRLZXkiOlsiYXNzZXJ0S2V5Il0sImNoZWNrQ29weVNldCI6WyJjaGVja0NvcHlTZXQiXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCJdLCJhc3NlcnRDb3B5U2V0IjpbImFzc2VydENvcHlTZXQiXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiXSwiZXZlcnlDb3B5U2V0S2V5IjpbImV2ZXJ5Q29weVNldEtleSJdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCJdLCJjaGVja0NvcHlCYWciOlsiY2hlY2tDb3B5QmFnIl0sImlzQ29weUJhZyI6WyJpc0NvcHlCYWciXSwiYXNzZXJ0Q29weUJhZyI6WyJhc3NlcnRDb3B5QmFnIl0sImdldENvcHlCYWdFbnRyaWVzIjpbImdldENvcHlCYWdFbnRyaWVzIl0sImV2ZXJ5Q29weUJhZ0VudHJ5IjpbImV2ZXJ5Q29weUJhZ0VudHJ5Il0sIm1ha2VDb3B5QmFnIjpbIm1ha2VDb3B5QmFnIl0sIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIjpbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sImNoZWNrQ29weU1hcCI6WyJjaGVja0NvcHlNYXAiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJhc3NlcnRDb3B5TWFwIjpbImFzc2VydENvcHlNYXAiXSwiZ2V0Q29weU1hcEtleXMiOlsiZ2V0Q29weU1hcEtleXMiXSwiZ2V0Q29weU1hcFZhbHVlcyI6WyJnZXRDb3B5TWFwVmFsdWVzIl0sImdldENvcHlNYXBFbnRyaWVzIjpbImdldENvcHlNYXBFbnRyaWVzIl0sImV2ZXJ5Q29weU1hcEtleSI6WyJldmVyeUNvcHlNYXBLZXkiXSwiZXZlcnlDb3B5TWFwVmFsdWUiOlsiZXZlcnlDb3B5TWFwVmFsdWUiXSwiY29weU1hcEtleVNldCI6WyJjb3B5TWFwS2V5U2V0Il0sIm1ha2VDb3B5TWFwIjpbIm1ha2VDb3B5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPfmwlF3GgAAdxoAAC0AAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY29tcGFyZUtleXMuanN7ImltcG9ydHMiOlsiLi9jaGVja0tleS5qcyIsIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4vbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJjb21wYXJlS2V5cyIsImtleUVRIiwia2V5R1QiLCJrZXlHVEUiLCJrZXlMVCIsImtleUxURSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixnZXRUYWcsY29tcGFyZVJhbmsscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLGFzc2VydEtleSxiYWdDb21wYXJlLHNldENvbXBhcmU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXSxbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dLFtcIi4vY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXV1dLFtcIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnQ29tcGFyZVwiLCBbJGjigI1fYSA9PiAoYmFnQ29tcGFyZSA9ICRo4oCNX2EpXV1dXSxbXCIuL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcInNldENvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKHNldENvbXBhcmUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyZX0gKi9cbmNvbnN0ICAgICAgICBjb21wYXJlS2V5cz0obGVmdCxyaWdodCk9PntcbmFzc2VydEtleShsZWZ0KTtcbmFzc2VydEtleShyaWdodCk7XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xuLyogRGlmZmVyZW50IHBhc3NTdHlsZXMgYXJlIGluY29tbWVuc3VyYXRlKi9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzp7XG4vKiBmb3IgdGhlc2UsIGtleXMgY29tcGFyZSB0aGUgc2FtZSBhcyByYW5rKi9cbnJldHVybiBjb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ251bWJlcic6e1xuY29uc3QgcmFua0NvbXA9Y29tcGFyZVJhbmsobGVmdCxyaWdodCk7XG5pZihyYW5rQ29tcD09PTApe1xucmV0dXJuIDA7XG4gfVxuaWYoTnVtYmVyLmlzTmFOKGxlZnQpfHxOdW1iZXIuaXNOYU4ocmlnaHQpKXtcbi8qIE5hTiBpcyBlcXVhbCB0byBpdHNlbGYsIGJ1dCBpbmNvbW1lbnN1cmF0ZSB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSovXG5hc3NlcnQoIU51bWJlci5pc05hTihsZWZ0KXx8IU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIE5hTjtcbiB9XG4vKiBBbW9uZyBub24tTmFOIG51bWJlcnMsIGtleSBvcmRlciBpcyB0aGUgc2FtZSBhcyByYW5rIG9yZGVyLiBOb3RlIHRoYXQqL1xuLyogaW4gYm90aCBvcmRlcnMsIGAtMGAgaXMgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3MgYXMgYDBgLiovXG5yZXR1cm4gcmFua0NvbXA7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmlmKGxlZnQ9PT1yaWdodCl7XG5yZXR1cm4gMDtcbiB9XG4vKiBJZiB0d28gcmVtb3RhYmxlcyBhcmUgbm90IGlkZW50aWNhbCwgdGhlbiBhcyBrZXlzIHRoZXkgYXJlKi9cbi8qIGluY29tbWVuc3VyYXRlLiovXG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGtleSBvcmRlci4gUmFuayBvcmRlciBvZiBhcnJheXMgaXMgbGV4aWNvZ3JhcGhpYyBieSovXG4vKiByYW5rIG9yZGVyLiovXG4vKiBCZWNhdXNlIHRoZSBpbnZhcmlhbnRzIGFib3ZlIGFwcGx5IHRvIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXksKi9cbi8qIHRoZXkgYXBwbHkgdG8gdGhlIGFycmF5IGFzIGEgd2hvbGUuKi9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jb25zdCByZXN1bHQ9Y29tcGFyZUtleXMobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyBhcmUga2V5RVEsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbi8qIFRodXMsIGlmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGlzIHNtYWxsZXIgdGhhbiBZLiovXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIFBhcmV0byBwYXJ0aWFsIG9yZGVyIGNvbXBhcmlzb24uKi9cbmNvbnN0IGxlZnROYW1lcz1yZWNvcmROYW1lcyhsZWZ0KTtcbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIWtleUVRKGxlZnROYW1lcyxyaWdodE5hbWVzKSl7XG4vKiBJZiB0aGV5IGRvIG5vdCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydGllcywqL1xuLyogdGhleSBhcmUgaW5jb21tZW5zdXJhdGUuKi9cbi8qIE5vdGUgdGhhdCByYW5rIHNvcnRpbmcgb2YgY29weVJlY29yZHMgZ3JvdXBzIGFsbCBjb3B5UmVjb3JkcyB3aXRoKi9cbi8qIHRoZSBzYW1lIGtleXMgdG9nZXRoZXIsIGVuYWJsaW5nIHJhbmdlIHNlYXJjaGluZyBvdmVyIGNvcHlSZWNvcmRzKi9cbi8qIHRvIGF2b2lkIG1vcmUgaXJyZWxldmFudCBvbmVzLiovXG5yZXR1cm4gTmFOO1xuIH1cbmNvbnN0IGxlZnRWYWx1ZXM9cmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKTtcbmNvbnN0IHJpZ2h0VmFsdWVzPXJlY29yZFZhbHVlcyhyaWdodCxyaWdodE5hbWVzKTtcbi8qIFByZXN1bWUgdGhhdCBib3RoIGNvcHlSZWNvcmRzIGhhdmUgdGhlIHNhbWUga2V5IG9yZGVyKi9cbi8qIHVudGlsIGVuY291bnRlcmluZyBhIHByb3BlcnR5IGRpc3Byb3ZpbmcgdGhhdCBoeXBvdGhlc2lzLiovXG5sZXQgcmVzdWx0PTA7XG5mb3IobGV0IGk9MDtpPGxlZnRWYWx1ZXMubGVuZ3RoO2krPTEpe1xuY29uc3QgY29tcD1jb21wYXJlS2V5cyhsZWZ0VmFsdWVzW2ldLHJpZ2h0VmFsdWVzW2ldKTtcbmlmKE51bWJlci5pc05hTihjb21wKSl7XG5yZXR1cm4gTmFOO1xuIH1cbmlmKHJlc3VsdCE9PWNvbXAmJmNvbXAhPT0wKXtcbmlmKHJlc3VsdD09PTApe1xucmVzdWx0PWNvbXA7XG4gfWVsc2V7XG5hc3NlcnQoXG5yZXN1bHQ9PT0tMSYmY29tcD09PTF8fHJlc3VsdD09PTEmJmNvbXA9PT0tMSk7XG5cbnJldHVybiBOYU47XG4gfVxuIH1cbiB9XG4vKiBJZiBjb3B5UmVjb3JkIFggaXMgc21hbGxlciB0aGFuIGNvcHlSZWNvcmQgWSwgdGhlbiB0aGV5IG11c3QgaGF2ZSB0aGUqL1xuLyogc2FtZSBwcm9wZXJ0eSBuYW1lcyBhbmQgZXZlcnkgdmFsdWUgaW4gWCBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8qL1xuLyogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW4gWSAod2l0aCBhdCBsZWFzdCBvbmUgdmFsdWUgc21hbGxlcikuKi9cbi8qIFRoZSByYW5rIG9yZGVyIG9mIFggYW5kIFkgaXMgYmFzZWQgb24gbGV4aWNvZ3JhcGhpYyByYW5rIG9yZGVyIG9mKi9cbi8qIHRoZWlyIHZhbHVlcywgYXMgb3JnYW5pemVkIGJ5IHJldmVyc2UgbGV4aWNvZ3JhcGhpYyBvcmRlciBvZiB0aGVpciovXG4vKiBwcm9wZXJ0eSBuYW1lcy4qL1xuLyogVGh1cyBpZiBjb21wYXJlS2V5cyhYLFkpIDwgMCB0aGVuIGNvbXBhcmVSYW5rKFgsWSkgPCAwLiovXG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCBsZWZ0VGFnPWdldFRhZyhsZWZ0KTtcbmNvbnN0IHJpZ2h0VGFnPWdldFRhZyhyaWdodCk7XG5pZihsZWZ0VGFnIT09cmlnaHRUYWcpe1xuLyogZGlmZmVyZW50IHRhZ3MgYXJlIGluY29tbWVuc3VyYXRlKi9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRUYWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG4vKiBjb3B5U2V0IFggaXMgc21hbGxlciB0aGFuIGNvcHlTZXQgWSB3aGVuIGV2ZXJ5IGVsZW1lbnQgb2YgWCovXG4vKiBpcyBrZXlFUSB0byBzb21lIGVsZW1lbnQgb2YgWSBhbmQgc29tZSBlbGVtZW50IG9mIFkgaXMqL1xuLyogbm90IGtleUVRIHRvIGFueSBlbGVtZW50IG9mIFguKi9cbnJldHVybiBzZXRDb21wYXJlKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnY29weUJhZyc6e1xuLyogY29weUJhZyBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5QmFnIFkgd2hlbiBldmVyeSBlbGVtZW50IG9mIFgqL1xuLyogb2NjdXJzIG5vIG1vcmUgdGhhbiB0aGUga2V5RVEgZWxlbWVudCBvZiBZLCBhbmQgc29tZSBlbGVtZW50Ki9cbi8qIG9mIFkgb2NjdXJzIG1vcmUgdGhhbiBzb21lIGVsZW1lbnQgb2YgWCwgd2hlcmUgYmVpbmcgYWJzZW50Ki9cbi8qIGZyb20gWCBjb3VudHMgYXMgb2NjdXJyaW5nIHplcm8gdGltZXMuKi9cbnJldHVybiBiYWdDb21wYXJlKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogVHdvIGNvcHlNYXBzIHRoYXQgaGF2ZSBkaWZmZXJlbnQga2V5cyAoYWNjb3JkaW5nIHRvIGtleUVRKSBhcmUqL1xuLyogaW5jb21tZW5zdXJhdGUuIFRoZSByZXByZXNlbnRhdGlvbiBvZiBjb3B5TWFwcyBpbmNsdWRlcyB0aGUga2V5cyovXG4vKiBmaXJzdCwgaW4gdGhlIHNhbWUgcmV2ZXJzZSByYW5rIG9yZGVyIHVzZWQgYnkgc2V0cy4gVGh1cywgYWxsKi9cbi8qIGNvcHlNYXBzIHdpdGgga2V5cyBvZiB0aGUgc2FtZSByYW5rICh3aGljaCBpcyovXG4vKiBsZXNzIHByZWNpc2UhKSB3aWxsIGJlIGdyb3VwZWQgdG9nZXRoZXIgd2hlbiBjb3B5TWFwcyBhcmUgc29ydGVkKi9cbi8qIGJ5IHJhbmssIG1pbmltaXppbmcgdGhlIG51bWJlciBvZiBtaXNzZXMgd2hlbiByYW5nZSBzZWFyY2hpbmcuKi9cbi8qKi9cbi8qIEFtb25nIGNvcHlNYXBzIHdpdGggdGhlIHNhbWUga2V5cyAoYWNjb3JkaW5nIHRvIGtleUVRKSwgdGhleSovXG4vKiBjb21wYXJlIGJ5IGEgY29ycmVzcG9uZGluZyBjb21wYXJpc29uIG9mIHRoZWlyIHZhbHVlcy4gVGh1cywgYXMqL1xuLyogd2l0aCByZWNvcmRzLCBmb3IgdHdvIGNvcHlNYXBzIFggYW5kIFksIGlmIGBjb21wYXJlS2V5cyhYLFkpIDwqL1xuLyogMGAgdGhlbiwgYmVjYXVzZSB0aGVzZSB2YWx1ZXMgb2JleSB0aGUgYWJvdmUgaW52YXJpYW50cywgbm9uZSBvZiovXG4vKiB0aGUgdmFsdWVzIGluIFggaGF2ZSBhIGxhdGVyIHJhbmsgdGhhbiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSovXG4vKiBvZiBZLiBUaHVzLCBgY29tcGFyZVJhbmsoWCxZKSA8PSAwYC4gVE9ETyBpbXBsZW1lbnQqL1xudGhyb3cgRmFpbCBgTWFwIGNvbXBhcmlzb24gbm90IHlldCBpbXBsZW1lbnRlZDogJHtsZWZ0fSB2cyAke3JpZ2h0fWA7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YDtcbiB9fVxuXG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EobGVmdFN0eWxlKX06ICR7bGVmdH1gO1xuIH19XG5cbiB9OyRo4oCNX29uY2UuY29tcGFyZUtleXMoY29tcGFyZUtleXMpO1xuaGFyZGVuKGNvbXBhcmVLZXlzKTtcblxuY29uc3QgICAgICAgIGtleUxUPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk8MDskaOKAjV9vbmNlLmtleUxUKGtleUxUKTtcbmhhcmRlbihrZXlMVCk7XG5cbmNvbnN0ICAgICAgICBrZXlMVEU9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KTw9MDskaOKAjV9vbmNlLmtleUxURShrZXlMVEUpO1xuaGFyZGVuKGtleUxURSk7XG5cbmNvbnN0ICAgICAgICBrZXlFUT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPT09MDskaOKAjV9vbmNlLmtleUVRKGtleUVRKTtcbmhhcmRlbihrZXlFUSk7XG5cbmNvbnN0ICAgICAgICBrZXlHVEU9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT49MDskaOKAjV9vbmNlLmtleUdURShrZXlHVEUpO1xuaGFyZGVuKGtleUdURSk7XG5cbmNvbnN0ICAgICAgICBrZXlHVD0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPjA7JGjigI1fb25jZS5rZXlHVChrZXlHVCk7XG5oYXJkZW4oa2V5R1QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvbXBhcmVLZXlzIjpbImNvbXBhcmVLZXlzIl0sImtleUxUIjpbImtleUxUIl0sImtleUxURSI6WyJrZXlMVEUiXSwia2V5RVEiOlsia2V5RVEiXSwia2V5R1RFIjpbImtleUdURSJdLCJrZXlHVCI6WyJrZXlHVCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABVIML9KhQAACoUAAApAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL2NvcHlCYWcuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydEJhZ0VudHJpZXMiLCJhc3NlcnROb0R1cGxpY2F0ZUtleXMiLCJjaGVja0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiLCJtYWtlQmFnT2ZFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChpc1JhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5QmFnPEs+fSBDb3B5QmFnICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5fSBLZXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5XG4gKiBrbm93biB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdFxuICogcmF0aGVyIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmVcbiAqIGFycmF5IGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlLWtleXMgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuLyogU2luY2UgdGhlIGtleSBpcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gdGhlIHZhbHVlICh0aGUgY291bnQpLCovXG4vKiBzb3J0aW5nIGJ5IGZ1bGxPcmRlciBpcyBndWFyYW50ZWVkIHRvIG1ha2UgZHVwbGljYXRlIGtleXMqL1xuLyogYWRqYWNlbnQgaW5kZXBlbmRlbnQgb2YgdGhlaXIgY291bnRzLiovXG5iYWdFbnRyaWVzPXNvcnRCeVJhbmsoYmFnRW50cmllcyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5mb3IobGV0IGk9MTtpPGxlbmd0aDtpKz0xKXtcbmNvbnN0IGswPWJhZ0VudHJpZXNbaS0xXVswXTtcbmNvbnN0IGsxPWJhZ0VudHJpZXNbaV1bMF07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZT11bmRlZmluZWQpPT57XG5jaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKGFzc2VydE5vRHVwbGljYXRlS2V5cyk7XG5jb25zdCAgICAgICAgY2hlY2tCYWdFbnRyaWVzPShiYWdFbnRyaWVzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoYmFnRW50cmllcykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rKSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmZvcihjb25zdCBlbnRyeSBvZiBiYWdFbnRyaWVzKXtcbmlmKFxucGFzc1N0eWxlT2YoZW50cnkpIT09J2NvcHlBcnJheSd8fFxuZW50cnkubGVuZ3RoIT09Mnx8XG50eXBlb2YgZW50cnlbMV0hPT0nYmlnaW50JylcbntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbmlmKGVudHJ5WzFdPDEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyx1bmRlZmluZWQsY2hlY2spO1xuIH07JGjigI1fb25jZS5jaGVja0JhZ0VudHJpZXMoY2hlY2tCYWdFbnRyaWVzKTtcbmhhcmRlbihjaGVja0JhZ0VudHJpZXMpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrIC0tIGRvZXNuJ3QgdW5kZXJzdGFuZCBhc3NlcnRzKi9cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiYWdFbnRyaWVzIGlzIFtQYXNzYWJsZSxiaWdpbnRdW119XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRCYWdFbnRyaWVzPShiYWdFbnRyaWVzKT0+e1xuY2hlY2tCYWdFbnRyaWVzKGJhZ0VudHJpZXMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEJhZ0VudHJpZXMoYXNzZXJ0QmFnRW50cmllcyk7XG5oYXJkZW4oYXNzZXJ0QmFnRW50cmllcyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0JhZ0VudHJpZXM9KGJhZ0VudHJpZXNMaXN0KT0+e1xuY29uc3QgYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXNMaXN0LGNvbXBhcmVBbnRpUmFuayk7XG5hc3NlcnRCYWdFbnRyaWVzKGJhZ0VudHJpZXMpO1xucmV0dXJuIGJhZ0VudHJpZXM7XG4gfTskaOKAjV9vbmNlLmNvZXJjZVRvQmFnRW50cmllcyhjb2VyY2VUb0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNvZXJjZVRvQmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUJhZ09mRW50cmllcz0oYmFnRW50cnlJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5QmFnJyxjb2VyY2VUb0JhZ0VudHJpZXMoYmFnRW50cnlJdGVyKSk7JGjigI1fb25jZS5tYWtlQmFnT2ZFbnRyaWVzKG1ha2VCYWdPZkVudHJpZXMpO1xuaGFyZGVuKG1ha2VCYWdPZkVudHJpZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACh3+v6MQAACjEAAAKQAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMva2V5cy9jb3B5U2V0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVtZW50cyIsImFzc2VydE5vRHVwbGljYXRlcyIsImNoZWNrRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIiwibWFrZVNldE9mRWxlbWVudHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuazskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuLyoqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkNvcHlTZXQ8Sz59IENvcHlTZXQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXl9IEtleSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBlbGVtZW50c2AgaXMgYWxyZWFkeSBrbm93blxuICogdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXQgcmF0aGVyXG4gKiB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlIGFycmF5XG4gKiBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZSBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50cyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWVsZW1lbnRzO1xuZm9yKGxldCBpPTE7aTxsZW5ndGg7aSs9MSl7XG5jb25zdCBrMD1lbGVtZW50c1tpLTFdO1xuY29uc3QgazE9ZWxlbWVudHNbaV07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlczogJHtrMH1gKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlcz0oZWxlbWVudHMsZnVsbENvbXBhcmU9dW5kZWZpbmVkKT0+e1xuY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsZnVsbENvbXBhcmUsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVzKGFzc2VydE5vRHVwbGljYXRlcyk7XG5jb25zdCAgICAgICAgY2hlY2tFbGVtZW50cz0oZWxlbWVudHMsY2hlY2spPT57XG5pZihwYXNzU3R5bGVPZihlbGVtZW50cykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuaykpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7ZWxlbWVudHN9YCk7XG5cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsdW5kZWZpbmVkLGNoZWNrKTtcbiB9OyRo4oCNX29uY2UuY2hlY2tFbGVtZW50cyhjaGVja0VsZW1lbnRzKTtcbmhhcmRlbihjaGVja0VsZW1lbnRzKTtcblxuY29uc3QgICAgICAgIGFzc2VydEVsZW1lbnRzPShlbGVtZW50cyk9PntcbmNoZWNrRWxlbWVudHMoZWxlbWVudHMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEVsZW1lbnRzKGFzc2VydEVsZW1lbnRzKTtcbmhhcmRlbihhc3NlcnRFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0VsZW1lbnRzPShlbGVtZW50c0xpc3QpPT57XG5jb25zdCBlbGVtZW50cz1zb3J0QnlSYW5rKGVsZW1lbnRzTGlzdCxjb21wYXJlQW50aVJhbmspO1xuYXNzZXJ0RWxlbWVudHMoZWxlbWVudHMpO1xucmV0dXJuIGVsZW1lbnRzO1xuIH07JGjigI1fb25jZS5jb2VyY2VUb0VsZW1lbnRzKGNvZXJjZVRvRWxlbWVudHMpO1xuaGFyZGVuKGNvZXJjZVRvRWxlbWVudHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0T2ZFbGVtZW50cz0oZWxlbWVudEl0ZXIpPT5cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLGNvZXJjZVRvRWxlbWVudHMoZWxlbWVudEl0ZXIpKTskaOKAjV9vbmNlLm1ha2VTZXRPZkVsZW1lbnRzKG1ha2VTZXRPZkVsZW1lbnRzKTtcbmhhcmRlbihtYWtlU2V0T2ZFbGVtZW50cyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVzIjpbImFzc2VydE5vRHVwbGljYXRlcyJdLCJjaGVja0VsZW1lbnRzIjpbImNoZWNrRWxlbWVudHMiXSwiYXNzZXJ0RWxlbWVudHMiOlsiYXNzZXJ0RWxlbWVudHMiXSwiY29lcmNlVG9FbGVtZW50cyI6WyJjb2VyY2VUb0VsZW1lbnRzIl0sIm1ha2VTZXRPZkVsZW1lbnRzIjpbIm1ha2VTZXRPZkVsZW1lbnRzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAsonm15JQAAeSUAADUAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyIuL2NvcHlCYWcuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYmFnQ29tcGFyZSIsImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJc0Rpc2pvaW50IiwiYmFnSXNTdXBlcmJhZyIsImJhZ1VuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzLG1ha2VCYWdPZkVudHJpZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlS2V5c1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyaXNvbn0gS2V5Q29tcGFyaXNvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG5cbi8qIEJhc2VkIG9uIG1lcmdlLXNldC1vcGVyYXRvcnMuanMsIGJ1dCBhbHRlcmVkIGZvciB0aGUgYmFnIHJlcHJlc2VudGF0aW9uLiovXG4vKiBUT0RPIHNoYXJlIG1vcmUgY29kZSB3aXRoIG1lcmdlLXNldC1vcGVyYXRvcnMuanMsIHJhdGhlciB0aGFuKi9cbi8qIGR1cGxpY2F0aW5nIHdpdGggY2hhbmdlcy4qL1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZVxuICogdGhlcmVcbiAqIG1heSBiZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgYmFnRW50cmllcyB3aG9zZSBrZXlzIGFyZSB0aWVkIGZvciB0aGUgc2FtZVxuICogcmFuay5cbiAqIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCB3aWxsIGVudW1lcmF0ZSBhbGwgdGhlIGJhZ0VudHJpZXMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBiYWdFbnRyaWVzYCBhcnJheVxuICogYWNjb3JkaW5nXG4gKiB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludF0+fVxuICovXG5jb25zdCBiYWdXaW5kb3dSZXNvcnQ9KGJhZ0VudHJpZXMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGJhZ0VudHJpZXMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1iYWdFbnRyaWVzO1xubGV0IGk9MDtcbmxldCBvcHRJbm5lckl0ZXJhdG9yO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+XG5oYXJkZW4oe1xubmV4dDooKT0+e1xuaWYob3B0SW5uZXJJdGVyYXRvcil7XG5jb25zdCByZXN1bHQ9b3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG5pZihyZXN1bHQuZG9uZSl7XG5vcHRJbm5lckl0ZXJhdG9yPXVuZGVmaW5lZDtcbi8qIGZhbGwgdGhyb3VnaCovXG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5pZihpPGxlbmd0aCl7XG5jb25zdCBlbnRyeT1iYWdFbnRyaWVzW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoXG5qPGxlbmd0aCYmXG5yYW5rQ29tcGFyZShlbnRyeVswXSxiYWdFbnRyaWVzW2pdWzBdKT09PTApXG57XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTplbnRyeX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49YmFnRW50cmllcy5zbGljZShpLGopO1xuaT1qO1xuY29uc3QgcmVzb3J0ZWQ9c29ydEJ5UmFuayhzaW1pbGFyUnVuLGZ1bGxDb21wYXJlKTtcbi8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbi8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbi8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbmFzc2VydE5vRHVwbGljYXRlS2V5cyhyZXNvcnRlZCxmdWxsQ29tcGFyZSk7XG4vKiBUaGlzIGlzIHRoZSByYXcgSlMgYXJyYXkgaXRlcmF0b3Igd2hvc2UgYC5uZXh0KClgIG1ldGhvZCovXG4vKiBkb2VzIG5vdCBoYXJkZW4gdGhlIEl0ZXJhdG9yUmVzdWx0LCBpbiB2aW9sYXRpb24gb2Ygb3VyKi9cbi8qIGNvbnZlbnRpb25zLiBGaXhpbmcgdGhpcyBpcyBleHBlbnNpdmUgYW5kIEknbSBjb25maWRlbnQgdGhlKi9cbi8qIHVuZnJvemVuIHZhbHVlIGRvZXMgbm90IGVzY2FwZSB0aGlzIGZpbGUsIHNvIEknbSBsZWF2aW5nIHRoaXMqL1xuLyogYXMgaXMuKi9cbm9wdElubmVySXRlcmF0b3I9cmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOltudWxsLDBuXX0pO1xuIH1cbiB9fSl9KTtcblxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHhiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geWJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlPSh4YmFnRW50cmllcyx5YmFnRW50cmllcyk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPWJhZ1dpbmRvd1Jlc29ydCh4YmFnRW50cmllcyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuY29uc3QgeXM9YmFnV2luZG93UmVzb3J0KHliYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vKiBUaGVzZSBzaXggYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbi8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHg7XG5sZXQgeGM7XG5sZXQgeERvbmU7XG4vKiogQHR5cGUge1R9ICovXG5sZXQgeTtcbmxldCB5YztcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe1xuZG9uZTp4RG9uZSxcbnZhbHVlOlt4LHhjXX09XG54aS5uZXh0KCkpO1xuIH07XG5uZXh0WCgpO1xuXG5jb25zdCB5aT15c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WT0oKT0+e1xuIXlEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7XG5kb25lOnlEb25lLFxudmFsdWU6W3kseWNdfT1cbnlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtib29sZWFufSAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLyogb25seSB4cyBhcmUgbGVmdCovXG52YWx1ZT1beCx4Yywwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuY29uc3QgY29tcD1mdWxsQ29tcGFyZSh4LHkpO1xuaWYoY29tcD09PTApe1xuLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xudmFsdWU9W3gseGMseWNdO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbnZhbHVlPVt4LHhjLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG5jb21wPjB8fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG52YWx1ZT1beSwwbix5Y107XG5uZXh0WSgpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlfSk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTtcbmhhcmRlbihtZXJnZSk7XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNTdXBlcnNldCBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc1N1cGVyYmFnPSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPHljKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzRGlzam9pbnQgYXMgd2VsbC4qL1xuLyogVGhlIGNvZGUgaXMgaWRlbnRpY2FsLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgYmFnSXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVyQ29tcGFyZSBhcyB3ZWxsLiovXG4vKiBUaGUgZ2VuZXJhbGl6YXRpb24gaXMgZnJlZS4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge0tleUNvbXBhcmlzb259XG4gKi9cbmNvbnN0IGJhZ0l0ZXJDb21wYXJlPSh4eWkpPT57XG5sZXQgbG9uZVk9ZmFsc2U7XG5sZXQgbG9uZVg9ZmFsc2U7XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPHljKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHkqL1xubG9uZVk9dHJ1ZTtcbiB9XG5pZih4Yz55Yyl7XG4vKiBzb21ldGhpbmcgaW4geCBpcyBub3QgaW4geSwgc28geSBpcyBub3QgYSBzdXBlcmJhZyBvZiB4Ki9cbmxvbmVYPXRydWU7XG4gfVxuaWYobG9uZVgmJmxvbmVZKXtcbnJldHVybiBOYU47XG4gfVxuIH1cbmlmKGxvbmVYKXtcbnJldHVybiAxO1xuIH1lbHNlIGlmKGxvbmVZKXtcbnJldHVybi0xO1xuIH1lbHNle1xuIWxvbmVYJiYhbG9uZVl8fFxuRmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsbG9uZVldKX1gO1xucmV0dXJuIDA7XG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50LGJpZ2ludF1bXX0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVyVW5pb249KHh5aSk9Pntcbi8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnJlc3VsdC5wdXNoKFttLHhjK3ljXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVySW50ZXJzZWN0aW9uPSh4eWkpPT57XG4vKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5jb25zdCBtYz14Yzw9eWM/eGM6eWM7XG5yZXN1bHQucHVzaChbbSxtY10pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9Pntcbi8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjLXljO1xubWM+PTBufHxGYWlsIGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbmlmKG1jPj0xbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBtZXJnZWlmeT0oYmFnSXRlck9wKT0+KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+XG5iYWdJdGVyT3AobWVyZ2UoeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpKTtcblxuY29uc3QgYmFnRW50cmllc0lzU3VwZXJiYWc9bWVyZ2VpZnkoYmFnSXRlcklzU3VwZXJiYWcpO1xuY29uc3QgYmFnRW50cmllc0lzRGlzam9pbnQ9bWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc0NvbXBhcmU9bWVyZ2VpZnkoYmFnSXRlckNvbXBhcmUpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uPW1lcmdlaWZ5KGJhZ0l0ZXJVbmlvbik7XG5jb25zdCBiYWdFbnRyaWVzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGJhZ0l0ZXJJbnRlcnNlY3Rpb24pO1xuY29uc3QgYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3Q9bWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbmJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKTtcblxuY29uc3QgYmFnaWZ5PShiYWdFbnRyaWVzT3ApPT4oeGJhZyx5YmFnKT0+XG5tYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQseWJhZy5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBiYWdJc1N1cGVyYmFnPXJhd0JhZ2lmeShiYWdFbnRyaWVzSXNTdXBlcmJhZyk7JGjigI1fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuY29uc3QgICAgICAgIGJhZ0lzRGlzam9pbnQ9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc0Rpc2pvaW50KTskaOKAjV9vbmNlLmJhZ0lzRGlzam9pbnQoYmFnSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgYmFnQ29tcGFyZT1yYXdCYWdpZnkoYmFnRW50cmllc0NvbXBhcmUpOyRo4oCNX29uY2UuYmFnQ29tcGFyZShiYWdDb21wYXJlKTtcbmNvbnN0ICAgICAgICBiYWdVbmlvbj1iYWdpZnkoYmFnRW50cmllc1VuaW9uKTskaOKAjV9vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbmNvbnN0ICAgICAgICBiYWdJbnRlcnNlY3Rpb249YmFnaWZ5KGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2UuYmFnSW50ZXJzZWN0aW9uKGJhZ0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgYmFnRGlzam9pbnRTdWJ0cmFjdD1iYWdpZnkoYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2UuYmFnRGlzam9pbnRTdWJ0cmFjdChiYWdEaXNqb2ludFN1YnRyYWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJiYWdJc1N1cGVyYmFnIjpbImJhZ0lzU3VwZXJiYWciXSwiYmFnSXNEaXNqb2ludCI6WyJiYWdJc0Rpc2pvaW50Il0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSJdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiJdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIl0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAi9nVSnigAAJ4oAAA1AAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiLi9jb3B5U2V0LmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsInNldENvbXBhcmUiLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZXMsbWFrZVNldE9mRWxlbWVudHM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlc1wiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVzID0gJGjigI1fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXlDb21wYXJpc29ufSBLZXlDb21wYXJpc29uICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5SYW5rQ29tcGFyZX0gUmFua0NvbXBhcmUgKi9cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGVsZW1lbnRzIHRpZWQgZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBlbGVtZW50cyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGVsZW1lbnRzYCBhcnJheSBhY2NvcmRpbmdcbiAqICB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3Qgd2luZG93UmVzb3J0PShlbGVtZW50cyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoZWxlbWVudHMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vKiBmYWxsIHRocm91Z2gqL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgdmFsdWU9ZWxlbWVudHNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShqPGxlbmd0aCYmcmFua0NvbXBhcmUodmFsdWUsZWxlbWVudHNbal0pPT09MCl7XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49ZWxlbWVudHMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4vKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4vKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG5hc3NlcnROb0R1cGxpY2F0ZXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4vKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4vKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbi8qIGFzIGlzLiovXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpudWxsfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0geGVsZW1lbnRzXG4gKiBAcGFyYW0ge1RbXX0geWVsZW1lbnRzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZT0oeGVsZW1lbnRzLHllbGVtZW50cyk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPXdpbmRvd1Jlc29ydCh4ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPXdpbmRvd1Jlc29ydCh5ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8qIFRoZXNlIGZvdXIgYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbi8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHg7XG5sZXQgeERvbmU7XG4vKiogQHR5cGUge1R9ICovXG5sZXQgeTtcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eERvbmUsdmFsdWU6eH09eGkubmV4dCgpKTtcbiB9O1xubmV4dFgoKTtcblxuY29uc3QgeWk9eXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFk9KCk9PntcbiF5RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eURvbmUsdmFsdWU6eX09eWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge2Jvb2xlYW59ICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xudmFsdWU9W251bGwsMG4sMG5dO1xuIH1lbHNlIGlmKHhEb25lKXtcbi8qIG9ubHkgeXMgYXJlIGxlZnQqL1xudmFsdWU9W3ksMG4sMW5dO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG52YWx1ZT1beCwxbiwxbl07XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xudmFsdWU9W3gsMW4sMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbi8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuY29uc3QgaXRlcklzU3VwZXJzZXQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4YyxfeWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge0tleUNvbXBhcmlzb259XG4gKi9cbmNvbnN0IGl0ZXJDb21wYXJlPSh4eWkpPT57XG5sZXQgbG9uZVk9ZmFsc2U7XG5sZXQgbG9uZVg9ZmFsc2U7XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5sb25lWT10cnVlO1xuIH1cbmlmKHljPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJzZXQgb2YgeCovXG5sb25lWD10cnVlO1xuIH1cbmlmKGxvbmVYJiZsb25lWSl7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG5pZihsb25lWCl7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihsb25lWSl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbiFsb25lWCYmIWxvbmVZfHxcbkZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLGxvbmVZXSl9YDtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyVW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MG4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MG58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbi8qIGlmIHggYW5kIHkgd2VyZSBib3RoIHJlYWR5LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50IGFuZCovXG4vKiBhYm92ZSBjbGF1c2UgYWxyZWFkeSB0b29rIGNhcmUgb2YgaXQuIE90aGVyd2lzZSBwdXNoIGhlcmUuKi9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xueGM9PT0wbnx8eWM9PT0wbnx8RmFpbCBgU2V0cyBtdXN0IG5vdCBoYXZlIGNvbW1vbiBlbGVtZW50czogJHttfWA7XG5pZih4Yz49MW4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MW58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJJbnRlcnNlY3Rpb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBJZiB0aGV5IGFyZSBib3RoIHByZXNlbnQsIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG54Yz49MW58fEZhaWwgYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuaWYoeWM9PT0wbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgbWVyZ2VpZnk9KGl0ZXJPcCk9Pih4ZWxlbWVudHMseWVsZW1lbnRzKT0+XG5pdGVyT3AobWVyZ2UoeGVsZW1lbnRzLHllbGVtZW50cykpO1xuXG5jb25zdCAgICAgICAgZWxlbWVudHNJc1N1cGVyc2V0PW1lcmdlaWZ5KGl0ZXJJc1N1cGVyc2V0KTskaOKAjV9vbmNlLmVsZW1lbnRzSXNTdXBlcnNldChlbGVtZW50c0lzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSXNEaXNqb2ludD1tZXJnZWlmeShpdGVySXNEaXNqb2ludCk7JGjigI1fb25jZS5lbGVtZW50c0lzRGlzam9pbnQoZWxlbWVudHNJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0NvbXBhcmU9bWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRo4oCNX29uY2UuZWxlbWVudHNDb21wYXJlKGVsZW1lbnRzQ29tcGFyZSk7XG5jb25zdCAgICAgICAgZWxlbWVudHNVbmlvbj1tZXJnZWlmeShpdGVyVW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNVbmlvbihlbGVtZW50c1VuaW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0Rpc2pvaW50VW5pb249bWVyZ2VpZnkoaXRlckRpc2pvaW50VW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNEaXNqb2ludFVuaW9uKGVsZW1lbnRzRGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjigI1fb25jZS5lbGVtZW50c0ludGVyc2VjdGlvbihlbGVtZW50c0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0PW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdTZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5lbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpO1xuXG5jb25zdCBzZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIHNldElzU3VwZXJzZXQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNTdXBlcnNldCk7JGjigI1fb25jZS5zZXRJc1N1cGVyc2V0KHNldElzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIHNldElzRGlzam9pbnQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNEaXNqb2ludCk7JGjigI1fb25jZS5zZXRJc0Rpc2pvaW50KHNldElzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIHNldENvbXBhcmU9cmF3U2V0aWZ5KGVsZW1lbnRzQ29tcGFyZSk7JGjigI1fb25jZS5zZXRDb21wYXJlKHNldENvbXBhcmUpO1xuY29uc3QgICAgICAgIHNldFVuaW9uPXNldGlmeShlbGVtZW50c1VuaW9uKTskaOKAjV9vbmNlLnNldFVuaW9uKHNldFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFVuaW9uPXNldGlmeShlbGVtZW50c0Rpc2pvaW50VW5pb24pOyRo4oCNX29uY2Uuc2V0RGlzam9pbnRVbmlvbihzZXREaXNqb2ludFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXRJbnRlcnNlY3Rpb249c2V0aWZ5KGVsZW1lbnRzSW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLnNldEludGVyc2VjdGlvbihzZXRJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIHNldERpc2pvaW50U3VidHJhY3Q9c2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5zZXREaXNqb2ludFN1YnRyYWN0KHNldERpc2pvaW50U3VidHJhY3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCJdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIl0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiJdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0Il0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCJdLCJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiXSwic2V0VW5pb24iOlsic2V0VW5pb24iXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIl0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIkMOwUzwwAAM8MAADUAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4va2V5cy9jb21wYXJlS2V5cy5qcyIsIi4uL3V0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIk0iLCJhc3NlcnRQYXR0ZXJuIiwiY2hlY2tNYXRjaGVzIiwiZGVmYXVsdExpbWl0cyIsImdldFJhbmtDb3ZlciIsImlzUGF0dGVybiIsIm1hdGNoZXMiLCJtdXN0TWF0Y2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaGFzT3duUHJvcGVydHlPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsY29tcGFyZVJhbmssZ2V0UGFzc1N0eWxlQ292ZXIsaW50ZXJzZWN0UmFua0NvdmVycyx1bmlvblJhbmtDb3ZlcnMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLGlkZW50Q2hlY2tlcixhcHBseUxhYmVsaW5nRXJyb3IsZnJvbVVuaXF1ZUVudHJpZXMsbGlzdERpZmZlcmVuY2Usa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV0sW1wiZ2V0UGFzc1N0eWxlQ292ZXJcIiwgWyRo4oCNX2EgPT4gKGdldFBhc3NTdHlsZUNvdmVyID0gJGjigI1fYSldXSxbXCJpbnRlcnNlY3RSYW5rQ292ZXJzXCIsIFskaOKAjV9hID0+IChpbnRlcnNlY3RSYW5rQ292ZXJzID0gJGjigI1fYSldXSxbXCJ1bmlvblJhbmtDb3ZlcnNcIiwgWyRo4oCNX2EgPT4gKHVuaW9uUmFua0NvdmVycyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXSxbXCIuLi91dGlscy5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChpZGVudENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImFwcGx5TGFiZWxpbmdFcnJvclwiLCBbJGjigI1fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjigI1fYSldXSxbXCJmcm9tVW5pcXVlRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaOKAjV9hKV1dLFtcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcImtleUdUXCIsIFskaOKAjV9hID0+IChrZXlHVCA9ICRo4oCNX2EpXV0sW1wia2V5R1RFXCIsIFskaOKAjV9hID0+IChrZXlHVEUgPSAkaOKAjV9hKV1dLFtcImtleUxUXCIsIFskaOKAjV9hID0+IChrZXlMVCA9ICRo4oCNX2EpXV0sW1wia2V5TFRFXCIsIFskaOKAjV9hID0+IChrZXlMVEUgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrS2V5XCIsIFskaOKAjV9hID0+IChjaGVja0tleSA9ICRo4oCNX2EpXV0sW1wiaXNLZXlcIiwgWyRo4oCNX2EgPT4gKGlzS2V5ID0gJGjigI1fYSldXSxbXCJjaGVja1NjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weVNldFwiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRo4oCNX2EpXV0sW1wiY29weU1hcEtleVNldFwiLCBbJGjigI1fYSA9PiAoY29weU1hcEtleVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlCYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e3F1b3RlOnEsZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcbmNvbnN0e2VudHJpZXMsdmFsdWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8UGF0dGVybj59ICovXG5jb25zdCBwYXR0ZXJuTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogRm9yIGZvcndhcmQgcmVmZXJlbmNlcyB0byBgTWAgKi9cbmxldCBNTTtcblxuLyoqXG4gKiBUaGUgYWN0dWFsIGRlZmF1bHQgdmFsdWVzIGhlcmUgYXJlLCBhdCB0aGUgcHJlc2VudCB0aW1lLCBmYWlybHlcbiAqIGFyYml0cmFyeSBjaG9pY2VzIGFuZCBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IHNldHRsZSBkb3duLiBPZiBjb3Vyc2VcbiAqIGF0IHNvbWUgcG9pbnQgd2UnbGwgbmVlZCB0byBzdG9wIGNoYW5naW5nIHRoZW0uIEJ1dCB3ZSBzaG91bGQgZmlyc3RcbiAqIHNlZSBob3cgb3VyIHN5c3RlbSBob2xkcyB1cCB3aXRoIHRoZXNlIGNob2ljZXMuIFRoZSBtYWluIGNyaXRlcmlhXG4gKiBpcyB0aGF0IHRoZXkgYmUgYmlnIGVub3VnaCB0aGF0IFwibm9ybWFsXCIgaW5ub2NlbnQgcHJvZ3JhbXMgcmFyZWx5XG4gKiBlbmNvdW50ZXIgdGhlc2UgbGltaXRzLlxuICpcbiAqIEV4cG9ydGVkIHByaW1hcmlseSBmb3IgdGVzdGluZy5cbiAqL1xuY29uc3QgICAgICAgIGRlZmF1bHRMaW1pdHM9aGFyZGVuKHtcbmRlY2ltYWxEaWdpdHNMaW1pdDoxMDAsXG5zdHJpbmdMZW5ndGhMaW1pdDoxMDBfMDAwLFxuc3ltYm9sTmFtZUxlbmd0aExpbWl0OjEwMCxcbm51bVByb3BlcnRpZXNMaW1pdDo4MCxcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0OjEwMCxcbmFycmF5TGVuZ3RoTGltaXQ6MTBfMDAwLFxubnVtU2V0RWxlbWVudHNMaW1pdDoxMF8wMDAsXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bU1hcEVudHJpZXNMaW1pdDo1MDAwfSk7XG5cblxuLyoqXG4gKiBVc2UgdGhlIHJlc3VsdCBvbmx5IHRvIGdldCB0aGUgbGltaXRzIHlvdSBuZWVkIGJ5IGRlc3RydWN0dXJpbmcuXG4gKiBUaHVzLCB0aGUgcmVzdWx0IG9ubHkgbmVlZHMgdG8gc3VwcG9ydCBkZXN0cnVjdHVyaW5nLiBUaGUgY3VycmVudFxuICogaW1wbGVtZW50YXRpb24gdXNlcyBpbmhlcml0YW5jZSBhcyBhIGNoZWFwIGhhY2suXG4gKlxuICogQHBhcmFtIHtMaW1pdHN9IFtsaW1pdHNdXG4gKiBAcmV0dXJucyB7QWxsTGltaXRzfVxuICovJGjigI1fb25jZS5kZWZhdWx0TGltaXRzKGRlZmF1bHRMaW1pdHMpO1xuY29uc3QgbGltaXQ9KGxpbWl0cz17fSk9PlxuLyoqIEB0eXBlIHtBbGxMaW1pdHN9ICovaGFyZGVuKHtfX3Byb3RvX186ZGVmYXVsdExpbWl0cywuLi5saW1pdHN9KTtcblxuY29uc3QgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQ9KFxucGF5bG9hZCxcbm1haW5QYXlsb2FkU2hhcGUsXG5jaGVjayxcbmxhYmVsKT0+XG57XG5hc3NlcnQoQXJyYXkuaXNBcnJheShtYWluUGF5bG9hZFNoYXBlKSk7XG5pZighQXJyYXkuaXNBcnJheShwYXlsb2FkKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtxKGxhYmVsKX0gcGF5bG9hZCBtdXN0IGJlIGFuIGFycmF5OiAke3BheWxvYWR9YCk7XG4gfVxuXG4vKiBXYXMgdGhlIGZvbGxvd2luZywgYnV0IGl0cyBvdmVydXNlIG9mIHBhdHRlcm5zIGNhdXNlZCBhbiBpbmZpbml0ZSByZWdyZXNzKi9cbi8qIGNvbnN0IHBheWxvYWRMaW1pdFNoYXBlID0gaGFyZGVuKCovXG4vKiBNLnNwbGl0KCovXG4vKiBtYWluUGF5bG9hZFNoYXBlLCovXG4vKiBNLnBhcnRpYWwoaGFyZGVuKFtNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0ubnVtYmVyKCkpXSksIGhhcmRlbihbXSkpLCovXG4vKiApLCovXG4vKiApOyovXG4vKiByZXR1cm4gY2hlY2tNYXRjaGVzKHBheWxvYWQsIHBheWxvYWRMaW1pdFNoYXBlLCBjaGVjaywgbGFiZWwpOyovXG5cbmNvbnN0IG1haW5MZW5ndGg9bWFpblBheWxvYWRTaGFwZS5sZW5ndGg7XG5pZighKHBheWxvYWQubGVuZ3RoPT09bWFpbkxlbmd0aHx8cGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RoKzEpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuIH1cbmNvbnN0IGxpbWl0cz1wYXlsb2FkW21haW5MZW5ndGhdO1xucGF5bG9hZD1oYXJkZW4ocGF5bG9hZC5zbGljZSgwLG1haW5MZW5ndGgpKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighY2hlY2tNYXRjaGVzKHBheWxvYWQsbWFpblBheWxvYWRTaGFwZSxjaGVjayxsYWJlbCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmlmKGxpbWl0cz09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YobGltaXRzKT09PSdjb3B5UmVjb3JkJ3x8XG5jaGVjayhmYWxzZSxYIGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpJiZcbmVudHJpZXMobGltaXRzKS5ldmVyeShcbihba2V5LHZhbHVlXSk9PlxucGFzc1N0eWxlT2YodmFsdWUpPT09J251bWJlcid8fFxuY2hlY2soZmFsc2UsWCBgVmFsdWUgb2YgbGltaXQgJHtxKGtleSl9IGJ1dCBiZSBhIG51bWJlcjogJHtxKHZhbHVlKX1gKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWNpbWFsRGlnaXRzTGltaXRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY29uc3QgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQ9KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjayk9PntcbmlmKFxuTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKE51bWJlcihzcGVjaW1lbikpKSkrMTw9XG5kZWNpbWFsRGlnaXRzTGltaXQpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGJpZ2ludCAke3NwZWNpbWVufSBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke2RlY2ltYWxEaWdpdHNMaW1pdH0gZGlnaXRzYCk7XG5cbiB9O1xuXG4vKipcbiAqIEByZXR1cm5zIHtQYXR0ZXJuS2l0fVxuICovXG5jb25zdCBtYWtlUGF0dGVybktpdD0oKT0+e1xuLyoqXG4gKiBJZiB0aGlzIGlzIGEgcmVjb2duaXplZCBtYXRjaCB0YWcsIHJldHVybiB0aGUgTWF0Y2hIZWxwZXIuXG4gKiBPdGhlcndpc2UgcmVzdWx0IHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7TWF0Y2hIZWxwZXIgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1heWJlTWF0Y2hIZWxwZXI9KHRhZyk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2luZFxuICogSXQgaXMgZWl0aGVyIGEgUGFzc1N0eWxlIG90aGVyIHRoYW4gJ3RhZ2dlZCcsIG9yLCBpZiB0aGUgdW5kZXJseWluZ1xuICogUGFzc1N0eWxlIGlzICd0YWdnZWQnLCB0aGVuIHRoZSBgZ2V0VGFnYCB2YWx1ZSBmb3IgdGFncyB0aGF0IGFyZVxuICogcmVjb2duaXplZCBhdCB0aGUgc3RvcmUgbGV2ZWwgb2YgYWJzdHJhY3Rpb24uIEZvciBlYWNoIG9mIHRob3NlXG4gKiB0YWdzLCBhIHRhZ2dlZCByZWNvcmQgb25seSBoYXMgdGhhdCBraW5kIGlmIGl0IHNhdGlzZmllcyB0aGUgaW52YXJpYW50c1xuICogdGhhdCB0aGUgc3RvcmUgbGV2ZWwgYXNzb2NpYXRlcyB3aXRoIHRoYXQga2luZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPENvcHlUYWdnZWQsIEtpbmQ+fVxuICogT25seSBmb3IgdGFnZ2VkIHJlY29yZHMgb2YgcmVjb2duaXplZCBraW5kcyB3aG9zZSBzdG9yZS1sZXZlbCBpbnZhcmlhbnRzXG4gKiBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICovXG5jb25zdCB0YWdNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCB0YWdzLCBhbmQgb25seSBpZiB0aGUgdGFnZ2VkXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdGFnZ2VkXG4gKiBAcGFyYW0ge0tpbmR9IHRhZ1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnZ2VkPSh0YWdnZWQsdGFnLGNoZWNrKT0+e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbi8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQodGFnZ2VkLnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4gY2hlY2tDb3B5TWFwKHRhZ2dlZCxjaGVjayk7XG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfTogJHt0YWdnZWR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIG9ubHkgYSByZWNvZ25pemVkIGtpbmQsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lbiBwYXNzZXMgdGhlXG4gKiBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICogT3RoZXJ3aXNlLCBgY2hlY2soZmFsc2UsIC4uLilgIGFuZCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtLaW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBraW5kT2Y9KHNwZWNpbWVuLGNoZWNrPWlkZW50Q2hlY2tlcik9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihwYXNzU3R5bGUhPT0ndGFnZ2VkJyl7XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH1cbi8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHNwZWNpbWVuIGlzIGEgd2VsbCBmb3JtZWQqL1xuLyogYXMgYSB0YWdnZWQgcmVjb3JkLCB3aGljaCBpcyBkZWZpbmVkIGF0IHRoZSBtYXJzaGFsIGxldmVsIG9mIGFic3RyYWN0aW9uLCovXG4vKiBzaW5jZSBgcGFzc1N0eWxlT2ZgIGNoZWNrcyB0aG9zZSBpbnZhcmlhbnRzLiovXG5pZih0YWdNZW1vLmhhcyhzcGVjaW1lbikpe1xucmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiB9XG5jb25zdCB0YWc9Z2V0VGFnKHNwZWNpbWVuKTtcbmlmKGNoZWNrVGFnZ2VkKHNwZWNpbWVuLHRhZyxjaGVjaykpe1xudGFnTWVtby5zZXQoc3BlY2ltZW4sdGFnKTtcbnJldHVybiB0YWc7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuY2hlY2soZmFsc2UsWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9YCk7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuaGFyZGVuKGtpbmRPZik7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2luZD0oc3BlY2ltZW4sa2luZCxjaGVjayk9PntcbmNvbnN0IHJlYWxLaW5kPWtpbmRPZihzcGVjaW1lbixjaGVjayk7XG5pZihraW5kPT09cmVhbEtpbmQpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuLyogcXVvdGluZyB3aXRob3V0IHF1b3RlcyovXG5jb25zdCBkZXRhaWxzPVgoWyBgJHtyZWFsS2luZH0gYCxgIC0gTXVzdCBiZSBhICR7a2luZH1gXSxzcGVjaW1lbik7XG5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLZXl9IGtleUFzUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrQXNLZXlQYXR0PShzcGVjaW1lbixrZXlBc1BhdHRlcm4sY2hlY2spPT57XG5pZihrZXlFUShzcGVjaW1lbixrZXlBc1BhdHRlcm4pKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZTogJHtrZXlBc1BhdHRlcm59YCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja1BhdHRlcm59ICovXG5jb25zdCBjaGVja1BhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBBbGwga2V5cyBhcmUgcGF0dGVybnMuIEZvciB0aGVzZSwgdGhlIGtleU1lbW8gd2lsbCBkby4qL1xuLyogQWxsIHByaW1pdGl2ZXMgdGhhdCBhcmUgcGF0dGVybnMgYXJlIGFsc28ga2V5cywgd2hpY2ggdGhpcyovXG4vKiBhbHNvIHRha2VzIGNhcmUgb2Ygd2l0aG91dCBtZW1vLiBUaGUgcmVzdCBvZiBvdXIgY2hlY2tpbmcgbG9naWMqL1xuLyogaXMgb25seSBjb25jZXJuZWQgd2l0aCBub24ta2V5IHBhdHRlcm5zLiovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihwYXR0ZXJuTWVtby5oYXMocGF0dCkpe1xucmV0dXJuIHRydWU7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHJlc3VsdD1jaGVja1BhdHRlcm5JbnRlcm5hbChwYXR0LGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5wYXR0ZXJuTWVtby5hZGQocGF0dCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHQgLSBrbm93biBub3QgdG8gYmUgYSBrZXksIGFuZCB0aGVyZWZvcmUga25vd25cbiAqIG5vdCB0byBiZSBwcmltaXRpdmUuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tQYXR0ZXJuKGNoaWxkLGNoZWNrKTtcblxuY29uc3Qga2luZD1raW5kT2YocGF0dCxjaGVjayk7XG5zd2l0Y2goa2luZCl7XG5jYXNlIHVuZGVmaW5lZDp7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBBIGNvcHlSZWNvcmQgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4vKiBwYXR0ZXJucyovXG5yZXR1cm4gdmFsdWVzKHBhdHQpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiBwYXR0LmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUga2V5cyBhbmQgdGhlcmVmb3JlIGFscmVhZHkga25vd24gdG8gYmUqL1xuLyogcGF0dGVybnMuKi9cbi8qIEEgY29weU1hcCBpcyBhIHBhdHRlcm4gaWYgaXRzIHZhbHVlcyBhcmUgcGF0dGVybnMuKi9cbnJldHVybiBjaGVja1BhdHRlcm4ocGF0dC52YWx1ZXMsY2hlY2spO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiB9XG5kZWZhdWx0OntcbmlmKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkhPT11bmRlZmluZWQpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBIHBhc3NhYmxlIG9mIGtpbmQgJHtxKGtpbmQpfSBpcyBub3QgYSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNQYXR0ZXJuPShwYXR0KT0+Y2hlY2tQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuY29uc3QgYXNzZXJ0UGF0dGVybj0ocGF0dCk9PntcbmNoZWNrUGF0dGVybihwYXR0LGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzPShzcGVjaW1lbixwYXR0ZXJuLGNoZWNrLGxhYmVsPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCxbc3BlY2ltZW4scGF0dGVybixjaGVja10sbGFiZWwpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbD0oc3BlY2ltZW4scGF0dCxjaGVjayk9Pntcbi8qIFdvcnRoIGJlaW5nIGEgYml0IHZlcmJvc2UgYW5kIHJlcGV0aXRpdmUgaW4gb3JkZXIgdG8gb3B0aW1pemUqL1xuY29uc3QgcGF0dGVybktpbmQ9a2luZE9mKHBhdHQsY2hlY2spO1xuY29uc3Qgc3BlY2ltZW5LaW5kPWtpbmRPZihzcGVjaW1lbik7LyogbWF5IGJlIHVuZGVmaW5lZCovXG5zd2l0Y2gocGF0dGVybktpbmQpe1xuY2FzZSB1bmRlZmluZWQ6e1xucmV0dXJuIEZhaWwgYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEZhaWwgYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIEZhaWwgYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weUJhZyc6XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogVGhlc2Uga2luZHMgYXJlIG5lY2Vzc2FyaWx5IGtleXMqL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG5jb25zdHtsZW5ndGh9PXBhdHQ7XG5pZihzcGVjaW1lbi5sZW5ndGghPT1sZW5ndGgpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSAke3NwZWNpbWVufSAtIE11c3QgYmUgYXMgbG9uZyBhcyBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxucmV0dXJuIHBhdHQuZXZlcnkoKHAsaSk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSxwLGNoZWNrLGkpKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbi8qIFRPRE8gRGV0ZWN0IGFuZCBhY2N1bXVsYXRlIGRpZmZlcmVuY2UgaW4gb25lIHBhc3MuKi9cbi8qIFJhdGhlciB0aGFuIHVzaW5nIHR3byBjYWxscyB0byBgbGlzdERpZmZlcmVuY2VgIHRvIGRldGVjdCBhbmQqL1xuLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbi8qIGluIHNvcnRlZCBvcmRlciwgd2Ugc2hvdWxkIGluc3RlYWQgdXNlIGFuIGFsZ29yaXRobSBsaWtlKi9cbi8qIGBpdGVyRGlzam9pbnRVbmlvbmAgZnJvbSBtZXJnZS1zb3J0LW9wZXJhdG9ycy5qcyovXG5jb25zdCBzcGVjaW1lbk5hbWVzPXJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbmNvbnN0IHBhdHROYW1lcz1yZWNvcmROYW1lcyhwYXR0KTtcbmNvbnN0IG1pc3Npbmc9bGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLHNwZWNpbWVuTmFtZXMpO1xuaWYobWlzc2luZy5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWApO1xuXG4gfVxuY29uc3QgdW5leHBlY3RlZD1saXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLHBhdHROYW1lcyk7XG5pZih1bmV4cGVjdGVkLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbnVuZXhwZWN0ZWQpXG4gfWApO1xuXG4gfVxuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9cmVjb3JkVmFsdWVzKHNwZWNpbWVuLHNwZWNpbWVuTmFtZXMpO1xuY29uc3QgcGF0dFZhbHVlcz1yZWNvcmRWYWx1ZXMocGF0dCxwYXR0TmFtZXMpO1xucmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsaSk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLHBhdHRWYWx1ZXNbaV0sY2hlY2ssbGFiZWwpKTtcblxuIH1cbmNhc2UnY29weU1hcCc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlNYXAnKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7cGF5bG9hZDpwYXR0UGF5bG9hZH09cGF0dDtcbmNvbnN0e3BheWxvYWQ6c3BlY2ltZW5QYXlsb2FkfT1zcGVjaW1lbjtcbmNvbnN0IHBhdHRLZXlTZXQ9Y29weU1hcEtleVNldChwYXR0UGF5bG9hZCk7XG5jb25zdCBzcGVjaW1lbktleVNldD1jb3B5TWFwS2V5U2V0KHNwZWNpbWVuUGF5bG9hZCk7XG4vKiBDb21wYXJlIGtleXMgYXMgY29weVNldHMqL1xuaWYoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCxwYXR0S2V5U2V0LGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcGF0dFZhbHVlcz1wYXR0UGF5bG9hZC52YWx1ZXM7XG5jb25zdCBzcGVjaW1lblZhbHVlcz1zcGVjaW1lblBheWxvYWQudmFsdWVzO1xuLyogY29tcGFyZSB2YWx1ZXMgYXMgY29weUFycmF5cyovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzLHBhdHRWYWx1ZXMsY2hlY2spO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG5pZihtYXRjaEhlbHBlcil7XG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQucGF5bG9hZCxjaGVjayk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgbWF0Y2hlcz0oc3BlY2ltZW4scGF0dCk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgbm9ybWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MuIE1hdGNoIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5XG4gKiB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqL1xuY29uc3QgbXVzdE1hdGNoPShzcGVjaW1lbixwYXR0LGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcixsYWJlbCkpe1xucmV0dXJuO1xuIH1cbi8qIHNob3VsZCBvbmx5IHRocm93Ki9cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGFzc2VydENoZWNrZXIsbGFiZWwpO1xuRmFpbCBgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxKHBhdHQpfWA7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZ2V0UmFua0NvdmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtHZXRSYW5rQ292ZXJ9ICovXG5jb25zdCBnZXRSYW5rQ292ZXI9KHBhdHQsZW5jb2RlUGFzc2FibGUpPT57XG5pZihpc0tleShwYXR0KSl7XG5jb25zdCBlbmNvZGVkPWVuY29kZVBhc3NhYmxlKHBhdHQpO1xuaWYoZW5jb2RlZCE9PXVuZGVmaW5lZCl7XG5yZXR1cm5bZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gfVxuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuLyoqL1xuLyogY29uc3QgcmFua0NvdmVycyA9IHBhdHQubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiByYW5rQ292ZXJzLm1hcCgoW2xlZnQsIF9yaWdodF0pID0+IGxlZnQpLCovXG4vKiByYW5rQ292ZXJzLm1hcCgoW19sZWZ0LCByaWdodF0pID0+IHJpZ2h0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuLyoqL1xuLyogY29uc3QgcGF0dEtleXMgPSBvd25LZXlzKHBhdHQpOyovXG4vKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuLyogY29uc3QgW2xlZnRFbnRyaWVzTGltaXQsIHJpZ2h0RW50cmllc0xpbWl0XSA9Ki9cbi8qIGdldFJhbmtDb3ZlcihwYXR0RW50cmllcyk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBmcm9tVW5pcXVlRW50cmllcyhsZWZ0RW50cmllc0xpbWl0KSwqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMocmlnaHRFbnRyaWVzTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcocGF0dCk7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuLyoqL1xuLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4vKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbi8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbi8qIGBgYGpzKi9cbi8qIHBhdHQucGF5bG9hZC5sZW5ndGggPT09IDEgfHwqL1xuLyogRmFpbGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YDsqL1xuLyogYGBgKi9cbi8qKi9cbi8qIGNvbnN0IFtsZWZ0RWxlbWVudExpbWl0LCByaWdodEVsZW1lbnRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZFswXSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIG1ha2VDb3B5U2V0KFtsZWZ0RWxlbWVudExpbWl0XSksKi9cbi8qIG1ha2VDb3B5U2V0KFtyaWdodEVsZW1lbnRMaW1pdF0pLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlNYXBzLiovXG4vKiovXG4vKiAvLyBBIG1hdGNoaW5nIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMsIG9yIGF0IG1vc3Qgb25lKi9cbi8qIC8vIG5vbi1rZXkga2V5IHBhdHRlcm4uIFRodXMgd2UgY2FuIGFzc3VtZSB0aGF0IHZhbHVlIHBvc2l0aW9ucyovXG4vKiAvLyBtYXRjaCAxLXRvLTEuKi9cbi8qIC8vKi9cbi8qIC8vIFRPRE8gSSBtYXkgYmUgb3Zlcmxvb2tpbmcgdGhhdCB0aGUgbGVzcyBwcmVjaXNlIHJhbmtPcmRlciovXG4vKiAvLyBlcXVpdmFsZW5jZSBjbGFzcyBtYXkgY2F1c2UgdmFsdWVzIHRvIGJlIG91dCBvZiBvcmRlciwqL1xuLyogLy8gbWFraW5nIHRoaXMgcmFua0NvdmVyIG5vdCBhY3R1YWxseSBjb3Zlci4gSW4gdGhhdCBjYXNlLCBmb3IqL1xuLyogLy8gYWxsIHRoZSB2YWx1ZXMgZm9yIGtleXMgYXQgdGhlIHNhbWUgcmFuaywgd2Ugc2hvdWxkIHVuaW9uIHRoZWlyKi9cbi8qIC8vIHJhbmsgY292ZXJzLiBUT0RPIFBPU1NJQkxFIFNJTEVOVCBDT1JSRUNUTkVTUyBCVUcqL1xuLyogLy8qL1xuLyogLy8gSWYgdGhpcyBpcyBhIGJ1ZywgaXQgcHJvYmFibHkgYWZmZWN0cyB0aGUgZ2V0UmFua0NvdmVyKi9cbi8qIC8vIGNhc2VzIG9mIG1hdGNoTFRFSGVscGVyIGFuZCBtYXRjaEdURUhlbHBlciBvbiBjb3B5TWFwIGFzKi9cbi8qIC8vIHdlbGwuIFNlZSBtYWtlQ29weU1hcCBmb3IgYW4gaWRlYSBvbiBmaXhpbmcqL1xuLyogLy8gdGhpcyBidWcuKi9cbi8qIGNvbnN0IFtsZWZ0UGF5bG9hZExpbWl0LCByaWdodFBheWxvYWRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZCwqL1xuLyogZW5jb2RlUGFzc2FibGUsKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgbGVmdFBheWxvYWRMaW1pdCksKi9cbi8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCByaWdodFBheWxvYWRMaW1pdCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9fVxuXG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gfTtcblxuY29uc3QgYXJyYXlFdmVyeU1hdGNoUGF0dGVybj0oYXJyYXkscGF0dCxjaGVjayxsYWJlbFByZWZpeD0nJyk9PntcbmlmKGNoZWNrS2luZChwYXR0LCdtYXRjaDphbnknLGlkZW50Q2hlY2tlcikpe1xuLyogaWYgdGhlIHBhdHRlcm4gaXMgTS5hbnkoKSwgd2Uga25vdyBpdHMgdHJ1ZSovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gYXJyYXkuZXZlcnkoKGVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhlbCxwYXR0LGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbnlIZWxwZXI9RmFyKCdtYXRjaDphbnkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KF9zcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KG1hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5tYXRjaGVyUGF5bG9hZD09PXVuZGVmaW5lZHx8XG5jaGVjayhmYWxzZSxYIGBtYXRjaDphbnkgcGF5bG9hZDogJHttYXRjaGVyUGF5bG9hZH0gLSBNdXN0IGJlIHVuZGVmaW5lZGApLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbmRIZWxwZXI9RmFyKCdtYXRjaDphbmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsY2hlY2spKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFBhdHRzLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0ocGF0dCk9PmNoZWNrUGF0dGVybihwYXR0LGNoZWNrKTtcbnJldHVybihcbihwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgTmVlZHMgYXJyYXkgb2Ygc3ViLXBhdHRlcm5zOiAke2FsbGVnZWRQYXR0c31gKSkmJlxuYWxsZWdlZFBhdHRzLmV2ZXJ5KGNoZWNrSXQpKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjoocGF0dHMsZW5jb2RlUGFzc2FibGUpPT5cbmludGVyc2VjdFJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hPckhlbHBlcj1GYXIoJ21hdGNoOm9yIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbmNvbnN0e2xlbmd0aH09cGF0dHM7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBubyBwYXR0ZXJuIGRpc2p1bmN0cyB0byBtYXRjaDogJHtwYXR0c31gKTtcblxuIH1cbmlmKFxucGF0dHMubGVuZ3RoPT09MiYmXG4hbWF0Y2hlcyhzcGVjaW1lbixwYXR0c1swXSkmJlxuY2hlY2tLaW5kKHBhdHRzWzBdLCdtYXRjaDpraW5kJyxpZGVudENoZWNrZXIpJiZcbnBhdHRzWzBdLnBheWxvYWQ9PT0ndW5kZWZpbmVkJylcbntcbi8qIFdvcnRoIHNwZWNpYWwgY2FzaW5nIHRoZSBvcHRpb25hbCBwYXR0ZXJuIGZvciovXG4vKiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbnJldHVybiBjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dHNbMV0sY2hlY2spO1xuIH1cbmlmKHBhdHRzLnNvbWUoKHBhdHQpPT5tYXRjaGVzKHNwZWNpbWVuLHBhdHQpKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3BhdHRzfWApO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG51bmlvblJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOb3RIZWxwZXI9RmFyKCdtYXRjaDpub3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG5pZihtYXRjaGVzKHNwZWNpbWVuLHBhdHQpKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9ZWxzZXtcbnJldHVybiB0cnVlO1xuIH1cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja1BhdHRlcm4sXG5cbmdldFJhbmtDb3ZlcjooX3BhdHQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXI9RmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tTY2FsYXJLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLZXlIZWxwZXI9RmFyKCdtYXRjaDprZXkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyPUZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1BhdHRlcm4oc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLaW5kSGVscGVyPUZhcignbWF0Y2g6a2luZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczpjaGVja0tpbmQsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkS2V5S2luZCxjaGVjayk9PlxudHlwZW9mIGFsbGVnZWRLZXlLaW5kPT09J3N0cmluZyd8fFxuY2hlY2soXG5mYWxzZSxcblggYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2ApLFxuXG5cbmdldFJhbmtDb3Zlcjooa2luZCxfZW5jb2RlUGFzc2FibGUpPT57XG5sZXQgc3R5bGU7XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2NvcHlTZXQnOlxuY2FzZSdjb3B5TWFwJzp7XG5zdHlsZT0ndGFnZ2VkJztcbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuc3R5bGU9a2luZDtcbmJyZWFrO1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihzdHlsZSk7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJpZ2ludEhlbHBlcj1GYXIoJ21hdGNoOmJpZ2ludCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6YmlnaW50IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOYXRIZWxwZXI9RmFyKCdtYXRjaDpuYXQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2RlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnYmlnaW50JyxjaGVjaykmJlxuY2hlY2soXG4vKiogQHR5cGUge2JpZ2ludH0gKi9zcGVjaW1lbj49MG4sXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgbm9uLW5lZ2F0aXZlYCkmJlxuXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6bmF0IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG4vKiBUT0RPIENvdWxkIGJlIG1vcmUgcHJlY2lzZSovXG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTdHJpbmdIZWxwZXI9RmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N0cmluZ0xlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuLyogcHJldHRpZXItaWdub3JlKi9cbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnc3RyaW5nJyxjaGVjaykmJihcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbi8qKiBAdHlwZSB7c3RyaW5nfSAqL3NwZWNpbWVuLmxlbmd0aDw9c3RyaW5nTGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYHN0cmluZyAke3NwZWNpbWVufSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N0cmluZ0xlbmd0aExpbWl0fWApKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6c3RyaW5nIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3Zlcignc3RyaW5nJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTeW1ib2xIZWxwZXI9RmFyKCdtYXRjaDpzeW1ib2wgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N5bWJvbE5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ3N5bWJvbCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBzeW1ib2xOYW1lPW5hbWVGb3JQYXNzYWJsZVN5bWJvbChzcGVjaW1lbik7XG5cbmlmKHR5cGVvZiBzeW1ib2xOYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFBhc3NhYmxlIHN5bWJvbCAke3NwZWNpbWVufSBtdXN0IGhhdmUgYSBwYXNzYWJsZSBuYW1lYDtcbiB9XG5yZXR1cm4gY2hlY2soXG5zeW1ib2xOYW1lLmxlbmd0aDw9c3ltYm9sTmFtZUxlbmd0aExpbWl0LFxuWCBgU3ltYm9sIG5hbWUgJHtxKFxuc3ltYm9sTmFtZSlcbiB9IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3ltYm9sTmFtZUxlbmd0aExpbWl0fWApO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpzeW1ib2wgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdzeW1ib2wnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFJlbW90YWJsZUhlbHBlcj1GYXIoJ21hdGNoOnJlbW90YWJsZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmVtb3RhYmxlRGVzYyxjaGVjayk9Pntcbi8qIFVuZm9ydHVuYXRlIGR1cGxpY2F0aW9uIG9mIGNoZWNrS2luZCBsb2dpYywgYnV0IG5vIGJldHRlciBjaG9pY2VzLiovXG5pZihjaGVja0tpbmQoc3BlY2ltZW4sJ3JlbW90YWJsZScsaWRlbnRDaGVja2VyKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjaGVjaz09PWlkZW50Q2hlY2tlcil7XG5yZXR1cm4gZmFsc2U7XG4gfVxubGV0IHNwZWNpbWVuS2luZD1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihzcGVjaW1lbktpbmQ9PT0ndGFnZ2VkJyl7XG5zcGVjaW1lbktpbmQ9Z2V0VGFnKHNwZWNpbWVuKTtcbiB9XG5jb25zdHtsYWJlbH09cmVtb3RhYmxlRGVzYztcblxuLyogcXVvdGluZyB3aXRob3V0IHF1b3RlcyovXG5jb25zdCBkZXRhaWxzPVgoXG5bIGAke3NwZWNpbWVuS2luZH0gYCxgIC0gTXVzdCBiZSBhIHJlbW90YWJsZSAoJHtsYWJlbH0pYF0sXG5zcGVjaW1lbik7XG5cbnJldHVybiBjaGVjayhmYWxzZSxkZXRhaWxzKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFJlbW90YWJsZURlc2MsY2hlY2spPT5cbmNoZWNrTWF0Y2hlcyhcbmFsbGVnZWRSZW1vdGFibGVEZXNjLFxuaGFyZGVuKHtsYWJlbDpNTS5zdHJpbmcoKX0pLFxuY2hlY2ssXG4nbWF0Y2g6cmVtb3RhYmxlIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9yZW1vdGFibGVEZXNjLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3JlbW90YWJsZScpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTFRFSGVscGVyPUZhcignbWF0Y2g6bHRlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdSaWdodEJvdW5kPSBgJHtlbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpfX5gO1xuaWYobmV3UmlnaHRCb3VuZCE9PXVuZGVmaW5lZCl7XG5yaWdodEJvdW5kPW5ld1JpZ2h0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTFRIZWxwZXI9RmFyKCdtYXRjaDpsdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlMVChzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOm1hdGNoTFRFSGVscGVyLmdldFJhbmtDb3Zlcn0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEdURUhlbHBlcj1GYXIoJ21hdGNoOmd0ZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlHVEUoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPj0gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6KHJpZ2h0T3BlcmFuZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuLyogVGhlIHByZWZlci1jb25zdCBtYWtlcyBubyBzZW5zZSB3aGVuIHNvbWUgb2YgdGhlIHZhcmlhYmxlcyBuZWVkKi9cbi8qIHRvIGJlIGBsZXRgKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QqL1xubGV0W2xlZnRCb3VuZCxyaWdodEJvdW5kXT1nZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuY29uc3QgbmV3TGVmdEJvdW5kPWVuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCk7XG5pZihuZXdMZWZ0Qm91bmQhPT11bmRlZmluZWQpe1xubGVmdEJvdW5kPW5ld0xlZnRCb3VuZDtcbiB9XG5yZXR1cm5bbGVmdEJvdW5kLHJpZ2h0Qm91bmRdO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hHVEhlbHBlcj1GYXIoJ21hdGNoOmd0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID4gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUmVjb3JkT2ZIZWxwZXI9RmFyKCdtYXRjaDpyZWNvcmRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1Qcm9wZXJ0aWVzTGltaXQscHJvcGVydHlOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlSZWNvcmQnLGNoZWNrKSYmXG5jaGVjayhcbm93bktleXMoc3BlY2ltZW4pLmxlbmd0aDw9bnVtUHJvcGVydGllc0xpbWl0LFxuWCBgTXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxubnVtUHJvcGVydGllc0xpbWl0KVxuIH0gcHJvcGVydGllczogJHtzcGVjaW1lbn1gKSYmXG5cbmVudHJpZXMoc3BlY2ltZW4pLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5hcHBseUxhYmVsaW5nRXJyb3IoXG5jaGVjayxcbltcbmtleS5sZW5ndGg8PXByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuWCBgUHJvcGVydHkgbmFtZSBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAke3EoXG5wcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdClcbiB9YF0sXG5cbmtleSkmJlxuXG5jaGVja01hdGNoZXMoXG5oYXJkZW4oW2tleSx2YWx1ZV0pLFxuaGFyZGVuKFtrZXlQYXR0LHZhbHVlUGF0dF0pLFxuY2hlY2ssXG5rZXkpKSk7XG5cblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6cmVjb3JkT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5UmVjb3JkJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBcnJheU9mSGVscGVyPUZhcignbWF0Y2g6YXJyYXlPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW3N1YlBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHthcnJheUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuLyogcHJldHRpZXItaWdub3JlKi9cbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weUFycmF5JyxjaGVjaykmJihcbi8qKiBAdHlwZSB7QXJyYXl9ICovc3BlY2ltZW4ubGVuZ3RoPD1hcnJheUxlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSBsZW5ndGggJHtzcGVjaW1lbi5sZW5ndGh9IG11c3QgYmUgPD0gbGltaXQgJHthcnJheUxlbmd0aExpbWl0fWApKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4sc3ViUGF0dCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDphcnJheU9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNldE9mSGVscGVyPUZhcignbWF0Y2g6c2V0T2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtrZXlQYXR0LGxpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7bnVtU2V0RWxlbWVudHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVNldCcsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDxudW1TZXRFbGVtZW50c0xpbWl0LFxuWCBgU2V0IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShudW1TZXRFbGVtZW50c0xpbWl0KX0gZWxlbWVudHM6ICR7XG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aFxuIH1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4ucGF5bG9hZCxrZXlQYXR0LGNoZWNrLCdzZXQgZWxlbWVudHMnKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOnNldE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJhZ09mSGVscGVyPUZhcignbWF0Y2g6YmFnT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlCYWcnLGNoZWNrKSYmXG5jaGVjayhcbi8qKiBAdHlwZSB7QXJyYXl9ICovc3BlY2ltZW4ucGF5bG9hZC5sZW5ndGg8PVxubnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxcblggYEJhZyBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0KVxuIH0gdW5pcXVlIGVsZW1lbnRzOiAke3NwZWNpbWVufWApJiZcblxuc3BlY2ltZW4ucGF5bG9hZC5ldmVyeShcbihba2V5LGNvdW50XSxpKT0+XG5jaGVja01hdGNoZXMoa2V5LGtleVBhdHQsY2hlY2ssIGBiYWcga2V5c1ske2l9XWApJiZcbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuW2NvdW50LGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVja10sXG4gYGJhZyBjb3VudHNbJHtpfV1gKSYmXG5cbmNoZWNrTWF0Y2hlcyhjb3VudCxjb3VudFBhdHQsY2hlY2ssIGBiYWcgY291bnRzWyR7aX1dYCkpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6YmFnT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTWFwT2ZIZWxwZXI9RmFyKCdtYXRjaDptYXBPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1NYXBFbnRyaWVzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlNYXAnLGNoZWNrKSYmXG5jaGVjayhcbi8qKiBAdHlwZSB7QXJyYXl9ICovc3BlY2ltZW4ucGF5bG9hZC5rZXlzLmxlbmd0aDw9XG5udW1NYXBFbnRyaWVzTGltaXQsXG5YIGBDb3B5TWFwIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gJHtxKFxubnVtTWFwRW50cmllc0xpbWl0KVxuIH0gZW50cmllczogJHtzcGVjaW1lbn1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLmtleXMsXG5rZXlQYXR0LFxuY2hlY2ssXG4nbWFwIGtleXMnKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLnZhbHVlcyxcbnZhbHVlUGF0dCxcbmNoZWNrLFxuJ21hcCB2YWx1ZXMnKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKSxNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOm1hcE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9lbnRyeVBhdHQpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybltdfSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEByZXR1cm5zIHt7XG4gKiAgIHJlcXVpcmVkU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IFBhc3NhYmxlW10sXG4gKiAgIHJlc3RTcGVjaW1lbjogUGFzc2FibGVbXVxuICogfX1cbiAqL1xuY29uc3Qgc3BsaXRBcnJheVBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuY29uc3QgbnVtUmVxdWlyZWQ9cmVxdWlyZWRQYXR0Lmxlbmd0aDtcbmNvbnN0IG51bU9wdGlvbmFsPW9wdGlvbmFsUGF0dC5sZW5ndGg7XG5jb25zdCByZXF1aXJlZFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKDAsbnVtUmVxdWlyZWQpO1xuY29uc3Qgb3B0aW9uYWxTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShcbm51bVJlcXVpcmVkLFxubnVtUmVxdWlyZWQrbnVtT3B0aW9uYWwpO1xuXG5jb25zdCByZXN0U3BlY2ltZW49c3BlY2ltZW4uc2xpY2UobnVtUmVxdWlyZWQrbnVtT3B0aW9uYWwpO1xucmV0dXJuIGhhcmRlbih7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn0pO1xuIH07XG5cbi8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gZWxlbWVudHMgd2hpY2ggYXJlIGB1bmRlZmluZWRgIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICogV2UgZW5jb2RlIHRoaXMgd2l0aCB0aGUgYE0ub3JgIHBhdHRlcm4gc28gaXQgYWxzbyBwcm9kdWNlcyBhIGdvb2RcbiAqIGNvbXByZXNzaW9uIGRpc3Rpbmd1aXNoaW5nIGB1bmRlZmluZWRgIGZyb20gYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcmV0dXJucyB7UGF0dGVybltdfSBUaGUgcGFydGlhbFBhdHRcbiAqL1xuY29uc3QgYWRhcHRBcnJheVBhdHRlcm49KG9wdGlvbmFsUGF0dCxsZW5ndGgpPT5cbmhhcmRlbihvcHRpb25hbFBhdHQuc2xpY2UoMCxsZW5ndGgpLm1hcCgocGF0dCk9Pk1NLm9wdChwYXR0KSkpO1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTcGxpdEFycmF5SGVscGVyPUZhcignbWF0Y2g6c3BsaXRBcnJheSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PVtdLHJlc3RQYXR0PU1NLmFueSgpXSxcbmNoZWNrKT0+XG57XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QXJyYXknLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn09XG5zcGxpdEFycmF5UGFydHMoc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk7XG5jb25zdCBwYXJ0aWFsUGF0dD1hZGFwdEFycmF5UGF0dGVybihcbm9wdGlvbmFsUGF0dCxcbm9wdGlvbmFsU3BlY2ltZW4ubGVuZ3RoKTtcblxubGV0IGFyZ051bT0wO1xucmV0dXJuKFxuKHJlcXVpcmVkU3BlY2ltZW4ubGVuZ3RoPT09cmVxdWlyZWRQYXR0Lmxlbmd0aHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgRXhwZWN0ZWQgYXQgbGVhc3QgJHtxKFxucmVxdWlyZWRQYXR0Lmxlbmd0aClcbiB9IGFyZ3VtZW50czogJHtzcGVjaW1lbn1gKSkmJlxuXG5yZXF1aXJlZFBhdHQuZXZlcnkoKHAsaSk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbmNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuW2ldLHAsY2hlY2ssIGBhcmcgJHthcmdOdW0rK31gKSkmJlxuXG5wYXJ0aWFsUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKG9wdGlvbmFsU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfT9gKSkmJlxuXG5jaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLHJlc3RQYXR0LGNoZWNrLCcuLi5yZXN0JykpO1xuXG4gfSxcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBzcGxpdEFycmF5XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbmNoZWNrSXNXZWxsRm9ybWVkOihzcGxpdEFycmF5LGNoZWNrKT0+e1xuaWYoXG5wYXNzU3R5bGVPZihzcGxpdEFycmF5KT09PSdjb3B5QXJyYXknJiYoXG5zcGxpdEFycmF5Lmxlbmd0aD49MXx8c3BsaXRBcnJheS5sZW5ndGg8PTMpKVxue1xuY29uc3RbcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD11bmRlZmluZWQscmVzdFBhdHQ9dW5kZWZpbmVkXT1cbnNwbGl0QXJyYXk7XG5pZihcbmlzUGF0dGVybihyZXF1aXJlZFBhdHQpJiZcbnBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCk9PT0nY29weUFycmF5JyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weUFycmF5JykmJihcbnJlc3RQYXR0PT09dW5kZWZpbmVkfHxpc1BhdHRlcm4ocmVzdFBhdHQpKSlcbntcbnJldHVybiB0cnVlO1xuIH1cbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgYXJyYXksIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCBhcnJheSwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xuX3JlcXVpcmVkUGF0dCxcbl9vcHRpb25hbFBhdHQ9dW5kZWZpbmVkLFxuX3Jlc3RQYXR0PXVuZGVmaW5lZF0pPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhc3NhYmxlPn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIG9wdGlvbmFsU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICByZXN0U3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+XG4gKiB9fVxuICovXG5jb25zdCBzcGxpdFJlY29yZFBhcnRzPShzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KT0+e1xuLyogTm90IGZyb3plbiEgTXV0YXRlZCBpbiBwbGFjZSovXG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3QgcmVxdWlyZWRFbnRyaWVzPVtdO1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IG9wdGlvbmFsRW50cmllcz1bXTtcbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCByZXN0RW50cmllcz1bXTtcbmZvcihjb25zdFtuYW1lLHZhbHVlXW9mIGVudHJpZXMoc3BlY2ltZW4pKXtcbmlmKGhhc093blByb3BlcnR5T2YocmVxdWlyZWRQYXR0LG5hbWUpKXtcbnJlcXVpcmVkRW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfWVsc2UgaWYoaGFzT3duUHJvcGVydHlPZihvcHRpb25hbFBhdHQsbmFtZSkpe1xub3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZXtcbnJlc3RFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7XG5yZXF1aXJlZFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG5vcHRpb25hbFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKG9wdGlvbmFsRW50cmllcyksXG5yZXN0U3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVzdEVudHJpZXMpfSk7XG5cbiB9O1xuXG4vKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIHZhbHVlcyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge0NvcHlSZWNvcmQ8UGF0dGVybj59IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdFJlY29yZFBhdHRlcm49KG9wdGlvbmFsUGF0dCxuYW1lcyk9PlxuZnJvbVVuaXF1ZUVudHJpZXMobmFtZXMubWFwKChuYW1lKT0+W25hbWUsTU0ub3B0KG9wdGlvbmFsUGF0dFtuYW1lXSldKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0UmVjb3JkSGVscGVyPUZhcignbWF0Y2g6c3BsaXRSZWNvcmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5bcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD17fSxyZXN0UGF0dD1NTS5hbnkoKV0sXG5jaGVjayk9Plxue1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk7XG5cbmNvbnN0IHBhcnRpYWxOYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMob3B0aW9uYWxTcGVjaW1lbik7XG5jb25zdCBwYXJ0aWFsUGF0dD1hZGFwdFJlY29yZFBhdHRlcm4ob3B0aW9uYWxQYXR0LHBhcnRpYWxOYW1lcyk7XG5yZXR1cm4oXG5jaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbixyZXF1aXJlZFBhdHQsY2hlY2spJiZcbnBhcnRpYWxOYW1lcy5ldmVyeSgobmFtZSk9PlxuY2hlY2tNYXRjaGVzKFxub3B0aW9uYWxTcGVjaW1lbltuYW1lXSxcbnBhcnRpYWxQYXR0W25hbWVdLFxuY2hlY2ssXG4gYCR7bmFtZX0/YCkpJiZcblxuXG5jaGVja01hdGNoZXMocmVzdFNwZWNpbWVuLHJlc3RQYXR0LGNoZWNrLCcuLi5yZXN0JykpO1xuXG4gfSxcblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBzcGxpdEFycmF5XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbmNoZWNrSXNXZWxsRm9ybWVkOihzcGxpdEFycmF5LGNoZWNrKT0+e1xuaWYoXG5wYXNzU3R5bGVPZihzcGxpdEFycmF5KT09PSdjb3B5QXJyYXknJiYoXG5zcGxpdEFycmF5Lmxlbmd0aD49MXx8c3BsaXRBcnJheS5sZW5ndGg8PTMpKVxue1xuY29uc3RbcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD11bmRlZmluZWQscmVzdFBhdHQ9dW5kZWZpbmVkXT1cbnNwbGl0QXJyYXk7XG5pZihcbmlzUGF0dGVybihyZXF1aXJlZFBhdHQpJiZcbnBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCk9PT0nY29weVJlY29yZCcmJihcbm9wdGlvbmFsUGF0dD09PXVuZGVmaW5lZHx8XG5pc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSYmXG5wYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpPT09J2NvcHlSZWNvcmQnKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCByZWNvcmQsIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCByZWNvcmQsIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuc3BsaXRBcnJheSlcbiB9YCk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KFtcbnJlcXVpcmVkUGF0dCxcbl9vcHRpb25hbFBhdHQ9dW5kZWZpbmVkLFxuX3Jlc3RQYXR0PXVuZGVmaW5lZF0pPT5cbmdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkpfSk7XG5cblxuLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBNYXRjaEhlbHBlcj59ICovXG5jb25zdCBIZWxwZXJzQnlNYXRjaFRhZz1oYXJkZW4oe1xuJ21hdGNoOmFueSc6bWF0Y2hBbnlIZWxwZXIsXG4nbWF0Y2g6YW5kJzptYXRjaEFuZEhlbHBlcixcbidtYXRjaDpvcic6bWF0Y2hPckhlbHBlcixcbidtYXRjaDpub3QnOm1hdGNoTm90SGVscGVyLFxuXG4nbWF0Y2g6c2NhbGFyJzptYXRjaFNjYWxhckhlbHBlcixcbidtYXRjaDprZXknOm1hdGNoS2V5SGVscGVyLFxuJ21hdGNoOnBhdHRlcm4nOm1hdGNoUGF0dGVybkhlbHBlcixcbidtYXRjaDpraW5kJzptYXRjaEtpbmRIZWxwZXIsXG4nbWF0Y2g6YmlnaW50JzptYXRjaEJpZ2ludEhlbHBlcixcbidtYXRjaDpuYXQnOm1hdGNoTmF0SGVscGVyLFxuJ21hdGNoOnN0cmluZyc6bWF0Y2hTdHJpbmdIZWxwZXIsXG4nbWF0Y2g6c3ltYm9sJzptYXRjaFN5bWJvbEhlbHBlcixcbidtYXRjaDpyZW1vdGFibGUnOm1hdGNoUmVtb3RhYmxlSGVscGVyLFxuXG4nbWF0Y2g6bHQnOm1hdGNoTFRIZWxwZXIsXG4nbWF0Y2g6bHRlJzptYXRjaExURUhlbHBlcixcbidtYXRjaDpndGUnOm1hdGNoR1RFSGVscGVyLFxuJ21hdGNoOmd0JzptYXRjaEdUSGVscGVyLFxuXG4nbWF0Y2g6YXJyYXlPZic6bWF0Y2hBcnJheU9mSGVscGVyLFxuJ21hdGNoOnJlY29yZE9mJzptYXRjaFJlY29yZE9mSGVscGVyLFxuJ21hdGNoOnNldE9mJzptYXRjaFNldE9mSGVscGVyLFxuJ21hdGNoOmJhZ09mJzptYXRjaEJhZ09mSGVscGVyLFxuJ21hdGNoOm1hcE9mJzptYXRjaE1hcE9mSGVscGVyLFxuJ21hdGNoOnNwbGl0QXJyYXknOm1hdGNoU3BsaXRBcnJheUhlbHBlcixcbidtYXRjaDpzcGxpdFJlY29yZCc6bWF0Y2hTcGxpdFJlY29yZEhlbHBlcn0pO1xuXG5cbmNvbnN0IG1ha2VNYXRjaGVyPSh0YWcscGF5bG9hZCk9PntcbmNvbnN0IG1hdGNoZXI9bWFrZVRhZ2dlZCh0YWcscGF5bG9hZCk7XG5hc3NlcnRQYXR0ZXJuKG1hdGNoZXIpO1xucmV0dXJuIG1hdGNoZXI7XG4gfTtcblxuY29uc3QgbWFrZUtpbmRNYXRjaGVyPShraW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmtpbmQnLGtpbmQpO1xuXG5jb25zdCBBbnlTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6YW55Jyx1bmRlZmluZWQpO1xuY29uc3QgU2NhbGFyU2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOnNjYWxhcicsdW5kZWZpbmVkKTtcbmNvbnN0IEtleVNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDprZXknLHVuZGVmaW5lZCk7XG5jb25zdCBQYXR0ZXJuU2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOnBhdHRlcm4nLHVuZGVmaW5lZCk7XG5jb25zdCBCb29sZWFuU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdib29sZWFuJyk7XG5jb25zdCBOdW1iZXJTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ251bWJlcicpO1xuY29uc3QgQmlnSW50U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YmlnaW50JyxbXSk7XG5jb25zdCBOYXRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpuYXQnLFtdKTtcbmNvbnN0IFN0cmluZ1NoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnN0cmluZycsW10pO1xuY29uc3QgU3ltYm9sU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c3ltYm9sJyxbXSk7XG5jb25zdCBSZWNvcmRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpyZWNvcmRPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBBcnJheVNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOmFycmF5T2YnLFtBbnlTaGFwZV0pO1xuY29uc3QgU2V0U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c2V0T2YnLFtBbnlTaGFwZV0pO1xuY29uc3QgQmFnU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YmFnT2YnLFtBbnlTaGFwZSxBbnlTaGFwZV0pO1xuY29uc3QgTWFwU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6bWFwT2YnLFtBbnlTaGFwZSxBbnlTaGFwZV0pO1xuY29uc3QgUmVtb3RhYmxlU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdyZW1vdGFibGUnKTtcbmNvbnN0IEVycm9yU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdlcnJvcicpO1xuY29uc3QgUHJvbWlzZVNoYXBlPW1ha2VLaW5kTWF0Y2hlcigncHJvbWlzZScpO1xuY29uc3QgVW5kZWZpbmVkU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCd1bmRlZmluZWQnKTtcblxuLyoqXG4gKiBGb3Igd2hlbiB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBwYXlsb2FkIGlzIHRoZSBvcHRpb25hbCBsaW1pdHMsXG4gKiBzbyB0aGF0IHdoZW4gaXQgaXMgYHVuZGVmaW5lZGAgaXQgaXMgZHJvcHBlZCBmcm9tIHRoZSBlbmQgb2YgdGhlXG4gKiBwYXlsb2FkcyBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBheWxvYWRcbiAqL1xuY29uc3QgbWFrZUxpbWl0c01hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuaWYocGF5bG9hZFtwYXlsb2FkLmxlbmd0aC0xXT09PXVuZGVmaW5lZCl7XG5wYXlsb2FkPWhhcmRlbihwYXlsb2FkLnNsaWNlKDAscGF5bG9hZC5sZW5ndGgtMSkpO1xuIH1cbnJldHVybiBtYWtlTWF0Y2hlcih0YWcscGF5bG9hZCk7XG4gfTtcblxuY29uc3QgbWFrZVJlbW90YWJsZU1hdGNoZXI9KGxhYmVsPXVuZGVmaW5lZCk9PlxubGFiZWw9PT11bmRlZmluZWQ/XG5SZW1vdGFibGVTaGFwZTpcbm1ha2VNYXRjaGVyKCdtYXRjaDpyZW1vdGFibGUnLGhhcmRlbih7bGFiZWx9KSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gZW1wdHlcbiAqIEBwYXJhbSB7VH0gYmFzZVxuICogQHBhcmFtIHtUfSBbb3B0aW9uYWxdXG4gKiBAcGFyYW0ge1R9IFtyZXN0XVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgbWFrZVNwbGl0UGF5bG9hZD0oXG5lbXB0eSxcbmJhc2UsXG5vcHRpb25hbD11bmRlZmluZWQsXG5yZXN0PXVuZGVmaW5lZCk9Plxue1xuaWYocmVzdCl7XG5yZXR1cm5bYmFzZSxvcHRpb25hbHx8ZW1wdHkscmVzdF07XG4gfVxuaWYob3B0aW9uYWwpe1xucmV0dXJuW2Jhc2Usb3B0aW9uYWxdO1xuIH1cbnJldHVybltiYXNlXTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7J3N5bmMnfCdhc3luYyd9IGNhbGxLaW5kXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IGFyZ0d1YXJkc1xuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBbb3B0aW9uYWxBcmdHdWFyZHNdXG4gKiBAcGFyYW0ge0FyZ0d1YXJkfSBbcmVzdEFyZ0d1YXJkXVxuICogQHJldHVybnMge01ldGhvZEd1YXJkTWFrZXJ9XG4gKi9cbmNvbnN0IG1ha2VNZXRob2RHdWFyZE1ha2VyPShcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHM9dW5kZWZpbmVkLFxucmVzdEFyZ0d1YXJkPXVuZGVmaW5lZCk9PlxuXG5oYXJkZW4oe1xub3B0aW9uYWw6KC4uLm9wdEFyZ0d1YXJkcyk9Pntcbm9wdGlvbmFsQXJnR3VhcmRzPT09dW5kZWZpbmVkfHxcbkZhaWwgYENhbiBvbmx5IGhhdmUgb25lIHNldCBvZiBvcHRpb25hbCBndWFyZHNgO1xucmVzdEFyZ0d1YXJkPT09dW5kZWZpbmVkfHxcbkZhaWwgYG9wdGlvbmFsIGFyZyBndWFyZHMgbXVzdCBjb21lIGJlZm9yZSByZXN0IGFyZ2A7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoY2FsbEtpbmQsYXJnR3VhcmRzLG9wdEFyZ0d1YXJkcyk7XG4gfSxcbnJlc3Q6KHJBcmdHdWFyZCk9PntcbnJlc3RBcmdHdWFyZD09PXVuZGVmaW5lZHx8RmFpbCBgQ2FuIG9ubHkgaGF2ZSBvbmUgcmVzdCBhcmdgO1xucmV0dXJuIG1ha2VNZXRob2RHdWFyZE1ha2VyKFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJBcmdHdWFyZCk7XG5cbiB9LFxucmV0dXJuczoocmV0dXJuR3VhcmQ9VW5kZWZpbmVkU2hhcGUpPT5cbmhhcmRlbih7XG5rbGFzczonbWV0aG9kR3VhcmQnLFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCxcbnJldHVybkd1YXJkfSl9KTtcblxuXG5cbmNvbnN0IG1ha2VBd2FpdEFyZ0d1YXJkPShhcmdHdWFyZCk9PlxuaGFyZGVuKHtcbmtsYXNzOidhd2FpdEFyZycsXG5hcmdHdWFyZH0pO1xuXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7TWF0Y2hlck5hbWVzcGFjZX0gKi9cbmNvbnN0IE09aGFyZGVuKHtcbmFueTooKT0+QW55U2hhcGUsXG5hbmQ6KC4uLnBhdHRzKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmFuZCcscGF0dHMpLFxub3I6KC4uLnBhdHRzKT0+bWFrZU1hdGNoZXIoJ21hdGNoOm9yJyxwYXR0cyksXG5ub3Q6KHN1YlBhdHQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bm90JyxzdWJQYXR0KSxcblxuc2NhbGFyOigpPT5TY2FsYXJTaGFwZSxcbmtleTooKT0+S2V5U2hhcGUsXG5wYXR0ZXJuOigpPT5QYXR0ZXJuU2hhcGUsXG5raW5kOm1ha2VLaW5kTWF0Y2hlcixcbmJvb2xlYW46KCk9PkJvb2xlYW5TaGFwZSxcbm51bWJlcjooKT0+TnVtYmVyU2hhcGUsXG5iaWdpbnQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmlnaW50JyxbbGltaXRzXSk6QmlnSW50U2hhcGUsXG5uYXQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bmF0JyxbbGltaXRzXSk6TmF0U2hhcGUsXG5zdHJpbmc6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3RyaW5nJyxbbGltaXRzXSk6U3RyaW5nU2hhcGUsXG5zeW1ib2w6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3ltYm9sJyxbbGltaXRzXSk6U3ltYm9sU2hhcGUsXG5yZWNvcmQ6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLnJlY29yZE9mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOlJlY29yZFNoYXBlLFxuYXJyYXk6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmFycmF5T2YoTS5hbnkoKSxsaW1pdHMpOkFycmF5U2hhcGUsXG5zZXQ6KGxpbWl0cz11bmRlZmluZWQpPT5saW1pdHM/TS5zZXRPZihNLmFueSgpLGxpbWl0cyk6U2V0U2hhcGUsXG5iYWc6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLmJhZ09mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOkJhZ1NoYXBlLFxubWFwOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5tYXBPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpNYXBTaGFwZSxcbnJlbW90YWJsZTptYWtlUmVtb3RhYmxlTWF0Y2hlcixcbmVycm9yOigpPT5FcnJvclNoYXBlLFxucHJvbWlzZTooKT0+UHJvbWlzZVNoYXBlLFxudW5kZWZpbmVkOigpPT5VbmRlZmluZWRTaGFwZSxcbm51bGw6KCk9Pm51bGwsXG5cbmx0OihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bHQnLHJpZ2h0T3BlcmFuZCksXG5sdGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpsdGUnLHJpZ2h0T3BlcmFuZCksXG5lcTooa2V5KT0+e1xuYXNzZXJ0S2V5KGtleSk7XG5yZXR1cm4ga2V5PT09dW5kZWZpbmVkP00udW5kZWZpbmVkKCk6a2V5O1xuIH0sXG5uZXE6KGtleSk9Pk0ubm90KE0uZXEoa2V5KSksXG5ndGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpndGUnLHJpZ2h0T3BlcmFuZCksXG5ndDoocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmd0JyxyaWdodE9wZXJhbmQpLFxuXG5yZWNvcmRPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpyZWNvcmRPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuYXJyYXlPZjooc3ViUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDphcnJheU9mJyxbc3ViUGF0dCxsaW1pdHNdKSxcbnNldE9mOihrZXlQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnNldE9mJyxba2V5UGF0dCxsaW1pdHNdKSxcbmJhZ09mOihrZXlQYXR0PU0uYW55KCksY291bnRQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJhZ09mJyxba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzXSksXG5tYXBPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDptYXBPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuc3BsaXRBcnJheTooYmFzZSxvcHRpb25hbD11bmRlZmluZWQscmVzdD11bmRlZmluZWQpPT5cbm1ha2VNYXRjaGVyKFxuJ21hdGNoOnNwbGl0QXJyYXknLFxubWFrZVNwbGl0UGF5bG9hZChbXSxiYXNlLG9wdGlvbmFsLHJlc3QpKSxcblxuc3BsaXRSZWNvcmQ6KGJhc2Usb3B0aW9uYWw9dW5kZWZpbmVkLHJlc3Q9dW5kZWZpbmVkKT0+XG5tYWtlTWF0Y2hlcihcbidtYXRjaDpzcGxpdFJlY29yZCcsXG5tYWtlU3BsaXRQYXlsb2FkKHt9LGJhc2Usb3B0aW9uYWwscmVzdCkpLFxuXG5zcGxpdDooYmFzZSxyZXN0PXVuZGVmaW5lZCk9PntcbmlmKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSk9PT0nY29weUFycmF5Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgaXQgc2hvdWxkIGJlIGFuIGFycmF5Ki9cbnJldHVybiBNLnNwbGl0QXJyYXkoYmFzZSxyZXN0JiZbXSxyZXN0KTtcbiB9ZWxzZXtcbnJldHVybiBNLnNwbGl0UmVjb3JkKGJhc2UscmVzdCYme30scmVzdCk7XG4gfVxuIH0sXG5wYXJ0aWFsOihiYXNlLHJlc3Q9dW5kZWZpbmVkKT0+e1xuaWYocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xucmV0dXJuIE0uc3BsaXRBcnJheShbXSxiYXNlLHJlc3QpO1xuIH1lbHNle1xucmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sYmFzZSxyZXN0KTtcbiB9XG4gfSxcblxuZXJlZjoodCk9Pk0ub3IodCxNLnByb21pc2UoKSksXG5vcHQ6KHQpPT5NLm9yKE0udW5kZWZpbmVkKCksdCksXG5cbmludGVyZmFjZTooaW50ZXJmYWNlTmFtZSxtZXRob2RHdWFyZHMse3Nsb3BweT1mYWxzZX09e30pPT57XG5mb3IoY29uc3RbXyxtZXRob2RHdWFyZF1vZiBlbnRyaWVzKG1ldGhvZEd1YXJkcykpe1xubWV0aG9kR3VhcmQua2xhc3M9PT0nbWV0aG9kR3VhcmQnfHxcbkZhaWwgYHVucmVjb2duaXplIG1ldGhvZCBndWFyZCAke21ldGhvZEd1YXJkfWA7XG4gfVxucmV0dXJuIGhhcmRlbih7XG5rbGFzczonSW50ZXJmYWNlJyxcbmludGVyZmFjZU5hbWUsXG5tZXRob2RHdWFyZHMsXG5zbG9wcHl9KTtcblxuIH0sXG5jYWxsOiguLi5hcmdHdWFyZHMpPT5tYWtlTWV0aG9kR3VhcmRNYWtlcignc3luYycsYXJnR3VhcmRzKSxcbmNhbGxXaGVuOiguLi5hcmdHdWFyZHMpPT5tYWtlTWV0aG9kR3VhcmRNYWtlcignYXN5bmMnLGFyZ0d1YXJkcyksXG5cbmF3YWl0OihhcmdHdWFyZCk9Pm1ha2VBd2FpdEFyZ0d1YXJkKGFyZ0d1YXJkKX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuY2hlY2tNYXRjaGVzLFxubWF0Y2hlcyxcbm11c3RNYXRjaCxcbmFzc2VydFBhdHRlcm4sXG5pc1BhdHRlcm4sXG5nZXRSYW5rQ292ZXIsXG5NfSk7XG5cbiB9O1xuXG4vKiBPbmx5IGluY2x1ZGUgdGhvc2Ugd2hvc2UgbWVhbmluZyBpcyBpbmRlcGVuZGVudCBvZiBhbiBpbXB1dGVkIHNvcnQgb3JkZXIqL1xuLyogb2YgcmVtb3RhYmxlcywgb3Igb2YgZW5jb2Rpbmcgb2YgcGFzc2FibGUgYXMgc29ydGFibGUgc3RyaW5ncy4gVGh1cywqL1xuLyogZ2V0UmFua0NvdmVyIGlzIG9taXR0ZWQuIFRvIGdldCBvbmUsIHlvdSdkIG5lZWQgdG8gaW5zdGFudGlhdGUqL1xuLyogYG1ha2VQYXR0ZXJuS2l0KClgIHlvdXJzZWxmLiBTaW5jZSB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGV4dGVybmFsKi9cbi8qIHVzZXMgb2YgYGdldFJhbmtDb3ZlcmAsIGZvciBjbGFyaXR5IGR1cmluZyBkZXZlbG9wbWVudCwgYG1ha2VQYXR0ZXJuS2l0YCovXG4vKiBpcyBub3QgY3VycmVudGx5IGV4cG9ydGVkLiovXG5jb25zdCAgICAgICB7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxubXVzdE1hdGNoLFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19PVxubWFrZVBhdHRlcm5LaXQoKTskaOKAjV9vbmNlLmNoZWNrTWF0Y2hlcyhjaGVja01hdGNoZXMpOyRo4oCNX29uY2UubWF0Y2hlcyhtYXRjaGVzKTskaOKAjV9vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpOyRo4oCNX29uY2UuYXNzZXJ0UGF0dGVybihhc3NlcnRQYXR0ZXJuKTskaOKAjV9vbmNlLmlzUGF0dGVybihpc1BhdHRlcm4pOyRo4oCNX29uY2UuZ2V0UmFua0NvdmVyKGdldFJhbmtDb3Zlcik7JGjigI1fb25jZS5NKE0pO1xuXG5NTT1NO1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5VGFnZ2VkfSBDb3B5VGFnZ2VkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5SYW5rQ292ZXJ9IFJhbmtDb3ZlciAqL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQXJnR3VhcmR9IEFyZ0d1YXJkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuTWV0aG9kR3VhcmRNYWtlcn0gTWV0aG9kR3VhcmRNYWtlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLk1hdGNoZXJOYW1lc3BhY2V9IE1hdGNoZXJOYW1lc3BhY2UgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXl9IEtleSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLlBhdHRlcm59IFBhdHRlcm4gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5QYXR0ZXJuS2l0fSBQYXR0ZXJuS2l0ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ2hlY2tQYXR0ZXJufSBDaGVja1BhdHRlcm4gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5MaW1pdHN9IExpbWl0cyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkFsbExpbWl0c30gQWxsTGltaXRzICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuR2V0UmFua0NvdmVyfSBHZXRSYW5rQ292ZXIgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRjaEhlbHBlclxuICogVGhpcyBmYWN0b3JzIG91dCBvbmx5IHRoZSBwYXJ0cyBzcGVjaWZpYyB0byBlYWNoIGtpbmQgb2YgTWF0Y2hlci4gSXQgaXNcbiAqIGVuY2Fwc3VsYXRlZCwgYW5kIGl0cyBtZXRob2RzIGNhbiBtYWtlIHRoZSBzdGF0ZWQgdW5jaGVja2VyIGFzc3VtcHRpb25zXG4gKiBlbmZvcmNlZCBieSB0aGUgY29tbW9uIGNhbGxpbmcgbG9naWMuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZFBheWxvYWQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tJc1dlbGxGb3JtZWRcbiAqIFJlcG9ydHMgd2hldGhlciBgYWxsZWdlZFBheWxvYWRgIGlzIHZhbGlkIGFzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZFxuICogd2hvc2UgdGFnIGNvcnJlc3BvbmRzIHdpdGggdGhpcyBNYXRjaEhlbHBlcidzIE1hdGNoZXJzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyLFxuICogKSA9PiBib29sZWFufSBjaGVja01hdGNoZXNcbiAqIEFzc3VtaW5nIHZhbGlkaXR5IG9mIGBtYXRjaGVyUGF5bG9hZGAgYXMgdGhlIHBheWxvYWQgb2YgYSBNYXRjaGVyIGNvcnJlc3BvbmRpbmdcbiAqIHdpdGggdGhpcyBNYXRjaEhlbHBlciwgcmVwb3J0cyB3aGV0aGVyIGBzcGVjaW1lbmAgaXMgbWF0Y2hlZCBieSB0aGF0IE1hdGNoZXIuXG4gKlxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuLi90eXBlcycpLkdldFJhbmtDb3Zlcn0gZ2V0UmFua0NvdmVyXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsXG4gKiBpbiByYW5rIG9yZGVyLCBhbGwgcG9zc2libGUgUGFzc2FibGVzIHRoYXQgd291bGQgbWF0Y2ggdGhpcyBNYXRjaGVyLlxuICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZVxuICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWVcbiAqIHJhbmsgYXMgYW55IHBvc3NpYmxlIG1hdGNoaW5nIHNwZWNpbWVuLlxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdExpbWl0cyI6WyJkZWZhdWx0TGltaXRzIl0sImNoZWNrTWF0Y2hlcyI6WyJjaGVja01hdGNoZXMiXSwibWF0Y2hlcyI6WyJtYXRjaGVzIl0sIm11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXSwiYXNzZXJ0UGF0dGVybiI6WyJhc3NlcnRQYXR0ZXJuIl0sImlzUGF0dGVybiI6WyJpc1BhdHRlcm4iXSwiZ2V0UmFua0NvdmVyIjpbImdldFJhbmtDb3ZlciJdLCJNIjpbIk0iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAIgAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlh73x+oaAADqGgAAIgAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMvdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIiwiZnJvbVVuaXF1ZUVudHJpZXMiLCJpZGVudENoZWNrZXIiLCJsaXN0RGlmZmVyZW5jZSIsIm9iamVjdE1hcCIsInRocm93TGFiZWxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGlzUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtmcm9tRW50cmllcyxlbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qIFRPRE8gbWlncmF0ZSB0byBwcm9wZXIgaG9tZSovXG4vKiBGcm9tIHRoZSBgYWdvcmljLXNka2AgbW9ub3JlcG8uIE1vdmVkIGhlcmUgdGVtcG9yYXJpbHkgYmVjYXVzZSB0aGUgcGF0dGVybiovXG4vKiBjb2RlIGlzIG1pZ3JhdGVkIGZyb20gYEBhZ29yaWMvc3RvcmVgIHRvIGBAZW5kby9wYXR0ZXJuc2AsIGFuZCBkZXBlbmRzIG9uKi9cbi8qIHRoZSBmdW5jdGlvbmFsaXR5IGluIHRoaXMgZmlsZSwgd2hpY2ggaXMgb3RoZXJ3aXNlIGF2YWlsYWJsZSBvbmx5Ki9cbi8qIHdpdGhpbiB0aGUgYGFnb3JpYy1zZGtgIG1vbm9yZXBvLiovXG5cbi8qKlxuICogVE9ETyBhcyBsb25nIGFzIGBAZW5kby9wYXNzLXN0eWxlYCByZW1haW5zIHRoZSBwcm9wZXIgaG9tZSBvZiB0aGVcbiAqIGBDaGVja2VyYCB0eXBlLCBpdCBwcm9iYWJseSBtYWtlcyBtb3N0IHNlbnNlIHRvIG1vdmUgYGlkZW50Q2hlY2tlcmBcbiAqIGludG8gYEBlbmRvL3Bhc3Mtc3R5bGVgIGFzIHdlbGwuXG4gKlxuICogSW4gdGhlIGBhc3NlcnRGb29gL2Bpc0Zvb2AvYGNoZWNrRm9vYCBwYXR0ZXJuLCBgY2hlY2tGb29gIGhhcyBhIGBjaGVja2BcbiAqIHBhcmFtZXRlciBvZiB0eXBlIGBDaGVja2VyYC4gYGFzc2VydEZvb2AgY2FsbHMgYGNoZWNrRm9vYCBwYXNzZXNcbiAqIGBhc3NlcnRDaGVja2VyYCBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlzRm9vYCBwYXNzZXMgYGlkZW50Q2hlY2tlcmBcbiAqIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaWRlbnRDaGVja2VyYCBhY3RzIHByZWNpc2VseSBsaWtlIGFuXG4gKiBpZGVudGl0eSBmdW5jdGlvbiwgYnV0IGlzIHR5cGVkIGFzIGEgYENoZWNrZXJgIHRvIGluZGljYXRlIGl0c1xuICogaW50ZW5kZWQgdXNlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgaWRlbnRDaGVja2VyPShjb25kLF9kZXRhaWxzKT0+Y29uZDskaOKAjV9vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG5cbi8qKlxuICogVGhyb3dzIGlmIG11bHRpcGxlIGVudHJpZXMgdXNlIHRoZSBzYW1lIHByb3BlcnR5IG5hbWUuIE90aGVyd2lzZSBhY3RzXG4gKiBsaWtlIGBPYmplY3QuZnJvbUVudHJpZXNgIGJ1dCBoYXJkZW5zIHRoZSByZXN1bHQuXG4gKiBVc2UgaXQgdG8gcHJvdGVjdCBmcm9tIHByb3BlcnR5IG5hbWVzIGNvbXB1dGVkIGZyb20gdXNlci1wcm92aWRlZCBkYXRhLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssVl0+fSBhbGxFbnRyaWVzXG4gKiBAcmV0dXJucyB7e1trOiBLXTogVn19XG4gKi9cbmNvbnN0ICAgICAgICBmcm9tVW5pcXVlRW50cmllcz0oYWxsRW50cmllcyk9PntcbmNvbnN0IGVudHJpZXNBcnJheT1bLi4uYWxsRW50cmllc107XG5jb25zdCByZXN1bHQ9aGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuaWYob3duS2V5cyhyZXN1bHQpLmxlbmd0aD09PWVudHJpZXNBcnJheS5sZW5ndGgpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7XG5mb3IoY29uc3RbbmFtZSxfXW9mIGVudHJpZXNBcnJheSl7XG5pZihuYW1lcy5oYXMobmFtZSkpe1xuRmFpbCBgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiB9XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xuIH07JGjigI1fb25jZS5mcm9tVW5pcXVlRW50cmllcyhmcm9tVW5pcXVlRW50cmllcyk7XG5oYXJkZW4oZnJvbVVuaXF1ZUVudHJpZXMpO1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZlxuICogYW4gYXJyYXkgdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsXG4gKiBgb2JqZWN0TWFwYCB3aWxsIGRvIGxpa2V3aXNlIGZvciB0aGUgc3RyaW5nLW5hbWVkIG93biBlbnVtZXJhYmxlXG4gKiBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdC5cbiAqXG4gKiBUeXBpY2FsIHVzYWdlIGFwcGxpZXMgYG9iamVjdE1hcGAgdG8gYSBDb3B5UmVjb3JkLCBpLmUuLFxuICogYW4gb2JqZWN0IGZvciB3aGljaCBgcGFzc1N0eWxlT2Yob3JpZ2luYWwpID09PSAnY29weVJlY29yZCdgLiBGb3IgdGhlc2UsXG4gKiBub25lIG9mIHRoZSBmb2xsb3dpbmcgZWRnZSBjYXNlcyBhcmlzZS4gVGhlIHJlc3VsdCB3aWxsIGJlIGEgQ29weVJlY29yZFxuICogd2l0aCBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnR5IG5hbWVzLCB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBtYXBwZWQgZm9ybSBvZlxuICogdGhlIG9yaWdpbmFsJ3MgdmFsdWVzLlxuICpcbiAqIFdoZW4gdGhlIG9yaWdpbmFsIGlzIG5vdCBhIENvcHlSZWNvcmQsIHNvbWUgZWRnZSBjYXNlcyB0byBiZSBhd2FyZSBvZlxuICogICAgKiBObyBtYXR0ZXIgaG93IG11dGFibGUgdGhlIG9yaWdpbmFsIG9iamVjdCwgdGhlIHJldHVybmVkIG9iamVjdCBpc1xuICogICAgICBoYXJkZW5lZC5cbiAqICAgICogT25seSB0aGUgc3RyaW5nLW5hbWVkIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsXG4gKiAgICAgIGFyZSBtYXBwZWQuIEFsbCBvdGhlciBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIGBPYmplY3QuZW50cmllc2BcbiAqICAgICAgd2lsbCBjYXVzZSBpdHMgYGdldHRlcmAgdG8gYmUgY2FsbGVkIGFuZCB3aWxsIHVzZSB0aGUgcmVzdWx0aW5nXG4gKiAgICAgIHZhbHVlLlxuICogICAgKiBObyBtYXR0ZXIgd2hldGhlciB0aGUgb3JpZ2luYWwgcHJvcGVydHkgd2FzIGFuIGFjY2Vzc29yLCB3cml0YWJsZSxcbiAqICAgICAgb3IgY29uZmlndXJhYmxlLCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiAgICAgIG5vbi13cml0YWJsZSwgbm9uLWNvbmZpZ3VyYWJsZSwgZGF0YSBwcm9wZXJ0aWVzLlxuICogICAgKiBObyBtYXR0ZXIgd2hhdCB0aGUgb3JpZ2luYWwgb2JqZWN0IG1heSBoYXZlIGluaGVyaXRlZCBmcm9tLCBhbmRcbiAqICAgICAgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgc3BlY2lhbCBraW5kIG9mIG9iamVjdCBzdWNoIGFzIGFuIGFycmF5LFxuICogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWx3YXlzIGJlIGEgcGxhaW4gb2JqZWN0IGluaGVyaXRpbmcgZGlyZWN0bHlcbiAqICAgICAgZnJvbSBgT2JqZWN0LnByb3RvdHlwZWAgYW5kIHdob3NlIHN0YXRlIGlzIG9ubHkgdGhlc2UgbmV3IG1hcHBlZFxuICogICAgICBvd24gcHJvcGVydGllcy5cbiAqXG4gKiBXaXRoIHRoZXNlIGRpZmZlcmVuY2VzLCBldmVuIGlmIHRoZSBvcmlnaW5hbCBvYmplY3Qgd2FzIG5vdCBhIENvcHlSZWNvcmQsXG4gKiBpZiBhbGwgdGhlIG1hcHBlZCB2YWx1ZXMgYXJlIFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogYSBDb3B5UmVjb3JkLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgYW55Pn0gT1xuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHRlbXBsYXRlIFIgbWFwIHJlc3VsdFxuICogQHBhcmFtIHsodmFsdWU6IE9ba2V5b2YgT10sIGtleToga2V5b2YgTykgPT4gUn0gbWFwRm5cbiAqIEByZXR1cm5zIHt7IFtQIGluIGtleW9mIE9dOiBSfX1cbiAqL1xuY29uc3QgICAgICAgIG9iamVjdE1hcD0ob3JpZ2luYWwsbWFwRm4pPT57XG5jb25zdCBlbnRzPWVudHJpZXMob3JpZ2luYWwpO1xuY29uc3QgbWFwRW50cz1lbnRzLm1hcCgoW2ssdl0pPT5bayxtYXBGbih2LGspXSk7XG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKTtcbiB9OyRo4oCNX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSBsZWZ0TmFtZXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gcmlnaHROYW1lc1xuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bmV3IFNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcj19IEVycm9yQ29uc3RydWN0b3JcbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKiBFdmFkZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE0NTAgdXNpbmcgYmxhbmsgbGluZSovXG5jb25zdCAgICAgICAgdGhyb3dMYWJlbGVkPShpbm5lckVycixsYWJlbCxFcnJvckNvbnN0cnVjdG9yPXVuZGVmaW5lZCk9PntcbmlmKHR5cGVvZiBsYWJlbD09PSdudW1iZXInKXtcbmxhYmVsPSBgWyR7bGFiZWx9XWA7XG4gfVxuY29uc3Qgb3V0ZXJFcnI9YXNzZXJ0LmVycm9yKFxuIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAsXG5FcnJvckNvbnN0cnVjdG9yKTtcblxuYXNzZXJ0Lm5vdGUob3V0ZXJFcnIsWCBgQ2F1c2VkIGJ5ICR7aW5uZXJFcnJ9YCk7XG50aHJvdyBvdXRlckVycjtcbiB9OyRo4oCNX29uY2UudGhyb3dMYWJlbGVkKHRocm93TGFiZWxlZCk7XG5oYXJkZW4odGhyb3dMYWJlbGVkKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgQSxSXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFJ9IGZ1bmNcbiAqIEBwYXJhbSB7QVtdfSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtSfVxuICovXG5jb25zdCAgICAgICAgYXBwbHlMYWJlbGluZ0Vycm9yPShmdW5jLGFyZ3MsbGFiZWw9dW5kZWZpbmVkKT0+e1xuaWYobGFiZWw9PT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmMoLi4uYXJncyk7XG4gfVxubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xudGhyb3dMYWJlbGVkKGVycixsYWJlbCk7XG4gfVxuaWYoaXNQcm9taXNlKHJlc3VsdCkpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBJZiByZXN1bHQgaXMgYSByZWplY3RlZCBwcm9taXNlLCB0aGlzIHdpbGwqL1xuLyogcmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEgZGlmZmVyZW50IHJlamVjdGlvbiByZWFzb24uIEJ1dCB0aGlzKi9cbi8qIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCovXG4vKiB3aGljaCBpcyBjb29sIGZvciBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyIGZ1bGZsbC4qL1xuLyogQnV0IFR5cGVTY3JpcHQgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgdGhpcyB3aWxsIG9ubHkgaGFwcGVuKi9cbi8qIHdoZW4gYHJlc3VsdGAgd2FzIGEgcmVqZWN0ZWQgcHJvbWlzZS4gSW4gb25seSB0aGlzIGNhc2UgYFJgKi9cbi8qIHNob3VsZCBhbHJlYWR5IGFsbG93IGBQcm9taXNlPG5ldmVyPmAgYXMgYSBzdWJ0eXBlLiovXG5yZXR1cm4gRS53aGVuKHJlc3VsdCx1bmRlZmluZWQsKHJlYXNvbik9PnRocm93TGFiZWxlZChyZWFzb24sbGFiZWwpKTtcbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH07JGjigI1fb25jZS5hcHBseUxhYmVsaW5nRXJyb3IoYXBwbHlMYWJlbGluZ0Vycm9yKTtcbmhhcmRlbihhcHBseUxhYmVsaW5nRXJyb3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlkZW50Q2hlY2tlciI6WyJpZGVudENoZWNrZXIiXSwiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiXSwib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdLCJsaXN0RGlmZmVyZW5jZSI6WyJsaXN0RGlmZmVyZW5jZSJdLCJ0aHJvd0xhYmVsZWQiOlsidGhyb3dMYWJlbGVkIl0sImFwcGx5TGFiZWxpbmdFcnJvciI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAClK+n3AJAABwCQAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCxtZW1vUmFjZTskaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLCBbJGjigI1fYSA9PiAobWVtb1JhY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlUHJvbWlzZUtpdFwifSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywgJ25hbWUnLCB7dmFsdWU6IFwicmFjZVByb21pc2VzXCJ9KTskaOKAjV9vbmNlLnJhY2VQcm9taXNlcyhyYWNlUHJvbWlzZXMpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2U9Z2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZXx8UHJvbWlzZTtcblxuLyoqXG4gKiBtYWtlUHJvbWlzZUtpdCgpIGJ1aWxkcyBhIFByb21pc2Ugb2JqZWN0LCBhbmQgcmV0dXJucyBhIHJlY29yZFxuICogY29udGFpbmluZyB0aGUgcHJvbWlzZSBpdHNlbGYsIGFzIHdlbGwgYXMgc2VwYXJhdGUgZmFjZXRzIGZvciByZXNvbHZpbmdcbiAqIGFuZCByZWplY3RpbmcgaXQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3NyYy90eXBlcy5qcycpLlByb21pc2VLaXQ8VD59XG4gKi9cbmZ1bmN0aW9uICAgICAgICBtYWtlUHJvbWlzZUtpdCgpe1xuY29uc3R7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9PW1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpO1xuXG5jb25zdCBwcm9taXNlPW5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxucmV0dXJuIGhhcmRlbih7cHJvbWlzZSxyZXNvbHZlLHJlamVjdH0pO1xuIH1cbmhhcmRlbihtYWtlUHJvbWlzZUtpdCk7XG5cbi8qIE5COiBBbm90aGVyIGltcGxlbWVudGF0aW9uIGZvciBQcm9taXNlLnJhY2Ugd291bGQgYmUgdG8gdXNlIHRoZSByZWxlYXNpbmcgZXhlY3V0b3IsKi9cbi8qIEhvd2V2ZXIgd2hpbGUgaXQgd291bGQgbm8gbG9uZ2VyIGxlYWsgdGhlIHJhY2VkIHByb21pc2Ugb2JqZWN0cyB0aGVtc2VsdmVzLCBpdCB3b3VsZCovXG4vKiBzdGlsbCBsZWFrIHJlYWN0aW9ucyBvbiB0aGUgbm9uLXJlc29sdmVkIHByb21pc2VzIGNvbnRlbmRpbmcgZm9yIHRoZSByYWNlLiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xuZnVuY3Rpb24gICAgICAgIHJhY2VQcm9taXNlcyh2YWx1ZXMpe1xucmV0dXJuIGhhcmRlbihtZW1vUmFjZS5jYWxsKEJlc3RQaXBlbGluYWJsZVByb21pc2UsdmFsdWVzKSk7XG4gfVxuaGFyZGVuKHJhY2VQcm9taXNlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACIfYGs3wIAAN8CAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzUHJvbWlzZSwgJ25hbWUnLCB7dmFsdWU6IFwiaXNQcm9taXNlXCJ9KTskaOKAjV9vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOyAgIC8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBtYXliZVByb21pc2UgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHttYXliZVByb21pc2UgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuZnVuY3Rpb24gICAgICAgIGlzUHJvbWlzZShtYXliZVByb21pc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpPT09bWF5YmVQcm9taXNlO1xuIH1cbmhhcmRlbihpc1Byb21pc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHadN674SAAC+EgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBJbml0aWFsIHZlcnNpb24gYXV0aG9yZWQgYnkgQnJpYW4gS2ltOlxuaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8xNzQ2OSNpc3N1ZWNvbW1lbnQtNjg1MjE2Nzc3XG4gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbiBBbnlvbmUgaXMgZnJlZSB0byBjb3B5LCBtb2RpZnksIHB1Ymxpc2gsIHVzZSwgY29tcGlsZSwgc2VsbCwgb3JcbmRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgZWl0aGVyIGluIHNvdXJjZSBjb2RlIGZvcm0gb3IgYXMgYSBjb21waWxlZFxuYmluYXJ5LCBmb3IgYW55IHB1cnBvc2UsIGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwsIGFuZCBieSBhbnlcbm1lYW5zLlxuIEluIGp1cmlzZGljdGlvbnMgdGhhdCByZWNvZ25pemUgY29weXJpZ2h0IGxhd3MsIHRoZSBhdXRob3Igb3IgYXV0aG9yc1xub2YgdGhpcyBzb2Z0d2FyZSBkZWRpY2F0ZSBhbnkgYW5kIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlXG5zb2Z0d2FyZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0XG5vZiB0aGUgcHVibGljIGF0IGxhcmdlIGFuZCB0byB0aGUgZGV0cmltZW50IG9mIG91ciBoZWlycyBhbmRcbnN1Y2Nlc3NvcnMuIFdlIGludGVuZCB0aGlzIGRlZGljYXRpb24gdG8gYmUgYW4gb3ZlcnQgYWN0IG9mXG5yZWxpbnF1aXNobWVudCBpbiBwZXJwZXR1aXR5IG9mIGFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXNcbnNvZnR3YXJlIHVuZGVyIGNvcHlyaWdodCBsYXcuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Jcbk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLFxuQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SXG5PVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byA8aHR0cDovL3VubGljZW5zZS5vcmcvPlxuKi9cblxuXG5cblxuXG5cblxuY29uc3QgaXNPYmplY3Q9KHZhbHVlKT0+T2JqZWN0KHZhbHVlKT09PXZhbHVlO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWZlcnJlZFxuICogQHByb3BlcnR5IHsodmFsdWU/OiBYaW1wb3J0KFwiLi90eXBlcy5qc1wiKS5FUmVmPFQ+ICkgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHByb3BlcnR5IHsoZXJyPzogYW55ICkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IG5ldmVyXG4gKiAgfCB7c2V0dGxlZDogZmFsc2UsIGRlZmVycmVkczogU2V0PERlZmVycmVkPn1cbiAqICB8IHtzZXR0bGVkOiB0cnVlLCBkZWZlcnJlZHM/OiB1bmRlZmluZWR9XG4gKiB9IFByb21pc2VNZW1vUmVjb3JkXG4gKi9cblxuLyogS2V5cyBhcmUgdGhlIHZhbHVlcyBwYXNzZWQgdG8gcmFjZSwgdmFsdWVzIGFyZSBhIHJlY29yZCBvZiBkYXRhIGNvbnRhaW5pbmcgYSovXG4vKiBzZXQgb2YgZGVmZXJyZWRzIGFuZCB3aGV0aGVyIHRoZSB2YWx1ZSBoYXMgc2V0dGxlZC4qL1xuLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgUHJvbWlzZU1lbW9SZWNvcmQ+fSAqL1xuY29uc3Qga25vd25Qcm9taXNlcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZU1lbW9SZWNvcmQgfCB1bmRlZmluZWR9IHJlY29yZFxuICogQHJldHVybnMge1NldDxEZWZlcnJlZD59XG4gKi9cbmNvbnN0IG1hcmtTZXR0bGVkPShyZWNvcmQpPT57XG5pZighcmVjb3JkfHxyZWNvcmQuc2V0dGxlZCl7XG5yZXR1cm4gbmV3IFNldCgpO1xuIH1cblxuY29uc3R7ZGVmZXJyZWRzfT1yZWNvcmQ7XG5PYmplY3QuYXNzaWduKHJlY29yZCx7XG5kZWZlcnJlZHM6dW5kZWZpbmVkLFxuc2V0dGxlZDp0cnVlfSk7XG5cbk9iamVjdC5mcmVlemUocmVjb3JkKTtcbnJldHVybiBkZWZlcnJlZHM7XG4gfTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZU1lbW9SZWNvcmR9XG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQ9KHZhbHVlKT0+e1xuaWYoIWlzT2JqZWN0KHZhbHVlKSl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIGEgcHJpbWl0aXZlLCBhdHRlbXB0aW5nIHRvIHVzZSBpdCBhcyBhIGtleSBpbiB0aGUqL1xuLyogd2Vha21hcCB3b3VsZCB0aHJvdyBhbiBlcnJvci4gTHVja2lseSwgaXQgaXMgc2FmZSB0byBjYWxsKi9cbi8qIGBQcm9taXNlLnJlc29sdmUoY29udGVuZGVyKS50aGVuYCBvbiBhIHByaW1pdGl2ZSB2YWx1ZSBtdWx0aXBsZSB0aW1lcyovXG4vKiBiZWNhdXNlIHRoZSBwcm9taXNlIGZ1bGZpbGxzIGltbWVkaWF0ZWx5LiBTbyB3ZSBmYWtlIGEgc2V0dGxlZCByZWNvcmQuKi9cbnJldHVybiBoYXJkZW4oe3NldHRsZWQ6dHJ1ZX0pO1xuIH1cblxubGV0IHJlY29yZD1rbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbmlmKCFyZWNvcmQpe1xucmVjb3JkPXtkZWZlcnJlZHM6bmV3IFNldCgpLHNldHRsZWQ6ZmFsc2V9O1xua25vd25Qcm9taXNlcy5zZXQodmFsdWUscmVjb3JkKTtcbi8qIFRoaXMgY2FsbCB0byBgdGhlbmAgaGFwcGVucyBvbmNlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHZhbHVlLiovXG5Qcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oXG4odmFsKT0+e1xuZm9yKGNvbnN0e3Jlc29sdmV9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZXNvbHZlKHZhbCk7XG4gfVxuIH0sXG4oZXJyKT0+e1xuZm9yKGNvbnN0e3JlamVjdH1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlamVjdChlcnIpO1xuIH1cbiB9KTtcblxuIH1cbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3R7cmFjZX09e1xuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSBbUD1Qcm9taXNlQ29uc3RydWN0b3JdXG4gKiBAdGhpcyB7UH1cbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5yYWNlKHZhbHVlcyl7XG5sZXQgZGVmZXJyZWQ7XG4vKiogQHR5cGUge1RbXX0gKi9cbmNvbnN0IGNhY2hlZFZhbHVlcz1bXTtcbmNvbnN0IEM9dGhpcztcbmNvbnN0IHJlc3VsdD1uZXcgQygocmVzb2x2ZSxyZWplY3QpPT57XG5kZWZlcnJlZD17cmVzb2x2ZSxyZWplY3R9O1xuZm9yKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyl7XG5jYWNoZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG5jb25zdHtzZXR0bGVkLGRlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihzZXR0bGVkKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgc2V0dGxlZCAoaW5jbHVkaW5nIHByaW1pdGl2ZXMpLCBpdCBpcyBzYWZlKi9cbi8qIHRvIGNhbGwgYFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbmAgb24gaXQuKi9cbkMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLHJlamVjdCk7XG4gfWVsc2V7XG5kZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuXG4vKiBUaGUgZmluYWxseSBjYWxsYmFjayBleGVjdXRlcyB3aGVuIGFueSB2YWx1ZSBzZXR0bGVzLCBwcmV2ZW50aW5nIGFueSBvZiovXG4vKiB0aGUgdW5yZXNvbHZlZCB2YWx1ZXMgZnJvbSByZXRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIHJlc29sdmVkIHZhbHVlLiovXG5yZXR1cm4gcmVzdWx0LmZpbmFsbHkoKCk9PntcbmZvcihjb25zdCB2YWx1ZSBvZiBjYWNoZWRWYWx1ZXMpe1xuY29uc3R7ZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKGRlZmVycmVkcyl7XG5kZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuIH19OyRo4oCNX29uY2UucmFjZShyYWNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANNDsO5pBwAAaQcAADUAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQGNhbGxiYWNrIFByb21pc2VFeGVjdXRvciBUaGUgcHJvbWlzZSBleGVjdXRvclxuICogQHBhcmFtIHsodmFsdWU6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKSBidWlsZHMgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIHdoaWNoIGRyb3AgcmVmZXJlbmNlc1xuICogdG8gdGhlIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyBnYXRoZXJlZCBmcm9tIGFuIGV4ZWN1dG9yIHRvIGJlIHVzZWQgd2l0aCBhXG4gKiBwcm9taXNlIGNvbnN0cnVjdG9yLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UGljazxYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPiwgJ3Jlc29sdmUnIHwgJ3JlamVjdCc+ICYgeyBleGVjdXRvcjogUHJvbWlzZUV4ZWN1dG9yPFQ+fX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKCh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVzb2x2ZTtcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgocmVhc29uOiB1bmtub3duKSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlamVjdDtcblxuLyoqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD59IHZhbHVlICovXG5jb25zdCByZXNvbHZlPSh2YWx1ZSk9PntcbmlmKGludGVybmFsUmVzb2x2ZSl7XG5pbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PW51bGwpO1xuIH1cbiB9O1xuXG4vKiogQHBhcmFtIHt1bmtub3dufSByZWFzb24gKi9cbmNvbnN0IHJlamVjdD0ocmVhc29uKT0+e1xuaWYoaW50ZXJuYWxSZWplY3Qpe1xuaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlamVjdD09PW51bGwpO1xuIH1cbiB9O1xuXG5jb25zdCBleGVjdXRvcj0ocmVzLHJlaik9PntcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT11bmRlZmluZWQmJmludGVybmFsUmVqZWN0PT09dW5kZWZpbmVkKTtcbmludGVybmFsUmVzb2x2ZT1yZXM7XG5pbnRlcm5hbFJlamVjdD1yZWo7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cmVzb2x2ZSxyZWplY3QsZXhlY3V0b3J9KTtcbiB9OyRo4oCNX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACYAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAMriXk9BgAAPQYAAAdAAAAQGVuZG8vc3RyZWFtLXYwLjMuMjUvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsibWFrZVBpcGUiLCJtYWtlUXVldWUiLCJtYWtlU3RyZWFtIiwibWFwUmVhZGVyIiwibWFwV3JpdGVyIiwicHJpbWUiLCJwdW1wIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsbWFrZVByb21pc2VLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZXNvbHZlKHZhbHVlPzogVCB8IFByb21pc2U8VD4pOiB2b2lkLFxuICogICByZWplY3QoZXJyb3I6IEVycm9yKTogdm9pZCxcbiAqICAgcHJvbWlzZTogUHJvbWlzZTxUPlxuICogfX0gUHJvbWlzZUtpdFxuICovXG5cbi8qIFR5cGVTY3JpcHQgUmVhZE9ubHkgc2VtYW50aWNzIGFyZSBub3Qgc3VmZmljaWVudGx5IGV4cHJlc3NpdmUgdG8gZGlzdGluZ3Vpc2gqL1xuLyogYSB2YWx1ZSBvbmUgcHJvbWlzZXMgbm90IHRvIGFsdGVyIGZyb20gYSB2YWx1ZSBvbmUgbXVzdCBub3QgYWx0ZXIsKi9cbi8qIG1ha2luZyBpdCB1c2VsZXNzLiovXG5jb25zdCBmcmVlemU9LyoqIEB0eXBlIHs8VD4odjogVCB8IFJlYWRvbmx5PFQ+KSA9PiBUfSAqL09iamVjdC5mcmVlemU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXN5bmNRdWV1ZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VRdWV1ZT0oKT0+e1xubGV0e3Byb21pc2U6dGFpbFByb21pc2UscmVzb2x2ZTp0YWlsUmVzb2x2ZX09bWFrZVByb21pc2VLaXQoKTtcbnJldHVybntcbnB1dCh2YWx1ZSl7XG5jb25zdHtyZXNvbHZlLHByb21pc2V9PW1ha2VQcm9taXNlS2l0KCk7XG50YWlsUmVzb2x2ZShmcmVlemUoe3ZhbHVlLHByb21pc2V9KSk7XG50YWlsUmVzb2x2ZT1yZXNvbHZlO1xuIH0sXG5nZXQoKXtcbmNvbnN0IHByb21pc2U9dGFpbFByb21pc2UudGhlbigobmV4dCk9Pm5leHQudmFsdWUpO1xudGFpbFByb21pc2U9dGFpbFByb21pc2UudGhlbigobmV4dCk9Pm5leHQucHJvbWlzZSk7XG5yZXR1cm4gaGFyZGVuKHByb21pc2UpO1xuIH19O1xuXG4gfTskaOKAjV9vbmNlLm1ha2VRdWV1ZShtYWtlUXVldWUpO1xuaGFyZGVuKG1ha2VRdWV1ZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRSZWFkXG4gKiBAdGVtcGxhdGUgVFdyaXRlXG4gKiBAdGVtcGxhdGUgVFJlYWRSZXR1cm5cbiAqIEB0ZW1wbGF0ZSBUV3JpdGVSZXR1cm5cbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkFzeW5jUXVldWU8SXRlcmF0b3JSZXN1bHQ8VFJlYWQsIFRSZWFkUmV0dXJuPj59IGFja3NcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkFzeW5jUXVldWU8SXRlcmF0b3JSZXN1bHQ8VFdyaXRlLCBUV3JpdGVSZXR1cm4+Pn0gZGF0YVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0cmVhbT0oYWNrcyxkYXRhKT0+e1xuY29uc3Qgc3RyZWFtPWhhcmRlbih7XG4vKipcbiAqIEBwYXJhbSB7VFdyaXRlfSB2YWx1ZVxuICovXG5uZXh0KHZhbHVlKXtcbi8qIE5vdGUgdGhlIHNoYWxsb3cgZnJlZXplIHNpbmNlIHZhbHVlIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGZyZWV6YWJsZSovXG4vKiAodHlwZWQgYXJyYXlzIGFyZSBub3QpLiovXG5kYXRhLnB1dChmcmVlemUoe3ZhbHVlLGRvbmU6ZmFsc2V9KSk7XG5yZXR1cm4gYWNrcy5nZXQoKTtcbiB9LFxuLyoqXG4gKiBAcGFyYW0ge1RXcml0ZVJldHVybn0gdmFsdWVcbiAqL1xucmV0dXJuKHZhbHVlKXtcbmRhdGEucHV0KGZyZWV6ZSh7dmFsdWUsZG9uZTp0cnVlfSkpO1xucmV0dXJuIGFja3MuZ2V0KCk7XG4gfSxcbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqL1xudGhyb3coZXJyb3Ipe1xuZGF0YS5wdXQoaGFyZGVuKFByb21pc2UucmVqZWN0KGVycm9yKSkpO1xucmV0dXJuIGFja3MuZ2V0KCk7XG4gfSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiBzdHJlYW07XG4gfX0pO1xuXG5yZXR1cm4gc3RyZWFtO1xuIH07JGjigI1fb25jZS5tYWtlU3RyZWFtKG1ha2VTdHJlYW0pO1xuaGFyZGVuKG1ha2VTdHJlYW0pO1xuXG4vKiBKU0RvYyBUeXBlU2NyaXB0IHNlZW1zIHVuYWJsZSB0byBleHByZXNzIHRoaXMgcGFydGljdWxhciBmdW5jdGlvbidzKi9cbi8qIGVudGFuZ2xlbWVudCBvZiBxdWV1ZXMsIGJ1dCB0aGUgZGVmaW5pdGlvbiBpbiB0eXBlcy5kLnRzIHdvcmtzIGZvciB0aGUgZW5kKi9cbi8qIHVzZXIuKi9cbmNvbnN0ICAgICAgICBtYWtlUGlwZT0oKT0+e1xuY29uc3QgZGF0YT1tYWtlUXVldWUoKTtcbmNvbnN0IGFja3M9bWFrZVF1ZXVlKCk7XG5jb25zdCByZWFkZXI9bWFrZVN0cmVhbShhY2tzLGRhdGEpO1xuY29uc3Qgd3JpdGVyPW1ha2VTdHJlYW0oZGF0YSxhY2tzKTtcbnJldHVybiBoYXJkZW4oW3dyaXRlcixyZWFkZXJdKTtcbiB9OyRo4oCNX29uY2UubWFrZVBpcGUobWFrZVBpcGUpO1xuaGFyZGVuKG1ha2VQaXBlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmVhZFJldHVyblxuICogQHRlbXBsYXRlIFRXcml0ZVJldHVyblxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU3RyZWFtPFRXcml0ZSwgVFJlYWQsIFRXcml0ZVJldHVybiwgVFJlYWRSZXR1cm4+fSB3cml0ZXJcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlN0cmVhbTxUUmVhZCwgVFdyaXRlLCBUUmVhZFJldHVybiwgVFdyaXRlUmV0dXJuPn0gcmVhZGVyXG4gKiBAcGFyYW0ge1RXcml0ZX0gcHJpbWVyXG4gKi9cbmNvbnN0ICAgICAgICBwdW1wPWFzeW5jKHdyaXRlcixyZWFkZXIscHJpbWVyKT0+e1xuLyoqIEBwYXJhbSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJlYWRSZXR1cm4+Pn0gcHJvbWlzZSAqL1xuY29uc3QgdGljaz0ocHJvbWlzZSk9PlxuRS53aGVuKFxucHJvbWlzZSxcbihyZXN1bHQpPT57XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gd3JpdGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuIH1lbHNle1xuLyogQmVob2xkOiBtdXR1YWwgcmVjdXJzaW9uLiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIHRvY2sod3JpdGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gfVxuIH0sXG4oLyoqIEB0eXBlIHtFcnJvcn0gKi9lcnJvcik9PntcbnJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuIH0pO1xuXG4vKiogQHBhcmFtIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRXcml0ZSwgVFdyaXRlUmV0dXJuPj59IHByb21pc2UgKi9cbmNvbnN0IHRvY2s9KHByb21pc2UpPT5cbkUud2hlbihcbnByb21pc2UsXG4ocmVzdWx0KT0+e1xuaWYocmVzdWx0LmRvbmUpe1xucmV0dXJuIHJlYWRlci5yZXR1cm4ocmVzdWx0LnZhbHVlKTtcbiB9ZWxzZXtcbnJldHVybiB0aWNrKHJlYWRlci5uZXh0KHJlc3VsdC52YWx1ZSkpO1xuIH1cbiB9LFxuKC8qKiBAdHlwZSB7RXJyb3J9ICovZXJyb3IpPT57XG5yZXR1cm4gcmVhZGVyLnRocm93KGVycm9yKTtcbiB9KTtcblxuYXdhaXQgdGljayhyZWFkZXIubmV4dChwcmltZXIpKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfTskaOKAjV9vbmNlLnB1bXAocHVtcCk7XG5oYXJkZW4ocHVtcCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRSZWFkXG4gKiBAdGVtcGxhdGUgVFdyaXRlXG4gKiBAdGVtcGxhdGUgVFJldHVyblxuICogQHBhcmFtIHtBc3luY0dlbmVyYXRvcjxUUmVhZCwgVFJldHVybiwgVFdyaXRlPn0gZ2VuZXJhdG9yXG4gKiBAcGFyYW0ge1RXcml0ZX0gcHJpbWVyXG4gKi9cbmNvbnN0ICAgICAgICBwcmltZT0oZ2VuZXJhdG9yLHByaW1lcik9Pntcbi8qIFdlIGNhcHR1cmUgdGhlIGZpcnN0IHJldHVybmVkIHByb21pc2UuKi9cbmNvbnN0IGZpcnN0PWdlbmVyYXRvci5uZXh0KHByaW1lcik7XG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmV0dXJuPj19ICovXG5sZXQgcmVzdWx0O1xuY29uc3QgcHJpbWVkPWhhcmRlbih7XG4vKiogQHBhcmFtIHtUV3JpdGV9IHZhbHVlICovXG4gICAgICBhc3luYyBuZXh0KHZhbHVlKXtcbmlmKHJlc3VsdD09PXVuZGVmaW5lZCl7XG5yZXN1bHQ9YXdhaXQgZmlyc3Q7XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5yZXR1cm4gZ2VuZXJhdG9yLm5leHQodmFsdWUpO1xuIH0sXG4vKiogQHBhcmFtIHtUUmV0dXJufSB2YWx1ZSAqL1xuICAgICAgYXN5bmMgcmV0dXJuKHZhbHVlKXtcbmlmKHJlc3VsdD09PXVuZGVmaW5lZCl7XG5yZXN1bHQ9YXdhaXQgZmlyc3Q7XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5yZXR1cm4gZ2VuZXJhdG9yLnJldHVybih2YWx1ZSk7XG4gfSxcbi8qKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAqL1xuICAgICAgYXN5bmMgdGhyb3coZXJyb3Ipe1xuaWYocmVzdWx0PT09dW5kZWZpbmVkKXtcbnJlc3VsdD1hd2FpdCBmaXJzdDtcbmlmKHJlc3VsdC5kb25lKXtcbnRocm93IGVycm9yO1xuIH1cbiB9XG5yZXR1cm4gZ2VuZXJhdG9yLnRocm93KGVycm9yKTtcbiB9fSk7XG5cbnJldHVybiBwcmltZWQ7XG4gfTskaOKAjV9vbmNlLnByaW1lKHByaW1lKTtcbmhhcmRlbihwcmltZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRJblxuICogQHRlbXBsYXRlIFRPdXRcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlYWRlcjxUSW4+fSByZWFkZXJcbiAqIEBwYXJhbSB7KHZhbHVlOiBUSW4pID0+IFRPdXR9IHRyYW5zZm9ybVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZWFkZXI8VE91dD59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBSZWFkZXI9KHJlYWRlcix0cmFuc2Zvcm0pPT57XG5hc3luYyBmdW5jdGlvbip0cmFuc2Zvcm1HZW5lcmF0b3IoKXtcbmZvciBhd2FpdChjb25zdCB2YWx1ZSBvZiByZWFkZXIpe1xueWllbGQgdHJhbnNmb3JtKHZhbHVlKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbnJldHVybiBoYXJkZW4odHJhbnNmb3JtR2VuZXJhdG9yKCkpO1xuIH07JGjigI1fb25jZS5tYXBSZWFkZXIobWFwUmVhZGVyKTtcbmhhcmRlbihtYXBSZWFkZXIpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUSW5cbiAqIEB0ZW1wbGF0ZSBUT3V0XG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Xcml0ZXI8VE91dD59IHdyaXRlclxuICogQHBhcmFtIHsodmFsdWU6IFRJbikgPT4gVE91dH0gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi90eXBlcy5qcycpLldyaXRlcjxUSW4+fVxuICovXG5jb25zdCAgICAgICAgbWFwV3JpdGVyPSh3cml0ZXIsdHJhbnNmb3JtKT0+e1xuY29uc3QgdHJhbnNmb3JtZWRXcml0ZXI9aGFyZGVuKHtcbi8qKlxuICogQHBhcmFtIHtUSW59IHZhbHVlXG4gKi9cbiAgICAgIGFzeW5jIG5leHQodmFsdWUpe1xucmV0dXJuIHdyaXRlci5uZXh0KHRyYW5zZm9ybSh2YWx1ZSkpO1xuIH0sXG4vKipcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKi9cbiAgICAgIGFzeW5jIHRocm93KGVycm9yKXtcbnJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuIH0sXG4vKipcbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSB2YWx1ZVxuICovXG4gICAgICBhc3luYyByZXR1cm4odmFsdWUpe1xucmV0dXJuIHdyaXRlci5yZXR1cm4odmFsdWUpO1xuIH0sXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7XG5yZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG4gfX0pO1xuXG5yZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG4gfTskaOKAjV9vbmNlLm1hcFdyaXRlcihtYXBXcml0ZXIpO1xuaGFyZGVuKG1hcFdyaXRlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVF1ZXVlIjpbIm1ha2VRdWV1ZSJdLCJtYWtlU3RyZWFtIjpbIm1ha2VTdHJlYW0iXSwibWFrZVBpcGUiOlsibWFrZVBpcGUiXSwicHVtcCI6WyJwdW1wIl0sInByaW1lIjpbInByaW1lIl0sIm1hcFJlYWRlciI6WyJtYXBSZWFkZXIiXSwibWFwV3JpdGVyIjpbIm1hcFdyaXRlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACLuoeSrQEAAK0BAAAcAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvbWFpbi5qc3siaW1wb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3JpbmcwL21haW4uanNcIiwgW11dLFtcIi4vcmluZzEvbWFpbi5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnc8TiV0BAABdAQAAHwAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL0UuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiQGVuZG8vZmFyIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD4tMm/qQMAAKkDAAAsAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzeW5jR2VuZXJhdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIFJldHVybiBhbiBhc3luYyBpdGVyYWJsZSB0aGF0IHByb2R1Y2VzIGl0ZXJhdG9yIHJlc3VsdHMgdmlhIGBuZXh0YC5cbiAqXG4gKiBUaGlzIHdvcmtzIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBTeW1ib2wuXG4gKlxuICogQHRlbXBsYXRlIFQsVFJldHVyblxuICogQHBhcmFtIHsoKSA9PiBJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPiB8XG4gKiAgICAgICAgICAgICAgIFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4+XG4gKiB9IG5leHQgcHJvZHVjZSBhIHNpbmdsZS1zdGVwIGl0ZXJhdG9yIHJlc3VsdFxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBhc3luY0dlbmVyYXRlPShuZXh0KT0+e1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6YXN5bmMoKT0+aGFyZGVuKG5leHQoKSl9KTtcblxuIH19KTtcblxuIH07JGjigI1fb25jZS5hc3luY0dlbmVyYXRlKGFzeW5jR2VuZXJhdGUpO1xuaGFyZGVuKGFzeW5jR2VuZXJhdGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jR2VuZXJhdGUiOlsiYXN5bmNHZW5lcmF0ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACX11Tt0AEAANABAAAiAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFpbi5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIiwiLi9tYWtlcnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL0UuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIiwiLi9tYWtlcnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL0UuanNcIiwgW11dLFtcIi4vbWFrZXJzLmpzXCIsIFtdXSxbXCIuL2FzeW5jLWdlbmVyYXRlLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABvm3ti4wgAAOMIAAAkAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFrZXJzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlTWFwIiwibWFrZVByb21pc2UiLCJtYWtlU2V0IiwibWFrZVdlYWtNYXAiLCJtYWtlV2Vha1NldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBUaGVzZSB3b3JrIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBgbmV3YC4qL1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIiAvPiovXG5cbi8qKiBAdHlwZSB7PFQ+KGV4ZWN1dG9yOiAocmVzb2x2ZTogKHZhbHVlOiBUKSA9PiB2b2lkLCByZWplY3Q6IChyZWFzb24/OiBhbnkpID0+XG4gKiB2b2lkKSA9PiB2b2lkKSA9PiBQcm9taXNlPFQ+fSAqL1xuY29uc3QgICAgICAgIG1ha2VQcm9taXNlPShleGVjdXRvcik9PmhhcmRlbihuZXcgUHJvbWlzZShleGVjdXRvcikpOyRo4oCNX29uY2UubWFrZVByb21pc2UobWFrZVByb21pc2UpO1xuaGFyZGVuKG1ha2VQcm9taXNlKTtcblxuLyoqIEB0eXBlZGVmIHs8SywgVj4oZW50cmllcz86IHJlYWRvbmx5IChyZWFkb25seSBbSywgVl0pW10pID0+IE1hcDxLLCBWPn0gTWFwRnJvbUVudHJpZXMgKi9cbi8qKiBAdHlwZWRlZiB7PEssIFY+KGl0ZXJhYmxlOiBJdGVyYWJsZTxyZWFkb25seSBbSywgVl0+KSA9PiBNYXA8SywgVj59IE1hcEZyb21JdGVyYWJsZSAqL1xuXG4vKiogQHR5cGUge01hcEZyb21FbnRyaWVzICYgTWFwRnJvbUl0ZXJhYmxlfSAqL1xuY29uc3QgICAgICAgIG1ha2VNYXA9KGVudHJpZXNPckl0ZXJhYmxlKT0+aGFyZGVuKG5ldyBNYXAoZW50cmllc09ySXRlcmFibGUpKTskaOKAjV9vbmNlLm1ha2VNYXAobWFrZU1hcCk7XG5oYXJkZW4obWFrZU1hcCk7XG5cbi8qKiBAdHlwZWRlZiB7PFQ+KHZhbHVlcz86IHJlYWRvbmx5IFRbXSkgPT4gU2V0PFQ+fSBTZXRGcm9tVmFsdWVzICovXG4vKiogQHR5cGVkZWYgezxUPihpdGVyYWJsZTogSXRlcmFibGU8VD4pID0+IFNldDxUPn0gU2V0RnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1NldEZyb21WYWx1ZXMgJiBTZXRGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZVNldD0odmFsdWVzKT0+aGFyZGVuKG5ldyBTZXQodmFsdWVzKSk7JGjigI1fb25jZS5tYWtlU2V0KG1ha2VTZXQpO1xuaGFyZGVuKG1ha2VTZXQpO1xuXG4vKiogQHR5cGVkZWYgezxLIGV4dGVuZHMge30sIFYgPSBhbnk+KGVudHJpZXM/OiByZWFkb25seSBbSywgVl1bXSB8IG51bGwpID0+IFdlYWtNYXA8SywgVj59IFdlYWtNYXBGcm9tRW50cmllcyAqL1xuLyoqIEB0eXBlZGVmIHs8SyBleHRlbmRzIHt9LCBWPihpdGVyYWJsZTogSXRlcmFibGU8W0ssIFZdPikgPT4gV2Vha01hcDxLLCBWPn0gV2Vha01hcEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtXZWFrTWFwRnJvbUVudHJpZXMgJiBXZWFrTWFwRnJvbUl0ZXJhYmxlfSAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrTWFwPShlbnRyaWVzKT0+aGFyZGVuKG5ldyBXZWFrTWFwKGVudHJpZXMpKTskaOKAjV9vbmNlLm1ha2VXZWFrTWFwKG1ha2VXZWFrTWFwKTtcbmhhcmRlbihtYWtlV2Vha01hcCk7XG5cbi8qKiBAdHlwZWRlZiB7PFQgZXh0ZW5kcyB7fT4odmFsdWVzPzogcmVhZG9ubHkgVFtdKSA9PiBXZWFrU2V0PFQ+fSBXZWFrU2V0RnJvbVZhbHVlcyAqL1xuLyoqIEB0eXBlZGVmIHs8VCBleHRlbmRzIHt9PihpdGVyYWJsZTogSXRlcmFibGU8VD4pID0+IFdlYWtTZXQ8VD59IFdlYWtTZXRGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7V2Vha1NldEZyb21WYWx1ZXMgJiBXZWFrU2V0RnJvbUl0ZXJhYmxlfSAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrU2V0PSh2YWx1ZXMpPT5oYXJkZW4obmV3IFdlYWtTZXQodmFsdWVzKSk7JGjigI1fb25jZS5tYWtlV2Vha1NldChtYWtlV2Vha1NldCk7XG5oYXJkZW4obWFrZVdlYWtTZXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlIjpbIm1ha2VQcm9taXNlIl0sIm1ha2VNYXAiOlsibWFrZU1hcCJdLCJtYWtlU2V0IjpbIm1ha2VTZXQiXSwibWFrZVdlYWtNYXAiOlsibWFrZVdlYWtNYXAiXSwibWFrZVdlYWtTZXQiOlsibWFrZVdlYWtTZXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAtCz1mP4EAAD+BAAAKQAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzeyJpbXBvcnRzIjpbIi4uL3JpbmcwL21haW4uanMiXSwiZXhwb3J0cyI6WyJhc3luY0RvV2hpbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVByb21pc2U7JGjigI1faW1wb3J0cyhbW1wiLi4vcmluZzAvbWFpbi5qc1wiLCBbW1wibWFrZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIFJlc29sdmUgcmV0dXJuZWQgcHJvbWlzZSB3aXRoIHVuZGVmaW5lZCB3aGVuIGBib2R5YCByZXR1cm5zIGZhbHN5LlxuICpcbiAqIFRoaXMgd29ya3MgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIGBhd2FpdGAgbm90IGF0IHRoZSBmdW5jdGlvbi1sZXZlbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUIHwgUHJvbWlzZTxUPn0gYm9keSBwZXJmb3JtIHNpZGUtZWZmZWN0cywgYW5kIHJldHVybiB0cnV0aHkgaWZcbiAqIHdlIHNob3VsZCBydW4gYWdhaW5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5jb25zdCAgICAgICAgYXN5bmNEb1doaWxlPShib2R5KT0+e1xuY29uc3QgbG9vcD1hc3luYyhyZXNvbHZlLHJlamVjdCk9PntcbmNvbnN0IGRvQ29udGludWU9YXdhaXQgYm9keSgpO1xuaWYoIWRvQ29udGludWUpe1xuLyogUmVzb2x2ZSB0aGUgb3V0ZXJtb3N0IHByb21pc2UuKi9cbnJlc29sdmUodW5kZWZpbmVkKTtcbnJldHVybjtcbiB9XG5cbi8qIERvIHRoZSBsb29wIGFnYWluLiAgV2UgYXJlIGNhcmVmdWwgbm90IHRvIGF3YWl0IHNvIHRoYXQgd2UgZG9uJ3QgY3JlYXRlIGEqL1xuLyogcHJvbWlzZSBjaGFpbi4qL1xubG9vcChyZXNvbHZlLHJlamVjdCkuY2F0Y2gocmVqZWN0KTtcbiB9O1xuXG5yZXR1cm4gbWFrZVByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+bG9vcChyZXNvbHZlLHJlamVjdCkuY2F0Y2gocmVqZWN0KSk7XG4gfTskaOKAjV9vbmNlLmFzeW5jRG9XaGlsZShhc3luY0RvV2hpbGUpO1xuaGFyZGVuKGFzeW5jRG9XaGlsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNEb1doaWxlIjpbImFzeW5jRG9XaGlsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACWE0KycgEAAHIBAAAiAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvbWFpbi5qc3siaW1wb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vYXN5bmMtdG9vbHMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAAq9BYJ6gMAQCoDAEAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAOYpWAjsLAAA7CwAAIwAAAAAAAAAAAAAApIHaDAEAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy9hc3NlcnQuanNQSwECHgMKAAAAAAAAAAAABbmH7NouAADaLgAAIgAAAAAAAAAAAAAApIFWGAEAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACriiOmbAEAAGwBAAAgAAAAAAAAAAAAAACkgXBHAQBAYWdvcmljL2VydHAtdjAuMTYuMi9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAABT9YW/RjcAAEY3AAAmAAAAAAAAAAAAAACkgRpJAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50TWF0aC5qc1BLAQIeAwoAAAAAAAAAAABKlADt1QUAANUFAAAnAAAAAAAAAAAAAACkgaSAAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanNQSwECHgMKAAAAAAAAAAAAQzB73OgBAADoAQAAIQAAAAAAAAAAAAAApIG+hgEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAADVdwSiYIAAAmCAAACUAAAAAAAAAAAAAAKSB5YgBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pc3N1ZXJLaXQuanNQSwECHgMKAAAAAAAAAAAAgMhu7rMFAACzBQAAOgAAAAAAAAAAAAAApIHAqQEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABx52I9xwUAAMcFAAA6AAAAAAAAAAAAAACkgcuvAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAP/csPsqBgAAKgYAADYAAAAAAAAAAAAAAKSB6rUBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAmmZgvnwcAAJ8HAAA2AAAAAAAAAAAAAACkgWi8AQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAsDioH6UEAAClBAAAIwAAAAAAAAAAAAAApIFbxAEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanNQSwECHgMKAAAAAAAAAAAAD9fo7usxAADrMQAAKQAAAAAAAAAAAAAApIFByQEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanNQSwECHgMKAAAAAAAAAAAAokVFQsAPAADADwAAIQAAAAAAAAAAAAAApIFz+wEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3B1cnNlLmpzUEsBAh4DCgAAAAAAAAAAAC5JY6kUBgAAFAYAAC0AAAAAAAAAAAAAAKSBcgsCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAo7p4+EicAABInAAAmAAAAAAAAAAAAAACkgdERAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAAAsz6lRcD8AAHA/AAApAAAAAAAAAAAAAACkgSc5AgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAABt22EKXigAAF4oAAAnAAAAAAAAAAAAAACkgd54AgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2FsbGJhY2suanNQSwECHgMKAAAAAAAAAAAAqo/dRiIGAAAiBgAAJQAAAAAAAAAAAAAApIGBoQIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NvbmZpZy5qc1BLAQIeAwoAAAAAAAAAAAAXyTOAyAQAAMgEAAAkAAAAAAAAAAAAAACkgeanAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvZGVidWcuanNQSwECHgMKAAAAAAAAAAAAbhWYn0MCAABDAgAAJAAAAAAAAAAAAAAApIHwrAIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAACkBuNZ+KQAAfikAAC8AAAAAAAAAAAAAAKSBda8CAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAAKLuyIDeEAAA3hAAACsAAAAAAAAAAAAAAKSBQNkCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRob2QtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAVDn6ES0CAAAtAgAAKQAAAAAAAAAAAAAApIFn6gIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAA3saijCsHAAArBwAAKgAAAAAAAAAAAAAApIHb7AIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3VwZ3JhZGUtYXBpLmpzUEsBAh4DCgAAAAAAAAAAAKLpsZLjPAAA4zwAACQAAAAAAAAAAAAAAKSBTvQCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91dGlscy5qc1BLAQIeAwoAAAAAAAAAAABn0MWK1RIAANUSAAAzAAAAAAAAAAAAAACkgXMxAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNQSwECHgMKAAAAAAAAAAAAsL4vTxwHAAAcBwAAJAAAAAAAAAAAAAAApIGZRAMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAPKwCGVaGAAAWhgAACcAAAAAAAAAAAAAAKSB90sDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAADXOBOWgDgAAIA4AAAqAAAAAAAAAAAAAACkgZZkAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvcHVibGlzaC1raXQuanNQSwECHgMKAAAAAAAAAAAAvgEwJIMKAACDCgAALgAAAAAAAAAAAAAApIFenQMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAEVEtx1SEAANUhAAAnAAAAAAAAAAAAAACkgS2oAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVzdWIuanNQSwECHgMKAAAAAAAAAAAA2t8JhyIkAAAiJAAAKAAAAAAAAAAAAAAApIFHygMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZS5qc1BLAQIeAwoAAAAAAAAAAAAnsjsjxQsAAMULAAApAAAAAAAAAAAAAACkga/uAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlci5qc1BLAQIeAwoAAAAAAAAAAAAhgRZyDAYAAAwGAAAkAAAAAAAAAAAAAACkgbv6AwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdG9waWMuanNQSwECHgMKAAAAAAAAAAAA+FEPEz8wAAA/MAAALAAAAAAAAAAAAAAApIEJAQQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAAPmJcNlwBAABcAQAAIAAAAAAAAAAAAAAApIGSMQQAQGFnb3JpYy9zdG9yZS12MC45LjIvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAxKPgSCMMAAAjDAAAIQAAAAAAAAAAAAAApIEsMwQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAOKvgH1GCwAARgsAACwAAAAAAAAAAAAAAKSBjj8EAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzUEsBAh4DCgAAAAAAAAAAAKaDTbTCBgAAwgYAADAAAAAAAAAAAAAAAKSBHksEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1BLAQIeAwoAAAAAAAAAAACaA7rXFhYAABYWAAAxAAAAAAAAAAAAAACkgS5SBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAJ0DliBBDwAAQQ8AADEAAAAAAAAAAAAAAKSBk2gEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNQSwECHgMKAAAAAAAAAAAAfkXiyXcTAAB3EwAANQAAAAAAAAAAAAAApIEjeAQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAA6ErEYQ8PAAAPDwAANQAAAAAAAAAAAAAApIHtiwQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNQSwECHgMKAAAAAAAAAAAAstdjCJ0ZAACdGQAALgAAAAAAAAAAAAAApIFPmwQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc1BLAQIeAwoAAAAAAAAAAADFAKyCWCoAAFgqAAAhAAAAAAAAAAAAAACkgTi1BABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAIZgh2L8BAAC/AQAAHAAAAAAAAAAAAAAApIHP3wQAQGFnb3JpYy90aW1lLXYwLjMuMi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADAQDfmqCIAAKgiAAAjAAAAAAAAAAAAAACkgcjhBABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90aW1lTWF0aC5qc1BLAQIeAwoAAAAAAAAAAABusx6qpwcAAKcHAAAlAAAAAAAAAAAAAACkgbEEBQBAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAADLMtBIlKQAAJSkAACgAAAAAAAAAAAAAAKSBmwwFAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9leG8tdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAO+M9iJIIAACSCAAAJAAAAAAAAAAAAAAApIEGNgUAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAN70jyBTKAAAUygAADAAAAAAAAAAAAAAAKSB2j4FAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc1BLAQIeAwoAAAAAAAAAAAAN22wXigcAAIoHAAAjAAAAAAAAAAAAAACkgXtnBQBAYWdvcmljL3ZhdHMtdjAuMTUuMS9zcmMvdmF0LXpvZS5qc1BLAQIeAwoAAAAAAAAAAABxjbziQBwAAEAcAAAoAAAAAAAAAAAAAACkgUZvBQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jbGVhblByb3Bvc2FsLmpzUEsBAh4DCgAAAAAAAAAAAJqoOUK8EAAAvBAAADQAAAAAAAAAAAAAAKSBzIsFAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanNQSwECHgMKAAAAAAAAAAAApH1jNjMRAAAzEQAAMAAAAAAAAAAAAAAApIHanAUAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvaW5zdGFuY2VSZWNvcmRTdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAAG0xO1m5JwAAuScAACkAAAAAAAAAAAAAAKSBW64FAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2ludGVybmFsLXR5cGVzLmpzUEsBAh4DCgAAAAAAAAAAACaMz6smBQAAJgUAACcAAAAAAAAAAAAAAKSBW9YFAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2lzc3VlclJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAAAr1BXiSR0AAEkdAAAoAAAAAAAAAAAAAACkgcbbBQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9pc3N1ZXJTdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAAKCkFjVWCAAAVggAACUAAAAAAAAAAAAAAKSBVfkFAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL21ha2VIYW5kbGUuanNQSwECHgMKAAAAAAAAAAAAxvqXB6IFAACiBQAALQAAAAAAAAAAAAAApIHuAQYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvb2JqQXJyYXlDb252ZXJzaW9uLmpzUEsBAh4DCgAAAAAAAAAAAOWxCczbQwAA20MAACUAAAAAAAAAAAAAAKSB2wcGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAA6Q0Ba5YHAACWBwAAIAAAAAAAAAAAAAAApIH5SwYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAdoiDztoDAADaAwAAMgAAAAAAAAAAAAAApIHNUwYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9jcmVhdGVaQ0ZWYXQuanNQSwECHgMKAAAAAAAAAAAAp26XTvsSAAD7EgAAMwAAAAAAAAAAAAAApIH3VwYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9lc2Nyb3dTdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAAGf6duUZDQAAGQ0AAC0AAAAAAAAAAAAAAKSBQ2sGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvZmVlTWludC5qc1BLAQIeAwoAAAAAAAAAAABlMdlo5xcAAOcXAAA5AAAAAAAAAAAAAACkgad4BgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL2luc3RhbGxhdGlvblN0b3JhZ2UuanNQSwECHgMKAAAAAAAAAAAAp6GYtC0oAAAtKAAAOgAAAAAAAAAAAAAApIHlkAYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9pbnN0YW5jZUFkbWluU3RvcmFnZS5qc1BLAQIeAwoAAAAAAAAAAAA/cyV5dxQAAHcUAAA0AAAAAAAAAAAAAACkgWq5BgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL2ludGVybmFsLXR5cGVzLmpzUEsBAh4DCgAAAAAAAAAAACppN6+RBQAAkQUAADcAAAAAAAAAAAAAAKSBM84GAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvaW52aXRhdGlvblF1ZXJpZXMuanNQSwECHgMKAAAAAAAAAAAAZLXOVD4HAAA+BwAANAAAAAAAAAAAAAAApIEZ1AYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9tYWtlSW52aXRhdGlvbi5qc1BLAQIeAwoAAAAAAAAAAACO9VSaqQYAAKkGAAA6AAAAAAAAAAAAAACkganbBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy96b2VTZXJ2aWNlL29mZmVyL2J1cm5JbnZpdGF0aW9uLmpzUEsBAh4DCgAAAAAAAAAAAMYcSk5RCwAAUQsAADEAAAAAAAAAAAAAAKSBquIGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2Uvb2ZmZXIvb2ZmZXIuanNQSwECHgMKAAAAAAAAAAAAj+C2uoImAACCJgAAMwAAAAAAAAAAAAAApIFK7gYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS9zdGFydEluc3RhbmNlLmpzUEsBAh4DCgAAAAAAAAAAAGpVpz4sLQAALC0AACsAAAAAAAAAAAAAAKSBHRUHAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2UvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAKFcYZU8jAABPIwAAKQAAAAAAAAAAAAAApIGSQgcAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS96b2UuanNQSwECHgMKAAAAAAAAAAAAUXCv0NgqAADYKgAALQAAAAAAAAAAAAAApIEoZgcAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvem9lU2VydmljZS96b2VTZWF0LmpzUEsBAh4DCgAAAAAAAAAAAJFGVsUiOgAAIjoAADcAAAAAAAAAAAAAAKSBS5EHAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL3pvZVNlcnZpY2Uvem9lU3RvcmFnZU1hbmFnZXIuanNQSwECHgMKAAAAAAAAAAAAt8K8e+IGAADiBgAAHwAAAAAAAAAAAAAApIHCywcAQGFnb3JpYy96b25lLXYwLjIuMi9zcmMvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAADY9BkwjwkAAI8JAAAgAAAAAAAAAAAAAACkgeHSBwBAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAB+JG4t0hEAANIRAAAkAAAAAAAAAAAAAACkga7cBwBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAANwvtTx8CAAAfAgAAKgAAAAAAAAAAAAAApIHC7gcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yL3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAKFYIz+PEAAAjxAAAC4AAAAAAAAAAAAAAKSBKfEHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAOlKtTRwCAAAcAgAAGQAAAAAAAAAAAAAApIEEAggAQGVuZG8vZXhvLXYwLjIuMi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADGt+tWYxgAAGMYAAAiAAAAAAAAAAAAAACkgVcECABAZW5kby9leG8tdjAuMi4yL3NyYy9leG8tbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAADGwrfJxJgAAcSYAACEAAAAAAAAAAAAAAKSB+hwIAEBlbmRvL2V4by12MC4yLjIvc3JjL2V4by10b29scy5qc1BLAQIeAwoAAAAAAAAAAABBDDOUQAIAAEACAAAeAAAAAAAAAAAAAACkgapDCABAZW5kby9mYXItdjAuMi4xOC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAApY8690oHAABKBwAAHQAAAAAAAAAAAAAApIEmRggAQGVuZG8vbWFyc2hhbC12MC44LjUvaW5kZXguanNQSwECHgMKAAAAAAAAAAAADQgme5QNAACUDQAAKwAAAAAAAAAAAAAApIGrTQgAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1BLAQIeAwoAAAAAAAAAAAA7cs+A5D8AAOQ/AAAqAAAAAAAAAAAAAACkgYhbCABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlUGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAxFOn8Pw/AAD8PwAAKwAAAAAAAAAAAAAApIG0mwgAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1BLAQIeAwoAAAAAAAAAAACzXvdrxTsAAMU7AAAtAAAAAAAAAAAAAACkgfnbCABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanNQSwECHgMKAAAAAAAAAAAACEKS/awqAACsKgAAKgAAAAAAAAAAAAAApIEJGAkAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL21hcnNoYWwtanVzdGluLmpzUEsBAh4DCgAAAAAAAAAAABPT1RvcBgAA3AYAAC0AAAAAAAAAAAAAAKSB/UIJAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1BLAQIeAwoAAAAAAAAAAAC+nmlK7DIAAOwyAAAjAAAAAAAAAAAAAACkgSRKCQBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvbWFyc2hhbC5qc1BLAQIeAwoAAAAAAAAAAABXRGQKfkAAAH5AAAAlAAAAAAAAAAAAAACkgVF9CQBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAAJgZO7M0AQAANAEAACEAAAAAAAAAAAAAAKSBEr4JAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAlHpu9zwsAAM8LAAAeAAAAAAAAAAAAAACkgYW/CQBAZW5kby9uYXQtdjQuMS4yNy9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAZfKMGnwIAAB8CAAAIAAAAAAAAAAAAAAApIGQywkAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA3ka2qpMHAACTBwAAKAAAAAAAAAAAAAAApIFK1AkAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAACD9dsszwcAAM8HAAApAAAAAAAAAAAAAACkgSPcCQBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAADToDhxnREAAJ0RAAAkAAAAAAAAAAAAAACkgTnkCQBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvZXJyb3IuanNQSwECHgMKAAAAAAAAAAAASjtmg1UIAABVCAAAKwAAAAAAAAAAAAAApIEY9gkAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2l0ZXItaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABiTWcDThoAAE4aAAAnAAAAAAAAAAAAAACkgbb+CQBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvbWFrZS1mYXIuanNQSwECHgMKAAAAAAAAAAAAApF75R0EAAAdBAAAKQAAAAAAAAAAAAAApIFJGQoAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL21ha2VUYWdnZWQuanNQSwECHgMKAAAAAAAAAAAAGUAoxvUZAAD1GQAAMAAAAAAAAAAAAAAApIGtHQoAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAC5usQ2DGwAAgxsAACoAAAAAAAAAAAAAAKSB8DcKAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9wYXNzU3R5bGVPZi5qc1BLAQIeAwoAAAAAAAAAAAAUsaJ9wyEAAMMhAAAoAAAAAAAAAAAAAACkgbtTCgBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcmVtb3RhYmxlLmpzUEsBAh4DCgAAAAAAAAAAADXiToqaDwAAmg8AACsAAAAAAAAAAAAAAKSBxHUKAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9zYWZlLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAxx/VUEcSAABHEgAAJQAAAAAAAAAAAAAApIGnhQoAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAAAlvFz7/QcAAP0HAAAlAAAAAAAAAAAAAACkgTGYCgBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAHqgfmgSDQAAEg0AACkAAAAAAAAAAAAAAKSBcaAKAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAJgZO7M0AQAANAEAACQAAAAAAAAAAAAAAKSByq0KAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACwnEJ+4goAAOIKAAAeAAAAAAAAAAAAAACkgUCvCgBAZW5kby9wYXR0ZXJucy12MC4yLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAyxcZ4KRGAACkRgAAKgAAAAAAAAAAAAAApIFeugoAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL2NoZWNrS2V5LmpzUEsBAh4DCgAAAAAAAAAAAPfmwlF3GgAAdxoAAC0AAAAAAAAAAAAAAKSBSgELAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1BLAQIeAwoAAAAAAAAAAABVIML9KhQAACoUAAApAAAAAAAAAAAAAACkgQwcCwBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY29weUJhZy5qc1BLAQIeAwoAAAAAAAAAAAAKHf6/oxAAAKMQAAApAAAAAAAAAAAAAACkgX0wCwBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY29weVNldC5qc1BLAQIeAwoAAAAAAAAAAAALKJ5teSUAAHklAAA1AAAAAAAAAAAAAACkgWdBCwBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAAAi9nVSnigAAJ4oAAA1AAAAAAAAAAAAAACkgTNnCwBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAACJDDsFM8MAADPDAAA1AAAAAAAAAAAAAACkgSSQCwBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAiAAAAAAAAAAAAAACkgapTDABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAJYe98fqGgAA6hoAACIAAAAAAAAAAAAAAKSBHlUMAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAClK+n3AJAABwCQAAIgAAAAAAAAAAAAAApIFIcAwAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACIfYGs3wIAAN8CAAArAAAAAAAAAAAAAACkgfh5DABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAB2nTeu+EgAAvhIAACoAAAAAAAAAAAAAAKSBIH0MAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAADTQ7DuaQcAAGkHAAA1AAAAAAAAAAAAAACkgSaQDABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAmAAAAAAAAAAAAAACkgeKXDABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAMriXk9BgAAPQYAAAdAAAAAAAAAAAAAACkgVqZDABAZW5kby9zdHJlYW0tdjAuMy4yNS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACLuoeSrQEAAK0BAAAcAAAAAAAAAAAAAACkgYmyDABqZXNzaWUuanMtdjAuMy4yL3NyYy9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAJ3PE4ldAQAAXQEAAB8AAAAAAAAAAAAAAKSBcLQMAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL0UuanNQSwECHgMKAAAAAAAAAAAA+LTJv6kDAACpAwAALAAAAAAAAAAAAAAApIEKtgwAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanNQSwECHgMKAAAAAAAAAAAAl9dU7dABAADQAQAAIgAAAAAAAAAAAAAApIH9uQwAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAABvm3ti4wgAAOMIAAAkAAAAAAAAAAAAAACkgQ28DABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAtCz1mP4EAAD+BAAAKQAAAAAAAAAAAAAApIEyxQwAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAlhNCsnIBAAByAQAAIgAAAAAAAAAAAAAApIF3ygwAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvbWFpbi5qc1BLBQYAAAAAiQCJAIguAAApzAwAAAA=", - "endoZipBase64Sha512": "9b02c49613fc09ec8ae9138d6345fa589739c86d7d71044a002080dcc5450583b39b3d4d814924f654474398e23ff459af51f850890fabc109a3106d577732a1" -} \ No newline at end of file diff --git a/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/zoe-full-upgrade/Zoe-upgrade-bundle.json b/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/zoe-full-upgrade/Zoe-upgrade-bundle.json deleted file mode 100644 index 9ab90995814c..000000000000 --- a/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/zoe-full-upgrade/Zoe-upgrade-bundle.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "moduleFormat": "endoZipBase64", - "endoZipBase64": "UEsDBAoAAAAAAAAAAAB7fTG6FFwBABRcAQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdEZhY2V0L3ZhdFJvb3QuanMiCiAgfSwKICAiY29tcGFydG1lbnRzIjogewogICAgIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9hc3NlcnQiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYXNzZXJ0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3NlcnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhYTY0NzU5M2U5ZmNkYzc1MTA5MjEwZTI2NmI4ZTdhOWMwZTk5ZDAxMzZmNzNiOTkyYTE1YzQ2YTllODdkMDFjOWNkNmYwYTJmOGFlNWE4MGM0YmJiNWViMGNhZjM1ZjQyYzA0MjhlOWNjZjIyOTg1M2QzNWMwZTk0ZTJiMzIzNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MTIxZDE1ZGNiMTBmODVmNzdiNDBkNDhlZTg3ZDVkNWQ3NmY5ZDQ5MDJlMGU4YzdkODhjMzE3YzBiMmZlM2EyYjBkZWVmZmE3ODc2Mjk0MTE4ZmRmNjUxYWU0ZmFjODczOTE3NTY5MTcyN2RjNzQ5MjM0YzE0NDUyODVhODQ1YSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvZXJ0cCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zdWJzY3JpYmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudE1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudE1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMjVkYTYwMDk1YmNhYjJhOGY2ZjM1ZTQ0ZThjYTNmMmYxZGUzYmRkYmQ0MmFiYTBkODJmNTg4MDA0NjM4ZGZhYTZiMjQxNzk1ZjU5ZjBjZjYxNDlkYzIyYWZjOGIyY2U1N2Y1NjYwMjgwNzY2N2I0ODc5YzJjN2E0ZjU1YjYyYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kaXNwbGF5SW5mby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGlzcGxheUluZm8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4N2ZkMzZhNjQyOTFkYmMzYjJiZDk0OTMzMGQ4Mzk3OTYzNGM2MTVjOGI5MGRlYTRlZDYzZmM0ZWZiNzZmMjYyOGI3ZTcyNzc4YWEzZTc0NzE0NTQxODlhODMzNWJlMmZiMmYyNGQxOTgxZDU0MDdjMWM1MjhlYWJjNmFiZjAyZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzM2E4MTQzNzhmNDFlMWI4ZTZiYzU2N2QzYmZkNGI0YTc4ZTg3ZTQ3YmE3ZjUxOWU5NTgwMjFlYTdmMGExMmFlOWFjOWY3NjZiNDcwNTI4ZDQ5ODhhNzY4ODE4ZjBiYWIxYTE0YWMwMTUxOTBkNTQzMWM4ZTU1YzFmMzNjNWNjZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlcktpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNlODkyYmYyYTUzOGYyZDVmYjVkMmYwYTJhNjY5Zjk0ZmFmMTZmZWU2N2I0ZGQwYWUxYzIyM2M5ZmM3NmU5YmYxNmZlNzc2OTg3NmVkNjI5YmQxZWFiZDRkZDIyYmJkN2E3YzhmNDg1NWM3NzIyYTNkNTRmOWY3MzE4NzZkYmZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZThiZThkYzM2MTRkYmUzNTdhMzhhZWYzZTg3NWExY2Y0NzMxNDhlNDliMzcxOGY4MGQ4Njc1Y2YzZjdhZjdkMDcyMzlhMWE3MDg0ZGU2YTdkNjY0MTIzYzYxYjk2MjU4OTZkMzM3OTE0MTRhYjRkMDUwYjZkNzZlMGU4MWIzNzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMTEzNjFjODgzY2RiODAyYzllMTk0YmNhYTE1YjU1ZWNiOTQ3ZjQ1YWQyMjQwNGYzYzk5Y2NjYzQ2ZmRjMDA2ZGI4YjZkMTZmOWY4OTNkYmZmYTNhMjM4ZGQwOGMwOTJiOTliODhkMDMzNWRlYjVkMWE0NGU3ZDdkNTI0ZDk2ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlOTJlNjA3MTNlODU1ZDYwNDQxZjhhNDg3YTE1ODlmN2NlOTk1Yjc5MmQ5Yjk3NDcxZTBjMTlmNGU2MmZhNjUyMjI5OTRkMGMxOTJhOThmOTgyZDQ0MGQwNjkzMzM4MmZjNGM0N2E2MTRkZDUzYzcyNTRhNGE2MTdkODY5YmYzMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NjQ4YmQ0NmRmOTljZDgwYTBmMDEyMWZkZDQ4YmI4N2VkOTYyNjkzNjA4ZmIxYTNhNGE2YzA5NGI1NzI5YTBkOTZmNDBmMGYyMWJkNzQ2MTZlOTJhNDFmYzdjYzVlMTE1ZTI3MWRiMWRmNzdhNjRiNGNhMjUxYjI0OWI1ZDFkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmZkN2Y5OWI4YmVjYTY5MzJmN2MzN2I2YTU0MjhmMTU3ZDE0YjM2NzNmNWIxODk1M2NkYjM4NTc5YThjZDQ2MTE5OTc1OTdkYjIzM2EzYzBkYTRiMDJhZTJhYTAyYjQ3YmU5MzM3ZDNmM2JjOTIyODRhYTZkZWU4ZjYxNjk1YjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudExlZGdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudExlZGdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI5MmM0YjUzNjY5MDlhZTFhMmVmMjk4MWI2ZmIwMzkyNzcyMGRiYmQxYTMyZTEwMzdhMGJjZmVhNDliMzA5Mjg1MTExZjEwZGIxMjAxYjA4ZmQzYWI3NWY5MDM0ZDg5OWM4ZmFjYWRjMDdmMGY1YTQ3NjZkYmUxMzgxNDBmYmExIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1cnNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdXJzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkN2RkYTZhODQxODBjNjhlNmQwOTcyYTY4ZGM4ZGViYjUxNWI5MmNlODBjMjE4ODE2ZTUzMWYyNGRhNjQ4ZjU1NWY2ZjZjMmRiYjgyMDBlOTQzNTlhZDYxYzA0NjAyNjlhNGQ0YzA2NWE5MDVkYTk0ZTA1N2QzYWY1NjI1ZTIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFuc2llbnROb3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImExMWIyYTZmMjlhZDQ5NmJiYWQwYzU5ODgyZGRjNDkwZjNlYmVjOTYwNmI1MWUwYjcwYmU1NTg1MTEyZDMyZTQ5ZWRhYjhlYzdhYTU3ZmYyYmQ3ZTQ2M2Y1ODdmZTY0YzA2YWM4ZDVjODYxMDIxZGI3NWRjMDM4YzNlNDRlNTU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlOGU2YjIwNWM5OTBkMjcwM2U2YTE4NGMxYTNkZjAxZThmNGVlYTk5MjdiZWIxMjAyMWFiNmQwZTE4MzUwODc1NTk2ZjU4MjhiNDBlMzc0YjUxZjVjZjdlZTYyNTkxZGJkMjVjMWI0NjliN2Q1OGM5MTE1ODg4YTNlYTVjZDQwMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTAyMWY1NGI5YWZjMDI1Y2EwZTkwZDJkYzJlMGJlZDJmYjA4YjA2M2M2ZDY4YTQ0YjFlYzJlYjc4MzkwNzY5NmMyZTRiM2NkODA1NjA1MWRjMTMxOGQ2YjQ1YWM1NzMxMmFmN2YzZjlkODQ0MmIyYmVmNDAyNzZhY2Y2MjQ0YzEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVybmFsIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvdmlydHVhbC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi92aXJ0dWFsLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0cmVhbSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgImFueWxvZ2dlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhbnlsb2dnZXItdjAuMjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYW55bG9nZ2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFpbi5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jYWxsYmFjay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2FsbGJhY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MGZjMDkyMDc3ZWI5ZDE0Y2FmNWZkNDUzMWI4MDQ0NzI3YmRhYTY1NTRjNGQyZmNhOGY3NmY5YjJkYmEyZGQ0YmEzOTA5YzUxNzM5ZjQwZmI5MDI5ODlmZGNhMGI1ZGU2NTJkOTZiZDJmOGI3N2NlNTA1OGE4ZDAyNWI4ZWM4YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb25maWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbmZpZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhhMzE4ZTEzNzliZTdhODg3MmRkOGRhOWU3ZmFhMGQ3OTIwNWI1Yzg5OWM1NDEwZmI5MGE0YmM4OTViNzU4NTVjYzcyYTdhOWZkZTM1ZGEwYTA3NWQwNmNhNzdhNWYwMGRjOGI2YmI0MDA5Y2UzZjE5NDNkOWJkY2NjYmJjZDUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlYnVnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWJ1Zy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUwMDFlYWNhNGIzYjI0NDc5NmFmNzFhZDQ5OTFlYjA5ZjkwMGRhOGFkNDY4MDRjMjJiMDgxYTg2MTk0ZTQ2MWIxNTEyNDU1ZWYyM2E1ZmFiMTJlMzdmZDYzOWY1MDdmMTkyNTZiOGNlMTA1M2ZkY2Q4NzA5ZTIyYWZmNjNhYWYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdhMTJlM2I4NzlmYjM5NDU0MzhkODI3MTNhOTViZDc3MTI5NzQ4ZDcwZjk2MWQxNWVlZGNiMmE0YzQ1OGZjZmJiYjljNzA5ZTUwMWNlNzdlYjMzNTJiNmM4N2IzYmNjNzFiMDY1YWViZWU3MDIxYjg2NDY0MTQ0ZjY4MTE0YmVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MDFiZmVlMGVhOGNjN2ZiYzE3OTQzZmI3ODMxZGUyYWNjZjY0Zjg4OTRlMjZkOWE0ZDU5Y2Q4ZGMyY2JiOTE1OGYyYTczYTU1NTJiNjQ1ZDFiYWZjMmJlZjUzNTJmMWM1MmE0YzMxZmJlMzFhYjJkNzcwNDlkMzZlZmM2MTRiZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXRob2QtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldGhvZC10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjViMGVmZjM5YzkzNzAwMWU5MDlhN2I2YWE1ZmE2OWY3MWM2Y2ZmOGQyODRlNjQyMDQzNjczNWY0OTk1NTNmZTdmMTYzZDFlN2RlNjM2MTM4YjZlNjA3MmNmMzVmNWYwNzBlZmRkNmIxZGVjMjRjMTIxOGU1OTFjODRhZmMxZWI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMDQ3YjBkOTVmNTllZTNiNmYxMDQxNzhjZjczZmNiNmNjN2I1MmJjNTMxMjFhMTg4MzE1NWQxNGZjYzM2N2M1MDVhOTZiODI4M2M3ZmJhMTcwMmRjM2YyY2YzYjNlNzhjNjUyNTAyZDc5YWUzZjQ2NTY4NmMyYzkyOGJlZWQ2MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy91cGdyYWRlLWFwaS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdXBncmFkZS1hcGkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMDFlYjMzZDcyNGUxN2YwYTBiYjRmNzdhZjE3MzMyYWU1ZTZiOWM4YWVmODg3MmUyYTNkZjFhYmVlZDIwNTg0ODIyMTkyZTE2ZDljNDdiZDA4ZjdmZGMyZDE1NTA3NmRjMzVhYzA0ODMwNjA5MTRmZTZhMDgwMmFhYzRlZDRjMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy91dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YjExNGJiZTNhNDliMzlkOGY1ZDQ2ZmI2MDU1ZTM5YzFhZDAxMjk4Yjc0ZGI4NGMzOWZkMTkwMGVjYzQ5NWU5NTY4YjBhNDkwODY4NDYwNWFiMGZkOWY4MmI5NDdlN2YzMTQxYTg2OTk1YjQ2ZTZlMjlmYjM1MDg4MDI0NDFiYiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvbm90aWZpZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgwOWNiZWVjYjJiZGExN2Q1ZjVkZTVkNzg0NmIwMmU1YTIzZDdmNTRiOTAzZDQ4YTEwNGViMjYzZmNmMzUyOTlhY2VhNGEzZWIxZDU3Yzc1MGJkM2Y0ZmZhZjkyYmE5MjA3MGM1ZmJhNTI2ZmJkNDExNWIwYTk5ZDVkMGRlYTQ4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1Y2NhNGNjNjQ1Y2VlMTRlMTJhNDVmNjg4YTI3NTBmMjNjMmI4MTE0MDliZTdmMzY5ZmYwN2YxN2I5ZGEwMjM2NGE4ZTczZTBjMThhZDM0MzFjN2UwYzFhZTA5Zjk5ZGM4NDdkYjMyNWFmYmEwNjJiNjVlYTZlZGEwMjJhZTI1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZmNTY2YzZmMjAwN2YzZjc5MTMyNjE2MWNiZDIwNDE5NmI0NTkxZWVmMDk1Mjk2NDJhZjg0ZGYwYTNkYmQ3ZjczYzBmZDRlYjE2NmZhNGI3ZDk2NDRmN2VmMWQ2NzhmNzljZTkyN2VmNDU2Y2E3MDExNTdmMmExNTIyNjczYzMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQwM2U0NzUzZjU0ZTBjYjEyZTc5ZDNhZmRjMzVmOTBlNTg0YmRjMTlkYjk0NmU1ZTI4Nzg0ZGEwOGRjYWE2NmFlZGUzMDkzMDgzOWZmNjkwZDRiMDM2MWU2OGQ2MzY4Nzc5MjEzYTkzNjhmMDljYWUzMjBiNDFlMjFiMDg5MGI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC1ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLW5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTUxYzVlYWJjZTE3YjM3YTc0OGExYTUwMjA4NmFlYTBkNWE0MGY0M2FkODExYzM3YjczMGQwMDRjMDZjMDdhMzFhYzdkNTg3Yzk5NmI3Nzk1YjY2MjdlMTM5NDU2YjNlMGQ2YWMyYjUwMzc1NDQwOTM4NmIzNmMxNjliNTM0YzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGY0NmY4MWE2NDcwYjdlMWFhOWYyMmNmZWIyNzRjM2Q2ZDg3ZmNmNDkzMzE4ZTYwZGQxNDQ0YmNiYzVmZmYzYjhmMjhiOGI2NGU4ODZlM2VjZmEwNDQ3MzRiYTg0NWUwNDI1OTJiMmRlOGQwMTk5NmFkMGU4YTBiYWM5OWMwOGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYmMxMmJkZTYyYTQwZWU5ZTQ3OThlMDg4Mzc1MmY5YWI1YmQxYjg2ZGM3ZWIyOTFjZTI0NGUxYzZiNzgwYzgyMzA5Yzc1MjE2NzNhOGQyOGQzZjY1N2VlNzgyYWFmMmYwNjM5MTk5ZDYyMWRjN2U1ZGFhNGJmYjlkYzIxZDE5MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTYxOGZjNmY1ZTcxZTVlMWI3ZjA2NDUxOWU4YzVlNzk2NTBjNmRkZjU2MjkyN2EyNmEyZWY3NDVmNTRhNTYxZTczMzdhNTM2OTA2YzQwMWZmMjZhMjI2ZGJlMDA0NmFiM2Q2YTdmNjJkNjkzNTg4NTY1NDdiMWM3NWZjM2E0MmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdG9waWMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RvcGljLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTdhMGUwNGE0YWVmMzIyNTZkMjE4Yjg0YjI1MmRmODIxZDAyNWI5MGJhMWUzNzQ1NTdlNjM1OWJlYzBlMzIxNTAzODAzOGFmOWZkZjA2MTAxMTBiNzU4ODllODE0ZjdmYzBlNWMwODJkNTc4ZjQyNDMzMWUyNDYxZmU2Zjc3NDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtYW1iaWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZlMTdiOWRiNjczYzRhMTNmM2U3ZWY5YTBjYmNlZjE3OTI3ZjE2ZTE5M2M0MzgwOWM4YzZiYmFmNGI1NWU2ZDkwMTYwZDMyMmZjNzU5ZTk2NTA0NDVlOTM3NzIzYjE0ZWFkYTI5ZGI2MTczZDJiZGQ1YWZiOWEzNWMzOWY0NjNlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3N0b3JlLXYwLjkuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9zdG9yZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4byI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8vcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8vdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImV4cG9ydGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWFhNDYwYmJhNzY0NDQzZDVjYWZiMzNmNTIyNzkzYmJlMjllOGQyNGYyYzVlNzdjN2I2YTFlYzA0MTUwYWY4MDBjN2JmMWMwNWZlNTA0NTBkZmQyOThjY2Q5MmE3OTg2MDFiMWI0OGEyZmM0NGE5ZjliZGJiNjhlMDkwY2VhMjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTNjMjcwZTQxOTBhYjAxZGUxOGQ5NjQ4ZmMzZGE3OTNhNGM4OGNhZDY1YzJiZjJkNzU3YTJjMTM4MmMyZmQ2MGY5MDc1MDExMDI0YjQ3NjRiOGY4YTEzOWI4MWI0YmMxYzZlOTc3ZTE4ZmVjMzUzMzExYjQ3NmIzYWQ0NjgwNjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdhNjRmYWI5YWRhYTU1MTgxODhiODNiNmU0YmUyMTBiY2Q5NTcwYjg4MWU3YWFiZDY3OWNiOTdkYWY3N2FjOGY5MzcwYTQxNDAxODgwZDhlOTIzMDgzZGRkYTMwYjc1YmZjNDQzZjZkMTEwOTQ2YTViNzE5MmQ0MTA2NzU3NDQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFjYzliYjZmYWYyYzI4YzEyNjQ3OWQ0NzFkNTA3ZTg2ZTBhMjBmNzg5YjBjZjkzNWMyZjM0NGJkZDdlMTgwMDdmOWJjYzYzNWI3ZTEyMzI0NWNjYWE0ZTVkY2QzOWFkMmYyMDIwZmM2NDQ5YjNiYTNlOWRkMGRkMWNhZTlmYmYxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTE4ZDAyYjRlY2ZkYTkzMTE3Y2U5YWUzZjU3Y2FhNzdlYjJiYWZlM2E3M2ZkMGY2ODEyZjZlYWQyZjI1OGRlN2RmNTAzMDgxOWU3OTgxNzllMGM1Y2ZiZDAxY2IxMDQ5MTcyMWY5NTFhN2UyYWVmMDNiNmZiMmE4ODMzOGY5N2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2Mzk5YWFmNjY1NTk4ZDRhZmRjN2NhYTllNTY0YmVhODNhYzM4MWYzOTA1NzA3OGIzZGE2YTEyZmZlYWUxZDU1MWNmN2MyY2ZhMTFjMzY5YjcxYzc2OGNhOTdmZTA2OTg0NmNlMThiOWI3MTg3NmQ3ZjA1YzBiYTc1MDE3ZWFjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjYyMDZlZjY2YWI1MzgwYjc5YzI3Zjk5MWVjZWQ5NWM1MmYzY2FkOTZmODgyMWY5YjA0ZWQyNGY4Y2JkNzdmZDA3NzI1YzMwOGU5ZTI3MWJhMWY0ZDFiNTc0MTA4YjdlMTY2OGMwMjQwMzNhZGRhZWY1YzUwNzUzMDI4NGUyNWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYwYTM3MzI0ZmRhYzAwNWE0NmMzZDI4ZDMzNDA1ZjVjNmY4M2RmN2UwNTU2ZjBkYjNjODNkYjlmMjEzYjlkZjIyMmE5YzZhYmY1ZGE5N2VjMmUzODM0NGQzZjdmZTgwMzk0YjE4ZDBlYWI5NDEyOGE5NGRjYjM3OWNmNDdkODVhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGZlMTZhNmQ4MTI4YjUwYTI4YjM5Y2RmOTZhODdkMWIyMTJhNmJiZjA2Zjc1MjAyZjY4ZDVlNWE4YzA5MmIwYTJmZjVmYzRjZjg2MjM5ZDE0NGRlMTQ0NDVkZmU5ZThkNTYwNjhkOWNkNmRlNTBjNWQ3N2IzMWU0OTk1N2QzYzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTA4MWQ4NDQ2OTg0MmE1NjcyOWE1NWVlYjU0MTJjN2YyZmZjNWNiNjJlMzdmMGQzMzVjNTEzNmVhOGQ3OWI4Nzk4MjYwMDBkYTRlYmMwYmNmN2I3YjUzN2E3NzQ4MmExZTUwNDlmMDU1N2U0NjQxMDhjZmQ3NTMxYWE2YTQ0NDMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzIuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nLXN0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmctc3RvcmUtdjAuOS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvc3dpbmdTdG9yZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cy12MC4xMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQteHNuYXAtc3VwZXJ2aXNvciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXhzbmFwLXN1cGVydmlzb3ItdjAuMTAuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQteHNuYXAtc3VwZXJ2aXNvci9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC14c25hcC1zdXBlcnZpc29yLXYwLjEwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMveHNuYXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy94c25hcC12MC4xNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy94c25hcC1sb2NrZG93biI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3hzbmFwLWxvY2tkb3duLXYwLjE0LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9hdG9iLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hdG9iLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9idG9hLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idG9hLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9kZWNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZW5jb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbmNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2NhY2hlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9jYWNoZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NhcHRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NhcHRwLXYzLjEuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NoZWNrLWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jaGVjay1idW5kbGUtdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2hlY2stYnVuZGxlL2xpdGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2hlY2stYnVuZGxlLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpdGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2hlY2stYnVuZGxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jaGVjay1idW5kbGUtdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlYnVnLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvbGVnYWN5LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGVnYWN5LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcHJlLWJ1bmRsZS1zb3VyY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUtYnVuZGxlLXNvdXJjZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS1yZW1vdGluZy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS1yZW1vdGluZy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3Vuc2FmZS1mYXN0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdW5zYWZlLWZhc3QuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Nlcy1hdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc2VzLWF2YS12MC4yLjQwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zZXMtYXZhL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Nlcy1hdmEtdjAuMi40MCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc2VzLWF2YS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc2VzLWF2YS12MC4yLjQwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcmVhZGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC93cml0ZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3dyaXRlci5qcyIKICAgICAgICB9LAogICAgICAgICJhbnNpLXN0eWxlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhbnNpLXN0eWxlcy12Ni4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgImFueWxvZ2dlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhbnlsb2dnZXItdjAuMjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYW55bG9nZ2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgImF2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhdmEtdjUuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbnRyeXBvaW50cy9tYWluLm1qcyIKICAgICAgICB9LAogICAgICAgICJhdmEvZXNsaW50LXBsdWdpbi1oZWxwZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYXZhLXY1LjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW50cnlwb2ludHMvZXNsaW50LXBsdWdpbi1oZWxwZXIuY2pzIgogICAgICAgIH0sCiAgICAgICAgImF2YS9wbHVnaW4iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYXZhLXY1LjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW50cnlwb2ludHMvcGx1Z2luLm1qcyIKICAgICAgICB9LAogICAgICAgICJiZXR0ZXItc3FsaXRlMyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJiZXR0ZXItc3FsaXRlMy12OC4yLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpYi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJpbXBvcnQtbWV0YS1yZXNvbHZlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImltcG9ydC1tZXRhLXJlc29sdmUtdjIuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJtaWNyb3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAibWljcm90aW1lLXYzLjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXgiCiAgICAgICAgfSwKICAgICAgICAic2VtdmVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlbXZlci12Ni4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NlbXZlci5qcyIKICAgICAgICB9LAogICAgICAgICJ0bXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAidG1wLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGliL3RtcC5qcyIKICAgICAgICB9LAogICAgICAgICJ5YXJncy1wYXJzZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAieWFyZ3MtcGFyc2VyLXYyMS4xLjEtbjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J1aWxkL2xpYi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJ5YXJncy1wYXJzZXIvYnJvd3NlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJ5YXJncy1wYXJzZXItdjIxLjEuMS1uMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnJvd3Nlci5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTY0NGNjNzNkNTgyNjUxNTM5ZTJlNzEwNjAyNzg5NzBlMDQ0NTEyOWM0MDZhZTRhMjcyNWQ4ODdiNGFkM2RhNTIwNGI3NzkyYWY3MzgyNzA1MzJhMTU3OGQ1NTYwYWFjYTBhZDYzNDUzMTVhMjU3OTFmYTA1OTM5ODFjMmJlZTEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdGltZS12MC4zLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdGltZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NWRmZDRlYWI3MmE2YzhhODdlYjc4NjNlN2QxNmZkYTEwNzhkMDg4ZTQ4ZWQ1NTJiYmU3Y2FiYzVjZWQ5OGM5NjViODIwZGY0Nzg3Mjg1OTc0NWFmNzM0ODRkMWQ4YjIxNTM1YzZmZjFmYzRiNWU3NTRlNjYxMGQzZDFmMzc0NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90aW1lTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGltZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YjIxYzhmOTkzYTg5N2Y0NzllODgyZTM1NDA4MDRiOThlOTEyZDM2OWE4NjdjYzkwNDczNjc4MDkyNzFkYzE3OTEyYzFhOGQ3NjY0YjFhOTgzNjM3MGM2N2U3YmZhNGE1OWVmNGFmMDE5NjdmNTMwNDNlOTQ1ZGE1OWQ5YTFkMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjcyMjQxNzNiNmQ1MWZkMjllOThkM2VlZmNjYjk0MDUyNDcxMzU4N2FiODg0MjUyOThhOTJhMGM0YjFhZjcwNWViYTRmYTE5MjlhM2M3ZjBiMTRkOGY2YzNhMTM4N2U4N2YyNjJlZjI5OTM2ODk5OTYxZDM1ODY0NWYxZDhmYTgiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdC1kYXRhIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0M2MyOWEzODUxOGI2MDQ2MTVlMTJlZjRhZDY1MDNlOGJlNDQ1NDI0YWFkZmUzOTIxMGIyYWZhYTc2YWE4YWI2Y2NmZjI3ZTc3OTY1YWVkYjA1OWQ4MjU4MDRhNTA3NzUyNzY4YmVhOWJlYTA5NWU3M2E5OTI5YjAwNGU0NDQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQwN2M1M2NlYTJkZTcxNWUxOTZjNmJmYzczMzNlYWZlOGRhZTdmOGI3MmY2NzUzNTIzMzkxZWM4ZDU3Njc2MzI1OTYxMDY5NjUxYzM3M2MzNjRlMjYzY2ZmMmIxNTAyNDBmMDNmZDIwZDZkMDM4ZDY3NWU4ZmFkZjliZGFmZWI3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM2ZTFjOGVhOGNhYWRmZTkwNDQzZGQ1ZjNlMGM3M2UyZmRjYzg5MTQ0ODBkOTEyYTNmZTFlYzliZGY2MGFiYzY0YzYzNGZhYWY4ZjMzZTBkYTc5Nzc2ZWUxM2U5MzNkZDlmYTk0ZjM3NWNkZGUwYWQ3OTlhNWY4MGJjZjIzZDhmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvem9lU2VydmljZS96b2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvY2FjaGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2NhY2hlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2FwdHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2FwdHAtdjMuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAieWFyZ3MtcGFyc2VyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInlhcmdzLXBhcnNlci12MjEuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idWlsZC9saWIvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAieWFyZ3MtcGFyc2VyL2Jyb3dzZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAieWFyZ3MtcGFyc2VyLXYyMS4xLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Jyb3dzZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2xlYW5Qcm9wb3NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2xlYW5Qcm9wb3NhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFmMzk1NjZjZGEzM2ZmNTJiZjkwNWJkMDIxNzU3MzQyMjI2MjdhMTMyOTkzMmI4MjgyYmNiZjBmYWI3NmZhODBlMjM1OGIxNTYwMmEwY2NjODlkZWYxOGU2ODM1MjgwNTcyMjYyOGVmZWQ4MGVhNjg1MTAwYWI0M2Q1MzBjOGQ1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0RmFjZXQvYWxsb2NhdGlvbk1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0RmFjZXQvYWxsb2NhdGlvbk1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZTQ1YjJiNjkxZDBlYmNlNGY1YjdmNmY4MWE4MTdkOTMyOTY5N2QzODdmMGRkNDVmMDZiNjcxZTA2OWQ0ODdhZDI5YTFjZDUzN2FmMWJiZWVmYzNhODIxMGFhNTk5NjkxMmQzYzE5MGNiZmE5YWZmNDQxM2Q4MjdmNzNjMjg1ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEZhY2V0L2V2YWxDb250cmFjdENvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0RmFjZXQvZXZhbENvbnRyYWN0Q29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI5OWZkNTRkZjQyYTJlZWVkZTE5ZTNjZDMwZDJlNTNlYzRiZGExMjU0MzczODQwODg3ZjQ1NGY5OGNmNzU2Zjk0N2Q4MzExMjdiOTRjYjNmYzdjMmFiZWRhYjMwZmIxNmViMjBmZTRlYmVmNTNkNmFkNGQxZjc5NzcwMzcwNjU2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0RmFjZXQvZXhpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC9leGl0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzVjZDA4MzIyMjVhOTM4Njc3OWI4MDRkODJiMTUxMGJiMDg0ZGRhYzRhZDM5MmMwYTBhMmYzZTMzMWQwOWUzZmI4OWVlMDZkZWY5Njc5YzM0NDgyZWIwZWE4ODQ2Njc1Y2I2YmU1NjgxMjA1MDk1ODg3MDQ5MTBkYjNkMWMxZGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RGYWNldC9pbnRlcm5hbC10eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC9pbnRlcm5hbC10eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiN2M5MDVlNmM4OTM1Yzg3ZmFlNjllODA4ZjFlZmZiOGU0YTMwMTRiYjU5ZjliYjZjMDhkNGI3N2RkNWQwYTAwYWZmYmVlNTczNDExYWQ2ZWY2YzVhOTg1ZDQxZjE3NDY5MDMwZWQ3NzI0NjE2MjFiNjJiMWU3YWI3ZGJjMmU4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJIYW5kbGVyU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC9vZmZlckhhbmRsZXJTdG9yYWdlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGIxMTRkY2IxM2ZlOGY2ZmVkN2Q2YWVmOGFkNzBlMmFmOTJjMjgxYjk0OWJlMjNkMjgyNDRkNWZlM2E4MzhiYjQwNDBhYWM1YjBhNTI2NmQwY2JmODJiNGRmNzBhMDBmY2Y2NzM5Y2YzYTNlYzMyNWJiNTVlMjVmMGQ3Njc0MzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUyYTJmZWU0NjY3Njc1NzUzYWI4NmZiODZlZWU3NzdhY2EyNzRlMDA3MzFkZWJmMjdmNjdmNjM3ODA1ZWY2NTYxNjllMDYyZDliZjE5ODBlZDEyZGM3YzgyNWI5Y2E4NmM2MmU4Y2M5MmViNDJkNzVhYzE5MDkzZjhlMmE1M2U0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0RmFjZXQvcmVhbGxvY2F0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC9yZWFsbG9jYXRlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2EzZTZkMDNmNDhmNDc3ZDFmNzJkNzIzY2UzYmVmYzUxNDRiM2Q1YWRmYjEwYzZhNzZlZjZlZWJkMjU2Mjc3ODE1YmQzZjliNTIzMzJmODUwOTk4ZWUyN2E3MDllOGZlM2M4M2I4MmM4OThkNTY1Y2IwZDEyMzg1MzMwYmExMGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RGYWNldC9yaWdodHNDb25zZXJ2YXRpb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0RmFjZXQvcmlnaHRzQ29uc2VydmF0aW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjZmYTNkMGM2OGRlN2I2YjZmMDU1YmUyY2JlZWY5ZWEzYzQyMWVmMzI5NTJjNGZmYmRhMzE0OGRjNWIxZDU5MTdlYWNkMDk3NjBhZjBkOTdlYjUwOTgwNjMwOTVkMGY3ZjgwOTExY2EwYjYwY2EwMjA5ZjYwMGJlNjAyYTA3NzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RGYWNldC90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjczOGMxZDY2NzM1ZjE2NzRmMDY4MTM0NTYyOGUwZjNiNjU1ZjkwNjc3NzFlMGI0NjRmMjRmZDdiZDk4NDBjYzU2YzYwYjQxMTY3N2VmZTM4OTM0NWEyZTUyYzUzMzRmMTM5YTU3MGFkZTIyYWQ2YzY5ZjI3NTdlMGI5YjFiNGYxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0RmFjZXQvdmF0Um9vdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC92YXRSb290LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmQ4ZTJhZjkxZDk0NWYzZGFmNmE0NDZjZjNhZTkyNGRkOWI2OTc4ZDdmMDBhZDU1MzVlM2I0ZWU3ODQwYmI5YzFkNzUyNWMxOTFiNDAwOTliNzZiNDdlYTg1MTQxMmI4OTZhOGU1MGE1YTE0YWI1ZGQzNzQ2MDc3N2MwZTNiNGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RGYWNldC96Y2ZNaW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEZhY2V0L3pjZk1pbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwNjJlZjJmMDBjYjk0NWE4MDEyNjNkZmZmMTczZTRkZmEzZTNhYmRkOTMzOTE4ZGI4NWU1Y2MxYWZhNzY2Njc3YmE5ZTg4OWU2NmY3MjI0YzAwZmI0ZjU1NGYyODk3YWYyODRiODJiOTQ4Y2UxMjFmMjUzYjc4MGM0MjE2YTcxZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEZhY2V0L3pjZlNlYXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0RmFjZXQvemNmU2VhdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI5NWZjMTA3ODY1NGQ3YzM5MzU3MjQzNDFiZDc5YTljOGQxNGI1MGFjNzljMGVjYTM1ZDBhYzY1M2JkM2JiMTRlZmUwOTkxNTJlYmZjNmM3YzczOWZmNDIyZTc5ZjNmNmI2MWY2NzIwOGFkOGRmNzdiZTA0NGYzNWM3YTEzZjlkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0RmFjZXQvemNmWnlnb3RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEZhY2V0L3pjZlp5Z290ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVlNTllZDMzNTkxNzBkNzA4ZGY3NWJmMWZhMTIwZjZhMGMzZmZlMDg4NmRhN2IxYTE2MWE5ZjlhYjY5NWZhMjI0MDI0MDc5ODJhYmIzOTlhZTAyYTY5MDdiYWJlMWFhZDUwOGMyNDkwNWNiY2I2NzUzYzMzMTNlNTU4MGVlOWE3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWU5NGMyYzFiZTVmNDI3ZWUwMDFjNmZlYTE2Y2ZmMDVkNmFhMjE0MDg5OTE1ODQ5OTY2OTVlZjZiODA0ODI0N2FkZGYyZDVlZjk0NDI0N2I5ZTA1YmIzYTk2YWI5MjY5Mjc1MmM4YWNhYTI1Y2Y5ZmMzOWM0MDU0YTg5MGNmZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGFuZGxlV2FybmluZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGFuZGxlV2FybmluZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFkOTJlM2MyOGJmYjYxMTdkYjU5YTE0YTIxOTdkN2FjMWIzNjNiNzY1MzJkZGYyZmQ2YjRiNDk1OWZkNjRiOTM4MWQ3M2Y5MWRmY2U2ZTQ2Mjg3NmFiOTcwZjZkYzAwNzNhY2YzNTdhNzgxNDc5ODNmNTAxYzA4N2Y4MTUyYjZhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luc3RhbmNlUmVjb3JkU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5zdGFuY2VSZWNvcmRTdG9yYWdlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWRjNTk1NzMyODIyMDI4Zjg3MzQ4MTRjM2IxZWM2MmJmMzQ2ZDBkNWI4MzkzODI5NTRjNjVjNjEyNDQ4ODI3NDMxZGQwMzc1MTQwYzBmYzlmODIwYjgxMmY4Nzg2YjY4ZWE4NzBlNTJlYWRlMzcwOTZhZmRlYTEzYmNhNGRkZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW50ZXJuYWwtdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ludGVybmFsLXR5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2UxZGMxMzM1YTkyYTcxMmRjOGEyZjRmOTcwYTU1OTEyOGQ4MmRhZTA1NmJmOTg0YTJiMzE1Y2U4YmI0ZjY1MGU4MDYwY2VjOGNiOWQzYWIzYWVjYzBjYTNhN2NjYWIxMWZhYmQxZjAyNjVmMzY2ODlmOWNkNDVmNzdlNjA2NjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXNzdWVyUmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pc3N1ZXJSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NDZlNjMzM2ZjMGRjZGVhZjQ5NjQyMWFkNzE3Y2E3NmVkOTJhNGMwOTFlMzBiYzQyNjJhMmMxY2Q2MDE4NTdkODBlYmIyODc0YjVjMjA5OGQ5MDRmYWVlOTJjNDhiY2ZmNDIyYzVlMDQwZGNmZDQwZjZmZjhjYTVmMWUyOTg0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJTdG9yYWdlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pc3N1ZXJTdG9yYWdlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2ZiODk0MzE2OTBkYjJiMjc5N2IzZjA2MGViN2UyNjlmZGYyNDRhMWMzMDE5ZTA3MDEzYTViMTg2Njg2MDdmNjZkNzEwNzI3OTgzZTJkZTY2OWU1OTdjYTg0OGZmZjU4ODY1NjcwNjI3MWU3M2EzY2UzZmRhZjU0M2Q5M2FiY2EiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZUhhbmRsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZUhhbmRsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ0ZGUzOTUzMzA0MDExOTAxZDkwNTEzMjAwYjk4NjBmZDVmNTJhOWM2OWQxZjQyMTA4NTM1ZTgwNWQxNzFhMDE2MTIxZmZjYmE0ODk5OTEyZDk5YmU4ZmQyMjdiMmUwMmRmY2FiMTRmZmRjYTI4YjJkYmMzODU5YjI3MGFkYTVlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL29iakFycmF5Q29udmVyc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvb2JqQXJyYXlDb252ZXJzaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGNmOTg0YzlhYWJhNGI2ZWM2MDRhNzZjNDAxZjBkODFiM2U1NWUxYjRjMTY5MjQxOWZkOWI5ZTA4NzQzNmY2ZDZlN2I5YjM4YTg4ZGI2MzlmYmU3ZTFhMWJmNTYyNjYzNzlkZWU0NzE1MWVmMzBlYjZjYWIwNGM5ZjU5OTZlNTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ5Y2JmNjRmMWYwOWVlZTgyMjU2NjBiNzgzMzc2N2U4NzU5NmRkYjIxMWRkMTdiOWZlOTJkN2FhMGY3MGEzMmZlNDRjYjg5YzcyYTNmYzU5MGEzMWFhYjRiNzI2ZTZiNGJhNjU2YzFiN2QyMzVmNDJmY2U5MDkwMDcyODBhYTU3IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvbmUtdjAuMi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvbmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kdXJhYmxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9oZWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2hlYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL3ZpcnR1YWwuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdmlydHVhbC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGJlMDAxYmQ2Y2QyNjM1ZTZhZmZlNTdjNGI5NzMwNTg1MjhlMzNkNWY5YzBjZmIyNWFiNDM4NDM0Njg2MDQ0NzkzNzdmMzZmMmRhNmQxNjQ3OWNiMTdkM2YxYzI3ODkwY2RlYzE1MzRmNWFlYTk3MjcyZTljMmNhOTcxYWQyMDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTZmY2EwNmVhZjlhNDI2NDk0OGFjNDIzYmEwZmFmOThhY2JmNTQ1NDAyMjczNzk2MzQ4ZGQ0N2UzYzAyZGM0MDU3NjVlYmEwNzUxOTI3NWY4OTQ2NTkxMTNiZmExOGUwMzliMDE0M2U3ZjQ1YmUzOTIyNDEyMTgyZThmMzk4NWIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Jhc2U2NC12MC4yLjMxIjogewogICAgICAibmFtZSI6ICJAZW5kby9iYXNlNjQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vYmFzZTY0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYXRvYi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXRvYi5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYnRvYS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnRvYS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZGVjb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2VuY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW5jb2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM2MTYwOTVlNjU1ZmFkZmE4NGJjNjAzZDZiZWJlYWFkZDk4MGE1OTg4YmU4ZDI4MTI3YWEyZWM3ZDY1N2VjZDdhZmUwYjg4MmNhZjQwNTMyMGFkMTBmOGJmZTYwMGE3MjcyYWE4M2JjNjFjMjdkNWVkYTkxMGFmM2Y0NmIxZWMzIgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTBiMWM2ZTM5ZWFkOTZhOGI4ZTdhMjE3YWFjYzQwMzgzMDk4ZmQ4Nzg1MzUxZWVhNGNjOTk0OWE3NTBiZDJjZTM2NmQ0YjlhZTIwMDc5ODgwZjA3YTVjODgzNDJhMjU5YWUyY2UwMmZkOTU0MjU5MzkxZjVhZDUxMTQ0YzFjNjQiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzkxOGY1NmNhOTk2ZTU1OGU1ZDBmMGFhMDJjMWQ3YWE3ODcxYmIwZjZiZDBjZjU2MmUyN2I3ZWVlYmNlNWU4ODhlOGY1ZWRjOWIzNDJjMmRkYmVjY2UzZDU1NTZlZmE4Zjg2MThjYjI4MGMyNmQzOTA1YTdiODdlMzBjNmU0ODIiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjRjNWM3M2E4MWQ1YjZhMGYwOWU4NmRiNTRkZjIyMmQwNjQ1NDcwZWU1YzBjZjYyMTUwM2JjYzkzMDg2Zjg4NWVhZjY4MjM0MmQ5NGM3OTIxMTRiNGYxMmEyZmUxOGYzMTU4MzY1Zjg2MjM2NmQ3Y2M0Y2RhYjU5MDZmYTJlZGUiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk2MGUxNjA0YmM2YjVkNTZlODY2ODVjNzgzMTAzZDI5YTk1NWM0MThhYjI3MTYwNWNiMGZiZGY4MzNjNmNmZjhhODZjN2I2Y2YwNzE0NTYxZTgxYzhkMWJhN2JlNTFjMTBhNTVmOWUyYjI3ODRlYWEwYjg5NGFhYThlMTljYzk4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzQwMWRkYzNjM2I4NzEyNDdlMmJjMzdiNGE2MzQ5M2Q4NGVlMzgyNzQ5ZWQ2OTI4NTFkMmFjZGQ4YWU1MWZmNGIwM2MwMmZmY2EwNjRkODlhMmI0MGYzMDI3N2VlOTcyNzA1Mzc3NTY0MzU3Mjk2ZmIwMzg2Y2VmZGRhZjFkNmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZGVmMWY3N2ZjNTYyY2Y5NDhkMjY2Yzk3ZWFhY2VhYTY1MTdhYzRkNzFmMTA1NTQyNTg1Y2RlNzdjOTc5Y2EwZGNlYmM2ZTJmNTg5NTEyM2U5MDVmNGU4ZDZkMjEwYmVjNmI0OGJlM2JlZmVkMTBmYTAyMTRhZTg3NzFjZWQ1MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQzYzM3ZTI5YjYyMjU0OTQwZGQ4YjFkOTIwNGMxNDM4ZTY1NjA2NWFjOGE2YzU5OGUzM2ViN2M3MDQ4NjQ5YWE4YmU1MzRjMGNjMWExOGZhNTg5MmY1Mzc3NTQ2NmRkNDc2Y2E5N2ZjNDYxZThhYjY2YzBmMmFhMDkwZWIwNTVjIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IjogewogICAgICAibmFtZSI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Nqcy1tb2R1bGUtYW5hbHl6ZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2pzLW1vZHVsZS1hbmFseXplci12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9janMtbW9kdWxlLWFuYWx5emVyLXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2FyY2hpdmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYnVuZGxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J1bmRsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW1wb3J0LWFyY2hpdmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL25vZGUtcG93ZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL25vZGUtcG93ZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0YXRpYy1tb2R1bGUtcmVjb3JkIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0YXRpYy1tb2R1bGUtcmVjb3JkLXYwLjcuMTkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0YXRpYy1tb2R1bGUtcmVjb3JkL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zdGF0aWMtbW9kdWxlLXJlY29yZC12MC43LjE5IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcmVhZGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC93cml0ZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3dyaXRlci5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9sb2NrZG93biI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgInNlcy90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbXBvcnQtYXJjaGl2ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIxODJkNTUzYmUyZGUwOTQwZWRjZDdhN2M0YTFhMzdlNTVmMjZmNTRlNjY5ODJkYmQ1MzVmZWI2OWI2ZWViODBjNWYxYmQ1NDlhZDk3YzY3MDg4ZDUwNjVlMGIzZWY2M2YyYzkxMmE3NGM5YmVlYjdmZDk2NWQ1NjNjOWRhOWYxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcGFydG1lbnQtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjRkYjJlMGRlZmEyMWQ0ZTZjYTAxZTc0MTQ5YmY0MDc1MjA4OGEzNDczNjMxYmJjYWU1MTNjZjRlYmJjNWIxNzYxMTQ2ZDQ1ZmIxNzZmMTM0ODBiNzI2MzBkNTA2MWEzOWE0ZmI3NTQ2YjNhZjI4MDdjNDEyOGIyMmY2YzFmMzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXh0ZW5zaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHRlbnNpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMGVkN2VmMjMzYzRhMzE5ZmZiYzg2MDQwYzZmMjk2MDQ2MmUzMzhhMmI2NzE4MTk5OGYxMTgyOTE4NDkzZjg4ZTIyZDA1NTI4MzkxY2E0OTQxODZhMWI2YWZlMzUyZWFhMzQ5N2I2OTljNjY4NzQ1YjY3NTgwOWNlOGJlNzY2YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2Y2FiYjhlYmJiMzFhNzRjYzA5MTQwZmM0OGE5ZGEyYjgxZmMwZDJlNjA0Mzk0MWFhYWVhMTFhM2NhODA1YjI0ZjNlZmZiYjQ5ZWFjOWRmODZmNGQ1ODliMGU4MGY2ODBkMTJmYTQ1ZTU1YjQxMDQyNzhiMjcwYTRlNzQyYWEyZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjg5MTFhNTc3ZDcwNTNlMGY2Y2FiNjA5MjM4Y2NlNzE2OWI0OTM3NjQ0ZWM2YmZiOTllNWY1NWJmYzE1NzE5YTk1ZTUyMDFlMzZmMzA0YmNjODliYzViYTNmNGY3ZWFkZjNlYzc0N2UwZmU5MDVhOWFkNGUzODRlNDc3NzE5ZGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZkMTg4MTJmODY4YmY0MTJhNDY2NzM2MjIzMGMxZmVjMjFmN2U5NGIxNmRmYjI5Zjk2OTI5YzJlOWRjNWMyNTVlZjQ4OWE5Mzk5MTgwNDcyNDE1NmVkNTE4NmI2MWRjMGQ2N2Y1ZmQyZGIyZDUyYzA4ZmI1NmY3M2Q1YTJkYjA5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTM4MjUwMmRhYjRjYTRhNjRkYzVmNWZlNThjNjI0M2YwMmI2YmYxZWU1N2U2MGEzZDQ3NjhhODZkMTZiMWIyMjkzZjJlOWQ4YzM3YzI1OWViZWIxMTY2NTM2NjUyOTMxY2I1MjM0MmViMGEwZjRlZGZlMjE4NjFiYjg1ZDJjZWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtYnl0ZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWJ5dGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjU5NmFmZGQ0NzJhMTYxNmI1OTkyOGVjNDgwMjBjOWNiZWM0YmQ1YjkxMDhmMDZiODdkNzhjZDQ5ZGI5NmFiMzAxODAzYTNkZmE3YmE0ZjhjMWM2MzNjYjA2MzRlNjNkM2ZhZjhkNDViY2U0MjZlOWNjZjFmYjZiMjk1Zjg0YTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFjMzJlYTIzOTQyNzU3MmQ0ZTJlYTIzNzUwNGNmMzY3MjQ2M2Q0NzM2NjNlNTdkMmI2ZDI3YTA3OWI2MjlmNjk0NmU1NjQ2YjA1YWZkNjBiNDk4YzYxOWRkNTNkZmE2MTQyMjg2M2MwNjJhY2Y5MjMwOTUxMDFlNDc5NDY2M2M5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWpzb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWpzb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMzBlN2M1NzU1MDhjZWFiMmI5NjcxMWY3ZTQxYTJiZGM4OWIxNmIyNjRjZGU5ZDE2NmIyNjA1NmY2YzcxNDAyMzRmMjk1Yjg0MDAyYmQxN2YzZmExNzZlYjU2MGJlNWE4ZjQ0NjlkZjg3M2NlZDEzZGQ4YmQyZDQ1N2NiYjIzNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1wcmUtY2pzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1wcmUtY2pzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWRmN2I3ZGNlYzRiYTcxMGVjNDBlYzNkZjZhYjc4NDM5ZDZmNjdhNGQ3MzJhNDZlOTE3OGExM2FiOTJhNmIxZTRiMjY3MmMyZjdjZTIwZDVhM2YyYmNmNzdhODE5MmVlZDA3ODQxNDE0MmQ2Y2EzNThmZTQ0ZmYxZjkzODJlZmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLW1qcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLW1qcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE4NGI0MjU4M2Y4ZjcyMWYzZGQzYjgxMmJmZTEyOTVkNTc5NWU2ODk3NzlmNGY4MGZjYjhjZTMzNzA1MzYwMzJlOGE5YTAwNjliZDAwNWYzNGI1ZTQ0YzgxMmU1NzNjZTYzNzI0ZWFmNDAyMTVlNTIyNDg4NGFjOWMyZGFiZWY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXRleHQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXRleHQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYzUyYjcxMWRmNmMwOWRlNTYzYjM0OTI5ZTAyMWFmODY2YTUzODAyYjliMmZkN2YxZGU0YjAwZTI5NmEyYTMwZGMyMjQ2NDkwOGUyYmFlNTJjMWY4Y2Q0ZjE5N2I0MDdjN2I4NWIwOTYwMzViNjU3YTQzNzI0ZTg0ZTQ2NjkxNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb2xpY3ktZm9ybWF0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb2xpY3ktZm9ybWF0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzNkOWJmYjI5YjdlZTRmMzgxZTcyMmZhYjgxYTZmOWExMTc2MDBlMjg2MjNlMzRjMTA4Yjg0ZTc5MTQ1MTVhN2YwMmY3ZWRiYWE5MzE2OTJmM2ExYjkxMmY4YmIxMmFkOTUwNzYwOGI5YzVkMDRlNjA5NTFiM2RlN2UzMWI4NDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb2xpY3kuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyODg2NzUyNTFmYzUxMzZmOWUzMDcyOThhOWQzYTBlNmJlMjU0OWY4ZDAwNDYwYWYxOTIyZWE1ZmYyYTE2YWQwZmVkMTY3NjA3MmY4MTlkY2UxNmQ5MDk2MDI3MTVkMWIzZmVkNDZlYjdiZGE1MDNjODE2ZjRjNmQ4YzJjY2FjZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wb3dlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bvd2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg5MGI0YThkNGNkYjc0NDVmMjYxZTI0MDhhZDhlNWIzYzRhMWNjNTQ4MGZmMjE4NjcwMWQzYmY3ZGI4YjRkNTYwYzE1ZTU1ZmE1N2VlOWQ3YzQ2YWNlYjMwMWU0ZTA3ZWFjZjA3YTgzOGIzNGQxYzE2ZGMyZDcyZDQ3NWJjOTRmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM1MzY4NDgyNmNiNTY2MDlmNjJiN2Q2YjRkZTMzZGFkMjJjMjBhZGFhMmViMzg4MDBjMzY0Y2VjNTA5NzM4M2U5NzNmMDU4YjMzNWQ0ZTRjNDgwMzBlNDI4ZjdiOThkZGEyYmYyMjg4ZGJhMzAwOGFjYjU3YjRhZTcyMjA2NGNiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vLXNoaW0uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vLXNoaW0uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZTI4MjAyY2ViMjNlMDY0ZDVkY2NiZTAyMWFlN2QxYTVmZGNjYzAyMzQyNzBkYzU2MjRmZDkxZGYyMzZmOTA3ZGNjNWQyNTQzMjZkMWNkMzJhYzUxMTc2MDJkMmZhMjM5ZTZmMzIwMzMyODJmZDY3ZTI0ZjFhN2E0ZGU5NTYzMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFjay10dXJucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhY2stdHVybnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNzlkM2EyOWViN2JmM2JhOGEzOWYyZjhhZWY4NTBhOGE5Y2ZlMTBmOTU3MjNkMjcxZDQ0ZTIxMjJhMmU4ZDJkZTQ5NDI2YzFjNGQ0OGNhNTljOGJhNmZmMGRmOTI5OTU1MjhkMzQ5ZWVmZTFkMGQ1MDNiZGZhODFmODRmZWU2ZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXhvLXYwLjIuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXhvIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXhvLXYwLjIuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9leG8iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjYjE5YzBkNzRjYzUwODgyN2IwYzk4YzM0NWJkNTc3NTUwZTVlYTIxMGE5NTE1MzcwODJkMzkwNmRiZGI3YjBmMjgzYWM3NmI3NTE0OGYyNGRjOGYyNzIzYjJiNTQ4NzY4ODgwYmViY2JjY2JmODIwZDA2NWFjMDE1ZTMxMmZjMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tbWFrZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWI2ZGYxN2NlYzcwNjIzN2I4NmVmYmUwZjNhM2I5ZWM4ZmU1MTZjNWUwNTE2MDdiODE5YWVjYjJlNjBkMzI3NTMwMzM1Y2U5MWZhYjc3OGZmMWY1MTQ1ZjBkYzc4M2M4ZTYyNzdiZTY2ZWU4N2I2ZTZiNTAwNGFlNWY4ZmNmYjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NjZiZGMzZWIzNWUwYmQxOTg3MjNkNGE1NjkwMjQ2ODI2ZjRmMGQ2OGMwZDdjNTQ4ZjQ5MzhhZDNjOTViNGNiZjhiOTE4MzI2YTg0YmIwMGI0YjA0ODNkNzg1NDZmNjc2MGZiMzRiNmU0NzVlZDJlZWM4MDk2ODUzMmI2ZGYzYiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZmFyLXYwLjIuMTgiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ZhciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ODc0OTdlM2JmNjhjNTI3OWYzNmQ0MGUyOGU0YTc0Mzk3MTU4NDAzMWY2NDBlZTQ5NzJkOTI1NWEyOWU5MWJhZDE4ZmQ0Njk5YzRiZGNiM2IzNjgyYzE5NjVkNzZjMjk5ZDQ3ZmI1ODJkMjYyOGJmZmM0ZmNiN2MwZjNkNmYxYyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ltcG9ydC1idW5kbGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vYmFzZTY0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYXRvYi5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXRvYi5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvYnRvYS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnRvYS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvZGVjb2RlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kZWNvZGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2VuY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZW5jb2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2FyY2hpdmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYnVuZGxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J1bmRsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW1wb3J0LWFyY2hpdmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL2ltcG9ydC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL25vZGUtcG93ZXJzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL25vZGUtcG93ZXJzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2Y1ZDY5NjY3ZjY5OTk2YzljNzM5MmFjMDBmM2E5ZWI4M2RkZjMxMTkzMjFjNTJkZGViMzc2NjAyODQ3ZmUxMTQxY2NiYzk0N2YyOTUwNDQxNDY5NDIwNjQwNWYyZjYxZWVlODJhNjhiMDgxZDI0OGZjZjk2MzY0MTFmYTRjYTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzg0OTFkZjY4MDA2MDZlODkwMjczMDU4ODljOWYxMDQyODNiMmFmYWRiYzJiMWRhYzA1ZmJmYTYwYmVlY2MyMmY3MGY2MWRlYjkwNDE0NzBiN2ZhMDBhNDMwYmEwNzNiZGRlZWFlMGZmZDNhZWJjMTI2YzFmMGRjYTI5NzVlZDciCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjAuOC41IjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmVjMmY3NmJmZWUzN2Y0NGE4ZDNhZjI3YjI3ODY2YTdkMzNmNzg2OWVhODcyODVlNGZjZmYxYzNkMDc2NGMxYmMzYTVkYzE3NTMxYzcxZDMzZTFlYzY0Yjc1OTYwY2JhZjdmZWVlMDRiN2Q1Y2YzMDViYjgwNGQzMDVhNzgwYTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MzVhNjk2MmQ3MmQ5ZDI0MDUxYjk3NDk5MzIzMjcxOWVmNmQ5NjQ4YmFlZjM4MzIyYTYzNTg3MDExOGQ2ODJhM2M5NjYyYjEwMjA1NzVlMzhhYmFkMDZjZDU0M2NjMjFmZjEyZGVlNTFmYWEyNDdhNjM0OTZhN2Q3NzI4YzI3MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YTAyZWMxYjFiMTNlYzhlMWU3YmQ3NWZmMDdhMDNkZWVlNTE4OGZjZDYyMDFlNGI1YTBjYzRmYTRiNjE1NTNlZDBlMmI4MjRiOTEzMmM1ZWQ5ZmQ3MDkwMGJhYjE2ZmQzYzE0YTQ3MWIwMDNjMjVjZTI2MWFmNDIwMzMxYWU0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlhOGRkMmEyZmY4YWIwNWQ4MTI1ODk3ZjE3MmFhMGE5ZmE0Mjk2ZGFmODI5ZjQ2ODI2N2I1OTNkNDVhODZjMGU0Nzg4MjRkZDBhYmY1NWRmMThkODBmMTc5MDMyNjQ4NmE1M2M1MDBjZmQ3NTk3ZmQ3YmIzZmZjNTgwZjU0N2Y5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiMjMzYTVjNTYyMjIxMjRhYWI1ZGU0OWUyMWY3NmQ2N2I2ZTNjZjFkZTBmMjQ1ZjIxYjg2YmZiNDM2YzAyMGY1MGMwY2M1OTBhOTZhMGRiYWE5M2U2ZDM5NDM5NTU4MWZlNzY5MTQ5MDAzNDc1NDc1ODgyZTIyM2E2NzAzNDVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJiODJkNTk1ZDJhZmQ1ZDljMDJjNWNiZTAyZTdmN2M5NjA4N2M2MGNkMDkwOTFiOTk3ODJiZDhhN2MxMjZiMjM5MjYyZTk4ZDBmNDYwYTQ4OTgxYjVjZjM1MTFiN2I3OGNkMGYwMDFiMmZhMGU1ZTkzODE0MzVkYTE2ZGIxNjdjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZkNjMyZDY0Zjc2MzlkYjI3OTAwNzZmN2Y1OTMxYjQ1Y2NlMmQ4NDM4N2NkYTJjNzhjOTFhNDIyOWY4MTYzNDQxNzZiYjQ3MDA4ZTE5NzcwNGY2YjdkYWFmZDI3NDNkZWI0NWFkMDZjNWJjNmI4OGMwMzhkZjBlNmRmYmEyN2YzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMjYxNDcwNzE0ZDY1ZDMzY2U2YzhkZmQ5ZGI0Y2NiZmNhNGJjODhiMzE5OTliZjAxOTdiOTViZDAyNzNmY2FlYzM5YzRlODY2NjlmOTc3MGJhNzEyYjBiNWI2Y2QyMzIzZDViYzRiYTJmNTBjN2JlMWQ1NzM3ZmU5YTQ3ZjYwMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVmMDg2YTYwY2QwZjM5ZDcyNjBiODdmOWJhMjAwMDcyYjE5ZmFjYzc0YmNjMGE2Mjc2Y2QwYjEwZmEzOWQ5MWM5ZmU3ZTM3OThjNzgwMDhhMGZhMWIyN2NlYzQ1NjIzZTVhMmFhZTgxYzU0NTYwMzBkZDE0NzViODk1MWYxMmI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjQuMS4yNyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MjUwODJmNGM4Y2E2YWE3ZWNmYWI5MGFjMTE2NWFmZDU4YzcwMGMwNWZiNDZjMzgwYThlYTQyN2QwY2I3YzAyYWRiMTMzNjM1MGI3MzQ0ZjY5MjU2MWMyYTk4ZmEyN2ZkZGQxOTRjM2E2MTM1NWZmZDgyYjRmNzM3ZWJhOTQ5OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Bhc3Mtc3R5bGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGliL2VzbS9hdmEtZmFzdC1jaGVjay5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4xLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzZiNzMyMDNiM2FjMWU3NjAxMDg3MmYxNjY0NTdkNTU1MzI4ZjQ1OWNmNTBhNTcyZmZhMDEwNDFlYzA5MzNhN2Y1NzkxNzBhY2UwYjZlNzZhZjc5MmUxMmJiYmUxYWY1NWJkNmQyYzY4YzRlZjExYjQwZGRhOTRlZmRjNjFiNzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMzhiYjYwZjc4NTRiNGE3YjYxYTFmZDMzYjI0YTdlOWQwNThkYTc5MGU2ZjBhMjk2NDQzZjcwOWYyMDZmZWY3MzE1MGI3ZTJkZWQ3OTljNjM5YjU4ODQ4ZGM0NWE0ZjNmY2FhOTlhMGYxZTcyNWEyYWQ5YTQzZGNlNjkwODM5MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTRiODEyNWQwOWQ3M2IwMjVjODM5ZjYyNTFkY2MwNmE1M2RjZDI1YWU5MThjOTczZTM2MDE2MTE2MzA4YTQ4YzE4MzBhZDMzODczZDliOGVlZTA2YWQ1MGI4MjlkNDUwMzZlOGM0ODYwMzYzOWUyYTU0ODJlZTJiYTljZGQzMGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzRlNjI3MjdjY2E4Y2YzYzJiNWEzYTc4YTViMjc5ZjM2NzkzYTM4ZDM2NzE4MTUyYWNhNWIxZTE4NjY2NWIzMDYzOGRkMTI0YTFiYjhjYzk0NGMxMTFhNzEyNjg2YjQ0ZDBmN2NhYWI0ZjJmNWYwMjczYTA0ZjQyNzZmMjczOGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NzZlYmYzNGU3M2QwNTAzOTM3NDdlOWVhZjM1ZDk3MDdhMTkwNWQ0Y2MxYzUxMGE0ZjE5ZTE1ZmMzNTBlY2IxZGI0OWIyZjUxZjg0ZmFhZWNiOWI2N2FmNTQ4YWNjMmU1MTJmYWIyZmExNjEwYjM2OGRkMWExNzllYTBmMzM0ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOGVlZGEzNmRlZGNhYmNlZmZhOWYyNmU2MzUyNWU2ODg3MWEzMmNiZWRjZDdjMWFkNmI2ZDU5NDM2NmIyNzI0OGMxZDQzNmUxZjlkY2YzYjA5NzEwN2UzODAxZDIyOTgxNDQ1YzhjMzMyY2JkMDUzMDA3NTk5ZGU1MzJiYWYxMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmQwZTRiYzZlNDdlM2Y2NDc5NDZlMWE0YjlhMGNlYTY0N2MzNTMwN2U5NTUzZTU4ZjNjMTMyMTYxODM2YjlkM2I4YzdlNzAxYjNlNjg2MDcxYjYwMWY0YjBiODAyMzMyNmY5YmE0ODdhZWM4MDI1MmM5NWNhYWQ4ZmQ5OTYxNDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDk1YWVkODc0YjQ5NTc2NDhmMGU1NWM4Yzc1OTJkYzdlMWI2NTMwNzllMjU4NjU5NWJkY2Y4OTM3ZjcyMmMyYmU4NjdhZGNhMTYzZDA0MDQzMjUxMDY2MTMwZTAyZGRjOGNiNzY2M2NmOGQ4NzY0YjEwYmY2YTI2YTk2MjRmMTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2MwYzc4YjA2ZmZmMmIxNzVkODQzYTliMTNmZjg3Mzk3MGM2YzJlZWIyZTBhMmEyMDdlOWFjYjI1YTliMGE2MjFkNGVjOGQyMWUwY2NhODgzZDIwMTFiZmVlMDdmN2RiNzI4ZTJlYzBiNDViMjRkMjU4ZWNiZmUwZGVlMDAzNTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTg0MmZlODI1MWQ0ZTA5NmYxM2NiZTVlYmY3ZTBiMzBjNmI1MzBhMDBiMzRmYTA3YmU4MDRkNWQ3YjQwMGEwMmIyNmZmNDI2OGIxNGRkODc3ZTk2ZTFhZTMzYWQwOGVmMmFiODgxMjk2MzJkNjI4NzU5NTJlYWZkMDE3MjExYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjliNzM0MWY4OWVmN2RhYTVhM2EwMTgwZTFiZmY3MWM1MmQwODg3MWViMGFmY2U1Nzc0NzAzZDk1MTgyZGQwYzAyYzA1MDgzM2VmNjE5OWJmMzEyYWM1YzAyZGJlNDUyM2U0ZDhhMGYxOTY5MTI1ZWM3NzU5NmNjYjc2NTAzZmM1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjk5MTliNzhkMDczNjljNjdjYmU2OGU4NjgwYjJjOTE5ZDYwOWQyZGJjYmIyMWQyYzgwY2ZmMjYyYTM2NDUzNDdhNTMwZTczOTFkNDFlNzhhNDQ4ZDc1MTgzMjZhMWNlM2VjYjljOTlkMTYzNDM5MDE2Mzk2NTQ5MmFkZTA0OWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMzlmMzA1YmM3OWYxZGI5YTZjZmJmOTUyNTE5MjViMmVlNTZiZDI5YmIxNTU3ZjI0NDY5OGZjMjM1ZDBhZjllNzI3YWM1NzIwMjI2ZTMyZGM4MGZjOGFmMzYxN2IwYTRkNTNjZTc3MmU3MDNlMjVmZjBiOWViZWQ3NGM3NTczOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTQxNzBjNGUxNmQ1Mzc5NWE4NDc5ZDBjMWE3OWQxOWIxOTBkOTIyZTE2MzAxZTdhMGJiOGI4MTZkM2M0OWJkMjVmZTBiODRlODc5ZGE3ODBjM2ZjMDY0MWFkNjljYzU3ZGQxZTc5NWVjZTdlOGJiMjgxMmY3NDMwNThhZmYwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGF0dGVybnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjMTEwNTVmY2E1ODRhZjRkNDczOTljNTRiYzUwZDgxYWE2OGM2MDNhNTUwYmY2OWEwOWIyN2M4OWY2ODVlOTc0NDU0NWE3NTNhZDVlOGZlMzMzMWFkYmQ5ZDRkY2ExNDNhNTg3ZGQ2MDkzNGZiNDFjODJmNGExZTllYjFkZTUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZTcyYTVkY2Q2NGUxZDdkMjU0NWNlMzBjYzM3MDI0ODQzOTBjOWQ1Y2RkYjlkMDVjZWEzMzZlODhlZThlOTMzYmMzMTUwM2M0YzI1YzM3ZTBhMWNhYzhjZGUzMWNiYmY0NzgxODY0ZDBkODlkNzFmZWU1ODRmNTliMDE5MzQyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDJkMzcyODdhMmVhYzlmNDFjYzQ0YTkyMDFmOTlkZjIyMWE2NzZhNDdjZTc5ZDgwNjBiN2M1NjdjMmU2M2Y3ZGViZDkyNmZmZTM1MjIzZWE3ZjM1OWZmNmE5YjMwYTgzNjhhMzk2YWI2ZGRmYzRiOGIxMjI2NDFmODVjOWI4ZTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZGU0ZjgyZjJjNGQ0OWRiM2E5ODE0YmRiY2YxZWM2NGQ3MWQ4ZmFkNTIxZTExMGU2ODEyZDNiMzczZWQ5MjhiODYxZDc1ZjA3YTY3ZTNjZjRjM2ZlZDZhZGU0NTU3YmJmNGFkOTQ1NzM1YTIzOGRlZGRkMDUzYzA5MzJlNmEwNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRlYWI3ZWMyODRjYWRlMWIwNGRmNGYzYmU2ODZjMTcyYjA0MzkxZjBlZWQ4NTQ4ZTQ5ZjkzMWIzYzJjNGM1MTgzZTg0MTFlZTY1YTBiOWI2ZGZiNWZkZjFhZGI4ZTRhMzYxMjUwYWUwMTkxZTJlYzYwYzU4MTQxOGU4Y2E1MDQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGI5ODkyYjNhMjViZjZiYWQzMjM1ZDZhMzc2NTZmMTFhNDNlNDRhMzhmZThkNWM4ZTQzNWIxZjA5Y2JmMmI0MmY2YWQ2NDk0NDY0ZDU3YWQxOTQ3Zjc4YzhhMTAxOTZiYmQ4ZjUwYjY0ZTI1MTA2NzYzZWRhOTNkZTI3YWRlYmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YjFiNDE3YzZkZDkzMmRiODFmOWRhMTE0YzAyMGM3ZDAyNzhiZjEyYmE4YzQ2MDdmZjQwYWJjNWUzMDE1OTUxZGNkZmJhMmUwMWEwMTUzZjRkMGZmOWEzNzU0ZWJjMDA0NjA3N2Y3YTg0MjMxN2IzMWJiN2EzZjFjYjBmYzkyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMyNzZjNmZiYzYzYjViYmY4M2FjZjBlOTkzMTdlOTAzNWZmMzhkMDRhN2I2MWIyOWY4MDAzNTM4NTAxZmVjZGYyYmU5OTc2YWRmOWUyMmE5MDA5YWI0ZjUxMWI5OGU3ZWZjNjQ5ZmE3M2UyYTlhYzMyMzYzY2NkZThhYWE1MTNhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjExNGIzYTQwNDM4MjJmOGZiZmQyMmFiNjAxOWNjMWE3ZTYwYWRjZjdhNTdkNzBkMjdlOGVmMWMxMTIyNjI3NWY3ZTMxMzc2ZDg0MzZhMTQ3OTk4Y2E5YTA0NjA3NjkyMWQzNjcyZWM5MWRmNmQ2ZjMyMTEwNWJjZGFiM2Q2NzMwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOWZmZTU1YTMxMDM3M2E0NTdhYTlkMDc3MTYxMTg1MDU0ZWIzNmY4MzUzMjhmY2ExNGVmZDExNDUxYzYxNTAyYTEyMGI4M2M3NDgyMDRmYTA4NzdhZmM3MDUyZWIyMmE0ZDdiMGUxYjBiNjE4ZGI5MDIxN2Q2ZThjZTc3YTI5MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTgxNGRkMTQzZGZmNzNkZTNlZTRjMWYwNzcwN2U1NzdjYWFjYWEzYWJmNGIwNTkwY2RlZGUxMGI5MTk5YTkyZDc5N2YwYzExYmI3MzgyOTVjNDlmMWU3ZWY5MGYzZDExNmUyOGU3NGMwODY3MzRlYmNhOGJjZGExZGM5MzlkNDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZWE1NWZhMmNjMWI3MzZlMDJiYjgzMjI0NmRjYzZmY2Q0YTBhMWViYzI0MWUzODFlZjZmNjRiZDhlYzQ2YTE1ZDNmNzk3ZWMyMmEzNWM5YzVjOTUxNDI0ZTM5ZmQ2YTY4N2NkYjQxNTVjOGRiNzFmNmVmZTdkM2ZlOTdlOTQ1YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NWU4MzM2Y2JjNDFjZDJmNjMxMTc3YzA2MTA5Y2YzZjhiNTE4MTRjYjMzZTIyMDgyYzhlOWVlZTA3MmVjNDg5MTlkMDhkNDNkMjlkNTY1NTE4MjZjODk1MTM1ODM1NGQ2OGU1YWEwOTZjNmFhNTY2MTM0OWUwZmExMDgxNmY3OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vc3RyZWFtLXYwLjMuMjUiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3N0cmVhbSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MC4zLjI1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdHJlYW0vcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MC4zLjI1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMDk0MTMyY2I5YWNlN2YyYWE4ZmIyNGE4NWE4NjBkNDhkZDdjM2U1NDQwMDFmZWNmZWQwYTk3ZGMxYTM3YzJmZTNkM2QxYzBlNDQwOTkwYTg2MGU1ZjQzZTdlNmI1N2UzYTBlMTQ2MDI0YjA1ZDk4ODMwNmM2ZjkwNjhiNWEyZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vemlwLXYwLjIuMzEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3ppcCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby96aXAtdjAuMi4zMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby96aXAtdjAuMi4zMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMzEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvcmVhZGVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjMxIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9yZWFkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4zMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vd3JpdGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkODQzNzI5M2FmMWQzZTgwNzQzMDM0NDE1NDY5YmI5N2U4M2JjMmNkYWFmYTdiMGI2ZGM4YjIxZTBjMTBiYzZiMGVkZGIxMTQ0MWMxYjdhMWNiMmVlNjM0OGM0ZjAxYzI4MzdmMDJiNGEzNGRlZWE2NDBjMmYwNTQ0OWEyZWRkOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9idWZmZXItcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9idWZmZXItcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTM1ZGFlNjdlOGFkZGM1MWMzNWU5Y2E1NGMzOWU4ZmUzYzllZTI4MGEyZThkY2M3YjQ0YzBlNDg1NmQ1YWFkNjIwNmUxZjhkMGNkNjFlMTkwNzYzYmMxNzE4NDE0OWIxMTRjNGFiNDQxYmZhZWRiMDcxNDYyMWE0NWQ1MmNmODAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk0YThjOGU4ODQ1ODRkMzZjMDIzYTQ0ZjVkYTc3M2Q3ZDJhOWU0NWUxOTNmYzA0ZDc0MmEyMmVlMjU5MDAxMGJkNTdiM2FhZDhiNjI0Njc2ZDViYTlmMDQwYTBjMzQ4MTg5NmE5Y2MxNjE5OWE2ZTI5NWY4ZGQwNGM3MThiMDQ2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXByZXNzaW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb21wcmVzc2lvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUwNWRiNDM1M2M4NmY1MWRlNzk3YmQ2Y2NhYWViMWM5MjFkYzc0NmU3OTRlOGM2NDIxMWZjZWU3OGQ5MjAwMmIzYmFmNTIzYjFmNjk3ODVhZmY5YmZhNTc3OWQwZjkyOTM4ZjVmM2FhZGJmNDg5ZmM4MjIxM2FjYjliN2Q0NzNiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NyYzMyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jcmMzMi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg1Mzg0ZTEzOWFmOWYwOTNiOWVjYTUyY2M1ZTYwZDVlZmU0MTU1ODQwYTZhZmViMDIxYjFlOGFmODFkMzAxNzM0NTE3MjE0ZGI0YWQ4OGIxMzg0MWZkYjYwMTFlOTZkNjFjY2UzYjA3ZGExNzgxODRmZDZiOGQyMGM1ZTgxODA1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Zvcm1hdC1yZWFkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Zvcm1hdC1yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiY2E0NDdlMmNjNGU5OGZmMzc2YTNjZTA5ZmQ5OTBlYjVlZTBjN2QwNWYxMDRjZDk1OWY4OWI3MmJhNDdlOGNkZWY0YzQ2MWYwNjc3NmU3ZTMzMjUzMDlkZjZhMDNkMWE2YjRhYTE3M2E3ZGMxZjc3NGU5YzE2M2NkOTgyNDYwOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtd3JpdGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTM4OTRkYWYzOTZmYzBlZGQzZGJhMGEzYjJlYjk1ZDUxYzQ2OThlYTgxNzBhMDRiZGZlOWM3N2UwMTg1ODg2ZWZiZjY1ZjU3N2JhYjE3ZjIxYmE5NTc1MjBkY2NiMzhiZTBhZmFmOGZmNzEzZDBkNWRjMDlhMmI1ODVlMWRiZWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZWFkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjYWQzNTFmMDE2YTY3MTg2ZTQzZWFjZmVhNzY0NDJiODM1ZjY2YzRmZDc4YmE0MWJiM2I1ODBhN2YwZGY4OTc4ZmYwZDk5NjRkZGU0OWJiYzdjOGE3Nzg4Yzk5ZTBhNGE2ZTNiMmFjMmUzNTQ2MjVmYTRjOTI3YTVjYWNjMjIwYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zaWduYXR1cmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NpZ25hdHVyZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIwNzc1MzIwZDRmMzI5ZWU4YWEwNDE0NGE3MTQwOWU3Y2Y2OTY3NmFiNWFmMjVhNmI1YjZlMzYzNGNiOTE0NjYyZGM0MjU3Mzg0M2VjYTllMThhNzc3ZDVkZDAwNDk4NzI4ZmQ5ZThjNjVlYTEwZmJkYjM2ZDYzYWNmMTE1NjM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvd3JpdGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTZkZmZhY2U2MzFlYjQ2NWU4M2ZlNDY1YzRhODRkZmFjYTJmMmM0YTc2MzgzMzM5MDIwNDdlZjZmYzhlZDY5YmMyZjJhNjQ5MWFjMjc2ODlmYzNhMTBiYTFmZjA0MTUwMDc3ZjNlZjE1NGRiNjFkMjY4MDBiMTcwMmI1NTk0N2EiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgImplc3NpZS5qcy12MC4zLjIiOiB7CiAgICAgICJuYW1lIjogImplc3NpZS5qcyIsCiAgICAgICJsYWJlbCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMWRjYmUzNGY0YzIyNGQ2ZDZmZmRkZWNiM2RlNWJkZjJmZjMxMzg2NjdmNTZmNDk5NTU2OWYwYzJkOWZjZTNiNGRlYzQzM2YwZDQ1NmExOGI5NWQ3ZjNmMjM3YzExOTZjNDg3YmM0NGU0NDZmMjk1Y2Y2M2QyZDU4M2Q3ODg4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzIxMjRiY2NjODQ2MDE5MDA2MWY0Y2RiZDhkZjQ5YmQ3MjNkMWM2NTVhYjk5ZDAyNjc2ZjhhMTExYTBmNzRlNDc2MmNhYzQzZWNkZWViODVkMjkzZjM3YzgyZWJjMjVmYzRlMDUyYzk5MjM3OGJjN2ViZTEwZTY4MWNkODMwMzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWE5NWQxZGJjYzhmNGJlODE0MjA0ZjY4MzJjMWVhYzMwNjIxZmNjYjAzMjhjMGVjNDFlYTVhMDM5MTQ5OThjOGVmZjkwMTllZmY2NWFkNjYyODljMDE1OTE4MWQ5YjQ5ZGIyY2Q5NmYzZmI1OWUyMWFkYjg0ZDlhNGMwZTg5N2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJmNzE2Mzc4MmY2NzJmNjI4NDQ5MjViNmJiNGZkOWQwMTdiOGI2NDJmZjMzNjQ0ZjI1OWVlMDA3ZTJiYjVhODFiMjRiZmUwNjQxNzQwNWIwNTA1MTlmYjUzYzIwYTgzZjI5ZGUxMmY4M2MzYjlkNjk2Y2Y3Zjg0ZTk4ZGU1MTE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL21ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFrZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODM1N2JiZjZiMTFiYmNiY2EzYjk1OWM1ZWUxYWVhNGZhZWMzNGZlMzQ2YjgzODE5NDAyZTkzZGZiYmRlN2ZmOGZkY2UzOWUxZjYwOGRiYjc2NTQwYTgxY2E0OThlZmQ0NjkyOWY0MWU3ODllMjliYjZkYWY2N2FkM2MxNzVhNWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzBiZjEyMWE3YTU2OTUxNGMyZTBjMWFhNTFkMTZlM2UwZDEzYWM1ZWFmOTAxNTNhMWMyNTdjNjlhY2JhY2FiMGY0YTJkYzYxNTAzYjMzNzJlYjBhOTgwNmE2MTUyNjUxZjcwMTlhMzdiZTkyZGU4NGQ4YTIyNTVlN2YzMzEwNzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFlMTQ0OTBjZTUzYWY0MmJlNTI0NmM3MTY5Mjg4MzQ2NmY3MTRlODk4MjRjNzMzYmM0MzNlYTI5NWIyMjI5Y2Q0ZjdjM2I4YmEwMmM2OTk3YzcyZmYwMjc5NGExMjY3ZTllNWU0ZjEzYTI1ZGM0NmJkZTRkZmU1MjNjZGU1NTQ4IgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAOYpWAjsLAAA7CwAAIwAAAEBhZ29yaWMvYXNzZXJ0LXYwLjYuMC9zcmMvYXNzZXJ0LmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYWlsIiwiTm9uTnVsbGlzaCIsImFuIiwiYXNzZXJ0IiwiZGV0YWlscyIsImlkZW50Q2hlY2tlciIsIm1ha2VBc3NlcnQiLCJxIiwicXVvdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhbiwgJ25hbWUnLCB7dmFsdWU6IFwiYW5cIn0pOyRo4oCNX29uY2UuYW4oYW4pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtmcmVlemV9PU9iamVjdDtcblxuLyoqIEB0eXBlIHtBc3NlcnR9ICovXG5jb25zdCBnbG9iYWxBc3NlcnQ9Z2xvYmFsVGhpcy5hc3NlcnQ7JGjigI1fb25jZS5nbG9iYWxBc3NlcnQoZ2xvYmFsQXNzZXJ0KTtcblxuaWYoZ2xvYmFsQXNzZXJ0PT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKFxuIGBDYW5ub3QgaW5pdGlhbGl6ZSBAYWdvcmljL2Fzc2VydCwgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCwgaW1wb3J0ICdzZXMnIGJlZm9yZSAnQGFnb3JpYy9hc3NlcnQnYCk7XG5cbiB9XG5cbmNvbnN0IG1pc3Npbmc9LyoqIEB0eXBlIHtjb25zdH0gKi9bXG4nZmFpbCcsXG4nZXF1YWwnLFxuJ3R5cGVvZicsXG4nc3RyaW5nJyxcbidub3RlJyxcbidkZXRhaWxzJyxcbidGYWlsJyxcbidxdW90ZScsXG4nbWFrZUFzc2VydCddLlxuZmlsdGVyKChuYW1lKT0+Z2xvYmFsQXNzZXJ0W25hbWVdPT09dW5kZWZpbmVkKTtcbmlmKG1pc3NpbmcubGVuZ3RoPjApe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBhZ29yaWMvYXNzZXJ0LCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0IG1ldGhvZHMgJHttaXNzaW5nLmpvaW4oXG4nLCAnKVxuIH1gKTtcblxuIH1cblxuY29uc3R7ZGV0YWlscyxGYWlsLHF1b3RlLG1ha2VBc3NlcnR9PWdsb2JhbEFzc2VydDskaOKAjV9vbmNlLmRldGFpbHMoZGV0YWlscyk7JGjigI1fb25jZS5GYWlsKEZhaWwpOyRo4oCNX29uY2UucXVvdGUocXVvdGUpOyRo4oCNX29uY2UubWFrZUFzc2VydChtYWtlQXNzZXJ0KTtcblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VCB8IG51bGwgfCB1bmRlZmluZWR9IHZhbFxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICBOb25OdWxsaXNoPSh2YWwsb3B0RGV0YWlscz0gYHVuZXhwZWN0ZWQgJHtxdW90ZSh2YWwpfWApPT57XG5pZih2YWwhPW51bGwpe1xuLyogVGhpcyBgIT0gbnVsbGAgaWRpb20gY2hlY2tzIHRoYXQgYHZhbGAgaXMgbmVpdGhlciBgbnVsbGAgbm9yIGB1bmRlZmluZWRgLiovXG5yZXR1cm4gdmFsO1xuIH1cbmFzc2VydC5mYWlsKG9wdERldGFpbHMpO1xuIH07JGjigI1fb25jZS5Ob25OdWxsaXNoKE5vbk51bGxpc2gpO1xuaGFyZGVuKE5vbk51bGxpc2gpO1xuXG4vKipcbiAqIFByZXBlbmQgdGhlIGNvcnJlY3QgaW5kZWZpbml0ZSBhcnRpY2xlIG9udG8gYSBub3VuLCB0eXBpY2FsbHkgYSB0eXBlb2YgcmVzdWx0XG4gKiBlLmcuLCBcImFuIE9iamVjdFwiIHZzLiBcImEgTnVtYmVyXCJcbiAqXG4gKiBAZGVwcmVjYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBUaGUgbm91biB0byBwcmVwZW5kXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgbm91biBwcmVwZW5kZWQgd2l0aCBhL2FuXG4gKi9cbmZ1bmN0aW9uIGFuKHN0cil7XG5zdHI9IGAke3N0cn1gO1xuaWYoc3RyLmxlbmd0aD49MSYmJ2FlaW91QUVJT1UnLmluY2x1ZGVzKHN0clswXSkpe1xucmV0dXJuIGBhbiAke3N0cn1gO1xuIH1cbnJldHVybiBgYSAke3N0cn1gO1xuIH1cbmZyZWV6ZShhbik7XG5cblxuLyoqXG4gKiBJbiB0aGUgYGFzc2VydEZvb2AvYGlzRm9vYC9gY2hlY2tGb29gIHBhdHRlcm4sIGBjaGVja0Zvb2AgaGFzIGEgYGNoZWNrYFxuICogcGFyYW1ldGVyIG9mIHR5cGUgYENoZWNrZXJgLiBgYXNzZXJ0Rm9vYCBjYWxscyBgY2hlY2tGb29gIHBhc3Nlc1xuICogYGFzc2VydENoZWNrZXJgIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaXNGb29gIHBhc3NlcyBgaWRlbnRDaGVja2VyYFxuICogYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpZGVudENoZWNrZXJgIGFjdHMgcHJlY2lzZWx5IGxpa2UgYW5cbiAqIGlkZW50aXR5IGZ1bmN0aW9uLCBidXQgaXMgdHlwZWQgYXMgYSBgQ2hlY2tlcmAgdG8gaW5kaWNhdGUgaXRzXG4gKiBpbnRlbmRlZCB1c2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpZGVudENoZWNrZXI9KGNvbmQsX2RldGFpbHMpPT5jb25kOyRo4oCNX29uY2UuaWRlbnRDaGVja2VyKGlkZW50Q2hlY2tlcik7XG5oYXJkZW4oaWRlbnRDaGVja2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnQiOlsiZ2xvYmFsQXNzZXJ0Il0sImRldGFpbHMiOlsiZGV0YWlscyJdLCJGYWlsIjpbIkZhaWwiXSwicXVvdGUiOlsicXVvdGUiXSwicSI6WyJxdW90ZSJdLCJtYWtlQXNzZXJ0IjpbIm1ha2VBc3NlcnQiXSwiYW4iOlsiYW4iXSwiTm9uTnVsbGlzaCI6WyJOb25OdWxsaXNoIl0sImlkZW50Q2hlY2tlciI6WyJpZGVudENoZWNrZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABbmH7NouAADaLgAAIgAAAEBhZ29yaWMvYXNzZXJ0LXYwLjYuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyogQmFzZWQgb24qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2Jsb2IvSEVBRC9wYWNrYWdlcy9zZXMvc3JjL2Vycm9yL3R5cGVzLmpzKi9cbi8qIENvb3JkaW5hdGUgZWRpdHMgdW50aWwgd2UgcmVmYWN0b3IgdG8gYXZvaWQgdGhpcyBkdXBsaWNhdGlvbiovXG4vKiBBdCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3NzQqL1xuLyogaXMgYSByZWNvcmQgb2YgYSBmYWlsZWQgYXR0ZW1wdCB0byByZW1vdmUgdGhpcyBkdXBsaWNhdGlvbi4qL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCYXNlQXNzZXJ0XG4gKiBUaGUgYGFzc2VydGAgZnVuY3Rpb24gaXRzZWxmLlxuICpcbiAqIEBwYXJhbSB7Kn0gZmxhZyBUaGUgdHJ1dGh5L2ZhbHN5IHZhbHVlXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBbRXJyb3JDb25zdHJ1Y3Rvcl0gQW4gb3B0aW9uYWwgYWx0ZXJuYXRlIGVycm9yXG4gKiBjb25zdHJ1Y3RvciB0byB1c2UuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBmbGFnfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXNzZXJ0TWFrZUVycm9yT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlcnJvck5hbWVdXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0TWFrZUVycm9yXG4gKlxuICogVGhlIGBhc3NlcnQuZXJyb3JgIG1ldGhvZCwgcmVjb3JkaW5nIGRldGFpbHMgZm9yIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nLlxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc10gVGhlIGRldGFpbHMgb2Ygd2hhdCB3YXMgYXNzZXJ0ZWRcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHBhcmFtIHtBc3NlcnRNYWtlRXJyb3JPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRGYWlsXG4gKlxuICogVGhlIGBhc3NlcnQuZmFpbGAgbWV0aG9kLlxuICpcbiAqIEZhaWwgYW4gYXNzZXJ0aW9uLCByZWNvcmRpbmcgZnVsbCBkZXRhaWxzIHRvIHRoZSBjb25zb2xlIGFuZFxuICogcmFpc2luZyBhbiBleGNlcHRpb24gd2l0aCBhIG1lc3NhZ2UgaW4gd2hpY2ggYGRldGFpbHNgIHN1YnN0aXR1dGlvbiB2YWx1ZXNcbiAqIGhhdmUgYmVlbiBtYXNrZWQuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gKiB3aXRoIHRoZSBub2RlanMgYXNzZXJ0aW9uIGxpYnJhcnkuXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBbRXJyb3JDb25zdHJ1Y3Rvcl0gQW4gb3B0aW9uYWwgYWx0ZXJuYXRlIGVycm9yXG4gKiBjb25zdHJ1Y3RvciB0byB1c2UuXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0RXF1YWxcbiAqIFRoZSBgYXNzZXJ0LmVxdWFsYCBtZXRob2RcbiAqXG4gKiBBc3NlcnQgdGhhdCB0d28gdmFsdWVzIG11c3QgYmUgYE9iamVjdC5pc2AuXG4gKiBAcGFyYW0geyp9IGFjdHVhbCBUaGUgdmFsdWUgd2UgcmVjZWl2ZWRcbiAqIEBwYXJhbSB7Kn0gZXhwZWN0ZWQgV2hhdCB3ZSB3YW50ZWRcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIFR5cGUgYWxsIHRoZSBvdmVybG9hZHMgb2YgdGhlIGFzc2VydFR5cGVvZiBmdW5jdGlvbi4qL1xuLyogVGhlcmUgbWF5IGV2ZW50dWFsbHkgYmUgYSBiZXR0ZXIgd2F5IHRvIGRvIHRoaXMsIGJ1dCovXG4vKiB0aGVtcyB0aGUgYnJlYWtzIHdpdGggVHlwZXNjcmlwdCA0LjAuKi9cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJpZ2ludFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydiaWdpbnQnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIGJpZ2ludH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZCb29sZWFuXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2Jvb2xlYW4nfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIGJvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mRnVuY3Rpb25cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnZnVuY3Rpb24nfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIEZ1bmN0aW9ufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk51bWJlclxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydudW1iZXInfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIG51bWJlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZPYmplY3RcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnb2JqZWN0J30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBSZWNvcmQ8YW55LCBhbnk+IHwgbnVsbH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZTdHJpbmdcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnc3RyaW5nJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3ltYm9sXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N5bWJvbCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgc3ltYm9sfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZlVuZGVmaW5lZFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geyd1bmRlZmluZWQnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHVuZGVmaW5lZH1cbiAqL1xuXG4vKipcbiAqIFRoZSBgYXNzZXJ0LnR5cGVvZmAgbWV0aG9kXG4gKlxuICogQHR5cGVkZWYge0Fzc2VydFR5cGVvZkJpZ2ludCAmIEFzc2VydFR5cGVvZkJvb2xlYW4gJiBBc3NlcnRUeXBlb2ZGdW5jdGlvbiAmIEFzc2VydFR5cGVvZk51bWJlciAmIEFzc2VydFR5cGVvZk9iamVjdCAmIEFzc2VydFR5cGVvZlN0cmluZyAmIEFzc2VydFR5cGVvZlN5bWJvbCAmIEFzc2VydFR5cGVvZlVuZGVmaW5lZH0gQXNzZXJ0VHlwZW9mXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0U3RyaW5nXG4gKiBUaGUgYGFzc2VydC5zdHJpbmdgIG1ldGhvZC5cbiAqXG4gKiBgYXNzZXJ0LnN0cmluZyh2KWAgaXMgZXF1aXZhbGVudCB0byBgYXNzZXJ0LnR5cGVvZih2LCAnc3RyaW5nJylgLiBXZVxuICogc3BlY2lhbCBjYXNlIHRoaXMgb25lIGJlY2F1c2UgaXQgaXMgdGhlIG1vc3QgZnJlcXVlbnRseSB1c2VkLlxuICpcbiAqIEFzc2VydCBhbiBleHBlY3RlZCB0eXBlb2YgcmVzdWx0LlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuIFRoZSB2YWx1ZSB0byBnZXQgdGhlIHR5cGVvZlxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc10gVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN0cmluZ31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnROb3RlXG4gKiBUaGUgYGFzc2VydC5ub3RlYCBtZXRob2QuXG4gKlxuICogQW5ub3RhdGUgYW4gZXJyb3Igd2l0aCBkZXRhaWxzLCBwb3RlbnRpYWxseSB0byBiZSB1c2VkIGJ5IGFuXG4gKiBhdWdtZW50ZWQgY29uc29sZSBzdWNoIGFzIHRoZSBjYXVzYWwgY29uc29sZSBvZiBgY29uc29sZS5qc2AsIHRvXG4gKiBwcm92aWRlIGV4dHJhIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBsb2dnZWQgZXJyb3JzLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKiBAcGFyYW0ge0RldGFpbHN9IGRldGFpbHNOb3RlXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYge3t9fSBEZXRhaWxzVG9rZW5cbiAqIEEgY2FsbCB0byB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgbWFrZXMgYW5kIHJldHVybnMgYSBmcmVzaCBkZXRhaWxzXG4gKiB0b2tlbiwgd2hpY2ggaXMgYSBmcm96ZW4gZW1wdHkgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXJndW1lbnRzIG9mIHRoYXRcbiAqIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIGV4cHJlc3Npb24uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgRGV0YWlsc1Rva2VufSBEZXRhaWxzXG4gKiBFaXRoZXIgYSBwbGFpbiBzdHJpbmcsIG9yIG1hZGUgYnkgdGhlIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIHRhZy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0cmluZ2FibGVQYXlsb2FkXG4gKiBIb2xkcyB0aGUgcGF5bG9hZCBwYXNzZWQgdG8gcXVvdGUgc28gdGhhdCBpdHMgcHJpbnRlZCBmb3JtIGlzIHZpc2libGUuXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gdG9TdHJpbmcgSG93IHRvIHByaW50IHRoZSBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBUbyBcImRlY2xhc3NpZnlcIiBhbmQgcXVvdGUgYSBzdWJzdGl0dXRpb24gdmFsdWUgdXNlZCBpbiBhXG4gKiBgYGAgZGV0YWlsc2AuLi5gIGBgYCB0ZW1wbGF0ZSBsaXRlcmFsLCBlbmNsb3NlIHRoYXQgc3Vic3RpdHV0aW9uIGV4cHJlc3Npb25cbiAqIGluIGEgY2FsbCB0byBgcXVvdGVgLiBUaGlzIG1ha2VzIHRoZSB2YWx1ZSBhcHBlYXIgcXVvdGVkXG4gKiAoYXMgaWYgd2l0aCBgSlNPTi5zdHJpbmdpZnlgKSBpbiB0aGUgbWVzc2FnZSBvZiB0aGUgdGhyb3duIGVycm9yLiBUaGVcbiAqIHBheWxvYWQgaXRzZWxmIGlzIHN0aWxsIHBhc3NlZCB1bnF1b3RlZCB0byB0aGUgY29uc29sZSBhcyBpdCB3b3VsZCBiZVxuICogd2l0aG91dCBgcXVvdGVgLlxuICpcbiAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHdpbGwgcmV2ZWFsIHRoZSBleHBlY3RlZCBza3kgY29sb3IsIGJ1dCBub3QgdGhlXG4gKiBhY3R1YWwgaW5jb3JyZWN0IHNreSBjb2xvciwgaW4gdGhlIHRocm93biBlcnJvcidzIG1lc3NhZ2U6XG4gKiBgYGBqc1xuICogc2t5LmNvbG9yID09PSBleHBlY3RlZENvbG9yIHx8IEZhaWxgJHtza3kuY29sb3J9IHNob3VsZCBiZSAke3F1b3RlKGV4cGVjdGVkQ29sb3IpfWA7XG4gKiBgYGBcbiAqXG4gKiBUaGUgbm9ybWFsIGNvbnZlbnRpb24gaXMgdG8gbG9jYWxseSByZW5hbWUgYGRldGFpbHNgIHRvIGBYYCBhbmQgYHF1b3RlYCB0byBgcWBcbiAqIGxpa2UgYGNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEgfSA9IGFzc2VydDtgLCBzbyB0aGUgYWJvdmUgZXhhbXBsZSB3b3VsZCB0aGVuIGJlXG4gKiBgYGBqc1xuICogc2t5LmNvbG9yID09PSBleHBlY3RlZENvbG9yIHx8IEZhaWxgJHtza3kuY29sb3J9IHNob3VsZCBiZSAke3EoZXhwZWN0ZWRDb2xvcil9YDtcbiAqIGBgYFxuICpcbiAqIEBjYWxsYmFjayBBc3NlcnRRdW90ZVxuICogQHBhcmFtIHsqfSBwYXlsb2FkIFdoYXQgdG8gZGVjbGFzc2lmeVxuICogQHBhcmFtIHsoc3RyaW5nfG51bWJlcil9IFtzcGFjZXNdXG4gKiBAcmV0dXJucyB7U3RyaW5nYWJsZVBheWxvYWR9IFRoZSBkZWNsYXNzaWZpZWQgcGF5bG9hZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJhaXNlXG4gKlxuICogVG8gbWFrZSBhbiBgYXNzZXJ0YCB3aGljaCB0ZXJtaW5hdGVzIHNvbWUgbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb25cbiAqIGxpa2UgYSB0cmFuc2FjdGlvbiwgdmF0LCBvciBwcm9jZXNzLCBjYWxsIGBtYWtlQXNzZXJ0YCB3aXRoIGEgYFJhaXNlYFxuICogY2FsbGJhY2ssIHdoZXJlIHRoYXQgY2FsbGJhY2sgYWN0dWFsbHkgcGVyZm9ybXMgdGhhdCBsYXJnZXIgdGVybWluYXRpb24uXG4gKiBJZiBwb3NzaWJsZSwgdGhlIGNhbGxiYWNrIHNob3VsZCBhbHNvIHJlcG9ydCBpdHMgYHJlYXNvbmAgcGFyYW1ldGVyIGFzXG4gKiB0aGUgYWxsZWdlZCByZWFzb24gZm9yIHRoZSB0ZXJtaW5hdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSByZWFzb25cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlQXNzZXJ0XG4gKlxuICogTWFrZXMgYW5kIHJldHVybnMgYW4gYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0IHRoYXQgc2hhcmVzIHRoZSBib29ra2VlcGluZ1xuICogc3RhdGUgZGVmaW5lZCBieSB0aGlzIG1vZHVsZSB3aXRoIG90aGVyIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdHMgbWFkZSBieVxuICogYG1ha2VBc3NlcnRgLiBUaGlzIHN0YXRlIGlzIHBlci1tb2R1bGUtaW5zdGFuY2UgYW5kIGlzIGV4cG9zZWQgYnkgdGhlXG4gKiBgbG9nZ2VkRXJyb3JIYW5kbGVyYCBhYm92ZS4gV2UgcmVmZXIgdG8gYGFzc2VydGAgYXMgYSBcImZ1bmN0aW9uIG9iamVjdFwiXG4gKiBiZWNhdXNlIGl0IGNhbiBiZSBjYWxsZWQgZGlyZWN0bHkgYXMgYSBmdW5jdGlvbiwgYnV0IGFsc28gaGFzIG1ldGhvZHMgdGhhdFxuICogY2FuIGJlIGNhbGxlZC5cbiAqXG4gKiBJZiBgb3B0UmFpc2VgIGlzIHByb3ZpZGVkLCB0aGUgcmV0dXJuZWQgYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0IHdpbGwgY2FsbFxuICogYG9wdFJhaXNlKHJlYXNvbilgIGJlZm9yZSB0aHJvd2luZyB0aGUgZXJyb3IuIFRoaXMgZW5hYmxlcyBgb3B0UmFpc2VgIHRvXG4gKiBlbmdhZ2UgaW4gZXZlbiBtb3JlIHZpb2xlbnQgdGVybWluYXRpb24gYmVoYXZpb3IsIGxpa2UgdGVybWluYXRpbmcgdGhlIHZhdCxcbiAqIHRoYXQgcHJldmVudHMgZXhlY3V0aW9uIGZyb20gcmVhY2hpbmcgdGhlIGZvbGxvd2luZyB0aHJvdy4gSG93ZXZlciwgaWZcbiAqIGBvcHRSYWlzZWAgcmV0dXJucyBub3JtYWxseSwgd2hpY2ggd291bGQgYmUgdW51c3VhbCwgdGhlIHRocm93IGZvbGxvd2luZ1xuICogYG9wdFJhaXNlKHJlYXNvbilgIHdvdWxkIHN0aWxsIGhhcHBlbi5cbiAqXG4gKiBAcGFyYW0ge1JhaXNlfSBbb3B0UmFpc2VdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt1bnJlZGFjdGVkXVxuICogQHJldHVybnMge0Fzc2VydH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsodGVtcGxhdGU6IFRlbXBsYXRlU3RyaW5nc0FycmF5IHwgc3RyaW5nW10sIC4uLmFyZ3M6IGFueSkgPT4gRGV0YWlsc1Rva2VufSBEZXRhaWxzVGFnXG4gKlxuICogVXNlIHRoZSBgZGV0YWlsc2AgZnVuY3Rpb24gYXMgYSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0byBjcmVhdGVcbiAqIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzLiBUaGUgYXNzZXJ0aW9uIGZ1bmN0aW9ucyB0YWtlIHN1Y2ggbWVzc2FnZXNcbiAqIGFzIG9wdGlvbmFsIGFyZ3VtZW50czpcbiAqIGBgYGpzXG4gKiBhc3NlcnQoc2t5LmlzQmx1ZSgpLCBkZXRhaWxzYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgXCJibHVlXCJgKTtcbiAqIGBgYFxuICogb3IgZm9sbG93aW5nIHRoZSBub3JtYWwgY29udmVudGlvbiB0byBsb2NhbGx5IHJlbmFtZSBgZGV0YWlsc2AgdG8gYFhgXG4gKiBhbmQgYHF1b3RlYCB0byBgcWAgbGlrZSBgY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSB9ID0gYXNzZXJ0O2A6XG4gKiBgYGBqc1xuICogYXNzZXJ0KHNreS5pc0JsdWUoKSwgWGAke3NreS5jb2xvcn0gc2hvdWxkIGJlIFwiYmx1ZVwiYCk7XG4gKiBgYGBcbiAqIEhvd2V2ZXIsIG5vdGUgdGhhdCBpbiBtb3N0IGNhc2VzIGl0IGlzIHByZWZlcmFibGUgdG8gaW5zdGVhZCB1c2UgdGhlIGBGYWlsYFxuICogdGVtcGxhdGUgbGl0ZXJhbCB0YWcgKHdoaWNoIGhhcyB0aGUgc2FtZSBpbnB1dCBzaWduYXR1cmUgYXMgYGRldGFpbHNgXG4gKiBidXQgYXV0b21hdGljYWxseSBjcmVhdGVzIGFuZCB0aHJvd3MgYW4gZXJyb3IpOlxuICogYGBganNcbiAqIHNreS5pc0JsdWUoKSB8fCBGYWlsYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgXCJibHVlXCJgO1xuICogYGBgXG4gKlxuICogVGhlIGRldGFpbHMgdGVtcGxhdGUgdGFnIHJldHVybnMgYSBgRGV0YWlsc1Rva2VuYCBvYmplY3QgdGhhdCBjYW4gcHJpbnRcbiAqIGl0c2VsZiB3aXRoIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSBpbiB0d28gd2F5cy5cbiAqIEl0IHdpbGwgcmVwb3J0IGZ1bGwgZGV0YWlscyB0byB0aGUgY29uc29sZSwgYnV0XG4gKiBtYXNrIGVtYmVkZGVkIHN1YnN0aXR1dGlvbiB2YWx1ZXMgd2l0aCB0aGVpciB0eXBlb2YgaW5mb3JtYXRpb24gaW4gdGhlIHRocm93biBlcnJvclxuICogdG8gcHJldmVudCByZXZlYWxpbmcgc2VjcmV0cyB1cCB0aGUgZXhjZXB0aW9uYWwgcGF0aC4gSW4gdGhlIGV4YW1wbGVcbiAqIGFib3ZlLCB0aGUgdGhyb3duIGVycm9yIG1heSByZXZlYWwgb25seSB0aGF0IGBza3kuY29sb3JgIGlzIGEgc3RyaW5nLFxuICogd2hlcmVhcyB0aGUgc2FtZSBkaWFnbm9zdGljIHByaW50ZWQgdG8gdGhlIGNvbnNvbGUgcmV2ZWFscyB0aGF0IHRoZVxuICogc2t5IHdhcyBncmVlbi4gVGhpcyBtYXNraW5nIGNhbiBiZSBkaXNhYmxlZCBmb3IgYW4gaW5kaXZpZHVhbCBzdWJzdGl0dXRpb24gdmFsdWVcbiAqIHVzaW5nIGBxdW90ZWAuXG4gKlxuICogVGhlIGByYXdgIHByb3BlcnR5IG9mIGFuIGlucHV0IHRlbXBsYXRlIGFycmF5IGlzIGlnbm9yZWQsIHNvIGEgc2ltcGxlXG4gKiBhcnJheSBvZiBzdHJpbmdzIG1heSBiZSBwcm92aWRlZCBkaXJlY3RseS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsodGVtcGxhdGU6IFRlbXBsYXRlU3RyaW5nc0FycmF5IHwgc3RyaW5nW10sIC4uLmFyZ3M6IGFueSkgPT4gbmV2ZXJ9IEZhaWxUYWdcbiAqXG4gKiBVc2UgdGhlIGBGYWlsYCBmdW5jdGlvbiBhcyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIHRvIGVmZmljaWVudGx5XG4gKiBjcmVhdGUgYW5kIHRocm93IGEgYGRldGFpbHNgLXN0eWxlIGVycm9yIG9ubHkgd2hlbiBhIGNvbmRpdGlvbiBpcyBub3Qgc2F0aXNmaWVkLlxuICogYGBganNcbiAqIGNvbmRpdGlvbiB8fCBGYWlsYC4uLmNvbXBsYWludC4uLmA7XG4gKiBgYGBcbiAqIFRoaXMgYXZvaWRzIHRoZSBvdmVyaGVhZCBvZiBjcmVhdGluZyB1c3VhbGx5LXVubmVjZXNzYXJ5IGVycm9ycyBsaWtlXG4gKiBgYGBqc1xuICogYXNzZXJ0KGNvbmRpdGlvbiwgZGV0YWlsc2AuLi5jb21wbGFpbnQuLi5gKTtcbiAqIGBgYFxuICogd2hpbGUgaW1wcm92aW5nIHJlYWRhYmlsaXR5IG92ZXIgYWx0ZXJuYXRpdmVzIGxpa2VcbiAqIGBgYGpzXG4gKiBjb25kaXRpb24gfHwgYXNzZXJ0LmZhaWwoZGV0YWlsc2AuLi5jb21wbGFpbnQuLi5gKTtcbiAqIGBgYFxuICpcbiAqIEhvd2V2ZXIsIGR1ZSB0byBjdXJyZW50IHdlYWtuZXNzIGluIFR5cGVTY3JpcHQsIHN0YXRpYyByZWFzb25pbmdcbiAqIGlzIGxlc3MgcG93ZXJmdWwgd2l0aCB0aGUgYHx8YCBwYXR0ZXJucyB0aGFuIHdpdGggYW4gYGFzc2VydGAgY2FsbC5cbiAqIFVudGlsL3VubGVzcyBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUxNDI2IGlzIGZpeGVkLFxuICogZm9yIGB8fGAtc3R5bGUgYXNzZXJ0aW9ucyB3aGVyZSB0aGlzIGxvc3Mgb2Ygc3RhdGljIHJlYXNvbmluZyBpcyBhIHByb2JsZW0sXG4gKiBpbnN0ZWFkIGV4cHJlc3MgdGhlIGFzc2VydGlvbiBhc1xuICogYGBganNcbiAqICAgaWYgKCFjb25kaXRpb24pIHtcbiAqICAgICBGYWlsYC4uLmNvbXBsYWludC4uLmA7XG4gKiAgIH1cbiAqIGBgYFxuICogb3IsIGlmIG5lZWRlZCxcbiAqIGBgYGpzXG4gKiAgIGlmICghY29uZGl0aW9uKSB7XG4gKiAgICAgLy8gYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MsIGJ1dCBpdCBpbXByb3ZlcyBzdGF0aWMgYW5hbHlzaXNcbiAqICAgICB0aHJvdyBGYWlsYC4uLmNvbXBsYWludC4uLmA7XG4gKiAgIH1cbiAqIGBgYFxuICovXG5cbi8qKlxuICogYXNzZXJ0IHRoYXQgZXhwciBpcyB0cnV0aHksIHdpdGggYW4gb3B0aW9uYWwgZGV0YWlscyB0byBkZXNjcmliZVxuICogdGhlIGFzc2VydGlvbi4gSXQgaXMgYSB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbCBsaWtlXG4gKiBgYGBqc1xuICogYXNzZXJ0KGV4cHIsIGRldGFpbHNgLi4uLmApO2BcbiAqIGBgYFxuICpcbiAqIFRoZSBsaXRlcmFsIHBvcnRpb25zIG9mIHRoZSB0ZW1wbGF0ZSBhcmUgYXNzdW1lZCBub24tc2Vuc2l0aXZlLCBhc1xuICogYXJlIHRoZSBgdHlwZW9mYCB0eXBlcyBvZiB0aGUgc3Vic3RpdHV0aW9uIHZhbHVlcy4gVGhlc2UgYXJlXG4gKiBhc3NlbWJsZWQgaW50byB0aGUgdGhyb3duIGVycm9yIG1lc3NhZ2UuIFRoZSBhY3R1YWwgY29udGVudHMgb2YgdGhlXG4gKiBzdWJzdGl0dXRpb24gdmFsdWVzIGFyZSBhc3N1bWVkIHNlbnNpdGl2ZSwgdG8gYmUgcmV2ZWFsZWQgdG9cbiAqIHRoZSBjb25zb2xlIG9ubHkuIFdlIGFzc3VtZSBvbmx5IHRoZSB2aXJ0dWFsIHBsYXRmb3JtJ3Mgb3duZXIgY2FuIHJlYWRcbiAqIHdoYXQgaXMgd3JpdHRlbiB0byB0aGUgY29uc29sZSwgd2hlcmUgdGhlIG93bmVyIGlzIGluIGEgcHJpdmlsZWdlZFxuICogcG9zaXRpb24gb3ZlciBjb21wdXRhdGlvbiBydW5uaW5nIG9uIHRoYXQgcGxhdGZvcm0uXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gKiB3aXRoIHRoZSBub2RlanMgYXNzZXJ0aW9uIGxpYnJhcnkuXG4gKlxuICogQHR5cGVkZWYgeyBCYXNlQXNzZXJ0ICYge1xuICogICB0eXBlb2Y6IEFzc2VydFR5cGVvZixcbiAqICAgZXJyb3I6IEFzc2VydE1ha2VFcnJvcixcbiAqICAgZmFpbDogQXNzZXJ0RmFpbCxcbiAqICAgZXF1YWw6IEFzc2VydEVxdWFsLFxuICogICBzdHJpbmc6IEFzc2VydFN0cmluZyxcbiAqICAgbm90ZTogQXNzZXJ0Tm90ZSxcbiAqICAgZGV0YWlsczogRGV0YWlsc1RhZyxcbiAqICAgRmFpbDogRmFpbFRhZyxcbiAqICAgcXVvdGU6IEFzc2VydFF1b3RlLFxuICogICBtYWtlQXNzZXJ0OiBNYWtlQXNzZXJ0LFxuICogfSB9IEFzc2VydFxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFP1hb9GNwAARjcAACYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50TWF0aC5qc3siaW1wb3J0cyI6WyIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIkFtb3VudE1hdGgiLCJBc3NldEtpbmQiLCJhc3NlcnRBc3NldEtpbmQiLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiLCJnZXRBc3NldEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0UmVtb3RhYmxlLGFzc2VydFJlY29yZCxNLG1hdGNoZXMsbmF0TWF0aEhlbHBlcnMsc2V0TWF0aEhlbHBlcnMsY29weVNldE1hdGhIZWxwZXJzLGNvcHlCYWdNYXRoSGVscGVyczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlbW90YWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVtb3RhYmxlID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNcIiwgW1tcIm5hdE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChuYXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJzZXRNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAoc2V0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlTZXRNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAoY29weVNldE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5QmFnTWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKGNvcHlCYWdNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBDb25zdGFudHMgZm9yIHRoZSBraW5kcyBvZiBhc3NldHMgd2Ugc3VwcG9ydC5cbiAqXG4gKiBAdHlwZSB7eyBOQVQ6ICduYXQnLCBTRVQ6ICdzZXQnLCBDT1BZX1NFVDogJ2NvcHlTZXQnLCBDT1BZX0JBRzogJ2NvcHlCYWcnIH19XG4gKi9cbmNvbnN0IEFzc2V0S2luZD1oYXJkZW4oe1xuTkFUOiduYXQnLFxuU0VUOidzZXQnLFxuQ09QWV9TRVQ6J2NvcHlTZXQnLFxuQ09QWV9CQUc6J2NvcHlCYWcnfSk7JGjigI1fb25jZS5Bc3NldEtpbmQoQXNzZXRLaW5kKTtcblxuY29uc3QgYXNzZXRLaW5kTmFtZXM9aGFyZGVuKE9iamVjdC52YWx1ZXMoQXNzZXRLaW5kKS5zb3J0KCkpO1xuXG4vKipcbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhbGxlZ2VkQUtcbiAqL1xuY29uc3QgYXNzZXJ0QXNzZXRLaW5kPShhbGxlZ2VkQUspPT57XG5hc3NldEtpbmROYW1lcy5pbmNsdWRlcyhhbGxlZ2VkQUspfHxcbkZhaWwgYFRoZSBhc3NldEtpbmQgJHthbGxlZ2VkQUt9IG11c3QgYmUgb25lIG9mICR7cShhc3NldEtpbmROYW1lcyl9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0QXNzZXRLaW5kKGFzc2VydEFzc2V0S2luZCk7XG5oYXJkZW4oYXNzZXJ0QXNzZXRLaW5kKTtcblxuLyoqXG4gKiBBbW91bnRzIGRlc2NyaWJlIGRpZ2l0YWwgYXNzZXRzLiBGcm9tIGFuIGFtb3VudCwgeW91IGNhbiBsZWFybiB0aGVcbiAqIGJyYW5kIG9mIGRpZ2l0YWwgYXNzZXQgYXMgd2VsbCBhcyBcImhvdyBtdWNoXCIgb3IgXCJob3cgbWFueVwiLiBBbW91bnRzXG4gKiBoYXZlIHR3byBwYXJ0czogYSBicmFuZCAobG9vc2VseSBzcGVha2luZywgdGhlIHR5cGUgb2YgZGlnaXRhbFxuICogYXNzZXQpIGFuZCB0aGUgdmFsdWUgKHRoZSBhbnN3ZXIgdG8gXCJob3cgbXVjaFwiKS4gRm9yIGV4YW1wbGUsIGluXG4gKiB0aGUgcGhyYXNlIFwiNSBidWNrc1wiLCBcImJ1Y2tzXCIgdGFrZXMgdGhlIHJvbGUgb2YgdGhlIGJyYW5kIGFuZCB0aGVcbiAqIHZhbHVlIGlzIDUuIEFtb3VudHMgY2FuIGRlc2NyaWJlIGZ1bmdpYmxlIGFuZCBub24tZnVuZ2libGUgZGlnaXRhbFxuICogYXNzZXRzLiBBbW91bnRzIGFyZSBwYXNzLWJ5LWNvcHkgYW5kIGNhbiBiZSBtYWRlIGJ5IGFuZCBzZW50IHRvXG4gKiBhbnlvbmUuXG4gKlxuICogVGhlIGlzc3VlciBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzb3VyY2Ugb2YgdGhlIGFtb3VudCBpbiBwYXltZW50c1xuICogYW5kIHB1cnNlcy4gVGhlIGlzc3VlciBtdXN0IGJlIGFibGUgdG8gZG8gdGhpbmdzIHN1Y2ggYXMgYWRkXG4gKiBkaWdpdGFsIGFzc2V0cyB0byBhIHB1cnNlIGFuZCB3aXRoZHJhdyBkaWdpdGFsIGFzc2V0cyBmcm9tIGEgcHVyc2UuXG4gKiBUbyBkbyBzbywgaXQgbXVzdCBrbm93IGhvdyB0byBhZGQgYW5kIHN1YnRyYWN0IGRpZ2l0YWwgYXNzZXRzLlxuICogUmF0aGVyIHRoYW4gaGFyZC1jb2RpbmcgYSBwYXJ0aWN1bGFyIHNvbHV0aW9uLCB3ZSBjaG9zZSB0b1xuICogcGFyYW1ldGVyaXplIHRoZSBpc3N1ZXIgd2l0aCBhIGNvbGxlY3Rpb24gb2YgcG9seW1vcnBoaWMgZnVuY3Rpb25zLFxuICogd2hpY2ggd2UgY2FsbCBgQW1vdW50TWF0aGAuIFRoZXNlIG1hdGggZnVuY3Rpb25zIGluY2x1ZGUgY29uY2VwdHNcbiAqIGxpa2UgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBhbmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvLlxuICpcbiAqIFdlIGFsc28gd2FudCB0byBtYWtlIHN1cmUgdGhlcmUgaXMgbm8gY29uZnVzaW9uIGFzIHRvIHdoYXQga2luZCBvZlxuICogYXNzZXQgd2UgYXJlIHVzaW5nLiBUaHVzLCBBbW91bnRNYXRoIGluY2x1ZGVzIGNoZWNrcyBvZiB0aGVcbiAqIGBicmFuZGAsIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldC4gSWZcbiAqIHRoZSB3cm9uZyBicmFuZCBpcyB1c2VkIGluIEFtb3VudE1hdGgsIGFuIGVycm9yIGlzIHRocm93biBhbmQgdGhlXG4gKiBvcGVyYXRpb24gZG9lcyBub3Qgc3VjY2VlZC5cbiAqXG4gKiBBbW91bnRNYXRoIHVzZXMgbWF0aEhlbHBlcnMgdG8gZG8gbW9zdCBvZiB0aGUgd29yaywgYnV0IHRoZW4gYWRkc1xuICogdGhlIGJyYW5kIHRvIHRoZSByZXN1bHQuIFRoZSBmdW5jdGlvbiBgdmFsdWVgIGdldHMgdGhlIHZhbHVlIGZyb21cbiAqIHRoZSBhbW91bnQgYnkgcmVtb3ZpbmcgdGhlIGJyYW5kIChhbW91bnQgLT4gdmFsdWUpLCBhbmQgdGhlXG4gKiBmdW5jdGlvbiBgbWFrZWAgYWRkcyB0aGUgYnJhbmQgdG8gcHJvZHVjZSBhbiBhbW91bnQgKHZhbHVlIC0+XG4gKiBhbW91bnQpLiBUaGUgZnVuY3Rpb24gYGNvZXJjZWAgdGFrZXMgYW4gYW1vdW50IGFuZCBjaGVja3MgaXQsXG4gKiByZXR1cm5pbmcgYW4gYW1vdW50IChhbW91bnQgLT4gYW1vdW50KS5cbiAqXG4gKiBFYWNoIGlzc3VlciBvZiBkaWdpdGFsIGFzc2V0cyBoYXMgYW4gYXNzb2NpYXRlZCBicmFuZCBpbiBhXG4gKiBvbmUtdG8tb25lIG1hcHBpbmcuIEluIHVudHJ1c3RlZCBjb250ZXh0cywgc3VjaCBhcyBpbiBhbmFseXppbmdcbiAqIHBheW1lbnRzIGFuZCBhbW91bnRzLCB3ZSBjYW4gZ2V0IHRoZSBicmFuZCBhbmQgZmluZCB0aGUgaXNzdWVyXG4gKiB3aGljaCBtYXRjaGVzIHRoZSBicmFuZC4gVGhlIGlzc3VlciBhbmQgdGhlIGJyYW5kIG11dHVhbGx5IHZhbGlkYXRlXG4gKiBlYWNoIG90aGVyLlxuICovXG5cbmNvbnN0IGhlbHBlcnM9e1xubmF0Om5hdE1hdGhIZWxwZXJzLFxuc2V0OnNldE1hdGhIZWxwZXJzLFxuY29weVNldDpjb3B5U2V0TWF0aEhlbHBlcnMsXG5jb3B5QmFnOmNvcHlCYWdNYXRoSGVscGVyc307XG5cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAdHlwZSB7KHZhbHVlOiBWKSA9PiBBc3NldEtpbmRGb3JWYWx1ZTxWPn1cbiAqL1xuY29uc3QgYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQ9KHZhbHVlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbHVlKTtcbmlmKHBhc3NTdHlsZT09PSdiaWdpbnQnKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nbmF0JztcbiB9XG5pZihwYXNzU3R5bGU9PT0nY29weUFycmF5Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ3NldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLnNldCgpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlTZXQnO1xuIH1cbmlmKG1hdGNoZXModmFsdWUsTS5iYWcoKSkpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybidjb3B5QmFnJztcbiB9XG4vKiBUT0RPIFRoaXMgaXNuJ3QgcXVpdGUgdGhlIHJpZ2h0IGVycm9yIG1lc3NhZ2UsIGluIGNhc2UgdmFsdWVQYXNzU3R5bGUqL1xuLyogaXMgJ3RhZ2dlZCcuIFdlIHdvdWxkIG5lZWQgdG8gZGlzdGluZ3Vpc2ggd2hhdCBraW5kIG9mIHRhZ2dlZCovXG4vKiBvYmplY3QgaXQgaXMuKi9cbi8qIEFsc28sIHRoaXMga2luZCBvZiBtYW51YWwgbGlzdGluZyBpcyBhIG1haW50ZW5hbmNlIGhhemFyZCB3ZSovXG4vKiAoVE9ETykgd2lsbCBlbmNvdW50ZXIgd2hlbiB3ZSBleHRlbmQgdGhlIG1hdGggaGVscGVycyBmdXJ0aGVyLiovXG50aHJvdyBGYWlsIGB2YWx1ZSAke3ZhbHVlfSBtdXN0IGJlIGEgYmlnaW50LCBjb3B5U2V0LCBjb3B5QmFnLCBvciBhbiBhcnJheSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9O1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCB2YWx1ZSBpcyBhIHZhbGlkIEFtb3VudE1hdGggYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGhlbHBlcnMuXG4gKlxuICogTWFkZSBhdmFpbGFibGUgb25seSBmb3IgdGVzdGluZywgYnV0IGl0IGlzIGhhcm1sZXNzIGZvciBvdGhlciB1c2VzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczxWPn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFZhbHVlR2V0SGVscGVycz0odmFsdWUpPT5cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5oZWxwZXJzW2Fzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKV07XG5cbi8qKiBAdHlwZSB7KGFsbGVnZWRCcmFuZDogQnJhbmQsIGJyYW5kPzogQnJhbmQpID0+IHZvaWR9ICovJGjigI1fb25jZS5hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKTtcbmNvbnN0IG9wdGlvbmFsQnJhbmRDaGVjaz0oYWxsZWdlZEJyYW5kLGJyYW5kKT0+e1xuaWYoYnJhbmQhPT11bmRlZmluZWQpe1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYWxsZWdlZEJyYW5kPT09YnJhbmR8fFxuRmFpbCBgYW1vdW50J3MgYnJhbmQgJHtxKGFsbGVnZWRCcmFuZCl9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfWA7XG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz4gfCB1bmRlZmluZWR9IGJyYW5kXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8Kj59XG4gKi9cbmNvbnN0IGNoZWNrTFJBbmRHZXRIZWxwZXJzPShsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmFzc2VydFJlY29yZChsZWZ0QW1vdW50LCdsZWZ0QW1vdW50Jyk7XG5hc3NlcnRSZWNvcmQocmlnaHRBbW91bnQsJ3JpZ2h0QW1vdW50Jyk7XG5jb25zdHt2YWx1ZTpsZWZ0VmFsdWUsYnJhbmQ6bGVmdEJyYW5kfT1sZWZ0QW1vdW50O1xuY29uc3R7dmFsdWU6cmlnaHRWYWx1ZSxicmFuZDpyaWdodEJyYW5kfT1yaWdodEFtb3VudDtcbmFzc2VydFJlbW90YWJsZShsZWZ0QnJhbmQsJ2xlZnRCcmFuZCcpO1xuYXNzZXJ0UmVtb3RhYmxlKHJpZ2h0QnJhbmQsJ3JpZ2h0QnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhsZWZ0QnJhbmQsYnJhbmQpO1xub3B0aW9uYWxCcmFuZENoZWNrKHJpZ2h0QnJhbmQsYnJhbmQpO1xubGVmdEJyYW5kPT09cmlnaHRCcmFuZHx8XG5GYWlsIGBCcmFuZHMgaW4gbGVmdCAke3EobGVmdEJyYW5kKX0gYW5kIHJpZ2h0ICR7cShcbnJpZ2h0QnJhbmQpXG4gfSBzaG91bGQgbWF0Y2ggYnV0IGRvIG5vdGA7XG5jb25zdCBsZWZ0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMobGVmdFZhbHVlKTtcbmNvbnN0IHJpZ2h0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMocmlnaHRWYWx1ZSk7XG5sZWZ0SGVscGVycz09PXJpZ2h0SGVscGVyc3x8XG5GYWlsIGBUaGUgbGVmdCAke2xlZnRBbW91bnR9IGFuZCByaWdodCBhbW91bnQgJHtyaWdodEFtb3VudH0gaGFkIGRpZmZlcmVudCBhc3NldEtpbmRzYDtcbnJldHVybiBsZWZ0SGVscGVycztcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge01hdGhIZWxwZXJzPEFzc2V0VmFsdWVGb3JLaW5kPEs+Pn0gaFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHJldHVybnMge1tLLCBLXX1cbiAqL1xuY29uc3QgY29lcmNlTFI9KGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgYXJiaXRyYXJ5IHN1YnR5cGUqL1xucmV0dXJuW2guZG9Db2VyY2UobGVmdEFtb3VudC52YWx1ZSksaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGVcbiAqIHJpZ2h0QW1vdW50LiBUaGUgbm90aW9uIG9mIFwiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXCIgZGVwZW5kc1xuICogb24gdGhlIGtpbmQgb2YgYW1vdW50LCBhcyBkZWZpbmVkIGJ5IHRoZSBNYXRoSGVscGVycy4gRm9yIGV4YW1wbGUsXG4gKiB3aGV0aGVyIHJlY3RhbmdsZSBBIGlzIGdyZWF0ZXIgdGhhbiByZWN0YW5nbGUgQiBkZXBlbmRzIG9uIHdoZXRoZXIgcmVjdGFuZ2xlXG4gKiBBIGluY2x1ZGVzIHJlY3RhbmdsZSBCIGFzIGRlZmluZWQgYnkgdGhlIGxvZ2ljIGluIE1hdGhIZWxwZXJzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNHVEU9KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbnJldHVybiBoLmRvSXNHVEUoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG4gfTtcblxuLyoqXG4gKiBMb2dpYyBmb3IgbWFuaXB1bGF0aW5nIGFtb3VudHMuXG4gKlxuICogQW1vdW50cyBhcmUgdGhlIGNhbm9uaWNhbCBkZXNjcmlwdGlvbiBvZiB0cmFkYWJsZSBnb29kcy4gVGhleSBhcmUgbWFuaXB1bGF0ZWRcbiAqIGJ5IGlzc3VlcnMgYW5kIG1pbnRzLCBhbmQgcmVwcmVzZW50IHRoZSBnb29kcyBhbmQgY3VycmVuY3kgY2FycmllZCBieSBwdXJzZXNcbiAqIGFuZFxuICogcGF5bWVudHMuIFRoZXkgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoaW5ncyBsaWtlIGN1cnJlbmN5LCBzdG9jaywgYW5kIHRoZVxuICogYWJzdHJhY3QgcmlnaHQgdG8gcGFydGljaXBhdGUgaW4gYSBwYXJ0aWN1bGFyIGV4Y2hhbmdlLlxuICovXG5jb25zdCBBbW91bnRNYXRoPXtcbi8qKlxuICogTWFrZSBhbiBhbW91bnQgZnJvbSBhIHZhbHVlIGJ5IGFkZGluZyB0aGUgYnJhbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fSBhbGxlZ2VkVmFsdWVcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbi8qIGFsbGVnZWRWYWx1ZSBoYXMgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGZvciB0eXBlIHdpZGVuaW5nLCB0byBwcmV2ZW50IFYgYmVpbmcgYm91bmQgdG8gYSBhIGxpdGVyYWwgbGlrZSAxbiovXG5tYWtlOihicmFuZCxhbGxlZ2VkVmFsdWUpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5jb25zdCBoPWFzc2VydFZhbHVlR2V0SGVscGVycyhhbGxlZ2VkVmFsdWUpO1xuY29uc3QgdmFsdWU9aC5kb0NvZXJjZShhbGxlZ2VkVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBNYWtlIHN1cmUgdGhpcyBhbW91bnQgaXMgdmFsaWQgZW5vdWdoLCBhbmQgcmV0dXJuIGEgY29ycmVzcG9uZGluZ1xuICogdmFsaWQgYW1vdW50IGlmIHNvLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFsbGVnZWRBbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbmNvZXJjZTooYnJhbmQsYWxsZWdlZEFtb3VudCk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydFJlY29yZChhbGxlZ2VkQW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZTphbGxlZ2VkVmFsdWV9PWFsbGVnZWRBbW91bnQ7XG5icmFuZD09PWFsbGVnZWRCcmFuZHx8XG5GYWlsIGBUaGUgYnJhbmQgaW4gdGhlIGFsbGVnZWRBbW91bnQgJHthbGxlZ2VkQW1vdW50fSBpbiAnY29lcmNlJyBkaWRuJ3QgbWF0Y2ggdGhlIHNwZWNpZmllZCBicmFuZCAke2JyYW5kfS5gO1xuLyogV2lsbCB0aHJvdyBvbiBpbmFwcHJvcHJpYXRlIHZhbHVlKi9cbnJldHVybiBBbW91bnRNYXRoLm1ha2UoYnJhbmQsYWxsZWdlZFZhbHVlKTtcbiB9LFxuLyoqXG4gKiBFeHRyYWN0IGFuZCByZXR1cm4gdGhlIHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFtb3VudFxuICogQHJldHVybnMge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fVxuICovXG5nZXRWYWx1ZTooYnJhbmQsYW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYW1vdW50KS52YWx1ZSxcbi8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudC4gVGhpcyBpcyB0aGVcbiAqIGlkZW50aXR5IGVsZW1lbnQgZm9yIE1hdGhIZWxwZXJzLmFkZCBhbmQgTWF0SGVscGVycy5zdWJ0cmFjdC5cbiAqXG4gKiBAdHlwZSB7e1xuICogICAoYnJhbmQ6IEJyYW5kKTogQW1vdW50PCduYXQnPjtcbiAqICAgPEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGJyYW5kOiBCcmFuZCwgYXNzZXRLaW5kOiBLKTogQW1vdW50PEs+O1xuICogfX1cbiAqL1xubWFrZUVtcHR5OihicmFuZCxhc3NldEtpbmQ9LyoqIEB0eXBlIHtjb25zdH0gKi8nbmF0Jyk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuY29uc3QgdmFsdWU9aGVscGVyc1thc3NldEtpbmRdLmRvTWFrZUVtcHR5KCk7XG5yZXR1cm4gaGFyZGVuKHticmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQsIHVzaW5nIGFub3RoZXJcbiAqIGFtb3VudCBhcyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBicmFuZCBhbmQgYXNzZXRLaW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5tYWtlRW1wdHlGcm9tQW1vdW50OihhbW91bnQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kLHZhbHVlfT1hbW91bnQ7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuY29uc3QgYXNzZXRLaW5kPWFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCAoaWdub3JlIGIvYyBlcnJvcmluZyBpbiBDSSBidXQgbm90IG15IElERSkqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIEFtb3VudCBpcyBlbXB0eS4gT3RoZXJ3aXNlIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0VtcHR5OihhbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZDphbGxlZ2VkQnJhbmQsdmFsdWV9PWFtb3VudDtcbmFzc2VydFJlbW90YWJsZShhbGxlZ2VkQnJhbmQsJ2JyYW5kJyk7XG5vcHRpb25hbEJyYW5kQ2hlY2soYWxsZWdlZEJyYW5kLGJyYW5kKTtcbmNvbnN0IGg9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHZhbHVlKTtcbnJldHVybiBoLmRvSXNFbXB0eShoLmRvQ29lcmNlKHZhbHVlKSk7XG4gfSxcbmlzR1RFLFxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgZXF1YWxzIHRoZSByaWdodEFtb3VudC4gV2UgYXNzdW1lXG4gKiB0aGF0IGlmIGlzR1RFIGlzIHRydWUgaW4gYm90aCBkaXJlY3Rpb25zLCBpc0VxdWFsIGlzIGFsc28gdHJ1ZVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuaXNFcXVhbDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0VxdWFsKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuIH0sXG4vKipcbiAqIFJldHVybnMgYSBuZXcgYW1vdW50IHRoYXQgaXMgdGhlIHVuaW9uIG9mIGJvdGggbGVmdEFtb3VudCBhbmQgcmlnaHRBbW91bnQuXG4gKlxuICogRm9yIGZ1bmdpYmxlIGFtb3VudCB0aGlzIG1lYW5zIGFkZGluZyB0aGUgdmFsdWVzLiBGb3Igb3RoZXIga2luZHMgb2ZcbiAqIGFtb3VudCwgaXQgdXN1YWxseSBtZWFucyBpbmNsdWRpbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIGJvdGhcbiAqIGxlZnQgYW5kIHJpZ2h0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5hZGQ6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbmNvbnN0IHZhbHVlPWguZG9BZGQoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZDpsZWZ0QW1vdW50LmJyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgbGVmdEFtb3VudCBtaW51cyB0aGUgcmlnaHRBbW91bnRcbiAqIChpLmUuIGV2ZXJ5dGhpbmcgaW4gdGhlIGxlZnRBbW91bnQgdGhhdCBpcyBub3QgaW4gdGhlXG4gKiByaWdodEFtb3VudCkuIElmIGxlZnRBbW91bnQgZG9lc24ndCBpbmNsdWRlIHJpZ2h0QW1vdW50XG4gKiAoc3VidHJhY3Rpb24gcmVzdWx0cyBpbiBhIG5lZ2F0aXZlKSwgdGhyb3cgIGFuIGVycm9yLiBCZWNhdXNlIHRoZVxuICogbGVmdCBhbW91bnQgbXVzdCBpbmNsdWRlIHRoZSByaWdodCBhbW91bnQsIHRoaXMgaXMgTk9UIGVxdWl2YWxlbnRcbiAqIHRvIHNldCBzdWJ0cmFjdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuc3VidHJhY3Q6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbmNvbnN0IHZhbHVlPWguZG9TdWJ0cmFjdCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW4gdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB4XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geVxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xubWluOih4LHksYnJhbmQ9dW5kZWZpbmVkKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xuaXNHVEUoeCx5LGJyYW5kKT9cbnk6XG5pc0dURSh5LHgsYnJhbmQpP1xueDpcbkZhaWwgYCR7eH0gYW5kICR7eX0gYXJlIGluY29tcGFyYWJsZWAsXG4vKipcbiAqIFJldHVybnMgdGhlIG1heCB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5tYXg6KHgseSxicmFuZD11bmRlZmluZWQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5pc0dURSh4LHksYnJhbmQpP1xueDpcbmlzR1RFKHkseCk/XG55OlxuRmFpbCBgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYH07JGjigI1fb25jZS5BbW91bnRNYXRoKEFtb3VudE1hdGgpO1xuXG5oYXJkZW4oQW1vdW50TWF0aCk7XG5cbi8qKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICovXG5jb25zdCBnZXRBc3NldEtpbmQ9KGFtb3VudCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7dmFsdWV9PWFtb3VudDtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCAoaWdub3JlIGIvYyBlcnJvcmluZyBpbiBDSSBidXQgbm90IG15IElERSkqL1xucmV0dXJuIGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbiB9OyRo4oCNX29uY2UuZ2V0QXNzZXRLaW5kKGdldEFzc2V0S2luZCk7XG5oYXJkZW4oZ2V0QXNzZXRLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJBc3NldEtpbmQiOlsiQXNzZXRLaW5kIl0sImFzc2VydEFzc2V0S2luZCI6WyJhc3NlcnRBc3NldEtpbmQiXSwiQW1vdW50TWF0aCI6WyJBbW91bnRNYXRoIl0sImdldEFzc2V0S2luZCI6WyJnZXRBc3NldEtpbmQiXSwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIjpbImFzc2VydFZhbHVlR2V0SGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABKlADt1QUAANUFAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Rpc3BsYXlJbmZvLmpzeyJpbXBvcnRzIjpbIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvZXJjZURpc3BsYXlJbmZvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhaWwsbXVzdE1hdGNoLERpc3BsYXlJbmZvU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJEaXNwbGF5SW5mb1NoYXBlXCIsIFskaOKAjV9hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKipcbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBhbGxlZ2VkRGlzcGxheUluZm9cbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEByZXR1cm5zIHtEaXNwbGF5SW5mb31cbiAqL1xuY29uc3QgICAgICAgIGNvZXJjZURpc3BsYXlJbmZvPShhbGxlZ2VkRGlzcGxheUluZm8sYXNzZXRLaW5kKT0+e1xubXVzdE1hdGNoKGFsbGVnZWREaXNwbGF5SW5mbyxEaXNwbGF5SW5mb1NoYXBlLCdkaXNwbGF5SW5mbycpO1xuXG5pZihhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kIT09dW5kZWZpbmVkKXtcbmFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQ9PT1hc3NldEtpbmR8fFxuRmFpbCBgZGlzcGxheUluZm8uYXNzZXRLaW5kIHdhcyBwcmVzZW50ICgke2FsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmR9KSBhbmQgZGlkIG5vdCBtYXRjaCB0aGUgYXNzZXRLaW5kIGFyZ3VtZW50ICgke2Fzc2V0S2luZH0pYDtcbiB9XG5jb25zdCBkaXNwbGF5SW5mbz1oYXJkZW4oey4uLmFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmR9KTtcblxuaWYoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyE9PXVuZGVmaW5lZCl7XG5OdW1iZXIuaXNTYWZlSW50ZWdlcihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzKXx8XG5GYWlsIGBkZWNpbWFsUGxhY2VzICR7ZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlc30gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYDtcbiB9XG5cbnJldHVybiBkaXNwbGF5SW5mbztcbiB9OyRo4oCNX29uY2UuY29lcmNlRGlzcGxheUluZm8oY29lcmNlRGlzcGxheUluZm8pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvZXJjZURpc3BsYXlJbmZvIjpbImNvZXJjZURpc3BsYXlJbmZvIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEMwe9zoAQAA6AEAACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vYW1vdW50TWF0aC5qc1wiLCBbXV0sW1wiLi9pc3N1ZXJLaXQuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANV3BKJggAACYIAAAJQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pc3N1ZXJLaXQuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9kaXNwbGF5SW5mby5qcyIsIi4vcGF5bWVudExlZGdlci5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJoYXNJc3N1ZXIiLCJtYWtlRHVyYWJsZUlzc3VlcktpdCIsIm1ha2VJc3N1ZXJLaXQiLCJwcmVwYXJlSXNzdWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxhc3NlcnRQYXR0ZXJuLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxBc3NldEtpbmQsYXNzZXJ0QXNzZXRLaW5kLGNvZXJjZURpc3BsYXlJbmZvLHByZXBhcmVQYXltZW50TGVkZ2VyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmQgPSAkaOKAjV9hKV1dLFtcImFzc2VydEFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QXNzZXRLaW5kID0gJGjigI1fYSldXV1dLFtcIi4vZGlzcGxheUluZm8uanNcIiwgW1tcImNvZXJjZURpc3BsYXlJbmZvXCIsIFskaOKAjV9hID0+IChjb2VyY2VEaXNwbGF5SW5mbyA9ICRo4oCNX2EpXV1dXSxbXCIuL3BheW1lbnRMZWRnZXIuanNcIiwgW1tcInByZXBhcmVQYXltZW50TGVkZ2VyXCIsIFskaOKAjV9hID0+IChwcmVwYXJlUGF5bWVudExlZGdlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge0t9IGFzc2V0S2luZFxuICogQHByb3BlcnR5IHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGRpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7SXNzdWVyUmVjb3JkPEs+fSBpc3N1ZXJSZWNvcmRcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0IHNldHVwSXNzdWVyS2l0PShcbntuYW1lLGFzc2V0S2luZCxkaXNwbGF5SW5mbyxlbGVtZW50U2hhcGV9LFxuaXNzdWVyQmFnZ2FnZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkKT0+XG57XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5cbi8qIEFkZCBhc3NldEtpbmQgdG8gZGlzcGxheUluZm8sIG9yIG92ZXJyaWRlIGlmIHByZXNlbnQqL1xuY29uc3QgY2xlYW5EaXNwbGF5SW5mbz1jb2VyY2VEaXNwbGF5SW5mbyhkaXNwbGF5SW5mbyxhc3NldEtpbmQpO1xuaWYob3B0U2h1dGRvd25XaXRoRmFpbHVyZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKG9wdFNodXRkb3duV2l0aEZhaWx1cmUsJ2Z1bmN0aW9uJyk7XG4gfVxuXG5pZihlbGVtZW50U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihlbGVtZW50U2hhcGUpO1xuIH1cblxuLyogQXR0ZW51YXRlIHRoZSBwb3dlcmZ1bCBhdXRob3JpdHkgdG8gbWludCBhbmQgY2hhbmdlIGJhbGFuY2VzKi9cbi8qKiBAdHlwZSB7UGF5bWVudExlZGdlcjxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmNvbnN0e2lzc3VlcixtaW50LGJyYW5kLG1pbnRSZWNvdmVyeVB1cnNlfT1wcmVwYXJlUGF5bWVudExlZGdlcihcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuY2xlYW5EaXNwbGF5SW5mbyxcbmVsZW1lbnRTaGFwZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUpO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYnJhbmQsXG5pc3N1ZXIsXG5taW50LFxubWludFJlY292ZXJ5UHVyc2UsXG5kaXNwbGF5SW5mbzpjbGVhbkRpc3BsYXlJbmZvfSk7XG5cbiB9O1xuaGFyZGVuKHNldHVwSXNzdWVyS2l0KTtcblxuLyoqIFRoZSBrZXkgYXQgd2hpY2ggdGhlIGlzc3VlciByZWNvcmQgaXMgc3RvcmVkLiAqL1xuY29uc3QgSU5TVEFOQ0VfS0VZPSdpc3N1ZXInO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbmNvbnN0IGlzc3VlclJlY29yZD1pc3N1ZXJCYWdnYWdlLmdldChJTlNUQU5DRV9LRVkpO1xucmV0dXJuIHNldHVwSXNzdWVyS2l0KGlzc3VlclJlY29yZCxpc3N1ZXJCYWdnYWdlLG9wdFNodXRkb3duV2l0aEZhaWx1cmUpO1xuIH07JGjigI1fb25jZS5wcmVwYXJlSXNzdWVyS2l0KHByZXBhcmVJc3N1ZXJLaXQpO1xuaGFyZGVuKHByZXBhcmVJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIERvZXMgYmFnZ2FnZSBhbHJlYWR5IGhhdmUgYW4gaXNzdWVyIGZyb20gcHJlcGFyZUlzc3VlcktpdCgpP1xuICogVGhhdCBpczogZG9lcyBpdCBoYXZlIHRoZSByZWxldmFudCBrZXlzIGRlZmluZWQ/XG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKi9cbmNvbnN0ICAgICAgICBoYXNJc3N1ZXI9KGJhZ2dhZ2UpPT5iYWdnYWdlLmhhcyhJTlNUQU5DRV9LRVkpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPHtlbGVtZW50U2hhcGU6IFBhdHRlcm59Pn0gSXNzdWVyT3B0aW9uc1JlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXQgZGVzY3JpcHRpb25zLlxuICogVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuXG4gKiBGb3IgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0XG4gKiBpdCBpcyBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nXG4gKiB0byB0aGF0IGlzc3VlciBhbmQgYnJhbmQuXG4gKlxuICogVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnNcbiAqIGZyb20gdGhlIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlXG4gKiBkZWZhdWx0LCBpcyB1c2VkIGZvciBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kPUFzc2V0S2luZC5OQVRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvPXt9XVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovJGjigI1fb25jZS5oYXNJc3N1ZXIoaGFzSXNzdWVyKTtcbmNvbnN0ICAgICAgICBtYWtlRHVyYWJsZUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QgaXNzdWVyRGF0YT1oYXJkZW4oe25hbWUsYXNzZXRLaW5kLGRpc3BsYXlJbmZvLGVsZW1lbnRTaGFwZX0pO1xuaXNzdWVyQmFnZ2FnZS5pbml0KElOU1RBTkNFX0tFWSxpc3N1ZXJEYXRhKTtcbnJldHVybiBzZXR1cElzc3VlcktpdChpc3N1ZXJEYXRhLGlzc3VlckJhZ2dhZ2Usb3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEdXJhYmxlSXNzdWVyS2l0KG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcbmhhcmRlbihtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPSduYXQnXVxuICogVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldCBkZXNjcmlwdGlvbnMuXG4gKiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS5cbiAqIEZvciBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXRcbiAqIGl0IGlzIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmdcbiAqIHRvIHRoYXQgaXNzdWVyIGFuZCBicmFuZC5cbiAqXG4gKiBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVyc1xuICogZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kPSduYXQnXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mbz17fV1cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge0lzc3Vlck9wdGlvbnNSZWNvcmR9IFtvcHRpb25zXVxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJLaXQ9KFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9PlxuXG5tYWtlRHVyYWJsZUlzc3VlcktpdChcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZHJvcHBlZCBpc3N1ZXIga2l0Jyx7ZHVyYWJsZTp0cnVlfSksXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxue2VsZW1lbnRTaGFwZX0pOyRo4oCNX29uY2UubWFrZUlzc3VlcktpdChtYWtlSXNzdWVyS2l0KTtcblxuaGFyZGVuKG1ha2VJc3N1ZXJLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVJc3N1ZXJLaXQiOlsicHJlcGFyZUlzc3VlcktpdCJdLCJoYXNJc3N1ZXIiOlsiaGFzSXNzdWVyIl0sIm1ha2VEdXJhYmxlSXNzdWVyS2l0IjpbIm1ha2VEdXJhYmxlSXNzdWVyS2l0Il0sIm1ha2VJc3N1ZXJLaXQiOlsibWFrZUlzc3VlcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACAyG7uswUAALMFAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBrZXlFUSxtYWtlQ29weUJhZyxtdXN0TWF0Y2gsTSxnZXRDb3B5QmFnRW50cmllcyxiYWdJc1N1cGVyYmFnLGJhZ1VuaW9uLGJhZ0Rpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlCYWcgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaOKAjV9hKV1dLFtcImJhZ0lzU3VwZXJiYWdcIiwgWyRo4oCNX2EgPT4gKGJhZ0lzU3VwZXJiYWcgPSAkaOKAjV9hKV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9hID0+IChiYWdVbmlvbiA9ICRo4oCNX2EpXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGUge0NvcHlCYWd9ICovXG5jb25zdCBlbXB0eT1tYWtlQ29weUJhZyhbXSk7XG5cbi8qKlxuICogQHR5cGUge01hdGhIZWxwZXJzPENvcHlCYWc+fVxuICovXG5jb25zdCAgICAgICAgY29weUJhZ01hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZTooYmFnKT0+e1xubXVzdE1hdGNoKGJhZyxNLmJhZygpLCdiYWcgb2YgYW1vdW50Jyk7XG5yZXR1cm4gYmFnO1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGJhZyk9PmdldENvcHlCYWdFbnRyaWVzKGJhZykubGVuZ3RoPT09MCxcbmRvSXNHVEU6YmFnSXNTdXBlcmJhZyxcbmRvSXNFcXVhbDprZXlFUSxcbmRvQWRkOmJhZ1VuaW9uLFxuZG9TdWJ0cmFjdDpiYWdEaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5QmFnTWF0aEhlbHBlcnMoY29weUJhZ01hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5QmFnTWF0aEhlbHBlcnMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHHnYj3HBQAAxwUAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weVNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5U2V0LG11c3RNYXRjaCxNLGdldENvcHlTZXRLZXlzLHNldElzU3VwZXJzZXQsc2V0RGlzam9pbnRVbmlvbixzZXREaXNqb2ludFN1YnRyYWN0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjigI1fYSldXSxbXCJzZXRJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChzZXRJc1N1cGVyc2V0ID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weVNldH0gKi9cbmNvbnN0IGVtcHR5PW1ha2VDb3B5U2V0KFtdKTtcblxuLyoqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weVNldD59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5U2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihzZXQpPT57XG5tdXN0TWF0Y2goc2V0LE0uc2V0KCksJ3NldCBvZiBhbW91bnQnKTtcbnJldHVybiBzZXQ7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooc2V0KT0+Z2V0Q29weVNldEtleXMoc2V0KS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpzZXRJc1N1cGVyc2V0LFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6c2V0RGlzam9pbnRVbmlvbixcbmRvU3VidHJhY3Q6c2V0RGlzam9pbnRTdWJ0cmFjdH0pOyRo4oCNX29uY2UuY29weVNldE1hdGhIZWxwZXJzKGNvcHlTZXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weVNldE1hdGhIZWxwZXJzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD/3LD7KgYAACoGAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJuYXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsaXNOYXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV0sW1wiaXNOYXRcIiwgWyRo4oCNX2EgPT4gKGlzTmF0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3QgZW1wdHk9MG47XG5cbi8qKlxuICogRnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdXNlIHRoZSBuYXRNYXRoSGVscGVycyB0byBtYW5hZ2UgYmFsYW5jZXMgLVxuICogdGhlIG9wZXJhdGlvbnMgYXJlIG1lcmVseSBhcml0aG1ldGljIG9uIG5hdHVyYWwsIG5vbi1uZWdhdGl2ZVxuICogbnVtYmVycy5cbiAqXG4gKiBOYXR1cmFsIG51bWJlcnMgYXJlIHVzZWQgZm9yIGZ1bmdpYmxlIGVyaWdodHMgc3VjaCBhcyBtb25leSBiZWNhdXNlXG4gKiByb3VuZGluZyBpc3N1ZXMgbWFrZSBmbG9hdHMgcHJvYmxlbWF0aWMuIEFsbCBvcGVyYXRpb25zIHNob3VsZCBiZVxuICogZG9uZSB3aXRoIHRoZSBzbWFsbGVzdCB3aG9sZSB1bml0IHN1Y2ggdGhhdCB0aGUgYG5hdE1hdGhIZWxwZXJzYCBuZXZlclxuICogZGVhbHMgd2l0aCBmcmFjdGlvbmFsIHBhcnRzLlxuICpcbiAqIEB0eXBlIHtNYXRoSGVscGVyczxOYXRWYWx1ZT59XG4gKi9cbmNvbnN0ICAgICAgICBuYXRNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KG5hdCk9Pntcbi8qIFRPRE86IHRpZ2h0ZW4gdGhlIGRlZmluaXRpb24gb2YgTmF0IGluIEBhZ29yaWMvbmF0IHRvIHRocm93IG9uIGBudW1iZXJgKi9cbmFzc2VydC50eXBlb2YobmF0LCdiaWdpbnQnKTtcbmlzTmF0KG5hdCl8fEZhaWwgYHZhbHVlICR7bmF0fSBtdXN0IGJlIGEgbmF0dXJhbCBudW1iZXJgO1xucmV0dXJuIE5hdChuYXQpO1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KG5hdCk9Pm5hdD09PWVtcHR5LFxuZG9Jc0dURToobGVmdCxyaWdodCk9PmxlZnQ+PXJpZ2h0LFxuZG9Jc0VxdWFsOihsZWZ0LHJpZ2h0KT0+bGVmdD09PXJpZ2h0LFxuLyogQmlnSW50cyBkb24ndCBvYnNlcnZhYmx5IG92ZXJmbG93Ki9cbmRvQWRkOihsZWZ0LHJpZ2h0KT0+bGVmdCtyaWdodCxcbmRvU3VidHJhY3Q6KGxlZnQscmlnaHQpPT5OYXQobGVmdC1yaWdodCl9KTskaOKAjV9vbmNlLm5hdE1hdGhIZWxwZXJzKG5hdE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJuYXRNYXRoSGVscGVycyI6WyJuYXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAmmZgvnwcAAJ8HAAA2AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbInNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGFzc2VydEtleSxlbGVtZW50c0lzU3VwZXJzZXQsZWxlbWVudHNEaXNqb2ludFVuaW9uLGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCxjb2VyY2VUb0VsZW1lbnRzLGVsZW1lbnRzQ29tcGFyZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzSXNTdXBlcnNldFwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNJc1N1cGVyc2V0ID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50VW5pb25cIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRVbmlvbiA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QgPSAkaOKAjV9hKV1dLFtcImNvZXJjZVRvRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKGNvZXJjZVRvRWxlbWVudHMgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzQ29tcGFyZVwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNDb21wYXJlID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBPcGVyYXRpb25zIGZvciBhcnJheXMgd2l0aCB1bmlxdWUgb2JqZWN0cyBpZGVudGlmeWluZyBhbmQgcHJvdmlkaW5nKi9cbi8qIGluZm9ybWF0aW9uIGFib3V0IGRpZ2l0YWwgYXNzZXRzLiBVc2VkIGZvciBab2UgaW52aXRlcy4qL1xuLyoqIEB0eXBlIHtTZXRWYWx1ZX0gKi9cbmNvbnN0IGVtcHR5PWhhcmRlbihbXSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgUmVwbGFjZSBhcnJheS1iYXNlZCBTZXRNYXRoIHdpdGggQ29weVNldC1iYXNlZCBDb3B5U2V0TWF0aFxuICogQHR5cGUge01hdGhIZWxwZXJzPFNldFZhbHVlPn1cbiAqL1xuY29uc3QgICAgICAgIHNldE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobGlzdCk9Pntcbmxpc3Q9Y29lcmNlVG9FbGVtZW50cyhsaXN0KTtcbi8qIEFzc2VydCB0aGF0IGxpc3QgY29udGFpbnMgb25seSovXG4vKiAqIHBhc3MtYnktY29weSBwcmltaXRpdmVzLCovXG4vKiAqIHBhc3MtYnktY29weSBjb250YWluZXJzIGNvbnRhaW5pbmcga2V5cywqL1xuLyogKiByZW1vdGFibGVzLiovXG5hc3NlcnRLZXkobGlzdCk7XG5yZXR1cm4gbGlzdDtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihsaXN0KT0+cGFzc1N0eWxlT2YobGlzdCk9PT0nY29weUFycmF5JyYmbGlzdC5sZW5ndGg9PT0wLFxuZG9Jc0dURTplbGVtZW50c0lzU3VwZXJzZXQsXG5kb0lzRXF1YWw6KHgseSk9PmVsZW1lbnRzQ29tcGFyZSh4LHkpPT09MCxcbmRvQWRkOmVsZW1lbnRzRGlzam9pbnRVbmlvbixcbmRvU3VidHJhY3Q6ZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5zZXRNYXRoSGVscGVycyhzZXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0TWF0aEhlbHBlcnMiOlsic2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsDioH6UEAAClBAAAIwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGluaXRFbXB0eSxwcmVwYXJlRXhvQ2xhc3M7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZH0gUGF5bWVudElcbiAqIEByZXR1cm5zIHsoKSA9PiBQYXltZW50PEs+fVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZVBheW1lbnRLaW5kPShpc3N1ZXJCYWdnYWdlLG5hbWUsYnJhbmQsUGF5bWVudEkpPT57XG5jb25zdCBtYWtlUGF5bWVudD1wcmVwYXJlRXhvQ2xhc3MoXG5pc3N1ZXJCYWdnYWdlLFxuIGAke25hbWV9IHBheW1lbnRgLFxuUGF5bWVudEksXG5pbml0RW1wdHksXG57XG5nZXRBbGxlZ2VkQnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9fSk7XG5cblxucmV0dXJuIG1ha2VQYXltZW50O1xuIH07JGjigI1fb25jZS5wcmVwYXJlUGF5bWVudEtpbmQocHJlcGFyZVBheW1lbnRLaW5kKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudEtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50S2luZCI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAD9fo7usxAADrMQAAKQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50TGVkZ2VyLmpzeyJpbXBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vcGF5bWVudC5qcyIsIi4vcHVyc2UuanMiLCIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbInByZXBhcmVQYXltZW50TGVkZ2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxtdXN0TWF0Y2gsTSxrZXlFUSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxwcmVwYXJlRXhvLHByb3ZpZGUsQW1vdW50TWF0aCxwcmVwYXJlUGF5bWVudEtpbmQscHJlcGFyZVB1cnNlS2luZCxCcmFuZEksbWFrZUlzc3VlckludGVyZmFjZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvID0gJGjigI1fYSldXSxbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCIuL3BheW1lbnQuanNcIiwgW1tcInByZXBhcmVQYXltZW50S2luZFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVBheW1lbnRLaW5kID0gJGjigI1fYSldXV1dLFtcIi4vcHVyc2UuanNcIiwgW1tcInByZXBhcmVQdXJzZUtpbmRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVQdXJzZUtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZS9leHBvcnRlZC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJCcmFuZElcIiwgWyRo4oCNX2EgPT4gKEJyYW5kSSA9ICRo4oCNX2EpXV0sW1wibWFrZUlzc3VlckludGVyZmFjZXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICovXG5jb25zdCBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGU9KGJyYW5kLGFzc2V0S2luZCxlbGVtZW50U2hhcGUpPT57XG5sZXQgdmFsdWVTaGFwZTtcbnN3aXRjaChhc3NldEtpbmQpe1xuY2FzZSduYXQnOntcbnZhbHVlU2hhcGU9TS5uYXQoKTtcbmVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZHx8XG5GYWlsIGBGdW5naWJsZSBhc3NldHMgY2Fubm90IGhhdmUgYW4gZWxlbWVudFNoYXBlOiAke3EoZWxlbWVudFNoYXBlKX1gO1xuYnJlYWs7XG4gfVxuY2FzZSdzZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYXJyYXlPZihNLmtleSgpKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0uYW5kKE0ua2V5KCksZWxlbWVudFNoYXBlKSk7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSdjb3B5U2V0Jzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLnNldCgpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLnNldE9mKGVsZW1lbnRTaGFwZSk7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLmJhZygpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmJhZ09mKGVsZW1lbnRTaGFwZSk7XG4gfVxuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5GYWlsIGB1bmV4cGVjdGVkIGFzc2V0IGtpbmQgJHtxKGFzc2V0S2luZCl9YDtcbiB9fVxuXG5cbmNvbnN0IGFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZCwvKiBtYXRjaGVzIG9ubHkgdGhpcyBleGFjdCBicmFuZCovXG52YWx1ZTp2YWx1ZVNoYXBlfSk7XG5cbnJldHVybiBhbW91bnRTaGFwZTtcbiB9O1xuXG4vKipcbiAqIE1ha2UgdGhlIHBheW1lbnRMZWRnZXIsIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBiYWxhbmNlcyBvZlxuICogcGF5bWVudHMuIEFsbCBtaW50aW5nIGFuZCB0cmFuc2ZlciBhdXRob3JpdHkgb3JpZ2luYXRlcyBoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IGFzc2V0S2luZFxuICogQHBhcmFtIHtEaXNwbGF5SW5mbzxLPn0gZGlzcGxheUluZm9cbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXVxuICogQHJldHVybnMge1BheW1lbnRMZWRnZXI8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUGF5bWVudExlZGdlcj0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbi8qKiBAdHlwZSB7QnJhbmQ8Sz59ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBjYWxsV2hlbiovXG5jb25zdCBicmFuZD1wcmVwYXJlRXhvKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IGJyYW5kYCxCcmFuZEkse1xuaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKXtcbi8qIEJyYW5kSSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgYWxsZWdlZElzc3VlcmAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIGFsbGVnZWRJc3N1ZXI9PT1pc3N1ZXI7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuLyogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LiovXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5nZXRBbW91bnRTaGFwZSgpe1xucmV0dXJuIGFtb3VudFNoYXBlO1xuIH19KTtcblxuXG5jb25zdCBhbW91bnRTaGFwZT1hbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG5icmFuZCxcbmFzc2V0S2luZCxcbmVsZW1lbnRTaGFwZSk7XG5cblxuY29uc3R7SXNzdWVySSxNaW50SSxQYXltZW50SSxQdXJzZUlLaXR9PW1ha2VJc3N1ZXJJbnRlcmZhY2VzKFxuYnJhbmQsXG5hc3NldEtpbmQsXG5hbW91bnRTaGFwZSk7XG5cblxuY29uc3QgbWFrZVBheW1lbnQ9cHJlcGFyZVBheW1lbnRLaW5kKGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk7XG5cbi8qKiBAdHlwZSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gKi9cbmNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmU9KHJlYXNvbik9Pntcbi8qIFRPRE8gVGhpcyBzaG91bGQgYWxzbyBkZXN0cm95IGxlZGdlciBzdGF0ZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNCovXG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbnRyeXtcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUocmVhc29uKTtcbiB9Y2F0Y2goZXJySW5TaHV0ZG93bil7XG5hc3NlcnQubm90ZShlcnJJblNodXRkb3duLFggYENhdXNlZCBieTogJHtyZWFzb259YCk7XG50aHJvdyBlcnJJblNodXRkb3duO1xuIH1cbiB9XG50aHJvdyByZWFzb247XG4gfTtcblxuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgQW1vdW50Pn0gKi9cbmNvbnN0IHBheW1lbnRMZWRnZXI9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRMZWRnZXInLFxue3ZhbHVlU2hhcGU6YW1vdW50U2hhcGV9KTtcblxuXG4vKipcbiAqIEEgd2l0aGRyYXduIGxpdmUgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZlxuICogdGhlIHB1cnNlIGl0IHdhcyB3aXRoZHJhd24gZnJvbS4gTGV0J3MgY2FsbCB0aGVzZSBcInJlY292ZXJhYmxlXCJcbiAqIHBheW1lbnRzLiBBbGwgcmVjb3ZlcmFibGUgcGF5bWVudHMgYXJlIGxpdmUsIGJ1dCBub3QgYWxsIGxpdmVcbiAqIHBheW1lbnRzIGFyZSByZWNvdmVyYWJsZS4gV2UgZG8gdGhlIGJvb2trZWVwaW5nIGZvciBwYXltZW50IHJlY292ZXJ5XG4gKiB3aXRoIHRoaXMgd2Vha21hcCBmcm9tIHJlY292ZXJhYmxlIHBheW1lbnRzIHRvIHRoZSByZWNvdmVyeSBzZXQgdGhleSBhcmVcbiAqIGluLlxuICogQSBidW5jaCBvZiBpbnRlcmVzdGluZyBpbnZhcmlhbnRzIGhlcmU6XG4gKiAgICAqIEV2ZXJ5IHBheW1lbnQgdGhhdCBpcyBhIGtleSBpbiB0aGUgb3V0ZXIgYHBheW1lbnRSZWNvdmVyeVNldHNgXG4gKiAgICAgIHdlYWtNYXAgaXMgYWxzbyBpbiB0aGUgcmVjb3Zlcnkgc2V0IGluZGV4ZWQgYnkgdGhhdCBwYXltZW50LlxuICogICAgKiBJbXBsaWVkIGJ5IHRoZSBhYm92ZSBidXQgd29ydGggc3RhdGluZzogdGhlIHBheW1lbnQgaXMgb25seVxuICogICAgICBpbiBhdCBtb3N0IG9uZSByZWNvdmVyeSBzZXQuXG4gKiAgICAqIEEgcmVjb3Zlcnkgc2V0IG9ubHkgY29udGFpbnMgc3VjaCBwYXltZW50cy5cbiAqICAgICogRXZlcnkgcHVyc2UgaXMgYXNzb2NpYXRlZCB3aXRoIGV4YWN0bHkgb25lIHJlY292ZXJ5IHNldCB1bmlxdWUgdG9cbiAqICAgICAgaXQuXG4gKiAgICAqIEEgcHVyc2UncyByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBwYXltZW50cyB3aXRoZHJhd24gZnJvbVxuICogICAgICB0aGF0IHB1cnNlIGFuZCBub3QgeWV0IGNvbnN1bWVkLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fVxuICovXG5jb25zdCBwYXltZW50UmVjb3ZlcnlTZXRzPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuaXNzdWVyQmFnZ2FnZSxcbidwYXltZW50UmVjb3ZlcnlTZXRzJyk7XG5cblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGluaXRQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5pbml0YC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IFtvcHRSZWNvdmVyeVNldF1cbiAqL1xuY29uc3QgaW5pdFBheW1lbnQ9KHBheW1lbnQsYW1vdW50LG9wdFJlY292ZXJ5U2V0PXVuZGVmaW5lZCk9PntcbmlmKG9wdFJlY292ZXJ5U2V0IT09dW5kZWZpbmVkKXtcbm9wdFJlY292ZXJ5U2V0LmFkZChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuaW5pdChwYXltZW50LG9wdFJlY292ZXJ5U2V0KTtcbiB9XG5wYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCxhbW91bnQpO1xuIH07XG5cbi8qKlxuICogVG8gbWFpbnRhaW4gdGhlIGludmFyaWFudHMgbGlzdGVkIGluIHRoZSBgcGF5bWVudFJlY292ZXJ5U2V0c2AgY29tbWVudCxcbiAqIGBkZWxldGVQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5kZWxldGVgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICovXG5jb25zdCBkZWxldGVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG5pZihwYXltZW50UmVjb3ZlcnlTZXRzLmhhcyhwYXltZW50KSl7XG5jb25zdCByZWNvdmVyeVNldD1wYXltZW50UmVjb3ZlcnlTZXRzLmdldChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuZGVsZXRlKHBheW1lbnQpO1xucmVjb3ZlcnlTZXQuZGVsZXRlKHBheW1lbnQpO1xuIH1cbiB9O1xuXG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IEFtb3VudCB9ICovXG5jb25zdCBhZGQ9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLmFkZChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IHN1YnRyYWN0PShsZWZ0LHJpZ2h0KT0+QW1vdW50TWF0aC5zdWJ0cmFjdChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGFsbGVnZWRBbW91bnQ6IEFtb3VudCkgPT4gQW1vdW50fSAqL1xuY29uc3QgY29lcmNlPShhbGxlZ2VkQW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYWxsZWdlZEFtb3VudCk7XG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IGJvb2xlYW4gfSAqL1xuXG4vKipcbiAqIE1ldGhvZHMgbGlrZSBkZXBvc2l0KCkgaGF2ZSBhbiBvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyXG4gKiBgb3B0QW1vdW50U2hhcGVgXG4gKiB3aGljaCwgaWYgcHJlc2VudCwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggdGhlIGJhbGFuY2Ugb2YgdGhlXG4gKiBwYXltZW50LiBUaGlzIGhlbHBlciBmdW5jdGlvbiBkb2VzIHRoYXQgY2hlY2suXG4gKlxuICogTm90ZTogYG9wdEFtb3VudFNoYXBlYCBpcyB1c2VyLXN1cHBsaWVkIHdpdGggbm8gcHJldmlvdXMgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gcGF5bWVudEJhbGFuY2VcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydEFtb3VudENvbnNpc3RlbnQ9KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKT0+e1xuaWYob3B0QW1vdW50U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlLCdhbW91bnQnKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBhc3NlcnRMaXZlUGF5bWVudD0ocGF5bWVudCk9PntcbnBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpfHxcbkZhaWwgYCR7cGF5bWVudH0gd2FzIG5vdCBhIGxpdmUgcGF5bWVudCBmb3IgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiB9O1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLmRlcG9zaXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gY3VycmVudEJhbGFuY2UgLSB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoZSBwdXJzZVxuICogYmVmb3JlIGEgZGVwb3NpdFxuICogQHBhcmFtIHsobmV3UHVyc2VCYWxhbmNlOiBBbW91bnQpID0+IHZvaWR9IHVwZGF0ZVB1cnNlQmFsYW5jZSAtXG4gKiBjb21taXQgdGhlIHB1cnNlIGJhbGFuY2VcbiAqIEBwYXJhbSB7UGF5bWVudH0gc3JjUGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG5jb25zdCBkZXBvc2l0SW50ZXJuYWw9KFxuY3VycmVudEJhbGFuY2UsXG51cGRhdGVQdXJzZUJhbGFuY2UsXG5zcmNQYXltZW50LFxub3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKT0+XG57XG4haXNQcm9taXNlKHNyY1BheW1lbnQpfHxcbmFzc2VydC5mYWlsKFxuIGBkZXBvc2l0IGRvZXMgbm90IGFjY2VwdCBwcm9taXNlcyBhcyBmaXJzdCBhcmd1bWVudC4gSW5zdGVhZCBvZiBwYXNzaW5nIHRoZSBwcm9taXNlIChkZXBvc2l0KHBheW1lbnRQcm9taXNlKSksIGNvbnNpZGVyIHVud3JhcHBpbmcgdGhlIHByb21pc2UgZmlyc3Q6IEUud2hlbihwYXltZW50UHJvbWlzZSwgKGFjdHVhbFBheW1lbnQgPT4gZGVwb3NpdChhY3R1YWxQYXltZW50KSlgLFxuVHlwZUVycm9yKTtcblxuYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG5jb25zdCBzcmNQYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQoc3JjUGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xuY29uc3QgbmV3UHVyc2VCYWxhbmNlPWFkZChzcmNQYXltZW50QmFsYW5jZSxjdXJyZW50QmFsYW5jZSk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQqL1xuLyogTW92ZSB0aGUgYXNzZXRzIGluIGBzcmNQYXltZW50YCBpbnRvIHRoaXMgcHVyc2UsIHVzaW5nIHVwIHRoZSovXG4vKiBzb3VyY2UgcGF5bWVudCwgc3VjaCB0aGF0IHRvdGFsIGFzc2V0cyBhcmUgY29uc2VydmVkLiovXG5kZWxldGVQYXltZW50KHNyY1BheW1lbnQpO1xudXBkYXRlUHVyc2VCYWxhbmNlKG5ld1B1cnNlQmFsYW5jZSk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2Uud2l0aGRyYXdcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gY3VycmVudEJhbGFuY2UgLSB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoZSBwdXJzZVxuICogYmVmb3JlIGEgd2l0aGRyYXdhbFxuICogQHBhcmFtIHsobmV3UHVyc2VCYWxhbmNlOiBBbW91bnQpID0+IHZvaWR9IHVwZGF0ZVB1cnNlQmFsYW5jZSAtXG4gKiBjb21taXQgdGhlIHB1cnNlIGJhbGFuY2VcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnQgLSB0aGUgYW1vdW50IHRvIGJlIHdpdGhkcmF3blxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gcmVjb3ZlcnlTZXRcbiAqIEByZXR1cm5zIHtQYXltZW50fVxuICovXG5jb25zdCB3aXRoZHJhd0ludGVybmFsPShcbmN1cnJlbnRCYWxhbmNlLFxudXBkYXRlUHVyc2VCYWxhbmNlLFxuYW1vdW50LFxucmVjb3ZlcnlTZXQpPT5cbntcbmFtb3VudD1jb2VyY2UoYW1vdW50KTtcbkFtb3VudE1hdGguaXNHVEUoY3VycmVudEJhbGFuY2UsYW1vdW50KXx8XG5GYWlsIGBXaXRoZHJhd2FsIG9mICR7YW1vdW50fSBmYWlsZWQgYmVjYXVzZSB0aGUgcHVyc2Ugb25seSBjb250YWluZWQgJHtjdXJyZW50QmFsYW5jZX1gO1xuY29uc3QgbmV3UHVyc2VCYWxhbmNlPXN1YnRyYWN0KGN1cnJlbnRCYWxhbmNlLGFtb3VudCk7XG5cbmNvbnN0IHBheW1lbnQ9bWFrZVBheW1lbnQoKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCBNb3ZlIHRoZSB3aXRoZHJhd24gYXNzZXRzIGZyb20gdGhpcyBwdXJzZSBpbnRvKi9cbi8qIHBheW1lbnQuIFRvdGFsIGFzc2V0cyBtdXN0IHJlbWFpbiBjb25zZXJ2ZWQuKi9cbnVwZGF0ZVB1cnNlQmFsYW5jZShuZXdQdXJzZUJhbGFuY2UpO1xuaW5pdFBheW1lbnQocGF5bWVudCxhbW91bnQscmVjb3ZlcnlTZXQpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBwYXltZW50O1xuIH07XG5cbmNvbnN0IG1ha2VFbXB0eVB1cnNlPXByZXBhcmVQdXJzZUtpbmQoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxuaGFyZGVuKHtcbmRlcG9zaXRJbnRlcm5hbCxcbndpdGhkcmF3SW50ZXJuYWx9KSk7XG5cblxuXG4vKiogQHR5cGUge0lzc3VlcjxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCBkdWUgdG8gY2FsbFdoZW4gZGlzY3JlcGFuY3kqL1xuY29uc3QgaXNzdWVyPXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gaXNzdWVyYCxJc3N1ZXJJLHtcbmdldEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuZ2V0QXNzZXRLaW5kKCl7XG5yZXR1cm4gYXNzZXRLaW5kO1xuIH0sXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5tYWtlRW1wdHlQdXJzZSgpe1xucmV0dXJuIG1ha2VFbXB0eVB1cnNlKCk7XG4gfSxcbi8qKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlbiAqL1xuaXNMaXZlKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpO1xuIH0sXG4vKiogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW4gKi9cbmdldEFtb3VudE9mKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG5yZXR1cm4gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gfSxcbi8qKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gb3B0QW1vdW50U2hhcGVcbiAqL1xuYnVybihwYXltZW50LG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbmNvbnN0IHBheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChwYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQuKi9cbmRlbGV0ZVBheW1lbnQocGF5bWVudCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnRCYWxhbmNlO1xuIH19KTtcblxuXG4vKipcbiAqIFByb3ZpZGVzIGZvciB0aGUgcmVjb3Zlcnkgb2YgbmV3bHkgbWludGVkIGJ1dCBub3QteWV0LWRlcG9zaXRlZCBwYXltZW50cy5cbiAqXG4gKiBCZWNhdXNlIHRoZSBgbWludFJlY292ZXJ5UHVyc2VgIGlzIHBsYWNlZCBpbiBiYWdnYWdlLCBldmVuIGlmIHRoZVxuICogY2FsbGVyIG9mIGBtYWtlSXNzdWVyS2l0YCBkcm9wcyBpdCBvbiB0aGUgZmxvb3IsIGl0IGNhbiBzdGlsbCBiZVxuICogcmVjb3ZlcmVkIGluIGFuIGVtZXJnZW5jeSB1cGdyYWRlLlxuICpcbiAqIEB0eXBlIHtQdXJzZTxLPn1cbiAqL1xuY29uc3QgbWludFJlY292ZXJ5UHVyc2U9cHJvdmlkZShpc3N1ZXJCYWdnYWdlLCdtaW50UmVjb3ZlcnlQdXJzZScsKCk9PlxubWFrZUVtcHR5UHVyc2UoKSk7XG5cblxuLyoqIEB0eXBlIHtNaW50PEs+fSAqL1xuY29uc3QgbWludD1wcmVwYXJlRXhvKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IG1pbnRgLE1pbnRJLHtcbmdldElzc3Vlcigpe1xucmV0dXJuIGlzc3VlcjtcbiB9LFxubWludFBheW1lbnQobmV3QW1vdW50KXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2hlY2tlZCBjYXN0Ki9cbm5ld0Ftb3VudD1jb2VyY2UobmV3QW1vdW50KTtcbm11c3RNYXRjaChuZXdBbW91bnQsYW1vdW50U2hhcGUsJ21pbnRlZCBhbW91bnQnKTtcbi8qIGByYXdQYXltZW50YCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFueSByZWNvdmVyeSBzZXQsIGFuZCovXG4vKiBzbyBtdXN0IG5vdCBlc2NhcGUuKi9cbmNvbnN0IHJhd1BheW1lbnQ9bWFrZVBheW1lbnQoKTtcbmluaXRQYXltZW50KHJhd1BheW1lbnQsbmV3QW1vdW50LHVuZGVmaW5lZCk7XG5cbmNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlQmVmb3JlPW1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbm1pbnRSZWNvdmVyeVB1cnNlLmRlcG9zaXQocmF3UGF5bWVudCxuZXdBbW91bnQpO1xuY29uc3QgcGF5bWVudD1taW50UmVjb3ZlcnlQdXJzZS53aXRoZHJhdyhuZXdBbW91bnQpO1xuY29uc3QgbWludFJlY292ZXJ5UHVyc2VBZnRlcj1taW50UmVjb3ZlcnlQdXJzZS5nZXRDdXJyZW50QW1vdW50KCk7XG5hc3NlcnQoa2V5RVEobWludFJlY292ZXJ5UHVyc2VCZWZvcmUsbWludFJlY292ZXJ5UHVyc2VBZnRlcikpO1xucmV0dXJuIHBheW1lbnQ7XG4gfX0pO1xuXG5cbmNvbnN0IGlzc3VlcktpdD1oYXJkZW4oe2lzc3VlcixtaW50LGJyYW5kLG1pbnRSZWNvdmVyeVB1cnNlfSk7XG5yZXR1cm4gaXNzdWVyS2l0O1xuIH07JGjigI1fb25jZS5wcmVwYXJlUGF5bWVudExlZGdlcihwcmVwYXJlUGF5bWVudExlZGdlcik7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRMZWRnZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50TGVkZ2VyIjpbInByZXBhcmVQYXltZW50TGVkZ2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKJFRULADwAAwA8AACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcHVyc2UuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi90cmFuc2llbnROb3RpZmllci5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsicHJlcGFyZVB1cnNlS2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNLHByZXBhcmVFeG9DbGFzc0tpdCxtYWtlU2NhbGFyQmlnU2V0U3RvcmUsQW1vdW50TWF0aCxtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhckJpZ1NldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnU2V0U3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vdHJhbnNpZW50Tm90aWZpZXIuanNcIiwgW1tcIm1ha2VUcmFuc2llbnROb3RpZmllcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuY29uc3QgICAgICAgIHByZXBhcmVQdXJzZUtpbmQ9KFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5icmFuZCxcblB1cnNlSUtpdCxcbnB1cnNlTWV0aG9kcyk9Plxue1xuY29uc3QgYW1vdW50U2hhcGU9YnJhbmQuZ2V0QW1vdW50U2hhcGUoKTtcblxuLyogTm90ZTogVmlydHVhbCBmb3IgaGlnaCBjYXJkaW5hbGl0eSwgYnV0ICpub3QqIGR1cmFibGUsIGFuZCBzbyovXG4vKiBicm9rZW4gYWNyb3NzIGFuIHVwZ3JhZGUuKi9cbmNvbnN0e3Byb3ZpZGVOb3RpZmllcix1cGRhdGU6dXBkYXRlQmFsYW5jZX09bWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KCk7XG5cbmNvbnN0IHVwZGF0ZVB1cnNlQmFsYW5jZT0oc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHB1cnNlKT0+e1xuc3RhdGUuY3VycmVudEJhbGFuY2U9bmV3UHVyc2VCYWxhbmNlO1xudXBkYXRlQmFsYW5jZShwdXJzZSxwdXJzZS5nZXRDdXJyZW50QW1vdW50KCkpO1xuIH07XG5cbi8qIC0gVGhpcyBraW5kIGlzIGEgcGFpciBvZiBwdXJzZSBhbmQgZGVwb3NpdEZhY2V0IHRoYXQgaGF2ZSBhIDE6MSovXG4vKiBjb3JyZXNwb25kZW5jZS4qL1xuLyogLSBUaGV5IGFyZSB2aXJ0dWFsaXplZCB0b2dldGhlciB0byBzaGFyZSBhIHNpbmdsZSBzdGF0ZSByZWNvcmQuKi9cbi8qIC0gQW4gYWx0ZXJuYXRpdmUgZGVzaWduIGNvbnNpZGVyZWQgd2FzIHRvIGhhdmUgdGhpcyByZXR1cm4gYSBQdXJzZSBhbG9uZSovXG4vKiB0aGF0IGNyZWF0ZWQgZGVwb3NpdEZhY2V0IGFzIG5lZWRlZC4gQnV0IHRoaXMgYXBwcm9hY2ggZW5zdXJlcyBhIGNvbnN0YW50Ki9cbi8qIGlkZW50aXR5IGZvciB0aGUgZmFjZXQgYW5kIGV4ZXJjaXNlcyB0aGUgbXVsdGktZmFjZXRlZCBvYmplY3Qgc3R5bGUuKi9cbmNvbnN0e2RlcG9zaXRJbnRlcm5hbCx3aXRoZHJhd0ludGVybmFsfT1wdXJzZU1ldGhvZHM7XG5jb25zdCBtYWtlUHVyc2VLaXQ9cHJlcGFyZUV4b0NsYXNzS2l0KFxuaXNzdWVyQmFnZ2FnZSxcbiBgJHtuYW1lfSBQdXJzZWAsXG5QdXJzZUlLaXQsXG4oKT0+e1xuY29uc3QgY3VycmVudEJhbGFuY2U9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcblxuLyoqIEB0eXBlIHtTZXRTdG9yZTxQYXltZW50Pn0gKi9cbmNvbnN0IHJlY292ZXJ5U2V0PW1ha2VTY2FsYXJCaWdTZXRTdG9yZSgncmVjb3Zlcnkgc2V0Jyx7XG5kdXJhYmxlOnRydWV9KTtcblxuXG5yZXR1cm57XG5jdXJyZW50QmFsYW5jZSxcbnJlY292ZXJ5U2V0fTtcblxuIH0sXG57XG5wdXJzZTp7XG5kZXBvc2l0KHNyY1BheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBTZWUgdGhlIGNvbW1lbnRzIG9uIFB1cnNlSS5kZXBvc2l0IGluIHR5cGVHdWFyZHMuanMqL1xuY29uc3R7c3RhdGV9PXRoaXM7XG4vKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gZGVwb3NpdC4qL1xucmV0dXJuIGRlcG9zaXRJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5zcmNQYXltZW50LFxub3B0QW1vdW50U2hhcGUpO1xuXG4gfSxcbndpdGhkcmF3KGFtb3VudCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiB3aXRoZHJhdy4qL1xucmV0dXJuIHdpdGhkcmF3SW50ZXJuYWwoXG5zdGF0ZS5jdXJyZW50QmFsYW5jZSxcbihuZXdQdXJzZUJhbGFuY2UpPT5cbnVwZGF0ZVB1cnNlQmFsYW5jZShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UsdGhpcy5mYWNldHMucHVyc2UpLFxuYW1vdW50LFxuc3RhdGUucmVjb3ZlcnlTZXQpO1xuXG4gfSxcbmdldEN1cnJlbnRBbW91bnQoKXtcbnJldHVybiB0aGlzLnN0YXRlLmN1cnJlbnRCYWxhbmNlO1xuIH0sXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXIoKXtcbnJldHVybiBwcm92aWRlTm90aWZpZXIodGhpcy5mYWNldHMucHVyc2UpO1xuIH0sXG5nZXRBbGxlZ2VkQnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmdldERlcG9zaXRGYWNldCgpe1xucmV0dXJuIHRoaXMuZmFjZXRzLmRlcG9zaXRGYWNldDtcbiB9LFxuXG5nZXRSZWNvdmVyeVNldCgpe1xucmV0dXJuIHRoaXMuc3RhdGUucmVjb3ZlcnlTZXQuc25hcHNob3QoKTtcbiB9LFxucmVjb3ZlckFsbCgpe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xubGV0IGFtb3VudD1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuZm9yKGNvbnN0IHBheW1lbnQgb2Ygc3RhdGUucmVjb3ZlcnlTZXQua2V5cygpKXtcbi8qIFRoaXMgZG9lcyBjYXVzZSBkZWxldGlvbnMgZnJvbSB0aGUgc2V0IHdoaWxlIGl0ZXJhdGluZywqL1xuLyogYnV0IHRoaXMgc3BlY2lhbCBjYXNlIGlzIGFsbG93ZWQuKi9cbmNvbnN0IGRlbHRhPWZhY2V0cy5wdXJzZS5kZXBvc2l0KHBheW1lbnQpO1xuYW1vdW50PUFtb3VudE1hdGguYWRkKGFtb3VudCxkZWx0YSxicmFuZCk7XG4gfVxuc3RhdGUucmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpPT09MHx8XG5GYWlsIGBpbnRlcm5hbDogUmVtYWluaW5nIHVucmVjb3ZlcmVkIHBheW1lbnRzOiAke2ZhY2V0cy5wdXJzZS5nZXRSZWNvdmVyeVNldCgpfWA7XG5yZXR1cm4gYW1vdW50O1xuIH19LFxuXG5kZXBvc2l0RmFjZXQ6e1xucmVjZWl2ZSguLi5hcmdzKXtcbnJldHVybiB0aGlzLmZhY2V0cy5wdXJzZS5kZXBvc2l0KC4uLmFyZ3MpO1xuIH19fSxcblxuXG57XG5zdGF0ZVNoYXBlOntcbmN1cnJlbnRCYWxhbmNlOmFtb3VudFNoYXBlLFxucmVjb3ZlcnlTZXQ6TS5yZW1vdGFibGUoJ3JlY292ZXJ5U2V0Jyl9fSk7XG5cblxuXG5yZXR1cm4oKT0+bWFrZVB1cnNlS2l0KCkucHVyc2U7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQdXJzZUtpbmQocHJlcGFyZVB1cnNlS2luZCk7XG5oYXJkZW4ocHJlcGFyZVB1cnNlS2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVB1cnNlS2luZCI6WyJwcmVwYXJlUHVyc2VLaW5kIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC5JY6kUBgAAFAYAAC0AAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUscHJvdmlkZUxhenksbWFrZU5vdGlmaWVyS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZU5vdGlmaWVyS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyogTm90ZTogVmlydHVhbCBmb3IgaGlnaCBjYXJkaW5hbGl0eSwgYnV0ICpub3QqIGR1cmFibGUsIGFuZCBzbyovXG4vKiBicm9rZW4gYWNyb3NzIGFuIHVwZ3JhZGUuKi9cbmNvbnN0ICAgICAgICBtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7V2Vha01hcFN0b3JlPFB1cnNlLCBOb3RpZmllclJlY29yZDxhbnk+Pn0gKi9cbmNvbnN0IHRyYW5zaWVudE5vdGlmZXJLaXRzPW1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUoXG4ndHJhbnNpZW50Tm90aWZlcktpdHMnKTtcblxuXG5jb25zdCBwcm92aWRlTm90aWZpZXJLaXQ9KGtleSk9PlxucHJvdmlkZUxhenkodHJhbnNpZW50Tm90aWZlcktpdHMsa2V5LCgpPT5cbm1ha2VOb3RpZmllcktpdChrZXkuZ2V0Q3VycmVudEFtb3VudCgpKSk7XG5cblxuY29uc3QgcHJvdmlkZU5vdGlmaWVyPShrZXkpPT5wcm92aWRlTm90aWZpZXJLaXQoa2V5KS5ub3RpZmllcjtcbmNvbnN0IHVwZGF0ZT0oa2V5LG5ld1ZhbHVlKT0+e1xuaWYodHJhbnNpZW50Tm90aWZlcktpdHMuaGFzKGtleSkpe1xuY29uc3R7dXBkYXRlcn09dHJhbnNpZW50Tm90aWZlcktpdHMuZ2V0KGtleSk7XG51cGRhdGVyLnVwZGF0ZVN0YXRlKG5ld1ZhbHVlKTtcbiB9XG4gfTtcblxucmV0dXJue3Byb3ZpZGVOb3RpZmllcix1cGRhdGV9O1xuIH07JGjigI1fb25jZS5tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbmhhcmRlbihtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFuc2llbnROb3RpZmllcktpdCI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKO6ePhInAAASJwAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJBbW91bnRTaGFwZSIsIkFzc2V0S2luZFNoYXBlIiwiQnJhbmRJIiwiQnJhbmRTaGFwZSIsIkRlcG9zaXRGYWNldFNoYXBlIiwiRGlzcGxheUluZm9TaGFwZSIsIklzc3VlcktpdFNoYXBlIiwiSXNzdWVyU2hhcGUiLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiLCJNaW50U2hhcGUiLCJOb3RpZmllclNoYXBlIiwiUGF5bWVudFNoYXBlIiwiUHVyc2VTaGFwZSIsIlJhdGlvU2hhcGUiLCJpc0NvcHlCYWdWYWx1ZSIsImlzQ29weVNldFZhbHVlIiwiaXNOYXRWYWx1ZSIsImlzU2V0VmFsdWUiLCJtYWtlSXNzdWVySW50ZXJmYWNlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNLG1hdGNoZXM7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3QgICAgICAgIEJyYW5kU2hhcGU9TS5yZW1vdGFibGUoJ0JyYW5kJyk7JGjigI1fb25jZS5CcmFuZFNoYXBlKEJyYW5kU2hhcGUpO1xuY29uc3QgICAgICAgIElzc3VlclNoYXBlPU0ucmVtb3RhYmxlKCdJc3N1ZXInKTskaOKAjV9vbmNlLklzc3VlclNoYXBlKElzc3VlclNoYXBlKTtcbmNvbnN0ICAgICAgICBQYXltZW50U2hhcGU9TS5yZW1vdGFibGUoJ1BheW1lbnQnKTskaOKAjV9vbmNlLlBheW1lbnRTaGFwZShQYXltZW50U2hhcGUpO1xuY29uc3QgICAgICAgIFB1cnNlU2hhcGU9TS5yZW1vdGFibGUoJ1B1cnNlJyk7JGjigI1fb25jZS5QdXJzZVNoYXBlKFB1cnNlU2hhcGUpO1xuY29uc3QgICAgICAgIERlcG9zaXRGYWNldFNoYXBlPU0ucmVtb3RhYmxlKCdEZXBvc2l0RmFjZXQnKTskaOKAjV9vbmNlLkRlcG9zaXRGYWNldFNoYXBlKERlcG9zaXRGYWNldFNoYXBlKTtcbmNvbnN0ICAgICAgICBOb3RpZmllclNoYXBlPU0ucmVtb3RhYmxlKCdOb3RpZmllcicpOyRo4oCNX29uY2UuTm90aWZpZXJTaGFwZShOb3RpZmllclNoYXBlKTtcbmNvbnN0ICAgICAgICBNaW50U2hhcGU9TS5yZW1vdGFibGUoJ01pbnQnKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgTmF0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdCBpc1xuICogYSBub24tbmVnYXRpdmUgYmlnaW50LCB0aGVuIGl0IHJlcHJlc2VudHMgdGhhdCBtYW55IHVuaXRzIG9mIHRoZVxuICogZnVuZ2libGUgYXNzZXQgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQuIFRoZSBicmFuZCBvZiB0aGF0IGFtb3VudFxuICogc2hvdWxkIGluZGVlZCByZXByZXNlbnQgYSBraW5kIG9mIGFzc2V0IGNvbnNpc3Rpbmcgb2YgYSBjb3VudGFibGVcbiAqIHNldCBvZiBmdW5naWJsZSB1bml0cy5cbiAqLyRo4oCNX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlPU0ubmF0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlTZXQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgc2V0IG9mIHRob3NlXG4gKiBrZXlzLCB3aGVyZSBlYWNoIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBub24tZnVuZ2libGVcbiAqIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCwgZnJvbSB0aGUgbm9uLWZ1bmdpYmxlIGFzc2V0IGNsYXNzXG4gKiByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudCdzIGJyYW5kLiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzXG4gKiB0aGUgc2V0IG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXNcbiAqIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZVxuICogdGhhdCB3ZSBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdFxuICogdGhlIGNvZGUgdGhhdCBob2xkcyB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGF0IGJyYW5kLCBvbmx5IG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHNcbiAqIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieSBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlclxuICogYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXkgXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0XG4gKiB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmUgc2F0aXNmaWVkLlxuICogXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlTZXRWYWx1ZVNoYXBlPU0uc2V0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIFNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weUFycmF5IG9mIHBhc3NhYmxlIEtleXMuIFRoaXMgcmVwcmVzZW50YXRpb24gaXMgZGVwcmVjYXRlZC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqIENvcHlTZXRWYWx1ZXMuXG4gKi9cbmNvbnN0IFNldFZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5QmFnVmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QmFnLCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIGJhZyAobXVsdGlzZXQpIG9mIHRob3NlXG4gKiBrZXlzLCB3aGVyZSBlYWNoIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBzZW1pLWZ1bmdpYmxlXG4gKiBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsIGZyb20gdGhlIHNlbWktZnVuZ2libGUgYXNzZXQgY2xhc3NcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBrZXlcbiAqIGFwcGVhcnMgaW4gdGhlIGJhZyBpcyB0aGUgbnVtYmVyIG9mIGZ1bmdpYmxlIHVuaXRzIG9mIHRoYXQga2V5LlxuICogVGhlIGFtb3VudCBpdHNlbGYgcmVwcmVzZW50c1xuICogdGhlIGJhZyBvZiB0aGVzZSBpdGVtcywgYXMgb3Bwb3NlZCB0byBhbnkgb2YgdGhlIG90aGVyIGl0ZW1zXG4gKiBmcm9tIHRoZSBzYW1lIGFzc2V0IGNsYXNzLlxuICpcbiAqIElmIGEgZ2l2ZW4gdmFsdWUgY2xhc3MgcmVwcmVzZW50cyBjb25jZXJ0IHRpY2tldHMsIGl0IHNlZW1zIGJpemFycmVcbiAqIHRoYXQgd2UgY2FuIGZvcm0gYW1vdW50cyBvZiBhbnkga2V5LiBUaGUgaGFyZCBjb25zdHJhaW50IGlzIHRoYXRcbiAqIHRoZSBjb2RlIHRoYXQgaG9sZHMgdGhlIG1pbnQgZm9yIHRoYXQgYXNzZXQgY2xhc3MtLS10aGUgb25lIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhhdCBicmFuZCwgb25seSBtaW50cyB0aGUgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSByZWFsIHVuaXRzXG4gKiBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnkgaXQuIEFueW9uZSBlbHNlIGNhbiBwdXQgdG9nZXRoZXJcbiAqIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5IFwid2FudFwiIHNvbWUgaXRlbXMgdGhhdFxuICogd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlIHNhdGlzZmllZC5cbiAqIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5QmFnVmFsdWVTaGFwZT1NLmJhZygpO1xuXG5jb25zdCBBbW91bnRWYWx1ZVNoYXBlPU0ub3IoXG5OYXRWYWx1ZVNoYXBlLFxuQ29weVNldFZhbHVlU2hhcGUsXG5TZXRWYWx1ZVNoYXBlLFxuQ29weUJhZ1ZhbHVlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBBbW91bnRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbnZhbHVlOkFtb3VudFZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLkFtb3VudFNoYXBlKEFtb3VudFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUmF0aW9TaGFwZT1oYXJkZW4oe1xubnVtZXJhdG9yOkFtb3VudFNoYXBlLFxuZGVub21pbmF0b3I6QW1vdW50U2hhcGV9KTtcblxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIE5hdCBiaWdpbnQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBYaW1wb3J0KCcuL3R5cGVzLmpzJykuTmF0VmFsdWV9XG4gKi8kaOKAjV9vbmNlLlJhdGlvU2hhcGUoUmF0aW9TaGFwZSk7XG5jb25zdCAgICAgICAgaXNOYXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLE5hdFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNOYXRWYWx1ZShpc05hdFZhbHVlKTtcbmhhcmRlbihpc05hdFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5U2V0XG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5U2V0fVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0VmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5U2V0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc0NvcHlTZXRWYWx1ZShpc0NvcHlTZXRWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5U2V0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIHBhc3MgYnkgY29weSBhcnJheSBzdHJ1Y3R1cmUuIERvZXMgbm90XG4gKiBjaGVjayBmb3IgZHVwbGljYXRlcy4gVG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXMsIHVzZSBzZXRNYXRoSGVscGVycy5jb2VyY2UuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNoYW5nZSBmcm9tIHVzaW5nIGFycmF5LWJhc2VkIFNldFZhbHVlcyB0byBDb3B5U2V0LWJhc2VkXG4gKiBDb3B5U2V0VmFsdWVzLlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBTZXRWYWx1ZX1cbiAqL1xuY29uc3QgICAgICAgIGlzU2V0VmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxTZXRWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzU2V0VmFsdWUoaXNTZXRWYWx1ZSk7XG5oYXJkZW4oaXNTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgQ29weUJhZ1xuICpcbiAqIEBwYXJhbSB7QW1vdW50VmFsdWV9IHZhbHVlXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgQ29weUJhZ31cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weUJhZ1ZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsQ29weUJhZ1ZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNDb3B5QmFnVmFsdWUoaXNDb3B5QmFnVmFsdWUpO1xuaGFyZGVuKGlzQ29weUJhZ1ZhbHVlKTtcblxuLyogT25lIEdPT0dPTHRoIHNob3VsZCBiZSBlbm91Z2ggZGVjaW1hbCBwbGFjZXMgZm9yIGFueWJvZHkuKi9cbmNvbnN0ICAgICAgICBNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVM9MTAwOyRo4oCNX29uY2UuTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyk7XG5cbmNvbnN0ICAgICAgICBBc3NldEtpbmRTaGFwZT1NLm9yKCduYXQnLCdzZXQnLCdjb3B5U2V0JywnY29weUJhZycpOyRo4oCNX29uY2UuQXNzZXRLaW5kU2hhcGUoQXNzZXRLaW5kU2hhcGUpO1xuXG5jb25zdCAgICAgICAgRGlzcGxheUluZm9TaGFwZT1NLnNwbGl0UmVjb3JkKFxue30sXG57XG5kZWNpbWFsUGxhY2VzOk0uYW5kKFxuTS5ndGUoLU1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyksXG5NLmx0ZShNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpKSxcblxuYXNzZXRLaW5kOkFzc2V0S2luZFNoYXBlfSxcblxue1xuLyogSW5jbHVkaW5nIHRoaXMgZW1wdHkgYHJlc3RgIGVuc3VyZXMgdGhhdCB0aGVyZSBhcmUgbm8gb3RoZXIqL1xuLyogcHJvcGVydGllcyBiZXlvbmQgdGhvc2UgaW4gdGhlIGBiYXNlYCByZWNvcmQuKi99KTskaOKAjV9vbmNlLkRpc3BsYXlJbmZvU2hhcGUoRGlzcGxheUluZm9TaGFwZSk7XG5cblxuXG5jb25zdCAgICAgICAgSXNzdWVyS2l0U2hhcGU9aGFyZGVuKHtcbmJyYW5kOkJyYW5kU2hhcGUsXG5taW50Ok1pbnRTaGFwZSxcbm1pbnRSZWNvdmVyeVB1cnNlOlB1cnNlU2hhcGUsXG5pc3N1ZXI6SXNzdWVyU2hhcGUsXG5kaXNwbGF5SW5mbzpEaXNwbGF5SW5mb1NoYXBlfSk7XG5cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEludGVyZmFjZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qLyRo4oCNX29uY2UuSXNzdWVyS2l0U2hhcGUoSXNzdWVyS2l0U2hhcGUpO1xuXG5jb25zdCAgICAgICAgQnJhbmRJPU0uaW50ZXJmYWNlKCdCcmFuZCcse1xuaXNNeUlzc3VlcjpNLmNhbGxXaGVuKE0uYXdhaXQoSXNzdWVyU2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldEFsbGVnZWROYW1lOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXREaXNwbGF5SW5mbzpNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxuZ2V0QW1vdW50U2hhcGU6TS5jYWxsKCkucmV0dXJucyhNLnBhdHRlcm4oKSl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2JyYW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthc3NldEtpbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Ftb3VudFNoYXBlXVxuICovJGjigI1fb25jZS5CcmFuZEkoQnJhbmRJKTtcbmNvbnN0ICAgICAgICBtYWtlSXNzdWVySW50ZXJmYWNlcz0oXG5icmFuZFNoYXBlPUJyYW5kU2hhcGUsXG5hc3NldEtpbmRTaGFwZT1Bc3NldEtpbmRTaGFwZSxcbmFtb3VudFNoYXBlPUFtb3VudFNoYXBlKT0+XG57XG5jb25zdCBJc3N1ZXJJPU0uaW50ZXJmYWNlKCdJc3N1ZXInLHtcbmdldEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG5nZXRBbGxlZ2VkTmFtZTpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0QXNzZXRLaW5kOk0uY2FsbCgpLnJldHVybnMoYXNzZXRLaW5kU2hhcGUpLFxuZ2V0RGlzcGxheUluZm86TS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbm1ha2VFbXB0eVB1cnNlOk0uY2FsbCgpLnJldHVybnMoUHVyc2VTaGFwZSksXG5cbmlzTGl2ZTpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRBbW91bnRPZjpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5idXJuOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5cbm9wdGlvbmFsKE0ucGF0dGVybigpKS5cbnJldHVybnMoYW1vdW50U2hhcGUpfSk7XG5cblxuY29uc3QgTWludEk9TS5pbnRlcmZhY2UoJ01pbnQnLHtcbmdldElzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbm1pbnRQYXltZW50Ok0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpfSk7XG5cblxuY29uc3QgUGF5bWVudEk9TS5pbnRlcmZhY2UoJ1BheW1lbnQnLHtcbmdldEFsbGVnZWRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpfSk7XG5cblxuY29uc3QgUHVyc2VJPU0uaW50ZXJmYWNlKCdQdXJzZScse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Ok0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyOk0uY2FsbCgpLnJldHVybnMoTm90aWZpZXJTaGFwZSksXG4vKiBQdXJzZUkgZG9lcyAqbm90KiBkZWxheSBgZGVwb3NpdGAgdW50aWwgYHNyY1BheW1lbnRgIGlzIGZ1bGZ1bGxlZC4qL1xuLyogUmF0aGVyLCB0aGUgc2VtYW50aWNzIG9mIGBkZXBvc2l0YCByZXF1aXJlIGl0IHRvIHByb3ZpZGUgaXRzKi9cbi8qIGNhbGxlcnMgd2l0aCBhIHN0cm9uZyBndWFyYW50ZWUgdGhhdCBgZGVwb3NpdGAgbWVzc2FnZXMgYXJlKi9cbi8qIHByb2Nlc3NlZCB3aXRob3V0IGZ1cnRoZXIgZGVsYXkgaW4gdGhlIG9yZGVyIHRoZXkgYXJyaXZlLiovXG4vKiBQdXJzZUkgdGhlcmVmb3JlIHJlcXVpcmVzIHRoYXQgdGhlIGBzcmNQYXltZW50YCBhcmd1bWVudCBhbHJlYWR5Ki9cbi8qIGJlIGEgcmVtb3RhYmxlLCBub3QgYSBwcm9taXNlLiovXG4vKiBQdXJzZUkgb25seSBjYWxscyB0aGlzIHJhdyBtZXRob2QgYWZ0ZXIgdmFsaWRhdGluZyB0aGF0Ki9cbi8qIGBzcmNQYXltZW50YCBpcyBhIHJlbW90YWJsZSwgbGVhdmluZyBpdCovXG4vKiB0byB0aGlzIHJhdyBtZXRob2QgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIHJlbW90YWJsZSBpcyBhY3R1YWxseSovXG4vKiBhIGxpdmUgcGF5bWVudCBvZiB0aGUgY29ycmVjdCBicmFuZCB3aXRoIHN1ZmZpY2llbnQgZnVuZHMuKi9cbmRlcG9zaXQ6TS5jYWxsKFBheW1lbnRTaGFwZSkub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuZ2V0RGVwb3NpdEZhY2V0Ok0uY2FsbCgpLnJldHVybnMoRGVwb3NpdEZhY2V0U2hhcGUpLFxud2l0aGRyYXc6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG5nZXRSZWNvdmVyeVNldDpNLmNhbGwoKS5yZXR1cm5zKE0uc2V0T2YoUGF5bWVudFNoYXBlKSksXG5yZWNvdmVyQWxsOk0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpfSk7XG5cblxuY29uc3QgRGVwb3NpdEZhY2V0ST1NLmludGVyZmFjZSgnRGVwb3NpdEZhY2V0Jyx7XG5yZWNlaXZlOlB1cnNlSS5tZXRob2RHdWFyZHMuZGVwb3NpdH0pO1xuXG5cbmNvbnN0IFB1cnNlSUtpdD1oYXJkZW4oe1xucHVyc2U6UHVyc2VJLFxuZGVwb3NpdEZhY2V0OkRlcG9zaXRGYWNldEl9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbklzc3VlckksXG5NaW50SSxcblBheW1lbnRJLFxuUHVyc2VJS2l0fSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUlzc3VlckludGVyZmFjZXMobWFrZUlzc3VlckludGVyZmFjZXMpO1xuaGFyZGVuKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmFuZFNoYXBlIjpbIkJyYW5kU2hhcGUiXSwiSXNzdWVyU2hhcGUiOlsiSXNzdWVyU2hhcGUiXSwiUGF5bWVudFNoYXBlIjpbIlBheW1lbnRTaGFwZSJdLCJQdXJzZVNoYXBlIjpbIlB1cnNlU2hhcGUiXSwiRGVwb3NpdEZhY2V0U2hhcGUiOlsiRGVwb3NpdEZhY2V0U2hhcGUiXSwiTm90aWZpZXJTaGFwZSI6WyJOb3RpZmllclNoYXBlIl0sIk1pbnRTaGFwZSI6WyJNaW50U2hhcGUiXSwiQW1vdW50U2hhcGUiOlsiQW1vdW50U2hhcGUiXSwiUmF0aW9TaGFwZSI6WyJSYXRpb1NoYXBlIl0sImlzTmF0VmFsdWUiOlsiaXNOYXRWYWx1ZSJdLCJpc0NvcHlTZXRWYWx1ZSI6WyJpc0NvcHlTZXRWYWx1ZSJdLCJpc1NldFZhbHVlIjpbImlzU2V0VmFsdWUiXSwiaXNDb3B5QmFnVmFsdWUiOlsiaXNDb3B5QmFnVmFsdWUiXSwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIjpbIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyJdLCJBc3NldEtpbmRTaGFwZSI6WyJBc3NldEtpbmRTaGFwZSJdLCJEaXNwbGF5SW5mb1NoYXBlIjpbIkRpc3BsYXlJbmZvU2hhcGUiXSwiSXNzdWVyS2l0U2hhcGUiOlsiSXNzdWVyS2l0U2hhcGUiXSwiQnJhbmRJIjpbIkJyYW5kSSJdLCJtYWtlSXNzdWVySW50ZXJmYWNlcyI6WyJtYWtlSXNzdWVySW50ZXJmYWNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAsz6lRcD8AAHA/AAApAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVzLWFtYmllbnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAamVzc2llLWNoZWNrKi9cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gQW1vdW50XG4gKiBBbW91bnRzIGFyZSBkZXNjcmlwdGlvbnMgb2YgZGlnaXRhbCBhc3NldHMsIGFuc3dlcmluZyB0aGUgcXVlc3Rpb25zXG4gKiBcImhvdyBtdWNoXCIgYW5kIFwib2Ygd2hhdCBraW5kXCIuIEFtb3VudHMgYXJlIHZhbHVlcyBsYWJlbGVkIHdpdGggYSBicmFuZC5cbiAqIEFtb3VudE1hdGggZXhlY3V0ZXMgdGhlIGxvZ2ljIG9mIGhvdyBhbW91bnRzIGFyZSBjaGFuZ2VkIHdoZW4gZGlnaXRhbFxuICogYXNzZXRzIGFyZSBtZXJnZWQsIHNlcGFyYXRlZCwgb3Igb3RoZXJ3aXNlIG1hbmlwdWxhdGVkLiBGb3JcbiAqIGV4YW1wbGUsIGEgZGVwb3NpdCBvZiAyIGJ1Y2tzIGludG8gYSBwdXJzZSB0aGF0IGFscmVhZHkgaGFzIDMgYnVja3NcbiAqIGdpdmVzIGEgbmV3IHB1cnNlIGJhbGFuY2Ugb2YgNSBidWNrcy4gQW4gZW1wdHkgcHVyc2UgaGFzIDAgYnVja3MuIEFtb3VudE1hdGhcbiAqIHJlbGllcyBoZWF2aWx5IG9uIHBvbHltb3JwaGljIE1hdGhIZWxwZXJzLCB3aGljaCBtYW5pcHVsYXRlIHRoZSB1bmJyYW5kZWRcbiAqIHBvcnRpb24uXG4gKlxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwcm9wZXJ0eSB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59IHZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TmF0VmFsdWUgfCBTZXRWYWx1ZSB8IENvcHlTZXQgfCBDb3B5QmFnfSBBbW91bnRWYWx1ZVxuICogQW4gYEFtb3VudFZhbHVlYCBkZXNjcmliZXMgYSBzZXQgb3IgcXVhbnRpdHkgb2YgYXNzZXRzIHRoYXQgY2FuIGJlIG93bmVkIG9yXG4gKiBzaGFyZWQuXG4gKlxuICogQSBmdW5naWJsZSBgQW1vdW50VmFsdWVgIHVzZXMgYSBub24tbmVnYXRpdmUgYmlnaW50IHRvIHJlcHJlc2VudCBhIHF1YW50aXR5XG4gKiBvZiB0aGF0IG1hbnkgYXNzZXRzLlxuICpcbiAqIEEgbm9uLWZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhbiBhcnJheSBvciBDb3B5U2V0IG9mIGBLZXlgcyB0byByZXByZXNlbnRcbiAqIGEgc2V0IG9mIHdoYXRldmVyIGFzc2V0IGVhY2gga2V5IHJlcHJlc2VudHMuIEEgYEtleWAgaXMgYSBwYXNzYWJsZSB2YWx1ZVxuICogdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBlbGVtZW50IGluIGEgc2V0IChTZXRTdG9yZSBvciBDb3B5U2V0KSBvciBhcyB0aGVcbiAqIGtleSBpbiBhIG1hcCAoTWFwU3RvcmUgb3IgQ29weU1hcCkuXG4gKlxuICogYFNldFZhbHVlYCBpcyBmb3IgdGhlIGRlcHJlY2F0ZWQgc2V0IHJlcHJlc2VudGF0aW9uLCB1c2luZyBhbiBhcnJheSBkaXJlY3RseVxuICogdG8gcmVwcmVzZW50IHRoZSBhcnJheSBvZiBpdHMgZWxlbWVudHMuIGBDb3B5U2V0YCBpcyB0aGUgcHJvcGVyXG4gKiByZXByZXNlbnRhdGlvbiB1c2luZyBhIENvcHlTZXQuXG4gKlxuICogQSBzZW1pLWZ1bmdpYmxlIGBDb3B5QmFnYCBpcyByZXByZXNlbnRlZCBhcyBhXG4gKiBgQ29weUJhZ2Agb2YgYEtleWAgb2JqZWN0cy4gXCJCYWdcIiBpcyBzeW5vbnltb3VzIHdpdGggTXVsdGlTZXQsIHdoZXJlIGFuXG4gKiBlbGVtZW50IG9mIGEgYmFnIGNhbiBiZSBwcmVzZW50IG9uY2Ugb3IgbW9yZSB0aW1lcywgaS5lLiwgc29tZSBwb3NpdGl2ZVxuICogYmlnaW50IG51bWJlciBvZiB0aW1lcywgcmVwcmVzZW50aW5nIHRoYXQgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IHJlcHJlc2VudGVkXG4gKiBieSB0aGF0IGtleS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnbmF0JyB8ICdzZXQnIHwgJ2NvcHlTZXQnIHwgJ2NvcHlCYWcnIH0gQXNzZXRLaW5kXG4gKlxuICogU2VlIGRvYy1jb21tZW50IGZvciBgQW1vdW50VmFsdWVgLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEB0eXBlZGVmIHtLIGV4dGVuZHMgJ25hdCcgPyBOYXRWYWx1ZSA6XG4gKiBLIGV4dGVuZHMgJ3NldCcgPyBTZXRWYWx1ZSA6XG4gKiBLIGV4dGVuZHMgJ2NvcHlTZXQnID8gQ29weVNldDpcbiAqIEsgZXh0ZW5kcyAnY29weUJhZycgPyBDb3B5QmFnIDpcbiAqIG5ldmVyXG4gKiB9IEFzc2V0VmFsdWVGb3JLaW5kXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAdHlwZWRlZiB7ViBleHRlbmRzIE5hdFZhbHVlID8gJ25hdCcgOlxuICogIFYgZXh0ZW5kcyBTZXRWYWx1ZSA/ICdzZXQnIDpcbiAqICBWIGV4dGVuZHMgQ29weVNldCA/ICdjb3B5U2V0JyA6XG4gKiAgViBleHRlbmRzIENvcHlCYWcgPyAnY29weUJhZycgOlxuICogIG5ldmVyfSBBc3NldEtpbmRGb3JWYWx1ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlY2ltYWxQbGFjZXNdIFRlbGxzIHRoZSBkaXNwbGF5IHNvZnR3YXJlIGhvd1xuICogICBtYW55IGRlY2ltYWwgcGxhY2VzIHRvIG1vdmUgdGhlIGRlY2ltYWwgb3ZlciB0byB0aGUgbGVmdCwgb3IgaW5cbiAqICAgb3RoZXIgd29yZHMsIHdoaWNoIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHdob2xlIG51bWJlcnMuIFdlXG4gKiAgIHJlcXVpcmUgZnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdG8gYmUgcmVwcmVzZW50ZWQgaW4gaW50ZWdlcnMsIGluXG4gKiAgIHRoZSBzbWFsbGVzdCB1bml0IChpLmUuIFVTRCBtaWdodCBiZSByZXByZXNlbnRlZCBpbiBtaWxsLCBhXG4gKiAgIHRob3VzYW5kdGggb2YgYSBkb2xsYXIuIEluIHRoYXQgY2FzZSwgYGRlY2ltYWxQbGFjZXNgIHdvdWxkIGJlXG4gKiAgIDMuKSBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgZm9yIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiAgIGFzc2V0cywgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuIFRoZSBkZWNpbWFsUGxhY2VzIHByb3BlcnR5XG4gKiAgIHNob3VsZCBiZSB1c2VkIGZvciAqZGlzcGxheSBwdXJwb3NlcyBvbmx5Ki4gQW55IG90aGVyIHVzZSBpcyBhblxuICogICBhbnRpLXBhdHRlcm4uXG4gKiBAcHJvcGVydHkge0t9IGFzc2V0S2luZCAtIHRoZSBraW5kIG9mIGFzc2V0LCBlaXRoZXJcbiAqICAgQXNzZXRLaW5kLk5BVCAoZnVuZ2libGUpIG9yXG4gKiAgIEFzc2V0S2luZC5TRVQgb3IgQXNzZXRLaW5kLkNPUFlfU0VUIChub24tZnVuZ2libGUpXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gQnJhbmRcbiAqIFRoZSBicmFuZCBpZGVudGlmaWVzIHRoZSBraW5kIG9mIGlzc3VlciwgYW5kIGhhcyBhIGZ1bmN0aW9uIHRvIGdldCB0aGVcbiAqIGFsbGVnZWQgbmFtZSBmb3IgdGhlIGtpbmQgb2YgYXNzZXQgZGVzY3JpYmVkLiBUaGUgYWxsZWdlZCBuYW1lIChzdWNoXG4gKiBhcyAnQlRDJyBvciAnbW9vbGEnKSBpcyBwcm92aWRlZCBieSB0aGUgbWFrZXIgb2YgdGhlIGlzc3VlciBhbmQgc2hvdWxkXG4gKiBub3QgYmUgdHJ1c3RlZCBhcyBhY2N1cmF0ZS5cbiAqXG4gKiBFdmVyeSBhbW91bnQgY3JlYXRlZCBieSBhIHBhcnRpY3VsYXIgQW1vdW50TWF0aCB3aWxsIHNoYXJlIHRoZSBzYW1lIGJyYW5kLFxuICogYnV0IHJlY2lwaWVudHMgY2Fubm90IHJlbHkgb24gdGhlIGJyYW5kIHRvIHZlcmlmeSB0aGF0IGEgcHVycG9ydGVkIGFtb3VudFxuICogcmVwcmVzZW50cyB0aGUgaXNzdWVyIHRoZXkgaW50ZW5kZWQsIHNpbmNlIHRoZSBzYW1lIGJyYW5kIGNhbiBiZSByZXVzZWQgYnlcbiAqIGEgbWlzYmVoYXZpbmcgaXNzdWVyLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRJc3N1ZXI6IEVSZWY8SXNzdWVyPikgPT4gUHJvbWlzZTxib29sZWFuPn0gaXNNeUlzc3VlclxuICogU2hvdWxkIGJlIHVzZWQgd2l0aCBgaXNzdWVyLmdldEJyYW5kYCB0byBlbnN1cmUgYW4gaXNzdWVyIGFuZCBicmFuZCBtYXRjaC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRBbGxlZ2VkTmFtZVxuICogQHByb3BlcnR5IHsoKSA9PiBEaXNwbGF5SW5mbzxLPn0gZ2V0RGlzcGxheUluZm9cbiAqIEdpdmUgaW5mb3JtYXRpb24gdG8gVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUGF0dGVybn0gZ2V0QW1vdW50U2hhcGVcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSXNzdWVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlcklzTGl2ZVxuICpcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXltZW50IGNvbnRpbnVlcyB0byBleGlzdC5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckdldEFtb3VudE9mXG4gKlxuICogR2V0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQuIEJlY2F1c2UgdGhlXG4gKiBwYXltZW50IGlzIG5vdCB0cnVzdGVkLCB3ZSBjYW5ub3QgY2FsbCBhIG1ldGhvZCBvbiBpdCBkaXJlY3RseSwgYW5kXG4gKiBtdXN0IHVzZSB0aGUgaXNzdWVyIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHJldHVybnMge1Byb21pc2U8QW1vdW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJCdXJuXG4gKlxuICogQnVybiBhbGwgb2YgdGhlIGRpZ2l0YWwgYXNzZXRzIGluIHRoZVxuICogcGF5bWVudC4gYG9wdEFtb3VudGAgaXMgb3B0aW9uYWwuIElmIGBvcHRBbW91bnRgIGlzIHByZXNlbnQsIHRoZVxuICogY29kZSB3aWxsIGluc2lzdCB0aGF0IHRoZSBhbW91bnQgb2YgdGhlIGRpZ2l0YWwgYXNzZXRzIGluIHRoZVxuICogcGF5bWVudCBpcyBlcXVhbCB0byBgb3B0QW1vdW50YCwgdG8gcHJldmVudCBzZW5kaW5nIHRoZSB3cm9uZ1xuICogcGF5bWVudCBhbmQgb3RoZXIgY29uZnVzaW9uLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge1Byb21pc2U8QW1vdW50Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyQ2xhaW1cbiAqXG4gKiBUcmFuc2ZlciBhbGwgZGlnaXRhbCBhc3NldHMgZnJvbSB0aGUgcGF5bWVudCB0byBhIG5ldyBwYXltZW50IGFuZFxuICogZGVsZXRlIHRoZSBvcmlnaW5hbC4gYG9wdEFtb3VudGAgaXMgb3B0aW9uYWwuIElmIGBvcHRBbW91bnRgIGlzXG4gKiBwcmVzZW50LCB0aGUgY29kZSB3aWxsIGluc2lzdCB0aGF0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW5cbiAqIHRoZSBwYXltZW50IGlzIGVxdWFsIHRvIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nXG4gKiBwYXltZW50IGFuZCBvdGhlciBjb25mdXNpb24uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyQ29tYmluZVxuICpcbiAqIENvbWJpbmUgbXVsdGlwbGUgcGF5bWVudHMgaW50byBvbmUgcGF5bWVudC5cbiAqXG4gKiBJZiBhbnkgb2YgdGhlIHBheW1lbnRzIGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWRcbiAqIHVwb24gcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj5bXX0gcGF5bWVudHNBcnJheVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IFtvcHRUb3RhbEFtb3VudF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJTcGxpdFxuICpcbiAqIFNwbGl0IGEgc2luZ2xlIHBheW1lbnQgaW50byB0d28gcGF5bWVudHMsXG4gKiBBIGFuZCBCLCBhY2NvcmRpbmcgdG8gdGhlIHBheW1lbnRBbW91bnRBIHBhc3NlZCBpbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBwYXltZW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcGF5bWVudEFtb3VudEFcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz5bXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVyU3BsaXRNYW55XG4gKlxuICogU3BsaXQgYSBzaW5nbGUgcGF5bWVudCBpbnRvIG1hbnkgcGF5bWVudHMsIGFjY29yZGluZyB0byB0aGUgYW1vdW50c1xuICogcGFzc2VkIGluLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50W119IGFtb3VudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnRbXT59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyXG4gKlxuICogVGhlIGlzc3VlciBjYW5ub3QgbWludCBhIG5ldyBhbW91bnQsIGJ1dCBpdCBjYW4gY3JlYXRlIGVtcHR5IHB1cnNlc1xuICogYW5kIHBheW1lbnRzLiBUaGUgaXNzdWVyIGNhbiBhbHNvIHRyYW5zZm9ybSBwYXltZW50cyAoc3BsaXR0aW5nXG4gKiBwYXltZW50cywgY29tYmluaW5nIHBheW1lbnRzLCBidXJuaW5nIHBheW1lbnRzLCBhbmQgY2xhaW1pbmdcbiAqIHBheW1lbnRzIGV4Y2x1c2l2ZWx5KS4gVGhlIGlzc3VlciBzaG91bGQgYmUgZ290dGVuIGZyb20gYSB0cnVzdGVkXG4gKiBzb3VyY2UgYW5kIHRoZW4gcmVsaWVkIHVwb24gYXMgdGhlIGRlY2lkZXIgb2Ygd2hldGhlciBhbiB1bnRydXN0ZWRcbiAqIHBheW1lbnQgaXMgdmFsaWQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QnJhbmQgR2V0IHRoZSBCcmFuZCBmb3IgdGhpcyBJc3N1ZXIuIFRoZVxuICogQnJhbmQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQgYW5kIGlzIHNoYXJlZCBieSB0aGVcbiAqIG1pbnQsIHRoZSBpc3N1ZXIsIGFuZCBhbnkgcHVyc2VzIGFuZCBwYXltZW50cyBvZiB0aGlzIHBhcnRpY3VsYXJcbiAqIGtpbmQuIFRoZSBicmFuZCBpcyBub3QgY2xvc2VseSBoZWxkLCBzbyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmVcbiAqIHRydXN0ZWQgdG8gaWRlbnRpZnkgYW4gaXNzdWVyIGFsb25lLiBGYWtlIGRpZ2l0YWwgYXNzZXRzIGFuZCBhbW91bnRcbiAqIGNhbiB1c2UgYW5vdGhlciBpc3N1ZXIncyBicmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0QWxsZWdlZE5hbWUgR2V0IHRoZSBhbGxlZ2VkTmFtZSBmb3JcbiAqIHRoaXMgbWludC9pc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQXNzZXRLaW5kfSBnZXRBc3NldEtpbmQgR2V0IHRoZSBraW5kIG9mXG4gKiBNYXRoSGVscGVycyB1c2VkIGJ5IHRoaXMgSXNzdWVyLlxuICogQHByb3BlcnR5IHsoKSA9PiBEaXNwbGF5SW5mbzxLPn0gZ2V0RGlzcGxheUluZm8gR2l2ZSBpbmZvcm1hdGlvbiB0byBVSVxuICogIG9uIGhvdyB0byBkaXNwbGF5IGFtb3VudHMgZm9yIHRoaXMgaXNzdWVyLlxuICogQHByb3BlcnR5IHsoKSA9PiBQdXJzZTxLPn0gbWFrZUVtcHR5UHVyc2UgTWFrZSBhbiBlbXB0eSBwdXJzZSBvZiB0aGlzXG4gKiBicmFuZC5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVySXNMaXZlfSBpc0xpdmVcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyR2V0QW1vdW50T2Y8Sz59IGdldEFtb3VudE9mXG4gKiBAcHJvcGVydHkge0lzc3VlckJ1cm59IGJ1cm5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXltZW50TGVkZ2VyXG4gKiBAcHJvcGVydHkge01pbnQ8Sz59IG1pbnRcbiAqIEBwcm9wZXJ0eSB7UHVyc2U8Sz59IG1pbnRSZWNvdmVyeVB1cnNlXG4gKiBAcHJvcGVydHkge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlcktpdFxuICogQHByb3BlcnR5IHtNaW50PEs+fSBtaW50XG4gKiBAcHJvcGVydHkge1B1cnNlPEs+fSBtaW50UmVjb3ZlcnlQdXJzZVxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwcm9wZXJ0eSB7RGlzcGxheUluZm99IGRpc3BsYXlJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBZGRpdGlvbmFsRGlzcGxheUluZm9cbiAqXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlY2ltYWxQbGFjZXNdIFRlbGxzIHRoZSBkaXNwbGF5IHNvZnR3YXJlIGhvd1xuICogICBtYW55IGRlY2ltYWwgcGxhY2VzIHRvIG1vdmUgdGhlIGRlY2ltYWwgb3ZlciB0byB0aGUgbGVmdCwgb3IgaW5cbiAqICAgb3RoZXIgd29yZHMsIHdoaWNoIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHdob2xlIG51bWJlcnMuIFdlXG4gKiAgIHJlcXVpcmUgZnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdG8gYmUgcmVwcmVzZW50ZWQgaW4gaW50ZWdlcnMsIGluXG4gKiAgIHRoZSBzbWFsbGVzdCB1bml0IChpLmUuIFVTRCBtaWdodCBiZSByZXByZXNlbnRlZCBpbiBtaWxsLCBhXG4gKiAgIHRob3VzYW5kdGggb2YgYSBkb2xsYXIuIEluIHRoYXQgY2FzZSwgYGRlY2ltYWxQbGFjZXNgIHdvdWxkIGJlXG4gKiAgIDMuKSBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgZm9yIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiAgIGFzc2V0cywgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuIFRoZSBkZWNpbWFsUGxhY2VzIHByb3BlcnR5XG4gKiAgIHNob3VsZCBiZSB1c2VkIGZvciAqZGlzcGxheSBwdXJwb3NlcyBvbmx5Ki4gQW55IG90aGVyIHVzZSBpcyBhblxuICogICBhbnRpLXBhdHRlcm4uXG4gKiBAcHJvcGVydHkge0Fzc2V0S2luZH0gW2Fzc2V0S2luZF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLlNodXRkb3duV2l0aEZhaWx1cmV9IFNodXRkb3duV2l0aEZhaWx1cmVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNaW50XG4gKiBIb2xkaW5nIGEgTWludCBjYXJyaWVzIHRoZSByaWdodCB0byBpc3N1ZSBuZXcgZGlnaXRhbCBhc3NldHMuIFRoZXNlXG4gKiBhc3NldHMgYWxsIGhhdmUgdGhlIHNhbWUga2luZCwgd2hpY2ggaXMgY2FsbGVkIGEgQnJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXI8Sz59IGdldElzc3VlciBHZXRzIHRoZSBJc3N1ZXIgZm9yIHRoaXMgbWludC5cbiAqIEBwcm9wZXJ0eSB7KG5ld0Ftb3VudDogQW1vdW50PEs+KSA9PiBQYXltZW50PEs+fSBtaW50UGF5bWVudFxuICogQ3JlYXRlcyBhIG5ldyBQYXltZW50IGNvbnRhaW5pbmcgbmV3bHkgbWludGVkIGFtb3VudC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBEZXBvc2l0RmFjZXRSZWNlaXZlXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge0Ftb3VudH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlcG9zaXRGYWNldFxuICogQHByb3BlcnR5IHtEZXBvc2l0RmFjZXRSZWNlaXZlfSByZWNlaXZlXG4gKiBEZXBvc2l0IGFsbCB0aGUgY29udGVudHMgb2YgcGF5bWVudCBpbnRvIHRoZSBwdXJzZSB0aGF0IG1hZGUgdGhpcyBmYWNldCxcbiAqIHJldHVybmluZyB0aGUgYW1vdW50LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgYG9wdEFtb3VudGAgZG9lcyBub3QgZXF1YWwgdGhlXG4gKiBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIElmIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aHJvdyBhbiBlcnJvci5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgUHVyc2VEZXBvc2l0XG4gKiBAcGFyYW0ge1BheW1lbnQ8Sz59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdXJzZVxuICogUHVyc2VzIGhvbGQgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIG9mIHRoZSBzYW1lIGJyYW5kLCBidXQgdW5saWtlIFBheW1lbnRzLFxuICogdGhleSBhcmUgbm90IG1lYW50IHRvIGJlIHNlbnQgdG8gb3RoZXJzLiBUbyB0cmFuc2ZlciBkaWdpdGFsIGFzc2V0cywgYVxuICogUGF5bWVudCBzaG91bGQgYmUgd2l0aGRyYXduIGZyb20gYSBQdXJzZS4gVGhlIGFtb3VudCBvZiBkaWdpdGFsXG4gKiBhc3NldHMgaW4gYSBwdXJzZSBjYW4gY2hhbmdlIHRocm91Z2ggdGhlIGFjdGlvbiBvZiBkZXBvc2l0KCkgYW5kIHdpdGhkcmF3KCkuXG4gKlxuICogVGhlIHByaW1hcnkgdXNlIGZvciBQdXJzZXMgYW5kIFBheW1lbnRzIGlzIGZvciBjdXJyZW5jeS1saWtlIGFuZCBnb29kcy1saWtlXG4gKiBkaWdpdGFsIGFzc2V0cywgYnV0IHRoZXkgY2FuIGFsc28gYmUgdXNlZCB0byByZXByZXNlbnQgb3RoZXIga2luZHMgb2YgcmlnaHRzLFxuICogc3VjaCBhcyB0aGUgcmlnaHQgdG8gcGFydGljaXBhdGUgaW4gYSBwYXJ0aWN1bGFyIGNvbnRyYWN0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEFsbGVnZWRCcmFuZCBHZXQgdGhlIGFsbGVnZWQgQnJhbmQgZm9yIHRoaXMgUHVyc2VcbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudDxLPn0gZ2V0Q3VycmVudEFtb3VudFxuICogR2V0IHRoZSBhbW91bnQgY29udGFpbmVkIGluIHRoaXMgcHVyc2UuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBMYXRlc3RUb3BpYzxBbW91bnQ8Sz4+fSBnZXRDdXJyZW50QW1vdW50Tm90aWZpZXJcbiAqIEdldCBhIGxvc3N5IG5vdGlmaWVyIGZvciBjaGFuZ2VzIHRvIHRoaXMgcHVyc2UncyBiYWxhbmNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7UHVyc2VEZXBvc2l0PEs+fSBkZXBvc2l0XG4gKiBEZXBvc2l0IGFsbCB0aGUgY29udGVudHMgb2YgcGF5bWVudCBpbnRvIHRoaXMgcHVyc2UsIHJldHVybmluZyB0aGVcbiAqIGFtb3VudC4gSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBvcHRBbW91bnRgIGRvZXMgbm90IGVxdWFsIHRoZVxuICogYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBJZiBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBEZXBvc2l0RmFjZXR9IGdldERlcG9zaXRGYWNldFxuICogUmV0dXJuIGFuIG9iamVjdCB3aG9zZSBgcmVjZWl2ZWAgbWV0aG9kIGRlcG9zaXRzIHRvIHRoZSBjdXJyZW50IFB1cnNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudDogQW1vdW50PEs+KSA9PiBQYXltZW50PEs+fSB3aXRoZHJhd1xuICogV2l0aGRyYXcgYW1vdW50IGZyb20gdGhpcyBwdXJzZSBpbnRvIGEgbmV3IFBheW1lbnQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBDb3B5U2V0PFBheW1lbnQ8Sz4+fSBnZXRSZWNvdmVyeVNldFxuICogVGhlIHNldCBvZiBwYXltZW50cyB3aXRoZHJhd24gZnJvbSB0aGlzIHB1cnNlIHRoYXQgYXJlIHN0aWxsIGxpdmUuIFRoZXNlXG4gKiBhcmUgdGhlIHBheW1lbnRzIHRoYXQgY2FuIHN0aWxsIGJlIHJlY292ZXJlZCBpbiBlbWVyZ2VuY2llcyBieSwgZm9yIGV4YW1wbGUsXG4gKiBkZXBvc2l0aW5nIGludG8gdGhpcyBwdXJzZS4gU3VjaCBhIGRlcG9zaXQgYWN0aW9uIGlzIGxpa2UgY2FuY2VsaW5nIGFuXG4gKiBvdXRzdGFuZGluZyBjaGVjayBiZWNhdXNlIHlvdSdyZSB0aXJlZCBvZiB3YWl0aW5nIGZvciBpdC4gT25jZSB5b3VyXG4gKiBjYW5jZWxsYXRpb24gaXMgYWNrbm93bGVkZ2VkLCB5b3UgY2FuIHNwZW5kIHRoZSBhc3NldHMgYXQgc3Rha2Ugb24gb3RoZXJcbiAqIHRoaW5ncy4gQWZ0ZXJ3YXJkcywgaWYgdGhlIHJlY2lwaWVudCBvZiB0aGUgb3JpZ2luYWwgY2hlY2sgZmluYWxseSBnZXRzXG4gKiBhcm91bmQgdG8gZGVwb3NpdGluZyBpdCwgdGhlaXIgZGVwb3NpdCBmYWlscy5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudDxLPn0gcmVjb3ZlckFsbFxuICogRm9yIHVzZSBpbiBlbWVyZ2VuY2llcywgc3VjaCBhcyBjb21pbmcgYmFjayBmcm9tIGEgdHJhdW1hdGljIGNyYXNoIGFuZFxuICogdXBncmFkZS4gVGhpcyBkZXBvc2l0cyBhbGwgdGhlIHBheW1lbnRzIGluIHRoaXMgcHVyc2UncyByZWNvdmVyeSBzZXRcbiAqIGludG8gdGhlIHB1cnNlIGl0c2VsZiwgcmV0dXJuaW5nIHRoZSB0b3RhbCBhbW91bnQgb2YgYXNzZXRzIHJlY292ZXJlZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXltZW50XG4gKiBQYXltZW50cyBob2xkIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBvZiB0aGUgc2FtZSBicmFuZCBpbiB0cmFuc2l0LiBQYXltZW50c1xuICogY2FuIGJlIGRlcG9zaXRlZCBpbiBwdXJzZXMsIHNwbGl0IGludG8gbXVsdGlwbGUgcGF5bWVudHMsIGNvbWJpbmVkLCBhbmRcbiAqIGNsYWltZWQgKGdldHRpbmcgYW4gZXhjbHVzaXZlIHBheW1lbnQpLiBQYXltZW50cyBhcmUgbGluZWFyLCBtZWFuaW5nXG4gKiB0aGF0IGVpdGhlciBhIHBheW1lbnQgaGFzIHRoZSBzYW1lIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpdFxuICogc3RhcnRlZCB3aXRoLCBvciBpdCBpcyB1c2VkIHVwIGVudGlyZWx5LiBJdCBpcyBpbXBvc3NpYmxlIHRvIHBhcnRpYWxseSB1c2UgYVxuICogcGF5bWVudC5cbiAqXG4gKiBQYXltZW50cyBhcmUgb2Z0ZW4gcmVjZWl2ZWQgZnJvbSBvdGhlciBhY3RvcnMgYW5kIHRoZXJlZm9yZSBzaG91bGRcbiAqIG5vdCBiZSB0cnVzdGVkIHRoZW1zZWx2ZXMuIFRvIGdldCB0aGUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIGEgcGF5bWVudCxcbiAqIHVzZSB0aGUgdHJ1c3RlZCBpc3N1ZXI6IGlzc3Vlci5nZXRBbW91bnRPZihwYXltZW50KSxcbiAqXG4gKiBQYXltZW50cyBjYW4gYmUgY29udmVydGVkIHRvIFB1cnNlcyBieSBnZXR0aW5nIGEgdHJ1c3RlZCBpc3N1ZXIgYW5kXG4gKiBjYWxsaW5nIGBpc3N1ZXIubWFrZUVtcHR5UHVyc2UoKWAgdG8gY3JlYXRlIGEgcHVyc2UsIHRoZW5cbiAqIGBwdXJzZS5kZXBvc2l0KHBheW1lbnQpYC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRBbGxlZ2VkQnJhbmRcbiAqIEdldCB0aGUgYWxsZWdlZEJyYW5kLCBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQgdGhpc1xuICogcGF5bWVudCBwdXJwb3J0cyB0byBiZSwgYW5kIHdoaWNoIGlzc3VlciB0byB1c2UuIEJlY2F1c2UgcGF5bWVudHNcbiAqIGFyZSBub3QgdHJ1c3RlZCwgYW55IG1ldGhvZCBjYWxscyBvbiBwYXltZW50cyBzaG91bGQgYmUgdHJlYXRlZFxuICogd2l0aCBzdXNwaWNpb24gYW5kIHZlcmlmaWVkIGVsc2V3aGVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGhIZWxwZXJzXG4gKiBBbGwgb2YgdGhlIGRpZmZlcmVuY2UgaW4gaG93IGRpZ2l0YWwgYXNzZXQgYW1vdW50IGFyZSBtYW5pcHVsYXRlZCBjYW4gYmVcbiAqIHJlZHVjZWQgdG8gdGhlIGJlaGF2aW9yIG9mIHRoZSBtYXRoIG9uIHZhbHVlcy4gV2UgZXh0cmFjdCB0aGlzXG4gKiBjdXN0b20gbG9naWMgaW50byBtYXRoSGVscGVycy4gTWF0aEhlbHBlcnMgYXJlIGFib3V0IHZhbHVlXG4gKiBhcml0aG1ldGljLCB3aGVyZWFzIEFtb3VudE1hdGggaXMgYWJvdXQgYW1vdW50cywgd2hpY2ggYXJlIHRoZVxuICogdmFsdWVzIGxhYmVsZWQgd2l0aCBhIGJyYW5kLiBBbW91bnRNYXRoIHVzZSBtYXRoSGVscGVycyB0byBkbyB0aGVpciB2YWx1ZVxuICogYXJpdGhtZXRpYywgYW5kIHRoZW4gYnJhbmQgdGhlIHJlc3VsdHMsIG1ha2luZyBhIG5ldyBhbW91bnQuXG4gKlxuICogVGhlIE1hdGhIZWxwZXJzIGFyZSBkZXNpZ25lZCB0byBiZSBjYWxsZWQgb25seSBmcm9tIEFtb3VudE1hdGgsIGFuZCBzb1xuICogYWxsIG1ldGhvZHMgYnV0IGNvZXJjZSBjYW4gYXNzdW1lIHRoZWlyIGlucHV0cyBhcmUgdmFsaWQuIFRoZXkgb25seVxuICogbmVlZCB0byBkbyBvdXRwdXQgdmFsaWRhdGlvbiwgYW5kIG9ubHkgd2hlbiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IG9mXG4gKiBpbnZhbGlkIG91dHB1dC5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkVmFsdWU6IFYpID0+IFZ9IGRvQ29lcmNlXG4gKiBDaGVjayB0aGUga2luZCBvZiB0aGlzIHZhbHVlIGFuZCB0aHJvdyBpZiBpdCBpcyBub3QgdGhlXG4gKiBleHBlY3RlZCBraW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVn0gZG9NYWtlRW1wdHlcbiAqIEdldCB0aGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBpZGVudGl0eSBlbGVtZW50IChvZnRlbiAwIG9yIGFuXG4gKiBlbXB0eSBhcnJheSlcbiAqXG4gKiBAcHJvcGVydHkgeyh2YWx1ZTogVikgPT4gYm9vbGVhbn0gZG9Jc0VtcHR5XG4gKiBJcyB0aGUgdmFsdWUgdGhlIGlkZW50aXR5IGVsZW1lbnQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IGJvb2xlYW59IGRvSXNHVEVcbiAqIElzIHRoZSBsZWZ0IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcmlnaHQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IGJvb2xlYW59IGRvSXNFcXVhbFxuICogRG9lcyBsZWZ0IGVxdWFsIHJpZ2h0P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBWfSBkb0FkZFxuICogUmV0dXJuIHRoZSBsZWZ0IGNvbWJpbmVkIHdpdGggdGhlIHJpZ2h0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBWfSBkb1N1YnRyYWN0XG4gKiBSZXR1cm4gd2hhdCByZW1haW5zIGFmdGVyIHJlbW92aW5nIHRoZSByaWdodCBmcm9tIHRoZSBsZWZ0LiBJZlxuICogc29tZXRoaW5nIGluIHRoZSByaWdodCB3YXMgbm90IGluIHRoZSBsZWZ0LCB3ZSB0aHJvdyBhbiBlcnJvci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtiaWdpbnR9IE5hdFZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7QXJyYXk8S2V5Pn0gU2V0VmFsdWVcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABt22EKXigAAF4oAAAnAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NhbGxiYWNrLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJjYWxsRSIsImNhbGxTeW5jIiwiaXNDYWxsYmFjayIsIm1ha2VGdW5jdGlvbkNhbGxiYWNrIiwibWFrZU1ldGhvZENhbGxiYWNrIiwibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIiwibWFrZVN5bmNNZXRob2RDYWxsYmFjayIsInByZXBhcmVBdHRlbnVhdG9yIiwicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsaXNPYmplY3QsaXNQYXNzYWJsZVN5bWJvbDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJpc1Bhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChpc1Bhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuY29uc3R7ZnJvbUVudHJpZXN9PU9iamVjdDtcblxuY29uc3R7b3duS2V5czpyYXdPd25LZXlzfT1SZWZsZWN0O1xuY29uc3Qgb3duS2V5cz1cbi8qKiBAdHlwZSB7PFQgZXh0ZW5kcyBQcm9wZXJ0eUtleT4ob2JqOiB7W0sgaW4gVF0/OiB1bmtub3dufSkgPT4gVFtdfSAqL1xucmF3T3duS2V5cztcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8UmV0dXJuVHlwZTxwcmVwYXJlQXR0ZW51YXRvcj4+KSA9PiBGYXJhYmxlPFQ+fSBNYWtlQXR0ZW51YXRvclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IElcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuQ2FsbGJhY2s8ST59IENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5TeW5jQ2FsbGJhY2s8ST59IFN5bmNDYWxsYmFja1xuICovXG5cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPiAmIFR9IEZhcmFibGUgKi9cblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGtleVxuICogQHJldHVybnMge2tleSBpcyBQcm9wZXJ0eUtleX0gRklYTUU6IHNob3VsZCBiZSBqdXN0IGBQcm9wZXJ0eUtleWAgYnV0IFRTXG4gKiBjb21wbGFpbnMgaXQgY2FuJ3QgYmUgdXNlZCBhcyBhbiBpbmRleCB0eXBlLlxuICovXG5jb25zdCBpc1Byb3BlcnR5S2V5PShrZXkpPT57XG5zd2l0Y2godHlwZW9mIGtleSl7XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ251bWJlcic6XG5jYXNlJ3N5bWJvbCc6XG5yZXR1cm4gdHJ1ZTtcbmRlZmF1bHQ6XG5yZXR1cm4gZmFsc2U7fVxuXG4gfTtcblxuLyoqXG4gKiBTeW5jaHJvbm91c2x5IGNhbGwgYSBjYWxsYmFjay5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHBhcmFtIHtTeW5jQ2FsbGJhY2s8ST59IGNhbGxiYWNrXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPEk+fVxuICovXG5jb25zdCAgICAgICAgY2FsbFN5bmM9KGNhbGxiYWNrLC4uLmFyZ3MpPT57XG5jb25zdHt0YXJnZXQsbWV0aG9kTmFtZSxib3VuZH09Y2FsbGJhY2s7XG5pZihtZXRob2ROYW1lPT09dW5kZWZpbmVkKXtcbnJldHVybiB0YXJnZXQoLi4uYm91bmQsLi4uYXJncyk7XG4gfVxucmV0dXJuIHRhcmdldFttZXRob2ROYW1lXSguLi5ib3VuZCwuLi5hcmdzKTtcbiB9OyRo4oCNX29uY2UuY2FsbFN5bmMoY2FsbFN5bmMpO1xuaGFyZGVuKGNhbGxTeW5jKTtcblxuLyoqXG4gKiBFdmVudHVhbCBzZW5kIHRvIGEgY2FsbGJhY2suXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IElcbiAqIEBwYXJhbSB7Q2FsbGJhY2s8ST59IGNhbGxiYWNrXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8UmV0dXJuVHlwZTxJPj4+fVxuICovXG5jb25zdCAgICAgICAgY2FsbEU9KGNhbGxiYWNrLC4uLmFyZ3MpPT57XG5jb25zdHt0YXJnZXQsbWV0aG9kTmFtZSxib3VuZH09Y2FsbGJhY2s7XG5pZihtZXRob2ROYW1lPT09dW5kZWZpbmVkKXtcbnJldHVybiBFKHRhcmdldCkoLi4uYm91bmQsLi4uYXJncyk7XG4gfVxucmV0dXJuIEUodGFyZ2V0KVttZXRob2ROYW1lXSguLi5ib3VuZCwuLi5hcmdzKTtcbiB9OyRo4oCNX29uY2UuY2FsbEUoY2FsbEUpO1xuaGFyZGVuKGNhbGxFKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgbmVhciBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+fSBbVD1JXVxuICogQHRlbXBsYXRlIHt1bmtub3duW119IFtCPVtdXVxuICogQHBhcmFtIHtUfSB0YXJnZXRcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2s9KHRhcmdldCwuLi5ib3VuZCk9PntcbnR5cGVvZiB0YXJnZXQ9PT0nZnVuY3Rpb24nfHxcbkZhaWwgYHN5bmMgZnVuY3Rpb24gY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYSBmdW5jdGlvbjogJHt0YXJnZXR9YDtcbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LGJvdW5kLGlzU3luYzp0cnVlfSk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7U3luY0NhbGxiYWNrPEk+fSAqL2NiKTtcbiB9OyRo4oCNX29uY2UubWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgcG90ZW50aWFsbHkgZmFyIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8XG4gKiAgICguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST5cbiAqID59IFtUPVhpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8ST5dXG4gKiBAdGVtcGxhdGUge3Vua25vd25bXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge0NhbGxiYWNrPEk+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUZ1bmN0aW9uQ2FsbGJhY2s9KHRhcmdldCwuLi5ib3VuZCk9PntcbmlzT2JqZWN0KHRhcmdldCl8fFxuRmFpbCBgZnVuY3Rpb24gY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYSBmdW5jdGlvbiBwcmVzZW5jZTogJHt0YXJnZXR9YDtcbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LGJvdW5kfSk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7Q2FsbGJhY2s8ST59ICovY2IpO1xuIH07JGjigI1fb25jZS5tYWtlRnVuY3Rpb25DYWxsYmFjayhtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZUZ1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIG1ldGhvZC5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gUFxuICogQHRlbXBsYXRlIHt7XG4gKiAgIFt4IGluIFBdOiAoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+XG4gKiB9fSBbVD17IFt4IGluIFBdOiBJIH1dXG4gKiBAdGVtcGxhdGUge3Vua25vd25bXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQfSBtZXRob2ROYW1lXG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7U3luY0NhbGxiYWNrPEk+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN5bmNNZXRob2RDYWxsYmFjaz0odGFyZ2V0LG1ldGhvZE5hbWUsLi4uYm91bmQpPT57XG5pc09iamVjdCh0YXJnZXQpfHxcbkZhaWwgYHN5bmMgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbnR5cGVvZiBtZXRob2ROYW1lPT09J3N0cmluZyd8fFxuaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKXx8XG5GYWlsIGBtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIHBhc3NhYmxlIHN5bWJvbDogJHttZXRob2ROYW1lfWA7XG4vKiogQHR5cGUge3Vua25vd259ICovXG5jb25zdCBjYj1oYXJkZW4oe3RhcmdldCxtZXRob2ROYW1lLGJvdW5kLGlzU3luYzp0cnVlfSk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7U3luY0NhbGxiYWNrPEk+fSAqL2NiKTtcbiB9OyRo4oCNX29uY2UubWFrZVN5bmNNZXRob2RDYWxsYmFjayhtYWtlU3luY01ldGhvZENhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY01ldGhvZENhbGxiYWNrKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgcG90ZW50aWFsbHkgZmFyIG1ldGhvZC5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gUFxuICogQHRlbXBsYXRlIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPHtcbiAqICAgW3ggaW4gUF06ICguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST5cbiAqIH0+fSBbVD1YaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPHsgW3ggaW4gUF06IEkgfT5dXG4gKiBAdGVtcGxhdGUge3Vua25vd25bXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQfSBtZXRob2ROYW1lXG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7Q2FsbGJhY2s8ST59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWV0aG9kQ2FsbGJhY2s9KHRhcmdldCxtZXRob2ROYW1lLC4uLmJvdW5kKT0+e1xuaXNPYmplY3QodGFyZ2V0KXx8RmFpbCBgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbnR5cGVvZiBtZXRob2ROYW1lPT09J3N0cmluZyd8fFxuaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKXx8XG5GYWlsIGBtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIHBhc3NhYmxlIHN5bWJvbDogJHttZXRob2ROYW1lfWA7XG4vKiogQHR5cGUge3Vua25vd259ICovXG5jb25zdCBjYj1oYXJkZW4oe3RhcmdldCxtZXRob2ROYW1lLGJvdW5kfSk7XG5yZXR1cm4gKC8qKiBAdHlwZSB7Q2FsbGJhY2s8ST59ICovY2IpO1xuIH07JGjigI1fb25jZS5tYWtlTWV0aG9kQ2FsbGJhY2sobWFrZU1ldGhvZENhbGxiYWNrKTtcbmhhcmRlbihtYWtlTWV0aG9kQ2FsbGJhY2spO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBjYWxsYmFja1xuICogQHJldHVybnMge2NhbGxiYWNrIGlzIENhbGxiYWNrPGFueT59XG4gKi9cbmNvbnN0ICAgICAgICBpc0NhbGxiYWNrPShjYWxsYmFjayk9PntcbmlmKCFpc09iamVjdChjYWxsYmFjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e3RhcmdldCxtZXRob2ROYW1lLGJvdW5kfT1jYWxsYmFjaztcbnJldHVybihcbmlzT2JqZWN0KHRhcmdldCkmJihcbm1ldGhvZE5hbWU9PT11bmRlZmluZWR8fFxudHlwZW9mIG1ldGhvZE5hbWU9PT0nc3RyaW5nJ3x8XG5pc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpKSYmXG5BcnJheS5pc0FycmF5KGJvdW5kKSk7XG5cbiB9OyRo4oCNX29uY2UuaXNDYWxsYmFjayhpc0NhbGxiYWNrKTtcbmhhcmRlbihpc0NhbGxiYWNrKTtcblxuLyoqXG4gKiBQcmVwYXJlIGFuIGF0dGVudWF0b3IgY2xhc3Mgd2hvc2UgbWV0aG9kcyBjYW4gYmUgcmVkaXJlY3RlZCB2aWEgY2FsbGJhY2tzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IE1cbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy96b25lJykuWm9uZX0gem9uZSBUaGUgem9uZSBpbiB3aGljaCB0byBhbGxvY2F0ZSBhdHRlbnVhdG9ycy5cbiAqIEBwYXJhbSB7TVtdfSBtZXRob2ROYW1lcyBNZXRob2RzIHRvIGZvcndhcmQuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZH0gW29wdHMuaW50ZXJmYWNlR3VhcmRdIEFuIGludGVyZmFjZSBndWFyZCBmb3IgdGhlXG4gKiBuZXcgYXR0ZW51YXRvci5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy50YWddIEEgdGFnIGZvciB0aGUgbmV3IGF0dGVudWF0b3IgZXhvQ2xhc3MuXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlQXR0ZW51YXRvcj0oXG56b25lLFxubWV0aG9kTmFtZXMsXG57aW50ZXJmYWNlR3VhcmQsdGFnPSdBdHRlbnVhdG9yJ309e30pPT5cbntcbi8qKlxuICogQHR5cGVkZWYgeyh0aGlzOiBhbnksIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBNZXRob2RcbiAqIEB0eXBlZGVmIHt7IFtLIGluIE1dPzogQ2FsbGJhY2s8YW55PiB8IG51bGx9fSBPdmVycmlkZXNcbiAqIEB0eXBlZGVmIHt7IFtLIGluIE1dOiAodGhpczogYW55LCAuLi5hcmdzOiB1bmtub3duW10pID0+IGFueSB9fSBNZXRob2RzXG4gKi9cbmNvbnN0IG1ldGhvZHM9LyoqIEB0eXBlIHtNZXRob2RzfSAqL1xuZnJvbUVudHJpZXMoXG5tZXRob2ROYW1lcy5tYXAoKGtleSk9Pntcbi8qIE9ubHkgYWxsb3cgdGhlIGBQcm9wZXJ0eUtleWAgdHlwZSBmb3IgdGhlIHRhcmdldCBtZXRob2Qga2V5LiovXG5pZighaXNQcm9wZXJ0eUtleShrZXkpKXtcbnRocm93IEZhaWwgYGtleSAke3Eoa2V5KX0gaXMgbm90IGEgUHJvcGVydHlLZXlgO1xuIH1cblxuY29uc3QgbT0vKiogQHR5cGUge01ldGhvZHN9ICove1xuLyogRXhwbGljaXRseSB1c2UgY29uY2lzZSBtZXRob2Qgc3ludGF4IHRvIHByZXNlcnZlIGB0aGlzYCBidXQgcHJldmVudCovXG4vKiBjb25zdHJ1Y3RvciBiZWhhdmlvci4qL1xuLyoqIEB0eXBlIHtNZXRob2R9ICovXG5ba2V5XSguLi5hcmdzKXtcbi8qIFN1cHBvcnQgYm90aCBzeW5jaHJvbm91cyBhbmQgYXN5bmMgY2FsbGJhY2tzLiovXG5jb25zdCBjYj10aGlzLnN0YXRlLmNic1trZXldO1xuaWYoIWNiKXtcbmNvbnN0IGVycj1hc3NlcnQuZXJyb3IoXG4gYHVuaW1wbGVtZW50ZWQgJHtxKHRhZyl9IG1ldGhvZCAke3Eoa2V5KX1gKTtcblxuaWYodGhpcy5zdGF0ZS5pc1N5bmMpe1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuIH1cbmlmKGNiLmlzU3luYyl7XG5yZXR1cm4gY2FsbFN5bmMoY2IsLi4uYXJncyk7XG4gfVxucmV0dXJuIGNhbGxFKGNiLC4uLmFyZ3MpO1xuIH19W1xua2V5XTtcbnJldHVybiAoLyoqIEB0eXBlIHtjb25zdH0gKi9ba2V5LG1dKTtcbiB9KSk7XG5cblxuXG4vKipcbiAqIENyZWF0ZSBhbiBleG8gb2JqZWN0IHdob3NlIGJlaGF2aW9yIGlzIGNvbXBvc2VkIGZyb20gYSBkZWZhdWx0IHRhcmdldFxuICogYW5kL29yIGluZGl2aWR1YWwgbWV0aG9kIG92ZXJyaWRlIGNhbGxiYWNrcy5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHt1bmtub3dufSBbb3B0cy50YXJnZXRdIFRoZSB0YXJnZXQgZm9yIGFueSBtZXRob2RzIHRoYXRcbiAqIHdlcmVuJ3Qgc3BlY2lmaWVkIGluIGBvcHRzLm92ZXJyaWRlc2AuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmlzU3luYz1mYWxzZV0gV2hldGhlciB0aGUgdGFyZ2V0IHNob3VsZCBiZSB0cmVhdGVkXG4gKiBhcyBzeW5jaHJvbm91c2x5IGF2YWlsYWJsZS5cbiAqIEBwYXJhbSB7T3ZlcnJpZGVzfSBbb3B0cy5vdmVycmlkZXNdIFNldCBpbmRpdmlkdWFsXG4gKiBjYWxsYmFja3MgZm9yIG1ldGhvZHMgKHdob3NlIG5hbWVzIG11c3QgYmUgZGVmaW5lZCBpbiB0aGVcbiAqIGBwcmVwYXJlQXR0ZW51YXRvcmAgb3IgYHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcmAgY2FsbCkuICBOdWxsaXNoIG92ZXJyaWRlc1xuICogbWVhbiB0byB0aHJvdy5cbiAqL1xuY29uc3QgbWFrZUF0dGVudWF0b3I9em9uZS5leG9DbGFzcyhcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHthbnl9IFtvcHRzLnRhcmdldF1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaXNTeW5jPWZhbHNlXVxuICogQHBhcmFtIHtPdmVycmlkZXN9IFtvcHRzLm92ZXJyaWRlc11cbiAqL1xuKHtcbnRhcmdldD1udWxsLFxuaXNTeW5jPWZhbHNlLFxub3ZlcnJpZGVzPS8qKiBAdHlwZSB7T3ZlcnJpZGVzfSAqL3t9fSk9Plxue1xuY29uc3QgY2JzPS8qKiBAdHlwZSB7T3ZlcnJpZGVzfSAqL3t9O1xuXG5jb25zdCByZW1haW5pbmc9bmV3IFNldChtZXRob2ROYW1lcyk7XG5mb3IoY29uc3Qga2V5IG9mIG93bktleXMob3ZlcnJpZGVzKSl7XG5yZW1haW5pbmcuaGFzKGtleSl8fFxuRmFpbCBgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIG5vdCBhbGxvd2VkIGJ5IG1ldGhvZE5hbWVzYDtcblxucmVtYWluaW5nLmRlbGV0ZShrZXkpO1xuY29uc3QgY2I9b3ZlcnJpZGVzW2tleV07XG5jYj09bnVsbHx8XG5pc0NhbGxiYWNrKGNiKXx8XG5GYWlsIGAke3EodGFnKX0gb3ZlcnJpZGVzWyR7cShrZXkpfV0gaXMgbm90IGEgY2FsbGJhY2s7IGdvdCAke2NifWA7XG5jYnNba2V5XT1jYjtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIHJlbWFpbmluZyl7XG5pZihpc1N5bmMpe1xuY2JzW2tleV09bWFrZVN5bmNNZXRob2RDYWxsYmFjayh0YXJnZXQsa2V5KTtcbiB9ZWxzZXtcbmNic1trZXldPW1ha2VNZXRob2RDYWxsYmFjayh0YXJnZXQsa2V5KTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7Y2JzLGlzU3luY30pO1xuIH0sXG4vKiogQHR5cGUge01ldGhvZHN9ICovbWV0aG9kcyk7XG5cbnJldHVybiBtYWtlQXR0ZW51YXRvcjtcbiB9OyRo4oCNX29uY2UucHJlcGFyZUF0dGVudWF0b3IocHJlcGFyZUF0dGVudWF0b3IpO1xuaGFyZGVuKHByZXBhcmVBdHRlbnVhdG9yKTtcblxuLyoqXG4gKiBQcmVwYXJlIGFuIGF0dGVudWF0b3Igd2hvc2UgbWV0aG9kTmFtZXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaW50ZXJmYWNlR3VhcmQuXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3pvbmUnKS5ab25lfSB6b25lXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRzXVxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLnRhZ11cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcj0oem9uZSxpbnRlcmZhY2VHdWFyZCxvcHRzPXt9KT0+e1xuY29uc3R7bWV0aG9kR3VhcmRzfT1pbnRlcmZhY2VHdWFyZDtcbmNvbnN0IG1ldGhvZE5hbWVzPW93bktleXMobWV0aG9kR3VhcmRzKTtcbmNvbnN0IG1ha2VBdHRlbnVhdG9yPXByZXBhcmVBdHRlbnVhdG9yKHpvbmUsbWV0aG9kTmFtZXMse1xuLi4ub3B0cyxcbmludGVyZmFjZUd1YXJkfSk7XG5cbnJldHVybiAoLyoqIEB0eXBlIHtNYWtlQXR0ZW51YXRvcjxhbnk+fSAqL21ha2VBdHRlbnVhdG9yKTtcbiB9OyRo4oCNX29uY2UucHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcik7XG5oYXJkZW4ocHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYWxsU3luYyI6WyJjYWxsU3luYyJdLCJjYWxsRSI6WyJjYWxsRSJdLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siOlsibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VGdW5jdGlvbkNhbGxiYWNrIjpbIm1ha2VGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siOlsibWFrZVN5bmNNZXRob2RDYWxsYmFjayJdLCJtYWtlTWV0aG9kQ2FsbGJhY2siOlsibWFrZU1ldGhvZENhbGxiYWNrIl0sImlzQ2FsbGJhY2siOlsiaXNDYWxsYmFjayJdLCJwcmVwYXJlQXR0ZW51YXRvciI6WyJwcmVwYXJlQXR0ZW51YXRvciJdLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiOlsicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKqP3UYiBgAAIgYAACUAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY29uZmlnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCcmlkZ2VJZCIsIlZCYW5rQWNjb3VudCIsIldhbGxldE5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyogQGplc3NpZS1jaGVjayovXG5cbi8qKlxuICogQGZpbGVcbiAqXG4gKiBTb21lIG9mIHRoaXMgY29uZmlnIGluZm8gbWF5IG1ha2UgbW9yZSBzZW5zZSBpbiBhIHBhcnRpY3VsYXIgcGFja2FnZS4gSG93ZXZlclxuICogZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCBhbmQgb3VyIGxheCBwYWNrYWdlXG4gKiBkZXBlbmRlbmN5IGdyYXBoLCBzb21ldGltZXMgcmF0aW9uYWwgcGxhY2VtZW50cyBjYXVzZSB0eXBlIHJlc29sdXRpb24gZXJyb3JzLlxuICpcbiAqIFNvIGFzIGEgd29yay1hcm91bmQgc29tZSBjb25zdGFudHMgdGhhdCBuZWVkIGFjY2VzcyBmcm9tIG1vcmUgdGhhbiBvbmUgcGFja2FnZSBhcmUgcGxhY2VkIGhlcmUuXG4gKi9cblxuLyoqXG4gKiBFdmVudCBzb3VyY2UgaWRzIHVzZWQgYnkgdGhlIGJyaWRnZSBkZXZpY2UuXG4gKi9cbmNvbnN0ICAgICAgICBCcmlkZ2VJZD17XG5CQU5LOidiYW5rJyxcbkNPUkU6J2NvcmUnLFxuRElCQzonZGliYycsXG5TVE9SQUdFOidzdG9yYWdlJyxcblBST1ZJU0lPTjoncHJvdmlzaW9uJyxcblBST1ZJU0lPTl9TTUFSVF9XQUxMRVQ6J3Byb3Zpc2lvbldhbGxldCcsXG5XQUxMRVQ6J3dhbGxldCd9OyRo4oCNX29uY2UuQnJpZGdlSWQoQnJpZGdlSWQpO1xuXG5oYXJkZW4oQnJpZGdlSWQpO1xuXG5jb25zdCAgICAgICAgV2FsbGV0TmFtZT17XG5kZXBvc2l0RmFjZXQ6J2RlcG9zaXRGYWNldCd9OyRo4oCNX29uY2UuV2FsbGV0TmFtZShXYWxsZXROYW1lKTtcblxuaGFyZGVuKFdhbGxldE5hbWUpO1xuXG4vKiBkZWZpbmVkIGluIGdvbGFuZy9jb3Ntb3MveC92YmFuayovXG5jb25zdCAgICAgICAgVkJhbmtBY2NvdW50PXtcbnJlc2VydmU6e1xubW9kdWxlOid2YmFuay9yZXNlcnZlJyxcbmFkZHJlc3M6J2Fnb3JpYzFhZTBsbXR6bGdyY25sYTl4amtwYWFycTVkNWRmZXo2M2gzbnVjbCd9LFxuXG5wcm92aXNpb246e1xubW9kdWxlOid2YmFuay9wcm92aXNpb24nLFxuYWRkcmVzczonYWdvcmljMW1lZ3p5dGc2NWN5cmd6czZmdnp4Z3JjcXZ3d2w3dWdwdDYyMzQ2J319OyRo4oCNX29uY2UuVkJhbmtBY2NvdW50KFZCYW5rQWNjb3VudCk7XG5cblxuaGFyZGVuKFZCYW5rQWNjb3VudCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJpZGdlSWQiOlsiQnJpZGdlSWQiXSwiV2FsbGV0TmFtZSI6WyJXYWxsZXROYW1lIl0sIlZCYW5rQWNjb3VudCI6WyJWQmFua0FjY291bnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAF8kzgMgEAADIBAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9kZWJ1Zy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRyYWNlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG5sZXQgZGVidWdJbnN0YW5jZT0xO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCAndmVyYm9zZSd9IGVuYWJsZVxuICovXG5jb25zdCAgICAgICAgbWFrZVRyYWNlcj0obmFtZSxlbmFibGU9dHJ1ZSk9PntcbmRlYnVnSW5zdGFuY2UrPTE7XG5sZXQgZGVidWdDb3VudD0xO1xuY29uc3Qga2V5PSBgLS0tLS0gJHtuYW1lfS4ke2RlYnVnSW5zdGFuY2V9IGA7XG4vKiB0aGUgY2FzZXMgYmVsb3cgZGVmaW5lIGEgbmFtZWQgdmFyaWFibGUgdG8gcHJvdmlkZSBiZXR0ZXIgZGVidWcgaW5mbyovXG5zd2l0Y2goZW5hYmxlKXtcbmNhc2UgZmFsc2U6e1xuY29uc3QgbG9nRGlzYWJsZWQ9KC4uLl9hcmdzKT0+eyB9O1xucmV0dXJuIGxvZ0Rpc2FibGVkO1xuIH1cbmNhc2UndmVyYm9zZSc6e1xuY29uc3QgaW5mb1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5jb25zb2xlLmluZm8oa2V5LGRlYnVnQ291bnQrPTEsLi4uYXJncyk7XG4gfWVsc2V7XG5jb25zb2xlLmluZm8oa2V5LGRlYnVnQ291bnQrPTEsb3B0TG9nLC4uLmFyZ3MpO1xuIH1cbiB9O1xucmV0dXJuIGluZm9UaWNrO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgZGVidWdUaWNrPShvcHRMb2csLi4uYXJncyk9PntcbmlmKG9wdExvZy5sb2cpe1xub3B0TG9nLmxvZyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gZGVidWdUaWNrO1xuIH19XG5cbiB9OyRo4oCNX29uY2UubWFrZVRyYWNlcihtYWtlVHJhY2VyKTtcbmhhcmRlbihtYWtlVHJhY2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhY2VyIjpbIm1ha2VUcmFjZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbhWYn0MCAABDAgAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdXRpbHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdXRpbHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2NvbmZpZy5qc1wiLCBbXV0sW1wiLi9kZWJ1Zy5qc1wiLCBbXV0sW1wiLi91dGlscy5qc1wiLCBbXV0sW1wiLi9tZXRob2QtdG9vbHMuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKQG41n4pAAB+KQAALwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzeyJpbXBvcnRzIjpbIi4vY2FsbGJhY2suanMiLCJAYWdvcmljL3pvbmUiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJhc3NlcnRDYXBEYXRhIiwiYXNzZXJ0UGF0aFNlZ21lbnQiLCJpc1N0cmVhbUNlbGwiLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCIsIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCIsInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsTSxoZWFwWm9uZSxjYjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy96b25lXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJoZWFwWm9uZVwiLCBbJGjigI1fYSA9PiAoaGVhcFpvbmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jYWxsYmFjay5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoY2IgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZUNoYWluU3RvcmFnZVJvb3QsICduYW1lJywge3ZhbHVlOiBcIm1ha2VDaGFpblN0b3JhZ2VSb290XCJ9KTskaOKAjV9vbmNlLm1ha2VDaGFpblN0b3JhZ2VSb290KG1ha2VDaGFpblN0b3JhZ2VSb290KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVN0b3JhZ2VOb2RlQ2hpbGQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VTdG9yYWdlTm9kZUNoaWxkXCJ9KTskaOKAjV9vbmNlLm1ha2VTdG9yYWdlTm9kZUNoaWxkKG1ha2VTdG9yYWdlTm9kZUNoaWxkKTsgICBcblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLm1ha2VNYXJzaGFsPn0gTWFyc2hhbGxlciAqL1xuLyoqIEB0eXBlZGVmIHtQaWNrPE1hcnNoYWxsZXIsICdmcm9tQ2FwRGF0YSc+fSBVbnNlcmlhbGl6ZXIgKi9cblxuLyoqXG4gKiBEZWZpbmVkIGJ5IHZzdG9yYWdlU3RvcmVLZXkgaW4gdnN0b3JhZ2UuZ29cbiAqXG4gKiBAdHlwZWRlZiBWU3RvcmFnZUtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlU3Via2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YVByZWZpeEJ5dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vRGF0YVZhbHVlXVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAdHlwZWRlZiBTdHJlYW1DZWxsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYmxvY2tIZWlnaHQgZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiBhIG5hdHVyYWwgbnVtYmVyXG4gKiBAcHJvcGVydHkge1RbXX0gdmFsdWVzXG4gKi9cblxuLyoqXG4gKiBUaGlzIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIElBVkwgdHJlZS5cbiAqXG4gKiBUaGUgYWN0aXZlIGltcGxlbWVudGF0aW9uIGlzIHgvdnN0b3JhZ2UsIGFuIEFnb3JpYyBleHRlbnNpb24gb2YgdGhlIENvc21vcyBTREsuXG4gKlxuICogVnN0b3JhZ2UgaXMgYSBoaWVyYXJjaGljYWwgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmFnZSBzdHJ1Y3R1cmUgdGhhdFxuICogaWRlbnRpZmllcyBjaGlsZHJlbiBieSByZXN0cmljdGVkIEFTQ0lJIG5hbWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhcmJpdHJhcnlcbiAqIHN0cmluZy12YWx1ZWQgZGF0YSBmb3IgZWFjaCBub2RlLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmFnZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KGRhdGE6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gc2V0VmFsdWUgcHVibGlzaGVzIHNvbWUgZGF0YVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldFBhdGggdGhlIGNoYWluIHN0b3JhZ2UgcGF0aCBhdCB3aGljaCB0aGUgbm9kZSB3YXMgY29uc3RydWN0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleT59IGdldFN0b3JlS2V5IERFUFJFQ0FURUQgdXNlIGdldFBhdGhcbiAqIEBwcm9wZXJ0eSB7KHN1YlBhdGg6IHN0cmluZywgb3B0aW9ucz86IHtzZXF1ZW5jZT86IGJvb2xlYW59KSA9PiBTdG9yYWdlTm9kZX0gbWFrZUNoaWxkTm9kZVxuICovXG5cbmNvbnN0IENoYWluU3RvcmFnZU5vZGVJPU0uaW50ZXJmYWNlKCdTdG9yYWdlTm9kZScse1xuc2V0VmFsdWU6TS5jYWxsV2hlbihNLnN0cmluZygpKS5yZXR1cm5zKCksXG5nZXRQYXRoOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXRTdG9yZUtleTpNLmNhbGxXaGVuKCkucmV0dXJucyhNLnJlY29yZCgpKSxcbm1ha2VDaGlsZE5vZGU6TS5jYWxsKE0uc3RyaW5nKCkpLlxub3B0aW9uYWwoTS5zcGxpdFJlY29yZCh7fSx7c2VxdWVuY2U6TS5ib29sZWFuKCl9LHt9KSkuXG5yZXR1cm5zKE0ucmVtb3RhYmxlKCdTdG9yYWdlTm9kZScpKX0pO1xuXG5cbi8qKlxuICogVGhpcyBpcyBhbiBpbXBlcmZlY3QgaGV1cmlzdGljIHRvIG5hdmlnYXRlIHRoZSBtaWdyYXRpb24gZnJvbSB2YWx1ZSBjZWxscyB0b1xuICogc3RyZWFtIGNlbGxzLlxuICogQXQgdGltZSBvZiB3cml0aW5nLCBubyBsZWdhY3kgY2VsbHMgaGF2ZSB0aGUgc2FtZSBzaGFwZSBhcyBhIHN0cmVhbSBjZWxsLFxuICogYW5kIHdlIGRvIG5vdCBpbnRlbmQgdG8gY3JlYXRlIGFueSBtb3JlIGxlZ2FjeSB2YWx1ZSBjZWxscy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gY2VsbFxuICogQHJldHVybnMge2NlbGwgaXMgU3RyZWFtQ2VsbH1cbiAqL1xuY29uc3QgICAgICAgIGlzU3RyZWFtQ2VsbD0oY2VsbCk9PlxuY2VsbCYmXG50eXBlb2YgY2VsbD09PSdvYmplY3QnJiZcbkFycmF5LmlzQXJyYXkoY2VsbC52YWx1ZXMpJiZcbnR5cGVvZiBjZWxsLmJsb2NrSGVpZ2h0PT09J3N0cmluZycmJlxuL14wJHxeWzEtOV1bMC05XSokLy50ZXN0KGNlbGwuYmxvY2tIZWlnaHQpOyRo4oCNX29uY2UuaXNTdHJlYW1DZWxsKGlzU3RyZWFtQ2VsbCk7XG5oYXJkZW4oaXNTdHJlYW1DZWxsKTtcblxuLyogVE9ETzogQ29uc29saWRhdGUgd2l0aCBgaW5zaXN0Q2FwRGF0YWAgZnVuY3Rpb25zIGZyb20gc3dpbmdzZXQtbGl2ZXNsb3RzLCovXG4vKiBzd2luZ3NldC14c25hcC1zdXBlcnZpc29yLCBldGMuKi9cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBkYXRhXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBkYXRhIGlzIFhpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DYXBEYXRhPHN0cmluZz59XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDYXBEYXRhPShkYXRhKT0+e1xuYXNzZXJ0LnR5cGVvZihkYXRhLCdvYmplY3QnKTtcbmFzc2VydChkYXRhKTtcbmFzc2VydC50eXBlb2YoZGF0YS5ib2R5LCdzdHJpbmcnKTtcbmFzc2VydChBcnJheS5pc0FycmF5KGRhdGEuc2xvdHMpKTtcbi8qIFhYWCBjaGVjayB0aGF0IHRoZSAuc2xvdHMgYXJyYXkgZWxlbWVudHMgYXJlIGFjdHVhbGx5IHN0cmluZ3MqL1xuIH07JGjigI1fb25jZS5hc3NlcnRDYXBEYXRhKGFzc2VydENhcERhdGEpO1xuaGFyZGVuKGFzc2VydENhcERhdGEpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZEZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8c3RyaW5nPn0gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHtTdG9yYWdlTm9kZVsnZ2V0U3RvcmVLZXknXX0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoKSA9PiBVbnNlcmlhbGl6ZXJ9IGdldFVuc2VyaWFsaXplciBnZXQgdGhlIHVuc2VyaWFsaXplciBmb3IgdGhlIHN0b3JlZCBkYXRhXG4gKi9cblxuLyogVE9ETzogRm9ybWFsaXplIHNlZ21lbnQgY29uc3RyYWludHMuKi9cbi8qIE11c3QgYmUgbm9uZW1wdHkgYW5kIGRpc2FsbG93ICh1bmVzY2FwZWQpIGAuYCwgYW5kIGZvciBzaW1wbGljaXR5Ki9cbi8qIChhbmQgZnV0dXJlIHBvc3NpYmlsaXR5IG9mIGUuZy4gZXNjYXBpbmcpIHdlIGN1cnJlbnRseSBsaW1pdCB0byovXG4vKiBBU0NJSSBhbHBoYW51bWVyaWMgcGx1cyB1bmRlcnNjb3JlIGFuZCBkYXNoLiovXG5jb25zdCBwYXRoU2VnbWVudFBhdHRlcm49L15bYS16QS1aMC05Xy1dezEsMTAwfSQvO1xuXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcpID0+IHZvaWR9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0UGF0aFNlZ21lbnQ9KG5hbWUpPT57XG5wYXRoU2VnbWVudFBhdHRlcm4udGVzdChuYW1lKXx8XG5GYWlsIGBQYXRoIHNlZ21lbnQgbmFtZXMgbXVzdCBjb25zaXN0IG9mIDEgdG8gMTAwIGNoYXJhY3RlcnMgbGltaXRlZCB0byBBU0NJSSBhbHBoYW51bWVyaWNzLCB1bmRlcnNjb3JlcywgYW5kL29yIGRhc2hlczogJHtuYW1lfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFBhdGhTZWdtZW50KGFzc2VydFBhdGhTZWdtZW50KTtcbmhhcmRlbihhc3NlcnRQYXRoU2VnbWVudCk7XG5cbi8qKlxuICogTXVzdCBtYXRjaCB0aGUgc3dpdGNoIGluIHZzdG9yYWdlLmdvIHVzaW5nIGB2c3RvcmFnZU1lc3NhZ2VgIHR5cGVcbiAqXG4gKiBAdHlwZWRlZiB7ICdnZXQnIHwgJ2dldFN0b3JlS2V5JyB8ICdoYXMnIHwgJ2NoaWxkcmVuJyB8ICdlbnRyaWVzJyB8ICd2YWx1ZXMnIHwnc2l6ZScgfSBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZFxuICogQHR5cGVkZWYgeyAnc2V0JyB8ICdzZXRXaXRob3V0Tm90aWZ5JyB8ICdhcHBlbmQnIH0gU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlTWV0aG9kXG4gKiBAdHlwZWRlZiB7U3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VNZXRob2QgfCBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2QgfSBTdG9yYWdlTWVzc2FnZU1ldGhvZFxuICogQHR5cGVkZWYgeyBbcGF0aDogc3RyaW5nXSB9IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlQXJnc1xuICogQHR5cGVkZWYgeyBbcGF0aDogc3RyaW5nLCB2YWx1ZT86IHN0cmluZyB8IG51bGxdIH0gU3RvcmFnZUVudHJ5XG4gKiBAdHlwZWRlZiB7IFN0b3JhZ2VFbnRyeVtdIH0gU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlQXJnc1xuICogQHR5cGVkZWYge3tcbiAqICAgbWV0aG9kOiBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZDtcbiAqICAgYXJnczogU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VBcmdzO1xuICogIH0gfCB7XG4gKiAgIG1ldGhvZDogU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlTWV0aG9kO1xuICogICBhcmdzOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VBcmdzO1xuICogfX0gU3RvcmFnZU1lc3NhZ2VcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy96b25lJykuWm9uZX0gem9uZVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUNoYWluU3RvcmFnZU5vZGU9KHpvbmUpPT57XG4vKipcbiAqIENyZWF0ZSBhIHN0b3JhZ2Ugbm9kZSBmb3IgYSBnaXZlbiBiYWNraW5nIHN0b3JhZ2UgaW50ZXJmYWNlIGFuZCBwYXRoLlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9jYWxsYmFjaycpLkNhbGxiYWNrPChtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55Pn0gbWVzc2VuZ2VyIGEgY2FsbGJhY2tcbiAqIGZvciBzZW5kaW5nIGEgc3RvcmFnZU1lc3NhZ2Ugb2JqZWN0IHRvIHRoZSBzdG9yYWdlIGltcGxlbWVudGF0aW9uXG4gKiAoY2YuIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS92c3RvcmFnZS5nbylcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNlcXVlbmNlXSBzZXQgdmFsdWVzIHdpdGggYGFwcGVuZGAgbWVzc2FnZXMgcmF0aGVyIHRoYW4gYHNldGAgbWVzc2FnZXNcbiAqIHNvIHRoZSBiYWNraW5nIGltcGxlbWVudGF0aW9uIGVtcGxveXMgYSB3cmFwcGluZyBzdHJ1Y3R1cmUgdGhhdFxuICogcHJlc2VydmVzIGVhY2ggdmFsdWUgc2V0IHdpdGhpbiBhIHNpbmdsZSBibG9jay5cbiAqIENoaWxkIG5vZGVzIGRlZmF1bHQgdG8gaW5oZXJpdGluZyB0aGlzIG9wdGlvbiBmcm9tIHRoZWlyIHBhcmVudC5cbiAqIEByZXR1cm5zIHtTdG9yYWdlTm9kZX1cbiAqL1xuY29uc3QgbWFrZUNoYWluU3RvcmFnZU5vZGU9em9uZS5leG9DbGFzcyhcbidDaGFpblN0b3JhZ2VOb2RlJyxcbkNoYWluU3RvcmFnZU5vZGVJLFxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vY2FsbGJhY2snKS5DYWxsYmFjazwobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueT59IG1lc3NlbmdlclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VxdWVuY2VdXG4gKi9cbihtZXNzZW5nZXIscGF0aCx7c2VxdWVuY2U9ZmFsc2V9PXt9KT0+e1xuYXNzZXJ0LnR5cGVvZihwYXRoLCdzdHJpbmcnKTtcbmFzc2VydC50eXBlb2Yoc2VxdWVuY2UsJ2Jvb2xlYW4nKTtcbnJldHVybiBoYXJkZW4oe3BhdGgsbWVzc2VuZ2VyLHNlcXVlbmNlfSk7XG4gfSxcbntcbmdldFBhdGgoKXtcbnJldHVybiB0aGlzLnN0YXRlLnBhdGg7XG4gfSxcbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGdldFBhdGhcbiAqIEB0eXBlIHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn1cbiAqL1xuICAgICAgYXN5bmMgZ2V0U3RvcmVLZXkoKXtcbmNvbnN0e3BhdGgsbWVzc2VuZ2VyfT10aGlzLnN0YXRlO1xucmV0dXJuIGNiLmNhbGxFKG1lc3Nlbmdlcix7XG5tZXRob2Q6J2dldFN0b3JlS2V5JyxcbmFyZ3M6W3BhdGhdfSk7XG5cbiB9LFxuLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCBjaGlsZE5vZGVPcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSAqL1xubWFrZUNoaWxkTm9kZShuYW1lLGNoaWxkTm9kZU9wdGlvbnM9e30pe1xuY29uc3R7c2VxdWVuY2UscGF0aCxtZXNzZW5nZXJ9PXRoaXMuc3RhdGU7XG5hc3NlcnRQYXRoU2VnbWVudChuYW1lKTtcbmNvbnN0IG1lcmdlZE9wdGlvbnM9e3NlcXVlbmNlLC4uLmNoaWxkTm9kZU9wdGlvbnN9O1xucmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VOb2RlKFxubWVzc2VuZ2VyLFxuIGAke3BhdGh9LiR7bmFtZX1gLFxubWVyZ2VkT3B0aW9ucyk7XG5cbiB9LFxuLyoqIEB0eXBlIHsodmFsdWU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gKi9cbiAgICAgIGFzeW5jIHNldFZhbHVlKHZhbHVlKXtcbmNvbnN0e3NlcXVlbmNlLHBhdGgsbWVzc2VuZ2VyfT10aGlzLnN0YXRlO1xuYXNzZXJ0LnR5cGVvZih2YWx1ZSwnc3RyaW5nJyk7XG4vKiogQHR5cGUge1N0b3JhZ2VFbnRyeX0gKi9cbmxldCBlbnRyeTtcbmlmKCFzZXF1ZW5jZSYmIXZhbHVlKXtcbmVudHJ5PVtwYXRoXTtcbiB9ZWxzZXtcbmVudHJ5PVtwYXRoLHZhbHVlXTtcbiB9XG5hd2FpdCBjYi5jYWxsRShtZXNzZW5nZXIse1xubWV0aG9kOnNlcXVlbmNlPydhcHBlbmQnOidzZXQnLFxuYXJnczpbZW50cnldfSk7XG5cbiB9XG4vKiBQb3NzaWJsZSBleHRlbnNpb25zOiovXG4vKiAqIGdldFZhbHVlKCkqL1xuLyogKiBnZXRDaGlsZE5hbWVzKCkgYW5kL29yIG1ha2VDaGlsZE5vZGVzKCkqL1xuLyogKiBnZXROYW1lKCkqL1xuLyogKiByZWN1cnNpdmUgZGVsZXRlKi9cbi8qICogYmF0Y2ggb3BlcmF0aW9ucyovXG4vKiAqIGxvY2FsIGJ1ZmZlcmluZyAod2l0aCBlbmQtb2YtYmxvY2sgY29tbWl0KSovfSk7XG5cblxucmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VOb2RlO1xuIH07JGjigI1fb25jZS5wcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZShwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSk7XG5cbmNvbnN0IG1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZT1wcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZShoZWFwWm9uZSk7XG5cbi8qKlxuICogQ3JlYXRlIGEgaGVhcC1iYXNlZCByb290IHN0b3JhZ2Ugbm9kZSBmb3IgYSBnaXZlbiBiYWNraW5nIGZ1bmN0aW9uIGFuZCByb290IHBhdGguXG4gKlxuICogQHBhcmFtIHsobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueX0gaGFuZGxlU3RvcmFnZU1lc3NhZ2UgYSBmdW5jdGlvbiBmb3JcbiAqIHNlbmRpbmcgYSBzdG9yYWdlTWVzc2FnZSBvYmplY3QgdG8gdGhlIHN0b3JhZ2UgaW1wbGVtZW50YXRpb25cbiAqIChjZi4gZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHJvb3RQYXRoXG4gKiBAcGFyYW0ge29iamVjdH0gW3Jvb3RPcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbcm9vdE9wdGlvbnMuc2VxdWVuY2VdIGVtcGxveSBhIHdyYXBwaW5nIHN0cnVjdHVyZSB0aGF0XG4gKiBwcmVzZXJ2ZXMgZWFjaCB2YWx1ZSBzZXQgd2l0aGluIGEgc2luZ2xlIGJsb2NrLCBhbmQgZGVmYXVsdCBjaGlsZCBub2Rlc1xuICogdG8gZG8gdGhlIHNhbWVcbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VDaGFpblN0b3JhZ2VSb290KFxuaGFuZGxlU3RvcmFnZU1lc3NhZ2UsXG5yb290UGF0aCxcbnJvb3RPcHRpb25zPXt9KVxue1xuY29uc3QgbWVzc2VuZ2VyPWNiLm1ha2VGdW5jdGlvbkNhbGxiYWNrKGhhbmRsZVN0b3JhZ2VNZXNzYWdlKTtcblxuLyogVXNlIHRoZSBoZWFwWm9uZSBkaXJlY3RseS4qL1xuY29uc3Qgcm9vdE5vZGU9bWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlKG1lc3Nlbmdlcixyb290UGF0aCxyb290T3B0aW9ucyk7XG5yZXR1cm4gcm9vdE5vZGU7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtTdG9yYWdlTm9kZX0gYW4gb2JqZWN0IHRoYXQgY29uZmlybXMgdG8gU3RvcmFnZU5vZGUgQVBJIGJ1dCBkb2VzIG5vdCBzdG9yZSBhbnl3aGVyZS5cbiAqL1xuY29uc3QgbWFrZU51bGxTdG9yYWdlTm9kZT0oKT0+e1xuLyogWFhYIHJlLXVzZSBcIkNoYWluU3RvcmFnZVwiIG1ldGhvZHMgYWJvdmUgd2hpY2ggZG9uJ3QgYWN0dWFsbHkgZGVwZW5kIG9uIGNoYWlucyovXG5yZXR1cm4gbWFrZUNoYWluU3RvcmFnZVJvb3QoKCk9Pm51bGwsJ251bGwnKTtcbiB9O1xuXG4vKipcbiAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciByZXR1cm5pbmcgYSBzdG9yYWdlIG5vZGUgYXQgb3IgdW5kZXIgaXRzIGlucHV0LFxuICogZmFsbGluZyBiYWNrIHRvIGFuIGluZXJ0IG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0IGludGVyZmFjZSAoYnV0IGluY29tcGxldGVcbiAqIGJlaGF2aW9yKSB3aGVuIHRoYXQgaXMgdW5hdmFpbGFibGUuXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFN0b3JhZ2VOb2RlPz59IHN0b3JhZ2VOb2RlUmVmXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hpbGROYW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxTdG9yYWdlTm9kZT59XG4gKi9cbmFzeW5jIGZ1bmN0aW9uICAgICAgICBtYWtlU3RvcmFnZU5vZGVDaGlsZChzdG9yYWdlTm9kZVJlZixjaGlsZE5hbWUpe1xuY29uc3QgZXhpc3RpbmdTdG9yYWdlTm9kZT1hd2FpdCBzdG9yYWdlTm9kZVJlZjtcbmNvbnN0IHN0b3JhZ2VOb2RlPWV4aXN0aW5nU3RvcmFnZU5vZGV8fG1ha2VOdWxsU3RvcmFnZU5vZGUoKTtcbnJldHVybiBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkTmFtZSk7XG4gfVxuaGFyZGVuKG1ha2VTdG9yYWdlTm9kZUNoaWxkKTtcblxuLyogVE9ETyBmaW5kIGEgYmV0dGVyIG1vZHVsZSBmb3IgdGhpcyovXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8TWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHsodmFsdWU6IHVua25vd24pID0+IFByb21pc2U8dm9pZD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2VyaWFsaXplVG9TdG9yYWdlPShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xucmV0dXJuIGFzeW5jKHZhbHVlKT0+e1xuY29uc3QgbWFyc2hhbGxlZD1hd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG5jb25zdCBzZXJpYWxpemVkPUpTT04uc3RyaW5naWZ5KG1hcnNoYWxsZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKHNlcmlhbGl6ZWQpO1xuIH07XG4gfTskaOKAjV9vbmNlLm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTdHJlYW1DZWxsIjpbImlzU3RyZWFtQ2VsbCJdLCJhc3NlcnRDYXBEYXRhIjpbImFzc2VydENhcERhdGEiXSwiYXNzZXJ0UGF0aFNlZ21lbnQiOlsiYXNzZXJ0UGF0aFNlZ21lbnQiXSwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiOlsicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwibWFrZUNoYWluU3RvcmFnZVJvb3QiOlsibWFrZUNoYWluU3RvcmFnZVJvb3QiXSwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiOlsibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiXSwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSI6WyJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKLuyIDeEAAA3hAAACsAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJiaW5kQWxsTWV0aG9kcyIsImdldE1ldGhvZE5hbWVzIiwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNPYmplY3Q7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyoqXG4gKiBAZmlsZSBtZXRob2QtdG9vbHMgdXNlIGR5bmFtaWMgcHJvcGVydHkgbG9va3VwLCB3aGljaCBpcyBub3QgSmVzc2llLWNvbXBhdGlibGVcbiAqL1xuXG5jb25zdHtnZXRQcm90b3R5cGVPZixjcmVhdGUsZnJvbUVudHJpZXMsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5jb25zdHtvd25LZXlzLGFwcGx5fT1SZWZsZWN0O1xuXG4vKipcbiAqIFByaW9yaXRpemUgc3ltYm9scyBhcyBlYXJsaWVyIHRoYW4gc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGFcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYlxuICogQHJldHVybnMgey0xIHwgMCB8IDF9XG4gKi9cbmNvbnN0IGNvbXBhcmVTdHJpbmdpZmllZD0oYSxiKT0+e1xuaWYodHlwZW9mIGE9PT10eXBlb2YgYil7XG5jb25zdCBsZWZ0PVN0cmluZyhhKTtcbmNvbnN0IHJpZ2h0PVN0cmluZyhiKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5yZXR1cm4gbGVmdDxyaWdodD8tMTpsZWZ0PnJpZ2h0PzE6MDtcbiB9XG5pZih0eXBlb2YgYT09PSdzeW1ib2wnKXtcbmFzc2VydCh0eXBlb2YgYj09PSdzdHJpbmcnKTtcbnJldHVybi0xO1xuIH1cbmFzc2VydCh0eXBlb2YgYT09PSdzdHJpbmcnKTtcbmFzc2VydCh0eXBlb2YgYj09PSdzeW1ib2wnKTtcbnJldHVybiAxO1xuIH07XG5cbi8qKlxuICogVE9ETyBDb25zb2xpZGF0ZSB3aXRoIHRoZSBgZ2V0TWV0aG9kTmFtZXNgIGluIGBAZW5kby9ldmVudHVhbC1zZW5kYFxuICpcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IEtcbiAqIEBwYXJhbSB7UmVjb3JkPEssIGFueT59IHZhbFxuICogQHJldHVybnMge0tbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldE1ldGhvZE5hbWVzPSh2YWwpPT57XG5sZXQgbGF5ZXI9dmFsO1xuY29uc3QgbmFtZXM9bmV3IFNldCgpOy8qIFNldCB0byBkZWR1cGxpY2F0ZSovXG53aGlsZShsYXllciE9PW51bGwmJmxheWVyIT09T2JqZWN0LnByb3RvdHlwZSl7XG4vKiBiZSB0b2xlcmFudCBvZiBub24tb2JqZWN0cyovXG5jb25zdCBkZXNjcz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGxheWVyKTtcbmNvbnN0IG93bk5hbWVzPS8qKiBAdHlwZSB7S1tdfSAqL293bktleXMoZGVzY3MpO1xuZm9yKGNvbnN0IG5hbWUgb2Ygb3duTmFtZXMpe1xuLyogSW4gY2FzZSBhIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5IGEgbm9uLW1ldGhvZCwqL1xuLyogdGVzdCBgdmFsW25hbWVdYCByYXRoZXIgdGhhbiBgbGF5ZXJbbmFtZV1gKi9cbmlmKHR5cGVvZiB2YWxbbmFtZV09PT0nZnVuY3Rpb24nKXtcbm5hbWVzLmFkZChuYW1lKTtcbiB9XG4gfVxuaWYoIWlzT2JqZWN0KHZhbCkpe1xuYnJlYWs7XG4gfVxubGF5ZXI9Z2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuIH1cbnJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xuIH07JGjigI1fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7XG5oYXJkZW4oZ2V0TWV0aG9kTmFtZXMpO1xuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgYGdldE1ldGhvZE5hbWVzYCBjb250YWluaW5nIG9ubHkgc3RyaW5nIG5hbWVzLCB3aXRob3V0IHN5bWJvbHNcbiAqXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBLXG4gKiBAcGFyYW0ge1JlY29yZDxLLCBhbnk+fSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldFN0cmluZ01ldGhvZE5hbWVzPSh2YWwpPT5cbi8qKiBAdHlwZSB7c3RyaW5nW119ICovXG5nZXRNZXRob2ROYW1lcyh2YWwpLmZpbHRlcigobmFtZSk9PnR5cGVvZiBuYW1lPT09J3N0cmluZycpO1xuXG5cbi8qKlxuICogVE9ETyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGVhc2UgdGhlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81OTcwIHRyYW5zaXRpb24sIGZyb20gYWxsIG1ldGhvZHNcbiAqIGJlaW5nIG93biBwcm9wZXJ0aWVzIHRvIG1ldGhvZHMgYmVpbmcgaW5oZXJpdGVkIGZyb20gYSBjb21tb24gcHJvdG90eXBlLlxuICogVGhpcyB0cmFuc2l0aW9uIGJyZWFrcyB0d28gcGF0dGVybnMgdXNlZCBpbiBwcmlvciBjb2RlOiBhdXRvYmluZGluZyxcbiAqIGFuZCBlbnVtZXJhdGluZyBtZXRob2RzIGJ5IGVudW1lcmF0aW5nIG93biBwcm9wZXJ0aWVzLiBGb3IgYm90aCwgdGhlXG4gKiBwcmVmZXJyZWQgcmVwYWlycyBhcmVcbiAqICAgICogYXV0b2JpbmRpbmc6IFJlcGxhY2UsIGZvciBleGFtcGxlLFxuICogICAgICBgZm9vKG9iai5tZXRob2QpYCB3aXRoIGBmb28oYXJnID0+IGBvYmoubWV0aG9kKGFyZykpYC4gSU9XLCBzdG9wIHJlbHlpbmdcbiAqICAgICAgb24gZXhwcmVzc2lvbnMgbGlrZSBgb2JqLm1ldGhvZGAgdG8gZXh0cmFjdCBhIG1ldGhvZCBzdGlsbCBib3VuZCB0byB0aGVcbiAqICAgICAgc3RhdGUgb2YgYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kIGR1cmFibGUgb2JqZWN0cyxcbiAqICAgICAgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqICAgICogbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZVxuICogICAgICBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGggYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuXG4gKiBGb3IgdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBhbnk+fSBUXG4gKiBAcGFyYW0ge1R9IG9ialxuICogQHJldHVybnMge1R9XG4gKi8kaOKAjV9vbmNlLmdldFN0cmluZ01ldGhvZE5hbWVzKGdldFN0cmluZ01ldGhvZE5hbWVzKTtcbmNvbnN0ICAgICAgICBiaW5kQWxsTWV0aG9kcz0ob2JqKT0+XG5oYXJkZW4oXG5jcmVhdGUoXG5vYmosXG5mcm9tRW50cmllcyhcbmdldE1ldGhvZE5hbWVzKG9iaikubWFwKChuYW1lKT0+W1xubmFtZSxcbntcbnZhbHVlOigvKiogQHR5cGUge3Vua25vd25bXX0gKi8uLi5hcmdzKT0+XG5hcHBseShvYmpbbmFtZV0sb2JqLGFyZ3MpLFxuZW51bWVyYWJsZTp0cnVlfV0pKSkpOyRo4oCNX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuXG5cblxuXG5cbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiOlsiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVDn6ES0CAAAtAgAAKQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiU3RvcmFnZU5vZGVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCAgICAgICAgU3RvcmFnZU5vZGVTaGFwZT1NLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKTskaOKAjV9vbmNlLlN0b3JhZ2VOb2RlU2hhcGUoU3RvcmFnZU5vZGVTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiU3RvcmFnZU5vZGVTaGFwZSI6WyJTdG9yYWdlTm9kZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN7GoowrBwAAKwcAACoAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXBncmFkZS1hcGkuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNPYmplY3Q7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIEB0eXBlZGVmIHt7IG5hbWU6IHN0cmluZywgdXBncmFkZU1lc3NhZ2U6IHN0cmluZywgaW5jYXJuYXRpb25OdW1iZXI6IG51bWJlciB9fSBEaXNjb25uZWN0aW9uT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBNYWtlcyBhbiBFcnJvci1saWtlIG9iamVjdCBmb3IgdXNlIGFzIHRoZSByZWplY3Rpb24gdmFsdWUgb2YgcHJvbWlzZXNcbiAqIGFiYW5kb25lZCBieSB1cGdyYWRlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cGdyYWRlTWVzc2FnZVxuICogQHBhcmFtIHtudW1iZXJ9IHRvSW5jYXJuYXRpb25OdW1iZXJcbiAqIEByZXR1cm5zIHtEaXNjb25uZWN0aW9uT2JqZWN0fVxuICovXG5jb25zdCAgICAgICAgbWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uPSh1cGdyYWRlTWVzc2FnZSx0b0luY2FybmF0aW9uTnVtYmVyKT0+XG5oYXJkZW4oe1xubmFtZTondmF0VXBncmFkZWQnLFxudXBncmFkZU1lc3NhZ2UsXG5pbmNhcm5hdGlvbk51bWJlcjp0b0luY2FybmF0aW9uTnVtYmVyfSk7JGjigI1fb25jZS5tYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuaGFyZGVuKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qIFRPRE86IFNpbXBsaWZ5IG9uY2Ugd2UgaGF2ZSBAZW5kby9wYXR0ZXJucyAob3IganVzdCBleHBvcnQgdGhlIHNoYXBlKS4qL1xuLyogY29uc3QgdXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSA9IGhhcmRlbih7Ki9cbi8qIG5hbWU6ICd2YXRVcGdyYWRlZCcsKi9cbi8qIHVwZ3JhZGVNZXNzYWdlOiBNLnN0cmluZygpLCovXG4vKiBpbmNhcm5hdGlvbk51bWJlcjogTS5udW1iZXIoKSwqL1xuLyogfSk7Ki9cbi8qIGNvbnN0IGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSBlcnIgPT4gbWF0Y2hlcyhlcnIsIHVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpOyovXG4vKipcbiAqIEBwYXJhbSB7YW55fSBlcnJcbiAqIEByZXR1cm5zIHtlcnIgaXMgRGlzY29ubmVjdGlvbk9iamVjdH1cbiAqL1xuY29uc3QgICAgICAgIGlzVXBncmFkZURpc2Nvbm5lY3Rpb249KGVycik9PlxuaXNPYmplY3QoZXJyKSYmXG5lcnIubmFtZT09PSd2YXRVcGdyYWRlZCcmJlxudHlwZW9mIGVyci51cGdyYWRlTWVzc2FnZT09PSdzdHJpbmcnJiZcbnR5cGVvZiBlcnIuaW5jYXJuYXRpb25OdW1iZXI9PT0nbnVtYmVyJzskaOKAjV9vbmNlLmlzVXBncmFkZURpc2Nvbm5lY3Rpb24oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIjpbIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoumxkuM8AADjPAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9zdHJlYW0iLCJqZXNzaWUuanMiXSwiZXhwb3J0cyI6WyJCQVNJU19QT0lOVFMiLCJQcm9taXNlQWxsT3JFcnJvcnMiLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IiwiYWxsVmFsdWVzIiwiYXBwbHlMYWJlbGluZ0Vycm9yIiwiYXNzZXJ0QWxsRGVmaW5lZCIsImRlZXBseUZ1bGZpbGxlZE9iamVjdCIsImZvcmV2ZXIiLCJmcm9tVW5pcXVlRW50cmllcyIsImxpc3REaWZmZXJlbmNlIiwibWFrZUFnZ3JlZ2F0ZUVycm9yIiwibWFrZU1lYXN1cmVTZWNvbmRzIiwib2JqZWN0TWFwIiwic3luY2hyb25pemVkVGVlIiwidGhyb3dMYWJlbGVkIiwidW50aWxUcnVlIiwid2hpbGVUcnVlIiwiemlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsZGVlcGx5RnVsZmlsbGVkLGlzT2JqZWN0LGlzUHJvbWlzZSxtYWtlUHJvbWlzZUtpdCxtYWtlUXVldWUsYXN5bmNHZW5lcmF0ZSxtYWtlU2V0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIiwgWyRo4oCNX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRo4oCNX2EgPT4gKGlzUHJvbWlzZSA9ICRo4oCNX2EpXV0sW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3N0cmVhbVwiLCBbW1wibWFrZVF1ZXVlXCIsIFskaOKAjV9hID0+IChtYWtlUXVldWUgPSAkaOKAjV9hKV1dXV0sW1wiamVzc2llLmpzXCIsIFtbXCJhc3luY0dlbmVyYXRlXCIsIFskaOKAjV9hID0+IChhc3luY0dlbmVyYXRlID0gJGjigI1fYSldXSxbXCJtYWtlU2V0XCIsIFskaOKAjV9hID0+IChtYWtlU2V0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxrZXlzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgQkFTSVNfUE9JTlRTPTEwXzAwMG47XG5cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWY8VD4gKi9cblxuLyoqXG4gKiBUaHJvd3MgaWYgbXVsdGlwbGUgZW50cmllcyB1c2UgdGhlIHNhbWUgcHJvcGVydHkgbmFtZS4gT3RoZXJ3aXNlIGFjdHNcbiAqIGxpa2UgYE9iamVjdC5mcm9tRW50cmllc2AgYnV0IGhhcmRlbnMgdGhlIHJlc3VsdC5cbiAqIFVzZSBpdCB0byBwcm90ZWN0IGZyb20gcHJvcGVydHkgbmFtZXMgY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxWXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7W2s6IEtdOiBWfX1cbiAqLyRo4oCNX29uY2UuQkFTSVNfUE9JTlRTKEJBU0lTX1BPSU5UUyk7XG5jb25zdCAgICAgICAgZnJvbVVuaXF1ZUVudHJpZXM9KGFsbEVudHJpZXMpPT57XG5jb25zdCBlbnRyaWVzQXJyYXk9Wy4uLmFsbEVudHJpZXNdO1xuY29uc3QgcmVzdWx0PWhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpKTtcbmlmKG93bktleXMocmVzdWx0KS5sZW5ndGg9PT1lbnRyaWVzQXJyYXkubGVuZ3RoKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuY29uc3QgbmFtZXM9bWFrZVNldCgpO1xuZm9yKGNvbnN0W25hbWUsX11vZiBlbnRyaWVzQXJyYXkpe1xuaWYobmFtZXMuaGFzKG5hbWUpKXtcbkZhaWwgYGNvbGxpc2lvbiBvbiBwcm9wZXJ0eSBuYW1lICR7cShuYW1lKX06ICR7ZW50cmllc0FycmF5fWA7XG4gfVxubmFtZXMuYWRkKG5hbWUpO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYDtcbiB9OyRo4oCNX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2ZcbiAqIGFuIGFycmF5IHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLFxuICogYG9iamVjdE1hcGAgd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIHN0cmluZy1uYW1lZCBvd24gZW51bWVyYWJsZVxuICogcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVHlwaWNhbCB1c2FnZSBhcHBsaWVzIGBvYmplY3RNYXBgIHRvIGEgQ29weVJlY29yZCwgaS5lLixcbiAqIGFuIG9iamVjdCBmb3Igd2hpY2ggYHBhc3NTdHlsZU9mKG9yaWdpbmFsKSA9PT0gJ2NvcHlSZWNvcmQnYC4gRm9yIHRoZXNlLFxuICogbm9uZSBvZiB0aGUgZm9sbG93aW5nIGVkZ2UgY2FzZXMgYXJpc2UuIFRoZSByZXN1bHQgd2lsbCBiZSBhIENvcHlSZWNvcmRcbiAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lcywgd2hvc2UgdmFsdWVzIGFyZSB0aGUgbWFwcGVkIGZvcm0gb2ZcbiAqIHRoZSBvcmlnaW5hbCdzIHZhbHVlcy5cbiAqXG4gKiBXaGVuIHRoZSBvcmlnaW5hbCBpcyBub3QgYSBDb3B5UmVjb3JkLCBzb21lIGVkZ2UgY2FzZXMgdG8gYmUgYXdhcmUgb2ZcbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIE9ubHkgdGhlIHN0cmluZy1uYW1lZCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbFxuICogICAgICBhcmUgbWFwcGVkLiBBbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgaWdub3JlZC5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCBgT2JqZWN0LmVudHJpZXNgXG4gKiAgICAgIHdpbGwgY2F1c2UgaXRzIGBnZXR0ZXJgIHRvIGJlIGNhbGxlZCBhbmQgd2lsbCB1c2UgdGhlIHJlc3VsdGluZ1xuICogICAgICB2YWx1ZS5cbiAqICAgICogTm8gbWF0dGVyIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHByb3BlcnR5IHdhcyBhbiBhY2Nlc3Nvciwgd3JpdGFibGUsXG4gKiAgICAgIG9yIGNvbmZpZ3VyYWJsZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogICAgICBub24td3JpdGFibGUsIG5vbi1jb25maWd1cmFibGUsIGRhdGEgcHJvcGVydGllcy5cbiAqICAgICogTm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBtYXkgaGF2ZSBpbmhlcml0ZWQgZnJvbSwgYW5kXG4gKiAgICAgIG5vIG1hdHRlciB3aGV0aGVyIGl0IHdhcyBhIHNwZWNpYWwga2luZCBvZiBvYmplY3Qgc3VjaCBhcyBhbiBhcnJheSxcbiAqICAgICAgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCBpbmhlcml0aW5nIGRpcmVjdGx5XG4gKiAgICAgIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFuZCB3aG9zZSBzdGF0ZSBpcyBvbmx5IHRoZXNlIG5ldyBtYXBwZWRcbiAqICAgICAgb3duIHByb3BlcnRpZXMuXG4gKlxuICogV2l0aCB0aGVzZSBkaWZmZXJlbmNlcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyBub3QgYSBDb3B5UmVjb3JkLFxuICogaWYgYWxsIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqIGEgQ29weVJlY29yZC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IE9cbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEB0ZW1wbGF0ZSBSIG1hcCByZXN1bHRcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW2tleW9mIE9dLCBrZXk6IGtleW9mIE8pID0+IFJ9IG1hcEZuXG4gKiBAcmV0dXJucyB7eyBbUCBpbiBrZXlvZiBPXTogUn19XG4gKi9cbmNvbnN0ICAgICAgICBvYmplY3RNYXA9KG9yaWdpbmFsLG1hcEZuKT0+e1xuY29uc3QgZW50cz1lbnRyaWVzKG9yaWdpbmFsKTtcbmNvbnN0IG1hcEVudHM9ZW50cy5tYXAoKFtrLHZdKT0+W2ssbWFwRm4odixrKV0pO1xucmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSk7XG4gfTskaOKAjV9vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG5cbi8qKlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSBsZWZ0TmFtZXNcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gcmlnaHROYW1lc1xuICovXG5jb25zdCAgICAgICAgbGlzdERpZmZlcmVuY2U9KGxlZnROYW1lcyxyaWdodE5hbWVzKT0+e1xuY29uc3QgcmlnaHRTZXQ9bWFrZVNldChyaWdodE5hbWVzKTtcbnJldHVybiBsZWZ0TmFtZXMuZmlsdGVyKChuYW1lKT0+IXJpZ2h0U2V0LmhhcyhuYW1lKSk7XG4gfTskaOKAjV9vbmNlLmxpc3REaWZmZXJlbmNlKGxpc3REaWZmZXJlbmNlKTtcbmhhcmRlbihsaXN0RGlmZmVyZW5jZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gaW5uZXJFcnJcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbGFiZWxcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB0aHJvd0xhYmVsZWQ9KGlubmVyRXJyLGxhYmVsLEVycm9yQ29uc3RydWN0b3I9dW5kZWZpbmVkKT0+e1xuaWYodHlwZW9mIGxhYmVsPT09J251bWJlcicpe1xubGFiZWw9IGBbJHtsYWJlbH1dYDtcbiB9XG5jb25zdCBvdXRlckVycj1hc3NlcnQuZXJyb3IoXG4gYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YCxcbkVycm9yQ29uc3RydWN0b3IpO1xuXG5hc3NlcnQubm90ZShvdXRlckVycixYIGBDYXVzZWQgYnkgJHtpbm5lckVycn1gKTtcbnRocm93IG91dGVyRXJyO1xuIH07JGjigI1fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBLFJcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gUn0gZnVuY1xuICogQHBhcmFtIHtBW119IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge1J9XG4gKi9cbmNvbnN0ICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3I9KGZ1bmMsYXJncyxsYWJlbD11bmRlZmluZWQpPT57XG5pZihsYWJlbD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYyguLi5hcmdzKTtcbiB9XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG50aHJvd0xhYmVsZWQoZXJyLGxhYmVsKTtcbiB9XG5pZihpc1Byb21pc2UocmVzdWx0KSl7XG4vKiBJZiByZXN1bHQgaXMgYSByZWplY3RlZCBwcm9taXNlLCB0aGlzIHdpbGwgcmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEqL1xuLyogZGlmZmVyZW50IHJlamVjdGlvbiByZWFzb24uIEJ1dCB0aGlzIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyovXG4vKiB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCB3aGljaCBpcyBjb29sIGZvciBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyKi9cbi8qIGZ1bGZpbGwuICBCdXQgVHlwZVNjcmlwdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGlzIHdpbGwgb25seSBoYXBwZW4qL1xuLyogd2hlbiBgcmVzdWx0YCB3YXMgYSByZWplY3RlZCBwcm9taXNlLiBJbiBvbmx5IHRoaXMgY2FzZSBgUmAgc2hvdWxkKi9cbi8qIGFscmVhZHkgYWxsb3cgYFByb21pc2U8bmV2ZXI+YCBhcyBhIHN1YnR5cGUuKi9cbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IHJlbGFiZWxlZD1FLndoZW4ocmVzdWx0LHVuZGVmaW5lZCwocmVhc29uKT0+XG50aHJvd0xhYmVsZWQocmVhc29uLGxhYmVsKSk7XG5cbnJldHVybiAoLyoqIEB0eXBlIHtSfSAqL3JlbGFiZWxlZCk7XG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tbS2V5VHlwZSBpbiBrZXlvZiBUXTogVFtLZXlUeXBlXX0gJiB7fX0gU2ltcGxpZnlcbiAqIGZsYXR0ZW4gdGhlIHR5cGUgb3V0cHV0IHRvIGltcHJvdmUgdHlwZSBoaW50cyBzaG93biBpbiBlZGl0b3JzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdC9ibG9iL21haW4vc291cmNlL3NpbXBsaWZ5LmQudHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEB0eXBlZGVmIHt7IFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ2FsbGFibGUgPyBUW0tdIDogRGVlcGx5QXdhaXRlZDxUW0tdPiB9fSBEZWVwbHlBd2FpdGVkT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyBQcm9taXNlTGlrZTxhbnk+ID8gQXdhaXRlZDxUPiA6IFQgZXh0ZW5kcyB7fSA/IFNpbXBsaWZ5PERlZXBseUF3YWl0ZWRPYmplY3Q8VD4+IDogQXdhaXRlZDxUPn0gRGVlcGx5QXdhaXRlZFxuICovXG5cbi8qKlxuICogQSBtb3JlIGNvbnN0cmFpbmVkIHZlcnNpb24gb2Yge2RlZXBseUZ1bGZpbGxlZH0gZm9yIHR5cGUgc2FmZXR5IHVudGlsXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzEyNTdcbiAqIFVzZWZ1bCBpbiBzdGFydGluZyBjb250cmFjdHMgdGhhdCBuZWVkIGFsbCB0ZXJtcyB0byBiZSBmdWxmaWxsZWRcbiAqIGluIG9yZGVyIHRvIGJlIGR1cmFibGUuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMge30+KHVuZnVsZmlsbGVkVGVybXM6IFQpID0+IFByb21pc2U8RGVlcGx5QXdhaXRlZDxUPj59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWRPYmplY3Q9YXN5bmMob2JqKT0+e1xuaXNPYmplY3Qob2JqKXx8RmFpbCBgcGFyYW0gbXVzdCBiZSBhbiBvYmplY3RgO1xucmV0dXJuIGRlZXBseUZ1bGZpbGxlZChvYmopO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdXNlcyBhIG1pbGxpc2Vjb25kLWJhc2VkIHRpbWUtc2luY2UtZXBvY2ggY2FwYWJpbGl0eVxuICogKHN1Y2ggYXMgYHBlcmZvcm1hbmNlLm5vd2ApIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWUgb2YgYW4gYXN5bmMgZnVuY3Rpb25cbiAqIGFuZCByZXBvcnQgdGhlIHJlc3VsdCBpbiBzZWNvbmRzIHRvIG1hdGNoIG91ciB0ZWxlbWV0cnkgc3RhbmRhcmQuXG4gKlxuICogQHBhcmFtIHt0eXBlb2YgWGltcG9ydCgncGVyZl9ob29rcycpLnBlcmZvcm1hbmNlLm5vd30gY3VycmVudFRpbWVNaWxsaXNlY1xuICogQHJldHVybnMgezxUPihmbjogKCkgPT4gUHJvbWlzZTxUPikgPT4gUHJvbWlzZTx7IHJlc3VsdDogVCwgZHVyYXRpb246IG51bWJlciB9Pn1cbiAqLyRo4oCNX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCAgICAgICAgbWFrZU1lYXN1cmVTZWNvbmRzPShjdXJyZW50VGltZU1pbGxpc2VjKT0+e1xuLyoqIEBwYXJhbSB7KCkgPT4gYW55fSBmbiAqL1xuY29uc3QgbWVhc3VyZVNlY29uZHM9YXN5bmMoZm4pPT57XG5jb25zdCB0MD1jdXJyZW50VGltZU1pbGxpc2VjKCk7XG5jb25zdCByZXN1bHQ9YXdhaXQgZm4oKTtcbmNvbnN0IGR1cmF0aW9uTWlsbGlzZWM9Y3VycmVudFRpbWVNaWxsaXNlYygpLXQwO1xucmV0dXJue3Jlc3VsdCxkdXJhdGlvbjpkdXJhdGlvbk1pbGxpc2VjLzEwMDB9O1xuIH07XG5yZXR1cm4gbWVhc3VyZVNlY29uZHM7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yW119IGVycm9yc1xuICogQHBhcmFtIHtzdHJpbmd9IFttZXNzYWdlXVxuICovJGjigI1fb25jZS5tYWtlTWVhc3VyZVNlY29uZHMobWFrZU1lYXN1cmVTZWNvbmRzKTtcbmNvbnN0ICAgICAgICBtYWtlQWdncmVnYXRlRXJyb3I9KGVycm9ycyxtZXNzYWdlKT0+e1xuY29uc3QgZXJyPUVycm9yKG1lc3NhZ2UpO1xuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZXJyLHtcbm5hbWU6e1xudmFsdWU6J0FnZ3JlZ2F0ZUVycm9yJ30sXG5cbmVycm9yczp7XG52YWx1ZTplcnJvcnN9fSk7XG5cblxucmV0dXJuIGVycjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3JlYWRvbmx5IChUIHwgUHJvbWlzZUxpa2U8VD4pW119IGl0ZW1zXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxUW10+fVxuICovJGjigI1fb25jZS5tYWtlQWdncmVnYXRlRXJyb3IobWFrZUFnZ3JlZ2F0ZUVycm9yKTtcbmNvbnN0ICAgICAgICBQcm9taXNlQWxsT3JFcnJvcnM9YXN5bmMoaXRlbXMpPT57XG5yZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGl0ZW1zKS50aGVuKChyZXN1bHRzKT0+e1xuY29uc3QgZXJyb3JzPS8qKiBAdHlwZSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0W119ICovXG5yZXN1bHRzLmZpbHRlcigoe3N0YXR1c30pPT5zdGF0dXM9PT0ncmVqZWN0ZWQnKS5cbm1hcCgocmVzdWx0KT0+cmVzdWx0LnJlYXNvbik7XG5pZighZXJyb3JzLmxlbmd0aCl7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxUPltdfSAqL3Jlc3VsdHMubWFwKFxuKHJlc3VsdCk9PnJlc3VsdC52YWx1ZSkpO1xuXG4gfWVsc2UgaWYoZXJyb3JzLmxlbmd0aD09PTEpe1xudGhyb3cgZXJyb3JzWzBdO1xuIH1lbHNle1xudGhyb3cgbWFrZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gfVxuIH0pO1xuIH07XG5cbi8qKlxuICogQHR5cGUgezxUPihcbiAqICAgdHJpZXI6ICgpID0+IFByb21pc2U8VD4sXG4gKiAgZmluYWxpemVyOiAoZXJyb3I/OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+LFxuICogKSA9PiBQcm9taXNlPFQ+fVxuICovJGjigI1fb25jZS5Qcm9taXNlQWxsT3JFcnJvcnMoUHJvbWlzZUFsbE9yRXJyb3JzKTtjb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5PWFzeW5jKHRyaWVyLGZpbmFsaXplcik9PlxudHJpZXIoKS50aGVuKFxuYXN5bmMocmVzdWx0KT0+ZmluYWxpemVyKCkudGhlbigoKT0+cmVzdWx0KSxcbmFzeW5jKHRyeUVycm9yKT0+XG5maW5hbGl6ZXIodHJ5RXJyb3IpLlxudGhlbihcbigpPT50cnlFcnJvcixcbihmaW5hbGl6ZUVycm9yKT0+bWFrZUFnZ3JlZ2F0ZUVycm9yKFt0cnlFcnJvcixmaW5hbGl6ZUVycm9yXSkpLlxuXG50aGVuKChlcnJvcik9PlByb21pc2UucmVqZWN0KGVycm9yKSkpO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVFxuICogQHR5cGVkZWYge3tbUCBpbiBrZXlvZiBUXTogRXhjbHVkZTxUW1BdLCB1bmRlZmluZWQ+O319IEFsbERlZmluZWRcbiAqL1xuXG4vKipcbiAqIENvbmNpc2Ugd2F5IHRvIGNoZWNrIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGZyb20gb2JqZWN0IGxpdGVyYWwgc2hvcnRoYW5kLlxuICogVGhyb3dzIGVycm9yIG1lc3NhZ2UgdG8gc3BlY2lmeSB0aGUgbWlzc2luZyB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gVFxuICogQHBhcmFtIHtUfSBvYmpcbiAqIEB0aHJvd3MgaWYgYW55IHZhbHVlIGluIHRoZSBvYmplY3QgZW50cmllcyBpcyBub3QgZGVmaW5lZFxuICogQHJldHVybnMge2Fzc2VydHMgb2JqIGlzIEFsbERlZmluZWQ8VD59XG4gKi8kaOKAjV9vbmNlLmFnZ3JlZ2F0ZVRyeUZpbmFsbHkoYWdncmVnYXRlVHJ5RmluYWxseSk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRBbGxEZWZpbmVkPShvYmopPT57XG5jb25zdCBtaXNzaW5nPVtdO1xuZm9yKGNvbnN0W2tleSx2YWxdb2YgT2JqZWN0LmVudHJpZXMob2JqKSl7XG5pZih2YWw9PT11bmRlZmluZWQpe1xubWlzc2luZy5wdXNoKGtleSk7XG4gfVxuIH1cbmlmKG1pc3NpbmcubGVuZ3RoPjApe1xuRmFpbCBgbWlzc2luZyAke3EobWlzc2luZyl9YDtcbiB9XG4gfTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDx1bmRlZmluZWQsIG5ldmVyPn0gKi8kaOKAjV9vbmNlLmFzc2VydEFsbERlZmluZWQoYXNzZXJ0QWxsRGVmaW5lZCk7XG5jb25zdCBub3REb25lPWhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTp1bmRlZmluZWR9KTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxuZXZlciwgdm9pZD59ICovXG5jb25zdCBhbHdheXNEb25lPWhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuXG5jb25zdCAgICAgICAgZm9yZXZlcj1hc3luY0dlbmVyYXRlKCgpPT5ub3REb25lKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUfSBwcm9kdWNlXG4gKiBUaGUgdmFsdWUgb2YgYGF3YWl0IHByb2R1Y2UoKWAgaXMgdXNlZCBmb3IgaXRzIHRydXRoaW5lc3MgdnMgZmFsc2luZXNzLlxuICogSU9XLCBpdCBpcyBjb2VyY2VkIHRvIGEgYm9vbGVhbiBzbyB0aGUgY2FsbGVyIG5lZWQgbm90IGJvdGhlciBkb2luZyB0aGlzXG4gKiB0aGVtc2VsdmVzLlxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8QXdhaXRlZDxUPj59XG4gKi8kaOKAjV9vbmNlLmZvcmV2ZXIoZm9yZXZlcik7XG5jb25zdCAgICAgICAgd2hpbGVUcnVlPShwcm9kdWNlKT0+XG5hc3luY0dlbmVyYXRlKGFzeW5jKCk9PntcbmNvbnN0IHZhbHVlPWF3YWl0IHByb2R1Y2UoKTtcbmlmKCF2YWx1ZSl7XG5yZXR1cm4gYWx3YXlzRG9uZTtcbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmRvbmU6ZmFsc2UsXG52YWx1ZX0pO1xuXG4gfSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVH0gcHJvZHVjZVxuICogVGhlIHZhbHVlIG9mIGBhd2FpdCBwcm9kdWNlKClgIGlzIHVzZWQgZm9yIGl0cyB0cnV0aGluZXNzIHZzIGZhbHNpbmVzcy5cbiAqIElPVywgaXQgaXMgY29lcmNlZCB0byBhIGJvb2xlYW4gc28gdGhlIGNhbGxlciBuZWVkIG5vdCBib3RoZXIgZG9pbmcgdGhpc1xuICogdGhlbXNlbHZlcy5cbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPEF3YWl0ZWQ8VD4+fVxuICovJGjigI1fb25jZS53aGlsZVRydWUod2hpbGVUcnVlKTtcbmNvbnN0ICAgICAgICB1bnRpbFRydWU9KHByb2R1Y2UpPT5cbmFzeW5jR2VuZXJhdGUoYXN5bmMoKT0+e1xuY29uc3QgdmFsdWU9YXdhaXQgcHJvZHVjZSgpO1xuaWYodmFsdWUpe1xucmV0dXJuIGhhcmRlbih7XG5kb25lOnRydWUsXG52YWx1ZX0pO1xuXG4gfVxucmV0dXJuIGhhcmRlbih7XG5kb25lOmZhbHNlLFxudmFsdWV9KTtcblxuIH0pO1xuXG4vKiogQHR5cGUgeyA8WCwgWT4oeHM6IFhbXSwgeXM6IFlbXSkgPT4gW1gsIFldW119ICovJGjigI1fb25jZS51bnRpbFRydWUodW50aWxUcnVlKTtcbmNvbnN0ICAgICAgICB6aXA9KHhzLHlzKT0+aGFyZGVuKHhzLm1hcCgoeCxpKT0+W3gseXNbK2ldXSkpO1xuXG4vKiogQHR5cGUgeyA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIEVSZWY8YW55Pj4+KG9iajogVCkgPT4gUHJvbWlzZTx7IFtLIGluIGtleW9mIFRdOiBBd2FpdGVkPFRbS10+fT4gfSAqLyRo4oCNX29uY2UuemlwKHppcCk7XG5jb25zdCAgICAgICAgYWxsVmFsdWVzPWFzeW5jKG9iaik9PntcbmNvbnN0IHJlc29sdmVkPWF3YWl0IFByb21pc2UuYWxsKHZhbHVlcyhvYmopKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKHppcChrZXlzKG9iaikscmVzb2x2ZWQpKSk7XG4gfTtcblxuLyoqXG4gKiBBIHRlZSBpbXBsZW1lbnRhdGlvbiB3aGVyZSBhbGwgcmVhZGVycyBhcmUgc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlci5cbiAqIFRoZXkgYWxsIGNvbnN1bWUgdGhlIHNvdXJjZSBzdHJlYW0gaW4gbG9ja3N0ZXAsIGFuZCBhbnkgb25lIHJldHVybmluZyBvclxuICogdGhyb3dpbmcgZWFybHkgd2lsbCBhZmZlY3QgdGhlIG90aGVycy5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7QXN5bmNJdGVyYXRvcjxULCB2b2lkLCB2b2lkPn0gc291cmNlU3RyZWFtXG4gKiBAcGFyYW0ge251bWJlcn0gcmVhZGVyQ291bnRcbiAqLyRo4oCNX29uY2UuYWxsVmFsdWVzKGFsbFZhbHVlcyk7XG5jb25zdCAgICAgICAgc3luY2hyb25pemVkVGVlPShzb3VyY2VTdHJlYW0scmVhZGVyQ291bnQpPT57XG4vKiogQHR5cGUge0l0ZXJhdG9yUmV0dXJuUmVzdWx0PHZvaWQ+IHwgdW5kZWZpbmVkfSAqL1xubGV0IGRvbmVSZXN1bHQ7XG5cbi8qKiBAdHlwZWRlZiB7SXRlcmF0b3JSZXN1bHQ8KHZhbHVlOiBQcm9taXNlTGlrZTxJdGVyYXRvclJlc3VsdDxUPj4pID0+IHZvaWQ+fSBRdWV1ZVBheWxvYWQgKi9cbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vc3RyZWFtJykuQXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+W119ICovXG5jb25zdCBxdWV1ZXM9W107XG5cbi8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbmNvbnN0IHB1bGxOZXh0PWFzeW5jKCk9PntcbmNvbnN0IHJlcXVlc3RzPWF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChxdWV1ZXMubWFwKChxdWV1ZSk9PnF1ZXVlLmdldCgpKSk7XG5jb25zdCByZWplY3Rpb25zPVtdO1xuLyoqIEB0eXBlIHtBcnJheTwodmFsdWU6IFByb21pc2VMaWtlPEl0ZXJhdG9yUmVzdWx0PFQ+PikgPT4gdm9pZD59ICovXG5jb25zdCByZXNvbHZlcnM9W107XG5sZXQgZG9uZT1mYWxzZTtcbmZvcihjb25zdCBzZXR0bGVkUmVzdWx0IG9mIHJlcXVlc3RzKXtcbmlmKHNldHRsZWRSZXN1bHQuc3RhdHVzPT09J3JlamVjdGVkJyl7XG5yZWplY3Rpb25zLnB1c2goc2V0dGxlZFJlc3VsdC5yZWFzb24pO1xuIH1lbHNle1xuZG9uZXx8PSEhc2V0dGxlZFJlc3VsdC52YWx1ZS5kb25lO1xucmVzb2x2ZXJzLnB1c2goc2V0dGxlZFJlc3VsdC52YWx1ZS52YWx1ZSk7XG4gfVxuIH1cbi8qKiBAdHlwZSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj59ICovXG5sZXQgcmVzdWx0O1xuaWYoZG9uZVJlc3VsdCl7XG5yZXN1bHQ9UHJvbWlzZS5yZXNvbHZlKGRvbmVSZXN1bHQpO1xuIH1lbHNlIGlmKHJlamVjdGlvbnMubGVuZ3RoKXtcbmNvbnN0IGVycm9yPWFzc2VydC5lcnJvcihhc3NlcnQuZGV0YWlscyBgVGVlZCBzdHJlYW0gdGhyZXdgKTtcbmFzc2VydC5ub3RlKGVycm9yLGFzc2VydC5kZXRhaWxzIGBUZWVkIHJlamVjdGlvbnM6ICR7cmVqZWN0aW9uc31gKTtcbnJlc3VsdD1cbnNvdXJjZVN0cmVhbS50aHJvdz8uKGVycm9yKXx8XG5Qcm9taXNlLnJlc29sdmUoc291cmNlU3RyZWFtLnJldHVybj8uKCkpLnRoZW4oKCk9PlxuUHJvbWlzZS5yZWplY3QoZXJyb3IpKTtcblxuIH1lbHNlIGlmKGRvbmUpe1xucmVzdWx0PVxuc291cmNlU3RyZWFtLnJldHVybj8uKCl8fFxuUHJvbWlzZS5yZXNvbHZlKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfWVsc2V7XG5yZXN1bHQ9c291cmNlU3RyZWFtLm5leHQoKTtcbiB9XG5yZXN1bHQudGhlbihcbihyKT0+e1xuaWYoci5kb25lKXtcbmRvbmVSZXN1bHQ9cjtcbiB9XG4gfSxcbigpPT57XG5kb25lUmVzdWx0PXtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfTtcbiB9KTtcblxucmVzb2x2ZXJzLmZvckVhY2goKHJlc29sdmUpPT5yZXNvbHZlKHJlc3VsdCkpO1xucmV0dXJuIHB1bGxOZXh0KCk7XG4gfTtcblxuY29uc3QgcmVhZGVycz1BcnJheS5mcm9tKHtsZW5ndGg6cmVhZGVyQ291bnR9KS5tYXAoKCk9Pntcbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vc3RyZWFtJykuQXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+fSAqL1xuY29uc3QgcXVldWU9bWFrZVF1ZXVlKCk7XG5xdWV1ZXMucHVzaChxdWV1ZSk7XG5cbi8qKiBAdHlwZSB7QXN5bmNHZW5lcmF0b3I8VCwgdm9pZCwgdm9pZD59ICovXG5jb25zdCByZWFkZXI9aGFyZGVuKHtcbiAgICAgIGFzeW5jIG5leHQoKXtcbi8qKiBAdHlwZSB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlS2l0PEl0ZXJhdG9yUmVzdWx0PFQ+Pn0gKi9cbmNvbnN0e3Byb21pc2UscmVzb2x2ZX09bWFrZVByb21pc2VLaXQoKTtcbnF1ZXVlLnB1dCh7dmFsdWU6cmVzb2x2ZSxkb25lOmZhbHNlfSk7XG5yZXR1cm4gcHJvbWlzZTtcbiB9LFxuICAgICAgYXN5bmMgcmV0dXJuKCl7XG4vKiogQHR5cGUge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZUtpdDxJdGVyYXRvclJlc3VsdDxUPj59ICovXG5jb25zdHtwcm9taXNlLHJlc29sdmV9PW1ha2VQcm9taXNlS2l0KCk7XG5xdWV1ZS5wdXQoe3ZhbHVlOnJlc29sdmUsZG9uZTp0cnVlfSk7XG5yZXR1cm4gcHJvbWlzZTtcbiB9LFxuICAgICAgYXN5bmMgdGhyb3cocmVhc29uKXtcbmNvbnN0IHJlamVjdGlvbj1Qcm9taXNlLnJlamVjdChyZWFzb24pO1xucXVldWUucHV0KHJlamVjdGlvbik7XG5yZXR1cm4gcmVqZWN0aW9uO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiByZWFkZXI7XG4gfX0pO1xuXG5yZXR1cm4gcmVhZGVyO1xuIH0pO1xuXG52b2lkIHB1bGxOZXh0KCk7XG5yZXR1cm4gcmVhZGVycztcbiB9OyRo4oCNX29uY2Uuc3luY2hyb25pemVkVGVlKHN5bmNocm9uaXplZFRlZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQkFTSVNfUE9JTlRTIjpbIkJBU0lTX1BPSU5UUyJdLCJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl0sImxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl0sInRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXSwiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXSwibWFrZUFnZ3JlZ2F0ZUVycm9yIjpbIm1ha2VBZ2dyZWdhdGVFcnJvciJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJhc3NlcnRBbGxEZWZpbmVkIjpbImFzc2VydEFsbERlZmluZWQiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXSwic3luY2hyb25pemVkVGVlIjpbInN5bmNocm9uaXplZFRlZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABn0MWK1RIAANUSAAAzAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzeyJpbXBvcnRzIjpbIi4vc3Vic2NyaWJlLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJvYnNlcnZlSXRlcmF0aW9uIiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZU5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsc3Vic2NyaWJlTGF0ZXN0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgYHN1YnNjcmliZUxhdGVzdGAgZnJvbSBgQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanNgIGluc3RlYWQuXG4gKlxuICogQWRhcHRvciBmcm9tIGEgbm90aWZpZXJQIHRvIGFuIGFzeW5jIGl0ZXJhYmxlLlxuICogVGhlIG5vdGlmaWVyUCBjYW4gYmUgYW55IG9iamVjdCB0aGF0IGhhcyBhbiBldmVudHVhbGx5IGludm9jYWJsZVxuICogYGdldFVwZGF0ZVNpbmNlYCBtZXRob2QgdGhhdCBiZWhhdmVzIGFjY29yZGluZyB0byB0aGUgbm90aWZpZXJcbiAqIHNwZWMuIFRoaXMgY2FuIGJlIGEgbm90aWZpZXIsIGEgcHJvbWlzZSBmb3IgYSBsb2NhbCBvciByZW1vdGVcbiAqIG5vdGlmaWVyLCBvciBhIHByZXNlbmNlIG9mIGEgcmVtb3RlIG5vdGlmaWVyLlxuICpcbiAqIEl0IGlzIGFsc28gdXNlZCBpbnRlcm5hbGx5IGJ5IG5vdGlmaWVyLmpzIHNvIHRoYXQgYSBub3RpZmllciBpdHNlbGYgaXMgYW5cbiAqIGFzeW5jIGl0ZXJhYmxlLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhYmxlIGlzIGFuIG9iamVjdCB3aXRoIGEgYFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKWAgbWV0aG9kXG4gKiB0aGF0IHJldHVybnMgYW4gYXN5bmMgaXRlcmF0b3IuIFRoZSBhc3luYyBpdGVyYXRvciB3ZSByZXR1cm4gaGVyZSBoYXMgb25seVxuICogYSBgbmV4dCgpYCBtZXRob2QsIHdpdGhvdXQgdGhlIG9wdGlvbmFsIGByZXR1cm5gIGFuZCBgdGhyb3dgIG1ldGhvZHMuIFRoZVxuICogb21pdHRlZCBtZXRob2RzLCBpZiBwcmVzZW50LCB3b3VsZCBiZSB1c2VkIGJ5IHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB0b1xuICogaW5mb3JtIHRoZSBpdGVyYXRvciBvZiBlYXJseSB0ZXJtaW5hdGlvbi4gQnV0IHRoaXMgYWRhcHRvciB3b3VsZCBub3QgZG9cbiAqIGFueXRoaW5nIHVzZWZ1bCBpbiByZWFjdGlvbiB0byB0aGlzIG5vdGlmaWNhdGlvbi5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYXRvcidzIGBuZXh0KClgIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYW4gaXRlcmF0aW9uXG4gKiByZXN1bHQuIEFuIGl0ZXJhdGlvbiByZXN1bHQgaXMgYSByZWNvcmQgd2l0aCBgdmFsdWVgIGFuZCBgZG9uZWAgcHJvcGVydGllcy5cbiAqXG4gKiBUaGUgcHVycG9zZSBvZiBidWlsZGluZyBvbiB0aGUgbm90aWZpZXIgcHJvdG9jb2wgaXMgdG8gaGF2ZSBhIGxvc3N5XG4gKiBhZGFwdG9yLCB3aGVyZSBpbnRlcm1lZGlhdGUgcmVzdWx0cyBjYW4gYmUgbWlzc2VkIGluIGZhdm9yIG9mIG1vcmUgcmVjZW50XG4gKiByZXN1bHRzIHdoaWNoIGFyZSB0aGVyZWZvcmUgbGVzcyBzdGFsZS4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2RvY3VtZW50YXRpb24vYmxvYi9IRUFEL21haW4vZ3VpZGVzL2pzLXByb2dyYW1taW5nL25vdGlmaWVycy5tZFxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QmFzZU5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJQXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXI9c3Vic2NyaWJlTGF0ZXN0O1xuXG4vKipcbiAqIFRoaXMgYWR2YW5jZXMgYGFzeW5jSXRlcmF0b3JQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0b3JgIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmF0b3I8VD4+fSBhc3luY0l0ZXJhdG9yUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlSXRlcmF0b3I9KGFzeW5jSXRlcmF0b3JQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xucmV0dXJuIG5ldyBQcm9taXNlKChhY2ssb2JzZXJ2ZXJFcnJvcik9PntcbmNvbnN0IHJlY3VyPSgpPT57XG5FLndoZW4oXG5FKGFzeW5jSXRlcmF0b3JQKS5uZXh0KCksXG4oe3ZhbHVlLGRvbmV9KT0+e1xuaWYoZG9uZSl7XG5pdGVyYXRpb25PYnNlcnZlci5maW5pc2gmJml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCh2YWx1ZSk7XG5hY2sodW5kZWZpbmVkKTtcbiB9ZWxzZXtcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlJiZcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbnJlY3VyKCk7XG4gfVxuIH0sXG4ocmVhc29uKT0+e1xuaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbChyZWFzb24pO1xuYWNrKHVuZGVmaW5lZCk7XG4gfSkuXG5jYXRjaChvYnNlcnZlckVycm9yKTtcbiB9O1xucmVjdXIoKTtcbiB9KTtcbiB9O1xuXG4vKipcbiAqIFRoaXMgcmVhZHMgZnJvbSBgYXN5bmNJdGVyYWJsZVBgIHVwZGF0aW5nIGBpdGVyYXRpb25PYnNlcnZlcmAgd2l0aCBlYWNoXG4gKiBzdWNjZXNzaXZlIHZhbHVlLiBUaGUgYGl0ZXJhdGlvbk9ic2VydmVyYCBtYXkgb25seSBiZSBpbnRlcmVzdGVkIGluIGNlcnRhaW5cbiAqIG9jY3VycmVuY2VzIChgdXBkYXRlU3RhdGVgLCBgZmluaXNoYCwgYGZhaWxgKSwgc28gZm9yIGNvbnZlbmllbmNlLFxuICogYG9ic2VydmVJdGVyYXRpb25gIGZlYXR1cmUgdGVzdHMgZm9yIHRob3NlIG1ldGhvZHMgYmVmb3JlIGNhbGxpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVJdGVyYXRvcihvYnNlcnZlSXRlcmF0b3IpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRpb249KGFzeW5jSXRlcmFibGVQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xucmV0dXJuIG9ic2VydmVJdGVyYXRvcihpdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpO1xuIH07XG5cbi8qKlxuICogQXMgdXBkYXRlcyBjb21lIGluIGZyb20gdGhlIHBvc3NpYmx5IHJlbW90ZSBgbm90aWZpZXJQYCwgdXBkYXRlXG4gKiB0aGUgbG9jYWwgYHVwZGF0ZXJgLiBTaW5jZSB0aGUgdXBkYXRlcyBjb21lIGZyb20gYSBub3RpZmllciwgdGhleVxuICogYXJlIGxvc3N5LCBpLmUuLCBvbmNlIGEgbW9yZSByZWNlbnQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkLCBsZXNzIHJlY2VudFxuICogc3RhdGVzIGFyZSBhc3N1bWVkIGlycmVsZXZhbnQgYW5kIGRyb3BwZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IG5vdGlmaWVyUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaOKAjV9vbmNlLm9ic2VydmVJdGVyYXRpb24ob2JzZXJ2ZUl0ZXJhdGlvbik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZU5vdGlmaWVyPShub3RpZmllclAsaXRlcmF0aW9uT2JzZXJ2ZXIpPT5cbm9ic2VydmVJdGVyYXRpb24oc3Vic2NyaWJlTGF0ZXN0KG5vdGlmaWVyUCksaXRlcmF0aW9uT2JzZXJ2ZXIpOyRo4oCNX29uY2Uub2JzZXJ2ZU5vdGlmaWVyKG9ic2VydmVOb3RpZmllcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciJdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iXSwib2JzZXJ2ZU5vdGlmaWVyIjpbIm9ic2VydmVOb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACwvi9PHAcAABwHAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi9zdWJzY3JpYmVyLmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbIi4vc3RvcmVkLW5vdGlmaWVyLmpzIiwiLi9zdG9yZXN1Yi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vcHVibGlzaC1raXQuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtdXSxbXCIuL25vdGlmaWVyLmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW11dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW11dLFtcIi4vc3RvcmVzdWIuanNcIiwgW11dLFtcIi4vc3RvcmVkLW5vdGlmaWVyLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vcHVibGlzaC1raXQuanMiOltbIm1ha2VQdWJsaXNoS2l0IiwibWFrZVB1Ymxpc2hLaXQiXSxbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLFsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSxbIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlRWFjaFRvcGljSSJdLFsiSXRlcmFibGVMYXRlc3RUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLFsiU3Vic2NyaWJlclNoYXBlIiwiU3Vic2NyaWJlclNoYXBlIl1dLCIuL3N1YnNjcmliZS5qcyI6W1sic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUVhY2giXSxbInN1YnNjcmliZUxhdGVzdCIsInN1YnNjcmliZUxhdGVzdCJdXSwiLi9ub3RpZmllci5qcyI6W1sibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyIl0sWyJtYWtlTm90aWZpZXJLaXQiLCJtYWtlTm90aWZpZXJLaXQiXSxbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXSxbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXV0sIi4vc3Vic2NyaWJlci5qcyI6W1sibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb24iXSxbIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il1dLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjpbWyJvYnNlcnZlTm90aWZpZXIiLCJvYnNlcnZlTm90aWZpZXIiXSxbIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVJdGVyYXRvciJdLFsib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRpb24iXSxbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPKwCGVaGAAAWhgAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvbm90aWZpZXIuanN7ImltcG9ydHMiOlsiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxFLEZhcixtYWtlUHVibGlzaEtpdCxzdWJzY3JpYmVMYXRlc3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gc2hhcmFibGVJbnRlcm5hbHNQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXI9KHNoYXJhYmxlSW50ZXJuYWxzUCk9Pntcbi8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5zdWJzY3JpYmVMYXRlc3Qoc2hhcmFibGVJbnRlcm5hbHNQKSxcbmdldFVwZGF0ZVNpbmNlOmFzeW5jKHVwZGF0ZUNvdW50KT0+XG5FKHNoYXJhYmxlSW50ZXJuYWxzUCkuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsczphc3luYygpPT5zaGFyYWJsZUludGVybmFsc1AsXG4vKipcbiAqIEBkZXByZWNhdGVkXG4gKiBVc2VkIG9ubHkgYnkgYG1ha2VDYXN0aW5nU3BlY0Zyb21SZWZgLiAgSW5zdGVhZCB0aGF0IGZ1bmN0aW9uIHNob3VsZCB1c2VcbiAqIHRoZSBgU3RvcmVkRmFjZXRgIEFQSS5cbiAqL1xuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7bm90aWZpZXJ9KX0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN1YnNjcmliZXI8VD4+fSBzdWJzY3JpYmVyXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VOb3RpZmllcihtYWtlTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyPShzdWJzY3JpYmVyKT0+e1xuLyoqXG4gKiBAdHlwZSB7TGF0ZXN0VG9waWM8VD59XG4gKi9cbmNvbnN0IGJhc2VOb3RpZmllcj1oYXJkZW4oe1xuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50PXVuZGVmaW5lZCk9PlxuRShzdWJzY3JpYmVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCl9KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXJ9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuXG4vKipcbiAqIFByb2R1Y2VzIGEgcGFpciBvZiBvYmplY3RzLCB3aGljaCBhbGxvdyBhIHNlcnZpY2UgdG8gcHJvZHVjZSBhIHN0cmVhbSBvZlxuICogdXBkYXRlIHByb21pc2VzLlxuICpcbiAqIFRoZSBpbml0aWFsIHN0YXRlIGFyZ3VtZW50IGhhcyB0byBiZSB0cnVseSBvcHRpb25hbCBldmVuIHRob3VnaCBpdCBjYW5cbiAqIGJlIGFueSBmaXJzdCBjbGFzcyB2YWx1ZSBpbmNsdWRpbmcgYHVuZGVmaW5lZGAuIFdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlXG4gKiBwcmVzZW5jZSB2cyB0aGUgYWJzZW5jZSBvZiBpdCwgd2hpY2ggd2UgY2Fubm90IGRvIHdpdGggdGhlIG9wdGlvbmFsIGFyZ3VtZW50XG4gKiBzeW50YXguIFJhdGhlciB3ZSB1c2UgdGhlIGFyaXR5IG9mIHRoZSBgaW5pdGlhbFN0YXRlQXJyYCBhcnJheS5cbiAqXG4gKiBJZiBubyBpbml0aWFsIHN0YXRlIGlzIHByb3ZpZGVkIHRvIGBtYWtlTm90aWZpZXJLaXRgLCB0aGVuIGl0IHN0YXJ0cyB3aXRob3V0XG4gKiBhbiBpbml0aWFsIHN0YXRlLiBJdHMgaW5pdGlhbCBzdGF0ZSB3aWxsIGluc3RlYWQgYmUgdGhlIHN0YXRlIG9mIHRoZSBmaXJzdFxuICogdXBkYXRlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tdIHwgW1RdfSBpbml0aWFsU3RhdGVBcnIgdGhlIGZpcnN0IHN0YXRlIHRvIGJlIHJldHVybmVkICh0eXBlZCBhcyByZXN0IGFycmF5IHRvIHBlcm1pdCBgdW5kZWZpbmVkYClcbiAqIEByZXR1cm5zIHtOb3RpZmllclJlY29yZDxUPn0gdGhlIG5vdGlmaWVyIGFuZCB1cGRhdGVyXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJLaXQ9KC4uLmluaXRpYWxTdGF0ZUFycik9Pntcbi8qKiBAdHlwZSB7UHVibGlzaEtpdDxUPn0gKi9cbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5jb25zdCBub3RpZmllcj1tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihzdWJzY3JpYmVyKTtcblxuY29uc3QgdXBkYXRlcj1GYXIoJ3VwZGF0ZXInLHtcbnVwZGF0ZVN0YXRlOihzdGF0ZSk9PnB1Ymxpc2hlci5wdWJsaXNoKHN0YXRlKSxcbmZpbmlzaDooY29tcGxldGlvbik9PnB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG5mYWlsOihyZWFzb24pPT5wdWJsaXNoZXIuZmFpbChyZWFzb24pfSk7XG5cblxuYXNzZXJ0KGluaXRpYWxTdGF0ZUFyci5sZW5ndGg8PTEsJ3RvbyBtYW55IGFyZ3VtZW50cycpO1xuaWYoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aD09PTEpe1xudXBkYXRlci51cGRhdGVTdGF0ZShpbml0aWFsU3RhdGVBcnJbMF0pO1xuIH1cblxuLyogbm90aWZpZXIgZmFjZXQgaXMgc2VwYXJhdGUgc28gaXQgY2FuIGJlIGhhbmRlZCBvdXQgd2hpbGUgdXBkYXRlciovXG4vKiBpcyB0aWdodGx5IGhlbGQqL1xucmV0dXJuIGhhcmRlbih7bm90aWZpZXIsdXBkYXRlcn0pO1xuIH07XG5cbi8qKlxuICogQWRhcHRvciBmcm9tIGFzeW5jIGl0ZXJhYmxlIHRvIG5vdGlmaWVyLlxuICpcbiAqIEBkZXByZWNhdGVkIFRoZSByZXN1bHRpbmcgbm90aWZpZXIgaXMgbG9zc2xlc3MsIHdoaWNoIGlzIG5vdCBkZXNpcmFibGUuXG4gKiBQcmVmZXIgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIsIGFuZCByZWZlciB0b1xuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy81NDEzIGFuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTY5NSBmb3IgY29udGV4dC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovJGjigI1fb25jZS5tYWtlTm90aWZpZXJLaXQobWFrZU5vdGlmaWVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZT0oYXN5bmNJdGVyYWJsZVApPT57XG5jb25zdCBpdGVyYXRvclA9RShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBvcHROZXh0UHJvbWlzZTtcbmxldCBjdXJyZW50VXBkYXRlQ291bnQ9MG47XG4vKiogQHR5cGUge0VSZWY8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG5sZXQgY3VycmVudFJlc3BvbnNlO1xubGV0IGZpbmFsPWZhbHNlO1xuXG4vKipcbiAqIEB0eXBlIHtMYXRlc3RUb3BpYzxUPn1cbiAqL1xuY29uc3QgYmFzZU5vdGlmaWVyPUZhcignYmFzZU5vdGlmaWVyJyx7XG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudD0tMW4pe1xuaWYodXBkYXRlQ291bnQ8Y3VycmVudFVwZGF0ZUNvdW50KXtcbmlmKGN1cnJlbnRSZXNwb25zZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuIH1lbHNlIGlmKHVwZGF0ZUNvdW50IT09Y3VycmVudFVwZGF0ZUNvdW50KXtcbnRocm93IEVycm9yKFxuJ2dldFVwZGF0ZVNpbmNlIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nKTtcblxuIH1cblxuLyogUmV0dXJuIGEgZmluYWwgcmVzcG9uc2UgaWYgd2UgaGF2ZSBvbmUsIG90aGVyd2lzZSBhIHByb21pc2UgZm9yIHRoZSBuZXh0IHN0YXRlLiovXG5pZihmaW5hbCl7XG5hc3NlcnQoY3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkKTtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG5pZighb3B0TmV4dFByb21pc2Upe1xuY29uc3QgbmV4dEl0ZXJSZXN1bHRQPUUoaXRlcmF0b3JQKS5uZXh0KCk7XG5vcHROZXh0UHJvbWlzZT1FLndoZW4oXG5uZXh0SXRlclJlc3VsdFAsXG4oe2RvbmUsdmFsdWV9KT0+e1xuYXNzZXJ0KCFmaW5hbCk7XG5pZihkb25lKXtcbmZpbmFsPXRydWU7XG4gfVxuY3VycmVudFVwZGF0ZUNvdW50Kz0xbjtcbmN1cnJlbnRSZXNwb25zZT1oYXJkZW4oe1xudmFsdWUsXG51cGRhdGVDb3VudDpkb25lP3VuZGVmaW5lZDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9LFxuKF9yZWFzb24pPT57XG5maW5hbD10cnVlO1xuY3VycmVudFJlc3BvbnNlPVxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59ICovXG5uZXh0SXRlclJlc3VsdFA7XG5vcHROZXh0UHJvbWlzZT11bmRlZmluZWQ7XG5yZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuIH0pO1xuXG4gfVxucmV0dXJuIG9wdE5leHRQcm9taXNlO1xuIH19KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLyogRG9uJ3QgbGVhayB0aGUgb3JpZ2luYWwgYXN5bmNJdGVyYWJsZVAgc2luY2UgaXQgbWF5IGJlIHJlbW90ZSBhbmQgd2UgYWxzbyovXG4vKiB3YW50IHRoZSBzYW1lIHNlbWFudGljcyBmb3IgdGhpcyBleHBvc2VkIGl0ZXJhYmxlIGFuZCB0aGUgYmFzZU5vdGlmaWVyLiovXG4uLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcn0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciJdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0Il0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANc4E5aAOAAAgDgAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvcHVibGlzaC1raXQuanN7ImltcG9ydHMiOlsiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2ZhciIsIkBlbmRvL3BhdHRlcm5zIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIiwiSXRlcmFibGVFYWNoVG9waWNJIiwiSXRlcmFibGVMYXRlc3RUb3BpY0kiLCJQdWJsaXNoZXJJIiwiU3Vic2NyaWJlckkiLCJTdWJzY3JpYmVyU2hhcGUiLCJVcGRhdGVDb3VudFNoYXBlIiwibWFrZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwdWJsaXNoS2l0SUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBjYW5CZUR1cmFibGUscHJlcGFyZUV4b0NsYXNzS2l0LEUsRmFyLE0sbWFrZVByb21pc2VLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiY2FuQmVEdXJhYmxlXCIsIFskaOKAjV9hID0+IChjYW5CZUR1cmFibGUgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IHNpbms9KCk9PnsgfTtcbmNvbnN0IG1ha2VRdWlldFJlamVjdGlvbj0ocmVhc29uKT0+e1xuY29uc3QgcmVqZWN0aW9uPWhhcmRlbihQcm9taXNlLnJlamVjdChyZWFzb24pKTtcbnZvaWQgRS53aGVuKHJlamVjdGlvbixzaW5rLHNpbmspO1xucmV0dXJuIHJlamVjdGlvbjtcbiB9O1xuY29uc3QgdG9vRmFyUmVqZWN0aW9uPW1ha2VRdWlldFJlamVjdGlvbihcbmhhcmRlbihuZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgZW5kIG9mIGl0ZXJhdGlvbi4nKSkpO1xuXG5cbmNvbnN0ICAgICAgICBQdWJsaXNoZXJJPU0uaW50ZXJmYWNlKCdQdWJsaXNoZXInLHtcbnB1Ymxpc2g6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZpbmlzaDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZmFpbDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpfSk7XG5cblxuLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggTm90aWZpZXIgYGdldFVwZGF0ZVNpbmNlYC4qLyRo4oCNX29uY2UuUHVibGlzaGVySShQdWJsaXNoZXJJKTtcbmNvbnN0ICAgICAgICBVcGRhdGVDb3VudFNoYXBlPU0ub3IoTS5iaWdpbnQoKSxNLm51bWJlcigpKTskaOKAjV9vbmNlLlVwZGF0ZUNvdW50U2hhcGUoVXBkYXRlQ291bnRTaGFwZSk7XG5jb25zdCAgICAgICAgU3Vic2NyaWJlckk9TS5pbnRlcmZhY2UoJ1N1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOk0uY2FsbCgpLm9wdGlvbmFsKE0uYmlnaW50KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0VXBkYXRlU2luY2U6TS5jYWxsKCkub3B0aW9uYWwoVXBkYXRlQ291bnRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSl9KTskaOKAjV9vbmNlLlN1YnNjcmliZXJJKFN1YnNjcmliZXJJKTtcblxuY29uc3QgICAgICAgIHB1Ymxpc2hLaXRJS2l0PWhhcmRlbih7XG5wdWJsaXNoZXI6UHVibGlzaGVySSxcbnN1YnNjcmliZXI6U3Vic2NyaWJlckl9KTskaOKAjV9vbmNlLnB1Ymxpc2hLaXRJS2l0KHB1Ymxpc2hLaXRJS2l0KTtcblxuXG5jb25zdCAgICAgICAgRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZT1NLmludGVyZmFjZShcbidGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicsXG57XG5mb3JrOk0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOk0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksLyogb29wczogcmVjdXJzaXZlIHR5cGUqL1xubmV4dDpNLmNhbGxXaGVuKCkucmV0dXJucyhNLmFueSgpKX0pOyRo4oCNX29uY2UuRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZShGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBJdGVyYWJsZUVhY2hUb3BpY0k9TS5pbnRlcmZhY2UoJ0l0ZXJhYmxlRWFjaFRvcGljJyx7XG5zdWJzY3JpYmVBZnRlcjpTdWJzY3JpYmVySS5tZXRob2RHdWFyZHMuc3Vic2NyaWJlQWZ0ZXIsXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOk0uY2FsbCgpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InKSl9KTskaOKAjV9vbmNlLkl0ZXJhYmxlRWFjaFRvcGljSShJdGVyYWJsZUVhY2hUb3BpY0kpO1xuXG5cblxuY29uc3QgICAgICAgIEl0ZXJhYmxlTGF0ZXN0VG9waWNJPU0uaW50ZXJmYWNlKCdJdGVyYWJsZUxhdGVzdFRvcGljJyx7XG5nZXRVcGRhdGVTaW5jZTpTdWJzY3JpYmVySS5tZXRob2RHdWFyZHMuZ2V0VXBkYXRlU2luY2UsXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOk0uY2FsbCgpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InKSl9KTtcblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IEFyZ1xuICogQHRlbXBsYXRlIFJldFxuICogQHBhcmFtIHsoYXJnOiBBcmcpID0+IFJldH0gZm5cbiAqIEByZXR1cm5zIHsoYXJnOiBBcmcpID0+IFJldH1cbiAqLyRo4oCNX29uY2UuSXRlcmFibGVMYXRlc3RUb3BpY0koSXRlcmFibGVMYXRlc3RUb3BpY0kpO1xuY29uc3Qgd2Vha01lbW9pemVVbmFyeT0oZm4pPT57XG5jb25zdCBjYWNoZT1uZXcgV2Vha01hcCgpO1xucmV0dXJuKGFyZyk9Pntcbi8qKiBAdHlwZSB7b2JqZWN0fSAqL1xuY29uc3Qgb2FyZz1hcmc7XG5pZihjYWNoZS5oYXMob2FyZykpe1xucmV0dXJuIGNhY2hlLmdldChvYXJnKTtcbiB9XG5jb25zdCByZXN1bHQ9Zm4oYXJnKTtcbmNhY2hlLnNldChvYXJnLHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQdWJsaWNhdGlvblJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7VXBkYXRlUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkPShyZWNvcmQpPT57XG5jb25zdHtcbmhlYWQ6e3ZhbHVlLGRvbmV9LFxucHVibGlzaENvdW50fT1cbnJlY29yZDtcbmlmKGRvbmUpe1xuLyogRmluYWwgcmVzdWx0cyBoYXZlIHVuZGVmaW5lZCB1cGRhdGVDb3VudC4qL1xucmV0dXJuIGhhcmRlbih7dmFsdWUsdXBkYXRlQ291bnQ6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIGhhcmRlbih7dmFsdWUsdXBkYXRlQ291bnQ6cHVibGlzaENvdW50fSk7XG4gfTtcblxuLyoqXG4gKiBNYWtlcyBhIGB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9YCBwYWlyIGZvciBkb2luZyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIgc3VwcG9ydGluZyBib3RoIFwiZWFjaFwiIGFuZCBcImxhdGVzdFwiIGl0ZXJhdGlvblxuICogb2YgcHVibGlzaGVkIHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1B1Ymxpc2hLaXQ8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUHVibGlzaEtpdD0oKT0+e1xuLyoqIEB0eXBlIHtQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gKi9cbmxldCB0YWlsUDtcbi8qKiBAdHlwZSB7dW5kZWZpbmVkIHwgKCh2YWx1ZTogRVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj4pID0+IHZvaWQpfSAqL1xubGV0IHRhaWxSO1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xuXG5sZXQgY3VycmVudFB1Ymxpc2hDb3VudD0wbjtcbmxldCBjdXJyZW50UD10YWlsUDtcbmNvbnN0IGFkdmFuY2VDdXJyZW50PShkb25lLHZhbHVlLHJlamVjdGlvbik9PntcbmlmKHRhaWxSPT09dW5kZWZpbmVkKXtcbnRocm93IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cblxuY3VycmVudFB1Ymxpc2hDb3VudCs9MW47XG5jdXJyZW50UD10YWlsUDtcbmNvbnN0IHJlc29sdmVDdXJyZW50PXRhaWxSO1xuXG5pZihkb25lKXtcbnRhaWxQPXRvb0ZhclJlamVjdGlvbjtcbnRhaWxSPXVuZGVmaW5lZDtcbiB9ZWxzZXtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcbiB9XG5cbmlmKHJlamVjdGlvbil7XG5yZXNvbHZlQ3VycmVudChyZWplY3Rpb24pO1xuIH1lbHNle1xucmVzb2x2ZUN1cnJlbnQoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQ6Y3VycmVudFB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSk7XG5cblxuIH1cbiB9O1xuXG5jb25zdCBtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQ9d2Vha01lbW9pemVVbmFyeShcbm1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQpO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHtTdWJzY3JpYmVyPFQ+fVxuICovXG5jb25zdCBzdWJzY3JpYmVyPUZhcignU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6KHB1Ymxpc2hDb3VudD0tMW4pPT57XG5hc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwnYmlnaW50Jyk7XG5pZihwdWJsaXNoQ291bnQ9PT1jdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiB0YWlsUDtcbiB9ZWxzZSBpZihwdWJsaXNoQ291bnQ8Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gY3VycmVudFA7XG4gfWVsc2V7XG50aHJvdyBFcnJvcihcbidzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicpO1xuXG4gfVxuIH0sXG5nZXRVcGRhdGVTaW5jZToodXBkYXRlQ291bnQpPT57XG5pZih1cGRhdGVDb3VudD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLnRoZW4obWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkKTtcbiB9XG51cGRhdGVDb3VudD1CaWdJbnQodXBkYXRlQ291bnQpO1xucmV0dXJuKFxuc3Vic2NyaWJlclxuLyogYHN1YnNjcmliZUFmdGVyYCBtYXkgcmVzb2x2ZSB3aXRoIHRoZSB1cGRhdGUgcmVjb3JkIG51bWJlcmVkKi9cbi8qIGB1cGRhdGVDb3VudCArIDFgLCBldmVuIGlmIHNldmVyYWwgdXBkYXRlcyBhcmUgcHVibGlzaGVkIGluIHRoZSovXG4vKiBzYW1lIGNyYW5rLi4uKi8uXG5zdWJzY3JpYmVBZnRlcih1cGRhdGVDb3VudClcbi8qIC4uLiBzbyB3ZSBwb2xsIHRoZSBsYXRlc3QgcHVibGlzaGVkIHVwZGF0ZSwgd2l0aG91dCB3YWl0aW5nIGZvciBhbnkqL1xuLyogZnVydGhlciBvbmVzLiovLlxudGhlbigoKT0+c3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpKSk7XG5cbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtQdWJsaXNoZXI8VD59ICovXG5jb25zdCBwdWJsaXNoZXI9RmFyKCdQdWJsaXNoZXInLHtcbnB1Ymxpc2g6KHZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQoZmFsc2UsdmFsdWUpO1xuIH0sXG5maW5pc2g6KGZpbmFsVmFsdWUpPT57XG5hZHZhbmNlQ3VycmVudCh0cnVlLGZpbmFsVmFsdWUpO1xuIH0sXG5mYWlsOihyZWFzb24pPT57XG5hZHZhbmNlQ3VycmVudCh0cnVlLHVuZGVmaW5lZCxtYWtlUXVpZXRSZWplY3Rpb24ocmVhc29uKSk7XG4gfX0pO1xuXG5yZXR1cm4gaGFyZGVuKHtwdWJsaXNoZXIsc3Vic2NyaWJlcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUHVibGlzaEtpdChtYWtlUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVB1Ymxpc2hLaXQpO1xuXG5jb25zdCBEdXJhYmxlUHVibGlzaEtpdFN0YXRlU2hhcGU9aGFyZGVuKHtcbnZhbHVlRHVyYWJpbGl0eTpNLmFueSgpLFxucHVibGlzaENvdW50Ok0uYW55KCksXG5zdGF0dXM6TS5hbnkoKSxcbmhhc1ZhbHVlOk0uYW55KCksXG52YWx1ZTpNLmFueSgpfSk7XG5cblxuLyogVE9ETzogTW92ZSBkdXJhYmxlIHB1Ymxpc2gga2l0IHRvIGEgbmV3IGZpbGU/Ki9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5ICYgJ21hbmRhdG9yeSd9IFtvcHRpb25zLnZhbHVlRHVyYWJpbGl0eT0nbWFuZGF0b3J5J11cbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfVxuICovXG5jb25zdCBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZT0ob3B0aW9ucz17fSk9PntcbmNvbnN0e3ZhbHVlRHVyYWJpbGl0eT0nbWFuZGF0b3J5J309b3B0aW9ucztcbmFzc2VydC5lcXVhbCh2YWx1ZUR1cmFiaWxpdHksJ21hbmRhdG9yeScpO1xucmV0dXJue1xuLyogY29uZmlndXJhdGlvbiovXG52YWx1ZUR1cmFiaWxpdHksXG5cbi8qIGxpZmVjeWNsZSBwcm9ncmVzcyovXG5wdWJsaXNoQ291bnQ6MG4sXG5zdGF0dXM6J2xpdmUnLC8qIHwgJ2ZpbmlzaGVkJyB8ICdmYWlsZWQnKi9cblxuLyogcGVyc2lzdGVkIHJlc3VsdCBkYXRhKi9cbi8qIE5vdGUgdGhhdCBpbiBhZGRpdGlvbiB0byBub24tdGVybWluYWwgdmFsdWVzIGZyb20gYHB1Ymxpc2hgLCovXG4vKiB2YWx1ZSBhbHNvIGhvbGRzIHRoZSB0ZXJtaW5hbCB2YWx1ZSBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYC4qL1xuaGFzVmFsdWU6ZmFsc2UsXG52YWx1ZTp1bmRlZmluZWR9O1xuXG4gfTtcblxuLyogV2UgbmVlZCB0aGUgV2Vha01hcCBrZXkgZm9yIGEga2l0IHRvIGJlIGEgdnJlZi1iZWFyaW5nIG9iamVjdCovXG4vKiBpbiBpdHMgY29ob3J0LCBhbmQgaGF2ZSBhcmJpdHJhcmlseSBjaG9zZW4gdGhlIHB1Ymxpc2hlciBmYWNldC4qL1xuLyoqIEB0eXBlZGVmIHtQdWJsaXNoZXI8Kj59IER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5ICovXG4vKipcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXl9XG4gKi9cbmNvbnN0IGdldEVwaGVtZXJhbEtleT0oZmFjZXRzKT0+ZmFjZXRzLnB1Ymxpc2hlcjtcblxuLyoqXG4gKiBAdHlwZWRlZiBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGFcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTwqPiB8IHVuZGVmaW5lZH0gY3VycmVudFAgVGhlIGN1cnJlbnQtcmVzdWx0IHByb21pc2VcbiAqICAgKHVuZGVmaW5lZCB1bmxlc3MgcmVzb2x2ZWQgd2l0aCB1bnJlY292ZXJhYmxlIGVwaGVtZXJhbCBkYXRhKVxuICogQHByb3BlcnR5IHtQcm9taXNlPCo+fSB0YWlsUCBUaGUgbmV4dC1yZXN1bHQgcHJvbWlzZVxuICogQHByb3BlcnR5IHsoKHZhbHVlOiBhbnkpID0+IHZvaWQpIHwgdW5kZWZpbmVkfSB0YWlsUiBUaGUgbmV4dC1yZXN1bHQgcmVzb2x2ZXJcbiAqICAgKHVuZGVmaW5lZCB3aGVuIHRoZSBwdWJsaXNoIGtpdCBoYXMgdGVybWluYXRlZClcbiAqL1xuXG4vKiogQHR5cGUge1dlYWtNYXA8RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXksIER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YT59ICovXG5jb25zdCBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50LXJlc3VsdCBwcm9taXNlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGR1cmFibGVcbiAqIHB1Ymxpc2gga2l0LCByZWNyZWF0ZWQgdW5sZXNzIHdlIGFscmVhZHkgaGF2ZSBvbmUgd2l0aCByZXRhaW5lZFxuICogZXBoZW1lcmFsIGRhdGEuXG4gKlxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfSBzdGF0ZVxuICogQHBhcmFtIHtQdWJsaXNoS2l0PCo+fSBmYWNldHNcbiAqIEBwYXJhbSB7UHJvbWlzZTwqPn0gdGFpbFxuICogQHJldHVybnMge1Byb21pc2U8Kj59XG4gKi9cbmNvbnN0IHByb3ZpZGVDdXJyZW50UD0oc3RhdGUsZmFjZXRzLHRhaWwpPT57XG5jb25zdCBlcGhlbWVyYWxLZXk9Z2V0RXBoZW1lcmFsS2V5KGZhY2V0cyk7XG5jb25zdCBmb3VuZERhdGE9ZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLmdldChlcGhlbWVyYWxLZXkpO1xuY29uc3QgY3VycmVudFA9Zm91bmREYXRhJiZmb3VuZERhdGEuY3VycmVudFA7XG5pZihjdXJyZW50UCl7XG5yZXR1cm4gY3VycmVudFA7XG4gfVxuXG5jb25zdHtwdWJsaXNoQ291bnQsc3RhdHVzLGhhc1ZhbHVlLHZhbHVlfT1zdGF0ZTtcbmlmKCFoYXNWYWx1ZSl7XG5hc3NlcnQoc3RhdHVzPT09J2xpdmUnKTtcbnJldHVybiB0YWlsO1xuIH1cbmlmKHN0YXR1cz09PSdsaXZlJ3x8c3RhdHVzPT09J2ZpbmlzaGVkJyl7XG5jb25zdCBjZWxsPWhhcmRlbih7XG5oZWFkOnt2YWx1ZSxkb25lOnN0YXR1cyE9PSdsaXZlJ30sXG5wdWJsaXNoQ291bnQsXG50YWlsfSk7XG5cbnJldHVybiBFLnJlc29sdmUoY2VsbCk7XG4gfWVsc2UgaWYoc3RhdHVzPT09J2ZhaWxlZCcpe1xucmV0dXJuIG1ha2VRdWlldFJlamVjdGlvbih2YWx1ZSk7XG4gfWVsc2V7XG50aHJvdyBGYWlsIGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuIH1cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG5leHQtcmVzdWx0IHByb21pc2UgYW5kIHJlc29sdmVyIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuXG4gKiBkdXJhYmxlIHB1Ymxpc2gga2l0LlxuICogVGhlc2UgYXJlIGxvc3Qgb24gdXBncmFkZSBidXQgcmVjcmVhdGVkIG9uLWRlbWFuZCwgcHJlc2VydmluZyB0aGVcbiAqIHZhbHVlIGluIChidXQgbm90IHRoZSBpZGVudGl0eSBvZikgdGhlIGN1cnJlbnQgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdFxuICogd2hlbiBwb3NzaWJsZSwgd2hpY2ggaXMgYWx3YXlzIHRoZSBjYXNlIHdoZW4gdGhhdCB2YWx1ZSBpcyB0ZXJtaW5hbFxuICogKGkuZS4sIGZyb20gYGZpbmlzaGAgb3IgYGZhaWxgKSBvciB3aGVuIHRoZSBkdXJhYmxlIHB1Ymxpc2gga2l0IGlzXG4gKiBjb25maWd1cmVkIHdpdGggYHZhbHVlRHVyYWJpbGl0eTogJ21hbmRhdG9yeSdgLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhfVxuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPShzdGF0ZSxmYWNldHMpPT57XG5jb25zdCBlcGhlbWVyYWxLZXk9Z2V0RXBoZW1lcmFsS2V5KGZhY2V0cyk7XG5jb25zdCBmb3VuZERhdGE9ZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLmdldChlcGhlbWVyYWxLZXkpO1xuaWYoZm91bmREYXRhKXtcbnJldHVybiBmb3VuZERhdGE7XG4gfVxuXG5jb25zdHtzdGF0dXN9PXN0YXRlO1xubGV0IHRhaWxQO1xubGV0IHRhaWxSO1xuaWYoc3RhdHVzPT09J2xpdmUnKXtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcbnZvaWQgRS53aGVuKHRhaWxQLHNpbmssc2luayk7XG4gfWVsc2UgaWYoc3RhdHVzPT09J2ZpbmlzaGVkJ3x8c3RhdHVzPT09J2ZhaWxlZCcpe1xudGFpbFA9dG9vRmFyUmVqZWN0aW9uO1xuIH1lbHNle1xudGhyb3cgRmFpbCBgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiB9XG4vKiBjdXJyZW50UCBpcyBub3QgZXBoZW1lcmFsIHdoZW4gcmVzdG9yaW5nIGZyb20gcGVyc2lzdGVkIHN0YXRlLiovXG5jb25zdCBvYmo9aGFyZGVuKHtjdXJyZW50UDp1bmRlZmluZWQsdGFpbFAsdGFpbFJ9KTtcbmR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoZXBoZW1lcmFsS2V5LG9iaik7XG5yZXR1cm4gb2JqO1xuIH07XG5cbi8qKlxuICogRXh0ZW5kcyB0aGUgc2VxdWVuY2Ugb2YgcmVzdWx0cy5cbiAqXG4gKiBAcGFyYW0ge3tzdGF0ZTogRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSwgZmFjZXRzOiBQdWJsaXNoS2l0PCo+fX0gY29udGV4dFxuICogQHBhcmFtIHthbnl9IHZhbHVlXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGVbJ3N0YXR1cyddfSBbdGFyZ2V0U3RhdHVzXVxuICovXG5jb25zdCBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQ9KGNvbnRleHQsdmFsdWUsdGFyZ2V0U3RhdHVzPSdsaXZlJyk9PntcbmNvbnN0e3N0YXRlLGZhY2V0c309Y29udGV4dDtcbmNvbnN0e3ZhbHVlRHVyYWJpbGl0eSxzdGF0dXN9PXN0YXRlO1xuaWYoc3RhdHVzIT09J2xpdmUnKXtcbnRocm93IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cbmNvbnN0IGRvbmU9dGFyZ2V0U3RhdHVzIT09J2xpdmUnO1xuaWYoZG9uZXx8dmFsdWVEdXJhYmlsaXR5PT09J21hbmRhdG9yeScpe1xuY2FuQmVEdXJhYmxlKHZhbHVlKXx8RmFpbCBgQ2Fubm90IGFjY2VwdCBub24tZHVyYWJsZSB2YWx1ZTogJHt2YWx1ZX1gO1xuIH1cbmNvbnN0e3RhaWxQOm9sZFRhaWxQLHRhaWxSOnJlc29sdmVPbGRUYWlsfT1cbnByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoc3RhdGUsZmFjZXRzKTtcbmFzc2VydC50eXBlb2YocmVzb2x2ZU9sZFRhaWwsJ2Z1bmN0aW9uJyk7XG5cbmNvbnN0IHB1Ymxpc2hDb3VudD1zdGF0ZS5wdWJsaXNoQ291bnQrMW47XG5zdGF0ZS5wdWJsaXNoQ291bnQ9cHVibGlzaENvdW50O1xuXG5sZXQgdGFpbFA7XG5sZXQgdGFpbFI7XG5pZihkb25lKXtcbnN0YXRlLnN0YXR1cz10YXJnZXRTdGF0dXM7XG50YWlsUD10b29GYXJSZWplY3Rpb247XG50YWlsUj11bmRlZmluZWQ7XG4gfWVsc2V7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG52b2lkIEUud2hlbih0YWlsUCxzaW5rLHNpbmspO1xuIH1cblxubGV0IGN1cnJlbnRQO1xuaWYodGFyZ2V0U3RhdHVzPT09J2ZhaWxlZCcpe1xuc3RhdGUuaGFzVmFsdWU9dHJ1ZTtcbnN0YXRlLnZhbHVlPXZhbHVlO1xuY29uc3QgcmVqZWN0aW9uPW1ha2VRdWlldFJlamVjdGlvbih2YWx1ZSk7XG5yZXNvbHZlT2xkVGFpbChyZWplY3Rpb24pO1xuIH1lbHNle1xuLyogUGVyc2lzdCBhIHRlcm1pbmFsIHZhbHVlLCBvciBhIG5vbi10ZXJtaW5hbCB2YWx1ZSovXG4vKiBpZiBjb25maWd1cmVkIGFzICdtYW5kYXRvcnknIG9yICdvcHBvcnR1bmlzdGljJy4qL1xuaWYoZG9uZXx8dmFsdWVEdXJhYmlsaXR5IT09J2lnbm9yZWQnJiZjYW5CZUR1cmFibGUodmFsdWUpKXtcbnN0YXRlLmhhc1ZhbHVlPXRydWU7XG5zdGF0ZS52YWx1ZT12YWx1ZTtcbiB9ZWxzZXtcbnN0YXRlLmhhc1ZhbHVlPWZhbHNlO1xuc3RhdGUudmFsdWU9dW5kZWZpbmVkO1xuLyogUmV0YWluIGFueSBwcm9taXNlIHdpdGggbm9uLWR1cmFibGUgcmVzb2x1dGlvbi4qL1xuY3VycmVudFA9b2xkVGFpbFA7XG4gfVxuXG5yZXNvbHZlT2xkVGFpbChcbmhhcmRlbih7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSk7XG5cblxuIH1cblxuZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChcbmdldEVwaGVtZXJhbEtleShmYWNldHMpLFxuaGFyZGVuKHtjdXJyZW50UCx0YWlsUCx0YWlsUn0pKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuLi8uLi92YXQtZGF0YS9zcmMvdHlwZXMuanMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdD0oYmFnZ2FnZSxraW5kTmFtZSk9Pntcbi8qIFRPRE86IE9uY2Ugd2UgdW5pZnkgd2l0aCBtYWtlUHVibGlzaEtpdCwgd2Ugd2lsbCB1c2UgYSBab25lLWNvbXBhdGlibGUgd2VhayovXG4vKiBtYXAgZm9yIG1lbW9pemF0aW9uLiovXG5jb25zdCBtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQ9bWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZDtcblxuLyoqXG4gKiBAcmV0dXJucyB7KCkgPT4gUHVibGlzaEtpdDwqPn1cbiAqL1xucmV0dXJuIHByZXBhcmVFeG9DbGFzc0tpdChcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbnB1Ymxpc2hLaXRJS2l0LFxuaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGUsXG57XG4vKiBUaGUgcHVibGlzaGVyIGZhY2V0IG9mIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCovXG4vKiBhY2NlcHRzIG5ldyB2YWx1ZXMuKi9cbnB1Ymxpc2hlcjp7XG5wdWJsaXNoKHZhbHVlKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLHZhbHVlKTtcbiB9LFxuZmluaXNoKGZpbmFsVmFsdWUpe1xuYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsZmluYWxWYWx1ZSwnZmluaXNoZWQnKTtcbiB9LFxuZmFpbChyZWFzb24pe1xuYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMscmVhc29uLCdmYWlsZWQnKTtcbiB9fSxcblxuXG4vKiBUaGUgc3Vic2NyaWJlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuLyogcHJvcGFnYXRlcyB2YWx1ZXMuKi9cbnN1YnNjcmliZXI6e1xuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50PS0xbil7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5jb25zdHtwdWJsaXNoQ291bnQ6Y3VycmVudFB1Ymxpc2hDb3VudH09c3RhdGU7XG5jb25zdHtjdXJyZW50UCx0YWlsUH09cHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShcbnN0YXRlLFxuZmFjZXRzKTtcblxuaWYocHVibGlzaENvdW50PT09Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gdGFpbFA7XG4gfWVsc2UgaWYocHVibGlzaENvdW50PGN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIGN1cnJlbnRQfHxwcm92aWRlQ3VycmVudFAoc3RhdGUsZmFjZXRzLHRhaWxQKTtcbiB9ZWxzZXtcbnRocm93IEVycm9yKFxuJ3N1YnNjcmliZUFmdGVyIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCBwdWJsaXNoQ291bnQuJyk7XG5cbiB9XG4gfSxcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KXtcbmNvbnN0e1xuZmFjZXRzOntzdWJzY3JpYmVyfX09XG50aGlzO1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gfVxudXBkYXRlQ291bnQ9QmlnSW50KHVwZGF0ZUNvdW50KTtcbnJldHVybihcbnN1YnNjcmliZXJcbi8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4vKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuLyogc2FtZSBjcmFuay4uLiovLlxuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4vKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbi8qIGZ1cnRoZXIgb25lcy4qLy5cbnRoZW4oKCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSkpO1xuXG4gfX19LFxuXG5cbntcbnN0YXRlU2hhcGU6RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlfSk7XG5cblxuIH07JGjigI1fb25jZS5wcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcbmhhcmRlbihwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuXG5jb25zdCAgICAgICAgU3Vic2NyaWJlclNoYXBlPU0ucmVtb3RhYmxlKCdTdWJzY3JpYmVyJyk7JGjigI1fb25jZS5TdWJzY3JpYmVyU2hhcGUoU3Vic2NyaWJlclNoYXBlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQdWJsaXNoZXJJIjpbIlB1Ymxpc2hlckkiXSwiVXBkYXRlQ291bnRTaGFwZSI6WyJVcGRhdGVDb3VudFNoYXBlIl0sIlN1YnNjcmliZXJJIjpbIlN1YnNjcmliZXJJIl0sInB1Ymxpc2hLaXRJS2l0IjpbInB1Ymxpc2hLaXRJS2l0Il0sIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiOlsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSJdLCJJdGVyYWJsZUVhY2hUb3BpY0kiOlsiSXRlcmFibGVFYWNoVG9waWNJIl0sIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIjpbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIl0sIm1ha2VQdWJsaXNoS2l0IjpbIm1ha2VQdWJsaXNoS2l0Il0sInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCI6WyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSwiU3Vic2NyaWJlclNoYXBlIjpbIlN1YnNjcmliZXJTaGFwZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC+ATAkgwoAAIMKAAAuAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc3siaW1wb3J0cyI6WyIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLEUsRmFyLG9ic2VydmVOb3RpZmllcjskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlTm90aWZpZXJcIiwgWyRo4oCNX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0Jhc2VOb3RpZmllcjxUPiAmIE9taXQ8U3RvcmVkRmFjZXQsICdnZXRTdG9yZUtleSc+fSBTdG9yZWROb3RpZmllclxuICovXG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWROb3RpZmllciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxOb3RpZmllcjxUPj59IG5vdGlmaWVyXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkTm90aWZpZXI8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkTm90aWZpZXI9KG5vdGlmaWVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5hc3NlcnRBbGxEZWZpbmVkKHtub3RpZmllcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyfSk7XG5cbmNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlPW1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik7XG5cbm9ic2VydmVOb3RpZmllcihub3RpZmllcix7XG51cGRhdGVTdGF0ZSh2YWx1ZSl7XG5tYXJzaGFsbFRvU3RvcmFnZSh2YWx1ZSkuY2F0Y2goKHJlYXNvbik9PlxuY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIHVwZGF0ZVN0YXRlJyxyZWFzb24pKTtcblxuIH0sXG5mYWlsKHJlYXNvbil7XG5jb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBmYWlsZWQgdG8gaXRlcmF0ZScscmVhc29uKTtcbiB9fSkuXG5jYXRjaCgocmVhc29uKT0+e1xuY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgaGFsdGVkIGl0ZXJhdGlvbicscmVhc29uKTtcbiB9KTtcblxuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbmZyb21DYXBEYXRhOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKX0pO1xuXG5cbi8qKiBAdHlwZSB7U3RvcmVkTm90aWZpZXI8VD59ICovXG5jb25zdCBzdG9yZWROb3RpZmllcj1GYXIoJ1N0b3JlZE5vdGlmaWVyJyx7XG5nZXRVcGRhdGVTaW5jZToodXBkYXRlQ291bnQpPT5FKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG5nZXRQYXRoOigpPT5FKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcn0pO1xuXG5yZXR1cm4gc3RvcmVkTm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWROb3RpZmllcihtYWtlU3RvcmVkTm90aWZpZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdG9yZWROb3RpZmllciI6WyJtYWtlU3RvcmVkTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABFRLcdUhAADVIQAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc3siaW1wb3J0cyI6WyIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi9zdWJzY3JpYmVyLmpzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIiwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IiwibWFrZVN0b3JlZFN1YnNjcmliZXIiLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLG1ha2VNYXJzaGFsLGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxvYnNlcnZlSXRlcmF0aW9uLG1ha2VQdWJsaXNoS2l0LG1ha2VTdWJzY3JpcHRpb25LaXQsc3Vic2NyaWJlRWFjaDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZUl0ZXJhdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsIFskaOKAjV9hID0+IChtYWtlU3Vic2NyaXB0aW9uS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVFYWNoID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBOQjogZG9lcyBub3QgeWV0IHN1cnZpdmUgdXBncmFkZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzY4OTNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0geyh2OiBUKSA9PiB2b2lkfSBjb25zdW1lVmFsdWVcbiAqL1xuY29uc3QgICAgICAgIGZvckVhY2hQdWJsaWNhdGlvblJlY29yZD1hc3luYyhzdWJzY3JpYmVyLGNvbnN1bWVWYWx1ZSk9Pntcbi8qIFdlIG9wZW4tY29kZSB0aGUgZm9yLWF3YWl0LW9mIGltcGxlbWVudGF0aW9uIHJhdGhlciB0aGFuIHVzaW5nIHRoYXQgc3ludGF4Ki9cbi8qIGRpcmVjdGx5IGJlY2F1c2Ugd2Ugd2FudCB0byBydW4gdGhlIGNvbnN1bWVyIG9uIHRoZSBkb25lIHZhbHVlIGFzIHdlbGwuKi9cbmNvbnN0IGl0ZXJhdG9yPXN1YnNjcmliZUVhY2goc3Vic2NyaWJlcilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbmxldCBmaW5pc2hlZD1mYWxzZTtcbmF3YWl0IG51bGw7XG53aGlsZSghZmluaXNoZWQpe1xuY29uc3R7dmFsdWUsZG9uZX09YXdhaXQgaXRlcmF0b3IubmV4dCgpO1xuYXdhaXQgY29uc3VtZVZhbHVlKHZhbHVlKTtcbmZpbmlzaGVkPSEhZG9uZTtcbiB9XG4gfTtcblxuLyoqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgbm8gZnVydGhlciB3cml0ZXMgdG8gaXQgd2lsbFxuICogYmUgYXR0ZW1wdGVkIChidXQgcmVzdWx0cyB3aWxsIHJlbWFpbiBhdmFpbGFibGUgZnJvbSB0aGUgc3Vic2NyaWJlcikuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmliZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8UmV0dXJuVHlwZTx0eXBlb2YgbWFrZU1hcnNoYWw+Pn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmliZXI8VD59XG4gKi8kaOKAjV9vbmNlLmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChmb3JFYWNoUHVibGljYXRpb25SZWNvcmQpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRTdWJzY3JpYmVyPShzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5hc3NlcnRBbGxEZWZpbmVkKHtzdWJzY3JpYmVyLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXJ9KTtcblxuY29uc3QgbWFyc2hhbGxUb1N0b3JhZ2U9bWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKTtcblxuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoc3Vic2NyaWJlcixtYXJzaGFsbFRvU3RvcmFnZSkuY2F0Y2goKGVycik9Pntcbi8qIFRPRE86IEhvdyBzaG91bGQgd2UgaGFuZGxlIGFuZC9vciBzdXJmYWNlIHRoaXMgZmFpbHVyZT8qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTc2NiNkaXNjdXNzaW9uX3I5MjI0OTgwODgqL1xuY29uc29sZS5lcnJvcignU3RvcmVkU3Vic2NyaWJlciBmYWlsZWQgdG8gaXRlcmF0ZScsZXJyKTtcbiB9KTtcblxuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbmZyb21DYXBEYXRhOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKX0pO1xuXG5cbi8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaWJlcjxUPn0gKi9cbmNvbnN0IHN0b3Jlc3ViPUZhcignU3RvcmVkU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6KHB1Ymxpc2hDb3VudCk9PnN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcbmdldFVwZGF0ZVNpbmNlOih1cGRhdGVDb3VudCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuZ2V0UGF0aDooKT0+RShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuZ2V0U3RvcmVLZXk6KCk9PkUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCksXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcn0pO1xuXG5yZXR1cm4gc3RvcmVzdWI7XG4gfTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgbWFrZVN0b3JlZFN1YnNjcmliZXJcbiAqXG4gKiBCZWdpbiBpdGVyYXRpbmcgdGhlIHNvdXJjZSwgc3RvcmluZyBzZXJpYWxpemVkIGl0ZXJhdGlvbiB2YWx1ZXMuICBJZiB0aGVcbiAqIHN0b3JhZ2VOb2RlJ3MgYHNldFZhbHVlYCBvcGVyYXRpb24gcmVqZWN0cywgdGhlIGl0ZXJhdGlvbiB3aWxsIGJlIHRlcm1pbmF0ZWQuXG4gKlxuICogUmV0dXJucyBhIFN0b3JlZFN1YnNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpcHRpb25cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBtYWtlTWFyc2hhbD4+fSBbbWFyc2hhbGxlcl1cbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpcHRpb248VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VTdG9yZWRTdWJzY3JpYmVyKG1ha2VTdG9yZWRTdWJzY3JpYmVyKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkU3Vic2NyaXB0aW9uPShcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcj1tYWtlTWFyc2hhbCh1bmRlZmluZWQsdW5kZWZpbmVkLHtcbm1hcnNoYWxTYXZlRXJyb3I6KCk9PnsgfSxcbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J3NtYWxsY2Fwcyd9KSk9PlxuXG57XG4vKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xuZnJvbUNhcERhdGE6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpfSk7XG5cblxuLyogQWJvcnQgdGhlIGl0ZXJhdGlvbiBvbiB0aGUgbmV4dCBvYnNlcnZhdGlvbiBpZiB0aGUgcHVibGlzaGVyIGV2ZXIgZmFpbHMuKi9cbmxldCBwdWJsaXNoRmFpbGVkPWZhbHNlO1xubGV0IHB1Ymxpc2hFeGNlcHRpb247XG5cbmNvbnN0IGZhaWw9KGVycik9PntcbnB1Ymxpc2hGYWlsZWQ9dHJ1ZTtcbnB1Ymxpc2hFeGNlcHRpb249ZXJyO1xuIH07XG5cbi8qIE11c3QgKm5vdCogYmUgYW4gYXN5bmMgZnVuY3Rpb24sIGJlY2F1c2UgaXQgc29tZXRpbWVzIG11c3QgdGhyb3cgdG8gYWJvcnQqL1xuLyogdGhlIGl0ZXJhdGlvbi4qL1xuY29uc3QgcHVibGlzaFZhbHVlPShvYmopPT57XG5hc3NlcnQoc3RvcmFnZU5vZGUpO1xuaWYocHVibGlzaEZhaWxlZCl7XG4vKiBUbyBwcm9wZXJseSBhYm9ydCB0aGUgaXRlcmF0aW9uLCB0aGlzIG11c3QgYmUgYSBzeW5jaHJvbm91cyBleGNlcHRpb24uKi9cbnRocm93IHB1Ymxpc2hFeGNlcHRpb247XG4gfVxuXG4vKiBQdWJsaXNoIHRoZSB2YWx1ZSwgY2FwdHVyaW5nIGFueSBlcnJvci4qL1xuRShtYXJzaGFsbGVyKS5cbnRvQ2FwRGF0YShvYmopLlxudGhlbigoc2VyaWFsaXplZCk9PntcbmNvbnN0IGVuY29kZWQ9SlNPTi5zdHJpbmdpZnkoc2VyaWFsaXplZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoZW5jb2RlZCk7XG4gfSkuXG5jYXRjaChmYWlsKTtcbiB9O1xuXG5pZihzdG9yYWdlTm9kZSl7XG4vKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbm9ic2VydmVJdGVyYXRpb24oc3Vic2NyaXB0aW9uLHtcbnVwZGF0ZVN0YXRlOnB1Ymxpc2hWYWx1ZSxcbmZpbmlzaDpwdWJsaXNoVmFsdWV9KS5cbmNhdGNoKGZhaWwpO1xuIH1cblxuLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpcHRpb248VD59ICovXG5jb25zdCBzdG9yZXN1Yj1GYXIoJ1N0b3JlZFN1YnNjcmlwdGlvbicse1xuLyogQHRzLWV4cGVjdC1lcnJvciBnZXRTdG9yZUtleSB0eXBlIGRvZXMgbm90IGhhdmUgYHN1YnNjcmlwdGlvbmAqL1xuZ2V0U3RvcmVLZXk6YXN5bmMoKT0+e1xuaWYoIXN0b3JhZ2VOb2RlKXtcbnJldHVybiBoYXJkZW4oe3N1YnNjcmlwdGlvbn0pO1xuIH1cbmNvbnN0IHN0b3JlS2V5PWF3YWl0IEUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCk7XG5yZXR1cm4gaGFyZGVuKHsuLi5zdG9yZUtleSxzdWJzY3JpcHRpb259KTtcbiB9LFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXIsXG5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczooKT0+XG5zdWJzY3JpcHRpb24uZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnN1YnNjcmlwdGlvbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSxcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQpPT5zdWJzY3JpcHRpb24uc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KX0pO1xuXG5yZXR1cm4gc3RvcmVzdWI7XG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRTdWJzY3JpcHRpb24obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0b3JlZFB1Ymxpc2hLaXRcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRQdWJsaXNoZXJLaXRcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBwdWJsaXNoZXJcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGluY29tcGF0aWJsZSB3aXRoIGR1cmFiaWxpdHk7IGluc3RlYWQgaGFuZGxlIHZzdG9yYWdlIGVwaGVtZXJhbGx5IG9uIGEgZHVyYWJsZSBQdWJsaXNoS2l0XG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IFttYXJzaGFsbGVyXVxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGlsZFBhdGhdXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaGVyS2l0PFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFB1Ymxpc2hlcktpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcixjaGlsZFBhdGgpPT57XG5jb25zdHtwdWJsaWNhdGlvbixzdWJzY3JpcHRpb259PW1ha2VTdWJzY3JpcHRpb25LaXQoKTtcblxuaWYoc3RvcmFnZU5vZGUmJmNoaWxkUGF0aCl7XG5zdG9yYWdlTm9kZT1FKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkUGF0aCk7XG4gfVxuXG4vKiB3cmFwIHRoZSBzdWJzY3JpcHRpb24gdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlLCByZXBlYXRpbmcgdG8gdGhpcyBgc3Vic2NyaWJlcmAqL1xuY29uc3Qgc3Vic2NyaWJlcj1tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyKTtcblxuXG5yZXR1cm57XG5wdWJsaXNoZXI6cHVibGljYXRpb24sXG5zdWJzY3JpYmVyfTtcblxuIH07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgaW5jb21wYXRpYmxlIHdpdGggZHVyYWJpbGl0eTsgaW5zdGVhZCBoYW5kbGUgdnN0b3JhZ2UgZXBoZW1lcmFsbHkgb24gYSBkdXJhYmxlIFB1Ymxpc2hLaXRcbiAqXG4gKiBMaWtlIG1ha2VQdWJsaXNoS2l0IHRoaXMgbWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogV2hhdCdzIGRpZmZlcmVudCBpcyBgc3Vic2NyaWJlcmAgdGVlcyByZWNvcmRzLCB3cml0aW5nIG91dCB0byBzdG9yYWdlTm9kZS5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8TWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRQdWJsaXNoS2l0PFQ+fVxuICovJGjigI1fb25jZS5tYWtlU3RvcmVkUHVibGlzaGVyS2l0KG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoS2l0PShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PW1ha2VQdWJsaXNoS2l0KCk7XG5cbnJldHVybntcbnB1Ymxpc2hlcixcbi8qIHdyYXAgdGhlIHN1YnNjcmliZXIgdG8gdGVlIGV2ZW50cyB0byBzdG9yYWdlKi9cbnN1YnNjcmliZXI6bWFrZVN0b3JlZFN1YnNjcmliZXIoc3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKX07XG5cbiB9OyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hLaXQobWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIl0sIm1ha2VTdG9yZWRTdWJzY3JpYmVyIjpbIm1ha2VTdG9yZWRTdWJzY3JpYmVyIl0sIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iOlsibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiXSwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2t8JhyIkAAAiJAAAKAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmUuanN7ImltcG9ydHMiOlsiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanMiLCJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsic3Vic2NyaWJlIiwic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUxhdGVzdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixpc09iamVjdCxpc1VwZ3JhZGVEaXNjb25uZWN0aW9uOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzXCIsIFtbXCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uXCIsIFskaOKAjV9hID0+IChpc1VwZ3JhZGVEaXNjb25uZWN0aW9uID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuY29uc3Qgc2luaz0oKT0+eyB9O1xuXG4vKipcbiAqIENoZWNrIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IGEgZnVuY3Rpb24gZm9yIHJlamVjdGlvbiBieSB2YXQgdXBncmFkZSxcbiAqIGFuZCByZWZldGNoIHVwb24gZW5jb3VudGVyaW5nIHRoYXQgY29uZGl0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IEVSZWY8VD59IGdldHRlclxuICogQHBhcmFtIHtFUmVmPFQ+W119IFtzZWVkXVxuICogQHJldHVybnMge1Byb21pc2U8VD59XG4gKi9cbmNvbnN0IHJlY29ubmVjdEFzTmVlZGVkPWFzeW5jKGdldHRlcixzZWVkPVtdKT0+e1xubGV0IGRpc2Nvbm5lY3Rpb247XG5sZXQgbGFzdFZlcnNpb249LUluZmluaXR5O1xuLyogRW5kIHN5bmNocm9ub3VzIHByZWx1ZGUuKi9cbmF3YWl0IG51bGw7XG5mb3IobGV0IGk9MDs7aSs9MSl7XG50cnl7XG5jb25zdCByZXN1bHRQPWk8c2VlZC5sZW5ndGg/c2VlZFtpXTpnZXR0ZXIoKTtcbmNvbnN0IHJlc3VsdD1hd2FpdCByZXN1bHRQO1xucmV0dXJuIHJlc3VsdDtcbiB9Y2F0Y2goZXJyKXtcbmlmKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24oZXJyKSl7XG5pZighZGlzY29ubmVjdGlvbil7XG5kaXNjb25uZWN0aW9uPWVycjtcbiB9XG5jb25zdHtpbmNhcm5hdGlvbk51bWJlcjp2ZXJzaW9ufT1lcnI7XG5pZih2ZXJzaW9uPmxhc3RWZXJzaW9uKXtcbi8qIFdlIGRvbid0IGV4cGVjdCBhbm90aGVyIHVwZ3JhZGUgaW4gYmV0d2VlbiByZWNlaXZpbmcqL1xuLyogYSBkaXNjb25uZWN0aW9uIGFuZCByZS1yZXF1ZXN0aW5nIGFuIHVwZGF0ZSwgYnV0IG11c3QqL1xuLyogbmV2ZXJ0aGVsZXNzIGJlIHByZXBhcmVkIGZvciB0aGF0LiovXG5sYXN0VmVyc2lvbj12ZXJzaW9uO1xuY29udGludWU7XG4gfVxuIH1cbi8qIGlmIGBlcnJgIGlzIGFuIChFcnJvcikgb2JqZWN0LCB3ZSBjYW4gdHJ5IHRvIGFzc29jaWF0ZSBpdCB3aXRoKi9cbi8qIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkaXNjb25uZWN0aW9uIHRoYXQgcHJvbXB0ZWQgdGhlIHJlcXVlc3QqL1xuLyogZm9yIHdoaWNoIGl0IGlzIGEgcmVzdWx0LiovXG5pZihpc09iamVjdChlcnIpJiZkaXNjb25uZWN0aW9uJiZkaXNjb25uZWN0aW9uIT09ZXJyKXtcbnRyeXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgQXR0ZW1wdGluZyB0byByZWNvdmVyIGZyb20gZGlzY29ubmVjdGlvbjogJHtkaXNjb25uZWN0aW9ufWApO1xuXG4gfWNhdGNoKF9lcnIpe1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5Ki9cbiB9XG4gfVxudGhyb3cgZXJyO1xuIH1cbiB9XG4gfTtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZWFyIGl0ZXJhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwb3RlbnRpYWxseSBmYXIgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+Pn0gaXRQXG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmU9KGl0UCk9PlxuRmFyKCdBc3luY0l0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5jb25zdCBpdD1FKGl0UClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5jb25zdCBzZWxmPUZhcignQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zZWxmLFxubmV4dDphc3luYygpPT5FKGl0KS5uZXh0KCl9KTtcblxucmV0dXJuIHNlbGY7XG4gfX0pO1xuXG5cbi8qKlxuICogQXN5bmNyb25vdXNseSBpdGVyYXRlcyBvdmVyIHRoZSBjb250ZW50cyBvZiBhIFB1YmxpY2F0aW9uUmVjb3JkIGNoYWluIGFzIHRoZXlcbiAqIGFwcGVhci4gIFRoaXMgaXRlcmF0aW9uIG11c3QgZHJvcCBwYXJ0cyBvZiBwdWJsaWNhdGlvbiByZWNvcmRzIHRoYXQgYXJlIG5vXG4gKiBsb25nZXIgbmVlZGVkIHNvIHRoZXkgY2FuIGJlIGdhcmJhZ2UgY29sbGVjdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IG5leHRDZWxsUFxuICogICBQdWJsaWNhdGlvblJlY29yZCBjb3JyZXNwb25kaW5nIHdpdGggdGhlIGZpcnN0IGl0ZXJhdGlvbiByZXN1bHRcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUPn1cbiAqLyRo4oCNX29uY2Uuc3Vic2NyaWJlKHN1YnNjcmliZSk7XG5jb25zdCBtYWtlRWFjaEl0ZXJhdG9yPSh0b3BpYyxuZXh0Q2VsbFApPT57XG4vKiBUbyB1bmRlcnN0YW5kIHRoZSBpbXBsZW1lbnRhdGlvbiwgc3RhcnQgd2l0aCovXG4vKiBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNjA0MDQxMjIyNTAvaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9c3RyYXdtYW46Y29uY3VycmVuY3kjaW5maW5pdGVfcXVldWUqL1xuY29uc3Qgc2VsZj1GYXIoJ0VhY2hJdGVyYXRvcicse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+c2VsZixcbm5leHQ6KCk9PntcbmNvbnN0e1xuaGVhZDpyZXN1bHRQLFxucHVibGlzaENvdW50OnB1Ymxpc2hDb3VudFAsXG50YWlsOnRhaWxQfT1cbkUuZ2V0KG5leHRDZWxsUCk7XG5cbi8qIElmIHRhaWxQIGlzIGJyb2tlbiBieSB1cGdyYWRlLCB3ZSB3aWxsIG5lZWQgdG8gcmUtcmVxdWVzdCBpdCovXG4vKiBkaXJlY3RseSBmcm9tIGB0b3BpY2AuKi9cbmNvbnN0IGdldFN1Y2Nlc3Nvcj1hc3luYygpPT57XG5jb25zdCBwdWJsaXNoQ291bnQ9YXdhaXQgcHVibGlzaENvdW50UDtcbmFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCdiaWdpbnQnKTtcbmNvbnN0IHN1Y2Nlc3Nvcj1hd2FpdCBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuY29uc3QgbmV3UHVibGlzaENvdW50PXN1Y2Nlc3Nvci5wdWJsaXNoQ291bnQ7XG5pZihuZXdQdWJsaXNoQ291bnQhPT1wdWJsaXNoQ291bnQrMW4pe1xuRmFpbCBgZWFjaEl0ZXJhdG9yIGJyb2tlbiBieSBnYXAgZnJvbSBwdWJsaXNoQ291bnQgJHtwdWJsaXNoQ291bnR9IHRvICR7bmV3UHVibGlzaENvdW50fWA7XG4gfVxucmV0dXJuIHN1Y2Nlc3NvcjtcbiB9O1xuXG4vKiBSZXBsYWNlIG5leHRDZWxsUCBvbiBldmVyeSBjYWxsIHRvIG5leHQoKSBzbyB0aGluZ3Mgd29yayBldmVuKi9cbi8qIHdpdGggYW4gZWFnZXIgY29uc3VtZXIgdGhhdCBkb2Vzbid0IHdhaXQgZm9yIHJlc3VsdHMgdG8gc2V0dGxlLiovXG5uZXh0Q2VsbFA9cmVjb25uZWN0QXNOZWVkZWQoZ2V0U3VjY2Vzc29yLFt0YWlsUF0pO1xuXG4vKiBBdm9pZCB1bmhhbmRsZWQgcmVqZWN0aW9uIHdhcm5pbmdzIGhlcmUgaWYgdGhlIHByZXZpb3VzIGNlbGwgd2FzIHJlamVjdGVkIG9yKi9cbi8qIHRoZXJlIGlzIG5vIGZ1cnRoZXIgcmVxdWVzdCBvZiB0aGlzIGl0ZXJhdG9yLiovXG4vKiBgdGFpbFBgIGlzIGhhbmRsZWQgaW5zaWRlIGByZWNvbm5lY3RBc05lZWRlZGAgYW5kIGByZXN1bHRQYCBpcyB0aGUgY2FsbGVyJ3MqL1xuLyogY29uY2VybiwgbGVhdmluZyBvbmx5IGBwdWJsaXNoQ291bnRQYCBhbmQgdGhlIG5ldyBgbmV4dENlbGxQYC4qL1xudm9pZCBFLndoZW4ocHVibGlzaENvdW50UCxzaW5rLHNpbmspO1xudm9pZCBFLndoZW4obmV4dENlbGxQLHNpbmssc2luayk7XG5yZXR1cm4gcmVzdWx0UDtcbiB9LFxuZm9yazooKT0+bWFrZUVhY2hJdGVyYXRvcih0b3BpYyxuZXh0Q2VsbFApfSk7XG5cbnJldHVybiBzZWxmO1xuIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwicHJlZml4IGxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcInByZWZpeCBsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGV2ZXJ5dGhpbmcgcHVibGlzaGVkIGJlZm9yZVxuICogeW91IGFzayB0aGUgcmV0dXJuZWQgaXRlcmFibGUgZm9yIGFuIGl0ZXJhdG9yLiBCdXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yXG4gKiB3aWxsIGVudW1lcmF0ZSBlYWNoIHRoaW5nIHB1Ymxpc2hlZCBmcm9tIHRoYXQgaXRlcmF0b3IncyBzdGFydGluZyBwb2ludFxuICogdXAgdG8gYSBkaXNjb25uZWN0aW9uIHJlc3VsdCBpbmRpY2F0aW5nIHVwZ3JhZGUgb2YgdGhlIHByb2R1Y2VyXG4gKiAod2hpY2ggYnJlYWtzIHRoZSBnYXAtZnJlZSBndWFyYW50ZWUgYW5kIHRoZXJlZm9yZSB0ZXJtaW5hdGVzIGFueSBhY3RpdmVcbiAqIGl0ZXJhdG9yIHdoaWxlIHN0aWxsIHN1cHBvcnRpbmcgY3JlYXRpb24gb2YgbmV3IGl0ZXJhdG9ycykuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQsIHRoYXQgdGVybWluYWwgdmFsdWUgd2lsbCBiZVxuICogcmVwb3J0ZWQgbG9zc2xlc3NseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEVhY2hUb3BpYzxUPj59IHRvcGljXG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmVFYWNoPSh0b3BpYyk9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignRWFjaEl0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5jb25zdCBmaXJzdENlbGxQPXJlY29ubmVjdEFzTmVlZGVkKCgpPT5FKHRvcGljKS5zdWJzY3JpYmVBZnRlcigpKTtcbnJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHRvcGljLGZpcnN0Q2VsbFApO1xuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5zdWJzY3JpYmVFYWNoKHN1YnNjcmliZUVhY2gpO1xuaGFyZGVuKHN1YnNjcmliZUVhY2gpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICogQHBhcmFtIHtiaWdpbnR9IFtsb2NhbFVwZGF0ZUNvdW50XVxuICogQHBhcmFtIHtJdGVyYXRvclJldHVyblJlc3VsdDxUPn0gW3Rlcm1pbmFsUmVzdWx0XVxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFQ+fVxuICovXG5jb25zdCBjbG9uZUxhdGVzdEl0ZXJhdG9yPSh0b3BpYyxsb2NhbFVwZGF0ZUNvdW50LHRlcm1pbmFsUmVzdWx0KT0+e1xubGV0IG11dGV4PVByb21pc2UucmVzb2x2ZSgpO1xuXG4vKipcbiAqIFJlcXVlc3QgdGhlIG5leHQgdXBkYXRlIHJlY29yZCBmcm9tIHRoZSB0b3BpYywgdXBkYXRpbmcgb3VyIGxvY2FsIHN0YXRlLFxuICogYW5kIGNvbnZlcnQgaXQgdG8gYW4gaXRlcmF0b3IgcmVzdWx0LlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFQ+Pn1cbiAqL1xuY29uc3QgbWF5YmVSZXF1ZXN0TmV4dFJlc3VsdD1hc3luYygpPT57XG5pZih0ZXJtaW5hbFJlc3VsdCl7XG4vKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRvcGljLCBqdXN0IGtlZXAgcmV0dXJuaW5nIHRoZSBsYXN0IHJlc3VsdCovXG4vKiB3aXRob3V0IGZ1cnRoZXIgcmVxdWVzdHMuKi9cbnJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiB9XG5cbi8qIFNlbmQgdGhlIG5leHQgcmVxdWVzdCBub3csIHNraXBwaW5nIHBhc3QgaW50ZXJtZWRpYXRlIHVwZGF0ZXMqL1xuLyogYW5kIHVwZ3JhZGUgZGlzY29ubmVjdGlvbnMuKi9cbmNvbnN0e3ZhbHVlLHVwZGF0ZUNvdW50fT1hd2FpdCByZWNvbm5lY3RBc05lZWRlZCgoKT0+XG5FKHRvcGljKS5nZXRVcGRhdGVTaW5jZShsb2NhbFVwZGF0ZUNvdW50KSk7XG5cbi8qIE1ha2Ugc3VyZSB0aGUgbmV4dCByZXF1ZXN0IGlzIGZvciBhIGZyZXNoZXIgdmFsdWUuKi9cbmxvY2FsVXBkYXRlQ291bnQ9dXBkYXRlQ291bnQ7XG5cbi8qIE1ha2UgYW4gSXRlcmF0b3JSZXN1bHQuKi9cbmlmKHVwZGF0ZUNvdW50PT09dW5kZWZpbmVkKXtcbnRlcm1pbmFsUmVzdWx0PWhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlfSk7XG5yZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH07XG5cbmNvbnN0IHNlbGY9RmFyKCdMYXRlc3RJdGVyYXRvcicse1xuZm9yazooKT0+Y2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyxsb2NhbFVwZGF0ZUNvdW50LHRlcm1pbmFsUmVzdWx0KSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnNlbGYsXG5uZXh0OmFzeW5jKCk9Pntcbi8qIEluIHRoaXMgYWRhcHRvciwgb25jZSBgbmV4dCgpYCBpcyBjYWxsZWQgYW5kIHJldHVybnMgYW4gdW5yZXNvbHZlZCovXG4vKiBwcm9taXNlLCBmdXJ0aGVyIGBuZXh0KClgIGNhbGxzIHdpbGwgYWxzbyByZXR1cm4gdW5yZXNvbHZlZCBwcm9taXNlcyovXG4vKiBidXQgZWFjaCBjYWxsIHdpbGwgbm90IHRyaWdnZXIgYW5vdGhlciBgdG9waWNgIHJlcXVlc3QgdW50aWwgdGhlIHByaW9yKi9cbi8qIG9uZSBoYXMgc2V0dGxlZC4qL1xuLyoqL1xuLyogVGhpcyBsaW5lYXIgcXVldWVpbmcgYmVoYXZpb3IgaXMgb25seSBuZWVkZWQgZm9yIGNvZGUgdGhhdCB1c2VzIHRoZSovXG4vKiBhc3luYyBpdGVyYXRvciBwcm90b2NvbCBleHBsaWNpdGx5LiBXaGVuIHRoaXMgYXN5bmMgaXRlcmF0b3IgaXMqL1xuLyogY29uc3VtZWQgYnkgYSBmb3IvYXdhaXQvb2YgbG9vcCwgYG5leHQoKWAgd2lsbCBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUqL1xuLyogcHJvbWlzZSBmb3IgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiByZXN1bHQgaGFzIGZ1bGZpbGxlZC4gSWYgaXQgZnVsZmlsbHMqL1xuLyogd2l0aCBgZG9uZTogdHJ1ZWAsIHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB3aWxsIG5ldmVyIGNhbGwgYG5leHQoKWAqL1xuLyogYWdhaW4uKi9cbi8qKi9cbi8qIFNlZSovXG4vKiBodHRwczovLzJhbGl0eS5jb20vMjAxNi8xMC9hc3luY2hyb25vdXMtaXRlcmF0aW9uLmh0bWwjcXVldWluZy1uZXh0KCktaW52b2NhdGlvbnMqL1xuLyogZm9yIGFuIGV4cGxpY2l0IHVzZSB0aGF0IHNlbmRzIGBuZXh0KClgIHdpdGhvdXQgd2FpdGluZy4qL1xuXG5pZih0ZXJtaW5hbFJlc3VsdCl7XG4vKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRvcGljLCBqdXN0IGtlZXAgcmV0dXJuaW5nIHRoZSBsYXN0Ki9cbi8qIHJlc3VsdC4qL1xucmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuIH1cblxuLyogQkVHSU4gQ1JJVElDQUwgU0VDVElPTiAtIHN5bmNocm9ub3VzbHkgZW5xdWV1ZSBhbmQgcmVhc3NpZ24gYG11dGV4YCovXG4vKiovXG4vKiBVc2UgYG11dGV4YCB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlIG5vIG1vcmUgdGhhbiBhIHNpbmdsZSByZXF1ZXN0IGluKi9cbi8qIGZsaWdodC4qL1xuY29uc3QgbmV4dFJlc3VsdD1tdXRleC50aGVuKG1heWJlUmVxdWVzdE5leHRSZXN1bHQpO1xubXV0ZXg9bmV4dFJlc3VsdC50aGVuKHNpbmssc2luayk7XG4vKiBFTkQgQ1JJVElDQUwgU0VDVElPTiovXG5cbnJldHVybiBuZXh0UmVzdWx0O1xuIH19KTtcblxucmV0dXJuIHNlbGY7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gdG9waWNcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUPn1cbiAqL1xuY29uc3QgbWFrZUxhdGVzdEl0ZXJhdG9yPSh0b3BpYyk9PmNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMpO1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcImxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcImxvc3N5XCIsIHdlIG1lYW4gdGhhdCB5b3UgbWF5IG1pc3MgYW55IHB1Ymxpc2hlZCBzdGF0ZSBpZiBhIG1vcmVcbiAqIHJlY2VudCBwdWJsaXNoZWQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQgYnkgdXBncmFkZSBvZiB0aGUgcHJvZHVjZXIsXG4gKiBpdCB3aWxsIGJlIHJlLXJlcXVlc3RlZC4gQWxsIG90aGVyIHRlcm1pbmFsIHZhbHVlcyB3aWxsIGJlIGxvc3NsZXNzbHlcbiAqIHByb3BhZ2F0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmVMYXRlc3Q9KHRvcGljKT0+e1xuY29uc3QgaXRlcmFibGU9RmFyKCdMYXRlc3RJdGVyYWJsZScse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+bWFrZUxhdGVzdEl0ZXJhdG9yKHRvcGljKX0pO1xuXG5yZXR1cm4gaXRlcmFibGU7XG4gfTskaOKAjV9vbmNlLnN1YnNjcmliZUxhdGVzdChzdWJzY3JpYmVMYXRlc3QpO1xuaGFyZGVuKHN1YnNjcmliZUxhdGVzdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3Vic2NyaWJlIjpbInN1YnNjcmliZSJdLCJzdWJzY3JpYmVFYWNoIjpbInN1YnNjcmliZUVhY2giXSwic3Vic2NyaWJlTGF0ZXN0IjpbInN1YnNjcmliZUxhdGVzdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAnsjsjxQsAAMULAAApAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZXIuanN7ImltcG9ydHMiOlsiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi90b3BpYy5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLHN1YnNjcmliZUVhY2gsbWFrZVB1Ymxpc2hLaXQsbWFrZVBpbm5lZEhpc3RvcnlUb3BpYzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVFYWNoID0gJGjigI1fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3RvcGljLmpzXCIsIFtbXCJtYWtlUGlubmVkSGlzdG9yeVRvcGljXCIsIFskaOKAjV9hID0+IChtYWtlUGlubmVkSGlzdG9yeVRvcGljID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb248VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb249KHRvcGljKT0+e1xuY29uc3Qgc3Vic2NyaXB0aW9uPUZhcignU3Vic2NyaXB0aW9uJyx7XG4uLi5zdWJzY3JpYmVFYWNoKHRvcGljKSxcbnN1YnNjcmliZUFmdGVyOmFzeW5jKHB1Ymxpc2hDb3VudCk9PkUodG9waWMpLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIFN1YnNjcmlwdGlvbiBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgU3Vic2NyaXB0aW9uIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VTdWJzY3JpcHRpb25gIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogU3Vic2NyaXB0aW9uIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6YXN5bmMoKT0+dG9waWMsXG5cbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe3N1YnNjcmlwdGlvbn0pfSk7XG5cbnJldHVybiBzdWJzY3JpcHRpb247XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb24obWFrZVN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbik7XG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBQcm9kdWNlcnMgc2hvdWxkIHVzZVxuICogYGBganNcbiAqIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuICogY29uc3QgdG9waWMgPSBtYWtlUGlubmVkSGlzdG9yeVRvcGljKHN1YnNjcmliZXIpO1xuICogYGBgXG4gKiBpbnN0ZWFkLCB3aGljaCBtYWtlcyBpdCBjbGVhcmVyIHRoYXQgYWxsIHRoZSBzdWJzY3JpYmVyJ3MgaGlzdG9yeSBpc1xuICogcmV0YWluZWQsIHByZXZlbnRpbmcgR0MuICBQb3RlbnRpYWxseSByZW1vdGUgY29uc3VtZXJzIHVzZVxuICogYGBganNcbiAqIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2Ygc3Vic2NyaWJlRWFjaCh0b3BpYykpIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIE1ha2VzIGEgYHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9YCBmb3IgZG9pbmcgbG9zc2xlc3MgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0PSgpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxuLyogVGhlIHB1Ymxpc2gga2l0IHN1YnNjcmliZXIgaXMgcHJlZml4LWxvc3N5LCBzbyBtYWtpbmcgKnRoaXMqIHN1YnNjcmliZXIgY29tcGxldGVseSovXG4vKiBsb3NzbGVzcyBmcm9tIGluaXRpYWxpc2F0aW9uIHJlcXVpcmVzIHBpbm5pbmcgdGhlIGZvcm1lcidzIGhpc3RvcnkuKi9cblxuY29uc3QgcGlubmVkSGlzdG9yeVRvcGljPW1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG5jb25zdCBzdWJzY3JpcHRpb249bWFrZVN1YnNjcmlwdGlvbihwaW5uZWRIaXN0b3J5VG9waWMpO1xuXG4vKiogQHR5cGUge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSAqL1xuY29uc3QgcHVibGljYXRpb249RmFyKCdwdWJsaWNhdGlvbicse1xudXBkYXRlU3RhdGU6KG5vbkZpbmFsVmFsdWUpPT5wdWJsaXNoZXIucHVibGlzaChub25GaW5hbFZhbHVlKSxcbmZpbmlzaDooY29tcGxldGlvbik9PnB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG5mYWlsOihyZWFzb24pPT5wdWJsaXNoZXIuZmFpbChyZWFzb24pfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufSk7XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb25LaXQobWFrZVN1YnNjcmlwdGlvbktpdCk7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAhgRZyDAYAAAwGAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3RvcGljLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIEEgcGlubmVkLWhpc3RvcnkgdG9waWMgcHJlc2VydmVzIGFsbCBvZiBpdHMgcHVibGlzaGVkIHZhbHVlcyBpblxuICogbWVtb3J5LiAgVXNlIGEgcHJlZml4LWxvc3N5IG1ha2VQdWJsaXNoS2l0IGluc3RlYWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RWFjaFRvcGljPFQ+ICYgTGF0ZXN0VG9waWM8VD59IHRvcGljIG5lZWRzIHRvIGJlIG5lYXIgaW4gb3JkZXIgdG9cbiAqIHByZXNlcnZlIHN1YnNjcmlwdGlvbiB0aW1pbmdzLiAgVE9ETzogZHJvcCBMYXRlc3RUb3BpYzxUPiByZXF1aXJlbWVudFxuICogQHJldHVybnMge0VhY2hUb3BpYzxUPiAmIExhdGVzdFRvcGljPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVBpbm5lZEhpc3RvcnlUb3BpYz0odG9waWMpPT57XG4vKiBTdWNoIGxvc3NsZXNzbmVzcyBpbmhpYml0cyBHQywgd2hpY2ggaXMgd2h5IHdlJ3JlIG1vdmluZyBhd2F5IGZyb20gaXQuKi9cblxuLyogV2UgbmVlZCB0byB0YWtlIGFuIGltbWVkaWF0ZSBzbmFwc2hvdCBvZiB0aGUgdG9waWMncyBjdXJyZW50IHN0YXRlLiovXG5jb25zdCBwaW5uZWRQdWJMaXN0PXRvcGljLnN1YnNjcmliZUFmdGVyKCk7XG5cbnJldHVybiBGYXIoJ1Bpbm5lZEhpc3RvcnlUb3BpYycse1xuc3Vic2NyaWJlQWZ0ZXI6YXN5bmMocHVibGlzaENvdW50PS0xbik9PntcbmlmKHB1Ymxpc2hDb3VudD09PS0xbil7XG5yZXR1cm4gcGlubmVkUHViTGlzdDtcbiB9XG5yZXR1cm4gdG9waWMuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbiB9LFxuZ2V0VXBkYXRlU2luY2U6YXN5bmModXBkYXRlQ291bnQ9dW5kZWZpbmVkKT0+e1xuLyogVE9ETzogQnVpbGQgdGhpcyBvdXQgb2YgRWFjaFRvcGljPFQ+LiovXG5yZXR1cm4gdG9waWMuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpO1xuIH19KTtcblxuIH07JGjigI1fb25jZS5tYWtlUGlubmVkSGlzdG9yeVRvcGljKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xuaGFyZGVuKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQaW5uZWRIaXN0b3J5VG9waWMiOlsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD4UQ8TPzAAAD8wAAAsAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3R5cGVzLWFtYmllbnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAamVzc2llLWNoZWNrKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8VD59IEVSZWZcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlS2l0PFQ+fSBQcm9taXNlS2l0XG4gKi9cblxuLyoqXG4gKiBEZXByZWNhdGVkLiBVc2UgUHJvbWlzZUtpdCBpbnN0ZWFkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcHJvbWlzZS1raXQnKS5Qcm9taXNlUmVjb3JkPFQ+fSBQcm9taXNlUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIFtUUmV0dXJuPWFueV1cbiAqIEB0ZW1wbGF0ZSBbVE5leHQ9dW5kZWZpbmVkXVxuICogQHR5cGVkZWYge0FzeW5jSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+ICYge1xuICogICBmb3JrKCk6IEZvcmthYmxlQXN5bmNJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD5cbiAqIH19IEZvcmthYmxlQXN5bmNJdGVyYXRvciBBbiBBc3luY0l0ZXJhdG9yIHRoYXQgY2FuIGJlIGZvcmtlZCBhdCBhIGdpdmVuIHBvc2l0aW9uXG4gKiBpbnRvIG11bHRpcGxlIGluZGVwZW5kZW50IEZvcmthYmxlQXN5bmNJdGVyYXRvcnMgc3RhcnRpbmcgZnJvbSB0aGF0IHBvc2l0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVFJldHVybj1hbnldXG4gKiBAdGVtcGxhdGUgW1ROZXh0PXVuZGVmaW5lZF1cbiAqIEB0eXBlZGVmIHt7IFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PiB9fSBBc3luY0l0ZXJhYmxlT25seVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVFJldHVybj1hbnldXG4gKiBAdGVtcGxhdGUgW1ROZXh0PXVuZGVmaW5lZF1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTogRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+LFxuICogICBmb3JrKCk6IEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PiB9ICZcbiAqICAgRm9ya2FibGVBc3luY0l0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PlxuICogfSBGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVFJldHVybj1hbnldXG4gKiBAdGVtcGxhdGUgW1ROZXh0PXVuZGVmaW5lZF1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IEZvcmthYmxlQXN5bmNJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD5cbiAqIH19IEZvcmthYmxlQXN5bmNJdGVyYWJsZVxuICogQW4gQXN5bmNJdGVyYWJsZSB0aGF0IHByb2R1Y2VzIEZvcmthYmxlQXN5bmNJdGVyYXRvcnMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gSXRlcmF0aW9uT2JzZXJ2ZXI8VD5cbiAqIEEgdmFsaWQgc2VxdWVuY2Ugb2YgY2FsbHMgdG8gdGhlIG1ldGhvZHMgb2YgYW4gYEl0ZXJhdGlvbk9ic2VydmVyYFxuICogcmVwcmVzZW50cyBhbiBpdGVyYXRpb24uIEEgdmFsaWQgc2VxdWVuY2UgY29uc2lzdHMgb2YgYW55IG51bWJlciBvZiBjYWxsc1xuICogdG8gYHVwZGF0ZVN0YXRlYCB3aXRoIHRoZSBzdWNjZXNzaXZlIG5vbi1maW5hbCB2YWx1ZXMsIGZvbGxvd2VkIGJ5IGFcbiAqIGZpbmFsIGNhbGwgdG8gZWl0aGVyIGBmaW5pc2hgIHdpdGggYSBzdWNjZXNzZnVsIGBjb21wbGV0aW9uYCB2YWx1ZVxuICogb3IgYGZhaWxgIHdpdGggdGhlIGFsbGVnZWQgYHJlYXNvbmAgZm9yIGZhaWx1cmUuIEFmdGVyIGF0IG1vc3Qgb25lXG4gKiB0ZXJtaW5hdGluZyBjYWxscywgbm8gZnVydGhlciBjYWxscyB0byB0aGVzZSBtZXRob2RzIGFyZSB2YWxpZCBhbmQgbXVzdCBiZVxuICogcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkgeyhub25GaW5hbFZhbHVlOiBUKSA9PiB2b2lkfSB1cGRhdGVTdGF0ZVxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogVCkgPT4gdm9pZH0gZmluaXNoXG4gKiBAcHJvcGVydHkgeyhyZWFzb246IHVua25vd24pID0+IHZvaWR9IGZhaWxcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1YmxpY2F0aW9uUmVjb3JkXG4gKiBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLCBzbyBpdCBtdXN0IGJlIHNhZmUgdG8gZXhwb3NlLiBCdXQgc29mdHdhcmVcbiAqIG91dHNpZGUgdGhlIGN1cnJlbnQgcGFja2FnZSBzaG91bGQgY29uc2lkZXIgaXQgb3BhcXVlLCBub3QgZGVwZW5kaW5nIG9uIGl0c1xuICogaW50ZXJuYWwgc3RydWN0dXJlLlxuICogQHByb3BlcnR5IHtJdGVyYXRvclJlc3VsdDxUPn0gaGVhZFxuICogQHByb3BlcnR5IHtiaWdpbnR9IHB1Ymxpc2hDb3VudCBzdGFydHMgYXQgMSBmb3IgdGhlIGZpcnN0IHJlc3VsdFxuICogICBhbmQgYWR2YW5jZXMgYnkgMSBmb3IgZWFjaCBzdWJzZXF1ZW50IHJlc3VsdFxuICogQHByb3BlcnR5IHtQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gdGFpbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVhY2hUb3BpY1xuICogQHByb3BlcnR5IHsocHVibGlzaENvdW50PzogYmlnaW50KSA9PiBQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gc3Vic2NyaWJlQWZ0ZXJcbiAqIFJldHVybnMgYSBwcm9taXNlIGZvciBhIFwiY3VycmVudFwiIFB1YmxpY2F0aW9uUmVjb3JkIChyZWZlcmVuY2luZyBpdHNcbiAqIGltbWVkaWF0ZSBzdWNjZXNzb3IgdmlhIGEgYHRhaWxgIHByb21pc2UpIHRoYXQgaXMgbGF0ZXIgdGhhbiB0aGVcbiAqIHByb3ZpZGVkIHB1Ymxpc2hDb3VudC5cbiAqIFVzZWQgdG8gbWFrZSBmb3J3YXJkLWxvc3NsZXNzIChcImVhY2hcIikgaXRlcmF0b3JzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtGb3JrYWJsZUFzeW5jSXRlcmFibGU8VCwgVD4gJiBFYWNoVG9waWM8VD59IEl0ZXJhYmxlRWFjaFRvcGljXG4gKiBBbiBFYWNoVG9waWMgd2l0aCBkZWZhdWx0IGFzeW5jSXRlcmFibGUgYmVoYXZpb3VyLlxuICpcbiAqIE5PVEU6IHRoZSBwdWJsaWNhdGlvbiByZWNvcmRzIGFuZCBpdGVyYXRvcnMgcmV0dXJuZWQgYnkgdGhpcyBvYmplY3QgYXJlXG4gKiBlcGhlbWVyYWwgYW5kIHdpbGwgYmUgc2V2ZXJlZCBkdXJpbmcgdXBncmFkZS4gIEEgY2FsbGVyIHNob3VsZCB1c2VcbiAqIGBzdWJzY3JpYmVFYWNoYCB0byB3cmFwIHRoaXMgdG9waWMgaW4gYSBsb2NhbCBpdGVyYWJsZSB3aGljaCBhdXRvbWF0aWNhbGx5XG4gKiBhdHRlbXB0cyB0byByZWNvbm5lY3QgdXBvbiBiZWluZyBzZXZlcmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtBc3luY0l0ZXJhYmxlT25seTxULCBUPiAmIExhdGVzdFRvcGljPFQ+fSBJdGVyYWJsZUxhdGVzdFRvcGljXG4gKiBBIExhdGVzdFRvcGljIHdpdGggZGVmYXVsdCBhc3luY0l0ZXJhYmxlIGJlaGF2aW91ci5cbiAqXG4gKiBOT1RFOiB0aGUgaXRlcmF0b3JzIHJldHVybmVkIGJ5IHRoaXMgb2JqZWN0IGFyZSBlcGhlbWVyYWwgYW5kIHdpbGwgYmUgc2V2ZXJlZFxuICogZHVyaW5nIHVwZ3JhZGUuICBBIGNhbGxlciBzaG91bGQgdXNlIGBzdWJzY3JpYmVMYXRlc3RgIHRvIHdyYXAgdGhpcyB0b3BpYyBpblxuICogYSBsb2NhbCBpdGVyYWJsZSB3aGljaCBhdXRvbWF0aWNhbGx5IGF0dGVtcHRzIHRvIHJlY29ubmVjdCB1cG9uIGJlaW5nXG4gKiBzZXZlcmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExhdGVzdFRvcGljXG4gKiBAcHJvcGVydHkgeyh1cGRhdGVDb3VudD86IGJpZ2ludCB8IG51bWJlcikgPT4gUHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSBnZXRVcGRhdGVTaW5jZVxuICogUmV0dXJucyBhIHByb21pc2UgZm9yIGFuIHVwZGF0ZSByZWNvcmQgYXMgb2YgYW4gdXBkYXRlIGNvdW50LlxuICogSWYgdGhlIGB1cGRhdGVDb3VudGAgYXJndW1lbnQgaXMgb21pdHRlZCBvciBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnQgdXBkYXRlIGNvdW50LFxuICogdGhlIHByb21pc2UgcHJvbXB0bHkgcmVzb2x2ZXMgdG8gdGhlIGN1cnJlbnQgcmVjb3JkLlxuICogT3RoZXJ3aXNlLCBhZnRlciB0aGUgbmV4dCBzdGF0ZSBjaGFuZ2UsIHRoZSBwcm9taXNlIHJlc29sdmVzIHRvIHRoZSByZXN1bHRpbmcgcmVjb3JkLlxuICogVGhpcyBpcyBhbiBhdHRlbnVhdGVkIGZvcm0gb2YgYHN1YnNjcmliZUFmdGVyYCB3aG9zZSByZXR1cm4gdmFsdWUgc3RhbmRzIGFsb25lIGFuZFxuICogZG9lcyBub3QgYWxsb3cgY29uc3VtZXJzIHRvIHBpbiBhIGNoYWluIG9mIGhpc3RvcmljYWwgUHVibGljYXRpb25SZWNvcmRzLlxuICogVXNlZCB0byBtYWtlIGxvc3N5IChcImxhdGVzdFwiKSBpdGVyYXRvcnMuXG4gKiBOT1RFOiBVc2Ugb2YgYG51bWJlcmAgYXMgYW4gYHVwZGF0ZUNvdW50YCBpcyBkZXByZWNhdGVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtMYXRlc3RUb3BpYzxUPn0gQmFzZU5vdGlmaWVyIFRoaXMgdHlwZSBpcyBkZXByZWNhdGVkIGJ1dCBpcyBzdGlsbFxuICogdXNlZCBleHRlcm5hbGx5LlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtMYXRlc3RUb3BpYzxUPiAmIEVhY2hUb3BpYzxUPn0gU3Vic2NyaWJlclxuICogQSBzdHJlYW0gb2YgcmVzdWx0cyB0aGF0IGFsbG93cyBjb25zdW1lcnMgdG8gY29uZmlndXJlXG4gKiBmb3J3YXJkLWxvc3NsZXNzIFwiZWFjaFwiIGl0ZXJhdGlvbiB3aXRoIGBzdWJzY3JpYmVFYWNoYCBhbmRcbiAqIGxvc3N5IFwibGF0ZXN0XCIgaXRlcmF0aW9uIHdpdGggYHN1YnNjcmliZUxhdGVzdGAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaGVyXG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGBwdWJsaXNoYCB3aXRoIHRoZSBzdWNjZXNzaXZlIG5vbi1maW5hbCB2YWx1ZXMsIGZvbGxvd2VkIGJ5IGFcbiAqIGZpbmFsIGNhbGwgdG8gZWl0aGVyIGBmaW5pc2hgIHdpdGggYSBzdWNjZXNzZnVsIGBjb21wbGV0aW9uYCB2YWx1ZVxuICogb3IgYGZhaWxgIHdpdGggdGhlIGFsbGVnZWQgYHJlYXNvbmAgZm9yIGZhaWx1cmUuIEFmdGVyIGF0IG1vc3Qgb25lXG4gKiB0ZXJtaW5hdGluZyBjYWxscywgbm8gZnVydGhlciBjYWxscyB0byB0aGVzZSBtZXRob2RzIGFyZSB2YWxpZCBhbmQgbXVzdCBiZVxuICogcmVqZWN0ZWQuXG4gKiBAcHJvcGVydHkgeyhub25GaW5hbFZhbHVlOiBUKSA9PiB2b2lkfSBwdWJsaXNoXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBUKSA9PiB2b2lkfSBmaW5pc2hcbiAqIEBwcm9wZXJ0eSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSBmYWlsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1BhcnRpYWw8UHVibGlzaGVyPFQ+Pn0gUHVibGlzaE9ic2VydmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaEtpdDxUPlxuICogQHByb3BlcnR5IHtQdWJsaXNoZXI8VD59IHB1Ymxpc2hlclxuICogQHByb3BlcnR5IHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsnbWFuZGF0b3J5JyB8ICdvcHBvcnR1bmlzdGljJyB8ICdpZ25vcmVkJ30gRHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHlcbiAqXG4gKiBEdXJhYmlsaXR5IGNvbmZpZ3VyZXMgY29uc3RyYWludHMgb24gbm9uLXRlcm1pbmFsIHZhbHVlcyB0aGF0IGNhbiBiZVxuICogcHVibGlzaGVkIHRvIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCAodGVybWluYWwgdmFsdWVzIHNlbnQgdG8gZmluaXNoIG9yIGZhaWxcbiAqIG11c3QgYWx3YXlzIGJlIGR1cmFibGUpLlxuICogLSAnbWFuZGF0b3J5JyBtZWFucyB0aGF0IGVhY2ggdmFsdWUgbXVzdCBiZSBkdXJhYmxlLCBzbyBpdCBjYW4gYmUgcmVzdG9yZWRcbiAqICAgb24gdXBncmFkZS5cbiAqIC0gJ29wcG9ydHVuaXN0aWMnIG1lYW5zIHRoYXQgYSBkdXJhYmxlIHZhbHVlIGlzIHBlcnNpc3RlZCBmb3IgcG9zdC11cGdyYWRlXG4gKiAgIHJlc3RvcmF0aW9uLCBidXQgYSBub24tZHVyYWJsZSB2YWx1ZSBpcyBzdGlsbCBhY2NlcHRlZCAoYW5kIHdpbGwgcmVzdWx0IGluXG4gKiAgIHZhbHVlbGVzcyByZXN0b3JhdGlvbikuXG4gKiAtICdpZ25vcmVkJyBtZWFucyB0aGF0IGEgdmFsdWUgaXMgbm90IHBlcnNpc3RlZCBmb3IgcmVzdG9yYXRpb24gZXZlbiBpZiBpdFxuICogICBpcyBkdXJhYmxlLlxuICpcbiAqICdtYW5kYXRvcnknIGlzIHRoZSBvbmx5IGN1cnJlbnRseS1zdXBwb3J0ZWQgdmFsdWUsIGFuZCBvdGhlcnMgbXVzdCBub3QgYmVcbiAqIGVuYWJsZWQgd2l0aG91dCB0ZXN0IGNvdmVyYWdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVxuICpcbiAqIEBwcm9wZXJ0eSB7RHVyYWJsZVB1Ymxpc2hLaXRWYWx1ZUR1cmFiaWxpdHl9IHZhbHVlRHVyYWJpbGl0eVxuICpcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBwdWJsaXNoQ291bnRcbiAqXG4gKiBAcHJvcGVydHkgeydsaXZlJyB8ICdmaW5pc2hlZCcgfCAnZmFpbGVkJ30gc3RhdHVzXG4gKlxuICogQHByb3BlcnR5IHtib29sZWFufSBoYXNWYWx1ZVxuICogaGFzVmFsdWUgaW5kaWNhdGVzIHRoZSBwcmVzZW5jZSBvZiB2YWx1ZS4gSXQgc3RhcnRzIG9mZiBmYWxzZSxcbiAqIGFuZCBjYW4gYmUgcmVzZXQgdG8gZmFsc2Ugd2hlbiBhIGR1cmFibGUgcHVibGlzaCBraXQgaXMgcmVzdG9yZWQgYW5kXG4gKiB0aGUgcHJldmlvdXMgdmFsdWUgd2FzIG5vdCBkdXJhYmxlLCBvciBub24tdGVybWluYWwgYW5kIHZhbHVlRHVyYWJsaXR5IGlzICdpZ25vcmVkJy5cbiAqXG4gKiBAcHJvcGVydHkge2FueX0gdmFsdWVcbiAqIHZhbHVlIGhvbGRzIGVpdGhlciBhIG5vbi10ZXJtaW5hbCB2YWx1ZSBmcm9tIGBwdWJsaXNoYCBvciBhIHRlcm1pbmFsIHZhbHVlXG4gKiBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCwgZGVwZW5kaW5nIHVwb24gdGhlIHZhbHVlIGluIHN0YXR1cy5cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFVwZGF0ZVJlY29yZDxUPlxuICogQHByb3BlcnR5IHtUfSB2YWx1ZSBpcyB3aGF0ZXZlciBzdGF0ZSB0aGUgc2VydmljZSB3YW50cyB0byBwdWJsaXNoXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gW3VwZGF0ZUNvdW50XSBpcyBhIHZhbHVlIHRoYXQgaWRlbnRpZmllcyB0aGUgdXBkYXRlLiAgRm9yXG4gKiB0aGUgbGFzdCB1cGRhdGUsIGl0IGlzIGB1bmRlZmluZWRgLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD59IE5vdGlmaWVySW50ZXJuYWxzIFdpbGwgYmUgc2hhcmVkIGJldHdlZW4gbWFjaGluZXMsXG4gKiBzbyBpdCBtdXN0IGJlIHNhZmUgdG8gZXhwb3NlLiBCdXQgb3RoZXIgc29mdHdhcmUgc2hvdWxkIGF2b2lkIGRlcGVuZGluZyBvblxuICogaXRzIGludGVybmFsIHN0cnVjdHVyZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7Tm90aWZpZXJJbnRlcm5hbHM8VD4gJlxuICogICBGb3JrYWJsZUFzeW5jSXRlcmFibGU8VCwgVD4gJlxuICogICBTaGFyYWJsZU5vdGlmaWVyPFQ+XG4gKiB9IE5vdGlmaWVyPFQ+IGFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCB0aGUgY3VycmVudCBzdGF0ZSBvciB1cGRhdGVzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU2hhcmFibGVOb3RpZmllclxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPE5vdGlmaWVySW50ZXJuYWxzPFQ+Pn0gZ2V0U2hhcmFibGVOb3RpZmllckludGVybmFsc1xuICogVXNlZCB0byByZXBsaWNhdGUgdGhlIG11bHRpY2FzdCB2YWx1ZXMgYXQgb3RoZXIgc2l0ZXMuIFRvIG1hbnVhbGx5IGNyZWF0ZSBhXG4gKiBsb2NhbCByZXByZXNlbnRhdGl2ZSBvZiBhIE5vdGlmaWNhdGlvbiwgZG9cbiAqIGBgYGpzXG4gKiBsb2NhbEl0ZXJhYmxlID1cbiAqICAgbWFrZU5vdGlmaWVyKEUocmVtb3RlSXRlcmFibGUpLmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb3RpZmllclJlY29yZDxUPiB0aGUgcHJvZHVjZWQgbm90aWZpZXIvdXBkYXRlciBwYWlyXG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSB1cGRhdGVyIHRoZSAoY2xvc2VseS1oZWxkKSBub3RpZmllciBwcm9kdWNlclxuICogQHByb3BlcnR5IHtOb3RpZmllcjxUPn0gbm90aWZpZXIgdGhlICh3aWRlbHktaGVsZCkgbm90aWZpZXIgY29uc3VtZXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtJdGVyYWJsZUVhY2hUb3BpYzxUPiAmIEVhY2hUb3BpYzxUPiAmXG4gKiAgIFNoYXJhYmxlU3Vic2NyaXB0aW9uPFQ+fSBTdWJzY3JpcHRpb248VD5cbiAqIEEgZm9ybSBvZiBBc3luY0l0ZXJhYmxlIHN1cHBvcnRpbmcgZGlzdHJpYnV0ZWQgYW5kIG11bHRpY2FzdCB1c2FnZS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTaGFyYWJsZVN1YnNjcmlwdGlvblxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEVhY2hUb3BpYzxUPj59IGdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzXG4gKiBVc2VkIHRvIHJlcGxpY2F0ZSB0aGUgbXVsdGljYXN0IHZhbHVlcyBhdCBvdGhlciBzaXRlcy4gVG8gbWFudWFsbHkgY3JlYXRlIGFcbiAqIGxvY2FsIHJlcHJlc2VudGF0aXZlIG9mIGEgU3Vic2NyaXB0aW9uLCBkb1xuICogYGBganNcbiAqIGxvY2FsSXRlcmFibGUgPVxuICogICBtYWtlU3Vic2NyaXB0aW9uKEUocmVtb3RlSXRlcmFibGUpLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3Vic2NyaXB0aW9uUmVjb3JkPFQ+XG4gKiBAcHJvcGVydHkge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSBwdWJsaWNhdGlvblxuICogQHByb3BlcnR5IHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0ZW1wbGF0ZSBbU2xvdD11bmtub3duXSBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLk1hcnNoYWw8U2xvdD59IE1hcnNoYWxsZXIgKi9cbi8qKiBAdHlwZWRlZiB7UGljazxNYXJzaGFsbGVyLCAnZnJvbUNhcERhdGEnPn0gVW5zZXJpYWxpemVyICovXG5cbi8qKlxuICogRGVmaW5lZCBieSB2c3RvcmFnZVN0b3JlS2V5IGluIHZzdG9yYWdlLmdvXG4gKlxuICogQHR5cGVkZWYgVlN0b3JhZ2VLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZVN1YmtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGFQcmVmaXhCeXRlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub0RhdGFWYWx1ZV1cbiAqL1xuXG4vKipcbiAqIFRoaXMgcmVwcmVzZW50cyBhIG5vZGUgaW4gYW4gSUFWTCB0cmVlLlxuICpcbiAqIFRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgeC92c3RvcmFnZSwgYW4gQWdvcmljIGV4dGVuc2lvbiBvZiB0aGUgQ29zbW9zIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhIChhcHBlbmQgdG8gdGhlIG5vZGUpXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHN0cmluZz59IGdldFBhdGggdGhlIGNoYWluIHN0b3JhZ2UgcGF0aCBhdCB3aGljaCB0aGUgbm9kZSB3YXMgY29uc3RydWN0ZWRcbiAqIEBwcm9wZXJ0eSB7U3RvcmFnZU5vZGVbJ2dldFN0b3JlS2V5J119IGdldFN0b3JlS2V5IERFUFJFQ0FURUQgdXNlIGdldFBhdGhcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVW5zZXJpYWxpemVyfSBnZXRVbnNlcmlhbGl6ZXIgZ2V0IHRoZSB1bnNlcmlhbGl6ZXIgZm9yIHRoZSBzdG9yZWQgZGF0YVxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0b3JlZFN1YnNjcmliZXJcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaXB0aW9uPFQ+ICYge1xuICogICBnZXRTdG9yZUtleTogKCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleSAmIHsgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb248VD4gfT4sXG4gKiAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gVW5zZXJpYWxpemVyLFxuICogfX0gU3RvcmVkU3Vic2NyaXB0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1N1YnNjcmliZXI8VD4gJiBTdG9yZWRGYWNldH0gU3RvcmVkU3Vic2NyaWJlclxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD5iXDZcAQAAXAEAACAAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9leHBvcnRlZC5qc3siaW1wb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxKPgSCMMAAAjDAAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vZXhvIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiLCJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIiwiaXNDb3B5TWFwIiwiaXNDb3B5TWFwIixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW11dLFtcIkBlbmRvL2V4b1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanNcIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbXV0sW1wiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAZW5kby9wYXR0ZXJucyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXSxbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl0sWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXSxbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl0sWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il0sWyJiYWdJc1N1cGVyYmFnIiwiYmFnSXNTdXBlcmJhZyJdLFsiYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXSxbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJtdXN0TWF0Y2giLCJtdXN0TWF0Y2giXV0sIkBlbmRvL2V4byI6W1siaW5pdEVtcHR5IiwiaW5pdEVtcHR5Il0sWyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIl0sWyJkZWZpbmVFeG9DbGFzc0tpdCIsImRlZmluZUV4b0NsYXNzS2l0Il0sWyJtYWtlRXhvIiwibWFrZUV4byJdXSwiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOltbInByb3ZpZGVMYXp5IiwicHJvdmlkZUxhenkiXSxbImlzQ29weU1hcCIsImlzQ29weU1hcCJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il1dLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiOltbIm1ha2VMZWdhY3lNYXAiLCJtYWtlTGVnYWN5TWFwIl1dLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjpbWyJtYWtlTGVnYWN5V2Vha01hcCIsIm1ha2VMZWdhY3lXZWFrTWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADir4B9RgsAAEYLAAAsAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMuanMiLCJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcSxGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBhbmQgaXRzIGZyYXRlcm5hbCBzaWJsaW5nIGxlZ2FjeVdlYWtNYXAgZXhpc3Qgb25seSB0b1xuICogZWFzZSBhIHRyYW5zaXRpb24gdG8gdGhlIG1vZGVybiBgc3RvcmVgIHN5c3RlbSwgYXJlIGRlcHJlY2F0ZWQsXG4gKiBhbmQgd2lsbCBldmVudHVhbGx5IGRpc2FwcGVhci4gVGhleSBhcmUgbmVlZGVkIGZvciBub3cgdG8gc3VwcG9ydFxuICogc29tZSBvZiB0aGUgdXNlcyBvZiB0aGUgb2xkIGJlaGF2aW9yIHRoYXQgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGhcbiAqIHRoZSBuZXcuIFRoZSBjb25zdHJhaW50IGltcG9zZWQgYnkgdGhlIG5ldyBpcyB0aGF0IG9ubHkgcGFzc2FibGVzIGNhblxuICogYmUgdXNlZCBhcyB2YWx1ZXMsIGFuZCBvbmx5IGtleXMgKHJvdWdobHksIHN0cnVjdHVyZXMsIGFrYSBjb21wYXJhYmxlcylcbiAqIGNhbiBiZSB1c2VkIGFzIHZhbHVlcy5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvMzU2N1xuICogVE9ETyBPbmNlIHRoYXQgUFIgaXMgbWVyZ2VkLCBsaW5rIHRvIHRoZSBkb2N1bWVudHMgcmF0aGVyIHRoYW4gdGhlIFBScy5cbiAqXG4gKiBFYWNoIG9mIHRoZXNlIG5vbi1jb25mb3JtaW5nIHVzZXMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoIGFcbiAqIGBgYGpzXG4gKiAvLyBMZWdhY3kgYmVjYXVzZS4uLlxuICogYGBgXG4gKiBjb21tZW50IGV4cGxhaW5pbmcgdGhlIHByb2JsZW0gaW5oaWJpdGluZyBjb252ZXJzaW9uIHRvIHRoZSBuZXdcbiAqIHN5c3RlbS4gU29tZSBvZiB0aGVzZSBwcm9ibGVtcyBhcyBvZiB0aGlzIHdyaXRpbmc6XG4gKiAgICAqIEEgcHJvbWlzZUtpdCB1c2VkIGFzIGEgdmFsdWUsIGV2ZW4gdGhvdWdoIGEgcHJvbWlzZUtpdCBpcyBub3RcbiAqICAgICAgYSBwYXNzYWJsZS4gU29sdXRpb25zIGFyZSB0byBtYWtlIGl0IGEgcGFzc2FibGUsIG9yIHRvIGNvbnZlcnRcbiAqICAgICAgdGhlIGNvbnRhaW5lciBiYWNrIHRvIGEgY29udmVudGlvbmFsIEphdmFTY3JpcHQgTWFwLlxuICogICAgKiBBIG11dGFibGUgYXJyYXkgdXNlZCBhcyBhIHZhbHVlLCB0aGF0IGlzIHN1YnNlcXVlbnRseSBtdXRhdGVkLlxuICogICAgICBGcmVlemluZyB0aGUgYXJyYXkgd291bGRuJ3Qgd29yayBvZiBjb3Vyc2UgYmVjYXVzZSBpdCB3b3VsZCBicmVha1xuICogICAgICB0aGUgc3Vic2VxdWVudCBtdXRhdGlvbi4gVXNpbmcgYSBmYXIgb2JqZWN0IHdyYXBwaW5nIGFuIGFycmF5IHdvdWxkXG4gKiAgICAgIGxpa2VseSB3b3JrIGZpbmUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhck1hcCBpZiBwb3NzaWJsZSwgTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VMZWdhY3lNYXA9KHRhZz0na2V5Jyk9PntcbmNvbnN0IG09bmV3IE1hcCgpO1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiFtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbm0uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiBtLmhhcyhrZXkpO1xuIH0sXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5yZXR1cm4gbS5nZXQoa2V5KTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbm0uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLmRlbGV0ZShrZXkpO1xuIH0sXG5rZXlzOigpPT5tLmtleXMoKSxcbnZhbHVlczooKT0+bS52YWx1ZXMoKSxcbmVudHJpZXM6KCk9Pm0uZW50cmllcygpLFxuZ2V0U2l6ZTooKT0+bS5zaXplLFxuY2xlYXI6KCk9Pm0uY2xlYXIoKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lNYXAobWFrZUxlZ2FjeU1hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeU1hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKaDTbTCBgAAwgYAADAAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMuanMiLCJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHEsRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG4vKipcbiAqIFNlZSBkb2Njb21tZW50IGluIHRoZSBjbG9zZWx5IHJlbGF0ZWQgYGxlZ2FjeU1hcC5qc2AgbW9kdWxlLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJXZWFrTWFwIGlmIHBvc3NpYmxlLCBXZWFrTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lXZWFrTWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTGVnYWN5V2Vha01hcD0odGFnPSdrZXknKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSAqL1xuY29uc3Qgd209bmV3IFdlYWtNYXAoKTtcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hd20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9Plxud20uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiB3bS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtWfSAqL3dtLmdldChrZXkpKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xud20uZGVsZXRlKGtleSk7XG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeVdlYWtNYXAiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmgO61xYWAAAWFgAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLGZpbHRlckl0ZXJhYmxlLG1hcEl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weU1hcCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjigI1fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaOKAjV9hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChtYXBJdGVyYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weU1hcFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlNYXAgPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kc1wiLCBbJGjigI1fYSA9PiAobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsIFskaOKAjV9hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge01hcDxLLFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KChrOiBLKSA9PiB2b2lkKX0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ11cbiAqIEByZXR1cm5zIHtNYXBTdG9yZTxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZU1hcFN0b3JlTWV0aG9kcz0oXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxudGFnPSdrZXknKT0+XG57XG5jb25zdHthc3NlcnRVcGRhdGVPbkFkZCxhc3NlcnRVcGRhdGVPbkRlbGV0ZSxpdGVyYWJsZUtleXN9PVxubWFrZUN1cnJlbnRLZXlzS2l0KFxuKCk9PmpzbWFwLmtleXMoKSxcbihrKT0+anNtYXAuaGFzKGspLFxuY29tcGFyZVJhbmssXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlLFxudGFnKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbmNvbnN0IGtleXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGl0ZXJhYmxlS2V5cztcbiB9XG5jb25zdCBmaWx0ZXI9KGspPT57XG5pZihrZXlQYXR0IT09dW5kZWZpbmVkJiYhbWF0Y2hlcyhrLGtleVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBVc2VzIHRoZSBjdXJyZW50IGpzbWFwIHZhbHVlLCBzaW5jZSB0aGUgaXRlcmF0YXRvciBzdXJ2aXZlcyBgLnNldGAqL1xuaWYodmFsdWVQYXR0IT09dW5kZWZpbmVkJiYhbWF0Y2hlcyhqc21hcC5nZXQoayksdmFsdWVQYXR0KSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcbnJldHVybiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsZmlsdGVyKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Vj59XG4gKi9cbmNvbnN0IHZhbHVlcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT4vKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGspKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHBhcmFtIHtQYXR0ZXJufSBbdmFsdWVQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtLLFZdPn1cbiAqL1xuY29uc3QgZW50cmllcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT5bXG5rLFxuLyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrKV0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbi8qKiBAdHlwZSB7KGs6IEssIHY6IFYpID0+IHZvaWR9ICovYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbnRhZyksXG5cbmtleXMsXG52YWx1ZXMsXG5lbnRyaWVzLFxuXG5zbmFwc2hvdDooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LHZhbHVlUGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQ/XG5qc21hcC5zaXplOlxuWy4uLmtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+e1xuaWYoa2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkKXtcbmpzbWFwLmNsZWFyKCk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSl7XG5qc21hcC5kZWxldGUoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gYWRkaW5nIGEgbmV3IGtleSAoaW5pdCkgYW5kIHVwZGF0aW5nIG9yXG4gKiByZWZlcmVuY2luZyBhIGtleSAoZ2V0LCBzZXQsIGRlbGV0ZSkuXG4gKlxuICogYGluaXRgIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuIGBHZXRgLFxuICogYHNldGAgYW5kIGBkZWxldGVgIGFyZSBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIGFscmVhZHkgZXhpc3QuXG4gKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIG1hcCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlTWFwcyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0aGUgY29sdW1uIG5hbWUgZm9yIHRoZSBrZXlcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNYXBTdG9yZTxLLFY+fVxuICovJGjigI1fb25jZS5tYWtlTWFwU3RvcmVNZXRob2RzKG1ha2VNYXBTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJNYXBTdG9yZT0oXG50YWc9J2tleScsXG57a2V5U2hhcGU9dW5kZWZpbmVkLHZhbHVlU2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNtYXA9bmV3IE1hcCgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S1ZPa1RvU2V0PShfa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4odmFsdWUpO1xuXG5hc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaCh2YWx1ZSx2YWx1ZVNoYXBlLCdtYXBTdG9yZSB2YWx1ZScpO1xuIH1cbiB9O1xuXG5jb25zdCBhc3NlcnRLVk9rVG9BZGQ9KGtleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5cbmFzc2VydFNjYWxhcktleShrZXkpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnbWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBNYXBTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbnVuZGVmaW5lZCxcbnRhZyl9KTtcblxuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJNYXBTdG9yZShtYWtlU2NhbGFyTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcFN0b3JlTWV0aG9kcyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnQOWIEEPAABBDwAAMQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5U2V0XCIsIFskaOKAjV9hID0+IChtYWtlQ29weVNldCA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsIFskaOKAjV9hID0+IChtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyA9ICRo4oCNX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtTZXQ8Sz59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdHthc3NlcnRVcGRhdGVPbkFkZCxhc3NlcnRVcGRhdGVPbkRlbGV0ZSxpdGVyYWJsZUtleXN9PVxubWFrZUN1cnJlbnRLZXlzS2l0KFxuKCk9Pmpzc2V0LmtleXMoKSxcbihrKT0+anNzZXQuaGFzKGspLFxuY29tcGFyZVJhbmssXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbmtleU5hbWUpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/XG5pdGVyYWJsZUtleXM6XG5maWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsKGspPT5tYXRjaGVzKGssa2V5UGF0dCkpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKFxuanNzZXQsXG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxua2V5TmFtZSksXG5cblxua2V5cyxcblxudmFsdWVzOmtleXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCk9Pm1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZD9qc3NldC5zaXplOlsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQpe1xuanNzZXQuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpe1xuanNzZXQuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVNldFN0b3JlTWV0aG9kcyhtYWtlU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2tleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyBTZXQoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S2V5T2tUb0FkZD0oa2V5KT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCdzZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VTZXRTdG9yZU1ldGhvZHMoanNzZXQsYXNzZXJ0S2V5T2tUb0FkZCx1bmRlZmluZWQsdGFnKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVNldFN0b3JlTWV0aG9kcyI6WyJtYWtlU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfkXiyXcTAAB3EwAANQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4vc3RvcmUtdXRpbHMuanMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGFzc2VydFBhc3NhYmxlLHBhc3NTdHlsZU9mLGdldENvcHlNYXBFbnRyaWVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weU1hcDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldENvcHlNYXBFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wiaXNDb3B5TWFwXCIsIFskaOKAjV9hID0+IChpc0NvcHlNYXAgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0ganNtYXBcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb0FkZFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvU2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtXZWFrTWFwU3RvcmU8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzPShcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIWpzbWFwLmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcblxuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbmpzbWFwLmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4ganNtYXAuaGFzKGtleSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4vKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoa2V5KSk7XG4gfSxcblxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5hc3NlcnRLVk9rVG9BZGQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmlmKGFzc2VydEtleU9rVG9EZWxldGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuIH1cbmpzbWFwLmRlbGV0ZShrZXkpO1xuIH0sXG5cbmFkZEFsbDooZW50cmllcyk9PntcbmlmKHR5cGVvZiBlbnRyaWVzW1N5bWJvbC5pdGVyYXRvcl0hPT0nZnVuY3Rpb24nKXtcbmlmKE9iamVjdC5pc0Zyb3plbihlbnRyaWVzKSYmaXNDb3B5TWFwKGVudHJpZXMpKXtcbmVudHJpZXM9Z2V0Q29weU1hcEVudHJpZXMoZW50cmllcyk7XG4gfWVsc2V7XG5GYWlsIGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7ZW50cmllc31gO1xuIH1cbiB9XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mLyoqIEB0eXBlIHtJdGVyYWJsZTxbSywgVl0+fSAqL2VudHJpZXMpe1xuLyogRG9uJ3QgYXNzZXJ0IHRoYXQgdGhlIGtleSBlaXRoZXIgZG9lcyBvciBkb2VzIG5vdCBleGlzdC4qL1xuYXNzZXJ0S1ZPa1RvQWRkKGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogbWFwU3RvcmUgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzOlxuICogcHJpbWl0aXZlcyBvciByZW1vdGFibGVzLlxuICogT3RoZXIgbWFwU3RvcmVzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha01hcCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha01hcCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogbWFwLiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIHJlYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7V2Vha01hcFN0b3JlPEssVj59XG4gKi8kaOKAjV9vbmNlLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyV2Vha01hcFN0b3JlPShcbnRhZz0na2V5Jyxcbntsb25nTGl2ZWQ9dHJ1ZSxrZXlTaGFwZT11bmRlZmluZWQsdmFsdWVTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc21hcD1uZXcobG9uZ0xpdmVkP1dlYWtNYXA6TWFwKSgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S1ZPa1RvU2V0PShfa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4odmFsdWUpO1xuXG5hc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaCh2YWx1ZSx2YWx1ZVNoYXBlLCd3ZWFrTWFwU3RvcmUgdmFsdWUnKTtcbiB9XG4gfTtcblxuY29uc3QgYXNzZXJ0S1ZPa1RvQWRkPShrZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xucGFzc1N0eWxlT2Yoa2V5KT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha01hcFN0b3JlczogJHtrZXl9YDtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaChrZXksa2V5U2hhcGUsJ3dlYWtNYXBTdG9yZSBrZXknKTtcbiB9XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFdlYWtNYXBTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG51bmRlZmluZWQsXG50YWcpfSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADoSsRhDw8AAA8PAAA1AAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiLi9zdG9yZS11dGlscy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIscGFzc1N0eWxlT2YsZ2V0Q29weVNldEtleXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4saXNDb3B5U2V0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldENvcHlTZXRLZXlzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wiaXNDb3B5U2V0XCIsIFskaOKAjV9hID0+IChpc0NvcHlTZXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge1dlYWtTZXQ8SyAmIG9iamVjdD59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha1NldFN0b3JlTWV0aG9kcz0oXG5qc3NldCxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5qc3NldC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIHNldC4qL1xucmV0dXJuIGpzc2V0LmhhcyhrZXkpO1xuIH0sXG5cbmFkZDooa2V5KT0+e1xuYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuanNzZXQuYWRkKGtleSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5pZihhc3NlcnRLZXlPa1RvRGVsZXRlIT09dW5kZWZpbmVkKXtcbmFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiB9XG5qc3NldC5kZWxldGUoa2V5KTtcbiB9LFxuXG5hZGRBbGw6KGtleXMpPT57XG5pZih0eXBlb2Yga2V5c1tTeW1ib2wuaXRlcmF0b3JdIT09J2Z1bmN0aW9uJyl7XG5pZihPYmplY3QuaXNGcm96ZW4oa2V5cykmJmlzQ29weVNldChrZXlzKSl7XG5rZXlzPWdldENvcHlTZXRLZXlzKGtleXMpO1xuIH1lbHNle1xuRmFpbCBgcHJvdmlkZWQgZGF0YSBzb3VyY2UgaXMgbm90IGl0ZXJhYmxlOiAke2tleXN9YDtcbiB9XG4gfVxuZm9yKGNvbnN0IGtleSBvZi8qKiBAdHlwZSB7SXRlcmFibGU8Sz59ICova2V5cyl7XG5hc3NlcnRLZXlPa1RvQWRkKGtleSk7XG5qc3NldC5hZGQoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogc2V0IGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVTZXRzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogVE9ETyBGb3Igbm93LCB0aGlzIHNjYWxhcldlYWtTZXQgYWNjZXB0cyBvbmx5IHJlbW90YWJsZXMsIHJlZmxlY3RpbmcgdGhlXG4gKiBjb25zdHJhaW50cyBvZiB0aGUgdW5kZXJseWluZyBKYXZhU2NyaXB0IFdlYWtTZXQgaXQgdXNlcyBpbnRlcm5hbGx5LiBCdXRcbiAqIGl0IHNob3VsZCBhY2NlcHQgdGhlIHByaW1pdGl2ZXMgYXMgd2VsbCwgc3RvcmluZyB0aGVtIGluIGEgc2VwYXJhdGUgaW50ZXJuYWxcbiAqIHNldC4gV2hhdCBtYWtlcyBpdCBcIndlYWtcIiBpcyB0aGF0IGl0IHByb3ZpZGVzIG5vIEFQSSBmb3IgZW51bWVyYXRpbmcgd2hhdCdzXG4gKiB0aGVyZS4gVGhvdWdoIG5vdGUgdGhhdCB0aGlzIHdvdWxkIG9ubHkgZW5hYmxlcyBjb2xsZWN0aW9uIG9mIHRoZVxuICogcmVtb3RhYmxlcywgc2luY2UgdGhlIG90aGVyIHByaW1pdGl2ZXMgbWF5IGFsd2F5cyBhcHBlYXIuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlPEs+fVxuICovJGjigI1fb25jZS5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhcldlYWtTZXRTdG9yZT0oXG50YWc9J2tleScsXG57bG9uZ0xpdmVkPXRydWUsa2V5U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNzZXQ9bmV3KGxvbmdMaXZlZD9XZWFrU2V0OlNldCkoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S2V5T2tUb0FkZD0oa2V5KT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcbnBhc3NTdHlsZU9mKGtleSk9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtTdG9yZXM6ICR7a2V5fWA7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCd3ZWFrU2V0U3RvcmUga2V5Jyk7XG4gfVxuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgV2Vha1NldFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMoanNzZXQsYXNzZXJ0S2V5T2tUb0FkZCx1bmRlZmluZWQsdGFnKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUobWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhcldlYWtTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALLXYwidGQAAnRkAAC4AAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJtYWtlQXRvbWljUHJvdmlkZXIiLCJtYWtlQ3VycmVudEtleXNLaXQiLCJwcm92aWRlTGF6eSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsTSxtYXRjaGVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogU2hvdWxkIGJlaGF2ZSBpZGVudGljYWxseSB0byB0aGUgb25lIGluIGBAZW5kby9wYXR0ZXJuc2AsIGJ1dFxuICogcmVpbXBsZW1lbnRlZCBmb3Igbm93IGJlY2F1c2UgYEBlbmRvL3BhdHRlcm5zYCBmb3Jnb3QgdG8gZXhwb3J0IHRoaXMgb25lLlxuICogVGhpcyBvbmUgaXMgc2ltcGxlIGVub3VnaCB0aGF0IEkgcHJlZmVyIGEgcmVpbXBsZW1lbnRhdGlvbiB0byBhIGRlZXAgaW1wb3J0LlxuICogVE9ETzogVW5kYXRlIGBAZW5kby9wYXR0ZXJuc2AgdG8gZXhwb3J0IHRoZSBvcmlnaW5hbCwgYW5kIGRlbGV0ZSB0aGVcbiAqIHJlaW1wbGVtZW50YXRpb24gaGVyZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7cyBpcyBDb3B5U2V0fVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0PShzKT0+bWF0Y2hlcyhzLE0uc2V0KCkpO1xuXG4vKipcbiAqIFNob3VsZCBiZWhhdmUgaWRlbnRpY2FsbHkgdG8gdGhlIG9uZSBpbiBgQGVuZG8vcGF0dGVybnNgLCBidXRcbiAqIHJlaW1wbGVtZW50ZWQgZm9yIG5vdyBiZWNhdXNlIGBAZW5kby9wYXR0ZXJuc2AgZm9yZ290IHRvIGV4cG9ydCB0aGlzIG9uZS5cbiAqIFRoaXMgb25lIGlzIHNpbXBsZSBlbm91Z2ggdGhhdCBJIHByZWZlciBhIHJlaW1wbGVtZW50YXRpb24gdG8gYSBkZWVwIGltcG9ydC5cbiAqIFRPRE86IFVuZGF0ZSBgQGVuZG8vcGF0dGVybnNgIHRvIGV4cG9ydCB0aGUgb3JpZ2luYWwsIGFuZCBkZWxldGUgdGhlXG4gKiByZWltcGxlbWVudGF0aW9uIGhlcmUuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHJldHVybnMge20gaXMgQ29weU1hcH1cbiAqLyRo4oCNX29uY2UuaXNDb3B5U2V0KGlzQ29weVNldCk7XG5jb25zdCAgICAgICAgaXNDb3B5TWFwPShtKT0+bWF0Y2hlcyhtLE0ubWFwKCkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEN1cnJlbnRLZXlzS2l0XG4gKiBAcHJvcGVydHkgeyhrOiBLLCB2PzogVikgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25BZGRcbiAqIEBwcm9wZXJ0eSB7KGs6IEspID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uRGVsZXRlXG4gKiBAcHJvcGVydHkge0l0ZXJhYmxlPEs+fSBpdGVyYWJsZUtleXNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmFibGU8Sz59IGdldFJhd0tleXNcbiAqIEBwYXJhbSB7KGs6IEspID0+IGJvb2xlYW59IGNoZWNrSGFzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0geyhrOiBLLCB2PzogVikgPT4gdm9pZH0gYXNzZXJ0T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydE9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7Q3VycmVudEtleXNLaXQ8SyxWPn1cbiAqLyRo4oCNX29uY2UuaXNDb3B5TWFwKGlzQ29weU1hcCk7XG5jb25zdCAgICAgICAgbWFrZUN1cnJlbnRLZXlzS2l0PShcbmdldFJhd0tleXMsXG5jaGVja0hhcyxcbmNvbXBhcmUsXG5hc3NlcnRPa1RvQWRkLFxuYXNzZXJ0T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5sZXQgdXBkYXRlQ291bnQ9MDtcbmxldCBzb3J0ZWRLZXlzTWVtbztcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25BZGQ9KGssdj11bmRlZmluZWQpPT57XG5hc3NlcnRPa1RvQWRkKGssdik7XG51cGRhdGVDb3VudCs9MTtcbnNvcnRlZEtleXNNZW1vPXVuZGVmaW5lZDtcbiB9O1xuXG5jb25zdCBhc3NlcnRVcGRhdGVPbkRlbGV0ZT0oayk9PmFzc2VydE9rVG9EZWxldGUmJmFzc2VydE9rVG9EZWxldGUoayk7XG5cbmNvbnN0IGdldFNvcnRlZEtleXM9KCk9PntcbmlmKHNvcnRlZEtleXNNZW1vPT09dW5kZWZpbmVkKXtcbnNvcnRlZEtleXNNZW1vPWhhcmRlbihbLi4uZ2V0UmF3S2V5cygpXS5zb3J0KGNvbXBhcmUpKTtcbiB9XG5yZXR1cm4gc29ydGVkS2V5c01lbW87XG4gfTtcblxuY29uc3QgaXRlcmFibGVLZXlzPUZhcignSXRlcmFibGUgb2Yga2V5cycse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGdlbmVyYXRpb249dXBkYXRlQ291bnQ7XG5nZXRTb3J0ZWRLZXlzKCk7XG5jb25zdCBsZW49c29ydGVkS2V5c01lbW8ubGVuZ3RoO1xubGV0IGk9MDtcbnJldHVybiBGYXIoJ0l0ZXJhdG9yIG9mIGtleXMnLHtcbm5leHQ6KCk9PntcbmdlbmVyYXRpb249PT11cGRhdGVDb3VudHx8RmFpbCBgU3RvcmUgJHtxKGtleU5hbWUpfSBjdXJzb3Igc3RhbGVgO1xuLyogSWYgdGhleSdyZSBlcXVhbCwgdGhlbiB0aGUgc29ydGVkS2V5TWVtbyBpcyB0aGUgc2FtZSBvbmUqL1xuLyogd2Ugc3RhcnRlZCB3aXRoLiovXG5mb3IoOzspe1xuaWYoaTxsZW4pe1xuY29uc3QgdmFsdWU9c29ydGVkS2V5c01lbW9baV07XG5pKz0xO1xuaWYoY2hlY2tIYXModmFsdWUpKXtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuaXRlcmFibGVLZXlzfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUN1cnJlbnRLZXlzS2l0KG1ha2VDdXJyZW50S2V5c0tpdCk7XG5oYXJkZW4obWFrZUN1cnJlbnRLZXlzS2l0KTtcblxuLyoqXG4gKiBDYWxsIGBwcm92aWRlTGF6eWAgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICogSWYgdGhlcmUgYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsXG4gKiBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzIHRoZSB2YWx1ZSBmb3JcbiAqIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssVj59IG1hcFN0b3JlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBWfSBtYWtlVmFsdWVcbiAqIEByZXR1cm5zIHtWfVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUxhenk9KG1hcFN0b3JlLGtleSxtYWtlVmFsdWUpPT57XG5pZighbWFwU3RvcmUuaGFzKGtleSkpe1xubWFwU3RvcmUuaW5pdChrZXksbWFrZVZhbHVlKGtleSkpO1xuIH1cbnJldHVybiBtYXBTdG9yZS5nZXQoa2V5KTtcbiB9OyRo4oCNX29uY2UucHJvdmlkZUxhenkocHJvdmlkZUxhenkpO1xuaGFyZGVuKHByb3ZpZGVMYXp5KTtcblxuLyoqXG4gKiBIZWxwZXIgZm9yIHVzZSBjYXNlcyBpbiB3aGljaCB0aGUgbWFrZXIgZnVuY3Rpb24gaXMgYXN5bmMuXG4gKiBGb3IgdHdvIHByb3ZpZGVMYXp5IGNhbGxzIHdpdGggdGhlIHNhbWUga2V5LCBvbmUgbWF5IGJlIG1ha2luZyB3aGVuIHRoZVxuICogb3RoZXIgY2FsbCBzdGFydHMgYW5kIGl0IHdvdWxkIG1ha2UgYWdhaW4uXG4gKiAoVGhlbiB0aGVyZSdkIGJlIGEgY29sbGlzaW9uIHdoZW4gdGhlIHNlY29uZCB0cmllcyB0byBzdG9yZVxuICogdGhlIGtleS4pIFRoaXMgcHJldmVudHMgdGhhdCByYWNlIGNvbmRpdGlvbiBieSBpbW1lZGlhdGVseSBzdG9yaW5nIGEgUHJvbWlzZVxuICogZm9yIHRoZSBtYWtlciBpbiBhbiBlcGhlbWVyYWwgc3RvcmUuXG4gKlxuICogV2hlbiB0aGUgYHN0b3JlYCBhcmd1bWVudCBpcyBkdXJhYmxlIHN0b3JhZ2UsIG5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvclxuICogdGVybWluYXRpb24gdG8gaGFwcGVuIGFmdGVyIHRoZSBtYWtlIGNvbXBsZXRlcyBhbmQgYmVmb3JlIGl0IHJlYWNoZXMgZHVyYWJsZVxuICogc3RvcmFnZS5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssIFY+fSBzdG9yZVxuICovXG5jb25zdCAgICAgICAgbWFrZUF0b21pY1Byb3ZpZGVyPShzdG9yZSk9Pntcbi8qKiBAdHlwZSB7TWFwPEssIFByb21pc2U8Vj4+fSAqL1xuY29uc3QgcGVuZGluZz1uZXcgTWFwKCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUFzeW5jYCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksXG4gKiB3aGVuIHRoZSBtYWtlciBpcyBhc3luY2hyb25vdXMuXG4gKiBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSxcbiAqIGNhbGwgYG1ha2VWYWx1ZShrZXkpYCwgcmVtZW1iZXIgaXQgYXMgdGhlIHZhbHVlIGZvclxuICogdGhhdCBrZXksIGFuZCByZXR1cm4gaXQuXG4gKlxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gUHJvbWlzZTxWPn0gbWFrZVZhbHVlIG1ha2UgdGhlIHZhbHVlIGZvciB0aGUgc3RvcmVcbiAqIGlmIGl0IGhhc24ndCBiZWVuIG1hZGUgeWV0IG9yIHRoZSBsYXN0IG1ha2UgZmFpbGVkXG4gKiBAcGFyYW0geyhrZXk6IEssIHZhbHVlOiBWKSA9PiBQcm9taXNlPHZvaWQ+fSBbZmluaXNoVmFsdWVdIHJ1bnMgZXhhY3RseVxuICogb25jZSBhZnRlciBhIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgc3RvcmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFY+fVxuICovXG5jb25zdCBwcm92aWRlQXN5bmM9KGtleSxtYWtlVmFsdWUsZmluaXNoVmFsdWUpPT57XG5pZihzdG9yZS5oYXMoa2V5KSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0b3JlLmdldChrZXkpKTtcbiB9XG5pZighcGVuZGluZy5oYXMoa2V5KSl7XG5jb25zdCB2YWxQPW1ha2VWYWx1ZShrZXkpLlxudGhlbigodik9PntcbnN0b3JlLmluaXQoa2V5LHYpO1xucmV0dXJuIHY7XG4gfSkuXG50aGVuKCh2KT0+e1xuaWYoZmluaXNoVmFsdWUpe1xucmV0dXJuIGZpbmlzaFZhbHVlKGtleSx2KS50aGVuKCgpPT52KTtcbiB9XG5yZXR1cm4gdjtcbiB9KS5cbmZpbmFsbHkoKCk9PntcbnBlbmRpbmcuZGVsZXRlKGtleSk7XG4gfSk7XG5wZW5kaW5nLnNldChrZXksdmFsUCk7XG4gfVxuY29uc3QgdmFsUD1wZW5kaW5nLmdldChrZXkpO1xuYXNzZXJ0KHZhbFApO1xucmV0dXJuIHZhbFA7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cHJvdmlkZUFzeW5jfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VBdG9taWNQcm92aWRlcihtYWtlQXRvbWljUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VBdG9taWNQcm92aWRlcik7XG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VBdG9taWNQcm92aWRlcjxLLCBWPj59IEF0b21pY1Byb3ZpZGVyPEssIFY+XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSywgVlxuICogQHBhcmFtIHtNYXBTdG9yZTxLLCBWW10+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7Vn0gaXRlbVxuICovXG5jb25zdCAgICAgICAgYXBwZW5kVG9TdG9yZWRBcnJheT0obWFwU3RvcmUsa2V5LGl0ZW0pPT57XG5pZihtYXBTdG9yZS5oYXMoa2V5KSl7XG5jb25zdCBleHRhbnQ9bWFwU3RvcmUuZ2V0KGtleSk7XG5tYXBTdG9yZS5zZXQoa2V5LGhhcmRlbihbLi4uZXh0YW50LGl0ZW1dKSk7XG4gfWVsc2V7XG5tYXBTdG9yZS5pbml0KGtleSxoYXJkZW4oW2l0ZW1dKSk7XG4gfVxuIH07JGjigI1fb25jZS5hcHBlbmRUb1N0b3JlZEFycmF5KGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xuaGFyZGVuKGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weVNldCI6WyJpc0NvcHlTZXQiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJtYWtlQ3VycmVudEtleXNLaXQiOlsibWFrZUN1cnJlbnRLZXlzS2l0Il0sInByb3ZpZGVMYXp5IjpbInByb3ZpZGVMYXp5Il0sIm1ha2VBdG9taWNQcm92aWRlciI6WyJtYWtlQXRvbWljUHJvdmlkZXIiXSwiYXBwZW5kVG9TdG9yZWRBcnJheSI6WyJhcHBlbmRUb1N0b3JlZEFycmF5Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMUArIJYKgAAWCoAACEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5VGFnZ2VkfSBDb3B5VGFnZ2VkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXInKS5SYW5rQ29tcGFyZX0gUmFua0NvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyJykuUmFua0NvbXBhcmlzb259IFJhbmtDb21wYXJpc29uICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cbi8qIFBsYWNlaG9sZGVyIHJlZHVuZGFudCB0eXBlcywgdG8gYmUgaW1wb3J0ZWQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWQuKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFzc2FibGV9IEtleVxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFzc2FibGV9IFBhdHRlcm5cbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV1cbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkICYge1xuICogICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogJ2NvcHlTZXQnLFxuICogICBwYXlsb2FkOiBBcnJheTxLPixcbiAqIH19IENvcHlTZXRcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV1cbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkICYge1xuICogICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogJ2NvcHlCYWcnLFxuICogICBwYXlsb2FkOiBBcnJheTxbSywgYmlnaW50XT4sXG4gKiB9fSBDb3B5QmFnXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVj1QYXNzYWJsZV1cbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkICYge1xuICogICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogJ2NvcHlNYXAnLFxuICogICBwYXlsb2FkOiB7IGtleXM6IEFycmF5PEs+LCB2YWx1ZXM6IEFycmF5PFY+IH0sXG4gKiB9fSBDb3B5TWFwXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEd1YXJkTWFrZXJzXG4gKiBAcHJvcGVydHkgezxNIGV4dGVuZHMgUmVjb3JkPGFueSwgYW55Pj4oaW50ZXJmYWNlTmFtZTogc3RyaW5nLFxuICogICAgICAgICAgICAgbWV0aG9kR3VhcmRzOiBNLFxuICogICAgICAgICAgICAgb3B0aW9ucz86IHtzbG9wcHk/OiBib29sZWFufVxuICogKSA9PiBJbnRlcmZhY2VHdWFyZH0gaW50ZXJmYWNlXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqXG4gKiBAcHJvcGVydHkgeyguLi5hcmdHdWFyZHM6IEFyZ0d1YXJkW10pID0+IE1ldGhvZEd1YXJkTWFrZXJ9IGNhbGwgR3VhcmQgYSBzeW5jaHJvbm91cyBjYWxsXG4gKlxuICogQHByb3BlcnR5IHsoLi4uYXJnR3VhcmRzOiBBcmdHdWFyZFtdKSA9PiBNZXRob2RHdWFyZE1ha2VyfSBjYWxsV2hlbiBHdWFyZCBhbiBhc3luYyBjYWxsXG4gKlxuICogQHByb3BlcnR5IHsoYXJnR3VhcmQ6IEFyZ0d1YXJkKSA9PiBBcmdHdWFyZH0gYXdhaXQgR3VhcmQgYW4gYXdhaXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gTWV0aG9kXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiBrbGFzczogJ0ludGVyZmFjZScsXG4gKiBpbnRlcmZhY2VOYW1lOiBzdHJpbmcsXG4gKiBtZXRob2RHdWFyZHM6IFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIE1ldGhvZEd1YXJkPlxuICogc2xvcHB5PzogYm9vbGVhblxuICogfX0gSW50ZXJmYWNlR3VhcmRcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2FueX0gTWV0aG9kR3VhcmRNYWtlclxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7eyBrbGFzczogJ21ldGhvZEd1YXJkJywgY2FsbEtpbmQ6ICdzeW5jJyB8ICdhc3luYycsIHJldHVybkd1YXJkOiB1bmtub3duIH19IE1ldGhvZEd1YXJkXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHthbnl9IEFyZ0d1YXJkXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVPcHRpb25zXG4gKiBPZiB0aGUgZGltZW5zaW9ucyBvbiB3aGljaCBLZXllZFN0b3JlcyBjYW4gZGlmZmVyLCB3ZSBvbmx5IHJlcHJlc2VudCBhIGZld1xuICogb2YgdGhlbSBhcyBzdGFuZGFyZCBvcHRpb25zLiBBIGdpdmVuIHN0b3JlIG1ha2VyIHNob3VsZCBkb2N1bWVudCB3aGljaFxuICogb3B0aW9ucyBpdCBzdXBwb3J0cywgYXMgd2VsbCBhcyBpdHMgcG9zaXRpb25zIG9uIGRpbWVuc2lvbnMgZm9yIHdoaWNoIGl0XG4gKiBkb2VzIG5vdCBzdXBwb3J0IG9wdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtsb25nTGl2ZWQ9dHJ1ZV0gV2hpY2ggd2F5IHRvIG9wdGltaXplIGEgd2VhayBzdG9yZS4gVHJ1ZSBtZWFuc1xuICogdGhhdCB3ZSBleHBlY3QgdGhpcyB3ZWFrIHN0b3JlIHRvIG91dGxpdmUgbW9zdCBvZiBpdHMga2V5cywgaW4gd2hpY2hcbiAqIGNhc2Ugd2UgaW50ZXJuYWxseSBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgV2Vha01hcGAuIE90aGVyd2lzZSB3ZSBpbnRlcm5hbGx5XG4gKiBtYXkgdXNlIGEgSmF2YVNjcmlwdCBgTWFwYC5cbiAqIERlZmF1bHRzIHRvIHRydWUsIHNvIHBsZWFzZSBtYXJrIHNob3J0IGxpdmVkIHN0b3JlcyBleHBsaWNpdGx5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZHVyYWJsZT1mYWxzZV0gIFRoZSBjb250ZW50cyBvZiB0aGlzIHN0b3JlIHN1cnZpdmUgdGVybWluYXRpb25cbiAqICAgb2YgaXRzIGNvbnRhaW5pbmcgcHJvY2VzcywgYWxsb3dpbmcgZm9yIHJlc3RhcnQgb3IgdXBncmFkZSBidXQgYXQgdGhlIGNvc3RcbiAqICAgb2YgZm9yYmlkZGluZyBzdG9yYWdlIG9mIHJlZmVyZW5jZXMgdG8gZXBoZW1lcmFsIGRhdGEuICBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Zha2VEdXJhYmxlPWZhbHNlXSAgVGhpcyBzdG9yZSBwcmV0ZW5kcyB0byBiZSBhIGR1cmFibGUgc3RvcmVcbiAqICAgYnV0IGRvZXMgbm90IGVuZm9yY2UgdGhhdCB0aGUgdGhpbmdzIHN0b3JlZCBpbiBpdCBhY3R1YWxseSBiZSB0aGVtc2VsdmVzXG4gKiAgIGR1cmFibGUgKHdoZXJlYXMgYW4gYWN0dWFsIGR1cmFibGUgc3RvcmUgd291bGQgZm9yYmlkIHN0b3JhZ2Ugb2Ygc3VjaFxuICogICBpdGVtcykuICBUaGlzIGlzIGluIHNlcnZpY2Ugb2YgYWxsb3dpbmcgaW5jcmVtZW50YWwgdHJhbnNpdGlvbiB0byB1c2Ugb2ZcbiAqICAgZHVyYWJsZSBzdG9yZXMsIHRvIGVuYWJsZSBub3JtYWwgb3BlcmF0aW9uIGFuZCB0ZXN0aW5nIHdoZW4gc29tZSBzdHVmZlxuICogICBpbnRlbmRlZCB0byBldmVudHVhbGx5IGJlIGR1cmFibGUgaGFzIG5vdCB5ZXQgYmVlbiBtYWRlIGR1cmFibGUuICBBIHN0b3JlXG4gKiAgIG1hcmtlZCBhcyBmYWtlRHVyYWJsZSB3aWxsIGFwcGVhciB0byBvcGVyYXRlIG5vcm1hbGx5IGJ1dCBhbnkgYXR0ZW1wdCB0b1xuICogICB1cGdyYWRlIGl0cyBjb250YWluaW5nIHZhdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvci5cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gW2tleVNoYXBlXVxuICogQHByb3BlcnR5IHtQYXR0ZXJufSBbdmFsdWVTaGFwZV1cbiAqL1xuXG4vKipcbiAqIE1vc3Qgc3RvcmUgbWV0aG9kcyBhcmUgaW4gb25lIG9mIHRocmVlIGNhdGVnb3JpZXNcbiAqICAgKiBsb29rdXAgbWV0aG9kcyAoYGhhc2AsYGdldGApXG4gKiAgICogdXBkYXRlIG1ldGhvZHMgKGBhZGRgLGBpbml0YCxgc2V0YCxgZGVsZXRlYCxgYWRkQWxsYClcbiAqICAgKiBxdWVyeSBtZXRob2RzIChgc25hcHNob3RgLGBrZXlzYCxgdmFsdWVzYCxgZW50cmllc2AsYGdldFNpemVgKVxuICogICAqIHF1ZXJ5LXVwZGF0ZSBtZXRob2RzIChgY2xlYXJgKVxuICpcbiAqIFdlYWtTdG9yZXMgaGF2ZSB0aGUgbG9va3VwIGFuZCB1cGRhdGUgbWV0aG9kcyBidXQgbm90IHRoZSBxdWVyeVxuICogb3IgcXVlcnktdXBkYXRlIG1ldGhvZHMuXG4gKiBOb24td2VhayBTdG9yZXMgYXJlIGxpa2UgdGhlaXIgY29ycmVzcG9uZGluZyBXZWFrU3RvcmVzLCBidXQgd2l0aCB0aGVcbiAqIGFkZGl0aW9uYWwgcXVlcnkgYW5kIHF1ZXJ5LXVwZGF0ZSBtZXRob2RzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXkgJiBvYmplY3R9IFtLPUtleV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYWtTZXRTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBhZGRcbiAqIEFkZCB0aGUga2V5IHRvIHRoZSBzZXQgaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUuIERvIG5vdGhpbmcgc2lsZW50bHkgaWZcbiAqIGFscmVhZHkgdGhlcmUuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXlzOiBDb3B5U2V0PEs+IHwgSXRlcmFibGU8Sz4pID0+IHZvaWR9IGFkZEFsbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNldFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGFkZFxuICogQWRkIHRoZSBrZXkgdG8gdGhlIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4gRG8gbm90aGluZyBzaWxlbnRseSBpZlxuICogYWxyZWFkeSB0aGVyZS5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXM6IENvcHlTZXQ8Sz4gfCBJdGVyYWJsZTxLPikgPT4gdm9pZH0gYWRkQWxsXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gQ29weVNldDxLPn0gc25hcHNob3RcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBudW1iZXJ9IGdldFNpemVcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiB2b2lkfSBjbGVhclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXkgJiBvYmplY3R9IFtLPUtleV1cbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFtWPVBhc3NhYmxlXVxuICogQHR5cGVkZWYge29iamVjdH0gV2Vha01hcFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoZW50cmllczogQ29weU1hcDxLLFY+IHwgSXRlcmFibGU8W0ssVl0+KSA9PiB2b2lkfSBhZGRBbGxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVj1QYXNzYWJsZV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hcFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgbWFwXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoZW50cmllczogQ29weU1hcDxLLFY+IHwgSXRlcmFibGU8W0ssVl0+KSA9PiB2b2lkfSBhZGRBbGxcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPFY+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBrZXlQYXR0PzogUGF0dGVybixcbiAqICAgdmFsdWVQYXR0PzogUGF0dGVyblxuICogKSA9PiBJdGVyYWJsZTxbSyxWXT59IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBDb3B5TWFwPEssVj59IHNuYXBzaG90XG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gdm9pZH0gY2xlYXJcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIERlcHJlY2F0ZWQgTGVnYWN5IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5V2Vha01hcFxuICogTGVnYWN5V2Vha01hcCBpcyBkZXByZWNhdGVkLiBVc2UgV2Vha01hcFN0b3JlIGluc3RlYWQgaWYgcG9zc2libGUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdFxuICogZG9lc24ndCBhbHJlYWR5IGV4aXN0XG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gTGVnYWN5TWFwXG4gKiBMZWdhY3lNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIE1hcFN0b3JlIGluc3RlYWQgaWYgcG9zc2libGUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdFxuICogZG9lc24ndCBhbHJlYWR5IGV4aXN0XG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxWPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeygpID0+IEl0ZXJhYmxlPFtLLFZdPn0gZW50cmllc1xuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGdldFNpemVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gY2xlYXJcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA1HHBQ+xsAAPsbAAAxAAAAQGFnb3JpYy9zd2luZ3NldC12YXQtdjAuMzIuMi9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuQnVuZGxlRm9ybWF0IH0gQnVuZGxlRm9ybWF0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DYXBEYXRhPHN0cmluZz4gfSBTd2luZ1NldENhcERhdGFcbiAqL1xuXG4vKiogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuQnVuZGxlSUQgfSBCdW5kbGVJRCAqL1xuLyoqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLkJ1bmRsZUNhcCB9IEJ1bmRsZUNhcCAqL1xuLyoqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLkVuZG9aaXBCYXNlNjRCdW5kbGUgfSBFbmRvWmlwQmFzZTY0QnVuZGxlICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuR2V0RXhwb3J0QnVuZGxlIH0gR2V0RXhwb3J0QnVuZGxlXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5OZXN0ZWRFdmFsdWF0ZUJ1bmRsZSB9IE5lc3RlZEV2YWx1YXRlQnVuZGxlXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5CdW5kbGUgfSBCdW5kbGVcbiAqXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5NYW5hZ2VyVHlwZSB9IE1hbmFnZXJUeXBlXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5LZXJuZWxPcHRpb25zIH0gS2VybmVsT3B0aW9uc1xuICovXG5cbi8qKlxuICogU2VlIC4uL2RvY3Mvc3RhdGljLXZhdHMubWQjdmF0cG93ZXJzXG4gKlxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuVmF0UG93ZXJzIH0gVmF0UG93ZXJzXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5TdGF0aWNWYXRQb3dlcnMgfSBTdGF0aWNWYXRQb3dlcnNcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLk1ldGVyaW5nVmF0UG93ZXJzIH0gTWV0ZXJpbmdWYXRQb3dlcnNcbiAqXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5UZXJtaW5hdGlvblZhdFBvd2VycyB9IFRlcm1pbmF0aW9uVmF0UG93ZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5NZXNzYWdlIH0gTWVzc2FnZVxuICpcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLlJlc29sdXRpb25Qb2xpY3kgfSBSZXNvbHV0aW9uUG9saWN5XG4gKlxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuS2VybmVsRGVsaXZlcnlNZXNzYWdlIH0gS2VybmVsRGVsaXZlcnlNZXNzYWdlXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5LZXJuZWxEZWxpdmVyeU9uZU5vdGlmeSB9IEtlcm5lbERlbGl2ZXJ5T25lTm90aWZ5XG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5LZXJuZWxEZWxpdmVyeU5vdGlmeSB9IEtlcm5lbERlbGl2ZXJ5Tm90aWZ5XG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5LZXJuZWxEZWxpdmVyeURyb3BFeHBvcnRzIH0gS2VybmVsRGVsaXZlcnlEcm9wRXhwb3J0c1xuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuS2VybmVsRGVsaXZlcnlSZXRpcmVFeHBvcnRzIH0gS2VybmVsRGVsaXZlcnlSZXRpcmVFeHBvcnRzXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5LZXJuZWxEZWxpdmVyeVJldGlyZUltcG9ydHMgfSBLZXJuZWxEZWxpdmVyeVJldGlyZUltcG9ydHNcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLktlcm5lbERlbGl2ZXJ5U3RhcnRWYXQgfSBLZXJuZWxEZWxpdmVyeVN0YXJ0VmF0XG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5LZXJuZWxEZWxpdmVyeUNoYW5nZVZhdE9wdGlvbnMgfSBLZXJuZWxEZWxpdmVyeUNoYW5nZVZhdE9wdGlvbnNcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLktlcm5lbERlbGl2ZXJ5QnJpbmdPdXRZb3VyRGVhZCB9IEtlcm5lbERlbGl2ZXJ5QnJpbmdPdXRZb3VyRGVhZFxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuS2VybmVsRGVsaXZlcnlPYmplY3QgfSBLZXJuZWxEZWxpdmVyeU9iamVjdFxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuS2VybmVsU3lzY2FsbFNlbmQgfSBLZXJuZWxTeXNjYWxsU2VuZFxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuS2VybmVsU3lzY2FsbEludm9rZSB9IEtlcm5lbFN5c2NhbGxJbnZva2VcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLktlcm5lbFN5c2NhbGxTdWJzY3JpYmUgfSBLZXJuZWxTeXNjYWxsU3Vic2NyaWJlXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5LZXJuZWxPbmVSZXNvbHV0aW9uIH0gS2VybmVsT25lUmVzb2x1dGlvblxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuS2VybmVsU3lzY2FsbFJlc29sdmUgfSBLZXJuZWxTeXNjYWxsUmVzb2x2ZVxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuS2VybmVsU3lzY2FsbEV4aXQgfSBLZXJuZWxTeXNjYWxsRXhpdFxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuS2VybmVsU3lzY2FsbFZhdHN0b3JlR2V0IH0gS2VybmVsU3lzY2FsbFZhdHN0b3JlR2V0XG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5LZXJuZWxTeXNjYWxsVmF0c3RvcmVHZXROZXh0S2V5IH0gS2VybmVsU3lzY2FsbFZhdHN0b3JlR2V0TmV4dEtleVxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuS2VybmVsU3lzY2FsbFZhdHN0b3JlU2V0IH0gS2VybmVsU3lzY2FsbFZhdHN0b3JlU2V0XG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5LZXJuZWxTeXNjYWxsVmF0c3RvcmVEZWxldGUgfSBLZXJuZWxTeXNjYWxsVmF0c3RvcmVEZWxldGVcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLktlcm5lbFN5c2NhbGxEcm9wSW1wb3J0cyB9IEtlcm5lbFN5c2NhbGxEcm9wSW1wb3J0c1xuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuS2VybmVsU3lzY2FsbFJldGlyZUltcG9ydHMgfSBLZXJuZWxTeXNjYWxsUmV0aXJlSW1wb3J0c1xuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuS2VybmVsU3lzY2FsbFJldGlyZUV4cG9ydHMgfSBLZXJuZWxTeXNjYWxsUmV0aXJlRXhwb3J0c1xuICpcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLktlcm5lbFN5c2NhbGxPYmplY3QgfSBLZXJuZWxTeXNjYWxsT2JqZWN0XG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5LZXJuZWxTeXNjYWxsUmVzdWx0T2sgfSBLZXJuZWxTeXNjYWxsUmVzdWx0T2tcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLktlcm5lbFN5c2NhbGxSZXN1bHRFcnJvciB9IEtlcm5lbFN5c2NhbGxSZXN1bHRFcnJvclxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuS2VybmVsU3lzY2FsbFJlc3VsdCB9IEtlcm5lbFN5c2NhbGxSZXN1bHRcbiAqXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5EZXZpY2VJbnZvY2F0aW9uIH0gRGV2aWNlSW52b2NhdGlvblxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuRGV2aWNlSW52b2NhdGlvblJlc3VsdE9rIH0gRGV2aWNlSW52b2NhdGlvblJlc3VsdE9rXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5EZXZpY2VJbnZvY2F0aW9uUmVzdWx0RXJyb3IgfSBEZXZpY2VJbnZvY2F0aW9uUmVzdWx0RXJyb3JcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLkRldmljZUludm9jYXRpb25SZXN1bHQgfSBEZXZpY2VJbnZvY2F0aW9uUmVzdWx0XG4gKlxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuVmF0U3RhdHMgfSBWYXRTdGF0c1xuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuVmF0S2VlcGVyIH0gVmF0S2VlcGVyXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5LZXJuZWxLZWVwZXIgfSBLZXJuZWxLZWVwZXJcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLlhTbmFwIH0gWFNuYXBcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLlNsb2dGaW5pc2hEZWxpdmVyeSB9IFNsb2dGaW5pc2hEZWxpdmVyeVxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuU2xvZ0ZpbmlzaFN5c2NhbGwgfSBTbG9nRmluaXNoU3lzY2FsbFxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuS2VybmVsU2xvZyB9IEtlcm5lbFNsb2dcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLlZhdFNsb2cgfSBWYXRTbG9nXG4gKlxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuU25hcFN0b3JlIH0gU25hcFN0b3JlXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5TbmFwc2hvdFJlc3VsdCB9IFNuYXBzaG90UmVzdWx0XG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5XYWl0VW50aWxRdWllc2NlbnQgfSBXYWl0VW50aWxRdWllc2NlbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLlNvdXJjZVNwZWMgfSBTb3VyY2VTcGVjXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5CdW5kbGVTcGVjIH0gQnVuZGxlU3BlY1xuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuQnVuZGxlUmVmIH0gQnVuZGxlUmVmXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5Td2luZ1NldENvbmZpZ1Byb3BlcnRpZXMgfSBTd2luZ1NldENvbmZpZ1Byb3BlcnRpZXNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLlN3aW5nU2V0Q29uZmlnRGVzY3JpcHRvciB9IFN3aW5nU2V0Q29uZmlnRGVzY3JpcHRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuU3dpbmdTZXRDb25maWcgfSBTd2luZ1NldENvbmZpZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuU3dpbmdTZXRLZXJuZWxDb25maWcgfSBTd2luZ1NldEtlcm5lbENvbmZpZ1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuU291cmNlT2ZCdW5kbGUgfSBTb3VyY2VPZkJ1bmRsZVxuICovXG4vKipcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnQGFnb3JpYy9zd2luZy1zdG9yZScpLktWU3RvcmUgfSBLVlN0b3JlXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmctc3RvcmUnKS5UcmFuc2NyaXB0U3RvcmUgfSBUcmFuc2NyaXB0U3RvcmVcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnQGFnb3JpYy9zd2luZy1zdG9yZScpLlN3aW5nU3RvcmUgfSBTd2luZ1N0b3JlXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmctc3RvcmUnKS5Td2luZ1N0b3JlS2VybmVsU3RvcmFnZSB9IFN3aW5nU3RvcmVLZXJuZWxTdG9yYWdlXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmctc3RvcmUnKS5Td2luZ1N0b3JlSG9zdFN0b3JhZ2UgfSBTd2luZ1N0b3JlSG9zdFN0b3JhZ2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgWGltcG9ydCgnLi90eXBlcy1leHRlcm5hbC5qcycpLlBvbGljeUlucHV0Tm9uZSB9IFBvbGljeUlucHV0Tm9uZVxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuUG9saWN5SW5wdXRDcmVhdGVWYXQgfSBQb2xpY3lJbnB1dENyZWF0ZVZhdFxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuUG9saWN5SW5wdXRDcmFua0NvbXBsZXRlIH0gUG9saWN5SW5wdXRDcmFua0NvbXBsZXRlXG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5Qb2xpY3lJbnB1dENyYW5rRmFpbGVkIH0gUG9saWN5SW5wdXRDcmFua0ZhaWxlZFxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuUG9saWN5SW5wdXQgfSBQb2xpY3lJbnB1dFxuICogQHR5cGVkZWYgeyBYaW1wb3J0KCcuL3R5cGVzLWV4dGVybmFsLmpzJykuUG9saWN5T3V0cHV0IH0gUG9saWN5T3V0cHV0XG4gKiBAdHlwZWRlZiB7IFhpbXBvcnQoJy4vdHlwZXMtZXh0ZXJuYWwuanMnKS5SdW5Qb2xpY3kgfSBSdW5Qb2xpY3lcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAhmCHYvwEAAL8BAAAcAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90aW1lTWF0aC5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy90aW1lTWF0aC5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90aW1lTWF0aC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwEA35qgiAACoIgAAIwAAAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3RpbWVNYXRoLmpzeyJpbXBvcnRzIjpbIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJUaW1lTWF0aCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtdXN0TWF0Y2gsTmF0LFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLFRpbWVzdGFtcFJlY29yZFNoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUgPSAkaOKAjV9hKV1dLFtcIlRpbWVzdGFtcFJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lc3RhbXBSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuVGltZXJCcmFuZH0gVGltZXJCcmFuZFxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5UaW1lc3RhbXB9IFRpbWVzdGFtcFxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5SZWxhdGl2ZVRpbWV9IFJlbGF0aXZlVGltZVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5SZWxhdGl2ZVRpbWVWYWx1ZX0gUmVsYXRpdmVUaW1lVmFsdWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuVGltZXN0YW1wVmFsdWV9IFRpbWVzdGFtcFZhbHVlXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVNYXRoVHlwZX0gVGltZU1hdGhUeXBlXG4gKlxuICovXG5cbi8qKlxuICogYGFncmVlZFRpbWVyQnJhbmRgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLlxuICpcbiAqIEBwYXJhbSB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH0gbGVmdEJyYW5kXG4gKiBAcGFyYW0ge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9IHJpZ2h0QnJhbmRcbiAqIEByZXR1cm5zIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBhZ3JlZWRUaW1lckJyYW5kPShsZWZ0QnJhbmQscmlnaHRCcmFuZCk9PntcbmlmKGxlZnRCcmFuZD09PXVuZGVmaW5lZCl7XG5pZihyaWdodEJyYW5kPT09dW5kZWZpbmVkKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfWVsc2V7XG5yZXR1cm4gcmlnaHRCcmFuZDtcbiB9XG4gfWVsc2UgaWYocmlnaHRCcmFuZD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gbGVmdEJyYW5kO1xuIH1lbHNle1xubGVmdEJyYW5kPT09cmlnaHRCcmFuZHx8XG5GYWlsIGBUaW1lckJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdEJyYW5kKX0gdnMgJHtxKHJpZ2h0QnJhbmQpfWA7XG5yZXR1cm4gbGVmdEJyYW5kO1xuIH1cbiB9O1xuXG4vKipcbiAqIGBzaGFyZWRUaW1lckJyYW5kYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIGltcGxlbWVudHMgdGhlXG4gKiB0cmFuc2l0aW9uYWwgYnJhbmQgY2hlY2tpbmcgYW5kIGNvbnRhaWdpb24gbG9naWMgZXhwbGFpbmVkIGluIHRoZSBgVGltZU1hdGhgXG4gKiBjb21tZW50LiBJdCBpcyB1c2VkIHRvIGRlZmluZSB0aGUgYmluYXJ5IG9wZXJhdG9ycyB0aGF0IHNob3VsZCBmb2xsb3dcbiAqIHRoaXMgbG9naWMuIEl0IGRvZXMgdGhlIGVycm9yIGNoZWNraW5nIGJldHdlZW4gdGhlIG9wZXJhbmRzLCBhbmQgcmV0dXJuc1xuICogdGhlIGJyYW5kLCBpZiBhbnksIHRoYXQgc2hvdWxkIGxhYmVsIHRoZSByZXN1bHRpbmcgdGltZSB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcmV0dXJucyB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3Qgc2hhcmVkVGltZXJCcmFuZD0obGVmdCxyaWdodCk9PntcbmNvbnN0IGxlZnRCcmFuZD10eXBlb2YgbGVmdD09PSdiaWdpbnQnP3VuZGVmaW5lZDpsZWZ0LnRpbWVyQnJhbmQ7XG5jb25zdCByaWdodEJyYW5kPXR5cGVvZiByaWdodD09PSdiaWdpbnQnP3VuZGVmaW5lZDpyaWdodC50aW1lckJyYW5kO1xucmV0dXJuIGFncmVlZFRpbWVyQnJhbmQobGVmdEJyYW5kLHJpZ2h0QnJhbmQpO1xuIH07XG5cbi8qKlxuICogYGFic0xpa2VgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGJpbmFyeVxuICogb3BlcmF0b3JzIGluIHRoZSBjYXNlIHdoZXJlIHRoZSByZXR1cm5lZCB0aW1lIHNob3VsZCBiZSBhIGBUaW1lc3RhbXBgXG4gKiByYXRoZXIgdGhhbiBhIGBSZWxhdGl2ZVRpbWVgLlxuICpcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSBsZWZ0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gcmlnaHRcbiAqIEBwYXJhbSB7VGltZXN0YW1wVmFsdWV9IGFic1ZhbHVlXG4gKiBAcmV0dXJucyB7VGltZXN0YW1wfVxuICovXG5jb25zdCBhYnNMaWtlPShsZWZ0LHJpZ2h0LGFic1ZhbHVlKT0+e1xuTmF0KGFic1ZhbHVlKTtcbmNvbnN0IHRpbWVyQnJhbmQ9c2hhcmVkVGltZXJCcmFuZChsZWZ0LHJpZ2h0KTtcbmlmKHRpbWVyQnJhbmQpe1xucmV0dXJuIGhhcmRlbih7XG50aW1lckJyYW5kLFxuYWJzVmFsdWV9KTtcblxuIH1lbHNle1xucmV0dXJuIGFic1ZhbHVlO1xuIH1cbiB9O1xuXG4vKipcbiAqIGByZWxMaWtlYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnlcbiAqIG9wZXJhdG9ycyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgYSBgUmVsYXRpdmVUaW1lYFxuICogcmF0aGVyIHRoYW4gYSBgVGltZXN0YW1wYC5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge1JlbGF0aXZlVGltZVZhbHVlfSByZWxWYWx1ZVxuICogQHJldHVybnMge1JlbGF0aXZlVGltZX1cbiAqL1xuY29uc3QgcmVsTGlrZT0obGVmdCxyaWdodCxyZWxWYWx1ZSk9Pntcbk5hdChyZWxWYWx1ZSk7XG5jb25zdCB0aW1lckJyYW5kPXNoYXJlZFRpbWVyQnJhbmQobGVmdCxyaWdodCk7XG5pZih0aW1lckJyYW5kKXtcbnJldHVybiBoYXJkZW4oe1xudGltZXJCcmFuZCxcbnJlbFZhbHVlfSk7XG5cbiB9ZWxzZXtcbnJldHVybiByZWxWYWx1ZTtcbiB9XG4gfTtcblxuLyogRm9yIGFsbCB0aGUgZm9sbG93aW5nIHRpbWUgb3BlcmF0b3JzLCB0aGVpciBkb2N1bWVudGF0aW9uIGlzIGluKi9cbi8qIHRoZSBgVGltZU1hdGhUeXBlYCwgc2luY2UgdGhhdCBpcyB0aGUgZG9jdW1lbnRhdGlvbiB0aGF0IHNob3dzIHVwKi9cbi8qIGluIHRoZSBJREUuIFdlbGwsIGF0IGxlYXN0IHRoZSB2c2NvZGUgSURFLiovXG5cbmNvbnN0IGFic1ZhbHVlPShhYnMpPT57XG5pZih0eXBlb2YgYWJzPT09J2JpZ2ludCcpe1xucmV0dXJuIE5hdChhYnMpO1xuIH1cbm11c3RNYXRjaChhYnMsVGltZXN0YW1wUmVjb3JkU2hhcGUsJ3RpbWVzdGFtcCcpO1xucmV0dXJuIE5hdChhYnMuYWJzVmFsdWUpO1xuIH07XG5cbmNvbnN0IHJlbFZhbHVlPShyZWwpPT57XG5pZih0eXBlb2YgcmVsPT09J2JpZ2ludCcpe1xucmV0dXJuIE5hdChyZWwpO1xuIH1cbm11c3RNYXRjaChyZWwsUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsJ3JlbGF0aXZlJyk7XG5yZXR1cm4gTmF0KHJlbC5yZWxWYWx1ZSk7XG4gfTtcblxuY29uc3QgbWFrZVRpbWVzdGFtcFJlY29yZD0oYWJzLHRpbWVyQnJhbmQpPT5cbmhhcmRlbih7YWJzVmFsdWU6YWJzLHRpbWVyQnJhbmR9KTtcbmNvbnN0IG1ha2VSZWxhdGl2ZVRpbWVSZWNvcmQ9KHJlbCx0aW1lckJyYW5kKT0+XG5oYXJkZW4oe3JlbFZhbHVlOnJlbCx0aW1lckJyYW5kfSk7XG5cbmNvbnN0IGNvZXJjZVRpbWVzdGFtcFJlY29yZD0odHMsYnJhbmQpPT57XG5icmFuZHx8RmFpbCBgbXVzdCBoYXZlIGEgYnJhbmRgO1xuaWYodHlwZW9mIHRzPT09J251bWJlcicpe1xudHM9TmF0KHRzKTtcbiB9XG5pZih0eXBlb2YgdHM9PT0nYmlnaW50Jyl7XG5yZXR1cm4gbWFrZVRpbWVzdGFtcFJlY29yZCh0cyxicmFuZCk7XG4gfWVsc2V7XG5jb25zdHt0aW1lckJyYW5kfT10cztcbm11c3RNYXRjaCh0cyxUaW1lc3RhbXBSZWNvcmRTaGFwZSwndGltZXN0YW1wJyk7XG5hZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsYnJhbmQpO1xucmV0dXJuIHRzO1xuIH1cbiB9O1xuXG5jb25zdCBjb2VyY2VSZWxhdGl2ZVRpbWVSZWNvcmQ9KHJ0LGJyYW5kKT0+e1xuYnJhbmR8fEZhaWwgYG11c3QgaGF2ZSBhIGJyYW5kYDtcbmlmKHR5cGVvZiBydD09PSdudW1iZXInKXtcbnJ0PU5hdChydCk7XG4gfVxuaWYodHlwZW9mIHJ0PT09J2JpZ2ludCcpe1xucmV0dXJuIG1ha2VSZWxhdGl2ZVRpbWVSZWNvcmQocnQsYnJhbmQpO1xuIH1lbHNle1xuY29uc3R7dGltZXJCcmFuZH09cnQ7XG5tdXN0TWF0Y2gocnQsUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsJ3JlbGF0aXZlVGltZScpO1xuYWdyZWVkVGltZXJCcmFuZCh0aW1lckJyYW5kLGJyYW5kKTtcbnJldHVybiBydDtcbiB9XG4gfTtcblxuY29uc3QgYWRkQWJzUmVsPShhYnMscmVsKT0+XG5hYnNMaWtlKGFicyxyZWwsYWJzVmFsdWUoYWJzKStyZWxWYWx1ZShyZWwpKTtcblxuY29uc3QgYWRkUmVsUmVsPShyZWwxLHJlbDIpPT5cbnJlbExpa2UocmVsMSxyZWwyLHJlbFZhbHVlKHJlbDEpK3JlbFZhbHVlKHJlbDIpKTtcblxuY29uc3Qgc3VidHJhY3RBYnNBYnM9KGFiczEsYWJzMik9PlxucmVsTGlrZShhYnMxLGFiczIsYWJzVmFsdWUoYWJzMSktYWJzVmFsdWUoYWJzMikpO1xuXG5jb25zdCBjbGFtcGVkU3VidHJhY3RBYnNBYnM9KGFiczEsYWJzMik9PntcbmNvbnN0IHZhbDE9YWJzVmFsdWUoYWJzMSk7XG5jb25zdCB2YWwyPWFic1ZhbHVlKGFiczIpO1xucmV0dXJuIHJlbExpa2UoYWJzMSxhYnMyLHZhbDE+dmFsMj92YWwxLXZhbDI6MG4pO1xuIH07XG5cbmNvbnN0IHN1YnRyYWN0QWJzUmVsPShhYnMscmVsKT0+XG5hYnNMaWtlKGFicyxyZWwsYWJzVmFsdWUoYWJzKS1yZWxWYWx1ZShyZWwpKTtcblxuY29uc3Qgc3VidHJhY3RSZWxSZWw9KHJlbDEscmVsMik9PlxucmVsTGlrZShyZWwxLHJlbDIscmVsVmFsdWUocmVsMSktcmVsVmFsdWUocmVsMikpO1xuXG5jb25zdCBpc1JlbFplcm89KHJlbCk9PnJlbFZhbHVlKHJlbCk9PT0wbjtcblxuY29uc3QgbXVsdGlwbHlSZWxOYXQ9KHJlbCxuYXQpPT5yZWxMaWtlKHJlbCxuYXQscmVsVmFsdWUocmVsKSpuYXQpO1xuXG5jb25zdCBkaXZpZGVSZWxOYXQ9KHJlbCxuYXQpPT5yZWxMaWtlKHJlbCxuYXQscmVsVmFsdWUocmVsKS9uYXQpO1xuXG5jb25zdCBkaXZpZGVSZWxSZWw9KHJlbDEscmVsMik9PntcbnNoYXJlZFRpbWVyQnJhbmQocmVsMSxyZWwyKTsvKiBqdXN0IGVycm9yIGNoZWNrKi9cbnJldHVybiByZWxWYWx1ZShyZWwxKS9yZWxWYWx1ZShyZWwyKTtcbiB9O1xuXG5jb25zdCBtb2RBYnNSZWw9KGFicyxzdGVwKT0+XG5yZWxMaWtlKGFicyxzdGVwLGFic1ZhbHVlKGFicyklcmVsVmFsdWUoc3RlcCkpO1xuXG5jb25zdCBtb2RSZWxSZWw9KHJlbCxzdGVwKT0+XG5yZWxMaWtlKHJlbCxzdGVwLHJlbFZhbHVlKHJlbCklcmVsVmFsdWUoc3RlcCkpO1xuXG4vKipcbiAqIGBjb21wYXJlVmFsdWVzYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50XG4gKiB0aGUgdGltZSBjb21wYXJpc29uIG9wZXJhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge2JpZ2ludH0gdjFcbiAqIEBwYXJhbSB7YmlnaW50fSB2MlxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG5jb25zdCBjb21wYXJlVmFsdWVzPShsZWZ0LHJpZ2h0LHYxLHYyKT0+e1xuc2hhcmVkVGltZXJCcmFuZChsZWZ0LHJpZ2h0KTtcbmlmKHYxPHYyKXtcbnJldHVybi0xO1xuIH1lbHNlIGlmKHYxPT09djIpe1xucmV0dXJuIDA7XG4gfWVsc2V7XG5hc3NlcnQodjE+djIpO1xucmV0dXJuIDE7XG4gfVxuIH07XG5cbi8qKlxuICogVGhlIGBUaW1lTWF0aGAgb2JqZWN0IHByb3ZpZGVzIGhlbHBlciBtZXRob2RzIHRvIGRvIGFyaXRobWV0aWMgb24gbGFiZWxlZFxuICogdGltZSB2YWx1ZXMsIG11Y2ggbGlrZSBgQW1vdW50TWF0aGAgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdG8gZG8gYXJpdGhtZXRpY1xuICogb24gbGFiZWxlZCBhc3NldC9tb25leSB2YWx1ZXMuIEJvdGggY2hlY2sgZm9yIGNvbnNpc3RlbmN5IG9mIGxhYmVsczogYVxuICogYmluYXJ5IG9wZXJhdGlvbiBvbiB0d28gbGFiZWxlZCBvYmplY3RzIGVuc3VyZXMgdGhhdCB0aGUgYm90aCBjYXJyeVxuICogdGhlIHNhbWUgbGFiZWwuIElmIHRoZXkgcHJvZHVjZSBhbm90aGVyIG9iamVjdCBmcm9tIHRoZSBzYW1lIGRvbWFpbiwgaXRcbiAqIHdpbGwgY2FycnkgdGhlIHNhbWUgbGFiZWwuIElmIHRoZSBvcGVyYW5kcyBoYXZlIGluY29tcGF0aWJsZSBsYWJlbHMsXG4gKiBhbiBlcnJvciBpcyB0aHJvd24uXG4gKlxuICogVW5saWtlIGFtb3VudCBhcml0aG1ldGljLCB0aW1lIGFyaXRobWV0aWMgZGVhbHMgaW4gdHdvIGtpbmRzIG9mIHRpbWUgb2JqZWN0czpcbiAqIFRpbWVzdGFtcHMsIHdoaWNoIHJlcHJlc2VudCBhYnNvbHV0ZSB0aW1lLCBhbmQgUmVsYXRpdmVUaW1lLCB3aGljaCByZXByZXNlbnRzXG4gKiB0aGUgZHVyYXRpb24gYmV0d2VlbiB0d28gYWJzb2x1dGUgdGltZXMuIEJvdGgga2luZHMgb2YgdGltZSBvYmplY3RcbiAqIGFyZSBsYWJlbGVkIGJ5IGEgYFRpbWVyQnJhbmRgLiBGb3IgYSBUaW1lc3RhbXAgb2JqZWN0LCB0aGUgdmFsdWUgaXNcbiAqIGEgYmlnaW50IGluIGFuIGBhYnNWYWx1ZWAgcHJvcGVydHkuIEZvciBhIFJlbGF0aXZlVGltZSBvYmplY3QsIHRoZSB2YWx1ZVxuICogaXMgYSBiaWdpbnQgaW4gYSBgcmVsVmFsdWVgIHByb3BlcnR5LiBUaHVzIHdlIGhhdmUgYSBydW50aW1lIHNhZmV0eSBjaGVja1xuICogdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgY29uZnVzZWQgdGhlIHR3bywgZXZlbiBpZiB3ZSBoYXZlIG1hbmFnZWQgdG8gZm9vbFxuICogdGhlICh1bnNvdW5kKSBzdGF0aWMgdHlwZSBzeXN0ZW0uXG4gKlxuICogQXMgYSB0cmFuc2l0aW9uYWwgbWVhc3VyZSwgY3VycmVudGx5IG1hbnkgVGltZXN0YW1wcyBhbmQgUmVsYXRpdmVUaW1lcyBhcmVcbiAqIHN0aWxsIHJlcHJlc2VudGVkIGJ5IHVubGFiZWxlZCBiaWdpbnRzLiBEdXJpbmcgdGhpcyB0cmFuc2l0aW9uYWwgcGVyaW9kLFxuICogd2UgYWxsb3cgdGhpcywgYm90aCBzdGF0aWNhbGx5IGFuZCBkeW5hbWljYWxseS4gRm9yIGEgbm9ybWFsIGJpbmFyeVxuICogb3BlcmF0aW9uLCBpZiBib3RoIGlucHV0cyBhcmUgbGFiZWxlZCwgdGhlbiB3ZSBkbyB0aGUgZnVsbCBjaGVja2luZyBhc1xuICogZXhwbGFpbmVkIGFib3ZlIGFuZCByZXR1cm4gYSBsYWJlbGVkIHJlc3VsdC4gSWYgYm90aCBpbnB1dHMgYXJlIHVubGFiZWxlZFxuICogYmlnaW50cywgd2UgKmFzc3VtZSogdGhhdCB0aGV5IGluZGljYXRlIGEgdGltZSBvZiB0aGUgcmlnaHQga2luZFxuICogKFRpbWVzdGFtcCB2cyBSZWxhdGl2ZVRpbWUpIGFuZCB0aW1lciBicmFuZC4gU2luY2Ugd2UgZG9uJ3Qga25vdyB3aGF0XG4gKiBicmFuZCB3YXMgaW50ZW5kZWQsIHdlIGNhbiBvbmx5IHJldHVybiB5ZXQgYW5vdGhlciB1bmxhYmVsZWQgYmlnaW50LlxuICpcbiAqIElmIG9uZSBvcGVyYW5kIGlzIGxhYmVsZWQgYW5kIHRoZSBvdGhlciBpcyBub3QsIHdlIGNoZWNrIHRoZSBsYWJlbGVkIG9wZXJhbmQsXG4gKiAqYXNzdW1lKiB0aGUgdW5sYWJlbGVkIGJpZ2ludCByZXByZXNlbnRzIHRoZSB2YWx1ZSBuZWVkZWQgZm9yIHRoZSBvdGhlclxuICogb3BlcmFuZCwgYW5kIHJldHVybiBhIGxhYmVsZWQgdGltZSBvYmplY3Qgd2l0aCB0aGUgYnJhbmQgb2YgdGhlIGxhYmVsZWRcbiAqIG9wZXJhbmQuXG4gKlxuICogQHR5cGUge1RpbWVNYXRoVHlwZX1cbiAqL1xuY29uc3QgICAgICAgIFRpbWVNYXRoPWhhcmRlbih7XG5hYnNWYWx1ZSxcbnJlbFZhbHVlLFxuY29lcmNlVGltZXN0YW1wUmVjb3JkLFxuY29lcmNlUmVsYXRpdmVUaW1lUmVjb3JkLFxuYWRkQWJzUmVsLFxuYWRkUmVsUmVsLFxuc3VidHJhY3RBYnNBYnMsXG5jbGFtcGVkU3VidHJhY3RBYnNBYnMsXG5zdWJ0cmFjdEFic1JlbCxcbnN1YnRyYWN0UmVsUmVsLFxuaXNSZWxaZXJvLFxubXVsdGlwbHlSZWxOYXQsXG5kaXZpZGVSZWxOYXQsXG5kaXZpZGVSZWxSZWwsXG5tb2RBYnNSZWwsXG5tb2RSZWxSZWwsXG5jb21wYXJlQWJzOihhYnMxLGFiczIpPT5cbmNvbXBhcmVWYWx1ZXMoYWJzMSxhYnMyLGFic1ZhbHVlKGFiczEpLGFic1ZhbHVlKGFiczIpKSxcbmNvbXBhcmVSZWw6KHJlbDEscmVsMik9PlxuY29tcGFyZVZhbHVlcyhyZWwxLHJlbDIscmVsVmFsdWUocmVsMSkscmVsVmFsdWUocmVsMikpfSk7JGjigI1fb25jZS5UaW1lTWF0aChUaW1lTWF0aCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGltZU1hdGgiOlsiVGltZU1hdGgiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbrMeqqcHAACnBwAAJQAAAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIiwiUmVsYXRpdmVUaW1lU2hhcGUiLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIiwiVGltZXJCcmFuZFNoYXBlIiwiVGltZXJTZXJ2aWNlU2hhcGUiLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSIsIlRpbWVzdGFtcFNoYXBlIiwiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgICAgICAgIFRpbWVyQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgnVGltZXJCcmFuZCcpOyRo4oCNX29uY2UuVGltZXJCcmFuZFNoYXBlKFRpbWVyQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgVGltZXN0YW1wVmFsdWVTaGFwZT1NLm5hdCgpOyRo4oCNX29uY2UuVGltZXN0YW1wVmFsdWVTaGFwZShUaW1lc3RhbXBWYWx1ZVNoYXBlKTtcbmNvbnN0ICAgICAgICBSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlPU0ubmF0KCk7LyogU2hvdWxkIHdlIGFsbG93IG5lZ2F0aXZlcz8qLyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lVmFsdWVTaGFwZShSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTtcblxuY29uc3QgICAgICAgIFRpbWVzdGFtcFJlY29yZFNoYXBlPWhhcmRlbih7XG50aW1lckJyYW5kOlRpbWVyQnJhbmRTaGFwZSxcbmFic1ZhbHVlOlRpbWVzdGFtcFZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLlRpbWVzdGFtcFJlY29yZFNoYXBlKFRpbWVzdGFtcFJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGU9aGFyZGVuKHtcbnRpbWVyQnJhbmQ6VGltZXJCcmFuZFNoYXBlLFxucmVsVmFsdWU6UmVsYXRpdmVUaW1lVmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUaW1lc3RhbXBTaGFwZT1NLm9yKFRpbWVzdGFtcFJlY29yZFNoYXBlLFRpbWVzdGFtcFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuVGltZXN0YW1wU2hhcGUoVGltZXN0YW1wU2hhcGUpO1xuY29uc3QgICAgICAgIFJlbGF0aXZlVGltZVNoYXBlPU0ub3IoXG5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxcblJlbGF0aXZlVGltZVZhbHVlU2hhcGUpOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lU2hhcGUoUmVsYXRpdmVUaW1lU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUaW1lclNlcnZpY2VTaGFwZT1NLnJlbW90YWJsZSgnVGltZXJTZXJ2aWNlJyk7JGjigI1fb25jZS5UaW1lclNlcnZpY2VTaGFwZShUaW1lclNlcnZpY2VTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGltZXJCcmFuZFNoYXBlIjpbIlRpbWVyQnJhbmRTaGFwZSJdLCJUaW1lc3RhbXBWYWx1ZVNoYXBlIjpbIlRpbWVzdGFtcFZhbHVlU2hhcGUiXSwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIl0sIlRpbWVzdGFtcFJlY29yZFNoYXBlIjpbIlRpbWVzdGFtcFJlY29yZFNoYXBlIl0sIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIl0sIlRpbWVzdGFtcFNoYXBlIjpbIlRpbWVzdGFtcFNoYXBlIl0sIlJlbGF0aXZlVGltZVNoYXBlIjpbIlJlbGF0aXZlVGltZVNoYXBlIl0sIlRpbWVyU2VydmljZVNoYXBlIjpbIlRpbWVyU2VydmljZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADLMtBIlKQAAJSkAACgAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzeyJpbXBvcnRzIjpbIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzIiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiaWdub3JlQ29udGV4dCIsIm1ha2VFeG9VdGlscyIsInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvQ2xhc3MiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlU2luZ2xldG9uIiwicHJvdmlkZUtpbmRIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHByb3ZpZGUsZ2xvYmFsVmF0RGF0YTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXSxbXCJWYXREYXRhXCIsIFskaOKAjV9hID0+IChnbG9iYWxWYXREYXRhID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyoqIEB0ZW1wbGF0ZSBMLFIgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDxMLCBSPn0gUmVtb3RhYmxlQnJhbmQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxUPn0gRVJlZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRGVmaW5lS2luZE9wdGlvbnM8VD59IERlZmluZUtpbmRPcHRpb25zICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5LaW5kRmFjZXQ8VD59IEtpbmRGYWNldCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuS2luZEZhY2V0czxUPn0gS2luZEZhY2V0cyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRHVyYWJsZUtpbmRIYW5kbGV9IER1cmFibGVLaW5kSGFuZGxlICovXG5cbi8qKlxuICogTWFrZSBhIHZlcnNpb24gb2YgdGhlIGFyZ3VtZW50IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBraW5kIGNvbnRleHQgYnV0XG4gKiBpZ25vcmVzIGl0LlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIEZ1bmN0aW9uPihmbjogVCkgPT4gWGltcG9ydCgnLi90eXBlcy5qcycpLlBsdXNDb250ZXh0PG5ldmVyLCBUPn1cbiAqL1xuY29uc3QgICAgICAgIGlnbm9yZUNvbnRleHQ9XG4oZm4pPT5cbihfY29udGV4dCwuLi5hcmdzKT0+XG5mbiguLi5hcmdzKTskaOKAjV9vbmNlLmlnbm9yZUNvbnRleHQoaWdub3JlQ29udGV4dCk7XG5oYXJkZW4oaWdub3JlQ29udGV4dCk7XG5cbi8qIFRPRE86IEZpbmQgYSBnb29kIGhvbWUgZm9yIHRoaXMgZnVuY3Rpb24gdXNlZCBieSBAYWdvcmljL3ZhdC1kYXRhIGFuZCB0ZXN0aW5nIGNvZGUqL1xuY29uc3QgICAgICAgIG1ha2VFeG9VdGlscz0oVmF0RGF0YSk9PntcbmNvbnN0e1xuZGVmaW5lS2luZCxcbmRlZmluZUtpbmRNdWx0aSxcbmRlZmluZUR1cmFibGVLaW5kLFxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxcbm1ha2VLaW5kSGFuZGxlfT1cblZhdERhdGE7XG5cbi8qKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEByZXR1cm5zIHtEdXJhYmxlS2luZEhhbmRsZX1cbiAqL1xuY29uc3QgcHJvdmlkZUtpbmRIYW5kbGU9KGJhZ2dhZ2Usa2luZE5hbWUpPT5cbnByb3ZpZGUoYmFnZ2FnZSwgYCR7a2luZE5hbWV9X2tpbmRIYW5kbGVgLCgpPT5tYWtlS2luZEhhbmRsZShraW5kTmFtZSkpO1xuaGFyZGVuKHByb3ZpZGVLaW5kSGFuZGxlKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4b0NsYXNzIGluc3RlYWRcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJlcGFyZUtpbmR9XG4gKi9cbmNvbnN0IHByZXBhcmVLaW5kPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zKTtcblxuaGFyZGVuKHByZXBhcmVLaW5kKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4b0NsYXNzS2l0IGluc3RlYWRcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJlcGFyZUtpbmRNdWx0aX1cbiAqL1xuY29uc3QgcHJlcGFyZUtpbmRNdWx0aT0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zKTtcblxuaGFyZGVuKHByZXBhcmVLaW5kTXVsdGkpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIFQgYmVoYXZpb3JcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7XG4gKiAgIHNlbGY6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIHNlbGY6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzPSh0YWcsaW50ZXJmYWNlR3VhcmQsaW5pdCxtZXRob2RzLG9wdGlvbnMpPT5cbmRlZmluZUtpbmQodGFnLGluaXQsbWV0aG9kcyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkfSk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8e1xuICogICBmYWNldHM6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIGZhY2V0czogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQ9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk9PlxuXG5kZWZpbmVLaW5kTXVsdGkodGFnLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmQ6aW50ZXJmYWNlR3VhcmRLaXR9KTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7XG4gKiAgIHNlbGY6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIHNlbGY6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgZGVmaW5lRHVyYWJsZUV4b0NsYXNzPShcbmtpbmRIYW5kbGUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZChraW5kSGFuZGxlLGluaXQsbWV0aG9kcyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkfSk7XG5cbmhhcmRlbihkZWZpbmVEdXJhYmxlRXhvQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8e1xuICogICBmYWNldHM6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIGZhY2V0czogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQ9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShraW5kSGFuZGxlLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmQ6aW50ZXJmYWNlR3VhcmRLaXR9KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8e1xuICogICBzZWxmOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0IHByZXBhcmVFeG9DbGFzcz0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlRXhvQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHtcbiAqICAgZmFjZXRzOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgcHJlcGFyZUV4b0NsYXNzS2l0PShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlRXhvQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge019IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNICYgUmVtb3RhYmxlQnJhbmQ8e30sIE0+fVxuICovXG5jb25zdCBwcmVwYXJlRXhvPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlU2luZ2xldG9uPXByZXBhcmVFeG9DbGFzcyhcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdEVtcHR5LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5cbnJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9zaW5nbGV0b25gLCgpPT5tYWtlU2luZ2xldG9uKCkpO1xuIH07XG5oYXJkZW4ocHJlcGFyZUV4byk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4byBpbnN0ZWFkLlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7TX0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IE0gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMge00gJiBSZW1vdGFibGVCcmFuZDx7fSwgTT59XG4gKi9cbmNvbnN0IHByZXBhcmVTaW5nbGV0b249KGJhZ2dhZ2Usa2luZE5hbWUsbWV0aG9kcyxvcHRpb25zPXVuZGVmaW5lZCk9PlxucHJlcGFyZUV4byhiYWdnYWdlLGtpbmROYW1lLHVuZGVmaW5lZCxtZXRob2RzLG9wdGlvbnMpO1xuaGFyZGVuKHByZXBhcmVTaW5nbGV0b24pO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmRlZmluZVZpcnR1YWxFeG9DbGFzcyxcbmRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbmRlZmluZUR1cmFibGVFeG9DbGFzcyxcbmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG9DbGFzcyxcbnByZXBhcmVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG8sXG5wcmVwYXJlU2luZ2xldG9uLFxuXG5wcm92aWRlS2luZEhhbmRsZSxcbnByZXBhcmVLaW5kLFxucHJlcGFyZUtpbmRNdWx0aX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VFeG9VdGlscyhtYWtlRXhvVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxFeG9VdGlscz1tYWtlRXhvVXRpbHMoZ2xvYmFsVmF0RGF0YSk7XG5cbmNvbnN0ICAgICAgIHtcbmRlZmluZVZpcnR1YWxFeG9DbGFzcyxcbmRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbmRlZmluZUR1cmFibGVFeG9DbGFzcyxcbmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG9DbGFzcyxcbnByZXBhcmVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG8sXG5wcmVwYXJlU2luZ2xldG9ufT1cbmdsb2JhbEV4b1V0aWxzO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovJGjigI1fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MoZGVmaW5lVmlydHVhbEV4b0NsYXNzKTskaOKAjV9vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdChkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQoZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KTskaOKAjV9vbmNlLnByZXBhcmVFeG9DbGFzcyhwcmVwYXJlRXhvQ2xhc3MpOyRo4oCNX29uY2UucHJlcGFyZUV4b0NsYXNzS2l0KHByZXBhcmVFeG9DbGFzc0tpdCk7JGjigI1fb25jZS5wcmVwYXJlRXhvKHByZXBhcmVFeG8pOyRo4oCNX29uY2UucHJlcGFyZVNpbmdsZXRvbihwcmVwYXJlU2luZ2xldG9uKTtcbmNvbnN0ICAgICAgIHtwcm92aWRlS2luZEhhbmRsZSxwcmVwYXJlS2luZCxwcmVwYXJlS2luZE11bHRpfT1cbmdsb2JhbEV4b1V0aWxzOyRo4oCNX29uY2UucHJvdmlkZUtpbmRIYW5kbGUocHJvdmlkZUtpbmRIYW5kbGUpOyRo4oCNX29uY2UucHJlcGFyZUtpbmQocHJlcGFyZUtpbmQpOyRo4oCNX29uY2UucHJlcGFyZUtpbmRNdWx0aShwcmVwYXJlS2luZE11bHRpKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZ25vcmVDb250ZXh0IjpbImlnbm9yZUNvbnRleHQiXSwibWFrZUV4b1V0aWxzIjpbIm1ha2VFeG9VdGlscyJdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG9DbGFzcyI6WyJwcmVwYXJlRXhvQ2xhc3MiXSwicHJlcGFyZUV4b0NsYXNzS2l0IjpbInByZXBhcmVFeG9DbGFzc0tpdCJdLCJwcmVwYXJlRXhvIjpbInByZXBhcmVFeG8iXSwicHJlcGFyZVNpbmdsZXRvbiI6WyJwcmVwYXJlU2luZ2xldG9uIl0sInByb3ZpZGVLaW5kSGFuZGxlIjpbInByb3ZpZGVLaW5kSGFuZGxlIl0sInByZXBhcmVLaW5kIjpbInByZXBhcmVLaW5kIl0sInByZXBhcmVLaW5kTXVsdGkiOlsicHJlcGFyZUtpbmRNdWx0aSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA74z2IkggAAJIIAAAkAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vZXhvLXV0aWxzLmpzIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtdXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtdXSxbXCIuL2V4by11dGlscy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAYWdvcmljL3N0b3JlIjpbWyJNIiwiTSJdLFsibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl0sWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyI6W1sibWFrZUtpbmRIYW5kbGUiLCJtYWtlS2luZEhhbmRsZSJdLFsicHJvdmlkZVByb21pc2VXYXRjaGVyIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sWyJ3YXRjaFByb21pc2UiLCJ3YXRjaFByb21pc2UiXSxbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSxbImNhbkJlRHVyYWJsZSIsImNhbkJlRHVyYWJsZSJdLFsicGlja0ZhY2V0IiwicGlja0ZhY2V0Il0sWyJwYXJ0aWFsQXNzaWduIiwicGFydGlhbEFzc2lnbiJdLFsicHJvdmlkZSIsInByb3ZpZGUiXSxbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdLFsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSJdLFsiZGVmaW5lS2luZCIsImRlZmluZUtpbmQiXSxbImRlZmluZUtpbmRNdWx0aSIsImRlZmluZUtpbmRNdWx0aSJdLFsiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZCJdLFsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXV0sIi4vZXhvLXV0aWxzLmpzIjpbWyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSxbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLFsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG9DbGFzcyIsInByZXBhcmVFeG9DbGFzcyJdLFsicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUV4b0NsYXNzS2l0Il0sWyJwcmVwYXJlRXhvIiwicHJlcGFyZUV4byJdLFsicHJlcGFyZVNpbmdsZXRvbiIsInByZXBhcmVTaW5nbGV0b24iXSxbImlnbm9yZUNvbnRleHQiLCJpZ25vcmVDb250ZXh0Il0sWyJwcm92aWRlS2luZEhhbmRsZSIsInByb3ZpZGVLaW5kSGFuZGxlIl0sWyJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kIl0sWyJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZUtpbmRNdWx0aSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3vSPIFMoAABTKAAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJWYXREYXRhIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmVVdGlscyIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhaWwscHJvdmlkZUxhenk7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcycpLlZhdERhdGF9ICovXG5sZXQgVmF0RGF0YUdsb2JhbDtcbmlmKCdWYXREYXRhJ2luIGdsb2JhbFRoaXMpe1xuZ2xvYmFsVGhpcy5WYXREYXRhfHxGYWlsIGBWYXREYXRhIGRlZmluZWQgaW4gZ2xvYmFsIGFzIG51bGwgb3IgdW5kZWZpbmVkYDtcblZhdERhdGFHbG9iYWw9Z2xvYmFsVGhpcy5WYXREYXRhO1xuIH1lbHNle1xuLyogWFhYIHRoaXMgbW9kdWxlIGhhcyBiZWVuIGtub3duIHRvIGdldCBpbXBvcnRlZCAodHJhbnNpdGl2ZWx5KSBpbiBjYXNlcyB0aGF0Ki9cbi8qIG5ldmVyIHVzZSBpdCBzbyB3ZSBtYWtlIGEgdmVyc2lvbiB0aGF0IHdpbGwgc2F0aXNmeSBtb2R1bGUgcmVzb2x1dGlvbiBidXQqL1xuLyogZmFpbCBhdCBydW50aW1lLiovXG5jb25zdCB1bnZhaWxhYmxlPSgpPT5GYWlsIGBWYXREYXRhIHVuYXZhaWxhYmxlYDtcblZhdERhdGFHbG9iYWw9e1xuZGVmaW5lS2luZDp1bnZhaWxhYmxlLFxuZGVmaW5lS2luZE11bHRpOnVudmFpbGFibGUsXG5kZWZpbmVEdXJhYmxlS2luZDp1bnZhaWxhYmxlLFxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aTp1bnZhaWxhYmxlLFxubWFrZUtpbmRIYW5kbGU6dW52YWlsYWJsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcjp1bnZhaWxhYmxlLFxud2F0Y2hQcm9taXNlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdTZXRTdG9yZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZTp1bnZhaWxhYmxlLFxuY2FuQmVEdXJhYmxlOnVudmFpbGFibGV9O1xuXG4gfVxuXG5jb25zdCBWYXREYXRhRXhwb3J0PVZhdERhdGFHbG9iYWw7JGjigI1fb25jZS5WYXREYXRhRXhwb3J0KFZhdERhdGFFeHBvcnQpO1xuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIEV4b3MvRXhvQ2xhc3NlcyBpbnN0ZWFkIG9mIEtpbmRzXG4gKi9cbmNvbnN0ICAgICAgIHtcbmRlZmluZUtpbmQsXG5kZWZpbmVLaW5kTXVsdGksXG5kZWZpbmVEdXJhYmxlS2luZCxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGl9PVxuVmF0RGF0YUdsb2JhbDskaOKAjV9vbmNlLmRlZmluZUtpbmQoZGVmaW5lS2luZCk7JGjigI1fb25jZS5kZWZpbmVLaW5kTXVsdGkoZGVmaW5lS2luZE11bHRpKTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVLaW5kKGRlZmluZUR1cmFibGVLaW5kKTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVLaW5kTXVsdGkoZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSk7XG5cbmNvbnN0ICAgICAgIHtcbm1ha2VLaW5kSGFuZGxlLFxucHJvdmlkZVByb21pc2VXYXRjaGVyLFxud2F0Y2hQcm9taXNlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlLFxubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUsXG5jYW5CZUR1cmFibGV9PVxuVmF0RGF0YUdsb2JhbDtcblxuLyoqXG4gKiBXaGVuIG1ha2luZyBhIG11bHRpLWZhY2V0IGtpbmQsIGl0J3MgY29tbW9uIHRvIHBpY2sgb25lIGZhY2V0IHRvIGV4cG9zZS4gRS5nLixcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IChhLCBiLCBjLCBkKSA9PiBtYWtlRm9vQmFzZShhLCBiLCBjLCBkKS5zZWxmO1xuICpcbiAqIFRoaXMgaGVscGVyIHJlZHVjZXMgdGhlIGR1cGxpY2F0aW9uOlxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gcGlja0ZhY2V0KG1ha2VGb29CYXNlLCAnc2VsZicpO1xuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzJykuUGlja0ZhY2V0fVxuICovJGjigI1fb25jZS5tYWtlS2luZEhhbmRsZShtYWtlS2luZEhhbmRsZSk7JGjigI1fb25jZS5wcm92aWRlUHJvbWlzZVdhdGNoZXIocHJvdmlkZVByb21pc2VXYXRjaGVyKTskaOKAjV9vbmNlLndhdGNoUHJvbWlzZSh3YXRjaFByb21pc2UpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ01hcFN0b3JlKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1NldFN0b3JlKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSk7JGjigI1fb25jZS5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUpOyRo4oCNX29uY2UuY2FuQmVEdXJhYmxlKGNhbkJlRHVyYWJsZSk7XG5jb25zdCAgICAgICAgcGlja0ZhY2V0PVxuKG1ha2VyLGZhY2V0TmFtZSk9PlxuKC4uLmFyZ3MpPT5cbm1ha2VyKC4uLmFyZ3MpW2ZhY2V0TmFtZV07JGjigI1fb25jZS5waWNrRmFjZXQocGlja0ZhY2V0KTtcbmhhcmRlbihwaWNrRmFjZXQpO1xuXG4vKipcbiAqIEFzc2lnbiB0aGUgdmFsdWVzIG9mIGFsbCBvZiB0aGUgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2VcbiAqIG9iamVjdCB0byB0aGVpciBrZXlzIGluIHRoZSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1BhcnRpYWw8VD59IHNvdXJjZVxuICovXG5jb25zdCAgICAgICAgcGFydGlhbEFzc2lnbj0odGFyZ2V0LHNvdXJjZSk9Pntcbk9iamVjdC5hc3NpZ24odGFyZ2V0LHNvdXJjZSk7XG4gfTskaOKAjV9vbmNlLnBhcnRpYWxBc3NpZ24ocGFydGlhbEFzc2lnbik7XG5oYXJkZW4ocGFydGlhbEFzc2lnbik7XG5cbi8qIFhYWCBjb3BpZWQgZnJvbSBAYWdvcmljL3N0b3JlIHR5cGVzKi9cbi8qIFVOVElMIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDU2MCovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlT3B0aW9uc1xuICogT2YgdGhlIGRpbWVuc2lvbnMgb24gd2hpY2ggS2V5ZWRTdG9yZXMgY2FuIGRpZmZlciwgd2Ugb25seSByZXByZXNlbnQgYSBmZXdcbiAqIG9mIHRoZW0gYXMgc3RhbmRhcmQgb3B0aW9ucy4gQSBnaXZlbiBzdG9yZSBtYWtlciBzaG91bGQgZG9jdW1lbnQgd2hpY2hcbiAqIG9wdGlvbnMgaXQgc3VwcG9ydHMsIGFzIHdlbGwgYXMgaXRzIHBvc2l0aW9ucyBvbiBkaW1lbnNpb25zIGZvciB3aGljaCBpdFxuICogZG9lcyBub3Qgc3VwcG9ydCBvcHRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbG9uZ0xpdmVkPXRydWVdIFdoaWNoIHdheSB0byBvcHRpbWl6ZSBhIHdlYWsgc3RvcmUuIFRydWUgbWVhbnNcbiAqIHRoYXQgd2UgZXhwZWN0IHRoaXMgd2VhayBzdG9yZSB0byBvdXRsaXZlIG1vc3Qgb2YgaXRzIGtleXMsIGluIHdoaWNoXG4gKiBjYXNlIHdlIGludGVybmFsbHkgbWF5IHVzZSBhIEphdmFTY3JpcHQgYFdlYWtNYXBgLiBPdGhlcndpc2Ugd2UgaW50ZXJuYWxseVxuICogbWF5IHVzZSBhIEphdmFTY3JpcHQgYE1hcGAuXG4gKiBEZWZhdWx0cyB0byB0cnVlLCBzbyBwbGVhc2UgbWFyayBzaG9ydCBsaXZlZCBzdG9yZXMgZXhwbGljaXRseS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2R1cmFibGU9ZmFsc2VdICBUaGUgY29udGVudHMgb2YgdGhpcyBzdG9yZSBzdXJ2aXZlIHRlcm1pbmF0aW9uXG4gKiAgIG9mIGl0cyBjb250YWluaW5nIHByb2Nlc3MsIGFsbG93aW5nIGZvciByZXN0YXJ0IG9yIHVwZ3JhZGUgYnV0IGF0IHRoZSBjb3N0XG4gKiAgIG9mIGZvcmJpZGRpbmcgc3RvcmFnZSBvZiByZWZlcmVuY2VzIHRvIGVwaGVtZXJhbCBkYXRhLiAgRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWtlRHVyYWJsZT1mYWxzZV0gIFRoaXMgc3RvcmUgcHJldGVuZHMgdG8gYmUgYSBkdXJhYmxlIHN0b3JlXG4gKiAgIGJ1dCBkb2VzIG5vdCBlbmZvcmNlIHRoYXQgdGhlIHRoaW5ncyBzdG9yZWQgaW4gaXQgYWN0dWFsbHkgYmUgdGhlbXNlbHZlc1xuICogICBkdXJhYmxlICh3aGVyZWFzIGFuIGFjdHVhbCBkdXJhYmxlIHN0b3JlIHdvdWxkIGZvcmJpZCBzdG9yYWdlIG9mIHN1Y2hcbiAqICAgaXRlbXMpLiAgVGhpcyBpcyBpbiBzZXJ2aWNlIG9mIGFsbG93aW5nIGluY3JlbWVudGFsIHRyYW5zaXRpb24gdG8gdXNlIG9mXG4gKiAgIGR1cmFibGUgc3RvcmVzLCB0byBlbmFibGUgbm9ybWFsIG9wZXJhdGlvbiBhbmQgdGVzdGluZyB3aGVuIHNvbWUgc3R1ZmZcbiAqICAgaW50ZW5kZWQgdG8gZXZlbnR1YWxseSBiZSBkdXJhYmxlIGhhcyBub3QgeWV0IGJlZW4gbWFkZSBkdXJhYmxlLiAgQSBzdG9yZVxuICogICBtYXJrZWQgYXMgZmFrZUR1cmFibGUgd2lsbCBhcHBlYXIgdG8gb3BlcmF0ZSBub3JtYWxseSBidXQgYW55IGF0dGVtcHQgdG9cbiAqICAgdXBncmFkZSBpdHMgY29udGFpbmluZyB2YXQgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IuXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdHlwZXMnKS5QYXR0ZXJufSBba2V5U2hhcGVdXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdHlwZXMnKS5QYXR0ZXJufSBbdmFsdWVTaGFwZV1cbiAqL1xuLyoqXG4gKiBVbmxpa2UgYHByb3ZpZGVMYXp5YCwgYHByb3ZpZGVgIHNob3VsZCBiZSBjYWxsZWQgYXQgbW9zdCBvbmNlXG4gKiB3aXRoaW4gYW55IHZhdCBpbmNhcm5hdGlvbiB3aXRoIGEgZ2l2ZW4gYGJhZ2dhZ2VgLGBrZXlgIHBhaXIuXG4gKlxuICogYHByb3ZpZGVgIHNob3VsZCBvbmx5IHRvIGJlIHVzZWQgdG8gcG9wdWxhdGUgYmFnZ2FnZSxcbiAqIHdoZXJlIHRoZSB0b3RhbCBudW1iZXIgb2YgY2FsbHMgdG8gYHByb3ZpZGVgIG11c3QgYmVcbiAqIGxvdyBjYXJkaW5hbGl0eSwgc2luY2Ugd2Uga2VlcCB0aGUgYm9va2tlZXBpbmcgdG8gZGV0ZWN0IGNvbGxpc2lvbnNcbiAqIGluIG5vcm1hbCBsYW5ndWFnZS1oZWFwIG1lbW9yeS4gQWxsIHRoZSBvdGhlciBiYWdnYWdlLW9yaWVudGVkXG4gKiBgcHJvdmlkZSpgIGFuZCBgcHJlcGFyZSpgIGZ1bmN0aW9ucyBjYWxsIGBwcm92aWRlYCxcbiAqIGFuZCBzbyBpbXBvc2UgdGhlIHNhbWUgY29uc3RyYWludHMuIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoXG4gKiBvdXIgZXhwZWN0ZWQgZHVyYWJpbGl0eSBwYXR0ZXJuczogV2hhdCB3ZSBzdG9yZSBpbiBiYWdnYWdlIGFyZVxuICogICAgKiBraW5kSGFuZGxlcywgd2hpY2ggYXJlIHBlciBraW5kLCB3aGljaCBtdXN0IGJlIGxvdyBjYXJkaW5hbGl0eVxuICogICAgKiBkYXRhIFwidmFyaWFibGVzXCIgZm9yIHJlZXN0YWJsaXNoaW5nIHRoZSBsZXhpY2FsIHNjb3BlLCBlc3BlY2lhbGx5XG4gKiAgICAgIG9mIHNpbmdsZXRvbnNcbiAqICAgICogbmFtZWQgbm9uLWJhZ2dhZ2UgY29sbGVjdGlvbnMgYXQgdGhlIGxlYXZlcyBvZiB0aGUgYmFnZ2FnZSB0cmVlLlxuICpcbiAqIFdoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgaGlnaCBjYXJkaW5hbGl0eSBhcmUgdGhlIGluc3RhbmNlcyBvZiB0aGUga2luZHMsXG4gKiBhbmQgdGhlIG1lbWJlcnMgb2YgdGhlIG5vbi1iYWdnZ2FnZSBjb2xsZWN0aW9ucy5cbiAqXG4gKiBUT0RPIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU4NzUgOlxuICogSW1wbGVtZW50IGRldmVsb3BtZW50LXRpbWUgaW5zdHJ1bWVudGF0aW9uIHRvIGRldGVjdCB3aGVuXG4gKiBgcHJvdmlkZWAgdmlvbGF0ZXMgdGhlIGFib3ZlIHByZXNjcmlwdGlvbiwgYW5kIGlzIGNhbGxlZCBtb3JlXG4gKiB0aGFuIG9uY2UgaW4gdGhlIHNhbWUgdmF0IGluY2FybmF0aW9uIHdpdGggdGhlIHNhbWVcbiAqIGJhZ2dhZ2Usa2V5IHBhaXIuXG4gKi9cblxuY29uc3QgICAgICAgIHByb3ZpZGU9XG4vKiBYWFggY2FzdCBiZWNhdXNlIHByb3ZpZGVMYXp5IGlzIGBhbnlgIGR1ZSB0byBicm9rZW4gdHlwZSBpbXBvcnQqL1xuLyoqIEB0eXBlIHs8SywgVj4oYmFnZ2FnZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkJhZ2dhZ2UsIGtleTogSywgbWFrZVZhbHVlOiAoa2V5OiBLKSA9PiBWKSA9PiBWfSAqL1xucHJvdmlkZUxhenk7XG5cblxuLyogVE9ETzogRmluZCBhIGdvb2QgaG9tZSBmb3IgdGhpcyBmdW5jdGlvbiB1c2VkIGJ5IEBhZ29yaWMvdmF0LWRhdGEgYW5kIHRlc3RpbmcgY29kZSovXG4vKiogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhL3NyYy90eXBlcycpLlZhdERhdGF9IFZhdERhdGEgKi8kaOKAjV9vbmNlLnByb3ZpZGUocHJvdmlkZSk7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlVXRpbHM9KFZhdERhdGEpPT57XG5jb25zdHtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZX09XG5WYXREYXRhO1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPbWl0PFN0b3JlT3B0aW9ucywgJ2R1cmFibGUnPn0gb3B0aW9uc1xuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lLG9wdGlvbnM9e30pPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5cbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVTZXRTdG9yZT0oYmFnZ2FnZSxuYW1lLG9wdGlvbnM9e30pPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5cbm1ha2VTY2FsYXJCaWdTZXRTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcblxucmV0dXJuIGhhcmRlbih7XG5wcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVNldFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmV9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU3RvcmVVdGlscyhtYWtlU3RvcmVVdGlscyk7XG5cbmNvbnN0IGdsb2JhbFN0b3JlVXRpbHM9bWFrZVN0b3JlVXRpbHMoVmF0RGF0YUdsb2JhbCk7XG5jb25zdCAgICAgICB7XG5wcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVNldFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmV9PVxuZ2xvYmFsU3RvcmVVdGlsczskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlZhdERhdGEiOlsiVmF0RGF0YUV4cG9ydCJdLCJkZWZpbmVLaW5kIjpbImRlZmluZUtpbmQiXSwiZGVmaW5lS2luZE11bHRpIjpbImRlZmluZUtpbmRNdWx0aSJdLCJkZWZpbmVEdXJhYmxlS2luZCI6WyJkZWZpbmVEdXJhYmxlS2luZCJdLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIjpbImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXSwibWFrZUtpbmRIYW5kbGUiOlsibWFrZUtpbmRIYW5kbGUiXSwicHJvdmlkZVByb21pc2VXYXRjaGVyIjpbInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJ3YXRjaFByb21pc2UiOlsid2F0Y2hQcm9taXNlIl0sIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIl0sImNhbkJlRHVyYWJsZSI6WyJjYW5CZUR1cmFibGUiXSwicGlja0ZhY2V0IjpbInBpY2tGYWNldCJdLCJwYXJ0aWFsQXNzaWduIjpbInBhcnRpYWxBc3NpZ24iXSwicHJvdmlkZSI6WyJwcm92aWRlIl0sIm1ha2VTdG9yZVV0aWxzIjpbIm1ha2VTdG9yZVV0aWxzIl0sInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAcY284kAcAABAHAAAKAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NsZWFuUHJvcG9zYWwuanN7ImltcG9ydHMiOlsiLi9pbnRlcm5hbC10eXBlcy5qcyIsIi4vb2JqQXJyYXlDb252ZXJzaW9uLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL2VydHAiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIk1BWF9LRVlXT1JEX0xFTkdUSCIsImFzc2VydEtleXdvcmROYW1lIiwiY2xlYW5LZXl3b3JkcyIsImNsZWFuUHJvcG9zYWwiLCJjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkIiwiY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LHEsRmFpbCxBbW91bnRNYXRoLGdldEFzc2V0S2luZCxhc3NlcnRSZWNvcmQsYXNzZXJ0S2V5LGFzc2VydFBhdHRlcm4sbXVzdE1hdGNoLGlzS2V5LEZ1bGxQcm9wb3NhbFNoYXBlLGFycmF5VG9PYmo7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV0sW1wiZ2V0QXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChnZXRBc3NldEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJpc0tleVwiLCBbJGjigI1fYSA9PiAoaXNLZXkgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJGdWxsUHJvcG9zYWxTaGFwZVwiLCBbJGjigI1fYSA9PiAoRnVsbFByb3Bvc2FsU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9vYmpBcnJheUNvbnZlcnNpb24uanNcIiwgW1tcImFycmF5VG9PYmpcIiwgWyRo4oCNX2EgPT4gKGFycmF5VG9PYmogPSAkaOKAjV9hKV1dXV0sW1wiLi9pbnRlcm5hbC10eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG5jb25zdCAgICAgICAgTUFYX0tFWVdPUkRfTEVOR1RIPTEwMDskaOKAjV9vbmNlLk1BWF9LRVlXT1JEX0xFTkdUSChNQVhfS0VZV09SRF9MRU5HVEgpO1xuXG5jb25zdCBmaXJzdENhcEFTQ0lJPS9eW0EtWl1bYS16QS1aMC05XyRdKiQvO1xuXG4vKiBXZSBhZG9wdCBzaW1wbGUgcmVxdWlyZW1lbnRzIG9uIGtleXdvcmRzIHNvIHRoYXQgdGhleSBkbyBub3QgYWNjaWRlbnRhbGx5Ki9cbi8qIGNvbmZsaWN0IHdpdGggZXhpc3RpbmcgcHJvcGVydHkgbmFtZXMuKi9cbi8qIFdlIHJlcXVpcmUga2V5d29yZHMgdG8gYmUgc3RyaW5ncywgYXNjaWkgaWRlbnRpZmllcnMgYmVnaW5uaW5nIHdpdGggYW4qL1xuLyogdXBwZXIgY2FzZSBsZXR0ZXIsIGFuZCBkaXN0aW5jdCBmcm9tIHRoZSBzdHJpbmdpZmllZCBmb3JtIG9mIGFueSBudW1iZXIuKi9cbi8qKi9cbi8qIE9mIG51bWJlcnMsIG9ubHkgTmFOIGFuZCBJbmZpbml0eSwgd2hlbiBzdHJpbmdpZmllZCB0byBhIHByb3BlcnR5IG5hbWUsKi9cbi8qIHByb2R1Y2UgYW4gYXNjaWkgaWRlbnRpZmllciBiZWdpbm5pbmcgd2l0aCBhbiB1cHBlciBjYXNlIGxldHRlci4qL1xuLyogV2l0aCB0aGlzIHJ1bGUsIGEgY29tcHV0ZWQgaW5kZXhpbmcgZXhwcmVzc2lvbiBsaWtlIGBhWytpXWAgY2Fubm90Ki9cbi8qIGxvb2t1cCBhIGtleXdvcmQtbmFtZWQgcHJvcGVydHkgbm8gbWF0dGVyIHdoYXQgYGlgIGlzLiovXG5jb25zdCAgICAgICAgYXNzZXJ0S2V5d29yZE5hbWU9KGtleXdvcmQpPT57XG5hc3NlcnQudHlwZW9mKGtleXdvcmQsJ3N0cmluZycpO1xua2V5d29yZC5sZW5ndGg8PU1BWF9LRVlXT1JEX0xFTkdUSHx8XG5GYWlsIGBrZXl3b3JkICR7cShrZXl3b3JkKX0gZXhjZWVkZWQgbWF4aW11bSBsZW5ndGggJHtxKFxuTUFYX0tFWVdPUkRfTEVOR1RIKVxuIH0gY2hhcmFjdGVyczsgZ290ICR7a2V5d29yZC5sZW5ndGh9YDtcbmZpcnN0Q2FwQVNDSUkudGVzdChrZXl3b3JkKXx8XG5GYWlsIGBrZXl3b3JkICR7cShcbmtleXdvcmQpXG4gfSBtdXN0IGJlIGFuIGFzY2lpIGlkZW50aWZpZXIgc3RhcnRpbmcgd2l0aCB1cHBlciBjYXNlLmA7XG5rZXl3b3JkIT09J05hTicmJmtleXdvcmQhPT0nSW5maW5pdHknfHxcbkZhaWwgYGtleXdvcmQgJHtxKGtleXdvcmQpfSBtdXN0IG5vdCBiZSBhIG51bWJlcidzIG5hbWVgO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt7W25hbWU6IHN0cmluZ106IGFueX19IHVuY2xlYW5LZXl3b3JkUmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi8kaOKAjV9vbmNlLmFzc2VydEtleXdvcmROYW1lKGFzc2VydEtleXdvcmROYW1lKTtcbmNvbnN0ICAgICAgICBjbGVhbktleXdvcmRzPSh1bmNsZWFuS2V5d29yZFJlY29yZCk9PntcbmhhcmRlbih1bmNsZWFuS2V5d29yZFJlY29yZCk7XG5hc3NlcnRSZWNvcmQodW5jbGVhbktleXdvcmRSZWNvcmQsJ2tleXdvcmRSZWNvcmQnKTtcbmNvbnN0IGtleXdvcmRzPW93bktleXModW5jbGVhbktleXdvcmRSZWNvcmQpO1xuXG4vKiBBc3NlcnQgYWxsIG5hbWVzIGFyZSBhc2NpaSBpZGVudGlmaWVycyBzdGFydGluZyB3aXRoKi9cbi8qIGFuIHVwcGVyIGNhc2UgbGV0dGVyLiovXG5rZXl3b3Jkcy5mb3JFYWNoKGFzc2VydEtleXdvcmROYW1lKTtcblxucmV0dXJuICgvKiogQHR5cGUge3N0cmluZ1tdfSAqL2tleXdvcmRzKTtcbiB9OyRo4oCNX29uY2UuY2xlYW5LZXl3b3JkcyhjbGVhbktleXdvcmRzKTtcblxuY29uc3QgICAgICAgIGNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkPShcbmFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkLFxuZ2V0QXNzZXRLaW5kQnlCcmFuZCk9Plxue1xuY29uc3Qga2V5d29yZHM9Y2xlYW5LZXl3b3JkcyhhbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCk7XG5cbmNvbnN0IGFtb3VudHM9T2JqZWN0LnZhbHVlcyhhbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCk7XG4vKiBDaGVjayB0aGF0IGVhY2ggdmFsdWUgY2FuIGJlIGNvZXJjZWQgdXNpbmcgdGhlIEFtb3VudE1hdGgqL1xuLyogaW5kaWNhdGVkIGJ5IGJyYW5kLiBgQW1vdW50TWF0aC5jb2VyY2VgIHRocm93cyBpZiBjb2VyY2lvbiBmYWlscy4qL1xuY29uc3QgY29lcmNlZEFtb3VudHM9YW1vdW50cy5tYXAoKGFtb3VudCk9PntcbmlmKGlzS2V5KGFtb3VudCkpe1xuY29uc3QgYnJhbmRBc3NldEtpbmQ9Z2V0QXNzZXRLaW5kQnlCcmFuZChhbW91bnQuYnJhbmQpO1xuY29uc3QgYXNzZXRLaW5kPWdldEFzc2V0S2luZChhbW91bnQpO1xuLyogVE9ETzogcmVwbGFjZSB0aGlzIGFzc2VydGlvbiB3aXRoIGEgY2hlY2sgb2YgdGhlIGFzc2V0S2luZCovXG4vKiBwcm9wZXJ0eSBvbiB0aGUgYnJhbmQsIHdoZW4gdGhhdCBleGlzdHMuKi9cbmFzc2V0S2luZD09PWJyYW5kQXNzZXRLaW5kfHxcbkZhaWwgYFRoZSBhbW91bnQgJHthbW91bnR9IGRpZCBub3QgaGF2ZSB0aGUgYXNzZXRLaW5kIG9mIHRoZSBicmFuZCAke2JyYW5kQXNzZXRLaW5kfWA7XG5yZXR1cm4gQW1vdW50TWF0aC5jb2VyY2UoYW1vdW50LmJyYW5kLGFtb3VudCk7XG4gfWVsc2V7XG5hc3NlcnRQYXR0ZXJuKGFtb3VudCk7XG5yZXR1cm4gYW1vdW50O1xuIH1cbiB9KTtcblxuLyogUmVjcmVhdGUgdGhlIGFtb3VudEtleXdvcmRSZWNvcmQgd2l0aCBjb2VyY2VkQW1vdW50cy4qL1xucmV0dXJuIGhhcmRlbihhcnJheVRvT2JqKGNvZXJjZWRBbW91bnRzLGtleXdvcmRzKSk7XG4gfTskaOKAjV9vbmNlLmNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkKGNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkKTtcblxuY29uc3QgICAgICAgIGNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQ9KFxuYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG5nZXRBc3NldEtpbmRCeUJyYW5kKT0+XG57XG5jb25zdCByZXN1bHQ9Y29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQoXG5hbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCxcbmdldEFzc2V0S2luZEJ5QnJhbmQpO1xuXG5hc3NlcnRLZXkocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBKdXN0IGNoZWNrcyByZXNpZHVhbCBpc3N1ZXMgYWZ0ZXIgbWF0Y2hpbmcgUHJvcG9zYWxTaGFwZS5cbiAqIE9ubHkga25vd24gcmVzaWR1YWwgaXNzdWUgaXMgdmVyaWZ5aW5nIHRoYXQgaXQgb25seSBoYXMgb25lIG9mIHRoZVxuICogb3B0aW9uYWwgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKi8kaOKAjV9vbmNlLmNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQoY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCk7XG5jb25zdCBhc3NlcnRFeGl0PShleGl0KT0+XG5vd25LZXlzKGV4aXQpLmxlbmd0aD09PTF8fEZhaWwgYGV4aXQgJHtleGl0fSBzaG91bGQgb25seSBoYXZlIG9uZSBrZXlgO1xuXG4vKipcbiAqIGNoZWNrIHRoYXQga2V5d29yZCBpcyBub3QgaW4gYm90aCAnd2FudCcgYW5kICdnaXZlJy5cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkW1wid2FudFwiXX0gd2FudFxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZFtcImdpdmVcIl19IGdpdmVcbiAqL1xuY29uc3QgYXNzZXJ0S2V5d29yZE5vdEluQm90aD0od2FudCxnaXZlKT0+e1xuY29uc3Qgd2FudEtleXdvcmRTZXQ9bmV3IFNldChvd25LZXlzKHdhbnQpKTtcbmNvbnN0IGdpdmVLZXl3b3Jkcz1vd25LZXlzKGdpdmUpO1xuXG5naXZlS2V5d29yZHMuZm9yRWFjaCgoa2V5d29yZCk9PntcbiF3YW50S2V5d29yZFNldC5oYXMoa2V5d29yZCl8fFxuRmFpbCBgYSBrZXl3b3JkIGNhbm5vdCBiZSBpbiBib3RoICd3YW50JyBhbmQgJ2dpdmUnYDtcbiB9KTtcbiB9O1xuXG4vKipcbiAqIGNsZWFuUHJvcG9zYWwgY2hlY2tzIHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIHByb3Bvc2FsLCBpbmNsdWRpbmdcbiAqIHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIGludGVybmFsIG9iamVjdHMuIFRoZSBwcm9wb3NhbCBtYXkgaGF2ZVxuICogdGhlIGZvbGxvd2luZyBrZXlzOiBgZ2l2ZWAsIGB3YW50YCwgYW5kIGBleGl0YC4gVGhlc2Uga2V5cyBtYXkgYmVcbiAqIG9taXR0ZWQgaW4gdGhlIGBwcm9wb3NhbGAgYXJndW1lbnQgcGFzc2VkIHRvIGNsZWFuUHJvcG9zYWwsIGJ1dFxuICogYW55dGhpbmcgb3RoZXIgdGhhbiB0aGVzZSBrZXlzIGlzIG5vdCBhbGxvd2VkLiBUaGUgdmFsdWVzIG9mIGBnaXZlYFxuICogYW5kIGB3YW50YCBtdXN0IGJlIFwiYW1vdW50S2V5d29yZFJlY29yZHNcIiwgbWVhbmluZyB0aGF0IHRoZSBrZXlzXG4gKiBtdXN0IGJlIGtleXdvcmRzIGFuZCB0aGUgdmFsdWVzIG11c3QgYmUgYW1vdW50cy4gVGhlIHZhbHVlIG9mXG4gKiBgZXhpdGAsIGlmIHByZXNlbnQsIG11c3QgYmUgYSByZWNvcmQgb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6XG4gKiBgeyB3YWl2ZWQ6IG51bGwgfWAgYHsgb25EZW1hbmQ6IG51bGwgfWAgYHsgYWZ0ZXJEZWFkbGluZTogeyB0aW1lclxuICogOlRpbWVyLCBkZWFkbGluZSA6YmlnaW50IH0gfVxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWx9IHByb3Bvc2FsXG4gKiBAcGFyYW0ge0dldEFzc2V0S2luZEJ5QnJhbmR9IGdldEFzc2V0S2luZEJ5QnJhbmRcbiAqIEByZXR1cm5zIHtQcm9wb3NhbFJlY29yZH1cbiAqL1xuY29uc3QgICAgICAgIGNsZWFuUHJvcG9zYWw9KHByb3Bvc2FsLGdldEFzc2V0S2luZEJ5QnJhbmQpPT57XG5hc3NlcnRSZWNvcmQocHJvcG9zYWwsJ3Byb3Bvc2FsJyk7XG4vKiBXZSBmaWxsIGluIHRoZSBkZWZhdWx0IHZhbHVlcyBpZiB0aGUga2V5cyBhcmUgYWJzZW50IG9yIHVuZGVmaW5lZC4qL1xuY29uc3R7XG53YW50PWhhcmRlbih7fSksXG5naXZlPWhhcmRlbih7fSksXG5leGl0PWhhcmRlbih7b25EZW1hbmQ6bnVsbH0pLFxuLi4ucmVzdH09XG5wcm9wb3NhbDtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGAke3Byb3Bvc2FsfSAtIE11c3Qgb25seSBoYXZlIHdhbnQ6LCBnaXZlOiwgZXhpdDogcHJvcGVydGllczogJHtyZXN0fWA7XG5cbmNvbnN0IGNsZWFuZWRXYW50PWNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkKFxud2FudCxcbmdldEFzc2V0S2luZEJ5QnJhbmQpO1xuXG5jb25zdCBjbGVhbmVkR2l2ZT1jb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKGdpdmUsZ2V0QXNzZXRLaW5kQnlCcmFuZCk7XG5cbmNvbnN0IGNsZWFuZWRQcm9wb3NhbD1oYXJkZW4oe1xud2FudDpjbGVhbmVkV2FudCxcbmdpdmU6Y2xlYW5lZEdpdmUsXG5leGl0fSk7XG5cbm11c3RNYXRjaChjbGVhbmVkUHJvcG9zYWwsRnVsbFByb3Bvc2FsU2hhcGUsJ3Byb3Bvc2FsJyk7XG5hc3NlcnRFeGl0KGV4aXQpO1xuYXNzZXJ0S2V5d29yZE5vdEluQm90aChjbGVhbmVkV2FudCxjbGVhbmVkR2l2ZSk7XG5yZXR1cm4gY2xlYW5lZFByb3Bvc2FsO1xuIH07JGjigI1fb25jZS5jbGVhblByb3Bvc2FsKGNsZWFuUHJvcG9zYWwpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Ik1BWF9LRVlXT1JEX0xFTkdUSCI6WyJNQVhfS0VZV09SRF9MRU5HVEgiXSwiYXNzZXJ0S2V5d29yZE5hbWUiOlsiYXNzZXJ0S2V5d29yZE5hbWUiXSwiY2xlYW5LZXl3b3JkcyI6WyJjbGVhbktleXdvcmRzIl0sImNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkIjpbImNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkIl0sImNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQiOlsiY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCJdLCJjbGVhblByb3Bvc2FsIjpbImNsZWFuUHJvcG9zYWwiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArRtPXccNAADHDQAANwAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvYWxsb2NhdGlvbk1hdGguanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIl0sImV4cG9ydHMiOlsiYWRkVG9BbGxvY2F0aW9uIiwic3VidHJhY3RGcm9tQWxsb2NhdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRNYXRoOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAY2FsbGJhY2sgT3BlcmF0aW9uXG4gKlxuICogQW4gb3BlcmF0aW9uIHN1Y2ggYXMgYWRkIG9yIHN1YnRyYWN0LlxuICpcbiAqIEBwYXJhbSB7QW1vdW50IHwgdW5kZWZpbmVkfSBhbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50IHwgdW5kZWZpbmVkfSBkaWZmXG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmRcbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cblxuLyoqXG4gKiBBZGQgYW1vdW50cyB0byBhbiBhbGxvY2F0aW9uLCBvciBzdWJ0cmFjdCBhbW91bnRzIGZyb20gYW5cbiAqIGFsbG9jYXRpb24sIGJ5IGtleXdvcmQuIFRoZSBvcGVyYXRpb25GbiBwZXJmb3JtcyB0aGUgYWN0dWFsIGFkZGluZ1xuICogb3Igc3VidHJhY3RpbmcuXG4gKlxuICogQHBhcmFtIHtBbGxvY2F0aW9ufSBhbGxvY2F0aW9uXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFtb3VudEtleXdvcmRSZWNvcmRcbiAqIEBwYXJhbSB7T3BlcmF0aW9ufSBvcGVyYXRpb25GblxuICogQHJldHVybnMge0Ftb3VudEtleXdvcmRSZWNvcmR9XG4gKi9cbmNvbnN0IGRvT3BlcmF0aW9uPShhbGxvY2F0aW9uLGFtb3VudEtleXdvcmRSZWNvcmQsb3BlcmF0aW9uRm4pPT57XG5jb25zdCBhbGxLZXl3b3Jkcz1PYmplY3Qua2V5cyh7Li4uYWxsb2NhdGlvbiwuLi5hbW91bnRLZXl3b3JkUmVjb3JkfSk7XG5cbmNvbnN0IGVudHJpZXM9YWxsS2V5d29yZHMuXG5tYXAoKGtleXdvcmQpPT57XG5jb25zdCByZXN1bHQ9b3BlcmF0aW9uRm4oXG5hbGxvY2F0aW9uW2tleXdvcmRdLFxuYW1vdW50S2V5d29yZFJlY29yZFtrZXl3b3JkXSxcbmtleXdvcmQpO1xuXG5yZXR1cm5ba2V5d29yZCxyZXN1bHRdO1xuIH0pLlxuZmlsdGVyKChbX2tleXdvcmQscmVzdWx0XSk9PnJlc3VsdCE9PXVuZGVmaW5lZCk7XG5cbnJldHVybiBoYXJkZW4oT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpKTtcbiB9O1xuXG4vKiogQHR5cGUge09wZXJhdGlvbn0gKi9cbmNvbnN0IGFkZD0oYW1vdW50LGFtb3VudFRvQWRkLF9rZXl3b3JkKT0+e1xuLyogQWRkIGlmIGJvdGggYXJlIGRlZmluZWQuKi9cbmlmKGFtb3VudCYmYW1vdW50VG9BZGQpe1xucmV0dXJuIEFtb3VudE1hdGguYWRkKGFtb3VudCxhbW91bnRUb0FkZCk7XG4gfVxuLyogSWYgb25lIGlzIHVuZGVmaW5lZCAoYXQgbGVhc3Qgb25lIHdpbGwgYmUgZGVmaW5lZCksIHJldHVybiB0aGUqL1xuLyogb3RoZXIsIGRlZmluZWQgYW1vdW50Ki9cbnJldHVybiAoLyoqIEB0eXBlIHtBbW91bnR9ICovYW1vdW50fHxhbW91bnRUb0FkZCk7XG4gfTtcblxuLyoqIEB0eXBlIHtPcGVyYXRpb259ICovXG5jb25zdCBzdWJ0cmFjdD0oYW1vdW50LGFtb3VudFRvU3VidHJhY3Qsa2V5d29yZCk9Pntcbi8qIGlmIGFtb3VudFRvU3VidHJhY3QgaXMgdW5kZWZpbmVkIE9SIGlzIGRlZmluZWQsIGJ1dCBlbXB0eSovXG5pZihhbW91bnRUb1N1YnRyYWN0PT09dW5kZWZpbmVkfHxBbW91bnRNYXRoLmlzRW1wdHkoYW1vdW50VG9TdWJ0cmFjdCkpe1xuLyogU3VidHJhY3RpbmcgdW5kZWZpbmVkIGlzIGVxdWl2YWxlbnQgdG8gc3VidHJhY3RpbmcgZW1wdHksIHNvIGluKi9cbi8qIGJvdGggY2FzZXMgd2UgY2FuIHJldHVybiB0aGUgb3JpZ2luYWwgYW1vdW50LiBJZiB0aGUgb3JpZ2luYWwqL1xuLyogYW1vdW50IGlzIHVuZGVmaW5lZCwgaXQgaXMgZmlsdGVyZWQgb3V0IGluIGRvT3BlcmF0aW9uLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7QW1vdW50fSAqL2Ftb3VudCk7XG4gfWVsc2V7XG5pZihhbW91bnQ9PT11bmRlZmluZWQpe1xuLyogVHlwZVNjcmlwdCBjb25mdXNlZCBhYm91dCBgfHxgIGNvbnRyb2wgZmxvdyBzbyB1c2UgYGlmYCBpbnN0ZWFkKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTA3MzkqL1xudGhyb3cgRmFpbCBgVGhlIGFtb3VudCBjb3VsZCBub3QgYmUgc3VidHJhY3RlZCBmcm9tIHRoZSBhbGxvY2F0aW9uIGJlY2F1c2UgdGhlIGFsbG9jYXRpb24gZGlkIG5vdCBoYXZlIGFuIGFtb3VudCB1bmRlciB0aGUga2V5d29yZCAke3EoXG5rZXl3b3JkKVxuIH0uYDtcbiB9XG5BbW91bnRNYXRoLmlzR1RFKGFtb3VudCxhbW91bnRUb1N1YnRyYWN0KXx8XG5GYWlsIGBUaGUgYW1vdW50IHRvIGJlIHN1YnRyYWN0ZWQgJHthbW91bnRUb1N1YnRyYWN0fSB3YXMgZ3JlYXRlciB0aGFuIHRoZSBhbGxvY2F0aW9uJ3MgYW1vdW50ICR7YW1vdW50fSBmb3IgdGhlIGtleXdvcmQgJHtxKFxua2V5d29yZClcbiB9YDtcbnJldHVybiBBbW91bnRNYXRoLnN1YnRyYWN0KGFtb3VudCxhbW91bnRUb1N1YnRyYWN0KTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0FsbG9jYXRpb259IGFsbG9jYXRpb25cbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYW1vdW50S2V5d29yZFJlY29yZFxuICogQHJldHVybnMge0Ftb3VudEtleXdvcmRSZWNvcmR9XG4gKi9cbmNvbnN0ICAgICAgICBhZGRUb0FsbG9jYXRpb249KGFsbG9jYXRpb24sYW1vdW50S2V5d29yZFJlY29yZCk9PntcbnJldHVybiBkb09wZXJhdGlvbihhbGxvY2F0aW9uLGFtb3VudEtleXdvcmRSZWNvcmQsYWRkKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7QWxsb2NhdGlvbn0gYWxsb2NhdGlvblxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbW91bnRLZXl3b3JkUmVjb3JkXG4gKiBAcmV0dXJucyB7QW1vdW50S2V5d29yZFJlY29yZH1cbiAqLyRo4oCNX29uY2UuYWRkVG9BbGxvY2F0aW9uKGFkZFRvQWxsb2NhdGlvbik7XG5jb25zdCAgICAgICAgc3VidHJhY3RGcm9tQWxsb2NhdGlvbj0oYWxsb2NhdGlvbixhbW91bnRLZXl3b3JkUmVjb3JkKT0+e1xucmV0dXJuIGRvT3BlcmF0aW9uKGFsbG9jYXRpb24sYW1vdW50S2V5d29yZFJlY29yZCxzdWJ0cmFjdCk7XG4gfTskaOKAjV9vbmNlLnN1YnRyYWN0RnJvbUFsbG9jYXRpb24oc3VidHJhY3RGcm9tQWxsb2NhdGlvbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYWRkVG9BbGxvY2F0aW9uIjpbImFkZFRvQWxsb2NhdGlvbiJdLCJzdWJ0cmFjdEZyb21BbGxvY2F0aW9uIjpbInN1YnRyYWN0RnJvbUFsbG9jYXRpb24iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxAlnTJ4FAACeBQAAOQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvZXZhbENvbnRyYWN0Q29kZS5qc3siaW1wb3J0cyI6WyIuLi9oYW5kbGVXYXJuaW5nLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAZW5kby9pbXBvcnQtYnVuZGxlIl0sImV4cG9ydHMiOlsiZXZhbENvbnRyYWN0QnVuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGltcG9ydEJ1bmRsZSxhc3NlcnQsaGFuZGxlUFdhcm5pbmc7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vaW1wb3J0LWJ1bmRsZVwiLCBbW1wiaW1wb3J0QnVuZGxlXCIsIFskaOKAjV9hID0+IChpbXBvcnRCdW5kbGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIi4uL2hhbmRsZVdhcm5pbmcuanNcIiwgW1tcImhhbmRsZVBXYXJuaW5nXCIsIFskaOKAjV9hID0+IChoYW5kbGVQV2FybmluZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0IGV2YWxDb250cmFjdEJ1bmRsZT0oYnVuZGxlLGFkZGl0aW9uYWxFbmRvd21lbnRzPXt9KT0+e1xuLyogTWFrZSB0aGUgY29uc29sZSBtb3JlIHZlcmJvc2UuKi9cbmNvbnN0IGxvdWRlckNvbnNvbGU9e1xuLi4uY29uc29sZSxcbmxvZzpjb25zb2xlLmluZm99O1xuXG5cbmNvbnN0IGRlZmF1bHRFbmRvd21lbnRzPXtcbmNvbnNvbGU6bG91ZGVyQ29uc29sZSxcbmFzc2VydCxcblZhdERhdGE6Z2xvYmFsVGhpcy5WYXREYXRhfTtcblxuXG5jb25zdCBmdWxsRW5kb3dtZW50cz1PYmplY3QuY3JlYXRlKG51bGwse1xuLi4uT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoZGVmYXVsdEVuZG93bWVudHMpLFxuLi4uT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoYWRkaXRpb25hbEVuZG93bWVudHMpfSk7XG5cblxuLyogRXZhbHVhdGUgdGhlIGV4cG9ydCBmdW5jdGlvbiwgYW5kIHVzZSB0aGUgcmVzdWx0aW5nKi9cbi8qIG1vZHVsZSBuYW1lc3BhY2UgYXMgb3VyIGluc3RhbGxhdGlvbi4qL1xuXG5jb25zdCBpbnN0YWxsYXRpb249aW1wb3J0QnVuZGxlKGJ1bmRsZSx7XG5lbmRvd21lbnRzOmZ1bGxFbmRvd21lbnRzfSk7XG5cbmhhbmRsZVBXYXJuaW5nKGluc3RhbGxhdGlvbik7XG5yZXR1cm4gaW5zdGFsbGF0aW9uO1xuIH07JGjigI1fb25jZS5ldmFsQ29udHJhY3RCdW5kbGUoZXZhbENvbnRyYWN0QnVuZGxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJldmFsQ29udHJhY3RCdW5kbGUiOlsiZXZhbENvbnRyYWN0QnVuZGxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKdK0H04EAAAOBAAAC0AAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L2V4aXQuanN7ImltcG9ydHMiOlsiLi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3RpbWUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbIm1ha2VNYWtlRXhpdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUscHJlcGFyZUV4b0NsYXNzLHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsTSxpbml0RW1wdHksVGltZXN0YW1wU2hhcGUsaXNPbkRlbWFuZEV4aXRSdWxlLGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlLGlzV2FpdmVkRXhpdFJ1bGU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV0sW1wicHJvdmlkZUR1cmFibGVTZXRTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVTZXRTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJpc09uRGVtYW5kRXhpdFJ1bGVcIiwgWyRo4oCNX2EgPT4gKGlzT25EZW1hbmRFeGl0UnVsZSA9ICRo4oCNX2EpXV0sW1wiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGVcIiwgWyRo4oCNX2EgPT4gKGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlID0gJGjigI1fYSldXSxbXCJpc1dhaXZlZEV4aXRSdWxlXCIsIFskaOKAjV9hID0+IChpc1dhaXZlZEV4aXRSdWxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBFeGl0T2JqZWN0ST1NLmludGVyZmFjZSgnRXhpdE9iamVjdCcse2V4aXQ6TS5jYWxsKCkucmV0dXJucygpfSk7XG5jb25zdCBXYWtlckk9TS5pbnRlcmZhY2UoJ1dha2VyJyx7XG53YWtlOk0uY2FsbChUaW1lc3RhbXBTaGFwZSkucmV0dXJucygpLFxuc2NoZWR1bGU6TS5jYWxsKCkucmV0dXJucygpfSk7XG5cblxuLyoqXG4gKiBNYWtlcyBhIGZ1bmN0aW9uIHRoYXQgbWFrZXMgZXhpdE9iamVjdHMuIFRoZSBtYWtlciBpcyBleGVjdXRlZCBpbiBaQ0YuIEl0XG4gKiByZXR1cm5zIGFuIG9iamVjdCB0aGFuIGNhbiBiZSBwYXNzZWQgdG8gWm9lIHdoZW4gYSBzZWF0IGlzIGNyZWF0ZWQgc28gWm9lIGNhblxuICogaW5mb3JtIFpDRiBpZiBhbmQgd2hlbiB0aGUgc2VhdCdzIG93bmVyIGNhbGxzIHNlYXQuZXhpdCgpLlxuICovXG5cbmNvbnN0ICAgICAgICBtYWtlTWFrZUV4aXRlcj0oYmFnZ2FnZSk9PntcbmNvbnN0IGFjdGl2ZVdha2Vycz1wcm92aWRlRHVyYWJsZVNldFN0b3JlKGJhZ2dhZ2UsJ2FjdGl2ZVdha2VycycpO1xuXG5jb25zdCBtYWtlRXhpdGFibGU9cHJlcGFyZUV4b0NsYXNzKFxuYmFnZ2FnZSxcbidFeGl0T2JqZWN0JyxcbkV4aXRPYmplY3RJLFxuKHpjZlNlYXQpPT4oe3pjZlNlYXR9KSxcbntcbmV4aXQoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuc3RhdGUuemNmU2VhdC5leGl0KCk7XG4gfX0sXG5cbntcbnN0YXRlU2hhcGU6aGFyZGVuKHtcbnpjZlNlYXQ6TS5hbnkoKX0pfSk7XG5cblxuXG5jb25zdCBtYWtlV2FpdmVkPXByZXBhcmVFeG9DbGFzcyhcbmJhZ2dhZ2UsXG4nRXhpdFdhaXZlZCcsXG5FeGl0T2JqZWN0SSxcbmluaXRFbXB0eSxcbntcbmV4aXQoKXtcbi8qIGluIHRoaXMgY2FzZSB0aGUgdXNlciBoYXMgbm8gYWJpbGl0eSB0byBleGl0IHRoZWlyIHNlYXQgb24gZGVtYW5kKi9cbnRocm93IEVycm9yKFxuIGBPbmx5IHNlYXRzIHdpdGggdGhlIGV4aXQgcnVsZSBcIm9uRGVtYW5kXCIgY2FuIGV4aXQgYXQgd2lsbGApO1xuXG4gfX0pO1xuXG5cbmNvbnN0IG1ha2VXYWtlcj1wcmVwYXJlRXhvQ2xhc3MoXG5iYWdnYWdlLFxuJ1dha2VyJyxcbldha2VySSxcbih6Y2ZTZWF0LGFmdGVyRGVhZGxpbmUpPT4oe3pjZlNlYXQsYWZ0ZXJEZWFkbGluZX0pLFxue1xud2FrZShfd2hlbil7XG5jb25zdHtzdGF0ZSxzZWxmfT10aGlzO1xuXG5hY3RpdmVXYWtlcnMuZGVsZXRlKHNlbGYpO1xuLyogVGhlIGNvbnRyYWN0IG1heSBoYXZlIGV4aXRlZCB0aGUgc2VhdCBhZnRlciBzYXRpc2Z5aW5nIGl0IG9yKi9cbi8qIHJlamVjdGluZyBpdCwgYnV0IHRoZSBvbkRlbWFuZCBleGl0IHdha2VyIHdpbGwgc3RpbGwgZmlyZS4qL1xuaWYoIXN0YXRlLnpjZlNlYXQuaGFzRXhpdGVkKCkpe1xuc3RhdGUuemNmU2VhdC5leGl0KCk7XG4gfVxuIH0sXG5zY2hlZHVsZSgpe1xuY29uc3R7c3RhdGUsc2VsZn09dGhpcztcblxuRShzdGF0ZS5hZnRlckRlYWRsaW5lLnRpbWVyKS5cbnNldFdha2V1cChzdGF0ZS5hZnRlckRlYWRsaW5lLmRlYWRsaW5lLHNlbGYpLlxuY2F0Y2goKHJlYXNvbik9PntcbmNvbnNvbGUuZXJyb3IoXG4gYFRoZSBzZWF0IGNvdWxkIG5vdCBiZSBtYWRlIHdpdGggdGhlIHByb3ZpZGVkIHRpbWVyICR7c3RhdGUuYWZ0ZXJEZWFkbGluZS50aW1lcn0gYW5kIGRlYWRsaW5lICR7c3RhdGUuYWZ0ZXJEZWFkbGluZS5kZWFkbGluZX1gKTtcblxuY29uc29sZS5lcnJvcihyZWFzb24pO1xuc3RhdGUuemNmU2VhdC5mYWlsKHJlYXNvbik7XG50aHJvdyByZWFzb247XG4gfSk7XG4gfX0pO1xuXG5cblxuLyogT24gcmV2aXZhbCwgcmVzY2hlZHVsZSBhbGwgdGhlIGFjdGl2ZSB3YWtlcnMuKi9cbmZvcihjb25zdCB3YWtlciBvZiBhY3RpdmVXYWtlcnMudmFsdWVzKCkpe1xud2FrZXIuc2NoZWR1bGUoKTtcbiB9XG5cbi8qKlxuICogTWFrZXMgdGhlIGFwcHJvcHJpYXRlIGV4aXRPYmosIHdoaWNoIHJ1bnMgaW4gWkNGIGFuZCBhbGxvd3MgdGhlIHNlYXQncyBvd25lclxuICogdG8gcmVxdWVzdCB0aGUgcG9zaXRpb24gYmUgZXhpdGVkLlxuICpcbiAqIEB0eXBlIHtNYWtlRXhpdE9ian1cbiAqL1xucmV0dXJuKHByb3Bvc2FsLHpjZlNlYXQpPT57XG5jb25zdHtleGl0fT1wcm9wb3NhbDtcblxuaWYoaXNPbkRlbWFuZEV4aXRSdWxlKGV4aXQpKXtcbi8qIEFsbG93IHRoZSB1c2VyIHRvIGV4aXQgdGhlaXIgc2VhdCBvbiBkZW1hbmQuIE5vdGU6IHdlIG11c3Qgd3JhcCovXG4vKiBpdCBpbiBhbiBvYmplY3QgdG8gc2VuZCBpdCBiYWNrIHRvIFpvZSBiZWNhdXNlIG91ciBtYXJzaGFsbGluZyBsYXllciovXG4vKiBvbmx5IGFsbG93cyB0d28ga2luZHMgb2Ygb2JqZWN0czogcmVjb3JkcyAobm8gbWV0aG9kcyBhbmQgb25seSovXG4vKiBkYXRhKSBhbmQgcHJlc2VuY2VzIChsb2NhbCBwcm94aWVzIGZvciBvYmplY3RzIHRoYXQgbWF5IGhhdmUqL1xuLyogbWV0aG9kcykuKi9cbnJldHVybiBtYWtlRXhpdGFibGUoemNmU2VhdCk7XG4gfVxuXG5pZihpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZShleGl0KSl7XG5jb25zdCB3YWtlcj1tYWtlV2FrZXIoemNmU2VhdCxleGl0LmFmdGVyRGVhZGxpbmUpO1xuYWN0aXZlV2FrZXJzLmFkZCh3YWtlcik7XG4vKiBBdXRvbWF0aWNhbGx5IGV4aXQgdGhlIHNlYXQgYWZ0ZXIgZGVhZGxpbmUuKi9cbndha2VyLnNjaGVkdWxlKCk7XG4gfVxuXG5pZihpc1dhaXZlZEV4aXRSdWxlKGV4aXQpfHxpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZShleGl0KSl7XG5yZXR1cm4gbWFrZVdhaXZlZCgpO1xuIH1cblxudGhyb3cgRmFpbCBgZXhpdCBraW5kIHdhcyBub3QgcmVjb2duaXplZDogJHtxKGV4aXQpfWA7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZU1ha2VFeGl0ZXIobWFrZU1ha2VFeGl0ZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYWtlRXhpdGVyIjpbIm1ha2VNYWtlRXhpdGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO4InwbeAgAA3gIAADcAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L2ludGVybmFsLXR5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbi8qKlxuICogQHR5cGVkZWYgeygge3pjZn06IHt6Y2Y6IFpDRn0gKSA9PiB2b2lkfSBUZXN0SmlnU2V0dGVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBaQ0ZaeWdvdGVcbiAqIEBwcm9wZXJ0eSB7KGluc3RhbmNlQWRtaW5Gcm9tWm9lOiBFUmVmPFpvZUluc3RhbmNlQWRtaW4+LFxuICogICAgIGluc3RhbmNlUmVjb3JkRnJvbVpvZTogSW5zdGFuY2VSZWNvcmQsXG4gKiAgICAgaXNzdWVyU3RvcmFnZUZyb21ab2U6IElzc3VlclJlY29yZHMsXG4gKiAgICAgcHJpdmF0ZUFyZ3M/OiBvYmplY3QsXG4gKiApID0+IFByb21pc2U8RXhlY3V0ZUNvbnRyYWN0UmVzdWx0Pn0gc3RhcnRDb250cmFjdFxuICogQHByb3BlcnR5IHsocHJpdmF0ZUFyZ3M/OiBvYmplY3QpID0+IHZvaWR9IHJlc3RhcnRDb250cmFjdFxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEekhcQnDAAAJwwAADwAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L29mZmVySGFuZGxlclN0b3JhZ2UuanN7ImltcG9ydHMiOlsiLi4vbWFrZUhhbmRsZS5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbIm1ha2VPZmZlckhhbmRsZXJTdG9yYWdlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsVG9GYXJGdW5jdGlvbixjYW5CZUR1cmFibGUscHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsZGVmaW5lRHVyYWJsZUhhbmRsZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIlRvRmFyRnVuY3Rpb25cIiwgWyRo4oCNX2EgPT4gKFRvRmFyRnVuY3Rpb24gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiY2FuQmVEdXJhYmxlXCIsIFskaOKAjV9hID0+IChjYW5CZUR1cmFibGUgPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9tYWtlSGFuZGxlLmpzXCIsIFtbXCJkZWZpbmVEdXJhYmxlSGFuZGxlXCIsIFskaOKAjV9hID0+IChkZWZpbmVEdXJhYmxlSGFuZGxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0ICAgICAgICBtYWtlT2ZmZXJIYW5kbGVyU3RvcmFnZT0oemNmQmFnZ2FnZSk9PntcbmNvbnN0IG1ha2VJbnZpdGF0aW9uSGFuZGxlPWRlZmluZUR1cmFibGVIYW5kbGUoemNmQmFnZ2FnZSwnSW52aXRhdGlvbicpO1xuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8SW52aXRhdGlvbkhhbmRsZSwgT2ZmZXJIYW5kbGVyPn0gKi9cblxuLyogWkNGIG5lZWRzIHRvIGVwaGVtZXJhbGx5IGhvbGQgb24gdG8gZXBoZW1lcmFsIGhhbmRsZXJzLCBhbmQgZHVyYWJseSBob2xkKi9cbi8qIG9udG8gaGFuZGxlcnMgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUgZHVyYWJsZS4gV2Uga2VlcCB0d28gc3RvcmVzIGFuZCBzdG9yZSovXG4vKiBlYWNoIGhhbmRsZXIgaW4gdGhlIHJpZ2h0IG9uZS4gV2hlbiByZXRyaWV2aW5nLCB3ZSBsb29rIGZvciB0aGVtIGluIGJvdGguKi9cbi8qIElmIFpvZSByZXN0YXJ0cywgdGhlIGVwaGVtZXJhbCBvbmVzIHdpbGwgYmUgbG9zdCwgYW5kIHRoZSBkdXJhYmxlIG9uZXMgd2lsbCovXG4vKiBzdXJ2aXZlLiovXG5jb25zdCBpbnZpdGF0aW9uSGFuZGxlVG9FcGhlbWVyYWxIYW5kbGVyPW1ha2VTY2FsYXJXZWFrTWFwU3RvcmUoXG4naW52aXRhdGlvbkhhbmRsZVRvRXBoZW1lcmFsSGFuZGxlcicpO1xuXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxJbnZpdGF0aW9uSGFuZGxlLCBPZmZlckhhbmRsZXI+fSAqL1xuY29uc3QgaW52aXRhdGlvbkhhbmRsZVRvRHVyYWJsZUhhbmRsZXI9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG56Y2ZCYWdnYWdlLFxuJ2ludml0YXRpb25IYW5kbGVUb0R1cmFibGVIYW5kbGVyJyk7XG5cblxuLyoqIEB0eXBlIHsob2ZmZXJIYW5kbGVyOiBPZmZlckhhbmRsZXIpID0+IEludml0YXRpb25IYW5kbGV9ICovXG5jb25zdCBzdG9yZU9mZmVySGFuZGxlcj0ob2ZmZXJIYW5kbGVyKT0+e1xuaWYodHlwZW9mIG9mZmVySGFuZGxlcj09PSdmdW5jdGlvbicpe1xub2ZmZXJIYW5kbGVyPVRvRmFyRnVuY3Rpb24oJ29mZmVySGFuZGxlcicsb2ZmZXJIYW5kbGVyKTtcbiB9XG5jb25zdCBpbnZpdGF0aW9uSGFuZGxlVG9IYW5kbGVyPWNhbkJlRHVyYWJsZShvZmZlckhhbmRsZXIpP1xuaW52aXRhdGlvbkhhbmRsZVRvRHVyYWJsZUhhbmRsZXI6XG5pbnZpdGF0aW9uSGFuZGxlVG9FcGhlbWVyYWxIYW5kbGVyO1xuXG5jb25zdCBpbnZpdGF0aW9uSGFuZGxlPW1ha2VJbnZpdGF0aW9uSGFuZGxlKCk7XG5pbnZpdGF0aW9uSGFuZGxlVG9IYW5kbGVyLmluaXQoaW52aXRhdGlvbkhhbmRsZSxvZmZlckhhbmRsZXIpO1xucmV0dXJuIGludml0YXRpb25IYW5kbGU7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7KGludml0YXRpb25IYW5kbGU6IEludml0YXRpb25IYW5kbGUsIGRldGFpbHM/OiBEZXRhaWxzKSA9PiBPZmZlckhhbmRsZXJ9XG4gKi9cbmNvbnN0IHRha2VPZmZlckhhbmRsZXI9KFxuaW52aXRhdGlvbkhhbmRsZSxcbmRldGFpbHM9J29mZmVySGFuZGxlciBtYXkgbm90IGhhdmUgc3Vydml2ZWQgdXBncmFkZScpPT5cbntcbmxldCBpbnZpdGF0aW9uSGFuZGxlVG9IYW5kbGVyO1xuaWYoaW52aXRhdGlvbkhhbmRsZVRvRHVyYWJsZUhhbmRsZXIuaGFzKGludml0YXRpb25IYW5kbGUpKXtcbmludml0YXRpb25IYW5kbGVUb0hhbmRsZXI9aW52aXRhdGlvbkhhbmRsZVRvRHVyYWJsZUhhbmRsZXI7XG4gfWVsc2V7XG5hc3NlcnQoaW52aXRhdGlvbkhhbmRsZVRvRXBoZW1lcmFsSGFuZGxlci5oYXMoaW52aXRhdGlvbkhhbmRsZSksZGV0YWlscyk7XG5pbnZpdGF0aW9uSGFuZGxlVG9IYW5kbGVyPWludml0YXRpb25IYW5kbGVUb0VwaGVtZXJhbEhhbmRsZXI7XG4gfVxuY29uc3Qgb2ZmZXJIYW5kbGVyPWludml0YXRpb25IYW5kbGVUb0hhbmRsZXIuZ2V0KGludml0YXRpb25IYW5kbGUpO1xuaW52aXRhdGlvbkhhbmRsZVRvSGFuZGxlci5kZWxldGUoaW52aXRhdGlvbkhhbmRsZSk7XG5yZXR1cm4gb2ZmZXJIYW5kbGVyO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe1xuc3RvcmVPZmZlckhhbmRsZXIsXG50YWtlT2ZmZXJIYW5kbGVyfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZU9mZmVySGFuZGxlclN0b3JhZ2UobWFrZU9mZmVySGFuZGxlclN0b3JhZ2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VPZmZlckhhbmRsZXJTdG9yYWdlIjpbIm1ha2VPZmZlckhhbmRsZXJTdG9yYWdlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJqoOUK8EAAAvBAAADQAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCJdLCJleHBvcnRzIjpbImlzT2ZmZXJTYWZlIiwic2F0aXNmaWVzV2FudCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRNYXRoOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc09mZmVyU2FmZSwgJ25hbWUnLCB7dmFsdWU6IFwiaXNPZmZlclNhZmVcIn0pOyRo4oCNX29uY2UuaXNPZmZlclNhZmUoaXNPZmZlclNhZmUpOyAgIFxuXG4vKipcbiAqIEhlbHBlciB0byBwZXJmb3JtIHNhdGlzZmllc1dhbnQgYW5kIHNhdGlzZmllc0dpdmUuIElzXG4gKiBhbGxvY2F0aW9uQW1vdW50IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byByZXF1aXJlZEFtb3VudCBmb3IgZXZlcnlcbiAqIGtleXdvcmQgb2YgZ2l2ZU9yV2FudD9cbiAqXG4gKiBUbyBwcmVwYXJlIGZvciBtdWx0aXBsZXMsIHNhdGlzZmllc1dhbnQgYW5kIHNhdGlzZmllc0dpdmUgcmV0dXJuIDAgb3IgMS5cbiAqIGlzT2ZmZXJTYWZlIHdpbGwgc3RpbGwgYmUgYm9vbGVhbi4gV2hlbiB3ZSBoYXZlIE11bHRpcGxlcywgc2F0aXNmaWVzV2FudCBhbmRcbiAqIHNhdGlzZmllc0dpdmUgd2lsbCB0ZWxsIGhvdyBtYW55IHRpbWVzIHRoZSBvZmZlciB3YXMgbWF0Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGdpdmVPcldhbnRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvblxuICogQHJldHVybnMgezB8MX1cbiAqL1xuY29uc3Qgc2F0aXNmaWVzSW50ZXJuYWw9KGdpdmVPcldhbnQ9e30sYWxsb2NhdGlvbik9PntcbmNvbnN0IGlzR1RFQnlLZXl3b3JkPShba2V5d29yZCxyZXF1aXJlZEFtb3VudF0pPT57XG4vKiBJZiB0aGVyZSBpcyBubyBhbGxvY2F0aW9uIGZvciBhIGtleXdvcmQsIHdlIGtub3cgdGhlIGdpdmVPcldhbnQqL1xuLyogaXMgbm90IHNhdGlzZmllZCB3aXRob3V0IGNoZWNraW5nIGZ1cnRoZXIuKi9cbmlmKGFsbG9jYXRpb25ba2V5d29yZF09PT11bmRlZmluZWQpe1xucmV0dXJuIDA7XG4gfVxuY29uc3QgYWxsb2NhdGlvbkFtb3VudD1hbGxvY2F0aW9uW2tleXdvcmRdO1xucmV0dXJuIEFtb3VudE1hdGguaXNHVEUoYWxsb2NhdGlvbkFtb3VudCxyZXF1aXJlZEFtb3VudCk/MTowO1xuIH07XG5yZXR1cm4gT2JqZWN0LmVudHJpZXMoZ2l2ZU9yV2FudCkuZXZlcnkoaXNHVEVCeUtleXdvcmQpPzE6MDtcbiB9O1xuXG4vKipcbiAqIEZvciB0aGlzIGFsbG9jYXRpb24gdG8gc2F0aXNmeSB3aGF0IHRoZSB1c2VyIHdhbnRlZCwgdGhlaXJcbiAqIGFsbG9jYXRlZCBhbW91bnRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHByb3Bvc2FsLndhbnQuXG4gKlxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWwgLSB0aGUgcnVsZXMgdGhhdCBhY2NvbXBhbmllZCB0aGVcbiAqIGVzY3JvdyBvZiBwYXltZW50cyB0aGF0IGRpY3RhdGUgd2hhdCB0aGUgdXNlciBleHBlY3RlZCB0byBnZXQgYmFja1xuICogZnJvbSBab2UuIEEgcHJvcG9zYWwgaXMgYSByZWNvcmQgd2l0aCBrZXlzIGBnaXZlYCwgYHdhbnRgLCBhbmRcbiAqIGBleGl0YC4gYGdpdmVgIGFuZCBgd2FudGAgYXJlIHJlY29yZHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZFxuICogYW1vdW50cyBhcyB2YWx1ZXMuIFRoZSBwcm9wb3NhbCBpcyBhIHVzZXIncyB1bmRlcnN0YW5kaW5nIG9mIHRoZVxuICogY29udHJhY3QgdGhhdCB0aGV5IGFyZSBlbnRlcmluZyB3aGVuIHRoZXkgbWFrZSBhbiBvZmZlci5cbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvbiAtIGEgcmVjb3JkIHdpdGgga2V5d29yZHNcbiAqIGFzIGtleXMgYW5kIGFtb3VudHMgYXMgdmFsdWVzLiBUaGVzZSBhbW91bnRzIGFyZSB0aGUgcmVhbGxvY2F0aW9uXG4gKiB0byBiZSBnaXZlbiB0byBhIHVzZXIuXG4gKi9cbmNvbnN0IHNhdGlzZmllc1dhbnQ9KHByb3Bvc2FsLGFsbG9jYXRpb24pPT5cbnNhdGlzZmllc0ludGVybmFsKHByb3Bvc2FsLndhbnQsYWxsb2NhdGlvbik7XG5cbi8qKlxuICogRm9yIHRoaXMgYWxsb2NhdGlvbiB0byBjb3VudCBhcyBhIGZ1bGwgcmVmdW5kLCB0aGUgYWxsb2NhdGVkXG4gKiBhbW91bnRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHdoYXQgd2FzIG9yaWdpbmFsbHlcbiAqIG9mZmVyZWQgKHByb3Bvc2FsLmdpdmUpLlxuICpcbiAqIEBwYXJhbSAge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbCAtIHRoZSBydWxlcyB0aGF0IGFjY29tcGFuaWVkIHRoZVxuICogZXNjcm93IG9mIHBheW1lbnRzIHRoYXQgZGljdGF0ZSB3aGF0IHRoZSB1c2VyIGV4cGVjdGVkIHRvIGdldCBiYWNrXG4gKiBmcm9tIFpvZS4gQSBwcm9wb3NhbCBpcyBhIHJlY29yZCB3aXRoIGtleXMgYGdpdmVgLCBgd2FudGAsIGFuZFxuICogYGV4aXRgLiBgZ2l2ZWAgYW5kIGB3YW50YCBhcmUgcmVjb3JkcyB3aXRoIGtleXdvcmRzIGFzIGtleXMgYW5kXG4gKiBhbW91bnRzIGFzIHZhbHVlcy4gVGhlIHByb3Bvc2FsIGlzIGEgdXNlcidzIHVuZGVyc3RhbmRpbmcgb2YgdGhlXG4gKiBjb250cmFjdCB0aGF0IHRoZXkgYXJlIGVudGVyaW5nIHdoZW4gdGhleSBtYWtlIGFuIG9mZmVyLlxuICogQHBhcmFtICB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvbiAtIGEgcmVjb3JkIHdpdGgga2V5d29yZHNcbiAqIGFzIGtleXMgYW5kIGFtb3VudHMgYXMgdmFsdWVzLiBUaGVzZSBhbW91bnRzIGFyZSB0aGUgcmVhbGxvY2F0aW9uXG4gKiB0byBiZSBnaXZlbiB0byBhIHVzZXIuXG4gKi8kaOKAjV9vbmNlLnNhdGlzZmllc1dhbnQoc2F0aXNmaWVzV2FudCk7XG5jb25zdCBzYXRpc2ZpZXNHaXZlPShwcm9wb3NhbCxhbGxvY2F0aW9uKT0+XG5zYXRpc2ZpZXNJbnRlcm5hbChwcm9wb3NhbC5naXZlLGFsbG9jYXRpb24pO1xuXG4vKipcbiAqIGBpc09mZmVyU2FmZWAgY2hlY2tzIG9mZmVyIHNhZmV0eSBmb3IgYSBzaW5nbGUgb2ZmZXIuXG4gKlxuICogTm90ZTogVGhpcyBpbXBsZW1lbnRhdGlvbiBjaGVja3Mgd2hldGhlciB3ZSBmdWxseSBzYXRpc2Z5XG4gKiBgcHJvcG9zYWwuZ2l2ZWAgKGdpdmluZyBhIHJlZnVuZCkgb3Igd2hldGhlciB3ZSBmdWxseSBzYXRpc2Z5XG4gKiBgcHJvcG9zYWwud2FudGAuIEJvdGggY2FuIGJlIGZ1bGx5IHNhdGlzZmllZC5cbiAqXG4gKiBAcGFyYW0gIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWwgLSB0aGUgcnVsZXMgdGhhdCBhY2NvbXBhbmllZCB0aGVcbiAqIGVzY3JvdyBvZiBwYXltZW50cyB0aGF0IGRpY3RhdGUgd2hhdCB0aGUgdXNlciBleHBlY3RlZCB0byBnZXQgYmFja1xuICogZnJvbSBab2UuIEEgcHJvcG9zYWwgaXMgYSByZWNvcmQgd2l0aCBrZXlzIGBnaXZlYCwgYHdhbnRgLCBhbmRcbiAqIGBleGl0YC4gYGdpdmVgIGFuZCBgd2FudGAgYXJlIHJlY29yZHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZFxuICogYW1vdW50cyBhcyB2YWx1ZXMuIFRoZSBwcm9wb3NhbCBpcyBhIHVzZXIncyB1bmRlcnN0YW5kaW5nIG9mIHRoZVxuICogY29udHJhY3QgdGhhdCB0aGV5IGFyZSBlbnRlcmluZyB3aGVuIHRoZXkgbWFrZSBhbiBvZmZlci5cbiAqIEBwYXJhbSAge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovXG5mdW5jdGlvbiBpc09mZmVyU2FmZShwcm9wb3NhbCxhbGxvY2F0aW9uKXtcbnJldHVybihcbnNhdGlzZmllc0dpdmUocHJvcG9zYWwsYWxsb2NhdGlvbik+MHx8XG5zYXRpc2ZpZXNXYW50KHByb3Bvc2FsLGFsbG9jYXRpb24pPjApO1xuXG4gfVxuXG5oYXJkZW4oaXNPZmZlclNhZmUpO1xuaGFyZGVuKHNhdGlzZmllc1dhbnQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNhdGlzZmllc1dhbnQiOlsic2F0aXNmaWVzV2FudCJdLCJpc09mZmVyU2FmZSI6WyJpc09mZmVyU2FmZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACCbCRllw0AAJcNAAAzAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RGYWNldC9yZWFsbG9jYXRlLmpzeyJpbXBvcnRzIjpbIi4vYWxsb2NhdGlvbk1hdGguanMiLCIuL3JpZ2h0c0NvbnNlcnZhdGlvbi5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlQWxsb2NhdGlvbk1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlU2NhbGFyTWFwU3RvcmUsYXNzZXJ0UmlnaHRzQ29uc2VydmVkLGFkZFRvQWxsb2NhdGlvbixzdWJ0cmFjdEZyb21BbGxvY2F0aW9uOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIi4vcmlnaHRzQ29uc2VydmF0aW9uLmpzXCIsIFtbXCJhc3NlcnRSaWdodHNDb25zZXJ2ZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJpZ2h0c0NvbnNlcnZlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2FsbG9jYXRpb25NYXRoLmpzXCIsIFtbXCJhZGRUb0FsbG9jYXRpb25cIiwgWyRo4oCNX2EgPT4gKGFkZFRvQWxsb2NhdGlvbiA9ICRo4oCNX2EpXV0sW1wic3VidHJhY3RGcm9tQWxsb2NhdGlvblwiLCBbJGjigI1fYSA9PiAoc3VidHJhY3RGcm9tQWxsb2NhdGlvbiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZWRlZiB7QXJyYXk8QW1vdW50S2V5d29yZFJlY29yZD59IFRyYW5zYWN0aW9uTGlzdCAqL1xuXG4vKipcbiAqIENvbnZlcnQgZnJvbSBhIGxpc3Qgb2YgdHJhbnNmZXIgZGVzY3JpcHRpb25zIChbZnJvbVNlYXQsIHRvU2VhdCwgZnJvbUFtb3VudCxcbiAqIHRvQW1vdW50XSwgd2l0aCBtYW55IHBhcnRzIG9wdGlvbmFsKSB0byBhIGxpc3Qgb2YgcmVzdWx0aW5nIGFsbG9jYXRpb25zIGZvclxuICogZWFjaCBvZiB0aGUgc2VhdHMgbWVudGlvbmVkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8VHJhbnNmZXJQYXJ0Pn0gdHJhbnNmZXJzXG4gKiBAcmV0dXJucyB7W1pDRlNlYXQsIEFtb3VudEtleXdvcmRSZWNvcmRdW119XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQWxsb2NhdGlvbk1hcD0odHJhbnNmZXJzKT0+e1xuLyoqIEB0eXBlIHtNYXBTdG9yZTxaQ0ZTZWF0LCBbVHJhbnNhY3Rpb25MaXN0LCBUcmFuc2FjdGlvbkxpc3RdPn0gKi9cbmNvbnN0IGFsbG9jYXRpb25zPW1ha2VTY2FsYXJNYXBTdG9yZSgpO1xuXG5jb25zdCBnZXRBbGxvY2F0aW9ucz0oc2VhdCk9PntcbmlmKGFsbG9jYXRpb25zLmhhcyhzZWF0KSl7XG5yZXR1cm4gYWxsb2NhdGlvbnMuZ2V0KHNlYXQpO1xuIH1cblxuLyoqIEB0eXBlIHtbVHJhbnNhY3Rpb25MaXN0LCBUcmFuc2FjdGlvbkxpc3RdfSAqL1xuY29uc3QgcGFpcj1bW10sW11dO1xuYWxsb2NhdGlvbnMuaW5pdChzZWF0LHBhaXIpO1xucmV0dXJuIHBhaXI7XG4gfTtcblxuY29uc3QgZGVjcmVtZW50QWxsb2NhdGlvbj0oc2VhdCxkZWNyZW1lbnQpPT57XG5jb25zdFtpbmNyLGRlY3JdPWdldEFsbG9jYXRpb25zKHNlYXQpO1xuXG5jb25zdCBuZXdEZWNyPVsuLi5kZWNyLGRlY3JlbWVudF07XG5hbGxvY2F0aW9ucy5zZXQoc2VhdCxbaW5jcixuZXdEZWNyXSk7XG4gfTtcblxuY29uc3QgaW5jcmVtZW50QWxsb2NhdGlvbj0oc2VhdCxpbmNyZW1lbnQpPT57XG5jb25zdFtpbmNyLGRlY3JdPWdldEFsbG9jYXRpb25zKHNlYXQpO1xuXG5jb25zdCBuZXdJbmNyPVsuLi5pbmNyLGluY3JlbWVudF07XG5hbGxvY2F0aW9ucy5zZXQoc2VhdCxbbmV3SW5jcixkZWNyXSk7XG4gfTtcblxuZm9yKGNvbnN0W2Zyb21TZWF0LHRvU2VhdCxmcm9tQW1vdW50cyx0b0Ftb3VudHNdb2YgdHJhbnNmZXJzKXtcbmlmKGZyb21TZWF0KXtcbmlmKCFmcm9tQW1vdW50cyl7XG50aHJvdyBGYWlsIGBUcmFuc2ZlciBmcm9tICR7ZnJvbVNlYXR9IG11c3Qgc2F5IGhvdyBtdWNoYDtcbiB9XG5kZWNyZW1lbnRBbGxvY2F0aW9uKGZyb21TZWF0LGZyb21BbW91bnRzKTtcbmlmKHRvU2VhdCl7XG4vKiBDb25zZXJ2ZWQgdHJhbnNmZXIgYmV0d2VlbiBzZWF0cyovXG5pZih0b0Ftb3VudHMpe1xuLyogZGlzdGluY3QgYW1vdW50cywgc28gd2UgY2hlY2sgY29uc2VydmF0aW9uLiovXG5hc3NlcnRSaWdodHNDb25zZXJ2ZWQoXG5PYmplY3QudmFsdWVzKGZyb21BbW91bnRzKSxcbk9iamVjdC52YWx1ZXModG9BbW91bnRzKSk7XG5cbmluY3JlbWVudEFsbG9jYXRpb24odG9TZWF0LHRvQW1vdW50cyk7XG4gfWVsc2V7XG4vKiBmcm9tQW1vdW50cyB3aWxsIGJlIHVzZWQgZm9yIHRvQW1vdW50cyBhcyB3ZWxsKi9cbmluY3JlbWVudEFsbG9jYXRpb24odG9TZWF0LGZyb21BbW91bnRzKTtcbiB9XG4gfWVsc2V7XG4vKiBUcmFuc2ZlciBvbmx5IGZyb20gZnJvbVNlYXQqL1xuIXRvQW1vdW50c3x8XG5GYWlsIGBUcmFuc2ZlciB3aXRob3V0IHRvU2VhdCBjYW5ub3QgaGF2ZSB0b0Ftb3VudHMgJHt0b0Ftb3VudHN9YDtcbiB9XG4gfWVsc2V7XG50b1NlYXR8fEZhaWwgYFRyYW5zZmVyIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgb2YgZnJvbVNlYXQgb3IgdG9TZWF0YDtcbi8qIFRyYW5zZmVyIG9ubHkgdG8gdG9TZWF0Ki9cbiFmcm9tQW1vdW50c3x8XG5GYWlsIGBUcmFuc2ZlciB3aXRob3V0IGZyb21TZWF0IGNhbm5vdCBoYXZlIGZyb21BbW91bnRzICR7ZnJvbUFtb3VudHN9YDtcbnRvQW1vdW50c3x8RmFpbCBgVHJhbnNmZXIgdG8gJHt0b1NlYXR9IG11c3Qgc2F5IGhvdyBtdWNoYDtcbmluY3JlbWVudEFsbG9jYXRpb24odG9TZWF0LHRvQW1vdW50cyk7XG4gfVxuIH1cblxuLyoqIEB0eXBlIHtbWkNGU2VhdCxBbW91bnRLZXl3b3JkUmVjb3JkXVtdfSAqL1xuY29uc3QgcmVzdWx0aW5nQWxsb2NhdGlvbnM9W107XG5mb3IoY29uc3Rbc2VhdCxbaW5jckxpc3QsZGVjckxpc3RdXW9mIGFsbG9jYXRpb25zLmVudHJpZXMoKSl7XG5sZXQgbmV3QWxsb2M9c2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpO1xuZm9yKGNvbnN0IGluY3Igb2YgaW5jckxpc3Qpe1xubmV3QWxsb2M9YWRkVG9BbGxvY2F0aW9uKG5ld0FsbG9jLGluY3IpO1xuIH1cbmZvcihjb25zdCBkZWNyIG9mIGRlY3JMaXN0KXtcbm5ld0FsbG9jPXN1YnRyYWN0RnJvbUFsbG9jYXRpb24obmV3QWxsb2MsZGVjcik7XG4gfVxucmVzdWx0aW5nQWxsb2NhdGlvbnMucHVzaChbc2VhdCxuZXdBbGxvY10pO1xuIH1cbnJldHVybiByZXN1bHRpbmdBbGxvY2F0aW9ucztcbiB9OyRo4oCNX29uY2UubWFrZUFsbG9jYXRpb25NYXAobWFrZUFsbG9jYXRpb25NYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBbGxvY2F0aW9uTWFwIjpbIm1ha2VBbGxvY2F0aW9uTWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACn3kkENDwAADQ8AADsAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L3JpZ2h0c0NvbnNlcnZhdGlvbi5qc3siaW1wb3J0cyI6WyIuLi9pbnRlcm5hbC10eXBlcy5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImFzc2VydFJpZ2h0c0NvbnNlcnZlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlU2NhbGFyTWFwU3RvcmUsYXNzZXJ0LEZhaWwsQW1vdW50TWF0aDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4uL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShhc3NlcnRSaWdodHNDb25zZXJ2ZWQsICduYW1lJywge3ZhbHVlOiBcImFzc2VydFJpZ2h0c0NvbnNlcnZlZFwifSk7JGjigI1fb25jZS5hc3NlcnRSaWdodHNDb25zZXJ2ZWQoYXNzZXJ0UmlnaHRzQ29uc2VydmVkKTsgICBcblxuXG5cblxuXG4vKipcbiAqIEl0ZXJhdGUgb3ZlciB0aGUgYW1vdW50cyBhbmQgc3VtLCBzdG9yaW5nIHRoZSBzdW1zIGluIGFcbiAqIG1hcCBieSBicmFuZC5cbiAqXG4gKiBAcGFyYW0gIHtBbW91bnRbXX0gYW1vdW50cyAtIGFuIGFycmF5IG9mIGFtb3VudHNcbiAqIEByZXR1cm5zIHtNYXBTdG9yZTxCcmFuZCwgQW1vdW50Pn0gc3Vtc0J5QnJhbmQgLSBhIG1hcCBvZiBCcmFuZCBrZXlzIGFuZFxuICogQW1vdW50IHZhbHVlcy4gVGhlIGFtb3VudHMgYXJlIHRoZSBzdW1zLlxuICovXG5jb25zdCBzdW1CeUJyYW5kPShhbW91bnRzKT0+e1xuLyoqIEB0eXBlIHtNYXBTdG9yZTxCcmFuZCwgQW1vdW50Pn0gKi9cbmNvbnN0IHN1bXNCeUJyYW5kPW1ha2VTY2FsYXJNYXBTdG9yZSgnYnJhbmQnKTtcbmFtb3VudHMuZm9yRWFjaCgoYW1vdW50KT0+e1xuY29uc3R7YnJhbmR9PWFtb3VudDtcbmlmKCFzdW1zQnlCcmFuZC5oYXMoYnJhbmQpKXtcbnN1bXNCeUJyYW5kLmluaXQoYnJhbmQsYW1vdW50KTtcbiB9ZWxzZXtcbmNvbnN0IHN1bVNvRmFyPXN1bXNCeUJyYW5kLmdldChicmFuZCk7XG5zdW1zQnlCcmFuZC5zZXQoYnJhbmQsQW1vdW50TWF0aC5hZGQoc3VtU29GYXIsYW1vdW50KSk7XG4gfVxuIH0pO1xucmV0dXJuIHN1bXNCeUJyYW5kO1xuIH07XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgdGhlIGxlZnQgc3VtcyBieSBicmFuZCBlcXVhbCB0aGUgcmlnaHQgc3VtcyBieSBicmFuZFxuICpcbiAqIEBwYXJhbSAge01hcFN0b3JlPEJyYW5kLCBBbW91bnQ+fSBsZWZ0U3Vtc0J5QnJhbmQgLSBhIG1hcCBvZiBicmFuZHMgdG8gc3Vtc1xuICogQHBhcmFtICB7TWFwU3RvcmU8QnJhbmQsIEFtb3VudD59IHJpZ2h0U3Vtc0J5QnJhbmQgLSBhIG1hcCBvZiBicmFuZHMgdG8gc3Vtc1xuICovXG5jb25zdCBhc3NlcnRFcXVhbFBlckJyYW5kPShsZWZ0U3Vtc0J5QnJhbmQscmlnaHRTdW1zQnlCcmFuZCk9Pntcbi8qIFdlIGNhbm5vdCBhc3N1bWUgdGhhdCBhbGwgb2YgdGhlIGJyYW5kIGtleXMgcHJlc2VudCBpbiovXG4vKiBsZWZ0U3Vtc0J5QnJhbmQgYXJlIGFsc28gcHJlc2VudCBpbiByaWdodFN1bXNCeUJyYW5kLiBBIGVtcHR5Ki9cbi8qIGFtb3VudCBjb3VsZCBiZSBpbnRyb2R1Y2VkIG9yIGRyb3BwZWQsIGFuZCB0aGlzIHNob3VsZCBzdGlsbCBiZSovXG4vKiBkZWVtZWQgXCJlcXVhbFwiIGZyb20gdGhlIHBlcnNwZWN0aXZlIG9mIHJpZ2h0cyBjb25zZXJ2YXRpb24uKi9cblxuLyogVGh1cywgd2Ugc2hvdWxkIGFsbG93IGZvciBhIGJyYW5kIHRvIGJlIG1pc3NpbmcgZnJvbSBhIG1hcCwgYnV0Ki9cbi8qIG9ubHkgaWYgdGhlIHN1bSBmb3IgdGhlIGJyYW5kIGluIHRoZSBvdGhlciBtYXAgaXMgZW1wdHkuKi9cblxuLyoqXG4gKiBBIGhlbHBlciB0aGF0IGVpdGhlciBnZXRzIHRoZSBzdW1zIGZvciB0aGUgc3BlY2lmaWVkIGJyYW5kLCBvciBpZlxuICogdGhlIGJyYW5kIGlzIGFic2VudCBpbiB0aGUgbWFwLCByZXR1cm5zIGFuIGVtcHR5IGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHJldHVybnMge3sgbGVmdFN1bTogQW1vdW50LCByaWdodFN1bTogQW1vdW50IH19XG4gKi9cbmNvbnN0IGdldFN1bXM9KGJyYW5kKT0+e1xubGV0IGxlZnRTdW07XG5sZXQgcmlnaHRTdW07XG5pZihsZWZ0U3Vtc0J5QnJhbmQuaGFzKGJyYW5kKSl7XG5sZWZ0U3VtPWxlZnRTdW1zQnlCcmFuZC5nZXQoYnJhbmQpO1xuIH1cbmlmKHJpZ2h0U3Vtc0J5QnJhbmQuaGFzKGJyYW5kKSl7XG5yaWdodFN1bT1yaWdodFN1bXNCeUJyYW5kLmdldChicmFuZCk7XG4gfVxuaWYobGVmdFN1bT09PXVuZGVmaW5lZCl7XG5hc3NlcnQocmlnaHRTdW0pO1xubGVmdFN1bT1BbW91bnRNYXRoLm1ha2VFbXB0eUZyb21BbW91bnQocmlnaHRTdW0pO1xuIH1cbmlmKHJpZ2h0U3VtPT09dW5kZWZpbmVkKXtcbnJpZ2h0U3VtPUFtb3VudE1hdGgubWFrZUVtcHR5RnJvbUFtb3VudChsZWZ0U3VtKTtcbiB9XG5yZXR1cm57bGVmdFN1bSxyaWdodFN1bX07XG4gfTtcblxuY29uc3QgYWxsQnJhbmRzPW5ldyBTZXQoW1xuLi4ubGVmdFN1bXNCeUJyYW5kLmtleXMoKSxcbi4uLnJpZ2h0U3Vtc0J5QnJhbmQua2V5cygpXSk7XG5cblxuYWxsQnJhbmRzLmZvckVhY2goKGJyYW5kKT0+e1xuY29uc3R7bGVmdFN1bSxyaWdodFN1bX09Z2V0U3VtcyhicmFuZCk7XG5BbW91bnRNYXRoLmlzRXF1YWwobGVmdFN1bSxyaWdodFN1bSl8fFxuRmFpbCBgcmlnaHRzIHdlcmUgbm90IGNvbnNlcnZlZCBmb3IgYnJhbmQgJHticmFuZH0gJHtsZWZ0U3VtLnZhbHVlfSAhPSAke3JpZ2h0U3VtLnZhbHVlfWA7XG4gfSk7XG4gfTtcblxuLyoqXG4gKiBgYXNzZXJ0UmlnaHRzQ29uc2VydmVkYCBjaGVja3MgdGhhdCB0aGUgdG90YWwgYW1vdW50IHBlciBicmFuZCBpc1xuICogZXF1YWwgdG8gdGhlIHRvdGFsIGFtb3VudCBwZXIgYnJhbmQgaW4gdGhlIHByb3Bvc2VkIHJlYWxsb2NhdGlvblxuICpcbiAqIEBwYXJhbSB7QW1vdW50W119IHByZXZpb3VzQW1vdW50cyAtIGFuIGFycmF5IG9mIHRoZSBhbW91bnRzIGJlZm9yZSB0aGVcbiAqIHByb3Bvc2VkIHJlYWxsb2NhdGlvblxuICogQHBhcmFtIHtBbW91bnRbXX0gbmV3QW1vdW50cyAtIGFuIGFycmF5IG9mIHRoZSBhbW91bnRzIGluIHRoZVxuICogcHJvcG9zZWQgcmVhbGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZnVuY3Rpb24gYXNzZXJ0UmlnaHRzQ29uc2VydmVkKHByZXZpb3VzQW1vdW50cyxuZXdBbW91bnRzKXtcbmNvbnN0IHN1bXNQcmV2QW1vdW50cz1zdW1CeUJyYW5kKHByZXZpb3VzQW1vdW50cyk7XG5jb25zdCBzdW1zTmV3QW1vdW50cz1zdW1CeUJyYW5kKG5ld0Ftb3VudHMpO1xuYXNzZXJ0RXF1YWxQZXJCcmFuZChzdW1zUHJldkFtb3VudHMsc3Vtc05ld0Ftb3VudHMpO1xuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRSaWdodHNDb25zZXJ2ZWQiOlsiYXNzZXJ0UmlnaHRzQ29uc2VydmVkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAycQiz4JgAA+CYAAC4AAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy9lcnRwJykuSXNzdWVyT3B0aW9uc1JlY29yZH0gSXNzdWVyT3B0aW9uc1JlY29yZCAqL1xuXG4vKiBYWFggY2FuIGJlIHRpZ2h0ZXIgdGhhbiAnYW55JyovXG4vKipcbiAqIEB0eXBlZGVmIHthbnl9IENvbXBsZXRpb25cbiAqIEFueSBwYXNzYWJsZSBub24tdGhlbmFibGUuIE9mdGVuIGFuIGV4cGxhbmF0b3J5IHN0cmluZy5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBaQ0ZNYWtlRW1wdHlTZWF0S2l0XG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBbZXhpdF1cbiAqIEByZXR1cm5zIHtaY2ZTZWF0S2l0fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtDVD1SZWNvcmQ8c3RyaW5nLCB1bmtub3duPl0gQ29udHJhY3QncyBjdXN0b20gdGVybXNcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpDRiBab2UgQ29udHJhY3QgRmFjZXRcbiAqXG4gKiBUaGUgWm9lIGludGVyZmFjZSBzcGVjaWZpYyB0byBhIGNvbnRyYWN0IGluc3RhbmNlLiBUaGUgWm9lIENvbnRyYWN0XG4gKiBGYWNldCBpcyBhbiBBUEkgb2JqZWN0IHVzZWQgYnkgcnVubmluZyBjb250cmFjdCBpbnN0YW5jZXMgdG8gYWNjZXNzXG4gKiB0aGUgWm9lIHN0YXRlIGZvciB0aGF0IGluc3RhbmNlLiBUaGUgWm9lIENvbnRyYWN0IEZhY2V0IGlzIGFjY2Vzc2VkXG4gKiBzeW5jaHJvbm91c2x5IGZyb20gd2l0aGluIHRoZSBjb250cmFjdCwgYW5kIHVzdWFsbHkgaXMgcmVmZXJyZWQgdG9cbiAqIGluIGNvZGUgYXMgemNmLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHRyYW5zZmVyczogVHJhbnNmZXJQYXJ0W10pID0+IHZvaWR9IGF0b21pY1JlYXJyYW5nZSAtIGF0b21pY2FsbHkgcmVhbGxvY2F0ZSBhbW91bnRzIGFtb25nIHNlYXRzLlxuICogQHByb3BlcnR5IHtSZWFsbG9jYXRlfSByZWFsbG9jYXRlIC0gcmVhbGxvY2F0ZSBhbW91bnRzIGFtb25nIHNlYXRzLlxuICogRGVwcmVjYXRlZDogVXNlIGF0b21pY1JlYXJyYW5nZSBpbnN0ZWFkLlxuICogQHByb3BlcnR5IHsoa2V5d29yZDogS2V5d29yZCkgPT4gdm9pZH0gYXNzZXJ0VW5pcXVlS2V5d29yZCAtIGNoZWNrXG4gKiB3aGV0aGVyIGEga2V5d29yZCBpcyB2YWxpZCBhbmQgdW5pcXVlIGFuZCBjb3VsZCBiZSBhZGRlZCBpblxuICogYHNhdmVJc3N1ZXJgXG4gKiBAcHJvcGVydHkge1NhdmVJc3N1ZXJ9IHNhdmVJc3N1ZXIgLSBzYXZlIGFuIGlzc3VlciB0byBaQ0YgYW5kIFpvZVxuICogYW5kIGdldCB0aGUgQW1vdW50TWF0aCBhbmQgYnJhbmQgc3luY2hyb25vdXNseSBhY2Nlc3NpYmxlIGFmdGVyXG4gKiBzYXZpbmdcbiAqIEBwcm9wZXJ0eSB7TWFrZUludml0YXRpb259IG1ha2VJbnZpdGF0aW9uXG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uOiBDb21wbGV0aW9uKSA9PiB2b2lkfSBzaHV0ZG93blxuICogQHByb3BlcnR5IHtTaHV0ZG93bldpdGhGYWlsdXJlfSBzaHV0ZG93bldpdGhGYWlsdXJlXG4gKiBAcHJvcGVydHkgeygpID0+IEVSZWY8Wm9lU2VydmljZT59IGdldFpvZVNlcnZpY2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXNzdWVyPCdzZXQnPn0gZ2V0SW52aXRhdGlvbklzc3VlclxuICogQHByb3BlcnR5IHsoKSA9PiBTdGFuZGFyZFRlcm1zICYgQ1R9IGdldFRlcm1zXG4gKiBAcHJvcGVydHkgezxLIGV4dGVuZHMgQXNzZXRLaW5kPihpc3N1ZXI6IElzc3VlcjxLPikgPT4gQnJhbmQ8Sz59IGdldEJyYW5kRm9ySXNzdWVyXG4gKiBAcHJvcGVydHkgezxLIGV4dGVuZHMgQXNzZXRLaW5kPihicmFuZDogQnJhbmQ8Sz4pID0+IElzc3VlcjxLPn0gZ2V0SXNzdWVyRm9yQnJhbmRcbiAqIEBwcm9wZXJ0eSB7R2V0QXNzZXRLaW5kQnlCcmFuZH0gZ2V0QXNzZXRLaW5kXG4gKiBAcHJvcGVydHkgezxLIGV4dGVuZHMgQXNzZXRLaW5kID0gJ25hdCc+KFxuICogICBrZXl3b3JkOiBLZXl3b3JkLFxuICogICBhc3NldEtpbmQ/OiBLLFxuICogICBkaXNwbGF5SW5mbz86IEFkZGl0aW9uYWxEaXNwbGF5SW5mbyxcbiAqICAgb3B0aW9ucz86IElzc3Vlck9wdGlvbnNSZWNvcmRcbiAqICkgPT4gUHJvbWlzZTxaQ0ZNaW50PEs+Pn0gbWFrZVpDRk1pbnRcbiAqIEBwcm9wZXJ0eSB7WkNGUmVnaXN0ZXJGZWVNaW50fSByZWdpc3RlckZlZU1pbnRcbiAqIEBwcm9wZXJ0eSB7WkNGTWFrZUVtcHR5U2VhdEtpdH0gbWFrZUVtcHR5U2VhdEtpdFxuICogQHByb3BlcnR5IHtTZXRUZXN0SmlnfSBzZXRUZXN0SmlnXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8dm9pZD59IHN0b3BBY2NlcHRpbmdPZmZlcnNcbiAqIEBwcm9wZXJ0eSB7KHN0cmluZ3M6IEFycmF5PHN0cmluZz4pID0+IFByb21pc2U8dm9pZD59IHNldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8QXJyYXk8c3RyaW5nPj59IGdldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgcmVhbGxvY2F0ZSgpLiBVc2UgemNmLmF0b21pY1JlYXJyYW5nZSgpIGluc3RlYWRcbiAqXG4gKiBAdHlwZWRlZiB7KHNlYXQxOiBaQ0ZTZWF0LCBzZWF0MjogWkNGU2VhdCwgLi4uc2VhdFJlc3Q6XG4gKiBBcnJheTxaQ0ZTZWF0PikgPT4gdm9pZH0gUmVhbGxvY2F0ZVxuICpcbiAqIFRoZSBjb250cmFjdCBjYW4gcmVhbGxvY2F0ZSBvdmVyIHNlYXRzLCB3aGljaCBjb21taXRzIHRoZSBzdGFnZWRcbiAqIGFsbG9jYXRpb24gZm9yIGVhY2ggc2VhdC4gT24gY29tbWl0LCB0aGUgc3RhZ2VkIGFsbG9jYXRpb24gYmVjb21lc1xuICogdGhlIGN1cnJlbnQgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YWdlZCBhbGxvY2F0aW9uIGlzIGRlbGV0ZWQuXG4gKlxuICogVGhlIHJlYWxsb2NhdGlvbiB3aWxsIG9ubHkgc3VjY2VlZCBpZiB0aGUgcmVhbGxvY2F0aW9uIDEpIGNvbnNlcnZlc1xuICogcmlnaHRzICh0aGUgYW1vdW50cyBzcGVjaWZpZWQgaGF2ZSB0aGUgc2FtZSB0b3RhbCB2YWx1ZSBhcyB0aGVcbiAqIGN1cnJlbnQgdG90YWwgYW1vdW50KSwgYW5kIDIpIGlzICdvZmZlci1zYWZlJyBmb3IgYWxsIHBhcnRpZXNcbiAqIGludm9sdmVkLiBBbGwgc2VhdHMgdGhhdCBoYXZlIHN0YWdlZCBhbGxvY2F0aW9ucyBtdXN0IGJlIGluY2x1ZGVkXG4gKiBhcyBhcmd1bWVudHMgdG8gYHJlYWxsb2NhdGVgLCBvciBhbiBlcnJvciBpcyB0aHJvd24uIEFkZGl0aW9uYWxseSxcbiAqIGFuIGVycm9yIGlzIHRocm93biBpZiBhbnkgc2VhdHMgaW5jbHVkZWQgaW4gYHJlYWxsb2NhdGVgIGRvIG5vdFxuICogaGF2ZSBhIHN0YWdlZCBhbGxvY2F0aW9uLlxuICpcbiAqIFRoZSByZWFsbG9jYXRpb24gaXMgcGFydGlhbCwgbWVhbmluZyB0aGF0IGl0IGFwcGxpZXMgb25seSB0byB0aGVcbiAqIHNlYXRzIHBhc3NlZCBpbiBhcyBhcmd1bWVudHMuIEJ5IGluZHVjdGlvbiwgaWYgcmlnaHRzIGNvbnNlcnZhdGlvblxuICogYW5kIG9mZmVyIHNhZmV0eSBob2xkIGJlZm9yZSwgdGhleSB3aWxsIGhvbGQgYWZ0ZXIgYSBzYWZlXG4gKiByZWFsbG9jYXRpb24sIGV2ZW4gdGhvdWdoIHdlIG9ubHkgcmUtdmFsaWRhdGUgZm9yIHRoZSBzZWF0cyB3aG9zZVxuICogYWxsb2NhdGlvbnMgd2lsbCBjaGFuZ2UuIFNpbmNlIHJpZ2h0cyBhcmUgY29uc2VydmVkIGZvciB0aGUgY2hhbmdlLFxuICogb3ZlcmFsbCByaWdodHMgd2lsbCBiZSB1bmNoYW5nZWQsIGFuZCBhIHJlYWxsb2NhdGlvbiBjYW4gb25seVxuICogZWZmZWN0IG9mZmVyIHNhZmV0eSBmb3Igc2VhdHMgd2hvc2UgYWxsb2NhdGlvbnMgY2hhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tcbiAqICAgZnJvbVNlYXQ/OiBaQ0ZTZWF0LFxuICogICB0b1NlYXQ/OiBaQ0ZTZWF0LFxuICogICBmcm9tQW1vdW50cz86IEFtb3VudEtleXdvcmRSZWNvcmQsXG4gKiAgIHRvQW1vdW50cz86IEFtb3VudEtleXdvcmRSZWNvcmRcbiAqIF19IFRyYW5zZmVyUGFydFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNhdmVJc3N1ZXJcbiAqXG4gKiBJbmZvcm1zIFpvZSBhYm91dCBhbiBpc3N1ZXIgYW5kIHJldHVybnMgYSBwcm9taXNlIGZvciBhY2tub3dsZWRnaW5nXG4gKiB3aGVuIHRoZSBpc3N1ZXIgaXMgYWRkZWQgYW5kIHJlYWR5LlxuICpcbiAqIEBwYXJhbSB7RVJlZjxJc3N1ZXI+fSBpc3N1ZXJQIFByb21pc2UgZm9yIGlzc3VlclxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkIEtleXdvcmQgZm9yIGFkZGVkIGlzc3VlclxuICogQHJldHVybnMge1Byb21pc2U8SXNzdWVyUmVjb3JkPCo+Pn0gSXNzdWVyIGlzIGFkZGVkIGFuZCByZWFkeVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgezxSZXN1bHQ+KFxuICogICBvZmZlckhhbmRsZXI6IE9mZmVySGFuZGxlcjxSZXN1bHQ+LFxuICogICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICogICBjdXN0b21EZXRhaWxzPzogb2JqZWN0LFxuICogICBwcm9wb3NhbFNoYXBlPzogUGF0dGVybixcbiAqICkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPEF3YWl0ZWQ8UmVzdWx0Pj4+XG4gKiB9IE1ha2VJbnZpdGF0aW9uXG4gKlxuICogTWFrZSBhIGNyZWRpYmxlIFpvZSBpbnZpdGF0aW9uIGZvciBhIHBhcnRpY3VsYXIgc21hcnQgY29udHJhY3RcbiAqIGluZGljYXRlZCBieSB0aGUgYGluc3RhbmNlYCBpbiB0aGUgZGV0YWlscyBvZiB0aGUgaW52aXRhdGlvbi4gWm9lXG4gKiBhbHNvIHB1dHMgdGhlIGBpbnN0YWxsYXRpb25gIGFuZCBhIHVuaXF1ZSBgaGFuZGxlYCBpbiB0aGUgZGV0YWlsc1xuICogb2YgdGhlIGludml0YXRpb24uIFRoZSBjb250cmFjdCBtdXN0IHByb3ZpZGUgYSBgZGVzY3JpcHRpb25gIGZvclxuICogdGhlIGludml0YXRpb24gYW5kIHNob3VsZCBpbmNsdWRlIHdoYXRldmVyIGluZm9ybWF0aW9uIGlzIG5lY2Vzc2FyeVxuICogZm9yIGEgcG90ZW50aWFsIGJ1eWVyIG9mIHRoZSBpbnZpdGF0aW9uIHRvIGtub3cgd2hhdCB0aGV5IGFyZVxuICogZ2V0dGluZyBpbiB0aGUgYGN1c3RvbURldGFpbHNgLiBgY3VzdG9tRGV0YWlsc2Agd2lsbCBiZVxuICogcGxhY2VkIGluIHRoZSBkZXRhaWxzIG9mIHRoZSBpbnZpdGF0aW9uLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpDRlJlZ2lzdGVyRmVlTWludFxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkXG4gKiBAcGFyYW0ge0ZlZU1pbnRBY2Nlc3N9IGFsbGVnZWRGZWVNaW50QWNjZXNzIC0gYW4gb2JqZWN0IHRoYXRcbiAqIHB1cnBvcnRzIHRvIGJlIHRoZSBvYmplY3QgdGhhdCBncmFudHMgYWNjZXNzIHRvIHRoZSBmZWUgbWludFxuICogQHJldHVybnMge1Byb21pc2U8WkNGTWludDwnbmF0Jz4+fVxuICovXG5cbi8qKlxuICogUHJvdmlkZSBhIGppZyBvYmplY3QgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cbiAqXG4gKiBUaGUgY29udHJhY3QgY29kZSBwcm92aWRlcyBhIGNhbGxiYWNrIHdob3NlIHJldHVybiByZXN1bHQgd2lsbFxuICogYmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHRlc3QgdGhhdCBzdGFydGVkIHRoaXMgY29udHJhY3QuIFRoZVxuICogc3VwcGxpZWQgY2FsbGJhY2sgd2lsbCBvbmx5IGJlIGNhbGxlZCBpbiBhIHRlc3RpbmcgY29udGV4dCxcbiAqIG5ldmVyIGluIHByb2R1Y3Rpb247IGkuZS4sIGl0IGlzIG9ubHkgY2FsbGVkIGlmIGB0ZXN0SmlnU2V0dGVyYFxuICogd2FzIHN1cHBsaWVkLlxuICpcbiAqIElmIG5vLCBgdGVzdEZuYCBpcyBzdXBwbGllZCwgdGhlbiBhbiBlbXB0eSBqaWcgd2lsbCBiZSB1c2VkLlxuICogQW4gYWRkaXRpb25hbCBgemNmYCBwcm9wZXJ0eSBzZXQgdG8gdGhlIGN1cnJlbnQgQ29udHJhY3RGYWNldFxuICogd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcmV0dXJuZWQgamlnIG9iamVjdCAob3ZlcnJpZGluZyBhbnlcbiAqIHByb3ZpZGVkIGJ5IHRoZSBgdGVzdEZuYCkuXG4gKlxuICogQGNhbGxiYWNrIFNldFRlc3RKaWdcbiAqIEBwYXJhbSB7KCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj59IHRlc3RGblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gWkNGTWludFxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJSZWNvcmQ8Sz59IGdldElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHsoZ2FpbnM6IEFtb3VudEtleXdvcmRSZWNvcmQsIHpjZlNlYXQ/OiBaQ0ZTZWF0KSA9PiBaQ0ZTZWF0fSBtaW50R2FpbnNcbiAqIEFsbCB0aGUgYW1vdW50cyBpbiBnYWlucyBtdXN0IGJlIG9mIHRoaXMgWkNGTWludCdzIGJyYW5kLlxuICogVGhlIGdhaW5zJyBrZXl3b3JkcyBhcmUgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGF0IHNlYXQuXG4gKiBBZGQgdGhlIGdhaW5zIHRvIHRoYXQgc2VhdCdzIGFsbG9jYXRpb24uXG4gKiBUaGUgcmVzdWx0aW5nIHN0YXRlIG11c3QgYmUgb2ZmZXIgc2FmZS4gKEN1cnJlbnRseSwgaW5jcmVhc2luZyBhc3NldHMgY2FuXG4gKiBuZXZlciB2aW9sYXRlIG9mZmVyIHNhZmV0eSBhbnl3YXkuKVxuICpcbiAqIE1pbnQgdGhhdCBhbW91bnQgb2YgYXNzZXRzIGludG8gdGhlIHBvb2xlZCBwdXJzZS5cbiAqIElmIGEgc2VhdCBpcyBwcm92aWRlZCwgaXQgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSBhIG5ldyBzZWF0IGlzXG4gKiByZXR1cm5lZC5cbiAqXG4gKiBAcHJvcGVydHkgeyhsb3NzZXM6IEFtb3VudEtleXdvcmRSZWNvcmQsXG4gKiAgICAgICAgICAgICB6Y2ZTZWF0OiBaQ0ZTZWF0LFxuICogICAgICAgICAgICApID0+IHZvaWR9IGJ1cm5Mb3NzZXNcbiAqIEFsbCB0aGUgYW1vdW50cyBpbiBsb3NzZXMgbXVzdCBiZSBvZiB0aGlzIFpDRk1pbnQncyBicmFuZC5cbiAqIFRoZSBsb3NzZXMnIGtleXdvcmRzIGFyZSBpbiB0aGUgbmFtZXNwYWNlIG9mIHRoYXQgc2VhdC5cbiAqIFN1YnRyYWN0IGxvc3NlcyBmcm9tIHRoYXQgc2VhdCdzIGFsbG9jYXRpb24uXG4gKiBUaGUgcmVzdWx0aW5nIHN0YXRlIG11c3QgYmUgb2ZmZXIgc2FmZS5cbiAqXG4gKiBCdXJuIHRoYXQgYW1vdW50IG9mIGFzc2V0cyBmcm9tIHRoZSBwb29sZWQgcHVyc2UuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGU2VhdEZhaWxcbiAqXG4gKiBmYWlsIGNhbGxlZCB3aXRoIHRoZSByZWFzb24gZm9yIHRoaXMgZmFpbHVyZSwgd2hlcmUgcmVhc29uIGlzXG4gKiBub3JtYWxseSBhbiBpbnN0YW5jZW9mIEVycm9yLlxuICogQHBhcmFtIHt1bmtub3dufSByZWFzb25cbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBaQ0ZHZXRBbW91bnRBbGxvY2F0ZWRcbiAqIFRoZSBicmFuZCBpcyB1c2VkIGZvciBmaWxsaW5nIGluIGFuIGVtcHR5IGFtb3VudCBpZiB0aGUgYGtleXdvcmRgXG4gKiBpcyBub3QgcHJlc2VudCBpbiB0aGUgYWxsb2NhdGlvblxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkXG4gKiBAcGFyYW0ge0JyYW5kfSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PGFueT59XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaQ0ZTZWF0XG4gKiBAcHJvcGVydHkgeyhjb21wbGV0aW9uPzogQ29tcGxldGlvbikgPT4gdm9pZH0gZXhpdFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0RmFpbH0gZmFpbFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFN1YnNjcmliZXI8QWxsb2NhdGlvbj4+fSBnZXRTdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGhhc0V4aXRlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9wb3NhbFJlY29yZH0gZ2V0UHJvcG9zYWxcbiAqIEBwcm9wZXJ0eSB7WkNGR2V0QW1vdW50QWxsb2NhdGVkfSBnZXRBbW91bnRBbGxvY2F0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQWxsb2NhdGlvbn0gZ2V0Q3VycmVudEFsbG9jYXRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQWxsb2NhdGlvbn0gZ2V0U3RhZ2VkQWxsb2NhdGlvblxuICogRGVwcmVjYXRlZDogVXNlIGF0b21pY1JlYXJyYW5nZSBpbnN0ZWFkXG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGhhc1N0YWdlZEFsbG9jYXRpb25cbiAqIERlcHJlY2F0ZWQ6IFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZFxuICogQHByb3BlcnR5IHsobmV3QWxsb2NhdGlvbjogQWxsb2NhdGlvbikgPT4gYm9vbGVhbn0gaXNPZmZlclNhZmVcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEtleXdvcmRSZWNvcmQ6IEFtb3VudEtleXdvcmRSZWNvcmQpID0+IEFtb3VudEtleXdvcmRSZWNvcmR9IGluY3JlbWVudEJ5XG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWRcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEtleXdvcmRSZWNvcmQ6IEFtb3VudEtleXdvcmRSZWNvcmQpID0+IEFtb3VudEtleXdvcmRSZWNvcmR9IGRlY3JlbWVudEJ5XG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gY2xlYXJcbiAqIERlcHJlY2F0ZWQ6IFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgemNmU2VhdDogWkNGU2VhdCwgdXNlclNlYXQ6IEVSZWY8VXNlclNlYXQ+fX0gWmNmU2VhdEtpdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IE9SIE9mZmVyIHJlc3VsdHNcbiAqIEB0eXBlZGVmIHsoc2VhdDogWkNGU2VhdCwgb2ZmZXJBcmdzPzogb2JqZWN0KSA9PiBPUn0gSGFuZGxlT2ZmZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbT1I9dW5rbm93bl0gT2ZmZXIgcmVzdWx0c1xuICogQHR5cGVkZWYge0hhbmRsZU9mZmVyPE9SPiB8IHsgaGFuZGxlOiBIYW5kbGVPZmZlcjxPUj4gfX0gT2ZmZXJIYW5kbGVyXG4gKi9cblxuLyoqXG4gKiBBUEkgZm9yIGEgY29udHJhY3Qgc3RhcnQgZnVuY3Rpb24uXG4gKlxuICogQ0FWRUFUOiBhc3N1bWVzIHN5bmNocm9ub3VzXG4gKlxuICogQGRlcHJlY2F0ZWQgZGVmaW5lIGZ1bmN0aW9uIHNpZ25hdHVyZSBkaXJlY3RseVxuICpcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbUEY9YW55XSBQdWJsaWMgZmFjZXRcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbQ0Y9YW55XSBDcmVhdG9yIGZhY2V0XG4gKiBAdGVtcGxhdGUge29iamVjdH0gW0NUPWFueV0gQ3VzdG9tIHRlcm1zXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW1BBPWFueV0gUHJpdmF0ZSBhcmdzXG4gKiBAY2FsbGJhY2sgQ29udHJhY3RTdGFydEZuXG4gKiBAcGFyYW0ge1pDRjxDVD59IHpjZlxuICogQHBhcmFtIHtQQX0gcHJpdmF0ZUFyZ3NcbiAqIEByZXR1cm5zIHtDb250cmFjdFN0YXJ0Rm5SZXN1bHQ8UEYsIENGPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBQRiBQdWJsaWMgZmFjZXRcbiAqIEB0ZW1wbGF0ZSBDRiBDcmVhdG9yIGZhY2V0XG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb250cmFjdFN0YXJ0Rm5SZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UEZ9IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge0NGfSBjcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxJbnZpdGF0aW9uPn0gW2NyZWF0b3JJbnZpdGF0aW9uXVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFNcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi96b2VTZXJ2aWNlL3V0aWxzJykuQ29udHJhY3RPZjxTPn0gQ29udHJhY3RPZlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3pvZVNlcnZpY2UvdXRpbHMnKS5BZG1pbkZhY2V0fSBBZG1pbkZhY2V0XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoU0zX6QLAACkCwAAMAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvdmF0Um9vdC5qc3siaW1wb3J0cyI6WyIuLi9pbnRlcm5hbC10eXBlcy5qcyIsIi4vemNmWnlnb3RlLmpzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImJ1aWxkUm9vdE9iamVjdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsRSxtYWtlWkNGWnlnb3RlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9pbnRlcm5hbC10eXBlcy5qc1wiLCBbXV0sW1wiLi96Y2ZaeWdvdGUuanNcIiwgW1tcIm1ha2VaQ0ZaeWdvdGVcIiwgWyRo4oCNX2EgPT4gKG1ha2VaQ0ZaeWdvdGUgPSAkaOKAjV9hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYnVpbGRSb290T2JqZWN0LCAnbmFtZScsIHt2YWx1ZTogXCJidWlsZFJvb3RPYmplY3RcIn0pOyRo4oCNX29uY2UuYnVpbGRSb290T2JqZWN0KGJ1aWxkUm9vdE9iamVjdCk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHBhcmFtIHtWYXRQb3dlcnMgJiB7IHRlc3RKaWdTZXR0ZXI6IFRlc3RKaWdTZXR0ZXIgfX0gcG93ZXJzXG4gKiBAcGFyYW0ge3tjb250cmFjdEJ1bmRsZUNhcDogQnVuZGxlQ2FwLCB6b2VTZXJ2aWNlOiBab2VTZXJ2aWNlLCBpbnZpdGF0aW9uSXNzdWVyOiBJc3N1ZXI8J3NldCc+LCBwcml2YXRlQXJncz86IGFueX19IHZhdFBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuYXN5bmMgZnVuY3Rpb24gICAgICAgIGJ1aWxkUm9vdE9iamVjdChwb3dlcnMsdmF0UGFyYW1ldGVycyxiYWdnYWdlKXtcbi8qIEN1cnJlbnRseSwgdGhlcmUgaXMgb25seSBvbmUgZnVuY3Rpb24sIGBleGVjdXRlQ29udHJhY3RgIGNhbGxlZCovXG4vKiBieSB0aGUgWm9lIFNlcnZpY2UuIEhvd2V2ZXIsIHdoZW4gdGhlcmUgaXMga2VybmVsIHN1cHBvcnQgZm9yKi9cbi8qIHp5Z290ZSB2YXRzIChlc3NlbnRpYWxseSBmcmVlemluZyBhbmQgdGhlbiBjcmVhdGluZyBjb3BpZXMgb2YqL1xuLyogdmF0cyksIGBtYWtlWkNGWnlnb3RlYCwgYHpjZlp5Z290ZS5ldmFsdWF0ZUNvbnRyYWN0YCBhbmQqL1xuLyogYHpjZlp5Z290ZS5zdGFydENvbnRyYWN0YCBzaG91bGQgZXhwb3NlZCBzZXBhcmF0ZWx5LiovXG5jb25zdHt0ZXN0SmlnU2V0dGVyfT1wb3dlcnM7XG5jb25zdHtjb250cmFjdEJ1bmRsZUNhcH09dmF0UGFyYW1ldGVycztcbmNvbnRyYWN0QnVuZGxlQ2FwfHxcbkZhaWwgYGV4cGVjdGVkIHZhdFBhcmFtZXRlcnMuY29udHJhY3RCdW5kbGVDYXAgJHt2YXRQYXJhbWV0ZXJzfWA7XG5sZXR7em9lU2VydmljZSxpbnZpdGF0aW9uSXNzdWVyfT12YXRQYXJhbWV0ZXJzO1xuY29uc3QgZmlyc3RUaW1lPSFiYWdnYWdlLmhhcygnRGlkU3RhcnQnKTtcbmlmKGZpcnN0VGltZSl7XG5iYWdnYWdlLmluaXQoJ0RpZFN0YXJ0JywnRGlkU3RhcnQnKTtcbmJhZ2dhZ2UuaW5pdCgnem9lU2VydmljZScsem9lU2VydmljZSk7XG5iYWdnYWdlLmluaXQoJ2ludml0YXRpb25Jc3N1ZXInLGludml0YXRpb25Jc3N1ZXIpO1xuIH1lbHNle1xuIXpvZVNlcnZpY2V8fEZhaWwgYE9uIHJlc3RhcnQgem9lU2VydmljZSBtdXN0IG5vdCBiZSBpbiB2YXRQYXJhbWV0ZXJzYDtcbnpvZVNlcnZpY2U9YmFnZ2FnZS5nZXQoJ3pvZVNlcnZpY2UnKTtcblxuIWludml0YXRpb25Jc3N1ZXJ8fFxuRmFpbCBgT24gcmVzdGFydCBpbnZpdGF0aW9uSXNzdWVyIG11c3Qgbm90IGJlIGluIHZhdFBhcmFtZXRlcnNgO1xuaW52aXRhdGlvbklzc3Vlcj1iYWdnYWdlLmdldCgnaW52aXRhdGlvbklzc3VlcicpO1xuIH1cblxuLyogbWFrZSB6Y2ZaeWdvdGUgd2l0aCBjb250cmFjdC1nZW5lcmFsIHN0YXRlIGFuZCBraW5kcyBpbml0aWFsaXplZCovXG5jb25zdCB6Y2ZaeWdvdGU9YXdhaXQgbWFrZVpDRlp5Z290ZShcbnBvd2VycyxcbnpvZVNlcnZpY2UsXG5pbnZpdGF0aW9uSXNzdWVyLFxudGVzdEppZ1NldHRlcixcbmNvbnRyYWN0QnVuZGxlQ2FwLFxuYmFnZ2FnZSk7XG5cblxuLyogc25hcHNob3Qgenlnb3RlIGhlcmUgLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuaWYoIWZpcnN0VGltZSl7XG5yZXR1cm4gRS53aGVuKEUoemNmWnlnb3RlKS5yZXN0YXJ0Q29udHJhY3QodmF0UGFyYW1ldGVycy5wcml2YXRlQXJncyksKCk9PlxuRmFyKCd1cGdyYWRlZCBjb250cmFjdFJ1bm5lcicse30pKTtcblxuIH1cblxucmV0dXJuIEZhcignY29udHJhY3RSdW5uZXInLHtcbi8qIGluaXRpYWxpemUgaW5zdGFuY2Utc3BlY2lmaWMgc3RhdGUgb2YgdGhlIGNvbnRyYWN0Ki9cbi8qKiBAdHlwZSB7U3RhcnRaY2Z9ICovXG5zdGFydFpjZjooXG56b2VJbnN0YW5jZUFkbWluLFxuaW5zdGFuY2VSZWNvcmRGcm9tWm9lLFxuaXNzdWVyU3RvcmFnZUZyb21ab2UsXG5wcml2YXRlQXJncz11bmRlZmluZWQpPT5cbntcbi8qKiBAdHlwZSB7WkNGWnlnb3RlfSAqL1xucmV0dXJuIEUoemNmWnlnb3RlKS5zdGFydENvbnRyYWN0KFxuem9lSW5zdGFuY2VBZG1pbixcbmluc3RhbmNlUmVjb3JkRnJvbVpvZSxcbmlzc3VlclN0b3JhZ2VGcm9tWm9lLFxucHJpdmF0ZUFyZ3MpO1xuXG4gfX0pO1xuXG4gfVxuXG5oYXJkZW4oYnVpbGRSb290T2JqZWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJidWlsZFJvb3RPYmplY3QiOlsiYnVpbGRSb290T2JqZWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALEO8UE/GQAAPxkAADAAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L3pjZk1pbnQuanN7ImltcG9ydHMiOlsiLi4vY2xlYW5Qcm9wb3NhbC5qcyIsIi4uL2ludGVybmFsLXR5cGVzLmpzIiwiLi4vaXNzdWVyUmVjb3JkLmpzIiwiLi4vdHlwZUd1YXJkcy5qcyIsIi4vYWxsb2NhdGlvbk1hdGguanMiLCIuL2ludGVybmFsLXR5cGVzLmpzIiwiLi90eXBlcy5qcyIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsicHJlcGFyZVpjTWludCIsInN1bUFtb3VudEtleXdvcmRSZWNvcmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQW1vdW50TWF0aCxwcmVwYXJlRXhvQ2xhc3MsRSxjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkLGFzc2VydEZ1bGxJc3N1ZXJSZWNvcmQsbWFrZUlzc3VlclJlY29yZCxhZGRUb0FsbG9jYXRpb24sc3VidHJhY3RGcm9tQWxsb2NhdGlvbixaY2ZNaW50STskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9jbGVhblByb3Bvc2FsLmpzXCIsIFtbXCJjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkXCIsIFskaOKAjV9hID0+IChjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkID0gJGjigI1fYSldXV1dLFtcIi4uL2lzc3VlclJlY29yZC5qc1wiLCBbW1wiYXNzZXJ0RnVsbElzc3VlclJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0RnVsbElzc3VlclJlY29yZCA9ICRo4oCNX2EpXV0sW1wibWFrZUlzc3VlclJlY29yZFwiLCBbJGjigI1fYSA9PiAobWFrZUlzc3VlclJlY29yZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2FsbG9jYXRpb25NYXRoLmpzXCIsIFtbXCJhZGRUb0FsbG9jYXRpb25cIiwgWyRo4oCNX2EgPT4gKGFkZFRvQWxsb2NhdGlvbiA9ICRo4oCNX2EpXV0sW1wic3VidHJhY3RGcm9tQWxsb2NhdGlvblwiLCBbJGjigI1fYSA9PiAoc3VidHJhY3RGcm9tQWxsb2NhdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9pbnRlcm5hbC10eXBlcy5qc1wiLCBbXV0sW1wiLi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiWmNmTWludElcIiwgWyRo4oCNX2EgPT4gKFpjZk1pbnRJID0gJGjigI1fYSldXV1dLFtcIi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dLFtcIi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYW1yXG4gKiBAcGFyYW0ge0lzc3VlclJlY29yZDxLPn0gaXNzdWVyUmVjb3JkXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5jb25zdCAgICAgICAgc3VtQW1vdW50S2V5d29yZFJlY29yZD0oYW1yLGlzc3VlclJlY29yZCk9PntcbmNvbnN0IGVtcHR5PUFtb3VudE1hdGgubWFrZUVtcHR5KFxuaXNzdWVyUmVjb3JkLmJyYW5kLFxuaXNzdWVyUmVjb3JkLmFzc2V0S2luZCk7XG5cbnJldHVybiBPYmplY3QudmFsdWVzKGFtcikucmVkdWNlKFxuKHRvdGFsLGFtb3VudFRvQWRkKT0+XG5BbW91bnRNYXRoLmFkZCh0b3RhbCxhbW91bnRUb0FkZCxpc3N1ZXJSZWNvcmQuYnJhbmQpLFxuZW1wdHkpO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSB6Y2ZCYWdnYWdlXG4gKiBAcGFyYW0ge3sgKGtleXdvcmQ6IHN0cmluZywgaXNzdWVyUmVjb3JkOiBJc3N1ZXJSZWNvcmQpOiB2b2lkIH19IHJlY29yZElzc3VlclxuICogQHBhcmFtIHtHZXRBc3NldEtpbmRCeUJyYW5kfSBnZXRBc3NldEtpbmRCeUJyYW5kXG4gKiBAcGFyYW0geyhleGl0PzogdW5kZWZpbmVkKSA9PiB7IHpjZlNlYXQ6IGFueTsgdXNlclNlYXQ6IFByb21pc2U8VXNlclNlYXQ+IH19IG1ha2VFbXB0eVNlYXRLaXRcbiAqIEBwYXJhbSB7WmNmTWludFJlYWxsb2NhdG9yfSByZWFsbG9jYXRvclxuICovJGjigI1fb25jZS5zdW1BbW91bnRLZXl3b3JkUmVjb3JkKHN1bUFtb3VudEtleXdvcmRSZWNvcmQpO1xuY29uc3QgICAgICAgIHByZXBhcmVaY01pbnQ9KFxuemNmQmFnZ2FnZSxcbnJlY29yZElzc3VlcixcbmdldEFzc2V0S2luZEJ5QnJhbmQsXG5tYWtlRW1wdHlTZWF0S2l0LFxucmVhbGxvY2F0b3IpPT5cbntcbmNvbnN0IG1ha2VaY01pbnRJbnRlcm5hbD1wcmVwYXJlRXhvQ2xhc3MoXG56Y2ZCYWdnYWdlLFxuJ3pjZk1pbnQnLFxuWmNmTWludEksXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5d29yZFxuICogQHBhcmFtIHtab2VNaW50PEs+fSB6b2VNaW50XG4gKiBAcGFyYW0ge1JlcXVpcmVkPElzc3VlclJlY29yZDxLPj59IGlzc3VlclJlY29yZFxuICovXG4oa2V5d29yZCx6b2VNaW50LGlzc3VlclJlY29yZCk9PntcbmNvbnN0e1xuYnJhbmQ6bWludHlCcmFuZCxcbmlzc3VlcjptaW50eUlzc3VlcixcbmRpc3BsYXlJbmZvOm1pbnR5RGlzcGxheUluZm99PVxuaXNzdWVyUmVjb3JkO1xuXG5jb25zdCBtaW50eUlzc3VlclJlY29yZD1tYWtlSXNzdWVyUmVjb3JkKFxubWludHlCcmFuZCxcbm1pbnR5SXNzdWVyLFxubWludHlEaXNwbGF5SW5mbyk7XG5cbnJlY29yZElzc3VlcihrZXl3b3JkLG1pbnR5SXNzdWVyUmVjb3JkKTtcblxucmV0dXJue2tleXdvcmQsem9lTWludCxtaW50eUlzc3VlclJlY29yZH07XG4gfSxcbntcbmdldElzc3VlclJlY29yZCgpe1xucmV0dXJuIHRoaXMuc3RhdGUubWludHlJc3N1ZXJSZWNvcmQ7XG4gfSxcbi8qKiBAdHlwZSB7KGdhaW5zOiBSZWNvcmQ8c3RyaW5nLCBBbW91bnQ+LCB6Y2ZTZWF0PzogWkNGU2VhdCkgPT4gWkNGU2VhdH0gKi9cbm1pbnRHYWlucyhnYWlucyx6Y2ZTZWF0PW1ha2VFbXB0eVNlYXRLaXQoKS56Y2ZTZWF0KXtcbmNvbnN0e21pbnR5SXNzdWVyUmVjb3JkLHpvZU1pbnR9PXRoaXMuc3RhdGU7XG5nYWlucz1jb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKGdhaW5zLGdldEFzc2V0S2luZEJ5QnJhbmQpO1xuXG5jb25zdCB0b3RhbFRvTWludD1zdW1BbW91bnRLZXl3b3JkUmVjb3JkKGdhaW5zLG1pbnR5SXNzdWVyUmVjb3JkKTtcblxuIXpjZlNlYXQuaGFzRXhpdGVkKCl8fFxuRmFpbCBgemNmU2VhdCBtdXN0IGJlIGFjdGl2ZSB0byBtaW50IGdhaW5zIGZvciB0aGUgemNmU2VhdGA7XG5jb25zdCBhbGxvY2F0aW9uUGx1c0dhaW5zPWFkZFRvQWxsb2NhdGlvbihcbnpjZlNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKSxcbmdhaW5zKTtcblxuXG4vKiBJbmNyZW1lbnQgdGhlIHN0YWdlZEFsbG9jYXRpb24gaWYgaXQgZXhpc3RzIHNvIHRoYXQgdGhlKi9cbi8qIHN0YWdlZEFsbG9jYXRpb24gaXMga2VwdCB1cCB0byB0aGUgY3VycmVudEFsbG9jYXRpb24qL1xuaWYoemNmU2VhdC5oYXNTdGFnZWRBbGxvY2F0aW9uKCkpe1xuemNmU2VhdC5pbmNyZW1lbnRCeShnYWlucyk7XG4gfVxuXG4vKiBPZmZlciBzYWZldHkgc2hvdWxkIG5ldmVyIGJlIGFibGUgdG8gYmUgdmlvbGF0ZWQgaGVyZSwgYXMqL1xuLyogd2UgYXJlIGFkZGluZyBhc3NldHMuIEhvd2V2ZXIsIHdlIGtlZXAgdGhpcyBjaGVjayBzbyB0aGF0Ki9cbi8qIGFsbCByZWFsbG9jYXRpb25zIGFyZSBjb3ZlcmVkIGJ5IG9mZmVyIHNhZmV0eSBjaGVja3MsIGFuZCovXG4vKiB0aGF0IGFueSBidWcgd2l0aGluIFpvZSB0aGF0IG1heSBhZmZlY3QgdGhpcyBpcyBjYXVnaHQuKi9cbnpjZlNlYXQuaXNPZmZlclNhZmUoYWxsb2NhdGlvblBsdXNHYWlucyl8fFxuRmFpbCBgVGhlIGFsbG9jYXRpb24gYWZ0ZXIgbWludGluZyBnYWlucyAke2FsbG9jYXRpb25QbHVzR2FpbnN9IGZvciB0aGUgemNmU2VhdCB3YXMgbm90IG9mZmVyIHNhZmVgO1xuLyogTm8gZWZmZWN0cyBhYm92ZSwgYXBhcnQgZnJvbSBpbmNyZW1lbnRCeS4gTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluKi9cbi8qIHJlYWxsb2NhdG9yLnJlYWxsb2NhdGUoKS4gVGhlIGZvbGxvd2luZyB0d28gc3RlcHMgKnNob3VsZCogYmUqL1xuLyogY29tbWl0dGVkIGF0b21pY2FsbHksIGJ1dCBpdCBpcyBub3QgYSBkaXNhc3RlciBpZiB0aGV5IGFyZSovXG4vKiBub3QuIElmIHdlIG1pbnRlZCBvbmx5LCBubyBvbmUgd291bGQgZXZlciBnZXQgdGhvc2UqL1xuLyogaW52aXNpYmx5LW1pbnRlZCBhc3NldHMuKi9cbkUoem9lTWludCkubWludEFuZEVzY3Jvdyh0b3RhbFRvTWludCk7XG5yZWFsbG9jYXRvci5yZWFsbG9jYXRlKHpjZlNlYXQsYWxsb2NhdGlvblBsdXNHYWlucyk7XG5yZXR1cm4gemNmU2VhdDtcbiB9LFxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGxvc3Nlc1xuICogQHBhcmFtIHtaQ0ZTZWF0fSB6Y2ZTZWF0XG4gKi9cbmJ1cm5Mb3NzZXMobG9zc2VzLHpjZlNlYXQpe1xuY29uc3R7bWludHlJc3N1ZXJSZWNvcmQsem9lTWludH09dGhpcy5zdGF0ZTtcbmxvc3Nlcz1jb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKGxvc3NlcyxnZXRBc3NldEtpbmRCeUJyYW5kKTtcblxuY29uc3QgdG90YWxUb0J1cm49c3VtQW1vdW50S2V5d29yZFJlY29yZChsb3NzZXMsbWludHlJc3N1ZXJSZWNvcmQpO1xuXG4hemNmU2VhdC5oYXNFeGl0ZWQoKXx8XG5GYWlsIGB6Y2ZTZWF0IG11c3QgYmUgYWN0aXZlIHRvIGJ1cm4gbG9zc2VzIGZyb20gdGhlIHpjZlNlYXRgO1xuY29uc3QgYWxsb2NhdGlvbk1pbnVzTG9zc2VzPXN1YnRyYWN0RnJvbUFsbG9jYXRpb24oXG56Y2ZTZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCksXG5sb3NzZXMpO1xuXG5cbi8qIHZlcmlmaWVzIG9mZmVyIHNhZmV0eSovXG56Y2ZTZWF0LmlzT2ZmZXJTYWZlKGFsbG9jYXRpb25NaW51c0xvc3Nlcyl8fFxuRmFpbCBgVGhlIGFsbG9jYXRpb24gYWZ0ZXIgYnVybmluZyBsb3NzZXMgJHthbGxvY2F0aW9uTWludXNMb3NzZXN9IGZvciB0aGUgemNmU2VhdCB3YXMgbm90IG9mZmVyIHNhZmVgO1xuXG4vKiBEZWNyZW1lbnQgdGhlIHN0YWdlZEFsbG9jYXRpb24gaWYgaXQgZXhpc3RzIHNvIHRoYXQgdGhlKi9cbi8qIHN0YWdlZEFsbG9jYXRpb24gaXMga2VwdCB1cCB0byB0aGUgY3VycmVudEFsbG9jYXRpb24qL1xuaWYoemNmU2VhdC5oYXNTdGFnZWRBbGxvY2F0aW9uKCkpe1xuemNmU2VhdC5kZWNyZW1lbnRCeShsb3NzZXMpO1xuIH1cblxuLyogTm8gZWZmZWN0cyBhYm92ZSwgYXBhcnQgZnJvbSBkZWNyZW1lbnRCeS4gTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluKi9cbi8qIHJlYWxsb2NhdG9yLnJlYWxsb2NhdGUoKS4gVGhlIGZvbGxvd2luZyB0d28gc3RlcHMgKnNob3VsZCogYmUqL1xuLyogY29tbWl0dGVkIGF0b21pY2FsbHksIGJ1dCBpdCBpcyBub3QgYSBkaXNhc3RlciBpZiB0aGV5IGFyZSovXG4vKiBub3QuIElmIHdlIG9ubHkgY29tbWl0IHRoZSBhbGxvY2F0aW9uTWludXNMb3NzZXMgbm8gb25lIHdvdWxkKi9cbi8qIGV2ZXIgZ2V0IHRoZSB1bmJ1cm5lZCBhc3NldHMuKi9cbnJlYWxsb2NhdG9yLnJlYWxsb2NhdGUoemNmU2VhdCxhbGxvY2F0aW9uTWludXNMb3NzZXMpO1xuRSh6b2VNaW50KS53aXRoZHJhd0FuZEJ1cm4odG90YWxUb0J1cm4pO1xuIH19KTtcblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXl3b3JkXG4gKiBAcGFyYW0ge0VSZWY8Wm9lTWludDxLPj59IHpvZU1pbnRQXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxaQ0ZNaW50PEs+Pn1cbiAqL1xucmV0dXJuIGFzeW5jKGtleXdvcmQsem9lTWludFApPT57XG5jb25zdFt6b2VNaW50LGlzc3VlclJlY29yZF09YXdhaXQgUHJvbWlzZS5hbGwoW1xuem9lTWludFAsXG5FKHpvZU1pbnRQKS5nZXRJc3N1ZXJSZWNvcmQoKV0pO1xuXG5hc3NlcnRGdWxsSXNzdWVyUmVjb3JkKGlzc3VlclJlY29yZCk7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QsIFhYWCBBc3NldEtpbmQgZ2VuZXJpYyovXG5yZXR1cm4gbWFrZVpjTWludEludGVybmFsKGtleXdvcmQsem9lTWludCxpc3N1ZXJSZWNvcmQpO1xuIH07XG4gfTskaOKAjV9vbmNlLnByZXBhcmVaY01pbnQocHJlcGFyZVpjTWludCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3VtQW1vdW50S2V5d29yZFJlY29yZCI6WyJzdW1BbW91bnRLZXl3b3JkUmVjb3JkIl0sInByZXBhcmVaY01pbnQiOlsicHJlcGFyZVpjTWludCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAApHeksCkAAAApAAAAwAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RGYWNldC96Y2ZTZWF0LmpzeyJpbXBvcnRzIjpbIi4uL2NsZWFuUHJvcG9zYWwuanMiLCIuLi9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanMiLCIuLi90eXBlR3VhcmRzLmpzIiwiLi9hbGxvY2F0aW9uTWF0aC5qcyIsIi4vb2ZmZXJTYWZldHkuanMiLCIuL3JlYWxsb2NhdGUuanMiLCIuL3JpZ2h0c0NvbnNlcnZhdGlvbi5qcyIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbImNyZWF0ZVNlYXRNYW5hZ2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUscHJlcGFyZUV4b0NsYXNzLHByZXBhcmVFeG9DbGFzc0tpdCxwcm92aWRlLHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUscHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsRSxBbW91bnRNYXRoLGluaXRFbXB0eSxNLGlzT2ZmZXJTYWZlLGFzc2VydFJpZ2h0c0NvbnNlcnZlZCxhZGRUb0FsbG9jYXRpb24sc3VidHJhY3RGcm9tQWxsb2NhdGlvbixjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkLEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxTZWF0RGF0YVNoYXBlLFNlYXRTaGFwZSxtYWtlQWxsb2NhdGlvbk1hcCxUcmFuc2ZlclBhcnRTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVEdXJhYmxlTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCIuL29mZmVyU2FmZXR5LmpzXCIsIFtbXCJpc09mZmVyU2FmZVwiLCBbJGjigI1fYSA9PiAoaXNPZmZlclNhZmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9yaWdodHNDb25zZXJ2YXRpb24uanNcIiwgW1tcImFzc2VydFJpZ2h0c0NvbnNlcnZlZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmlnaHRzQ29uc2VydmVkID0gJGjigI1fYSldXV1dLFtcIi4vYWxsb2NhdGlvbk1hdGguanNcIiwgW1tcImFkZFRvQWxsb2NhdGlvblwiLCBbJGjigI1fYSA9PiAoYWRkVG9BbGxvY2F0aW9uID0gJGjigI1fYSldXSxbXCJzdWJ0cmFjdEZyb21BbGxvY2F0aW9uXCIsIFskaOKAjV9hID0+IChzdWJ0cmFjdEZyb21BbGxvY2F0aW9uID0gJGjigI1fYSldXV1dLFtcIi4uL2NsZWFuUHJvcG9zYWwuanNcIiwgW1tcImNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUgPSAkaOKAjV9hKV1dLFtcIlNlYXREYXRhU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFNlYXREYXRhU2hhcGUgPSAkaOKAjV9hKV1dLFtcIlNlYXRTaGFwZVwiLCBbJGjigI1fYSA9PiAoU2VhdFNoYXBlID0gJGjigI1fYSldXV1dLFtcIi4vcmVhbGxvY2F0ZS5qc1wiLCBbW1wibWFrZUFsbG9jYXRpb25NYXBcIiwgWyRo4oCNX2EgPT4gKG1ha2VBbGxvY2F0aW9uTWFwID0gJGjigI1fYSldXV1dLFtcIi4uL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qc1wiLCBbW1wiVHJhbnNmZXJQYXJ0U2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRyYW5zZmVyUGFydFNoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge0NyZWF0ZVNlYXRNYW5hZ2VyfSAqL1xuY29uc3QgICAgICAgIGNyZWF0ZVNlYXRNYW5hZ2VyPShcbnpvZUluc3RhbmNlQWRtaW4sXG5nZXRBc3NldEtpbmRCeUJyYW5kLFxuc2h1dGRvd25XaXRoRmFpbHVyZSxcbnpjZkJhZ2dhZ2UpPT5cbntcbi8qKiBAdHlwZSB7V2Vha01hcFN0b3JlPFpDRlNlYXQsIEFsbG9jYXRpb24+fSAgKi9cbmxldCBhY3RpdmVaQ0ZTZWF0cz1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSh6Y2ZCYWdnYWdlLCdhY3RpdmVaQ0ZTZWF0cycpO1xuLyoqIEB0eXBlIHtNYXBTdG9yZTxaQ0ZTZWF0LCBBbGxvY2F0aW9uPn0gKi9cbmNvbnN0IHpjZlNlYXRUb1N0YWdlZEFsbG9jYXRpb25zPXByb3ZpZGVEdXJhYmxlTWFwU3RvcmUoXG56Y2ZCYWdnYWdlLFxuJ3pjZlNlYXRUb1N0YWdlZEFsbG9jYXRpb25zJyk7XG5cblxuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8WkNGU2VhdCwgU2VhdEhhbmRsZT59ICovXG5sZXQgemNmU2VhdFRvU2VhdEhhbmRsZT1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShcbnpjZkJhZ2dhZ2UsXG4nemNmU2VhdFRvU2VhdEhhbmRsZScpO1xuXG5cbi8qKiBAdHlwZSB7KHpjZlNlYXQ6IFpDRlNlYXQpID0+IGJvb2xlYW59ICovXG5jb25zdCBoYXNFeGl0ZWQ9KHpjZlNlYXQpPT4hYWN0aXZlWkNGU2VhdHMuaGFzKHpjZlNlYXQpO1xuXG4vKipcbiAqIEBwYXJhbSB7WkNGU2VhdH0gemNmU2VhdFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydEFjdGl2ZT0oemNmU2VhdCk9PntcbmFjdGl2ZVpDRlNlYXRzLmhhcyh6Y2ZTZWF0KXx8RmFpbCBgc2VhdCBoYXMgYmVlbiBleGl0ZWRgO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSB6Y2ZTZWF0XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgZG9FeGl0U2VhdD0oemNmU2VhdCk9PntcbmFzc2VydEFjdGl2ZSh6Y2ZTZWF0KTtcbmFjdGl2ZVpDRlNlYXRzLmRlbGV0ZSh6Y2ZTZWF0KTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7WkNGU2VhdH0gemNmU2VhdFxuICogQHJldHVybnMge0FsbG9jYXRpb259XG4gKi9cbmNvbnN0IGdldEN1cnJlbnRBbGxvY2F0aW9uPSh6Y2ZTZWF0KT0+e1xuLyogVE9ETyB1cGRhdGUgZG9jcyB0aGF0IGdldEN1cnJlbnRBbGxvY2F0aW9uKCkgZmFpbHMgYWZ0ZXIgZXhpdCovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2RvY3VtZW50YXRpb24vaXNzdWVzLzYzMCovXG5hc3NlcnRBY3RpdmUoemNmU2VhdCk7XG5yZXR1cm4gYWN0aXZlWkNGU2VhdHMuZ2V0KHpjZlNlYXQpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSB6Y2ZTZWF0XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgY29tbWl0U3RhZ2VkQWxsb2NhdGlvbj0oemNmU2VhdCk9Pntcbi8qIEJ5IHRoaXMgcG9pbnQsIHdlIGhhdmUgY2hlY2tlZCB0aGF0IHRoZSB6Y2ZTZWF0IGlzIGEga2V5IGluKi9cbi8qIGFjdGl2ZVpDRlNlYXRzIGFuZCBpbiB6Y2ZTZWF0VG9TdGFnZWRBbGxvY2F0aW9ucy4qL1xuYWN0aXZlWkNGU2VhdHMuc2V0KHpjZlNlYXQsemNmU2VhdC5nZXRTdGFnZWRBbGxvY2F0aW9uKCkpO1xuemNmU2VhdFRvU3RhZ2VkQWxsb2NhdGlvbnMuZGVsZXRlKHpjZlNlYXQpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSB6Y2ZTZWF0XG4gKiBAcmV0dXJucyB7QWxsb2NhdGlvbn1cbiAqL1xuY29uc3QgaGFzU3RhZ2VkQWxsb2NhdGlvbj16Y2ZTZWF0VG9TdGFnZWRBbGxvY2F0aW9ucy5oYXM7XG5cbi8qKlxuICogR2V0IHRoZSBzdGFnZWRBbGxvY2F0aW9uLiBJZiBvbmUgZG9lcyBub3QgZXhpc3QsIHJldHVybiB0aGVcbiAqIGN1cnJlbnRBbGxvY2F0aW9uLiBXZSByZXR1cm4gdGhlIGN1cnJlbnRBbGxvY2F0aW9uIGluIHRoaXMgY2FzZVxuICogc28gdGhhdCBkb3duc3RyZWFtIHVzZXJzIGRvIG5vdCBoYXZlIHRvIGNoZWNrIHdoZXRoZXIgdGhlXG4gKiBzdGFnZWRBbGxvY2F0aW9uIGlzIGRlZmluZWQgYmVmb3JlIGFkZGluZyB0byBpdCBvciBzdWJ0cmFjdGluZ1xuICogZnJvbSBpdC4gVG8gY2hlY2sgd2hldGhlciBhIHN0YWdlZEFsbG9jYXRpb24gZXhpc3RzLCB1c2VcbiAqIGBoYXNTdGFnZWRBbGxvY2F0aW9uYFxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gemNmU2VhdFxuICogQHJldHVybnMge0FsbG9jYXRpb259XG4gKi9cbmNvbnN0IGdldFN0YWdlZEFsbG9jYXRpb249KHpjZlNlYXQpPT57XG5pZih6Y2ZTZWF0VG9TdGFnZWRBbGxvY2F0aW9ucy5oYXMoemNmU2VhdCkpe1xucmV0dXJuIHpjZlNlYXRUb1N0YWdlZEFsbG9jYXRpb25zLmdldCh6Y2ZTZWF0KTtcbiB9ZWxzZXtcbnJldHVybiBhY3RpdmVaQ0ZTZWF0cy5nZXQoemNmU2VhdCk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydFN0YWdlZEFsbG9jYXRpb249KHpjZlNlYXQpPT57XG5oYXNTdGFnZWRBbGxvY2F0aW9uKHpjZlNlYXQpfHxcbkZhaWwgYFJlYWxsb2NhdGUgZmFpbGVkIGJlY2F1c2UgYSBzZWF0IGhhZCBubyBzdGFnZWQgYWxsb2NhdGlvbi4gUGxlYXNlIGFkZCBvciBzdWJ0cmFjdCBmcm9tIHRoZSBzZWF0IGFuZCB0aGVuIHJlYWxsb2NhdGUuYDtcbiB9O1xuXG5jb25zdCBzZXRTdGFnZWRBbGxvY2F0aW9uPSh6Y2ZTZWF0LG5ld1N0YWdlZEFsbG9jYXRpb24pPT57XG5pZih6Y2ZTZWF0VG9TdGFnZWRBbGxvY2F0aW9ucy5oYXMoemNmU2VhdCkpe1xuemNmU2VhdFRvU3RhZ2VkQWxsb2NhdGlvbnMuc2V0KHpjZlNlYXQsbmV3U3RhZ2VkQWxsb2NhdGlvbik7XG4gfWVsc2V7XG56Y2ZTZWF0VG9TdGFnZWRBbGxvY2F0aW9ucy5pbml0KHpjZlNlYXQsbmV3U3RhZ2VkQWxsb2NhdGlvbik7XG4gfVxuIH07XG5cbi8qKiBAcGFyYW0ge1pDRlNlYXR9IHpjZlNlYXQgKi9cbmNvbnN0IGFzc2VydE5vU3RhZ2VkQWxsb2NhdGlvbj0oemNmU2VhdCk9PntcbmlmKGhhc1N0YWdlZEFsbG9jYXRpb24oemNmU2VhdCkpe1xuRmFpbCBgVGhlIHNlYXQgY291bGQgbm90IGJlIGV4aXRlZCB3aXRoIGEgc3RhZ2VkIGJ1dCB1bmNvbW1pdHRlZCBhbGxvY2F0aW9uOiAke2dldFN0YWdlZEFsbG9jYXRpb24oXG56Y2ZTZWF0KVxuIH0uIFBsZWFzZSByZWFsbG9jYXRlIG92ZXIgdGhpcyBzZWF0IG9yIGNsZWFyIHRoZSBzdGFnZWQgYWxsb2NhdGlvbi5gO1xuIH1cbiB9O1xuXG5jb25zdCBaQ0ZTZWF0ST1NLmludGVyZmFjZSgnWkNGU2VhdCcse30se3Nsb3BweTp0cnVlfSk7XG5cbmNvbnN0IG1ha2VaQ0ZTZWF0SW50ZXJuYWw9cHJlcGFyZUV4b0NsYXNzKFxuemNmQmFnZ2FnZSxcbid6Y2ZTZWF0JyxcblpDRlNlYXRJLFxuKHByb3Bvc2FsKT0+KHtwcm9wb3NhbH0pLFxue1xuZ2V0U3Vic2NyaWJlcigpe1xuY29uc3R7c2VsZn09dGhpcztcbnJldHVybiBFKHpvZUluc3RhbmNlQWRtaW4pLmdldEV4aXRTdWJzY3JpYmVyKFxuemNmU2VhdFRvU2VhdEhhbmRsZS5nZXQoc2VsZikpO1xuXG4gfSxcbmdldFByb3Bvc2FsKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBzdGF0ZS5wcm9wb3NhbDtcbiB9LFxuZXhpdChjb21wbGV0aW9uKXtcbmNvbnN0e3NlbGZ9PXRoaXM7XG5hc3NlcnRBY3RpdmUoc2VsZik7XG5hc3NlcnROb1N0YWdlZEFsbG9jYXRpb24oc2VsZik7XG5kb0V4aXRTZWF0KHNlbGYpO1xuRSh6b2VJbnN0YW5jZUFkbWluKS5leGl0U2VhdCh6Y2ZTZWF0VG9TZWF0SGFuZGxlLmdldChzZWxmKSxjb21wbGV0aW9uKTtcbiB9LFxuZmFpbChcbnJlYXNvbj1FcnJvcihcbidTZWF0IGV4aXRlZCB3aXRoIGZhaWx1cmUuIFBsZWFzZSBjaGVjayB0aGUgbG9nIGZvciBtb3JlIGluZm9ybWF0aW9uLicpKVxuXG57XG5jb25zdHtzZWxmfT10aGlzO1xuaWYodHlwZW9mIHJlYXNvbj09PSdzdHJpbmcnKXtcbnJlYXNvbj1FcnJvcihyZWFzb24pO1xuYXNzZXJ0Lm5vdGUoXG5yZWFzb24sXG4nWkNGU2VhdC5mYWlsIHdhcyBjYWxsZWQgd2l0aCBhIHN0cmluZyByZWFzb24sIGJ1dCByZXF1aXJlcyBhbiBFcnJvciBhcmd1bWVudC4nKTtcblxuIH1cbmlmKCFoYXNFeGl0ZWQoc2VsZikpe1xuZG9FeGl0U2VhdChzZWxmKTtcbkUoem9lSW5zdGFuY2VBZG1pbikuZmFpbFNlYXQoXG56Y2ZTZWF0VG9TZWF0SGFuZGxlLmdldChzZWxmKSxcbmhhcmRlbihyZWFzb24pKTtcblxuIH1cbnJldHVybiByZWFzb247XG4gfSxcbmhhc0V4aXRlZCgpe1xuY29uc3R7c2VsZn09dGhpcztcbnJldHVybiBoYXNFeGl0ZWQoc2VsZik7XG4gfSxcblxuZ2V0QW1vdW50QWxsb2NhdGVkKGtleXdvcmQsYnJhbmQpe1xuY29uc3R7c2VsZn09dGhpcztcbmFzc2VydEFjdGl2ZShzZWxmKTtcbmNvbnN0IGN1cnJlbnRBbGxvY2F0aW9uPWdldEN1cnJlbnRBbGxvY2F0aW9uKHNlbGYpO1xuaWYoY3VycmVudEFsbG9jYXRpb25ba2V5d29yZF0hPT11bmRlZmluZWQpe1xucmV0dXJuIGN1cnJlbnRBbGxvY2F0aW9uW2tleXdvcmRdO1xuIH1cbmJyYW5kfHxGYWlsIGBBIGJyYW5kIG11c3QgYmUgc3VwcGxpZWQgd2hlbiB0aGUga2V5d29yZCBpcyBub3QgZGVmaW5lZGA7XG5jb25zdCBhc3NldEtpbmQ9Z2V0QXNzZXRLaW5kQnlCcmFuZChicmFuZCk7XG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbiB9LFxuZ2V0Q3VycmVudEFsbG9jYXRpb24oKXtcbmNvbnN0e3NlbGZ9PXRoaXM7XG5yZXR1cm4gZ2V0Q3VycmVudEFsbG9jYXRpb24oc2VsZik7XG4gfSxcbmdldFN0YWdlZEFsbG9jYXRpb24oKXtcbmNvbnN0e3NlbGZ9PXRoaXM7XG5yZXR1cm4gZ2V0U3RhZ2VkQWxsb2NhdGlvbihzZWxmKTtcbiB9LFxuaXNPZmZlclNhZmUobmV3QWxsb2NhdGlvbil7XG5jb25zdHtzdGF0ZSxzZWxmfT10aGlzO1xuYXNzZXJ0QWN0aXZlKHNlbGYpO1xuY29uc3QgY3VycmVudEFsbG9jYXRpb249Z2V0Q3VycmVudEFsbG9jYXRpb24oc2VsZik7XG5jb25zdCByZWFsbG9jYXRpb249aGFyZGVuKHtcbi4uLmN1cnJlbnRBbGxvY2F0aW9uLFxuLi4ubmV3QWxsb2NhdGlvbn0pO1xuXG5cbnJldHVybiBpc09mZmVyU2FmZShzdGF0ZS5wcm9wb3NhbCxyZWFsbG9jYXRpb24pO1xuIH0sXG4vKipcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byB6Y2YuYXRvbWljUmVhcnJhbmdlKClcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYW1vdW50S2V5d29yZFJlY29yZFxuICovXG5pbmNyZW1lbnRCeShhbW91bnRLZXl3b3JkUmVjb3JkKXtcbmNvbnN0e3NlbGZ9PXRoaXM7XG5hc3NlcnRBY3RpdmUoc2VsZik7XG5hbW91bnRLZXl3b3JkUmVjb3JkPWNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQoXG5hbW91bnRLZXl3b3JkUmVjb3JkLFxuZ2V0QXNzZXRLaW5kQnlCcmFuZCk7XG5cbnNldFN0YWdlZEFsbG9jYXRpb24oXG5zZWxmLFxuYWRkVG9BbGxvY2F0aW9uKGdldFN0YWdlZEFsbG9jYXRpb24oc2VsZiksYW1vdW50S2V5d29yZFJlY29yZCkpO1xuXG5yZXR1cm4gYW1vdW50S2V5d29yZFJlY29yZDtcbiB9LFxuLyoqXG4gKiBAZGVwcmVjYXRlZCBzd2l0Y2ggdG8gemNmLmF0b21pY1JlYXJyYW5nZSgpXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFtb3VudEtleXdvcmRSZWNvcmRcbiAqL1xuZGVjcmVtZW50QnkoYW1vdW50S2V5d29yZFJlY29yZCl7XG5jb25zdHtzZWxmfT10aGlzO1xuYXNzZXJ0QWN0aXZlKHNlbGYpO1xuYW1vdW50S2V5d29yZFJlY29yZD1jb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKFxuYW1vdW50S2V5d29yZFJlY29yZCxcbmdldEFzc2V0S2luZEJ5QnJhbmQpO1xuXG5zZXRTdGFnZWRBbGxvY2F0aW9uKFxuc2VsZixcbnN1YnRyYWN0RnJvbUFsbG9jYXRpb24oXG5nZXRTdGFnZWRBbGxvY2F0aW9uKHNlbGYpLFxuYW1vdW50S2V5d29yZFJlY29yZCkpO1xuXG5cbnJldHVybiBhbW91bnRLZXl3b3JkUmVjb3JkO1xuIH0sXG5jbGVhcigpe1xuY29uc3R7c2VsZn09dGhpcztcbmlmKHpjZlNlYXRUb1N0YWdlZEFsbG9jYXRpb25zLmhhcyhzZWxmKSl7XG56Y2ZTZWF0VG9TdGFnZWRBbGxvY2F0aW9ucy5kZWxldGUoc2VsZik7XG4gfVxuIH0sXG5oYXNTdGFnZWRBbGxvY2F0aW9uKCl7XG5jb25zdHtzZWxmfT10aGlzO1xucmV0dXJuIGhhc1N0YWdlZEFsbG9jYXRpb24oc2VsZik7XG4gfX0pO1xuXG5cblxuY29uc3QgcmVwbGFjZUR1cmFibGVXZWFrTWFwU3RvcmU9KGJhZ2dhZ2Usa2V5KT0+e1xuY29uc3QgbWFwU3RvcmU9bWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShrZXkse2R1cmFibGU6dHJ1ZX0pO1xuYmFnZ2FnZS5zZXQoa2V5LG1hcFN0b3JlKTtcbnJldHVybiBtYXBTdG9yZTtcbiB9O1xuXG5jb25zdCBaY2ZTZWF0TWFuYWdlcklLaXQ9aGFyZGVuKHtcbnNlYXRNYW5hZ2VyOk0uaW50ZXJmYWNlKCdaY2ZTZWF0TWFuYWdlcicse1xubWFrZVpDRlNlYXQ6TS5jYWxsKFNlYXREYXRhU2hhcGUpLnJldHVybnMoTS5yZW1vdGFibGUoJ3pjZlNlYXQnKSksXG5hdG9taWNSZWFycmFuZ2U6TS5jYWxsKE0uYXJyYXlPZihUcmFuc2ZlclBhcnRTaGFwZSkpLnJldHVybnMoKSxcbnJlYWxsb2NhdGU6TS5jYWxsKE0ucmVtb3RhYmxlKCd6Y2ZTZWF0JyksTS5yZW1vdGFibGUoJ3pjZlNlYXQnKSkuXG5yZXN0KE0uYXJyYXlPZihNLnJlbW90YWJsZSgnemNmU2VhdCcpKSkuXG5yZXR1cm5zKCksXG5kcm9wQWxsUmVmZXJlbmNlczpNLmNhbGwoKS5yZXR1cm5zKCl9KSxcblxuemNmTWludFJlYWxsb2NhdG9yOk0uaW50ZXJmYWNlKCdNaW50UmVhbGxvY2F0b3InLHtcbnJlYWxsb2NhdGU6TS5jYWxsKFNlYXRTaGFwZSxBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoKX0pfSk7XG5cblxuXG5jb25zdCBtYWtlU2VhdE1hbmFnZXJLaXQ9cHJlcGFyZUV4b0NsYXNzS2l0KFxuemNmQmFnZ2FnZSxcbidaY2ZTZWF0TWFuYWdlcicsXG5aY2ZTZWF0TWFuYWdlcklLaXQsXG5pbml0RW1wdHksXG57XG5zZWF0TWFuYWdlcjp7XG5tYWtlWkNGU2VhdCh7cHJvcG9zYWwsaW5pdGlhbEFsbG9jYXRpb24sc2VhdEhhbmRsZX0pe1xuY29uc3QgemNmU2VhdD1tYWtlWkNGU2VhdEludGVybmFsKHByb3Bvc2FsKTtcbmFjdGl2ZVpDRlNlYXRzLmluaXQoemNmU2VhdCxpbml0aWFsQWxsb2NhdGlvbik7XG56Y2ZTZWF0VG9TZWF0SGFuZGxlLmluaXQoemNmU2VhdCxzZWF0SGFuZGxlKTtcbnJldHVybiB6Y2ZTZWF0O1xuIH0sXG5cbi8qKlxuICogUmVhcnJhbmdlIHRoZSBhbGxvY2F0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9ucy5cbiAqIFRoaXMgaXMgYSBzZXQgb2YgY2hhbmdlcyB0byBhbGxvY2F0aW9ucyB0aGF0IG11c3Qgc2F0aXNmeSBzZXZlcmFsXG4gKiBjb25zdHJhaW50cy4gSWYgdGhlc2UgY29uc3RyYWludHMgYXJlIGFsbCBtZXQsIHRoZW4gdGhlIHJlYWxsb2NhdGlvblxuICogaGFwcGVucyBhdG9taWNhbGx5LiBPdGhlcndpc2UsIGl0IGRvZXMgbm90IGhhcHBlbiBhdCBhbGwuXG4gKlxuICogVGhlIGNvbmRpdGlvbnNcbiAqICAgICogQWxsIHRoZSBtZW50aW9uZWQgc2VhdHMgYXJlIHN0aWxsIGxpdmUsXG4gKiAgICAqIE5vIG91dHN0YW5kaW5nIHN0YWdpbmdzIGZvciBhbnkgb2YgdGhlIG1lbnRpb25lZCBzZWF0cy4gU3RhZ2luZ3NcbiAqICAgICAgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb3IgYXRvbWljUmVhcnJhbmdlLiBUbyBwcmV2ZW50XG4gKiAgICAgIGNvbmZ1c2lvbiwgZm9yIGVhY2ggcmVhbGxvY2F0aW9uLCBpdCBjYW4gb25seSBiZSBleHByZXNzZWQgaW5cbiAqICAgICAgdGhlIG9sZCB3YXkgb3IgdGhlIG5ldyB3YXksIGJ1dCBub3QgYSBtaXh0dXJlLlxuICogICAgKiBPZmZlciBzYWZldHlcbiAqICAgICogT3ZlcmFsbCBjb25zZXJ2YXRpb25cbiAqXG4gKiBUaGUgb3ZlcmFsbCB0cmFuc2ZlciBpcyBleHByZXNzZWQgYXMgYW4gYXJyYXkgb2YgYFRyYW5zZmVyUGFydGAuIEVhY2hcbiAqIGluZGl2aWR1YWwgYFRyYW5zZmVyUGFydGAgaXMgb25lIG9mXG4gKiAtIEEgdHJhbnNmZXIgZnJvbSBhIGBmcm9tU2VhdGAgdG8gYSBgdG9TZWF0YC4gU3BlY2lmeSBib3RoIHRvQW1vdW50XG4gKiAgICAgYW5kIGZyb21BbW91bnQgdG8gY2hhbmdlIGtleXdvcmRzLCBvdGhlcndpc2Ugb25seSBmcm9tQW1vdW50IGlzIHJlcXVpcmVkLlxuICogLSBBIHRha2luZyBmcm9tIGEgYGZyb21TZWF0YCdzIGFsbG9jYXRpb24uIFNlZSB0aGUgYGZyb21Pbmx5YCBoZWxwZXIuXG4gKiAtIEEgZ2l2aW5nIGludG8gYSBgdG9TZWF0YCdzIGFsbG9jYXRpb24uIFNlZSB0aGUgYHRvT25seWAgaGVscGVyLlxuICpcbiAqIEBwYXJhbSB7VHJhbnNmZXJQYXJ0W119IHRyYW5zZmVyc1xuICovXG5hdG9taWNSZWFycmFuZ2UodHJhbnNmZXJzKXtcbmNvbnN0IG5ld0FsbG9jYXRpb25zPW1ha2VBbGxvY2F0aW9uTWFwKHRyYW5zZmVycyk7XG5cbi8qIC8vLy8vLyBBbGwgU2VhdHMgYXJlIGFjdGl2ZSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuZm9yKGNvbnN0W3NlYXRdb2YgbmV3QWxsb2NhdGlvbnMpe1xuYXNzZXJ0QWN0aXZlKHNlYXQpO1xuIXNlYXQuaGFzU3RhZ2VkQWxsb2NhdGlvbigpfHxcbkZhaWwgYENhbm5vdCBtaXggYXRvbWljUmVhcnJhbmdlIHdpdGggc2VhdCBzdGFnaW5nczogJHtzZWF0fWA7XG56Y2ZTZWF0VG9TZWF0SGFuZGxlLmhhcyhzZWF0KXx8XG5GYWlsIGBUaGUgc2VhdCAke3NlYXR9IHdhcyBub3QgcmVjb2duaXplZGA7XG4gfVxuXG4vKiAvLy8vLy8gRW5zdXJlIHRoYXQgcmlnaHRzIGFyZSBjb25zZXJ2ZWQgb3ZlcmFsbCAvLy8vLy8vLy8vLy8vKi9cblxuLyogY29udmVydCBhcnJheSBvZiBrZXl3b3JkQW1vdW50UmVjb3JkcyB0byAxLWxldmVsIGFycmF5IG9mIEFtb3VudHMqL1xuY29uc3QgZmxhdHRlbkFtb3VudHM9KGFsbG9jYXRpb25zKT0+XG5hbGxvY2F0aW9ucy5mbGF0TWFwKE9iamVjdC52YWx1ZXMpO1xuY29uc3QgcHJldmlvdXNBbW91bnRzPWZsYXR0ZW5BbW91bnRzKFxubmV3QWxsb2NhdGlvbnMubWFwKChbc2VhdF0pPT5zZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCkpKTtcblxuY29uc3QgbmV3QW1vdW50cz1mbGF0dGVuQW1vdW50cyhcbm5ld0FsbG9jYXRpb25zLm1hcCgoW18sYWxsb2NhdGlvbl0pPT5hbGxvY2F0aW9uKSk7XG5cbmFzc2VydFJpZ2h0c0NvbnNlcnZlZChwcmV2aW91c0Ftb3VudHMsbmV3QW1vdW50cyk7XG5cbi8qIC8vLy8vLyBFbnN1cmUgdGhhdCBvZmZlciBzYWZldHkgaG9sZHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuZm9yKGNvbnN0W3NlYXQsYWxsb2NhdGlvbl1vZiBuZXdBbGxvY2F0aW9ucyl7XG5pc09mZmVyU2FmZShzZWF0LmdldFByb3Bvc2FsKCksYWxsb2NhdGlvbil8fFxuRmFpbCBgT2ZmZXIgc2FmZXR5IHdhcyB2aW9sYXRlZCBieSB0aGUgcHJvcG9zZWQgYWxsb2NhdGlvbjogJHthbGxvY2F0aW9ufS4gUHJvcG9zYWwgd2FzICR7c2VhdC5nZXRQcm9wb3NhbCgpfWA7XG4gfVxuXG5jb25zdCBzZWF0SGFuZGxlQWxsb2NhdGlvbnM9bmV3QWxsb2NhdGlvbnMubWFwKFxuKFtzZWF0LGFsbG9jYXRpb25dKT0+e1xuY29uc3Qgc2VhdEhhbmRsZT16Y2ZTZWF0VG9TZWF0SGFuZGxlLmdldChzZWF0KTtcbnJldHVybnthbGxvY2F0aW9uLHNlYXRIYW5kbGV9O1xuIH0pO1xuXG50cnl7XG4vKiBObyBzaWRlIGVmZmVjdHMgYWJvdmUuIEFsbCBjb25kaXRpb25zIGNoZWNrZWQgd2hpY2ggY291bGQgaGF2ZSovXG4vKiBjYXVzZWQgdXMgdG8gcmVqZWN0IHRoaXMgcmVhbGxvY2F0aW9uLiBOb3RpY2UgdGhhdCB0aGUgY3VycmVudCovXG4vKiBhbGxvY2F0aW9ucyBhcmUgY2FwdHVyZWQgaW4gc2VhdEhhbmRsZUFsbG9jYXRpb25zLCBzbyB0aGVyZSBtdXN0Ki9cbi8qIGJlIG5vIGF3YWl0cyBiZXR3ZWVuIHRoYXQgYXNzaWdubWVudCBhbmQgaGVyZS4qL1xuLyoqL1xuLyogQ09NTUlUIFBPSU5UKi9cbi8qKi9cbi8qIFRoZSBlZmZlY3RzIG11c3Qgc3VjY2VlZCBhdG9taWNhbGx5LiBUaGUgY2FsbCB0byovXG4vKiByZXBsYWNlQWxsb2NhdGlvbnMoKSB3aWxsIGJlIHByb2Nlc3NlZCBpbiB0aGUgb3JkZXIgb2YgdXBkYXRlcyovXG4vKiBmcm9tIFpDRiB0byBab2UuIEl0cyBlZmZlY3RzIG11c3Qgb2NjdXIgaW1tZWRpYXRlbHkgaW4gWm9lIG9uKi9cbi8qIHJlY2VwdGlvbiwgYW5kIG11c3Qgbm90IGZhaWwuKi9cbi8qKi9cbi8qIENvbW1pdCB0aGUgbmV3IGFsbG9jYXRpb25zIChjdXJyZW50QWxsb2NhdGlvbiBpcyByZXBsYWNlZCovXG4vKiBmb3IgZWFjaCBvZiB0aGUgc2VhdHMpIGFuZCBpbmZvcm0gWm9lIG9mIHRoZSBuZXcgYWxsb2NhdGlvbi4qL1xuXG5mb3IoY29uc3Rbc2VhdCxhbGxvY2F0aW9uXW9mIG5ld0FsbG9jYXRpb25zKXtcbmFjdGl2ZVpDRlNlYXRzLnNldChzZWF0LGFsbG9jYXRpb24pO1xuIH1cblxuRSh6b2VJbnN0YW5jZUFkbWluKS5yZXBsYWNlQWxsb2NhdGlvbnMoc2VhdEhhbmRsZUFsbG9jYXRpb25zKTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG4gfSxcbnJlYWxsb2NhdGUoLyoqIEB0eXBlIHtaQ0ZTZWF0W119ICovLi4uc2VhdHMpe1xuc2VhdHMuZm9yRWFjaChhc3NlcnRBY3RpdmUpO1xuc2VhdHMuZm9yRWFjaChhc3NlcnRTdGFnZWRBbGxvY2F0aW9uKTtcblxuLyogRW5zdXJlIHRoYXQgcmlnaHRzIGFyZSBjb25zZXJ2ZWQgb3ZlcmFsbC4qL1xuY29uc3QgZmxhdHRlbkFsbG9jYXRpb25zPShhbGxvY2F0aW9ucyk9PlxuYWxsb2NhdGlvbnMuZmxhdE1hcChPYmplY3QudmFsdWVzKTtcbmNvbnN0IHByZXZpb3VzQWxsb2NhdGlvbnM9c2VhdHMubWFwKChzZWF0KT0+XG5zZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCkpO1xuXG5jb25zdCBwcmV2aW91c0Ftb3VudHM9ZmxhdHRlbkFsbG9jYXRpb25zKHByZXZpb3VzQWxsb2NhdGlvbnMpO1xuY29uc3QgbmV3QWxsb2NhdGlvbnM9c2VhdHMubWFwKChzZWF0KT0+c2VhdC5nZXRTdGFnZWRBbGxvY2F0aW9uKCkpO1xuY29uc3QgbmV3QW1vdW50cz1mbGF0dGVuQWxsb2NhdGlvbnMobmV3QWxsb2NhdGlvbnMpO1xuXG5hc3NlcnRSaWdodHNDb25zZXJ2ZWQocHJldmlvdXNBbW91bnRzLG5ld0Ftb3VudHMpO1xuXG4vKiBFbnN1cmUgdGhhdCBvZmZlciBzYWZldHkgaG9sZHMuKi9cbmZvcihjb25zdCBzZWF0IG9mIHNlYXRzKXtcbmlzT2ZmZXJTYWZlKHNlYXQuZ2V0UHJvcG9zYWwoKSxzZWF0LmdldFN0YWdlZEFsbG9jYXRpb24oKSl8fFxuRmFpbCBgT2ZmZXIgc2FmZXR5IHdhcyB2aW9sYXRlZCBieSB0aGUgcHJvcG9zZWQgYWxsb2NhdGlvbjogJHtzZWF0LmdldFN0YWdlZEFsbG9jYXRpb24oKX0uIFByb3Bvc2FsIHdhcyAke3NlYXQuZ2V0UHJvcG9zYWwoKX1gO1xuIH1cblxuLyogS2VlcCB0cmFjayBvZiBzZWF0cyB1c2VkIHNvIGZhciBpbiB0aGlzIGNhbGwsIHRvIHByZXZlbnQgYWxpYXNpbmcuKi9cbmNvbnN0IHpjZlNlYXRzU29GYXI9bmV3IFNldCgpO1xuXG5mb3IoY29uc3Qgc2VhdCBvZiBzZWF0cyl7XG56Y2ZTZWF0VG9TZWF0SGFuZGxlLmhhcyhzZWF0KXx8XG5GYWlsIGBUaGUgc2VhdCAke3NlYXR9IHdhcyBub3QgcmVjb2duaXplZGA7XG4hemNmU2VhdHNTb0Zhci5oYXMoc2VhdCl8fFxuRmFpbCBgU2VhdCAoJHtzZWF0fSkgd2FzIGFscmVhZHkgYW4gYXJndW1lbnQgdG8gcmVhbGxvY2F0ZWA7XG56Y2ZTZWF0c1NvRmFyLmFkZChzZWF0KTtcbiB9XG5cbnRyeXtcbi8qIE5vIHNpZGUgZWZmZWN0cyBhYm92ZS4gQWxsIGNvbmRpdGlvbnMgY2hlY2tlZCB3aGljaCBjb3VsZCBoYXZlKi9cbi8qIGNhdXNlZCB1cyB0byByZWplY3QgdGhpcyByZWFsbG9jYXRpb24uKi9cbi8qIENPTU1JVCBQT0lOVCovXG4vKiBBbGwgdGhlIGVmZmVjdHMgYmVsb3cgbXVzdCBzdWNjZWVkIFwiYXRvbWljYWxseVwiLiBTY2FyZSBxdW90ZXMgYmVjYXVzZSovXG4vKiB0aGUgZXZlbnR1YWwgc2VuZCBhdCB0aGUgYm90dG9tIGlzIHBhcnQgb2YgdGhpcyBcImF0b21pY2l0eVwiIGV2ZW4qL1xuLyogdGhvdWdoIGl0cyBlZmZlY3RzIGhhcHBlbiBsYXRlci4gVGhlIHNlbmQgb2NjdXJzIGluIHRoZSBvcmRlciBvZiovXG4vKiB1cGRhdGVzIGZyb20gemNmIHRvIHpvZSwgaXRzIGVmZmVjdHMgbXVzdCBvY2N1ciBpbW1lZGlhdGVseSBpbiB6b2UqL1xuLyogb24gcmVjZXB0aW9uLCBhbmQgbXVzdCBub3QgZmFpbC4qL1xuLyoqL1xuLyogQ29tbWl0IHRoZSBzdGFnZWQgYWxsb2NhdGlvbnMgKGN1cnJlbnRBbGxvY2F0aW9uIGlzIHJlcGxhY2VkKi9cbi8qIGZvciBlYWNoIG9mIHRoZSBzZWF0cykgYW5kIGluZm9ybSBab2Ugb2YgdGhlKi9cbi8qIG5ld0FsbG9jYXRpb24uKi9cblxuc2VhdHMuZm9yRWFjaChjb21taXRTdGFnZWRBbGxvY2F0aW9uKTtcblxuY29uc3Qgc2VhdEhhbmRsZUFsbG9jYXRpb25zPXNlYXRzLm1hcCgoc2VhdCk9PntcbmNvbnN0IHNlYXRIYW5kbGU9emNmU2VhdFRvU2VhdEhhbmRsZS5nZXQoc2VhdCk7XG5yZXR1cm57c2VhdEhhbmRsZSxhbGxvY2F0aW9uOnNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKX07XG4gfSk7XG5cbkUoem9lSW5zdGFuY2VBZG1pbikucmVwbGFjZUFsbG9jYXRpb25zKHNlYXRIYW5kbGVBbGxvY2F0aW9ucyk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxuIH0sXG5kcm9wQWxsUmVmZXJlbmNlcygpe1xuYWN0aXZlWkNGU2VhdHM9cmVwbGFjZUR1cmFibGVXZWFrTWFwU3RvcmUoXG56Y2ZCYWdnYWdlLFxuJ2FjdGl2ZVpDRlNlYXRzJyk7XG5cbnpjZlNlYXRUb1NlYXRIYW5kbGU9cmVwbGFjZUR1cmFibGVXZWFrTWFwU3RvcmUoXG56Y2ZCYWdnYWdlLFxuJ3pjZlNlYXRUb1NlYXRIYW5kbGUnKTtcblxuIH19LFxuXG56Y2ZNaW50UmVhbGxvY2F0b3I6e1xuLyogVW5saWtlIHRoZSB6Y2YucmVhbGxvY2F0ZSBtZXRob2QsIHRoaXMgb25lIGRvZXMgbm90IGNoZWNrKi9cbi8qIGNvbnNlcnZhdGlvbiwgYW5kIHNvIGNhbiBiZSB1c2VkIGludGVybmFsbHkgZm9yIHJlYWxsb2NhdGlvbnMgdGhhdCovXG4vKiB2aW9sYXRlIGNvbnNlcnZhdGlvbi4qL1xucmVhbGxvY2F0ZSh6Y2ZTZWF0LG5ld0FsbG9jYXRpb24pe1xudHJ5e1xuLyogQ09NTUlUIFBPSU5UKi9cbi8qIEFsbCB0aGUgZWZmZWN0cyBiZWxvdyBtdXN0IHN1Y2NlZWQgXCJhdG9taWNhbGx5XCIuIFNjYXJlIHF1b3RlcyovXG4vKiBiZWNhdXNlIHRoZSBldmVudHVhbCBzZW5kIGF0IHRoZSBib3R0b20gaXMgcGFydCBvZiB0aGlzKi9cbi8qIFwiYXRvbWljaXR5XCIgZXZlbiB0aG91Z2ggaXRzIGVmZmVjdHMgaGFwcGVuIGxhdGVyLiBUaGUgc2VuZCBvY2N1cnMqL1xuLyogaW4gdGhlIG9yZGVyIG9mIHVwZGF0ZXMgZnJvbSB6Y2YgdG8gem9lLCBpdHMgZWZmZWN0cyBtdXN0IG9jY3VyKi9cbi8qIGltbWVkaWF0ZWx5IGluIHpvZSBvbiByZWNlcHRpb24sIGFuZCBtdXN0IG5vdCBmYWlsLiovXG4vKiovXG4vKiBDb21taXQgdGhlIG5ld0FsbG9jYXRpb24gYW5kIGluZm9ybSBab2Ugb2YgdGhlKi9cbi8qIG5ld0FsbG9jYXRpb24uKi9cblxuYWN0aXZlWkNGU2VhdHMuc2V0KHpjZlNlYXQsbmV3QWxsb2NhdGlvbik7XG5cbmNvbnN0IHNlYXRIYW5kbGVBbGxvY2F0aW9ucz1bXG57XG5zZWF0SGFuZGxlOnpjZlNlYXRUb1NlYXRIYW5kbGUuZ2V0KHpjZlNlYXQpLFxuYWxsb2NhdGlvbjpuZXdBbGxvY2F0aW9ufV07XG5cblxuXG5FKHpvZUluc3RhbmNlQWRtaW4pLnJlcGxhY2VBbGxvY2F0aW9ucyhzZWF0SGFuZGxlQWxsb2NhdGlvbnMpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25XaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbiB9fX0pO1xuXG5cblxuXG5yZXR1cm4gcHJvdmlkZSh6Y2ZCYWdnYWdlLCd0aGVTZWF0TWFuYWdlcktpdCcsKCk9Pm1ha2VTZWF0TWFuYWdlcktpdCgpKTtcbiB9OyRo4oCNX29uY2UuY3JlYXRlU2VhdE1hbmFnZXIoY3JlYXRlU2VhdE1hbmFnZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNyZWF0ZVNlYXRNYW5hZ2VyIjpbImNyZWF0ZVNlYXRNYW5hZ2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADr/ZM9aPgAAWj4AADIAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L3pjZlp5Z290ZS5qc3siaW1wb3J0cyI6WyIuLi9jbGVhblByb3Bvc2FsLmpzIiwiLi4vaGFuZGxlV2FybmluZy5qcyIsIi4uL2luc3RhbmNlUmVjb3JkU3RvcmFnZS5qcyIsIi4uL2ludGVybmFsLXR5cGVzLmpzIiwiLi4vaXNzdWVyU3RvcmFnZS5qcyIsIi4uL21ha2VIYW5kbGUuanMiLCIuLi90eXBlR3VhcmRzLmpzIiwiLi9ldmFsQ29udHJhY3RDb2RlLmpzIiwiLi9leGl0LmpzIiwiLi9pbnRlcm5hbC10eXBlcy5qcyIsIi4vb2ZmZXJIYW5kbGVyU3RvcmFnZS5qcyIsIi4vemNmTWludC5qcyIsIi4vemNmU2VhdC5qcyIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIm1ha2VaQ0ZaeWdvdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxwYXNzU3R5bGVPZixSZW1vdGFibGUsQXNzZXRLaW5kLG1ha2VQcm9taXNlS2l0LGFzc2VydFBhdHRlcm4sbXVzdE1hdGNoLGNhbkJlRHVyYWJsZSxNLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxwcm92aWRlRHVyYWJsZU1hcFN0b3JlLHByZXBhcmVFeG8scHJlcGFyZUV4b0NsYXNzLG9iamVjdE1hcCxjbGVhblByb3Bvc2FsLGV2YWxDb250cmFjdEJ1bmRsZSxtYWtlTWFrZUV4aXRlcixkZWZpbmVEdXJhYmxlSGFuZGxlLHByb3ZpZGVJc3N1ZXJTdG9yYWdlLGNyZWF0ZVNlYXRNYW5hZ2VyLG1ha2VJbnN0YW5jZVJlY29yZFN0b3JhZ2UsaGFuZGxlUEtpdFdhcm5pbmcsbWFrZU9mZmVySGFuZGxlclN0b3JhZ2UsSGFuZGxlT2ZmZXJJLEludml0YXRpb25IYW5kbGVTaGFwZSxwcmVwYXJlWmNNaW50OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJSZW1vdGFibGVcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiY2FuQmVEdXJhYmxlXCIsIFskaOKAjV9hID0+IChjYW5CZUR1cmFibGUgPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuLi9jbGVhblByb3Bvc2FsLmpzXCIsIFtbXCJjbGVhblByb3Bvc2FsXCIsIFskaOKAjV9hID0+IChjbGVhblByb3Bvc2FsID0gJGjigI1fYSldXV1dLFtcIi4vZXZhbENvbnRyYWN0Q29kZS5qc1wiLCBbW1wiZXZhbENvbnRyYWN0QnVuZGxlXCIsIFskaOKAjV9hID0+IChldmFsQ29udHJhY3RCdW5kbGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9leGl0LmpzXCIsIFtbXCJtYWtlTWFrZUV4aXRlclwiLCBbJGjigI1fYSA9PiAobWFrZU1ha2VFeGl0ZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi4vbWFrZUhhbmRsZS5qc1wiLCBbW1wiZGVmaW5lRHVyYWJsZUhhbmRsZVwiLCBbJGjigI1fYSA9PiAoZGVmaW5lRHVyYWJsZUhhbmRsZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9pc3N1ZXJTdG9yYWdlLmpzXCIsIFtbXCJwcm92aWRlSXNzdWVyU3RvcmFnZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUlzc3VlclN0b3JhZ2UgPSAkaOKAjV9hKV1dXV0sW1wiLi96Y2ZTZWF0LmpzXCIsIFtbXCJjcmVhdGVTZWF0TWFuYWdlclwiLCBbJGjigI1fYSA9PiAoY3JlYXRlU2VhdE1hbmFnZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi4vaW5zdGFuY2VSZWNvcmRTdG9yYWdlLmpzXCIsIFtbXCJtYWtlSW5zdGFuY2VSZWNvcmRTdG9yYWdlXCIsIFskaOKAjV9hID0+IChtYWtlSW5zdGFuY2VSZWNvcmRTdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIi4uL2hhbmRsZVdhcm5pbmcuanNcIiwgW1tcImhhbmRsZVBLaXRXYXJuaW5nXCIsIFskaOKAjV9hID0+IChoYW5kbGVQS2l0V2FybmluZyA9ICRo4oCNX2EpXV1dXSxbXCIuL29mZmVySGFuZGxlclN0b3JhZ2UuanNcIiwgW1tcIm1ha2VPZmZlckhhbmRsZXJTdG9yYWdlXCIsIFskaOKAjV9hID0+IChtYWtlT2ZmZXJIYW5kbGVyU3RvcmFnZSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9pbnRlcm5hbC10eXBlcy5qc1wiLCBbXV0sW1wiLi9pbnRlcm5hbC10eXBlcy5qc1wiLCBbXV0sW1wiQGFnb3JpYy9zd2luZ3NldC12YXQvc3JjL3R5cGVzLWFtYmllbnQuanNcIiwgW11dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIkhhbmRsZU9mZmVySVwiLCBbJGjigI1fYSA9PiAoSGFuZGxlT2ZmZXJJID0gJGjigI1fYSldXSxbXCJJbnZpdGF0aW9uSGFuZGxlU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEludml0YXRpb25IYW5kbGVTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3pjZk1pbnQuanNcIiwgW1tcInByZXBhcmVaY01pbnRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVaY01pbnQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL2VydHAnKS5Jc3N1ZXJPcHRpb25zUmVjb3JkfSBJc3N1ZXJPcHRpb25zUmVjb3JkICovXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBNYWtlIHRoZSBaQ0YgdmF0IGluIHp5Z290ZS11c2FibGUgZm9ybS4gRmlyc3QsIGEgZ2VuZXJpYyBaQ0YgaXNcbiAqIG1hZGUsIHRoZW4gdGhlIGNvbnRyYWN0IGNvZGUgaXMgZXZhbHVhdGVkLCB0aGVuIGEgcGFydGljdWxhclxuICogaW5zdGFuY2UgaXMgbWFkZS5cbiAqXG4gKiBAcGFyYW0ge1ZhdFBvd2Vyc30gcG93ZXJzXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVNlcnZpY2VcbiAqIEBwYXJhbSB7SXNzdWVyPCdzZXQnPn0gaW52aXRhdGlvbklzc3VlclxuICogQHBhcmFtIHtUZXN0SmlnU2V0dGVyfSB0ZXN0SmlnU2V0dGVyXG4gKiBAcGFyYW0ge0J1bmRsZUNhcH0gY29udHJhY3RCdW5kbGVDYXBcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IHpjZkJhZ2dhZ2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPFpDRlp5Z290ZT59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlWkNGWnlnb3RlPWFzeW5jKFxucG93ZXJzLFxuem9lU2VydmljZSxcbmludml0YXRpb25Jc3N1ZXIsXG50ZXN0SmlnU2V0dGVyLFxuY29udHJhY3RCdW5kbGVDYXAsXG56Y2ZCYWdnYWdlPW1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnemNmQmFnZ2FnZScse2R1cmFibGU6dHJ1ZX0pKT0+XG57XG5jb25zdCBtYWtlU2VhdEhhbmRsZT1kZWZpbmVEdXJhYmxlSGFuZGxlKHpjZkJhZ2dhZ2UsJ1NlYXQnKTtcbi8qKiBAdHlwZSB7RVJlZjxab2VJbnN0YW5jZUFkbWluPn0gKi9cbmxldCB6b2VJbnN0YW5jZUFkbWluO1xubGV0IHNlYXRNYW5hZ2VyO1xubGV0IGluc3RhbmNlUmVjSG9sZGVyO1xuY29uc3QgbWFrZUV4aXRlcj1tYWtlTWFrZUV4aXRlcih6Y2ZCYWdnYWdlKTtcblxuLyoqIEB0eXBlIHsoKSA9PiBJbnN0YW5jZVN0YXRlfSAqL1xuY29uc3QgZ2V0SW5zdGFuY2VSZWNIb2xkZXI9KCk9Pntcbmluc3RhbmNlUmVjSG9sZGVyfHxGYWlsIGBpbnN0YW5jZVJlY29yZCBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB1c2UuYDtcbnJldHVybiBpbnN0YW5jZVJlY0hvbGRlcjtcbiB9O1xuXG5jb25zdHtcbnN0b3JlSXNzdWVyUmVjb3JkLFxuZ2V0QXNzZXRLaW5kQnlCcmFuZCxcbmdldEJyYW5kRm9ySXNzdWVyLFxuZ2V0SXNzdWVyRm9yQnJhbmQsXG5pbnN0YW50aWF0ZTppbnN0YW50aWF0ZUlzc3VlclN0b3JhZ2V9PVxucHJvdmlkZUlzc3VlclN0b3JhZ2UoemNmQmFnZ2FnZSk7XG5cbi8qKiBAdHlwZSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gKi9cbmNvbnN0IHNodXRkb3duV2l0aEZhaWx1cmU9KHJlYXNvbik9PntcbkUoem9lSW5zdGFuY2VBZG1pbikuZmFpbEFsbFNlYXRzKHJlYXNvbik7XG5zZWF0TWFuYWdlci5kcm9wQWxsUmVmZXJlbmNlcygpO1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zMjM5Ki9cbnBvd2Vycy5leGl0VmF0V2l0aEZhaWx1cmUocmVhc29uKTtcbiB9O1xuXG5jb25zdHtzdG9yZU9mZmVySGFuZGxlcix0YWtlT2ZmZXJIYW5kbGVyfT1cbm1ha2VPZmZlckhhbmRsZXJTdG9yYWdlKHpjZkJhZ2dhZ2UpO1xuXG4vKiBNYWtlIHRoZSBpbnN0YW5jZVJlY29yZCovXG5jb25zdCBtYWtlSW5zdGFuY2VSZWNvcmQ9bWFrZUluc3RhbmNlUmVjb3JkU3RvcmFnZSh6Y2ZCYWdnYWdlKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5d29yZFxuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmR9IGlzc3VlclJlY29yZFxuICovXG5jb25zdCByZWNvcmRJc3N1ZXI9KGtleXdvcmQsaXNzdWVyUmVjb3JkKT0+e1xuZ2V0SW5zdGFuY2VSZWNIb2xkZXIoKS5hZGRJc3N1ZXIoa2V5d29yZCxpc3N1ZXJSZWNvcmQpO1xuc3RvcmVJc3N1ZXJSZWNvcmQoaXNzdWVyUmVjb3JkKTtcbiB9O1xuXG5jb25zdCBtYWtlRW1wdHlTZWF0S2l0PShleGl0PXVuZGVmaW5lZCk9PntcbmNvbnN0IGluaXRpYWxBbGxvY2F0aW9uPWhhcmRlbih7fSk7XG5jb25zdCBwcm9wb3NhbD1jbGVhblByb3Bvc2FsKGhhcmRlbih7ZXhpdH0pLGdldEFzc2V0S2luZEJ5QnJhbmQpO1xuY29uc3QgdXNlclNlYXRQcm9taXNlS2l0PW1ha2VQcm9taXNlS2l0KCk7XG5oYW5kbGVQS2l0V2FybmluZyh1c2VyU2VhdFByb21pc2VLaXQpO1xuY29uc3Qgc2VhdEhhbmRsZT1tYWtlU2VhdEhhbmRsZSgpO1xuXG5jb25zdCBzZWF0RGF0YT1oYXJkZW4oe1xucHJvcG9zYWwsXG5pbml0aWFsQWxsb2NhdGlvbixcbnNlYXRIYW5kbGV9KTtcblxuY29uc3QgemNmU2VhdD1zZWF0TWFuYWdlci5tYWtlWkNGU2VhdChzZWF0RGF0YSk7XG5cbmNvbnN0IGV4aXRlcj1tYWtlRXhpdGVyKHNlYXREYXRhLnByb3Bvc2FsLHpjZlNlYXQpO1xuRSh6b2VJbnN0YW5jZUFkbWluKS5cbm1ha2VOb0VzY3Jvd1NlYXQoaW5pdGlhbEFsbG9jYXRpb24scHJvcG9zYWwsZXhpdGVyLHNlYXRIYW5kbGUpLlxudGhlbigodXNlclNlYXQpPT51c2VyU2VhdFByb21pc2VLaXQucmVzb2x2ZSh1c2VyU2VhdCkpO1xuXG5yZXR1cm57emNmU2VhdCx1c2VyU2VhdDp1c2VyU2VhdFByb21pc2VLaXQucHJvbWlzZX07XG4gfTtcblxuLyoqIEB0eXBlIHtSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlWmNNaW50Pn0gKi9cbmxldCBtYWtlWmNNaW50O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz0nbmF0J11cbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZFxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mb11cbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxaQ0ZNaW50PEs+Pn1cbiAqL1xuY29uc3QgbWFrZVpDRk1pbnQ9YXN5bmMoXG5rZXl3b3JkLFxuLyogQHRzLWV4cGVjdC1lcnJvciBwb3NzaWJsZSBkaWZmZXJlbnQgc3VidHlwZSovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPXVuZGVmaW5lZCxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5nZXRJbnN0YW5jZVJlY0hvbGRlcigpLmFzc2VydFVuaXF1ZUtleXdvcmQoa2V5d29yZCk7XG5cbi8qKiBAdHlwZSB7UHJvbWlzZTxab2VNaW50PEs+Pn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCwgWFhYIEFzc2V0S2luZCBnZW5lcmljKi9cbmNvbnN0IHpvZU1pbnQ9RSh6b2VJbnN0YW5jZUFkbWluKS5tYWtlWm9lTWludChcbmtleXdvcmQsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbm9wdGlvbnMpO1xuXG5yZXR1cm4gbWFrZVpjTWludChrZXl3b3JkLHpvZU1pbnQpO1xuIH07XG5cbi8qKiBAdHlwZSB7WkNGUmVnaXN0ZXJGZWVNaW50fSAqL1xuY29uc3QgcmVnaXN0ZXJGZWVNaW50PWFzeW5jKGtleXdvcmQsZmVlTWludEFjY2Vzcyk9PntcbmdldEluc3RhbmNlUmVjSG9sZGVyKCkuYXNzZXJ0VW5pcXVlS2V5d29yZChrZXl3b3JkKTtcblxuY29uc3Qgem9lTWludD1FKHpvZUluc3RhbmNlQWRtaW4pLnJlZ2lzdGVyRmVlTWludChrZXl3b3JkLGZlZU1pbnRBY2Nlc3MpO1xucmV0dXJuIG1ha2VaY01pbnQoa2V5d29yZCx6b2VNaW50KTtcbiB9O1xuXG5jb25zdCBIYW5kbGVPZmZlclNoYXBlPU0ucmVtb3RhYmxlKCdIYW5kbGVPZmZlcicpO1xuXG4vKiBoYW5kbGVPZmZlck9iamVjdCBnaXZlcyBab2UgdGhlIGFiaWxpdHkgdG8gbm90aWZ5IFpDRiB3aGVuIGEgbmV3IHNlYXQgaXMqL1xuLyogYWRkZWQgaW4gb2ZmZXIoKS4gWkNGIHJlc3BvbmRzIHdpdGggdGhlIGV4aXRPYmogYW5kIG9mZmVyUmVzdWx0LiovXG5jb25zdCBtYWtlSGFuZGxlT2ZmZXJPYmo9cHJlcGFyZUV4b0NsYXNzKFxuemNmQmFnZ2FnZSxcbidoYW5kbGVPZmZlck9iaicsXG5IYW5kbGVPZmZlckksXG4ob2ZmZXJIYW5kbGVyVGFrZXIpPT4oe29mZmVySGFuZGxlclRha2VyfSksXG57XG5oYW5kbGVPZmZlcihpbnZpdGF0aW9uSGFuZGxlLHNlYXREYXRhKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuY29uc3QgemNmU2VhdD1zZWF0TWFuYWdlci5tYWtlWkNGU2VhdChzZWF0RGF0YSk7XG4vKiBUT0RPOiBwcm92aWRlIGEgZGV0YWlscyB0aGF0J3MgYSBiZXR0ZXIgZGlhZ25vc3RpYyBmb3IgdGhlKi9cbi8qIGVwaGVtZXJhbCBvZmZlckhhbmRsZXIgdGhhdCBkaWQgbm90IHN1cnZpdmUgdXBncmFkZS4qL1xuXG5jb25zdCBvZmZlckhhbmRsZXI9c3RhdGUub2ZmZXJIYW5kbGVyVGFrZXIudGFrZShpbnZpdGF0aW9uSGFuZGxlKTtcbmNvbnN0IG9mZmVyUmVzdWx0UD1cbnR5cGVvZiBvZmZlckhhbmRsZXI9PT0nZnVuY3Rpb24nP1xuRShvZmZlckhhbmRsZXIpKHpjZlNlYXQsc2VhdERhdGEub2ZmZXJBcmdzKTpcbkUob2ZmZXJIYW5kbGVyKS5oYW5kbGUoemNmU2VhdCxzZWF0RGF0YS5vZmZlckFyZ3MpO1xuXG5jb25zdCBvZmZlclJlc3VsdFByb21pc2U9b2ZmZXJSZXN1bHRQLmNhdGNoKChyZWFzb24pPT57XG5pZihyZWFzb249PT11bmRlZmluZWQpe1xuY29uc3QgbmV3RXJyPUVycm9yKFxuIGBJZiBhbiBvZmZlckhhbmRsZXIgdGhyb3dzLCBpdCBtdXN0IHByb3ZpZGUgYSByZWFzb24gb2YgdHlwZSBFcnJvciwgYnV0IHRoZSByZWFzb24gd2FzIHVuZGVmaW5lZC4gUGxlYXNlIGZpeCB0aGUgY29udHJhY3QgY29kZSB0byBzcGVjaWZ5IGEgcmVhc29uIGZvciB0aHJvd2luZy5gKTtcblxudGhyb3cgemNmU2VhdC5mYWlsKG5ld0Vycik7XG4gfVxudGhyb3cgemNmU2VhdC5mYWlsKHJlYXNvbik7XG4gfSk7XG5jb25zdCBleGl0ZXI9bWFrZUV4aXRlcihzZWF0RGF0YS5wcm9wb3NhbCx6Y2ZTZWF0KTtcbi8qKiBAdHlwZSB7SGFuZGxlT2ZmZXJSZXN1bHR9ICovXG5yZXR1cm4gaGFyZGVuKHtvZmZlclJlc3VsdFByb21pc2UsZXhpdE9iajpleGl0ZXJ9KTtcbiB9fSk7XG5cblxuXG5jb25zdCBIYW5kbGVPZmZlckZ1bmN0aW9uU2hhcGU9TS5yZW1vdGFibGUoJ0hhbmRsZU9mZmVyRnVuY3Rpb24nKTtcbmNvbnN0IE9mZmVySGFuZGxlclNoYXBlPU0ub3IoSGFuZGxlT2ZmZXJTaGFwZSxIYW5kbGVPZmZlckZ1bmN0aW9uU2hhcGUpO1xuY29uc3QgVGFrZXJJPU0uaW50ZXJmYWNlKCdvZmZlciBoYW5kbGVyIHRha2VyJyx7XG50YWtlOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLlxub3B0aW9uYWwoTS5zdHJpbmcoKSkuXG5yZXR1cm5zKE9mZmVySGFuZGxlclNoYXBlKX0pO1xuXG5jb25zdCB0YWtlcj1wcmVwYXJlRXhvKHpjZkJhZ2dhZ2UsJ29mZmVyIGhhbmRsZXIgdGFrZXInLFRha2VySSx7XG50YWtlOnRha2VPZmZlckhhbmRsZXJ9KTtcblxuY29uc3QgaGFuZGxlT2ZmZXJPYmo9bWFrZUhhbmRsZU9mZmVyT2JqKHRha2VyKTtcblxuY29uc3QgZXZhbHVhdGVDb250cmFjdD0oKT0+e1xubGV0IGJ1bmRsZTtcbmlmKHBhc3NTdHlsZU9mKGNvbnRyYWN0QnVuZGxlQ2FwKT09PSdyZW1vdGFibGUnKXtcbmNvbnN0IGJ1bmRsZUNhcD1jb250cmFjdEJ1bmRsZUNhcDtcbi8qIEB0cy1leHBlY3QtZXJyb3IgdmF0UG93ZXJzIGlzIG5vdCB0eXBlZCBjb3JyZWN0bHk6IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzIzOSovXG5idW5kbGU9cG93ZXJzLkQoYnVuZGxlQ2FwKS5nZXRCdW5kbGUoKTtcbiB9ZWxzZXtcbmJ1bmRsZT1jb250cmFjdEJ1bmRsZUNhcDtcbiB9XG5yZXR1cm4gZXZhbENvbnRyYWN0QnVuZGxlKGJ1bmRsZSk7XG4gfTtcbi8qIGV2YWx1YXRlIHRoZSBjb250cmFjdCAoZWl0aGVyIHRoZSBmaXJzdCB2ZXJzaW9uLCBvciBhbiB1cGdyYWRlKSovXG5jb25zdHtcbnN0YXJ0LFxuYnVpbGRSb290T2JqZWN0LFxucHJpdmF0ZUFyZ3NTaGFwZSxcbmN1c3RvbVRlcm1zU2hhcGUsXG5wcmVwYXJlfT1cbmF3YWl0IGV2YWx1YXRlQ29udHJhY3QoKTtcblxuaWYoc3RhcnQ9PT11bmRlZmluZWQmJnByZXBhcmU9PT11bmRlZmluZWQpe1xuYnVpbGRSb290T2JqZWN0PT09dW5kZWZpbmVkfHxcbkZhaWwgYERpZCB5b3UgcHJvdmlkZSBhIHZhdCBidW5kbGUgaW5zdGVhZCBvZiBhIGNvbnRyYWN0IGJ1bmRsZT9gO1xuRmFpbCBgY29udHJhY3QgZXhwb3J0cyBtaXNzaW5nIHN0YXJ0L3ByZXBhcmVgO1xuIH1cbiFzdGFydHx8XG4hcHJlcGFyZXx8XG5GYWlsIGBjb250cmFjdCBtdXN0IHByb3ZpZGUgZXhhY3RseSBvbmUgb2YgXCJzdGFydFwiIGFuZCBcInByZXBhcmVcImA7XG5cbi8qKiBAdHlwZSB7WkNGfSAqL1xuLyogVXNpbmcgUmVtb3RhYmxlIHJhdGhlciB0aGFuIEZhciBiZWNhdXNlIHRoZXJlIGFyZSB0b28gbWFueSBjb21wbGljYXRpb25zKi9cbi8qIGltcG9zaW5nIGNoZWNraW5nIHdyYXBwZXJzOiBtYWtlSW52aXRhdGlvbigpIGFuZCBzZXRKaWcoKSB3YW50IHRvKi9cbi8qIGFjY2VwdCByYXcgZnVuY3Rpb25zLiBhc3NlcnQgY2Fubm90IGJlIGEgdmFsaWQgcGFzc2FibGUhIChJdCdzIGEgZnVuY3Rpb24qL1xuLyogYW5kIGhhcyBtZW1iZXJzLikqL1xuY29uc3QgemNmPVJlbW90YWJsZSgnQWxsZWdlZDogemNmJyx1bmRlZmluZWQse1xuYXRvbWljUmVhcnJhbmdlOih0cmFuc2ZlcnMpPT5zZWF0TWFuYWdlci5hdG9taWNSZWFycmFuZ2UodHJhbnNmZXJzKSxcbnJlYWxsb2NhdGU6KC4uLnNlYXRzKT0+c2VhdE1hbmFnZXIucmVhbGxvY2F0ZSguLi5zZWF0cyksXG5hc3NlcnRVbmlxdWVLZXl3b3JkOihrd2QpPT5nZXRJbnN0YW5jZVJlY0hvbGRlcigpLmFzc2VydFVuaXF1ZUtleXdvcmQoa3dkKSxcbnNhdmVJc3N1ZXI6YXN5bmMoaXNzdWVyUCxrZXl3b3JkKT0+e1xuLyogVE9ETzogVGhlIGNoZWNrcyBvZiB0aGUga2V5d29yZCBmb3IgdW5pcXVlbmVzcyBhcmUqL1xuLyogZHVwbGljYXRlZC4gQXNzZXNzIGhvdyB3YWl0aW5nIG9uIHByb21pc2VzIHRvIHJlc29sdmUgbWlnaHQqL1xuLyogYWZmZWN0IHRob3NlIGNoZWNrcyBhbmQgc2VlIGlmIG9uZSBjYW4gYmUgcmVtb3ZlZC4qL1xuZ2V0SW5zdGFuY2VSZWNIb2xkZXIoKS5hc3NlcnRVbmlxdWVLZXl3b3JkKGtleXdvcmQpO1xuY29uc3QgcmVjb3JkPWF3YWl0IEUoem9lSW5zdGFuY2VBZG1pbikuc2F2ZUlzc3Vlcihpc3N1ZXJQLGtleXdvcmQpO1xuLyogQVdBSVQgLy8vKi9cbnJlY29yZElzc3VlcihrZXl3b3JkLHJlY29yZCk7XG5yZXR1cm4gcmVjb3JkO1xuIH0sXG5tYWtlSW52aXRhdGlvbjooXG5vZmZlckhhbmRsZXIsXG5kZXNjcmlwdGlvbixcbmN1c3RvbURldGFpbHM9aGFyZGVuKHt9KSxcbnByb3Bvc2FsU2hhcGU9dW5kZWZpbmVkKT0+XG57XG50eXBlb2YgZGVzY3JpcHRpb249PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZpdGF0aW9ucyBtdXN0IGhhdmUgYSBkZXNjcmlwdGlvbiBzdHJpbmc6ICR7ZGVzY3JpcHRpb259YDtcblxub2ZmZXJIYW5kbGVyfHxGYWlsIGBvZmZlckhhbmRsZXIgbXVzdCBiZSBwcm92aWRlZGA7XG5cbmlmKHByb3Bvc2FsU2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihwcm9wb3NhbFNoYXBlKTtcbiB9XG5cbmNvbnN0IGludml0YXRpb25IYW5kbGU9c3RvcmVPZmZlckhhbmRsZXIob2ZmZXJIYW5kbGVyKTtcbmNvbnN0IGludml0YXRpb25QPUUoem9lSW5zdGFuY2VBZG1pbikubWFrZUludml0YXRpb24oXG5pbnZpdGF0aW9uSGFuZGxlLFxuZGVzY3JpcHRpb24sXG5jdXN0b21EZXRhaWxzLFxucHJvcG9zYWxTaGFwZSk7XG5cbnJldHVybiBpbnZpdGF0aW9uUDtcbiB9LFxuLyogU2h1dGRvd24gdGhlIGVudGlyZSB2YXQgYW5kIGdpdmUgcGF5b3V0cyovXG5zaHV0ZG93bjooY29tcGxldGlvbik9PntcbkUoem9lSW5zdGFuY2VBZG1pbikuZXhpdEFsbFNlYXRzKGNvbXBsZXRpb24pO1xuc2VhdE1hbmFnZXIuZHJvcEFsbFJlZmVyZW5jZXMoKTtcbnBvd2Vycy5leGl0VmF0KGNvbXBsZXRpb24pO1xuIH0sXG5zaHV0ZG93bldpdGhGYWlsdXJlLFxuc3RvcEFjY2VwdGluZ09mZmVyczooKT0+RSh6b2VJbnN0YW5jZUFkbWluKS5zdG9wQWNjZXB0aW5nT2ZmZXJzKCksXG5tYWtlWkNGTWludCxcbnJlZ2lzdGVyRmVlTWludCxcbm1ha2VFbXB0eVNlYXRLaXQsXG5cbi8qIFRoZSBtZXRob2RzIGJlbG93IGFyZSBwdXJlIGFuZCBoYXZlIG5vIHNpZGUtZWZmZWN0cyAvLyovXG5nZXRab2VTZXJ2aWNlOigpPT56b2VTZXJ2aWNlLFxuZ2V0SW52aXRhdGlvbklzc3VlcjooKT0+aW52aXRhdGlvbklzc3VlcixcbmdldFRlcm1zOigpPT57XG5jb25zdCB0ZXJtcz1nZXRJbnN0YW5jZVJlY0hvbGRlcigpLmdldFRlcm1zKCk7XG5cbi8qIElmIHRoZSBjb250cmFjdCBwcm92aWRlZCBjdXN0b21UZXJtc1NoYXBlLCB2YWxpZGF0ZSB0aGUgY3VzdG9tVGVybXMuKi9cbmlmKGN1c3RvbVRlcm1zU2hhcGUpe1xuY29uc3R7YnJhbmRzOl9iLGlzc3VlcnM6X2ksLi4uY3VzdG9tVGVybXN9PXRlcm1zO1xubXVzdE1hdGNoKGhhcmRlbihjdXN0b21UZXJtcyksY3VzdG9tVGVybXNTaGFwZSwnY3VzdG9tVGVybXMnKTtcbiB9XG5cbnJldHVybiB0ZXJtcztcbiB9LFxuZ2V0QnJhbmRGb3JJc3N1ZXIsXG5nZXRJc3N1ZXJGb3JCcmFuZCxcbmdldEFzc2V0S2luZDpnZXRBc3NldEtpbmRCeUJyYW5kLFxuLyoqIEB0eXBlIHtTZXRUZXN0SmlnfSAqL1xuc2V0VGVzdEppZzoodGVzdEZuPSgpPT4oe30pKT0+e1xuaWYodGVzdEppZ1NldHRlcil7XG50ZXN0SmlnU2V0dGVyKHsuLi50ZXN0Rm4oKSx6Y2Z9KTtcbiB9XG4gfSxcbmdldEluc3RhbmNlOigpPT5nZXRJbnN0YW5jZVJlY0hvbGRlcigpLmdldEluc3RhbmNlUmVjb3JkKCkuaW5zdGFuY2UsXG5zZXRPZmZlckZpbHRlcjooc3RyaW5ncyk9PkUoem9lSW5zdGFuY2VBZG1pbikuc2V0T2ZmZXJGaWx0ZXIoc3RyaW5ncyksXG5nZXRPZmZlckZpbHRlcjooKT0+RSh6b2VJbnN0YW5jZUFkbWluKS5nZXRPZmZlckZpbHRlcigpfSk7XG5cblxuLyogc25hcHNob3Qgenlnb3RlIGhlcmUgLy8vLy8vLy8vLy8vLy8vLy8vKi9cbi8qIHRoZSB6eWdvdGUgb2JqZWN0IGJlbG93IHdpbGwgYmUgY3JlYXRlZCBub3csIGJ1dCBpdHMgbWV0aG9kcyB3b24ndCBiZSovXG4vKiBpbnZva2VkIHVudGlsIGFmdGVyIHRoZSBzbmFwc2hvdCBpcyB0YWtlbi4qL1xuXG5jb25zdCBjb250cmFjdEJhZ2dhZ2U9cHJvdmlkZUR1cmFibGVNYXBTdG9yZSh6Y2ZCYWdnYWdlLCdjb250cmFjdEJhZ2dhZ2UnKTtcblxuY29uc3QgaW5pdFNlYXRNZ3JBbmRNaW50S2luZD0oKT0+e1xubGV0IHpjZk1pbnRSZWFsbG9jYXRvcjtcbih7c2VhdE1hbmFnZXIsemNmTWludFJlYWxsb2NhdG9yfT1jcmVhdGVTZWF0TWFuYWdlcihcbnpvZUluc3RhbmNlQWRtaW4sXG5nZXRBc3NldEtpbmRCeUJyYW5kLFxuc2h1dGRvd25XaXRoRmFpbHVyZSxcbnpjZkJhZ2dhZ2UpKTtcblxuXG5tYWtlWmNNaW50PXByZXBhcmVaY01pbnQoXG56Y2ZCYWdnYWdlLFxucmVjb3JkSXNzdWVyLFxuZ2V0QXNzZXRLaW5kQnlCcmFuZCxcbm1ha2VFbXB0eVNlYXRLaXQsXG56Y2ZNaW50UmVhbGxvY2F0b3IpO1xuXG4gfTtcblxuLyoqXG4gKiBBIHp5Z290ZSBpcyBhIHByZS1pbWFnZSBvZiBhIHZhdCB0aGF0IGNhbiBxdWlja2x5IGJlIGluc3RhbnRpYXRlZCBiZWNhdXNlXG4gKiB0aGUgY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZC4gU3dpbmdTZXQgZG9lc24ndCBzdXBwb3J0IHp5Z290ZXMgeWV0LlxuICogT25jZSBpdCBkb2VzIHRoZSBjb2RlIHdpbGwgYmUgZXZhbHVhdGVkIG9uY2Ugd2hlbiBjcmVhdGluZyB0aGUgemNmWnlnb3RlLFxuICogdGhlbiB0aGUgc3RhcnQoKSBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBlYWNoIHRpbWUgYW4gaW5zdGFuY2UgaXMgc3RhcnRlZC5cbiAqXG4gKiBDdXJyZW50bHksIFpvZSdzIGJ1aWxkUm9vdE9iamVjdCBjYWxscyBtYWtlWkNGWnlnb3RlLCBldmFsdWF0ZUNvbnRyYWN0LCBhbmRcbiAqIHN0YXJ0Q29udHJhY3QgZXZlcnkgdGltZSBhIGNvbnRyYWN0IGluc3RhbmNlIGlzIGNyZWF0ZWQuXG4gKlxuICogQHR5cGUge1pDRlp5Z290ZX1cbiAqL1xuY29uc3QgemNmWnlnb3RlPXtcbi8qIHdpcmUgemNmIHVwIHRvIHpvZSBpbnN0YW5jZS1zcGVjaWZpYyBpbnRlcmZhY2VzKi9cbnN0YXJ0Q29udHJhY3Q6YXN5bmMoXG5pbnN0YW5jZUFkbWluRnJvbVpvZSxcbmluc3RhbmNlUmVjb3JkRnJvbVpvZSxcbmlzc3VlclN0b3JhZ2VGcm9tWm9lLFxucHJpdmF0ZUFyZ3M9dW5kZWZpbmVkKT0+XG57XG56b2VJbnN0YW5jZUFkbWluPWluc3RhbmNlQWRtaW5Gcm9tWm9lO1xuaW5pdFNlYXRNZ3JBbmRNaW50S2luZCgpO1xuXG56Y2ZCYWdnYWdlLmluaXQoJ3pjZkluc3RhbmNlQWRtaW4nLGluc3RhbmNlQWRtaW5Gcm9tWm9lKTtcbmluc3RhbmNlUmVjSG9sZGVyPW1ha2VJbnN0YW5jZVJlY29yZChpbnN0YW5jZVJlY29yZEZyb21ab2UpO1xuaW5zdGFudGlhdGVJc3N1ZXJTdG9yYWdlKGlzc3VlclN0b3JhZ2VGcm9tWm9lKTtcbnpjZkJhZ2dhZ2UuaW5pdCgnaW5zdGFuY2VSZWNIb2xkZXInLGluc3RhbmNlUmVjSG9sZGVyKTtcblxuY29uc3Qgc3RhcnRGbj1zdGFydHx8cHJlcGFyZTtcbmlmKHByaXZhdGVBcmdzU2hhcGUpe1xubXVzdE1hdGNoKHByaXZhdGVBcmdzLHByaXZhdGVBcmdzU2hhcGUsJ3ByaXZhdGVBcmdzJyk7XG4gfVxuLyogc3RhcnQgYSBjb250cmFjdCBmb3IgdGhlIGZpcnN0IHRpbWUqL1xucmV0dXJuIEUud2hlbihcbnN0YXJ0Rm4oemNmLHByaXZhdGVBcmdzLGNvbnRyYWN0QmFnZ2FnZSksXG4oe1xuY3JlYXRvckZhY2V0PXVuZGVmaW5lZCxcbnB1YmxpY0ZhY2V0PXVuZGVmaW5lZCxcbmNyZWF0b3JJbnZpdGF0aW9uPXVuZGVmaW5lZCxcbi4uLnVuZXhwZWN0ZWR9KT0+XG57XG5jb25zdCB1bmV4cGVjdGVkS2V5cz1PYmplY3Qua2V5cyh1bmV4cGVjdGVkKTtcbnVuZXhwZWN0ZWRLZXlzLmxlbmd0aD09PTB8fFxuRmFpbCBgY29udHJhY3QgJHtcbnByZXBhcmU/J3ByZXBhcmUnOidzdGFydCdcbiB9IHJldHVybmVkIHVucmVjb2duaXplZCBwcm9wZXJ0aWVzICR7dW5leHBlY3RlZEtleXN9YDtcblxuY29uc3QgYXJlRHVyYWJsZT1vYmplY3RNYXAoXG57Y3JlYXRvckZhY2V0LHB1YmxpY0ZhY2V0LGNyZWF0b3JJbnZpdGF0aW9ufSxcbmNhbkJlRHVyYWJsZSk7XG5cbmNvbnN0IGFsbER1cmFibGU9T2JqZWN0LnZhbHVlcyhhcmVEdXJhYmxlKS5ldmVyeShCb29sZWFuKTtcbmlmKHByZXBhcmUpe1xuYWxsRHVyYWJsZXx8XG5GYWlsIGB2YWx1ZXMgZnJvbSBwcmVwYXJlKCkgbXVzdCBiZSBkdXJhYmxlICR7YXJlRHVyYWJsZX1gO1xuIH1cblxuaWYoYWxsRHVyYWJsZSl7XG56Y2ZCYWdnYWdlLmluaXQoJ2NyZWF0b3JGYWNldCcsY3JlYXRvckZhY2V0KTtcbnpjZkJhZ2dhZ2UuaW5pdCgncHVibGljRmFjZXQnLHB1YmxpY0ZhY2V0KTtcbnpjZkJhZ2dhZ2UuaW5pdCgnY3JlYXRvckludml0YXRpb24nLGNyZWF0b3JJbnZpdGF0aW9uKTtcbiB9XG5cbnJldHVybiBoYXJkZW4oe1xuY3JlYXRvckZhY2V0LFxucHVibGljRmFjZXQsXG5jcmVhdG9ySW52aXRhdGlvbixcbmhhbmRsZU9mZmVyT2JqfSk7XG5cbiB9KTtcblxuIH0sXG5cbnJlc3RhcnRDb250cmFjdDphc3luYyhwcml2YXRlQXJncz11bmRlZmluZWQpPT57XG5wcmVwYXJlfHxGYWlsIGBwcmVwYXJlIG11c3QgYmUgZGVmaW5lZCB0byB1cGdyYWRlIGEgY29udHJhY3RgO1xuem9lSW5zdGFuY2VBZG1pbj16Y2ZCYWdnYWdlLmdldCgnemNmSW5zdGFuY2VBZG1pbicpO1xuaW5zdGFuY2VSZWNIb2xkZXI9emNmQmFnZ2FnZS5nZXQoJ2luc3RhbmNlUmVjSG9sZGVyJyk7XG5pbml0U2VhdE1nckFuZE1pbnRLaW5kKCk7XG5cbmlmKHByaXZhdGVBcmdzU2hhcGUpe1xubXVzdE1hdGNoKHByaXZhdGVBcmdzLHByaXZhdGVBcmdzU2hhcGUsJ3ByaXZhdGVBcmdzJyk7XG4gfVxuXG4vKiByZXN0YXJ0IGFuIHVwZ3JhZGVhYmxlIGNvbnRyYWN0Ki9cbnJldHVybiBFLndoZW4oXG5wcmVwYXJlKHpjZixwcml2YXRlQXJncyxjb250cmFjdEJhZ2dhZ2UpLFxuKHtcbmNyZWF0b3JGYWNldD11bmRlZmluZWQsXG5wdWJsaWNGYWNldD11bmRlZmluZWQsXG5jcmVhdG9ySW52aXRhdGlvbj11bmRlZmluZWR9KT0+XG57XG5jb25zdCBwcmlvckNyZWF0b3JGYWNldD16Y2ZCYWdnYWdlLmdldCgnY3JlYXRvckZhY2V0Jyk7XG5jb25zdCBwcmlvclB1YmxpY0ZhY2V0PXpjZkJhZ2dhZ2UuZ2V0KCdwdWJsaWNGYWNldCcpO1xuY29uc3QgcHJpb3JDcmVhdG9ySW52aXRhdGlvbj16Y2ZCYWdnYWdlLmdldCgnY3JlYXRvckludml0YXRpb24nKTtcblxucHJpb3JDcmVhdG9yRmFjZXQ9PT1jcmVhdG9yRmFjZXQmJlxucHJpb3JQdWJsaWNGYWNldD09PXB1YmxpY0ZhY2V0JiZcbnByaW9yQ3JlYXRvckludml0YXRpb249PT1jcmVhdG9ySW52aXRhdGlvbnx8XG5GYWlsIGByZXN0YXJ0Q29udHJhY3QgZmFpbGVkOiBmYWNldHMgcmV0dXJuZWQgYnkgY29udHJhY3QgY2hhbmdlZCBpZGVudGl0eWA7XG5yZXR1cm4gaGFyZGVuKHtcbmNyZWF0b3JGYWNldCxcbnB1YmxpY0ZhY2V0LFxuY3JlYXRvckludml0YXRpb24sXG5oYW5kbGVPZmZlck9ian0pO1xuXG4gfSk7XG5cbiB9fTtcblxucmV0dXJuIGhhcmRlbih6Y2ZaeWdvdGUpO1xuIH07JGjigI1fb25jZS5tYWtlWkNGWnlnb3RlKG1ha2VaQ0ZaeWdvdGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VaQ0ZaeWdvdGUiOlsibWFrZVpDRlp5Z290ZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAaKNhCuRIAALkSAAA5AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiVHJhbnNmZXJQYXJ0U2hhcGUiLCJhdG9taWNSZWFycmFuZ2UiLCJhdG9taWNUcmFuc2ZlciIsImZyb21Pbmx5IiwidG9Pbmx5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0sQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFNlYXRTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJTZWF0U2hhcGVcIiwgWyRo4oCNX2EgPT4gKFNlYXRTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0ICAgICAgICBUcmFuc2ZlclBhcnRTaGFwZT1NLnNwbGl0QXJyYXkoXG5oYXJkZW4oW00ub3B0KFNlYXRTaGFwZSksTS5vcHQoU2VhdFNoYXBlKSxNLm9wdChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpXSksXG5oYXJkZW4oW00ub3B0KEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSldKSk7XG5cblxuLyoqXG4gKiBBc2tzIFpvZSAodmlhIHpjZikgdG8gcmVhcnJhbmdlIHRoZSBhbGxvY2F0aW9ucyBhbW9uZyB0aGUgc2VhdHNcbiAqIG1lbnRpb25lZC4gVGhpcyBpcyBhIHNldCBvZiBjaGFuZ2VzIHRvIGFsbG9jYXRpb25zIHRoYXQgbXVzdCBzYXRpc2Z5XG4gKiBzZXZlcmFsIGNvbnN0cmFpbnRzLiBJZiB0aGVzZSBjb25zdHJhaW50cyBhcmUgYWxsIG1ldCwgdGhlbiB0aGVcbiAqIHJlYWxsb2NhdGlvbiBoYXBwZW5zIGF0b21pY2FsbHkuIE90aGVyd2lzZSBpdCBkb2VzIG5vdCBoYXBwZW5cbiAqIGF0IGFsbC5cbiAqXG4gKiBUaGUgY29uZGl0aW9uc1xuICogICAgKiBBbGwgdGhlIG1lbnRpb25lZCBzZWF0cyBhcmUgc3RpbGwgbGl2ZSAtLSBlbmZvcmNlZCBieSBaQ0YuXG4gKiAgICAqIE5vIG91dHN0YW5kaW5nIHN0YWdpbmdzIGZvciBhbnkgb2YgdGhlIG1lbnRpb25lZCBzZWF0cy5cbiAqICAgICAgU3RhZ2luZ3Mgbm93IGRlcHJlY2F0ZWQgaW4gZmF2b3Igb3IgYXRvbWljUmVhcnJhbmdlLiBUb1xuICogICAgICBwcmV2ZW50IGNvbmZ1c2lvbiwgZm9yIGVhY2ggcmVhbGxvY2F0aW9uLCBpdCBjYW4gb25seSBiZVxuICogICAgICBleHByZXNzZWQgaW4gdGhlIG9sZCB3YXkgb3IgdGhlIG5ldyB3YXksIGJ1dCBub3QgYSBtaXh0dXJlLlxuICogICAgKiBPZmZlciBzYWZldHkgLS0gZW5mb3JjZWQgYnkgWkNGLlxuICogICAgKiBPdmVyYWxsIGNvbnNlcnZhdGlvbiAtLSBlbmZvcmNlZCBieSBaQ0YuXG4gKiAgICAqIFRoZSBvdmVyYWxsIHRyYW5zZmVyIGlzIGV4cHJlc3NlZCBhcyBhbiBhcnJheSBvZiBgVHJhbnNmZXJQYXJ0YC5cbiAqICAgICAgRWFjaCBpbmRpdmlkdWFsIGBUcmFuc2ZlclBhcnRgIGlzIG9uZSBvZlxuICogICAgICAgLSBBIHRyYW5zZmVyIGZyb20gYSBgZnJvbVNlYXRgIHRvIGEgYHRvU2VhdGAuXG4gKiAgICAgICAgIFRoaXMgaXMgbm90IG5lZWRlZCBmb3IgWm9lJ3Mgc2FmZXR5LCBhcyBab2UgZG9lc1xuIGl0cyBvd24gb3ZlcmFsbCBjb25zZXJ2YXRpb24gY2hlY2suIFJhdGhlciwgaXQgaGVscHMgY2F0Y2hcbiBhbmQgZGlhZ25vc2UgY29udHJhY3QgYnVncyBlYXJsaWVyLlxuICogICAgICAgLSBBIHRha2luZyBmcm9tIGEgYGZyb21TZWF0YCdzIGFsbG9jYXRpb24uIFNlZSB0aGUgYGZyb21Pbmx5YFxuIGhlbHBlci5cbiAtIEEgZ2l2aW5nIGludG8gYSBgdG9TZWF0YCdzIGFsbG9jYXRpb24uIFNlZSB0aGUgYHRvT25seWBcbiBoZWxwZXIuXG4gKlxuICogVE9ETyg2Njc5KSBSZWZhY3RvciBgYXRvbWljUmVhcnJhbmdlYGZyb20gYmVpbmcgYSBoZWxwZXIgaW50byBiZWluZ1xuICogemNmJ3MgcmVwbGFjZW1lbnQgZm9yIHJlYWxsb2NhdGUuIEl0IHdhcyBtYWRlIGEgaGVscGVyIGR1cmluZ1xuICogdGhlIHRyYW5zaXRpb24sIHRvIGF2b2lkIGludGVyZmVyZW5jZSB3aXRoIHByb2dyZXNzIG9uIFpvZSBkdXJhYmlsaXR5LlxuICpcbiAqIFNlZSB0aGUgaGVscGVycyBiZWxvdywgYGZyb21Pbmx5YCwgYHRvT25seWAsIGFuZCBgYXRvbWljVHJhbnNmZXJgLFxuICogd2hpY2ggd2lsbCByZW1haW4gaGVscGVycy4gVGhlc2UgaGVscGVyIGFyZSBmb3IgY29udmVuaWVuY2VcbiAqIGluIGV4cHJlc3NpbmcgYXRvbWljIHJlYXJyYW5nZW1lbnRzIGNsZWFybHkuXG4gKlxuICogQGRlcHJlY2F0ZWQgdXNlIHRoZSB6Y2YgYnVpbHRpbiBpbnN0ZWFkXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtUcmFuc2ZlclBhcnRbXX0gdHJhbnNmZXJzXG4gKi8kaOKAjV9vbmNlLlRyYW5zZmVyUGFydFNoYXBlKFRyYW5zZmVyUGFydFNoYXBlKTtcbmNvbnN0ICAgICAgICBhdG9taWNSZWFycmFuZ2U9KHpjZix0cmFuc2ZlcnMpPT57XG56Y2YuYXRvbWljUmVhcnJhbmdlKHRyYW5zZmVycyk7XG4gfTtcblxuLyoqXG4gKiBTb21ldGltZXMgYSBUcmFuc2ZlclBhcnQgaW4gYW4gYXRvbWljUmVhcnJhbmdlIG9ubHkgZXhwcmVzc2VzIHdoYXQgYW1vdW50c1xuICogc2hvdWxkIGJlIHRha2VuIGZyb20gYSBzZWF0LCBsZWF2aW5nIGl0IHRvIG90aGVyIFRyYW5zZmVyUGFydCBvZiB0aGVcbiAqIHNhbWUgYXRvbWljUmVhcnJhbmdlIHRvIGJhbGFuY2UgaXQgb3V0LiBGb3IgdGhpcyBjYXNlLCB0aGVcbiAqIGBbZnJvbVNlYXQsIHVuZGVmaW5lZCwgZnJvbUFtb3VudHNdYCBmb3JtIGlzIG1vcmUgY2xlYXJseSBleHByZXNzZWQgYXNcbiAqIGBmcm9tT25seShmcm9tU2VhdCwgZnJvbUFtb3VudHMpYC4gVW5saWtlIFRyYW5zZmVyUGFydCwgYm90aCBhcmd1bWVudHMgdG9cbiAqIGBmcm9tT25seWAgYXJlIG5vbi1vcHRpb25hbCwgYXMgb3RoZXJ3aXNlIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gZnJvbVNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gZnJvbUFtb3VudHNcbiAqIEByZXR1cm5zIHtUcmFuc2ZlclBhcnR9XG4gKi8kaOKAjV9vbmNlLmF0b21pY1JlYXJyYW5nZShhdG9taWNSZWFycmFuZ2UpO1xuY29uc3QgICAgICAgIGZyb21Pbmx5PShmcm9tU2VhdCxmcm9tQW1vdW50cyk9PlxuaGFyZGVuKFtmcm9tU2VhdCx1bmRlZmluZWQsZnJvbUFtb3VudHNdKTtcblxuLyoqXG4gKiBTb21ldGltZXMgYSBUcmFuc2ZlclBhcnQgaW4gYW4gYXRvbWljUmVhcnJhbmdlIG9ubHkgZXhwcmVzc2VzIHdoYXQgYW1vdW50c1xuICogc2hvdWxkIGJlIGdpdmVuIHRvIGEgc2VhdCwgbGVhdmluZyBpdCB0byBvdGhlciBUcmFuc2ZlclBhcnQgb2YgdGhlXG4gKiBzYW1lIGF0b21pY1JlYXJyYW5nZSB0byBiYWxhbmNlIGl0IG91dC4gRm9yIHRoaXMgY2FzZSwgdGhlXG4gKiBgW3VuZGVmaW5lZCwgdG9TZWF0LCB1bmRlZmluZWQsIHRvQW1vdW50c11gIGZvcm0gaXMgbW9yZSBjbGVhcmx5IGV4cHJlc3NlZCBhc1xuICogYHRvT25seSh0b1NlYXQsIHRvQW1vdW50cylgLiBVbmxpa2UgVHJhbnNmZXJQYXJ0LCBib3RoIGFyZ3VtZW50cyB0b1xuICogYHRvT25seWAgYXJlIG5vbi1vcHRpb25hbCwgYXMgb3RoZXJ3aXNlIGl0IGRvZXNuJ3QgbWFrZSBtdWNoIHNlbnNlLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gdG9TZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IHRvQW1vdW50c1xuICogQHJldHVybnMge1RyYW5zZmVyUGFydH1cbiAqLyRo4oCNX29uY2UuZnJvbU9ubHkoZnJvbU9ubHkpO1xuY29uc3QgICAgICAgIHRvT25seT0odG9TZWF0LHRvQW1vdW50cyk9PlxuaGFyZGVuKFt1bmRlZmluZWQsdG9TZWF0LHVuZGVmaW5lZCx0b0Ftb3VudHNdKTtcblxuLyoqXG4gKiBTcGVjaWFsIGNhc2Ugb2YgYXRvbWljUmVhcnJhbmdlIGZvciBhIHNpbmdsZSBvbmUtd2F5IHRyYW5zZmVyXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBbZnJvbVNlYXRdXG4gKiBAcGFyYW0ge1pDRlNlYXR9IFt0b1NlYXRdXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IFtmcm9tQW1vdW50c11cbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gW3RvQW1vdW50c11cbiAqLyRo4oCNX29uY2UudG9Pbmx5KHRvT25seSk7XG5jb25zdCAgICAgICAgYXRvbWljVHJhbnNmZXI9KFxuemNmLFxuZnJvbVNlYXQ9dW5kZWZpbmVkLFxudG9TZWF0PXVuZGVmaW5lZCxcbmZyb21BbW91bnRzPXVuZGVmaW5lZCxcbnRvQW1vdW50cz11bmRlZmluZWQpPT5cbnpjZi5hdG9taWNSZWFycmFuZ2UoaGFyZGVuKFtbZnJvbVNlYXQsdG9TZWF0LGZyb21BbW91bnRzLHRvQW1vdW50c11dKSk7JGjigI1fb25jZS5hdG9taWNUcmFuc2ZlcihhdG9taWNUcmFuc2Zlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVHJhbnNmZXJQYXJ0U2hhcGUiOlsiVHJhbnNmZXJQYXJ0U2hhcGUiXSwiYXRvbWljUmVhcnJhbmdlIjpbImF0b21pY1JlYXJyYW5nZSJdLCJmcm9tT25seSI6WyJmcm9tT25seSJdLCJ0b09ubHkiOlsidG9Pbmx5Il0sImF0b21pY1RyYW5zZmVyIjpbImF0b21pY1RyYW5zZmVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABCqcKciBAAAIgQAACgAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9oYW5kbGVXYXJuaW5nLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJoYW5kbGVQS2l0V2FybmluZyIsImhhbmRsZVBXYXJuaW5nIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbi8qKlxuICogRG9uJ3QgdHJpZ2dlciBOb2RlLmpzJ3MgVW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbldhcm5pbmcuXG4gKiBUaGlzIGRvZXMgbm90IHN1cHByZXNzIGFueSBlcnJvciBtZXNzYWdlcy5cbiAqXG4gKiBAcGFyYW0ge1Byb21pc2U8YW55Pn0gcHJvbWlzZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBoYW5kbGVQV2FybmluZz0ocHJvbWlzZSk9PntcbnByb21pc2UuY2F0Y2goKCk9PnsgfSk7XG4gfTtcblxuLyoqXG4gKiBEb24ndCB0cmlnZ2VyIE5vZGUuanMncyBVbmhhbmRsZWRQcm9taXNlUmVqZWN0aW9uV2FybmluZy5cbiAqIFRoaXMgZG9lcyBub3Qgc3VwcHJlc3MgYW55IGVycm9yIG1lc3NhZ2VzLlxuICpcbiAqIEBwYXJhbSB7UHJvbWlzZVJlY29yZDxhbnk+fSBwcm9taXNlS2l0XG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqLyRo4oCNX29uY2UuaGFuZGxlUFdhcm5pbmcoaGFuZGxlUFdhcm5pbmcpO1xuY29uc3QgICAgICAgIGhhbmRsZVBLaXRXYXJuaW5nPShwcm9taXNlS2l0KT0+e1xuaGFuZGxlUFdhcm5pbmcocHJvbWlzZUtpdC5wcm9taXNlKTtcbiB9OyRo4oCNX29uY2UuaGFuZGxlUEtpdFdhcm5pbmcoaGFuZGxlUEtpdFdhcm5pbmcpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImhhbmRsZVBXYXJuaW5nIjpbImhhbmRsZVBXYXJuaW5nIl0sImhhbmRsZVBLaXRXYXJuaW5nIjpbImhhbmRsZVBLaXRXYXJuaW5nIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKR9YzYzEQAAMxEAADAAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9pbnN0YW5jZVJlY29yZFN0b3JhZ2UuanN7ImltcG9ydHMiOlsiLi9jbGVhblByb3Bvc2FsLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbIm1ha2VJbnN0YW5jZVJlY29yZFN0b3JhZ2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcHJvdmlkZSxwcmVwYXJlRXhvQ2xhc3MsTSxhc3NlcnRLZXl3b3JkTmFtZSxCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSxJbnN0YWxsYXRpb25TaGFwZSxJbnN0YW5jZVJlY29yZFNoYXBlLElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSxJc3N1ZXJSZWNvcmRTaGFwZSxLZXl3b3JkU2hhcGUsVGVybXNTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NsZWFuUHJvcG9zYWwuanNcIiwgW1tcImFzc2VydEtleXdvcmROYW1lXCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXl3b3JkTmFtZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kS2V5d29yZFJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiSW5zdGFsbGF0aW9uU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEluc3RhbGxhdGlvblNoYXBlID0gJGjigI1fYSldXSxbXCJJbnN0YW5jZVJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChJbnN0YW5jZVJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiSXNzdWVyUmVjb3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlclJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJLZXl3b3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEtleXdvcmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiVGVybXNTaGFwZVwiLCBbJGjigI1fYSA9PiAoVGVybXNTaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIFRoZSBJbnN0YW5jZVJlY29yZCBzdG9yZXMgdGhlIGluc3RhbGxhdGlvbiwgY3VzdG9tVGVybXMsIGlzc3VlcnMsXG4gKiBhbmQgYnJhbmRzIGZvciBhIHBhcnRpY3VsYXIgWm9lIGNvbnRyYWN0IGluc3RhbmNlLiBUaGUgaW5zdGFsbGF0aW9uXG4gKiBhbmQgY3VzdG9tVGVybXMgYXJlIG5ldmVyIGNoYW5nZWQsIGJ1dCBuZXcgaXNzdWVycyAoYW5kIHRoZWlyXG4gKiBtYXRjaGluZyBicmFuZHMpIG1heSBiZSBhZGRlZCBieSB0aGUgY29udHJhY3QgY29kZS4gVGh1cywgYW5cbiAqIEluc3RhbmNlUmVjb3JkIG1heSBiZSBvdXRkYXRlZCBhdCBhbnkgcGFydGljdWxhciBwb2ludC4gVGhpcyBjbGFzc1xuICogbWFuYWdlcyB0aGUgY3JlYXRpb24gYW5kIHVwZGF0aW5nIG9mIGFuIEluc3RhbmNlUmVjb3JkIGFuZCBwcm92aWRlc1xuICogZnVuY3Rpb25zIGZvciBnZXR0aW5nIHRoZSBsYXRlc3QgZGF0YS5cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEByZXR1cm5zIHsoaXI6IEluc3RhbmNlUmVjb3JkKSA9PiBJbnN0YW5jZVN0YXRlfVxuICovXG5jb25zdCAgICAgICAgbWFrZUluc3RhbmNlUmVjb3JkU3RvcmFnZT0oYmFnZ2FnZSk9PntcbnByb3ZpZGUoYmFnZ2FnZSwnaW5zdGFuY2VSZWNvcmQnLCgpPT51bmRlZmluZWQpO1xuXG5jb25zdCBhc3NlcnRJbnN0YW50aWF0ZWQ9KGluc3RhbmNlUmVjb3JkKT0+e1xuaW5zdGFuY2VSZWNvcmQhPT0ndW5kZWZpbmVkJ3x8XG5GYWlsIGBpbnN0YW5jZVJlY29yZCBoYXMgbm90IGJlZW4gaW5zdGFudGlhdGVkYDtcbiB9O1xuXG5jb25zdCBJbnN0YW5jZVJlY29yZEk9TS5pbnRlcmZhY2UoJ0luc3RhbmNlUmVjb3JkJyx7XG5hZGRJc3N1ZXI6TS5jYWxsKEtleXdvcmRTaGFwZSxJc3N1ZXJSZWNvcmRTaGFwZSkucmV0dXJucygpLFxuZ2V0SW5zdGFuY2VSZWNvcmQ6TS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZVJlY29yZFNoYXBlKSxcbmdldFRlcm1zOk0uY2FsbCgpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKCkucmV0dXJucyhJbnN0YWxsYXRpb25TaGFwZSksXG5nZXRJc3N1ZXJzOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEJyYW5kczpNLmNhbGwoKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmFzc2VydFVuaXF1ZUtleXdvcmQ6TS5jYWxsKEtleXdvcmRTaGFwZSkucmV0dXJucygpfSk7XG5cblxuY29uc3QgbWFrZUluc3RhbmNlUmVjb3JkPXByZXBhcmVFeG9DbGFzcyhcbmJhZ2dhZ2UsXG4nSW5zdGFuY2VSZWNvcmQnLFxuSW5zdGFuY2VSZWNvcmRJLFxuKHJlY29yZCk9PmhhcmRlbih7aW5zdGFuY2VSZWNvcmQ6cmVjb3JkfSksXG57XG5hZGRJc3N1ZXIoa2V5d29yZCxpc3N1ZXJSZWNvcmQpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG4hb3duS2V5cyhpc3N1ZXJSZWNvcmQpLmluY2x1ZGVzKGtleXdvcmQpfHxcbkZhaWwgYGNvbmZsaWN0aW5nIGRlZmluaXRpb24gb2YgJHtxKGtleXdvcmQpfWA7XG5cbmFzc2VydEluc3RhbnRpYXRlZChzdGF0ZS5pbnN0YW5jZVJlY29yZCk7XG5jb25zdCBpbnN0YW5jZVJlY29yZD1zdGF0ZS5pbnN0YW5jZVJlY29yZDtcbmNvbnN0IG5leHRJbnN0YW5jZVJlY29yZD1oYXJkZW4oe1xuLi4uaW5zdGFuY2VSZWNvcmQsXG50ZXJtczp7XG4uLi5pbnN0YW5jZVJlY29yZC50ZXJtcyxcbmlzc3VlcnM6e1xuLi4uaW5zdGFuY2VSZWNvcmQudGVybXMuaXNzdWVycyxcbltrZXl3b3JkXTppc3N1ZXJSZWNvcmQuaXNzdWVyfSxcblxuYnJhbmRzOntcbi4uLmluc3RhbmNlUmVjb3JkLnRlcm1zLmJyYW5kcyxcbltrZXl3b3JkXTppc3N1ZXJSZWNvcmQuYnJhbmR9fX0pO1xuXG5cblxuc3RhdGUuaW5zdGFuY2VSZWNvcmQ9bmV4dEluc3RhbmNlUmVjb3JkO1xuIH0sXG5nZXRJbnN0YW5jZVJlY29yZCgpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5hc3NlcnRJbnN0YW50aWF0ZWQoc3RhdGUuaW5zdGFuY2VSZWNvcmQpO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlUmVjb3JkO1xuIH0sXG5nZXRUZXJtcygpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5hc3NlcnRJbnN0YW50aWF0ZWQoc3RhdGUuaW5zdGFuY2VSZWNvcmQpO1xucmV0dXJuIHN0YXRlLmluc3RhbmNlUmVjb3JkLnRlcm1zO1xuIH0sXG5nZXRJbnN0YWxsYXRpb24oKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuYXNzZXJ0SW5zdGFudGlhdGVkKHN0YXRlLmluc3RhbmNlUmVjb3JkKTtcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVJlY29yZC5pbnN0YWxsYXRpb247XG4gfSxcbmdldElzc3VlcnMoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuYXNzZXJ0SW5zdGFudGlhdGVkKHN0YXRlLmluc3RhbmNlUmVjb3JkKTtcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVJlY29yZC50ZXJtcy5pc3N1ZXJzO1xuIH0sXG5nZXRCcmFuZHMoKXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuYXNzZXJ0SW5zdGFudGlhdGVkKHN0YXRlLmluc3RhbmNlUmVjb3JkKTtcbnJldHVybiBzdGF0ZS5pbnN0YW5jZVJlY29yZC50ZXJtcy5icmFuZHM7XG4gfSxcbmFzc2VydFVuaXF1ZUtleXdvcmQoa2V5d29yZCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbmFzc2VydEluc3RhbnRpYXRlZChzdGF0ZS5pbnN0YW5jZVJlY29yZCk7XG5hc3NlcnRLZXl3b3JkTmFtZShrZXl3b3JkKTtcbiFvd25LZXlzKHN0YXRlLmluc3RhbmNlUmVjb3JkLnRlcm1zLmlzc3VlcnMpLmluY2x1ZGVzKGtleXdvcmQpfHxcbkZhaWwgYGtleXdvcmQgJHtxKGtleXdvcmQpfSBtdXN0IGJlIHVuaXF1ZWA7XG4gfX0pO1xuXG5cblxucmV0dXJuIG1ha2VJbnN0YW5jZVJlY29yZDtcbiB9OyRo4oCNX29uY2UubWFrZUluc3RhbmNlUmVjb3JkU3RvcmFnZShtYWtlSW5zdGFuY2VSZWNvcmRTdG9yYWdlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSW5zdGFuY2VSZWNvcmRTdG9yYWdlIjpbIm1ha2VJbnN0YW5jZVJlY29yZFN0b3JhZ2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbTE7WbknAAC5JwAAKQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2ludGVybmFsLXR5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VhdERhdGFcbiAqIEBwcm9wZXJ0eSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsXG4gKiBAcHJvcGVydHkge0FsbG9jYXRpb259IGluaXRpYWxBbGxvY2F0aW9uXG4gKiBAcHJvcGVydHkge1NlYXRIYW5kbGV9IHNlYXRIYW5kbGVcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBbb2ZmZXJBcmdzXVxuICovXG5cbi8qKlxuICogR2l2ZW4gYW4gYWxsb2NhdGlvbiwgd2l0aGRyYXcgcGF5bWVudHMgdG8gY3JlYXRlIGEgcGF5b3V0XG4gKlxuICogQGNhbGxiYWNrIFdpdGhkcmF3UGF5bWVudHNcbiAqIEBwYXJhbSB7QWxsb2NhdGlvbn0gYWxsb2NhdGlvblxuICogQHJldHVybnMge1BheW1lbnRQS2V5d29yZFJlY29yZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFdpdGhkcmF3RmFjZXRcbiAqIEBwcm9wZXJ0eSB7KGFsbG9jYXRpb246QWxsb2NhdGlvbikgPT4gUGF5bWVudFBLZXl3b3JkUmVjb3JkfSB3aXRoZHJhd1BheW1lbnRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbnN0YW5jZUFkbWluSGVscGVyXG4gKiBAcHJvcGVydHkgeyh6b2VTZWF0QWRtaW46IFpvZVNlYXRBZG1pbikgPT4gdm9pZH0gZXhpdFpvZVNlYXRBZG1pblxuICogQHByb3BlcnR5IHsoem9lU2VhdEFkbWluOiBab2VTZWF0QWRtaW4pID0+IGJvb2xlYW59IGhhc0V4aXRlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWm9lU2VhdEFkbWluS2l0XG4gKiBAcHJvcGVydHkge1VzZXJTZWF0fSB1c2VyU2VhdFxuICogQHByb3BlcnR5IHtab2VTZWF0QWRtaW59IHpvZVNlYXRBZG1pblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2Vab2VTZWF0QWRtaW5LaXRcbiAqIE1ha2UgdGhlIFpvZSBzZWF0IGFkbWluLCB1c2VyIHNlYXQgYW5kIGEgbm90aWZpZXJcbiAqIEBwYXJhbSB7QWxsb2NhdGlvbn0gaW5pdGlhbEFsbG9jYXRpb25cbiAqIEBwYXJhbSB7SW5zdGFuY2VBZG1pbkhlbHBlcn0gaW5zdGFuY2VBZG1pbkhlbHBlclxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWxcbiAqIEBwYXJhbSB7V2l0aGRyYXdGYWNldH0gd2l0aGRyYXdGYWNldFxuICogQHBhcmFtIHtFUmVmPEV4aXRPYmo+fSBleGl0T2JqXG4gKiBAcGFyYW0ge0VSZWY8dW5rbm93bj59IFtvZmZlclJlc3VsdF1cbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEByZXR1cm5zIHtab2VTZWF0QWRtaW5LaXR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWm9lU2VhdEFkbWluRXhpdFxuICogQHBhcmFtIHtDb21wbGV0aW9ufSBbY29tcGxldGlvbl1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWm9lU2VhdEFkbWluXG4gKiBAcHJvcGVydHkgeyhhbGxvY2F0aW9uOiBBbGxvY2F0aW9uKSA9PiB2b2lkfSByZXBsYWNlQWxsb2NhdGlvblxuICogQHByb3BlcnR5IHtab2VTZWF0QWRtaW5FeGl0fSBleGl0XG4gKiBAcHJvcGVydHkge1NodXRkb3duV2l0aEZhaWx1cmV9IGZhaWwgY2FsbGVkIHdpdGggdGhlIHJlYXNvblxuICogZm9yIGNhbGxpbmcgZmFpbCBvbiB0aGlzIHNlYXQsIHdoZXJlIHJlYXNvbiBpcyBub3JtYWxseSBhbiBpbnN0YW5jZW9mIEVycm9yLlxuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpYmVyPEFtb3VudEtleXdvcmRSZWNvcmQ+fSBnZXRFeGl0U3Vic2NyaWJlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIHsoYnJhbmQ6IEJyYW5kKSA9PiBBc3NldEtpbmR9IEdldEFzc2V0S2luZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gSGFuZGxlT2ZmZXJSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTx1bmtub3duPn0gb2ZmZXJSZXN1bHRQcm9taXNlXG4gKiBAcHJvcGVydHkge0V4aXRPYmp9IGV4aXRPYmpcbiAqL1xuXG4vKipcbiAqIFRoZSBzZWF0SGFuZGxlIG1heSBiZSBjcmVhdGVkIGluIGVpdGhlciB0aGUgWm9lIG9yIFpDRiB2YXQsXG4gKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgc2VhdCBjb21lcyBmcm9tIGEgbm9ybWFsIG9mZmVyIG9yIGFcbiAqIHJlcXVlc3QgYnkgdGhlIGNvbnRyYWN0IGZvciBhbiBcImVtcHR5XCIgc2VhdC5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJbnN0YW5jZUFkbWluXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGFzc2VydEFjY2VwdGluZ09mZmVyc1xuICogQHByb3BlcnR5IHsoaW52aXRhdGlvbkhhbmRsZTogSW52aXRhdGlvbkhhbmRsZSxcbiAqICAgICBpbml0aWFsQWxsb2NhdGlvbjogQWxsb2NhdGlvbixcbiAqICAgICBwcm9wb3NhbDogUHJvcG9zYWxSZWNvcmQsXG4gKiAgICAgb2ZmZXJBcmdzPzogb2JqZWN0LFxuICogKSA9PiBVc2VyU2VhdCB9IG1ha2VVc2VyU2VhdFxuICogQHByb3BlcnR5IHtNYWtlTm9Fc2Nyb3dTZWF0fSBtYWtlTm9Fc2Nyb3dTZWF0XG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHsoKSA9PiBvYmplY3R9IGdldFB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlcktleXdvcmRSZWNvcmR9IGdldElzc3VlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmRLZXl3b3JkUmVjb3JkfSBnZXRCcmFuZHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gb2JqZWN0fSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXX0gZ2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFsbGF0aW9ufSBnZXRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IENvbXBsZXRpb24pID0+IHZvaWR9IGV4aXRBbGxTZWF0c1xuICogQHByb3BlcnR5IHtTaHV0ZG93bldpdGhGYWlsdXJlfSBmYWlsQWxsU2VhdHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gc3RvcEFjY2VwdGluZ09mZmVyc1xuICogQHByb3BlcnR5IHsoc3RyaW5nOiBzdHJpbmcpID0+IGJvb2xlYW59IGlzQmxvY2tlZFxuICogQHByb3BlcnR5IHsoaGFuZGxlT2ZmZXJPYmo6IEhhbmRsZU9mZmVyT2JqLCBwdWJsaWNGYWNldDogdW5rbm93bikgPT4gdm9pZH0gaW5pdERlbGF5ZWRTdGF0ZVxuICogQHByb3BlcnR5IHsoc3RyaW5nczogc3RyaW5nW10pID0+IHZvaWR9IHNldE9mZmVyRmlsdGVyXG4gKi9cblxuLyoqXG4gKiBUaGUgc2VhdEhhbmRsZSBtYXkgYmUgY3JlYXRlZCBpbiBlaXRoZXIgdGhlIFpvZSBvciBaQ0YgdmF0LFxuICogZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHNlYXQgY29tZXMgZnJvbSBhIG5vcm1hbCBvZmZlciBvciBhXG4gKiByZXF1ZXN0IGJ5IHRoZSBjb250cmFjdCBmb3IgYW4gXCJlbXB0eVwiIHNlYXQuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSGFuZGxlT2ZmZXJPYmpcbiAqIEBwcm9wZXJ0eSB7KGludml0YXRpb25IYW5kbGU6IEludml0YXRpb25IYW5kbGUsXG4gKiAgICAgICAgICAgICBzZWF0RGF0YTogU2VhdERhdGEsXG4gKiAgICAgICAgICAgICkgPT4gSGFuZGxlT2ZmZXJSZXN1bHR9IGhhbmRsZU9mZmVyXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWm9lSW5zdGFuY2VBZG1pbk1ha2VJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge0ludml0YXRpb25IYW5kbGV9IGludml0YXRpb25IYW5kbGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbY3VzdG9tRGV0YWlsc11cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3Byb3Bvc2FsU2hhcGVdXG4gKiBAcmV0dXJucyB7SW52aXRhdGlvbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZUluc3RhbmNlQWRtaW5cbiAqIEBwcm9wZXJ0eSB7Wm9lSW5zdGFuY2VBZG1pbk1ha2VJbnZpdGF0aW9ufSBtYWtlSW52aXRhdGlvblxuICogQHByb3BlcnR5IHsoaXNzdWVyUDogRVJlZjxJc3N1ZXI+LFxuICogICAgICAgICAgICAga2V5d29yZDogS2V5d29yZFxuICogICAgICAgICAgICApID0+IFByb21pc2U8SXNzdWVyUmVjb3JkPn0gc2F2ZUlzc3VlclxuICogQHByb3BlcnR5IHtNYWtlWm9lTWludH0gbWFrZVpvZU1pbnRcbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJGZWVNaW50fSByZWdpc3RlckZlZU1pbnRcbiAqIEBwcm9wZXJ0eSB7TWFrZU5vRXNjcm93U2VhdH0gbWFrZU5vRXNjcm93U2VhdFxuICogQHByb3BlcnR5IHtSZXBsYWNlQWxsb2NhdGlvbnN9IHJlcGxhY2VBbGxvY2F0aW9uc1xuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogQ29tcGxldGlvbikgPT4gdm9pZH0gZXhpdEFsbFNlYXRzXG4gKiBAcHJvcGVydHkge1NodXRkb3duV2l0aEZhaWx1cmV9IGZhaWxBbGxTZWF0c1xuICogQHByb3BlcnR5IHsoc2VhdEhhbmRsZTogU2VhdEhhbmRsZSwgY29tcGxldGlvbjogQ29tcGxldGlvbikgPT4gdm9pZH0gZXhpdFNlYXRcbiAqIEBwcm9wZXJ0eSB7KHNlYXRIYW5kbGU6IFNlYXRIYW5kbGUsIHJlYXNvbjogRXJyb3IpID0+IHZvaWR9IGZhaWxTZWF0XG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IHN0b3BBY2NlcHRpbmdPZmZlcnNcbiAqIEBwcm9wZXJ0eSB7KHN0cmluZ3M6IEFycmF5PHN0cmluZz4pID0+IHZvaWR9IHNldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkgeygpID0+IEFycmF5PHN0cmluZz59IGdldE9mZmVyRmlsdGVyXG4gKiBAcHJvcGVydHkgeyhzZWF0SGFuZGxlOiBTZWF0SGFuZGxlKSA9PiBTdWJzY3JpYmVyPEFtb3VudEtleXdvcmRSZWNvcmQ+fSBnZXRFeGl0U3Vic2NyaWJlclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJlZ2lzdGVyRmVlTWludFxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkIC0gdGhlIGtleXdvcmQgdG8gdXNlIGZvciB0aGUgaXNzdWVyXG4gKiBAcGFyYW0ge0ZlZU1pbnRBY2Nlc3N9IGFsbGVnZWRGZWVNaW50QWNjZXNzIC0gYW4gb2JqZWN0IHRoYXRcbiAqIHB1cnBvcnRzIHRvIGJlIHRoZSBvYmplY3QgdGhhdCBhbGxvd3MgYWNjZXNzIHRvIHRoZSBmZWVNaW50XG4gKiBAcmV0dXJucyB7Wm9lTWludDwnbmF0Jz59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgV3JhcElzc3VlcktpdFdpdGhab2VNaW50XG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmQgLSB0aGUga2V5d29yZCB0byB1c2UgZm9yIHRoZSBpc3N1ZXJcbiAqIEBwYXJhbSB7SXNzdWVyS2l0fSBsb2NhbElzc3VlcktpdCAtIGFuIGlzc3VlciBraXQgdGhhdCBvcmlnaW5hdGVzXG4gKiB3aXRoaW4gWm9lXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZVpvZU1pbnRcbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZFxuICogQHBhcmFtIHtBc3NldEtpbmR9IFthc3NldEtpbmRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvXVxuICogQHBhcmFtIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtab2VNaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VOb0VzY3Jvd1NlYXRcbiAqIEBwYXJhbSB7QWxsb2NhdGlvbn0gaW5pdGlhbEFsbG9jYXRpb25cbiAqIEBwYXJhbSB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsXG4gKiBAcGFyYW0ge0V4aXRPYmp9IGV4aXRPYmpcbiAqIEBwYXJhbSB7U2VhdEhhbmRsZX0gc2VhdEhhbmRsZVxuICogQHJldHVybnMge1VzZXJTZWF0fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJlcGxhY2VBbGxvY2F0aW9uc1xuICogQHBhcmFtIHtTZWF0SGFuZGxlQWxsb2NhdGlvbltdfSBzZWF0SGFuZGxlQWxsb2NhdGlvbnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlYXRIYW5kbGVBbGxvY2F0aW9uXG4gKiBAcHJvcGVydHkge1NlYXRIYW5kbGV9IHNlYXRIYW5kbGVcbiAqIEBwcm9wZXJ0eSB7QWxsb2NhdGlvbn0gYWxsb2NhdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZU1pbnRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXNzdWVyUmVjb3JkPEs+fSBnZXRJc3N1ZXJSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7KHRvdGFsVG9NaW50OiBBbW91bnQ8Sz4pID0+IHZvaWR9IG1pbnRBbmRFc2Nyb3dcbiAqIEBwcm9wZXJ0eSB7KHRvdGFsVG9CdXJuOiBBbW91bnQ8Sz4pID0+IHZvaWR9IHdpdGhkcmF3QW5kQnVyblxuICogTm90ZSB0aGF0IHRoZSBidXJuaW5nIGlzIGFzeW5jaHJvbm91cywgYW5kIHNvIG1heSBub3QgaGF2ZSBoYXBwZW5lZCBieVxuICogdGhlIHRpbWUgd2l0aGRyYXdBbmRCdXJuIHJldHVybnMuIFdlIHJlbHkgb24gb3VyIG90aGVyIGJvb2trZWVwaW5nIHNvIHRoYXRcbiAqIHRoZXNlIGFzc2V0cyBhcmUgYXNzdW1lZCBidXJuZWQgZWxzZXdoZXJlLCBzbyBubyBvbmUgd2lsbCB0cnkgdG8gYWNjZXNzXG4gKiB0aGVtIGV2ZW4gYmVmb3JlIHRoZXkgYXJlIGFjdHVhbGx5IGJ1cm5lZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpDRlJvb3RcbiAqIEBwcm9wZXJ0eSB7U3RhcnRaY2Z9IHN0YXJ0WmNmXG4gKiBAcHJvcGVydHkge1Jlc3RhcnRDb250cmFjdH0gcmVzdGFydENvbnRyYWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFeGVjdXRlQ29udHJhY3RSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBjcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxJbnZpdGF0aW9uPn0gY3JlYXRvckludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBwdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHtIYW5kbGVPZmZlck9ian0gaGFuZGxlT2ZmZXJPYmpcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTdGFydFpjZlxuICogQHBhcmFtIHtFUmVmPFpvZUluc3RhbmNlQWRtaW4+fSB6b2VJbnN0YW5jZUFkbWluXG4gKiBAcGFyYW0ge0luc3RhbmNlUmVjb3JkfSBpbnN0YW5jZVJlY29yZEZyb21ab2VcbiAqIEBwYXJhbSB7SXNzdWVyUmVjb3Jkc30gaXNzdWVyU3RvcmFnZUZyb21ab2VcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJpdmF0ZUFyZ3NdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxFeGVjdXRlQ29udHJhY3RSZXN1bHQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFJlc3RhcnRDb250cmFjdFxuICogQHBhcmFtIHtvYmplY3R9IFtwcml2YXRlQXJnc11cbiAqIEByZXR1cm5zIHtQcm9taXNlPEV4ZWN1dGVVcGdyYWRlYWJsZUNvbnRyYWN0UmVzdWx0Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlRXhpdE9ialxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWxcbiAqIEBwYXJhbSB7WkNGU2VhdH0gem9lU2VhdEFkbWluXG4gKiBAcmV0dXJucyB7RXhpdE9ian1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEV4aXRPYmpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gZXhpdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0hhbmRsZTwnU2VhdCc+fSBTZWF0SGFuZGxlXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0QXNzZXRLaW5kQnlCcmFuZFxuICogR2V0IHRoZSBhc3NldEtpbmQgZm9yIGEgYnJhbmQga25vd24gYnkgWm9lXG4gKlxuICogVG8gYmUgZGVsZXRlZCB3aGVuIGJyYW5kcyBoYXZlIGEgcHJvcGVydHkgZm9yIGFzc2V0S2luZFxuICpcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcmV0dXJucyB7QXNzZXRLaW5kfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0FycmF5PElzc3VlclJlY29yZD59IElzc3VlclJlY29yZHNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlWkNGU2VhdFxuICogQHBhcmFtIHtTZWF0RGF0YX0gc2VhdERhdGFcbiAqIEByZXR1cm5zIHtaQ0ZTZWF0fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIERyb3BBbGxSZWZlcmVuY2VzXG4gKlxuICogRHJvcHMgYWxsIG9mIHRoZSByZWZlcmVuY2VzIGluIHRoZSBzZWF0LXJlbGF0ZWQgd2Vha1N0b3JlcyBieVxuICogZHJvcHBpbmcgdGhlIHN0b3Jlc1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaY2ZTZWF0TWFuYWdlclxuICogQHByb3BlcnR5IHtNYWtlWkNGU2VhdH0gbWFrZVpDRlNlYXRcbiAqIEBwcm9wZXJ0eSB7UmVhbGxvY2F0ZX0gcmVhbGxvY2F0ZVxuICogQHByb3BlcnR5IHtEcm9wQWxsUmVmZXJlbmNlc30gZHJvcEFsbFJlZmVyZW5jZXNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpjZk1pbnRSZWFsbG9jYXRvclxuICogQHByb3BlcnR5IHsoemNmU2VhdDogWkNGU2VhdCwgbmV3QWxsb2NhdGlvbjogQWxsb2NhdGlvbikgPT4gdm9pZH0gcmVhbGxvY2F0ZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIENyZWF0ZVNlYXRNYW5hZ2VyXG4gKlxuICogVGhlIFNlYXRNYW5hZ2VyIGhvbGRzIHRoZSBhY3RpdmUgemNmU2VhdHMgYW5kIGNhbiByZWFsbG9jYXRlIGFuZFxuICogbWFrZSBuZXcgemNmU2VhdHMuXG4gKlxuICogQHBhcmFtIHtFUmVmPFpvZUluc3RhbmNlQWRtaW4+fSB6b2VJbnN0YW5jZUFkbWluXG4gKiBAcGFyYW0ge0dldEFzc2V0S2luZEJ5QnJhbmR9IGdldEFzc2V0S2luZEJ5QnJhbmRcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gc2h1dGRvd25XaXRoRmFpbHVyZVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gemNmQmFnZ2FnZVxuICogQHJldHVybnMge3sgc2VhdE1hbmFnZXI6IFpjZlNlYXRNYW5hZ2VyLCB6Y2ZNaW50UmVhbGxvY2F0b3I6IFpjZk1pbnRSZWFsbG9jYXRvciB9fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEluc3RhbmNlU3RhdGVBZGRJc3N1ZXJcbiAqXG4gKiBBZGQgYW4gaXNzdWVyIGFuZCBpdHMga2V5d29yZCB0byB0aGUgaW5zdGFuY2VSZWNvcmQgZm9yIHRoZVxuICogY29udHJhY3QgaW5zdGFuY2VcbiAqXG4gKiBAcGFyYW0ge0tleXdvcmR9IGtleXdvcmRcbiAqIEBwYXJhbSB7SXNzdWVyUmVjb3JkfSBpc3N1ZXJSZWNvcmRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEluc3RhbmNlU3RhdGVHZXRUZXJtc1xuICogQHJldHVybnMge0FueVRlcm1zfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEluc3RhbmNlU3RhdGVHZXRJbnN0YWxsYXRpb25cbiAqIEByZXR1cm5zIHtJbnN0YWxsYXRpb259XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSW5zdGFuY2VSZWNvcmRHZXRJc3N1ZXJzXG4gKiBAcmV0dXJucyB7SXNzdWVyS2V5d29yZFJlY29yZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YW5jZVJlY29yZEdldEJyYW5kc1xuICogQHJldHVybnMge0JyYW5kS2V5d29yZFJlY29yZH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluc3RhbmNlU3RhdGVcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VTdGF0ZUFkZElzc3Vlcn0gYWRkSXNzdWVyXG4gKiBAcHJvcGVydHkge0dldEluc3RhbmNlUmVjb3JkfSBnZXRJbnN0YW5jZVJlY29yZFxuICogQHByb3BlcnR5IHtJbnN0YW5jZVN0YXRlR2V0VGVybXN9IGdldFRlcm1zXG4gKiBAcHJvcGVydHkge0luc3RhbmNlU3RhdGVHZXRJbnN0YWxsYXRpb259IGdldEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHtJbnN0YW5jZVJlY29yZEdldElzc3VlcnN9IGdldElzc3VlcnNcbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VSZWNvcmRHZXRCcmFuZHN9IGdldEJyYW5kc1xuICogQHByb3BlcnR5IHsoa2V5d29yZDogS2V5d29yZCkgPT4gdm9pZH0gYXNzZXJ0VW5pcXVlS2V5d29yZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluc3RhbmNlUmVjb3JkXG4gKiBAcmV0dXJucyB7SW5zdGFuY2VSZWNvcmR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVyU3RvcmFnZUdldElzc3VlclJlY29yZHNcbiAqIEBwYXJhbSB7SXNzdWVyW119IGlzc3VlcnNcbiAqIEByZXR1cm5zIHtJc3N1ZXJSZWNvcmRzfVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACaMz6smBQAAJgUAACcAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9pc3N1ZXJSZWNvcmQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJhc3NlcnRGdWxsSXNzdWVyUmVjb3JkIiwibWFrZUlzc3VlclJlY29yZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyoqXG4gKiBQdXQgdG9nZXRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGlzc3VlciBpbiBhIHN0YW5kYXJkIGZvcm1hdCB0aGF0XG4gKiBpcyBzeW5jaHJvbm91c2x5IGFjY2Vzc2libGUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcGFyYW0ge0Rpc3BsYXlJbmZvPEs+fSBkaXNwbGF5SW5mb1xuICogQHJldHVybnMge0lzc3VlclJlY29yZDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJSZWNvcmQ9KGJyYW5kLGlzc3VlcixkaXNwbGF5SW5mbyk9PlxuaGFyZGVuKHtcbmJyYW5kLFxuaXNzdWVyLFxuYXNzZXRLaW5kOmRpc3BsYXlJbmZvLmFzc2V0S2luZCxcbmRpc3BsYXlJbmZvfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0lzc3VlclJlY29yZH0gaXNzdWVyUmVjb3JkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBpc3N1ZXJSZWNvcmQgaXMgUmVxdWlyZWQ8SXNzdWVyUmVjb3JkPn1cbiAqLyRo4oCNX29uY2UubWFrZUlzc3VlclJlY29yZChtYWtlSXNzdWVyUmVjb3JkKTtcbmNvbnN0ICAgICAgICBhc3NlcnRGdWxsSXNzdWVyUmVjb3JkPShpc3N1ZXJSZWNvcmQpPT57XG5pZighaXNzdWVyUmVjb3JkLmRpc3BsYXlJbmZvKXtcbnRocm93IEZhaWwgYGZ1bGwgSXNzdWVyUmVjb3JkIHJlcXVpcmVzIGRpc3BsYXlJbmZvYDtcbiB9XG4gfTskaOKAjV9vbmNlLmFzc2VydEZ1bGxJc3N1ZXJSZWNvcmQoYXNzZXJ0RnVsbElzc3VlclJlY29yZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUlzc3VlclJlY29yZCI6WyJtYWtlSXNzdWVyUmVjb3JkIl0sImFzc2VydEZ1bGxJc3N1ZXJSZWNvcmQiOlsiYXNzZXJ0RnVsbElzc3VlclJlY29yZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAr1BXiSR0AAEkdAAAoAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvaXNzdWVyU3RvcmFnZS5qc3siaW1wb3J0cyI6WyIuL2NsZWFuUHJvcG9zYWwuanMiLCIuL2lzc3VlclJlY29yZC5qcyIsIi4vb2JqQXJyYXlDb252ZXJzaW9uLmpzIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJwcm92aWRlSXNzdWVyU3RvcmFnZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxFLGFycmF5VG9PYmosY2xlYW5LZXl3b3JkcyxtYWtlSXNzdWVyUmVjb3JkOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIi4vb2JqQXJyYXlDb252ZXJzaW9uLmpzXCIsIFtbXCJhcnJheVRvT2JqXCIsIFskaOKAjV9hID0+IChhcnJheVRvT2JqID0gJGjigI1fYSldXV1dLFtcIi4vY2xlYW5Qcm9wb3NhbC5qc1wiLCBbW1wiY2xlYW5LZXl3b3Jkc1wiLCBbJGjigI1fYSA9PiAoY2xlYW5LZXl3b3JkcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2lzc3VlclJlY29yZC5qc1wiLCBbW1wibWFrZUlzc3VlclJlY29yZFwiLCBbJGjigI1fYSA9PiAobWFrZUlzc3VlclJlY29yZCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCBTVE9SQUdFX0lOU1RBTlRJQVRFRF9LRVk9J0lzc3VlclN0b3JhZ2VJbnN0YW50aWF0ZWQnO1xuXG4vKipcbiAqIE1ha2UgdGhlIElzc3VlciBTdG9yYWdlLlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IHpjZkJhZ2dhZ2VcbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVJc3N1ZXJTdG9yYWdlPSh6Y2ZCYWdnYWdlKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8QnJhbmQsSXNzdWVyUmVjb3JkPn0gKi9cbmNvbnN0IGJyYW5kVG9Jc3N1ZXJSZWNvcmQ9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG56Y2ZCYWdnYWdlLFxuJ2JyYW5kVG9Jc3N1ZXJSZWNvcmQnKTtcblxuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8SXNzdWVyLElzc3VlclJlY29yZD59ICovXG5jb25zdCBpc3N1ZXJUb0lzc3VlclJlY29yZD1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShcbnpjZkJhZ2dhZ2UsXG4naXNzdWVyVG9Jc3N1ZXJSZWNvcmQnKTtcblxuXG5sZXQgaW5zdGFudGlhdGVkPXpjZkJhZ2dhZ2UuaGFzKFNUT1JBR0VfSU5TVEFOVElBVEVEX0tFWSk7XG5jb25zdCBhc3NlcnRJbnN0YW50aWF0ZWQ9KCk9Pntcbmluc3RhbnRpYXRlZHx8RmFpbCBgaXNzdWVyU3RvcmFnZSBoYXMgbm90IGJlZW4gaW5zdGFudGlhdGVkYDtcbiB9O1xuXG4vKipcbiAqIElmIHdlIGFscmVhZHkga25vdyB0aGUgZW50aXJlIGlzc3VlciByZWNvcmQsIHN1Y2ggYXMgZm9yIGFcbiAqIFpDRk1pbnQgaXNzdWVyLCBvciBmb3IgYW4gaXNzdWVyIHRoYXQgWm9lIGhhcyB0b2xkIHVzIGFib3V0LFxuICogc3RvcmUgdGhlIGlzc3VlclJlY29yZCBkaXJlY3RseS5cbiAqXG4gKiBBIG5vdGUgb24gY2hlY2tpbmcgdGhhdCB0aGUgaXNzdWVyIGFuZCBicmFuZCBtYXRjaDogQmVjYXVzZSBvZlxuICogaG93IHdlIHVzZSBgc3RvcmVJc3N1ZXJSZWNvcmRgLCB0aGUgaXNzdWVyIGFuZCBicmFuZCBpbiB0aGVcbiAqIGBpc3N1ZXJSZWNvcmRgIHBhcmFtZXRlciBhcmUgZ3VhcmFudGVlZCB0byBtYXRjaCwgYW5kIHdlIGRvIG5vdFxuICogbmVlZCB0byBkbyBhbm90aGVyIGFzeW5jaHJvbm91cyBjYWxsLlxuICpcbiAqIFdlIHVzZSBgc3RvcmVJc3N1ZXJSZWNvcmRgIGluIDQgY2FzZXM6IDEpIFpvZU1pbnQgcmVjb3JkcywgMilcbiAqIFpDRk1pbnQgcmVjb3JkcywgMykgd2l0aGluIGBzdG9yZUlzc3VlcmAsIGFuZCA0KSBzdG9yaW5nIGFuXG4gKiBpc3N1ZXIgcmVjb3JkIGluIFpDRiB0aGF0IHdlIG9idGFpbmVkIGZyb20gWm9lIHRoYXQgb3JpZ2luYWxseVxuICogd2VudCB0aHJvdWdoIGBzdG9yZUlzc3VlcmAuIEluIFpvZU1pbnRzIChyZXBhY2thZ2VkIGFzIFpDRk1pbnRzKSxcbiAqIHdlIGNyZWF0ZSB0aGUgaXNzdWVycyBhbmQgYnJhbmRzIG91cnNlbHZlcyB1c2luZyBFUlRQIGRpcmVjdGx5LFxuICogc28gd2Uga25vdyB0aGV5IGFyZSBub3QgbWFsaWNpb3VzIGFuZCB0aGF0IHRoZSBpc3N1ZXJzIGFuZCBicmFuZHNcbiAqIG1hdGNoLiBJbiB0aGUgbGFzdCB0d28gY2FzZXMsIHdlIGdvIHRocm91Z2ggdGhlXG4gKiBicmFuZC1pc3N1ZXItbWF0Y2ggY2hlY2sgaW4gYHN0b3JlSXNzdWVyYC5cbiAqXG4gKiBUaGUgcmVhc29uIHdoeSB3ZSBuZWVkIHRoZSBgaGFzYCBjaGVjayBiZWxvdyBpcyBmb3IgdGhlIDR0aCBjYXNlXG4gKiBhYm92ZSwgaW4gd2hpY2ggd2Ugc3RvcmUgYW4gaXNzdWVyIHJlY29yZCBpbiBaQ0YgdGhhdCB3ZSBvYnRhaW5lZFxuICogZnJvbSBab2UuIGBXZWFrTWFwU3RvcmUuaW5pdGAgZXJyb3JzIGlmIHRoZSBrZXkgaXMgYWxyZWFkeSBwcmVzZW50LFxuICogYW5kIGJlY2F1c2UgYW4gaXNzdWVyIGNhbiBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBzYW1lXG4gKiBjb250cmFjdCwgd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgYXJlbid0IHRyeWluZyB0byBgaW5pdGAgdHdpY2UuXG4gKiBJZiB0aGUgaXNzdWVyIGFuZCBpdHMgcmVjb3JkIGFyZSBhbHJlYWR5IHByZXNlbnQsIHdlIGRvIG5vdCBuZWVkXG4gKiB0byBhZGQgdGhlIGlzc3VlciBhZ2FpbiBpbiBaQ0YuXG4gKlxuICpcbiAqIEBwYXJhbSB7SXNzdWVyUmVjb3JkfSBpc3N1ZXJSZWNvcmRcbiAqIEByZXR1cm5zIHtJc3N1ZXJSZWNvcmR9XG4gKi9cbmNvbnN0IHN0b3JlSXNzdWVyUmVjb3JkPShpc3N1ZXJSZWNvcmQpPT57XG5hc3NlcnRJbnN0YW50aWF0ZWQoKTtcbmNvbnN0e2JyYW5kLGlzc3Vlcn09aXNzdWVyUmVjb3JkO1xuaWYoaXNzdWVyVG9Jc3N1ZXJSZWNvcmQuaGFzKGlzc3Vlcikpe1xucmV0dXJuIGlzc3VlclRvSXNzdWVyUmVjb3JkLmdldChpc3N1ZXIpO1xuIH1cblxuYnJhbmRUb0lzc3VlclJlY29yZC5pbml0KGJyYW5kLGlzc3VlclJlY29yZCk7XG5pc3N1ZXJUb0lzc3VlclJlY29yZC5pbml0KGlzc3Vlcixpc3N1ZXJSZWNvcmQpO1xucmV0dXJuIGlzc3VlclRvSXNzdWVyUmVjb3JkLmdldChpc3N1ZXIpO1xuIH07XG5cbmNvbnN0IGdldEJ5QnJhbmQ9KGJyYW5kKT0+e1xuYXNzZXJ0SW5zdGFudGlhdGVkKCk7XG5yZXR1cm4gYnJhbmRUb0lzc3VlclJlY29yZC5nZXQoYnJhbmQpO1xuIH07XG5cbi8qKlxuICogSWYgdGhlIGlzc3VlciBpcyBhbHJlYWR5IHN0b3JlZCwgcmV0dXJuIHRoZSBpc3N1ZXJSZWNvcmQuXG4gKiBPdGhlcndpc2UsIG1ha2UgYW5kIHNhdmUgdGhlIGlzc3VlclJlY29yZC5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8SXNzdWVyPn0gaXNzdWVyUFxuICogQHJldHVybnMge1Byb21pc2U8SXNzdWVyUmVjb3JkPn1cbiAqL1xuY29uc3Qgc3RvcmVJc3N1ZXI9YXN5bmMoaXNzdWVyUCk9PntcbmFzc2VydEluc3RhbnRpYXRlZCgpO1xuY29uc3QgYnJhbmRQPUUoaXNzdWVyUCkuZ2V0QnJhbmQoKTtcbmNvbnN0IGJyYW5kSXNzdWVyTWF0Y2hQPUUoYnJhbmRQKS5pc015SXNzdWVyKGlzc3VlclApO1xuY29uc3QgZGlzcGxheUluZm9QPUUoYnJhbmRQKS5nZXREaXNwbGF5SW5mbygpO1xuLyoqIEB0eXBlIHtbSXNzdWVyLEJyYW5kLGJvb2xlYW4sRGlzcGxheUluZm9dfSAqL1xuY29uc3RbaXNzdWVyLGJyYW5kLGJyYW5kSXNzdWVyTWF0Y2gsZGlzcGxheUluZm9dPWF3YWl0IFByb21pc2UuYWxsKFtcbmlzc3VlclAsXG5icmFuZFAsXG5icmFuZElzc3Vlck1hdGNoUCxcbmRpc3BsYXlJbmZvUF0pO1xuXG4vKiBBV0FJVCAvLy8vLyovXG5cbmlmKGlzc3VlclRvSXNzdWVyUmVjb3JkLmhhcyhpc3N1ZXIpKXtcbnJldHVybiBpc3N1ZXJUb0lzc3VlclJlY29yZC5nZXQoaXNzdWVyKTtcbiB9XG4vKiBBIG1hbGljaW91cyBpc3N1ZXIgbWF5IHVzZSBhbm90aGVyIGlzc3VlcidzIHZhbGlkIGJyYW5kLiovXG4vKiBUaGVyZWZvcmUsIHdlIG11c3QgY2hlY2sgdGhhdCB0aGUgYnJhbmQgcmVjb2duaXplcyB0aGUgaXNzdWVyKi9cbi8qIGFzIGl0cyBvd24gYW5kIHZpY2UgdmVyc2EuIEhvd2V2ZXIsIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGlzKi9cbi8qIG9uY2UgcGVyIGlzc3VlciBwZXIgWm9lU2VydmljZSwgYW5kIHdlIGRvIG5vdCBuZWVkIHRvIGNoZWNrKi9cbi8qIHRoaXMgZm9yIGlzc3VlcnMgdGhhdCB0aGUgWm9lU2VydmljZSBjcmVhdGVzLCBzdWNoIGFzIGlzc3VlcnMqL1xuLyogbWFkZSB3aXRoIFpDRk1pbnRzLiovXG5cbi8qIEluIHRoZSBjYXNlIG9mIGEgbWFsaWNpb3VzIGlzc3VlciB1c2luZyBhbm90aGVyIGlzc3VlcidzIGJyYW5kLCovXG4vKiB0aGUgbGluZSBiZWxvdyB3aWxsIHRocm93IGluIGFsbCBjYXNlcy4gSG93ZXZlciwgaW4gdGhlIGNhc2Ugb2YqL1xuLyogYSBtYWxpY2lvdXMgaXNzdWVyIHVzaW5nIGEgKm1hbGljaW91cyogYnJhbmQsIHRoZSBtYWxpY2lvdXMqL1xuLyogaXNzdWVyIGFuZCBicmFuZCBtYXkgY29vcmRpbmF0ZSB0byBjaGFuZ2UgdGhlaXIgYW5zd2Vycy4gQXQqL1xuLyogdGhpcyBwb2ludCwgWm9lIGhhcyBkb25lIGFsbCBpdCBjb3VsZC4gWm9lIGRvZXMgbm90IHByZXZlbnQgb3IqL1xuLyogaW50ZW5kIHRvIHByZXZlbnQgaXNzdWVyIG1pc2JlaGF2aW9yIGluIGdlbmVyYWwsIHNvIHRoZSB1c2VyKi9cbi8qICptdXN0KiByZWx5IG9uIHRoZSBnb29kIGJlaGF2aW9yIG9mIHRoZSBpc3N1ZXJzIHVzZWQgaW4gdGhlKi9cbi8qIHNtYXJ0IGNvbnRyYWN0cyB0aGV5IHVzZS4qL1xuYnJhbmRJc3N1ZXJNYXRjaHx8RmFpbCBgaXNzdWVyIHdhcyB1c2luZyBhIGJyYW5kIHdoaWNoIHdhcyBub3QgaXRzIG93bmA7XG5jb25zdCBpc3N1ZXJSZWNvcmQ9bWFrZUlzc3VlclJlY29yZChicmFuZCxpc3N1ZXIsZGlzcGxheUluZm8pO1xuc3RvcmVJc3N1ZXJSZWNvcmQoaXNzdWVyUmVjb3JkKTtcbnJldHVybiBnZXRCeUJyYW5kKGJyYW5kKTtcbiB9O1xuXG5jb25zdCBzdG9yZUlzc3VlcnM9KGlzc3VlcnMpPT57XG5hc3NlcnRJbnN0YW50aWF0ZWQoKTtcbnJldHVybiBQcm9taXNlLmFsbChpc3N1ZXJzLm1hcChzdG9yZUlzc3VlcikpO1xuIH07XG5cbi8qKiBAdHlwZSB7R2V0QXNzZXRLaW5kQnlCcmFuZH0gKi9cbmNvbnN0IGdldEFzc2V0S2luZEJ5QnJhbmQ9KGJyYW5kKT0+e1xuYXNzZXJ0SW5zdGFudGlhdGVkKCk7XG5yZXR1cm4gZ2V0QnlCcmFuZChicmFuZCkuYXNzZXRLaW5kO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7SXNzdWVyS2V5d29yZFJlY29yZH0gdW5jbGVhbklzc3VlcktleXdvcmRSZWNvcmRcbiAqIEByZXR1cm5zIHtQcm9taXNlPHsgaXNzdWVyczogSXNzdWVyS2V5d29yZFJlY29yZCxcbiAqICAgICAgICAgICAgICAgICAgICAgYnJhbmRzOiBCcmFuZEtleXdvcmRSZWNvcmQgfT59XG4gKi9cbmNvbnN0IHN0b3JlSXNzdWVyS2V5d29yZFJlY29yZD1hc3luYyh1bmNsZWFuSXNzdWVyS2V5d29yZFJlY29yZCk9PntcbmFzc2VydEluc3RhbnRpYXRlZCgpO1xuY29uc3Qga2V5d29yZHM9Y2xlYW5LZXl3b3Jkcyh1bmNsZWFuSXNzdWVyS2V5d29yZFJlY29yZCk7XG5jb25zdCBpc3N1ZXJQcz1rZXl3b3Jkcy5tYXAoXG4oa2V5d29yZCk9PnVuY2xlYW5Jc3N1ZXJLZXl3b3JkUmVjb3JkW2tleXdvcmRdKTtcblxuLyogVGhlIGlzc3VlcnMgbWF5IG5vdCBoYXZlIGJlZW4gc2VlbiBiZWZvcmUsIHNvIHdlIG11c3Qgd2FpdCBmb3IgdGhlKi9cbi8qIGlzc3VlciByZWNvcmRzIHRvIGJlIGF2YWlsYWJsZSBzeW5jaHJvbm91c2x5Ki9cbmNvbnN0IGlzc3VlclJlY29yZHM9YXdhaXQgc3RvcmVJc3N1ZXJzKGlzc3VlclBzKTtcbi8qIEFXQUlUIC8vLyovXG5cbmNvbnN0IGlzc3VlcnM9YXJyYXlUb09iaihcbmlzc3VlclJlY29yZHMubWFwKChyZWNvcmQpPT5yZWNvcmQuaXNzdWVyKSxcbmtleXdvcmRzKTtcblxuY29uc3QgYnJhbmRzPWFycmF5VG9PYmooXG5pc3N1ZXJSZWNvcmRzLm1hcCgocmVjb3JkKT0+cmVjb3JkLmJyYW5kKSxcbmtleXdvcmRzKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmlzc3VlcnMsXG5icmFuZHN9KTtcblxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEByZXR1cm5zIHtCcmFuZDxLPn1cbiAqL1xuY29uc3QgZ2V0QnJhbmRGb3JJc3N1ZXI9KGlzc3Vlcik9PntcbmFzc2VydEluc3RhbnRpYXRlZCgpO1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiBpc3N1ZXJUb0lzc3VlclJlY29yZC5nZXQoaXNzdWVyKS5icmFuZDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHJldHVybnMge0lzc3VlcjxLPn1cbiAqL1xuY29uc3QgZ2V0SXNzdWVyRm9yQnJhbmQ9KGJyYW5kKT0+e1xuYXNzZXJ0SW5zdGFudGlhdGVkKCk7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuIGJyYW5kVG9Jc3N1ZXJSZWNvcmQuZ2V0KGJyYW5kKS5pc3N1ZXI7XG4gfTtcblxuLyoqIEB0eXBlIHtJc3N1ZXJTdG9yYWdlR2V0SXNzdWVyUmVjb3Jkc30gKi9cbmNvbnN0IGdldElzc3VlclJlY29yZHM9KGlzc3VlcnMpPT57XG5hc3NlcnRJbnN0YW50aWF0ZWQoKTtcbnJldHVybiBpc3N1ZXJzLm1hcChpc3N1ZXJUb0lzc3VlclJlY29yZC5nZXQpO1xuIH07XG5cbmNvbnN0IGluc3RhbnRpYXRlPShpc3N1ZXJSZWNvcmRzPVtdKT0+e1xuaWYoIXpjZkJhZ2dhZ2UuaGFzKFNUT1JBR0VfSU5TVEFOVElBVEVEX0tFWSkpe1xuemNmQmFnZ2FnZS5pbml0KFNUT1JBR0VfSU5TVEFOVElBVEVEX0tFWSx0cnVlKTtcbmluc3RhbnRpYXRlZD10cnVlO1xuaXNzdWVyUmVjb3Jkcy5mb3JFYWNoKHN0b3JlSXNzdWVyUmVjb3JkKTtcbiB9XG4gfTtcblxucmV0dXJue1xuc3RvcmVJc3N1ZXJLZXl3b3JkUmVjb3JkLFxuc3RvcmVJc3N1ZXIsXG5zdG9yZUlzc3VlclJlY29yZCxcbmdldEFzc2V0S2luZEJ5QnJhbmQsXG5nZXRCcmFuZEZvcklzc3VlcixcbmdldElzc3VlckZvckJyYW5kLFxuZ2V0SXNzdWVyUmVjb3Jkcyxcbmluc3RhbnRpYXRlfTtcblxuIH07JGjigI1fb25jZS5wcm92aWRlSXNzdWVyU3RvcmFnZShwcm92aWRlSXNzdWVyU3RvcmFnZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJvdmlkZUlzc3VlclN0b3JhZ2UiOlsicHJvdmlkZUlzc3VlclN0b3JhZ2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoKQWNVYIAABWCAAAJQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL21ha2VIYW5kbGUuanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVIYW5kbGUiLCJtYWtlSGFuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxpbml0RW1wdHksbWFrZUV4byxwcmVwYXJlRXhvQ2xhc3MsSGFuZGxlSTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dLFtcIm1ha2VFeG9cIiwgWyRo4oCNX2EgPT4gKG1ha2VFeG8gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJIYW5kbGVJXCIsIFskaOKAjV9hID0+IChIYW5kbGVJID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBIXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7SH0gaGFuZGxlVHlwZVxuICogQHJldHVybnMge0ggZXh0ZW5kcyAnSW5zdGFuY2UnID8gKCkgPT4gSW5zdGFuY2UgOiAoKSA9PiBIYW5kbGU8SD59XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVEdXJhYmxlSGFuZGxlPShiYWdnYWdlLGhhbmRsZVR5cGUpPT57XG50eXBlb2YgaGFuZGxlVHlwZT09PSdzdHJpbmcnfHxGYWlsIGBoYW5kbGVUeXBlIG11c3QgYmUgYSBzdHJpbmdgO1xuY29uc3QgbWFrZUhhbmRsZT1wcmVwYXJlRXhvQ2xhc3MoXG5iYWdnYWdlLFxuIGAke2hhbmRsZVR5cGV9SGFuZGxlYCxcbkhhbmRsZUksXG5pbml0RW1wdHksXG57fSk7XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgQml0IGJ5IG91ciBvd24gb3BhcXVlIHR5cGVzLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7KCkgPT4gSGFuZGxlPEg+fSAqL21ha2VIYW5kbGUpO1xuIH07JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlSGFuZGxlKGRlZmluZUR1cmFibGVIYW5kbGUpO1xuaGFyZGVuKGRlZmluZUR1cmFibGVIYW5kbGUpO1xuXG4vKipcbiAqIENyZWF0ZSBhbiBvcGFxdWUgaGFuZGxlIG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSFxuICogQHBhcmFtIHtIfSBoYW5kbGVUeXBlIHRoZSBzdHJpbmcgbGl0ZXJhbCB0eXBlIG9mIHRoZSBoYW5kbGVcbiAqIEByZXR1cm5zIHtIIGV4dGVuZHMgJ0luc3RhbmNlJyA/IEluc3RhbmNlIDogSGFuZGxlPEg+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUhhbmRsZT0oaGFuZGxlVHlwZSk9PntcbnR5cGVvZiBoYW5kbGVUeXBlPT09J3N0cmluZyd8fEZhaWwgYGhhbmRsZVR5cGUgbXVzdCBiZSBhIHN0cmluZ2A7XG4vKiBSZXR1cm4gdGhlIGludGVyc2VjdGlvbiB0eXBlIChyZWFsbHkganVzdCBhbiBlbXB0eSBvYmplY3QpLiovXG4vKiBAdHMtZXhwZWN0LWVycm9yIEJpdCBieSBvdXIgb3duIG9wYXF1ZSB0eXBlcy4qL1xucmV0dXJuICgvKiogQHR5cGUge0hhbmRsZTxIPn0gKi9tYWtlRXhvKGAke2hhbmRsZVR5cGV9SGFuZGxlYCxIYW5kbGVJLHt9KSk7XG4gfTskaOKAjV9vbmNlLm1ha2VIYW5kbGUobWFrZUhhbmRsZSk7XG5oYXJkZW4obWFrZUhhbmRsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmaW5lRHVyYWJsZUhhbmRsZSI6WyJkZWZpbmVEdXJhYmxlSGFuZGxlIl0sIm1ha2VIYW5kbGUiOlsibWFrZUhhbmRsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADG+pcHogUAAKIFAAAtAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvb2JqQXJyYXlDb252ZXJzaW9uLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0Il0sImV4cG9ydHMiOlsiYXJyYXlUb09iaiIsImFzc2VydFN1YnNldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsRmFpbCxxOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV0sW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKipcbiAqIEB0eXBlZGVmIHtiaWdpbnR8Ym9vbGVhbnxudWxsfG51bWJlcnxzdHJpbmd8c3ltYm9sfHVuZGVmaW5lZH0gUHJpbWl0aXZlXG4gKiBAdHlwZWRlZiB7c3RyaW5nfG51bWJlcnxzeW1ib2x9IFByb3BlcnR5TmFtZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlOYW1lfSBVXG4gKiBAcGFyYW0ge1RbXX0gYXJyYXlcbiAqIEBwYXJhbSB7VVtdfSBrZXlzXG4gKi9cbmNvbnN0ICAgICAgICBhcnJheVRvT2JqPShhcnJheSxrZXlzKT0+e1xuYXJyYXkubGVuZ3RoPT09a2V5cy5sZW5ndGh8fEZhaWwgYGFycmF5IGFuZCBrZXlzIG11c3QgYmUgb2YgZXF1YWwgbGVuZ3RoYDtcbmNvbnN0IG9iaj1cbi8qKiBAdHlwZSB7UmVjb3JkPFUsIFQ+fSAqL1xue307XG5rZXlzLmZvckVhY2goKGtleSxpKT0+b2JqW2tleV09YXJyYXlbaV0pO1xucmV0dXJuIGhhcmRlbihvYmopO1xuIH07XG5cbi8qKlxuICogQXNzZXJ0IGFsbCB2YWx1ZXMgZnJvbSBgcGFydGAgYXBwZWFyIGluIGB3aG9sZWAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gd2hvbGVcbiAqIEBwYXJhbSB7c3RyaW5nW119IHBhcnRcbiAqLyRo4oCNX29uY2UuYXJyYXlUb09iaihhcnJheVRvT2JqKTtcbmNvbnN0ICAgICAgICBhc3NlcnRTdWJzZXQ9KHdob2xlLHBhcnQpPT57XG5wYXJ0LmZvckVhY2goKGtleSk9PntcbmFzc2VydC50eXBlb2Yoa2V5LCdzdHJpbmcnKTtcbndob2xlLmluY2x1ZGVzKGtleSl8fFxuRmFpbCBga2V5ICR7cShrZXkpfSB3YXMgbm90IG9uZSBvZiB0aGUgZXhwZWN0ZWQga2V5cyAke3Eod2hvbGUpfWA7XG4gfSk7XG4gfTskaOKAjV9vbmNlLmFzc2VydFN1YnNldChhc3NlcnRTdWJzZXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFycmF5VG9PYmoiOlsiYXJyYXlUb09iaiJdLCJhc3NlcnRTdWJzZXQiOlsiYXNzZXJ0U3Vic2V0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOWxCczbQwAA20MAACUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIl0sImV4cG9ydHMiOlsiQWRtaW5GYWNldEkiLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIiwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiLCJCdW5kbGVDYXBTaGFwZSIsIkJ1bmRsZVNoYXBlIiwiRXhpdE9iamVjdEkiLCJFeGl0T2JqZWN0U2hhcGUiLCJGZWVNaW50QWNjZXNzU2hhcGUiLCJGdWxsUHJvcG9zYWxTaGFwZSIsIkhhbmRsZUkiLCJIYW5kbGVPZmZlckkiLCJJbnN0YWxsYXRpb25TaGFwZSIsIkluc3RhbmNlQWRtaW5JIiwiSW5zdGFuY2VBZG1pblNoYXBlIiwiSW5zdGFuY2VIYW5kbGVTaGFwZSIsIkluc3RhbmNlUmVjb3JkU2hhcGUiLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCIsIkludml0YXRpb25FbGVtZW50U2hhcGUiLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUmVjb3JkU2hhcGUiLCJLZXl3b3JkU2hhcGUiLCJPZmZlckhhbmRsZXJJIiwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiLCJQcmljZVF1b3RlU2hhcGUiLCJQcm9wb3NhbFNoYXBlIiwiU2VhdERhdGFTaGFwZSIsIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIiwiU2VhdFNoYXBlIiwiVGVybXNTaGFwZSIsIlRpbWVyU2hhcGUiLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSIsIlpjZk1pbnRJIiwiWm9lTWludEkiLCJab2VNaW50U2hhcGUiLCJab2VTZXJ2aWNlSSIsIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCIsImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIiwiaXNPbkRlbWFuZEV4aXRSdWxlIiwiaXNXYWl2ZWRFeGl0UnVsZSIsIm1ha2VIYW5kbGVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRTaGFwZSxBc3NldEtpbmRTaGFwZSxCcmFuZFNoYXBlLERpc3BsYXlJbmZvU2hhcGUsSXNzdWVyS2l0U2hhcGUsSXNzdWVyU2hhcGUsUGF5bWVudFNoYXBlLFN1YnNjcmliZXJTaGFwZSxNLFRpbWVzdGFtcFNoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50U2hhcGVcIiwgWyRo4oCNX2EgPT4gKEFtb3VudFNoYXBlID0gJGjigI1fYSldXSxbXCJBc3NldEtpbmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kU2hhcGUgPSAkaOKAjV9hKV1dLFtcIkJyYW5kU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEJyYW5kU2hhcGUgPSAkaOKAjV9hKV1dLFtcIkRpc3BsYXlJbmZvU2hhcGVcIiwgWyRo4oCNX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaOKAjV9hKV1dLFtcIklzc3VlcktpdFNoYXBlXCIsIFskaOKAjV9hID0+IChJc3N1ZXJLaXRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiSXNzdWVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlclNoYXBlID0gJGjigI1fYSldXSxbXCJQYXltZW50U2hhcGVcIiwgWyRo4oCNX2EgPT4gKFBheW1lbnRTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoga2V5d29yZHMgaGF2ZSBhbiBpbml0aWFsIGNhcCovXG5jb25zdCAgICAgICAgS2V5d29yZFNoYXBlPU0uc3RyaW5nKCk7JGjigI1fb25jZS5LZXl3b3JkU2hhcGUoS2V5d29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIEludml0YXRpb25IYW5kbGVTaGFwZT1NLnJlbW90YWJsZSgnSW52aXRhdGlvbkhhbmRsZScpOyRo4oCNX29uY2UuSW52aXRhdGlvbkhhbmRsZVNoYXBlKEludml0YXRpb25IYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgSW52aXRhdGlvblNoYXBlPU0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uJyk7JGjigI1fb25jZS5JbnZpdGF0aW9uU2hhcGUoSW52aXRhdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnN0YW5jZUhhbmRsZVNoYXBlPU0ucmVtb3RhYmxlKCdJbnN0YW5jZUhhbmRsZScpOyRo4oCNX29uY2UuSW5zdGFuY2VIYW5kbGVTaGFwZShJbnN0YW5jZUhhbmRsZVNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnN0YWxsYXRpb25TaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJyk7JGjigI1fb25jZS5JbnN0YWxsYXRpb25TaGFwZShJbnN0YWxsYXRpb25TaGFwZSk7XG5jb25zdCAgICAgICAgU2VhdFNoYXBlPU0ucmVtb3RhYmxlKCdTZWF0Jyk7JGjigI1fb25jZS5TZWF0U2hhcGUoU2VhdFNoYXBlKTtcblxuY29uc3QgICAgICAgIEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKEtleXdvcmRTaGFwZSxBbW91bnRTaGFwZSk7JGjigI1fb25jZS5BbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKTtcbmNvbnN0ICAgICAgICBBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoXG5LZXl3b3JkU2hhcGUsXG5NLnBhdHRlcm4oKSk7JGjigI1fb25jZS5BbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihcbktleXdvcmRTaGFwZSxcbk0uZXJlZihQYXltZW50U2hhcGUpKTskaOKAjV9vbmNlLlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIElzc3VlcktleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKEtleXdvcmRTaGFwZSxJc3N1ZXJTaGFwZSk7JGjigI1fb25jZS5Jc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKTtcbmNvbnN0ICAgICAgICBJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoXG5LZXl3b3JkU2hhcGUsXG5NLmVyZWYoSXNzdWVyU2hhcGUpKTskaOKAjV9vbmNlLklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKEtleXdvcmRTaGFwZSxCcmFuZFNoYXBlKTskaOKAjV9vbmNlLkJyYW5kS2V5d29yZFJlY29yZFNoYXBlKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIElzc3VlclJlY29yZFNoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5icmFuZDpCcmFuZFNoYXBlLFxuaXNzdWVyOklzc3VlclNoYXBlLFxuYXNzZXRLaW5kOkFzc2V0S2luZFNoYXBlfSxcblxue2Rpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9KTskaOKAjV9vbmNlLklzc3VlclJlY29yZFNoYXBlKElzc3VlclJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVGVybXNTaGFwZT1oYXJkZW4oe1xuaXNzdWVyczpJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUsXG5icmFuZHM6QnJhbmRLZXl3b3JkUmVjb3JkU2hhcGV9KTskaOKAjV9vbmNlLlRlcm1zU2hhcGUoVGVybXNTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEluc3RhbmNlUmVjb3JkU2hhcGU9aGFyZGVuKHtcbmluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25TaGFwZSxcbmluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGUsXG50ZXJtczpNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpfSk7JGjigI1fb25jZS5JbnN0YW5jZVJlY29yZFNoYXBlKEluc3RhbmNlUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBIYW5kbGVJPU0uaW50ZXJmYWNlKCdIYW5kbGUnLHt9KTskaOKAjV9vbmNlLkhhbmRsZUkoSGFuZGxlSSk7XG5cbmNvbnN0ICAgICAgICBtYWtlSGFuZGxlU2hhcGU9KG5hbWUpPT5NLnJlbW90YWJsZSggYCR7bmFtZX1IYW5kbGVgKTskaOKAjV9vbmNlLm1ha2VIYW5kbGVTaGFwZShtYWtlSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIFRpbWVyU2hhcGU9bWFrZUhhbmRsZVNoYXBlKCd0aW1lcicpO1xuXG4vKipcbiAqIEFmdGVyIGRlZmF1bHRzIGFyZSBmaWxsZWQgaW5cbiAqXG4gKiBAc2VlIHtQcm9wb3NhbFJlY29yZH0gdHlwZVxuICovJGjigI1fb25jZS5UaW1lclNoYXBlKFRpbWVyU2hhcGUpO1xuY29uc3QgICAgICAgIEZ1bGxQcm9wb3NhbFNoYXBlPWhhcmRlbih7XG53YW50OkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUsXG5naXZlOkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbi8qIFRvIGFjY2VwdCBvbmx5IG9uZSwgd2UgY291bGQgdXNlIE0ub3IgcmF0aGVyIHRoYW4gTS5zcGxpdFJlY29yZCwqL1xuLyogYnV0IHRoZSBlcnJvciBtZXNzYWdlcyB3b3VsZCBoYXZlIGJlZW4gd29yc2UuIFJhdGhlciwqL1xuLyogY2xlYW5Qcm9wb3NhbCdzIGFzc2VydEV4aXQgY2hlY2tzIHRoYXQgdGhlcmUncyBleGFjdGx5IG9uZS4qL1xuZXhpdDpNLnNwbGl0UmVjb3JkKFxue30sXG57XG5vbkRlbWFuZDpudWxsLFxud2FpdmVkOm51bGwsXG5hZnRlckRlYWRsaW5lOntcbnRpbWVyOk0uZXJlZihUaW1lclNoYXBlKSxcbmRlYWRsaW5lOlRpbWVzdGFtcFNoYXBlfX0sXG5cblxue30pfSk7XG5cblxuLyoqIEBzZWUge1Byb3Bvc2FsfSB0eXBlICovJGjigI1fb25jZS5GdWxsUHJvcG9zYWxTaGFwZShGdWxsUHJvcG9zYWxTaGFwZSk7XG5jb25zdCAgICAgICAgUHJvcG9zYWxTaGFwZT1NLnNwbGl0UmVjb3JkKHt9LEZ1bGxQcm9wb3NhbFNoYXBlLHt9KTskaOKAjV9vbmNlLlByb3Bvc2FsU2hhcGUoUHJvcG9zYWxTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBpc09uRGVtYW5kRXhpdFJ1bGU9KGV4aXQpPT57XG5jb25zdFtleGl0S2V5XT1PYmplY3Qua2V5cyhleGl0KTtcbnJldHVybiBleGl0S2V5PT09J29uRGVtYW5kJztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIFdhaXZlZEV4aXRSdWxlfVxuICovJGjigI1fb25jZS5pc09uRGVtYW5kRXhpdFJ1bGUoaXNPbkRlbWFuZEV4aXRSdWxlKTtcbmNvbnN0ICAgICAgICBpc1dhaXZlZEV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmtleXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSd3YWl2ZWQnO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgQWZ0ZXJEZWFkbGluZUV4aXRSdWxlfVxuICovJGjigI1fb25jZS5pc1dhaXZlZEV4aXRSdWxlKGlzV2FpdmVkRXhpdFJ1bGUpO1xuY29uc3QgICAgICAgIGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmtleXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSdhZnRlckRlYWRsaW5lJztcbiB9OyRo4oCNX29uY2UuaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUoaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUpO1xuXG5jb25zdCAgICAgICAgSW52aXRhdGlvbkVsZW1lbnRTaGFwZT1NLnNwbGl0UmVjb3JkKHtcbmRlc2NyaXB0aW9uOk0uc3RyaW5nKCksXG5oYW5kbGU6SW52aXRhdGlvbkhhbmRsZVNoYXBlLFxuaW5zdGFuY2U6SW5zdGFuY2VIYW5kbGVTaGFwZSxcbmluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25TaGFwZX0pOyRo4oCNX29uY2UuSW52aXRhdGlvbkVsZW1lbnRTaGFwZShJbnZpdGF0aW9uRWxlbWVudFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgT2ZmZXJIYW5kbGVyST1NLmludGVyZmFjZSgnT2ZmZXJIYW5kbGVyJyx7XG5oYW5kbGU6TS5jYWxsKFNlYXRTaGFwZSkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnN0cmluZygpKX0pOyRo4oCNX29uY2UuT2ZmZXJIYW5kbGVySShPZmZlckhhbmRsZXJJKTtcblxuXG5jb25zdCAgICAgICAgU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGU9TS5hcnJheU9mKFxuaGFyZGVuKHtcbnNlYXRIYW5kbGU6U2VhdFNoYXBlLFxuYWxsb2NhdGlvbjpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGV9KSk7JGjigI1fb25jZS5TZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZShTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSk7XG5cblxuXG5jb25zdCAgICAgICAgWm9lTWludFNoYXBlPU0ucmVtb3RhYmxlKCdab2VNaW50Jyk7JGjigI1fb25jZS5ab2VNaW50U2hhcGUoWm9lTWludFNoYXBlKTtcbmNvbnN0ICAgICAgICBab2VNaW50ST1NLmludGVyZmFjZSgnWm9lTWludCcse1xuZ2V0SXNzdWVyUmVjb3JkOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyUmVjb3JkU2hhcGUpLFxubWludEFuZEVzY3JvdzpNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKSxcbndpdGhkcmF3QW5kQnVybjpNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKX0pOyRo4oCNX29uY2UuWm9lTWludEkoWm9lTWludEkpO1xuXG5cbmNvbnN0ICAgICAgICBaY2ZNaW50ST1NLmludGVyZmFjZSgnWmNmTWludCcse1xuZ2V0SXNzdWVyUmVjb3JkOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyUmVjb3JkU2hhcGUpLFxubWludEdhaW5zOk0uY2FsbChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpLlxub3B0aW9uYWwoTS5yZW1vdGFibGUoJ3pjZlNlYXQnKSkuXG5yZXR1cm5zKE0ucmVtb3RhYmxlKCd6Y2ZTZWF0JykpLFxuYnVybkxvc3NlczpNLmNhbGwoXG5BbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5NLnJlbW90YWJsZSgnemNmU2VhdCcpKS5cbnJldHVybnMoKX0pOyRo4oCNX29uY2UuWmNmTWludEkoWmNmTWludEkpO1xuXG5cbmNvbnN0ICAgICAgICBGZWVNaW50QWNjZXNzU2hhcGU9TS5yZW1vdGFibGUoJ0ZlZU1pbnRBY2Nlc3MnKTskaOKAjV9vbmNlLkZlZU1pbnRBY2Nlc3NTaGFwZShGZWVNaW50QWNjZXNzU2hhcGUpO1xuXG5jb25zdCAgICAgICAgRXhpdE9iamVjdEk9TS5pbnRlcmZhY2UoJ0V4aXQgT2JqZWN0Jyx7XG5leGl0Ok0uY2FsbCgpLnJldHVybnMoKX0pOyRo4oCNX29uY2UuRXhpdE9iamVjdEkoRXhpdE9iamVjdEkpO1xuXG5cbmNvbnN0ICAgICAgICBFeGl0T2JqZWN0U2hhcGU9TS5yZW1vdGFibGUoJ0V4aXRPYmonKTskaOKAjV9vbmNlLkV4aXRPYmplY3RTaGFwZShFeGl0T2JqZWN0U2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbmNlQWRtaW5TaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFuY2VBZG1pbicpOyRo4oCNX29uY2UuSW5zdGFuY2VBZG1pblNoYXBlKEluc3RhbmNlQWRtaW5TaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VBZG1pbkk9TS5pbnRlcmZhY2UoJ0luc3RhbmNlQWRtaW4nLHtcbm1ha2VJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnJlY29yZCgpLE0ucGF0dGVybigpKS5cbnJldHVybnMoSW52aXRhdGlvblNoYXBlKSxcbnNhdmVJc3N1ZXI6TS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSxLZXl3b3JkU2hhcGUpLnJldHVybnMoXG5Jc3N1ZXJSZWNvcmRTaGFwZSksXG5cbm1ha2VOb0VzY3Jvd1NlYXQ6TS5jYWxsKFxuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuUHJvcG9zYWxTaGFwZSxcbkV4aXRPYmplY3RTaGFwZSxcblNlYXRTaGFwZSkuXG5yZXR1cm5zKFNlYXRTaGFwZSksXG5leGl0QWxsU2VhdHM6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWxBbGxTZWF0czpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZXhpdFNlYXQ6TS5jYWxsKFNlYXRTaGFwZSxNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsU2VhdDpNLmNhbGwoU2VhdFNoYXBlLE0uYW55KCkpLnJldHVybnMoKSxcbm1ha2Vab2VNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUpLlxub3B0aW9uYWwoXG5Bc3NldEtpbmRTaGFwZSxcbkRpc3BsYXlJbmZvU2hhcGUsXG5NLnNwbGl0UmVjb3JkKGhhcmRlbih7fSksaGFyZGVuKHtlbGVtZW50U2hhcGU6TS5wYXR0ZXJuKCl9KSkpLlxuXG5yZXR1cm5zKE0ucmVtb3RhYmxlKCd6b2VNaW50JykpLFxucmVnaXN0ZXJGZWVNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUsRmVlTWludEFjY2Vzc1NoYXBlKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKSksXG5cbnJlcGxhY2VBbGxvY2F0aW9uczpNLmNhbGwoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpLnJldHVybnMoKSxcbnN0b3BBY2NlcHRpbmdPZmZlcnM6TS5jYWxsKCkucmV0dXJucygpLFxuc2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKE0uYXJyYXlPZihNLnN0cmluZygpKSkucmV0dXJucygpLFxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuZ2V0RXhpdFN1YnNjcmliZXI6TS5jYWxsKFNlYXRTaGFwZSkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuaXNCbG9ja2VkOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0uYm9vbGVhbigpKX0pOyRo4oCNX29uY2UuSW5zdGFuY2VBZG1pbkkoSW5zdGFuY2VBZG1pbkkpO1xuXG5cbmNvbnN0ICAgICAgICBJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdD1oYXJkZW4oe1xuaW5zdGFuY2VTdG9yYWdlTWFuYWdlcjpNLmludGVyZmFjZSgnSW5zdGFuY2VTdG9yYWdlTWFuYWdlcicse1xuZ2V0VGVybXM6TS5jYWxsKCkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbmdldElzc3VlcnM6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0QnJhbmRzOk0uY2FsbCgpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0SW5zdGFsbGF0aW9uOk0uY2FsbCgpLnJldHVybnMoSW5zdGFsbGF0aW9uU2hhcGUpLFxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuc2F2ZUlzc3VlcjpNLmNhbGwoSXNzdWVyU2hhcGUsS2V5d29yZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm1ha2Vab2VNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUpLlxub3B0aW9uYWwoXG5Bc3NldEtpbmRTaGFwZSxcbkRpc3BsYXlJbmZvU2hhcGUsXG5NLnNwbGl0UmVjb3JkKGhhcmRlbih7fSksaGFyZGVuKHtlbGVtZW50U2hhcGU6TS5wYXR0ZXJuKCl9KSkpLlxuXG5yZXR1cm5zKE0uZXJlZihab2VNaW50U2hhcGUpKSxcbnJlZ2lzdGVyRmVlTWludDpNLmNhbGwoS2V5d29yZFNoYXBlLEZlZU1pbnRBY2Nlc3NTaGFwZSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdmZWVNaW50JykpLFxuXG5nZXRJbnN0YW5jZVJlY29yZDpNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlUmVjb3JkU2hhcGUpLFxuZ2V0SXNzdWVyUmVjb3JkczpNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihJc3N1ZXJSZWNvcmRTaGFwZSkpLFxuZ2V0V2l0aGRyYXdGYWNldDpNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdXaXRoZHJhd0ZhY2V0JykpLFxuaW5pdEluc3RhbmNlQWRtaW46TS5jYWxsKFxuSW5zdGFuY2VIYW5kbGVTaGFwZSxcbk0ucmVtb3RhYmxlKCdpbnN0YW5jZUFkbWluJykpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG5kZWxldGVJbnN0YW5jZUFkbWluOk0uY2FsbChJbnN0YW5jZUFkbWluSSkucmV0dXJucygpLFxubWFrZUludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSxNLnN0cmluZygpKS5cbm9wdGlvbmFsKE0ucmVjb3JkKCksTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhQYXltZW50U2hhcGUpLFxuZ2V0Um9vdDpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0QWRtaW5Ob2RlOk0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpKX0pLFxuXG53aXRoZHJhd0ZhY2V0Ok0uaW50ZXJmYWNlKCdXaXRoZHJhd0ZhY2V0Jyx7XG53aXRoZHJhd1BheW1lbnRzOk0uY2FsbChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG5QYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSl9KSxcblxuXG5oZWxwZXJzOk0uaW50ZXJmYWNlKCdJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyIGhlbHBlcicse1xud3JhcElzc3VlcktpdFdpdGhab2VNaW50Ok0uY2FsbChcbktleXdvcmRTaGFwZSxcbklzc3VlcktpdFNoYXBlLFxuTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpKS5cbnJldHVybnMoWm9lTWludFNoYXBlKX0pfSk7JGjigI1fb25jZS5JbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdChJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5cblxuXG5jb25zdCAgICAgICAgQnVuZGxlQ2FwU2hhcGU9TS5yZW1vdGFibGUoJ2J1bmRsZUNhcCcpOyRo4oCNX29uY2UuQnVuZGxlQ2FwU2hhcGUoQnVuZGxlQ2FwU2hhcGUpO1xuY29uc3QgICAgICAgIEJ1bmRsZVNoYXBlPU0uYW5kKFxuTS5zcGxpdFJlY29yZCh7bW9kdWxlRm9ybWF0Ok0uYW55KCl9KSxcbk0ucmVjb3JkT2YoTS5zdHJpbmcoKSxNLnN0cmluZyh7c3RyaW5nTGVuZ3RoTGltaXQ6SW5maW5pdHl9KSkpOyRo4oCNX29uY2UuQnVuZGxlU2hhcGUoQnVuZGxlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZT1NLnNwbGl0UmVjb3JkKFxuaGFyZGVuKHtcbmluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25TaGFwZX0pLFxuXG5oYXJkZW4oe1xuYnVuZGxlOk0ucmVjb3JkT2YoTS5zdHJpbmcoKSxNLnN0cmluZyh7c3RyaW5nTGVuZ3RoTGltaXQ6SW5maW5pdHl9KSksXG5idW5kbGVDYXA6QnVuZGxlQ2FwU2hhcGUsXG5idW5kbGVJRDpNLnN0cmluZygpfSksXG5cbmhhcmRlbih7fSkpOyRo4oCNX29uY2UuVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUoVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBab2VTdG9yYWdlTWFuYWdlcklLaXQ9aGFyZGVuKHtcbnpvZVNlcnZpY2VEYXRhQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTZXJ2aWNlIGRhdGFBY2Nlc3MnLHtcbmdldFRlcm1zOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSkpLFxuZ2V0SXNzdWVyczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0QnJhbmRzOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEluc3RhbGxhdGlvbjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbk0uZXJlZihNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpKSxcblxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uOk0uY2FsbChJbnN0YWxsYXRpb25TaGFwZSkucmV0dXJucyhcbk0uZXJlZihNLnN0cmluZygpKSksXG5cbmluc3RhbGxCdW5kbGU6TS5jYWxsKE0ub3IoSW5zdGFuY2VIYW5kbGVTaGFwZSxCdW5kbGVTaGFwZSkpLnJldHVybnMoXG5NLnByb21pc2UoKSksXG5cbmluc3RhbGxCdW5kbGVJRDpNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5cbmdldFB1YmxpY0ZhY2V0Ok0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpKSksXG5cbmdldE9mZmVyRmlsdGVyOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5vcHQoTS5wYXR0ZXJuKCkpKX0pLFxuXG5cbm1ha2VPZmZlckFjY2VzczpNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBtYWtlT2ZmZXIgYWNjZXNzJyx7XG5nZXRBc3NldEtpbmRCeUJyYW5kOk0uY2FsbChCcmFuZFNoYXBlKS5yZXR1cm5zKEFzc2V0S2luZFNoYXBlKSxcbmdldEluc3RhbmNlQWRtaW46TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpKSxcblxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ub3B0KE0ucGF0dGVybigpKSksXG5cbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5kZXBvc2l0UGF5bWVudHM6TS5jYWxsKFByb3Bvc2FsU2hhcGUsUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG5NLnByb21pc2UoKSl9KSxcblxuXG5zdGFydEluc3RhbmNlQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIHN0YXJ0SW5zdGFuY2UgYWNjZXNzJyx7XG5tYWtlWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcjpNLmNhbGwoXG5NLmFueSgpLFxuSW5zdGFsbGF0aW9uU2hhcGUsXG5NLmFueSgpLFxuSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSxcbk0ub3IoSW5zdGFuY2VIYW5kbGVTaGFwZSxCdW5kbGVTaGFwZSksXG5NLm9yKEJ1bmRsZUNhcFNoYXBlLEJ1bmRsZVNoYXBlKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnVud3JhcEluc3RhbGxhdGlvbjpNLmNhbGxXaGVuKE0uZXJlZihJbnN0YWxsYXRpb25TaGFwZSkpLnJldHVybnMoXG5VbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSl9KSxcblxuXG5pbnZpdGF0aW9uSXNzdWVyQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIGludml0YXRpb25Jc3N1ZXInLHtcbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSl9KX0pOyRo4oCNX29uY2UuWm9lU3RvcmFnZU1hbmFnZXJJS2l0KFpvZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5cblxuXG5jb25zdCAgICAgICAgWm9lU2VydmljZUk9TS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UnLHtcbmluc3RhbGw6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuaW5zdGFsbEJ1bmRsZUlEOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnN0YXJ0SW5zdGFuY2U6TS5jYWxsKE0uZXJlZihJbnN0YWxsYXRpb25TaGFwZSkpLlxub3B0aW9uYWwoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSxNLmFueSgpLE0uYW55KCkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG5vZmZlcjpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLlxub3B0aW9uYWwoUHJvcG9zYWxTaGFwZSxQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSxNLmFueSgpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxuXG5nZXRPZmZlckZpbHRlcjpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5NLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0RmVlSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0QnJhbmRzOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbkJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcblxuZ2V0SXNzdWVyczpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5Jc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuXG5nZXRQdWJsaWNGYWNldDpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnUHVibGljRmFjZXQnKSksXG5cbmdldFRlcm1zOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhNLmFueSgpKSxcbmdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0uZXJlZihNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpKSxcblxuZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uOk0uY2FsbChJbnN0YWxsYXRpb25TaGFwZSkucmV0dXJucyhcbk0uZXJlZihNLnN0cmluZygpKSksXG5cblxuZ2V0SW5zdGFsbGF0aW9uOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRJbnN0YW5jZTpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0Q29uZmlndXJhdGlvbjpNLmNhbGwoKS5yZXR1cm5zKHtcbmZlZUlzc3VlckNvbmZpZzp7XG5uYW1lOk0uc3RyaW5nKCksXG5hc3NldEtpbmQ6J25hdCcsXG5kaXNwbGF5SW5mbzpEaXNwbGF5SW5mb1NoYXBlfX0pLFxuXG5cbmdldEludml0YXRpb25EZXRhaWxzOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLmFueSgpKSxcbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLm9wdChQcm9wb3NhbFNoYXBlKSl9KTskaOKAjV9vbmNlLlpvZVNlcnZpY2VJKFpvZVNlcnZpY2VJKTtcblxuXG5cbmNvbnN0ICAgICAgICBBZG1pbkZhY2V0ST1NLmludGVyZmFjZSgnWmNmQWRtaW5GYWNldCcse1xuZ2V0VmF0U2h1dGRvd25Qcm9taXNlOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxucmVzdGFydENvbnRyYWN0Ok0uY2FsbCgpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxudXBncmFkZUNvbnRyYWN0Ok0uY2FsbChNLnN0cmluZygpKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pOyRo4oCNX29uY2UuQWRtaW5GYWNldEkoQWRtaW5GYWNldEkpO1xuXG5cbmNvbnN0ICAgICAgICBTZWF0RGF0YVNoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5wcm9wb3NhbDpQcm9wb3NhbFNoYXBlLFxuaW5pdGlhbEFsbG9jYXRpb246QW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuc2VhdEhhbmRsZTpTZWF0U2hhcGV9LFxuXG57XG5vZmZlckFyZ3M6TS5hbnkoKX0pOyRo4oCNX29uY2UuU2VhdERhdGFTaGFwZShTZWF0RGF0YVNoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBIYW5kbGVPZmZlckk9TS5pbnRlcmZhY2UoJ0hhbmRsZU9mZmVyJyx7XG5oYW5kbGVPZmZlcjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLFNlYXREYXRhU2hhcGUpLnJldHVybnMoe1xub2ZmZXJSZXN1bHRQcm9taXNlOk0ucHJvbWlzZSgpLFxuZXhpdE9iajpFeGl0T2JqZWN0U2hhcGV9KX0pOyRo4oCNX29uY2UuSGFuZGxlT2ZmZXJJKEhhbmRsZU9mZmVySSk7XG5cblxuXG5jb25zdCAgICAgICAgUHJpY2VRdW90ZVNoYXBlPWhhcmRlbih7XG5xdW90ZUFtb3VudDpBbW91bnRTaGFwZSxcbnF1b3RlUGF5bWVudDpNLmVyZWYoUGF5bWVudFNoYXBlKX0pOyRo4oCNX29uY2UuUHJpY2VRdW90ZVNoYXBlKFByaWNlUXVvdGVTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiS2V5d29yZFNoYXBlIjpbIktleXdvcmRTaGFwZSJdLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiOlsiSW52aXRhdGlvbkhhbmRsZVNoYXBlIl0sIkludml0YXRpb25TaGFwZSI6WyJJbnZpdGF0aW9uU2hhcGUiXSwiSW5zdGFuY2VIYW5kbGVTaGFwZSI6WyJJbnN0YW5jZUhhbmRsZVNoYXBlIl0sIkluc3RhbGxhdGlvblNoYXBlIjpbIkluc3RhbGxhdGlvblNoYXBlIl0sIlNlYXRTaGFwZSI6WyJTZWF0U2hhcGUiXSwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiXSwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIjpbIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIjpbIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiXSwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyUmVjb3JkU2hhcGUiOlsiSXNzdWVyUmVjb3JkU2hhcGUiXSwiVGVybXNTaGFwZSI6WyJUZXJtc1NoYXBlIl0sIkluc3RhbmNlUmVjb3JkU2hhcGUiOlsiSW5zdGFuY2VSZWNvcmRTaGFwZSJdLCJIYW5kbGVJIjpbIkhhbmRsZUkiXSwibWFrZUhhbmRsZVNoYXBlIjpbIm1ha2VIYW5kbGVTaGFwZSJdLCJUaW1lclNoYXBlIjpbIlRpbWVyU2hhcGUiXSwiRnVsbFByb3Bvc2FsU2hhcGUiOlsiRnVsbFByb3Bvc2FsU2hhcGUiXSwiUHJvcG9zYWxTaGFwZSI6WyJQcm9wb3NhbFNoYXBlIl0sImlzT25EZW1hbmRFeGl0UnVsZSI6WyJpc09uRGVtYW5kRXhpdFJ1bGUiXSwiaXNXYWl2ZWRFeGl0UnVsZSI6WyJpc1dhaXZlZEV4aXRSdWxlIl0sImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIjpbImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIl0sIkludml0YXRpb25FbGVtZW50U2hhcGUiOlsiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSJdLCJPZmZlckhhbmRsZXJJIjpbIk9mZmVySGFuZGxlckkiXSwiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiOlsiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiXSwiWm9lTWludFNoYXBlIjpbIlpvZU1pbnRTaGFwZSJdLCJab2VNaW50SSI6WyJab2VNaW50SSJdLCJaY2ZNaW50SSI6WyJaY2ZNaW50SSJdLCJGZWVNaW50QWNjZXNzU2hhcGUiOlsiRmVlTWludEFjY2Vzc1NoYXBlIl0sIkV4aXRPYmplY3RJIjpbIkV4aXRPYmplY3RJIl0sIkV4aXRPYmplY3RTaGFwZSI6WyJFeGl0T2JqZWN0U2hhcGUiXSwiSW5zdGFuY2VBZG1pblNoYXBlIjpbIkluc3RhbmNlQWRtaW5TaGFwZSJdLCJJbnN0YW5jZUFkbWluSSI6WyJJbnN0YW5jZUFkbWluSSJdLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJCdW5kbGVDYXBTaGFwZSI6WyJCdW5kbGVDYXBTaGFwZSJdLCJCdW5kbGVTaGFwZSI6WyJCdW5kbGVTaGFwZSJdLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSI6WyJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSJdLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiWm9lU3RvcmFnZU1hbmFnZXJJS2l0Il0sIlpvZVNlcnZpY2VJIjpbIlpvZVNlcnZpY2VJIl0sIkFkbWluRmFjZXRJIjpbIkFkbWluRmFjZXRJIl0sIlNlYXREYXRhU2hhcGUiOlsiU2VhdERhdGFTaGFwZSJdLCJIYW5kbGVPZmZlckkiOlsiSGFuZGxlT2ZmZXJJIl0sIlByaWNlUXVvdGVTaGFwZSI6WyJQcmljZVF1b3RlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAt8K8e+IGAADiBgAAHwAAAEBhZ29yaWMvem9uZS12MC4yLjIvc3JjL2hlYXAuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIk0iLCJoZWFwWm9uZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlRXhvLGRlZmluZUV4b0NsYXNzLGRlZmluZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJNYXBTdG9yZSxtYWtlU2NhbGFyU2V0U3RvcmUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxtYWtlU2NhbGFyV2Vha1NldFN0b3JlLE0sRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VFeG9cIiwgWyRo4oCNX2EgPT4gKG1ha2VFeG8gPSAkaOKAjV9hKV1dLFtcImRlZmluZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChkZWZpbmVFeG9DbGFzcyA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyU2V0U3RvcmUgPSAkaOKAjV9hKV1dLFtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUgPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wiTVwiXV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHR5cGUge1hpbXBvcnQoJy4nKS5TdG9yZXN9XG4gKi9cbmNvbnN0IGhlYXBTdG9yZXM9RmFyKCdoZWFwU3RvcmVzJyx7XG5kZXRhY2hlZDooKT0+aGVhcFN0b3JlcyxcbmlzU3RvcmFibGU6KF9zcGVjaW1lbik9PnRydWUsXG5cbnNldFN0b3JlOm1ha2VTY2FsYXJTZXRTdG9yZSxcbm1hcFN0b3JlOm1ha2VTY2FsYXJNYXBTdG9yZSxcbndlYWtNYXBTdG9yZTptYWtlU2NhbGFyV2Vha01hcFN0b3JlLFxud2Vha1NldFN0b3JlOm1ha2VTY2FsYXJXZWFrU2V0U3RvcmV9KTtcblxuXG4vKipcbiAqIEEgaGVhcCAoaW4tbWVtb3J5KSB6b25lIHRoYXQgdXNlcyB0aGUgZGVmYXVsdCBleG8gYW5kIHN0b3JlIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLicpLlpvbmV9XG4gKi9cbmNvbnN0ICAgICAgICBoZWFwWm9uZT1GYXIoJ2hlYXBab25lJyx7XG5leG9DbGFzczpkZWZpbmVFeG9DbGFzcyxcbmV4b0NsYXNzS2l0OmRlZmluZUV4b0NsYXNzS2l0LFxuZXhvOm1ha2VFeG8sXG5zdWJab25lOihfbGFiZWwsX29wdGlvbnMpPT5oZWFwWm9uZSxcbi4uLmhlYXBTdG9yZXN9KTskaOKAjV9vbmNlLmhlYXBab25lKGhlYXBab25lKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJNIjpbIk0iLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoZWFwWm9uZSI6WyJoZWFwWm9uZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADY9BkwjwkAAI8JAAAgAAAAQGFnb3JpYy96b25lLXYwLjIuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9oZWFwLmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vaGVhcC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlRXhvLGRlZmluZUV4b0NsYXNzLGRlZmluZUV4b0NsYXNzS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VFeG9cIiwgWyRo4oCNX2EgPT4gKG1ha2VFeG8gPSAkaOKAjV9hKV1dLFtcImRlZmluZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChkZWZpbmVFeG9DbGFzcyA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vaGVhcC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG4vKiBSZWZlcmVuY2VzIHRvIGFsbG93IHRoZSBiZWxvdyB0eXBlb2ZzIHRvIHN1Y2NlZWQuKi9cbm1ha2VFeG87XG5kZWZpbmVFeG9DbGFzcztcbmRlZmluZUV4b0NsYXNzS2l0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFeG9ab25lICYgU3RvcmVzfSBab25lIEEgYmFnIG9mIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGRlZmVuc2libGUgb2JqZWN0cyBhbmRcbiAqIGNvbGxlY3Rpb25zIHdpdGggdGhlIHNhbWUgYWxsb2NhdGlvbiBzZW1hbnRpY3MgKGVwaGVtZXJhbCwgcGVyc2lzdGVudCwgZXRjKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRXhvWm9uZVxuICogQHByb3BlcnR5IHt0eXBlb2YgbWFrZUV4b30gZXhvIGNyZWF0ZSBhIHNpbmdsZXRvbiBleG8tb2JqZWN0IGluc3RhbmNlIGJvdW5kIHRvIHRoaXMgem9uZVxuICogQHByb3BlcnR5IHt0eXBlb2YgZGVmaW5lRXhvQ2xhc3N9IGV4b0NsYXNzIGNyZWF0ZSBhIG1ha2VyIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGV4by1vYmplY3RzIGJvdW5kIHRvIHRoaXMgem9uZVxuICogQHByb3BlcnR5IHt0eXBlb2YgZGVmaW5lRXhvQ2xhc3NLaXR9IGV4b0NsYXNzS2l0IGNyZWF0ZSBhIFwia2l0XCIgbWFrZXIgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSByZWNvcmQgb2YgZXhvLW9iamVjdHMgc2hhcmluZyB0aGUgc2FtZSBzdGF0ZVxuICogQHByb3BlcnR5IHsobGFiZWw6IHN0cmluZywgb3B0aW9ucz86IFN0b3JlT3B0aW9ucykgPT4gWm9uZX0gc3ViWm9uZSBjcmVhdGUgYSBuZXcgWm9uZSB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdW50cnVzdGVkIGNvbnN1bWVycyB3aXRob3V0IGV4cG9zaW5nIHRoZSBzdG9yYWdlIG9mIHRoZSBwYXJlbnQgem9uZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVzXG4gKiBAcHJvcGVydHkgeygpID0+IFN0b3Jlc30gZGV0YWNoZWQgb2J0YWluIHN0b3JlIHByb3ZpZGVycyB3aGljaCBhcmUgZGV0YWNoZWQgKHRoZSBzdG9yZXMgYXJlIGFub255bW91cyByYXRoZXIgdGhhbiBib3VuZCB0byBgbGFiZWxgIGluIHRoZSB6b25lKVxuICogQHByb3BlcnR5IHsoc3BlY2ltZW46IHVua25vd24pID0+IGJvb2xlYW59IGlzU3RvcmFibGUgcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpbWVuIGNhbiBiZSBzdG9yZWQgaW4gdGhlIHpvbmUsIHdoZXRoZXIgYXMgZXhvLW9iamVjdCBzdGF0ZSBvciBpbiBhIHN0b3JlXG4gKiBAcHJvcGVydHkgezxLLFY+KGxhYmVsOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yZU9wdGlvbnMpID0+IE1hcFN0b3JlPEssIFY+fSBtYXBTdG9yZSBwcm92aWRlIGEgTWFwLWxpa2Ugc3RvcmUgbmFtZWQgYGxhYmVsYCBpbiB0aGUgem9uZVxuICogQHByb3BlcnR5IHs8Sz4obGFiZWw6IHN0cmluZywgb3B0aW9ucz86IFN0b3JlT3B0aW9ucykgPT4gU2V0U3RvcmU8Sz59IHNldFN0b3JlIHByb3ZpZGUgYSBTZXQtbGlrZSBzdG9yZSBuYW1lZCBgbGFiZWxgIGluIHRoZSB6b25lXG4gKiBAcHJvcGVydHkgezxLLFY+KFxuICogICBsYWJlbDogc3RyaW5nLCBvcHRpb25zPzogU3RvcmVPcHRpb25zKSA9PiBXZWFrTWFwU3RvcmU8SywgVj5cbiAqIH0gd2Vha01hcFN0b3JlIHByb3ZpZGUgYSBXZWFrTWFwLWxpa2Ugc3RvcmUgbmFtZWQgYGxhYmVsYCBpbiB0aGUgem9uZVxuICogQHByb3BlcnR5IHs8Sz4oXG4gKiAgIGxhYmVsOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yZU9wdGlvbnMpID0+IFdlYWtTZXRTdG9yZTxLPlxuICogfSB3ZWFrU2V0U3RvcmUgcHJvdmlkZSBhIFdlYWtTZXQtbGlrZSBzdG9yZSBuYW1lZCBgbGFiZWxgIGluIHRoZSB6b25lXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA954aPOsCAADrAgAAHAAAAEBlbmRvL2Jhc2U2NC12MC4yLjMxL2F0b2IuanN7ImltcG9ydHMiOlsiLi9kZWNvZGUuanMiXSwiZXhwb3J0cyI6WyJhdG9iIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGRlY29kZUJhc2U2NDskaOKAjV9pbXBvcnRzKFtbXCIuL2RlY29kZS5qc1wiLCBbW1wiZGVjb2RlQmFzZTY0XCIsIFskaOKAjV9hID0+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+XG4oLi4uYXJncyk9PntcbmhpZGRlblByaW9yRXJyb3I9c2VuZGluZ0Vycm9yO1xuaGlkZGVuQ3VycmVudFR1cm4rPTE7XG5oaWRkZW5DdXJyZW50RXZlbnQ9MDtcbnRyeXtcbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbmlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcbmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLGVycik7XG4gfVxudGhyb3cgZXJyO1xuIH1cbi8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG5jb25zdCBkZXRhaWxzTm90ZT1YIGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xucmV0dXJuIHJlc3VsdDtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9bmV3IEVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuIGZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSk7XG4gfTskaOKAjV9vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADpSrU0cAgAAHAIAABkAAABAZW5kby9leG8tdjAuMi4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2V4by1tYWtlcnMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvZXhvLW1ha2Vycy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9leG8tbWFrZXJzLmpzIjpbWyJpbml0RW1wdHkiLCJpbml0RW1wdHkiXSxbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiXSxbImRlZmluZUV4b0NsYXNzS2l0IiwiZGVmaW5lRXhvQ2xhc3NLaXQiXSxbIm1ha2VFeG8iLCJtYWtlRXhvIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADGt+tWYxgAAGMYAAAiAAAAQGVuZG8vZXhvLXYwLjIuMi9zcmMvZXhvLW1ha2Vycy5qc3siaW1wb3J0cyI6WyIuL2V4by10b29scy5qcyIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzc0tpdCIsImluaXRFbXB0eSIsIm1ha2VFeG8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgb2JqZWN0TWFwLGRlZmVuZFByb3RvdHlwZSxkZWZlbmRQcm90b3R5cGVLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXV1dLFtcIi4vZXhvLXRvb2xzLmpzXCIsIFtbXCJkZWZlbmRQcm90b3R5cGVcIiwgWyRo4oCNX2EgPT4gKGRlZmVuZFByb3RvdHlwZSA9ICRo4oCNX2EpXV0sW1wiZGVmZW5kUHJvdG90eXBlS2l0XCIsIFskaOKAjV9hID0+IChkZWZlbmRQcm90b3R5cGVLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtjcmVhdGUsc2VhbCxmcmVlemUsZGVmaW5lUHJvcGVydHl9PU9iamVjdDtcblxuLyogVE9ETyBVc2UgZW52aXJvbm1lbnQtb3B0aW9ucy5qcyBjdXJyZW50bHkgaW4gc2VzL3NyYyBhZnRlciBmYWN0b3JpbmcgaXQgb3V0Ki9cbi8qIHRvIGEgbmV3IHBhY2thZ2UuKi9cbmNvbnN0IGVudj0oZ2xvYmFsVGhpcy5wcm9jZXNzfHx7fSkuZW52fHx7fTtcblxuLyogVHVybiBvbiB0byBnaXZlIGVhY2ggZXhvIGluc3RhbmNlIGl0cyBvd24gdG9TdHJpbmdUYWcgdmFsdWUuKi9cbmNvbnN0IExBQkVMX0lOU1RBTkNFUz0oZW52LkRFQlVHfHwnJykuXG5zcGxpdCgnLCcpLlxuaW5jbHVkZXMoJ2xhYmVsLWluc3RhbmNlcycpO1xuXG5jb25zdCBtYWtlU2VsZj0ocHJvdG8saW5zdGFuY2VDb3VudCk9PntcbmNvbnN0IHNlbGY9Y3JlYXRlKHByb3RvKTtcbmlmKExBQkVMX0lOU1RBTkNFUyl7XG5kZWZpbmVQcm9wZXJ0eShzZWxmLFN5bWJvbC50b1N0cmluZ1RhZyx7XG52YWx1ZTogYCR7cHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXX0jJHtpbnN0YW5jZUNvdW50fWAsXG53cml0YWJsZTpmYWxzZSxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6ZmFsc2V9KTtcblxuIH1cbnJldHVybiBoYXJkZW4oc2VsZik7XG4gfTtcblxuY29uc3QgZW1wdHlSZWNvcmQ9aGFyZGVuKHt9KTtcblxuLyoqXG4gKiBXaGVuIGNhbGxpbmcgYGRlZmluZUR1cmFibGVLaW5kYCBhbmRcbiAqIGl0cyBzaWJsaW5ncywgdXNlZCBhcyB0aGUgYGluaXRgIGZ1bmN0aW9uIGFyZ3VtZW50IHRvIGluZGljYXRlIHRoYXQgdGhlXG4gKiBzdGF0ZSByZWNvcmQgb2YgdGhlICh2aXJ0dWFsL2R1cmFibGUpIGluc3RhbmNlcyBvZiB0aGUga2luZC9leG9DbGFzc1xuICogc2hvdWxkIGJlIGVtcHR5LCBhbmQgdGhhdCB0aGUgcmV0dXJuZWQgbWFrZXIgZnVuY3Rpb24gc2hvdWxkIGhhdmUgemVyb1xuICogcGFyYW1ldGVycy5cbiAqXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbmNvbnN0ICAgICAgICBpbml0RW1wdHk9KCk9PmVtcHR5UmVjb3JkO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2V4by10b29scy5qcycpLkZhY2V0TmFtZX0gRmFjZXROYW1lXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9leG8tdG9vbHMuanMnKS5NZXRob2RzfSBNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1MgPSBhbnldXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IFtNID0gYW55XVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vZXhvLXRvb2xzLmpzJykuQ2xhc3NDb250ZXh0fSBDbGFzc0NvbnRleHRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUyA9IGFueV1cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPEZhY2V0TmFtZSwgTWV0aG9kcz59IFtGID0gYW55XVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vZXhvLXRvb2xzLmpzJykuS2l0Q29udGV4dH0gS2l0Q29udGV4dFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tbbmFtZTogc3RyaW5nXTogWGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5QYXR0ZXJufX0gU3RhdGVTaGFwZVxuICogSXQgbG9va3MgbGlrZSBhIGNvcHlSZWNvcmQgcGF0dGVybiwgYnV0IHRoZSBpbnRlcnByZXRhdGlvbiBpcyBkaWZmZXJlbnQuXG4gKiBFYWNoIHByb3BlcnR5IGlzIGRpc3RpbmN0LCBpcyBjaGVja2VkIGFuZCBjaGFuZ2VkIHNlcGFyYXRlbHkuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgQ1xuICogQHR5cGVkZWYge29iamVjdH0gRmFyQ2xhc3NPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhjb250ZXh0OiBDKSA9PiB2b2lkfSBbZmluaXNoXVxuICogQHByb3BlcnR5IHtTdGF0ZVNoYXBlfSBbc3RhdGVTaGFwZV1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge00gJiBUaGlzVHlwZTx7IHNlbGY6IE0sIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxDbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPiwgTT4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKE0gJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIE0+KX1cbiAqLyRo4oCNX29uY2UuaW5pdEVtcHR5KGluaXRFbXB0eSk7XG5jb25zdCAgICAgICAgZGVmaW5lRXhvQ2xhc3M9KHRhZyxpbnRlcmZhY2VHdWFyZCxpbml0LG1ldGhvZHMsb3B0aW9ucyk9PntcbmNvbnN0e2ZpbmlzaD11bmRlZmluZWR9PW9wdGlvbnN8fHt9O1xuLyoqIEB0eXBlIHtXZWFrTWFwPE0sQ2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sIE0+Pn0gKi9cbmNvbnN0IGNvbnRleHRNYXA9bmV3IFdlYWtNYXAoKTtcbmNvbnN0IHByb3RvPWRlZmVuZFByb3RvdHlwZShcbnRhZyxcbihzZWxmKT0+LyoqIEB0eXBlIHthbnl9ICovY29udGV4dE1hcC5nZXQoc2VsZiksXG5tZXRob2RzLFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkKTtcblxubGV0IGluc3RhbmNlQ291bnQ9MDtcbi8qKlxuICogQHBhcmFtICB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICovXG5jb25zdCBtYWtlSW5zdGFuY2U9KC4uLmFyZ3MpPT57XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuaW5zdGFuY2VDb3VudCs9MTtcbi8qKiBAdHlwZSB7TX0gKi9cbmNvbnN0IHNlbGY9bWFrZVNlbGYocHJvdG8saW5zdGFuY2VDb3VudCk7XG5cbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbi8qKiBAdHlwZSB7Q2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sTT59ICovXG5jb25zdCBjb250ZXh0PWZyZWV6ZSh7c3RhdGUsc2VsZn0pO1xuY29udGV4dE1hcC5zZXQoc2VsZixjb250ZXh0KTtcbmlmKGZpbmlzaCl7XG5maW5pc2goY29udGV4dCk7XG4gfVxucmV0dXJuICgvKiogQHR5cGUge00gJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIE0+fSAqL1xuc2VsZik7XG5cbiB9O1xucmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2UpO1xuIH07JGjigI1fb25jZS5kZWZpbmVFeG9DbGFzcyhkZWZpbmVFeG9DbGFzcyk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3MpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEkgaW5pdCBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gRiBmYWNldCBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtGICYgVGhpc1R5cGU8eyBmYWNldHM6IEYsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+IH0gbWV0aG9kc0tpdFxuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8S2l0Q29udGV4dDxSZXR1cm5UeXBlPEk+LEY+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEZ9XG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVFeG9DbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5tZXRob2RzS2l0LFxub3B0aW9ucyk9Plxue1xuY29uc3R7ZmluaXNoPXVuZGVmaW5lZH09b3B0aW9uc3x8e307XG5jb25zdCBjb250ZXh0TWFwS2l0PW9iamVjdE1hcChtZXRob2RzS2l0LCgpPT5uZXcgV2Vha01hcCgpKTtcbmNvbnN0IGdldENvbnRleHRLaXQ9b2JqZWN0TWFwKFxubWV0aG9kc0tpdCxcbihfdixuYW1lKT0+KGZhY2V0KT0+Y29udGV4dE1hcEtpdFtuYW1lXS5nZXQoZmFjZXQpKTtcblxuY29uc3QgcHJvdG90eXBlS2l0PWRlZmVuZFByb3RvdHlwZUtpdChcbnRhZyxcbmdldENvbnRleHRLaXQsXG5tZXRob2RzS2l0LFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0KTtcblxubGV0IGluc3RhbmNlQ291bnQ9MDtcbi8qKlxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKi9cbmNvbnN0IG1ha2VJbnN0YW5jZUtpdD0oLi4uYXJncyk9Pntcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbmNvbnN0IHN0YXRlPXNlYWwoaW5pdCguLi5hcmdzKSk7XG4vKiBEb24ndCBmcmVlemUgY29udGV4dCB1bnRpbCB3ZSBhZGQgZmFjZXRzKi9cbi8qKiBAdHlwZSB7S2l0Q29udGV4dDxSZXR1cm5UeXBlPEk+LEY+fSAqL1xuY29uc3QgY29udGV4dD17c3RhdGUsZmFjZXRzOnt9fTtcbmluc3RhbmNlQ291bnQrPTE7XG5jb25zdCBmYWNldHM9b2JqZWN0TWFwKHByb3RvdHlwZUtpdCwocHJvdG8sZmFjZXROYW1lKT0+e1xuY29uc3Qgc2VsZj1tYWtlU2VsZihwcm90byxpbnN0YW5jZUNvdW50KTtcbmNvbnRleHRNYXBLaXRbZmFjZXROYW1lXS5zZXQoc2VsZixjb250ZXh0KTtcbnJldHVybiBzZWxmO1xuIH0pO1xuY29udGV4dC5mYWNldHM9ZmFjZXRzO1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuZnJlZXplKGNvbnRleHQpO1xuaWYoZmluaXNoKXtcbmZpbmlzaChjb250ZXh0KTtcbiB9XG5yZXR1cm4gY29udGV4dC5mYWNldHM7XG4gfTtcbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlS2l0KTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lRXhvQ2xhc3NLaXQoZGVmaW5lRXhvQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmQgQ0FWRUFUOiBzdGF0aWMgdHlwaW5nIGRvZXMgbm90IHlldCBzdXBwb3J0IGBjYWxsV2hlbmAgdHJhbnNmb3JtYXRpb25cbiAqIEBwYXJhbSB7VH0gbWV0aG9kc1xuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8Q2xhc3NDb250ZXh0PHt9LFQ+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRXhvPSh0YWcsaW50ZXJmYWNlR3VhcmQsbWV0aG9kcyxvcHRpb25zPXVuZGVmaW5lZCk9PntcbmNvbnN0IG1ha2VJbnN0YW5jZT1kZWZpbmVFeG9DbGFzcyhcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuaW5pdEVtcHR5LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5yZXR1cm4gbWFrZUluc3RhbmNlKCk7XG4gfTskaOKAjV9vbmNlLm1ha2VFeG8obWFrZUV4byk7XG5oYXJkZW4obWFrZUV4byk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaW5pdEVtcHR5IjpbImluaXRFbXB0eSJdLCJkZWZpbmVFeG9DbGFzcyI6WyJkZWZpbmVFeG9DbGFzcyJdLCJkZWZpbmVFeG9DbGFzc0tpdCI6WyJkZWZpbmVFeG9DbGFzc0tpdCJdLCJtYWtlRXhvIjpbIm1ha2VFeG8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMbCt8nEmAABxJgAAIQAAAEBlbmRvL2V4by12MC4yLjIvc3JjL2V4by10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImRlZmVuZFByb3RvdHlwZSIsImRlZmVuZFByb3RvdHlwZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixsaXN0RGlmZmVyZW5jZSxvYmplY3RNYXAsbXVzdE1hdGNoLE07JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibGlzdERpZmZlcmVuY2VcIiwgWyRo4oCNX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjigI1fYSldXSxbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3BhdHRlcm5zJykuTWV0aG9kfSBNZXRob2QgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5NZXRob2RHdWFyZH0gTWV0aG9kR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZH0gSW50ZXJmYWNlR3VhcmQgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5jb25zdHthcHBseSxvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7ZGVmaW5lUHJvcGVydGllc309T2JqZWN0O1xuXG4vKipcbiAqIEEgbWV0aG9kIGd1YXJkLCBmb3IgaW5jbHVzaW9uIGluIGFuIGludGVyZmFjZSBndWFyZCwgdGhhdCBlbmZvcmNlcyBvbmx5IHRoYXRcbiAqIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NhYmxlIGFuZCB0aGF0IHRoZSByZXN1bHQgaXMgcGFzc2FibGUuIChJbiBmYXIgY2xhc3NlcyxcbiAqIFwiYW55XCIgbWVhbnMgYW55ICpwYXNzYWJsZSouKSBUaGlzIGlzIHRoZSBsZWFzdCBwb3NzaWJsZSBlbmZvcmNlbWVudCBmb3IgYVxuICogbWV0aG9kIGd1YXJkLCBhbmQgaXMgaW1wbGllZCBieSBhbGwgb3RoZXIgbWV0aG9kIGd1YXJkcy5cbiAqL1xuY29uc3QgTWluTWV0aG9kR3VhcmQ9TS5jYWxsKCkucmVzdChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpO1xuXG5jb25zdCBkZWZlbmRTeW5jQXJncz0oYXJncyxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e2FyZ0d1YXJkcyxvcHRpb25hbEFyZ0d1YXJkcyxyZXN0QXJnR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3QgcGFyYW1zUGF0dGVybj1NLnNwbGl0QXJyYXkoXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCk7XG5cbm11c3RNYXRjaChoYXJkZW4oYXJncykscGFyYW1zUGF0dGVybixsYWJlbCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcmV0dXJucyB7TWV0aG9kfVxuICovXG5jb25zdCBkZWZlbmRTeW5jTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtyZXR1cm5HdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdHtzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbnN5bmNNZXRob2QoLi4uYXJncyl7XG5kZWZlbmRTeW5jQXJncyhoYXJkZW4oYXJncyksbWV0aG9kR3VhcmQsbGFiZWwpO1xuY29uc3QgcmVzdWx0PWFwcGx5KG1ldGhvZCx0aGlzLGFyZ3MpO1xubXVzdE1hdGNoKGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9fTtcblxucmV0dXJuIHN5bmNNZXRob2Q7XG4gfTtcblxuY29uc3QgaXNBd2FpdEFyZ0d1YXJkPShhcmdHdWFyZCk9PlxuYXJnR3VhcmQmJnR5cGVvZiBhcmdHdWFyZD09PSdvYmplY3QnJiZhcmdHdWFyZC5rbGFzcz09PSdhd2FpdEFyZyc7XG5cbmNvbnN0IGRlc3luYz0obWV0aG9kR3VhcmQpPT57XG5jb25zdHthcmdHdWFyZHMsb3B0aW9uYWxBcmdHdWFyZHM9W10scmVzdEFyZ0d1YXJkfT1tZXRob2RHdWFyZDtcbiFpc0F3YWl0QXJnR3VhcmQocmVzdEFyZ0d1YXJkKXx8XG5GYWlsIGBSZXN0IGFyZ3MgbWF5IG5vdCBiZSBhd2FpdGVkOiAke3Jlc3RBcmdHdWFyZH1gO1xuY29uc3QgcmF3QXJnR3VhcmRzPVsuLi5hcmdHdWFyZHMsLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG5jb25zdCBhd2FpdEluZGV4ZXM9W107XG5mb3IobGV0IGk9MDtpPHJhd0FyZ0d1YXJkcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBhcmdHdWFyZD1yYXdBcmdHdWFyZHNbaV07XG5pZihpc0F3YWl0QXJnR3VhcmQoYXJnR3VhcmQpKXtcbnJhd0FyZ0d1YXJkc1tpXT1hcmdHdWFyZC5hcmdHdWFyZDtcbmF3YWl0SW5kZXhlcy5wdXNoKGkpO1xuIH1cbiB9XG5yZXR1cm57XG5hd2FpdEluZGV4ZXMsXG5yYXdNZXRob2RHdWFyZDp7XG5hcmdHdWFyZHM6cmF3QXJnR3VhcmRzLnNsaWNlKDAsYXJnR3VhcmRzLmxlbmd0aCksXG5vcHRpb25hbEFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG5yZXN0QXJnR3VhcmR9fTtcblxuXG4gfTtcblxuY29uc3QgZGVmZW5kQXN5bmNNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0e2F3YWl0SW5kZXhlcyxyYXdNZXRob2RHdWFyZH09ZGVzeW5jKG1ldGhvZEd1YXJkKTtcbmNvbnN0e2FzeW5jTWV0aG9kfT17XG4vKiBOb3RlIHB1cnBvc2VmdWwgdXNlIG9mIGB0aGlzYCBhbmQgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbmFzeW5jTWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgYXdhaXRMaXN0PWF3YWl0SW5kZXhlcy5tYXAoKGkpPT5hcmdzW2ldKTtcbmNvbnN0IHA9UHJvbWlzZS5hbGwoYXdhaXRMaXN0KTtcbmNvbnN0IHJhd0FyZ3M9Wy4uLmFyZ3NdO1xuY29uc3QgcmVzdWx0UD1FLndoZW4ocCwoYXdhaXRlZEFyZ3MpPT57XG5mb3IobGV0IGo9MDtqPGF3YWl0SW5kZXhlcy5sZW5ndGg7ais9MSl7XG5yYXdBcmdzW2F3YWl0SW5kZXhlc1tqXV09YXdhaXRlZEFyZ3Nbal07XG4gfVxuZGVmZW5kU3luY0FyZ3MocmF3QXJncyxyYXdNZXRob2RHdWFyZCxsYWJlbCk7XG5yZXR1cm4gYXBwbHkobWV0aG9kLHRoaXMscmF3QXJncyk7XG4gfSk7XG5yZXR1cm4gRS53aGVuKHJlc3VsdFAsKHJlc3VsdCk9Pntcbm11c3RNYXRjaChoYXJkZW4ocmVzdWx0KSxyZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbnJldHVybiByZXN1bHQ7XG4gfSk7XG4gfX07XG5cbnJldHVybiBhc3luY01ldGhvZDtcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge01ldGhvZH0gbWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKi9cbmNvbnN0IGRlZmVuZE1ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7a2xhc3MsY2FsbEtpbmR9PW1ldGhvZEd1YXJkO1xuYXNzZXJ0KGtsYXNzPT09J21ldGhvZEd1YXJkJyk7XG5pZihjYWxsS2luZD09PSdzeW5jJyl7XG5yZXR1cm4gZGVmZW5kU3luY01ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpO1xuIH1lbHNle1xuYXNzZXJ0KGNhbGxLaW5kPT09J2FzeW5jJyk7XG5yZXR1cm4gZGVmZW5kQXN5bmNNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBGYWNldE5hbWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTWV0aG9kc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtNZXRob2RzfSBbTSA9IGFueV1cbiAqIEB0eXBlZGVmIHt7IHN0YXRlOiBTLCBzZWxmOiBNIH19IENsYXNzQ29udGV4dFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gW0YgPSBhbnldXG4gKiBAdHlwZWRlZiB7eyBzdGF0ZTogUywgZmFjZXRzOiBGIH19IEtpdENvbnRleHRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoZmFjZXQ6IGFueSkgPT4gS2l0Q29udGV4dH0gS2l0Q29udGV4dFByb3ZpZGVyXG4gKiBAdHlwZWRlZiB7KChyZXByZXNlbnRhdGl2ZTogYW55KSA9PiBDbGFzc0NvbnRleHQpIHwgS2l0Q29udGV4dFByb3ZpZGVyfSBDb250ZXh0UHJvdmlkZXJcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RUYWdcbiAqIEBwYXJhbSB7Q29udGV4dFByb3ZpZGVyfSBjb250ZXh0UHJvdmlkZXJcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gW21ldGhvZEd1YXJkXVxuICovXG5jb25zdCBiaW5kTWV0aG9kPShcbm1ldGhvZFRhZyxcbmNvbnRleHRQcm92aWRlcixcbmJlaGF2aW9yTWV0aG9kLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5tZXRob2RHdWFyZD11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YoYmVoYXZpb3JNZXRob2QsJ2Z1bmN0aW9uJyk7XG5cbmNvbnN0IGdldENvbnRleHQ9KHNlbGYpPT57XG5jb25zdCBjb250ZXh0PWNvbnRleHRQcm92aWRlcihzZWxmKTtcbmNvbnRleHR8fFxuRmFpbCBgJHtxKG1ldGhvZFRhZyl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtzZWxmfWA7XG5yZXR1cm4gY29udGV4dDtcbiB9O1xuXG4vKiBWaW9sYXRpbmcgYWxsIEplc3NpZSBydWxlcyB0byBjcmVhdGUgcmVwcmVzZW50YXRpdmVzIHRoYXQgaW5oZXJpdCovXG4vKiBtZXRob2RzIGZyb20gYSBzaGFyZWQgcHJvdG90eXBlLiBUaGUgYm91bmQgbWV0aG9kIHRoZXJlZm9yZSBuZWVkcyovXG4vKiB0byBtZW50aW9uIGB0aGlzYC4gV2UgZGVmaW5lIGl0IHVzaW5nIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4vKiBzbyB0aGF0IGl0IHdpbGwgYmUgYHRoaXNgIHNlbnNpdGl2ZSBidXQgbm90IGNvbnN0cnVjdGFibGUuKi9cbi8qKi9cbi8qIFdlIG5vcm1hbGx5IGNvbnNpZGVyIGB0aGlzYCB1bnNhZmUgYmVjYXVzZSBvZiB0aGUgaGF6YXJkIG9mIGEqL1xuLyogbWV0aG9kIG9mIG9uZSBhYnN0cmFjdGlvbiBiZWluZyBhcHBsaWVkIHRvIGFuIGluc3RhbmNlIG9mKi9cbi8qIGFub3RoZXIgYWJzdHJhY3Rpb24uIFRvIHByZXZlbnQgdGhhdCBhdHRhY2ssIHRoZSBib3VuZCBtZXRob2QqL1xuLyogY2hlY2tzIHRoYXQgaXRzIGB0aGlzYCBpcyBpbiB0aGUgbWFwIGluIHdoaWNoIGl0cyByZXByZXNlbnRhdGl2ZXMqL1xuLyogYXJlIHJlZ2lzdGVyZWQuKi9cbmxldHttZXRob2R9PXRoaXNmdWxNZXRob2RzP1xue1xubWV0aG9kKC4uLmFyZ3Mpe1xudGhpc3x8XG5GYWlsIGB0aGlzZnVsIG1ldGhvZCAke21ldGhvZFRhZ30gY2FsbGVkIHdpdGhvdXQgJ3RoaXMnIG9iamVjdGA7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsY29udGV4dCxhcmdzKTtcbiB9fTpcblxue1xubWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgY29udGV4dD1nZXRDb250ZXh0KHRoaXMpO1xucmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLG51bGwsW2NvbnRleHQsLi4uYXJnc10pO1xuIH19O1xuXG5pZihtZXRob2RHdWFyZCl7XG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1lbHNlIGlmKHRoaXNmdWxNZXRob2RzKXtcbi8qIEZvciBmYXIgY2xhc3NlcyBlbnN1cmUgdGhhdCBpbnB1dHMgYW5kIG91dHB1dHMgYXJlIHBhc3NhYmxlLiovXG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxNaW5NZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1cbmRlZmluZVByb3BlcnRpZXMobWV0aG9kLHtcbm5hbWU6e3ZhbHVlOm1ldGhvZFRhZ30sXG5sZW5ndGg6e1xudmFsdWU6dGhpc2Z1bE1ldGhvZHM/YmVoYXZpb3JNZXRob2QubGVuZ3RoOmJlaGF2aW9yTWV0aG9kLmxlbmd0aC0xfX0pO1xuXG5cbnJldHVybiBtZXRob2Q7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge0NvbnRleHRQcm92aWRlcn0gY29udGV4dFByb3ZpZGVyXG4gKiBAcGFyYW0ge1R9IGJlaGF2aW9yTWV0aG9kc1xuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBbaW50ZXJmYWNlR3VhcmRdXG4gKiBAcmV0dXJucyB7VCAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBkZWZlbmRQcm90b3R5cGU9KFxudGFnLFxuY29udGV4dFByb3ZpZGVyLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5pbnRlcmZhY2VHdWFyZD11bmRlZmluZWQpPT5cbntcbmNvbnN0IHByb3RvdHlwZT17fTtcbmNvbnN0IG1ldGhvZE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzKS5maWx0ZXIoXG4vKiBCeSBpZ25vcmluZyBhbnkgbWV0aG9kIG5hbWVkIFwiY29uc3RydWN0b3JcIiwgd2UgY2FuIHVzZSBhKi9cbi8qIGNsYXNzLnByb3RvdHlwZSBhcyBhIGJlaGF2aW9yTWV0aG9kcy4qL1xuKG5hbWUpPT5uYW1lIT09J2NvbnN0cnVjdG9yJyk7XG5cbmxldCBtZXRob2RHdWFyZHM7XG5pZihpbnRlcmZhY2VHdWFyZCl7XG5jb25zdHtcbmtsYXNzLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkczptZyxcbnNsb3BweT1mYWxzZX09XG5pbnRlcmZhY2VHdWFyZDtcbm1ldGhvZEd1YXJkcz1tZztcbmFzc2VydC5lcXVhbChrbGFzcywnSW50ZXJmYWNlJyk7XG5hc3NlcnQudHlwZW9mKGludGVyZmFjZU5hbWUsJ3N0cmluZycpO1xue1xuY29uc3QgbWV0aG9kR3VhcmROYW1lcz1vd25LZXlzKG1ldGhvZEd1YXJkcyk7XG5jb25zdCB1bmltcGxlbWVudGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsbWV0aG9kTmFtZXMpO1xudW5pbXBsZW1lbnRlZC5sZW5ndGg9PT0wfHxcbkZhaWwgYG1ldGhvZHMgJHtxKHVuaW1wbGVtZW50ZWQpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmlmKCFzbG9wcHkpe1xuY29uc3QgdW5ndWFyZGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLG1ldGhvZEd1YXJkTmFtZXMpO1xudW5ndWFyZGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5ndWFyZGVkKX0gbm90IGd1YXJkZWQgYnkgJHtxKGludGVyZmFjZU5hbWUpfWA7XG4gfVxuIH1cbiB9XG5mb3IoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcyl7XG5wcm90b3R5cGVbcHJvcF09YmluZE1ldGhvZChcbiBgSW4gJHtxKHByb3ApfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuY29udGV4dFByb3ZpZGVyLFxuYmVoYXZpb3JNZXRob2RzW3Byb3BdLFxudGhpc2Z1bE1ldGhvZHMsXG4vKiBUT0RPIHNvbWUgdG9vbCBkb2VzIG5vdCB5ZXQgdW5kZXJzdGFuZCB0aGUgYD8uW2Agc3ludGF4Ki9cbm1ldGhvZEd1YXJkcyYmbWV0aG9kR3VhcmRzW3Byb3BdKTtcblxuIH1cblxucmV0dXJuIEZhcih0YWcsLyoqIEB0eXBlIHtUfSAqL3Byb3RvdHlwZSk7XG4gfTskaOKAjV9vbmNlLmRlZmVuZFByb3RvdHlwZShkZWZlbmRQcm90b3R5cGUpO1xuaGFyZGVuKGRlZmVuZFByb3RvdHlwZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtSZWNvcmQ8RmFjZXROYW1lLCBLaXRDb250ZXh0UHJvdmlkZXI+fSBjb250ZXh0UHJvdmlkZXJLaXRcbiAqIEBwYXJhbSB7UmVjb3JkPEZhY2V0TmFtZSwgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBiZWhhdmlvck1ldGhvZHNLaXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBJbnRlcmZhY2VHdWFyZD59IFtpbnRlcmZhY2VHdWFyZEtpdF1cbiAqL1xuY29uc3QgICAgICAgIGRlZmVuZFByb3RvdHlwZUtpdD0oXG50YWcsXG5jb250ZXh0UHJvdmlkZXJLaXQsXG5iZWhhdmlvck1ldGhvZHNLaXQsXG50aGlzZnVsTWV0aG9kcz1mYWxzZSxcbmludGVyZmFjZUd1YXJkS2l0PXVuZGVmaW5lZCk9Plxue1xuY29uc3QgZmFjZXROYW1lcz1vd25LZXlzKGJlaGF2aW9yTWV0aG9kc0tpdCkuc29ydCgpO1xuZmFjZXROYW1lcy5sZW5ndGg+MXx8RmFpbCBgQSBtdWx0aS1mYWNldCBvYmplY3QgbXVzdCBoYXZlIG11bHRpcGxlIGZhY2V0c2A7XG5pZihpbnRlcmZhY2VHdWFyZEtpdCl7XG5jb25zdCBpbnRlcmZhY2VOYW1lcz1vd25LZXlzKGludGVyZmFjZUd1YXJkS2l0KTtcbmNvbnN0IGV4dHJhSW50ZXJmYWNlTmFtZXM9bGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcyxpbnRlcmZhY2VOYW1lcyk7XG5leHRyYUludGVyZmFjZU5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgSW50ZXJmYWNlcyAke3EoZXh0cmFJbnRlcmZhY2VOYW1lcyl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuY29uc3QgZXh0cmFGYWNldE5hbWVzPWxpc3REaWZmZXJlbmNlKGludGVyZmFjZU5hbWVzLGZhY2V0TmFtZXMpO1xuZXh0cmFGYWNldE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbm90IGd1YXJkZWQgYnkgaW50ZXJmYWNlc2A7XG4gfVxuY29uc3QgY29udGV4dE1hcE5hbWVzPW93bktleXMoY29udGV4dFByb3ZpZGVyS2l0KTtcbmNvbnN0IGV4dHJhQ29udGV4dE5hbWVzPWxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsY29udGV4dE1hcE5hbWVzKTtcbmV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoY29udGV4dE1hcE5hbWVzLGZhY2V0TmFtZXMpO1xuZXh0cmFGYWNldE5hbWVzLmxlbmd0aD09PTB8fFxuRmFpbCBgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbWlzc2luZyBjb250ZXh0c2A7XG5yZXR1cm4gb2JqZWN0TWFwKGJlaGF2aW9yTWV0aG9kc0tpdCwoYmVoYXZpb3JNZXRob2RzLGZhY2V0TmFtZSk9PlxuZGVmZW5kUHJvdG90eXBlKFxuIGAke3RhZ30gJHtmYWNldE5hbWV9YCxcbmNvbnRleHRQcm92aWRlcktpdFtmYWNldE5hbWVdLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHMsXG5pbnRlcmZhY2VHdWFyZEtpdCYmaW50ZXJmYWNlR3VhcmRLaXRbZmFjZXROYW1lXSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuZGVmZW5kUHJvdG90eXBlS2l0KGRlZmVuZFByb3RvdHlwZUtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEEMM5RAAgAAQAIAAB4AAABAZW5kby9mYXItdjAuMi4xOC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIixudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBlbmRvL2V2ZW50dWFsLXNlbmQiOltbIkUiLCJFIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJGYXIiLCJGYXIiXSxbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXSxbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP0lSmYLDAAACwwAADUAAABAZW5kby9pbXBvcnQtYnVuZGxlLXYwLjMuNC9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+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+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsJxCfuIKAADiCgAAHgAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIiwiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyIsIi4vc3JjL2tleXMvY29weUJhZy5qcyIsIi4vc3JjL2tleXMvY29weVNldC5qcyIsIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiLi9zcmMvdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiLCJiYWdDb21wYXJlIiwiYmFnQ29tcGFyZSIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCIsImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciIsImtleUxUIiwia2V5TFQiLCJvYmplY3RNYXAiLCJvYmplY3RNYXAiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2tleXMvY2hlY2tLZXkuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weVNldC5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5QmFnLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy91dGlscy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXV0sIi4vc3JjL2tleXMvY29weVNldC5qcyI6W1siY29lcmNlVG9FbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiXV0sIi4vc3JjL2tleXMvY29weUJhZy5qcyI6W1siY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIl1dLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjpbWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdXSwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjpbWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOltbImJhZ0lzU3VwZXJiYWciLCJiYWdJc1N1cGVyYmFnIl0sWyJiYWdDb21wYXJlIiwiYmFnQ29tcGFyZSJdLFsiYmFnVW5pb24iLCJiYWdVbmlvbiJdLFsiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSW50ZXJzZWN0aW9uIl0sWyJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnRGlzam9pbnRTdWJ0cmFjdCJdXSwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIjpbWyJNIiwiTSJdLFsiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIl0sWyJpc1BhdHRlcm4iLCJpc1BhdHRlcm4iXSxbImFzc2VydFBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIl0sWyJtYXRjaGVzIiwibWF0Y2hlcyJdLFsibXVzdE1hdGNoIiwibXVzdE1hdGNoIl1dLCIuL3NyYy91dGlscy5qcyI6W1sibGlzdERpZmZlcmVuY2UiLCJsaXN0RGlmZmVyZW5jZSJdLFsib2JqZWN0TWFwIiwib2JqZWN0TWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADLFxngpEYAAKRGAAAqAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL2NoZWNrS2V5LmpzeyJpbXBvcnRzIjpbIi4uL3V0aWxzLmpzIiwiLi9jb3B5QmFnLmpzIiwiLi9jb3B5U2V0LmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weVNldCIsImFzc2VydEtleSIsImFzc2VydFByaW1pdGl2ZUtleSIsImFzc2VydFNjYWxhcktleSIsImNoZWNrQ29weUJhZyIsImNoZWNrQ29weU1hcCIsImNoZWNrQ29weVNldCIsImNoZWNrS2V5IiwiY2hlY2tTY2FsYXJLZXkiLCJjb3B5TWFwS2V5U2V0IiwiZXZlcnlDb3B5QmFnRW50cnkiLCJldmVyeUNvcHlNYXBLZXkiLCJldmVyeUNvcHlNYXBWYWx1ZSIsImV2ZXJ5Q29weVNldEtleSIsImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwS2V5cyIsImdldENvcHlNYXBWYWx1ZXMiLCJnZXRDb3B5U2V0S2V5cyIsImlzQ29weUJhZyIsImlzQ29weU1hcCIsImlzQ29weVNldCIsImlzS2V5IiwiaXNQcmltaXRpdmVLZXkiLCJpc1NjYWxhcktleSIsIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weU1hcCIsIm1ha2VDb3B5U2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsYXNzZXJ0UGFzc2FibGUsRmFyLGdldFRhZyxpc09iamVjdCxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGlkZW50Q2hlY2tlcixjaGVja0VsZW1lbnRzLG1ha2VTZXRPZkVsZW1lbnRzLGNoZWNrQmFnRW50cmllcyxtYWtlQmFnT2ZFbnRyaWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuLi91dGlscy5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChpZGVudENoZWNrZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5U2V0LmpzXCIsIFtbXCJjaGVja0VsZW1lbnRzXCIsIFskaOKAjV9hID0+IChjaGVja0VsZW1lbnRzID0gJGjigI1fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJjaGVja0JhZ0VudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQmFnRW50cmllcyA9ICRo4oCNX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLCBbJGjigI1fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyaXNvbn0gS2V5Q29tcGFyaXNvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleX0gS2V5ICovXG4vKiogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV0gQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ29weUJhZzxLPn0gQ29weUJhZyAqL1xuLyoqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkNvcHlTZXQ8Sz59IENvcHlTZXQgKi9cbi8qKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XSBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVj1QYXNzYWJsZV0gQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ29weU1hcDxLLCBWPn0gQ29weU1hcCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleUNvbXBhcmV9IEtleUNvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vIFByaW1pdGl2ZSBhbmQgU2NhbGFyIGtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUHJpbWl0aXZlS2V5PSh2YWwsY2hlY2spPT57XG5pZihpc09iamVjdCh2YWwpKXtcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgJHtxKHR5cGVvZiB2YWwpfSBjYW5ub3QgYmUgYSBwcmltaXRpdmU6ICR7dmFsfWApKTtcblxuIH1cbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1ByaW1pdGl2ZUtleT0odmFsKT0+Y2hlY2tQcmltaXRpdmVLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc1ByaW1pdGl2ZUtleShpc1ByaW1pdGl2ZUtleSk7XG5oYXJkZW4oaXNQcmltaXRpdmVLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQcmltaXRpdmVLZXk9KHZhbCk9PntcbmNoZWNrUHJpbWl0aXZlS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UHJpbWl0aXZlS2V5KGFzc2VydFByaW1pdGl2ZUtleSk7XG5oYXJkZW4oYXNzZXJ0UHJpbWl0aXZlS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tTY2FsYXJLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzUHJpbWl0aXZlS2V5KHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5pZihwYXNzU3R5bGU9PT0ncmVtb3RhYmxlJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgc2NhbGFyIGtleTogJHt2YWx9YCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5jaGVja1NjYWxhcktleShjaGVja1NjYWxhcktleSk7XG5jb25zdCAgICAgICAgaXNTY2FsYXJLZXk9KHZhbCk9PmNoZWNrU2NhbGFyS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNTY2FsYXJLZXkoaXNTY2FsYXJLZXkpO1xuaGFyZGVuKGlzU2NhbGFyS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0U2NhbGFyS2V5PSh2YWwpPT57XG5jaGVja1NjYWxhcktleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydFNjYWxhcktleShhc3NlcnRTY2FsYXJLZXkpO1xuaGFyZGVuKGFzc2VydFNjYWxhcktleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PEtleT59ICovXG5jb25zdCBrZXlNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrS2V5PSh2YWwsY2hlY2spPT57XG5pZighaXNPYmplY3QodmFsKSl7XG4vKiBUT0RPIFRoZXJlIGlzIG5vdCB5ZXQgYSBjaGVja1Bhc3NhYmxlLCBidXQgcGVyaGFwcyB0aGVyZSBzaG91bGQgYmUuKi9cbi8qIElmIHRoYXQgaGFwcGVucywgd2Ugc2hvdWxkIGNhbGwgaXQgaGVyZSBpbnN0ZWFkLiovXG5hc3NlcnRQYXNzYWJsZSh2YWwpO1xucmV0dXJuIHRydWU7XG4gfVxuaWYoa2V5TWVtby5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcmVzdWx0PWNoZWNrS2V5SW50ZXJuYWwodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG4vKiBEb24ndCBjYWNoZSB0aGUgdW5kZWZpbmVkIGNhc2VzLCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkIGFnYWluKi9cbi8qIHdpdGggYGFzc2VydENoZWNrZXJgIGl0J2xsIHRocm93IGEgZGlhZ25vc3RpYyBhZ2FpbiovXG5rZXlNZW1vLmFkZCh2YWwpO1xuIH1cbi8qIE5vdGUgdGhhdCB3ZSBkbyBub3QgbWVtb2l6ZSBhIG5lZ2F0aXZlIGp1ZGdlbWVudCwgc28gdGhhdCBpZiBpdCBpcyB0cmllZCovXG4vKiBhZ2FpbiB3aXRoIGEgY2hlY2tlciwgaXQgd2lsbCBzdGlsbCBwcm9kdWNlIGEgdXNlZnVsIGRpYWdub3N0aWMuKi9cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrS2V5KGNoZWNrS2V5KTtcbmhhcmRlbihjaGVja0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzS2V5PSh2YWwpPT5jaGVja0tleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzS2V5KGlzS2V5KTtcbmhhcmRlbihpc0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtLZXl9IHZhbFxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0S2V5PSh2YWwpPT57XG5jaGVja0tleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEtleShhc3NlcnRLZXkpO1xuaGFyZGVuKGFzc2VydEtleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weVNldCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5U2V0IGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weVNldD59ICovXG5jb25zdCBjb3B5U2V0TWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5U2V0PShzLGNoZWNrKT0+e1xuaWYoY29weVNldE1lbW8uaGFzKHMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlc3VsdD1cbihwYXNzU3R5bGVPZihzKT09PSd0YWdnZWQnJiZnZXRUYWcocyk9PT0nY29weVNldCd8fFxuY2hlY2soZmFsc2UsWCBgTm90IGEgY29weVNldDogJHtzfWApKSYmXG5jaGVja0VsZW1lbnRzKHMucGF5bG9hZCxjaGVjaykmJlxuY2hlY2tLZXkocy5wYXlsb2FkLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb3B5U2V0TWVtby5hZGQocyk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5U2V0KGNoZWNrQ29weVNldCk7XG5oYXJkZW4oY2hlY2tDb3B5U2V0KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5U2V0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7cyBpcyBDb3B5U2V0fVxuICovXG5cbi8qKiBAdHlwZSB7SXNDb3B5U2V0fSAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldD0ocyk9PmNoZWNrQ29weVNldChzLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0NvcHlTZXQoaXNDb3B5U2V0KTtcbmhhcmRlbihpc0NvcHlTZXQpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5U2V0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzIGlzIENvcHlTZXR9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5U2V0fSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlTZXQ9KHMpPT57XG5jaGVja0NvcHlTZXQocyxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weVNldChhc3NlcnRDb3B5U2V0KTtcbmhhcmRlbihhc3NlcnRDb3B5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weVNldEtleXM9KHMpPT57XG5hc3NlcnRDb3B5U2V0KHMpO1xucmV0dXJuIHMucGF5bG9hZDtcbiB9OyRo4oCNX29uY2UuZ2V0Q29weVNldEtleXMoZ2V0Q29weVNldEtleXMpO1xuaGFyZGVuKGdldENvcHlTZXRLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5U2V0PEs+fSBzXG4gKiBAcGFyYW0geyhrZXk6IEssIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weVNldEtleT0ocyxmbik9PlxuZ2V0Q29weVNldEtleXMocykuZXZlcnkoKGtleSxpbmRleCk9PmZuKGtleSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5U2V0S2V5KGV2ZXJ5Q29weVNldEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5U2V0S2V5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlTZXQ9KGVsZW1lbnRJdGVyKT0+e1xuY29uc3QgcmVzdWx0PW1ha2VTZXRPZkVsZW1lbnRzKGVsZW1lbnRJdGVyKTtcbmFzc2VydENvcHlTZXQocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5U2V0KG1ha2VDb3B5U2V0KTtcbmhhcmRlbihtYWtlQ29weVNldCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weUJhZyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5QmFnIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weUJhZz59ICovXG5jb25zdCBjb3B5QmFnTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5QmFnPShiLGNoZWNrKT0+e1xuaWYoY29weUJhZ01lbW8uaGFzKGIpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlc3VsdD1cbihwYXNzU3R5bGVPZihiKT09PSd0YWdnZWQnJiZnZXRUYWcoYik9PT0nY29weUJhZyd8fFxuY2hlY2soZmFsc2UsWCBgTm90IGEgY29weUJhZzogJHtifWApKSYmXG5jaGVja0JhZ0VudHJpZXMoYi5wYXlsb2FkLGNoZWNrKSYmXG5jaGVja0tleShiLnBheWxvYWQsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvcHlCYWdNZW1vLmFkZChiKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0NvcHlCYWcoY2hlY2tDb3B5QmFnKTtcbmhhcmRlbihjaGVja0NvcHlCYWcpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc0NvcHlCYWdcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHtiIGlzIENvcHlCYWd9XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlCYWd9ICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnPShiKT0+Y2hlY2tDb3B5QmFnKGIsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weUJhZyhpc0NvcHlCYWcpO1xuaGFyZGVuKGlzQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlCYWdcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHthc3NlcnRzIGIgaXMgQ29weUJhZ31cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlCYWd9ICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weUJhZz0oYik9PntcbmNoZWNrQ29weUJhZyhiLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QmFnKGFzc2VydENvcHlCYWcpO1xuaGFyZGVuKGFzc2VydENvcHlCYWcpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlCYWc8Sz59IGJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+WydwYXlsb2FkJ119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5QmFnRW50cmllcz0oYik9PntcbmFzc2VydENvcHlCYWcoYik7XG5yZXR1cm4gYi5wYXlsb2FkO1xuIH07JGjigI1fb25jZS5nZXRDb3B5QmFnRW50cmllcyhnZXRDb3B5QmFnRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weUJhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0NvcHlCYWc8Sz59IGJcbiAqIEBwYXJhbSB7KGVudHJ5OiBbSywgYmlnaW50XSwgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5QmFnRW50cnk9KGIsZm4pPT5cbmdldENvcHlCYWdFbnRyaWVzKGIpLmV2ZXJ5KChlbnRyeSxpbmRleCk9PmZuKGVudHJ5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlCYWdFbnRyeShldmVyeUNvcHlCYWdFbnRyeSk7XG5oYXJkZW4oZXZlcnlDb3B5QmFnRW50cnkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlCYWc9KGJhZ0VudHJ5SXRlcik9PntcbmNvbnN0IHJlc3VsdD1tYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJ5SXRlcik7XG5hc3NlcnRDb3B5QmFnKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weUJhZyhtYWtlQ29weUJhZyk7XG5oYXJkZW4obWFrZUNvcHlCYWcpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weUJhZ0Zyb21FbGVtZW50cz0oZWxlbWVudEl0ZXIpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcbmNvbnN0IHNvcnRlZD1zb3J0QnlSYW5rKGVsZW1lbnRJdGVyLGZ1bGxDb21wYXJlKTtcbi8qKiBAdHlwZSB7W0ssYmlnaW50XVtdfSAqL1xuY29uc3QgZW50cmllcz1bXTtcbmZvcihsZXQgaT0wO2k8c29ydGVkLmxlbmd0aDspe1xuY29uc3Qgaz1zb3J0ZWRbaV07XG5sZXQgaj1pKzE7XG53aGlsZShqPHNvcnRlZC5sZW5ndGgmJmZ1bGxDb21wYXJlKGssc29ydGVkW2pdKT09PTApe1xuais9MTtcbiB9XG5lbnRyaWVzLnB1c2goW2ssQmlnSW50KGotaSldKTtcbmk9ajtcbiB9XG5yZXR1cm4gbWFrZUNvcHlCYWcoZW50cmllcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcbmhhcmRlbihtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weU1hcCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5TWFwJ3Mga2V5cyBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PENvcHlNYXA+fSAqL1xuY29uc3QgY29weU1hcE1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weU1hcD0obSxjaGVjayk9PntcbmlmKGNvcHlNYXBNZW1vLmhhcyhtKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZighKHBhc3NTdHlsZU9mKG0pPT09J3RhZ2dlZCcmJmdldFRhZyhtKT09PSdjb3B5TWFwJykpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlNYXA6ICR7bX1gKTtcbiB9XG5jb25zdHtwYXlsb2FkfT1tO1xuaWYocGFzc1N0eWxlT2YocGF5bG9hZCkhPT0nY29weVJlY29yZCcpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBiZSBhIHJlY29yZDogJHttfWApO1xuIH1cbmNvbnN0e2tleXMsdmFsdWVzLC4uLnJlc3R9PXBheWxvYWQ7XG5jb25zdCByZXN1bHQ9XG4ob3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3Qgb25seSBoYXZlIC5rZXlzIGFuZCAudmFsdWVzOiAke219YCkpJiZcblxuY2hlY2tFbGVtZW50cyhrZXlzLGNoZWNrKSYmXG5jaGVja0tleShrZXlzLGNoZWNrKSYmKFxucGFzc1N0eWxlT2YodmFsdWVzKT09PSdjb3B5QXJyYXknfHxcbmNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIC52YWx1ZXMgbXVzdCBiZSBhIGNvcHlBcnJheTogJHttfWApKSYmKFxua2V5cy5sZW5ndGg9PT12YWx1ZXMubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBrZXlzIGFuZCB2YWx1ZXM6ICR7bX1gKSk7XG5cbmlmKHJlc3VsdCl7XG5jb3B5TWFwTWVtby5hZGQobSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5TWFwKGNoZWNrQ29weU1hcCk7XG5oYXJkZW4oY2hlY2tDb3B5TWFwKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5TWFwXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7bSBpcyBDb3B5TWFwPEtleSwgUGFzc2FibGU+fVxuICovXG5cbi8qKiBAdHlwZSB7SXNDb3B5TWFwfSAqL1xuY29uc3QgICAgICAgIGlzQ29weU1hcD0obSk9PmNoZWNrQ29weU1hcChtLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmhhcmRlbihpc0NvcHlNYXApO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5TWFwXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBtIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5TWFwfSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlNYXA9KG0pPT57XG5jaGVja0NvcHlNYXAobSxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weU1hcChhc3NlcnRDb3B5TWFwKTtcbmhhcmRlbihhc3NlcnRDb3B5TWFwKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwS2V5cz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5yZXR1cm4gbS5wYXlsb2FkLmtleXM7XG4gfTskaOKAjV9vbmNlLmdldENvcHlNYXBLZXlzKGdldENvcHlNYXBLZXlzKTtcbmhhcmRlbihnZXRDb3B5TWFwS2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7VltdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcFZhbHVlcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5yZXR1cm4gbS5wYXlsb2FkLnZhbHVlcztcbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcFZhbHVlcyhnZXRDb3B5TWFwVmFsdWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwVmFsdWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwRW50cmllcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5jb25zdHtcbnBheWxvYWQ6e2tleXMsdmFsdWVzfX09XG5tO1xuY29uc3R7bGVuZ3RofT0vKiogQHR5cGUge0FycmF5fSAqL2tleXM7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT0wO1xucmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFtLLFZdLHZvaWQ+fSAqL1xubGV0IHJlc3VsdDtcbmlmKGk8bGVuZ3RoKXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6W2tleXNbaV0sdmFsdWVzW2ldXX0pO1xuaSs9MTtcbnJldHVybiByZXN1bHQ7XG4gfWVsc2V7XG5yZXN1bHQ9aGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcEVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwS2V5PShtLGZuKT0+XG5nZXRDb3B5TWFwS2V5cyhtKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlNYXBLZXkoZXZlcnlDb3B5TWFwS2V5KTtcbmhhcmRlbihldmVyeUNvcHlNYXBLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsodmFsdWU6IFYsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weU1hcFZhbHVlPShtLGZuKT0+XG5nZXRDb3B5TWFwVmFsdWVzKG0pLmV2ZXJ5KCh2YWx1ZSxpbmRleCk9PmZuKHZhbHVlLGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlNYXBWYWx1ZShldmVyeUNvcHlNYXBWYWx1ZSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwVmFsdWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5TWFwS2V5U2V0PShtKT0+XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBhbHJlYWR5IGluIHRoZSBpbnRlcm5hbCBmb3JtIHVzZWQgYnkgY29weVNldHMuKi9cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLG0ucGF5bG9hZC5rZXlzKTskaOKAjV9vbmNlLmNvcHlNYXBLZXlTZXQoY29weU1hcEtleVNldCk7XG5oYXJkZW4oY29weU1hcEtleVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIFZdPn0gZW50cmllc1xuICogQHJldHVybnMge0NvcHlNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5TWFwPShlbnRyaWVzKT0+e1xuLyogVGhpcyBpcyB3ZWlyZCwgYnV0IHJldmVyc2UgcmFuayBzb3J0aW5nIHRoZSBlbnRyaWVzIGlzIGEgZ29vZCBmaXJzdCBzdGVwKi9cbi8qIGZvciBnZXR0aW5nIHRoZSByYW5rIHNvcnRlZCBrZXlzIHRvZ2V0aGVyIHdpdGggdGhlIHZhbHVlcyovXG4vKiBvcmdhbml6ZWQgYnkgdGhvc2Uga2V5cy4gQWxzbywgYW1vbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCovXG4vKiBrZXlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzLCB0aG9zZSBhcmUgcmFuayBzb3J0ZWQuKi9cbi8qIFRPRE8gVGhpcyovXG4vKiBjb3VsZCBzb2x2ZSB0aGUgY29weU1hcCBjb3ZlciBpc3N1ZSBleHBsYWluZWQgaW4gcGF0dGVybk1hdGNoZXJzLmpzLiovXG4vKiBCdXQgb25seSBpZiB3ZSBpbmNsdWRlIHRoaXMgY3JpdGVyaWEgaW4gb3VyIHZhbGlkYXRpb24gb2YgY29weU1hcHMsKi9cbi8qIHdoaWNoIHdlIGN1cnJlbnRseSBkbyBub3QuKi9cbmNvbnN0IHNvcnRlZEVudHJpZXM9c29ydEJ5UmFuayhlbnRyaWVzLGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCBrZXlzPXNvcnRlZEVudHJpZXMubWFwKChbayxfdl0pPT5rKTtcbmNvbnN0IHZhbHVlcz1zb3J0ZWRFbnRyaWVzLm1hcCgoW19rLHZdKT0+dik7XG5jb25zdCByZXN1bHQ9bWFrZVRhZ2dlZCgnY29weU1hcCcse2tleXMsdmFsdWVzfSk7XG5hc3NlcnRDb3B5TWFwKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weU1hcChtYWtlQ29weU1hcCk7XG5oYXJkZW4obWFrZUNvcHlNYXApO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyBSZWN1ciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlJbnRlcm5hbD0odmFsLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja0tleShjaGlsZCxjaGVjayk7XG5cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWwpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gdmFsLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xucmV0dXJuIGNoZWNrQ29weVNldCh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weUJhZyc6e1xucmV0dXJuIGNoZWNrQ29weUJhZyh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weU1hcCc6e1xucmV0dXJuKFxuY2hlY2tDb3B5TWFwKHZhbCxjaGVjaykmJlxuLyogRm9yIGEgY29weU1hcCB0byBiZSBhIGtleSwgYWxsIGl0cyBrZXlzIGFuZCB2YWx1ZXMgbXVzdCovXG4vKiBiZSBrZXlzLiBLZXlzIGFscmVhZHkgY2hlY2tlZCBieSBgY2hlY2tDb3B5TWFwYCBzaW5jZSovXG4vKiB0aGF0J3MgYSBjb3B5TWFwIHJlcXVpcmVtZW50IGluIGdlbmVyYWwuKi9cbmV2ZXJ5Q29weU1hcFZhbHVlKHZhbCxjaGVja0l0KSk7XG5cbiB9XG5kZWZhdWx0OntcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgcGFzc2FibGUgdGFnZ2VkICR7cSh0YWcpfSBpcyBub3QgYSBrZXk6ICR7dmFsfWApKTtcblxuIH19XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogQWxsIHJlbW90YWJsZXMgYXJlIGtleXMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEga2V5YCk7XG4gfVxuZGVmYXVsdDp7XG4vKiBVbmV4cGVjdGVkIHRhZ3MgYXJlIGp1c3Qgbm9uLWtleXMsIGJ1dCBhbiB1bmV4cGVjdGVkIHBhc3NTdHlsZSovXG4vKiBpcyBhbHdheXMgYW4gZXJyb3IuKi9cbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHt2YWx9YDtcbiB9fVxuXG4gfTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1ByaW1pdGl2ZUtleSI6WyJpc1ByaW1pdGl2ZUtleSJdLCJhc3NlcnRQcmltaXRpdmVLZXkiOlsiYXNzZXJ0UHJpbWl0aXZlS2V5Il0sImNoZWNrU2NhbGFyS2V5IjpbImNoZWNrU2NhbGFyS2V5Il0sImlzU2NhbGFyS2V5IjpbImlzU2NhbGFyS2V5Il0sImFzc2VydFNjYWxhcktleSI6WyJhc3NlcnRTY2FsYXJLZXkiXSwiY2hlY2tLZXkiOlsiY2hlY2tLZXkiXSwiaXNLZXkiOlsiaXNLZXkiXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSJdLCJjaGVja0NvcHlTZXQiOlsiY2hlY2tDb3B5U2V0Il0sImlzQ29weVNldCI6WyJpc0NvcHlTZXQiXSwiYXNzZXJ0Q29weVNldCI6WyJhc3NlcnRDb3B5U2V0Il0sImdldENvcHlTZXRLZXlzIjpbImdldENvcHlTZXRLZXlzIl0sImV2ZXJ5Q29weVNldEtleSI6WyJldmVyeUNvcHlTZXRLZXkiXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiXSwiY2hlY2tDb3B5QmFnIjpbImNoZWNrQ29weUJhZyJdLCJpc0NvcHlCYWciOlsiaXNDb3B5QmFnIl0sImFzc2VydENvcHlCYWciOlsiYXNzZXJ0Q29weUJhZyJdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyJdLCJldmVyeUNvcHlCYWdFbnRyeSI6WyJldmVyeUNvcHlCYWdFbnRyeSJdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyJdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLCJjaGVja0NvcHlNYXAiOlsiY2hlY2tDb3B5TWFwIl0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwiYXNzZXJ0Q29weU1hcCI6WyJhc3NlcnRDb3B5TWFwIl0sImdldENvcHlNYXBLZXlzIjpbImdldENvcHlNYXBLZXlzIl0sImdldENvcHlNYXBWYWx1ZXMiOlsiZ2V0Q29weU1hcFZhbHVlcyJdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyJdLCJldmVyeUNvcHlNYXBLZXkiOlsiZXZlcnlDb3B5TWFwS2V5Il0sImV2ZXJ5Q29weU1hcFZhbHVlIjpbImV2ZXJ5Q29weU1hcFZhbHVlIl0sImNvcHlNYXBLZXlTZXQiOlsiY29weU1hcEtleVNldCJdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD35sJRdxoAAHcaAAAtAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzeyJpbXBvcnRzIjpbIi4vY2hlY2tLZXkuanMiLCIuL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLCIuL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiY29tcGFyZUtleXMiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsZ2V0VGFnLGNvbXBhcmVSYW5rLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyxhc3NlcnRLZXksYmFnQ29tcGFyZSxzZXRDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV1dXSxbXCIuL21lcmdlLWJhZy1vcGVyYXRvcnMuanNcIiwgW1tcImJhZ0NvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKGJhZ0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzXCIsIFtbXCJzZXRDb21wYXJlXCIsIFskaOKAjV9hID0+IChzZXRDb21wYXJlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuLi90eXBlcycpLktleUNvbXBhcmV9ICovXG5jb25zdCAgICAgICAgY29tcGFyZUtleXM9KGxlZnQscmlnaHQpPT57XG5hc3NlcnRLZXkobGVmdCk7XG5hc3NlcnRLZXkocmlnaHQpO1xuY29uc3QgbGVmdFN0eWxlPXBhc3NTdHlsZU9mKGxlZnQpO1xuY29uc3QgcmlnaHRTdHlsZT1wYXNzU3R5bGVPZihyaWdodCk7XG5pZihsZWZ0U3R5bGUhPT1yaWdodFN0eWxlKXtcbi8qIERpZmZlcmVudCBwYXNzU3R5bGVzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG5yZXR1cm4gTmFOO1xuIH1cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ3N5bWJvbCc6e1xuLyogZm9yIHRoZXNlLCBrZXlzIGNvbXBhcmUgdGhlIHNhbWUgYXMgcmFuayovXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdudW1iZXInOntcbmNvbnN0IHJhbmtDb21wPWNvbXBhcmVSYW5rKGxlZnQscmlnaHQpO1xuaWYocmFua0NvbXA9PT0wKXtcbnJldHVybiAwO1xuIH1cbmlmKE51bWJlci5pc05hTihsZWZ0KXx8TnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG4vKiBOYU4gaXMgZXF1YWwgdG8gaXRzZWxmLCBidXQgaW5jb21tZW5zdXJhdGUgd2l0aCBldmVyeXRoaW5nIGVsc2UqL1xuYXNzZXJ0KCFOdW1iZXIuaXNOYU4obGVmdCl8fCFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbnJldHVybiBOYU47XG4gfVxuLyogQW1vbmcgbm9uLU5hTiBudW1iZXJzLCBrZXkgb3JkZXIgaXMgdGhlIHNhbWUgYXMgcmFuayBvcmRlci4gTm90ZSB0aGF0Ki9cbi8qIGluIGJvdGggb3JkZXJzLCBgLTBgIGlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzIGFzIGAwYC4qL1xucmV0dXJuIHJhbmtDb21wO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5pZihsZWZ0PT09cmlnaHQpe1xucmV0dXJuIDA7XG4gfVxuLyogSWYgdHdvIHJlbW90YWJsZXMgYXJlIG5vdCBpZGVudGljYWwsIHRoZW4gYXMga2V5cyB0aGV5IGFyZSovXG4vKiBpbmNvbW1lbnN1cmF0ZS4qL1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogTGV4aWNvZ3JhcGhpYyBieSBrZXkgb3JkZXIuIFJhbmsgb3JkZXIgb2YgYXJyYXlzIGlzIGxleGljb2dyYXBoaWMgYnkqL1xuLyogcmFuayBvcmRlci4qL1xuLyogQmVjYXVzZSB0aGUgaW52YXJpYW50cyBhYm92ZSBhcHBseSB0byB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5LCovXG4vKiB0aGV5IGFwcGx5IHRvIHRoZSBhcnJheSBhcyBhIHdob2xlLiovXG5jb25zdCBsZW49TWF0aC5taW4obGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY29uc3QgcmVzdWx0PWNvbXBhcmVLZXlzKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vKiBJZiBhbGwgbWF0Y2hpbmcgZWxlbWVudHMgYXJlIGtleUVRLCB0aGVuIGFjY29yZGluZyB0byB0aGVpciBsZW5ndGhzLiovXG4vKiBUaHVzLCBpZiBhcnJheSBYIGlzIGEgcHJlZml4IG9mIGFycmF5IFksIHRoZW4gWCBpcyBzbWFsbGVyIHRoYW4gWS4qL1xucmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBQYXJldG8gcGFydGlhbCBvcmRlciBjb21wYXJpc29uLiovXG5jb25zdCBsZWZ0TmFtZXM9cmVjb3JkTmFtZXMobGVmdCk7XG5jb25zdCByaWdodE5hbWVzPXJlY29yZE5hbWVzKHJpZ2h0KTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFrZXlFUShsZWZ0TmFtZXMscmlnaHROYW1lcykpe1xuLyogSWYgdGhleSBkbyBub3QgaGF2ZSBleGFjdGx5IHRoZSBzYW1lIHByb3BlcnRpZXMsKi9cbi8qIHRoZXkgYXJlIGluY29tbWVuc3VyYXRlLiovXG4vKiBOb3RlIHRoYXQgcmFuayBzb3J0aW5nIG9mIGNvcHlSZWNvcmRzIGdyb3VwcyBhbGwgY29weVJlY29yZHMgd2l0aCovXG4vKiB0aGUgc2FtZSBrZXlzIHRvZ2V0aGVyLCBlbmFibGluZyByYW5nZSBzZWFyY2hpbmcgb3ZlciBjb3B5UmVjb3JkcyovXG4vKiB0byBhdm9pZCBtb3JlIGlycmVsZXZhbnQgb25lcy4qL1xucmV0dXJuIE5hTjtcbiB9XG5jb25zdCBsZWZ0VmFsdWVzPXJlY29yZFZhbHVlcyhsZWZ0LGxlZnROYW1lcyk7XG5jb25zdCByaWdodFZhbHVlcz1yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcyk7XG4vKiBQcmVzdW1lIHRoYXQgYm90aCBjb3B5UmVjb3JkcyBoYXZlIHRoZSBzYW1lIGtleSBvcmRlciovXG4vKiB1bnRpbCBlbmNvdW50ZXJpbmcgYSBwcm9wZXJ0eSBkaXNwcm92aW5nIHRoYXQgaHlwb3RoZXNpcy4qL1xubGV0IHJlc3VsdD0wO1xuZm9yKGxldCBpPTA7aTxsZWZ0VmFsdWVzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGNvbXA9Y29tcGFyZUtleXMobGVmdFZhbHVlc1tpXSxyaWdodFZhbHVlc1tpXSk7XG5pZihOdW1iZXIuaXNOYU4oY29tcCkpe1xucmV0dXJuIE5hTjtcbiB9XG5pZihyZXN1bHQhPT1jb21wJiZjb21wIT09MCl7XG5pZihyZXN1bHQ9PT0wKXtcbnJlc3VsdD1jb21wO1xuIH1lbHNle1xuYXNzZXJ0KFxucmVzdWx0PT09LTEmJmNvbXA9PT0xfHxyZXN1bHQ9PT0xJiZjb21wPT09LTEpO1xuXG5yZXR1cm4gTmFOO1xuIH1cbiB9XG4gfVxuLyogSWYgY29weVJlY29yZCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5UmVjb3JkIFksIHRoZW4gdGhleSBtdXN0IGhhdmUgdGhlKi9cbi8qIHNhbWUgcHJvcGVydHkgbmFtZXMgYW5kIGV2ZXJ5IHZhbHVlIGluIFggbXVzdCBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvKi9cbi8qIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIFkgKHdpdGggYXQgbGVhc3Qgb25lIHZhbHVlIHNtYWxsZXIpLiovXG4vKiBUaGUgcmFuayBvcmRlciBvZiBYIGFuZCBZIGlzIGJhc2VkIG9uIGxleGljb2dyYXBoaWMgcmFuayBvcmRlciBvZiovXG4vKiB0aGVpciB2YWx1ZXMsIGFzIG9yZ2FuaXplZCBieSByZXZlcnNlIGxleGljb2dyYXBoaWMgb3JkZXIgb2YgdGhlaXIqL1xuLyogcHJvcGVydHkgbmFtZXMuKi9cbi8qIFRodXMgaWYgY29tcGFyZUtleXMoWCxZKSA8IDAgdGhlbiBjb21wYXJlUmFuayhYLFkpIDwgMC4qL1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgbGVmdFRhZz1nZXRUYWcobGVmdCk7XG5jb25zdCByaWdodFRhZz1nZXRUYWcocmlnaHQpO1xuaWYobGVmdFRhZyE9PXJpZ2h0VGFnKXtcbi8qIGRpZmZlcmVudCB0YWdzIGFyZSBpbmNvbW1lbnN1cmF0ZSovXG5yZXR1cm4gTmFOO1xuIH1cbnN3aXRjaChsZWZ0VGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogY29weVNldCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5U2V0IFkgd2hlbiBldmVyeSBlbGVtZW50IG9mIFgqL1xuLyogaXMga2V5RVEgdG8gc29tZSBlbGVtZW50IG9mIFkgYW5kIHNvbWUgZWxlbWVudCBvZiBZIGlzKi9cbi8qIG5vdCBrZXlFUSB0byBhbnkgZWxlbWVudCBvZiBYLiovXG5yZXR1cm4gc2V0Q29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbi8qIGNvcHlCYWcgWCBpcyBzbWFsbGVyIHRoYW4gY29weUJhZyBZIHdoZW4gZXZlcnkgZWxlbWVudCBvZiBYKi9cbi8qIG9jY3VycyBubyBtb3JlIHRoYW4gdGhlIGtleUVRIGVsZW1lbnQgb2YgWSwgYW5kIHNvbWUgZWxlbWVudCovXG4vKiBvZiBZIG9jY3VycyBtb3JlIHRoYW4gc29tZSBlbGVtZW50IG9mIFgsIHdoZXJlIGJlaW5nIGFic2VudCovXG4vKiBmcm9tIFggY291bnRzIGFzIG9jY3VycmluZyB6ZXJvIHRpbWVzLiovXG5yZXR1cm4gYmFnQ29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8qIFR3byBjb3B5TWFwcyB0aGF0IGhhdmUgZGlmZmVyZW50IGtleXMgKGFjY29yZGluZyB0byBrZXlFUSkgYXJlKi9cbi8qIGluY29tbWVuc3VyYXRlLiBUaGUgcmVwcmVzZW50YXRpb24gb2YgY29weU1hcHMgaW5jbHVkZXMgdGhlIGtleXMqL1xuLyogZmlyc3QsIGluIHRoZSBzYW1lIHJldmVyc2UgcmFuayBvcmRlciB1c2VkIGJ5IHNldHMuIFRodXMsIGFsbCovXG4vKiBjb3B5TWFwcyB3aXRoIGtleXMgb2YgdGhlIHNhbWUgcmFuayAod2hpY2ggaXMqL1xuLyogbGVzcyBwcmVjaXNlISkgd2lsbCBiZSBncm91cGVkIHRvZ2V0aGVyIHdoZW4gY29weU1hcHMgYXJlIHNvcnRlZCovXG4vKiBieSByYW5rLCBtaW5pbWl6aW5nIHRoZSBudW1iZXIgb2YgbWlzc2VzIHdoZW4gcmFuZ2Ugc2VhcmNoaW5nLiovXG4vKiovXG4vKiBBbW9uZyBjb3B5TWFwcyB3aXRoIHRoZSBzYW1lIGtleXMgKGFjY29yZGluZyB0byBrZXlFUSksIHRoZXkqL1xuLyogY29tcGFyZSBieSBhIGNvcnJlc3BvbmRpbmcgY29tcGFyaXNvbiBvZiB0aGVpciB2YWx1ZXMuIFRodXMsIGFzKi9cbi8qIHdpdGggcmVjb3JkcywgZm9yIHR3byBjb3B5TWFwcyBYIGFuZCBZLCBpZiBgY29tcGFyZUtleXMoWCxZKSA8Ki9cbi8qIDBgIHRoZW4sIGJlY2F1c2UgdGhlc2UgdmFsdWVzIG9iZXkgdGhlIGFib3ZlIGludmFyaWFudHMsIG5vbmUgb2YqL1xuLyogdGhlIHZhbHVlcyBpbiBYIGhhdmUgYSBsYXRlciByYW5rIHRoYW4gdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUqL1xuLyogb2YgWS4gVGh1cywgYGNvbXBhcmVSYW5rKFgsWSkgPD0gMGAuIFRPRE8gaW1wbGVtZW50Ki9cbnRocm93IEZhaWwgYE1hcCBjb21wYXJpc29uIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7bGVmdH0gdnMgJHtyaWdodH1gO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCB0YWcgJHtxKGxlZnRUYWcpfTogJHtsZWZ0fWA7XG4gfX1cblxuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKGxlZnRTdHlsZSl9OiAke2xlZnR9YDtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmNvbXBhcmVLZXlzKGNvbXBhcmVLZXlzKTtcbmhhcmRlbihjb21wYXJlS2V5cyk7XG5cbmNvbnN0ICAgICAgICBrZXlMVD0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPDA7JGjigI1fb25jZS5rZXlMVChrZXlMVCk7XG5oYXJkZW4oa2V5TFQpO1xuXG5jb25zdCAgICAgICAga2V5TFRFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk8PTA7JGjigI1fb25jZS5rZXlMVEUoa2V5TFRFKTtcbmhhcmRlbihrZXlMVEUpO1xuXG5jb25zdCAgICAgICAga2V5RVE9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT09PTA7JGjigI1fb25jZS5rZXlFUShrZXlFUSk7XG5oYXJkZW4oa2V5RVEpO1xuXG5jb25zdCAgICAgICAga2V5R1RFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk+PTA7JGjigI1fb25jZS5rZXlHVEUoa2V5R1RFKTtcbmhhcmRlbihrZXlHVEUpO1xuXG5jb25zdCAgICAgICAga2V5R1Q9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT4wOyRo4oCNX29uY2Uua2V5R1Qoa2V5R1QpO1xuaGFyZGVuKGtleUdUKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyJdLCJrZXlMVCI6WyJrZXlMVCJdLCJrZXlMVEUiOlsia2V5TFRFIl0sImtleUVRIjpbImtleUVRIl0sImtleUdURSI6WyJrZXlHVEUiXSwia2V5R1QiOlsia2V5R1QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVSDC/SoUAAAqFAAAKQAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMva2V5cy9jb3B5QmFnLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRCYWdFbnRyaWVzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIiwiY2hlY2tCYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwibWFrZUJhZ09mRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcImlzUmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG4vKiogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV0gQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ29weUJhZzxLPn0gQ29weUJhZyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleX0gS2V5ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeVxuICoga25vd24gdG8gYmUgc29ydGVkIGJ5IHRoaXMgYGZ1bGxDb21wYXJlYCwgdGhlbiB3ZSBzaG91bGQgZ2V0IGEgbWVtbyBoaXRcbiAqIHJhdGhlciB0aGFuIGEgcmVzb3J0aW5nLiBIb3dldmVyLCBjdXJyZW50bHksIHdlIHN0aWxsIGVudW1lcmF0ZSB0aGUgZW50aXJlXG4gKiBhcnJheSBlYWNoIHRpbWUuXG4gKlxuICogVE9ETzogSWYgZG9pbmcgdGhpcyByZWR1bnRhbnRseSB0dXJucyBvdXQgdG8gYmUgZXhwZW5zaXZlLCB3ZVxuICogY291bGQgbWVtb2l6ZSB0aGlzIG5vLWR1cGxpY2F0ZS1rZXlzIGZpbmRpbmcgYXMgd2VsbCwgaW5kZXBlbmRlbnRcbiAqIG9mIHRoZSBgZnVsbE9yZGVyYCB1c2UgdG8gcmVhY2ggdGhpcyBmaW5kaW5nLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVLZXlzPShiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGNoZWNrKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbi8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbi8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuZnVsbENvbXBhcmU9ZnVsbENvbXBhcmV8fG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbi8qIFNpbmNlIHRoZSBrZXkgaXMgbW9yZSBzaWduaWZpY2FudCB0aGFuIHRoZSB2YWx1ZSAodGhlIGNvdW50KSwqL1xuLyogc29ydGluZyBieSBmdWxsT3JkZXIgaXMgZ3VhcmFudGVlZCB0byBtYWtlIGR1cGxpY2F0ZSBrZXlzKi9cbi8qIGFkamFjZW50IGluZGVwZW5kZW50IG9mIHRoZWlyIGNvdW50cy4qL1xuYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXMsZnVsbENvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1iYWdFbnRyaWVzO1xuZm9yKGxldCBpPTE7aTxsZW5ndGg7aSs9MSl7XG5jb25zdCBrMD1iYWdFbnRyaWVzW2ktMV1bMF07XG5jb25zdCBrMT1iYWdFbnRyaWVzW2ldWzBdO1xuaWYoZnVsbENvbXBhcmUoazAsazEpPT09MCl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gW2Z1bGxDb21wYXJlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmU9dW5kZWZpbmVkKT0+e1xuY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyxmdWxsQ29tcGFyZSxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7W1Bhc3NhYmxlLGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmFzc2VydE5vRHVwbGljYXRlS2V5cyhhc3NlcnROb0R1cGxpY2F0ZUtleXMpO1xuY29uc3QgICAgICAgIGNoZWNrQmFnRW50cmllcz0oYmFnRW50cmllcyxjaGVjayk9PntcbmlmKHBhc3NTdHlsZU9mKGJhZ0VudHJpZXMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtiYWdFbnRyaWVzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChiYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuaykpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5mb3IoY29uc3QgZW50cnkgb2YgYmFnRW50cmllcyl7XG5pZihcbnBhc3NTdHlsZU9mKGVudHJ5KSE9PSdjb3B5QXJyYXknfHxcbmVudHJ5Lmxlbmd0aCE9PTJ8fFxudHlwZW9mIGVudHJ5WzFdIT09J2JpZ2ludCcpXG57XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgYmUgcGFpciBvZiBhIGtleSBhbmQgYSBiaWdpbnQgcmVwcmVzZW50aW5nIGEgY291bnQ6ICR7ZW50cnl9YCk7XG5cbiB9XG5pZihlbnRyeVsxXTwxKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBoYXZlIGEgcG9zaXRpdmUgY291bnQ6ICR7ZW50cnl9YCk7XG5cbiB9XG4gfVxucmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsdW5kZWZpbmVkLGNoZWNrKTtcbiB9OyRo4oCNX29uY2UuY2hlY2tCYWdFbnRyaWVzKGNoZWNrQmFnRW50cmllcyk7XG5oYXJkZW4oY2hlY2tCYWdFbnRyaWVzKTtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJucy1jaGVjayAtLSBkb2Vzbid0IHVuZGVyc3RhbmQgYXNzZXJ0cyovXG4vKipcbiAqIEBwYXJhbSB7W1Bhc3NhYmxlLGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHJldHVybnMge2Fzc2VydHMgYmFnRW50cmllcyBpcyBbUGFzc2FibGUsYmlnaW50XVtdfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0QmFnRW50cmllcz0oYmFnRW50cmllcyk9PntcbmNoZWNrQmFnRW50cmllcyhiYWdFbnRyaWVzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRCYWdFbnRyaWVzKGFzc2VydEJhZ0VudHJpZXMpO1xuaGFyZGVuKGFzc2VydEJhZ0VudHJpZXMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlVG9CYWdFbnRyaWVzPShiYWdFbnRyaWVzTGlzdCk9PntcbmNvbnN0IGJhZ0VudHJpZXM9c29ydEJ5UmFuayhiYWdFbnRyaWVzTGlzdCxjb21wYXJlQW50aVJhbmspO1xuYXNzZXJ0QmFnRW50cmllcyhiYWdFbnRyaWVzKTtcbnJldHVybiBiYWdFbnRyaWVzO1xuIH07JGjigI1fb25jZS5jb2VyY2VUb0JhZ0VudHJpZXMoY29lcmNlVG9CYWdFbnRyaWVzKTtcbmhhcmRlbihjb2VyY2VUb0JhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBiaWdpbnRdPn0gYmFnRW50cnlJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VCYWdPZkVudHJpZXM9KGJhZ0VudHJ5SXRlcik9PlxubWFrZVRhZ2dlZCgnY29weUJhZycsY29lcmNlVG9CYWdFbnRyaWVzKGJhZ0VudHJ5SXRlcikpOyRo4oCNX29uY2UubWFrZUJhZ09mRW50cmllcyhtYWtlQmFnT2ZFbnRyaWVzKTtcbmhhcmRlbihtYWtlQmFnT2ZFbnRyaWVzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIl0sImNoZWNrQmFnRW50cmllcyI6WyJjaGVja0JhZ0VudHJpZXMiXSwiYXNzZXJ0QmFnRW50cmllcyI6WyJhc3NlcnRCYWdFbnRyaWVzIl0sImNvZXJjZVRvQmFnRW50cmllcyI6WyJjb2VyY2VUb0JhZ0VudHJpZXMiXSwibWFrZUJhZ09mRW50cmllcyI6WyJtYWtlQmFnT2ZFbnRyaWVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAod/r+jEAAAoxAAACkAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY29weVNldC5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0RWxlbWVudHMiLCJhc3NlcnROb0R1cGxpY2F0ZXMiLCJjaGVja0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyIsIm1ha2VTZXRPZkVsZW1lbnRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbms7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChpc1JhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbi8qKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5U2V0PEs+fSBDb3B5U2V0ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5fSBLZXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgZWxlbWVudHNgIGlzIGFscmVhZHkga25vd25cbiAqIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0IHJhdGhlclxuICogdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZSBhcnJheVxuICogZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlLGNoZWNrKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbi8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbi8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuZnVsbENvbXBhcmU9ZnVsbENvbXBhcmV8fG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmVsZW1lbnRzPXNvcnRCeVJhbmsoZWxlbWVudHMsZnVsbENvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmZvcihsZXQgaT0xO2k8bGVuZ3RoO2krPTEpe1xuY29uc3QgazA9ZWxlbWVudHNbaS0xXTtcbmNvbnN0IGsxPWVsZW1lbnRzW2ldO1xuaWYoZnVsbENvbXBhcmUoazAsazEpPT09MCl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgdmFsdWUgaGFzIGR1cGxpY2F0ZXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gW2Z1bGxDb21wYXJlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmFzc2VydE5vRHVwbGljYXRlcyhhc3NlcnROb0R1cGxpY2F0ZXMpO1xuY29uc3QgICAgICAgIGNoZWNrRWxlbWVudHM9KGVsZW1lbnRzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoZWxlbWVudHMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIGEgY29weUFycmF5OiAke2VsZW1lbnRzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChlbGVtZW50cyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWApO1xuXG4gfVxucmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaOKAjV9vbmNlLmNoZWNrRWxlbWVudHMoY2hlY2tFbGVtZW50cyk7XG5oYXJkZW4oY2hlY2tFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRFbGVtZW50cz0oZWxlbWVudHMpPT57XG5jaGVja0VsZW1lbnRzKGVsZW1lbnRzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRFbGVtZW50cyhhc3NlcnRFbGVtZW50cyk7XG5oYXJkZW4oYXNzZXJ0RWxlbWVudHMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlVG9FbGVtZW50cz0oZWxlbWVudHNMaXN0KT0+e1xuY29uc3QgZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50c0xpc3QsY29tcGFyZUFudGlSYW5rKTtcbmFzc2VydEVsZW1lbnRzKGVsZW1lbnRzKTtcbnJldHVybiBlbGVtZW50cztcbiB9OyRo4oCNX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVNldE9mRWxlbWVudHM9KGVsZW1lbnRJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5U2V0Jyxjb2VyY2VUb0VsZW1lbnRzKGVsZW1lbnRJdGVyKSk7JGjigI1fb25jZS5tYWtlU2V0T2ZFbGVtZW50cyhtYWtlU2V0T2ZFbGVtZW50cyk7XG5oYXJkZW4obWFrZVNldE9mRWxlbWVudHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAALKJ5teSUAAHklAAA1AAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiLi9jb3B5QmFnLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImJhZ0NvbXBhcmUiLCJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNEaXNqb2ludCIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGFzc2VydE5vRHVwbGljYXRlS2V5cyxtYWtlQmFnT2ZFbnRyaWVzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZUtleXNcIiwgWyRo4oCNX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlS2V5cyA9ICRo4oCNX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLCBbJGjigI1fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleUNvbXBhcmlzb259IEtleUNvbXBhcmlzb24gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlJhbmtDb21wYXJlfSBSYW5rQ29tcGFyZSAqL1xuXG4vKiBCYXNlZCBvbiBtZXJnZS1zZXQtb3BlcmF0b3JzLmpzLCBidXQgYWx0ZXJlZCBmb3IgdGhlIGJhZyByZXByZXNlbnRhdGlvbi4qL1xuLyogVE9ETyBzaGFyZSBtb3JlIGNvZGUgd2l0aCBtZXJnZS1zZXQtb3BlcmF0b3JzLmpzLCByYXRoZXIgdGhhbiovXG4vKiBkdXBsaWNhdGluZyB3aXRoIGNoYW5nZXMuKi9cblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHkgcmFuayBzb3J0ZWQgYnkgYHJhbmtDb21wYXJlYCwgd2hlcmVcbiAqIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGJhZ0VudHJpZXMgd2hvc2Uga2V5cyBhcmUgdGllZCBmb3IgdGhlIHNhbWVcbiAqIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBiYWdFbnRyaWVzIGluIG9yZGVyXG4gKiBhY2NvcmRpbmcgdG8gYGZ1bGxPcmRlcmAsIHdoaWNoIHNob3VsZCBkaWZmZXIgZnJvbSBgcmFua09yZGVyYCBvbmx5XG4gKiBieSBiZWluZyBtb3JlIHByZWNpc2UuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byByZXNvcnRpbmcgdGhlIGVudGlyZSBgYmFnRW50cmllc2AgYXJyYXlcbiAqIGFjY29yZGluZ1xuICogdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgYmFnV2luZG93UmVzb3J0PShiYWdFbnRyaWVzLHJhbmtDb21wYXJlLGZ1bGxDb21wYXJlKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChiYWdFbnRyaWVzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09YmFnRW50cmllcztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vKiBmYWxsIHRocm91Z2gqL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgZW50cnk9YmFnRW50cmllc1tpXTtcbmxldCBqPWkrMTtcbndoaWxlKFxuajxsZW5ndGgmJlxucmFua0NvbXBhcmUoZW50cnlbMF0sYmFnRW50cmllc1tqXVswXSk9PT0wKVxue1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6ZW50cnl9KTtcbiB9XG5jb25zdCBzaW1pbGFyUnVuPWJhZ0VudHJpZXMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4vKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4vKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG5hc3NlcnROb0R1cGxpY2F0ZUtleXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4vKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4vKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbi8qIGFzIGlzLiovXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpbbnVsbCwwbl19KTtcbiB9XG4gfX0pfSk7XG5cblxuIH07XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB3aG9zZSBpdGVyYXRpb24gcmVzdWx0cyBhcmUgW2tleSwgeENvdW50LCB5Q291bnRdIHR1cGxlc1xuICogcmVwcmVzZW50aW5nIHRoZSBuZXh0IGtleSBpbiB0aGUgbG9jYWwgZnVsbCBvcmRlciwgYXMgd2VsbCBhcyBob3cgbWFueVxuICogdGltZXMgaXQgb2NjdXJyZWQgaW4gdGhlIHggaW5wdXQgaXRlcmF0b3IgYW5kIHRoZSB5IGlucHV0IGl0ZXJhdG9yLlxuICpcbiAqIEZvciBzZXRzLCB0aGVzZSBjb3VudHMgYXJlIGFsd2F5cyAwIG9yIDEsIGJ1dCB0aGlzIHJlcHJlc2VudGF0aW9uXG4gKiBnZW5lcmFsaXplcyBuaWNlbHkgZm9yIGJhZ3MuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB4YmFnRW50cmllc1xuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHliYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZT0oeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5jb25zdCB4cz1iYWdXaW5kb3dSZXNvcnQoeGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPWJhZ1dpbmRvd1Jlc29ydCh5YmFnRW50cmllcyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuLyogVGhlc2Ugc2l4IGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbi8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4vKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB4O1xubGV0IHhjO1xubGV0IHhEb25lO1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHk7XG5sZXQgeWM7XG5sZXQgeURvbmU7XG5cbmNvbnN0IHhpPXhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtcbmRvbmU6eERvbmUsXG52YWx1ZTpbeCx4Y119PVxueGkubmV4dCgpKTtcbiB9O1xubmV4dFgoKTtcblxuY29uc3QgeWk9eXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFk9KCk9PntcbiF5RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe1xuZG9uZTp5RG9uZSxcbnZhbHVlOlt5LHljXX09XG55aS5uZXh0KCkpO1xuIH07XG5uZXh0WSgpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbmxldCBkb25lPWZhbHNlO1xuLyoqIEB0eXBlIHtbVCxiaWdpbnQsYmlnaW50XX0gKi9cbmxldCB2YWx1ZTtcbmlmKHhEb25lJiZ5RG9uZSl7XG5kb25lPXRydWU7XG4vKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG52YWx1ZT1bbnVsbCwwbiwwbl07XG4gfWVsc2UgaWYoeERvbmUpe1xuLyogb25seSB5cyBhcmUgbGVmdCovXG52YWx1ZT1beSwwbix5Y107XG5uZXh0WSgpO1xuIH1lbHNlIGlmKHlEb25lKXtcbi8qIG9ubHkgeHMgYXJlIGxlZnQqL1xudmFsdWU9W3gseGMsMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbmNvbnN0IGNvbXA9ZnVsbENvbXBhcmUoeCx5KTtcbmlmKGNvbXA9PT0wKXtcbi8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbnZhbHVlPVt4LHhjLHljXTtcbm5leHRYKCk7XG5uZXh0WSgpO1xuIH1lbHNlIGlmKGNvbXA8MCl7XG4vKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG52YWx1ZT1beCx4Yywwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuY29tcD4wfHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xudmFsdWU9W3ksMG4seWNdO1xubmV4dFkoKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZSx2YWx1ZX0pO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5oYXJkZW4obWVyZ2UpO1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzU3VwZXJzZXQgYXMgd2VsbC4qL1xuLyogVGhlIGdlbmVyYWxpemF0aW9uIGlzIGZyZWUuKi9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBiYWdJdGVySXNTdXBlcmJhZz0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yzx5Yyl7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcmJhZyBvZiB5Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc0Rpc2pvaW50IGFzIHdlbGwuKi9cbi8qIFRoZSBjb2RlIGlzIGlkZW50aWNhbC4qL1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc0Rpc2pvaW50PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0xbiYmeWM+PTFuKXtcbi8qIFNvbWV0aGluZyBpbiBib3RoLCBzbyBub3QgZGlzam9pbnQqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlckNvbXBhcmUgYXMgd2VsbC4qL1xuLyogVGhlIGdlbmVyYWxpemF0aW9uIGlzIGZyZWUuKi9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtLZXlDb21wYXJpc29ufVxuICovXG5jb25zdCBiYWdJdGVyQ29tcGFyZT0oeHlpKT0+e1xubGV0IGxvbmVZPWZhbHNlO1xubGV0IGxvbmVYPWZhbHNlO1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yzx5Yyl7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcmJhZyBvZiB5Ki9cbmxvbmVZPXRydWU7XG4gfVxuaWYoeGM+eWMpe1xuLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJiYWcgb2YgeCovXG5sb25lWD10cnVlO1xuIH1cbmlmKGxvbmVYJiZsb25lWSl7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG5pZihsb25lWCl7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihsb25lWSl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbiFsb25lWCYmIWxvbmVZfHxcbkZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLGxvbmVZXSl9YDtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludCxiaWdpbnRdW119IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlclVuaW9uPSh4eWkpPT57XG4vKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5yZXN1bHQucHVzaChbbSx4Yyt5Y10pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlckludGVyc2VjdGlvbj0oeHlpKT0+e1xuLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuY29uc3QgbWM9eGM8PXljP3hjOnljO1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0PSh4eWkpPT57XG4vKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5jb25zdCBtYz14Yy15Yztcbm1jPj0wbnx8RmFpbCBgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG5pZihtYz49MW4pe1xuLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbnJlc3VsdC5wdXNoKFttLG1jXSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgbWVyZ2VpZnk9KGJhZ0l0ZXJPcCk9Pih4YmFnRW50cmllcyx5YmFnRW50cmllcyk9PlxuYmFnSXRlck9wKG1lcmdlKHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKSk7XG5cbmNvbnN0IGJhZ0VudHJpZXNJc1N1cGVyYmFnPW1lcmdlaWZ5KGJhZ0l0ZXJJc1N1cGVyYmFnKTtcbmNvbnN0IGJhZ0VudHJpZXNJc0Rpc2pvaW50PW1lcmdlaWZ5KGJhZ0l0ZXJJc0Rpc2pvaW50KTtcbmNvbnN0IGJhZ0VudHJpZXNDb21wYXJlPW1lcmdlaWZ5KGJhZ0l0ZXJDb21wYXJlKTtcbmNvbnN0IGJhZ0VudHJpZXNVbmlvbj1tZXJnZWlmeShiYWdJdGVyVW5pb24pO1xuY29uc3QgYmFnRW50cmllc0ludGVyc2VjdGlvbj1tZXJnZWlmeShiYWdJdGVySW50ZXJzZWN0aW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0PW1lcmdlaWZ5KGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3QmFnaWZ5PShiYWdFbnRyaWVzT3ApPT4oeGJhZyx5YmFnKT0+XG5iYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLHliYWcucGF5bG9hZCk7XG5cbmNvbnN0IGJhZ2lmeT0oYmFnRW50cmllc09wKT0+KHhiYWcseWJhZyk9PlxubWFrZUJhZ09mRW50cmllcyhiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLHliYWcucGF5bG9hZCkpO1xuXG5jb25zdCAgICAgICAgYmFnSXNTdXBlcmJhZz1yYXdCYWdpZnkoYmFnRW50cmllc0lzU3VwZXJiYWcpOyRo4oCNX29uY2UuYmFnSXNTdXBlcmJhZyhiYWdJc1N1cGVyYmFnKTtcbmNvbnN0ICAgICAgICBiYWdJc0Rpc2pvaW50PXJhd0JhZ2lmeShiYWdFbnRyaWVzSXNEaXNqb2ludCk7JGjigI1fb25jZS5iYWdJc0Rpc2pvaW50KGJhZ0lzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIGJhZ0NvbXBhcmU9cmF3QmFnaWZ5KGJhZ0VudHJpZXNDb21wYXJlKTskaOKAjV9vbmNlLmJhZ0NvbXBhcmUoYmFnQ29tcGFyZSk7XG5jb25zdCAgICAgICAgYmFnVW5pb249YmFnaWZ5KGJhZ0VudHJpZXNVbmlvbik7JGjigI1fb25jZS5iYWdVbmlvbihiYWdVbmlvbik7XG5jb25zdCAgICAgICAgYmFnSW50ZXJzZWN0aW9uPWJhZ2lmeShiYWdFbnRyaWVzSW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLmJhZ0ludGVyc2VjdGlvbihiYWdJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIGJhZ0Rpc2pvaW50U3VidHJhY3Q9YmFnaWZ5KGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLmJhZ0Rpc2pvaW50U3VidHJhY3QoYmFnRGlzam9pbnRTdWJ0cmFjdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIl0sImJhZ0lzRGlzam9pbnQiOlsiYmFnSXNEaXNqb2ludCJdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiXSwiYmFnVW5pb24iOlsiYmFnVW5pb24iXSwiYmFnSW50ZXJzZWN0aW9uIjpbImJhZ0ludGVyc2VjdGlvbiJdLCJiYWdEaXNqb2ludFN1YnRyYWN0IjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIvZ1Up4oAACeKAAANQAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIi4vY29weVNldC5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzVW5pb24iLCJzZXRDb21wYXJlIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssYXNzZXJ0Tm9EdXBsaWNhdGVzLG1ha2VTZXRPZkVsZW1lbnRzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5U2V0LmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZXNcIiwgWyRo4oCNX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlcyA9ICRo4oCNX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5Q29tcGFyaXNvbn0gS2V5Q29tcGFyaXNvbiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBlbGVtZW50c2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZSB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBlbGVtZW50cyB0aWVkIGZvciB0aGUgc2FtZSByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgZWxlbWVudHMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBlbGVtZW50c2AgYXJyYXkgYWNjb3JkaW5nXG4gKiAgdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0IHdpbmRvd1Jlc29ydD0oZWxlbWVudHMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG5hc3NlcnRSYW5rU29ydGVkKGVsZW1lbnRzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZWxlbWVudHM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLyogZmFsbCB0aHJvdWdoKi9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IHZhbHVlPWVsZW1lbnRzW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoajxsZW5ndGgmJnJhbmtDb21wYXJlKHZhbHVlLGVsZW1lbnRzW2pdKT09PTApe1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9XG5jb25zdCBzaW1pbGFyUnVuPWVsZW1lbnRzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuYXNzZXJ0Tm9EdXBsaWNhdGVzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbi8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4vKiBhcyBpcy4qL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6bnVsbH0pO1xuIH1cbiB9fSl9KTtcblxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHdob3NlIGl0ZXJhdGlvbiByZXN1bHRzIGFyZSBba2V5LCB4Q291bnQsIHlDb3VudF0gdHVwbGVzXG4gKiByZXByZXNlbnRpbmcgdGhlIG5leHQga2V5IGluIHRoZSBsb2NhbCBmdWxsIG9yZGVyLCBhcyB3ZWxsIGFzIGhvdyBtYW55XG4gKiB0aW1lcyBpdCBvY2N1cnJlZCBpbiB0aGUgeCBpbnB1dCBpdGVyYXRvciBhbmQgdGhlIHkgaW5wdXQgaXRlcmF0b3IuXG4gKlxuICogRm9yIHNldHMsIHRoZXNlIGNvdW50cyBhcmUgYWx3YXlzIDAgb3IgMSwgYnV0IHRoaXMgcmVwcmVzZW50YXRpb25cbiAqIGdlbmVyYWxpemVzIG5pY2VseSBmb3IgYmFncy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IHhlbGVtZW50c1xuICogQHBhcmFtIHtUW119IHllbGVtZW50c1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2U9KHhlbGVtZW50cyx5ZWxlbWVudHMpPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5jb25zdCB4cz13aW5kb3dSZXNvcnQoeGVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5jb25zdCB5cz13aW5kb3dSZXNvcnQoeWVsZW1lbnRzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vKiBUaGVzZSBmb3VyIGBsZXRgIHZhcmlhYmxlcyBhcmUgYnVmZmVyaW5nIG9uZSBhaGVhZCBmcm9tIHRoZSB1bmRlcmx5aW5nKi9cbi8qIGl0ZXJhdG9ycy4gRWFjaCBpdGVyYXRpb24gcmVwb3J0cyBvbmUgb3IgdGhlIG90aGVyIG9yIGJvdGgsIGFuZCovXG4vKiB0aGVuIHJlZmlsbHMgdGhlIGJ1ZmZlcnMgb2YgdGhvc2UgaXQgYWR2YW5jZWQuKi9cbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB4O1xubGV0IHhEb25lO1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHk7XG5sZXQgeURvbmU7XG5cbmNvbnN0IHhpPXhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnhEb25lLHZhbHVlOnh9PXhpLm5leHQoKSk7XG4gfTtcbm5leHRYKCk7XG5cbmNvbnN0IHlpPXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnlEb25lLHZhbHVlOnl9PXlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtib29sZWFufSAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLyogb25seSB4cyBhcmUgbGVmdCovXG52YWx1ZT1beCwxbiwwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuY29uc3QgY29tcD1mdWxsQ29tcGFyZSh4LHkpO1xuaWYoY29tcD09PTApe1xuLyogeCBhbmQgeSBhcmUgZXF1aXZhbGVudCwgc28gcmVwb3J0IGJvdGgqL1xudmFsdWU9W3gsMW4sMW5dO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vKiB5IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG5jb21wPjB8fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG52YWx1ZT1beSwwbiwxbl07XG5uZXh0WSgpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lLHZhbHVlfSk7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTtcbmhhcmRlbihtZXJnZSk7XG5cbmNvbnN0IGl0ZXJJc1N1cGVyc2V0PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMsX3ljXW9mIHh5aSl7XG5pZih4Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtLZXlDb21wYXJpc29ufVxuICovXG5jb25zdCBpdGVyQ29tcGFyZT0oeHlpKT0+e1xubGV0IGxvbmVZPWZhbHNlO1xubGV0IGxvbmVYPWZhbHNlO1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xubG9uZVk9dHJ1ZTtcbiB9XG5pZih5Yz09PTBuKXtcbi8qIHNvbWV0aGluZyBpbiB4IGlzIG5vdCBpbiB5LCBzbyB5IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHgqL1xubG9uZVg9dHJ1ZTtcbiB9XG5pZihsb25lWCYmbG9uZVkpe1xucmV0dXJuIE5hTjtcbiB9XG4gfVxuaWYobG9uZVgpe1xucmV0dXJuIDE7XG4gfWVsc2UgaWYobG9uZVkpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG4hbG9uZVgmJiFsb25lWXx8XG5GYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCxsb25lWV0pfWA7XG5yZXR1cm4gMDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlclVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTBuKXtcbnJlc3VsdC5wdXNoKG0pO1xuIH1lbHNle1xueWM+PTBufHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG4vKiBpZiB4IGFuZCB5IHdlcmUgYm90aCByZWFkeSwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCBhbmQqL1xuLyogYWJvdmUgY2xhdXNlIGFscmVhZHkgdG9vayBjYXJlIG9mIGl0LiBPdGhlcndpc2UgcHVzaCBoZXJlLiovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyRGlzam9pbnRVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnhjPT09MG58fHljPT09MG58fEZhaWwgYFNldHMgbXVzdCBub3QgaGF2ZSBjb21tb24gZWxlbWVudHM6ICR7bX1gO1xuaWYoeGM+PTFuKXtcbnJlc3VsdC5wdXNoKG0pO1xuIH1lbHNle1xueWM+PTFufHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb3VudCAke3EoeWMpfWA7XG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVySW50ZXJzZWN0aW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLyogSWYgdGhleSBhcmUgYm90aCBwcmVzZW50LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50Ki9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFN1YnRyYWN0PSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xueGM+PTFufHxGYWlsIGByaWdodCBlbGVtZW50ICR7bX0gd2FzIG5vdCBpbiBsZWZ0YDtcbmlmKHljPT09MG4pe1xuLyogdGhlIHggd2FzIG5vdCBpbiB5Ki9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IG1lcmdlaWZ5PShpdGVyT3ApPT4oeGVsZW1lbnRzLHllbGVtZW50cyk9PlxuaXRlck9wKG1lcmdlKHhlbGVtZW50cyx5ZWxlbWVudHMpKTtcblxuY29uc3QgICAgICAgIGVsZW1lbnRzSXNTdXBlcnNldD1tZXJnZWlmeShpdGVySXNTdXBlcnNldCk7JGjigI1fb25jZS5lbGVtZW50c0lzU3VwZXJzZXQoZWxlbWVudHNJc1N1cGVyc2V0KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0lzRGlzam9pbnQ9bWVyZ2VpZnkoaXRlcklzRGlzam9pbnQpOyRo4oCNX29uY2UuZWxlbWVudHNJc0Rpc2pvaW50KGVsZW1lbnRzSXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgZWxlbWVudHNDb21wYXJlPW1lcmdlaWZ5KGl0ZXJDb21wYXJlKTskaOKAjV9vbmNlLmVsZW1lbnRzQ29tcGFyZShlbGVtZW50c0NvbXBhcmUpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzVW5pb249bWVyZ2VpZnkoaXRlclVuaW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzVW5pb24oZWxlbWVudHNVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFVuaW9uPW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFVuaW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzRGlzam9pbnRVbmlvbihlbGVtZW50c0Rpc2pvaW50VW5pb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSW50ZXJzZWN0aW9uPW1lcmdlaWZ5KGl0ZXJJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2UuZWxlbWVudHNJbnRlcnNlY3Rpb24oZWxlbWVudHNJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdD1tZXJnZWlmeShpdGVyRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5lbGVtZW50c0Rpc2pvaW50U3VidHJhY3QoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3U2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxuZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKTtcblxuY29uc3Qgc2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxubWFrZVNldE9mRWxlbWVudHMoZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBzZXRJc1N1cGVyc2V0PXJhd1NldGlmeShlbGVtZW50c0lzU3VwZXJzZXQpOyRo4oCNX29uY2Uuc2V0SXNTdXBlcnNldChzZXRJc1N1cGVyc2V0KTtcbmNvbnN0ICAgICAgICBzZXRJc0Rpc2pvaW50PXJhd1NldGlmeShlbGVtZW50c0lzRGlzam9pbnQpOyRo4oCNX29uY2Uuc2V0SXNEaXNqb2ludChzZXRJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBzZXRDb21wYXJlPXJhd1NldGlmeShlbGVtZW50c0NvbXBhcmUpOyRo4oCNX29uY2Uuc2V0Q29tcGFyZShzZXRDb21wYXJlKTtcbmNvbnN0ICAgICAgICBzZXRVbmlvbj1zZXRpZnkoZWxlbWVudHNVbmlvbik7JGjigI1fb25jZS5zZXRVbmlvbihzZXRVbmlvbik7XG5jb25zdCAgICAgICAgc2V0RGlzam9pbnRVbmlvbj1zZXRpZnkoZWxlbWVudHNEaXNqb2ludFVuaW9uKTskaOKAjV9vbmNlLnNldERpc2pvaW50VW5pb24oc2V0RGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgc2V0SW50ZXJzZWN0aW9uPXNldGlmeShlbGVtZW50c0ludGVyc2VjdGlvbik7JGjigI1fb25jZS5zZXRJbnRlcnNlY3Rpb24oc2V0SW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFN1YnRyYWN0PXNldGlmeShlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2Uuc2V0RGlzam9pbnRTdWJ0cmFjdChzZXREaXNqb2ludFN1YnRyYWN0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJlbGVtZW50c0lzU3VwZXJzZXQiOlsiZWxlbWVudHNJc1N1cGVyc2V0Il0sImVsZW1lbnRzSXNEaXNqb2ludCI6WyJlbGVtZW50c0lzRGlzam9pbnQiXSwiZWxlbWVudHNDb21wYXJlIjpbImVsZW1lbnRzQ29tcGFyZSJdLCJlbGVtZW50c1VuaW9uIjpbImVsZW1lbnRzVW5pb24iXSwiZWxlbWVudHNEaXNqb2ludFVuaW9uIjpbImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLCJlbGVtZW50c0ludGVyc2VjdGlvbiI6WyJlbGVtZW50c0ludGVyc2VjdGlvbiJdLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiOlsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sInNldElzU3VwZXJzZXQiOlsic2V0SXNTdXBlcnNldCJdLCJzZXRJc0Rpc2pvaW50IjpbInNldElzRGlzam9pbnQiXSwic2V0Q29tcGFyZSI6WyJzZXRDb21wYXJlIl0sInNldFVuaW9uIjpbInNldFVuaW9uIl0sInNldERpc2pvaW50VW5pb24iOlsic2V0RGlzam9pbnRVbmlvbiJdLCJzZXRJbnRlcnNlY3Rpb24iOlsic2V0SW50ZXJzZWN0aW9uIl0sInNldERpc2pvaW50U3VidHJhY3QiOlsic2V0RGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACJDDsFM8MAADPDAAA1AAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL2tleXMvY29tcGFyZUtleXMuanMiLCIuLi91dGlscy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJNIiwiYXNzZXJ0UGF0dGVybiIsImNoZWNrTWF0Y2hlcyIsImRlZmF1bHRMaW1pdHMiLCJnZXRSYW5rQ292ZXIiLCJpc1BhdHRlcm4iLCJtYXRjaGVzIiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsRmFyLGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGhhc093blByb3BlcnR5T2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLGNvbXBhcmVSYW5rLGdldFBhc3NTdHlsZUNvdmVyLGludGVyc2VjdFJhbmtDb3ZlcnMsdW5pb25SYW5rQ292ZXJzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyxpZGVudENoZWNrZXIsYXBwbHlMYWJlbGluZ0Vycm9yLGZyb21VbmlxdWVFbnRyaWVzLGxpc3REaWZmZXJlbmNlLGtleUVRLGtleUdULGtleUdURSxrZXlMVCxrZXlMVEUsYXNzZXJ0S2V5LGNoZWNrS2V5LGlzS2V5LGNoZWNrU2NhbGFyS2V5LGNoZWNrQ29weVNldCxjaGVja0NvcHlNYXAsY29weU1hcEtleVNldCxjaGVja0NvcHlCYWc7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dLFtcImdldFBhc3NTdHlsZUNvdmVyXCIsIFskaOKAjV9hID0+IChnZXRQYXNzU3R5bGVDb3ZlciA9ICRo4oCNX2EpXV0sW1wiaW50ZXJzZWN0UmFua0NvdmVyc1wiLCBbJGjigI1fYSA9PiAoaW50ZXJzZWN0UmFua0NvdmVycyA9ICRo4oCNX2EpXV0sW1widW5pb25SYW5rQ292ZXJzXCIsIFskaOKAjV9hID0+ICh1bmlvblJhbmtDb3ZlcnMgPSAkaOKAjV9hKV1dLFtcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdXRpbHMuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJhcHBseUxhYmVsaW5nRXJyb3JcIiwgWyRo4oCNX2EgPT4gKGFwcGx5TGFiZWxpbmdFcnJvciA9ICRo4oCNX2EpXV0sW1wiZnJvbVVuaXF1ZUVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjigI1fYSldXSxbXCJsaXN0RGlmZmVyZW5jZVwiLCBbJGjigI1fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJrZXlHVFwiLCBbJGjigI1fYSA9PiAoa2V5R1QgPSAkaOKAjV9hKV1dLFtcImtleUdURVwiLCBbJGjigI1fYSA9PiAoa2V5R1RFID0gJGjigI1fYSldXSxbXCJrZXlMVFwiLCBbJGjigI1fYSA9PiAoa2V5TFQgPSAkaOKAjV9hKV1dLFtcImtleUxURVwiLCBbJGjigI1fYSA9PiAoa2V5TFRFID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0tleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tLZXkgPSAkaOKAjV9hKV1dLFtcImlzS2V5XCIsIFskaOKAjV9hID0+IChpc0tleSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5TWFwXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlNYXAgPSAkaOKAjV9hKV1dLFtcImNvcHlNYXBLZXlTZXRcIiwgWyRo4oCNX2EgPT4gKGNvcHlNYXBLZXlTZXQgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5QmFnID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5jb25zdHtlbnRyaWVzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIHtXZWFrU2V0PFBhdHRlcm4+fSAqL1xuY29uc3QgcGF0dGVybk1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTWF0Y2ggSGVscGVycyBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEZvciBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gYE1gICovXG5sZXQgTU07XG5cbi8qKlxuICogVGhlIGFjdHVhbCBkZWZhdWx0IHZhbHVlcyBoZXJlIGFyZSwgYXQgdGhlIHByZXNlbnQgdGltZSwgZmFpcmx5XG4gKiBhcmJpdHJhcnkgY2hvaWNlcyBhbmQgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBzZXR0bGUgZG93bi4gT2YgY291cnNlXG4gKiBhdCBzb21lIHBvaW50IHdlJ2xsIG5lZWQgdG8gc3RvcCBjaGFuZ2luZyB0aGVtLiBCdXQgd2Ugc2hvdWxkIGZpcnN0XG4gKiBzZWUgaG93IG91ciBzeXN0ZW0gaG9sZHMgdXAgd2l0aCB0aGVzZSBjaG9pY2VzLiBUaGUgbWFpbiBjcml0ZXJpYVxuICogaXMgdGhhdCB0aGV5IGJlIGJpZyBlbm91Z2ggdGhhdCBcIm5vcm1hbFwiIGlubm9jZW50IHByb2dyYW1zIHJhcmVseVxuICogZW5jb3VudGVyIHRoZXNlIGxpbWl0cy5cbiAqXG4gKiBFeHBvcnRlZCBwcmltYXJpbHkgZm9yIHRlc3RpbmcuXG4gKi9cbmNvbnN0ICAgICAgICBkZWZhdWx0TGltaXRzPWhhcmRlbih7XG5kZWNpbWFsRGlnaXRzTGltaXQ6MTAwLFxuc3RyaW5nTGVuZ3RoTGltaXQ6MTAwXzAwMCxcbnN5bWJvbE5hbWVMZW5ndGhMaW1pdDoxMDAsXG5udW1Qcm9wZXJ0aWVzTGltaXQ6ODAsXG5wcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdDoxMDAsXG5hcnJheUxlbmd0aExpbWl0OjEwXzAwMCxcbm51bVNldEVsZW1lbnRzTGltaXQ6MTBfMDAwLFxubnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdDoxMF8wMDAsXG5udW1NYXBFbnRyaWVzTGltaXQ6NTAwMH0pO1xuXG5cbi8qKlxuICogVXNlIHRoZSByZXN1bHQgb25seSB0byBnZXQgdGhlIGxpbWl0cyB5b3UgbmVlZCBieSBkZXN0cnVjdHVyaW5nLlxuICogVGh1cywgdGhlIHJlc3VsdCBvbmx5IG5lZWRzIHRvIHN1cHBvcnQgZGVzdHJ1Y3R1cmluZy4gVGhlIGN1cnJlbnRcbiAqIGltcGxlbWVudGF0aW9uIHVzZXMgaW5oZXJpdGFuY2UgYXMgYSBjaGVhcCBoYWNrLlxuICpcbiAqIEBwYXJhbSB7TGltaXRzfSBbbGltaXRzXVxuICogQHJldHVybnMge0FsbExpbWl0c31cbiAqLyRo4oCNX29uY2UuZGVmYXVsdExpbWl0cyhkZWZhdWx0TGltaXRzKTtcbmNvbnN0IGxpbWl0PShsaW1pdHM9e30pPT5cbi8qKiBAdHlwZSB7QWxsTGltaXRzfSAqL2hhcmRlbih7X19wcm90b19fOmRlZmF1bHRMaW1pdHMsLi4ubGltaXRzfSk7XG5cbmNvbnN0IGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0PShcbnBheWxvYWQsXG5tYWluUGF5bG9hZFNoYXBlLFxuY2hlY2ssXG5sYWJlbCk9Plxue1xuYXNzZXJ0KEFycmF5LmlzQXJyYXkobWFpblBheWxvYWRTaGFwZSkpO1xuaWYoIUFycmF5LmlzQXJyYXkocGF5bG9hZCkpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7cShsYWJlbCl9IHBheWxvYWQgbXVzdCBiZSBhbiBhcnJheTogJHtwYXlsb2FkfWApO1xuIH1cblxuLyogV2FzIHRoZSBmb2xsb3dpbmcsIGJ1dCBpdHMgb3ZlcnVzZSBvZiBwYXR0ZXJucyBjYXVzZWQgYW4gaW5maW5pdGUgcmVncmVzcyovXG4vKiBjb25zdCBwYXlsb2FkTGltaXRTaGFwZSA9IGhhcmRlbigqL1xuLyogTS5zcGxpdCgqL1xuLyogbWFpblBheWxvYWRTaGFwZSwqL1xuLyogTS5wYXJ0aWFsKGhhcmRlbihbTS5yZWNvcmRPZihNLnN0cmluZygpLCBNLm51bWJlcigpKV0pLCBoYXJkZW4oW10pKSwqL1xuLyogKSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGNoZWNrTWF0Y2hlcyhwYXlsb2FkLCBwYXlsb2FkTGltaXRTaGFwZSwgY2hlY2ssIGxhYmVsKTsqL1xuXG5jb25zdCBtYWluTGVuZ3RoPW1haW5QYXlsb2FkU2hhcGUubGVuZ3RoO1xuaWYoIShwYXlsb2FkLmxlbmd0aD09PW1haW5MZW5ndGh8fHBheWxvYWQubGVuZ3RoPT09bWFpbkxlbmd0aCsxKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtxKGxhYmVsKX0gcGF5bG9hZCB1bmV4cGVjdGVkIHNpemU6ICR7cGF5bG9hZH1gKTtcbiB9XG5jb25zdCBsaW1pdHM9cGF5bG9hZFttYWluTGVuZ3RoXTtcbnBheWxvYWQ9aGFyZGVuKHBheWxvYWQuc2xpY2UoMCxtYWluTGVuZ3RoKSk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuaWYoIWNoZWNrTWF0Y2hlcyhwYXlsb2FkLG1haW5QYXlsb2FkU2hhcGUsY2hlY2ssbGFiZWwpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5pZihsaW1pdHM9PT11bmRlZmluZWQpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuKFxuKHBhc3NTdHlsZU9mKGxpbWl0cyk9PT0nY29weVJlY29yZCd8fFxuY2hlY2soZmFsc2UsWCBgTGltaXRzIG11c3QgYmUgYSByZWNvcmQ6ICR7cShsaW1pdHMpfWApKSYmXG5lbnRyaWVzKGxpbWl0cykuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5cbnBhc3NTdHlsZU9mKHZhbHVlKT09PSdudW1iZXInfHxcbmNoZWNrKGZhbHNlLFggYFZhbHVlIG9mIGxpbWl0ICR7cShrZXkpfSBidXQgYmUgYSBudW1iZXI6ICR7cSh2YWx1ZSl9YCkpKTtcblxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcGFyYW0ge251bWJlcn0gZGVjaW1hbERpZ2l0c0xpbWl0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbmNvbnN0IGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0PShzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spPT57XG5pZihcbk1hdGguZmxvb3IoTWF0aC5sb2cxMChNYXRoLmFicyhOdW1iZXIoc3BlY2ltZW4pKSkpKzE8PVxuZGVjaW1hbERpZ2l0c0xpbWl0KVxue1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBiaWdpbnQgJHtzcGVjaW1lbn0gbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtkZWNpbWFsRGlnaXRzTGltaXR9IGRpZ2l0c2ApO1xuXG4gfTtcblxuLyoqXG4gKiBAcmV0dXJucyB7UGF0dGVybktpdH1cbiAqL1xuY29uc3QgbWFrZVBhdHRlcm5LaXQ9KCk9Pntcbi8qKlxuICogSWYgdGhpcyBpcyBhIHJlY29nbml6ZWQgbWF0Y2ggdGFnLCByZXR1cm4gdGhlIE1hdGNoSGVscGVyLlxuICogT3RoZXJ3aXNlIHJlc3VsdCB1bmRlZmluZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge01hdGNoSGVscGVyIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBtYXliZU1hdGNoSGVscGVyPSh0YWcpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5IZWxwZXJzQnlNYXRjaFRhZ1t0YWddO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmd9IEtpbmRcbiAqIEl0IGlzIGVpdGhlciBhIFBhc3NTdHlsZSBvdGhlciB0aGFuICd0YWdnZWQnLCBvciwgaWYgdGhlIHVuZGVybHlpbmdcbiAqIFBhc3NTdHlsZSBpcyAndGFnZ2VkJywgdGhlbiB0aGUgYGdldFRhZ2AgdmFsdWUgZm9yIHRhZ3MgdGhhdCBhcmVcbiAqIHJlY29nbml6ZWQgYXQgdGhlIHN0b3JlIGxldmVsIG9mIGFic3RyYWN0aW9uLiBGb3IgZWFjaCBvZiB0aG9zZVxuICogdGFncywgYSB0YWdnZWQgcmVjb3JkIG9ubHkgaGFzIHRoYXQga2luZCBpZiBpdCBzYXRpc2ZpZXMgdGhlIGludmFyaWFudHNcbiAqIHRoYXQgdGhlIHN0b3JlIGxldmVsIGFzc29jaWF0ZXMgd2l0aCB0aGF0IGtpbmQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxDb3B5VGFnZ2VkLCBLaW5kPn1cbiAqIE9ubHkgZm9yIHRhZ2dlZCByZWNvcmRzIG9mIHJlY29nbml6ZWQga2luZHMgd2hvc2Ugc3RvcmUtbGV2ZWwgaW52YXJpYW50c1xuICogaGF2ZSBhbHJlYWR5IGJlZW4gY2hlY2tlZC5cbiAqL1xuY29uc3QgdGFnTWVtbz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIENoZWNrcyBvbmx5IHJlY29nbml6ZWQgdGFncywgYW5kIG9ubHkgaWYgdGhlIHRhZ2dlZFxuICogcGFzc2VzIHRoZSBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHRhZ2dlZFxuICogQHBhcmFtIHtLaW5kfSB0YWdcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1RhZ2dlZD0odGFnZ2VkLHRhZyxjaGVjayk9PntcbmNvbnN0IG1hdGNoSGVscGVyPW1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbmlmKG1hdGNoSGVscGVyKXtcbi8qIEJ1cmllZCBoZXJlIGlzIHRoZSBpbXBvcnRhbnQgY2FzZSwgd2hlcmUgd2UgcHJvY2VzcyovXG4vKiB0aGUgdmFyaW91cyBwYXR0ZXJuTm9kZXMqL1xucmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkKHRhZ2dlZC5wYXlsb2FkLGNoZWNrKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xucmV0dXJuIGNoZWNrQ29weVNldCh0YWdnZWQsY2hlY2spO1xuIH1cbmNhc2UnY29weUJhZyc6e1xucmV0dXJuIGNoZWNrQ29weUJhZyh0YWdnZWQsY2hlY2spO1xuIH1cbmNhc2UnY29weU1hcCc6e1xucmV0dXJuIGNoZWNrQ29weU1hcCh0YWdnZWQsY2hlY2spO1xuIH1cbmRlZmF1bHQ6e1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX06ICR7dGFnZ2VkfWApO1xuXG4gfX1cblxuIH07XG5cbi8qKlxuICogUmV0dXJucyBvbmx5IGEgcmVjb2duaXplZCBraW5kLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW4gcGFzc2VzIHRoZVxuICogaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqIE90aGVyd2lzZSwgYGNoZWNrKGZhbHNlLCAuLi4pYCBhbmQgcmV0dXJucyB1bmRlZmluZWRcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7S2luZCB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3Qga2luZE9mPShzcGVjaW1lbixjaGVjaz1pZGVudENoZWNrZXIpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuaWYocGFzc1N0eWxlIT09J3RhZ2dlZCcpe1xucmV0dXJuIHBhc3NTdHlsZTtcbiB9XG4vKiBBdCB0aGlzIHBvaW50IHdlIGtub3cgdGhhdCBzcGVjaW1lbiBpcyBhIHdlbGwgZm9ybWVkKi9cbi8qIGFzIGEgdGFnZ2VkIHJlY29yZCwgd2hpY2ggaXMgZGVmaW5lZCBhdCB0aGUgbWFyc2hhbCBsZXZlbCBvZiBhYnN0cmFjdGlvbiwqL1xuLyogc2luY2UgYHBhc3NTdHlsZU9mYCBjaGVja3MgdGhvc2UgaW52YXJpYW50cy4qL1xuaWYodGFnTWVtby5oYXMoc3BlY2ltZW4pKXtcbnJldHVybiB0YWdNZW1vLmdldChzcGVjaW1lbik7XG4gfVxuY29uc3QgdGFnPWdldFRhZyhzcGVjaW1lbik7XG5pZihjaGVja1RhZ2dlZChzcGVjaW1lbix0YWcsY2hlY2spKXtcbnRhZ01lbW8uc2V0KHNwZWNpbWVuLHRhZyk7XG5yZXR1cm4gdGFnO1xuIH1cbmlmKGNoZWNrIT09aWRlbnRDaGVja2VyKXtcbmNoZWNrKGZhbHNlLFggYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfWApO1xuIH1cbnJldHVybiB1bmRlZmluZWQ7XG4gfTtcbmhhcmRlbihraW5kT2YpO1xuXG4vKipcbiAqIENoZWNrcyBvbmx5IHJlY29nbml6ZWQga2luZHMsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lblxuICogcGFzc2VzIHRoZSBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tpbmR9IGtpbmRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0tpbmQ9KHNwZWNpbWVuLGtpbmQsY2hlY2spPT57XG5jb25zdCByZWFsS2luZD1raW5kT2Yoc3BlY2ltZW4sY2hlY2spO1xuaWYoa2luZD09PXJlYWxLaW5kKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGNoZWNrIT09aWRlbnRDaGVja2VyKXtcbi8qIHF1b3Rpbmcgd2l0aG91dCBxdW90ZXMqL1xuY29uc3QgZGV0YWlscz1YKFsgYCR7cmVhbEtpbmR9IGAsYCAtIE11c3QgYmUgYSAke2tpbmR9YF0sc3BlY2ltZW4pO1xuY2hlY2soZmFsc2UsZGV0YWlscyk7XG4gfVxucmV0dXJuIGZhbHNlO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2V5fSBrZXlBc1BhdHRlcm5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja0FzS2V5UGF0dD0oc3BlY2ltZW4sa2V5QXNQYXR0ZXJuLGNoZWNrKT0+e1xuaWYoa2V5RVEoc3BlY2ltZW4sa2V5QXNQYXR0ZXJuKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4oXG5jaGVjayE9PWlkZW50Q2hlY2tlciYmXG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmU6ICR7a2V5QXNQYXR0ZXJufWApKTtcblxuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGlzUGF0dGVybiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7Q2hlY2tQYXR0ZXJufSAqL1xuY29uc3QgY2hlY2tQYXR0ZXJuPShwYXR0LGNoZWNrKT0+e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogQWxsIGtleXMgYXJlIHBhdHRlcm5zLiBGb3IgdGhlc2UsIHRoZSBrZXlNZW1vIHdpbGwgZG8uKi9cbi8qIEFsbCBwcmltaXRpdmVzIHRoYXQgYXJlIHBhdHRlcm5zIGFyZSBhbHNvIGtleXMsIHdoaWNoIHRoaXMqL1xuLyogYWxzbyB0YWtlcyBjYXJlIG9mIHdpdGhvdXQgbWVtby4gVGhlIHJlc3Qgb2Ygb3VyIGNoZWNraW5nIGxvZ2ljKi9cbi8qIGlzIG9ubHkgY29uY2VybmVkIHdpdGggbm9uLWtleSBwYXR0ZXJucy4qL1xucmV0dXJuIHRydWU7XG4gfVxuaWYocGF0dGVybk1lbW8uaGFzKHBhdHQpKXtcbnJldHVybiB0cnVlO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCByZXN1bHQ9Y2hlY2tQYXR0ZXJuSW50ZXJuYWwocGF0dCxjaGVjayk7XG5pZihyZXN1bHQpe1xucGF0dGVybk1lbW8uYWRkKHBhdHQpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0IC0ga25vd24gbm90IHRvIGJlIGEga2V5LCBhbmQgdGhlcmVmb3JlIGtub3duXG4gKiBub3QgdG8gYmUgcHJpbWl0aXZlLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUGF0dGVybkludGVybmFsPShwYXR0LGNoZWNrKT0+e1xuLyogUHVycG9zZWx5IHBhcmFsbGVscyBjaGVja0tleS4gVE9ETyByZXVzZSBtb3JlIGxvZ2ljIGJldHdlZW4gdGhlbS4qL1xuLyogTW9zdCBvZiB0aGUgdGV4dCBvZiB0aGUgc3dpdGNoIGJlbG93IG5vdCBkZWFsaW5nIHdpdGggbWF0Y2hlcnMgaXMqL1xuLyogZXNzZW50aWFsbHkgaWRlbnRpY2FsLiovXG5jb25zdCBjaGVja0l0PShjaGlsZCk9PmNoZWNrUGF0dGVybihjaGlsZCxjaGVjayk7XG5cbmNvbnN0IGtpbmQ9a2luZE9mKHBhdHQsY2hlY2spO1xuc3dpdGNoKGtpbmQpe1xuY2FzZSB1bmRlZmluZWQ6e1xucmV0dXJuIGZhbHNlO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogQSBjb3B5UmVjb3JkIGlzIGEgcGF0dGVybiBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUqL1xuLyogcGF0dGVybnMqL1xucmV0dXJuIHZhbHVlcyhwYXR0KS5ldmVyeShjaGVja0l0KTtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogQSBjb3B5QXJyYXkgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4vKiBwYXR0ZXJucyovXG5yZXR1cm4gcGF0dC5ldmVyeShjaGVja0l0KTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8qIEEgY29weU1hcCdzIGtleXMgYXJlIGtleXMgYW5kIHRoZXJlZm9yZSBhbHJlYWR5IGtub3duIHRvIGJlKi9cbi8qIHBhdHRlcm5zLiovXG4vKiBBIGNvcHlNYXAgaXMgYSBwYXR0ZXJuIGlmIGl0cyB2YWx1ZXMgYXJlIHBhdHRlcm5zLiovXG5yZXR1cm4gY2hlY2tQYXR0ZXJuKHBhdHQudmFsdWVzLGNoZWNrKTtcbiB9XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgJHtxKGtpbmQpfSBjYW5ub3QgYmUgYSBwYXR0ZXJuYCk7XG4gfVxuZGVmYXVsdDp7XG5pZihtYXliZU1hdGNoSGVscGVyKGtpbmQpIT09dW5kZWZpbmVkKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgQSBwYXNzYWJsZSBvZiBraW5kICR7cShraW5kKX0gaXMgbm90IGEgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfX1cblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzUGF0dGVybj0ocGF0dCk9PmNoZWNrUGF0dGVybihwYXR0LGlkZW50Q2hlY2tlcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKi9cbmNvbnN0IGFzc2VydFBhdHRlcm49KHBhdHQpPT57XG5jaGVja1BhdHRlcm4ocGF0dCxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBtYXRjaGVzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRlcm5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTWF0Y2hlcz0oc3BlY2ltZW4scGF0dGVybixjaGVjayxsYWJlbD11bmRlZmluZWQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5hcHBseUxhYmVsaW5nRXJyb3IoY2hlY2tNYXRjaGVzSW50ZXJuYWwsW3NwZWNpbWVuLHBhdHRlcm4sY2hlY2tdLGxhYmVsKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzSW50ZXJuYWw9KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG4vKiBXb3J0aCBiZWluZyBhIGJpdCB2ZXJib3NlIGFuZCByZXBldGl0aXZlIGluIG9yZGVyIHRvIG9wdGltaXplKi9cbmNvbnN0IHBhdHRlcm5LaW5kPWtpbmRPZihwYXR0LGNoZWNrKTtcbmNvbnN0IHNwZWNpbWVuS2luZD1raW5kT2Yoc3BlY2ltZW4pOy8qIG1heSBiZSB1bmRlZmluZWQqL1xuc3dpdGNoKHBhdHRlcm5LaW5kKXtcbmNhc2UgdW5kZWZpbmVkOntcbnJldHVybiBGYWlsIGBwYXR0ZXJuIGV4cGVjdGVkOiAke3BhdHR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBGYWlsIGBwcm9taXNlcyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiBGYWlsIGBlcnJvcnMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YDtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzpcbmNhc2UnY29weVNldCc6XG5jYXNlJ2NvcHlCYWcnOlxuY2FzZSdyZW1vdGFibGUnOntcbi8qIFRoZXNlIGtpbmRzIGFyZSBuZWNlc3NhcmlseSBrZXlzKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5QXJyYXkgdG8gbWF0Y2ggYSBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7bGVuZ3RofT1wYXR0O1xuaWYoc3BlY2ltZW4ubGVuZ3RoIT09bGVuZ3RoKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgQXJyYXkgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGFzIGxvbmcgYXMgY29weUFycmF5IHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbnJldHVybiBwYXR0LmV2ZXJ5KChwLGkpPT5jaGVja01hdGNoZXMoc3BlY2ltZW5baV0scCxjaGVjayxpKSk7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weVJlY29yZCcpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5UmVjb3JkIHRvIG1hdGNoIGEgY29weVJlY29yZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG4vKiBUT0RPIERldGVjdCBhbmQgYWNjdW11bGF0ZSBkaWZmZXJlbmNlIGluIG9uZSBwYXNzLiovXG4vKiBSYXRoZXIgdGhhbiB1c2luZyB0d28gY2FsbHMgdG8gYGxpc3REaWZmZXJlbmNlYCB0byBkZXRlY3QgYW5kKi9cbi8qIHJlcG9ydCBpZiBhbmQgaG93IHRoZXNlIGxpc3RzIGRpZmZlciwgc2luY2UgdGhleSBhcmUgYWxyZWFkeSovXG4vKiBpbiBzb3J0ZWQgb3JkZXIsIHdlIHNob3VsZCBpbnN0ZWFkIHVzZSBhbiBhbGdvcml0aG0gbGlrZSovXG4vKiBgaXRlckRpc2pvaW50VW5pb25gIGZyb20gbWVyZ2Utc29ydC1vcGVyYXRvcnMuanMqL1xuY29uc3Qgc3BlY2ltZW5OYW1lcz1yZWNvcmROYW1lcyhzcGVjaW1lbik7XG5jb25zdCBwYXR0TmFtZXM9cmVjb3JkTmFtZXMocGF0dCk7XG5jb25zdCBtaXNzaW5nPWxpc3REaWZmZXJlbmNlKHBhdHROYW1lcyxzcGVjaW1lbk5hbWVzKTtcbmlmKG1pc3NpbmcubGVuZ3RoPj0xKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGhhdmUgbWlzc2luZyBwcm9wZXJ0aWVzICR7cShtaXNzaW5nKX1gKTtcblxuIH1cbmNvbnN0IHVuZXhwZWN0ZWQ9bGlzdERpZmZlcmVuY2Uoc3BlY2ltZW5OYW1lcyxwYXR0TmFtZXMpO1xuaWYodW5leHBlY3RlZC5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3Qgbm90IGhhdmUgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3EoXG51bmV4cGVjdGVkKVxuIH1gKTtcblxuIH1cbmNvbnN0IHNwZWNpbWVuVmFsdWVzPXJlY29yZFZhbHVlcyhzcGVjaW1lbixzcGVjaW1lbk5hbWVzKTtcbmNvbnN0IHBhdHRWYWx1ZXM9cmVjb3JkVmFsdWVzKHBhdHQscGF0dE5hbWVzKTtcbnJldHVybiBwYXR0TmFtZXMuZXZlcnkoKGxhYmVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlc1tpXSxwYXR0VmFsdWVzW2ldLGNoZWNrLGxhYmVsKSk7XG5cbiB9XG5jYXNlJ2NvcHlNYXAnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5TWFwJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlNYXAgdG8gbWF0Y2ggYSBjb3B5TWFwIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbmNvbnN0e3BheWxvYWQ6cGF0dFBheWxvYWR9PXBhdHQ7XG5jb25zdHtwYXlsb2FkOnNwZWNpbWVuUGF5bG9hZH09c3BlY2ltZW47XG5jb25zdCBwYXR0S2V5U2V0PWNvcHlNYXBLZXlTZXQocGF0dFBheWxvYWQpO1xuY29uc3Qgc3BlY2ltZW5LZXlTZXQ9Y29weU1hcEtleVNldChzcGVjaW1lblBheWxvYWQpO1xuLyogQ29tcGFyZSBrZXlzIGFzIGNvcHlTZXRzKi9cbmlmKCFjaGVja01hdGNoZXMoc3BlY2ltZW5LZXlTZXQscGF0dEtleVNldCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHBhdHRWYWx1ZXM9cGF0dFBheWxvYWQudmFsdWVzO1xuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9c3BlY2ltZW5QYXlsb2FkLnZhbHVlcztcbi8qIGNvbXBhcmUgdmFsdWVzIGFzIGNvcHlBcnJheXMqL1xucmV0dXJuIGNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlcyxwYXR0VmFsdWVzLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbmNvbnN0IG1hdGNoSGVscGVyPW1heWJlTWF0Y2hIZWxwZXIocGF0dGVybktpbmQpO1xuaWYobWF0Y2hIZWxwZXIpe1xucmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LnBheWxvYWQsY2hlY2spO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBzaG91bGQgaGF2ZSByZWNvZ25pemVkICR7cShwYXR0ZXJuS2luZCl9IGA7XG4gfX1cblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IG1hdGNoZXM9KHNwZWNpbWVuLHBhdHQpPT5cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcik7XG5cbi8qKlxuICogUmV0dXJuaW5nIG5vcm1hbGx5IGluZGljYXRlcyBzdWNjZXNzLiBNYXRjaCBmYWlsdXJlIGlzIGluZGljYXRlZCBieVxuICogdGhyb3dpbmcuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKi9cbmNvbnN0IG11c3RNYXRjaD0oc3BlY2ltZW4scGF0dCxsYWJlbD11bmRlZmluZWQpPT57XG5pZihjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxpZGVudENoZWNrZXIsbGFiZWwpKXtcbnJldHVybjtcbiB9XG4vKiBzaG91bGQgb25seSB0aHJvdyovXG5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxhc3NlcnRDaGVja2VyLGxhYmVsKTtcbkZhaWwgYGludGVybmFsOiAke2xhYmVsfTogaW5jb25zaXN0ZW50IHBhdHRlcm4gbWF0Y2g6ICR7cShwYXR0KX1gO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGdldFJhbmtDb3ZlciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7R2V0UmFua0NvdmVyfSAqL1xuY29uc3QgZ2V0UmFua0NvdmVyPShwYXR0LGVuY29kZVBhc3NhYmxlKT0+e1xuaWYoaXNLZXkocGF0dCkpe1xuY29uc3QgZW5jb2RlZD1lbmNvZGVQYXNzYWJsZShwYXR0KTtcbmlmKGVuY29kZWQhPT11bmRlZmluZWQpe1xucmV0dXJuW2VuY29kZWQsIGAke2VuY29kZWR9fmBdO1xuIH1cbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGF0dCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weUFycmF5Jzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlBcnJheXMuKi9cbi8qKi9cbi8qIGNvbnN0IHJhbmtDb3ZlcnMgPSBwYXR0Lm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogcmFua0NvdmVycy5tYXAoKFtsZWZ0LCBfcmlnaHRdKSA9PiBsZWZ0KSwqL1xuLyogcmFua0NvdmVycy5tYXAoKFtfbGVmdCwgcmlnaHRdKSA9PiByaWdodCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weVJlY29yZHMuKi9cbi8qKi9cbi8qIGNvbnN0IHBhdHRLZXlzID0gb3duS2V5cyhwYXR0KTsqL1xuLyogY29uc3QgcGF0dEVudHJpZXMgPSBoYXJkZW4ocGF0dEtleXMubWFwKGtleSA9PiBba2V5LCBwYXR0W2tleV1dKSk7Ki9cbi8qIGNvbnN0IFtsZWZ0RW50cmllc0xpbWl0LCByaWdodEVudHJpZXNMaW1pdF0gPSovXG4vKiBnZXRSYW5rQ292ZXIocGF0dEVudHJpZXMpOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMobGVmdEVudHJpZXNMaW1pdCksKi9cbi8qIGZyb21VbmlxdWVFbnRyaWVzKHJpZ2h0RW50cmllc0xpbWl0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHBhdHQpO1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbi8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG5yZXR1cm4gbWF0Y2hIZWxwZXIuZ2V0UmFua0NvdmVyKHBhdHQucGF5bG9hZCxlbmNvZGVQYXNzYWJsZSk7XG4gfVxuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weVNldHMuKi9cbi8qKi9cbi8qIC8vIFNob3VsZCBhbHJlYWR5IGJlIHZhbGlkYXRlZCBieSBjaGVja1BhdHRlcm4uIEJ1dCBiZWNhdXNlIHRoaXMqL1xuLyogLy8gaXMgYSBjaGVjayB0aGF0IG1heSBsb29zZW4gb3ZlciB0aW1lLCB3ZSBhbHNvIGFzc2VydCovXG4vKiAvLyBldmVyeXdoZXJlIHdlIHN0aWxsIHJlbHkgb24gdGhlIHJlc3RyaWN0aW9uLiovXG4vKiBgYGBqcyovXG4vKiBwYXR0LnBheWxvYWQubGVuZ3RoID09PSAxIHx8Ki9cbi8qIEZhaWxgTm9uLXNpbmdsZXRvbiBjb3B5U2V0cyB3aXRoIG1hdGNoZXIgbm90IHlldCBpbXBsZW1lbnRlZDogJHtwYXR0fWA7Ki9cbi8qIGBgYCovXG4vKiovXG4vKiBjb25zdCBbbGVmdEVsZW1lbnRMaW1pdCwgcmlnaHRFbGVtZW50TGltaXRdID0gZ2V0UmFua0NvdmVyKCovXG4vKiBwYXR0LnBheWxvYWRbMF0sKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlQ29weVNldChbbGVmdEVsZW1lbnRMaW1pdF0pLCovXG4vKiBtYWtlQ29weVNldChbcmlnaHRFbGVtZW50TGltaXRdKSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5TWFwcy4qL1xuLyoqL1xuLyogLy8gQSBtYXRjaGluZyBjb3B5TWFwIG11c3QgaGF2ZSB0aGUgc2FtZSBrZXlzLCBvciBhdCBtb3N0IG9uZSovXG4vKiAvLyBub24ta2V5IGtleSBwYXR0ZXJuLiBUaHVzIHdlIGNhbiBhc3N1bWUgdGhhdCB2YWx1ZSBwb3NpdGlvbnMqL1xuLyogLy8gbWF0Y2ggMS10by0xLiovXG4vKiAvLyovXG4vKiAvLyBUT0RPIEkgbWF5IGJlIG92ZXJsb29raW5nIHRoYXQgdGhlIGxlc3MgcHJlY2lzZSByYW5rT3JkZXIqL1xuLyogLy8gZXF1aXZhbGVuY2UgY2xhc3MgbWF5IGNhdXNlIHZhbHVlcyB0byBiZSBvdXQgb2Ygb3JkZXIsKi9cbi8qIC8vIG1ha2luZyB0aGlzIHJhbmtDb3ZlciBub3QgYWN0dWFsbHkgY292ZXIuIEluIHRoYXQgY2FzZSwgZm9yKi9cbi8qIC8vIGFsbCB0aGUgdmFsdWVzIGZvciBrZXlzIGF0IHRoZSBzYW1lIHJhbmssIHdlIHNob3VsZCB1bmlvbiB0aGVpciovXG4vKiAvLyByYW5rIGNvdmVycy4gVE9ETyBQT1NTSUJMRSBTSUxFTlQgQ09SUkVDVE5FU1MgQlVHKi9cbi8qIC8vKi9cbi8qIC8vIElmIHRoaXMgaXMgYSBidWcsIGl0IHByb2JhYmx5IGFmZmVjdHMgdGhlIGdldFJhbmtDb3ZlciovXG4vKiAvLyBjYXNlcyBvZiBtYXRjaExURUhlbHBlciBhbmQgbWF0Y2hHVEVIZWxwZXIgb24gY29weU1hcCBhcyovXG4vKiAvLyB3ZWxsLiBTZWUgbWFrZUNvcHlNYXAgZm9yIGFuIGlkZWEgb24gZml4aW5nKi9cbi8qIC8vIHRoaXMgYnVnLiovXG4vKiBjb25zdCBbbGVmdFBheWxvYWRMaW1pdCwgcmlnaHRQYXlsb2FkTGltaXRdID0gZ2V0UmFua0NvdmVyKCovXG4vKiBwYXR0LnBheWxvYWQsKi9cbi8qIGVuY29kZVBhc3NhYmxlLCovXG4vKiApOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogbWFrZVRhZ2dlZCgnY29weU1hcCcsIGxlZnRQYXlsb2FkTGltaXQpLCovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgcmlnaHRQYXlsb2FkTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxuYnJlYWs7LyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuIH1cbmRlZmF1bHQ6e1xuYnJlYWs7LyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuIH07XG5cbmNvbnN0IGFycmF5RXZlcnlNYXRjaFBhdHRlcm49KGFycmF5LHBhdHQsY2hlY2ssbGFiZWxQcmVmaXg9JycpPT57XG5pZihjaGVja0tpbmQocGF0dCwnbWF0Y2g6YW55JyxpZGVudENoZWNrZXIpKXtcbi8qIGlmIHRoZSBwYXR0ZXJuIGlzIE0uYW55KCksIHdlIGtub3cgaXRzIHRydWUqL1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGFycmF5LmV2ZXJ5KChlbCxpKT0+XG5jaGVja01hdGNoZXMoZWwscGF0dCxjaGVjaywgYCR7bGFiZWxQcmVmaXh9WyR7aX1dYCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTWF0Y2ggSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQW55SGVscGVyPUZhcignbWF0Y2g6YW55IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihfc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWUsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihtYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxubWF0Y2hlclBheWxvYWQ9PT11bmRlZmluZWR8fFxuY2hlY2soZmFsc2UsWCBgbWF0Y2g6YW55IHBheWxvYWQ6ICR7bWF0Y2hlclBheWxvYWR9IC0gTXVzdCBiZSB1bmRlZmluZWRgKSxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnJywneyddfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQW5kSGVscGVyPUZhcignbWF0Y2g6YW5kIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbnJldHVybiBwYXR0cy5ldmVyeSgocGF0dCk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGNoZWNrKSk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRQYXR0cyxjaGVjayk9PntcbmNvbnN0IGNoZWNrSXQ9KHBhdHQpPT5jaGVja1BhdHRlcm4ocGF0dCxjaGVjayk7XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YoYWxsZWdlZFBhdHRzKT09PSdjb3B5QXJyYXknfHxcbmNoZWNrKGZhbHNlLFggYE5lZWRzIGFycmF5IG9mIHN1Yi1wYXR0ZXJuczogJHthbGxlZ2VkUGF0dHN9YCkpJiZcbmFsbGVnZWRQYXR0cy5ldmVyeShjaGVja0l0KSk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG5pbnRlcnNlY3RSYW5rQ292ZXJzKFxuY29tcGFyZVJhbmssXG5wYXR0cy5tYXAoKHApPT5nZXRSYW5rQ292ZXIocCxlbmNvZGVQYXNzYWJsZSkpKX0pO1xuXG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoT3JIZWxwZXI9RmFyKCdtYXRjaDpvciBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scGF0dHMsY2hlY2spPT57XG5jb25zdHtsZW5ndGh9PXBhdHRzO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gbm8gcGF0dGVybiBkaXNqdW5jdHMgdG8gbWF0Y2g6ICR7cGF0dHN9YCk7XG5cbiB9XG5pZihcbnBhdHRzLmxlbmd0aD09PTImJlxuIW1hdGNoZXMoc3BlY2ltZW4scGF0dHNbMF0pJiZcbmNoZWNrS2luZChwYXR0c1swXSwnbWF0Y2g6a2luZCcsaWRlbnRDaGVja2VyKSYmXG5wYXR0c1swXS5wYXlsb2FkPT09J3VuZGVmaW5lZCcpXG57XG4vKiBXb3J0aCBzcGVjaWFsIGNhc2luZyB0aGUgb3B0aW9uYWwgcGF0dGVybiBmb3IqL1xuLyogYmV0dGVyIGVycm9yIG1lc3NhZ2VzLiovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHRzWzFdLGNoZWNrKTtcbiB9XG5pZihwYXR0cy5zb21lKChwYXR0KT0+bWF0Y2hlcyhzcGVjaW1lbixwYXR0KSkpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBtYXRjaCBvbmUgb2YgJHtwYXR0c31gKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFuZEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihwYXR0cyxlbmNvZGVQYXNzYWJsZSk9PlxudW5pb25SYW5rQ292ZXJzKFxuY29tcGFyZVJhbmssXG5wYXR0cy5tYXAoKHApPT5nZXRSYW5rQ292ZXIocCxlbmNvZGVQYXNzYWJsZSkpKX0pO1xuXG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTm90SGVscGVyPUZhcignbWF0Y2g6bm90IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0LGNoZWNrKT0+e1xuaWYobWF0Y2hlcyhzcGVjaW1lbixwYXR0KSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBmYWlsIG5lZ2F0ZWQgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfWVsc2V7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tQYXR0ZXJuLFxuXG5nZXRSYW5rQ292ZXI6KF9wYXR0LF9lbmNvZGVQYXNzYWJsZSk9PlsnJywneyddfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU2NhbGFySGVscGVyPUZhcignbWF0Y2g6c2NhbGFyIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbmNoZWNrU2NhbGFyS2V5KHNwZWNpbWVuLGNoZWNrKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6bWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5bJ2EnLCd6fiddfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoS2V5SGVscGVyPUZhcignbWF0Y2g6a2V5IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbmNoZWNrS2V5KHNwZWNpbWVuLGNoZWNrKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6bWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5bJ2EnLCd6fiddfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUGF0dGVybkhlbHBlcj1GYXIoJ21hdGNoOnBhdHRlcm4gaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tQYXR0ZXJuKHNwZWNpbWVuLGNoZWNrKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6bWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5bJ2EnLCd6fiddfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoS2luZEhlbHBlcj1GYXIoJ21hdGNoOmtpbmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6Y2hlY2tLaW5kLFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZEtleUtpbmQsY2hlY2spPT5cbnR5cGVvZiBhbGxlZ2VkS2V5S2luZD09PSdzdHJpbmcnfHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBtYXRjaDpraW5kOiBwYXlsb2FkOiAke2FsbGVnZWRLZXlLaW5kfSAtIEEga2luZCBuYW1lIG11c3QgYmUgYSBzdHJpbmdgKSxcblxuXG5nZXRSYW5rQ292ZXI6KGtpbmQsX2VuY29kZVBhc3NhYmxlKT0+e1xubGV0IHN0eWxlO1xuc3dpdGNoKGtpbmQpe1xuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weU1hcCc6e1xuc3R5bGU9J3RhZ2dlZCc7XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbnN0eWxlPWtpbmQ7XG5icmVhaztcbiB9fVxuXG5yZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIoc3R5bGUpO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hCaWdpbnRIZWxwZXI9RmFyKCdtYXRjaDpiaWdpbnQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2RlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnYmlnaW50JyxjaGVjaykmJlxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOmJpZ2ludCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ2JpZ2ludCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoTmF0SGVscGVyPUZhcignbWF0Y2g6bmF0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2JpZ2ludCcsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtiaWdpbnR9ICovc3BlY2ltZW4+PTBuLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIG5vbi1uZWdhdGl2ZWApJiZcblxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOm5hdCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuLyogVE9ETyBDb3VsZCBiZSBtb3JlIHByZWNpc2UqL1xuZ2V0UGFzc1N0eWxlQ292ZXIoJ2JpZ2ludCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3RyaW5nSGVscGVyPUZhcignbWF0Y2g6c3RyaW5nIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtzdHJpbmdMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbi8qIHByZXR0aWVyLWlnbm9yZSovXG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ3N0cmluZycsY2hlY2spJiYoXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGVuZG8vcmVzdHJpY3QtY29tcGFyaXNvbi1vcGVyYW5kcyovXG4vKiogQHR5cGUge3N0cmluZ30gKi9zcGVjaW1lbi5sZW5ndGg8PXN0cmluZ0xlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBzdHJpbmcgJHtzcGVjaW1lbn0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzdHJpbmdMZW5ndGhMaW1pdH1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOnN0cmluZyBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N0cmluZycpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3ltYm9sSGVscGVyPUZhcignbWF0Y2g6c3ltYm9sIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdzeW1ib2wnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3Qgc3ltYm9sTmFtZT1uYW1lRm9yUGFzc2FibGVTeW1ib2woc3BlY2ltZW4pO1xuXG5pZih0eXBlb2Ygc3ltYm9sTmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYGludGVybmFsOiBQYXNzYWJsZSBzeW1ib2wgJHtzcGVjaW1lbn0gbXVzdCBoYXZlIGEgcGFzc2FibGUgbmFtZWA7XG4gfVxucmV0dXJuIGNoZWNrKFxuc3ltYm9sTmFtZS5sZW5ndGg8PXN5bWJvbE5hbWVMZW5ndGhMaW1pdCxcblggYFN5bWJvbCBuYW1lICR7cShcbnN5bWJvbE5hbWUpXG4gfSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N5bWJvbE5hbWVMZW5ndGhMaW1pdH1gKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6c3ltYm9sIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3Zlcignc3ltYm9sJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZW1vdGFibGVIZWxwZXI9RmFyKCdtYXRjaDpyZW1vdGFibGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJlbW90YWJsZURlc2MsY2hlY2spPT57XG4vKiBVbmZvcnR1bmF0ZSBkdXBsaWNhdGlvbiBvZiBjaGVja0tpbmQgbG9naWMsIGJ1dCBubyBiZXR0ZXIgY2hvaWNlcy4qL1xuaWYoY2hlY2tLaW5kKHNwZWNpbWVuLCdyZW1vdGFibGUnLGlkZW50Q2hlY2tlcikpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2s9PT1pZGVudENoZWNrZXIpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmxldCBzcGVjaW1lbktpbmQ9cGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuaWYoc3BlY2ltZW5LaW5kPT09J3RhZ2dlZCcpe1xuc3BlY2ltZW5LaW5kPWdldFRhZyhzcGVjaW1lbik7XG4gfVxuY29uc3R7bGFiZWx9PXJlbW90YWJsZURlc2M7XG5cbi8qIHF1b3Rpbmcgd2l0aG91dCBxdW90ZXMqL1xuY29uc3QgZGV0YWlscz1YKFxuWyBgJHtzcGVjaW1lbktpbmR9IGAsYCAtIE11c3QgYmUgYSByZW1vdGFibGUgKCR7bGFiZWx9KWBdLFxuc3BlY2ltZW4pO1xuXG5yZXR1cm4gY2hlY2soZmFsc2UsZGV0YWlscyk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRSZW1vdGFibGVEZXNjLGNoZWNrKT0+XG5jaGVja01hdGNoZXMoXG5hbGxlZ2VkUmVtb3RhYmxlRGVzYyxcbmhhcmRlbih7bGFiZWw6TU0uc3RyaW5nKCl9KSxcbmNoZWNrLFxuJ21hdGNoOnJlbW90YWJsZSBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfcmVtb3RhYmxlRGVzYyxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdyZW1vdGFibGUnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaExURUhlbHBlcj1GYXIoJ21hdGNoOmx0ZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlMVEUoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPD0gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6KHJpZ2h0T3BlcmFuZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuLyogVGhlIHByZWZlci1jb25zdCBtYWtlcyBubyBzZW5zZSB3aGVuIHNvbWUgb2YgdGhlIHZhcmlhYmxlcyBuZWVkKi9cbi8qIHRvIGJlIGBsZXRgKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QqL1xubGV0W2xlZnRCb3VuZCxyaWdodEJvdW5kXT1nZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuY29uc3QgbmV3UmlnaHRCb3VuZD0gYCR7ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKX1+YDtcbmlmKG5ld1JpZ2h0Qm91bmQhPT11bmRlZmluZWQpe1xucmlnaHRCb3VuZD1uZXdSaWdodEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaExUSGVscGVyPUZhcignbWF0Y2g6bHQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5TFQoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPCAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjptYXRjaExURUhlbHBlci5nZXRSYW5rQ292ZXJ9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hHVEVIZWxwZXI9RmFyKCdtYXRjaDpndGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5R1RFKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID49ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOihyaWdodE9wZXJhbmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbi8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4vKiB0byBiZSBgbGV0YCovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbmxldFtsZWZ0Qm91bmQscmlnaHRCb3VuZF09Z2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbmNvbnN0IG5ld0xlZnRCb3VuZD1lbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpO1xuaWYobmV3TGVmdEJvdW5kIT09dW5kZWZpbmVkKXtcbmxlZnRCb3VuZD1uZXdMZWZ0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoR1RIZWxwZXI9RmFyKCdtYXRjaDpndCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlHVChzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOm1hdGNoR1RFSGVscGVyLmdldFJhbmtDb3Zlcn0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFJlY29yZE9mSGVscGVyPUZhcignbWF0Y2g6cmVjb3JkT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtUHJvcGVydGllc0xpbWl0LHByb3BlcnR5TmFtZUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5UmVjb3JkJyxjaGVjaykmJlxuY2hlY2soXG5vd25LZXlzKHNwZWNpbWVuKS5sZW5ndGg8PW51bVByb3BlcnRpZXNMaW1pdCxcblggYE11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbm51bVByb3BlcnRpZXNMaW1pdClcbiB9IHByb3BlcnRpZXM6ICR7c3BlY2ltZW59YCkmJlxuXG5lbnRyaWVzKHNwZWNpbWVuKS5ldmVyeShcbihba2V5LHZhbHVlXSk9PlxuYXBwbHlMYWJlbGluZ0Vycm9yKFxuY2hlY2ssXG5bXG5rZXkubGVuZ3RoPD1wcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCxcblggYFByb3BlcnR5IG5hbWUgbXVzdCBub3QgYmUgbG9uZ2VyIHRoYW4gJHtxKFxucHJvcGVydHlOYW1lTGVuZ3RoTGltaXQpXG4gfWBdLFxuXG5rZXkpJiZcblxuY2hlY2tNYXRjaGVzKFxuaGFyZGVuKFtrZXksdmFsdWVdKSxcbmhhcmRlbihba2V5UGF0dCx2YWx1ZVBhdHRdKSxcbmNoZWNrLFxua2V5KSkpO1xuXG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKSxNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOnJlY29yZE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9lbnRyeVBhdHQpPT5nZXRQYXNzU3R5bGVDb3ZlcignY29weVJlY29yZCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQXJyYXlPZkhlbHBlcj1GYXIoJ21hdGNoOmFycmF5T2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtzdWJQYXR0LGxpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7YXJyYXlMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbi8qIHByZXR0aWVyLWlnbm9yZSovXG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spJiYoXG4vKiogQHR5cGUge0FycmF5fSAqL3NwZWNpbWVuLmxlbmd0aDw9YXJyYXlMZW5ndGhMaW1pdHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgQXJyYXkgbGVuZ3RoICR7c3BlY2ltZW4ubGVuZ3RofSBtdXN0IGJlIDw9IGxpbWl0ICR7YXJyYXlMZW5ndGhMaW1pdH1gKSkmJlxuXG5hcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKHNwZWNpbWVuLHN1YlBhdHQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6YXJyYXlPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTZXRPZkhlbHBlcj1GYXIoJ21hdGNoOnNldE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixba2V5UGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e251bVNldEVsZW1lbnRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlTZXQnLGNoZWNrKSYmXG5jaGVjayhcbi8qKiBAdHlwZSB7QXJyYXl9ICovc3BlY2ltZW4ucGF5bG9hZC5sZW5ndGg8bnVtU2V0RWxlbWVudHNMaW1pdCxcblggYFNldCBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EobnVtU2V0RWxlbWVudHNMaW1pdCl9IGVsZW1lbnRzOiAke1xuc3BlY2ltZW4ucGF5bG9hZC5sZW5ndGhcbiB9YCkmJlxuXG5hcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKHNwZWNpbWVuLnBheWxvYWQsa2V5UGF0dCxjaGVjaywnc2V0IGVsZW1lbnRzJykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpzZXRPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hCYWdPZkhlbHBlcj1GYXIoJ21hdGNoOmJhZ09mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsY291bnRQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QmFnJyxjaGVjaykmJlxuY2hlY2soXG4vKiogQHR5cGUge0FycmF5fSAqL3NwZWNpbWVuLnBheWxvYWQubGVuZ3RoPD1cbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsXG5YIGBCYWcgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxubnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdClcbiB9IHVuaXF1ZSBlbGVtZW50czogJHtzcGVjaW1lbn1gKSYmXG5cbnNwZWNpbWVuLnBheWxvYWQuZXZlcnkoXG4oW2tleSxjb3VudF0saSk9PlxuY2hlY2tNYXRjaGVzKGtleSxrZXlQYXR0LGNoZWNrLCBgYmFnIGtleXNbJHtpfV1gKSYmXG5hcHBseUxhYmVsaW5nRXJyb3IoXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdCxcbltjb3VudCxkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2tdLFxuIGBiYWcgY291bnRzWyR7aX1dYCkmJlxuXG5jaGVja01hdGNoZXMoY291bnQsY291bnRQYXR0LGNoZWNrLCBgYmFnIGNvdW50c1ske2l9XWApKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKSxNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOmJhZ09mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaE1hcE9mSGVscGVyPUZhcignbWF0Y2g6bWFwT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtTWFwRW50cmllc0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5TWFwJyxjaGVjaykmJlxuY2hlY2soXG4vKiogQHR5cGUge0FycmF5fSAqL3NwZWNpbWVuLnBheWxvYWQua2V5cy5sZW5ndGg8PVxubnVtTWFwRW50cmllc0xpbWl0LFxuWCBgQ29weU1hcCBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuICR7cShcbm51bU1hcEVudHJpZXNMaW1pdClcbiB9IGVudHJpZXM6ICR7c3BlY2ltZW59YCkmJlxuXG5hcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuc3BlY2ltZW4ucGF5bG9hZC5rZXlzLFxua2V5UGF0dCxcbmNoZWNrLFxuJ21hcCBrZXlzJykmJlxuXG5hcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKFxuc3BlY2ltZW4ucGF5bG9hZC52YWx1ZXMsXG52YWx1ZVBhdHQsXG5jaGVjayxcbidtYXAgdmFsdWVzJykpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDptYXBPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfZW50cnlQYXR0KT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gb3B0aW9uYWxQYXR0XG4gKiBAcmV0dXJucyB7e1xuICogICByZXF1aXJlZFNwZWNpbWVuOiBQYXNzYWJsZVtdLFxuICogICBvcHRpb25hbFNwZWNpbWVuOiBQYXNzYWJsZVtdLFxuICogICByZXN0U3BlY2ltZW46IFBhc3NhYmxlW11cbiAqIH19XG4gKi9cbmNvbnN0IHNwbGl0QXJyYXlQYXJ0cz0oc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk9PntcbmNvbnN0IG51bVJlcXVpcmVkPXJlcXVpcmVkUGF0dC5sZW5ndGg7XG5jb25zdCBudW1PcHRpb25hbD1vcHRpb25hbFBhdHQubGVuZ3RoO1xuY29uc3QgcmVxdWlyZWRTcGVjaW1lbj1zcGVjaW1lbi5zbGljZSgwLG51bVJlcXVpcmVkKTtcbmNvbnN0IG9wdGlvbmFsU3BlY2ltZW49c3BlY2ltZW4uc2xpY2UoXG5udW1SZXF1aXJlZCxcbm51bVJlcXVpcmVkK251bU9wdGlvbmFsKTtcblxuY29uc3QgcmVzdFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKG51bVJlcXVpcmVkK251bU9wdGlvbmFsKTtcbnJldHVybiBoYXJkZW4oe3JlcXVpcmVkU3BlY2ltZW4sb3B0aW9uYWxTcGVjaW1lbixyZXN0U3BlY2ltZW59KTtcbiB9O1xuXG4vKipcbiAqIE9wdGlvbmFsIHNwZWNpbWVuIGVsZW1lbnRzIHdoaWNoIGFyZSBgdW5kZWZpbmVkYCBwYXNzIHVuY29uZGl0aW9uYWxseS5cbiAqIFdlIGVuY29kZSB0aGlzIHdpdGggdGhlIGBNLm9yYCBwYXR0ZXJuIHNvIGl0IGFsc28gcHJvZHVjZXMgYSBnb29kXG4gKiBjb21wcmVzc2lvbiBkaXN0aW5ndWlzaGluZyBgdW5kZWZpbmVkYCBmcm9tIGFic2VuY2UuXG4gKlxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICogQHJldHVybnMge1BhdHRlcm5bXX0gVGhlIHBhcnRpYWxQYXR0XG4gKi9cbmNvbnN0IGFkYXB0QXJyYXlQYXR0ZXJuPShvcHRpb25hbFBhdHQsbGVuZ3RoKT0+XG5oYXJkZW4ob3B0aW9uYWxQYXR0LnNsaWNlKDAsbGVuZ3RoKS5tYXAoKHBhdHQpPT5NTS5vcHQocGF0dCkpKTtcblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3BsaXRBcnJheUhlbHBlcj1GYXIoJ21hdGNoOnNwbGl0QXJyYXkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5bcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD1bXSxyZXN0UGF0dD1NTS5hbnkoKV0sXG5jaGVjayk9Plxue1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnY29weUFycmF5JyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e3JlcXVpcmVkU3BlY2ltZW4sb3B0aW9uYWxTcGVjaW1lbixyZXN0U3BlY2ltZW59PVxuc3BsaXRBcnJheVBhcnRzKHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpO1xuY29uc3QgcGFydGlhbFBhdHQ9YWRhcHRBcnJheVBhdHRlcm4oXG5vcHRpb25hbFBhdHQsXG5vcHRpb25hbFNwZWNpbWVuLmxlbmd0aCk7XG5cbmxldCBhcmdOdW09MDtcbnJldHVybihcbihyZXF1aXJlZFNwZWNpbWVuLmxlbmd0aD09PXJlcXVpcmVkUGF0dC5sZW5ndGh8fFxuY2hlY2soXG5mYWxzZSxcblggYEV4cGVjdGVkIGF0IGxlYXN0ICR7cShcbnJlcXVpcmVkUGF0dC5sZW5ndGgpXG4gfSBhcmd1bWVudHM6ICR7c3BlY2ltZW59YCkpJiZcblxucmVxdWlyZWRQYXR0LmV2ZXJ5KChwLGkpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG5jaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbltpXSxwLGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9YCkpJiZcblxucGFydGlhbFBhdHQuZXZlcnkoKHAsaSk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbmNoZWNrTWF0Y2hlcyhvcHRpb25hbFNwZWNpbWVuW2ldLHAsY2hlY2ssIGBhcmcgJHthcmdOdW0rK30/YCkpJiZcblxuY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbixyZXN0UGF0dCxjaGVjaywnLi4ucmVzdCcpKTtcblxuIH0sXG5cbi8qKlxuICogQHBhcmFtIHtBcnJheX0gc3BsaXRBcnJheVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG5jaGVja0lzV2VsbEZvcm1lZDooc3BsaXRBcnJheSxjaGVjayk9PntcbmlmKFxucGFzc1N0eWxlT2Yoc3BsaXRBcnJheSk9PT0nY29weUFycmF5JyYmKFxuc3BsaXRBcnJheS5sZW5ndGg+PTF8fHNwbGl0QXJyYXkubGVuZ3RoPD0zKSlcbntcbmNvbnN0W3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9dW5kZWZpbmVkLHJlc3RQYXR0PXVuZGVmaW5lZF09XG5zcGxpdEFycmF5O1xuaWYoXG5pc1BhdHRlcm4ocmVxdWlyZWRQYXR0KSYmXG5wYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpPT09J2NvcHlBcnJheScmJihcbm9wdGlvbmFsUGF0dD09PXVuZGVmaW5lZHx8XG5pc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSYmXG5wYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpPT09J2NvcHlBcnJheScpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IGFycmF5LCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgYXJyYXksIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuc3BsaXRBcnJheSlcbiB9YCk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KFtcbl9yZXF1aXJlZFBhdHQsXG5fb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxcbl9yZXN0UGF0dD11bmRlZmluZWRdKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5Jyl9KTtcblxuXG4vKipcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXNzYWJsZT59IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBvcHRpb25hbFBhdHRcbiAqIEByZXR1cm5zIHt7XG4gKiAgIHJlcXVpcmVkU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICBvcHRpb25hbFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPixcbiAqICAgcmVzdFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPlxuICogfX1cbiAqL1xuY29uc3Qgc3BsaXRSZWNvcmRQYXJ0cz0oc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk9Pntcbi8qIE5vdCBmcm96ZW4hIE11dGF0ZWQgaW4gcGxhY2UqL1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IHJlcXVpcmVkRW50cmllcz1bXTtcbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCBvcHRpb25hbEVudHJpZXM9W107XG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3QgcmVzdEVudHJpZXM9W107XG5mb3IoY29uc3RbbmFtZSx2YWx1ZV1vZiBlbnRyaWVzKHNwZWNpbWVuKSl7XG5pZihoYXNPd25Qcm9wZXJ0eU9mKHJlcXVpcmVkUGF0dCxuYW1lKSl7XG5yZXF1aXJlZEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1lbHNlIGlmKGhhc093blByb3BlcnR5T2Yob3B0aW9uYWxQYXR0LG5hbWUpKXtcbm9wdGlvbmFsRW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfWVsc2V7XG5yZXN0RW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe1xucmVxdWlyZWRTcGVjaW1lbjpmcm9tVW5pcXVlRW50cmllcyhyZXF1aXJlZEVudHJpZXMpLFxub3B0aW9uYWxTcGVjaW1lbjpmcm9tVW5pcXVlRW50cmllcyhvcHRpb25hbEVudHJpZXMpLFxucmVzdFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKHJlc3RFbnRyaWVzKX0pO1xuXG4gfTtcblxuLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiB2YWx1ZXMgd2hpY2ggYXJlIGB1bmRlZmluZWRgIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICogV2UgZW5jb2RlIHRoaXMgd2l0aCB0aGUgYE0ub3JgIHBhdHRlcm4gc28gaXQgYWxzbyBwcm9kdWNlcyBhIGdvb2RcbiAqIGNvbXByZXNzaW9uIGRpc3Rpbmd1aXNoaW5nIGB1bmRlZmluZWRgIGZyb20gYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IG9wdGlvbmFsUGF0dFxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZXNcbiAqIEByZXR1cm5zIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBUaGUgcGFydGlhbFBhdHRcbiAqL1xuY29uc3QgYWRhcHRSZWNvcmRQYXR0ZXJuPShvcHRpb25hbFBhdHQsbmFtZXMpPT5cbmZyb21VbmlxdWVFbnRyaWVzKG5hbWVzLm1hcCgobmFtZSk9PltuYW1lLE1NLm9wdChvcHRpb25hbFBhdHRbbmFtZV0pXSkpO1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTcGxpdFJlY29yZEhlbHBlcj1GYXIoJ21hdGNoOnNwbGl0UmVjb3JkIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9e30scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlSZWNvcmQnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn09XG5zcGxpdFJlY29yZFBhcnRzKHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpO1xuXG5jb25zdCBwYXJ0aWFsTmFtZXM9LyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKG9wdGlvbmFsU3BlY2ltZW4pO1xuY29uc3QgcGFydGlhbFBhdHQ9YWRhcHRSZWNvcmRQYXR0ZXJuKG9wdGlvbmFsUGF0dCxwYXJ0aWFsTmFtZXMpO1xucmV0dXJuKFxuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW4scmVxdWlyZWRQYXR0LGNoZWNrKSYmXG5wYXJ0aWFsTmFtZXMuZXZlcnkoKG5hbWUpPT5cbmNoZWNrTWF0Y2hlcyhcbm9wdGlvbmFsU3BlY2ltZW5bbmFtZV0sXG5wYXJ0aWFsUGF0dFtuYW1lXSxcbmNoZWNrLFxuIGAke25hbWV9P2ApKSYmXG5cblxuY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbixyZXN0UGF0dCxjaGVjaywnLi4ucmVzdCcpKTtcblxuIH0sXG5cbi8qKlxuICogQHBhcmFtIHtBcnJheX0gc3BsaXRBcnJheVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG5jaGVja0lzV2VsbEZvcm1lZDooc3BsaXRBcnJheSxjaGVjayk9PntcbmlmKFxucGFzc1N0eWxlT2Yoc3BsaXRBcnJheSk9PT0nY29weUFycmF5JyYmKFxuc3BsaXRBcnJheS5sZW5ndGg+PTF8fHNwbGl0QXJyYXkubGVuZ3RoPD0zKSlcbntcbmNvbnN0W3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9dW5kZWZpbmVkLHJlc3RQYXR0PXVuZGVmaW5lZF09XG5zcGxpdEFycmF5O1xuaWYoXG5pc1BhdHRlcm4ocmVxdWlyZWRQYXR0KSYmXG5wYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpPT09J2NvcHlSZWNvcmQnJiYoXG5vcHRpb25hbFBhdHQ9PT11bmRlZmluZWR8fFxuaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkmJlxucGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KT09PSdjb3B5UmVjb3JkJykmJihcbnJlc3RQYXR0PT09dW5kZWZpbmVkfHxpc1BhdHRlcm4ocmVzdFBhdHQpKSlcbntcbnJldHVybiB0cnVlO1xuIH1cbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgcmVjb3JkLCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgcmVjb3JkLCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbnNwbGl0QXJyYXkpXG4gfWApO1xuXG4gfSxcblxuZ2V0UmFua0NvdmVyOihbXG5yZXF1aXJlZFBhdHQsXG5fb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxcbl9yZXN0UGF0dD11bmRlZmluZWRdKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpKX0pO1xuXG5cbi8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgTWF0Y2hIZWxwZXI+fSAqL1xuY29uc3QgSGVscGVyc0J5TWF0Y2hUYWc9aGFyZGVuKHtcbidtYXRjaDphbnknOm1hdGNoQW55SGVscGVyLFxuJ21hdGNoOmFuZCc6bWF0Y2hBbmRIZWxwZXIsXG4nbWF0Y2g6b3InOm1hdGNoT3JIZWxwZXIsXG4nbWF0Y2g6bm90JzptYXRjaE5vdEhlbHBlcixcblxuJ21hdGNoOnNjYWxhcic6bWF0Y2hTY2FsYXJIZWxwZXIsXG4nbWF0Y2g6a2V5JzptYXRjaEtleUhlbHBlcixcbidtYXRjaDpwYXR0ZXJuJzptYXRjaFBhdHRlcm5IZWxwZXIsXG4nbWF0Y2g6a2luZCc6bWF0Y2hLaW5kSGVscGVyLFxuJ21hdGNoOmJpZ2ludCc6bWF0Y2hCaWdpbnRIZWxwZXIsXG4nbWF0Y2g6bmF0JzptYXRjaE5hdEhlbHBlcixcbidtYXRjaDpzdHJpbmcnOm1hdGNoU3RyaW5nSGVscGVyLFxuJ21hdGNoOnN5bWJvbCc6bWF0Y2hTeW1ib2xIZWxwZXIsXG4nbWF0Y2g6cmVtb3RhYmxlJzptYXRjaFJlbW90YWJsZUhlbHBlcixcblxuJ21hdGNoOmx0JzptYXRjaExUSGVscGVyLFxuJ21hdGNoOmx0ZSc6bWF0Y2hMVEVIZWxwZXIsXG4nbWF0Y2g6Z3RlJzptYXRjaEdURUhlbHBlcixcbidtYXRjaDpndCc6bWF0Y2hHVEhlbHBlcixcblxuJ21hdGNoOmFycmF5T2YnOm1hdGNoQXJyYXlPZkhlbHBlcixcbidtYXRjaDpyZWNvcmRPZic6bWF0Y2hSZWNvcmRPZkhlbHBlcixcbidtYXRjaDpzZXRPZic6bWF0Y2hTZXRPZkhlbHBlcixcbidtYXRjaDpiYWdPZic6bWF0Y2hCYWdPZkhlbHBlcixcbidtYXRjaDptYXBPZic6bWF0Y2hNYXBPZkhlbHBlcixcbidtYXRjaDpzcGxpdEFycmF5JzptYXRjaFNwbGl0QXJyYXlIZWxwZXIsXG4nbWF0Y2g6c3BsaXRSZWNvcmQnOm1hdGNoU3BsaXRSZWNvcmRIZWxwZXJ9KTtcblxuXG5jb25zdCBtYWtlTWF0Y2hlcj0odGFnLHBheWxvYWQpPT57XG5jb25zdCBtYXRjaGVyPW1ha2VUYWdnZWQodGFnLHBheWxvYWQpO1xuYXNzZXJ0UGF0dGVybihtYXRjaGVyKTtcbnJldHVybiBtYXRjaGVyO1xuIH07XG5cbmNvbnN0IG1ha2VLaW5kTWF0Y2hlcj0oa2luZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpraW5kJyxraW5kKTtcblxuY29uc3QgQW55U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmFueScsdW5kZWZpbmVkKTtcbmNvbnN0IFNjYWxhclNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDpzY2FsYXInLHVuZGVmaW5lZCk7XG5jb25zdCBLZXlTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6a2V5Jyx1bmRlZmluZWQpO1xuY29uc3QgUGF0dGVyblNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDpwYXR0ZXJuJyx1bmRlZmluZWQpO1xuY29uc3QgQm9vbGVhblNoYXBlPW1ha2VLaW5kTWF0Y2hlcignYm9vbGVhbicpO1xuY29uc3QgTnVtYmVyU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdudW1iZXInKTtcbmNvbnN0IEJpZ0ludFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOmJpZ2ludCcsW10pO1xuY29uc3QgTmF0U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6bmF0JyxbXSk7XG5jb25zdCBTdHJpbmdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzdHJpbmcnLFtdKTtcbmNvbnN0IFN5bWJvbFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnN5bWJvbCcsW10pO1xuY29uc3QgUmVjb3JkU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6cmVjb3JkT2YnLFtBbnlTaGFwZSxBbnlTaGFwZV0pO1xuY29uc3QgQXJyYXlTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDphcnJheU9mJyxbQW55U2hhcGVdKTtcbmNvbnN0IFNldFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnNldE9mJyxbQW55U2hhcGVdKTtcbmNvbnN0IEJhZ1NoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOmJhZ09mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IE1hcFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm1hcE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IFJlbW90YWJsZVNoYXBlPW1ha2VLaW5kTWF0Y2hlcigncmVtb3RhYmxlJyk7XG5jb25zdCBFcnJvclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignZXJyb3InKTtcbmNvbnN0IFByb21pc2VTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3Byb21pc2UnKTtcbmNvbnN0IFVuZGVmaW5lZFNoYXBlPW1ha2VLaW5kTWF0Y2hlcigndW5kZWZpbmVkJyk7XG5cbi8qKlxuICogRm9yIHdoZW4gdGhlIGxhc3QgZWxlbWVudCBvZiB0aGUgcGF5bG9hZCBpcyB0aGUgb3B0aW9uYWwgbGltaXRzLFxuICogc28gdGhhdCB3aGVuIGl0IGlzIGB1bmRlZmluZWRgIGl0IGlzIGRyb3BwZWQgZnJvbSB0aGUgZW5kIG9mIHRoZVxuICogcGF5bG9hZHMgYXJyYXkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXlsb2FkXG4gKi9cbmNvbnN0IG1ha2VMaW1pdHNNYXRjaGVyPSh0YWcscGF5bG9hZCk9PntcbmlmKHBheWxvYWRbcGF5bG9hZC5sZW5ndGgtMV09PT11bmRlZmluZWQpe1xucGF5bG9hZD1oYXJkZW4ocGF5bG9hZC5zbGljZSgwLHBheWxvYWQubGVuZ3RoLTEpKTtcbiB9XG5yZXR1cm4gbWFrZU1hdGNoZXIodGFnLHBheWxvYWQpO1xuIH07XG5cbmNvbnN0IG1ha2VSZW1vdGFibGVNYXRjaGVyPShsYWJlbD11bmRlZmluZWQpPT5cbmxhYmVsPT09dW5kZWZpbmVkP1xuUmVtb3RhYmxlU2hhcGU6XG5tYWtlTWF0Y2hlcignbWF0Y2g6cmVtb3RhYmxlJyxoYXJkZW4oe2xhYmVsfSkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IGVtcHR5XG4gKiBAcGFyYW0ge1R9IGJhc2VcbiAqIEBwYXJhbSB7VH0gW29wdGlvbmFsXVxuICogQHBhcmFtIHtUfSBbcmVzdF1cbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IG1ha2VTcGxpdFBheWxvYWQ9KFxuZW1wdHksXG5iYXNlLFxub3B0aW9uYWw9dW5kZWZpbmVkLFxucmVzdD11bmRlZmluZWQpPT5cbntcbmlmKHJlc3Qpe1xucmV0dXJuW2Jhc2Usb3B0aW9uYWx8fGVtcHR5LHJlc3RdO1xuIH1cbmlmKG9wdGlvbmFsKXtcbnJldHVybltiYXNlLG9wdGlvbmFsXTtcbiB9XG5yZXR1cm5bYmFzZV07XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0geydzeW5jJ3wnYXN5bmMnfSBjYWxsS2luZFxuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBhcmdHdWFyZHNcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gW29wdGlvbmFsQXJnR3VhcmRzXVxuICogQHBhcmFtIHtBcmdHdWFyZH0gW3Jlc3RBcmdHdWFyZF1cbiAqIEByZXR1cm5zIHtNZXRob2RHdWFyZE1ha2VyfVxuICovXG5jb25zdCBtYWtlTWV0aG9kR3VhcmRNYWtlcj0oXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzPXVuZGVmaW5lZCxcbnJlc3RBcmdHdWFyZD11bmRlZmluZWQpPT5cblxuaGFyZGVuKHtcbm9wdGlvbmFsOiguLi5vcHRBcmdHdWFyZHMpPT57XG5vcHRpb25hbEFyZ0d1YXJkcz09PXVuZGVmaW5lZHx8XG5GYWlsIGBDYW4gb25seSBoYXZlIG9uZSBzZXQgb2Ygb3B0aW9uYWwgZ3VhcmRzYDtcbnJlc3RBcmdHdWFyZD09PXVuZGVmaW5lZHx8XG5GYWlsIGBvcHRpb25hbCBhcmcgZ3VhcmRzIG11c3QgY29tZSBiZWZvcmUgcmVzdCBhcmdgO1xucmV0dXJuIG1ha2VNZXRob2RHdWFyZE1ha2VyKGNhbGxLaW5kLGFyZ0d1YXJkcyxvcHRBcmdHdWFyZHMpO1xuIH0sXG5yZXN0OihyQXJnR3VhcmQpPT57XG5yZXN0QXJnR3VhcmQ9PT11bmRlZmluZWR8fEZhaWwgYENhbiBvbmx5IGhhdmUgb25lIHJlc3QgYXJnYDtcbnJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yQXJnR3VhcmQpO1xuXG4gfSxcbnJldHVybnM6KHJldHVybkd1YXJkPVVuZGVmaW5lZFNoYXBlKT0+XG5oYXJkZW4oe1xua2xhc3M6J21ldGhvZEd1YXJkJyxcbmNhbGxLaW5kLFxuYXJnR3VhcmRzLFxub3B0aW9uYWxBcmdHdWFyZHMsXG5yZXN0QXJnR3VhcmQsXG5yZXR1cm5HdWFyZH0pfSk7XG5cblxuXG5jb25zdCBtYWtlQXdhaXRBcmdHdWFyZD0oYXJnR3VhcmQpPT5cbmhhcmRlbih7XG5rbGFzczonYXdhaXRBcmcnLFxuYXJnR3VhcmR9KTtcblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoZXJOYW1lc3BhY2V9ICovXG5jb25zdCBNPWhhcmRlbih7XG5hbnk6KCk9PkFueVNoYXBlLFxuYW5kOiguLi5wYXR0cyk9Pm1ha2VNYXRjaGVyKCdtYXRjaDphbmQnLHBhdHRzKSxcbm9yOiguLi5wYXR0cyk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpvcicscGF0dHMpLFxubm90OihzdWJQYXR0KT0+bWFrZU1hdGNoZXIoJ21hdGNoOm5vdCcsc3ViUGF0dCksXG5cbnNjYWxhcjooKT0+U2NhbGFyU2hhcGUsXG5rZXk6KCk9PktleVNoYXBlLFxucGF0dGVybjooKT0+UGF0dGVyblNoYXBlLFxua2luZDptYWtlS2luZE1hdGNoZXIsXG5ib29sZWFuOigpPT5Cb29sZWFuU2hhcGUsXG5udW1iZXI6KCk9Pk51bWJlclNoYXBlLFxuYmlnaW50OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJpZ2ludCcsW2xpbWl0c10pOkJpZ0ludFNoYXBlLFxubmF0OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm5hdCcsW2xpbWl0c10pOk5hdFNoYXBlLFxuc3RyaW5nOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN0cmluZycsW2xpbWl0c10pOlN0cmluZ1NoYXBlLFxuc3ltYm9sOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN5bWJvbCcsW2xpbWl0c10pOlN5bWJvbFNoYXBlLFxucmVjb3JkOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5yZWNvcmRPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpSZWNvcmRTaGFwZSxcbmFycmF5OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5hcnJheU9mKE0uYW55KCksbGltaXRzKTpBcnJheVNoYXBlLFxuc2V0OihsaW1pdHM9dW5kZWZpbmVkKT0+bGltaXRzP00uc2V0T2YoTS5hbnkoKSxsaW1pdHMpOlNldFNoYXBlLFxuYmFnOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5iYWdPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpCYWdTaGFwZSxcbm1hcDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00ubWFwT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6TWFwU2hhcGUsXG5yZW1vdGFibGU6bWFrZVJlbW90YWJsZU1hdGNoZXIsXG5lcnJvcjooKT0+RXJyb3JTaGFwZSxcbnByb21pc2U6KCk9PlByb21pc2VTaGFwZSxcbnVuZGVmaW5lZDooKT0+VW5kZWZpbmVkU2hhcGUsXG5udWxsOigpPT5udWxsLFxuXG5sdDoocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmx0JyxyaWdodE9wZXJhbmQpLFxubHRlOihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bHRlJyxyaWdodE9wZXJhbmQpLFxuZXE6KGtleSk9PntcbmFzc2VydEtleShrZXkpO1xucmV0dXJuIGtleT09PXVuZGVmaW5lZD9NLnVuZGVmaW5lZCgpOmtleTtcbiB9LFxubmVxOihrZXkpPT5NLm5vdChNLmVxKGtleSkpLFxuZ3RlOihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6Z3RlJyxyaWdodE9wZXJhbmQpLFxuZ3Q6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpndCcscmlnaHRPcGVyYW5kKSxcblxucmVjb3JkT2Y6KGtleVBhdHQ9TS5hbnkoKSx2YWx1ZVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6cmVjb3JkT2YnLFtrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHNdKSxcbmFycmF5T2Y6KHN1YlBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YXJyYXlPZicsW3N1YlBhdHQsbGltaXRzXSksXG5zZXRPZjooa2V5UGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzZXRPZicsW2tleVBhdHQsbGltaXRzXSksXG5iYWdPZjooa2V5UGF0dD1NLmFueSgpLGNvdW50UGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiYWdPZicsW2tleVBhdHQsY291bnRQYXR0LGxpbWl0c10pLFxubWFwT2Y6KGtleVBhdHQ9TS5hbnkoKSx2YWx1ZVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bWFwT2YnLFtrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHNdKSxcbnNwbGl0QXJyYXk6KGJhc2Usb3B0aW9uYWw9dW5kZWZpbmVkLHJlc3Q9dW5kZWZpbmVkKT0+XG5tYWtlTWF0Y2hlcihcbidtYXRjaDpzcGxpdEFycmF5Jyxcbm1ha2VTcGxpdFBheWxvYWQoW10sYmFzZSxvcHRpb25hbCxyZXN0KSksXG5cbnNwbGl0UmVjb3JkOihiYXNlLG9wdGlvbmFsPXVuZGVmaW5lZCxyZXN0PXVuZGVmaW5lZCk9PlxubWFrZU1hdGNoZXIoXG4nbWF0Y2g6c3BsaXRSZWNvcmQnLFxubWFrZVNwbGl0UGF5bG9hZCh7fSxiYXNlLG9wdGlvbmFsLHJlc3QpKSxcblxuc3BsaXQ6KGJhc2UscmVzdD11bmRlZmluZWQpPT57XG5pZihwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpPT09J2NvcHlBcnJheScpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG5yZXR1cm4gTS5zcGxpdEFycmF5KGJhc2UscmVzdCYmW10scmVzdCk7XG4gfWVsc2V7XG5yZXR1cm4gTS5zcGxpdFJlY29yZChiYXNlLHJlc3QmJnt9LHJlc3QpO1xuIH1cbiB9LFxucGFydGlhbDooYmFzZSxyZXN0PXVuZGVmaW5lZCk9PntcbmlmKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSk9PT0nY29weUFycmF5Jyl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIFdlIGtub3cgaXQgc2hvdWxkIGJlIGFuIGFycmF5Ki9cbnJldHVybiBNLnNwbGl0QXJyYXkoW10sYmFzZSxyZXN0KTtcbiB9ZWxzZXtcbnJldHVybiBNLnNwbGl0UmVjb3JkKHt9LGJhc2UscmVzdCk7XG4gfVxuIH0sXG5cbmVyZWY6KHQpPT5NLm9yKHQsTS5wcm9taXNlKCkpLFxub3B0Oih0KT0+TS5vcihNLnVuZGVmaW5lZCgpLHQpLFxuXG5pbnRlcmZhY2U6KGludGVyZmFjZU5hbWUsbWV0aG9kR3VhcmRzLHtzbG9wcHk9ZmFsc2V9PXt9KT0+e1xuZm9yKGNvbnN0W18sbWV0aG9kR3VhcmRdb2YgZW50cmllcyhtZXRob2RHdWFyZHMpKXtcbm1ldGhvZEd1YXJkLmtsYXNzPT09J21ldGhvZEd1YXJkJ3x8XG5GYWlsIGB1bnJlY29nbml6ZSBtZXRob2QgZ3VhcmQgJHttZXRob2RHdWFyZH1gO1xuIH1cbnJldHVybiBoYXJkZW4oe1xua2xhc3M6J0ludGVyZmFjZScsXG5pbnRlcmZhY2VOYW1lLFxubWV0aG9kR3VhcmRzLFxuc2xvcHB5fSk7XG5cbiB9LFxuY2FsbDooLi4uYXJnR3VhcmRzKT0+bWFrZU1ldGhvZEd1YXJkTWFrZXIoJ3N5bmMnLGFyZ0d1YXJkcyksXG5jYWxsV2hlbjooLi4uYXJnR3VhcmRzKT0+bWFrZU1ldGhvZEd1YXJkTWFrZXIoJ2FzeW5jJyxhcmdHdWFyZHMpLFxuXG5hd2FpdDooYXJnR3VhcmQpPT5tYWtlQXdhaXRBcmdHdWFyZChhcmdHdWFyZCl9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5tdXN0TWF0Y2gsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuZ2V0UmFua0NvdmVyLFxuTX0pO1xuXG4gfTtcblxuLyogT25seSBpbmNsdWRlIHRob3NlIHdob3NlIG1lYW5pbmcgaXMgaW5kZXBlbmRlbnQgb2YgYW4gaW1wdXRlZCBzb3J0IG9yZGVyKi9cbi8qIG9mIHJlbW90YWJsZXMsIG9yIG9mIGVuY29kaW5nIG9mIHBhc3NhYmxlIGFzIHNvcnRhYmxlIHN0cmluZ3MuIFRodXMsKi9cbi8qIGdldFJhbmtDb3ZlciBpcyBvbWl0dGVkLiBUbyBnZXQgb25lLCB5b3UnZCBuZWVkIHRvIGluc3RhbnRpYXRlKi9cbi8qIGBtYWtlUGF0dGVybktpdCgpYCB5b3Vyc2VsZi4gU2luY2UgdGhlcmUgYXJlIGN1cnJlbnRseSBubyBleHRlcm5hbCovXG4vKiB1c2VzIG9mIGBnZXRSYW5rQ292ZXJgLCBmb3IgY2xhcml0eSBkdXJpbmcgZGV2ZWxvcG1lbnQsIGBtYWtlUGF0dGVybktpdGAqL1xuLyogaXMgbm90IGN1cnJlbnRseSBleHBvcnRlZC4qL1xuY29uc3QgICAgICAge1xuY2hlY2tNYXRjaGVzLFxubWF0Y2hlcyxcbm11c3RNYXRjaCxcbmFzc2VydFBhdHRlcm4sXG5pc1BhdHRlcm4sXG5nZXRSYW5rQ292ZXIsXG5NfT1cbm1ha2VQYXR0ZXJuS2l0KCk7JGjigI1fb25jZS5jaGVja01hdGNoZXMoY2hlY2tNYXRjaGVzKTskaOKAjV9vbmNlLm1hdGNoZXMobWF0Y2hlcyk7JGjigI1fb25jZS5tdXN0TWF0Y2gobXVzdE1hdGNoKTskaOKAjV9vbmNlLmFzc2VydFBhdHRlcm4oYXNzZXJ0UGF0dGVybik7JGjigI1fb25jZS5pc1BhdHRlcm4oaXNQYXR0ZXJuKTskaOKAjV9vbmNlLmdldFJhbmtDb3ZlcihnZXRSYW5rQ292ZXIpOyRo4oCNX29uY2UuTShNKTtcblxuTU09TTtcblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVRhZ2dlZH0gQ29weVRhZ2dlZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlJhbmtDb21wYXJlfSBSYW5rQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUmFua0NvdmVyfSBSYW5rQ292ZXIgKi9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkFyZ0d1YXJkfSBBcmdHdWFyZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLk1ldGhvZEd1YXJkTWFrZXJ9IE1ldGhvZEd1YXJkTWFrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5NYXRjaGVyTmFtZXNwYWNlfSBNYXRjaGVyTmFtZXNwYWNlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuS2V5fSBLZXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5QYXR0ZXJufSBQYXR0ZXJuICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuUGF0dGVybktpdH0gUGF0dGVybktpdCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkNoZWNrUGF0dGVybn0gQ2hlY2tQYXR0ZXJuICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuTGltaXRzfSBMaW1pdHMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5BbGxMaW1pdHN9IEFsbExpbWl0cyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkdldFJhbmtDb3Zlcn0gR2V0UmFua0NvdmVyICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0Y2hIZWxwZXJcbiAqIFRoaXMgZmFjdG9ycyBvdXQgb25seSB0aGUgcGFydHMgc3BlY2lmaWMgdG8gZWFjaCBraW5kIG9mIE1hdGNoZXIuIEl0IGlzXG4gKiBlbmNhcHN1bGF0ZWQsIGFuZCBpdHMgbWV0aG9kcyBjYW4gbWFrZSB0aGUgc3RhdGVkIHVuY2hlY2tlciBhc3N1bXB0aW9uc1xuICogZW5mb3JjZWQgYnkgdGhlIGNvbW1vbiBjYWxsaW5nIGxvZ2ljLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXlsb2FkOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIGNoZWNrOiBDaGVja2VyXG4gKiApID0+IGJvb2xlYW59IGNoZWNrSXNXZWxsRm9ybWVkXG4gKiBSZXBvcnRzIHdoZXRoZXIgYGFsbGVnZWRQYXlsb2FkYCBpcyB2YWxpZCBhcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWRcbiAqIHdob3NlIHRhZyBjb3JyZXNwb25kcyB3aXRoIHRoaXMgTWF0Y2hIZWxwZXIncyBNYXRjaGVycy5cbiAqXG4gKiBAcHJvcGVydHkgeyhzcGVjaW1lbjogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBtYXRjaGVyUGF5bG9hZDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlcixcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzXG4gKiBBc3N1bWluZyB2YWxpZGl0eSBvZiBgbWF0Y2hlclBheWxvYWRgIGFzIHRoZSBwYXlsb2FkIG9mIGEgTWF0Y2hlciBjb3JyZXNwb25kaW5nXG4gKiB3aXRoIHRoaXMgTWF0Y2hIZWxwZXIsIHJlcG9ydHMgd2hldGhlciBgc3BlY2ltZW5gIGlzIG1hdGNoZWQgYnkgdGhhdCBNYXRjaGVyLlxuICpcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi4vdHlwZXMnKS5HZXRSYW5rQ292ZXJ9IGdldFJhbmtDb3ZlclxuICogQXNzdW1lcyB0aGlzIGlzIHRoZSBwYXlsb2FkIG9mIGEgQ29weVRhZ2dlZCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nXG4gKiBtYXRjaFRhZy4gUmV0dXJuIGEgUmFua0NvdmVyIHRvIGJvdW5kIGZyb20gYmVsb3cgYW5kIGFib3ZlLFxuICogaW4gcmFuayBvcmRlciwgYWxsIHBvc3NpYmxlIFBhc3NhYmxlcyB0aGF0IHdvdWxkIG1hdGNoIHRoaXMgTWF0Y2hlci5cbiAqIFRoZSBsZWZ0IGVsZW1lbnQgbXVzdCBiZSBiZWZvcmUgb3IgdGhlIHNhbWUgcmFuayBhcyBhbnkgcG9zc2libGVcbiAqIG1hdGNoaW5nIHNwZWNpbWVuLiBUaGUgcmlnaHQgZWxlbWVudCBtdXN0IGJlIGFmdGVyIG9yIHRoZSBzYW1lXG4gKiByYW5rIGFzIGFueSBwb3NzaWJsZSBtYXRjaGluZyBzcGVjaW1lbi5cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRMaW1pdHMiOlsiZGVmYXVsdExpbWl0cyJdLCJjaGVja01hdGNoZXMiOlsiY2hlY2tNYXRjaGVzIl0sIm1hdGNoZXMiOlsibWF0Y2hlcyJdLCJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiJdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIl0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiXSwiTSI6WyJNIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAACIAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJYe98fqGgAA6hoAACIAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL3V0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFwcGx5TGFiZWxpbmdFcnJvciIsImZyb21VbmlxdWVFbnRyaWVzIiwiaWRlbnRDaGVja2VyIiwibGlzdERpZmZlcmVuY2UiLCJvYmplY3RNYXAiLCJ0aHJvd0xhYmVsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxpc1Byb21pc2U7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuY29uc3R7ZnJvbUVudHJpZXMsZW50cmllc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiBUT0RPIG1pZ3JhdGUgdG8gcHJvcGVyIGhvbWUqL1xuLyogRnJvbSB0aGUgYGFnb3JpYy1zZGtgIG1vbm9yZXBvLiBNb3ZlZCBoZXJlIHRlbXBvcmFyaWx5IGJlY2F1c2UgdGhlIHBhdHRlcm4qL1xuLyogY29kZSBpcyBtaWdyYXRlZCBmcm9tIGBAYWdvcmljL3N0b3JlYCB0byBgQGVuZG8vcGF0dGVybnNgLCBhbmQgZGVwZW5kcyBvbiovXG4vKiB0aGUgZnVuY3Rpb25hbGl0eSBpbiB0aGlzIGZpbGUsIHdoaWNoIGlzIG90aGVyd2lzZSBhdmFpbGFibGUgb25seSovXG4vKiB3aXRoaW4gdGhlIGBhZ29yaWMtc2RrYCBtb25vcmVwby4qL1xuXG4vKipcbiAqIFRPRE8gYXMgbG9uZyBhcyBgQGVuZG8vcGFzcy1zdHlsZWAgcmVtYWlucyB0aGUgcHJvcGVyIGhvbWUgb2YgdGhlXG4gKiBgQ2hlY2tlcmAgdHlwZSwgaXQgcHJvYmFibHkgbWFrZXMgbW9zdCBzZW5zZSB0byBtb3ZlIGBpZGVudENoZWNrZXJgXG4gKiBpbnRvIGBAZW5kby9wYXNzLXN0eWxlYCBhcyB3ZWxsLlxuICpcbiAqIEluIHRoZSBgYXNzZXJ0Rm9vYC9gaXNGb29gL2BjaGVja0Zvb2AgcGF0dGVybiwgYGNoZWNrRm9vYCBoYXMgYSBgY2hlY2tgXG4gKiBwYXJhbWV0ZXIgb2YgdHlwZSBgQ2hlY2tlcmAuIGBhc3NlcnRGb29gIGNhbGxzIGBjaGVja0Zvb2AgcGFzc2VzXG4gKiBgYXNzZXJ0Q2hlY2tlcmAgYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpc0Zvb2AgcGFzc2VzIGBpZGVudENoZWNrZXJgXG4gKiBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlkZW50Q2hlY2tlcmAgYWN0cyBwcmVjaXNlbHkgbGlrZSBhblxuICogaWRlbnRpdHkgZnVuY3Rpb24sIGJ1dCBpcyB0eXBlZCBhcyBhIGBDaGVja2VyYCB0byBpbmRpY2F0ZSBpdHNcbiAqIGludGVuZGVkIHVzZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGlkZW50Q2hlY2tlcj0oY29uZCxfZGV0YWlscyk9PmNvbmQ7JGjigI1fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xuXG4vKipcbiAqIFRocm93cyBpZiBtdWx0aXBsZSBlbnRyaWVzIHVzZSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lLiBPdGhlcndpc2UgYWN0c1xuICogbGlrZSBgT2JqZWN0LmZyb21FbnRyaWVzYCBidXQgaGFyZGVucyB0aGUgcmVzdWx0LlxuICogVXNlIGl0IHRvIHByb3RlY3QgZnJvbSBwcm9wZXJ0eSBuYW1lcyBjb21wdXRlZCBmcm9tIHVzZXItcHJvdmlkZWQgZGF0YS5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLFZdPn0gYWxsRW50cmllc1xuICogQHJldHVybnMge3tbazogS106IFZ9fVxuICovXG5jb25zdCAgICAgICAgZnJvbVVuaXF1ZUVudHJpZXM9KGFsbEVudHJpZXMpPT57XG5jb25zdCBlbnRyaWVzQXJyYXk9Wy4uLmFsbEVudHJpZXNdO1xuY29uc3QgcmVzdWx0PWhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpKTtcbmlmKG93bktleXMocmVzdWx0KS5sZW5ndGg9PT1lbnRyaWVzQXJyYXkubGVuZ3RoKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuY29uc3QgbmFtZXM9bmV3IFNldCgpO1xuZm9yKGNvbnN0W25hbWUsX11vZiBlbnRyaWVzQXJyYXkpe1xuaWYobmFtZXMuaGFzKG5hbWUpKXtcbkZhaWwgYGNvbGxpc2lvbiBvbiBwcm9wZXJ0eSBuYW1lICR7cShuYW1lKX06ICR7ZW50cmllc0FycmF5fWA7XG4gfVxubmFtZXMuYWRkKG5hbWUpO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYDtcbiB9OyRo4oCNX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2ZcbiAqIGFuIGFycmF5IHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLFxuICogYG9iamVjdE1hcGAgd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIHN0cmluZy1uYW1lZCBvd24gZW51bWVyYWJsZVxuICogcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVHlwaWNhbCB1c2FnZSBhcHBsaWVzIGBvYmplY3RNYXBgIHRvIGEgQ29weVJlY29yZCwgaS5lLixcbiAqIGFuIG9iamVjdCBmb3Igd2hpY2ggYHBhc3NTdHlsZU9mKG9yaWdpbmFsKSA9PT0gJ2NvcHlSZWNvcmQnYC4gRm9yIHRoZXNlLFxuICogbm9uZSBvZiB0aGUgZm9sbG93aW5nIGVkZ2UgY2FzZXMgYXJpc2UuIFRoZSByZXN1bHQgd2lsbCBiZSBhIENvcHlSZWNvcmRcbiAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lcywgd2hvc2UgdmFsdWVzIGFyZSB0aGUgbWFwcGVkIGZvcm0gb2ZcbiAqIHRoZSBvcmlnaW5hbCdzIHZhbHVlcy5cbiAqXG4gKiBXaGVuIHRoZSBvcmlnaW5hbCBpcyBub3QgYSBDb3B5UmVjb3JkLCBzb21lIGVkZ2UgY2FzZXMgdG8gYmUgYXdhcmUgb2ZcbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIE9ubHkgdGhlIHN0cmluZy1uYW1lZCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbFxuICogICAgICBhcmUgbWFwcGVkLiBBbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgaWdub3JlZC5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCBgT2JqZWN0LmVudHJpZXNgXG4gKiAgICAgIHdpbGwgY2F1c2UgaXRzIGBnZXR0ZXJgIHRvIGJlIGNhbGxlZCBhbmQgd2lsbCB1c2UgdGhlIHJlc3VsdGluZ1xuICogICAgICB2YWx1ZS5cbiAqICAgICogTm8gbWF0dGVyIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHByb3BlcnR5IHdhcyBhbiBhY2Nlc3Nvciwgd3JpdGFibGUsXG4gKiAgICAgIG9yIGNvbmZpZ3VyYWJsZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogICAgICBub24td3JpdGFibGUsIG5vbi1jb25maWd1cmFibGUsIGRhdGEgcHJvcGVydGllcy5cbiAqICAgICogTm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBtYXkgaGF2ZSBpbmhlcml0ZWQgZnJvbSwgYW5kXG4gKiAgICAgIG5vIG1hdHRlciB3aGV0aGVyIGl0IHdhcyBhIHNwZWNpYWwga2luZCBvZiBvYmplY3Qgc3VjaCBhcyBhbiBhcnJheSxcbiAqICAgICAgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCBpbmhlcml0aW5nIGRpcmVjdGx5XG4gKiAgICAgIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFuZCB3aG9zZSBzdGF0ZSBpcyBvbmx5IHRoZXNlIG5ldyBtYXBwZWRcbiAqICAgICAgb3duIHByb3BlcnRpZXMuXG4gKlxuICogV2l0aCB0aGVzZSBkaWZmZXJlbmNlcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyBub3QgYSBDb3B5UmVjb3JkLFxuICogaWYgYWxsIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqIGEgQ29weVJlY29yZC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IE9cbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEB0ZW1wbGF0ZSBSIG1hcCByZXN1bHRcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW2tleW9mIE9dLCBrZXk6IGtleW9mIE8pID0+IFJ9IG1hcEZuXG4gKiBAcmV0dXJucyB7eyBbUCBpbiBrZXlvZiBPXTogUn19XG4gKi9cbmNvbnN0ICAgICAgICBvYmplY3RNYXA9KG9yaWdpbmFsLG1hcEZuKT0+e1xuY29uc3QgZW50cz1lbnRyaWVzKG9yaWdpbmFsKTtcbmNvbnN0IG1hcEVudHM9ZW50cy5tYXAoKFtrLHZdKT0+W2ssbWFwRm4odixrKV0pO1xucmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSk7XG4gfTskaOKAjV9vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gbGVmdE5hbWVzXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IHJpZ2h0TmFtZXNcbiAqL1xuY29uc3QgICAgICAgIGxpc3REaWZmZXJlbmNlPShsZWZ0TmFtZXMscmlnaHROYW1lcyk9PntcbmNvbnN0IHJpZ2h0U2V0PW5ldyBTZXQocmlnaHROYW1lcyk7XG5yZXR1cm4gbGVmdE5hbWVzLmZpbHRlcigobmFtZSk9PiFyaWdodFNldC5oYXMobmFtZSkpO1xuIH07JGjigI1fb25jZS5saXN0RGlmZmVyZW5jZShsaXN0RGlmZmVyZW5jZSk7XG5oYXJkZW4obGlzdERpZmZlcmVuY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3J9IGlubmVyRXJyXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxhYmVsXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3I9fSBFcnJvckNvbnN0cnVjdG9yXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cblxuLyogRXZhZGUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xNDUwIHVzaW5nIGJsYW5rIGxpbmUqL1xuY29uc3QgICAgICAgIHRocm93TGFiZWxlZD0oaW5uZXJFcnIsbGFiZWwsRXJyb3JDb25zdHJ1Y3Rvcj11bmRlZmluZWQpPT57XG5pZih0eXBlb2YgbGFiZWw9PT0nbnVtYmVyJyl7XG5sYWJlbD0gYFske2xhYmVsfV1gO1xuIH1cbmNvbnN0IG91dGVyRXJyPWFzc2VydC5lcnJvcihcbiBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLFxuRXJyb3JDb25zdHJ1Y3Rvcik7XG5cbmFzc2VydC5ub3RlKG91dGVyRXJyLFggYENhdXNlZCBieSAke2lubmVyRXJyfWApO1xudGhyb3cgb3V0ZXJFcnI7XG4gfTskaOKAjV9vbmNlLnRocm93TGFiZWxlZCh0aHJvd0xhYmVsZWQpO1xuaGFyZGVuKHRocm93TGFiZWxlZCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEEsUlxuICogQHBhcmFtIHsoLi4uYXJnczogQVtdKSA9PiBSfSBmdW5jXG4gKiBAcGFyYW0ge0FbXX0gYXJnc1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Un1cbiAqL1xuY29uc3QgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcj0oZnVuYyxhcmdzLGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGxhYmVsPT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jKC4uLmFyZ3MpO1xuIH1cbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbnRocm93TGFiZWxlZChlcnIsbGFiZWwpO1xuIH1cbmlmKGlzUHJvbWlzZShyZXN1bHQpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgSWYgcmVzdWx0IGlzIGEgcmVqZWN0ZWQgcHJvbWlzZSwgdGhpcyB3aWxsKi9cbi8qIHJldHVybiBhIHByb21pc2Ugd2l0aCBhIGRpZmZlcmVudCByZWplY3Rpb24gcmVhc29uLiBCdXQgdGhpcyovXG4vKiBjb25mdXNlcyBUeXBlU2NyaXB0IGJlY2F1c2UgaXQgdHlwZXMgdGhhdCBjYXNlIGFzIGBQcm9taXNlPG5ldmVyPmAqL1xuLyogd2hpY2ggaXMgY29vbCBmb3IgYSBwcm9taXNlIHRoYXQgd2lsbCBuZXZlciBmdWxmbGwuKi9cbi8qIEJ1dCBUeXBlU2NyaXB0IGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IHRoaXMgd2lsbCBvbmx5IGhhcHBlbiovXG4vKiB3aGVuIGByZXN1bHRgIHdhcyBhIHJlamVjdGVkIHByb21pc2UuIEluIG9ubHkgdGhpcyBjYXNlIGBSYCovXG4vKiBzaG91bGQgYWxyZWFkeSBhbGxvdyBgUHJvbWlzZTxuZXZlcj5gIGFzIGEgc3VidHlwZS4qL1xucmV0dXJuIEUud2hlbihyZXN1bHQsdW5kZWZpbmVkLChyZWFzb24pPT50aHJvd0xhYmVsZWQocmVhc29uLGxhYmVsKSk7XG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZGVudENoZWNrZXIiOlsiaWRlbnRDaGVja2VyIl0sImZyb21VbmlxdWVFbnRyaWVzIjpbImZyb21VbmlxdWVFbnRyaWVzIl0sIm9iamVjdE1hcCI6WyJvYmplY3RNYXAiXSwibGlzdERpZmZlcmVuY2UiOlsibGlzdERpZmZlcmVuY2UiXSwidGhyb3dMYWJlbGVkIjpbInRocm93TGFiZWxlZCJdLCJhcHBseUxhYmVsaW5nRXJyb3IiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAApSvp9wCQAAcAkAACIAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZVByb21pc2VLaXQiLCJyYWNlUHJvbWlzZXMiXSwicmVleHBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQsbWVtb1JhY2U7JGjigI1faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL21lbW8tcmFjZS5qc1wiLCBbW1wibWVtb1JhY2VcIiwgWyRo4oCNX2EgPT4gKG1lbW9SYWNlID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL2lzLXByb21pc2UuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlUHJvbWlzZUtpdCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZVByb21pc2VLaXRcIn0pOyRo4oCNX29uY2UubWFrZVByb21pc2VLaXQobWFrZVByb21pc2VLaXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyYWNlUHJvbWlzZXMsICduYW1lJywge3ZhbHVlOiBcInJhY2VQcm9taXNlc1wifSk7JGjigI1fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtQcm9taXNlQ29uc3RydWN0b3J9ICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlPWdsb2JhbFRoaXMuSGFuZGxlZFByb21pc2V8fFByb21pc2U7XG5cbi8qKlxuICogbWFrZVByb21pc2VLaXQoKSBidWlsZHMgYSBQcm9taXNlIG9iamVjdCwgYW5kIHJldHVybnMgYSByZWNvcmRcbiAqIGNvbnRhaW5pbmcgdGhlIHByb21pc2UgaXRzZWxmLCBhcyB3ZWxsIGFzIHNlcGFyYXRlIGZhY2V0cyBmb3IgcmVzb2x2aW5nXG4gKiBhbmQgcmVqZWN0aW5nIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9zcmMvdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+fVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZVByb21pc2VLaXQoKXtcbmNvbnN0e3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfT1tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuY29uc3QgcHJvbWlzZT1uZXcgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZShleGVjdXRvcik7XG5cbnJldHVybiBoYXJkZW4oe3Byb21pc2UscmVzb2x2ZSxyZWplY3R9KTtcbiB9XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vKiBOQjogQW5vdGhlciBpbXBsZW1lbnRhdGlvbiBmb3IgUHJvbWlzZS5yYWNlIHdvdWxkIGJlIHRvIHVzZSB0aGUgcmVsZWFzaW5nIGV4ZWN1dG9yLCovXG4vKiBIb3dldmVyIHdoaWxlIGl0IHdvdWxkIG5vIGxvbmdlciBsZWFrIHRoZSByYWNlZCBwcm9taXNlIG9iamVjdHMgdGhlbXNlbHZlcywgaXQgd291bGQqL1xuLyogc3RpbGwgbGVhayByZWFjdGlvbnMgb24gdGhlIG5vbi1yZXNvbHZlZCBwcm9taXNlcyBjb250ZW5kaW5nIGZvciB0aGUgcmFjZS4qL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbmZ1bmN0aW9uICAgICAgICByYWNlUHJvbWlzZXModmFsdWVzKXtcbnJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLHZhbHVlcykpO1xuIH1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiH2BrN8CAADfAgAAKwAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsICduYW1lJywge3ZhbHVlOiBcImlzUHJvbWlzZVwifSk7JGjigI1fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsgICAvKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbWF5YmVQcm9taXNlIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7bWF5YmVQcm9taXNlIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmZ1bmN0aW9uICAgICAgICBpc1Byb21pc2UobWF5YmVQcm9taXNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKT09PW1heWJlUHJvbWlzZTtcbiB9XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB2nTeu+EgAAvhIAACoAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogSW5pdGlhbCB2ZXJzaW9uIGF1dGhvcmVkIGJ5IEJyaWFuIEtpbTpcbmh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMTc0NjkjaXNzdWVjb21tZW50LTY4NTIxNjc3N1xuIFRoaXMgaXMgZnJlZSBhbmQgdW5lbmN1bWJlcmVkIHNvZnR3YXJlIHJlbGVhc2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4uXG4gQW55b25lIGlzIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBwdWJsaXNoLCB1c2UsIGNvbXBpbGUsIHNlbGwsIG9yXG5kaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGVpdGhlciBpbiBzb3VyY2UgY29kZSBmb3JtIG9yIGFzIGEgY29tcGlsZWRcbmJpbmFyeSwgZm9yIGFueSBwdXJwb3NlLCBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsLCBhbmQgYnkgYW55XG5tZWFucy5cbiBJbiBqdXJpc2RpY3Rpb25zIHRoYXQgcmVjb2duaXplIGNvcHlyaWdodCBsYXdzLCB0aGUgYXV0aG9yIG9yIGF1dGhvcnNcbm9mIHRoaXMgc29mdHdhcmUgZGVkaWNhdGUgYW55IGFuZCBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZVxuc29mdHdhcmUgdG8gdGhlIHB1YmxpYyBkb21haW4uIFdlIG1ha2UgdGhpcyBkZWRpY2F0aW9uIGZvciB0aGUgYmVuZWZpdFxub2YgdGhlIHB1YmxpYyBhdCBsYXJnZSBhbmQgdG8gdGhlIGRldHJpbWVudCBvZiBvdXIgaGVpcnMgYW5kXG5zdWNjZXNzb3JzLiBXZSBpbnRlbmQgdGhpcyBkZWRpY2F0aW9uIHRvIGJlIGFuIG92ZXJ0IGFjdCBvZlxucmVsaW5xdWlzaG1lbnQgaW4gcGVycGV0dWl0eSBvZiBhbGwgcHJlc2VudCBhbmQgZnV0dXJlIHJpZ2h0cyB0byB0aGlzXG5zb2Z0d2FyZSB1bmRlciBjb3B5cmlnaHQgbGF3LlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SXG5PVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSxcbkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUlxuT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG8gPGh0dHA6Ly91bmxpY2Vuc2Uub3JnLz5cbiovXG5cblxuXG5cblxuXG5cbmNvbnN0IGlzT2JqZWN0PSh2YWx1ZSk9Pk9iamVjdCh2YWx1ZSk9PT12YWx1ZTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gRGVmZXJyZWRcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlPzogWGltcG9ydChcIi4vdHlwZXMuanNcIikuRVJlZjxUPiApID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwcm9wZXJ0eSB7KGVycj86IGFueSApID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBuZXZlclxuICogIHwge3NldHRsZWQ6IGZhbHNlLCBkZWZlcnJlZHM6IFNldDxEZWZlcnJlZD59XG4gKiAgfCB7c2V0dGxlZDogdHJ1ZSwgZGVmZXJyZWRzPzogdW5kZWZpbmVkfVxuICogfSBQcm9taXNlTWVtb1JlY29yZFxuICovXG5cbi8qIEtleXMgYXJlIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIHJhY2UsIHZhbHVlcyBhcmUgYSByZWNvcmQgb2YgZGF0YSBjb250YWluaW5nIGEqL1xuLyogc2V0IG9mIGRlZmVycmVkcyBhbmQgd2hldGhlciB0aGUgdmFsdWUgaGFzIHNldHRsZWQuKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIFByb21pc2VNZW1vUmVjb3JkPn0gKi9cbmNvbnN0IGtub3duUHJvbWlzZXM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2VNZW1vUmVjb3JkIHwgdW5kZWZpbmVkfSByZWNvcmRcbiAqIEByZXR1cm5zIHtTZXQ8RGVmZXJyZWQ+fVxuICovXG5jb25zdCBtYXJrU2V0dGxlZD0ocmVjb3JkKT0+e1xuaWYoIXJlY29yZHx8cmVjb3JkLnNldHRsZWQpe1xucmV0dXJuIG5ldyBTZXQoKTtcbiB9XG5cbmNvbnN0e2RlZmVycmVkc309cmVjb3JkO1xuT2JqZWN0LmFzc2lnbihyZWNvcmQse1xuZGVmZXJyZWRzOnVuZGVmaW5lZCxcbnNldHRsZWQ6dHJ1ZX0pO1xuXG5PYmplY3QuZnJlZXplKHJlY29yZCk7XG5yZXR1cm4gZGVmZXJyZWRzO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2VNZW1vUmVjb3JkfVxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkPSh2YWx1ZSk9PntcbmlmKCFpc09iamVjdCh2YWx1ZSkpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBhIHByaW1pdGl2ZSwgYXR0ZW1wdGluZyB0byB1c2UgaXQgYXMgYSBrZXkgaW4gdGhlKi9cbi8qIHdlYWttYXAgd291bGQgdGhyb3cgYW4gZXJyb3IuIEx1Y2tpbHksIGl0IGlzIHNhZmUgdG8gY2FsbCovXG4vKiBgUHJvbWlzZS5yZXNvbHZlKGNvbnRlbmRlcikudGhlbmAgb24gYSBwcmltaXRpdmUgdmFsdWUgbXVsdGlwbGUgdGltZXMqL1xuLyogYmVjYXVzZSB0aGUgcHJvbWlzZSBmdWxmaWxscyBpbW1lZGlhdGVseS4gU28gd2UgZmFrZSBhIHNldHRsZWQgcmVjb3JkLiovXG5yZXR1cm4gaGFyZGVuKHtzZXR0bGVkOnRydWV9KTtcbiB9XG5cbmxldCByZWNvcmQ9a25vd25Qcm9taXNlcy5nZXQodmFsdWUpO1xuXG5pZighcmVjb3JkKXtcbnJlY29yZD17ZGVmZXJyZWRzOm5ldyBTZXQoKSxzZXR0bGVkOmZhbHNlfTtcbmtub3duUHJvbWlzZXMuc2V0KHZhbHVlLHJlY29yZCk7XG4vKiBUaGlzIGNhbGwgdG8gYHRoZW5gIGhhcHBlbnMgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB2YWx1ZS4qL1xuUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuKHZhbCk9PntcbmZvcihjb25zdHtyZXNvbHZlfW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVzb2x2ZSh2YWwpO1xuIH1cbiB9LFxuKGVycik9PntcbmZvcihjb25zdHtyZWplY3R9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZWplY3QoZXJyKTtcbiB9XG4gfSk7XG5cbiB9XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0e3JhY2V9PXtcbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gW1A9UHJvbWlzZUNvbnN0cnVjdG9yXVxuICogQHRoaXMge1B9XG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xucmFjZSh2YWx1ZXMpe1xubGV0IGRlZmVycmVkO1xuLyoqIEB0eXBlIHtUW119ICovXG5jb25zdCBjYWNoZWRWYWx1ZXM9W107XG5jb25zdCBDPXRoaXM7XG5jb25zdCByZXN1bHQ9bmV3IEMoKHJlc29sdmUscmVqZWN0KT0+e1xuZGVmZXJyZWQ9e3Jlc29sdmUscmVqZWN0fTtcbmZvcihjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpe1xuY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuY29uc3R7c2V0dGxlZCxkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoc2V0dGxlZCl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIHNldHRsZWQgKGluY2x1ZGluZyBwcmltaXRpdmVzKSwgaXQgaXMgc2FmZSovXG4vKiB0byBjYWxsIGBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW5gIG9uIGl0LiovXG5DLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSxyZWplY3QpO1xuIH1lbHNle1xuZGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcblxuLyogVGhlIGZpbmFsbHkgY2FsbGJhY2sgZXhlY3V0ZXMgd2hlbiBhbnkgdmFsdWUgc2V0dGxlcywgcHJldmVudGluZyBhbnkgb2YqL1xuLyogdGhlIHVucmVzb2x2ZWQgdmFsdWVzIGZyb20gcmV0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZXNvbHZlZCB2YWx1ZS4qL1xucmV0dXJuIHJlc3VsdC5maW5hbGx5KCgpPT57XG5mb3IoY29uc3QgdmFsdWUgb2YgY2FjaGVkVmFsdWVzKXtcbmNvbnN0e2RlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihkZWZlcnJlZHMpe1xuZGVmZXJyZWRzLmRlbGV0ZShkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcbiB9fTskaOKAjV9vbmNlLnJhY2UocmFjZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWVtb1JhY2UiOlsicmFjZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADTQ7DuaQcAAGkHAAA1AAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBQcm9taXNlRXhlY3V0b3IgVGhlIHByb21pc2UgZXhlY3V0b3JcbiAqIEBwYXJhbSB7KHZhbHVlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCkgYnVpbGRzIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyB3aGljaCBkcm9wIHJlZmVyZW5jZXNcbiAqIHRvIHRoZSByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgZ2F0aGVyZWQgZnJvbSBhbiBleGVjdXRvciB0byBiZSB1c2VkIHdpdGggYVxuICogcHJvbWlzZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1BpY2s8WGltcG9ydCgnLi90eXBlcy5qcycpLlByb21pc2VLaXQ8VD4sICdyZXNvbHZlJyB8ICdyZWplY3QnPiAmIHsgZXhlY3V0b3I6IFByb21pc2VFeGVjdXRvcjxUPn19XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgodmFsdWU6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlc29sdmU7XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZWplY3Q7XG5cbi8qKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+fSB2YWx1ZSAqL1xuY29uc3QgcmVzb2x2ZT0odmFsdWUpPT57XG5pZihpbnRlcm5hbFJlc29sdmUpe1xuaW50ZXJuYWxSZXNvbHZlKHZhbHVlKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT1udWxsKTtcbiB9XG4gfTtcblxuLyoqIEBwYXJhbSB7dW5rbm93bn0gcmVhc29uICovXG5jb25zdCByZWplY3Q9KHJlYXNvbik9PntcbmlmKGludGVybmFsUmVqZWN0KXtcbmludGVybmFsUmVqZWN0KHJlYXNvbik7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZWplY3Q9PT1udWxsKTtcbiB9XG4gfTtcblxuY29uc3QgZXhlY3V0b3I9KHJlcyxyZWopPT57XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09dW5kZWZpbmVkJiZpbnRlcm5hbFJlamVjdD09PXVuZGVmaW5lZCk7XG5pbnRlcm5hbFJlc29sdmU9cmVzO1xuaW50ZXJuYWxSZWplY3Q9cmVqO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xuaGFyZGVuKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0IjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACYGTuzNAEAADQBAAAmAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADK4l5PQYAAD0GAAAHQAAAEBlbmRvL3N0cmVhbS12MC4zLjI1L2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIm1ha2VQaXBlIiwibWFrZVF1ZXVlIiwibWFrZVN0cmVhbSIsIm1hcFJlYWRlciIsIm1hcFdyaXRlciIsInByaW1lIiwicHVtcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLG1ha2VQcm9taXNlS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3tcbiAqICAgcmVzb2x2ZSh2YWx1ZT86IFQgfCBQcm9taXNlPFQ+KTogdm9pZCxcbiAqICAgcmVqZWN0KGVycm9yOiBFcnJvcik6IHZvaWQsXG4gKiAgIHByb21pc2U6IFByb21pc2U8VD5cbiAqIH19IFByb21pc2VLaXRcbiAqL1xuXG4vKiBUeXBlU2NyaXB0IFJlYWRPbmx5IHNlbWFudGljcyBhcmUgbm90IHN1ZmZpY2llbnRseSBleHByZXNzaXZlIHRvIGRpc3Rpbmd1aXNoKi9cbi8qIGEgdmFsdWUgb25lIHByb21pc2VzIG5vdCB0byBhbHRlciBmcm9tIGEgdmFsdWUgb25lIG11c3Qgbm90IGFsdGVyLCovXG4vKiBtYWtpbmcgaXQgdXNlbGVzcy4qL1xuY29uc3QgZnJlZXplPS8qKiBAdHlwZSB7PFQ+KHY6IFQgfCBSZWFkb25seTxUPikgPT4gVH0gKi9PYmplY3QuZnJlZXplO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi90eXBlcy5qcycpLkFzeW5jUXVldWU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUXVldWU9KCk9PntcbmxldHtwcm9taXNlOnRhaWxQcm9taXNlLHJlc29sdmU6dGFpbFJlc29sdmV9PW1ha2VQcm9taXNlS2l0KCk7XG5yZXR1cm57XG5wdXQodmFsdWUpe1xuY29uc3R7cmVzb2x2ZSxwcm9taXNlfT1tYWtlUHJvbWlzZUtpdCgpO1xudGFpbFJlc29sdmUoZnJlZXplKHt2YWx1ZSxwcm9taXNlfSkpO1xudGFpbFJlc29sdmU9cmVzb2x2ZTtcbiB9LFxuZ2V0KCl7XG5jb25zdCBwcm9taXNlPXRhaWxQcm9taXNlLnRoZW4oKG5leHQpPT5uZXh0LnZhbHVlKTtcbnRhaWxQcm9taXNlPXRhaWxQcm9taXNlLnRoZW4oKG5leHQpPT5uZXh0LnByb21pc2UpO1xucmV0dXJuIGhhcmRlbihwcm9taXNlKTtcbiB9fTtcblxuIH07JGjigI1fb25jZS5tYWtlUXVldWUobWFrZVF1ZXVlKTtcbmhhcmRlbihtYWtlUXVldWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUUmVhZFxuICogQHRlbXBsYXRlIFRXcml0ZVxuICogQHRlbXBsYXRlIFRSZWFkUmV0dXJuXG4gKiBAdGVtcGxhdGUgVFdyaXRlUmV0dXJuXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Bc3luY1F1ZXVlPEl0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmVhZFJldHVybj4+fSBhY2tzXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Bc3luY1F1ZXVlPEl0ZXJhdG9yUmVzdWx0PFRXcml0ZSwgVFdyaXRlUmV0dXJuPj59IGRhdGFcbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdHJlYW09KGFja3MsZGF0YSk9PntcbmNvbnN0IHN0cmVhbT1oYXJkZW4oe1xuLyoqXG4gKiBAcGFyYW0ge1RXcml0ZX0gdmFsdWVcbiAqL1xubmV4dCh2YWx1ZSl7XG4vKiBOb3RlIHRoZSBzaGFsbG93IGZyZWV6ZSBzaW5jZSB2YWx1ZSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBmcmVlemFibGUqL1xuLyogKHR5cGVkIGFycmF5cyBhcmUgbm90KS4qL1xuZGF0YS5wdXQoZnJlZXplKHt2YWx1ZSxkb25lOmZhbHNlfSkpO1xucmV0dXJuIGFja3MuZ2V0KCk7XG4gfSxcbi8qKlxuICogQHBhcmFtIHtUV3JpdGVSZXR1cm59IHZhbHVlXG4gKi9cbnJldHVybih2YWx1ZSl7XG5kYXRhLnB1dChmcmVlemUoe3ZhbHVlLGRvbmU6dHJ1ZX0pKTtcbnJldHVybiBhY2tzLmdldCgpO1xuIH0sXG4vKipcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yXG4gKi9cbnRocm93KGVycm9yKXtcbmRhdGEucHV0KGhhcmRlbihQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbnJldHVybiBhY2tzLmdldCgpO1xuIH0sXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7XG5yZXR1cm4gc3RyZWFtO1xuIH19KTtcblxucmV0dXJuIHN0cmVhbTtcbiB9OyRo4oCNX29uY2UubWFrZVN0cmVhbShtYWtlU3RyZWFtKTtcbmhhcmRlbihtYWtlU3RyZWFtKTtcblxuLyogSlNEb2MgVHlwZVNjcmlwdCBzZWVtcyB1bmFibGUgdG8gZXhwcmVzcyB0aGlzIHBhcnRpY3VsYXIgZnVuY3Rpb24ncyovXG4vKiBlbnRhbmdsZW1lbnQgb2YgcXVldWVzLCBidXQgdGhlIGRlZmluaXRpb24gaW4gdHlwZXMuZC50cyB3b3JrcyBmb3IgdGhlIGVuZCovXG4vKiB1c2VyLiovXG5jb25zdCAgICAgICAgbWFrZVBpcGU9KCk9PntcbmNvbnN0IGRhdGE9bWFrZVF1ZXVlKCk7XG5jb25zdCBhY2tzPW1ha2VRdWV1ZSgpO1xuY29uc3QgcmVhZGVyPW1ha2VTdHJlYW0oYWNrcyxkYXRhKTtcbmNvbnN0IHdyaXRlcj1tYWtlU3RyZWFtKGRhdGEsYWNrcyk7XG5yZXR1cm4gaGFyZGVuKFt3cml0ZXIscmVhZGVyXSk7XG4gfTskaOKAjV9vbmNlLm1ha2VQaXBlKG1ha2VQaXBlKTtcbmhhcmRlbihtYWtlUGlwZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRSZWFkXG4gKiBAdGVtcGxhdGUgVFdyaXRlXG4gKiBAdGVtcGxhdGUgVFJlYWRSZXR1cm5cbiAqIEB0ZW1wbGF0ZSBUV3JpdGVSZXR1cm5cbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlN0cmVhbTxUV3JpdGUsIFRSZWFkLCBUV3JpdGVSZXR1cm4sIFRSZWFkUmV0dXJuPn0gd3JpdGVyXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TdHJlYW08VFJlYWQsIFRXcml0ZSwgVFJlYWRSZXR1cm4sIFRXcml0ZVJldHVybj59IHJlYWRlclxuICogQHBhcmFtIHtUV3JpdGV9IHByaW1lclxuICovXG5jb25zdCAgICAgICAgcHVtcD1hc3luYyh3cml0ZXIscmVhZGVyLHByaW1lcik9Pntcbi8qKiBAcGFyYW0ge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VFJlYWQsIFRSZWFkUmV0dXJuPj59IHByb21pc2UgKi9cbmNvbnN0IHRpY2s9KHByb21pc2UpPT5cbkUud2hlbihcbnByb21pc2UsXG4ocmVzdWx0KT0+e1xuaWYocmVzdWx0LmRvbmUpe1xucmV0dXJuIHdyaXRlci5yZXR1cm4ocmVzdWx0LnZhbHVlKTtcbiB9ZWxzZXtcbi8qIEJlaG9sZDogbXV0dWFsIHJlY3Vyc2lvbi4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiB0b2NrKHdyaXRlci5uZXh0KHJlc3VsdC52YWx1ZSkpO1xuIH1cbiB9LFxuKC8qKiBAdHlwZSB7RXJyb3J9ICovZXJyb3IpPT57XG5yZXR1cm4gd3JpdGVyLnRocm93KGVycm9yKTtcbiB9KTtcblxuLyoqIEBwYXJhbSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUV3JpdGUsIFRXcml0ZVJldHVybj4+fSBwcm9taXNlICovXG5jb25zdCB0b2NrPShwcm9taXNlKT0+XG5FLndoZW4oXG5wcm9taXNlLFxuKHJlc3VsdCk9PntcbmlmKHJlc3VsdC5kb25lKXtcbnJldHVybiByZWFkZXIucmV0dXJuKHJlc3VsdC52YWx1ZSk7XG4gfWVsc2V7XG5yZXR1cm4gdGljayhyZWFkZXIubmV4dChyZXN1bHQudmFsdWUpKTtcbiB9XG4gfSxcbigvKiogQHR5cGUge0Vycm9yfSAqL2Vycm9yKT0+e1xucmV0dXJuIHJlYWRlci50aHJvdyhlcnJvcik7XG4gfSk7XG5cbmF3YWl0IHRpY2socmVhZGVyLm5leHQocHJpbWVyKSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07JGjigI1fb25jZS5wdW1wKHB1bXApO1xuaGFyZGVuKHB1bXApO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUUmVhZFxuICogQHRlbXBsYXRlIFRXcml0ZVxuICogQHRlbXBsYXRlIFRSZXR1cm5cbiAqIEBwYXJhbSB7QXN5bmNHZW5lcmF0b3I8VFJlYWQsIFRSZXR1cm4sIFRXcml0ZT59IGdlbmVyYXRvclxuICogQHBhcmFtIHtUV3JpdGV9IHByaW1lclxuICovXG5jb25zdCAgICAgICAgcHJpbWU9KGdlbmVyYXRvcixwcmltZXIpPT57XG4vKiBXZSBjYXB0dXJlIHRoZSBmaXJzdCByZXR1cm5lZCBwcm9taXNlLiovXG5jb25zdCBmaXJzdD1nZW5lcmF0b3IubmV4dChwcmltZXIpO1xuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJldHVybj49fSAqL1xubGV0IHJlc3VsdDtcbmNvbnN0IHByaW1lZD1oYXJkZW4oe1xuLyoqIEBwYXJhbSB7VFdyaXRlfSB2YWx1ZSAqL1xuICAgICAgYXN5bmMgbmV4dCh2YWx1ZSl7XG5pZihyZXN1bHQ9PT11bmRlZmluZWQpe1xucmVzdWx0PWF3YWl0IGZpcnN0O1xuaWYocmVzdWx0LmRvbmUpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxucmV0dXJuIGdlbmVyYXRvci5uZXh0KHZhbHVlKTtcbiB9LFxuLyoqIEBwYXJhbSB7VFJldHVybn0gdmFsdWUgKi9cbiAgICAgIGFzeW5jIHJldHVybih2YWx1ZSl7XG5pZihyZXN1bHQ9PT11bmRlZmluZWQpe1xucmVzdWx0PWF3YWl0IGZpcnN0O1xuaWYocmVzdWx0LmRvbmUpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxucmV0dXJuIGdlbmVyYXRvci5yZXR1cm4odmFsdWUpO1xuIH0sXG4vKiogQHBhcmFtIHtFcnJvcn0gZXJyb3IgKi9cbiAgICAgIGFzeW5jIHRocm93KGVycm9yKXtcbmlmKHJlc3VsdD09PXVuZGVmaW5lZCl7XG5yZXN1bHQ9YXdhaXQgZmlyc3Q7XG5pZihyZXN1bHQuZG9uZSl7XG50aHJvdyBlcnJvcjtcbiB9XG4gfVxucmV0dXJuIGdlbmVyYXRvci50aHJvdyhlcnJvcik7XG4gfX0pO1xuXG5yZXR1cm4gcHJpbWVkO1xuIH07JGjigI1fb25jZS5wcmltZShwcmltZSk7XG5oYXJkZW4ocHJpbWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUSW5cbiAqIEB0ZW1wbGF0ZSBUT3V0XG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZWFkZXI8VEluPn0gcmVhZGVyXG4gKiBAcGFyYW0geyh2YWx1ZTogVEluKSA9PiBUT3V0fSB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZGVyPFRPdXQ+fVxuICovXG5jb25zdCAgICAgICAgbWFwUmVhZGVyPShyZWFkZXIsdHJhbnNmb3JtKT0+e1xuYXN5bmMgZnVuY3Rpb24qdHJhbnNmb3JtR2VuZXJhdG9yKCl7XG5mb3IgYXdhaXQoY29uc3QgdmFsdWUgb2YgcmVhZGVyKXtcbnlpZWxkIHRyYW5zZm9ybSh2YWx1ZSk7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm4gaGFyZGVuKHRyYW5zZm9ybUdlbmVyYXRvcigpKTtcbiB9OyRo4oCNX29uY2UubWFwUmVhZGVyKG1hcFJlYWRlcik7XG5oYXJkZW4obWFwUmVhZGVyKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVEluXG4gKiBAdGVtcGxhdGUgVE91dFxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuV3JpdGVyPFRPdXQ+fSB3cml0ZXJcbiAqIEBwYXJhbSB7KHZhbHVlOiBUSW4pID0+IFRPdXR9IHRyYW5zZm9ybVxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Xcml0ZXI8VEluPn1cbiAqL1xuY29uc3QgICAgICAgIG1hcFdyaXRlcj0od3JpdGVyLHRyYW5zZm9ybSk9PntcbmNvbnN0IHRyYW5zZm9ybWVkV3JpdGVyPWhhcmRlbih7XG4vKipcbiAqIEBwYXJhbSB7VElufSB2YWx1ZVxuICovXG4gICAgICBhc3luYyBuZXh0KHZhbHVlKXtcbnJldHVybiB3cml0ZXIubmV4dCh0cmFuc2Zvcm0odmFsdWUpKTtcbiB9LFxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICovXG4gICAgICBhc3luYyB0aHJvdyhlcnJvcil7XG5yZXR1cm4gd3JpdGVyLnRocm93KGVycm9yKTtcbiB9LFxuLyoqXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gdmFsdWVcbiAqL1xuICAgICAgYXN5bmMgcmV0dXJuKHZhbHVlKXtcbnJldHVybiB3cml0ZXIucmV0dXJuKHZhbHVlKTtcbiB9LFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe1xucmV0dXJuIHRyYW5zZm9ybWVkV3JpdGVyO1xuIH19KTtcblxucmV0dXJuIHRyYW5zZm9ybWVkV3JpdGVyO1xuIH07JGjigI1fb25jZS5tYXBXcml0ZXIobWFwV3JpdGVyKTtcbmhhcmRlbihtYXBXcml0ZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VRdWV1ZSI6WyJtYWtlUXVldWUiXSwibWFrZVN0cmVhbSI6WyJtYWtlU3RyZWFtIl0sIm1ha2VQaXBlIjpbIm1ha2VQaXBlIl0sInB1bXAiOlsicHVtcCJdLCJwcmltZSI6WyJwcmltZSJdLCJtYXBSZWFkZXIiOlsibWFwUmVhZGVyIl0sIm1hcFdyaXRlciI6WyJtYXBXcml0ZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkg0vx3YCAAB2AgAAGgAAAEBlbmRvL3ppcC12MC4yLjMxL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3JlYWRlci5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiLi9zcmMvd3JpdGVyLmpzIl0sImV4cG9ydHMiOlsicmVhZFppcCIsInJlYWRaaXAiLCJ3cml0ZVppcCIsIndyaXRlWmlwIl0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9yZWFkZXIuanNcIiwgW11dLFtcIi4vc3JjL3dyaXRlci5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9yZWFkZXIuanMiOltbIlppcFJlYWRlciIsIlppcFJlYWRlciJdLFsicmVhZFppcCIsInJlYWRaaXAiXV0sIi4vc3JjL3dyaXRlci5qcyI6W1siWmlwV3JpdGVyIiwiWmlwV3JpdGVyIl0sWyJ3cml0ZVppcCIsIndyaXRlWmlwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACakLsN1xcAANcXAAAmAAAAQGVuZG8vemlwLXYwLjIuMzEvc3JjL2J1ZmZlci1yZWFkZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJ1ZmZlclJlYWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogW1wib2ZmXCJdICovXG5cbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQnVmZmVyUmVhZGVyU3RhdGVcbiAqIEBwcm9wZXJ0eSB7VWludDhBcnJheX0gYnl0ZXNcbiAqIEBwcm9wZXJ0eSB7RGF0YVZpZXd9IGRhdGFcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsZW5ndGhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbmRleFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG9mZnNldFxuICovXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxCdWZmZXJSZWFkZXIsIEJ1ZmZlclJlYWRlclN0YXRlPn0gKi9cbmNvbnN0IHByaXZhdGVGaWVsZHM9bmV3IFdlYWtNYXAoKTtcblxuLyoqIEB0eXBlIHsoYnVmZmVyUmVhZGVyOiBCdWZmZXJSZWFkZXIpID0+IEJ1ZmZlclJlYWRlclN0YXRlfSAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkc0dldD1wcml2YXRlRmllbGRzLmdldC5iaW5kKHByaXZhdGVGaWVsZHMpO1xuXG5jbGFzcyAgICAgICAgQnVmZmVyUmVhZGVye1xuLyoqXG4gKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBidWZmZXJcbiAqL1xuICAgICAgICAgICBjb25zdHJ1Y3RvcihidWZmZXIpe1xuY29uc3QgYnl0ZXM9bmV3IFVpbnQ4QXJyYXkoYnVmZmVyKTtcbmNvbnN0IGRhdGE9bmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlcik7XG5wcml2YXRlRmllbGRzLnNldCh0aGlzLHtcbmJ5dGVzLFxuZGF0YSxcbmxlbmd0aDpieXRlcy5sZW5ndGgsXG5pbmRleDowLFxub2Zmc2V0OjB9KTtcblxuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICAgICAgZ2V0IGxlbmd0aCgpe1xucmV0dXJuIHByaXZhdGVGaWVsZHNHZXQodGhpcykubGVuZ3RoO1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gICAgICAgICBnZXQgaW5kZXgoKXtcbnJldHVybiBwcml2YXRlRmllbGRzR2V0KHRoaXMpLmluZGV4O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqL1xuICAgICAgICAgc2V0IGluZGV4KGluZGV4KXtcbnRoaXMuc2VlayhpbmRleCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuICAgICAgICAgIHNldCBvZmZzZXQob2Zmc2V0KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuaWYob2Zmc2V0PmZpZWxkcy5kYXRhLmJ5dGVMZW5ndGgpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3Qgc2V0IG9mZnNldCBiZXlvbmQgbGVuZ3RoIG9mIHVuZGVybHlpbmcgZGF0YScpO1xuIH1cbmlmKG9mZnNldDwwKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IHNldCBuZWdhdGl2ZSBvZmZzZXQnKTtcbiB9XG5maWVsZHMub2Zmc2V0PW9mZnNldDtcbmZpZWxkcy5sZW5ndGg9ZmllbGRzLmRhdGEuYnl0ZUxlbmd0aC1maWVsZHMub2Zmc2V0O1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gaW5kZXhcbiAqIEByZXR1cm5zIHtib29sZWFufSB3aGV0aGVyIHRoZSByZWFkIGhlYWQgY2FuIG1vdmUgdG8gdGhlIGdpdmVuIGFic29sdXRlXG4gKiBpbmRleC5cbiAqL1xuICAgICAgIGNhblNlZWsoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5yZXR1cm4gaW5kZXg+PTAmJmZpZWxkcy5vZmZzZXQraW5kZXg8PWZpZWxkcy5sZW5ndGg7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCB0aGUgaW5kZXggdG8gY2hlY2suXG4gKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMuXG4gKi9cbiAgICAgICAgICAgICBhc3NlcnRDYW5TZWVrKGluZGV4KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuaWYoIXRoaXMuY2FuU2VlayhpbmRleCkpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBFbmQgb2YgZGF0YSByZWFjaGVkIChkYXRhIGxlbmd0aCA9ICR7ZmllbGRzLmxlbmd0aH0sIGFza2VkIGluZGV4ICR7aW5kZXh9YCk7XG5cbiB9XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybnMge251bWJlcn0gcHJpb3IgaW5kZXhcbiAqL1xuICAgIHNlZWsoaW5kZXgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5jb25zdCByZXN0b3JlPWZpZWxkcy5pbmRleDtcbnRoaXMuYXNzZXJ0Q2FuU2VlayhpbmRleCk7XG5maWVsZHMuaW5kZXg9aW5kZXg7XG5yZXR1cm4gcmVzdG9yZTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG4gICAgcGVlayhzaXplKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuLyogQ2xhbXAgc2l6ZS4qL1xuc2l6ZT1NYXRoLm1heCgwLE1hdGgubWluKGZpZWxkcy5sZW5ndGgtZmllbGRzLmluZGV4LHNpemUpKTtcbmlmKHNpemU9PT0wKXtcbi8qIGluIElFMTAsIHdoZW4gdXNpbmcgc3ViYXJyYXkoaWR4LCBpZHgpLCB3ZSBnZXQgdGhlIGFycmF5IFsweDAwXSBpbnN0ZWFkIG9mIFtdLiovXG5yZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gfVxuY29uc3QgcmVzdWx0PWZpZWxkcy5ieXRlcy5zdWJhcnJheShcbmZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4LFxuZmllbGRzLm9mZnNldCtmaWVsZHMuaW5kZXgrc2l6ZSk7XG5cbnJldHVybiByZXN1bHQ7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBvZmZzZXRcbiAqL1xuICAgICAgIGNhblJlYWQob2Zmc2V0KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xucmV0dXJuIHRoaXMuY2FuU2VlayhmaWVsZHMuaW5kZXgrb2Zmc2V0KTtcbiB9XG5cbi8qKlxuICogQ2hlY2sgdGhhdCB0aGUgb2Zmc2V0IHdpbGwgbm90IGdvIHRvbyBmYXIuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldCB0aGUgYWRkaXRpb25hbCBvZmZzZXQgdG8gY2hlY2suXG4gKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzLlxuICovXG4gICAgICAgICAgICAgYXNzZXJ0Q2FuUmVhZChvZmZzZXQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG50aGlzLmFzc2VydENhblNlZWsoZmllbGRzLmluZGV4K29mZnNldCk7XG4gfVxuXG4vKipcbiAqIEdldCByYXcgZGF0YSB3aXRob3V0IGNvbnZlcnNpb24sIDxzaXplPiBieXRlcy5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gc2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX0gdGhlIHJhdyBkYXRhLlxuICovXG4gICAgcmVhZChzaXplKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xudGhpcy5hc3NlcnRDYW5SZWFkKHNpemUpO1xuY29uc3QgcmVzdWx0PXRoaXMucGVlayhzaXplKTtcbmZpZWxkcy5pbmRleCs9c2l6ZTtcbnJldHVybiByZXN1bHQ7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgIHJlYWRVaW50OCgpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG50aGlzLmFzc2VydENhblJlYWQoMSk7XG5jb25zdCBpbmRleD1maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleDtcbmNvbnN0IHZhbHVlPWZpZWxkcy5kYXRhLmdldFVpbnQ4KGluZGV4KTtcbmZpZWxkcy5pbmRleCs9MTtcbnJldHVybiB2YWx1ZTtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge251bWJlcn1cbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxpdHRsZUVuZGlhblxuICovXG4gICAgICAgICAgcmVhZFVpbnQxNihsaXR0bGVFbmRpYW4pe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG50aGlzLmFzc2VydENhblJlYWQoMik7XG5jb25zdCBpbmRleD1maWVsZHMub2Zmc2V0K2ZpZWxkcy5pbmRleDtcbmNvbnN0IHZhbHVlPWZpZWxkcy5kYXRhLmdldFVpbnQxNihpbmRleCxsaXR0bGVFbmRpYW4pO1xuZmllbGRzLmluZGV4Kz0yO1xucmV0dXJuIHZhbHVlO1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICogQHBhcmFtIHtib29sZWFuPX0gbGl0dGxlRW5kaWFuXG4gKi9cbiAgICAgICAgICByZWFkVWludDMyKGxpdHRsZUVuZGlhbil7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbnRoaXMuYXNzZXJ0Q2FuUmVhZCg0KTtcbmNvbnN0IGluZGV4PWZpZWxkcy5vZmZzZXQrZmllbGRzLmluZGV4O1xuY29uc3QgdmFsdWU9ZmllbGRzLmRhdGEuZ2V0VWludDMyKGluZGV4LGxpdHRsZUVuZGlhbik7XG5maWVsZHMuaW5kZXgrPTQ7XG5yZXR1cm4gdmFsdWU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICAgICAgYnl0ZUF0KGluZGV4KXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xucmV0dXJuIGZpZWxkcy5ieXRlc1tmaWVsZHMub2Zmc2V0K2luZGV4XTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IG9mZnNldFxuICovXG4gICAgc2tpcChvZmZzZXQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG50aGlzLnNlZWsoZmllbGRzLmluZGV4K29mZnNldCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICBleHBlY3QoZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5pZighdGhpcy5tYXRjaEF0KGZpZWxkcy5pbmRleCxleHBlY3RlZCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmZpZWxkcy5pbmRleCs9ZXhwZWN0ZWQubGVuZ3RoO1xucmV0dXJuIHRydWU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHBhcmFtIHtVaW50OEFycmF5fSBleHBlY3RlZFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBtYXRjaEF0KGluZGV4LGV4cGVjdGVkKXtcbmNvbnN0IGZpZWxkcz1wcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuaWYoaW5kZXgrZXhwZWN0ZWQubGVuZ3RoPmZpZWxkcy5sZW5ndGh8fGluZGV4PDApe1xucmV0dXJuIGZhbHNlO1xuIH1cbmZvcihsZXQgaT0wO2k8ZXhwZWN0ZWQubGVuZ3RoO2krPTEpe1xuaWYoZXhwZWN0ZWRbaV0hPT10aGlzLmJ5dGVBdChpbmRleCtpKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGV4cGVjdGVkXG4gKi9cbiAgICAgIGFzc2VydChleHBlY3RlZCl7XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbmlmKCF0aGlzLmV4cGVjdChleHBlY3RlZCkpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBFeHBlY3RlZCAke3EoZXhwZWN0ZWQpfSBhdCAke2ZpZWxkcy5pbmRleH0sIGdvdCAke3RoaXMucGVlayhcbmV4cGVjdGVkLmxlbmd0aClcbiB9YCk7XG5cbiB9XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWRcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgZmluZExhc3QoZXhwZWN0ZWQpe1xuY29uc3QgZmllbGRzPXByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG5sZXQgaW5kZXg9ZmllbGRzLmxlbmd0aC1leHBlY3RlZC5sZW5ndGg7XG53aGlsZShpbmRleD49MCYmIXRoaXMubWF0Y2hBdChpbmRleCxleHBlY3RlZCkpe1xuaW5kZXgtPTE7XG4gfVxucmV0dXJuIGluZGV4O1xuIH19JGjigI1fb25jZS4gQnVmZmVyUmVhZGVyKEJ1ZmZlclJlYWRlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnVmZmVyUmVhZGVyIjpbIkJ1ZmZlclJlYWRlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB/tSO36RAAAOkQAAAmAAAAQGVuZG8vemlwLXYwLjIuMzEvc3JjL2J1ZmZlci13cml0ZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJ1ZmZlcldyaXRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogW1wib2ZmXCJdICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8QnVmZmVyV3JpdGVyLCB7XG4gKiAgIGxlbmd0aDogbnVtYmVyLFxuICogICBpbmRleDogbnVtYmVyLFxuICogICBieXRlczogVWludDhBcnJheSxcbiAqICAgZGF0YTogRGF0YVZpZXcsXG4gKiAgIGNhcGFjaXR5OiBudW1iZXIsXG4gKiB9Pn1cbiAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkcz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSBzZWxmXG4gKi9cbmNvbnN0IGdldFByaXZhdGVGaWVsZHM9KHNlbGYpPT57XG5jb25zdCBmaWVsZHM9cHJpdmF0ZUZpZWxkcy5nZXQoc2VsZik7XG5pZighZmllbGRzKXtcbnRocm93IG5ldyBFcnJvcignQnVmZmVyV3JpdGVyIGZpZWxkcyBhcmUgbm90IGluaXRpYWxpemVkJyk7XG4gfVxucmV0dXJuIGZpZWxkcztcbiB9O1xuXG5jb25zdCBhc3NlcnROYXROdW1iZXI9KG4pPT57XG5pZihOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSYmLyoqIEB0eXBlIHtudW1iZXJ9ICovbj49MCl7XG5yZXR1cm47XG4gfVxudGhyb3cgVHlwZUVycm9yKCBgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBnb3QgJHtufWApO1xuIH07XG5cbmNsYXNzICAgICAgICBCdWZmZXJXcml0ZXJ7XG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgICBnZXQgbGVuZ3RoKCl7XG5yZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5sZW5ndGg7XG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbiAgICAgICAgIGdldCBpbmRleCgpe1xucmV0dXJuIGdldFByaXZhdGVGaWVsZHModGhpcykuaW5kZXg7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICovXG4gICAgICAgICBzZXQgaW5kZXgoaW5kZXgpe1xudGhpcy5zZWVrKGluZGV4KTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXI9fSBjYXBhY2l0eVxuICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKGNhcGFjaXR5PTE2KXtcbmNvbnN0IGJ5dGVzPW5ldyBVaW50OEFycmF5KGNhcGFjaXR5KTtcbmNvbnN0IGRhdGE9bmV3IERhdGFWaWV3KGJ5dGVzLmJ1ZmZlcik7XG5wcml2YXRlRmllbGRzLnNldCh0aGlzLHtcbmJ5dGVzLFxuZGF0YSxcbmluZGV4OjAsXG5sZW5ndGg6MCxcbmNhcGFjaXR5fSk7XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHJlcXVpcmVkXG4gKi9cbiAgICAgICAgICAgICBlbnN1cmVDYW5TZWVrKHJlcXVpcmVkKXtcbmFzc2VydE5hdE51bWJlcihyZXF1aXJlZCk7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbmxldCBjYXBhY2l0eT1maWVsZHMuY2FwYWNpdHk7XG53aGlsZShjYXBhY2l0eTxyZXF1aXJlZCl7XG5jYXBhY2l0eSo9MjtcbiB9XG5jb25zdCBieXRlcz1uZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG5jb25zdCBkYXRhPW5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuYnl0ZXMuc2V0KGZpZWxkcy5ieXRlcy5zdWJhcnJheSgwLGZpZWxkcy5sZW5ndGgpKTtcbmZpZWxkcy5ieXRlcz1ieXRlcztcbmZpZWxkcy5kYXRhPWRhdGE7XG5maWVsZHMuY2FwYWNpdHk9Y2FwYWNpdHk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICovXG4gICAgc2VlayhpbmRleCl7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnRoaXMuZW5zdXJlQ2FuU2VlayhpbmRleCk7XG5maWVsZHMuaW5kZXg9aW5kZXg7XG5maWVsZHMubGVuZ3RoPU1hdGgubWF4KGZpZWxkcy5pbmRleCxmaWVsZHMubGVuZ3RoKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXJ9IHNpemVcbiAqL1xuICAgICAgICAgICAgICBlbnN1cmVDYW5Xcml0ZShzaXplKXtcbmFzc2VydE5hdE51bWJlcihzaXplKTtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5TZWVrKGZpZWxkcy5pbmRleCtzaXplKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICovXG4gICAgIHdyaXRlKGJ5dGVzKXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5Xcml0ZShieXRlcy5ieXRlTGVuZ3RoKTtcbmZpZWxkcy5ieXRlcy5zZXQoYnl0ZXMsZmllbGRzLmluZGV4KTtcbmZpZWxkcy5pbmRleCs9Ynl0ZXMuYnl0ZUxlbmd0aDtcbmZpZWxkcy5sZW5ndGg9TWF0aC5tYXgoZmllbGRzLmluZGV4LGZpZWxkcy5sZW5ndGgpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge251bWJlcn0gc3RhcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbmRcbiAqL1xuICAgICAgICAgd3JpdGVDb3B5KHN0YXJ0LGVuZCl7XG5hc3NlcnROYXROdW1iZXIoc3RhcnQpO1xuYXNzZXJ0TmF0TnVtYmVyKGVuZCk7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbmNvbnN0IHNpemU9ZW5kLXN0YXJ0O1xudGhpcy5lbnN1cmVDYW5Xcml0ZShzaXplKTtcbmZpZWxkcy5ieXRlcy5jb3B5V2l0aGluKGZpZWxkcy5pbmRleCxzdGFydCxlbmQpO1xuZmllbGRzLmluZGV4Kz1zaXplO1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICovXG4gICAgICAgICAgd3JpdGVVaW50OCh2YWx1ZSl7XG5jb25zdCBmaWVsZHM9Z2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbnRoaXMuZW5zdXJlQ2FuV3JpdGUoMSk7XG5maWVsZHMuZGF0YS5zZXRVaW50OChmaWVsZHMuaW5kZXgsdmFsdWUpO1xuZmllbGRzLmluZGV4Kz0xO1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtib29sZWFuPX0gbGl0dGxlRW5kaWFuXG4gKi9cbiAgICAgICAgICAgd3JpdGVVaW50MTYodmFsdWUsbGl0dGxlRW5kaWFuKXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5Xcml0ZSgyKTtcbmNvbnN0IGluZGV4PWZpZWxkcy5pbmRleDtcbmZpZWxkcy5kYXRhLnNldFVpbnQxNihpbmRleCx2YWx1ZSxsaXR0bGVFbmRpYW4pO1xuZmllbGRzLmluZGV4Kz0yO1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZVxuICogQHBhcmFtIHtib29sZWFuPX0gbGl0dGxlRW5kaWFuXG4gKi9cbiAgICAgICAgICAgd3JpdGVVaW50MzIodmFsdWUsbGl0dGxlRW5kaWFuKXtcbmNvbnN0IGZpZWxkcz1nZXRQcml2YXRlRmllbGRzKHRoaXMpO1xudGhpcy5lbnN1cmVDYW5Xcml0ZSg0KTtcbmNvbnN0IGluZGV4PWZpZWxkcy5pbmRleDtcbmZpZWxkcy5kYXRhLnNldFVpbnQzMihpbmRleCx2YWx1ZSxsaXR0bGVFbmRpYW4pO1xuZmllbGRzLmluZGV4Kz00O1xuZmllbGRzLmxlbmd0aD1NYXRoLm1heChmaWVsZHMuaW5kZXgsZmllbGRzLmxlbmd0aCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyPX0gYmVnaW5cbiAqIEBwYXJhbSB7bnVtYmVyPX0gZW5kXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuICAgICAgICBzdWJhcnJheShiZWdpbixlbmQpe1xuY29uc3QgZmllbGRzPWdldFByaXZhdGVGaWVsZHModGhpcyk7XG5yZXR1cm4gZmllbGRzLmJ5dGVzLnN1YmFycmF5KDAsZmllbGRzLmxlbmd0aCkuc3ViYXJyYXkoYmVnaW4sZW5kKTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtudW1iZXI9fSBiZWdpblxuICogQHBhcmFtIHtudW1iZXI9fSBlbmRcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG4gICAgIHNsaWNlKGJlZ2luLGVuZCl7XG5yZXR1cm4gdGhpcy5zdWJhcnJheShiZWdpbixlbmQpLnNsaWNlKCk7XG4gfX0kaOKAjV9vbmNlLiBCdWZmZXJXcml0ZXIoQnVmZmVyV3JpdGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJXcml0ZXIiOlsiQnVmZmVyV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKCglV3DAQAAwwEAACQAAABAZW5kby96aXAtdjAuMi4zMS9zcmMvY29tcHJlc3Npb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlNUT1JFIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyogU1RPUkUgaXMgdGhlIG1hZ2ljIG51bWJlciBmb3IgXCJub3QgY29tcHJlc3NlZFwiLiovXG5jb25zdCAgICAgICAgU1RPUkU9MDskaOKAjV9vbmNlLlNUT1JFKFNUT1JFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTVE9SRSI6WyJTVE9SRSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAf4rsrPwUAAD8FAAAeAAAAQGVuZG8vemlwLXYwLjIuMzEvc3JjL2NyYzMyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJjcmMzMiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmMzMiwgJ25hbWUnLCB7dmFsdWU6IFwiY3JjMzJcIn0pOyRo4oCNX29uY2UuY3JjMzIoY3JjMzIpOyAgIC8qIEB0cy1jaGVjayovXG4vKiBlc2xpbnQgbm8tYml0d2lzZTogW1wib2ZmXCJdICovXG5cbi8qKlxuICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYG1ha2VUYWJsZWAgYW5kIGBjcmMzMmAgY29tZSBmcm9tIGBwYWtvYCwgZnJvbVxuICogcGFrby9saWIvemxpYi9jcmMzMi5qcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBwYWtvXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL3Bha28vXG4gKi9cblxuLyogVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmUqL1xuLyoqXG4gKiBAcmV0dXJucyB7QXJyYXk8bnVtYmVyPn1cbiAqL1xuZnVuY3Rpb24gbWFrZVRhYmxlKCl7XG5sZXQgYztcbmNvbnN0IHRhYmxlPVtdO1xuXG5mb3IobGV0IG49MDtuPDI1NjtuKz0xKXtcbmM9bjtcbmZvcihsZXQgaz0wO2s8ODtrKz0xKXtcbmM9YyYxPzB4ZWRiODgzMjBeYz4+PjE6Yz4+PjE7XG4gfVxudGFibGVbbl09YztcbiB9XG5cbnJldHVybiB0YWJsZTtcbiB9XG5cbi8qIEluaXRpYWxpemUgYSB0YWJsZSBvZiAyNTYgc2lnbmVkIDMyIGJpdCBpbnRlZ2Vycy4qL1xuY29uc3QgdGFibGU9bWFrZVRhYmxlKCk7XG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBieXRlc1xuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aFxuICogQHBhcmFtIHtudW1iZXJ9IGluZGV4XG4gKiBAcGFyYW0ge251bWJlcn0gY3JjXG4gKi9cbmZ1bmN0aW9uICAgICAgICBjcmMzMihieXRlcyxsZW5ndGg9Ynl0ZXMubGVuZ3RoLGluZGV4PTAsY3JjPTApe1xuY29uc3QgZW5kPWluZGV4K2xlbmd0aDtcblxuY3JjXj0tMTtcblxuZm9yKGxldCBpPWluZGV4O2k8ZW5kO2krPTEpe1xuY3JjPWNyYz4+PjhedGFibGVbKGNyY15ieXRlc1tpXSkmMHhmZl07XG4gfVxuXG5yZXR1cm4oY3JjXi0xKT4+PjA7XG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNyYzMyIjpbImNyYzMyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABfIUu4kNAAAJDQAACYAAABAZW5kby96aXAtdjAuMi4zMS9zcmMvZm9ybWF0LXJlYWRlci5qc3siaW1wb3J0cyI6WyIuL2NvbXByZXNzaW9uLmpzIiwiLi9jcmMzMi5qcyIsIi4vc2lnbmF0dXJlLmpzIiwiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbInJlYWRaaXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dLFtcIi4vY3JjMzIuanNcIiwgW1tcImNyYzMyXCIsIFskaOKAjV9hID0+IChjcmMzMiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NpZ25hdHVyZS5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoc2lnbmF0dXJlID0gJGjigI1fYSldXV1dLFtcIi4vY29tcHJlc3Npb24uanNcIiwgW1tcIipcIiwgWyRo4oCNX2EgPT4gKGNvbXByZXNzaW9uID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJlYWRaaXAsICduYW1lJywge3ZhbHVlOiBcInJlYWRaaXBcIn0pOyRo4oCNX29uY2UucmVhZFppcChyZWFkWmlwKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogcSwgYXMgaW4gcXVvdGUsIGZvciBxdW90aW5nIHN0cmluZ3MgaW4gZXJyb3JzKi9cbmNvbnN0IHE9SlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IE1BWF9WQUxVRV8xNkJJVFM9NjU1MzU7XG5jb25zdCBNQVhfVkFMVUVfMzJCSVRTPTQyOTQ5NjcyOTU7XG5cbmNvbnN0IHRleHREZWNvZGVyPW5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBiaXRGbGFnXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNFbmNyeXB0ZWQoYml0RmxhZyl7XG5yZXR1cm4oYml0RmxhZyYweDAwMDEpPT09MHgwMDAxO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7RGF0ZX1cbiAqIEBzZWUgaHR0cDovL3d3dy5kZWxvcmllLmNvbS9kamdwcC9kb2MvcmJpbnRlci9pdC82NS8xNi5odG1sXG4gKiBAc2VlIGh0dHA6Ly93d3cuZGVsb3JpZS5jb20vZGpncHAvZG9jL3JiaW50ZXIvaXQvNjYvMTYuaHRtbFxuICovXG5mdW5jdGlvbiByZWFkRG9zRGF0ZVRpbWUocmVhZGVyKXtcbmNvbnN0IGRvc1RpbWU9cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5yZXR1cm4gbmV3IERhdGUoXG5EYXRlLlVUQyhcbihkb3NUaW1lPj4yNSYweDdmKSsxOTgwLC8qIHllYXIqL1xuKGRvc1RpbWU+PjIxJjB4MGYpLTEsLyogbW9udGgqL1xuZG9zVGltZT4+MTYmMHgxZiwvKiBkYXkqL1xuZG9zVGltZT4+MTEmMHgxZiwvKiBob3VyKi9cbmRvc1RpbWU+PjUmMHgzZiwvKiBtaW51dGUqL1xuKGRvc1RpbWUmMHgxZik8PDEvKiBzZWNvbmQqLykpO1xuXG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHJldHVybnMge0FyY2hpdmVIZWFkZXJzfVxuICovXG5mdW5jdGlvbiByZWFkSGVhZGVycyhyZWFkZXIpe1xucmV0dXJue1xudmVyc2lvbk5lZWRlZDpyZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbmJpdEZsYWc6cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSksXG5jb21wcmVzc2lvbk1ldGhvZDpyZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbmRhdGU6cmVhZERvc0RhdGVUaW1lKHJlYWRlciksXG5jcmMzMjpyZWFkZXIucmVhZFVpbnQzMih0cnVlKSxcbmNvbXByZXNzZWRMZW5ndGg6cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG51bmNvbXByZXNzZWRMZW5ndGg6cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSl9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtDZW50cmFsRmlsZVJlY29yZH1cbiAqL1xuZnVuY3Rpb24gcmVhZENlbnRyYWxGaWxlSGVhZGVyKHJlYWRlcil7XG5jb25zdCB2ZXJzaW9uPXJlYWRlci5yZWFkVWludDgoKTtcbmNvbnN0IG1hZGVCeT1yZWFkZXIucmVhZFVpbnQ4KCk7XG5jb25zdCBoZWFkZXJzPXJlYWRIZWFkZXJzKHJlYWRlcik7XG5jb25zdCBuYW1lTGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZXh0cmFGaWVsZHNMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBjb21tZW50TGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZGlza051bWJlclN0YXJ0PXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgaW50ZXJuYWxGaWxlQXR0cmlidXRlcz1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXM9cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5jb25zdCBmaWxlU3RhcnQ9cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5cbmNvbnN0IG5hbWU9cmVhZGVyLnJlYWQobmFtZUxlbmd0aCk7XG4vKiBUT0RPIHJlYWQgZXh0cmEgZmllbGRzLCBwYXJ0aWN1bGFybHkgWmlwNjQqL1xucmVhZGVyLnNraXAoZXh0cmFGaWVsZHNMZW5ndGgpO1xuXG5pZihoZWFkZXJzLnVuY29tcHJlc3NlZExlbmd0aD09PU1BWF9WQUxVRV8zMkJJVFMpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cbmlmKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aD09PU1BWF9WQUxVRV8zMkJJVFMpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cbmlmKGZpbGVTdGFydD09PU1BWF9WQUxVRV8zMkJJVFMpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cbmlmKGRpc2tOdW1iZXJTdGFydD09PU1BWF9WQUxVRV8zMkJJVFMpe1xudGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuIH1cblxuY29uc3QgY29tbWVudD1yZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKTtcblxucmV0dXJue1xubmFtZSxcbnZlcnNpb24sXG5tYWRlQnksXG4uLi5oZWFkZXJzLFxuZGlza051bWJlclN0YXJ0LFxuaW50ZXJuYWxGaWxlQXR0cmlidXRlcyxcbmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMsXG5maWxlU3RhcnQsXG5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcGFyYW0ge0NlbnRyYWxEaXJlY3RvcnlMb2NhdG9yfSBsb2NhdG9yXG4gKiBAcmV0dXJucyB7QXJyYXk8Q2VudHJhbEZpbGVSZWNvcmQ+fVxuICovXG5mdW5jdGlvbiByZWFkQ2VudHJhbERpcmVjdG9yeShyZWFkZXIsbG9jYXRvcil7XG5jb25zdHtjZW50cmFsRGlyZWN0b3J5T2Zmc2V0LGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzfT1sb2NhdG9yO1xucmVhZGVyLnNlZWsoY2VudHJhbERpcmVjdG9yeU9mZnNldCk7XG5cbmNvbnN0IGVudHJpZXM9W107XG53aGlsZShyZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5DRU5UUkFMX0ZJTEVfSEVBREVSKSl7XG5jb25zdCBlbnRyeT1yZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKTtcbmVudHJpZXMucHVzaChlbnRyeSk7XG4gfVxuXG5pZihjZW50cmFsRGlyZWN0b3J5UmVjb3JkcyE9PWVudHJpZXMubGVuZ3RoKXtcbi8qIFdlIGV4cGVjdGVkIHNvbWUgcmVjb3JkcyBidXQgY291bGRuJ3QgZmluZCBBTlkuKi9cbi8qIFRoaXMgaXMgcmVhbGx5IHN1c3BpY2lvdXMsIGFzIGlmIHNvbWV0aGluZyB3ZW50IHdyb25nLiovXG50aHJvdyBuZXcgRXJyb3IoXG4gYENvcnJ1cHRlZCB6aXAgb3IgYnVnOiBleHBlY3RlZCAke2NlbnRyYWxEaXJlY3RvcnlSZWNvcmRzfSByZWNvcmRzIGluIGNlbnRyYWwgZGlyLCBnb3QgJHtlbnRyaWVzLmxlbmd0aH1gKTtcblxuIH1cblxucmV0dXJuIGVudHJpZXM7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyUmVhZGVyfSByZWFkZXJcbiAqIEByZXR1cm5zIHtMb2NhbEZpbGVSZWNvcmR9XG4gKi9cbmZ1bmN0aW9uIHJlYWRGaWxlKHJlYWRlcil7XG5yZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5MT0NBTF9GSUxFX0hFQURFUik7XG5jb25zdCBoZWFkZXJzPXJlYWRIZWFkZXJzKHJlYWRlcik7XG5jb25zdCBuYW1lTGVuZ3RoPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgZXh0cmFGaWVsZHNMZW5ndGg9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBuYW1lPXJlYWRlci5yZWFkKG5hbWVMZW5ndGgpO1xucmVhZGVyLnNraXAoZXh0cmFGaWVsZHNMZW5ndGgpO1xuY29uc3QgY29udGVudD1yZWFkZXIucmVhZChoZWFkZXJzLmNvbXByZXNzZWRMZW5ndGgpO1xucmV0dXJue25hbWUsLi4uaGVhZGVycyxjb250ZW50fTtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtCdWZmZXJSZWFkZXJ9IHJlYWRlclxuICogQHBhcmFtIHtBcnJheTxDZW50cmFsRmlsZVJlY29yZD59IHJlY29yZHNcbiAqIEByZXR1cm5zIHtBcnJheTxMb2NhbEZpbGVSZWNvcmQ+fVxuICovXG5mdW5jdGlvbiByZWFkTG9jYWxGaWxlcyhyZWFkZXIscmVjb3Jkcyl7XG5jb25zdCBmaWxlcz1bXTtcbmZvcihjb25zdCByZWNvcmQgb2YgcmVjb3Jkcyl7XG5yZWFkZXIuc2VlayhyZWNvcmQuZmlsZVN0YXJ0KTtcbmNvbnN0IGZpbGU9cmVhZEZpbGUocmVhZGVyKTtcbmZpbGVzLnB1c2goZmlsZSk7XG4gfVxucmV0dXJuIGZpbGVzO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7Q2VudHJhbERpcmVjdG9yeUxvY2F0b3J9XG4gKi9cbmZ1bmN0aW9uIHJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpe1xuaWYoIXJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCkpe1xudGhyb3cgbmV3IEVycm9yKFxuJ0NvcnJ1cHQgemlwIGZpbGUsIG9yIHppcCBmaWxlIGNvbnRhaW5pbmcgYW4gdW5zdXBwb3J0ZWQgdmFyaWFibGUtd2lkdGggZW5kLW9mLWFyY2hpdmUgY29tbWVudCwgb3IgYW4gdW5zdXBwb3J0ZWQgemlwIGZpbGUgd2l0aCA2NCBiaXQgc2l6ZXMnKTtcblxuIH1cbmNvbnN0IGRpc2tOdW1iZXI9cmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG5jb25zdCBkaXNrV2l0aENlbnRyYWxEaXJTdGFydD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzaz1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzPXJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVNpemU9cmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5jb25zdCBjZW50cmFsRGlyZWN0b3J5T2Zmc2V0PXJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuY29uc3QgY29tbWVudExlbmd0aD1yZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbi8qIFdhcm5pbmc6IHRoZSBlbmNvZGluZyBkZXBlbmRzIG9mIHRoZSBzeXN0ZW0gbG9jYWxlLiovXG4vKiBPbiBhIExpbnV4IG1hY2hpbmUgd2l0aCBMQU5HPWVuX1VTLnV0ZjgsIHRoaXMgZmllbGQgaXMgdXRmOCBlbmNvZGVkLiovXG4vKiBPbiBhIFdpbmRvd3MgbWFjaGluZSwgdGhpcyBmaWVsZCBpcyBlbmNvZGVkIHdpdGggdGhlIGxvY2FsaXplZCBXaW5kb3dzKi9cbi8qIGNvZGUgcGFnZS4qL1xuY29uc3QgY29tbWVudD10ZXh0RGVjb2Rlci5kZWNvZGUocmVhZGVyLnJlYWQoY29tbWVudExlbmd0aCkpO1xucmV0dXJue1xuZGlza051bWJlcixcbmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0LFxuY2VudHJhbERpcmVjdG9yeVJlY29yZHNPblRoaXNEaXNrLFxuY2VudHJhbERpcmVjdG9yeVJlY29yZHMsXG5jZW50cmFsRGlyZWN0b3J5U2l6ZSxcbmNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsXG5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcmV0dXJucyB7Q2VudHJhbERpcmVjdG9yeUxvY2F0b3J9XG4gKi9cbmZ1bmN0aW9uIHJlYWRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQocmVhZGVyKXtcbi8qIFppcCBmaWxlcyBhcmUgcGVybWl0dGVkIHRvIGhhdmUgYSB2YXJpYWJsZS13aWR0aCBjb21tZW50IGF0IHRoZSBlbmQgb2YgdGhlKi9cbi8qIFwiZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IHJlY29yZFwiIGFuZCBtYXkgaGF2ZSBzdWJzZXF1ZW50IFppcDY0IGhlYWRlcnMuKi9cbi8qIFRoZSBwcmVzY3JpYmVkIG1ldGhvZCBvZiBmaW5kaW5nIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFwiZW5kIG9mIGNlbnRyYWwqL1xuLyogZGlyZWN0b3J5IHJlY29yZFwiIGlzIHRvIHNlZWsgdGhlIG1hZ2ljIG51bWJlcjoqL1xuLyoqL1xuLyogcmVhZGVyLmZpbmRMYXN0KHNpZ25hdHVyZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpOyovXG4vKiovXG4vKiBUaGlzIGludHJvZHVjZXMgYSBudW1iZXIgb2YgdW5kZXNpcmFibGUsIGF0dGFja2FibGUgYW1iaWd1aXRpZXMqL1xuLyogQWdvcmljIGlzIG5vdCBjb21mb3J0YWJsZSBzdXBwb3J0aW5nLCBzbyB3ZSBmb3JiaWQgdGhlIGNvbW1lbnQqL1xuLyogYW5kIDY0IGJpdCB6aXAgc3VwcG9ydCBzbyB3ZSBjYW4gc2VlayBhIHByZWRpY3RhYmxlIGxlbmd0aCovXG4vKiBmcm9tIHRoZSBlbmQuKi9cbmNvbnN0IGNlbnRyYWxEaXJlY3RvcnlFbmQ9cmVhZGVyLmxlbmd0aC0yMjtcbmlmKGNlbnRyYWxEaXJlY3RvcnlFbmQ8MCl7XG50aHJvdyBuZXcgRXJyb3IoJ0NvcnJ1cHRlZCB6aXA6IG5vdCBlbm91Z2ggY29udGVudCcpO1xuIH1cbnJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlFbmQpO1xuY29uc3QgbG9jYXRvcj1yZWFkQmxvY2tFbmRPZkNlbnRyYWwocmVhZGVyKTtcblxuLyogRXhjZXJwdCBmcm9tIHRoZSB6aXAgc3BlYzoqL1xuLyogNCkgIElmIG9uZSBvZiB0aGUgZmllbGRzIGluIHRoZSBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkqL1xuLyogcmVjb3JkIGlzIHRvbyBzbWFsbCB0byBob2xkIHJlcXVpcmVkIGRhdGEsIHRoZSBmaWVsZCovXG4vKiBzaG91bGQgYmUgc2V0IHRvIC0xICgweEZGRkYgb3IgMHhGRkZGRkZGRikgYW5kIHRoZSovXG4vKiBaSVA2NCBmb3JtYXQgcmVjb3JkIHNob3VsZCBiZSBjcmVhdGVkLiovXG4vKiA1KSAgVGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgYW5kIHRoZSovXG4vKiBaaXA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgbG9jYXRvciByZWNvcmQgbXVzdCovXG4vKiByZXNpZGUgb24gdGhlIHNhbWUgZGlzayB3aGVuIHNwbGl0dGluZyBvciBzcGFubmluZyovXG4vKiBhbiBhcmNoaXZlLiovXG5jb25zdCB6aXA2ND1cbmxvY2F0b3IuZGlza051bWJlcj09PU1BWF9WQUxVRV8xNkJJVFN8fFxubG9jYXRvci5kaXNrV2l0aENlbnRyYWxEaXJTdGFydD09PU1BWF9WQUxVRV8xNkJJVFN8fFxubG9jYXRvci5jZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2s9PT1NQVhfVkFMVUVfMTZCSVRTfHxcbmxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVJlY29yZHM9PT1NQVhfVkFMVUVfMTZCSVRTfHxcbmxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVNpemU9PT1NQVhfVkFMVUVfMzJCSVRTfHxcbmxvY2F0b3IuY2VudHJhbERpcmVjdG9yeU9mZnNldD09PU1BWF9WQUxVRV8zMkJJVFM7XG5cbmlmKHppcDY0KXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiB9XG5cbmNvbnN0e1xuY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbmNlbnRyYWxEaXJlY3RvcnlTaXplXG4vKiB6aXA2NEVuZE9mQ2VudHJhbFNpemUqL309XG5sb2NhdG9yO1xuXG5jb25zdCBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQ9XG5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0K2NlbnRyYWxEaXJlY3RvcnlTaXplO1xuY29uc3QgZXh0cmFCeXRlcz1jZW50cmFsRGlyZWN0b3J5RW5kLWV4cGVjdGVkQ2VudHJhbERpcmVjdG9yeUVuZDtcblxucmVhZGVyLm9mZnNldD1leHRyYUJ5dGVzO1xuXG5yZXR1cm4gbG9jYXRvcjtcbiB9XG5cbi8qKlxuICogQHBhcmFtIHtDZW50cmFsRmlsZVJlY29yZH0gY2VudHJhbFJlY29yZFxuICogQHBhcmFtIHtMb2NhbEZpbGVSZWNvcmR9IGxvY2FsUmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZ30gYXJjaGl2ZU5hbWVcbiAqL1xuZnVuY3Rpb24gY2hlY2tSZWNvcmRzKGNlbnRyYWxSZWNvcmQsbG9jYWxSZWNvcmQsYXJjaGl2ZU5hbWUpe1xuY29uc3QgY2VudHJhbE5hbWU9dGV4dERlY29kZXIuZGVjb2RlKGNlbnRyYWxSZWNvcmQubmFtZSk7XG5jb25zdCBsb2NhbE5hbWU9dGV4dERlY29kZXIuZGVjb2RlKGxvY2FsUmVjb3JkLm5hbWUpO1xuXG4vKiBJbiBzb21lIHppcCBmaWxlcyBjcmVhdGVkIG9uIFdpbmRvd3MsIHRoZSBmaWxlbmFtZSBzdG9yZWQgaW4gdGhlIGNlbnRyYWwqL1xuLyogZGlyIGNvbnRhaW5zIFwiXFxcIiBpbnN0ZWFkIG9mIFwiL1wiLiAgU3RyYW5nZWx5LCB0aGUgZmlsZSBuYW1lIGluIHRoZSBsb2NhbCovXG4vKiBkaXJlY3RvcnkgdXNlcyBcIi9cIiBhcyBzcGVjaWZpZWQ6Ki9cbi8qIGh0dHA6Ly93d3cuaW5mby16aXAub3JnL0ZBUS5odG1sI2JhY2tzbGFzaGVzIG9yIEFQUE5PVEUjNC40LjE3LjEsIFwiQWxsKi9cbi8qIHNsYXNoZXMgTVVTVCBiZSBmb3J3YXJkIHNsYXNoZXMgJy8nXCIpIGJ1dCB0aGVyZSBhcmUgYSBsb3Qgb2YgYmFkIHppcCovXG4vKiBnZW5lcmF0b3JzLi4uICBTZWFyY2ggXCJ1bnppcCBtaXNtYXRjaGluZyBcImxvY2FsXCIgZmlsZW5hbWUgY29udGludWluZyB3aXRoKi9cbi8qIFwiY2VudHJhbFwiIGZpbGVuYW1lIHZlcnNpb25cIi4qL1xuLyoqL1xuLyogVGhlIHJlYXNvbmluZyBhcHBlYXJzIHRvIGJlIHRoYXQgdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGlzIGZvciovXG4vKiB1c2VyIGRpc3BsYXkgYW5kIG1heSBkaWZmZXIsIHRob3VnaCB0aGlzIG9wZW5zIHRoZSBwb3NzaWJpbGl0eSovXG4vKiBmb3Igc3Bvb2ZpbmcgYXR0YWNrcy4qL1xuLyogaHR0cDovL3NlY2xpc3RzLm9yZy9mdWxsZGlzY2xvc3VyZS8yMDA5L1NlcC8zOTQqL1xuLyoqL1xuLyogV2Ugc3RyaWtlIGEgY29tcHJvbWlzZTogdGhlIGNlbnRyYWwgZGlyZWN0b3J5IG5hbWUgbWF5IHZhcnkgZnJvbSB0aGUgbG9jYWwqL1xuLyogbmFtZSBleGFjdGx5IGFuZCBvbmx5IGJ5IGRpZmZlcmVudCBzbGFzaGVzLiovXG5pZihjZW50cmFsTmFtZS5yZXBsYWNlKC9cXFxcL2csJy8nKSE9PWxvY2FsTmFtZSl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYFppcCBpbnRlZ3JpdHkgZXJyb3I6IGNlbnRyYWwgcmVjb3JkIGZpbGUgbmFtZSAke3EoXG5jZW50cmFsTmFtZSlcbiB9IG11c3QgbWF0Y2ggbG9jYWwgZmlsZSBuYW1lICR7cShsb2NhbE5hbWUpfSBpbiBhcmNoaXZlICR7cShcbmFyY2hpdmVOYW1lKVxuIH1gKTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZVxuICovXG5mdW5jdGlvbiBjaGVjayh2YWx1ZSxtZXNzYWdlKXtcbmlmKCF2YWx1ZSl7XG50aHJvdyBuZXcgRXJyb3IoXG4gYFppcCBpbnRlZ3JpdHkgZXJyb3I6ICR7bWVzc2FnZX0gZm9yIGZpbGUgJHtxKFxubG9jYWxOYW1lKVxuIH0gaW4gYXJjaGl2ZSAke3EoYXJjaGl2ZU5hbWUpfWApO1xuXG4gfVxuIH1cblxuY2hlY2soXG5jZW50cmFsUmVjb3JkLmJpdEZsYWc9PT1sb2NhbFJlY29yZC5iaXRGbGFnLFxuIGBDZW50cmFsIHJlY29yZCBiaXQgZmxhZyAke2NlbnRyYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZyhcbjE2KVxuIH0gbXVzdCBtYXRjaCBsb2NhbCByZWNvcmQgYml0IGZsYWcgJHtsb2NhbFJlY29yZC5iaXRGbGFnLnRvU3RyaW5nKDE2KX1gKTtcblxuY2hlY2soXG5jZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kPT09bG9jYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QsXG4gYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG5jZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kKVxuIH0gbXVzdCBtYXRjaCBsb2NhbCBjb21wcmVzc2lvbiBtZXRob2QgJHtxKGxvY2FsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kKX1gKTtcblxuLyogVE9ETyBEYXRlIGludGVncml0eSBjaGVjayB3b3VsZCBiZSBlYXNpZXIgb24gdGhlIG9yaWdpbmFsIGJ5dGVzLiovXG4vKiBQZXJoYXBzIGRlZmVyIGRlY29kaW5nIHRoZSB1bmRlcmx5aW5nIGJ5dGVzLiovXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQuY3JjMzI9PT1sb2NhbFJlY29yZC5jcmMzMixcbiBgQ2VudHJhbCByZWNvcmQgQ1JDLTMyIGNoZWNrc3VtICR7Y2VudHJhbFJlY29yZC5jcmMzMn0gbXVzdCBtYXRjaCBsb2NhbCBjaGVja3N1bSAke2xvY2FsUmVjb3JkLmNyYzMyfWApO1xuXG5jaGVjayhcbmNlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aD09PWxvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGgsXG4gYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzZWQgc2l6ZSAke2NlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGh9YCk7XG5cbmNoZWNrKFxuY2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGg9PT1sb2NhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGgsXG4gYENlbnRyYWwgcmVjb3JkIHVuY29tcHJlc3NlZCBzaXplICR7Y2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGh9IG11c3QgbWF0Y2ggbG9jYWwgJHtsb2NhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGh9YCk7XG5cblxuY29uc3QgY2hlY2tzdW09Y3JjMzIobG9jYWxSZWNvcmQuY29udGVudCk7XG5jaGVjayhcbmNoZWNrc3VtPT09bG9jYWxSZWNvcmQuY3JjMzIsXG4gYENSQy0zMiBjaGVja3N1bSBtaXNtYXRjaCwgd2FudGVkICR7bG9jYWxSZWNvcmQuY3JjMzJ9IGJ1dCBhY3R1YWwgY29udGVudCBpcyAke2NoZWNrc3VtfWApO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzXG4gKi9cbmZ1bmN0aW9uIG1vZGVGb3JFeHRlcm5hbEF0dHJpYnV0ZXMoZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyl7XG5yZXR1cm4gZXh0ZXJuYWxGaWxlQXR0cmlidXRlcz4+MTYmMHhmZmZmO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0NlbnRyYWxGaWxlUmVjb3JkfSBjZW50cmFsUmVjb3JkXG4gKiBAcGFyYW0ge0xvY2FsRmlsZVJlY29yZH0gbG9jYWxSZWNvcmRcbiAqIEByZXR1cm5zIHtDb21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gcmVjb3JkVG9GaWxlKGNlbnRyYWxSZWNvcmQsbG9jYWxSZWNvcmQpe1xuY29uc3QgbW9kZT1tb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGNlbnRyYWxSZWNvcmQuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyk7XG5yZXR1cm57XG5uYW1lOmNlbnRyYWxSZWNvcmQubmFtZSxcbm1vZGUsXG5kYXRlOmNlbnRyYWxSZWNvcmQuZGF0ZSxcbmNyYzMyOmNlbnRyYWxSZWNvcmQuY3JjMzIsXG5jb21wcmVzc2lvbk1ldGhvZDpjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuY29tcHJlc3NlZExlbmd0aDpjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGgsXG51bmNvbXByZXNzZWRMZW5ndGg6Y2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGgsXG5jb250ZW50OmxvY2FsUmVjb3JkLmNvbnRlbnQsXG5jb21tZW50OmNlbnRyYWxSZWNvcmQuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtDb21wcmVzc2VkRmlsZX0gZmlsZVxuICogQHJldHVybnMge1VuY29tcHJlc3NlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIGRlY29tcHJlc3NGaWxlKGZpbGUpe1xuaWYoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCE9PWNvbXByZXNzaW9uLlNUT1JFKXtcbnRocm93IG5ldyBFcnJvcihcbiBgQ2Fubm90IGZpbmQgZGVjb21wcmVzc29yIGZvciBjb21wcmVzc2lvbiBtZXRob2QgJHtxKFxuZmlsZS5jb21wcmVzc2lvbk1ldGhvZClcbiB9IGZvciBmaWxlICR7ZmlsZS5uYW1lfWApO1xuXG4gfVxucmV0dXJue1xubmFtZTpmaWxlLm5hbWUsXG5tb2RlOmZpbGUubW9kZSxcbmRhdGU6ZmlsZS5kYXRlLFxuY29udGVudDpmaWxlLmNvbnRlbnQsXG5jb21tZW50OmZpbGUuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtVbmNvbXByZXNzZWRGaWxlfSBmaWxlXG4gKiBAcmV0dXJucyB7QXJjaGl2ZWRGaWxlfVxuICovXG5mdW5jdGlvbiBkZWNvZGVGaWxlKGZpbGUpe1xuY29uc3QgbmFtZT10ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5uYW1lKTtcbmNvbnN0IGNvbW1lbnQ9dGV4dERlY29kZXIuZGVjb2RlKGZpbGUuY29tbWVudCk7XG5yZXR1cm57XG5uYW1lLFxudHlwZTonZmlsZScsXG5tb2RlOmZpbGUubW9kZSYwbzc3NyxcbmRhdGU6ZmlsZS5kYXRlLFxuY29udGVudDpmaWxlLmNvbnRlbnQsXG5jb21tZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlclJlYWRlcn0gcmVhZGVyXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICovXG5mdW5jdGlvbiAgICAgICAgcmVhZFppcChyZWFkZXIsbmFtZT0nPHVua25vd24+Jyl7XG5jb25zdCBsb2NhdG9yPXJlYWRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQocmVhZGVyKTtcbmNvbnN0IGNlbnRyYWxSZWNvcmRzPXJlYWRDZW50cmFsRGlyZWN0b3J5KHJlYWRlcixsb2NhdG9yKTtcbmNvbnN0IGxvY2FsUmVjb3Jkcz1yZWFkTG9jYWxGaWxlcyhyZWFkZXIsY2VudHJhbFJlY29yZHMpO1xuY29uc3QgZmlsZXM9bmV3IE1hcCgpO1xuXG5mb3IobGV0IGk9MDtpPGNlbnRyYWxSZWNvcmRzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGNlbnRyYWxSZWNvcmQ9Y2VudHJhbFJlY29yZHNbaV07XG5jb25zdCBsb2NhbFJlY29yZD1sb2NhbFJlY29yZHNbaV07XG5cbmNoZWNrUmVjb3JkcyhjZW50cmFsUmVjb3JkLGxvY2FsUmVjb3JkLG5hbWUpO1xuXG5pZihpc0VuY3J5cHRlZChjZW50cmFsUmVjb3JkLmJpdEZsYWcpKXtcbnRocm93IG5ldyBFcnJvcignRW5jcnlwdGVkIHppcCBhcmUgbm90IHN1cHBvcnRlZCcpO1xuIH1cblxuY29uc3QgaXNEaXI9KGNlbnRyYWxSZWNvcmQuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyYweDAwMTApIT09MDtcbmlmKCFpc0Rpcil7XG5jb25zdCBjb21wcmVzc2VkRmlsZT1yZWNvcmRUb0ZpbGUoY2VudHJhbFJlY29yZCxsb2NhbFJlY29yZCk7XG5jb25zdCBkZWNvbXByZXNzZWRGaWxlPWRlY29tcHJlc3NGaWxlKGNvbXByZXNzZWRGaWxlKTtcbmNvbnN0IGRlY29kZWRGaWxlPWRlY29kZUZpbGUoZGVjb21wcmVzc2VkRmlsZSk7XG5maWxlcy5zZXQoZGVjb2RlZEZpbGUubmFtZSxkZWNvZGVkRmlsZSk7XG4gfVxuLyogVE9ETyBoYW5kbGUgZXhwbGljaXQgZGlyZWN0b3J5IGVudHJpZXMqL1xuIH1cbnJldHVybiBmaWxlcztcbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVhZFppcCI6WyJyZWFkWmlwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN6TfjelGwAApRsAACYAAABAZW5kby96aXAtdjAuMi4zMS9zcmMvZm9ybWF0LXdyaXRlci5qc3siaW1wb3J0cyI6WyIuL2NvbXByZXNzaW9uLmpzIiwiLi9jcmMzMi5qcyIsIi4vc2lnbmF0dXJlLmpzIl0sImV4cG9ydHMiOlsid3JpdGVaaXAiLCJ3cml0ZVppcFJlY29yZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRo4oCNX2ltcG9ydHMoW1tcIi4vY3JjMzIuanNcIiwgW1tcImNyYzMyXCIsIFskaOKAjV9hID0+IChjcmMzMiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NpZ25hdHVyZS5qc1wiLCBbW1wiKlwiLCBbJGjigI1fYSA9PiAoc2lnbmF0dXJlID0gJGjigI1fYSldXV1dLFtcIi4vY29tcHJlc3Npb24uanNcIiwgW1tcIipcIiwgWyRo4oCNX2EgPT4gKGNvbXByZXNzaW9uID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwUmVjb3JkcywgJ25hbWUnLCB7dmFsdWU6IFwid3JpdGVaaXBSZWNvcmRzXCJ9KTskaOKAjV9vbmNlLndyaXRlWmlwUmVjb3Jkcyh3cml0ZVppcFJlY29yZHMpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3cml0ZVppcCwgJ25hbWUnLCB7dmFsdWU6IFwid3JpdGVaaXBcIn0pOyRo4oCNX29uY2Uud3JpdGVaaXAod3JpdGVaaXApOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgVU5JWD0zO1xuY29uc3QgVU5JWF9WRVJTSU9OPTMwO1xuXG5jb25zdCB0ZXh0RW5jb2Rlcj1uZXcgVGV4dEVuY29kZXIoKTtcblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gd3JpdGVyXG4gKiBAcGFyYW0ge0RhdGU/fSBkYXRlXG4gKiBAc2VlIGh0dHA6Ly93d3cuZGVsb3JpZS5jb20vZGpncHAvZG9jL3JiaW50ZXIvaXQvNjUvMTYuaHRtbFxuICogQHNlZSBodHRwOi8vd3d3LmRlbG9yaWUuY29tL2RqZ3BwL2RvYy9yYmludGVyL2l0LzY2LzE2Lmh0bWxcbiAqL1xuZnVuY3Rpb24gd3JpdGVEb3NEYXRlVGltZSh3cml0ZXIsZGF0ZSl7XG5jb25zdCBkb3NUaW1lPVxuZGF0ZSE9PXVuZGVmaW5lZCYmZGF0ZSE9PW51bGw/XG4oZGF0ZS5nZXRVVENGdWxsWWVhcigpLTE5ODAmMHg3Zik8PDI1fC8qIHllYXIqL1xuZGF0ZS5nZXRVVENNb250aCgpKzE8PDIxfC8qIG1vbnRoKi9cbmRhdGUuZ2V0VVRDRGF0ZSgpPDwxNnwvKiBkYXkqL1xuZGF0ZS5nZXRVVENIb3VycygpPDwxMXwvKiBob3VyKi9cbmRhdGUuZ2V0VVRDTWludXRlcygpPDw1fC8qIG1pbnV0ZSovXG5kYXRlLmdldFVUQ1NlY29uZHMoKT4+MS8qIHNlY29uZCovOlxuMDsvKiBFcG9jaCBvcmlnaW4gYnkgZGVmYXVsdC4qL1xud3JpdGVyLndyaXRlVWludDMyKGRvc1RpbWUsdHJ1ZSk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7RmlsZVJlY29yZH0gZmlsZVxuICogQHJldHVybnMge0xvY2FsRmlsZUxvY2F0b3J9XG4gKi9cbmZ1bmN0aW9uIHdyaXRlRmlsZSh3cml0ZXIsZmlsZSl7XG4vKiBIZWFkZXIqL1xuY29uc3QgZmlsZVN0YXJ0PXdyaXRlci5pbmRleDtcbndyaXRlci53cml0ZShzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuY29uc3QgaGVhZGVyU3RhcnQ9d3JpdGVyLmluZGV4O1xuLyogVmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdCovXG53cml0ZXIud3JpdGVVaW50MTYoMTAsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5iaXRGbGFnLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUuY29tcHJlc3Npb25NZXRob2QsdHJ1ZSk7XG53cml0ZURvc0RhdGVUaW1lKHdyaXRlcixmaWxlLmRhdGUpO1xud3JpdGVyLndyaXRlVWludDMyKGZpbGUuY3JjMzIsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS5jb21wcmVzc2VkTGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGZpbGUudW5jb21wcmVzc2VkTGVuZ3RoLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGZpbGUubmFtZS5sZW5ndGgsdHJ1ZSk7XG5jb25zdCBoZWFkZXJFbmQ9d3JpdGVyLmxlbmd0aDtcblxuLyogVE9ETyBjb3VudCBvZiBleHRyYSBmaWVsZHMgbGVuZ3RoKi9cbndyaXRlci53cml0ZVVpbnQxNigwLHRydWUpO1xud3JpdGVyLndyaXRlKGZpbGUubmFtZSk7XG4vKiBUT0RPIHdyaXRlIGV4dHJhIGZpZWxkcyovXG53cml0ZXIud3JpdGUoZmlsZS5jb250ZW50KTtcblxucmV0dXJue1xuZmlsZVN0YXJ0LFxuaGVhZGVyU3RhcnQsXG5oZWFkZXJFbmR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7RmlsZVJlY29yZH0gZmlsZVxuICogQHBhcmFtIHtMb2NhbEZpbGVMb2NhdG9yfSBsb2NhdG9yXG4gKi9cbmZ1bmN0aW9uIHdyaXRlQ2VudHJhbEZpbGVIZWFkZXIod3JpdGVyLGZpbGUsbG9jYXRvcil7XG53cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpO1xud3JpdGVyLndyaXRlVWludDgoZmlsZS52ZXJzaW9uKTtcbndyaXRlci53cml0ZVVpbnQ4KGZpbGUubWFkZUJ5KTtcbndyaXRlci53cml0ZUNvcHkobG9jYXRvci5oZWFkZXJTdGFydCxsb2NhdG9yLmhlYWRlckVuZCk7XG4vKiBUT0RPIGV4dHJhIGZpZWxkcyBsZW5ndGgqL1xud3JpdGVyLndyaXRlVWludDE2KDAsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoZmlsZS5jb21tZW50Lmxlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmRpc2tOdW1iZXJTdGFydCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihmaWxlLmludGVybmFsRmlsZUF0dHJpYnV0ZXMsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoZmlsZS5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzLHRydWUpO1xud3JpdGVyLndyaXRlVWludDMyKGxvY2F0b3IuZmlsZVN0YXJ0LHRydWUpO1xud3JpdGVyLndyaXRlKGZpbGUuY2VudHJhbE5hbWUpO1xuLyogVE9ETyBleHRyYSBmaWVsZHMqL1xud3JpdGVyLndyaXRlKGZpbGUuY29tbWVudCk7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7QnVmZmVyV3JpdGVyfSB3cml0ZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBlbnRyaWVzQ291bnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBjZW50cmFsRGlyZWN0b3J5U3RhcnRcbiAqIEBwYXJhbSB7bnVtYmVyfSBjZW50cmFsRGlyZWN0b3J5TGVuZ3RoXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGNvbW1lbnRCeXRlc1xuICovXG5mdW5jdGlvbiB3cml0ZUVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChcbndyaXRlcixcbmVudHJpZXNDb3VudCxcbmNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbmNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsXG5jb21tZW50Qnl0ZXMpXG57XG53cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7XG53cml0ZXIud3JpdGVVaW50MTYoMCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNigwLHRydWUpO1xud3JpdGVyLndyaXRlVWludDE2KGVudHJpZXNDb3VudCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQxNihlbnRyaWVzQ291bnQsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MzIoY2VudHJhbERpcmVjdG9yeUxlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZVVpbnQzMihjZW50cmFsRGlyZWN0b3J5U3RhcnQsdHJ1ZSk7XG53cml0ZXIud3JpdGVVaW50MTYoY29tbWVudEJ5dGVzLmxlbmd0aCx0cnVlKTtcbndyaXRlci53cml0ZShjb21tZW50Qnl0ZXMpO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gd3JpdGVyXG4gKiBAcGFyYW0ge0FycmF5PEZpbGVSZWNvcmQ+fSByZWNvcmRzXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWVudFxuICovXG5mdW5jdGlvbiAgICAgICAgd3JpdGVaaXBSZWNvcmRzKHdyaXRlcixyZWNvcmRzLGNvbW1lbnQ9Jycpe1xuLyogV3JpdGUgcmVjb3JkcyB3aXRoIGxvY2FsIGhlYWRlcnMuKi9cbmNvbnN0IGxvY2F0b3JzPVtdO1xuZm9yKGxldCBpPTA7aTxyZWNvcmRzLmxlbmd0aDtpKz0xKXtcbmxvY2F0b3JzLnB1c2god3JpdGVGaWxlKHdyaXRlcixyZWNvcmRzW2ldKSk7XG4gfVxuXG4vKiB3cml0ZUNlbnRyYWxEaXJlY3RvcnkqL1xuY29uc3QgY2VudHJhbERpcmVjdG9yeVN0YXJ0PXdyaXRlci5pbmRleDtcbmZvcihsZXQgaT0wO2k8bG9jYXRvcnMubGVuZ3RoO2krPTEpe1xud3JpdGVDZW50cmFsRmlsZUhlYWRlcih3cml0ZXIscmVjb3Jkc1tpXSxsb2NhdG9yc1tpXSk7XG4gfVxuY29uc3QgY2VudHJhbERpcmVjdG9yeUxlbmd0aD13cml0ZXIuaW5kZXgtY2VudHJhbERpcmVjdG9yeVN0YXJ0O1xuXG5jb25zdCBjb21tZW50Qnl0ZXM9dGV4dEVuY29kZXIuZW5jb2RlKGNvbW1lbnQpO1xuXG4vKiBXcml0ZSBjZW50cmFsIGRpcmVjdG9yeSBlbmQuKi9cbndyaXRlRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKFxud3JpdGVyLFxucmVjb3Jkcy5sZW5ndGgsXG5jZW50cmFsRGlyZWN0b3J5U3RhcnQsXG5jZW50cmFsRGlyZWN0b3J5TGVuZ3RoLFxuY29tbWVudEJ5dGVzKTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5BcmNoaXZlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuVW5jb21wcmVzc2VkRmlsZX1cbiAqL1xuZnVuY3Rpb24gZW5jb2RlRmlsZShmaWxlKXtcbmNvbnN0IG5hbWU9dGV4dEVuY29kZXIuZW5jb2RlKGZpbGUubmFtZS5yZXBsYWNlKC9cXFxcL2csJy8nKSk7XG5jb25zdCBjb21tZW50PXRleHRFbmNvZGVyLmVuY29kZShmaWxlLmNvbW1lbnQpO1xucmV0dXJue1xubmFtZSxcbm1vZGU6ZmlsZS5tb2RlLFxuZGF0ZTpmaWxlLmRhdGUsXG5jb250ZW50OmZpbGUuY29udGVudCxcbmNvbW1lbnR9O1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlVuY29tcHJlc3NlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29tcHJlc3NlZEZpbGV9XG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzRmlsZVdpdGhTdG9yZShmaWxlKXtcbnJldHVybntcbm5hbWU6ZmlsZS5uYW1lLFxubW9kZTpmaWxlLm1vZGUsXG5kYXRlOmZpbGUuZGF0ZSxcbmNyYzMyOmNyYzMyKGZpbGUuY29udGVudCksXG5jb21wcmVzc2lvbk1ldGhvZDpjb21wcmVzc2lvbi5TVE9SRSxcbmNvbXByZXNzZWRMZW5ndGg6ZmlsZS5jb250ZW50Lmxlbmd0aCxcbnVuY29tcHJlc3NlZExlbmd0aDpmaWxlLmNvbnRlbnQubGVuZ3RoLFxuY29udGVudDpmaWxlLmNvbnRlbnQsXG5jb21tZW50OmZpbGUuY29tbWVudH07XG5cbiB9XG5cbi8qKlxuICogQ29tcHV0ZXMgWmlwIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcyBmaWVsZCBmcm9tIGEgVU5JWCBtb2RlIGZvciBhIGZpbGUuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG1vZGVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmZ1bmN0aW9uIGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMobW9kZSl7XG5yZXR1cm4obW9kZSYwbzc3N3wwbzEwMDAwMCk8PDE2O1xuIH1cblxuLyogVE9ETyBBZGQgc3VwcG9ydCBmb3IgZGlyZWN0b3J5IHJlY29yZHMuKi9cbi8qIC8qKiovXG4vKiAqIEBwYXJhbSB7bnVtYmVyfSBtb2RlKi9cbi8qICogQHJldHVybiB7bnVtYmVyfSovXG4vKiAqWC8qL1xuLyogZnVuY3Rpb24gZXh0ZXJuYWxEaXJlY3RvcnlBdHRyaWJ1dGVzKG1vZGUpIHsqL1xuLyogLy8gVGhlIDB4MTAgaXMgdGhlIERPUyBkaXJlY3RvcnkgYXR0cmlidXRlLCB3aGljaCBpcyBzZXQgcmVnYXJkbGVzcyBvZiBwbGF0Zm9ybS4qL1xuLyogcmV0dXJuICgobW9kZSAmIDBvNzc3KSB8IDBvNDAwMDApIDw8IDE2IHwgMHgxMDsqL1xuLyogfSovXG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29tcHJlc3NlZEZpbGV9IGZpbGVcbiAqIEByZXR1cm5zIHtGaWxlUmVjb3JkfVxuICovXG5mdW5jdGlvbiBtYWtlRmlsZVJlY29yZChmaWxlKXtcbnJldHVybntcbm5hbWU6ZmlsZS5uYW1lLFxuY2VudHJhbE5hbWU6ZmlsZS5uYW1lLFxubWFkZUJ5OlVOSVgsXG52ZXJzaW9uOlVOSVhfVkVSU0lPTixcbnZlcnNpb25OZWVkZWQ6MCwvKiBUT0RPIHRoaXMgaXMgcHJvYmFibHkgdG9vIGxheC4qL1xuYml0RmxhZzowLFxuY29tcHJlc3Npb25NZXRob2Q6Y29tcHJlc3Npb24uU1RPUkUsXG5kYXRlOmZpbGUuZGF0ZSxcbmNyYzMyOmZpbGUuY3JjMzIsXG5jb21wcmVzc2VkTGVuZ3RoOmZpbGUuY29tcHJlc3NlZExlbmd0aCxcbnVuY29tcHJlc3NlZExlbmd0aDpmaWxlLnVuY29tcHJlc3NlZExlbmd0aCxcbmRpc2tOdW1iZXJTdGFydDowLFxuaW50ZXJuYWxGaWxlQXR0cmlidXRlczowLFxuZXh0ZXJuYWxGaWxlQXR0cmlidXRlczpleHRlcm5hbEZpbGVBdHRyaWJ1dGVzKGZpbGUubW9kZSksXG5jb21tZW50OmZpbGUuY29tbWVudCxcbmNvbnRlbnQ6ZmlsZS5jb250ZW50fTtcblxuIH1cblxuLyoqXG4gKiBAcGFyYW0ge0J1ZmZlcldyaXRlcn0gd3JpdGVyXG4gKiBAcGFyYW0ge0FycmF5PFhpbXBvcnQoJy4vdHlwZXMuanMnKS5BcmNoaXZlZEZpbGU+fSBmaWxlc1xuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1lbnRcbiAqL1xuZnVuY3Rpb24gICAgICAgIHdyaXRlWmlwKHdyaXRlcixmaWxlcyxjb21tZW50PScnKXtcbmNvbnN0IGVuY29kZWRGaWxlcz1maWxlcy5tYXAoZW5jb2RlRmlsZSk7XG5jb25zdCBjb21wcmVzc2VkRmlsZXM9ZW5jb2RlZEZpbGVzLm1hcChjb21wcmVzc0ZpbGVXaXRoU3RvcmUpO1xuLyogVE9ETyBjb2xsYXRlIGRpcmVjdG9yeVJlY29yZHMgZnJvbSBmaWxlIGJhc2VzLiovXG5jb25zdCBmaWxlUmVjb3Jkcz1jb21wcmVzc2VkRmlsZXMubWFwKG1ha2VGaWxlUmVjb3JkKTtcbndyaXRlWmlwUmVjb3Jkcyh3cml0ZXIsZmlsZVJlY29yZHMsY29tbWVudCk7XG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndyaXRlWmlwUmVjb3JkcyI6WyJ3cml0ZVppcFJlY29yZHMiXSwid3JpdGVaaXAiOlsid3JpdGVaaXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5wlYYiwHAAAsBwAAHwAAAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9yZWFkZXIuanN7ImltcG9ydHMiOlsiLi9idWZmZXItcmVhZGVyLmpzIiwiLi9mb3JtYXQtcmVhZGVyLmpzIl0sImV4cG9ydHMiOlsiWmlwUmVhZGVyIiwicmVhZFppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBCdWZmZXJSZWFkZXIscmVhZFppcEZvcm1hdDskaOKAjV9pbXBvcnRzKFtbXCIuL2J1ZmZlci1yZWFkZXIuanNcIiwgW1tcIkJ1ZmZlclJlYWRlclwiLCBbJGjigI1fYSA9PiAoQnVmZmVyUmVhZGVyID0gJGjigI1fYSldXV1dLFtcIi4vZm9ybWF0LXJlYWRlci5qc1wiLCBbW1wicmVhZFppcFwiLCBbJGjigI1fYSA9PiAocmVhZFppcEZvcm1hdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jbGFzcyAgICAgICAgWmlwUmVhZGVye1xuLyoqXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGRhdGFcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5uYW1lXVxuICovXG4gICAgICAgICAgIGNvbnN0cnVjdG9yKGRhdGEsb3B0aW9ucz17fSl7XG5jb25zdHtuYW1lPSc8dW5rbm93bj4nfT1vcHRpb25zO1xuY29uc3QgcmVhZGVyPW5ldyBCdWZmZXJSZWFkZXIoZGF0YSk7XG50aGlzLmZpbGVzPXJlYWRaaXBGb3JtYXQocmVhZGVyKTtcbnRoaXMubmFtZT1uYW1lO1xuIH1cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge1VpbnQ4QXJyYXl9XG4gKi9cbiAgICByZWFkKG5hbWUpe1xuY29uc3QgZmlsZT10aGlzLmZpbGVzLmdldChuYW1lKTtcbmlmKGZpbGU9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKCBgQ2Fubm90IGZpbmQgZmlsZSAke25hbWV9IGluIFppcCBmaWxlICR7dGhpcy5uYW1lfWApO1xuIH1cbnJldHVybiBmaWxlLmNvbnRlbnQ7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi90eXBlcy5qcycpLkFyY2hpdmVkU3RhdD19XG4gKi9cbiAgICBzdGF0KG5hbWUpe1xuY29uc3QgZmlsZT10aGlzLmZpbGVzLmdldChuYW1lKTtcbmlmKGZpbGU9PT11bmRlZmluZWQpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm57XG50eXBlOmZpbGUudHlwZSxcbm1vZGU6ZmlsZS5tb2RlLFxuZGF0ZTpmaWxlLmRhdGUsXG5jb21tZW50OmZpbGUuY29tbWVudH07XG5cbiB9fVxuXG5cbi8qKlxuICogQHBhcmFtIHtVaW50OEFycmF5fSBkYXRhXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPFhpbXBvcnQoJy4vdHlwZXMuanMnKS5BcmNoaXZlUmVhZGVyPn1cbiAqLyRo4oCNX29uY2UuIFppcFJlYWRlcihaaXBSZWFkZXIpO1xuY29uc3QgICAgICAgIHJlYWRaaXA9YXN5bmMoZGF0YSxsb2NhdGlvbik9PntcbmNvbnN0IHJlYWRlcj1uZXcgWmlwUmVhZGVyKGRhdGEse25hbWU6bG9jYXRpb259KTtcbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlYWRGbn0gKi9cbmNvbnN0IHJlYWQ9YXN5bmMocGF0aCk9PnJlYWRlci5yZWFkKHBhdGgpO1xucmV0dXJue3JlYWR9O1xuIH07JGjigI1fb25jZS5yZWFkWmlwKHJlYWRaaXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlppcFJlYWRlciI6WyJaaXBSZWFkZXIiXSwicmVhZFppcCI6WyJyZWFkWmlwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABA0RBq2BgAAtgYAACIAAABAZW5kby96aXAtdjAuMi4zMS9zcmMvc2lnbmF0dXJlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiLCJDRU5UUkFMX0ZJTEVfSEVBREVSIiwiREFUQV9ERVNDUklQVE9SIiwiTE9DQUxfRklMRV9IRUFERVIiLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIGVzbGludCBuby1iaXR3aXNlOiBbXCJvZmZcIl0gKi9cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gKiBAcmV0dXJucyB7VWludDhBcnJheX1cbiAqL1xuZnVuY3Rpb24gdShzdHJpbmcpe1xuY29uc3QgYXJyYXk9bmV3IFVpbnQ4QXJyYXkoc3RyaW5nLmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPHN0cmluZy5sZW5ndGg7aSs9MSl7XG5hcnJheVtpXT1zdHJpbmcuY2hhckNvZGVBdChpKSYweGZmO1xuIH1cbnJldHVybiBhcnJheTtcbiB9XG5cbmNvbnN0ICAgICAgICBMT0NBTF9GSUxFX0hFQURFUj11KCdQS1xceDAzXFx4MDQnKTskaOKAjV9vbmNlLkxPQ0FMX0ZJTEVfSEVBREVSKExPQ0FMX0ZJTEVfSEVBREVSKTtcbmNvbnN0ICAgICAgICBDRU5UUkFMX0ZJTEVfSEVBREVSPXUoJ1BLXFx4MDFcXHgwMicpOyRo4oCNX29uY2UuQ0VOVFJBTF9GSUxFX0hFQURFUihDRU5UUkFMX0ZJTEVfSEVBREVSKTtcbmNvbnN0ICAgICAgICBDRU5UUkFMX0RJUkVDVE9SWV9FTkQ9dSgnUEtcXHgwNVxceDA2Jyk7JGjigI1fb25jZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQoQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbmNvbnN0ICAgICAgICBaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SPXUoJ1BLXFx4MDZcXHgwNycpOyRo4oCNX29uY2UuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUihaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKTtcbmNvbnN0ICAgICAgICBaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQ9dSgnUEtcXHgwNlxceDA2Jyk7JGjigI1fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQoWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbmNvbnN0ICAgICAgICBEQVRBX0RFU0NSSVBUT1I9dSgnUEtcXHgwN1xceDA4Jyk7JGjigI1fb25jZS5EQVRBX0RFU0NSSVBUT1IoREFUQV9ERVNDUklQVE9SKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJMT0NBTF9GSUxFX0hFQURFUiI6WyJMT0NBTF9GSUxFX0hFQURFUiJdLCJDRU5UUkFMX0ZJTEVfSEVBREVSIjpbIkNFTlRSQUxfRklMRV9IRUFERVIiXSwiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIkNFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiXSwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJEQVRBX0RFU0NSSVBUT1IiOlsiREFUQV9ERVNDUklQVE9SIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJgZO7M0AQAANAEAAB4AAABAZW5kby96aXAtdjAuMi4zMS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAg9krFlgHAABYBwAAHwAAAEBlbmRvL3ppcC12MC4yLjMxL3NyYy93cml0ZXIuanN7ImltcG9ydHMiOlsiLi9idWZmZXItd3JpdGVyLmpzIiwiLi9mb3JtYXQtd3JpdGVyLmpzIl0sImV4cG9ydHMiOlsiWmlwV3JpdGVyIiwid3JpdGVaaXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgQnVmZmVyV3JpdGVyLHdyaXRlWmlwRm9ybWF0OyRo4oCNX2ltcG9ydHMoW1tcIi4vYnVmZmVyLXdyaXRlci5qc1wiLCBbW1wiQnVmZmVyV3JpdGVyXCIsIFskaOKAjV9hID0+IChCdWZmZXJXcml0ZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9mb3JtYXQtd3JpdGVyLmpzXCIsIFtbXCJ3cml0ZVppcFwiLCBbJGjigI1fYSA9PiAod3JpdGVaaXBGb3JtYXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY2xhc3MgICAgICAgIFppcFdyaXRlcntcbi8qKlxuICogQHBhcmFtIHt7XG4gKiAgIGRhdGU6IERhdGUsXG4gKiB9fSBvcHRpb25zXG4gKi9cbiAgICAgICAgICAgY29uc3RydWN0b3Iob3B0aW9ucz17ZGF0ZTpuZXcgRGF0ZSgpfSl7XG5jb25zdHtkYXRlfT1vcHRpb25zO1xuLyoqIHR5cGUge01hcDxzdHJpbmcsIFpGaWxlPn0gKi9cbnRoaXMuZmlsZXM9bmV3IE1hcCgpO1xudGhpcy5kYXRlPWRhdGU7XG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IGNvbnRlbnRcbiAqIEBwYXJhbSB7e1xuICogICBtb2RlPzogbnVtYmVyLFxuICogICBkYXRlPzogRGF0ZSxcbiAqICAgY29tbWVudD86IHN0cmluZyxcbiAqIH19IFtvcHRpb25zXVxuICovXG4gICAgIHdyaXRlKG5hbWUsY29udGVudCxvcHRpb25zPXt9KXtcbmNvbnN0e21vZGU9MG82NDQsZGF0ZT11bmRlZmluZWQsY29tbWVudD0nJ309b3B0aW9ucztcbmlmKCFjb250ZW50KXtcbnRocm93IG5ldyBFcnJvciggYFppcFdyaXRlciB3cml0ZSByZXF1aXJlcyBjb250ZW50IGZvciAke25hbWV9YCk7XG4gfVxudGhpcy5maWxlcy5zZXQobmFtZSx7XG5uYW1lLFxubW9kZSxcbmRhdGUsXG5jb250ZW50LFxuY29tbWVudH0pO1xuXG4gfVxuXG4vKipcbiAqIEByZXR1cm5zIHtVaW50OEFycmF5fVxuICovXG4gICAgICAgIHNuYXBzaG90KCl7XG5jb25zdCB3cml0ZXI9bmV3IEJ1ZmZlcldyaXRlcigpO1xud3JpdGVaaXBGb3JtYXQod3JpdGVyLEFycmF5LmZyb20odGhpcy5maWxlcy52YWx1ZXMoKSkpO1xucmV0dXJuIHdyaXRlci5zdWJhcnJheSgpO1xuIH19XG5cblxuLyoqXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi90eXBlcy5qcycpLkFyY2hpdmVXcml0ZXJ9XG4gKi8kaOKAjV9vbmNlLiBaaXBXcml0ZXIoWmlwV3JpdGVyKTtcbmNvbnN0ICAgICAgICB3cml0ZVppcD0oKT0+e1xuY29uc3Qgd3JpdGVyPW5ldyBaaXBXcml0ZXIoKTtcbi8qKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLldyaXRlRm59ICovXG5jb25zdCB3cml0ZT1hc3luYyhwYXRoLGRhdGEpPT57XG53cml0ZXIud3JpdGUocGF0aCxkYXRhKTtcbiB9O1xuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU25hcHNob3RGbn0gKi9cbmNvbnN0IHNuYXBzaG90PWFzeW5jKCk9PndyaXRlci5zbmFwc2hvdCgpO1xucmV0dXJue3dyaXRlLHNuYXBzaG90fTtcbiB9OyRo4oCNX29uY2Uud3JpdGVaaXAod3JpdGVaaXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlppcFdyaXRlciI6WyJaaXBXcml0ZXIiXSwid3JpdGVaaXAiOlsid3JpdGVaaXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAi7qHkq0BAACtAQAAHAAAAGplc3NpZS5qcy12MC4zLjIvc3JjL21haW4uanN7ImltcG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9yaW5nMC9tYWluLmpzXCIsIFtdXSxbXCIuL3JpbmcxL21haW4uanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ3PE4ldAQAAXQEAAB8AAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9FLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIkBlbmRvL2ZhciJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+LTJv6kDAACpAwAALAAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhc3luY0dlbmVyYXRlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXN5bmMgaXRlcmFibGUgdGhhdCBwcm9kdWNlcyBpdGVyYXRvciByZXN1bHRzIHZpYSBgbmV4dGAuXG4gKlxuICogVGhpcyB3b3JrcyBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgU3ltYm9sLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFRSZXR1cm5cbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4gfFxuICogICAgICAgICAgICAgICBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PlxuICogfSBuZXh0IHByb2R1Y2UgYSBzaW5nbGUtc3RlcCBpdGVyYXRvciByZXN1bHRcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgYXN5bmNHZW5lcmF0ZT0obmV4dCk9PntcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+e1xucmV0dXJuIGhhcmRlbih7XG5uZXh0OmFzeW5jKCk9PmhhcmRlbihuZXh0KCkpfSk7XG5cbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UuYXN5bmNHZW5lcmF0ZShhc3luY0dlbmVyYXRlKTtcbmhhcmRlbihhc3luY0dlbmVyYXRlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0dlbmVyYXRlIjpbImFzeW5jR2VuZXJhdGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAl9dU7dABAADQAQAAIgAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL21haW4uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyIsIi4vbWFrZXJzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9FLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyIsIi4vbWFrZXJzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtdXSxbXCIuL21ha2Vycy5qc1wiLCBbXV0sW1wiLi9hc3luYy1nZW5lcmF0ZS5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAb5t7YuMIAADjCAAAJAAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL21ha2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZU1hcCIsIm1ha2VQcm9taXNlIiwibWFrZVNldCIsIm1ha2VXZWFrTWFwIiwibWFrZVdlYWtTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyogVGhlc2Ugd29yayBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgYG5ld2AuKi9cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIgLz4qL1xuXG4vKiogQHR5cGUgezxUPihleGVjdXRvcjogKHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PlxuICogdm9pZCkgPT4gdm9pZCkgPT4gUHJvbWlzZTxUPn0gKi9cbmNvbnN0ICAgICAgICBtYWtlUHJvbWlzZT0oZXhlY3V0b3IpPT5oYXJkZW4obmV3IFByb21pc2UoZXhlY3V0b3IpKTskaOKAjV9vbmNlLm1ha2VQcm9taXNlKG1ha2VQcm9taXNlKTtcbmhhcmRlbihtYWtlUHJvbWlzZSk7XG5cbi8qKiBAdHlwZWRlZiB7PEssIFY+KGVudHJpZXM/OiByZWFkb25seSAocmVhZG9ubHkgW0ssIFZdKVtdKSA9PiBNYXA8SywgVj59IE1hcEZyb21FbnRyaWVzICovXG4vKiogQHR5cGVkZWYgezxLLCBWPihpdGVyYWJsZTogSXRlcmFibGU8cmVhZG9ubHkgW0ssIFZdPikgPT4gTWFwPEssIFY+fSBNYXBGcm9tSXRlcmFibGUgKi9cblxuLyoqIEB0eXBlIHtNYXBGcm9tRW50cmllcyAmIE1hcEZyb21JdGVyYWJsZX0gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFwPShlbnRyaWVzT3JJdGVyYWJsZSk9PmhhcmRlbihuZXcgTWFwKGVudHJpZXNPckl0ZXJhYmxlKSk7JGjigI1fb25jZS5tYWtlTWFwKG1ha2VNYXApO1xuaGFyZGVuKG1ha2VNYXApO1xuXG4vKiogQHR5cGVkZWYgezxUPih2YWx1ZXM/OiByZWFkb25seSBUW10pID0+IFNldDxUPn0gU2V0RnJvbVZhbHVlcyAqL1xuLyoqIEB0eXBlZGVmIHs8VD4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+KSA9PiBTZXQ8VD59IFNldEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtTZXRGcm9tVmFsdWVzICYgU2V0RnJvbUl0ZXJhYmxlfSAqL1xuY29uc3QgICAgICAgIG1ha2VTZXQ9KHZhbHVlcyk9PmhhcmRlbihuZXcgU2V0KHZhbHVlcykpOyRo4oCNX29uY2UubWFrZVNldChtYWtlU2V0KTtcbmhhcmRlbihtYWtlU2V0KTtcblxuLyoqIEB0eXBlZGVmIHs8SyBleHRlbmRzIHt9LCBWID0gYW55PihlbnRyaWVzPzogcmVhZG9ubHkgW0ssIFZdW10gfCBudWxsKSA9PiBXZWFrTWFwPEssIFY+fSBXZWFrTWFwRnJvbUVudHJpZXMgKi9cbi8qKiBAdHlwZWRlZiB7PEsgZXh0ZW5kcyB7fSwgVj4oaXRlcmFibGU6IEl0ZXJhYmxlPFtLLCBWXT4pID0+IFdlYWtNYXA8SywgVj59IFdlYWtNYXBGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7V2Vha01hcEZyb21FbnRyaWVzICYgV2Vha01hcEZyb21JdGVyYWJsZX0gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha01hcD0oZW50cmllcyk9PmhhcmRlbihuZXcgV2Vha01hcChlbnRyaWVzKSk7JGjigI1fb25jZS5tYWtlV2Vha01hcChtYWtlV2Vha01hcCk7XG5oYXJkZW4obWFrZVdlYWtNYXApO1xuXG4vKiogQHR5cGVkZWYgezxUIGV4dGVuZHMge30+KHZhbHVlcz86IHJlYWRvbmx5IFRbXSkgPT4gV2Vha1NldDxUPn0gV2Vha1NldEZyb21WYWx1ZXMgKi9cbi8qKiBAdHlwZWRlZiB7PFQgZXh0ZW5kcyB7fT4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+KSA9PiBXZWFrU2V0PFQ+fSBXZWFrU2V0RnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1dlYWtTZXRGcm9tVmFsdWVzICYgV2Vha1NldEZyb21JdGVyYWJsZX0gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha1NldD0odmFsdWVzKT0+aGFyZGVuKG5ldyBXZWFrU2V0KHZhbHVlcykpOyRo4oCNX29uY2UubWFrZVdlYWtTZXQobWFrZVdlYWtTZXQpO1xuaGFyZGVuKG1ha2VXZWFrU2V0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZSI6WyJtYWtlUHJvbWlzZSJdLCJtYWtlTWFwIjpbIm1ha2VNYXAiXSwibWFrZVNldCI6WyJtYWtlU2V0Il0sIm1ha2VXZWFrTWFwIjpbIm1ha2VXZWFrTWFwIl0sIm1ha2VXZWFrU2V0IjpbIm1ha2VXZWFrU2V0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALQs9Zj+BAAA/gQAACkAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMS9hc3luYy10b29scy5qc3siaW1wb3J0cyI6WyIuLi9yaW5nMC9tYWluLmpzIl0sImV4cG9ydHMiOlsiYXN5bmNEb1doaWxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIi4uL3JpbmcwL21haW4uanNcIiwgW1tcIm1ha2VQcm9taXNlXCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBSZXNvbHZlIHJldHVybmVkIHByb21pc2Ugd2l0aCB1bmRlZmluZWQgd2hlbiBgYm9keWAgcmV0dXJucyBmYWxzeS5cbiAqXG4gKiBUaGlzIHdvcmtzIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBgYXdhaXRgIG5vdCBhdCB0aGUgZnVuY3Rpb24tbGV2ZWwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVCB8IFByb21pc2U8VD59IGJvZHkgcGVyZm9ybSBzaWRlLWVmZmVjdHMsIGFuZCByZXR1cm4gdHJ1dGh5IGlmXG4gKiB3ZSBzaG91bGQgcnVuIGFnYWluXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgICAgICAgIGFzeW5jRG9XaGlsZT0oYm9keSk9PntcbmNvbnN0IGxvb3A9YXN5bmMocmVzb2x2ZSxyZWplY3QpPT57XG5jb25zdCBkb0NvbnRpbnVlPWF3YWl0IGJvZHkoKTtcbmlmKCFkb0NvbnRpbnVlKXtcbi8qIFJlc29sdmUgdGhlIG91dGVybW9zdCBwcm9taXNlLiovXG5yZXNvbHZlKHVuZGVmaW5lZCk7XG5yZXR1cm47XG4gfVxuXG4vKiBEbyB0aGUgbG9vcCBhZ2Fpbi4gIFdlIGFyZSBjYXJlZnVsIG5vdCB0byBhd2FpdCBzbyB0aGF0IHdlIGRvbid0IGNyZWF0ZSBhKi9cbi8qIHByb21pc2UgY2hhaW4uKi9cbmxvb3AocmVzb2x2ZSxyZWplY3QpLmNhdGNoKHJlamVjdCk7XG4gfTtcblxucmV0dXJuIG1ha2VQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9Pmxvb3AocmVzb2x2ZSxyZWplY3QpLmNhdGNoKHJlamVjdCkpO1xuIH07JGjigI1fb25jZS5hc3luY0RvV2hpbGUoYXN5bmNEb1doaWxlKTtcbmhhcmRlbihhc3luY0RvV2hpbGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jRG9XaGlsZSI6WyJhc3luY0RvV2hpbGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlhNCsnIBAAByAQAAIgAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcxL21haW4uanN7ImltcG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2FzeW5jLXRvb2xzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAAHt9MboUXAEAFFwBABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAADmKVgI7CwAAOwsAACMAAAAAAAAAAAAAAKSBRlwBAEBhZ29yaWMvYXNzZXJ0LXYwLjYuMC9zcmMvYXNzZXJ0LmpzUEsBAh4DCgAAAAAAAAAAAAW5h+zaLgAA2i4AACIAAAAAAAAAAAAAAKSBwmcBAEBhZ29yaWMvYXNzZXJ0LXYwLjYuMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAU/WFv0Y3AABGNwAAJgAAAAAAAAAAAAAApIHclgEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudE1hdGguanNQSwECHgMKAAAAAAAAAAAASpQA7dUFAADVBQAAJwAAAAAAAAAAAAAApIFmzgEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Rpc3BsYXlJbmZvLmpzUEsBAh4DCgAAAAAAAAAAAEMwe9zoAQAA6AEAACEAAAAAAAAAAAAAAKSBgNQBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAA1XcEomCAAAJggAAAlAAAAAAAAAAAAAACkgafWAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaXNzdWVyS2l0LmpzUEsBAh4DCgAAAAAAAAAAAIDIbu6zBQAAswUAADoAAAAAAAAAAAAAAKSBgvcBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAcediPccFAADHBQAAOgAAAAAAAAAAAAAApIGN/QEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAD/3LD7KgYAACoGAAA2AAAAAAAAAAAAAACkgawDAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAJpmYL58HAACfBwAANgAAAAAAAAAAAAAApIEqCgIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAALA4qB+lBAAApQQAACMAAAAAAAAAAAAAAKSBHRICAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50LmpzUEsBAh4DCgAAAAAAAAAAAA/X6O7rMQAA6zEAACkAAAAAAAAAAAAAAKSBAxcCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wYXltZW50TGVkZ2VyLmpzUEsBAh4DCgAAAAAAAAAAAKJFRULADwAAwA8AACEAAAAAAAAAAAAAAKSBNUkCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wdXJzZS5qc1BLAQIeAwoAAAAAAAAAAAAuSWOpFAYAABQGAAAtAAAAAAAAAAAAAACkgTRZAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAAKO6ePhInAAASJwAAJgAAAAAAAAAAAAAApIGTXwIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAALM+pUXA/AABwPwAAKQAAAAAAAAAAAAAApIHphgIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAAbdthCl4oAABeKAAAJwAAAAAAAAAAAAAApIGgxgIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NhbGxiYWNrLmpzUEsBAh4DCgAAAAAAAAAAAKqP3UYiBgAAIgYAACUAAAAAAAAAAAAAAKSBQ+8CAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanNQSwECHgMKAAAAAAAAAAAAF8kzgMgEAADIBAAAJAAAAAAAAAAAAAAApIGo9QIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzUEsBAh4DCgAAAAAAAAAAAG4VmJ9DAgAAQwIAACQAAAAAAAAAAAAAAKSBsvoCAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAApAbjWfikAAH4pAAAvAAAAAAAAAAAAAACkgTf9AgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1BLAQIeAwoAAAAAAAAAAACi7siA3hAAAN4QAAArAAAAAAAAAAAAAACkgQInAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAFQ5+hEtAgAALQIAACkAAAAAAAAAAAAAAKSBKTgDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAN7GoowrBwAAKwcAACoAAAAAAAAAAAAAAKSBnToDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91cGdyYWRlLWFwaS5qc1BLAQIeAwoAAAAAAAAAAACi6bGS4zwAAOM8AAAkAAAAAAAAAAAAAACkgRBCAwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAZ9DFitUSAADVEgAAMwAAAAAAAAAAAAAApIE1fwMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzUEsBAh4DCgAAAAAAAAAAALC+L08cBwAAHAcAACQAAAAAAAAAAAAAAKSBW5IDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADysAhlWhgAAFoYAAAnAAAAAAAAAAAAAACkgbmZAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvbm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAA1zgTloA4AACAOAAAKgAAAAAAAAAAAAAApIFYsgMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3B1Ymxpc2gta2l0LmpzUEsBAh4DCgAAAAAAAAAAAL4BMCSDCgAAgwoAAC4AAAAAAAAAAAAAAKSBIOsDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZWQtbm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAABFRLcdUhAADVIQAAJwAAAAAAAAAAAAAApIHv9QMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3Jlc3ViLmpzUEsBAh4DCgAAAAAAAAAAANrfCYciJAAAIiQAACgAAAAAAAAAAAAAAKSBCRgEAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmUuanNQSwECHgMKAAAAAAAAAAAAJ7I7I8ULAADFCwAAKQAAAAAAAAAAAAAApIFxPAQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZXIuanNQSwECHgMKAAAAAAAAAAAAIYEWcgwGAAAMBgAAJAAAAAAAAAAAAAAApIF9SAQAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3RvcGljLmpzUEsBAh4DCgAAAAAAAAAAAPhRDxM/MAAAPzAAACwAAAAAAAAAAAAAAKSBy04EAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90eXBlcy1hbWJpZW50LmpzUEsBAh4DCgAAAAAAAAAAAD5iXDZcAQAAXAEAACAAAAAAAAAAAAAAAKSBVH8EAEBhZ29yaWMvc3RvcmUtdjAuOS4yL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAMSj4EgjDAAAIwwAACEAAAAAAAAAAAAAAKSB7oAEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADir4B9RgsAAEYLAAAsAAAAAAAAAAAAAACkgVCNBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc1BLAQIeAwoAAAAAAAAAAACmg020wgYAAMIGAAAwAAAAAAAAAAAAAACkgeCYBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNQSwECHgMKAAAAAAAAAAAAmgO61xYWAAAWFgAAMQAAAAAAAAAAAAAApIHwnwQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACdA5YgQQ8AAEEPAAAxAAAAAAAAAAAAAACkgVW2BABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAH5F4sl3EwAAdxMAADUAAAAAAAAAAAAAAKSB5cUEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAOhKxGEPDwAADw8AADUAAAAAAAAAAAAAAKSBr9kEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAALLXYwidGQAAnRkAAC4AAAAAAAAAAAAAAKSBEekEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAxQCsglgqAABYKgAAIQAAAAAAAAAAAAAApIH6AgUAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAADUccFD7GwAA+xsAADEAAAAAAAAAAAAAAKSBkS0FAEBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjIvc3JjL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAAIZgh2L8BAAC/AQAAHAAAAAAAAAAAAAAApIHbSQUAQGFnb3JpYy90aW1lLXYwLjMuMi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADAQDfmqCIAAKgiAAAjAAAAAAAAAAAAAACkgdRLBQBAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90aW1lTWF0aC5qc1BLAQIeAwoAAAAAAAAAAABusx6qpwcAAKcHAAAlAAAAAAAAAAAAAACkgb1uBQBAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAADLMtBIlKQAAJSkAACgAAAAAAAAAAAAAAKSBp3YFAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9leG8tdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAO+M9iJIIAACSCAAAJAAAAAAAAAAAAAAApIESoAUAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAN70jyBTKAAAUygAADAAAAAAAAAAAAAAAKSB5qgFAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc1BLAQIeAwoAAAAAAAAAAABxjbziQBwAAEAcAAAoAAAAAAAAAAAAAACkgYfRBQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jbGVhblByb3Bvc2FsLmpzUEsBAh4DCgAAAAAAAAAAAK0bT13HDQAAxw0AADcAAAAAAAAAAAAAAKSBDe4FAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvYWxsb2NhdGlvbk1hdGguanNQSwECHgMKAAAAAAAAAAAAxAlnTJ4FAACeBQAAOQAAAAAAAAAAAAAApIEp/AUAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RGYWNldC9ldmFsQ29udHJhY3RDb2RlLmpzUEsBAh4DCgAAAAAAAAAAAKdK0H04EAAAOBAAAC0AAAAAAAAAAAAAAKSBHgIGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvZXhpdC5qc1BLAQIeAwoAAAAAAAAAAADuCJ8G3gIAAN4CAAA3AAAAAAAAAAAAAACkgaESBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L2ludGVybmFsLXR5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAEekhcQnDAAAJwwAADwAAAAAAAAAAAAAAKSB1BUGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJIYW5kbGVyU3RvcmFnZS5qc1BLAQIeAwoAAAAAAAAAAACaqDlCvBAAALwQAAA0AAAAAAAAAAAAAACkgVUiBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzUEsBAh4DCgAAAAAAAAAAAIJsJGWXDQAAlw0AADMAAAAAAAAAAAAAAKSBYzMGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvcmVhbGxvY2F0ZS5qc1BLAQIeAwoAAAAAAAAAAAAp95JBDQ8AAA0PAAA7AAAAAAAAAAAAAACkgUtBBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L3JpZ2h0c0NvbnNlcnZhdGlvbi5qc1BLAQIeAwoAAAAAAAAAAAAMnEIs+CYAAPgmAAAuAAAAAAAAAAAAAACkgbFQBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAKFNM1+kCwAApAsAADAAAAAAAAAAAAAAAKSB9XcGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvdmF0Um9vdC5qc1BLAQIeAwoAAAAAAAAAAACxDvFBPxkAAD8ZAAAwAAAAAAAAAAAAAACkgeeDBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdEZhY2V0L3pjZk1pbnQuanNQSwECHgMKAAAAAAAAAAAAKR3pLApAAAAKQAAAMAAAAAAAAAAAAAAApIF0nQYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RGYWNldC96Y2ZTZWF0LmpzUEsBAh4DCgAAAAAAAAAAADr/ZM9aPgAAWj4AADIAAAAAAAAAAAAAAKSBzN0GAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvemNmWnlnb3RlLmpzUEsBAh4DCgAAAAAAAAAAABoo2EK5EgAAuRIAADkAAAAAAAAAAAAAAKSBdhwHAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qc1BLAQIeAwoAAAAAAAAAAAAQqnCnIgQAACIEAAAoAAAAAAAAAAAAAACkgYYvBwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9oYW5kbGVXYXJuaW5nLmpzUEsBAh4DCgAAAAAAAAAAAKR9YzYzEQAAMxEAADAAAAAAAAAAAAAAAKSB7jMHAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2luc3RhbmNlUmVjb3JkU3RvcmFnZS5qc1BLAQIeAwoAAAAAAAAAAABtMTtZuScAALknAAApAAAAAAAAAAAAAACkgW9FBwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9pbnRlcm5hbC10eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAmjM+rJgUAACYFAAAnAAAAAAAAAAAAAACkgW9tBwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9pc3N1ZXJSZWNvcmQuanNQSwECHgMKAAAAAAAAAAAAK9QV4kkdAABJHQAAKAAAAAAAAAAAAAAApIHacgcAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvaXNzdWVyU3RvcmFnZS5qc1BLAQIeAwoAAAAAAAAAAACgpBY1VggAAFYIAAAlAAAAAAAAAAAAAACkgWmQBwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9tYWtlSGFuZGxlLmpzUEsBAh4DCgAAAAAAAAAAAMb6lweiBQAAogUAAC0AAAAAAAAAAAAAAKSBApkHAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL29iakFycmF5Q29udmVyc2lvbi5qc1BLAQIeAwoAAAAAAAAAAADlsQnM20MAANtDAAAlAAAAAAAAAAAAAACkge+eBwBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAALfCvHviBgAA4gYAAB8AAAAAAAAAAAAAAKSBDeMHAEBhZ29yaWMvem9uZS12MC4yLjIvc3JjL2hlYXAuanNQSwECHgMKAAAAAAAAAAAA2PQZMI8JAACPCQAAIAAAAAAAAAAAAAAApIEs6gcAQGFnb3JpYy96b25lLXYwLjIuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA954aPOsCAADrAgAAHAAAAAAAAAAAAAAApIH58wcAQGVuZG8vYmFzZTY0LXYwLjIuMzEvYXRvYi5qc1BLAQIeAwoAAAAAAAAAAAB5JImbjQMAAI0DAAAcAAAAAAAAAAAAAACkgR73BwBAZW5kby9iYXNlNjQtdjAuMi4zMS9idG9hLmpzUEsBAh4DCgAAAAAAAAAAAHTa53CVAQAAlQEAAB4AAAAAAAAAAAAAAKSB5foHAEBlbmRvL2Jhc2U2NC12MC4yLjMxL2RlY29kZS5qc1BLAQIeAwoAAAAAAAAAAABHQ26WlQEAAJUBAAAeAAAAAAAAAAAAAACkgbb8BwBAZW5kby9iYXNlNjQtdjAuMi4zMS9lbmNvZGUuanNQSwECHgMKAAAAAAAAAAAAV3Fs4IACAACAAgAAHQAAAAAAAAAAAAAApIGH/gcAQGVuZG8vYmFzZTY0LXYwLjIuMzEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAKA5yQAMEAAADBAAAIgAAAAAAAAAAAAAApIFCAQgAQGVuZG8vYmFzZTY0LXYwLjIuMzEvc3JjL2NvbW1vbi5qc1BLAQIeAwoAAAAAAAAAAACS7ZRkfAkAAHwJAAAiAAAAAAAAAAAAAACkgYUFCABAZW5kby9iYXNlNjQtdjAuMi4zMS9zcmMvZGVjb2RlLmpzUEsBAh4DCgAAAAAAAAAAABqfoADmBwAA5gcAACIAAAAAAAAAAAAAAKSBQQ8IAEBlbmRvL2Jhc2U2NC12MC4yLjMxL3NyYy9lbmNvZGUuanNQSwECHgMKAAAAAAAAAAAA/PTENgQCAAAEAgAAMQAAAAAAAAAAAAAApIFnFwgAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAACQ6+lKdTEAAHUxAAA2AAAAAAAAAAAAAACkgboZCABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9jb21wYXJ0bWVudC1tYXAuanNQSwECHgMKAAAAAAAAAAAAZeYDsHwDAAB8AwAAMAAAAAAAAAAAAAAApIGDSwgAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvZXh0ZW5zaW9uLmpzUEsBAh4DCgAAAAAAAAAAALDNizTOJwAAzicAADUAAAAAAAAAAAAAAKSBTU8IAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL2ltcG9ydC1hcmNoaXZlLmpzUEsBAh4DCgAAAAAAAAAAAMVAAHNJAwAASQMAACsAAAAAAAAAAAAAAKSBbncIAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL2pzb24uanNQSwECHgMKAAAAAAAAAAAAuq57KYA7AACAOwAAKwAAAAAAAAAAAAAApIEAewgAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvbGluay5qc1BLAQIeAwoAAAAAAAAAAAA6Zecx5BQAAOQUAAA8AAAAAAAAAAAAAACkgcm2CABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNQSwECHgMKAAAAAAAAAAAAAGDt2m4FAABuBQAAMgAAAAAAAAAAAAAApIEHzAgAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcGFyc2UtYnl0ZXMuanNQSwECHgMKAAAAAAAAAAAAdUqWQU4WAABOFgAARgAAAAAAAAAAAAAApIHF0QgAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1BLAQIeAwoAAAAAAAAAAAAL3XfjkQUAAJEFAAAxAAAAAAAAAAAAAACkgXfoCABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wYXJzZS1qc29uLmpzUEsBAh4DCgAAAAAAAAAAAMY5EGF3BwAAdwcAADQAAAAAAAAAAAAAAKSBV+4IAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL3BhcnNlLXByZS1janMuanNQSwECHgMKAAAAAAAAAAAAq6T11YYEAACGBAAANAAAAAAAAAAAAAAApIEg9ggAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcGFyc2UtcHJlLW1qcy5qc1BLAQIeAwoAAAAAAAAAAADkIhjfKwUAACsFAAAxAAAAAAAAAAAAAACkgfj6CABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC40L3NyYy9wYXJzZS10ZXh0LmpzUEsBAh4DCgAAAAAAAAAAAKaeGJdSGAAAUhgAADQAAAAAAAAAAAAAAKSBcgAJAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL3BvbGljeS1mb3JtYXQuanNQSwECHgMKAAAAAAAAAAAAmo7Hxng8AAB4PAAALQAAAAAAAAAAAAAApIEWGQkAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguNC9zcmMvcG9saWN5LmpzUEsBAh4DCgAAAAAAAAAAAEFxd72NAwAAjQMAAC0AAAAAAAAAAAAAAKSB2VUJAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjQvc3JjL3Bvd2Vycy5qc1BLAQIeAwoAAAAAAAAAAAB+JG4t0hEAANIRAAAkAAAAAAAAAAAAAACkgbFZCQBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAANwvtTx8CAAAfAgAAKgAAAAAAAAAAAAAApIHFawkAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yL3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAKFYIz+PEAAAjxAAAC4AAAAAAAAAAAAAAKSBLG4JAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAOlKtTRwCAAAcAgAAGQAAAAAAAAAAAAAApIEHfwkAQGVuZG8vZXhvLXYwLjIuMi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADGt+tWYxgAAGMYAAAiAAAAAAAAAAAAAACkgVqBCQBAZW5kby9leG8tdjAuMi4yL3NyYy9leG8tbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAADGwrfJxJgAAcSYAACEAAAAAAAAAAAAAAKSB/ZkJAEBlbmRvL2V4by12MC4yLjIvc3JjL2V4by10b29scy5qc1BLAQIeAwoAAAAAAAAAAABBDDOUQAIAAEACAAAeAAAAAAAAAAAAAACkga3ACQBAZW5kby9mYXItdjAuMi4xOC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA/SVKZgsMAAALDAAANQAAAAAAAAAAAAAApIEpwwkAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQvc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanNQSwECHgMKAAAAAAAAAAAAMazFgFkTAABZEwAAJwAAAAAAAAAAAAAApIGHzwkAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKWPOvdKBwAASgcAAB0AAAAAAAAAAAAAAKSBJeMJAEBlbmRvL21hcnNoYWwtdjAuOC41L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAA0IJnuUDQAAlA0AACsAAAAAAAAAAAAAAKSBquoJAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAO3LPgOQ/AADkPwAAKgAAAAAAAAAAAAAApIGH+AkAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAMRTp/D8PwAA/D8AACsAAAAAAAAAAAAAAKSBszgKAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAs173a8U7AADFOwAALQAAAAAAAAAAAAAApIH4eAoAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAAhCkv2sKgAArCoAACoAAAAAAAAAAAAAAKSBCLUKAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAAT09Ub3AYAANwGAAAtAAAAAAAAAAAAAACkgfzfCgBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAvp5pSuwyAADsMgAAIwAAAAAAAAAAAAAApIEj5woAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAV0RkCn5AAAB+QAAAJQAAAAAAAAAAAAAApIFQGgsAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAhAAAAAAAAAAAAAACkgRFbCwBAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAJR6bvc8LAADPCwAAHgAAAAAAAAAAAAAApIGEXAsAQGVuZG8vbmF0LXY0LjEuMjcvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGXyjBp8CAAAfAgAACAAAAAAAAAAAAAAAKSBj2gLAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAN5GtqqTBwAAkwcAACgAAAAAAAAAAAAAAKSBSXELAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9jb3B5QXJyYXkuanNQSwECHgMKAAAAAAAAAAAAg/XbLM8HAADPBwAAKQAAAAAAAAAAAAAApIEieQsAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2NvcHlSZWNvcmQuanNQSwECHgMKAAAAAAAAAAAA06A4cZ0RAACdEQAAJAAAAAAAAAAAAAAApIE4gQsAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAAEo7ZoNVCAAAVQgAACsAAAAAAAAAAAAAAKSBF5MLAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAYk1nA04aAABOGgAAJwAAAAAAAAAAAAAApIG1mwsAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAAKRe+UdBAAAHQQAACkAAAAAAAAAAAAAAKSBSLYLAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAABlAKMb1GQAA9RkAADAAAAAAAAAAAAAAAKSBrLoLAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAubrENgxsAAIMbAAAqAAAAAAAAAAAAAACkge/UCwBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAFLGifcMhAADDIQAAKAAAAAAAAAAAAAAApIG68AsAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAAA14k6Kmg8AAJoPAAArAAAAAAAAAAAAAACkgcMSDABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAMcf1VBHEgAARxIAACUAAAAAAAAAAAAAAKSBpiIMAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAAJbxc+/0HAAD9BwAAJQAAAAAAAAAAAAAApIEwNQwAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAB6oH5oEg0AABINAAApAAAAAAAAAAAAAACkgXA9DABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAkAAAAAAAAAAAAAACkgclKDABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAsJxCfuIKAADiCgAAHgAAAAAAAAAAAAAApIE/TAwAQGVuZG8vcGF0dGVybnMtdjAuMi4yL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAMsXGeCkRgAApEYAACoAAAAAAAAAAAAAAKSBXVcMAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAAD35sJRdxoAAHcaAAAtAAAAAAAAAAAAAACkgUmeDABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY29tcGFyZUtleXMuanNQSwECHgMKAAAAAAAAAAAAVSDC/SoUAAAqFAAAKQAAAAAAAAAAAAAApIELuQwAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL2NvcHlCYWcuanNQSwECHgMKAAAAAAAAAAAACh3+v6MQAACjEAAAKQAAAAAAAAAAAAAApIF8zQwAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAACyiebXklAAB5JQAANQAAAAAAAAAAAAAApIFm3gwAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAIvZ1Up4oAACeKAAANQAAAAAAAAAAAAAApIEyBA0AQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAiQw7BTPDAAAzwwAANQAAAAAAAAAAAAAApIEjLQ0AQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAIgAAAAAAAAAAAAAApIGp8A0AQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACWHvfH6hoAAOoaAAAiAAAAAAAAAAAAAACkgR3yDQBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAApSvp9wCQAAcAkAACIAAAAAAAAAAAAAAKSBRw0OAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAiH2BrN8CAADfAgAAKwAAAAAAAAAAAAAApIH3Fg4AQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAAdp03rvhIAAL4SAAAqAAAAAAAAAAAAAACkgR8aDgBAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9tZW1vLXJhY2UuanNQSwECHgMKAAAAAAAAAAAA00Ow7mkHAABpBwAANQAAAAAAAAAAAAAApIElLQ4AQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAJgAAAAAAAAAAAAAApIHhNA4AQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAADK4l5PQYAAD0GAAAHQAAAAAAAAAAAAAApIFZNg4AQGVuZG8vc3RyZWFtLXYwLjMuMjUvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAkg0vx3YCAAB2AgAAGgAAAAAAAAAAAAAApIGITw4AQGVuZG8vemlwLXYwLjIuMzEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAmpC7DdcXAADXFwAAJgAAAAAAAAAAAAAApIE2Ug4AQGVuZG8vemlwLXYwLjIuMzEvc3JjL2J1ZmZlci1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAf7Ujt+kQAADpEAAAJgAAAAAAAAAAAAAApIFRag4AQGVuZG8vemlwLXYwLjIuMzEvc3JjL2J1ZmZlci13cml0ZXIuanNQSwECHgMKAAAAAAAAAAAAoKCVXcMBAADDAQAAJAAAAAAAAAAAAAAApIF+ew4AQGVuZG8vemlwLXYwLjIuMzEvc3JjL2NvbXByZXNzaW9uLmpzUEsBAh4DCgAAAAAAAAAAAB/iuys/BQAAPwUAAB4AAAAAAAAAAAAAAKSBg30OAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9jcmMzMi5qc1BLAQIeAwoAAAAAAAAAAAAXyFLuJDQAACQ0AAAmAAAAAAAAAAAAAACkgf6CDgBAZW5kby96aXAtdjAuMi4zMS9zcmMvZm9ybWF0LXJlYWRlci5qc1BLAQIeAwoAAAAAAAAAAADek343pRsAAKUbAAAmAAAAAAAAAAAAAACkgWa3DgBAZW5kby96aXAtdjAuMi4zMS9zcmMvZm9ybWF0LXdyaXRlci5qc1BLAQIeAwoAAAAAAAAAAADnCVhiLAcAACwHAAAfAAAAAAAAAAAAAACkgU/TDgBAZW5kby96aXAtdjAuMi4zMS9zcmMvcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAABA0RBq2BgAAtgYAACIAAAAAAAAAAAAAAKSBuNoOAEBlbmRvL3ppcC12MC4yLjMxL3NyYy9zaWduYXR1cmUuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAHgAAAAAAAAAAAAAApIGu4Q4AQGVuZG8vemlwLXYwLjIuMzEvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAIPZKxZYBwAAWAcAAB8AAAAAAAAAAAAAAKSBHuMOAEBlbmRvL3ppcC12MC4yLjMxL3NyYy93cml0ZXIuanNQSwECHgMKAAAAAAAAAAAAi7qHkq0BAACtAQAAHAAAAAAAAAAAAAAApIGz6g4AamVzc2llLmpzLXYwLjMuMi9zcmMvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAACdzxOJXQEAAF0BAAAfAAAAAAAAAAAAAACkgZrsDgBqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9FLmpzUEsBAh4DCgAAAAAAAAAAAPi0yb+pAwAAqQMAACwAAAAAAAAAAAAAAKSBNO4OAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzUEsBAh4DCgAAAAAAAAAAAJfXVO3QAQAA0AEAACIAAAAAAAAAAAAAAKSBJ/IOAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL21haW4uanNQSwECHgMKAAAAAAAAAAAAb5t7YuMIAADjCAAAJAAAAAAAAAAAAAAApIE39A4AamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAALQs9Zj+BAAA/gQAACkAAAAAAAAAAAAAAKSBXP0OAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAJYTQrJyAQAAcgEAACIAAAAAAAAAAAAAAKSBoQIPAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcxL21haW4uanNQSwUGAAAAAKsAqwA6OgAAUwQPAAAA", - "endoZipBase64Sha512": "102c585d2efe825e0ff17441dcdfc28c1cd83c866ad6497230446d19d0021de88f49f6786b225693ccca1ec913d86309e83094e5a0b0b0da42bc6684d3d7f808" -} \ No newline at end of file diff --git a/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/zoe-full-upgrade/prober-contract-bundle.json b/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/zoe-full-upgrade/prober-contract-bundle.json deleted file mode 100644 index c33e4b8dac72..000000000000 --- a/packages/deployment/upgrade-test/upgrade-test-scripts/agoric-upgrade-11/zoe-full-upgrade/prober-contract-bundle.json +++ /dev/null @@ -1 +0,0 @@ -{"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAACGNPcydwQBAHcEAQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0cy12MC4xNS4xIiwKICAgICJtb2R1bGUiOiAiLi90ZXN0L2Jvb3RzdHJhcFRlc3RzL3pjZlByb2JlLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC42LjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Fzc2VydC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYXNzZXJ0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWE2NDc1OTNlOWZjZGM3NTEwOTIxMGUyNjZiOGU3YTljMGU5OWQwMTM2ZjczYjk5MmExNWM0NmE5ZTg3ZDAxYzljZDZmMGEyZjhhZTVhODBjNGJiYjVlYjBjYWYzNWY0MmMwNDI4ZTljY2YyMjk4NTNkMzVjMGU5NGUyYjMyMzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTEyMWQxNWRjYjEwZjg1Zjc3YjQwZDQ4ZWU4N2Q1ZDVkNzZmOWQ0OTAyZTBlOGM3ZDg4YzMxN2MwYjJmZTNhMmIwZGVlZmZhNzg3NjI5NDExOGZkZjY1MWFlNGZhYzg3MzkxNzU2OTE3MjdkYzc0OTIzNGMxNDQ1Mjg1YTg0NWEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZXJ0cC12MC4xNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2VydHAiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hbW91bnRNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hbW91bnRNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDI1ZGE2MDA5NWJjYWIyYThmNmYzNWU0NGU4Y2EzZjJmMWRlM2JkZGJkNDJhYmEwZDgyZjU4ODAwNDYzOGRmYWE2YjI0MTc5NWY1OWYwY2Y2MTQ5ZGMyMmFmYzhiMmNlNTdmNTY2MDI4MDc2NjdiNDg3OWMyYzdhNGY1NWI2MmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGlzcGxheUluZm8uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Rpc3BsYXlJbmZvLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODdmZDM2YTY0MjkxZGJjM2IyYmQ5NDkzMzBkODM5Nzk2MzRjNjE1YzhiOTBkZWE0ZWQ2M2ZjNGVmYjc2ZjI2MjhiN2U3Mjc3OGFhM2U3NDcxNDU0MTg5YTgzMzViZTJmYjJmMjRkMTk4MWQ1NDA3YzFjNTI4ZWFiYzZhYmYwMmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzNhODE0Mzc4ZjQxZTFiOGU2YmM1NjdkM2JmZDRiNGE3OGU4N2U0N2JhN2Y1MTllOTU4MDIxZWE3ZjBhMTJhZTlhYzlmNzY2YjQ3MDUyOGQ0OTg4YTc2ODgxOGYwYmFiMWExNGFjMDE1MTkwZDU0MzFjOGU1NWMxZjMzYzVjY2YiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXNzdWVyS2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pc3N1ZXJLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZTg5MmJmMmE1MzhmMmQ1ZmI1ZDJmMGEyYTY2OWY5NGZhZjE2ZmVlNjdiNGRkMGFlMWMyMjNjOWZjNzZlOWJmMTZmZTc3Njk4NzZlZDYyOWJkMWVhYmQ0ZGQyMmJiZDdhN2M4ZjQ4NTVjNzcyMmEzZDU0ZjlmNzMxODc2ZGJmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU4YmU4ZGMzNjE0ZGJlMzU3YTM4YWVmM2U4NzVhMWNmNDczMTQ4ZTQ5YjM3MThmODBkODY3NWNmM2Y3YWY3ZDA3MjM5YTFhNzA4NGRlNmE3ZDY2NDEyM2M2MWI5NjI1ODk2ZDMzNzkxNDE0YWI0ZDA1MGI2ZDc2ZTBlODFiMzc3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTExMzYxYzg4M2NkYjgwMmM5ZTE5NGJjYWExNWI1NWVjYjk0N2Y0NWFkMjI0MDRmM2M5OWNjY2M0NmZkYzAwNmRiOGI2ZDE2ZjlmODkzZGJmZmEzYTIzOGRkMDhjMDkyYjk5Yjg4ZDAzMzVkZWI1ZDFhNDRlN2Q3ZDUyNGQ5NmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTkyZTYwNzEzZTg1NWQ2MDQ0MWY4YTQ4N2ExNTg5ZjdjZTk5NWI3OTJkOWI5NzQ3MWUwYzE5ZjRlNjJmYTY1MjIyOTk0ZDBjMTkyYTk4Zjk4MmQ0NDBkMDY5MzMzODJmYzRjNDdhNjE0ZGQ1M2M3MjU0YTRhNjE3ZDg2OWJmMzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjY0OGJkNDZkZjk5Y2Q4MGEwZjAxMjFmZGQ0OGJiODdlZDk2MjY5MzYwOGZiMWEzYTRhNmMwOTRiNTcyOWEwZDk2ZjQwZjBmMjFiZDc0NjE2ZTkyYTQxZmM3Y2M1ZTExNWUyNzFkYjFkZjc3YTY0YjRjYTI1MWIyNDliNWQxZGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZmZDdmOTliOGJlY2E2OTMyZjdjMzdiNmE1NDI4ZjE1N2QxNGIzNjczZjViMTg5NTNjZGIzODU3OWE4Y2Q0NjExOTk3NTk3ZGIyMzNhM2MwZGE0YjAyYWUyYWEwMmI0N2JlOTMzN2QzZjNiYzkyMjg0YWE2ZGVlOGY2MTY5NWI3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnRMZWRnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnRMZWRnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiOTJjNGI1MzY2OTA5YWUxYTJlZjI5ODFiNmZiMDM5Mjc3MjBkYmJkMWEzMmUxMDM3YTBiY2ZlYTQ5YjMwOTI4NTExMWYxMGRiMTIwMWIwOGZkM2FiNzVmOTAzNGQ4OTljOGZhY2FkYzA3ZjBmNWE0NzY2ZGJlMTM4MTQwZmJhMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wdXJzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHVyc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZDdkZGE2YTg0MTgwYzY4ZTZkMDk3MmE2OGRjOGRlYmI1MTViOTJjZTgwYzIxODgxNmU1MzFmMjRkYTY0OGY1NTVmNmY2YzJkYmI4MjAwZTk0MzU5YWQ2MWMwNDYwMjY5YTRkNGMwNjVhOTA1ZGE5NGUwNTdkM2FmNTYyNWUyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFuc2llbnROb3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMTFiMmE2ZjI5YWQ0OTZiYmFkMGM1OTg4MmRkYzQ5MGYzZWJlYzk2MDZiNTFlMGI3MGJlNTU4NTExMmQzMmU0OWVkYWI4ZWM3YWE1N2ZmMmJkN2U0NjNmNTg3ZmU2NGMwNmFjOGQ1Yzg2MTAyMWRiNzVkYzAzOGMzZTQ0ZTU1OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZThlNmIyMDVjOTkwZDI3MDNlNmExODRjMWEzZGYwMWU4ZjRlZWE5OTI3YmViMTIwMjFhYjZkMGUxODM1MDg3NTU5NmY1ODI4YjQwZTM3NGI1MWY1Y2Y3ZWU2MjU5MWRiZDI1YzFiNDY5YjdkNThjOTExNTg4OGEzZWE1Y2Q0MDIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtYW1iaWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkwMjFmNTRiOWFmYzAyNWNhMGU5MGQyZGMyZTBiZWQyZmIwOGIwNjNjNmQ2OGE0NGIxZWMyZWI3ODM5MDc2OTZjMmU0YjNjZDgwNTYwNTFkYzEzMThkNmI0NWFjNTczMTJhZjdmM2Y5ZDg0NDJiMmJlZjQwMjc2YWNmNjI0NGMxIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlcm5hbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9kdXJhYmxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9oZWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2hlYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL3ZpcnR1YWwuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdmlydHVhbC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdHJlYW0iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RyZWFtLXYwLjMuMjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3N0cmVhbS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc3RyZWFtLXYwLjMuMjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJhbnlsb2dnZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiYW55bG9nZ2VyLXYwLjIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2FueWxvZ2dlci5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2FsbGJhY2suanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NhbGxiYWNrLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTBmYzA5MjA3N2ViOWQxNGNhZjVmZDQ1MzFiODA0NDcyN2JkYWE2NTU0YzRkMmZjYThmNzZmOWIyZGJhMmRkNGJhMzkwOWM1MTczOWY0MGZiOTAyOTg5ZmRjYTBiNWRlNjUyZDk2YmQyZjhiNzdjZTUwNThhOGQwMjViOGVjOGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uZmlnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25maWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YTMxOGUxMzc5YmU3YTg4NzJkZDhkYTllN2ZhYTBkNzkyMDViNWM4OTljNTQxMGZiOTBhNGJjODk1Yjc1ODU1Y2M3MmE3YTlmZGUzNWRhMGEwNzVkMDZjYTc3YTVmMDBkYzhiNmJiNDAwOWNlM2YxOTQzZDliZGNjY2JiY2Q1MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVidWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMDAxZWFjYTRiM2IyNDQ3OTZhZjcxYWQ0OTkxZWIwOWY5MDBkYThhZDQ2ODA0YzIyYjA4MWE4NjE5NGU0NjFiMTUxMjQ1NWVmMjNhNWZhYjEyZTM3ZmQ2MzlmNTA3ZjE5MjU2YjhjZTEwNTNmZGNkODcwOWUyMmFmZjYzYWFmMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YTEyZTNiODc5ZmIzOTQ1NDM4ZDgyNzEzYTk1YmQ3NzEyOTc0OGQ3MGY5NjFkMTVlZWRjYjJhNGM0NThmY2ZiYmI5YzcwOWU1MDFjZTc3ZWIzMzUyYjZjODdiM2JjYzcxYjA2NWFlYmVlNzAyMWI4NjQ2NDE0NGY2ODExNGJlYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTAxYmZlZTBlYThjYzdmYmMxNzk0M2ZiNzgzMWRlMmFjY2Y2NGY4ODk0ZTI2ZDlhNGQ1OWNkOGRjMmNiYjkxNThmMmE3M2E1NTUyYjY0NWQxYmFmYzJiZWY1MzUyZjFjNTJhNGMzMWZiZTMxYWIyZDc3MDQ5ZDM2ZWZjNjE0YmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWV0aG9kLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXRob2QtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1YjBlZmYzOWM5MzcwMDFlOTA5YTdiNmFhNWZhNjlmNzFjNmNmZjhkMjg0ZTY0MjA0MzY3MzVmNDk5NTUzZmU3ZjE2M2QxZTdkZTYzNjEzOGI2ZTYwNzJjZjM1ZjVmMDcwZWZkZDZiMWRlYzI0YzEyMThlNTkxYzg0YWZjMWViNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90ZXN0aW5nLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2JmZjdkZTUxZWQyZjg3NDQ3YTgyYjJmYTZlODYwMzRiNjBhNzYxOWIzNDgwOGY4ODBiMjliZDI1Y2E4YjU2NjY3N2I3ODQxMTVjNGFkM2EzMjUyYTNlMDU4ZmYzOWQ4ODVkMWRhM2E4NDAwOWRkMGIxMDljMThhNmZjM2JkYjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQwNDdiMGQ5NWY1OWVlM2I2ZjEwNDE3OGNmNzNmY2I2Y2M3YjUyYmM1MzEyMWExODgzMTU1ZDE0ZmNjMzY3YzUwNWE5NmI4MjgzYzdmYmExNzAyZGMzZjJjZjNiM2U3OGM2NTI1MDJkNzlhZTNmNDY1Njg2YzJjOTI4YmVlZDYzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91cGdyYWRlLWFwaS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIwMWViMzNkNzI0ZTE3ZjBhMGJiNGY3N2FmMTczMzJhZTVlNmI5YzhhZWY4ODcyZTJhM2RmMWFiZWVkMjA1ODQ4MjIxOTJlMTZkOWM0N2JkMDhmN2ZkYzJkMTU1MDc2ZGMzNWFjMDQ4MzA2MDkxNGZlNmEwODAyYWFjNGVkNGMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiMTE0YmJlM2E0OWIzOWQ4ZjVkNDZmYjYwNTVlMzljMWFkMDEyOThiNzRkYjg0YzM5ZmQxOTAwZWNjNDk1ZTk1NjhiMGE0OTA4Njg0NjA1YWIwZmQ5ZjgyYjk0N2U3ZjMxNDFhODY5OTViNDZlNmUyOWZiMzUwODgwMjQ0MWJiIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9ub3RpZmllciIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy90ZXN0aW5nLXV0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdXBncmFkZS1hcGkuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zdWJzY3JpYmUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODA5Y2JlZWNiMmJkYTE3ZDVmNWRlNWQ3ODQ2YjAyZTVhMjNkN2Y1NGI5MDNkNDhhMTA0ZWIyNjNmY2YzNTI5OWFjZWE0YTNlYjFkNTdjNzUwYmQzZjRmZmFmOTJiYTkyMDcwYzVmYmE1MjZmYmQ0MTE1YjBhOTlkNWQwZGVhNDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTVjY2E0Y2M2NDVjZWUxNGUxMmE0NWY2ODhhMjc1MGYyM2MyYjgxMTQwOWJlN2YzNjlmZjA3ZjE3YjlkYTAyMzY0YThlNzNlMGMxOGFkMzQzMWM3ZTBjMWFlMDlmOTlkYzg0N2RiMzI1YWZiYTA2MmI2NWVhNmVkYTAyMmFlMjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmY1NjZjNmYyMDA3ZjNmNzkxMzI2MTYxY2JkMjA0MTk2YjQ1OTFlZWYwOTUyOTY0MmFmODRkZjBhM2RiZDdmNzNjMGZkNGViMTY2ZmE0YjdkOTY0NGY3ZWYxZDY3OGY3OWNlOTI3ZWY0NTZjYTcwMTE1N2YyYTE1MjI2NzNjMzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVibGlzaC1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1Ymxpc2gta2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDAzZTQ3NTNmNTRlMGNiMTJlNzlkM2FmZGMzNWY5MGU1ODRiZGMxOWRiOTQ2ZTVlMjg3ODRkYTA4ZGNhYTY2YWVkZTMwOTMwODM5ZmY2OTBkNGIwMzYxZTY4ZDYzNjg3NzkyMTNhOTM2OGYwOWNhZTMyMGI0MWUyMWIwODkwYjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZWQtbm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNTFjNWVhYmNlMTdiMzdhNzQ4YTFhNTAyMDg2YWVhMGQ1YTQwZjQzYWQ4MTFjMzdiNzMwZDAwNGMwNmMwN2EzMWFjN2Q1ODdjOTk2Yjc3OTViNjYyN2UxMzk0NTZiM2UwZDZhYzJiNTAzNzU0NDA5Mzg2YjM2YzE2OWI1MzRjOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXN1Yi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzdWIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkZjQ2ZjgxYTY0NzBiN2UxYWE5ZjIyY2ZlYjI3NGMzZDZkODdmY2Y0OTMzMThlNjBkZDE0NDRiY2JjNWZmZjNiOGYyOGI4YjY0ZTg4NmUzZWNmYTA0NDczNGJhODQ1ZTA0MjU5MmIyZGU4ZDAxOTk2YWQwZThhMGJhYzk5YzA4ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImViYzEyYmRlNjJhNDBlZTllNDc5OGUwODgzNzUyZjlhYjViZDFiODZkYzdlYjI5MWNlMjQ0ZTFjNmI3ODBjODIzMDljNzUyMTY3M2E4ZDI4ZDNmNjU3ZWU3ODJhYWYyZjA2MzkxOTlkNjIxZGM3ZTVkYWE0YmZiOWRjMjFkMTkxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNjE4ZmM2ZjVlNzFlNWUxYjdmMDY0NTE5ZThjNWU3OTY1MGM2ZGRmNTYyOTI3YTI2YTJlZjc0NWY1NGE1NjFlNzMzN2E1MzY5MDZjNDAxZmYyNmEyMjZkYmUwMDQ2YWIzZDZhN2Y2MmQ2OTM1ODg1NjU0N2IxYzc1ZmMzYTQyZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90b3BpYy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG9waWMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5N2EwZTA0YTRhZWYzMjI1NmQyMThiODRiMjUyZGY4MjFkMDI1YjkwYmExZTM3NDU1N2U2MzU5YmVjMGUzMjE1MDM4MDM4YWY5ZmRmMDYxMDExMGI3NTg4OWU4MTRmN2ZjMGU1YzA4MmQ1NzhmNDI0MzMxZTI0NjFmZTZmNzc0NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmUxN2I5ZGI2NzNjNGExM2YzZTdlZjlhMGNiY2VmMTc5MjdmMTZlMTkzYzQzODA5YzhjNmJiYWY0YjU1ZTZkOTAxNjBkMzIyZmM3NTllOTY1MDQ0NWU5Mzc3MjNiMTRlYWRhMjlkYjYxNzNkMmJkZDVhZmI5YTM1YzM5ZjQ2M2UiCiAgICAgICAgfSwKICAgICAgICAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidG9vbHMvdGVzdFN1cHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODNmZGMwZTUwZDczZTA5ZWRhYjY0Y2Q5OGY2NmM0MzZlNDE0ZmY0YWI1MGZlY2UyYjI2ZDNhY2IwODNjNzNhZTVkNTM5MGM0ODBjN2FjNWI3YmUzMzIzZmQzZTJhYWY3YTFhY2UyMTA0N2I0NGY5ZDhjZGZlZDk1NjdmMzdlMjMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3RvcmUtdjAuOS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N0b3JlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjYuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYWE0NjBiYmE3NjQ0NDNkNWNhZmIzM2Y1MjI3OTNiYmUyOWU4ZDI0ZjJjNWU3N2M3YjZhMWVjMDQxNTBhZjgwMGM3YmYxYzA1ZmU1MDQ1MGRmZDI5OGNjZDkyYTc5ODYwMWIxYjQ4YTJmYzQ0YTlmOWJkYmI2OGUwOTBjZWEyNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxM2MyNzBlNDE5MGFiMDFkZTE4ZDk2NDhmYzNkYTc5M2E0Yzg4Y2FkNjVjMmJmMmQ3NTdhMmMxMzgyYzJmZDYwZjkwNzUwMTEwMjRiNDc2NGI4ZjhhMTM5YjgxYjRiYzFjNmU5NzdlMThmZWMzNTMzMTFiNDc2YjNhZDQ2ODA2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2E2NGZhYjlhZGFhNTUxODE4OGI4M2I2ZTRiZTIxMGJjZDk1NzBiODgxZTdhYWJkNjc5Y2I5N2RhZjc3YWM4ZjkzNzBhNDE0MDE4ODBkOGU5MjMwODNkZGRhMzBiNzViZmM0NDNmNmQxMTA5NDZhNWI3MTkyZDQxMDY3NTc0NDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWNjOWJiNmZhZjJjMjhjMTI2NDc5ZDQ3MWQ1MDdlODZlMGEyMGY3ODliMGNmOTM1YzJmMzQ0YmRkN2UxODAwN2Y5YmNjNjM1YjdlMTIzMjQ1Y2NhYTRlNWRjZDM5YWQyZjIwMjBmYzY0NDliM2JhM2U5ZGQwZGQxY2FlOWZiZjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMThkMDJiNGVjZmRhOTMxMTdjZTlhZTNmNTdjYWE3N2ViMmJhZmUzYTczZmQwZjY4MTJmNmVhZDJmMjU4ZGU3ZGY1MDMwODE5ZTc5ODE3OWUwYzVjZmJkMDFjYjEwNDkxNzIxZjk1MWE3ZTJhZWYwM2I2ZmIyYTg4MzM4Zjk3ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYzOTlhYWY2NjU1OThkNGFmZGM3Y2FhOWU1NjRiZWE4M2FjMzgxZjM5MDU3MDc4YjNkYTZhMTJmZmVhZTFkNTUxY2Y3YzJjZmExMWMzNjliNzFjNzY4Y2E5N2ZlMDY5ODQ2Y2UxOGI5YjcxODc2ZDdmMDVjMGJhNzUwMTdlYWNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNjIwNmVmNjZhYjUzODBiNzljMjdmOTkxZWNlZDk1YzUyZjNjYWQ5NmY4ODIxZjliMDRlZDI0ZjhjYmQ3N2ZkMDc3MjVjMzA4ZTllMjcxYmExZjRkMWI1NzQxMDhiN2UxNjY4YzAyNDAzM2FkZGFlZjVjNTA3NTMwMjg0ZTI1ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjBhMzczMjRmZGFjMDA1YTQ2YzNkMjhkMzM0MDVmNWM2ZjgzZGY3ZTA1NTZmMGRiM2M4M2RiOWYyMTNiOWRmMjIyYTljNmFiZjVkYTk3ZWMyZTM4MzQ0ZDNmN2ZlODAzOTRiMThkMGVhYjk0MTI4YTk0ZGNiMzc5Y2Y0N2Q4NWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZmUxNmE2ZDgxMjhiNTBhMjhiMzljZGY5NmE4N2QxYjIxMmE2YmJmMDZmNzUyMDJmNjhkNWU1YThjMDkyYjBhMmZmNWZjNGNmODYyMzlkMTQ0ZGUxNDQ0NWRmZTllOGQ1NjA2OGQ5Y2Q2ZGU1MGM1ZDc3YjMxZTQ5OTU3ZDNjNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhMDgxZDg0NDY5ODQyYTU2NzI5YTU1ZWViNTQxMmM3ZjJmZmM1Y2I2MmUzN2YwZDMzNWM1MTM2ZWE4ZDc5Yjg3OTgyNjAwMGRhNGViYzBiY2Y3YjdiNTM3YTc3NDgyYTFlNTA0OWYwNTU3ZTQ2NDEwOGNmZDc1MzFhYTZhNDQ0MyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy90aW1lLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy90aW1lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC42LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1ZGZkNGVhYjcyYTZjOGE4N2ViNzg2M2U3ZDE2ZmRhMTA3OGQwODhlNDhlZDU1MmJiZTdjYWJjNWNlZDk4Yzk2NWI4MjBkZjQ3ODcyODU5NzQ1YWY3MzQ4NGQxZDhiMjE1MzVjNmZmMWZjNGI1ZTc1NGU2NjEwZDNkMWYzNzQ2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RpbWVNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90aW1lTWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZiMjFjOGY5OTNhODk3ZjQ3OWU4ODJlMzU0MDgwNGI5OGU5MTJkMzY5YTg2N2NjOTA0NzM2NzgwOTI3MWRjMTc5MTJjMWE4ZDc2NjRiMWE5ODM2MzcwYzY3ZTdiZmE0YTU5ZWY0YWYwMTk2N2Y1MzA0M2U5NDVkYTU5ZDlhMWQwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNzIyNDE3M2I2ZDUxZmQyOWU5OGQzZWVmY2NiOTQwNTI0NzEzNTg3YWI4ODQyNTI5OGE5MmEwYzRiMWFmNzA1ZWJhNGZhMTkyOWEzYzdmMGIxNGQ4ZjZjM2ExMzg3ZTg3ZjI2MmVmMjk5MzY4OTk5NjFkMzU4NjQ1ZjFkOGZhOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0LWRhdGEiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTQzYzI5YTM4NTE4YjYwNDYxNWUxMmVmNGFkNjUwM2U4YmU0NDU0MjRhYWRmZTM5MjEwYjJhZmFhNzZhYThhYjZjY2ZmMjdlNzc5NjVhZWRiMDU5ZDgyNTgwNGE1MDc3NTI3NjhiZWE5YmVhMDk1ZTczYTk5MjliMDA0ZTQ0NDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDA3YzUzY2VhMmRlNzE1ZTE5NmM2YmZjNzMzM2VhZmU4ZGFlN2Y4YjcyZjY3NTM1MjMzOTFlYzhkNTc2NzYzMjU5NjEwNjk2NTFjMzczYzM2NGUyNjNjZmYyYjE1MDI0MGYwM2ZkMjBkNmQwMzhkNjc1ZThmYWRmOWJkYWZlYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzZlMWM4ZWE4Y2FhZGZlOTA0NDNkZDVmM2UwYzczZTJmZGNjODkxNDQ4MGQ5MTJhM2ZlMWVjOWJkZjYwYWJjNjRjNjM0ZmFhZjhmMzNlMGRhNzk3NzZlZTEzZTkzM2RkOWZhOTRmMzc1Y2RkZTBhZDc5OWE1ZjgwYmNmMjNkOGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdmF0cy12MC4xNS4xIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdHMiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXRzLXYwLjE1LjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXRzLXYwLjE1LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZ292ZXJuYW5jZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zaGFyaW5nLXNlcnZpY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zaGFyaW5nLXNlcnZpY2UtdjAuMi4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3NoYXJpbmcuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMyLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdHMtdjAuMTUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvdmlydHVhbC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi92aXJ0dWFsLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlYnVnLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvbGVnYWN5LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGVnYWN5LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcHJlLWJ1bmRsZS1zb3VyY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUtYnVuZGxlLXNvdXJjZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS1yZW1vdGluZy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS1yZW1vdGluZy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3Vuc2FmZS1mYXN0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdW5zYWZlLWZhc3QuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgImltcG9ydC1tZXRhLXJlc29sdmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiaW1wb3J0LW1ldGEtcmVzb2x2ZS12Mi4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFpbi5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3Rlc3QvYm9vdHN0cmFwVGVzdHMvemNmUHJvYmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidGVzdC9ib290c3RyYXBUZXN0cy96Y2ZQcm9iZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM2ZWQ3MzQzNGU0NmRlODUzZjUzYmJjM2Y4ZDI3MDdhMWM2MmJhZWZiNGZhNmM2OWI0YTUxN2UyYWUyZjVmMmE2NWI2YmZjM2I0ZDU5OGI1Zjc3MTdlYTFjZGI3ZWYzNTE4OTAzZTcwMzhkMjYwMzg2OThjYjEzZTlkMjE2ZjMzIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC42LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy90aW1lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvem9lU2VydmljZS96b2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvY2FjaGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2NhY2hlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2FwdHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2FwdHAtdjMuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAieWFyZ3MtcGFyc2VyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInlhcmdzLXBhcnNlci12MjEuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9idWlsZC9saWIvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAieWFyZ3MtcGFyc2VyL2Jyb3dzZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAieWFyZ3MtcGFyc2VyLXYyMS4xLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Jyb3dzZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUyYTJmZWU0NjY3Njc1NzUzYWI4NmZiODZlZWU3NzdhY2EyNzRlMDA3MzFkZWJmMjdmNjdmNjM3ODA1ZWY2NTYxNjllMDYyZDliZjE5ODBlZDEyZGM3YzgyNWI5Y2E4NmM2MmU4Y2M5MmViNDJkNzVhYzE5MDkzZjhlMmE1M2U0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWU5NGMyYzFiZTVmNDI3ZWUwMDFjNmZlYTE2Y2ZmMDVkNmFhMjE0MDg5OTE1ODQ5OTY2OTVlZjZiODA0ODI0N2FkZGYyZDVlZjk0NDI0N2I5ZTA1YmIzYTk2YWI5MjY5Mjc1MmM4YWNhYTI1Y2Y5ZmMzOWM0MDU0YTg5MGNmZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9ib25kaW5nQ3VydmVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWZlYTVkN2YyMzk2MWNkZjNlNWIxOWIxYzk0OTY0NzQ1N2IxOGM3MmIyNzM4NGI0YzMzYjU0MjNjMDE5NWNhOGQ5ZDNiMDE0ZTBkOGI5MjI2MzgyOTgzOGVlN2NiZWMzNTgwZTg4YjMxNWZmNzQ0N2EwYWZkYTJjMjMyNmY1NTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWI4ODlhM2JlZTBmNjM1YjMzM2ViMDU5MmQwOGYwOGI5NjdhYzFiZjgwMzBiN2QwYzFiMzY5MzhhNDA4ZDU1MzNhYWFhMTcxZjk1Y2E5ZGQwYTY3MjI2Nzg0NzQ2MjViNTkwYmMyMWJkMmI0NmFhOTYzZjQ1NTM4ZjkyNGZlNjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MzAzZmFmYjgwMjAzNzI4MmY1YjdlZDVjMjk2YzUzZWI2YTg1MzA5YTE5MTQyYjZhMDVhYjZkNWQyZDJlMDIxMWE0MDE1M2E3ODM4N2E5MDQ5ODY0OWIxYjZhZTBlYjQzODBkZmMzYjAwZjUzNTMwNzA0NDQzMTE3ZTcxMTg2OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMzYTQ0MjQ1MTViN2FlYzViNWY2YWIzZWRlMTUwMWU1OWM5YzFmMGY1N2RlMjMzMWQ3NjNhZmJlY2UwYmY0MjllZTkzNWExODM2NjRlMGQzN2M4ZDc3MWIxYTFiYTZiYTYxOTg3Y2ZlN2Q0NzE1Y2E2Zjk2MzdjNTYwM2IyNGJkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMxOGI2Mjc5MTJmNjdlMWViY2M3Y2Y5MDY2NzA0MjEwOTY0NGFjM2JmMDhlM2JjZDE2NDAwM2E0Y2Q3ZjJiOGRkYzE1ZTRmY2U2NTcyYmNiMGU5YWEyZDk4NDk0MjUxMmNkNDQ4YWJjZGM5NDZiNGEzYWU0M2U1ZDBjYTM2NTVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzUxMjBmNDU4NGQwOWJlYTg2MmQwYTI1NGY2OTE3ZGJmMWYwOTljOWRiYjBkOWQ0N2ExY2U5NDIyNDAwYmNjZDBjNmY0YjkyNTQ2M2E1MGU0YWYwYWNmMjU0OTMwMWNlNmFiNzAxN2RjMzAxNjlmNmMzN2ViZWFjNzhiYmIyM2MiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTQxNGVkMmE1OGMwOTQ2ODE4MzhjNTUzYmJmYzQ1Mjg3ODdlMDUxNWZhMDNiY2VjZjNmNzJkNzMzZDc2YzY4YjE0MjU5ZjE4ZTZmNzQ2NzM0ZTcxNjAyYjNhYzhlOWZiZTZjMDY3NDBiMjhmYzBiODNmNmFlZWY0MjBlNTc5NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvc2FmZU1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9zYWZlTWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNhMjYyNTY4ZWViNTdiNGY2NTA5NWRiYTYzNDMxMmQyZWQ5YmYzMzM2NWI3MGZhZDQ0YmY1ODYzZGQwNWFmYjY1ZmFkYWNlY2M4MTEwNjU2MTNiNmFmNTllN2RlNTEyOTZiMzQ3ZDJlY2I0OWJiYTA3MGEyNzQyMGE0NTllOWYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Mjk4YmIyY2MyZjAwNDkzNzIxMzViYjc4MTNlYWIxNGEyN2I3M2QyYzYxZDM4Y2I0MmFiMjU2ZDlmZmVhNDZhZGQyYjc4MzFhMjFlYjQxOGE3ZjlkNDM3OTYwZDFjZDE2NjhjYmM5MTMzZTVhYTQ5YTZlMmQxMDRkZGExNjZiNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZTY4NDUxNGZlMzllNjMwZDc4ZWY0OTkwZWIwMmJlZGEyODJmNmE1Yjc2ZThiNDQyODBmZWIxNzE3MGFlNGRjZDQ4YzFlMGVmZGZkMDJhNTRlYzI1MWRkMjViOTg1MDhkNWVmMTVkYWM0MDA5OGYzMDYyOWMwZDMyNzRlYjVhZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2E2NjdmMjg3ZjIzNmVlZWQyZDRmOTUxM2I4YTI4ZWU5M2UxMTBiNTRhNmJmYjk0YWM0MzE0NjhkYTg2NjAxZTgxMmQ4NjQ5Nzg2ODFhNDNjNzdlN2VjNzFlNDBjYTRiNWYzNWIxOWIzNjI5NjliZmI3NzJkZTRjODE2NGMwZmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNzFiYjRkNGI3ZGQ2ZWY1NzhlNjNmYjgyMDlkZjczZjJkNjcyNDdiNzM2NDhhMDcwZTUxNTNmMzIxNmZiZmQxNWFkMTRkMmU2NDhmMjA2Yzg4MTkyODdiN2Q1Y2ZlNTM1NzIyZjJkMTBkZTE2NmJkOTI1ZjRkYjJmMWJiOTlmNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MWVkYzM5ZDRiNmFkMGMxMmZlYzFhMGNmNmI2NTNmM2EzNjU4MzJiNGU4YjIyM2NiNWI5ODVjNGMwZWM5NWYyZTQyOTY4YjQwY2E2ODlmNDk3OThlNTZmYmZkNDUyMmNjZmFkNzg5YmMxOWMwYjRjNTdlNmQ3YTgyNGJlMTdkMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDljYmY2NGYxZjA5ZWVlODIyNTY2MGI3ODMzNzY3ZTg3NTk2ZGRiMjExZGQxN2I5ZmU5MmQ3YWEwZjcwYTMyZmU0NGNiODljNzJhM2ZjNTkwYTMxYWFiNGI3MjZlNmI0YmE2NTZjMWI3ZDIzNWY0MmZjZTkwOTAwNzI4MGFhNTciCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9uZS12MC4yLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9uZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvbmUvdmlydHVhbC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi92aXJ0dWFsLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YmUwMDFiZDZjZDI2MzVlNmFmZmU1N2M0Yjk3MzA1ODUyOGUzM2Q1ZjljMGNmYjI1YWI0Mzg0MzQ2ODYwNDQ3OTM3N2YzNmYyZGE2ZDE2NDc5Y2IxN2QzZjFjMjc4OTBjZGVjMTUzNGY1YWVhOTcyNzJlOWMyY2E5NzFhZDIwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NmZjYTA2ZWFmOWE0MjY0OTQ4YWM0MjNiYTBmYWY5OGFjYmY1NDU0MDIyNzM3OTYzNDhkZDQ3ZTNjMDJkYzQwNTc2NWViYTA3NTE5Mjc1Zjg5NDY1OTExM2JmYTE4ZTAzOWIwMTQzZTdmNDViZTM5MjI0MTIxODJlOGYzOTg1YiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNTM2ODQ4MjZjYjU2NjA5ZjYyYjdkNmI0ZGUzM2RhZDIyYzIwYWRhYTJlYjM4ODAwYzM2NGNlYzUwOTczODNlOTczZjA1OGIzMzVkNGU0YzQ4MDMwZTQyOGY3Yjk4ZGRhMmJmMjI4OGRiYTMwMDhhY2I1N2I0YWU3MjIwNjRjYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmUyODIwMmNlYjIzZTA2NGQ1ZGNjYmUwMjFhZTdkMWE1ZmRjY2MwMjM0MjcwZGM1NjI0ZmQ5MWRmMjM2ZjkwN2RjYzVkMjU0MzI2ZDFjZDMyYWM1MTE3NjAyZDJmYTIzOWU2ZjMyMDMzMjgyZmQ2N2UyNGYxYTdhNGRlOTU2MzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDc5ZDNhMjllYjdiZjNiYThhMzlmMmY4YWVmODUwYThhOWNmZTEwZjk1NzIzZDI3MWQ0NGUyMTIyYTJlOGQyZGU0OTQyNmMxYzRkNDhjYTU5YzhiYTZmZjBkZjkyOTk1NTI4ZDM0OWVlZmUxZDBkNTAzYmRmYTgxZjg0ZmVlNmUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V4by12MC4yLjIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V4byIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4by90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MC4yLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2IxOWMwZDc0Y2M1MDg4MjdiMGM5OGMzNDViZDU3NzU1MGU1ZWEyMTBhOTUxNTM3MDgyZDM5MDZkYmRiN2IwZjI4M2FjNzZiNzUxNDhmMjRkYzhmMjcyM2IyYjU0ODc2ODg4MGJlYmNiY2NiZjgyMGQwNjVhYzAxNWUzMTJmYzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLW1ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLW1ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFiNmRmMTdjZWM3MDYyMzdiODZlZmJlMGYzYTNiOWVjOGZlNTE2YzVlMDUxNjA3YjgxOWFlY2IyZTYwZDMyNzUzMDMzNWNlOTFmYWI3NzhmZjFmNTE0NWYwZGM3ODNjOGU2Mjc3YmU2NmVlODdiNmU2YjUwMDRhZTVmOGZjZmI1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODY2YmRjM2ViMzVlMGJkMTk4NzIzZDRhNTY5MDI0NjgyNmY0ZjBkNjhjMGQ3YzU0OGY0OTM4YWQzYzk1YjRjYmY4YjkxODMyNmE4NGJiMDBiNGIwNDgzZDc4NTQ2ZjY3NjBmYjM0YjZlNDc1ZWQyZWVjODA5Njg1MzJiNmRmM2IiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Zhci12MC4yLjE4IjogewogICAgICAibmFtZSI6ICJAZW5kby9mYXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS90b29scy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjg3NDk3ZTNiZjY4YzUyNzlmMzZkNDBlMjhlNGE3NDM5NzE1ODQwMzFmNjQwZWU0OTcyZDkyNTVhMjllOTFiYWQxOGZkNDY5OWM0YmRjYjNiMzY4MmMxOTY1ZDc2YzI5OWQ0N2ZiNTgyZDI2MjhiZmZjNGZjYjdjMGYzZDZmMWMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjAuOC41IjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC41IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmVjMmY3NmJmZWUzN2Y0NGE4ZDNhZjI3YjI3ODY2YTdkMzNmNzg2OWVhODcyODVlNGZjZmYxYzNkMDc2NGMxYmMzYTVkYzE3NTMxYzcxZDMzZTFlYzY0Yjc1OTYwY2JhZjdmZWVlMDRiN2Q1Y2YzMDViYjgwNGQzMDVhNzgwYTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MzVhNjk2MmQ3MmQ5ZDI0MDUxYjk3NDk5MzIzMjcxOWVmNmQ5NjQ4YmFlZjM4MzIyYTYzNTg3MDExOGQ2ODJhM2M5NjYyYjEwMjA1NzVlMzhhYmFkMDZjZDU0M2NjMjFmZjEyZGVlNTFmYWEyNDdhNjM0OTZhN2Q3NzI4YzI3MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YTAyZWMxYjFiMTNlYzhlMWU3YmQ3NWZmMDdhMDNkZWVlNTE4OGZjZDYyMDFlNGI1YTBjYzRmYTRiNjE1NTNlZDBlMmI4MjRiOTEzMmM1ZWQ5ZmQ3MDkwMGJhYjE2ZmQzYzE0YTQ3MWIwMDNjMjVjZTI2MWFmNDIwMzMxYWU0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlhOGRkMmEyZmY4YWIwNWQ4MTI1ODk3ZjE3MmFhMGE5ZmE0Mjk2ZGFmODI5ZjQ2ODI2N2I1OTNkNDVhODZjMGU0Nzg4MjRkZDBhYmY1NWRmMThkODBmMTc5MDMyNjQ4NmE1M2M1MDBjZmQ3NTk3ZmQ3YmIzZmZjNTgwZjU0N2Y5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiMjMzYTVjNTYyMjIxMjRhYWI1ZGU0OWUyMWY3NmQ2N2I2ZTNjZjFkZTBmMjQ1ZjIxYjg2YmZiNDM2YzAyMGY1MGMwY2M1OTBhOTZhMGRiYWE5M2U2ZDM5NDM5NTU4MWZlNzY5MTQ5MDAzNDc1NDc1ODgyZTIyM2E2NzAzNDVjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJiODJkNTk1ZDJhZmQ1ZDljMDJjNWNiZTAyZTdmN2M5NjA4N2M2MGNkMDkwOTFiOTk3ODJiZDhhN2MxMjZiMjM5MjYyZTk4ZDBmNDYwYTQ4OTgxYjVjZjM1MTFiN2I3OGNkMGYwMDFiMmZhMGU1ZTkzODE0MzVkYTE2ZGIxNjdjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZkNjMyZDY0Zjc2MzlkYjI3OTAwNzZmN2Y1OTMxYjQ1Y2NlMmQ4NDM4N2NkYTJjNzhjOTFhNDIyOWY4MTYzNDQxNzZiYjQ3MDA4ZTE5NzcwNGY2YjdkYWFmZDI3NDNkZWI0NWFkMDZjNWJjNmI4OGMwMzhkZjBlNmRmYmEyN2YzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMjYxNDcwNzE0ZDY1ZDMzY2U2YzhkZmQ5ZGI0Y2NiZmNhNGJjODhiMzE5OTliZjAxOTdiOTViZDAyNzNmY2FlYzM5YzRlODY2NjlmOTc3MGJhNzEyYjBiNWI2Y2QyMzIzZDViYzRiYTJmNTBjN2JlMWQ1NzM3ZmU5YTQ3ZjYwMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVmMDg2YTYwY2QwZjM5ZDcyNjBiODdmOWJhMjAwMDcyYjE5ZmFjYzc0YmNjMGE2Mjc2Y2QwYjEwZmEzOWQ5MWM5ZmU3ZTM3OThjNzgwMDhhMGZhMWIyN2NlYzQ1NjIzZTVhMmFhZTgxYzU0NTYwMzBkZDE0NzViODk1MWYxMmI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjQuMS4yNyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NC4xLjI3IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjciLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MjUwODJmNGM4Y2E2YWE3ZWNmYWI5MGFjMTE2NWFmZDU4YzcwMGMwNWZiNDZjMzgwYThlYTQyN2QwY2I3YzAyYWRiMTMzNjM1MGI3MzQ0ZjY5MjU2MWMyYTk4ZmEyN2ZkZGQxOTRjM2E2MTM1NWZmZDgyYjRmNzM3ZWJhOTQ5OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Bhc3Mtc3R5bGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYwLjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZS9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlL3Rvb2xzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGZhc3QtY2hlY2svYXZhLXYxLjEuNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGliL2VzbS9hdmEtZmFzdC1jaGVjay5qcyIKICAgICAgICB9LAogICAgICAgICJAZmFzdC1jaGVjay9hdmEvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4xLjUiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzZiNzMyMDNiM2FjMWU3NjAxMDg3MmYxNjY0NTdkNTU1MzI4ZjQ1OWNmNTBhNTcyZmZhMDEwNDFlYzA5MzNhN2Y1NzkxNzBhY2UwYjZlNzZhZjc5MmUxMmJiYmUxYWY1NWJkNmQyYzY4YzRlZjExYjQwZGRhOTRlZmRjNjFiNzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMzhiYjYwZjc4NTRiNGE3YjYxYTFmZDMzYjI0YTdlOWQwNThkYTc5MGU2ZjBhMjk2NDQzZjcwOWYyMDZmZWY3MzE1MGI3ZTJkZWQ3OTljNjM5YjU4ODQ4ZGM0NWE0ZjNmY2FhOTlhMGYxZTcyNWEyYWQ5YTQzZGNlNjkwODM5MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTRiODEyNWQwOWQ3M2IwMjVjODM5ZjYyNTFkY2MwNmE1M2RjZDI1YWU5MThjOTczZTM2MDE2MTE2MzA4YTQ4YzE4MzBhZDMzODczZDliOGVlZTA2YWQ1MGI4MjlkNDUwMzZlOGM0ODYwMzYzOWUyYTU0ODJlZTJiYTljZGQzMGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzRlNjI3MjdjY2E4Y2YzYzJiNWEzYTc4YTViMjc5ZjM2NzkzYTM4ZDM2NzE4MTUyYWNhNWIxZTE4NjY2NWIzMDYzOGRkMTI0YTFiYjhjYzk0NGMxMTFhNzEyNjg2YjQ0ZDBmN2NhYWI0ZjJmNWYwMjczYTA0ZjQyNzZmMjczOGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NzZlYmYzNGU3M2QwNTAzOTM3NDdlOWVhZjM1ZDk3MDdhMTkwNWQ0Y2MxYzUxMGE0ZjE5ZTE1ZmMzNTBlY2IxZGI0OWIyZjUxZjg0ZmFhZWNiOWI2N2FmNTQ4YWNjMmU1MTJmYWIyZmExNjEwYjM2OGRkMWExNzllYTBmMzM0ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOGVlZGEzNmRlZGNhYmNlZmZhOWYyNmU2MzUyNWU2ODg3MWEzMmNiZWRjZDdjMWFkNmI2ZDU5NDM2NmIyNzI0OGMxZDQzNmUxZjlkY2YzYjA5NzEwN2UzODAxZDIyOTgxNDQ1YzhjMzMyY2JkMDUzMDA3NTk5ZGU1MzJiYWYxMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmQwZTRiYzZlNDdlM2Y2NDc5NDZlMWE0YjlhMGNlYTY0N2MzNTMwN2U5NTUzZTU4ZjNjMTMyMTYxODM2YjlkM2I4YzdlNzAxYjNlNjg2MDcxYjYwMWY0YjBiODAyMzMyNmY5YmE0ODdhZWM4MDI1MmM5NWNhYWQ4ZmQ5OTYxNDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDk1YWVkODc0YjQ5NTc2NDhmMGU1NWM4Yzc1OTJkYzdlMWI2NTMwNzllMjU4NjU5NWJkY2Y4OTM3ZjcyMmMyYmU4NjdhZGNhMTYzZDA0MDQzMjUxMDY2MTMwZTAyZGRjOGNiNzY2M2NmOGQ4NzY0YjEwYmY2YTI2YTk2MjRmMTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2MwYzc4YjA2ZmZmMmIxNzVkODQzYTliMTNmZjg3Mzk3MGM2YzJlZWIyZTBhMmEyMDdlOWFjYjI1YTliMGE2MjFkNGVjOGQyMWUwY2NhODgzZDIwMTFiZmVlMDdmN2RiNzI4ZTJlYzBiNDViMjRkMjU4ZWNiZmUwZGVlMDAzNTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NTg0MmZlODI1MWQ0ZTA5NmYxM2NiZTVlYmY3ZTBiMzBjNmI1MzBhMDBiMzRmYTA3YmU4MDRkNWQ3YjQwMGEwMmIyNmZmNDI2OGIxNGRkODc3ZTk2ZTFhZTMzYWQwOGVmMmFiODgxMjk2MzJkNjI4NzU5NTJlYWZkMDE3MjExYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjliNzM0MWY4OWVmN2RhYTVhM2EwMTgwZTFiZmY3MWM1MmQwODg3MWViMGFmY2U1Nzc0NzAzZDk1MTgyZGQwYzAyYzA1MDgzM2VmNjE5OWJmMzEyYWM1YzAyZGJlNDUyM2U0ZDhhMGYxOTY5MTI1ZWM3NzU5NmNjYjc2NTAzZmM1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjk5MTliNzhkMDczNjljNjdjYmU2OGU4NjgwYjJjOTE5ZDYwOWQyZGJjYmIyMWQyYzgwY2ZmMjYyYTM2NDUzNDdhNTMwZTczOTFkNDFlNzhhNDQ4ZDc1MTgzMjZhMWNlM2VjYjljOTlkMTYzNDM5MDE2Mzk2NTQ5MmFkZTA0OWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMzlmMzA1YmM3OWYxZGI5YTZjZmJmOTUyNTE5MjViMmVlNTZiZDI5YmIxNTU3ZjI0NDY5OGZjMjM1ZDBhZjllNzI3YWM1NzIwMjI2ZTMyZGM4MGZjOGFmMzYxN2IwYTRkNTNjZTc3MmU3MDNlMjVmZjBiOWViZWQ3NGM3NTczOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTQxNzBjNGUxNmQ1Mzc5NWE4NDc5ZDBjMWE3OWQxOWIxOTBkOTIyZTE2MzAxZTdhMGJiOGI4MTZkM2M0OWJkMjVmZTBiODRlODc5ZGE3ODBjM2ZjMDY0MWFkNjljYzU3ZGQxZTc5NWVjZTdlOGJiMjgxMmY3NDMwNThhZmYwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOThhODUxYmRiZjJmNGRkMDlhMTNiNTIxMTMwZTI5OWY5ZDE5NTVhZTE5MjkxNjI3Y2QyOGRmNGZiNWQ0ODc4ZWNkZjdjZTJiMjJhNTY3MGI0Mzk3YmY0OTBiODBkODk4MjQ4MWRiNWNlYjIyNGIxMGFmZGVmZTVjNDQ1MDYyNjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGF0dGVybnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3BhdHRlcm5zLXYwLjIuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguNSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjAuMi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjMTEwNTVmY2E1ODRhZjRkNDczOTljNTRiYzUwZDgxYWE2OGM2MDNhNTUwYmY2OWEwOWIyN2M4OWY2ODVlOTc0NDU0NWE3NTNhZDVlOGZlMzMzMWFkYmQ5ZDRkY2ExNDNhNTg3ZGQ2MDkzNGZiNDFjODJmNGExZTllYjFkZTUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZTcyYTVkY2Q2NGUxZDdkMjU0NWNlMzBjYzM3MDI0ODQzOTBjOWQ1Y2RkYjlkMDVjZWEzMzZlODhlZThlOTMzYmMzMTUwM2M0YzI1YzM3ZTBhMWNhYzhjZGUzMWNiYmY0NzgxODY0ZDBkODlkNzFmZWU1ODRmNTliMDE5MzQyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDJkMzcyODdhMmVhYzlmNDFjYzQ0YTkyMDFmOTlkZjIyMWE2NzZhNDdjZTc5ZDgwNjBiN2M1NjdjMmU2M2Y3ZGViZDkyNmZmZTM1MjIzZWE3ZjM1OWZmNmE5YjMwYTgzNjhhMzk2YWI2ZGRmYzRiOGIxMjI2NDFmODVjOWI4ZTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZGU0ZjgyZjJjNGQ0OWRiM2E5ODE0YmRiY2YxZWM2NGQ3MWQ4ZmFkNTIxZTExMGU2ODEyZDNiMzczZWQ5MjhiODYxZDc1ZjA3YTY3ZTNjZjRjM2ZlZDZhZGU0NTU3YmJmNGFkOTQ1NzM1YTIzOGRlZGRkMDUzYzA5MzJlNmEwNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRlYWI3ZWMyODRjYWRlMWIwNGRmNGYzYmU2ODZjMTcyYjA0MzkxZjBlZWQ4NTQ4ZTQ5ZjkzMWIzYzJjNGM1MTgzZTg0MTFlZTY1YTBiOWI2ZGZiNWZkZjFhZGI4ZTRhMzYxMjUwYWUwMTkxZTJlYzYwYzU4MTQxOGU4Y2E1MDQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGI5ODkyYjNhMjViZjZiYWQzMjM1ZDZhMzc2NTZmMTFhNDNlNDRhMzhmZThkNWM4ZTQzNWIxZjA5Y2JmMmI0MmY2YWQ2NDk0NDY0ZDU3YWQxOTQ3Zjc4YzhhMTAxOTZiYmQ4ZjUwYjY0ZTI1MTA2NzYzZWRhOTNkZTI3YWRlYmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YjFiNDE3YzZkZDkzMmRiODFmOWRhMTE0YzAyMGM3ZDAyNzhiZjEyYmE4YzQ2MDdmZjQwYWJjNWUzMDE1OTUxZGNkZmJhMmUwMWEwMTUzZjRkMGZmOWEzNzU0ZWJjMDA0NjA3N2Y3YTg0MjMxN2IzMWJiN2EzZjFjYjBmYzkyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMyNzZjNmZiYzYzYjViYmY4M2FjZjBlOTkzMTdlOTAzNWZmMzhkMDRhN2I2MWIyOWY4MDAzNTM4NTAxZmVjZGYyYmU5OTc2YWRmOWUyMmE5MDA5YWI0ZjUxMWI5OGU3ZWZjNjQ5ZmE3M2UyYTlhYzMyMzYzY2NkZThhYWE1MTNhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk4YTg1MWJkYmYyZjRkZDA5YTEzYjUyMTEzMGUyOTlmOWQxOTU1YWUxOTI5MTYyN2NkMjhkZjRmYjVkNDg3OGVjZGY3Y2UyYjIyYTU2NzBiNDM5N2JmNDkwYjgwZDg5ODI0ODFkYjVjZWIyMjRiMTBhZmRlZmU1YzQ0NTA2MjY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjExNGIzYTQwNDM4MjJmOGZiZmQyMmFiNjAxOWNjMWE3ZTYwYWRjZjdhNTdkNzBkMjdlOGVmMWMxMTIyNjI3NWY3ZTMxMzc2ZDg0MzZhMTQ3OTk4Y2E5YTA0NjA3NjkyMWQzNjcyZWM5MWRmNmQ2ZjMyMTEwNWJjZGFiM2Q2NzMwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOWZmZTU1YTMxMDM3M2E0NTdhYTlkMDc3MTYxMTg1MDU0ZWIzNmY4MzUzMjhmY2ExNGVmZDExNDUxYzYxNTAyYTEyMGI4M2M3NDgyMDRmYTA4NzdhZmM3MDUyZWIyMmE0ZDdiMGUxYjBiNjE4ZGI5MDIxN2Q2ZThjZTc3YTI5MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTgxNGRkMTQzZGZmNzNkZTNlZTRjMWYwNzcwN2U1NzdjYWFjYWEzYWJmNGIwNTkwY2RlZGUxMGI5MTk5YTkyZDc5N2YwYzExYmI3MzgyOTVjNDlmMWU3ZWY5MGYzZDExNmUyOGU3NGMwODY3MzRlYmNhOGJjZGExZGM5MzlkNDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZWE1NWZhMmNjMWI3MzZlMDJiYjgzMjI0NmRjYzZmY2Q0YTBhMWViYzI0MWUzODFlZjZmNjRiZDhlYzQ2YTE1ZDNmNzk3ZWMyMmEzNWM5YzVjOTUxNDI0ZTM5ZmQ2YTY4N2NkYjQxNTVjOGRiNzFmNmVmZTdkM2ZlOTdlOTQ1YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NWU4MzM2Y2JjNDFjZDJmNjMxMTc3YzA2MTA5Y2YzZjhiNTE4MTRjYjMzZTIyMDgyYzhlOWVlZTA3MmVjNDg5MTlkMDhkNDNkMjlkNTY1NTE4MjZjODk1MTM1ODM1NGQ2OGU1YWEwOTZjNmFhNTY2MTM0OWUwZmExMDgxNmY3OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OGE4NTFiZGJmMmY0ZGQwOWExM2I1MjExMzBlMjk5ZjlkMTk1NWFlMTkyOTE2MjdjZDI4ZGY0ZmI1ZDQ4NzhlY2RmN2NlMmIyMmE1NjcwYjQzOTdiZjQ5MGI4MGQ4OTgyNDgxZGI1Y2ViMjI0YjEwYWZkZWZlNWM0NDUwNjI2NSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vc3RyZWFtLXYwLjMuMjUiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3N0cmVhbSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9zdHJlYW0tdjAuMy4yNSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41NiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MC4zLjI1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zdHJlYW0vcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MC4zLjI1IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAic2VzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvbG9ja2Rvd24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJzZXMvdG9vbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VzLXYwLjE4LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3Rvb2xzLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMDk0MTMyY2I5YWNlN2YyYWE4ZmIyNGE4NWE4NjBkNDhkZDdjM2U1NDQwMDFmZWNmZWQwYTk3ZGMxYTM3YzJmZTNkM2QxYzBlNDQwOTkwYTg2MGU1ZjQzZTdlNmI1N2UzYTBlMTQ2MDI0YjA1ZDk4ODMwNmM2ZjkwNjhiNWEyZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiamVzc2llLmpzLXYwLjMuMiI6IHsKICAgICAgIm5hbWUiOiAiamVzc2llLmpzIiwKICAgICAgImxhYmVsIjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAibG9jYXRpb24iOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAxZGNiZTM0ZjRjMjI0ZDZkNmZmZGRlY2IzZGU1YmRmMmZmMzEzODY2N2Y1NmY0OTk1NTY5ZjBjMmQ5ZmNlM2I0ZGVjNDMzZjBkNDU2YTE4Yjk1ZDdmM2YyMzdjMTE5NmM0ODdiYzQ0ZTQ0NmYyOTVjZjYzZDJkNTgzZDc4ODg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMjEyNGJjY2M4NDYwMTkwMDYxZjRjZGJkOGRmNDliZDcyM2QxYzY1NWFiOTlkMDI2NzZmOGExMTFhMGY3NGU0NzYyY2FjNDNlY2RlZWI4NWQyOTNmMzdjODJlYmMyNWZjNGUwNTJjOTkyMzc4YmM3ZWJlMTBlNjgxY2Q4MzAzNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5YTk1ZDFkYmNjOGY0YmU4MTQyMDRmNjgzMmMxZWFjMzA2MjFmY2NiMDMyOGMwZWM0MWVhNWEwMzkxNDk5OGM4ZWZmOTAxOWVmZjY1YWQ2NjI4OWMwMTU5MTgxZDliNDlkYjJjZDk2ZjNmYjU5ZTIxYWRiODRkOWE0YzBlODk3ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmY3MTYzNzgyZjY3MmY2Mjg0NDkyNWI2YmI0ZmQ5ZDAxN2I4YjY0MmZmMzM2NDRmMjU5ZWUwMDdlMmJiNWE4MWIyNGJmZTA2NDE3NDA1YjA1MDUxOWZiNTNjMjBhODNmMjlkZTEyZjgzYzNiOWQ2OTZjZjdmODRlOThkZTUxMTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MzU3YmJmNmIxMWJiY2JjYTNiOTU5YzVlZTFhZWE0ZmFlYzM0ZmUzNDZiODM4MTk0MDJlOTNkZmJiZGU3ZmY4ZmRjZTM5ZTFmNjA4ZGJiNzY1NDBhODFjYTQ5OGVmZDQ2OTI5ZjQxZTc4OWUyOWJiNmRhZjY3YWQzYzE3NWE1ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9hc3luYy10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MGJmMTIxYTdhNTY5NTE0YzJlMGMxYWE1MWQxNmUzZTBkMTNhYzVlYWY5MDE1M2ExYzI1N2M2OWFjYmFjYWIwZjRhMmRjNjE1MDNiMzM3MmViMGE5ODA2YTYxNTI2NTFmNzAxOWEzN2JlOTJkZTg0ZDhhMjI1NWU3ZjMzMTA3MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWUxNDQ5MGNlNTNhZjQyYmU1MjQ2YzcxNjkyODgzNDY2ZjcxNGU4OTgyNGM3MzNiYzQzM2VhMjk1YjIyMjljZDRmN2MzYjhiYTAyYzY5OTdjNzJmZjAyNzk0YTEyNjdlOWU1ZTRmMTNhMjVkYzQ2YmRlNGRmZTUyM2NkZTU1NDgiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAAA5ilYCOwsAADsLAAAjAAAAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy9hc3NlcnQuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhaWwiLCJOb25OdWxsaXNoIiwiYW4iLCJhc3NlcnQiLCJkZXRhaWxzIiwiaWRlbnRDaGVja2VyIiwibWFrZUFzc2VydCIsInEiLCJxdW90ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGFuLCAnbmFtZScsIHt2YWx1ZTogXCJhblwifSk7JGjigI1fb25jZS5hbihhbik7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge0Fzc2VydH0gKi9cbmNvbnN0IGdsb2JhbEFzc2VydD1nbG9iYWxUaGlzLmFzc2VydDskaOKAjV9vbmNlLmdsb2JhbEFzc2VydChnbG9iYWxBc3NlcnQpO1xuXG5pZihnbG9iYWxBc3NlcnQ9PT11bmRlZmluZWQpe1xudGhyb3cgRXJyb3IoXG4gYENhbm5vdCBpbml0aWFsaXplIEBhZ29yaWMvYXNzZXJ0LCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0LCBpbXBvcnQgJ3NlcycgYmVmb3JlICdAYWdvcmljL2Fzc2VydCdgKTtcblxuIH1cblxuY29uc3QgbWlzc2luZz0vKiogQHR5cGUge2NvbnN0fSAqL1tcbidmYWlsJyxcbidlcXVhbCcsXG4ndHlwZW9mJyxcbidzdHJpbmcnLFxuJ25vdGUnLFxuJ2RldGFpbHMnLFxuJ0ZhaWwnLFxuJ3F1b3RlJyxcbidtYWtlQXNzZXJ0J10uXG5maWx0ZXIoKG5hbWUpPT5nbG9iYWxBc3NlcnRbbmFtZV09PT11bmRlZmluZWQpO1xuaWYobWlzc2luZy5sZW5ndGg+MCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGFnb3JpYy9hc3NlcnQsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbicsICcpXG4gfWApO1xuXG4gfVxuXG5jb25zdHtkZXRhaWxzLEZhaWwscXVvdGUsbWFrZUFzc2VydH09Z2xvYmFsQXNzZXJ0OyRo4oCNX29uY2UuZGV0YWlscyhkZXRhaWxzKTskaOKAjV9vbmNlLkZhaWwoRmFpbCk7JGjigI1fb25jZS5xdW90ZShxdW90ZSk7JGjigI1fb25jZS5tYWtlQXNzZXJ0KG1ha2VBc3NlcnQpO1xuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUIHwgbnVsbCB8IHVuZGVmaW5lZH0gdmFsXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIE5vbk51bGxpc2g9KHZhbCxvcHREZXRhaWxzPSBgdW5leHBlY3RlZCAke3F1b3RlKHZhbCl9YCk9PntcbmlmKHZhbCE9bnVsbCl7XG4vKiBUaGlzIGAhPSBudWxsYCBpZGlvbSBjaGVja3MgdGhhdCBgdmFsYCBpcyBuZWl0aGVyIGBudWxsYCBub3IgYHVuZGVmaW5lZGAuKi9cbnJldHVybiB2YWw7XG4gfVxuYXNzZXJ0LmZhaWwob3B0RGV0YWlscyk7XG4gfTskaOKAjV9vbmNlLk5vbk51bGxpc2goTm9uTnVsbGlzaCk7XG5oYXJkZW4oTm9uTnVsbGlzaCk7XG5cbi8qKlxuICogUHJlcGVuZCB0aGUgY29ycmVjdCBpbmRlZmluaXRlIGFydGljbGUgb250byBhIG5vdW4sIHR5cGljYWxseSBhIHR5cGVvZiByZXN1bHRcbiAqIGUuZy4sIFwiYW4gT2JqZWN0XCIgdnMuIFwiYSBOdW1iZXJcIlxuICpcbiAqIEBkZXByZWNhdGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRoZSBub3VuIHRvIHByZXBlbmRcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBub3VuIHByZXBlbmRlZCB3aXRoIGEvYW5cbiAqL1xuZnVuY3Rpb24gYW4oc3RyKXtcbnN0cj0gYCR7c3RyfWA7XG5pZihzdHIubGVuZ3RoPj0xJiYnYWVpb3VBRUlPVScuaW5jbHVkZXMoc3RyWzBdKSl7XG5yZXR1cm4gYGFuICR7c3RyfWA7XG4gfVxucmV0dXJuIGBhICR7c3RyfWA7XG4gfVxuZnJlZXplKGFuKTtcblxuXG4vKipcbiAqIEluIHRoZSBgYXNzZXJ0Rm9vYC9gaXNGb29gL2BjaGVja0Zvb2AgcGF0dGVybiwgYGNoZWNrRm9vYCBoYXMgYSBgY2hlY2tgXG4gKiBwYXJhbWV0ZXIgb2YgdHlwZSBgQ2hlY2tlcmAuIGBhc3NlcnRGb29gIGNhbGxzIGBjaGVja0Zvb2AgcGFzc2VzXG4gKiBgYXNzZXJ0Q2hlY2tlcmAgYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpc0Zvb2AgcGFzc2VzIGBpZGVudENoZWNrZXJgXG4gKiBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlkZW50Q2hlY2tlcmAgYWN0cyBwcmVjaXNlbHkgbGlrZSBhblxuICogaWRlbnRpdHkgZnVuY3Rpb24sIGJ1dCBpcyB0eXBlZCBhcyBhIGBDaGVja2VyYCB0byBpbmRpY2F0ZSBpdHNcbiAqIGludGVuZGVkIHVzZS5cbiAqXG4gKiBAdHlwZSB7Q2hlY2tlcn1cbiAqL1xuY29uc3QgICAgICAgIGlkZW50Q2hlY2tlcj0oY29uZCxfZGV0YWlscyk9PmNvbmQ7JGjigI1fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydCI6WyJnbG9iYWxBc3NlcnQiXSwiZGV0YWlscyI6WyJkZXRhaWxzIl0sIkZhaWwiOlsiRmFpbCJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sIm1ha2VBc3NlcnQiOlsibWFrZUFzc2VydCJdLCJhbiI6WyJhbiJdLCJOb25OdWxsaXNoIjpbIk5vbk51bGxpc2giXSwiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAFuYfs2i4AANouAAAiAAAAQGFnb3JpYy9hc3NlcnQtdjAuNi4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBCYXNlZCBvbiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9IRUFEL3BhY2thZ2VzL3Nlcy9zcmMvZXJyb3IvdHlwZXMuanMqL1xuLyogQ29vcmRpbmF0ZSBlZGl0cyB1bnRpbCB3ZSByZWZhY3RvciB0byBhdm9pZCB0aGlzIGR1cGxpY2F0aW9uKi9cbi8qIEF0IGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc3NCovXG4vKiBpcyBhIHJlY29yZCBvZiBhIGZhaWxlZCBhdHRlbXB0IHRvIHJlbW92ZSB0aGlzIGR1cGxpY2F0aW9uLiovXG5cbi8qKlxuICogQGNhbGxiYWNrIEJhc2VBc3NlcnRcbiAqIFRoZSBgYXNzZXJ0YCBmdW5jdGlvbiBpdHNlbGYuXG4gKlxuICogQHBhcmFtIHsqfSBmbGFnIFRoZSB0cnV0aHkvZmFsc3kgdmFsdWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHthc3NlcnRzIGZsYWd9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBc3NlcnRNYWtlRXJyb3JPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Vycm9yTmFtZV1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRNYWtlRXJyb3JcbiAqXG4gKiBUaGUgYGFzc2VydC5lcnJvcmAgbWV0aG9kLCByZWNvcmRpbmcgZGV0YWlscyBmb3IgdGhlIGNvbnNvbGUuXG4gKlxuICogVGhlIG9wdGlvbmFsIGBvcHREZXRhaWxzYCBjYW4gYmUgYSBzdHJpbmcuXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyBvZiB3aGF0IHdhcyBhc3NlcnRlZFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBbRXJyb3JDb25zdHJ1Y3Rvcl0gQW4gb3B0aW9uYWwgYWx0ZXJuYXRlIGVycm9yXG4gKiBjb25zdHJ1Y3RvciB0byB1c2UuXG4gKiBAcGFyYW0ge0Fzc2VydE1ha2VFcnJvck9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge0Vycm9yfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEZhaWxcbiAqXG4gKiBUaGUgYGFzc2VydC5mYWlsYCBtZXRob2QuXG4gKlxuICogRmFpbCBhbiBhc3NlcnRpb24sIHJlY29yZGluZyBmdWxsIGRldGFpbHMgdG8gdGhlIGNvbnNvbGUgYW5kXG4gKiByYWlzaW5nIGFuIGV4Y2VwdGlvbiB3aXRoIGEgbWVzc2FnZSBpbiB3aGljaCBgZGV0YWlsc2Agc3Vic3RpdHV0aW9uIHZhbHVlc1xuICogaGF2ZSBiZWVuIG1hc2tlZC5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggdGhlIG5vZGVqcyBhc3NlcnRpb24gbGlicmFyeS5cbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEByZXR1cm5zIHtuZXZlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRFcXVhbFxuICogVGhlIGBhc3NlcnQuZXF1YWxgIG1ldGhvZFxuICpcbiAqIEFzc2VydCB0aGF0IHR3byB2YWx1ZXMgbXVzdCBiZSBgT2JqZWN0LmlzYC5cbiAqIEBwYXJhbSB7Kn0gYWN0dWFsIFRoZSB2YWx1ZSB3ZSByZWNlaXZlZFxuICogQHBhcmFtIHsqfSBleHBlY3RlZCBXaGF0IHdlIHdhbnRlZFxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc10gVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyogVHlwZSBhbGwgdGhlIG92ZXJsb2FkcyBvZiB0aGUgYXNzZXJ0VHlwZW9mIGZ1bmN0aW9uLiovXG4vKiBUaGVyZSBtYXkgZXZlbnR1YWxseSBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcywgYnV0Ki9cbi8qIHRoZW1zIHRoZSBicmVha3Mgd2l0aCBUeXBlc2NyaXB0IDQuMC4qL1xuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mQmlnaW50XG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2JpZ2ludCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYmlnaW50fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkJvb2xlYW5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYm9vbGVhbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgYm9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZGdW5jdGlvblxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydmdW5jdGlvbid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgRnVuY3Rpb259XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mTnVtYmVyXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J251bWJlcid9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgbnVtYmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZk9iamVjdFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydvYmplY3QnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIFJlY29yZDxhbnksIGFueT4gfCBudWxsfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZlN0cmluZ1xuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydzdHJpbmcnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN0cmluZ31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZTeW1ib2xcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnc3ltYm9sJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzeW1ib2x9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3VuZGVmaW5lZCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgdW5kZWZpbmVkfVxuICovXG5cbi8qKlxuICogVGhlIGBhc3NlcnQudHlwZW9mYCBtZXRob2RcbiAqXG4gKiBAdHlwZWRlZiB7QXNzZXJ0VHlwZW9mQmlnaW50ICYgQXNzZXJ0VHlwZW9mQm9vbGVhbiAmIEFzc2VydFR5cGVvZkZ1bmN0aW9uICYgQXNzZXJ0VHlwZW9mTnVtYmVyICYgQXNzZXJ0VHlwZW9mT2JqZWN0ICYgQXNzZXJ0VHlwZW9mU3RyaW5nICYgQXNzZXJ0VHlwZW9mU3ltYm9sICYgQXNzZXJ0VHlwZW9mVW5kZWZpbmVkfSBBc3NlcnRUeXBlb2ZcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRTdHJpbmdcbiAqIFRoZSBgYXNzZXJ0LnN0cmluZ2AgbWV0aG9kLlxuICpcbiAqIGBhc3NlcnQuc3RyaW5nKHYpYCBpcyBlcXVpdmFsZW50IHRvIGBhc3NlcnQudHlwZW9mKHYsICdzdHJpbmcnKWAuIFdlXG4gKiBzcGVjaWFsIGNhc2UgdGhpcyBvbmUgYmVjYXVzZSBpdCBpcyB0aGUgbW9zdCBmcmVxdWVudGx5IHVzZWQuXG4gKlxuICogQXNzZXJ0IGFuIGV4cGVjdGVkIHR5cGVvZiByZXN1bHQuXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW4gVGhlIHZhbHVlIHRvIGdldCB0aGUgdHlwZW9mXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgc3RyaW5nfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydE5vdGVcbiAqIFRoZSBgYXNzZXJ0Lm5vdGVgIG1ldGhvZC5cbiAqXG4gKiBBbm5vdGF0ZSBhbiBlcnJvciB3aXRoIGRldGFpbHMsIHBvdGVudGlhbGx5IHRvIGJlIHVzZWQgYnkgYW5cbiAqIGF1Z21lbnRlZCBjb25zb2xlIHN1Y2ggYXMgdGhlIGNhdXNhbCBjb25zb2xlIG9mIGBjb25zb2xlLmpzYCwgdG9cbiAqIHByb3ZpZGUgZXh0cmEgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGxvZ2dlZCBlcnJvcnMuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqIEBwYXJhbSB7RGV0YWlsc30gZGV0YWlsc05vdGVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e319IERldGFpbHNUb2tlblxuICogQSBjYWxsIHRvIHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCBtYWtlcyBhbmQgcmV0dXJucyBhIGZyZXNoIGRldGFpbHNcbiAqIHRva2VuLCB3aGljaCBpcyBhIGZyb3plbiBlbXB0eSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBhcmd1bWVudHMgb2YgdGhhdFxuICogYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgZXhwcmVzc2lvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCBEZXRhaWxzVG9rZW59IERldGFpbHNcbiAqIEVpdGhlciBhIHBsYWluIHN0cmluZywgb3IgbWFkZSBieSB0aGUgYGRldGFpbHNgIHRlbXBsYXRlIGxpdGVyYWwgdGFnLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RyaW5nYWJsZVBheWxvYWRcbiAqIEhvbGRzIHRoZSBwYXlsb2FkIHBhc3NlZCB0byBxdW90ZSBzbyB0aGF0IGl0cyBwcmludGVkIGZvcm0gaXMgdmlzaWJsZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSB0b1N0cmluZyBIb3cgdG8gcHJpbnQgdGhlIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIFRvIFwiZGVjbGFzc2lmeVwiIGFuZCBxdW90ZSBhIHN1YnN0aXR1dGlvbiB2YWx1ZSB1c2VkIGluIGFcbiAqIGBgYCBkZXRhaWxzYC4uLmAgYGBgIHRlbXBsYXRlIGxpdGVyYWwsIGVuY2xvc2UgdGhhdCBzdWJzdGl0dXRpb24gZXhwcmVzc2lvblxuICogaW4gYSBjYWxsIHRvIGBxdW90ZWAuIFRoaXMgbWFrZXMgdGhlIHZhbHVlIGFwcGVhciBxdW90ZWRcbiAqIChhcyBpZiB3aXRoIGBKU09OLnN0cmluZ2lmeWApIGluIHRoZSBtZXNzYWdlIG9mIHRoZSB0aHJvd24gZXJyb3IuIFRoZVxuICogcGF5bG9hZCBpdHNlbGYgaXMgc3RpbGwgcGFzc2VkIHVucXVvdGVkIHRvIHRoZSBjb25zb2xlIGFzIGl0IHdvdWxkIGJlXG4gKiB3aXRob3V0IGBxdW90ZWAuXG4gKlxuICogRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgd2lsbCByZXZlYWwgdGhlIGV4cGVjdGVkIHNreSBjb2xvciwgYnV0IG5vdCB0aGVcbiAqIGFjdHVhbCBpbmNvcnJlY3Qgc2t5IGNvbG9yLCBpbiB0aGUgdGhyb3duIGVycm9yJ3MgbWVzc2FnZTpcbiAqIGBgYGpzXG4gKiBza3kuY29sb3IgPT09IGV4cGVjdGVkQ29sb3IgfHwgRmFpbGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cXVvdGUoZXhwZWN0ZWRDb2xvcil9YDtcbiAqIGBgYFxuICpcbiAqIFRoZSBub3JtYWwgY29udmVudGlvbiBpcyB0byBsb2NhbGx5IHJlbmFtZSBgZGV0YWlsc2AgdG8gYFhgIGFuZCBgcXVvdGVgIHRvIGBxYFxuICogbGlrZSBgY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSB9ID0gYXNzZXJ0O2AsIHNvIHRoZSBhYm92ZSBleGFtcGxlIHdvdWxkIHRoZW4gYmVcbiAqIGBgYGpzXG4gKiBza3kuY29sb3IgPT09IGV4cGVjdGVkQ29sb3IgfHwgRmFpbGAke3NreS5jb2xvcn0gc2hvdWxkIGJlICR7cShleHBlY3RlZENvbG9yKX1gO1xuICogYGBgXG4gKlxuICogQGNhbGxiYWNrIEFzc2VydFF1b3RlXG4gKiBAcGFyYW0geyp9IHBheWxvYWQgV2hhdCB0byBkZWNsYXNzaWZ5XG4gKiBAcGFyYW0geyhzdHJpbmd8bnVtYmVyKX0gW3NwYWNlc11cbiAqIEByZXR1cm5zIHtTdHJpbmdhYmxlUGF5bG9hZH0gVGhlIGRlY2xhc3NpZmllZCBwYXlsb2FkXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFpc2VcbiAqXG4gKiBUbyBtYWtlIGFuIGBhc3NlcnRgIHdoaWNoIHRlcm1pbmF0ZXMgc29tZSBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvblxuICogbGlrZSBhIHRyYW5zYWN0aW9uLCB2YXQsIG9yIHByb2Nlc3MsIGNhbGwgYG1ha2VBc3NlcnRgIHdpdGggYSBgUmFpc2VgXG4gKiBjYWxsYmFjaywgd2hlcmUgdGhhdCBjYWxsYmFjayBhY3R1YWxseSBwZXJmb3JtcyB0aGF0IGxhcmdlciB0ZXJtaW5hdGlvbi5cbiAqIElmIHBvc3NpYmxlLCB0aGUgY2FsbGJhY2sgc2hvdWxkIGFsc28gcmVwb3J0IGl0cyBgcmVhc29uYCBwYXJhbWV0ZXIgYXNcbiAqIHRoZSBhbGxlZ2VkIHJlYXNvbiBmb3IgdGhlIHRlcm1pbmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IHJlYXNvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VBc3NlcnRcbiAqXG4gKiBNYWtlcyBhbmQgcmV0dXJucyBhbiBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3QgdGhhdCBzaGFyZXMgdGhlIGJvb2trZWVwaW5nXG4gKiBzdGF0ZSBkZWZpbmVkIGJ5IHRoaXMgbW9kdWxlIHdpdGggb3RoZXIgYGFzc2VydGAgZnVuY3Rpb24gb2JqZWN0cyBtYWRlIGJ5XG4gKiBgbWFrZUFzc2VydGAuIFRoaXMgc3RhdGUgaXMgcGVyLW1vZHVsZS1pbnN0YW5jZSBhbmQgaXMgZXhwb3NlZCBieSB0aGVcbiAqIGBsb2dnZWRFcnJvckhhbmRsZXJgIGFib3ZlLiBXZSByZWZlciB0byBgYXNzZXJ0YCBhcyBhIFwiZnVuY3Rpb24gb2JqZWN0XCJcbiAqIGJlY2F1c2UgaXQgY2FuIGJlIGNhbGxlZCBkaXJlY3RseSBhcyBhIGZ1bmN0aW9uLCBidXQgYWxzbyBoYXMgbWV0aG9kcyB0aGF0XG4gKiBjYW4gYmUgY2FsbGVkLlxuICpcbiAqIElmIGBvcHRSYWlzZWAgaXMgcHJvdmlkZWQsIHRoZSByZXR1cm5lZCBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3Qgd2lsbCBjYWxsXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgYmVmb3JlIHRocm93aW5nIHRoZSBlcnJvci4gVGhpcyBlbmFibGVzIGBvcHRSYWlzZWAgdG9cbiAqIGVuZ2FnZSBpbiBldmVuIG1vcmUgdmlvbGVudCB0ZXJtaW5hdGlvbiBiZWhhdmlvciwgbGlrZSB0ZXJtaW5hdGluZyB0aGUgdmF0LFxuICogdGhhdCBwcmV2ZW50cyBleGVjdXRpb24gZnJvbSByZWFjaGluZyB0aGUgZm9sbG93aW5nIHRocm93LiBIb3dldmVyLCBpZlxuICogYG9wdFJhaXNlYCByZXR1cm5zIG5vcm1hbGx5LCB3aGljaCB3b3VsZCBiZSB1bnVzdWFsLCB0aGUgdGhyb3cgZm9sbG93aW5nXG4gKiBgb3B0UmFpc2UocmVhc29uKWAgd291bGQgc3RpbGwgaGFwcGVuLlxuICpcbiAqIEBwYXJhbSB7UmFpc2V9IFtvcHRSYWlzZV1cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3VucmVkYWN0ZWRdXG4gKiBAcmV0dXJucyB7QXNzZXJ0fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyh0ZW1wbGF0ZTogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmdbXSwgLi4uYXJnczogYW55KSA9PiBEZXRhaWxzVG9rZW59IERldGFpbHNUYWdcbiAqXG4gKiBVc2UgdGhlIGBkZXRhaWxzYCBmdW5jdGlvbiBhcyBhIHRlbXBsYXRlIGxpdGVyYWwgdGFnIHRvIGNyZWF0ZVxuICogaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZXMuIFRoZSBhc3NlcnRpb24gZnVuY3Rpb25zIHRha2Ugc3VjaCBtZXNzYWdlc1xuICogYXMgb3B0aW9uYWwgYXJndW1lbnRzOlxuICogYGBganNcbiAqIGFzc2VydChza3kuaXNCbHVlKCksIGRldGFpbHNgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImApO1xuICogYGBgXG4gKiBvciBmb2xsb3dpbmcgdGhlIG5vcm1hbCBjb252ZW50aW9uIHRvIGxvY2FsbHkgcmVuYW1lIGBkZXRhaWxzYCB0byBgWGBcbiAqIGFuZCBgcXVvdGVgIHRvIGBxYCBsaWtlIGBjb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxIH0gPSBhc3NlcnQ7YDpcbiAqIGBgYGpzXG4gKiBhc3NlcnQoc2t5LmlzQmx1ZSgpLCBYYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgXCJibHVlXCJgKTtcbiAqIGBgYFxuICogSG93ZXZlciwgbm90ZSB0aGF0IGluIG1vc3QgY2FzZXMgaXQgaXMgcHJlZmVyYWJsZSB0byBpbnN0ZWFkIHVzZSB0aGUgYEZhaWxgXG4gKiB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyAod2hpY2ggaGFzIHRoZSBzYW1lIGlucHV0IHNpZ25hdHVyZSBhcyBgZGV0YWlsc2BcbiAqIGJ1dCBhdXRvbWF0aWNhbGx5IGNyZWF0ZXMgYW5kIHRocm93cyBhbiBlcnJvcik6XG4gKiBgYGBqc1xuICogc2t5LmlzQmx1ZSgpIHx8IEZhaWxgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImA7XG4gKiBgYGBcbiAqXG4gKiBUaGUgZGV0YWlscyB0ZW1wbGF0ZSB0YWcgcmV0dXJucyBhIGBEZXRhaWxzVG9rZW5gIG9iamVjdCB0aGF0IGNhbiBwcmludFxuICogaXRzZWxmIHdpdGggdGhlIGZvcm1hdHRlZCBtZXNzYWdlIGluIHR3byB3YXlzLlxuICogSXQgd2lsbCByZXBvcnQgZnVsbCBkZXRhaWxzIHRvIHRoZSBjb25zb2xlLCBidXRcbiAqIG1hc2sgZW1iZWRkZWQgc3Vic3RpdHV0aW9uIHZhbHVlcyB3aXRoIHRoZWlyIHR5cGVvZiBpbmZvcm1hdGlvbiBpbiB0aGUgdGhyb3duIGVycm9yXG4gKiB0byBwcmV2ZW50IHJldmVhbGluZyBzZWNyZXRzIHVwIHRoZSBleGNlcHRpb25hbCBwYXRoLiBJbiB0aGUgZXhhbXBsZVxuICogYWJvdmUsIHRoZSB0aHJvd24gZXJyb3IgbWF5IHJldmVhbCBvbmx5IHRoYXQgYHNreS5jb2xvcmAgaXMgYSBzdHJpbmcsXG4gKiB3aGVyZWFzIHRoZSBzYW1lIGRpYWdub3N0aWMgcHJpbnRlZCB0byB0aGUgY29uc29sZSByZXZlYWxzIHRoYXQgdGhlXG4gKiBza3kgd2FzIGdyZWVuLiBUaGlzIG1hc2tpbmcgY2FuIGJlIGRpc2FibGVkIGZvciBhbiBpbmRpdmlkdWFsIHN1YnN0aXR1dGlvbiB2YWx1ZVxuICogdXNpbmcgYHF1b3RlYC5cbiAqXG4gKiBUaGUgYHJhd2AgcHJvcGVydHkgb2YgYW4gaW5wdXQgdGVtcGxhdGUgYXJyYXkgaXMgaWdub3JlZCwgc28gYSBzaW1wbGVcbiAqIGFycmF5IG9mIHN0cmluZ3MgbWF5IGJlIHByb3ZpZGVkIGRpcmVjdGx5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyh0ZW1wbGF0ZTogVGVtcGxhdGVTdHJpbmdzQXJyYXkgfCBzdHJpbmdbXSwgLi4uYXJnczogYW55KSA9PiBuZXZlcn0gRmFpbFRhZ1xuICpcbiAqIFVzZSB0aGUgYEZhaWxgIGZ1bmN0aW9uIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdG8gZWZmaWNpZW50bHlcbiAqIGNyZWF0ZSBhbmQgdGhyb3cgYSBgZGV0YWlsc2Atc3R5bGUgZXJyb3Igb25seSB3aGVuIGEgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQuXG4gKiBgYGBqc1xuICogY29uZGl0aW9uIHx8IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqIGBgYFxuICogVGhpcyBhdm9pZHMgdGhlIG92ZXJoZWFkIG9mIGNyZWF0aW5nIHVzdWFsbHktdW5uZWNlc3NhcnkgZXJyb3JzIGxpa2VcbiAqIGBgYGpzXG4gKiBhc3NlcnQoY29uZGl0aW9uLCBkZXRhaWxzYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKiB3aGlsZSBpbXByb3ZpbmcgcmVhZGFiaWxpdHkgb3ZlciBhbHRlcm5hdGl2ZXMgbGlrZVxuICogYGBganNcbiAqIGNvbmRpdGlvbiB8fCBhc3NlcnQuZmFpbChkZXRhaWxzYC4uLmNvbXBsYWludC4uLmApO1xuICogYGBgXG4gKlxuICogSG93ZXZlciwgZHVlIHRvIGN1cnJlbnQgd2Vha25lc3MgaW4gVHlwZVNjcmlwdCwgc3RhdGljIHJlYXNvbmluZ1xuICogaXMgbGVzcyBwb3dlcmZ1bCB3aXRoIHRoZSBgfHxgIHBhdHRlcm5zIHRoYW4gd2l0aCBhbiBgYXNzZXJ0YCBjYWxsLlxuICogVW50aWwvdW5sZXNzIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTE0MjYgaXMgZml4ZWQsXG4gKiBmb3IgYHx8YC1zdHlsZSBhc3NlcnRpb25zIHdoZXJlIHRoaXMgbG9zcyBvZiBzdGF0aWMgcmVhc29uaW5nIGlzIGEgcHJvYmxlbSxcbiAqIGluc3RlYWQgZXhwcmVzcyB0aGUgYXNzZXJ0aW9uIGFzXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmRpdGlvbikge1xuICogICAgIEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKiBvciwgaWYgbmVlZGVkLFxuICogYGBganNcbiAqICAgaWYgKCFjb25kaXRpb24pIHtcbiAqICAgICAvLyBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cywgYnV0IGl0IGltcHJvdmVzIHN0YXRpYyBhbmFseXNpc1xuICogICAgIHRocm93IEZhaWxgLi4uY29tcGxhaW50Li4uYDtcbiAqICAgfVxuICogYGBgXG4gKi9cblxuLyoqXG4gKiBhc3NlcnQgdGhhdCBleHByIGlzIHRydXRoeSwgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWxzIHRvIGRlc2NyaWJlXG4gKiB0aGUgYXNzZXJ0aW9uLiBJdCBpcyBhIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsIGxpa2VcbiAqIGBgYGpzXG4gKiBhc3NlcnQoZXhwciwgZGV0YWlsc2AuLi4uYCk7YFxuICogYGBgXG4gKlxuICogVGhlIGxpdGVyYWwgcG9ydGlvbnMgb2YgdGhlIHRlbXBsYXRlIGFyZSBhc3N1bWVkIG5vbi1zZW5zaXRpdmUsIGFzXG4gKiBhcmUgdGhlIGB0eXBlb2ZgIHR5cGVzIG9mIHRoZSBzdWJzdGl0dXRpb24gdmFsdWVzLiBUaGVzZSBhcmVcbiAqIGFzc2VtYmxlZCBpbnRvIHRoZSB0aHJvd24gZXJyb3IgbWVzc2FnZS4gVGhlIGFjdHVhbCBjb250ZW50cyBvZiB0aGVcbiAqIHN1YnN0aXR1dGlvbiB2YWx1ZXMgYXJlIGFzc3VtZWQgc2Vuc2l0aXZlLCB0byBiZSByZXZlYWxlZCB0b1xuICogdGhlIGNvbnNvbGUgb25seS4gV2UgYXNzdW1lIG9ubHkgdGhlIHZpcnR1YWwgcGxhdGZvcm0ncyBvd25lciBjYW4gcmVhZFxuICogd2hhdCBpcyB3cml0dGVuIHRvIHRoZSBjb25zb2xlLCB3aGVyZSB0aGUgb3duZXIgaXMgaW4gYSBwcml2aWxlZ2VkXG4gKiBwb3NpdGlvbiBvdmVyIGNvbXB1dGF0aW9uIHJ1bm5pbmcgb24gdGhhdCBwbGF0Zm9ybS5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAqIHdpdGggdGhlIG5vZGVqcyBhc3NlcnRpb24gbGlicmFyeS5cbiAqXG4gKiBAdHlwZWRlZiB7IEJhc2VBc3NlcnQgJiB7XG4gKiAgIHR5cGVvZjogQXNzZXJ0VHlwZW9mLFxuICogICBlcnJvcjogQXNzZXJ0TWFrZUVycm9yLFxuICogICBmYWlsOiBBc3NlcnRGYWlsLFxuICogICBlcXVhbDogQXNzZXJ0RXF1YWwsXG4gKiAgIHN0cmluZzogQXNzZXJ0U3RyaW5nLFxuICogICBub3RlOiBBc3NlcnROb3RlLFxuICogICBkZXRhaWxzOiBEZXRhaWxzVGFnLFxuICogICBGYWlsOiBGYWlsVGFnLFxuICogICBxdW90ZTogQXNzZXJ0UXVvdGUsXG4gKiAgIG1ha2VBc3NlcnQ6IE1ha2VBc3NlcnQsXG4gKiB9IH0gQXNzZXJ0XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAU/WFv0Y3AABGNwAAJgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzeyJpbXBvcnRzIjpbIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZW1vdGFibGUgPSAkaOKAjV9hKV1dLFtcImFzc2VydFJlY29yZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1wiLCBbW1wibmF0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKG5hdE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcInNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChzZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5U2V0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlCYWdNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAoY29weUJhZ01hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIENvbnN0YW50cyBmb3IgdGhlIGtpbmRzIG9mIGFzc2V0cyB3ZSBzdXBwb3J0LlxuICpcbiAqIEB0eXBlIHt7IE5BVDogJ25hdCcsIFNFVDogJ3NldCcsIENPUFlfU0VUOiAnY29weVNldCcsIENPUFlfQkFHOiAnY29weUJhZycgfX1cbiAqL1xuY29uc3QgQXNzZXRLaW5kPWhhcmRlbih7XG5OQVQ6J25hdCcsXG5TRVQ6J3NldCcsXG5DT1BZX1NFVDonY29weVNldCcsXG5DT1BZX0JBRzonY29weUJhZyd9KTskaOKAjV9vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuXG5jb25zdCBhc3NldEtpbmROYW1lcz1oYXJkZW4oT2JqZWN0LnZhbHVlcyhBc3NldEtpbmQpLnNvcnQoKSk7XG5cbi8qKlxuICogQHBhcmFtIHtBc3NldEtpbmR9IGFsbGVnZWRBS1xuICovXG5jb25zdCBhc3NlcnRBc3NldEtpbmQ9KGFsbGVnZWRBSyk9PntcbmFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSyl8fFxuRmFpbCBgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKipcbiAqIEFtb3VudHMgZGVzY3JpYmUgZGlnaXRhbCBhc3NldHMuIEZyb20gYW4gYW1vdW50LCB5b3UgY2FuIGxlYXJuIHRoZVxuICogYnJhbmQgb2YgZGlnaXRhbCBhc3NldCBhcyB3ZWxsIGFzIFwiaG93IG11Y2hcIiBvciBcImhvdyBtYW55XCIuIEFtb3VudHNcbiAqIGhhdmUgdHdvIHBhcnRzOiBhIGJyYW5kIChsb29zZWx5IHNwZWFraW5nLCB0aGUgdHlwZSBvZiBkaWdpdGFsXG4gKiBhc3NldCkgYW5kIHRoZSB2YWx1ZSAodGhlIGFuc3dlciB0byBcImhvdyBtdWNoXCIpLiBGb3IgZXhhbXBsZSwgaW5cbiAqIHRoZSBwaHJhc2UgXCI1IGJ1Y2tzXCIsIFwiYnVja3NcIiB0YWtlcyB0aGUgcm9sZSBvZiB0aGUgYnJhbmQgYW5kIHRoZVxuICogdmFsdWUgaXMgNS4gQW1vdW50cyBjYW4gZGVzY3JpYmUgZnVuZ2libGUgYW5kIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiBhc3NldHMuIEFtb3VudHMgYXJlIHBhc3MtYnktY29weSBhbmQgY2FuIGJlIG1hZGUgYnkgYW5kIHNlbnQgdG9cbiAqIGFueW9uZS5cbiAqXG4gKiBUaGUgaXNzdWVyIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBvZiB0aGUgYW1vdW50IGluIHBheW1lbnRzXG4gKiBhbmQgcHVyc2VzLiBUaGUgaXNzdWVyIG11c3QgYmUgYWJsZSB0byBkbyB0aGluZ3Mgc3VjaCBhcyBhZGRcbiAqIGRpZ2l0YWwgYXNzZXRzIHRvIGEgcHVyc2UgYW5kIHdpdGhkcmF3IGRpZ2l0YWwgYXNzZXRzIGZyb20gYSBwdXJzZS5cbiAqIFRvIGRvIHNvLCBpdCBtdXN0IGtub3cgaG93IHRvIGFkZCBhbmQgc3VidHJhY3QgZGlnaXRhbCBhc3NldHMuXG4gKiBSYXRoZXIgdGhhbiBoYXJkLWNvZGluZyBhIHBhcnRpY3VsYXIgc29sdXRpb24sIHdlIGNob3NlIHRvXG4gKiBwYXJhbWV0ZXJpemUgdGhlIGlzc3VlciB3aXRoIGEgY29sbGVjdGlvbiBvZiBwb2x5bW9ycGhpYyBmdW5jdGlvbnMsXG4gKiB3aGljaCB3ZSBjYWxsIGBBbW91bnRNYXRoYC4gVGhlc2UgbWF0aCBmdW5jdGlvbnMgaW5jbHVkZSBjb25jZXB0c1xuICogbGlrZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uXG4gKlxuICogV2UgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb25mdXNpb24gYXMgdG8gd2hhdCBraW5kIG9mXG4gKiBhc3NldCB3ZSBhcmUgdXNpbmcuIFRodXMsIEFtb3VudE1hdGggaW5jbHVkZXMgY2hlY2tzIG9mIHRoZVxuICogYGJyYW5kYCwgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0LiBJZlxuICogdGhlIHdyb25nIGJyYW5kIGlzIHVzZWQgaW4gQW1vdW50TWF0aCwgYW4gZXJyb3IgaXMgdGhyb3duIGFuZCB0aGVcbiAqIG9wZXJhdGlvbiBkb2VzIG5vdCBzdWNjZWVkLlxuICpcbiAqIEFtb3VudE1hdGggdXNlcyBtYXRoSGVscGVycyB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLCBidXQgdGhlbiBhZGRzXG4gKiB0aGUgYnJhbmQgdG8gdGhlIHJlc3VsdC4gVGhlIGZ1bmN0aW9uIGB2YWx1ZWAgZ2V0cyB0aGUgdmFsdWUgZnJvbVxuICogdGhlIGFtb3VudCBieSByZW1vdmluZyB0aGUgYnJhbmQgKGFtb3VudCAtPiB2YWx1ZSksIGFuZCB0aGVcbiAqIGZ1bmN0aW9uIGBtYWtlYCBhZGRzIHRoZSBicmFuZCB0byBwcm9kdWNlIGFuIGFtb3VudCAodmFsdWUgLT5cbiAqIGFtb3VudCkuIFRoZSBmdW5jdGlvbiBgY29lcmNlYCB0YWtlcyBhbiBhbW91bnQgYW5kIGNoZWNrcyBpdCxcbiAqIHJldHVybmluZyBhbiBhbW91bnQgKGFtb3VudCAtPiBhbW91bnQpLlxuICpcbiAqIEVhY2ggaXNzdWVyIG9mIGRpZ2l0YWwgYXNzZXRzIGhhcyBhbiBhc3NvY2lhdGVkIGJyYW5kIGluIGFcbiAqIG9uZS10by1vbmUgbWFwcGluZy4gSW4gdW50cnVzdGVkIGNvbnRleHRzLCBzdWNoIGFzIGluIGFuYWx5emluZ1xuICogcGF5bWVudHMgYW5kIGFtb3VudHMsIHdlIGNhbiBnZXQgdGhlIGJyYW5kIGFuZCBmaW5kIHRoZSBpc3N1ZXJcbiAqIHdoaWNoIG1hdGNoZXMgdGhlIGJyYW5kLiBUaGUgaXNzdWVyIGFuZCB0aGUgYnJhbmQgbXV0dWFsbHkgdmFsaWRhdGVcbiAqIGVhY2ggb3RoZXIuXG4gKi9cblxuY29uc3QgaGVscGVycz17XG5uYXQ6bmF0TWF0aEhlbHBlcnMsXG5zZXQ6c2V0TWF0aEhlbHBlcnMsXG5jb3B5U2V0OmNvcHlTZXRNYXRoSGVscGVycyxcbmNvcHlCYWc6Y29weUJhZ01hdGhIZWxwZXJzfTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlIHsodmFsdWU6IFYpID0+IEFzc2V0S2luZEZvclZhbHVlPFY+fVxuICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZD0odmFsdWUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsdWUpO1xuaWYocGFzc1N0eWxlPT09J2JpZ2ludCcpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiduYXQnO1xuIH1cbmlmKHBhc3NTdHlsZT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nc2V0JztcbiB9XG5pZihtYXRjaGVzKHZhbHVlLE0uc2V0KCkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nY29weVNldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLmJhZygpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlCYWcnO1xuIH1cbi8qIFRPRE8gVGhpcyBpc24ndCBxdWl0ZSB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSwgaW4gY2FzZSB2YWx1ZVBhc3NTdHlsZSovXG4vKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbi8qIG9iamVjdCBpdCBpcy4qL1xuLyogQWxzbywgdGhpcyBraW5kIG9mIG1hbnVhbCBsaXN0aW5nIGlzIGEgbWFpbnRlbmFuY2UgaGF6YXJkIHdlKi9cbi8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cbnRocm93IEZhaWwgYHZhbHVlICR7dmFsdWV9IG11c3QgYmUgYSBiaWdpbnQsIGNvcHlTZXQsIGNvcHlCYWcsIG9yIGFuIGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07XG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IHZhbHVlIGlzIGEgdmFsaWQgQW1vdW50TWF0aCBhbmQgcmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgaGVscGVycy5cbiAqXG4gKiBNYWRlIGF2YWlsYWJsZSBvbmx5IGZvciB0ZXN0aW5nLCBidXQgaXQgaXMgaGFybWxlc3MgZm9yIG90aGVyIHVzZXMuXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHBhcmFtIHtWfSB2YWx1ZVxuICogQHJldHVybnMge01hdGhIZWxwZXJzPFY+fVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0VmFsdWVHZXRIZWxwZXJzPSh2YWx1ZSk9PlxuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbmhlbHBlcnNbYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpXTtcblxuLyoqIEB0eXBlIHsoYWxsZWdlZEJyYW5kOiBCcmFuZCwgYnJhbmQ/OiBCcmFuZCkgPT4gdm9pZH0gKi8kaOKAjV9vbmNlLmFzc2VydFZhbHVlR2V0SGVscGVycyhhc3NlcnRWYWx1ZUdldEhlbHBlcnMpO1xuY29uc3Qgb3B0aW9uYWxCcmFuZENoZWNrPShhbGxlZ2VkQnJhbmQsYnJhbmQpPT57XG5pZihicmFuZCE9PXVuZGVmaW5lZCl7XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hbGxlZ2VkQnJhbmQ9PT1icmFuZHx8XG5GYWlsIGBhbW91bnQncyBicmFuZCAke3EoYWxsZWdlZEJyYW5kKX0gZGlkIG5vdCBtYXRjaCBleHBlY3RlZCBicmFuZCAke3EoXG5icmFuZClcbiB9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPiB8IHVuZGVmaW5lZH0gYnJhbmRcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczwqPn1cbiAqL1xuY29uc3QgY2hlY2tMUkFuZEdldEhlbHBlcnM9KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0UmVjb3JkKGxlZnRBbW91bnQsJ2xlZnRBbW91bnQnKTtcbmFzc2VydFJlY29yZChyaWdodEFtb3VudCwncmlnaHRBbW91bnQnKTtcbmNvbnN0e3ZhbHVlOmxlZnRWYWx1ZSxicmFuZDpsZWZ0QnJhbmR9PWxlZnRBbW91bnQ7XG5jb25zdHt2YWx1ZTpyaWdodFZhbHVlLGJyYW5kOnJpZ2h0QnJhbmR9PXJpZ2h0QW1vdW50O1xuYXNzZXJ0UmVtb3RhYmxlKGxlZnRCcmFuZCwnbGVmdEJyYW5kJyk7XG5hc3NlcnRSZW1vdGFibGUocmlnaHRCcmFuZCwncmlnaHRCcmFuZCcpO1xub3B0aW9uYWxCcmFuZENoZWNrKGxlZnRCcmFuZCxicmFuZCk7XG5vcHRpb25hbEJyYW5kQ2hlY2socmlnaHRCcmFuZCxicmFuZCk7XG5sZWZ0QnJhbmQ9PT1yaWdodEJyYW5kfHxcbkZhaWwgYEJyYW5kcyBpbiBsZWZ0ICR7cShsZWZ0QnJhbmQpfSBhbmQgcmlnaHQgJHtxKFxucmlnaHRCcmFuZClcbiB9IHNob3VsZCBtYXRjaCBidXQgZG8gbm90YDtcbmNvbnN0IGxlZnRIZWxwZXJzPWFzc2VydFZhbHVlR2V0SGVscGVycyhsZWZ0VmFsdWUpO1xuY29uc3QgcmlnaHRIZWxwZXJzPWFzc2VydFZhbHVlR2V0SGVscGVycyhyaWdodFZhbHVlKTtcbmxlZnRIZWxwZXJzPT09cmlnaHRIZWxwZXJzfHxcbkZhaWwgYFRoZSBsZWZ0ICR7bGVmdEFtb3VudH0gYW5kIHJpZ2h0IGFtb3VudCAke3JpZ2h0QW1vdW50fSBoYWQgZGlmZmVyZW50IGFzc2V0S2luZHNgO1xucmV0dXJuIGxlZnRIZWxwZXJzO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7TWF0aEhlbHBlcnM8QXNzZXRWYWx1ZUZvcktpbmQ8Sz4+fSBoXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcmV0dXJucyB7W0ssIEtdfVxuICovXG5jb25zdCBjb2VyY2VMUj0oaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KT0+e1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBhcmJpdHJhcnkgc3VidHlwZSovXG5yZXR1cm5baC5kb0NvZXJjZShsZWZ0QW1vdW50LnZhbHVlKSxoLmRvQ29lcmNlKHJpZ2h0QW1vdW50LnZhbHVlKV07XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZVxuICogcmlnaHRBbW91bnQuIFRoZSBub3Rpb24gb2YgXCJncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG9cIiBkZXBlbmRzXG4gKiBvbiB0aGUga2luZCBvZiBhbW91bnQsIGFzIGRlZmluZWQgYnkgdGhlIE1hdGhIZWxwZXJzLiBGb3IgZXhhbXBsZSxcbiAqIHdoZXRoZXIgcmVjdGFuZ2xlIEEgaXMgZ3JlYXRlciB0aGFuIHJlY3RhbmdsZSBCIGRlcGVuZHMgb24gd2hldGhlciByZWN0YW5nbGVcbiAqIEEgaW5jbHVkZXMgcmVjdGFuZ2xlIEIgYXMgZGVmaW5lZCBieSB0aGUgbG9naWMgaW4gTWF0aEhlbHBlcnMuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc0dURT0obGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0dURSguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9O1xuXG4vKipcbiAqIExvZ2ljIGZvciBtYW5pcHVsYXRpbmcgYW1vdW50cy5cbiAqXG4gKiBBbW91bnRzIGFyZSB0aGUgY2Fub25pY2FsIGRlc2NyaXB0aW9uIG9mIHRyYWRhYmxlIGdvb2RzLiBUaGV5IGFyZSBtYW5pcHVsYXRlZFxuICogYnkgaXNzdWVycyBhbmQgbWludHMsIGFuZCByZXByZXNlbnQgdGhlIGdvb2RzIGFuZCBjdXJyZW5jeSBjYXJyaWVkIGJ5IHB1cnNlc1xuICogYW5kXG4gKiBwYXltZW50cy4gVGhleSBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgdGhpbmdzIGxpa2UgY3VycmVuY3ksIHN0b2NrLCBhbmQgdGhlXG4gKiBhYnN0cmFjdCByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgZXhjaGFuZ2UuXG4gKi9cbmNvbnN0IEFtb3VudE1hdGg9e1xuLyoqXG4gKiBNYWtlIGFuIGFtb3VudCBmcm9tIGEgdmFsdWUgYnkgYWRkaW5nIHRoZSBicmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCcmFuZDxLPn0gYnJhbmRcbiAqIEBwYXJhbSB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59IGFsbGVnZWRWYWx1ZVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuLyogYWxsZWdlZFZhbHVlIGhhcyBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gZm9yIHR5cGUgd2lkZW5pbmcsIHRvIHByZXZlbnQgViBiZWluZyBib3VuZCB0byBhIGEgbGl0ZXJhbCBsaWtlIDFuKi9cbm1ha2U6KGJyYW5kLGFsbGVnZWRWYWx1ZSk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmNvbnN0IGg9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFsbGVnZWRWYWx1ZSk7XG5jb25zdCB2YWx1ZT1oLmRvQ29lcmNlKGFsbGVnZWRWYWx1ZSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIE1ha2Ugc3VyZSB0aGlzIGFtb3VudCBpcyB2YWxpZCBlbm91Z2gsIGFuZCByZXR1cm4gYSBjb3JyZXNwb25kaW5nXG4gKiB2YWxpZCBhbW91bnQgaWYgc28uXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYWxsZWdlZEFtb3VudFxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuY29lcmNlOihicmFuZCxhbGxlZ2VkQW1vdW50KT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0UmVjb3JkKGFsbGVnZWRBbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQ6YWxsZWdlZEJyYW5kLHZhbHVlOmFsbGVnZWRWYWx1ZX09YWxsZWdlZEFtb3VudDtcbmJyYW5kPT09YWxsZWdlZEJyYW5kfHxcbkZhaWwgYFRoZSBicmFuZCBpbiB0aGUgYWxsZWdlZEFtb3VudCAke2FsbGVnZWRBbW91bnR9IGluICdjb2VyY2UnIGRpZG4ndCBtYXRjaCB0aGUgc3BlY2lmaWVkIGJyYW5kICR7YnJhbmR9LmA7XG4vKiBXaWxsIHRocm93IG9uIGluYXBwcm9wcmlhdGUgdmFsdWUqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCxhbGxlZ2VkVmFsdWUpO1xuIH0sXG4vKipcbiAqIEV4dHJhY3QgYW5kIHJldHVybiB0aGUgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QXNzZXRWYWx1ZUZvcktpbmQ8Sz59XG4gKi9cbmdldFZhbHVlOihicmFuZCxhbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbW91bnQpLnZhbHVlLFxuLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LiBUaGlzIGlzIHRoZVxuICogaWRlbnRpdHkgZWxlbWVudCBmb3IgTWF0aEhlbHBlcnMuYWRkIGFuZCBNYXRIZWxwZXJzLnN1YnRyYWN0LlxuICpcbiAqIEB0eXBlIHt7XG4gKiAgIChicmFuZDogQnJhbmQpOiBBbW91bnQ8J25hdCc+O1xuICogICA8SyBleHRlbmRzIEFzc2V0S2luZD4oYnJhbmQ6IEJyYW5kLCBhc3NldEtpbmQ6IEspOiBBbW91bnQ8Sz47XG4gKiB9fVxuICovXG5tYWtlRW1wdHk6KGJyYW5kLGFzc2V0S2luZD0vKiogQHR5cGUge2NvbnN0fSAqLyduYXQnKT0+e1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5jb25zdCB2YWx1ZT1oZWxwZXJzW2Fzc2V0S2luZF0uZG9NYWtlRW1wdHkoKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudCwgdXNpbmcgYW5vdGhlclxuICogYW1vdW50IGFzIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGJyYW5kIGFuZCBhc3NldEtpbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBhbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1ha2VFbXB0eUZyb21BbW91bnQ6KGFtb3VudCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQsdmFsdWV9PWFtb3VudDtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5jb25zdCBhc3NldEtpbmQ9YXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbiB9LFxuLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgQW1vdW50IGlzIGVtcHR5LiBPdGhlcndpc2UgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmlzRW1wdHk6KGFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZX09YW1vdW50O1xuYXNzZXJ0UmVtb3RhYmxlKGFsbGVnZWRCcmFuZCwnYnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhhbGxlZ2VkQnJhbmQsYnJhbmQpO1xuY29uc3QgaD1hc3NlcnRWYWx1ZUdldEhlbHBlcnModmFsdWUpO1xucmV0dXJuIGguZG9Jc0VtcHR5KGguZG9Db2VyY2UodmFsdWUpKTtcbiB9LFxuaXNHVEUsXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGVmdEFtb3VudCBlcXVhbHMgdGhlIHJpZ2h0QW1vdW50LiBXZSBhc3N1bWVcbiAqIHRoYXQgaWYgaXNHVEUgaXMgdHJ1ZSBpbiBib3RoIGRpcmVjdGlvbnMsIGlzRXF1YWwgaXMgYWxzbyB0cnVlXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0VxdWFsOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5yZXR1cm4gaC5kb0lzRXF1YWwoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgdW5pb24gb2YgYm90aCBsZWZ0QW1vdW50IGFuZCByaWdodEFtb3VudC5cbiAqXG4gKiBGb3IgZnVuZ2libGUgYW1vdW50IHRoaXMgbWVhbnMgYWRkaW5nIHRoZSB2YWx1ZXMuIEZvciBvdGhlciBraW5kcyBvZlxuICogYW1vdW50LCBpdCB1c3VhbGx5IG1lYW5zIGluY2x1ZGluZyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gYm90aFxuICogbGVmdCBhbmQgcmlnaHQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbmFkZDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb0FkZCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSBsZWZ0QW1vdW50IG1pbnVzIHRoZSByaWdodEFtb3VudFxuICogKGkuZS4gZXZlcnl0aGluZyBpbiB0aGUgbGVmdEFtb3VudCB0aGF0IGlzIG5vdCBpbiB0aGVcbiAqIHJpZ2h0QW1vdW50KS4gSWYgbGVmdEFtb3VudCBkb2Vzbid0IGluY2x1ZGUgcmlnaHRBbW91bnRcbiAqIChzdWJ0cmFjdGlvbiByZXN1bHRzIGluIGEgbmVnYXRpdmUpLCB0aHJvdyAgYW4gZXJyb3IuIEJlY2F1c2UgdGhlXG4gKiBsZWZ0IGFtb3VudCBtdXN0IGluY2x1ZGUgdGhlIHJpZ2h0IGFtb3VudCwgdGhpcyBpcyBOT1QgZXF1aXZhbGVudFxuICogdG8gc2V0IHN1YnRyYWN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5zdWJ0cmFjdDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb1N1YnRyYWN0KC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQ6bGVmdEFtb3VudC5icmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbiB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5taW46KHgseSxicmFuZD11bmRlZmluZWQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5pc0dURSh4LHksYnJhbmQpP1xueTpcbmlzR1RFKHkseCxicmFuZCk/XG54OlxuRmFpbCBgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYCxcbi8qKlxuICogUmV0dXJucyB0aGUgbWF4IHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHlcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IFticmFuZF1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbm1heDooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbmlzR1RFKHgseSxicmFuZCk/XG54OlxuaXNHVEUoeSx4KT9cbnk6XG5GYWlsIGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgfTskaOKAjV9vbmNlLkFtb3VudE1hdGgoQW1vdW50TWF0aCk7XG5cbmhhcmRlbihBbW91bnRNYXRoKTtcblxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50XG4gKi9cbmNvbnN0IGdldEFzc2V0S2luZD0oYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHt2YWx1ZX09YW1vdW50O1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IChpZ25vcmUgYi9jIGVycm9yaW5nIGluIENJIGJ1dCBub3QgbXkgSURFKSovXG5yZXR1cm4gYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuIH07JGjigI1fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFzc2V0S2luZCI6WyJBc3NldEtpbmQiXSwiYXNzZXJ0QXNzZXRLaW5kIjpbImFzc2VydEFzc2V0S2luZCJdLCJBbW91bnRNYXRoIjpbIkFtb3VudE1hdGgiXSwiZ2V0QXNzZXRLaW5kIjpbImdldEFzc2V0S2luZCJdLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiOlsiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEqUAO3VBQAA1QUAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29lcmNlRGlzcGxheUluZm8iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFpbCxtdXN0TWF0Y2gsRGlzcGxheUluZm9TaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkRpc3BsYXlJbmZvU2hhcGVcIiwgWyRo4oCNX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGFsbGVnZWREaXNwbGF5SW5mb1xuICogQHBhcmFtIHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHJldHVybnMge0Rpc3BsYXlJbmZvfVxuICovXG5jb25zdCAgICAgICAgY29lcmNlRGlzcGxheUluZm89KGFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmQpPT57XG5tdXN0TWF0Y2goYWxsZWdlZERpc3BsYXlJbmZvLERpc3BsYXlJbmZvU2hhcGUsJ2Rpc3BsYXlJbmZvJyk7XG5cbmlmKGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQhPT11bmRlZmluZWQpe1xuYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZD09PWFzc2V0S2luZHx8XG5GYWlsIGBkaXNwbGF5SW5mby5hc3NldEtpbmQgd2FzIHByZXNlbnQgKCR7YWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZH0pIGFuZCBkaWQgbm90IG1hdGNoIHRoZSBhc3NldEtpbmQgYXJndW1lbnQgKCR7YXNzZXRLaW5kfSlgO1xuIH1cbmNvbnN0IGRpc3BsYXlJbmZvPWhhcmRlbih7Li4uYWxsZWdlZERpc3BsYXlJbmZvLGFzc2V0S2luZH0pO1xuXG5pZihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzIT09dW5kZWZpbmVkKXtcbk51bWJlci5pc1NhZmVJbnRlZ2VyKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMpfHxcbkZhaWwgYGRlY2ltYWxQbGFjZXMgJHtkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzfSBpcyBub3QgYSBzYWZlIGludGVnZXJgO1xuIH1cblxucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH07JGjigI1fb25jZS5jb2VyY2VEaXNwbGF5SW5mbyhjb2VyY2VEaXNwbGF5SW5mbyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29lcmNlRGlzcGxheUluZm8iOlsiY29lcmNlRGlzcGxheUluZm8iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQzB73OgBAADoAQAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYW1vdW50TWF0aC5qcyIsIi4vaXNzdWVyS2l0LmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA1XcEomCAAAJggAAAlAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2lzc3VlcktpdC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIiwiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbImhhc0lzc3VlciIsIm1ha2VEdXJhYmxlSXNzdWVyS2l0IiwibWFrZUlzc3VlcktpdCIsInByZXBhcmVJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LGFzc2VydFBhdHRlcm4sbWFrZVNjYWxhckJpZ01hcFN0b3JlLEFzc2V0S2luZCxhc3NlcnRBc3NldEtpbmQsY29lcmNlRGlzcGxheUluZm8scHJlcGFyZVBheW1lbnRMZWRnZXI7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0QXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChhc3NlcnRBc3NldEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9kaXNwbGF5SW5mby5qc1wiLCBbW1wiY29lcmNlRGlzcGxheUluZm9cIiwgWyRo4oCNX2EgPT4gKGNvZXJjZURpc3BsYXlJbmZvID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudExlZGdlci5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRMZWRnZXJcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVQYXltZW50TGVkZ2VyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEB0eXBlZGVmIHtvYmplY3R9IElzc3VlclJlY29yZFxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kXG4gKiBAcHJvcGVydHkge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtJc3N1ZXJSZWNvcmQ8Sz59IGlzc3VlclJlY29yZFxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3Qgc2V0dXBJc3N1ZXJLaXQ9KFxue25hbWUsYXNzZXRLaW5kLGRpc3BsYXlJbmZvLGVsZW1lbnRTaGFwZX0sXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5hc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcblxuLyogQWRkIGFzc2V0S2luZCB0byBkaXNwbGF5SW5mbywgb3Igb3ZlcnJpZGUgaWYgcHJlc2VudCovXG5jb25zdCBjbGVhbkRpc3BsYXlJbmZvPWNvZXJjZURpc3BsYXlJbmZvKGRpc3BsYXlJbmZvLGFzc2V0S2luZCk7XG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwnZnVuY3Rpb24nKTtcbiB9XG5cbmlmKGVsZW1lbnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gfVxuXG4vKiBBdHRlbnVhdGUgdGhlIHBvd2VyZnVsIGF1dGhvcml0eSB0byBtaW50IGFuZCBjaGFuZ2UgYmFsYW5jZXMqL1xuLyoqIEB0eXBlIHtQYXltZW50TGVkZ2VyPEs+fSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSBvZiBBc3NldEtpbmQqL1xuY29uc3R7aXNzdWVyLG1pbnQsYnJhbmQsbWludFJlY292ZXJ5UHVyc2V9PXByZXBhcmVQYXltZW50TGVkZ2VyKFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5jbGVhbkRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5icmFuZCxcbmlzc3Vlcixcbm1pbnQsXG5taW50UmVjb3ZlcnlQdXJzZSxcbmRpc3BsYXlJbmZvOmNsZWFuRGlzcGxheUluZm99KTtcblxuIH07XG5oYXJkZW4oc2V0dXBJc3N1ZXJLaXQpO1xuXG4vKiogVGhlIGtleSBhdCB3aGljaCB0aGUgaXNzdWVyIHJlY29yZCBpcyBzdG9yZWQuICovXG5jb25zdCBJTlNUQU5DRV9LRVk9J2lzc3Vlcic7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgaXNzdWVyUmVjb3JkPWlzc3VlckJhZ2dhZ2UuZ2V0KElOU1RBTkNFX0tFWSk7XG5yZXR1cm4gc2V0dXBJc3N1ZXJLaXQoaXNzdWVyUmVjb3JkLGlzc3VlckJhZ2dhZ2Usb3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVJc3N1ZXJLaXQocHJlcGFyZUlzc3VlcktpdCk7XG5oYXJkZW4ocHJlcGFyZUlzc3VlcktpdCk7XG5cbi8qKlxuICogRG9lcyBiYWdnYWdlIGFscmVhZHkgaGF2ZSBhbiBpc3N1ZXIgZnJvbSBwcmVwYXJlSXNzdWVyS2l0KCk/XG4gKiBUaGF0IGlzOiBkb2VzIGl0IGhhdmUgdGhlIHJlbGV2YW50IGtleXMgZGVmaW5lZD9cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuY29uc3QgICAgICAgIGhhc0lzc3Vlcj0oYmFnZ2FnZSk9PmJhZ2dhZ2UuaGFzKElOU1RBTkNFX0tFWSk7XG5cbi8qKlxuICogQHR5cGVkZWYge1BhcnRpYWw8e2VsZW1lbnRTaGFwZTogUGF0dGVybn0+fSBJc3N1ZXJPcHRpb25zUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldCBkZXNjcmlwdGlvbnMuXG4gKiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS5cbiAqIEZvciBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXRcbiAqIGl0IGlzIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmdcbiAqIHRvIHRoYXQgaXNzdWVyIGFuZCBicmFuZC5cbiAqXG4gKiBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVyc1xuICogZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9QXNzZXRLaW5kLk5BVF1cbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBbZGlzcGxheUluZm89e31dXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlsc1xuICogaW4gdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZVxuICogbGFyZ2VyIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93blxuICogYmVmb3JlIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi8kaOKAjV9vbmNlLmhhc0lzc3VlcihoYXNJc3N1ZXIpO1xuY29uc3QgICAgICAgIG1ha2VEdXJhYmxlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBpc3N1ZXJEYXRhPWhhcmRlbih7bmFtZSxhc3NldEtpbmQsZGlzcGxheUluZm8sZWxlbWVudFNoYXBlfSk7XG5pc3N1ZXJCYWdnYWdlLmluaXQoSU5TVEFOQ0VfS0VZLGlzc3VlckRhdGEpO1xucmV0dXJuIHNldHVwSXNzdWVyS2l0KGlzc3VlckRhdGEsaXNzdWVyQmFnZ2FnZSxvcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcbiB9OyRo4oCNX29uY2UubWFrZUR1cmFibGVJc3N1ZXJLaXQobWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuaGFyZGVuKG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9J25hdCddXG4gKiBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0IGRlc2NyaXB0aW9ucy5cbiAqIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqIGFzc3VtcHRpb25zLCBidXQgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIHdydCBhbnkgZXh0ZXJuYWwgbmFtZXNwYWNlLlxuICogRm9yIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dFxuICogaXQgaXMgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZ1xuICogdG8gdGhhdCBpc3N1ZXIgYW5kIGJyYW5kLlxuICpcbiAqIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzXG4gKiBmcm9tIHRoZSBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZVxuICogZGVmYXVsdCwgaXMgdXNlZCBmb3IgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmQ9J25hdCddXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvPXt9XVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUlzc3VlcktpdD0oXG5uYW1lLFxuLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxue2VsZW1lbnRTaGFwZT11bmRlZmluZWR9PXt9KT0+XG5cbm1ha2VEdXJhYmxlSXNzdWVyS2l0KFxubWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLHtkdXJhYmxlOnRydWV9KSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG57ZWxlbWVudFNoYXBlfSk7JGjigI1fb25jZS5tYWtlSXNzdWVyS2l0KG1ha2VJc3N1ZXJLaXQpO1xuXG5oYXJkZW4obWFrZUlzc3VlcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZUlzc3VlcktpdCI6WyJwcmVwYXJlSXNzdWVyS2l0Il0sImhhc0lzc3VlciI6WyJoYXNJc3N1ZXIiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwibWFrZUlzc3VlcktpdCI6WyJtYWtlSXNzdWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIDIbu6zBQAAswUAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5QmFnLG11c3RNYXRjaCxNLGdldENvcHlCYWdFbnRyaWVzLGJhZ0lzU3VwZXJiYWcsYmFnVW5pb24sYmFnRGlzam9pbnRTdWJ0cmFjdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9hID0+IChtYWtlQ29weUJhZyA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5QmFnRW50cmllcyA9ICRo4oCNX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fYSA9PiAoYmFnSXNTdXBlcmJhZyA9ICRo4oCNX2EpXV0sW1wiYmFnVW5pb25cIiwgWyRo4oCNX2EgPT4gKGJhZ1VuaW9uID0gJGjigI1fYSldXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChiYWdEaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weUJhZ30gKi9cbmNvbnN0IGVtcHR5PW1ha2VDb3B5QmFnKFtdKTtcblxuLyoqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weUJhZz59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5QmFnTWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihiYWcpPT57XG5tdXN0TWF0Y2goYmFnLE0uYmFnKCksJ2JhZyBvZiBhbW91bnQnKTtcbnJldHVybiBiYWc7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooYmFnKT0+Z2V0Q29weUJhZ0VudHJpZXMoYmFnKS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpiYWdJc1N1cGVyYmFnLFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6YmFnVW5pb24sXG5kb1N1YnRyYWN0OmJhZ0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLmNvcHlCYWdNYXRoSGVscGVycyhjb3B5QmFnTWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlCYWdNYXRoSGVscGVycyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAcediPccFAADHBQAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQga2V5RVEsbWFrZUNvcHlTZXQsbXVzdE1hdGNoLE0sZ2V0Q29weVNldEtleXMsc2V0SXNTdXBlcnNldCxzZXREaXNqb2ludFVuaW9uLHNldERpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaOKAjV9hKV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2EgPT4gKHNldElzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50VW5pb25cIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50VW5pb24gPSAkaOKAjV9hKV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKHNldERpc2pvaW50U3VidHJhY3QgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtDb3B5U2V0fSAqL1xuY29uc3QgZW1wdHk9bWFrZUNvcHlTZXQoW10pO1xuXG4vKipcbiAqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5U2V0Pn1cbiAqL1xuY29uc3QgICAgICAgIGNvcHlTZXRNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KHNldCk9Pntcbm11c3RNYXRjaChzZXQsTS5zZXQoKSwnc2V0IG9mIGFtb3VudCcpO1xucmV0dXJuIHNldDtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihzZXQpPT5nZXRDb3B5U2V0S2V5cyhzZXQpLmxlbmd0aD09PTAsXG5kb0lzR1RFOnNldElzU3VwZXJzZXQsXG5kb0lzRXF1YWw6a2V5RVEsXG5kb0FkZDpzZXREaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDpzZXREaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5U2V0TWF0aEhlbHBlcnMiOlsiY29weVNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP/csPsqBgAAKgYAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm5hdE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxpc05hdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXSxbXCJpc05hdFwiLCBbJGjigI1fYSA9PiAoaXNOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5jb25zdCBlbXB0eT0wbjtcblxuLyoqXG4gKiBGdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB1c2UgdGhlIG5hdE1hdGhIZWxwZXJzIHRvIG1hbmFnZSBiYWxhbmNlcyAtXG4gKiB0aGUgb3BlcmF0aW9ucyBhcmUgbWVyZWx5IGFyaXRobWV0aWMgb24gbmF0dXJhbCwgbm9uLW5lZ2F0aXZlXG4gKiBudW1iZXJzLlxuICpcbiAqIE5hdHVyYWwgbnVtYmVycyBhcmUgdXNlZCBmb3IgZnVuZ2libGUgZXJpZ2h0cyBzdWNoIGFzIG1vbmV5IGJlY2F1c2VcbiAqIHJvdW5kaW5nIGlzc3VlcyBtYWtlIGZsb2F0cyBwcm9ibGVtYXRpYy4gQWxsIG9wZXJhdGlvbnMgc2hvdWxkIGJlXG4gKiBkb25lIHdpdGggdGhlIHNtYWxsZXN0IHdob2xlIHVuaXQgc3VjaCB0aGF0IHRoZSBgbmF0TWF0aEhlbHBlcnNgIG5ldmVyXG4gKiBkZWFscyB3aXRoIGZyYWN0aW9uYWwgcGFydHMuXG4gKlxuICogQHR5cGUge01hdGhIZWxwZXJzPE5hdFZhbHVlPn1cbiAqL1xuY29uc3QgICAgICAgIG5hdE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobmF0KT0+e1xuLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuYXNzZXJ0LnR5cGVvZihuYXQsJ2JpZ2ludCcpO1xuaXNOYXQobmF0KXx8RmFpbCBgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmA7XG5yZXR1cm4gTmF0KG5hdCk7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eToobmF0KT0+bmF0PT09ZW1wdHksXG5kb0lzR1RFOihsZWZ0LHJpZ2h0KT0+bGVmdD49cmlnaHQsXG5kb0lzRXF1YWw6KGxlZnQscmlnaHQpPT5sZWZ0PT09cmlnaHQsXG4vKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuZG9BZGQ6KGxlZnQscmlnaHQpPT5sZWZ0K3JpZ2h0LFxuZG9TdWJ0cmFjdDoobGVmdCxyaWdodCk9Pk5hdChsZWZ0LXJpZ2h0KX0pOyRo4oCNX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACaZmC+fBwAAnwcAADYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsic2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0S2V5LGVsZW1lbnRzSXNTdXBlcnNldCxlbGVtZW50c0Rpc2pvaW50VW5pb24sZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LGNvZXJjZVRvRWxlbWVudHMsZWxlbWVudHNDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChlbGVtZW50c0lzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY29lcmNlVG9FbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIE9wZXJhdGlvbnMgZm9yIGFycmF5cyB3aXRoIHVuaXF1ZSBvYmplY3RzIGlkZW50aWZ5aW5nIGFuZCBwcm92aWRpbmcqL1xuLyogaW5mb3JtYXRpb24gYWJvdXQgZGlnaXRhbCBhc3NldHMuIFVzZWQgZm9yIFpvZSBpbnZpdGVzLiovXG4vKiogQHR5cGUge1NldFZhbHVlfSAqL1xuY29uc3QgZW1wdHk9aGFyZGVuKFtdKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlIGFycmF5LWJhc2VkIFNldE1hdGggd2l0aCBDb3B5U2V0LWJhc2VkIENvcHlTZXRNYXRoXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8U2V0VmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgc2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihsaXN0KT0+e1xubGlzdD1jb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuLyogQXNzZXJ0IHRoYXQgbGlzdCBjb250YWlucyBvbmx5Ki9cbi8qICogcGFzcy1ieS1jb3B5IHByaW1pdGl2ZXMsKi9cbi8qICogcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnMgY29udGFpbmluZyBrZXlzLCovXG4vKiAqIHJlbW90YWJsZXMuKi9cbmFzc2VydEtleShsaXN0KTtcbnJldHVybiBsaXN0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGxpc3QpPT5wYXNzU3R5bGVPZihsaXN0KT09PSdjb3B5QXJyYXknJiZsaXN0Lmxlbmd0aD09PTAsXG5kb0lzR1RFOmVsZW1lbnRzSXNTdXBlcnNldCxcbmRvSXNFcXVhbDooeCx5KT0+ZWxlbWVudHNDb21wYXJlKHgseSk9PT0wLFxuZG9BZGQ6ZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDplbGVtZW50c0Rpc2pvaW50U3VidHJhY3R9KTskaOKAjV9vbmNlLnNldE1hdGhIZWxwZXJzKHNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRNYXRoSGVscGVycyI6WyJzZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACwOKgfpQQAAKUEAAAjAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHByZXBhcmVFeG9DbGFzczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBQYXltZW50SVxuICogQHJldHVybnMgeygpID0+IFBheW1lbnQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUGF5bWVudEtpbmQ9KGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk9PntcbmNvbnN0IG1ha2VQYXltZW50PXByZXBhcmVFeG9DbGFzcyhcbmlzc3VlckJhZ2dhZ2UsXG4gYCR7bmFtZX0gcGF5bWVudGAsXG5QYXltZW50SSxcbmluaXRFbXB0eSxcbntcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH19KTtcblxuXG5yZXR1cm4gbWFrZVBheW1lbnQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50S2luZChwcmVwYXJlUGF5bWVudEtpbmQpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRLaW5kIjpbInByZXBhcmVQYXltZW50S2luZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAP1+ju6zEAAOsxAAApAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9wYXltZW50LmpzIiwiLi9wdXJzZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLG11c3RNYXRjaCxNLGtleUVRLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByZXBhcmVFeG8scHJvdmlkZSxBbW91bnRNYXRoLHByZXBhcmVQYXltZW50S2luZCxwcmVwYXJlUHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9cIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG8gPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRLaW5kXCIsIFskaOKAjV9hID0+IChwcmVwYXJlUGF5bWVudEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1wicHJlcGFyZVB1cnNlS2luZFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVB1cnNlS2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLCBbJGjigI1fYSA9PiAoQnJhbmRJID0gJGjigI1fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLCBbJGjigI1fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKi9cbmNvbnN0IGFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZT0oYnJhbmQsYXNzZXRLaW5kLGVsZW1lbnRTaGFwZSk9PntcbmxldCB2YWx1ZVNoYXBlO1xuc3dpdGNoKGFzc2V0S2luZCl7XG5jYXNlJ25hdCc6e1xudmFsdWVTaGFwZT1NLm5hdCgpO1xuZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkfHxcbkZhaWwgYEZ1bmdpYmxlIGFzc2V0cyBjYW5ub3QgaGF2ZSBhbiBlbGVtZW50U2hhcGU6ICR7cShlbGVtZW50U2hhcGUpfWA7XG5icmVhaztcbiB9XG5jYXNlJ3NldCc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmFycmF5T2YoTS5hbmQoTS5rZXkoKSxlbGVtZW50U2hhcGUpKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlTZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uc2V0KCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYmFnKCk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uYmFnT2YoZWxlbWVudFNoYXBlKTtcbiB9XG5icmVhaztcbiB9XG5kZWZhdWx0OntcbkZhaWwgYHVuZXhwZWN0ZWQgYXNzZXQga2luZCAke3EoYXNzZXRLaW5kKX1gO1xuIH19XG5cblxuY29uc3QgYW1vdW50U2hhcGU9aGFyZGVuKHtcbmJyYW5kLC8qIG1hdGNoZXMgb25seSB0aGlzIGV4YWN0IGJyYW5kKi9cbnZhbHVlOnZhbHVlU2hhcGV9KTtcblxucmV0dXJuIGFtb3VudFNoYXBlO1xuIH07XG5cbi8qKlxuICogTWFrZSB0aGUgcGF5bWVudExlZGdlciwgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGJhbGFuY2VzIG9mXG4gKiBwYXltZW50cy4gQWxsIG1pbnRpbmcgYW5kIHRyYW5zZmVyIGF1dGhvcml0eSBvcmlnaW5hdGVzIGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge0Rpc3BsYXlJbmZvPEs+fSBkaXNwbGF5SW5mb1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdXG4gKiBAcmV0dXJucyB7UGF5bWVudExlZGdlcjxLPn1cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVQYXltZW50TGVkZ2VyPShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5lbGVtZW50U2hhcGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuLyoqIEB0eXBlIHtCcmFuZDxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIGNhbGxXaGVuKi9cbmNvbnN0IGJyYW5kPXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gYnJhbmRgLEJyYW5kSSx7XG5pc015SXNzdWVyKGFsbGVnZWRJc3N1ZXIpe1xuLyogQnJhbmRJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBhbGxlZ2VkSXNzdWVyYCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gYWxsZWdlZElzc3Vlcj09PWlzc3VlcjtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG4vKiBHaXZlIGluZm9ybWF0aW9uIHRvIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuKi9cbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbmdldEFtb3VudFNoYXBlKCl7XG5yZXR1cm4gYW1vdW50U2hhcGU7XG4gfX0pO1xuXG5cbmNvbnN0IGFtb3VudFNoYXBlPWFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZShcbmJyYW5kLFxuYXNzZXRLaW5kLFxuZWxlbWVudFNoYXBlKTtcblxuXG5jb25zdHtJc3N1ZXJJLE1pbnRJLFBheW1lbnRJLFB1cnNlSUtpdH09bWFrZUlzc3VlckludGVyZmFjZXMoXG5icmFuZCxcbmFzc2V0S2luZCxcbmFtb3VudFNoYXBlKTtcblxuXG5jb25zdCBtYWtlUGF5bWVudD1wcmVwYXJlUGF5bWVudEtpbmQoaXNzdWVyQmFnZ2FnZSxuYW1lLGJyYW5kLFBheW1lbnRJKTtcblxuLyoqIEB0eXBlIHtTaHV0ZG93bldpdGhGYWlsdXJlfSAqL1xuY29uc3Qgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZT0ocmVhc29uKT0+e1xuLyogVE9ETyBUaGlzIHNob3VsZCBhbHNvIGRlc3Ryb3kgbGVkZ2VyIHN0YXRlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0Ki9cbmlmKG9wdFNodXRkb3duV2l0aEZhaWx1cmUhPT11bmRlZmluZWQpe1xudHJ5e1xub3B0U2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pO1xuIH1jYXRjaChlcnJJblNodXRkb3duKXtcbmFzc2VydC5ub3RlKGVyckluU2h1dGRvd24sWCBgQ2F1c2VkIGJ5OiAke3JlYXNvbn1gKTtcbnRocm93IGVyckluU2h1dGRvd247XG4gfVxuIH1cbnRocm93IHJlYXNvbjtcbiB9O1xuXG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBBbW91bnQ+fSAqL1xuY29uc3QgcGF5bWVudExlZGdlcj1wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShcbmlzc3VlckJhZ2dhZ2UsXG4ncGF5bWVudExlZGdlcicsXG57dmFsdWVTaGFwZTphbW91bnRTaGFwZX0pO1xuXG5cbi8qKlxuICogQSB3aXRoZHJhd24gbGl2ZSBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVjb3Zlcnkgc2V0IG9mXG4gKiB0aGUgcHVyc2UgaXQgd2FzIHdpdGhkcmF3biBmcm9tLiBMZXQncyBjYWxsIHRoZXNlIFwicmVjb3ZlcmFibGVcIlxuICogcGF5bWVudHMuIEFsbCByZWNvdmVyYWJsZSBwYXltZW50cyBhcmUgbGl2ZSwgYnV0IG5vdCBhbGwgbGl2ZVxuICogcGF5bWVudHMgYXJlIHJlY292ZXJhYmxlLiBXZSBkbyB0aGUgYm9va2tlZXBpbmcgZm9yIHBheW1lbnQgcmVjb3ZlcnlcbiAqIHdpdGggdGhpcyB3ZWFrbWFwIGZyb20gcmVjb3ZlcmFibGUgcGF5bWVudHMgdG8gdGhlIHJlY292ZXJ5IHNldCB0aGV5IGFyZVxuICogaW4uXG4gKiBBIGJ1bmNoIG9mIGludGVyZXN0aW5nIGludmFyaWFudHMgaGVyZTpcbiAqICAgICogRXZlcnkgcGF5bWVudCB0aGF0IGlzIGEga2V5IGluIHRoZSBvdXRlciBgcGF5bWVudFJlY292ZXJ5U2V0c2BcbiAqICAgICAgd2Vha01hcCBpcyBhbHNvIGluIHRoZSByZWNvdmVyeSBzZXQgaW5kZXhlZCBieSB0aGF0IHBheW1lbnQuXG4gKiAgICAqIEltcGxpZWQgYnkgdGhlIGFib3ZlIGJ1dCB3b3J0aCBzdGF0aW5nOiB0aGUgcGF5bWVudCBpcyBvbmx5XG4gKiAgICAgIGluIGF0IG1vc3Qgb25lIHJlY292ZXJ5IHNldC5cbiAqICAgICogQSByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBzdWNoIHBheW1lbnRzLlxuICogICAgKiBFdmVyeSBwdXJzZSBpcyBhc3NvY2lhdGVkIHdpdGggZXhhY3RseSBvbmUgcmVjb3Zlcnkgc2V0IHVuaXF1ZSB0b1xuICogICAgICBpdC5cbiAqICAgICogQSBwdXJzZSdzIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tXG4gKiAgICAgIHRoYXQgcHVyc2UgYW5kIG5vdCB5ZXQgY29uc3VtZWQuXG4gKlxuICogQHR5cGUge1dlYWtNYXBTdG9yZTxQYXltZW50LCBTZXRTdG9yZTxQYXltZW50Pj59XG4gKi9cbmNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHM9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRSZWNvdmVyeVNldHMnKTtcblxuXG4vKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgaW5pdFBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmluaXRgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gW29wdFJlY292ZXJ5U2V0XVxuICovXG5jb25zdCBpbml0UGF5bWVudD0ocGF5bWVudCxhbW91bnQsb3B0UmVjb3ZlcnlTZXQ9dW5kZWZpbmVkKT0+e1xuaWYob3B0UmVjb3ZlcnlTZXQhPT11bmRlZmluZWQpe1xub3B0UmVjb3ZlcnlTZXQuYWRkKHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5pbml0KHBheW1lbnQsb3B0UmVjb3ZlcnlTZXQpO1xuIH1cbnBheW1lbnRMZWRnZXIuaW5pdChwYXltZW50LGFtb3VudCk7XG4gfTtcblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGRlbGV0ZVBheW1lbnRgIHNob3VsZCBjb250YWluIHRoZSBvbmx5XG4gKiBjYWxsIHRvIGBwYXltZW50TGVkZ2VyLmRlbGV0ZWAuXG4gKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKi9cbmNvbnN0IGRlbGV0ZVBheW1lbnQ9KHBheW1lbnQpPT57XG5wYXltZW50TGVkZ2VyLmRlbGV0ZShwYXltZW50KTtcbmlmKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKXtcbmNvbnN0IHJlY292ZXJ5U2V0PXBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG5yZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gfVxuIH07XG5cbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IGFkZD0obGVmdCxyaWdodCk9PkFtb3VudE1hdGguYWRkKGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsobGVmdDogQW1vdW50LCByaWdodDogQW1vdW50KSA9PiBBbW91bnQgfSAqL1xuY29uc3Qgc3VidHJhY3Q9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLnN1YnRyYWN0KGxlZnQscmlnaHQsYnJhbmQpO1xuLyoqIEB0eXBlIHsoYWxsZWdlZEFtb3VudDogQW1vdW50KSA9PiBBbW91bnR9ICovXG5jb25zdCBjb2VyY2U9KGFsbGVnZWRBbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbGxlZ2VkQW1vdW50KTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gYm9vbGVhbiB9ICovXG5cbi8qKlxuICogTWV0aG9kcyBsaWtlIGRlcG9zaXQoKSBoYXZlIGFuIG9wdGlvbmFsIHNlY29uZCBwYXJhbWV0ZXJcbiAqIGBvcHRBbW91bnRTaGFwZWBcbiAqIHdoaWNoLCBpZiBwcmVzZW50LCBpcyBzdXBwb3NlZCB0byBtYXRjaCB0aGUgYmFsYW5jZSBvZiB0aGVcbiAqIHBheW1lbnQuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGRvZXMgdGhhdCBjaGVjay5cbiAqXG4gKiBOb3RlOiBgb3B0QW1vdW50U2hhcGVgIGlzIHVzZXItc3VwcGxpZWQgd2l0aCBubyBwcmV2aW91cyB2YWxpZGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBwYXltZW50QmFsYW5jZVxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgYXNzZXJ0QW1vdW50Q29uc2lzdGVudD0ocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpPT57XG5pZihvcHRBbW91bnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2gocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUsJ2Ftb3VudCcpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydExpdmVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5oYXMocGF5bWVudCl8fFxuRmFpbCBgJHtwYXltZW50fSB3YXMgbm90IGEgbGl2ZSBwYXltZW50IGZvciBicmFuZCAke3EoXG5icmFuZClcbiB9LiBJdCBjb3VsZCBiZSBhIHVzZWQtdXAgcGF5bWVudCwgYSBwYXltZW50IGZvciBhbm90aGVyIGJyYW5kLCBvciBpdCBtaWdodCBub3QgYmUgYSBwYXltZW50IGF0IGFsbC5gO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2UuZGVwb3NpdFxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSBkZXBvc2l0XG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtQYXltZW50fSBzcmNQYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cbmNvbnN0IGRlcG9zaXRJbnRlcm5hbD0oXG5jdXJyZW50QmFsYW5jZSxcbnVwZGF0ZVB1cnNlQmFsYW5jZSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZT11bmRlZmluZWQpPT5cbntcbiFpc1Byb21pc2Uoc3JjUGF5bWVudCl8fFxuYXNzZXJ0LmZhaWwoXG4gYGRlcG9zaXQgZG9lcyBub3QgYWNjZXB0IHByb21pc2VzIGFzIGZpcnN0IGFyZ3VtZW50LiBJbnN0ZWFkIG9mIHBhc3NpbmcgdGhlIHByb21pc2UgKGRlcG9zaXQocGF5bWVudFByb21pc2UpKSwgY29uc2lkZXIgdW53cmFwcGluZyB0aGUgcHJvbWlzZSBmaXJzdDogRS53aGVuKHBheW1lbnRQcm9taXNlLCAoYWN0dWFsUGF5bWVudCA9PiBkZXBvc2l0KGFjdHVhbFBheW1lbnQpKWAsXG5UeXBlRXJyb3IpO1xuXG5hc3NlcnRMaXZlUGF5bWVudChzcmNQYXltZW50KTtcbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHNyY1BheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChzcmNQYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG5jb25zdCBuZXdQdXJzZUJhbGFuY2U9YWRkKHNyY1BheW1lbnRCYWxhbmNlLGN1cnJlbnRCYWxhbmNlKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCovXG4vKiBNb3ZlIHRoZSBhc3NldHMgaW4gYHNyY1BheW1lbnRgIGludG8gdGhpcyBwdXJzZSwgdXNpbmcgdXAgdGhlKi9cbi8qIHNvdXJjZSBwYXltZW50LCBzdWNoIHRoYXQgdG90YWwgYXNzZXRzIGFyZSBjb25zZXJ2ZWQuKi9cbmRlbGV0ZVBheW1lbnQoc3JjUGF5bWVudCk7XG51cGRhdGVQdXJzZUJhbGFuY2UobmV3UHVyc2VCYWxhbmNlKTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gfTtcblxuLyoqXG4gKiBVc2VkIGJ5IHRoZSBwdXJzZSBjb2RlIHRvIGltcGxlbWVudCBwdXJzZS53aXRoZHJhd1xuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBjdXJyZW50QmFsYW5jZSAtIHRoZSBjdXJyZW50IGJhbGFuY2Ugb2YgdGhlIHB1cnNlXG4gKiBiZWZvcmUgYSB3aXRoZHJhd2FsXG4gKiBAcGFyYW0geyhuZXdQdXJzZUJhbGFuY2U6IEFtb3VudCkgPT4gdm9pZH0gdXBkYXRlUHVyc2VCYWxhbmNlIC1cbiAqIGNvbW1pdCB0aGUgcHVyc2UgYmFsYW5jZVxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAtIHRoZSBhbW91bnQgdG8gYmUgd2l0aGRyYXduXG4gKiBAcGFyYW0ge1NldFN0b3JlPFBheW1lbnQ+fSByZWNvdmVyeVNldFxuICogQHJldHVybnMge1BheW1lbnR9XG4gKi9cbmNvbnN0IHdpdGhkcmF3SW50ZXJuYWw9KFxuY3VycmVudEJhbGFuY2UsXG51cGRhdGVQdXJzZUJhbGFuY2UsXG5hbW91bnQsXG5yZWNvdmVyeVNldCk9Plxue1xuYW1vdW50PWNvZXJjZShhbW91bnQpO1xuQW1vdW50TWF0aC5pc0dURShjdXJyZW50QmFsYW5jZSxhbW91bnQpfHxcbkZhaWwgYFdpdGhkcmF3YWwgb2YgJHthbW91bnR9IGZhaWxlZCBiZWNhdXNlIHRoZSBwdXJzZSBvbmx5IGNvbnRhaW5lZCAke2N1cnJlbnRCYWxhbmNlfWA7XG5jb25zdCBuZXdQdXJzZUJhbGFuY2U9c3VidHJhY3QoY3VycmVudEJhbGFuY2UsYW1vdW50KTtcblxuY29uc3QgcGF5bWVudD1tYWtlUGF5bWVudCgpO1xudHJ5e1xuLyogQ09NTUlUIFBPSU5UIE1vdmUgdGhlIHdpdGhkcmF3biBhc3NldHMgZnJvbSB0aGlzIHB1cnNlIGludG8qL1xuLyogcGF5bWVudC4gVG90YWwgYXNzZXRzIG11c3QgcmVtYWluIGNvbnNlcnZlZC4qL1xudXBkYXRlUHVyc2VCYWxhbmNlKG5ld1B1cnNlQmFsYW5jZSk7XG5pbml0UGF5bWVudChwYXltZW50LGFtb3VudCxyZWNvdmVyeVNldCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnQ7XG4gfTtcblxuY29uc3QgbWFrZUVtcHR5UHVyc2U9cHJlcGFyZVB1cnNlS2luZChcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5oYXJkZW4oe1xuZGVwb3NpdEludGVybmFsLFxud2l0aGRyYXdJbnRlcm5hbH0pKTtcblxuXG5cbi8qKiBAdHlwZSB7SXNzdWVyPEs+fSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0IGR1ZSB0byBjYWxsV2hlbiBkaXNjcmVwYW5jeSovXG5jb25zdCBpc3N1ZXI9cHJlcGFyZUV4byhpc3N1ZXJCYWdnYWdlLCBgJHtuYW1lfSBpc3N1ZXJgLElzc3Vlckkse1xuZ2V0QnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG5nZXRBc3NldEtpbmQoKXtcbnJldHVybiBhc3NldEtpbmQ7XG4gfSxcbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbm1ha2VFbXB0eVB1cnNlKCl7XG5yZXR1cm4gbWFrZUVtcHR5UHVyc2UoKTtcbiB9LFxuLyoqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudCBhd2FpdGVkIGJ5IGNhbGxXaGVuICovXG5pc0xpdmUocGF5bWVudCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5yZXR1cm4gcGF5bWVudExlZGdlci5oYXMocGF5bWVudCk7XG4gfSxcbi8qKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlbiAqL1xuZ2V0QW1vdW50T2YocGF5bWVudCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbnJldHVybiBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiB9LFxuLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlblxuICogQHBhcmFtIHtQYXR0ZXJufSBvcHRBbW91bnRTaGFwZVxuICovXG5idXJuKHBheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbi8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbmFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xuY29uc3QgcGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVC4qL1xuZGVsZXRlUGF5bWVudChwYXltZW50KTtcbiB9Y2F0Y2goZXJyKXtcbnNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gcGF5bWVudEJhbGFuY2U7XG4gfX0pO1xuXG5cbi8qKlxuICogUHJvdmlkZXMgZm9yIHRoZSByZWNvdmVyeSBvZiBuZXdseSBtaW50ZWQgYnV0IG5vdC15ZXQtZGVwb3NpdGVkIHBheW1lbnRzLlxuICpcbiAqIEJlY2F1c2UgdGhlIGBtaW50UmVjb3ZlcnlQdXJzZWAgaXMgcGxhY2VkIGluIGJhZ2dhZ2UsIGV2ZW4gaWYgdGhlXG4gKiBjYWxsZXIgb2YgYG1ha2VJc3N1ZXJLaXRgIGRyb3BzIGl0IG9uIHRoZSBmbG9vciwgaXQgY2FuIHN0aWxsIGJlXG4gKiByZWNvdmVyZWQgaW4gYW4gZW1lcmdlbmN5IHVwZ3JhZGUuXG4gKlxuICogQHR5cGUge1B1cnNlPEs+fVxuICovXG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZT1wcm92aWRlKGlzc3VlckJhZ2dhZ2UsJ21pbnRSZWNvdmVyeVB1cnNlJywoKT0+XG5tYWtlRW1wdHlQdXJzZSgpKTtcblxuXG4vKiogQHR5cGUge01pbnQ8Sz59ICovXG5jb25zdCBtaW50PXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gbWludGAsTWludEkse1xuZ2V0SXNzdWVyKCl7XG5yZXR1cm4gaXNzdWVyO1xuIH0sXG5taW50UGF5bWVudChuZXdBbW91bnQpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjaGVja2VkIGNhc3QqL1xubmV3QW1vdW50PWNvZXJjZShuZXdBbW91bnQpO1xubXVzdE1hdGNoKG5ld0Ftb3VudCxhbW91bnRTaGFwZSwnbWludGVkIGFtb3VudCcpO1xuLyogYHJhd1BheW1lbnRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHJlY292ZXJ5IHNldCwgYW5kKi9cbi8qIHNvIG11c3Qgbm90IGVzY2FwZS4qL1xuY29uc3QgcmF3UGF5bWVudD1tYWtlUGF5bWVudCgpO1xuaW5pdFBheW1lbnQocmF3UGF5bWVudCxuZXdBbW91bnQsdW5kZWZpbmVkKTtcblxuY29uc3QgbWludFJlY292ZXJ5UHVyc2VCZWZvcmU9bWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xubWludFJlY292ZXJ5UHVyc2UuZGVwb3NpdChyYXdQYXltZW50LG5ld0Ftb3VudCk7XG5jb25zdCBwYXltZW50PW1pbnRSZWNvdmVyeVB1cnNlLndpdGhkcmF3KG5ld0Ftb3VudCk7XG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyPW1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbmFzc2VydChrZXlFUShtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSxtaW50UmVjb3ZlcnlQdXJzZUFmdGVyKSk7XG5yZXR1cm4gcGF5bWVudDtcbiB9fSk7XG5cblxuY29uc3QgaXNzdWVyS2l0PWhhcmRlbih7aXNzdWVyLG1pbnQsYnJhbmQsbWludFJlY292ZXJ5UHVyc2V9KTtcbnJldHVybiBpc3N1ZXJLaXQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50TGVkZ2VyKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudExlZGdlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRMZWRnZXIiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAokVFQsAPAADADwAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUHVyc2VLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0scHJlcGFyZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxBbW91bnRNYXRoLG1ha2VUcmFuc2llbnROb3RpZmllcktpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiLi90cmFuc2llbnROb3RpZmllci5qc1wiLCBbW1wibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgcHJlcGFyZVB1cnNlS2luZD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxucHVyc2VNZXRob2RzKT0+XG57XG5jb25zdCBhbW91bnRTaGFwZT1icmFuZC5nZXRBbW91bnRTaGFwZSgpO1xuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3R7cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZTp1cGRhdGVCYWxhbmNlfT1tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQoKTtcblxuY29uc3QgdXBkYXRlUHVyc2VCYWxhbmNlPShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UscHVyc2UpPT57XG5zdGF0ZS5jdXJyZW50QmFsYW5jZT1uZXdQdXJzZUJhbGFuY2U7XG51cGRhdGVCYWxhbmNlKHB1cnNlLHB1cnNlLmdldEN1cnJlbnRBbW91bnQoKSk7XG4gfTtcblxuLyogLSBUaGlzIGtpbmQgaXMgYSBwYWlyIG9mIHB1cnNlIGFuZCBkZXBvc2l0RmFjZXQgdGhhdCBoYXZlIGEgMToxKi9cbi8qIGNvcnJlc3BvbmRlbmNlLiovXG4vKiAtIFRoZXkgYXJlIHZpcnR1YWxpemVkIHRvZ2V0aGVyIHRvIHNoYXJlIGEgc2luZ2xlIHN0YXRlIHJlY29yZC4qL1xuLyogLSBBbiBhbHRlcm5hdGl2ZSBkZXNpZ24gY29uc2lkZXJlZCB3YXMgdG8gaGF2ZSB0aGlzIHJldHVybiBhIFB1cnNlIGFsb25lKi9cbi8qIHRoYXQgY3JlYXRlZCBkZXBvc2l0RmFjZXQgYXMgbmVlZGVkLiBCdXQgdGhpcyBhcHByb2FjaCBlbnN1cmVzIGEgY29uc3RhbnQqL1xuLyogaWRlbnRpdHkgZm9yIHRoZSBmYWNldCBhbmQgZXhlcmNpc2VzIHRoZSBtdWx0aS1mYWNldGVkIG9iamVjdCBzdHlsZS4qL1xuY29uc3R7ZGVwb3NpdEludGVybmFsLHdpdGhkcmF3SW50ZXJuYWx9PXB1cnNlTWV0aG9kcztcbmNvbnN0IG1ha2VQdXJzZUtpdD1wcmVwYXJlRXhvQ2xhc3NLaXQoXG5pc3N1ZXJCYWdnYWdlLFxuIGAke25hbWV9IFB1cnNlYCxcblB1cnNlSUtpdCxcbigpPT57XG5jb25zdCBjdXJyZW50QmFsYW5jZT1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuXG4vKiogQHR5cGUge1NldFN0b3JlPFBheW1lbnQ+fSAqL1xuY29uc3QgcmVjb3ZlcnlTZXQ9bWFrZVNjYWxhckJpZ1NldFN0b3JlKCdyZWNvdmVyeSBzZXQnLHtcbmR1cmFibGU6dHJ1ZX0pO1xuXG5cbnJldHVybntcbmN1cnJlbnRCYWxhbmNlLFxucmVjb3ZlcnlTZXR9O1xuXG4gfSxcbntcbnB1cnNlOntcbmRlcG9zaXQoc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbi8qIFNlZSB0aGUgY29tbWVudHMgb24gUHVyc2VJLmRlcG9zaXQgaW4gdHlwZUd1YXJkcy5qcyovXG5jb25zdHtzdGF0ZX09dGhpcztcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBkZXBvc2l0LiovXG5yZXR1cm4gZGVwb3NpdEludGVybmFsKFxuc3RhdGUuY3VycmVudEJhbGFuY2UsXG4obmV3UHVyc2VCYWxhbmNlKT0+XG51cGRhdGVQdXJzZUJhbGFuY2Uoc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHRoaXMuZmFjZXRzLnB1cnNlKSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZSk7XG5cbiB9LFxud2l0aGRyYXcoYW1vdW50KXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIHdpdGhkcmF3LiovXG5yZXR1cm4gd2l0aGRyYXdJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5hbW91bnQsXG5zdGF0ZS5yZWNvdmVyeVNldCk7XG5cbiB9LFxuZ2V0Q3VycmVudEFtb3VudCgpe1xucmV0dXJuIHRoaXMuc3RhdGUuY3VycmVudEJhbGFuY2U7XG4gfSxcbmdldEN1cnJlbnRBbW91bnROb3RpZmllcigpe1xucmV0dXJuIHByb3ZpZGVOb3RpZmllcih0aGlzLmZhY2V0cy5wdXJzZSk7XG4gfSxcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZ2V0RGVwb3NpdEZhY2V0KCl7XG5yZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuIH0sXG5cbmdldFJlY292ZXJ5U2V0KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5yZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuIH0sXG5yZWNvdmVyQWxsKCl7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5sZXQgYW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5mb3IoY29uc3QgcGF5bWVudCBvZiBzdGF0ZS5yZWNvdmVyeVNldC5rZXlzKCkpe1xuLyogVGhpcyBkb2VzIGNhdXNlIGRlbGV0aW9ucyBmcm9tIHRoZSBzZXQgd2hpbGUgaXRlcmF0aW5nLCovXG4vKiBidXQgdGhpcyBzcGVjaWFsIGNhc2UgaXMgYWxsb3dlZC4qL1xuY29uc3QgZGVsdGE9ZmFjZXRzLnB1cnNlLmRlcG9zaXQocGF5bWVudCk7XG5hbW91bnQ9QW1vdW50TWF0aC5hZGQoYW1vdW50LGRlbHRhLGJyYW5kKTtcbiB9XG5zdGF0ZS5yZWNvdmVyeVNldC5nZXRTaXplKCk9PT0wfHxcbkZhaWwgYGludGVybmFsOiBSZW1haW5pbmcgdW5yZWNvdmVyZWQgcGF5bWVudHM6ICR7ZmFjZXRzLnB1cnNlLmdldFJlY292ZXJ5U2V0KCl9YDtcbnJldHVybiBhbW91bnQ7XG4gfX0sXG5cbmRlcG9zaXRGYWNldDp7XG5yZWNlaXZlKC4uLmFyZ3Mpe1xucmV0dXJuIHRoaXMuZmFjZXRzLnB1cnNlLmRlcG9zaXQoLi4uYXJncyk7XG4gfX19LFxuXG5cbntcbnN0YXRlU2hhcGU6e1xuY3VycmVudEJhbGFuY2U6YW1vdW50U2hhcGUsXG5yZWNvdmVyeVNldDpNLnJlbW90YWJsZSgncmVjb3ZlcnlTZXQnKX19KTtcblxuXG5cbnJldHVybigpPT5tYWtlUHVyc2VLaXQoKS5wdXJzZTtcbiB9OyRo4oCNX29uY2UucHJlcGFyZVB1cnNlS2luZChwcmVwYXJlUHVyc2VLaW5kKTtcbmhhcmRlbihwcmVwYXJlUHVyc2VLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUHVyc2VLaW5kIjpbInByZXBhcmVQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALkljqRQGAAAUBgAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3QgICAgICAgIG1ha2VUcmFuc2llbnROb3RpZmllcktpdD0oKT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UHVyc2UsIE5vdGlmaWVyUmVjb3JkPGFueT4+fSAqL1xuY29uc3QgdHJhbnNpZW50Tm90aWZlcktpdHM9bWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShcbid0cmFuc2llbnROb3RpZmVyS2l0cycpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcktpdD0oa2V5KT0+XG5wcm92aWRlTGF6eSh0cmFuc2llbnROb3RpZmVyS2l0cyxrZXksKCk9PlxubWFrZU5vdGlmaWVyS2l0KGtleS5nZXRDdXJyZW50QW1vdW50KCkpKTtcblxuXG5jb25zdCBwcm92aWRlTm90aWZpZXI9KGtleSk9PnByb3ZpZGVOb3RpZmllcktpdChrZXkpLm5vdGlmaWVyO1xuY29uc3QgdXBkYXRlPShrZXksbmV3VmFsdWUpPT57XG5pZih0cmFuc2llbnROb3RpZmVyS2l0cy5oYXMoa2V5KSl7XG5jb25zdHt1cGRhdGVyfT10cmFuc2llbnROb3RpZmVyS2l0cy5nZXQoa2V5KTtcbnVwZGF0ZXIudXBkYXRlU3RhdGUobmV3VmFsdWUpO1xuIH1cbiB9O1xuXG5yZXR1cm57cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZX07XG4gfTskaOKAjV9vbmNlLm1ha2VUcmFuc2llbnROb3RpZmllcktpdChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xuaGFyZGVuKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAo7p4+EicAABInAAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIkFtb3VudFNoYXBlIiwiQXNzZXRLaW5kU2hhcGUiLCJCcmFuZEkiLCJCcmFuZFNoYXBlIiwiRGVwb3NpdEZhY2V0U2hhcGUiLCJEaXNwbGF5SW5mb1NoYXBlIiwiSXNzdWVyS2l0U2hhcGUiLCJJc3N1ZXJTaGFwZSIsIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyIsIk1pbnRTaGFwZSIsIk5vdGlmaWVyU2hhcGUiLCJQYXltZW50U2hhcGUiLCJQdXJzZVNoYXBlIiwiUmF0aW9TaGFwZSIsImlzQ29weUJhZ1ZhbHVlIiwiaXNDb3B5U2V0VmFsdWUiLCJpc05hdFZhbHVlIiwiaXNTZXRWYWx1ZSIsIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0sbWF0Y2hlczskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdCAgICAgICAgQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgnQnJhbmQnKTskaOKAjV9vbmNlLkJyYW5kU2hhcGUoQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgSXNzdWVyU2hhcGU9TS5yZW1vdGFibGUoJ0lzc3VlcicpOyRo4oCNX29uY2UuSXNzdWVyU2hhcGUoSXNzdWVyU2hhcGUpO1xuY29uc3QgICAgICAgIFBheW1lbnRTaGFwZT1NLnJlbW90YWJsZSgnUGF5bWVudCcpOyRo4oCNX29uY2UuUGF5bWVudFNoYXBlKFBheW1lbnRTaGFwZSk7XG5jb25zdCAgICAgICAgUHVyc2VTaGFwZT1NLnJlbW90YWJsZSgnUHVyc2UnKTskaOKAjV9vbmNlLlB1cnNlU2hhcGUoUHVyc2VTaGFwZSk7XG5jb25zdCAgICAgICAgRGVwb3NpdEZhY2V0U2hhcGU9TS5yZW1vdGFibGUoJ0RlcG9zaXRGYWNldCcpOyRo4oCNX29uY2UuRGVwb3NpdEZhY2V0U2hhcGUoRGVwb3NpdEZhY2V0U2hhcGUpO1xuY29uc3QgICAgICAgIE5vdGlmaWVyU2hhcGU9TS5yZW1vdGFibGUoJ05vdGlmaWVyJyk7JGjigI1fb25jZS5Ob3RpZmllclNoYXBlKE5vdGlmaWVyU2hhcGUpO1xuY29uc3QgICAgICAgIE1pbnRTaGFwZT1NLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBOYXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzXG4gKiBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGF0IG1hbnkgdW5pdHMgb2YgdGhlXG4gKiBmdW5naWJsZSBhc3NldCByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudC4gVGhlIGJyYW5kIG9mIHRoYXQgYW1vdW50XG4gKiBzaG91bGQgaW5kZWVkIHJlcHJlc2VudCBhIGtpbmQgb2YgYXNzZXQgY29uc2lzdGluZyBvZiBhIGNvdW50YWJsZVxuICogc2V0IG9mIGZ1bmdpYmxlIHVuaXRzLlxuICovJGjigI1fb25jZS5NaW50U2hhcGUoTWludFNoYXBlKTtcbmNvbnN0IE5hdFZhbHVlU2hhcGU9TS5uYXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgQ29weVNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weVNldCwgdGhlbiBpdCByZXByZXNlbnRzIHRoZSBzZXQgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIG5vbi1mdW5naWJsZVxuICogaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LCBmcm9tIHRoZSBub24tZnVuZ2libGUgYXNzZXQgY2xhc3NcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBhbW91bnQgaXRzZWxmIHJlcHJlc2VudHNcbiAqIHRoZSBzZXQgb2YgdGhlc2UgaXRlbXMsIGFzIG9wcG9zZWQgdG8gYW55IG9mIHRoZSBvdGhlciBpdGVtc1xuICogZnJvbSB0aGUgc2FtZSBhc3NldCBjbGFzcy5cbiAqXG4gKiBJZiBhIGdpdmVuIHZhbHVlIGNsYXNzIHJlcHJlc2VudHMgY29uY2VydCB0aWNrZXRzLCBpdCBzZWVtcyBiaXphcnJlXG4gKiB0aGF0IHdlIGNhbiBmb3JtIGFtb3VudHMgb2YgYW55IGtleS4gVGhlIGhhcmQgY29uc3RyYWludCBpcyB0aGF0XG4gKiB0aGUgY29kZSB0aGF0IGhvbGRzIHRoZSBtaW50IGZvciB0aGF0IGFzc2V0IGNsYXNzLS0tdGhlIG9uZSBhc3NvY2lhdGVkXG4gKiB3aXRoIHRoYXQgYnJhbmQsIG9ubHkgbWludHMgdGhlIGl0ZW1zIHJlcHJlc2VudGluZyB0aGUgcmVhbCB1bml0c1xuICogb2YgdGhhdCBhc3NldCBjbGFzcyBhcyBkZWZpbmVkIGJ5IGl0LiBBbnlvbmUgZWxzZSBjYW4gcHV0IHRvZ2V0aGVyXG4gKiBhbiBhbW91bnQgZXhwcmVzc2luZywgZm9yIGV4YW1wbGUsIHRoYXQgdGhleSBcIndhbnRcIiBzb21lIGl0ZW1zIHRoYXRcbiAqIHdpbGwgbmV2ZXIgYmUgbWludGVkLiBUaGF0IHdhbnQgd2lsbCBuZXZlciBiZSBzYXRpc2ZpZWQuXG4gKiBcIllvdSBjYW4ndCBhbHdheXMgZ2V0Li4uXCJcbiAqL1xuY29uc3QgQ29weVNldFZhbHVlU2hhcGU9TS5zZXQoKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgU2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QXJyYXkgb2YgcGFzc2FibGUgS2V5cy4gVGhpcyByZXByZXNlbnRhdGlvbiBpcyBkZXByZWNhdGVkLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogQ29weVNldFZhbHVlcy5cbiAqL1xuY29uc3QgU2V0VmFsdWVTaGFwZT1NLmFycmF5T2YoTS5rZXkoKSk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlCYWdWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlCYWcsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgYmFnIChtdWx0aXNldCkgb2YgdGhvc2VcbiAqIGtleXMsIHdoZXJlIGVhY2gga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIHNlbWktZnVuZ2libGVcbiAqIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCwgZnJvbSB0aGUgc2VtaS1mdW5naWJsZSBhc3NldCBjbGFzc1xuICogcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQncyBicmFuZC4gVGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGtleVxuICogYXBwZWFycyBpbiB0aGUgYmFnIGlzIHRoZSBudW1iZXIgb2YgZnVuZ2libGUgdW5pdHMgb2YgdGhhdCBrZXkuXG4gKiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzXG4gKiB0aGUgYmFnIG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXNcbiAqIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZVxuICogdGhhdCB3ZSBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdFxuICogdGhlIGNvZGUgdGhhdCBob2xkcyB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGF0IGJyYW5kLCBvbmx5IG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHNcbiAqIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieSBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlclxuICogYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXkgXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0XG4gKiB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmUgc2F0aXNmaWVkLlxuICogXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlCYWdWYWx1ZVNoYXBlPU0uYmFnKCk7XG5cbmNvbnN0IEFtb3VudFZhbHVlU2hhcGU9TS5vcihcbk5hdFZhbHVlU2hhcGUsXG5Db3B5U2V0VmFsdWVTaGFwZSxcblNldFZhbHVlU2hhcGUsXG5Db3B5QmFnVmFsdWVTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZDpCcmFuZFNoYXBlLFxudmFsdWU6QW1vdW50VmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuQW1vdW50U2hhcGUoQW1vdW50U2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBSYXRpb1NoYXBlPWhhcmRlbih7XG5udW1lcmF0b3I6QW1vdW50U2hhcGUsXG5kZW5vbWluYXRvcjpBbW91bnRTaGFwZX0pO1xuXG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgTmF0IGJpZ2ludC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFhpbXBvcnQoJy4vdHlwZXMuanMnKS5OYXRWYWx1ZX1cbiAqLyRo4oCNX29uY2UuUmF0aW9TaGFwZShSYXRpb1NoYXBlKTtcbmNvbnN0ICAgICAgICBpc05hdFZhbHVlPSh2YWx1ZSk9Pm1hdGNoZXModmFsdWUsTmF0VmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc05hdFZhbHVlKGlzTmF0VmFsdWUpO1xuaGFyZGVuKGlzTmF0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlTZXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlTZXR9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLENvcHlTZXRWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzQ29weVNldFZhbHVlKGlzQ29weVNldFZhbHVlKTtcbmhhcmRlbihpc0NvcHlTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgcGFzcyBieSBjb3B5IGFycmF5IHN0cnVjdHVyZS4gRG9lcyBub3RcbiAqIGNoZWNrIGZvciBkdXBsaWNhdGVzLiBUbyBjaGVjayBmb3IgZHVwbGljYXRlcywgdXNlIHNldE1hdGhIZWxwZXJzLmNvZXJjZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqIENvcHlTZXRWYWx1ZXMuXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFNldFZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLFNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNTZXRWYWx1ZShpc1NldFZhbHVlKTtcbmhhcmRlbihpc1NldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5QmFnXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5QmFnfVxuICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnVmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5QmFnVmFsdWVTaGFwZSk7JGjigI1fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vKiBPbmUgR09PR09MdGggc2hvdWxkIGJlIGVub3VnaCBkZWNpbWFsIHBsYWNlcyBmb3IgYW55Ym9keS4qL1xuY29uc3QgICAgICAgIE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUz0xMDA7JGjigI1fb25jZS5NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKTtcblxuY29uc3QgICAgICAgIEFzc2V0S2luZFNoYXBlPU0ub3IoJ25hdCcsJ3NldCcsJ2NvcHlTZXQnLCdjb3B5QmFnJyk7JGjigI1fb25jZS5Bc3NldEtpbmRTaGFwZShBc3NldEtpbmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBEaXNwbGF5SW5mb1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57fSxcbntcbmRlY2ltYWxQbGFjZXM6TS5hbmQoXG5NLmd0ZSgtTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbk0ubHRlKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUykpLFxuXG5hc3NldEtpbmQ6QXNzZXRLaW5kU2hhcGV9LFxuXG57XG4vKiBJbmNsdWRpbmcgdGhpcyBlbXB0eSBgcmVzdGAgZW5zdXJlcyB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciovXG4vKiBwcm9wZXJ0aWVzIGJleW9uZCB0aG9zZSBpbiB0aGUgYGJhc2VgIHJlY29yZC4qL30pOyRo4oCNX29uY2UuRGlzcGxheUluZm9TaGFwZShEaXNwbGF5SW5mb1NoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBJc3N1ZXJLaXRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbm1pbnQ6TWludFNoYXBlLFxubWludFJlY292ZXJ5UHVyc2U6UHVyc2VTaGFwZSxcbmlzc3VlcjpJc3N1ZXJTaGFwZSxcbmRpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9KTtcblxuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSW50ZXJmYWNlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovJGjigI1fb25jZS5Jc3N1ZXJLaXRTaGFwZShJc3N1ZXJLaXRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEk9TS5pbnRlcmZhY2UoJ0JyYW5kJyx7XG5pc015SXNzdWVyOk0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5nZXRBbW91bnRTaGFwZTpNLmNhbGwoKS5yZXR1cm5zKE0ucGF0dGVybigpKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBbYnJhbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Fzc2V0S2luZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYW1vdW50U2hhcGVdXG4gKi8kaOKAjV9vbmNlLkJyYW5kSShCcmFuZEkpO1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJJbnRlcmZhY2VzPShcbmJyYW5kU2hhcGU9QnJhbmRTaGFwZSxcbmFzc2V0S2luZFNoYXBlPUFzc2V0S2luZFNoYXBlLFxuYW1vdW50U2hhcGU9QW1vdW50U2hhcGUpPT5cbntcbmNvbnN0IElzc3Vlckk9TS5pbnRlcmZhY2UoJ0lzc3Vlcicse1xuZ2V0QnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEFsbGVnZWROYW1lOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXRBc3NldEtpbmQ6TS5jYWxsKCkucmV0dXJucyhhc3NldEtpbmRTaGFwZSksXG5nZXREaXNwbGF5SW5mbzpNLmNhbGwoKS5yZXR1cm5zKERpc3BsYXlJbmZvU2hhcGUpLFxubWFrZUVtcHR5UHVyc2U6TS5jYWxsKCkucmV0dXJucyhQdXJzZVNoYXBlKSxcblxuaXNMaXZlOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbmdldEFtb3VudE9mOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmJ1cm46TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLlxub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBNaW50ST1NLmludGVyZmFjZSgnTWludCcse1xuZ2V0SXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxubWludFBheW1lbnQ6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSl9KTtcblxuXG5jb25zdCBQYXltZW50ST1NLmludGVyZmFjZSgnUGF5bWVudCcse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSl9KTtcblxuXG5jb25zdCBQdXJzZUk9TS5pbnRlcmZhY2UoJ1B1cnNlJyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnQ6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXI6TS5jYWxsKCkucmV0dXJucyhOb3RpZmllclNoYXBlKSxcbi8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4vKiBSYXRoZXIsIHRoZSBzZW1hbnRpY3Mgb2YgYGRlcG9zaXRgIHJlcXVpcmUgaXQgdG8gcHJvdmlkZSBpdHMqL1xuLyogY2FsbGVycyB3aXRoIGEgc3Ryb25nIGd1YXJhbnRlZSB0aGF0IGBkZXBvc2l0YCBtZXNzYWdlcyBhcmUqL1xuLyogcHJvY2Vzc2VkIHdpdGhvdXQgZnVydGhlciBkZWxheSBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuKi9cbi8qIFB1cnNlSSB0aGVyZWZvcmUgcmVxdWlyZXMgdGhhdCB0aGUgYHNyY1BheW1lbnRgIGFyZ3VtZW50IGFscmVhZHkqL1xuLyogYmUgYSByZW1vdGFibGUsIG5vdCBhIHByb21pc2UuKi9cbi8qIFB1cnNlSSBvbmx5IGNhbGxzIHRoaXMgcmF3IG1ldGhvZCBhZnRlciB2YWxpZGF0aW5nIHRoYXQqL1xuLyogYHNyY1BheW1lbnRgIGlzIGEgcmVtb3RhYmxlLCBsZWF2aW5nIGl0Ki9cbi8qIHRvIHRoaXMgcmF3IG1ldGhvZCB0byB2YWxpZGF0ZSB0aGF0IHRoaXMgcmVtb3RhYmxlIGlzIGFjdHVhbGx5Ki9cbi8qIGEgbGl2ZSBwYXltZW50IG9mIHRoZSBjb3JyZWN0IGJyYW5kIHdpdGggc3VmZmljaWVudCBmdW5kcy4qL1xuZGVwb3NpdDpNLmNhbGwoUGF5bWVudFNoYXBlKS5vcHRpb25hbChNLnBhdHRlcm4oKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXREZXBvc2l0RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG53aXRoZHJhdzpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmdldFJlY292ZXJ5U2V0Ok0uY2FsbCgpLnJldHVybnMoTS5zZXRPZihQYXltZW50U2hhcGUpKSxcbnJlY292ZXJBbGw6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBEZXBvc2l0RmFjZXRJPU0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLHtcbnJlY2VpdmU6UHVyc2VJLm1ldGhvZEd1YXJkcy5kZXBvc2l0fSk7XG5cblxuY29uc3QgUHVyc2VJS2l0PWhhcmRlbih7XG5wdXJzZTpQdXJzZUksXG5kZXBvc2l0RmFjZXQ6RGVwb3NpdEZhY2V0SX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuSXNzdWVySSxcbk1pbnRJLFxuUGF5bWVudEksXG5QdXJzZUlLaXR9KTtcblxuIH07JGjigI1fb25jZS5tYWtlSXNzdWVySW50ZXJmYWNlcyhtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG5oYXJkZW4obWFrZUlzc3VlckludGVyZmFjZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyYW5kU2hhcGUiOlsiQnJhbmRTaGFwZSJdLCJJc3N1ZXJTaGFwZSI6WyJJc3N1ZXJTaGFwZSJdLCJQYXltZW50U2hhcGUiOlsiUGF5bWVudFNoYXBlIl0sIlB1cnNlU2hhcGUiOlsiUHVyc2VTaGFwZSJdLCJEZXBvc2l0RmFjZXRTaGFwZSI6WyJEZXBvc2l0RmFjZXRTaGFwZSJdLCJOb3RpZmllclNoYXBlIjpbIk5vdGlmaWVyU2hhcGUiXSwiTWludFNoYXBlIjpbIk1pbnRTaGFwZSJdLCJBbW91bnRTaGFwZSI6WyJBbW91bnRTaGFwZSJdLCJSYXRpb1NoYXBlIjpbIlJhdGlvU2hhcGUiXSwiaXNOYXRWYWx1ZSI6WyJpc05hdFZhbHVlIl0sImlzQ29weVNldFZhbHVlIjpbImlzQ29weVNldFZhbHVlIl0sImlzU2V0VmFsdWUiOlsiaXNTZXRWYWx1ZSJdLCJpc0NvcHlCYWdWYWx1ZSI6WyJpc0NvcHlCYWdWYWx1ZSJdLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiOlsiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIl0sIkFzc2V0S2luZFNoYXBlIjpbIkFzc2V0S2luZFNoYXBlIl0sIkRpc3BsYXlJbmZvU2hhcGUiOlsiRGlzcGxheUluZm9TaGFwZSJdLCJJc3N1ZXJLaXRTaGFwZSI6WyJJc3N1ZXJLaXRTaGFwZSJdLCJCcmFuZEkiOlsiQnJhbmRJIl0sIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIjpbIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACzPqVFwPwAAcD8AACkAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbW91bnRcbiAqIEFtb3VudHMgYXJlIGRlc2NyaXB0aW9ucyBvZiBkaWdpdGFsIGFzc2V0cywgYW5zd2VyaW5nIHRoZSBxdWVzdGlvbnNcbiAqIFwiaG93IG11Y2hcIiBhbmQgXCJvZiB3aGF0IGtpbmRcIi4gQW1vdW50cyBhcmUgdmFsdWVzIGxhYmVsZWQgd2l0aCBhIGJyYW5kLlxuICogQW1vdW50TWF0aCBleGVjdXRlcyB0aGUgbG9naWMgb2YgaG93IGFtb3VudHMgYXJlIGNoYW5nZWQgd2hlbiBkaWdpdGFsXG4gKiBhc3NldHMgYXJlIG1lcmdlZCwgc2VwYXJhdGVkLCBvciBvdGhlcndpc2UgbWFuaXB1bGF0ZWQuIEZvclxuICogZXhhbXBsZSwgYSBkZXBvc2l0IG9mIDIgYnVja3MgaW50byBhIHB1cnNlIHRoYXQgYWxyZWFkeSBoYXMgMyBidWNrc1xuICogZ2l2ZXMgYSBuZXcgcHVyc2UgYmFsYW5jZSBvZiA1IGJ1Y2tzLiBBbiBlbXB0eSBwdXJzZSBoYXMgMCBidWNrcy4gQW1vdW50TWF0aFxuICogcmVsaWVzIGhlYXZpbHkgb24gcG9seW1vcnBoaWMgTWF0aEhlbHBlcnMsIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHVuYnJhbmRlZFxuICogcG9ydGlvbi5cbiAqXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtBc3NldFZhbHVlRm9yS2luZDxLPn0gdmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtOYXRWYWx1ZSB8IFNldFZhbHVlIHwgQ29weVNldCB8IENvcHlCYWd9IEFtb3VudFZhbHVlXG4gKiBBbiBgQW1vdW50VmFsdWVgIGRlc2NyaWJlcyBhIHNldCBvciBxdWFudGl0eSBvZiBhc3NldHMgdGhhdCBjYW4gYmUgb3duZWQgb3JcbiAqIHNoYXJlZC5cbiAqXG4gKiBBIGZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhIG5vbi1uZWdhdGl2ZSBiaWdpbnQgdG8gcmVwcmVzZW50IGEgcXVhbnRpdHlcbiAqIG9mIHRoYXQgbWFueSBhc3NldHMuXG4gKlxuICogQSBub24tZnVuZ2libGUgYEFtb3VudFZhbHVlYCB1c2VzIGFuIGFycmF5IG9yIENvcHlTZXQgb2YgYEtleWBzIHRvIHJlcHJlc2VudFxuICogYSBzZXQgb2Ygd2hhdGV2ZXIgYXNzZXQgZWFjaCBrZXkgcmVwcmVzZW50cy4gQSBgS2V5YCBpcyBhIHBhc3NhYmxlIHZhbHVlXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGFzIGFuIGVsZW1lbnQgaW4gYSBzZXQgKFNldFN0b3JlIG9yIENvcHlTZXQpIG9yIGFzIHRoZVxuICoga2V5IGluIGEgbWFwIChNYXBTdG9yZSBvciBDb3B5TWFwKS5cbiAqXG4gKiBgU2V0VmFsdWVgIGlzIGZvciB0aGUgZGVwcmVjYXRlZCBzZXQgcmVwcmVzZW50YXRpb24sIHVzaW5nIGFuIGFycmF5IGRpcmVjdGx5XG4gKiB0byByZXByZXNlbnQgdGhlIGFycmF5IG9mIGl0cyBlbGVtZW50cy4gYENvcHlTZXRgIGlzIHRoZSBwcm9wZXJcbiAqIHJlcHJlc2VudGF0aW9uIHVzaW5nIGEgQ29weVNldC5cbiAqXG4gKiBBIHNlbWktZnVuZ2libGUgYENvcHlCYWdgIGlzIHJlcHJlc2VudGVkIGFzIGFcbiAqIGBDb3B5QmFnYCBvZiBgS2V5YCBvYmplY3RzLiBcIkJhZ1wiIGlzIHN5bm9ueW1vdXMgd2l0aCBNdWx0aVNldCwgd2hlcmUgYW5cbiAqIGVsZW1lbnQgb2YgYSBiYWcgY2FuIGJlIHByZXNlbnQgb25jZSBvciBtb3JlIHRpbWVzLCBpLmUuLCBzb21lIHBvc2l0aXZlXG4gKiBiaWdpbnQgbnVtYmVyIG9mIHRpbWVzLCByZXByZXNlbnRpbmcgdGhhdCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgcmVwcmVzZW50ZWRcbiAqIGJ5IHRoYXQga2V5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyduYXQnIHwgJ3NldCcgfCAnY29weVNldCcgfCAnY29weUJhZycgfSBBc3NldEtpbmRcbiAqXG4gKiBTZWUgZG9jLWNvbW1lbnQgZm9yIGBBbW91bnRWYWx1ZWAuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHR5cGVkZWYge0sgZXh0ZW5kcyAnbmF0JyA/IE5hdFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnc2V0JyA/IFNldFZhbHVlIDpcbiAqIEsgZXh0ZW5kcyAnY29weVNldCcgPyBDb3B5U2V0OlxuICogSyBleHRlbmRzICdjb3B5QmFnJyA/IENvcHlCYWcgOlxuICogbmV2ZXJcbiAqIH0gQXNzZXRWYWx1ZUZvcktpbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtWIGV4dGVuZHMgTmF0VmFsdWUgPyAnbmF0JyA6XG4gKiAgViBleHRlbmRzIFNldFZhbHVlID8gJ3NldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5U2V0ID8gJ2NvcHlTZXQnIDpcbiAqICBWIGV4dGVuZHMgQ29weUJhZyA/ICdjb3B5QmFnJyA6XG4gKiAgbmV2ZXJ9IEFzc2V0S2luZEZvclZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gRGlzcGxheUluZm9cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVjaW1hbFBsYWNlc10gVGVsbHMgdGhlIGRpc3BsYXkgc29mdHdhcmUgaG93XG4gKiAgIG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gbW92ZSB0aGUgZGVjaW1hbCBvdmVyIHRvIHRoZSBsZWZ0LCBvciBpblxuICogICBvdGhlciB3b3Jkcywgd2hpY2ggcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gd2hvbGUgbnVtYmVycy4gV2VcbiAqICAgcmVxdWlyZSBmdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB0byBiZSByZXByZXNlbnRlZCBpbiBpbnRlZ2VycywgaW5cbiAqICAgdGhlIHNtYWxsZXN0IHVuaXQgKGkuZS4gVVNEIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIG1pbGwsIGFcbiAqICAgdGhvdXNhbmR0aCBvZiBhIGRvbGxhci4gSW4gdGhhdCBjYXNlLCBgZGVjaW1hbFBsYWNlc2Agd291bGQgYmVcbiAqICAgMy4pIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwsIGFuZCBmb3Igbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqICAgYXNzZXRzLCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4gVGhlIGRlY2ltYWxQbGFjZXMgcHJvcGVydHlcbiAqICAgc2hvdWxkIGJlIHVzZWQgZm9yICpkaXNwbGF5IHB1cnBvc2VzIG9ubHkqLiBBbnkgb3RoZXIgdXNlIGlzIGFuXG4gKiAgIGFudGktcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7S30gYXNzZXRLaW5kIC0gdGhlIGtpbmQgb2YgYXNzZXQsIGVpdGhlclxuICogICBBc3NldEtpbmQuTkFUIChmdW5naWJsZSkgb3JcbiAqICAgQXNzZXRLaW5kLlNFVCBvciBBc3NldEtpbmQuQ09QWV9TRVQgKG5vbi1mdW5naWJsZSlcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCcmFuZFxuICogVGhlIGJyYW5kIGlkZW50aWZpZXMgdGhlIGtpbmQgb2YgaXNzdWVyLCBhbmQgaGFzIGEgZnVuY3Rpb24gdG8gZ2V0IHRoZVxuICogYWxsZWdlZCBuYW1lIGZvciB0aGUga2luZCBvZiBhc3NldCBkZXNjcmliZWQuIFRoZSBhbGxlZ2VkIG5hbWUgKHN1Y2hcbiAqIGFzICdCVEMnIG9yICdtb29sYScpIGlzIHByb3ZpZGVkIGJ5IHRoZSBtYWtlciBvZiB0aGUgaXNzdWVyIGFuZCBzaG91bGRcbiAqIG5vdCBiZSB0cnVzdGVkIGFzIGFjY3VyYXRlLlxuICpcbiAqIEV2ZXJ5IGFtb3VudCBjcmVhdGVkIGJ5IGEgcGFydGljdWxhciBBbW91bnRNYXRoIHdpbGwgc2hhcmUgdGhlIHNhbWUgYnJhbmQsXG4gKiBidXQgcmVjaXBpZW50cyBjYW5ub3QgcmVseSBvbiB0aGUgYnJhbmQgdG8gdmVyaWZ5IHRoYXQgYSBwdXJwb3J0ZWQgYW1vdW50XG4gKiByZXByZXNlbnRzIHRoZSBpc3N1ZXIgdGhleSBpbnRlbmRlZCwgc2luY2UgdGhlIHNhbWUgYnJhbmQgY2FuIGJlIHJldXNlZCBieVxuICogYSBtaXNiZWhhdmluZyBpc3N1ZXIuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZElzc3VlcjogRVJlZjxJc3N1ZXI+KSA9PiBQcm9taXNlPGJvb2xlYW4+fSBpc015SXNzdWVyXG4gKiBTaG91bGQgYmUgdXNlZCB3aXRoIGBpc3N1ZXIuZ2V0QnJhbmRgIHRvIGVuc3VyZSBhbiBpc3N1ZXIgYW5kIGJyYW5kIG1hdGNoLlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldEFsbGVnZWROYW1lXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvPEs+fSBnZXREaXNwbGF5SW5mb1xuICogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHByb3BlcnR5IHsoKSA9PiBQYXR0ZXJufSBnZXRBbW91bnRTaGFwZVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJc3N1ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVySXNMaXZlXG4gKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIHBheW1lbnQgY29udGludWVzIHRvIGV4aXN0LlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fVxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyR2V0QW1vdW50T2ZcbiAqXG4gKiBHZXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudC4gQmVjYXVzZSB0aGVcbiAqIHBheW1lbnQgaXMgbm90IHRydXN0ZWQsIHdlIGNhbm5vdCBjYWxsIGEgbWV0aG9kIG9uIGl0IGRpcmVjdGx5LCBhbmRcbiAqIG11c3QgdXNlIHRoZSBpc3N1ZXIgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlckJ1cm5cbiAqXG4gKiBCdXJuIGFsbCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50LiBgb3B0QW1vdW50YCBpcyBvcHRpb25hbC4gSWYgYG9wdEFtb3VudGAgaXMgcHJlc2VudCwgdGhlXG4gKiBjb2RlIHdpbGwgaW5zaXN0IHRoYXQgdGhlIGFtb3VudCBvZiB0aGUgZGlnaXRhbCBhc3NldHMgaW4gdGhlXG4gKiBwYXltZW50IGlzIGVxdWFsIHRvIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nXG4gKiBwYXltZW50IGFuZCBvdGhlciBjb25mdXNpb24uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBbW91bnQ+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJDbGFpbVxuICpcbiAqIFRyYW5zZmVyIGFsbCBkaWdpdGFsIGFzc2V0cyBmcm9tIHRoZSBwYXltZW50IHRvIGEgbmV3IHBheW1lbnQgYW5kXG4gKiBkZWxldGUgdGhlIG9yaWdpbmFsLiBgb3B0QW1vdW50YCBpcyBvcHRpb25hbC4gSWYgYG9wdEFtb3VudGAgaXNcbiAqIHByZXNlbnQsIHRoZSBjb2RlIHdpbGwgaW5zaXN0IHRoYXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpblxuICogdGhlIHBheW1lbnQgaXMgZXF1YWwgdG8gYG9wdEFtb3VudGAsIHRvIHByZXZlbnQgc2VuZGluZyB0aGUgd3JvbmdcbiAqIHBheW1lbnQgYW5kIG90aGVyIGNvbmZ1c2lvbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJDb21iaW5lXG4gKlxuICogQ29tYmluZSBtdWx0aXBsZSBwYXltZW50cyBpbnRvIG9uZSBwYXltZW50LlxuICpcbiAqIElmIGFueSBvZiB0aGUgcGF5bWVudHMgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZFxuICogdXBvbiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+PltdfSBwYXltZW50c0FycmF5XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gW29wdFRvdGFsQW1vdW50XVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlclNwbGl0XG4gKlxuICogU3BsaXQgYSBzaW5nbGUgcGF5bWVudCBpbnRvIHR3byBwYXltZW50cyxcbiAqIEEgYW5kIEIsIGFjY29yZGluZyB0byB0aGUgcGF5bWVudEFtb3VudEEgcGFzc2VkIGluLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBwYXltZW50QW1vdW50QVxuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudDxLPltdPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJTcGxpdE1hbnlcbiAqXG4gKiBTcGxpdCBhIHNpbmdsZSBwYXltZW50IGludG8gbWFueSBwYXltZW50cywgYWNjb3JkaW5nIHRvIHRoZSBhbW91bnRzXG4gKiBwYXNzZWQgaW4uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHBhcmFtIHtBbW91bnRbXX0gYW1vdW50c1xuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFtdPn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJcbiAqXG4gKiBUaGUgaXNzdWVyIGNhbm5vdCBtaW50IGEgbmV3IGFtb3VudCwgYnV0IGl0IGNhbiBjcmVhdGUgZW1wdHkgcHVyc2VzXG4gKiBhbmQgcGF5bWVudHMuIFRoZSBpc3N1ZXIgY2FuIGFsc28gdHJhbnNmb3JtIHBheW1lbnRzIChzcGxpdHRpbmdcbiAqIHBheW1lbnRzLCBjb21iaW5pbmcgcGF5bWVudHMsIGJ1cm5pbmcgcGF5bWVudHMsIGFuZCBjbGFpbWluZ1xuICogcGF5bWVudHMgZXhjbHVzaXZlbHkpLiBUaGUgaXNzdWVyIHNob3VsZCBiZSBnb3R0ZW4gZnJvbSBhIHRydXN0ZWRcbiAqIHNvdXJjZSBhbmQgdGhlbiByZWxpZWQgdXBvbiBhcyB0aGUgZGVjaWRlciBvZiB3aGV0aGVyIGFuIHVudHJ1c3RlZFxuICogcGF5bWVudCBpcyB2YWxpZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRCcmFuZCBHZXQgdGhlIEJyYW5kIGZvciB0aGlzIElzc3Vlci4gVGhlXG4gKiBCcmFuZCBpbmRpY2F0ZXMgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCBhbmQgaXMgc2hhcmVkIGJ5IHRoZVxuICogbWludCwgdGhlIGlzc3VlciwgYW5kIGFueSBwdXJzZXMgYW5kIHBheW1lbnRzIG9mIHRoaXMgcGFydGljdWxhclxuICoga2luZC4gVGhlIGJyYW5kIGlzIG5vdCBjbG9zZWx5IGhlbGQsIHNvIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZVxuICogdHJ1c3RlZCB0byBpZGVudGlmeSBhbiBpc3N1ZXIgYWxvbmUuIEZha2UgZGlnaXRhbCBhc3NldHMgYW5kIGFtb3VudFxuICogY2FuIHVzZSBhbm90aGVyIGlzc3VlcidzIGJyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRBbGxlZ2VkTmFtZSBHZXQgdGhlIGFsbGVnZWROYW1lIGZvclxuICogdGhpcyBtaW50L2lzc3VlclxuICogQHByb3BlcnR5IHsoKSA9PiBBc3NldEtpbmR9IGdldEFzc2V0S2luZCBHZXQgdGhlIGtpbmQgb2ZcbiAqIE1hdGhIZWxwZXJzIHVzZWQgYnkgdGhpcyBJc3N1ZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IERpc3BsYXlJbmZvPEs+fSBnZXREaXNwbGF5SW5mbyBHaXZlIGluZm9ybWF0aW9uIHRvIFVJXG4gKiAgb24gaG93IHRvIGRpc3BsYXkgYW1vdW50cyBmb3IgdGhpcyBpc3N1ZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IFB1cnNlPEs+fSBtYWtlRW1wdHlQdXJzZSBNYWtlIGFuIGVtcHR5IHB1cnNlIG9mIHRoaXNcbiAqIGJyYW5kLlxuICogQHByb3BlcnR5IHtJc3N1ZXJJc0xpdmV9IGlzTGl2ZVxuICogQHByb3BlcnR5IHtJc3N1ZXJHZXRBbW91bnRPZjxLPn0gZ2V0QW1vdW50T2ZcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyQnVybn0gYnVyblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW1lbnRMZWRnZXJcbiAqIEBwcm9wZXJ0eSB7TWludDxLPn0gbWludFxuICogQHByb3BlcnR5IHtQdXJzZTxLPn0gbWludFJlY292ZXJ5UHVyc2VcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyS2l0XG4gKiBAcHJvcGVydHkge01pbnQ8Sz59IG1pbnRcbiAqIEBwcm9wZXJ0eSB7UHVyc2U8Sz59IG1pbnRSZWNvdmVyeVB1cnNlXG4gKiBAcHJvcGVydHkge0lzc3VlcjxLPn0gaXNzdWVyXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZGl0aW9uYWxEaXNwbGF5SW5mb1xuICpcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVjaW1hbFBsYWNlc10gVGVsbHMgdGhlIGRpc3BsYXkgc29mdHdhcmUgaG93XG4gKiAgIG1hbnkgZGVjaW1hbCBwbGFjZXMgdG8gbW92ZSB0aGUgZGVjaW1hbCBvdmVyIHRvIHRoZSBsZWZ0LCBvciBpblxuICogICBvdGhlciB3b3Jkcywgd2hpY2ggcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gd2hvbGUgbnVtYmVycy4gV2VcbiAqICAgcmVxdWlyZSBmdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB0byBiZSByZXByZXNlbnRlZCBpbiBpbnRlZ2VycywgaW5cbiAqICAgdGhlIHNtYWxsZXN0IHVuaXQgKGkuZS4gVVNEIG1pZ2h0IGJlIHJlcHJlc2VudGVkIGluIG1pbGwsIGFcbiAqICAgdGhvdXNhbmR0aCBvZiBhIGRvbGxhci4gSW4gdGhhdCBjYXNlLCBgZGVjaW1hbFBsYWNlc2Agd291bGQgYmVcbiAqICAgMy4pIFRoaXMgcHJvcGVydHkgaXMgb3B0aW9uYWwsIGFuZCBmb3Igbm9uLWZ1bmdpYmxlIGRpZ2l0YWxcbiAqICAgYXNzZXRzLCBzaG91bGQgbm90IGJlIHNwZWNpZmllZC4gVGhlIGRlY2ltYWxQbGFjZXMgcHJvcGVydHlcbiAqICAgc2hvdWxkIGJlIHVzZWQgZm9yICpkaXNwbGF5IHB1cnBvc2VzIG9ubHkqLiBBbnkgb3RoZXIgdXNlIGlzIGFuXG4gKiAgIGFudGktcGF0dGVybi5cbiAqIEBwcm9wZXJ0eSB7QXNzZXRLaW5kfSBbYXNzZXRLaW5kXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuU2h1dGRvd25XaXRoRmFpbHVyZX0gU2h1dGRvd25XaXRoRmFpbHVyZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1pbnRcbiAqIEhvbGRpbmcgYSBNaW50IGNhcnJpZXMgdGhlIHJpZ2h0IHRvIGlzc3VlIG5ldyBkaWdpdGFsIGFzc2V0cy4gVGhlc2VcbiAqIGFzc2V0cyBhbGwgaGF2ZSB0aGUgc2FtZSBraW5kLCB3aGljaCBpcyBjYWxsZWQgYSBCcmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IElzc3VlcjxLPn0gZ2V0SXNzdWVyIEdldHMgdGhlIElzc3VlciBmb3IgdGhpcyBtaW50LlxuICogQHByb3BlcnR5IHsobmV3QW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IG1pbnRQYXltZW50XG4gKiBDcmVhdGVzIGEgbmV3IFBheW1lbnQgY29udGFpbmluZyBuZXdseSBtaW50ZWQgYW1vdW50LlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIERlcG9zaXRGYWNldFJlY2VpdmVcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVwb3NpdEZhY2V0XG4gKiBAcHJvcGVydHkge0RlcG9zaXRGYWNldFJlY2VpdmV9IHJlY2VpdmVcbiAqIERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG8gdGhlIHB1cnNlIHRoYXQgbWFkZSB0aGlzIGZhY2V0LFxuICogcmV0dXJuaW5nIHRoZSBhbW91bnQuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgb3B0QW1vdW50YCBkb2VzIG5vdCBlcXVhbCB0aGVcbiAqIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudCwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogSWYgcGF5bWVudCBpcyBhIHByb21pc2UsIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBQdXJzZURlcG9zaXRcbiAqIEBwYXJhbSB7UGF5bWVudDxLPn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1cnNlXG4gKiBQdXJzZXMgaG9sZCBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgb2YgdGhlIHNhbWUgYnJhbmQsIGJ1dCB1bmxpa2UgUGF5bWVudHMsXG4gKiB0aGV5IGFyZSBub3QgbWVhbnQgdG8gYmUgc2VudCB0byBvdGhlcnMuIFRvIHRyYW5zZmVyIGRpZ2l0YWwgYXNzZXRzLCBhXG4gKiBQYXltZW50IHNob3VsZCBiZSB3aXRoZHJhd24gZnJvbSBhIFB1cnNlLiBUaGUgYW1vdW50IG9mIGRpZ2l0YWxcbiAqIGFzc2V0cyBpbiBhIHB1cnNlIGNhbiBjaGFuZ2UgdGhyb3VnaCB0aGUgYWN0aW9uIG9mIGRlcG9zaXQoKSBhbmQgd2l0aGRyYXcoKS5cbiAqXG4gKiBUaGUgcHJpbWFyeSB1c2UgZm9yIFB1cnNlcyBhbmQgUGF5bWVudHMgaXMgZm9yIGN1cnJlbmN5LWxpa2UgYW5kIGdvb2RzLWxpa2VcbiAqIGRpZ2l0YWwgYXNzZXRzLCBidXQgdGhleSBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlcHJlc2VudCBvdGhlciBraW5kcyBvZiByaWdodHMsXG4gKiBzdWNoIGFzIHRoZSByaWdodCB0byBwYXJ0aWNpcGF0ZSBpbiBhIHBhcnRpY3VsYXIgY29udHJhY3QuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QWxsZWdlZEJyYW5kIEdldCB0aGUgYWxsZWdlZCBCcmFuZCBmb3IgdGhpcyBQdXJzZVxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSBnZXRDdXJyZW50QW1vdW50XG4gKiBHZXQgdGhlIGFtb3VudCBjb250YWluZWQgaW4gdGhpcyBwdXJzZS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IExhdGVzdFRvcGljPEFtb3VudDxLPj59IGdldEN1cnJlbnRBbW91bnROb3RpZmllclxuICogR2V0IGEgbG9zc3kgbm90aWZpZXIgZm9yIGNoYW5nZXMgdG8gdGhpcyBwdXJzZSdzIGJhbGFuY2UuXG4gKlxuICogQHByb3BlcnR5IHtQdXJzZURlcG9zaXQ8Sz59IGRlcG9zaXRcbiAqIERlcG9zaXQgYWxsIHRoZSBjb250ZW50cyBvZiBwYXltZW50IGludG8gdGhpcyBwdXJzZSwgcmV0dXJuaW5nIHRoZVxuICogYW1vdW50LiBJZiB0aGUgb3B0aW9uYWwgYXJndW1lbnQgYG9wdEFtb3VudGAgZG9lcyBub3QgZXF1YWwgdGhlXG4gKiBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIElmIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IERlcG9zaXRGYWNldH0gZ2V0RGVwb3NpdEZhY2V0XG4gKiBSZXR1cm4gYW4gb2JqZWN0IHdob3NlIGByZWNlaXZlYCBtZXRob2QgZGVwb3NpdHMgdG8gdGhlIGN1cnJlbnQgUHVyc2UuXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50OiBBbW91bnQ8Sz4pID0+IFBheW1lbnQ8Sz59IHdpdGhkcmF3XG4gKiBXaXRoZHJhdyBhbW91bnQgZnJvbSB0aGlzIHB1cnNlIGludG8gYSBuZXcgUGF5bWVudC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IENvcHlTZXQ8UGF5bWVudDxLPj59IGdldFJlY292ZXJ5U2V0XG4gKiBUaGUgc2V0IG9mIHBheW1lbnRzIHdpdGhkcmF3biBmcm9tIHRoaXMgcHVyc2UgdGhhdCBhcmUgc3RpbGwgbGl2ZS4gVGhlc2VcbiAqIGFyZSB0aGUgcGF5bWVudHMgdGhhdCBjYW4gc3RpbGwgYmUgcmVjb3ZlcmVkIGluIGVtZXJnZW5jaWVzIGJ5LCBmb3IgZXhhbXBsZSxcbiAqIGRlcG9zaXRpbmcgaW50byB0aGlzIHB1cnNlLiBTdWNoIGEgZGVwb3NpdCBhY3Rpb24gaXMgbGlrZSBjYW5jZWxpbmcgYW5cbiAqIG91dHN0YW5kaW5nIGNoZWNrIGJlY2F1c2UgeW91J3JlIHRpcmVkIG9mIHdhaXRpbmcgZm9yIGl0LiBPbmNlIHlvdXJcbiAqIGNhbmNlbGxhdGlvbiBpcyBhY2tub3dsZWRnZWQsIHlvdSBjYW4gc3BlbmQgdGhlIGFzc2V0cyBhdCBzdGFrZSBvbiBvdGhlclxuICogdGhpbmdzLiBBZnRlcndhcmRzLCBpZiB0aGUgcmVjaXBpZW50IG9mIHRoZSBvcmlnaW5hbCBjaGVjayBmaW5hbGx5IGdldHNcbiAqIGFyb3VuZCB0byBkZXBvc2l0aW5nIGl0LCB0aGVpciBkZXBvc2l0IGZhaWxzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PEs+fSByZWNvdmVyQWxsXG4gKiBGb3IgdXNlIGluIGVtZXJnZW5jaWVzLCBzdWNoIGFzIGNvbWluZyBiYWNrIGZyb20gYSB0cmF1bWF0aWMgY3Jhc2ggYW5kXG4gKiB1cGdyYWRlLiBUaGlzIGRlcG9zaXRzIGFsbCB0aGUgcGF5bWVudHMgaW4gdGhpcyBwdXJzZSdzIHJlY292ZXJ5IHNldFxuICogaW50byB0aGUgcHVyc2UgaXRzZWxmLCByZXR1cm5pbmcgdGhlIHRvdGFsIGFtb3VudCBvZiBhc3NldHMgcmVjb3ZlcmVkLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW1lbnRcbiAqIFBheW1lbnRzIGhvbGQgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIG9mIHRoZSBzYW1lIGJyYW5kIGluIHRyYW5zaXQuIFBheW1lbnRzXG4gKiBjYW4gYmUgZGVwb3NpdGVkIGluIHB1cnNlcywgc3BsaXQgaW50byBtdWx0aXBsZSBwYXltZW50cywgY29tYmluZWQsIGFuZFxuICogY2xhaW1lZCAoZ2V0dGluZyBhbiBleGNsdXNpdmUgcGF5bWVudCkuIFBheW1lbnRzIGFyZSBsaW5lYXIsIG1lYW5pbmdcbiAqIHRoYXQgZWl0aGVyIGEgcGF5bWVudCBoYXMgdGhlIHNhbWUgYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGl0XG4gKiBzdGFydGVkIHdpdGgsIG9yIGl0IGlzIHVzZWQgdXAgZW50aXJlbHkuIEl0IGlzIGltcG9zc2libGUgdG8gcGFydGlhbGx5IHVzZSBhXG4gKiBwYXltZW50LlxuICpcbiAqIFBheW1lbnRzIGFyZSBvZnRlbiByZWNlaXZlZCBmcm9tIG90aGVyIGFjdG9ycyBhbmQgdGhlcmVmb3JlIHNob3VsZFxuICogbm90IGJlIHRydXN0ZWQgdGhlbXNlbHZlcy4gVG8gZ2V0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gYSBwYXltZW50LFxuICogdXNlIHRoZSB0cnVzdGVkIGlzc3VlcjogaXNzdWVyLmdldEFtb3VudE9mKHBheW1lbnQpLFxuICpcbiAqIFBheW1lbnRzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gUHVyc2VzIGJ5IGdldHRpbmcgYSB0cnVzdGVkIGlzc3VlciBhbmRcbiAqIGNhbGxpbmcgYGlzc3Vlci5tYWtlRW1wdHlQdXJzZSgpYCB0byBjcmVhdGUgYSBwdXJzZSwgdGhlblxuICogYHB1cnNlLmRlcG9zaXQocGF5bWVudClgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQnJhbmQ8Sz59IGdldEFsbGVnZWRCcmFuZFxuICogR2V0IHRoZSBhbGxlZ2VkQnJhbmQsIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZGlnaXRhbCBhc3NldCB0aGlzXG4gKiBwYXltZW50IHB1cnBvcnRzIHRvIGJlLCBhbmQgd2hpY2ggaXNzdWVyIHRvIHVzZS4gQmVjYXVzZSBwYXltZW50c1xuICogYXJlIG5vdCB0cnVzdGVkLCBhbnkgbWV0aG9kIGNhbGxzIG9uIHBheW1lbnRzIHNob3VsZCBiZSB0cmVhdGVkXG4gKiB3aXRoIHN1c3BpY2lvbiBhbmQgdmVyaWZpZWQgZWxzZXdoZXJlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBbW91bnRWYWx1ZX0gVlxuICogQHR5cGVkZWYge29iamVjdH0gTWF0aEhlbHBlcnNcbiAqIEFsbCBvZiB0aGUgZGlmZmVyZW5jZSBpbiBob3cgZGlnaXRhbCBhc3NldCBhbW91bnQgYXJlIG1hbmlwdWxhdGVkIGNhbiBiZVxuICogcmVkdWNlZCB0byB0aGUgYmVoYXZpb3Igb2YgdGhlIG1hdGggb24gdmFsdWVzLiBXZSBleHRyYWN0IHRoaXNcbiAqIGN1c3RvbSBsb2dpYyBpbnRvIG1hdGhIZWxwZXJzLiBNYXRoSGVscGVycyBhcmUgYWJvdXQgdmFsdWVcbiAqIGFyaXRobWV0aWMsIHdoZXJlYXMgQW1vdW50TWF0aCBpcyBhYm91dCBhbW91bnRzLCB3aGljaCBhcmUgdGhlXG4gKiB2YWx1ZXMgbGFiZWxlZCB3aXRoIGEgYnJhbmQuIEFtb3VudE1hdGggdXNlIG1hdGhIZWxwZXJzIHRvIGRvIHRoZWlyIHZhbHVlXG4gKiBhcml0aG1ldGljLCBhbmQgdGhlbiBicmFuZCB0aGUgcmVzdWx0cywgbWFraW5nIGEgbmV3IGFtb3VudC5cbiAqXG4gKiBUaGUgTWF0aEhlbHBlcnMgYXJlIGRlc2lnbmVkIHRvIGJlIGNhbGxlZCBvbmx5IGZyb20gQW1vdW50TWF0aCwgYW5kIHNvXG4gKiBhbGwgbWV0aG9kcyBidXQgY29lcmNlIGNhbiBhc3N1bWUgdGhlaXIgaW5wdXRzIGFyZSB2YWxpZC4gVGhleSBvbmx5XG4gKiBuZWVkIHRvIGRvIG91dHB1dCB2YWxpZGF0aW9uLCBhbmQgb25seSB3aGVuIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgb2ZcbiAqIGludmFsaWQgb3V0cHV0LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRWYWx1ZTogVikgPT4gVn0gZG9Db2VyY2VcbiAqIENoZWNrIHRoZSBraW5kIG9mIHRoaXMgdmFsdWUgYW5kIHRocm93IGlmIGl0IGlzIG5vdCB0aGVcbiAqIGV4cGVjdGVkIGtpbmQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBWfSBkb01ha2VFbXB0eVxuICogR2V0IHRoZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGlkZW50aXR5IGVsZW1lbnQgKG9mdGVuIDAgb3IgYW5cbiAqIGVtcHR5IGFycmF5KVxuICpcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlOiBWKSA9PiBib29sZWFufSBkb0lzRW1wdHlcbiAqIElzIHRoZSB2YWx1ZSB0aGUgaWRlbnRpdHkgZWxlbWVudD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0dURVxuICogSXMgdGhlIGxlZnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSByaWdodD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gYm9vbGVhbn0gZG9Jc0VxdWFsXG4gKiBEb2VzIGxlZnQgZXF1YWwgcmlnaHQ/XG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IFZ9IGRvQWRkXG4gKiBSZXR1cm4gdGhlIGxlZnQgY29tYmluZWQgd2l0aCB0aGUgcmlnaHQuXG4gKlxuICogQHByb3BlcnR5IHsobGVmdDogViwgcmlnaHQ6IFYpID0+IFZ9IGRvU3VidHJhY3RcbiAqIFJldHVybiB3aGF0IHJlbWFpbnMgYWZ0ZXIgcmVtb3ZpbmcgdGhlIHJpZ2h0IGZyb20gdGhlIGxlZnQuIElmXG4gKiBzb21ldGhpbmcgaW4gdGhlIHJpZ2h0IHdhcyBub3QgaW4gdGhlIGxlZnQsIHdlIHRocm93IGFuIGVycm9yLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge2JpZ2ludH0gTmF0VmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcnJheTxLZXk+fSBTZXRWYWx1ZVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG3bYQpeKAAAXigAACcAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2FsbGJhY2suanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImNhbGxFIiwiY2FsbFN5bmMiLCJpc0NhbGxiYWNrIiwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siLCJtYWtlTWV0aG9kQ2FsbGJhY2siLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siLCJtYWtlU3luY01ldGhvZENhbGxiYWNrIiwicHJlcGFyZUF0dGVudWF0b3IiLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxpc09iamVjdCxpc1Bhc3NhYmxlU3ltYm9sOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcImlzUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGlzUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdHtmcm9tRW50cmllc309T2JqZWN0O1xuXG5jb25zdHtvd25LZXlzOnJhd093bktleXN9PVJlZmxlY3Q7XG5jb25zdCBvd25LZXlzPVxuLyoqIEB0eXBlIHs8VCBleHRlbmRzIFByb3BlcnR5S2V5PihvYmo6IHtbSyBpbiBUXT86IHVua25vd259KSA9PiBUW119ICovXG5yYXdPd25LZXlzO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogUGFyYW1ldGVyczxSZXR1cm5UeXBlPHByZXBhcmVBdHRlbnVhdG9yPj4pID0+IEZhcmFibGU8VD59IE1ha2VBdHRlbnVhdG9yXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5DYWxsYmFjazxJPn0gQ2FsbGJhY2tcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlN5bmNDYWxsYmFjazxJPn0gU3luY0NhbGxiYWNrXG4gKi9cblxuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+ICYgVH0gRmFyYWJsZSAqL1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0ga2V5XG4gKiBAcmV0dXJucyB7a2V5IGlzIFByb3BlcnR5S2V5fSBGSVhNRTogc2hvdWxkIGJlIGp1c3QgYFByb3BlcnR5S2V5YCBidXQgVFNcbiAqIGNvbXBsYWlucyBpdCBjYW4ndCBiZSB1c2VkIGFzIGFuIGluZGV4IHR5cGUuXG4gKi9cbmNvbnN0IGlzUHJvcGVydHlLZXk9KGtleSk9PntcbnN3aXRjaCh0eXBlb2Yga2V5KXtcbmNhc2Unc3RyaW5nJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2Unc3ltYm9sJzpcbnJldHVybiB0cnVlO1xuZGVmYXVsdDpcbnJldHVybiBmYWxzZTt9XG5cbiB9O1xuXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgY2FsbCBhIGNhbGxiYWNrLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAcGFyYW0ge1N5bmNDYWxsYmFjazxJPn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICogQHJldHVybnMge1JldHVyblR5cGU8ST59XG4gKi9cbmNvbnN0ICAgICAgICBjYWxsU3luYz0oY2FsbGJhY2ssLi4uYXJncyk9PntcbmNvbnN0e3RhcmdldCxtZXRob2ROYW1lLGJvdW5kfT1jYWxsYmFjaztcbmlmKG1ldGhvZE5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHRhcmdldCguLi5ib3VuZCwuLi5hcmdzKTtcbiB9XG5yZXR1cm4gdGFyZ2V0W21ldGhvZE5hbWVdKC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH07JGjigI1fb25jZS5jYWxsU3luYyhjYWxsU3luYyk7XG5oYXJkZW4oY2FsbFN5bmMpO1xuXG4vKipcbiAqIEV2ZW50dWFsIHNlbmQgdG8gYSBjYWxsYmFjay5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiB1bmtub3duW10pID0+IGFueX0gSVxuICogQHBhcmFtIHtDYWxsYmFjazxJPn0gY2FsbGJhY2tcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxSZXR1cm5UeXBlPEk+Pj59XG4gKi9cbmNvbnN0ICAgICAgICBjYWxsRT0oY2FsbGJhY2ssLi4uYXJncyk9PntcbmNvbnN0e3RhcmdldCxtZXRob2ROYW1lLGJvdW5kfT1jYWxsYmFjaztcbmlmKG1ldGhvZE5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIEUodGFyZ2V0KSguLi5ib3VuZCwuLi5hcmdzKTtcbiB9XG5yZXR1cm4gRSh0YXJnZXQpW21ldGhvZE5hbWVdKC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH07JGjigI1fb25jZS5jYWxsRShjYWxsRSk7XG5oYXJkZW4oY2FsbEUpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBuZWFyIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST59IFtUPUldXG4gKiBAdGVtcGxhdGUge3Vua25vd25bXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge1N5bmNDYWxsYmFjazxJPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjaz0odGFyZ2V0LC4uLmJvdW5kKT0+e1xudHlwZW9mIHRhcmdldD09PSdmdW5jdGlvbid8fFxuRmFpbCBgc3luYyBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uOiAke3RhcmdldH1gO1xuLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuY29uc3QgY2I9aGFyZGVuKHt0YXJnZXQsYm91bmQsaXNTeW5jOnRydWV9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovY2IpO1xuIH07JGjigI1fb25jZS5tYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sobWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IElcbiAqIEB0ZW1wbGF0ZSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxcbiAqICAgKC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPlxuICogPn0gW1Q9WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxJPl1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bltdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7Q2FsbGJhY2s8ST59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRnVuY3Rpb25DYWxsYmFjaz0odGFyZ2V0LC4uLmJvdW5kKT0+e1xuaXNPYmplY3QodGFyZ2V0KXx8XG5GYWlsIGBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uIHByZXNlbmNlOiAke3RhcmdldH1gO1xuLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuY29uc3QgY2I9aGFyZGVuKHt0YXJnZXQsYm91bmR9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtDYWxsYmFjazxJPn0gKi9jYik7XG4gfTskaOKAjV9vbmNlLm1ha2VGdW5jdGlvbkNhbGxiYWNrKG1ha2VGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgZnJvbSBhIG5lYXIgbWV0aG9kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge3tcbiAqICAgW3ggaW4gUF06ICguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST5cbiAqIH19IFtUPXsgW3ggaW4gUF06IEkgfV1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bltdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtTeW5jQ2FsbGJhY2s8ST59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3luY01ldGhvZENhbGxiYWNrPSh0YXJnZXQsbWV0aG9kTmFtZSwuLi5ib3VuZCk9PntcbmlzT2JqZWN0KHRhcmdldCl8fFxuRmFpbCBgc3luYyBtZXRob2QgY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0OiAke3RhcmdldH1gO1xudHlwZW9mIG1ldGhvZE5hbWU9PT0nc3RyaW5nJ3x8XG5pc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpfHxcbkZhaWwgYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmQsaXNTeW5jOnRydWV9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovY2IpO1xuIH07JGjigI1fb25jZS5tYWtlU3luY01ldGhvZENhbGxiYWNrKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgbWV0aG9kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8e1xuICogICBbeCBpbiBQXTogKC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPlxuICogfT59IFtUPVhpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8eyBbeCBpbiBQXTogSSB9Pl1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bltdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtDYWxsYmFjazxJPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNZXRob2RDYWxsYmFjaz0odGFyZ2V0LG1ldGhvZE5hbWUsLi4uYm91bmQpPT57XG5pc09iamVjdCh0YXJnZXQpfHxGYWlsIGBtZXRob2QgY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0OiAke3RhcmdldH1gO1xudHlwZW9mIG1ldGhvZE5hbWU9PT0nc3RyaW5nJ3x8XG5pc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpfHxcbkZhaWwgYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbi8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9KTtcbnJldHVybiAoLyoqIEB0eXBlIHtDYWxsYmFjazxJPn0gKi9jYik7XG4gfTskaOKAjV9vbmNlLm1ha2VNZXRob2RDYWxsYmFjayhtYWtlTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VNZXRob2RDYWxsYmFjayk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Y2FsbGJhY2sgaXMgQ2FsbGJhY2s8YW55Pn1cbiAqL1xuY29uc3QgICAgICAgIGlzQ2FsbGJhY2s9KGNhbGxiYWNrKT0+e1xuaWYoIWlzT2JqZWN0KGNhbGxiYWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9PWNhbGxiYWNrO1xucmV0dXJuKFxuaXNPYmplY3QodGFyZ2V0KSYmKFxubWV0aG9kTmFtZT09PXVuZGVmaW5lZHx8XG50eXBlb2YgbWV0aG9kTmFtZT09PSdzdHJpbmcnfHxcbmlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkpJiZcbkFycmF5LmlzQXJyYXkoYm91bmQpKTtcblxuIH07JGjigI1fb25jZS5pc0NhbGxiYWNrKGlzQ2FsbGJhY2spO1xuaGFyZGVuKGlzQ2FsbGJhY2spO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciBjbGFzcyB3aG9zZSBtZXRob2RzIGNhbiBiZSByZWRpcmVjdGVkIHZpYSBjYWxsYmFja3MuXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gTVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3pvbmUnKS5ab25lfSB6b25lIFRoZSB6b25lIGluIHdoaWNoIHRvIGFsbG9jYXRlIGF0dGVudWF0b3JzLlxuICogQHBhcmFtIHtNW119IG1ldGhvZE5hbWVzIE1ldGhvZHMgdG8gZm9yd2FyZC5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBbb3B0cy5pbnRlcmZhY2VHdWFyZF0gQW4gaW50ZXJmYWNlIGd1YXJkIGZvciB0aGVcbiAqIG5ldyBhdHRlbnVhdG9yLlxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHRzLnRhZ10gQSB0YWcgZm9yIHRoZSBuZXcgYXR0ZW51YXRvciBleG9DbGFzcy5cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVBdHRlbnVhdG9yPShcbnpvbmUsXG5tZXRob2ROYW1lcyxcbntpbnRlcmZhY2VHdWFyZCx0YWc9J0F0dGVudWF0b3InfT17fSk9Plxue1xuLyoqXG4gKiBAdHlwZWRlZiB7KHRoaXM6IGFueSwgLi4uYXJnczogdW5rbm93bltdKSA9PiBhbnl9IE1ldGhvZFxuICogQHR5cGVkZWYge3sgW0sgaW4gTV0/OiBDYWxsYmFjazxhbnk+IHwgbnVsbH19IE92ZXJyaWRlc1xuICogQHR5cGVkZWYge3sgW0sgaW4gTV06ICh0aGlzOiBhbnksIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gYW55IH19IE1ldGhvZHNcbiAqL1xuY29uc3QgbWV0aG9kcz0vKiogQHR5cGUge01ldGhvZHN9ICovXG5mcm9tRW50cmllcyhcbm1ldGhvZE5hbWVzLm1hcCgoa2V5KT0+e1xuLyogT25seSBhbGxvdyB0aGUgYFByb3BlcnR5S2V5YCB0eXBlIGZvciB0aGUgdGFyZ2V0IG1ldGhvZCBrZXkuKi9cbmlmKCFpc1Byb3BlcnR5S2V5KGtleSkpe1xudGhyb3cgRmFpbCBga2V5ICR7cShrZXkpfSBpcyBub3QgYSBQcm9wZXJ0eUtleWA7XG4gfVxuXG5jb25zdCBtPS8qKiBAdHlwZSB7TWV0aG9kc30gKi97XG4vKiBFeHBsaWNpdGx5IHVzZSBjb25jaXNlIG1ldGhvZCBzeW50YXggdG8gcHJlc2VydmUgYHRoaXNgIGJ1dCBwcmV2ZW50Ki9cbi8qIGNvbnN0cnVjdG9yIGJlaGF2aW9yLiovXG4vKiogQHR5cGUge01ldGhvZH0gKi9cbltrZXldKC4uLmFyZ3Mpe1xuLyogU3VwcG9ydCBib3RoIHN5bmNocm9ub3VzIGFuZCBhc3luYyBjYWxsYmFja3MuKi9cbmNvbnN0IGNiPXRoaXMuc3RhdGUuY2JzW2tleV07XG5pZighY2Ipe1xuY29uc3QgZXJyPWFzc2VydC5lcnJvcihcbiBgdW5pbXBsZW1lbnRlZCAke3EodGFnKX0gbWV0aG9kICR7cShrZXkpfWApO1xuXG5pZih0aGlzLnN0YXRlLmlzU3luYyl7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gfVxuaWYoY2IuaXNTeW5jKXtcbnJldHVybiBjYWxsU3luYyhjYiwuLi5hcmdzKTtcbiB9XG5yZXR1cm4gY2FsbEUoY2IsLi4uYXJncyk7XG4gfX1bXG5rZXldO1xucmV0dXJuICgvKiogQHR5cGUge2NvbnN0fSAqL1trZXksbV0pO1xuIH0pKTtcblxuXG5cbi8qKlxuICogQ3JlYXRlIGFuIGV4byBvYmplY3Qgd2hvc2UgYmVoYXZpb3IgaXMgY29tcG9zZWQgZnJvbSBhIGRlZmF1bHQgdGFyZ2V0XG4gKiBhbmQvb3IgaW5kaXZpZHVhbCBtZXRob2Qgb3ZlcnJpZGUgY2FsbGJhY2tzLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge3Vua25vd259IFtvcHRzLnRhcmdldF0gVGhlIHRhcmdldCBmb3IgYW55IG1ldGhvZHMgdGhhdFxuICogd2VyZW4ndCBzcGVjaWZpZWQgaW4gYG9wdHMub3ZlcnJpZGVzYC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdHMuaXNTeW5jPWZhbHNlXSBXaGV0aGVyIHRoZSB0YXJnZXQgc2hvdWxkIGJlIHRyZWF0ZWRcbiAqIGFzIHN5bmNocm9ub3VzbHkgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtPdmVycmlkZXN9IFtvcHRzLm92ZXJyaWRlc10gU2V0IGluZGl2aWR1YWxcbiAqIGNhbGxiYWNrcyBmb3IgbWV0aG9kcyAod2hvc2UgbmFtZXMgbXVzdCBiZSBkZWZpbmVkIGluIHRoZVxuICogYHByZXBhcmVBdHRlbnVhdG9yYCBvciBgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yYCBjYWxsKS4gIE51bGxpc2ggb3ZlcnJpZGVzXG4gKiBtZWFuIHRvIHRocm93LlxuICovXG5jb25zdCBtYWtlQXR0ZW51YXRvcj16b25lLmV4b0NsYXNzKFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge2FueX0gW29wdHMudGFyZ2V0XVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pc1N5bmM9ZmFsc2VdXG4gKiBAcGFyYW0ge092ZXJyaWRlc30gW29wdHMub3ZlcnJpZGVzXVxuICovXG4oe1xudGFyZ2V0PW51bGwsXG5pc1N5bmM9ZmFsc2UsXG5vdmVycmlkZXM9LyoqIEB0eXBlIHtPdmVycmlkZXN9ICove319KT0+XG57XG5jb25zdCBjYnM9LyoqIEB0eXBlIHtPdmVycmlkZXN9ICove307XG5cbmNvbnN0IHJlbWFpbmluZz1uZXcgU2V0KG1ldGhvZE5hbWVzKTtcbmZvcihjb25zdCBrZXkgb2Ygb3duS2V5cyhvdmVycmlkZXMpKXtcbnJlbWFpbmluZy5oYXMoa2V5KXx8XG5GYWlsIGAke3EodGFnKX0gb3ZlcnJpZGVzWyR7cShrZXkpfV0gbm90IGFsbG93ZWQgYnkgbWV0aG9kTmFtZXNgO1xuXG5yZW1haW5pbmcuZGVsZXRlKGtleSk7XG5jb25zdCBjYj1vdmVycmlkZXNba2V5XTtcbmNiPT1udWxsfHxcbmlzQ2FsbGJhY2soY2IpfHxcbkZhaWwgYCR7cSh0YWcpfSBvdmVycmlkZXNbJHtxKGtleSl9XSBpcyBub3QgYSBjYWxsYmFjazsgZ290ICR7Y2J9YDtcbmNic1trZXldPWNiO1xuIH1cbmZvcihjb25zdCBrZXkgb2YgcmVtYWluaW5nKXtcbmlmKGlzU3luYyl7XG5jYnNba2V5XT1tYWtlU3luY01ldGhvZENhbGxiYWNrKHRhcmdldCxrZXkpO1xuIH1lbHNle1xuY2JzW2tleV09bWFrZU1ldGhvZENhbGxiYWNrKHRhcmdldCxrZXkpO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtjYnMsaXNTeW5jfSk7XG4gfSxcbi8qKiBAdHlwZSB7TWV0aG9kc30gKi9tZXRob2RzKTtcblxucmV0dXJuIG1ha2VBdHRlbnVhdG9yO1xuIH07JGjigI1fb25jZS5wcmVwYXJlQXR0ZW51YXRvcihwcmVwYXJlQXR0ZW51YXRvcik7XG5oYXJkZW4ocHJlcGFyZUF0dGVudWF0b3IpO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciB3aG9zZSBtZXRob2ROYW1lcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpbnRlcmZhY2VHdWFyZC5cbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvem9uZScpLlpvbmV9IHpvbmVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdHNdXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMudGFnXVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yPSh6b25lLGludGVyZmFjZUd1YXJkLG9wdHM9e30pPT57XG5jb25zdHttZXRob2RHdWFyZHN9PWludGVyZmFjZUd1YXJkO1xuY29uc3QgbWV0aG9kTmFtZXM9b3duS2V5cyhtZXRob2RHdWFyZHMpO1xuY29uc3QgbWFrZUF0dGVudWF0b3I9cHJlcGFyZUF0dGVudWF0b3Ioem9uZSxtZXRob2ROYW1lcyx7XG4uLi5vcHRzLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxucmV0dXJuICgvKiogQHR5cGUge01ha2VBdHRlbnVhdG9yPGFueT59ICovbWFrZUF0dGVudWF0b3IpO1xuIH07JGjigI1fb25jZS5wcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IocHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGxTeW5jIjpbImNhbGxTeW5jIl0sImNhbGxFIjpbImNhbGxFIl0sIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayI6WyJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siXSwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siOlsibWFrZUZ1bmN0aW9uQ2FsbGJhY2siXSwibWFrZVN5bmNNZXRob2RDYWxsYmFjayI6WyJtYWtlU3luY01ldGhvZENhbGxiYWNrIl0sIm1ha2VNZXRob2RDYWxsYmFjayI6WyJtYWtlTWV0aG9kQ2FsbGJhY2siXSwiaXNDYWxsYmFjayI6WyJpc0NhbGxiYWNrIl0sInByZXBhcmVBdHRlbnVhdG9yIjpbInByZXBhcmVBdHRlbnVhdG9yIl0sInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciI6WyJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqo/dRiIGAAAiBgAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiVkJhbmtBY2NvdW50IiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiBAamVzc2llLWNoZWNrKi9cblxuLyoqXG4gKiBAZmlsZVxuICpcbiAqIFNvbWUgb2YgdGhpcyBjb25maWcgaW5mbyBtYXkgbWFrZSBtb3JlIHNlbnNlIGluIGEgcGFydGljdWxhciBwYWNrYWdlLiBIb3dldmVyXG4gKiBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwIGFuZCBvdXIgbGF4IHBhY2thZ2VcbiAqIGRlcGVuZGVuY3kgZ3JhcGgsIHNvbWV0aW1lcyByYXRpb25hbCBwbGFjZW1lbnRzIGNhdXNlIHR5cGUgcmVzb2x1dGlvbiBlcnJvcnMuXG4gKlxuICogU28gYXMgYSB3b3JrLWFyb3VuZCBzb21lIGNvbnN0YW50cyB0aGF0IG5lZWQgYWNjZXNzIGZyb20gbW9yZSB0aGFuIG9uZSBwYWNrYWdlIGFyZSBwbGFjZWQgaGVyZS5cbiAqL1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZHMgdXNlZCBieSB0aGUgYnJpZGdlIGRldmljZS5cbiAqL1xuY29uc3QgICAgICAgIEJyaWRnZUlkPXtcbkJBTks6J2JhbmsnLFxuQ09SRTonY29yZScsXG5ESUJDOidkaWJjJyxcblNUT1JBR0U6J3N0b3JhZ2UnLFxuUFJPVklTSU9OOidwcm92aXNpb24nLFxuUFJPVklTSU9OX1NNQVJUX1dBTExFVDoncHJvdmlzaW9uV2FsbGV0JyxcbldBTExFVDond2FsbGV0J307JGjigI1fb25jZS5CcmlkZ2VJZChCcmlkZ2VJZCk7XG5cbmhhcmRlbihCcmlkZ2VJZCk7XG5cbmNvbnN0ICAgICAgICBXYWxsZXROYW1lPXtcbmRlcG9zaXRGYWNldDonZGVwb3NpdEZhY2V0J307JGjigI1fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuXG5oYXJkZW4oV2FsbGV0TmFtZSk7XG5cbi8qIGRlZmluZWQgaW4gZ29sYW5nL2Nvc21vcy94L3ZiYW5rKi9cbmNvbnN0ICAgICAgICBWQmFua0FjY291bnQ9e1xucmVzZXJ2ZTp7XG5tb2R1bGU6J3ZiYW5rL3Jlc2VydmUnLFxuYWRkcmVzczonYWdvcmljMWFlMGxtdHpsZ3JjbmxhOXhqa3BhYXJxNWQ1ZGZlejYzaDNudWNsJ30sXG5cbnByb3Zpc2lvbjp7XG5tb2R1bGU6J3ZiYW5rL3Byb3Zpc2lvbicsXG5hZGRyZXNzOidhZ29yaWMxbWVnenl0ZzY1Y3lyZ3pzNmZ2enhncmNxdnd3bDd1Z3B0NjIzNDYnfX07JGjigI1fb25jZS5WQmFua0FjY291bnQoVkJhbmtBY2NvdW50KTtcblxuXG5oYXJkZW4oVkJhbmtBY2NvdW50KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmlkZ2VJZCI6WyJCcmlkZ2VJZCJdLCJXYWxsZXROYW1lIjpbIldhbGxldE5hbWUiXSwiVkJhbmtBY2NvdW50IjpbIlZCYW5rQWNjb3VudCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAXyTOAyAQAAMgEAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVHJhY2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbmxldCBkZWJ1Z0luc3RhbmNlPTE7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbiB8ICd2ZXJib3NlJ30gZW5hYmxlXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlVHJhY2VyPShuYW1lLGVuYWJsZT10cnVlKT0+e1xuZGVidWdJbnN0YW5jZSs9MTtcbmxldCBkZWJ1Z0NvdW50PTE7XG5jb25zdCBrZXk9IGAtLS0tLSAke25hbWV9LiR7ZGVidWdJbnN0YW5jZX0gYDtcbi8qIHRoZSBjYXNlcyBiZWxvdyBkZWZpbmUgYSBuYW1lZCB2YXJpYWJsZSB0byBwcm92aWRlIGJldHRlciBkZWJ1ZyBpbmZvKi9cbnN3aXRjaChlbmFibGUpe1xuY2FzZSBmYWxzZTp7XG5jb25zdCBsb2dEaXNhYmxlZD0oLi4uX2FyZ3MpPT57IH07XG5yZXR1cm4gbG9nRGlzYWJsZWQ7XG4gfVxuY2FzZSd2ZXJib3NlJzp7XG5jb25zdCBpbmZvVGljaz0ob3B0TG9nLC4uLmFyZ3MpPT57XG5pZihvcHRMb2cubG9nKXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gaW5mb1RpY2s7XG4gfVxuZGVmYXVsdDp7XG5jb25zdCBkZWJ1Z1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5vcHRMb2cubG9nKGtleSxkZWJ1Z0NvdW50Kz0xLC4uLmFyZ3MpO1xuIH1lbHNle1xuY29uc29sZS5pbmZvKGtleSxkZWJ1Z0NvdW50Kz0xLG9wdExvZywuLi5hcmdzKTtcbiB9XG4gfTtcbnJldHVybiBkZWJ1Z1RpY2s7XG4gfX1cblxuIH07JGjigI1fb25jZS5tYWtlVHJhY2VyKG1ha2VUcmFjZXIpO1xuaGFyZGVuKG1ha2VUcmFjZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFjZXIiOlsibWFrZVRyYWNlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABuFZifQwIAAEMCAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi91dGlscy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi91dGlscy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vY29uZmlnLmpzXCIsIFtdXSxbXCIuL2RlYnVnLmpzXCIsIFtdXSxbXCIuL3V0aWxzLmpzXCIsIFtdXSxbXCIuL21ldGhvZC10b29scy5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAApAbjWfikAAH4pAAAvAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanN7ImltcG9ydHMiOlsiLi9jYWxsYmFjay5qcyIsIkBhZ29yaWMvem9uZSIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbImFzc2VydENhcERhdGEiLCJhc3NlcnRQYXRoU2VnbWVudCIsImlzU3RyZWFtQ2VsbCIsIm1ha2VDaGFpblN0b3JhZ2VSb290IiwibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSIsIm1ha2VTdG9yYWdlTm9kZUNoaWxkIiwicHJlcGFyZUNoYWluU3RvcmFnZU5vZGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxNLGhlYXBab25lLGNiOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvbmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImhlYXBab25lXCIsIFskaOKAjV9hID0+IChoZWFwWm9uZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2NhbGxiYWNrLmpzXCIsIFtbXCIqXCIsIFskaOKAjV9hID0+IChjYiA9ICRo4oCNX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlQ2hhaW5TdG9yYWdlUm9vdCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZUNoYWluU3RvcmFnZVJvb3RcIn0pOyRo4oCNX29uY2UubWFrZUNoYWluU3RvcmFnZVJvb3QobWFrZUNoYWluU3RvcmFnZVJvb3QpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlU3RvcmFnZU5vZGVDaGlsZCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZVN0b3JhZ2VOb2RlQ2hpbGRcIn0pOyRo4oCNX29uY2UubWFrZVN0b3JhZ2VOb2RlQ2hpbGQobWFrZVN0b3JhZ2VOb2RlQ2hpbGQpOyAgIFxuXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykubWFrZU1hcnNoYWw+fSBNYXJzaGFsbGVyICovXG4vKiogQHR5cGVkZWYge1BpY2s8TWFyc2hhbGxlciwgJ2Zyb21DYXBEYXRhJz59IFVuc2VyaWFsaXplciAqL1xuXG4vKipcbiAqIERlZmluZWQgYnkgdnN0b3JhZ2VTdG9yZUtleSBpbiB2c3RvcmFnZS5nb1xuICpcbiAqIEB0eXBlZGVmIFZTdG9yYWdlS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVTdWJrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhUHJlZml4Qnl0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9EYXRhVmFsdWVdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIFN0cmVhbUNlbGxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBibG9ja0hlaWdodCBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgbmF0dXJhbCBudW1iZXJcbiAqIEBwcm9wZXJ0eSB7VFtdfSB2YWx1ZXNcbiAqL1xuXG4vKipcbiAqIFRoaXMgcmVwcmVzZW50cyBhIG5vZGUgaW4gYW4gSUFWTCB0cmVlLlxuICpcbiAqIFRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgeC92c3RvcmFnZSwgYW4gQWdvcmljIGV4dGVuc2lvbiBvZiB0aGUgQ29zbW9zIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuY29uc3QgQ2hhaW5TdG9yYWdlTm9kZUk9TS5pbnRlcmZhY2UoJ1N0b3JhZ2VOb2RlJyx7XG5zZXRWYWx1ZTpNLmNhbGxXaGVuKE0uc3RyaW5nKCkpLnJldHVybnMoKSxcbmdldFBhdGg6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldFN0b3JlS2V5Ok0uY2FsbFdoZW4oKS5yZXR1cm5zKE0ucmVjb3JkKCkpLFxubWFrZUNoaWxkTm9kZTpNLmNhbGwoTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnNwbGl0UmVjb3JkKHt9LHtzZXF1ZW5jZTpNLmJvb2xlYW4oKX0se30pKS5cbnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJykpfSk7XG5cblxuLyoqXG4gKiBUaGlzIGlzIGFuIGltcGVyZmVjdCBoZXVyaXN0aWMgdG8gbmF2aWdhdGUgdGhlIG1pZ3JhdGlvbiBmcm9tIHZhbHVlIGNlbGxzIHRvXG4gKiBzdHJlYW0gY2VsbHMuXG4gKiBBdCB0aW1lIG9mIHdyaXRpbmcsIG5vIGxlZ2FjeSBjZWxscyBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIGEgc3RyZWFtIGNlbGwsXG4gKiBhbmQgd2UgZG8gbm90IGludGVuZCB0byBjcmVhdGUgYW55IG1vcmUgbGVnYWN5IHZhbHVlIGNlbGxzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBjZWxsXG4gKiBAcmV0dXJucyB7Y2VsbCBpcyBTdHJlYW1DZWxsfVxuICovXG5jb25zdCAgICAgICAgaXNTdHJlYW1DZWxsPShjZWxsKT0+XG5jZWxsJiZcbnR5cGVvZiBjZWxsPT09J29iamVjdCcmJlxuQXJyYXkuaXNBcnJheShjZWxsLnZhbHVlcykmJlxudHlwZW9mIGNlbGwuYmxvY2tIZWlnaHQ9PT0nc3RyaW5nJyYmXG4vXjAkfF5bMS05XVswLTldKiQvLnRlc3QoY2VsbC5ibG9ja0hlaWdodCk7JGjigI1fb25jZS5pc1N0cmVhbUNlbGwoaXNTdHJlYW1DZWxsKTtcbmhhcmRlbihpc1N0cmVhbUNlbGwpO1xuXG4vKiBUT0RPOiBDb25zb2xpZGF0ZSB3aXRoIGBpbnNpc3RDYXBEYXRhYCBmdW5jdGlvbnMgZnJvbSBzd2luZ3NldC1saXZlc2xvdHMsKi9cbi8qIHN3aW5nc2V0LXhzbmFwLXN1cGVydmlzb3IsIGV0Yy4qL1xuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGRhdGFcbiAqIEByZXR1cm5zIHthc3NlcnRzIGRhdGEgaXMgWGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNhcERhdGE8c3RyaW5nPn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENhcERhdGE9KGRhdGEpPT57XG5hc3NlcnQudHlwZW9mKGRhdGEsJ29iamVjdCcpO1xuYXNzZXJ0KGRhdGEpO1xuYXNzZXJ0LnR5cGVvZihkYXRhLmJvZHksJ3N0cmluZycpO1xuYXNzZXJ0KEFycmF5LmlzQXJyYXkoZGF0YS5zbG90cykpO1xuLyogWFhYIGNoZWNrIHRoYXQgdGhlIC5zbG90cyBhcnJheSBlbGVtZW50cyBhcmUgYWN0dWFsbHkgc3RyaW5ncyovXG4gfTskaOKAjV9vbmNlLmFzc2VydENhcERhdGEoYXNzZXJ0Q2FwRGF0YSk7XG5oYXJkZW4oYXNzZXJ0Q2FwRGF0YSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGUgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKiBUT0RPOiBGb3JtYWxpemUgc2VnbWVudCBjb25zdHJhaW50cy4qL1xuLyogTXVzdCBiZSBub25lbXB0eSBhbmQgZGlzYWxsb3cgKHVuZXNjYXBlZCkgYC5gLCBhbmQgZm9yIHNpbXBsaWNpdHkqL1xuLyogKGFuZCBmdXR1cmUgcG9zc2liaWxpdHkgb2YgZS5nLiBlc2NhcGluZykgd2UgY3VycmVudGx5IGxpbWl0IHRvKi9cbi8qIEFTQ0lJIGFscGhhbnVtZXJpYyBwbHVzIHVuZGVyc2NvcmUgYW5kIGRhc2guKi9cbmNvbnN0IHBhdGhTZWdtZW50UGF0dGVybj0vXlthLXpBLVowLTlfLV17MSwxMDB9JC87XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZykgPT4gdm9pZH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQYXRoU2VnbWVudD0obmFtZSk9PntcbnBhdGhTZWdtZW50UGF0dGVybi50ZXN0KG5hbWUpfHxcbkZhaWwgYFBhdGggc2VnbWVudCBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgMSB0byAxMDAgY2hhcmFjdGVycyBsaW1pdGVkIHRvIEFTQ0lJIGFscGhhbnVtZXJpY3MsIHVuZGVyc2NvcmVzLCBhbmQvb3IgZGFzaGVzOiAke25hbWV9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGF0aFNlZ21lbnQoYXNzZXJ0UGF0aFNlZ21lbnQpO1xuaGFyZGVuKGFzc2VydFBhdGhTZWdtZW50KTtcblxuLyoqXG4gKiBNdXN0IG1hdGNoIHRoZSBzd2l0Y2ggaW4gdnN0b3JhZ2UuZ28gdXNpbmcgYHZzdG9yYWdlTWVzc2FnZWAgdHlwZVxuICpcbiAqIEB0eXBlZGVmIHsgJ2dldCcgfCAnZ2V0U3RvcmVLZXknIHwgJ2hhcycgfCAnY2hpbGRyZW4nIHwgJ2VudHJpZXMnIHwgJ3ZhbHVlcycgfCdzaXplJyB9IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kXG4gKiBAdHlwZWRlZiB7ICdzZXQnIHwgJ3NldFdpdGhvdXROb3RpZnknIHwgJ2FwcGVuZCcgfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2RcbiAqIEB0eXBlZGVmIHtTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZCB8IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZCB9IFN0b3JhZ2VNZXNzYWdlTWV0aG9kXG4gKiBAdHlwZWRlZiB7IFtwYXRoOiBzdHJpbmddIH0gU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VBcmdzXG4gKiBAdHlwZWRlZiB7IFtwYXRoOiBzdHJpbmcsIHZhbHVlPzogc3RyaW5nIHwgbnVsbF0gfSBTdG9yYWdlRW50cnlcbiAqIEB0eXBlZGVmIHsgU3RvcmFnZUVudHJ5W10gfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VBcmdzXG4gKiBAdHlwZWRlZiB7e1xuICogICBtZXRob2Q6IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kO1xuICogICBhcmdzOiBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZUFyZ3M7XG4gKiAgfSB8IHtcbiAqICAgbWV0aG9kOiBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VNZXRob2Q7XG4gKiAgIGFyZ3M6IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZUFyZ3M7XG4gKiB9fSBTdG9yYWdlTWVzc2FnZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3pvbmUnKS5ab25lfSB6b25lXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZT0oem9uZSk9Pntcbi8qKlxuICogQ3JlYXRlIGEgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgc3RvcmFnZSBpbnRlcmZhY2UgYW5kIHBhdGguXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2NhbGxiYWNrJykuQ2FsbGJhY2s8KG1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlKSA9PiBhbnk+fSBtZXNzZW5nZXIgYSBjYWxsYmFja1xuICogZm9yIHNlbmRpbmcgYSBzdG9yYWdlTWVzc2FnZSBvYmplY3QgdG8gdGhlIHN0b3JhZ2UgaW1wbGVtZW50YXRpb25cbiAqIChjZi4gZ29sYW5nL2Nvc21vcy94L3ZzdG9yYWdlL3ZzdG9yYWdlLmdvKVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VxdWVuY2VdIHNldCB2YWx1ZXMgd2l0aCBgYXBwZW5kYCBtZXNzYWdlcyByYXRoZXIgdGhhbiBgc2V0YCBtZXNzYWdlc1xuICogc28gdGhlIGJhY2tpbmcgaW1wbGVtZW50YXRpb24gZW1wbG95cyBhIHdyYXBwaW5nIHN0cnVjdHVyZSB0aGF0XG4gKiBwcmVzZXJ2ZXMgZWFjaCB2YWx1ZSBzZXQgd2l0aGluIGEgc2luZ2xlIGJsb2NrLlxuICogQ2hpbGQgbm9kZXMgZGVmYXVsdCB0byBpbmhlcml0aW5nIHRoaXMgb3B0aW9uIGZyb20gdGhlaXIgcGFyZW50LlxuICogQHJldHVybnMge1N0b3JhZ2VOb2RlfVxuICovXG5jb25zdCBtYWtlQ2hhaW5TdG9yYWdlTm9kZT16b25lLmV4b0NsYXNzKFxuJ0NoYWluU3RvcmFnZU5vZGUnLFxuQ2hhaW5TdG9yYWdlTm9kZUksXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9jYWxsYmFjaycpLkNhbGxiYWNrPChtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55Pn0gbWVzc2VuZ2VyXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW5jZV1cbiAqL1xuKG1lc3NlbmdlcixwYXRoLHtzZXF1ZW5jZT1mYWxzZX09e30pPT57XG5hc3NlcnQudHlwZW9mKHBhdGgsJ3N0cmluZycpO1xuYXNzZXJ0LnR5cGVvZihzZXF1ZW5jZSwnYm9vbGVhbicpO1xucmV0dXJuIGhhcmRlbih7cGF0aCxtZXNzZW5nZXIsc2VxdWVuY2V9KTtcbiB9LFxue1xuZ2V0UGF0aCgpe1xucmV0dXJuIHRoaXMuc3RhdGUucGF0aDtcbiB9LFxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UGF0aFxuICogQHR5cGUgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fVxuICovXG4gICAgICBhc3luYyBnZXRTdG9yZUtleSgpe1xuY29uc3R7cGF0aCxtZXNzZW5nZXJ9PXRoaXMuc3RhdGU7XG5yZXR1cm4gY2IuY2FsbEUobWVzc2VuZ2VyLHtcbm1ldGhvZDonZ2V0U3RvcmVLZXknLFxuYXJnczpbcGF0aF19KTtcblxuIH0sXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIGNoaWxkTm9kZU9wdGlvbnM/OiB7c2VxdWVuY2U/OiBib29sZWFufSkgPT4gU3RvcmFnZU5vZGV9ICovXG5tYWtlQ2hpbGROb2RlKG5hbWUsY2hpbGROb2RlT3B0aW9ucz17fSl7XG5jb25zdHtzZXF1ZW5jZSxwYXRoLG1lc3Nlbmdlcn09dGhpcy5zdGF0ZTtcbmFzc2VydFBhdGhTZWdtZW50KG5hbWUpO1xuY29uc3QgbWVyZ2VkT3B0aW9ucz17c2VxdWVuY2UsLi4uY2hpbGROb2RlT3B0aW9uc307XG5yZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGUoXG5tZXNzZW5nZXIsXG4gYCR7cGF0aH0uJHtuYW1lfWAsXG5tZXJnZWRPcHRpb25zKTtcblxuIH0sXG4vKiogQHR5cGUgeyh2YWx1ZTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSAqL1xuICAgICAgYXN5bmMgc2V0VmFsdWUodmFsdWUpe1xuY29uc3R7c2VxdWVuY2UscGF0aCxtZXNzZW5nZXJ9PXRoaXMuc3RhdGU7XG5hc3NlcnQudHlwZW9mKHZhbHVlLCdzdHJpbmcnKTtcbi8qKiBAdHlwZSB7U3RvcmFnZUVudHJ5fSAqL1xubGV0IGVudHJ5O1xuaWYoIXNlcXVlbmNlJiYhdmFsdWUpe1xuZW50cnk9W3BhdGhdO1xuIH1lbHNle1xuZW50cnk9W3BhdGgsdmFsdWVdO1xuIH1cbmF3YWl0IGNiLmNhbGxFKG1lc3Nlbmdlcix7XG5tZXRob2Q6c2VxdWVuY2U/J2FwcGVuZCc6J3NldCcsXG5hcmdzOltlbnRyeV19KTtcblxuIH1cbi8qIFBvc3NpYmxlIGV4dGVuc2lvbnM6Ki9cbi8qICogZ2V0VmFsdWUoKSovXG4vKiAqIGdldENoaWxkTmFtZXMoKSBhbmQvb3IgbWFrZUNoaWxkTm9kZXMoKSovXG4vKiAqIGdldE5hbWUoKSovXG4vKiAqIHJlY3Vyc2l2ZSBkZWxldGUqL1xuLyogKiBiYXRjaCBvcGVyYXRpb25zKi9cbi8qICogbG9jYWwgYnVmZmVyaW5nICh3aXRoIGVuZC1vZi1ibG9jayBjb21taXQpKi99KTtcblxuXG5yZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGU7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKTtcblxuY29uc3QgbWFrZUhlYXBDaGFpblN0b3JhZ2VOb2RlPXByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKGhlYXBab25lKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBoZWFwLWJhc2VkIHJvb3Qgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgZnVuY3Rpb24gYW5kIHJvb3QgcGF0aC5cbiAqXG4gKiBAcGFyYW0geyhtZXNzYWdlOiBTdG9yYWdlTWVzc2FnZSkgPT4gYW55fSBoYW5kbGVTdG9yYWdlTWVzc2FnZSBhIGZ1bmN0aW9uIGZvclxuICogc2VuZGluZyBhIHN0b3JhZ2VNZXNzYWdlIG9iamVjdCB0byB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvblxuICogKGNmLiBnb2xhbmcvY29zbW9zL3gvdnN0b3JhZ2UvdnN0b3JhZ2UuZ28pXG4gKiBAcGFyYW0ge3N0cmluZ30gcm9vdFBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcm9vdE9wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtyb290T3B0aW9ucy5zZXF1ZW5jZV0gZW1wbG95IGEgd3JhcHBpbmcgc3RydWN0dXJlIHRoYXRcbiAqIHByZXNlcnZlcyBlYWNoIHZhbHVlIHNldCB3aXRoaW4gYSBzaW5nbGUgYmxvY2ssIGFuZCBkZWZhdWx0IGNoaWxkIG5vZGVzXG4gKiB0byBkbyB0aGUgc2FtZVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZUNoYWluU3RvcmFnZVJvb3QoXG5oYW5kbGVTdG9yYWdlTWVzc2FnZSxcbnJvb3RQYXRoLFxucm9vdE9wdGlvbnM9e30pXG57XG5jb25zdCBtZXNzZW5nZXI9Y2IubWFrZUZ1bmN0aW9uQ2FsbGJhY2soaGFuZGxlU3RvcmFnZU1lc3NhZ2UpO1xuXG4vKiBVc2UgdGhlIGhlYXBab25lIGRpcmVjdGx5LiovXG5jb25zdCByb290Tm9kZT1tYWtlSGVhcENoYWluU3RvcmFnZU5vZGUobWVzc2VuZ2VyLHJvb3RQYXRoLHJvb3RPcHRpb25zKTtcbnJldHVybiByb290Tm9kZTtcbiB9XG5cbi8qKlxuICogQHJldHVybnMge1N0b3JhZ2VOb2RlfSBhbiBvYmplY3QgdGhhdCBjb25maXJtcyB0byBTdG9yYWdlTm9kZSBBUEkgYnV0IGRvZXMgbm90IHN0b3JlIGFueXdoZXJlLlxuICovXG5jb25zdCBtYWtlTnVsbFN0b3JhZ2VOb2RlPSgpPT57XG4vKiBYWFggcmUtdXNlIFwiQ2hhaW5TdG9yYWdlXCIgbWV0aG9kcyBhYm92ZSB3aGljaCBkb24ndCBhY3R1YWxseSBkZXBlbmQgb24gY2hhaW5zKi9cbnJldHVybiBtYWtlQ2hhaW5TdG9yYWdlUm9vdCgoKT0+bnVsbCwnbnVsbCcpO1xuIH07XG5cbi8qKlxuICogQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHJldHVybmluZyBhIHN0b3JhZ2Ugbm9kZSBhdCBvciB1bmRlciBpdHMgaW5wdXQsXG4gKiBmYWxsaW5nIGJhY2sgdG8gYW4gaW5lcnQgb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgaW50ZXJmYWNlIChidXQgaW5jb21wbGV0ZVxuICogYmVoYXZpb3IpIHdoZW4gdGhhdCBpcyB1bmF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8U3RvcmFnZU5vZGU/Pn0gc3RvcmFnZU5vZGVSZWZcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGlsZE5hbWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFN0b3JhZ2VOb2RlPn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gICAgICAgIG1ha2VTdG9yYWdlTm9kZUNoaWxkKHN0b3JhZ2VOb2RlUmVmLGNoaWxkTmFtZSl7XG5jb25zdCBleGlzdGluZ1N0b3JhZ2VOb2RlPWF3YWl0IHN0b3JhZ2VOb2RlUmVmO1xuY29uc3Qgc3RvcmFnZU5vZGU9ZXhpc3RpbmdTdG9yYWdlTm9kZXx8bWFrZU51bGxTdG9yYWdlTm9kZSgpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGROYW1lKTtcbiB9XG5oYXJkZW4obWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG4vKiBUT0RPIGZpbmQgYSBiZXR0ZXIgbW9kdWxlIGZvciB0aGlzKi9cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMgeyh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXJpYWxpemVUb1N0b3JhZ2U9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5yZXR1cm4gYXN5bmModmFsdWUpPT57XG5jb25zdCBtYXJzaGFsbGVkPWF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbHVlKTtcbmNvbnN0IHNlcmlhbGl6ZWQ9SlNPTi5zdHJpbmdpZnkobWFyc2hhbGxlZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShtYWtlU2VyaWFsaXplVG9TdG9yYWdlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1N0cmVhbUNlbGwiOlsiaXNTdHJlYW1DZWxsIl0sImFzc2VydENhcERhdGEiOlsiYXNzZXJ0Q2FwRGF0YSJdLCJhc3NlcnRQYXRoU2VnbWVudCI6WyJhc3NlcnRQYXRoU2VnbWVudCJdLCJwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSI6WyJwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSJdLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCI6WyJtYWtlQ2hhaW5TdG9yYWdlUm9vdCJdLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCI6WyJtYWtlU3RvcmFnZU5vZGVDaGlsZCJdLCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIjpbIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAou7IgN4QAADeEAAAKwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRob2QtdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImJpbmRBbGxNZXRob2RzIiwiZ2V0TWV0aG9kTmFtZXMiLCJnZXRTdHJpbmdNZXRob2ROYW1lcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBpc09iamVjdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKipcbiAqIEBmaWxlIG1ldGhvZC10b29scyB1c2UgZHluYW1pYyBwcm9wZXJ0eSBsb29rdXAsIHdoaWNoIGlzIG5vdCBKZXNzaWUtY29tcGF0aWJsZVxuICovXG5cbmNvbnN0e2dldFByb3RvdHlwZU9mLGNyZWF0ZSxmcm9tRW50cmllcyxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcbmNvbnN0e293bktleXMsYXBwbHl9PVJlZmxlY3Q7XG5cbi8qKlxuICogUHJpb3JpdGl6ZSBzeW1ib2xzIGFzIGVhcmxpZXIgdGhhbiBzdHJpbmdzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0gYVxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBiXG4gKiBAcmV0dXJucyB7LTEgfCAwIHwgMX1cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkPShhLGIpPT57XG5pZih0eXBlb2YgYT09PXR5cGVvZiBiKXtcbmNvbnN0IGxlZnQ9U3RyaW5nKGEpO1xuY29uc3QgcmlnaHQ9U3RyaW5nKGIpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5Ki9cbnJldHVybiBsZWZ0PHJpZ2h0Py0xOmxlZnQ+cmlnaHQ/MTowO1xuIH1cbmlmKHR5cGVvZiBhPT09J3N5bWJvbCcpe1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N0cmluZycpO1xucmV0dXJuLTE7XG4gfVxuYXNzZXJ0KHR5cGVvZiBhPT09J3N0cmluZycpO1xuYXNzZXJ0KHR5cGVvZiBiPT09J3N5bWJvbCcpO1xucmV0dXJuIDE7XG4gfTtcblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggdGhlIGBnZXRNZXRob2ROYW1lc2AgaW4gYEBlbmRvL2V2ZW50dWFsLXNlbmRgXG4gKlxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gS1xuICogQHBhcmFtIHtSZWNvcmQ8SywgYW55Pn0gdmFsXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0TWV0aG9kTmFtZXM9KHZhbCk9PntcbmxldCBsYXllcj12YWw7XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7LyogU2V0IHRvIGRlZHVwbGljYXRlKi9cbndoaWxlKGxheWVyIT09bnVsbCYmbGF5ZXIhPT1PYmplY3QucHJvdG90eXBlKXtcbi8qIGJlIHRvbGVyYW50IG9mIG5vbi1vYmplY3RzKi9cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuY29uc3Qgb3duTmFtZXM9LyoqIEB0eXBlIHtLW119ICovb3duS2V5cyhkZXNjcyk7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25OYW1lcyl7XG4vKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4vKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTskaOKAjV9vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBgZ2V0TWV0aG9kTmFtZXNgIGNvbnRhaW5pbmcgb25seSBzdHJpbmcgbmFtZXMsIHdpdGhvdXQgc3ltYm9sc1xuICpcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IEtcbiAqIEBwYXJhbSB7UmVjb3JkPEssIGFueT59IHZhbFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0U3RyaW5nTWV0aG9kTmFtZXM9KHZhbCk9PlxuLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbmdldE1ldGhvZE5hbWVzKHZhbCkuZmlsdGVyKChuYW1lKT0+dHlwZW9mIG5hbWU9PT0nc3RyaW5nJyk7XG5cblxuLyoqXG4gKiBUT0RPIFRoaXMgZnVuY3Rpb24gZXhpc3RzIG9ubHkgdG8gZWFzZSB0aGVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU5NzAgdHJhbnNpdGlvbiwgZnJvbSBhbGwgbWV0aG9kc1xuICogYmVpbmcgb3duIHByb3BlcnRpZXMgdG8gbWV0aG9kcyBiZWluZyBpbmhlcml0ZWQgZnJvbSBhIGNvbW1vbiBwcm90b3R5cGUuXG4gKiBUaGlzIHRyYW5zaXRpb24gYnJlYWtzIHR3byBwYXR0ZXJucyB1c2VkIGluIHByaW9yIGNvZGU6IGF1dG9iaW5kaW5nLFxuICogYW5kIGVudW1lcmF0aW5nIG1ldGhvZHMgYnkgZW51bWVyYXRpbmcgb3duIHByb3BlcnRpZXMuIEZvciBib3RoLCB0aGVcbiAqIHByZWZlcnJlZCByZXBhaXJzIGFyZVxuICogICAgKiBhdXRvYmluZGluZzogUmVwbGFjZSwgZm9yIGV4YW1wbGUsXG4gKiAgICAgIGBmb28ob2JqLm1ldGhvZClgIHdpdGggYGZvbyhhcmcgPT4gYG9iai5tZXRob2QoYXJnKSlgLiBJT1csIHN0b3AgcmVseWluZ1xuICogICAgICBvbiBleHByZXNzaW9ucyBsaWtlIGBvYmoubWV0aG9kYCB0byBleHRyYWN0IGEgbWV0aG9kIHN0aWxsIGJvdW5kIHRvIHRoZVxuICogICAgICBzdGF0ZSBvZiBgb2JqYCBiZWNhdXNlLCBmb3IgdmlydHVhbCBhbmQgZHVyYWJsZSBvYmplY3RzLFxuICogICAgICB0aGV5IG5vIGxvbmdlciB3aWxsIGFmdGVyICM1OTcwLlxuICogICAgKiBtZXRob2QgZW51bWVyYXRpb246IFJlcGxhY2UsIGZvciBleGFtcGxlXG4gKiAgICAgIGBSZWZsZWN0Lm93bktleXMob2JqKWAgd2l0aCBgZ2V0TWV0aG9kTmFtZXMob2JqKWAuXG4gKlxuICogT25jZSBhbGwgcHJvYmxlbWF0aWMgY2FzZXMgaGF2ZSBiZWVuIGNvbnZlcnRlZCBpbiB0aGlzIG1hbm5lciwgdGhpc1xuICogYGJpbmRBbGxNZXRob2RzYCBoYWNrIGNhbiBhbmQgVE9ETyBzaG91bGQgYmUgZGVsZXRlZC4gSG93ZXZlciwgd2UgY3VycmVudGx5XG4gKiBoYXZlIG5vIHJlbGlhYmxlIHN0YXRpYyB3YXkgdG8gdHJhY2sgZG93biBhbmQgZml4IGFsbCBhdXRvYmluZGluZyBzaXRlcy5cbiAqIEZvciB0aG9zZSBvYmplY3RzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gZnVsbHkgcmVwYWlyZWQgYnkgdGhlIGFib3ZlIHR3b1xuICogdGVjaG5pcXVlcywgYGJpbmRBbGxNZXRob2RzYCBjcmVhdGVzIGFuIG9iamVjdCB0aGF0IGFjdHMgbXVjaCBsaWtlIHRoZVxuICogcHJlLSM1OTcwIG9iamVjdHMsIHdpdGggYWxsIHRoZWlyIG1ldGhvZHMgYXMgaW5zdGFuY2UtYm91bmQgb3duIHByb3BlcnRpZXMuXG4gKiBJdCBkb2VzIHRoaXMgYnkgbWFraW5nIGEgbmV3IG9iamVjdCBpbmhlcml0aW5nIGZyb20gYG9iamAgd2hlcmUgdGhlIG5ld1xuICogb2JqZWN0IGhhcyBib3VuZCBvd24gbWV0aG9kcyBvdmVycmlkZGluZyBhbGwgdGhlIG1ldGhvZHMgaXQgd291bGQgaGF2ZVxuICogaW5oZXJpdGVkIGZyb20gYG9iamAuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIGFueT59IFRcbiAqIEBwYXJhbSB7VH0gb2JqXG4gKiBAcmV0dXJucyB7VH1cbiAqLyRo4oCNX29uY2UuZ2V0U3RyaW5nTWV0aG9kTmFtZXMoZ2V0U3RyaW5nTWV0aG9kTmFtZXMpO1xuY29uc3QgICAgICAgIGJpbmRBbGxNZXRob2RzPShvYmopPT5cbmhhcmRlbihcbmNyZWF0ZShcbm9iaixcbmZyb21FbnRyaWVzKFxuZ2V0TWV0aG9kTmFtZXMob2JqKS5tYXAoKG5hbWUpPT5bXG5uYW1lLFxue1xudmFsdWU6KC8qKiBAdHlwZSB7dW5rbm93bltdfSAqLy4uLmFyZ3MpPT5cbmFwcGx5KG9ialtuYW1lXSxvYmosYXJncyksXG5lbnVtZXJhYmxlOnRydWV9XSkpKSk7JGjigI1fb25jZS5iaW5kQWxsTWV0aG9kcyhiaW5kQWxsTWV0aG9kcyk7XG5cblxuXG5cblxuaGFyZGVuKGJpbmRBbGxNZXRob2RzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJnZXRTdHJpbmdNZXRob2ROYW1lcyI6WyJnZXRTdHJpbmdNZXRob2ROYW1lcyJdLCJiaW5kQWxsTWV0aG9kcyI6WyJiaW5kQWxsTWV0aG9kcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADqQ+El3gMAAN4DAAAsAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3Rlc3RpbmctdXRpbHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImV2ZW50TG9vcEl0ZXJhdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKiBAZmlsZSBub3RlIHRoaXMgY2Fubm90IGJlIGNhbGxlZCB0ZXN0LXV0aWxzLmpzIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzc1MDMgKi9cbi8qIGdsb2JhbCBzZXRJbW1lZGlhdGUgKi9cblxuLyoqXG4gKiBBIHdvcmthcm91bmQgZm9yIHNvbWUgaXNzdWVzIHdpdGggZmFrZSB0aW1lIGluIHRlc3RzLlxuICpcbiAqIExpbmVzIG9mIHRlc3QgY29kZSBjYW4gZGVwZW5kIG9uIGFzeW5jIHByb21pc2VzIG91dHNpZGUgdGhlIHRlc3RcbiAqIHJlc29sdmluZyBiZWZvcmUgdGhleSBydW4uIEF3YWl0aW5nIHRoaXMgZnVuY3Rpb24gcmVzdWx0IGVuc3VyZXNcbiAqIHRoYXQgYWxsIHByb21pc2VzIHRoYXQgY2FuIGRvIHJlc29sdmUuXG4gKiBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IG1lYW4gYWxsIG91dHN0YW5kaW5nIHByb21pc2VzLlxuICovXG5jb25zdCAgICAgICAgZXZlbnRMb29wSXRlcmF0aW9uPWFzeW5jKCk9PlxubmV3IFByb21pc2UoKHJlc29sdmUpPT5zZXRJbW1lZGlhdGUocmVzb2x2ZSkpOyRo4oCNX29uY2UuZXZlbnRMb29wSXRlcmF0aW9uKGV2ZW50TG9vcEl0ZXJhdGlvbik7XG5oYXJkZW4oZXZlbnRMb29wSXRlcmF0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJldmVudExvb3BJdGVyYXRpb24iOlsiZXZlbnRMb29wSXRlcmF0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFQ5+hEtAgAALQIAACkAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIlN0b3JhZ2VOb2RlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3QgICAgICAgIFN0b3JhZ2VOb2RlU2hhcGU9TS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJyk7JGjigI1fb25jZS5TdG9yYWdlTm9kZVNoYXBlKFN0b3JhZ2VOb2RlU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlN0b3JhZ2VOb2RlU2hhcGUiOlsiU3RvcmFnZU5vZGVTaGFwZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADexqKMKwcAACsHAAAqAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3VwZ3JhZGUtYXBpLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIiwibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzT2JqZWN0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7eyBuYW1lOiBzdHJpbmcsIHVwZ3JhZGVNZXNzYWdlOiBzdHJpbmcsIGluY2FybmF0aW9uTnVtYmVyOiBudW1iZXIgfX0gRGlzY29ubmVjdGlvbk9iamVjdFxuICovXG5cbi8qKlxuICogTWFrZXMgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIHVzZSBhcyB0aGUgcmVqZWN0aW9uIHZhbHVlIG9mIHByb21pc2VzXG4gKiBhYmFuZG9uZWQgYnkgdXBncmFkZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXBncmFkZU1lc3NhZ2VcbiAqIEBwYXJhbSB7bnVtYmVyfSB0b0luY2FybmF0aW9uTnVtYmVyXG4gKiBAcmV0dXJucyB7RGlzY29ubmVjdGlvbk9iamVjdH1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbj0odXBncmFkZU1lc3NhZ2UsdG9JbmNhcm5hdGlvbk51bWJlcik9PlxuaGFyZGVuKHtcbm5hbWU6J3ZhdFVwZ3JhZGVkJyxcbnVwZ3JhZGVNZXNzYWdlLFxuaW5jYXJuYXRpb25OdW1iZXI6dG9JbmNhcm5hdGlvbk51bWJlcn0pOyRo4oCNX29uY2UubWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbmhhcmRlbihtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuXG4vKiBUT0RPOiBTaW1wbGlmeSBvbmNlIHdlIGhhdmUgQGVuZG8vcGF0dGVybnMgKG9yIGp1c3QgZXhwb3J0IHRoZSBzaGFwZSkuKi9cbi8qIGNvbnN0IHVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUgPSBoYXJkZW4oeyovXG4vKiBuYW1lOiAndmF0VXBncmFkZWQnLCovXG4vKiB1cGdyYWRlTWVzc2FnZTogTS5zdHJpbmcoKSwqL1xuLyogaW5jYXJuYXRpb25OdW1iZXI6IE0ubnVtYmVyKCksKi9cbi8qIH0pOyovXG4vKiBjb25zdCBpc1VwZ3JhZGVEaXNjb25uZWN0aW9uID0gZXJyID0+IG1hdGNoZXMoZXJyLCB1cGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKTsqL1xuLyoqXG4gKiBAcGFyYW0ge2FueX0gZXJyXG4gKiBAcmV0dXJucyB7ZXJyIGlzIERpc2Nvbm5lY3Rpb25PYmplY3R9XG4gKi9cbmNvbnN0ICAgICAgICBpc1VwZ3JhZGVEaXNjb25uZWN0aW9uPShlcnIpPT5cbmlzT2JqZWN0KGVycikmJlxuZXJyLm5hbWU9PT0ndmF0VXBncmFkZWQnJiZcbnR5cGVvZiBlcnIudXBncmFkZU1lc3NhZ2U9PT0nc3RyaW5nJyYmXG50eXBlb2YgZXJyLmluY2FybmF0aW9uTnVtYmVyPT09J251bWJlcic7JGjigI1fb25jZS5pc1VwZ3JhZGVEaXNjb25uZWN0aW9uKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuaGFyZGVuKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiI6WyJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiI6WyJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKLpsZLjPAAA4zwAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vc3RyZWFtIiwiamVzc2llLmpzIl0sImV4cG9ydHMiOlsiQkFTSVNfUE9JTlRTIiwiUHJvbWlzZUFsbE9yRXJyb3JzIiwiYWdncmVnYXRlVHJ5RmluYWxseSIsImFsbFZhbHVlcyIsImFwcGx5TGFiZWxpbmdFcnJvciIsImFzc2VydEFsbERlZmluZWQiLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiLCJmb3JldmVyIiwiZnJvbVVuaXF1ZUVudHJpZXMiLCJsaXN0RGlmZmVyZW5jZSIsIm1ha2VBZ2dyZWdhdGVFcnJvciIsIm1ha2VNZWFzdXJlU2Vjb25kcyIsIm9iamVjdE1hcCIsInN5bmNocm9uaXplZFRlZSIsInRocm93TGFiZWxlZCIsInVudGlsVHJ1ZSIsIndoaWxlVHJ1ZSIsInppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLGRlZXBseUZ1bGZpbGxlZCxpc09iamVjdCxpc1Byb21pc2UsbWFrZVByb21pc2VLaXQsbWFrZVF1ZXVlLGFzeW5jR2VuZXJhdGUsbWFrZVNldDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsIFskaOKAjV9hID0+IChkZWVwbHlGdWxmaWxsZWQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VQcm9taXNlS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9zdHJlYW1cIiwgW1tcIm1ha2VRdWV1ZVwiLCBbJGjigI1fYSA9PiAobWFrZVF1ZXVlID0gJGjigI1fYSldXV1dLFtcImplc3NpZS5qc1wiLCBbW1wiYXN5bmNHZW5lcmF0ZVwiLCBbJGjigI1fYSA9PiAoYXN5bmNHZW5lcmF0ZSA9ICRo4oCNX2EpXV0sW1wibWFrZVNldFwiLCBbJGjigI1fYSA9PiAobWFrZVNldCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2VudHJpZXMsZnJvbUVudHJpZXMsa2V5cyx2YWx1ZXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3QgICAgICAgIEJBU0lTX1BPSU5UUz0xMF8wMDBuO1xuXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5FUmVmPFQ+fSBFUmVmPFQ+ICovXG5cbi8qKlxuICogVGhyb3dzIGlmIG11bHRpcGxlIGVudHJpZXMgdXNlIHRoZSBzYW1lIHByb3BlcnR5IG5hbWUuIE90aGVyd2lzZSBhY3RzXG4gKiBsaWtlIGBPYmplY3QuZnJvbUVudHJpZXNgIGJ1dCBoYXJkZW5zIHRoZSByZXN1bHQuXG4gKiBVc2UgaXQgdG8gcHJvdGVjdCBmcm9tIHByb3BlcnR5IG5hbWVzIGNvbXB1dGVkIGZyb20gdXNlci1wcm92aWRlZCBkYXRhLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssVl0+fSBhbGxFbnRyaWVzXG4gKiBAcmV0dXJucyB7e1trOiBLXTogVn19XG4gKi8kaOKAjV9vbmNlLkJBU0lTX1BPSU5UUyhCQVNJU19QT0lOVFMpO1xuY29uc3QgICAgICAgIGZyb21VbmlxdWVFbnRyaWVzPShhbGxFbnRyaWVzKT0+e1xuY29uc3QgZW50cmllc0FycmF5PVsuLi5hbGxFbnRyaWVzXTtcbmNvbnN0IHJlc3VsdD1oYXJkZW4oZnJvbUVudHJpZXMoZW50cmllc0FycmF5KSk7XG5pZihvd25LZXlzKHJlc3VsdCkubGVuZ3RoPT09ZW50cmllc0FycmF5Lmxlbmd0aCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNvbnN0IG5hbWVzPW1ha2VTZXQoKTtcbmZvcihjb25zdFtuYW1lLF9db2YgZW50cmllc0FycmF5KXtcbmlmKG5hbWVzLmhhcyhuYW1lKSl7XG5GYWlsIGBjb2xsaXNpb24gb24gcHJvcGVydHkgbmFtZSAke3EobmFtZSl9OiAke2VudHJpZXNBcnJheX1gO1xuIH1cbm5hbWVzLmFkZChuYW1lKTtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZmFpbGVkIHRvIGNyZWF0ZSBvYmplY3QgZnJvbSB1bmlxdWUgZW50cmllc2A7XG4gfTskaOKAjV9vbmNlLmZyb21VbmlxdWVFbnRyaWVzKGZyb21VbmlxdWVFbnRyaWVzKTtcbmhhcmRlbihmcm9tVW5pcXVlRW50cmllcyk7XG5cbi8qKlxuICogQnkgYW5hbG9neSB3aXRoIGhvdyBgQXJyYXkucHJvdG90eXBlLm1hcGAgd2lsbCBtYXAgdGhlIGVsZW1lbnRzIG9mXG4gKiBhbiBhcnJheSB0byB0cmFuc2Zvcm1lZCBlbGVtZW50cyBvZiBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSxcbiAqIGBvYmplY3RNYXBgIHdpbGwgZG8gbGlrZXdpc2UgZm9yIHRoZSBzdHJpbmctbmFtZWQgb3duIGVudW1lcmFibGVcbiAqIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LlxuICpcbiAqIFR5cGljYWwgdXNhZ2UgYXBwbGllcyBgb2JqZWN0TWFwYCB0byBhIENvcHlSZWNvcmQsIGkuZS4sXG4gKiBhbiBvYmplY3QgZm9yIHdoaWNoIGBwYXNzU3R5bGVPZihvcmlnaW5hbCkgPT09ICdjb3B5UmVjb3JkJ2AuIEZvciB0aGVzZSxcbiAqIG5vbmUgb2YgdGhlIGZvbGxvd2luZyBlZGdlIGNhc2VzIGFyaXNlLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBDb3B5UmVjb3JkXG4gKiB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydHkgbmFtZXMsIHdob3NlIHZhbHVlcyBhcmUgdGhlIG1hcHBlZCBmb3JtIG9mXG4gKiB0aGUgb3JpZ2luYWwncyB2YWx1ZXMuXG4gKlxuICogV2hlbiB0aGUgb3JpZ2luYWwgaXMgbm90IGEgQ29weVJlY29yZCwgc29tZSBlZGdlIGNhc2VzIHRvIGJlIGF3YXJlIG9mXG4gKiAgICAqIE5vIG1hdHRlciBob3cgbXV0YWJsZSB0aGUgb3JpZ2luYWwgb2JqZWN0LCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzXG4gKiAgICAgIGhhcmRlbmVkLlxuICogICAgKiBPbmx5IHRoZSBzdHJpbmctbmFtZWQgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZiB0aGUgb3JpZ2luYWxcbiAqICAgICAgYXJlIG1hcHBlZC4gQWxsIG90aGVyIHByb3BlcnRpZXMgYXJlIGlnbm9yZWQuXG4gKiAgICAqIElmIGFueSBvZiB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyB3ZXJlIGFjY2Vzc29ycywgYE9iamVjdC5lbnRyaWVzYFxuICogICAgICB3aWxsIGNhdXNlIGl0cyBgZ2V0dGVyYCB0byBiZSBjYWxsZWQgYW5kIHdpbGwgdXNlIHRoZSByZXN1bHRpbmdcbiAqICAgICAgdmFsdWUuXG4gKiAgICAqIE5vIG1hdHRlciB3aGV0aGVyIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSB3YXMgYW4gYWNjZXNzb3IsIHdyaXRhYmxlLFxuICogICAgICBvciBjb25maWd1cmFibGUsIGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqICAgICAgbm9uLXdyaXRhYmxlLCBub24tY29uZmlndXJhYmxlLCBkYXRhIHByb3BlcnRpZXMuXG4gKiAgICAqIE5vIG1hdHRlciB3aGF0IHRoZSBvcmlnaW5hbCBvYmplY3QgbWF5IGhhdmUgaW5oZXJpdGVkIGZyb20sIGFuZFxuICogICAgICBubyBtYXR0ZXIgd2hldGhlciBpdCB3YXMgYSBzcGVjaWFsIGtpbmQgb2Ygb2JqZWN0IHN1Y2ggYXMgYW4gYXJyYXksXG4gKiAgICAgIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgYSBwbGFpbiBvYmplY3QgaW5oZXJpdGluZyBkaXJlY3RseVxuICogICAgICBmcm9tIGBPYmplY3QucHJvdG90eXBlYCBhbmQgd2hvc2Ugc3RhdGUgaXMgb25seSB0aGVzZSBuZXcgbWFwcGVkXG4gKiAgICAgIG93biBwcm9wZXJ0aWVzLlxuICpcbiAqIFdpdGggdGhlc2UgZGlmZmVyZW5jZXMsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIG9iamVjdCB3YXMgbm90IGEgQ29weVJlY29yZCxcbiAqIGlmIGFsbCB0aGUgbWFwcGVkIHZhbHVlcyBhcmUgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiBhIENvcHlSZWNvcmQuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBPXG4gKiBAcGFyYW0ge099IG9yaWdpbmFsXG4gKiBAdGVtcGxhdGUgUiBtYXAgcmVzdWx0XG4gKiBAcGFyYW0geyh2YWx1ZTogT1trZXlvZiBPXSwga2V5OiBrZXlvZiBPKSA9PiBSfSBtYXBGblxuICogQHJldHVybnMge3sgW1AgaW4ga2V5b2YgT106IFJ9fVxuICovXG5jb25zdCAgICAgICAgb2JqZWN0TWFwPShvcmlnaW5hbCxtYXBGbik9PntcbmNvbnN0IGVudHM9ZW50cmllcyhvcmlnaW5hbCk7XG5jb25zdCBtYXBFbnRzPWVudHMubWFwKChbayx2XSk9PltrLG1hcEZuKHYsayldKTtcbnJldHVybiBoYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cykpO1xuIH07JGjigI1fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gbGVmdE5hbWVzXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IHJpZ2h0TmFtZXNcbiAqL1xuY29uc3QgICAgICAgIGxpc3REaWZmZXJlbmNlPShsZWZ0TmFtZXMscmlnaHROYW1lcyk9PntcbmNvbnN0IHJpZ2h0U2V0PW1ha2VTZXQocmlnaHROYW1lcyk7XG5yZXR1cm4gbGVmdE5hbWVzLmZpbHRlcigobmFtZSk9PiFyaWdodFNldC5oYXMobmFtZSkpO1xuIH07JGjigI1fb25jZS5saXN0RGlmZmVyZW5jZShsaXN0RGlmZmVyZW5jZSk7XG5oYXJkZW4obGlzdERpZmZlcmVuY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3J9IGlubmVyRXJyXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxhYmVsXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXVxuICogQHJldHVybnMge25ldmVyfVxuICovXG5jb25zdCAgICAgICAgdGhyb3dMYWJlbGVkPShpbm5lckVycixsYWJlbCxFcnJvckNvbnN0cnVjdG9yPXVuZGVmaW5lZCk9PntcbmlmKHR5cGVvZiBsYWJlbD09PSdudW1iZXInKXtcbmxhYmVsPSBgWyR7bGFiZWx9XWA7XG4gfVxuY29uc3Qgb3V0ZXJFcnI9YXNzZXJ0LmVycm9yKFxuIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAsXG5FcnJvckNvbnN0cnVjdG9yKTtcblxuYXNzZXJ0Lm5vdGUob3V0ZXJFcnIsWCBgQ2F1c2VkIGJ5ICR7aW5uZXJFcnJ9YCk7XG50aHJvdyBvdXRlckVycjtcbiB9OyRo4oCNX29uY2UudGhyb3dMYWJlbGVkKHRocm93TGFiZWxlZCk7XG5oYXJkZW4odGhyb3dMYWJlbGVkKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgQSxSXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFJ9IGZ1bmNcbiAqIEBwYXJhbSB7QVtdfSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtSfVxuICovXG5jb25zdCAgICAgICAgYXBwbHlMYWJlbGluZ0Vycm9yPShmdW5jLGFyZ3MsbGFiZWw9dW5kZWZpbmVkKT0+e1xuaWYobGFiZWw9PT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmMoLi4uYXJncyk7XG4gfVxubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xudGhyb3dMYWJlbGVkKGVycixsYWJlbCk7XG4gfVxuaWYoaXNQcm9taXNlKHJlc3VsdCkpe1xuLyogSWYgcmVzdWx0IGlzIGEgcmVqZWN0ZWQgcHJvbWlzZSwgdGhpcyB3aWxsIHJldHVybiBhIHByb21pc2Ugd2l0aCBhKi9cbi8qIGRpZmZlcmVudCByZWplY3Rpb24gcmVhc29uLiBCdXQgdGhpcyBjb25mdXNlcyBUeXBlU2NyaXB0IGJlY2F1c2UgaXQgdHlwZXMqL1xuLyogdGhhdCBjYXNlIGFzIGBQcm9taXNlPG5ldmVyPmAgd2hpY2ggaXMgY29vbCBmb3IgYSBwcm9taXNlIHRoYXQgd2lsbCBuZXZlciovXG4vKiBmdWxmaWxsLiAgQnV0IFR5cGVTY3JpcHQgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgdGhpcyB3aWxsIG9ubHkgaGFwcGVuKi9cbi8qIHdoZW4gYHJlc3VsdGAgd2FzIGEgcmVqZWN0ZWQgcHJvbWlzZS4gSW4gb25seSB0aGlzIGNhc2UgYFJgIHNob3VsZCovXG4vKiBhbHJlYWR5IGFsbG93IGBQcm9taXNlPG5ldmVyPmAgYXMgYSBzdWJ0eXBlLiovXG4vKiogQHR5cGUge3Vua25vd259ICovXG5jb25zdCByZWxhYmVsZWQ9RS53aGVuKHJlc3VsdCx1bmRlZmluZWQsKHJlYXNvbik9PlxudGhyb3dMYWJlbGVkKHJlYXNvbixsYWJlbCkpO1xuXG5yZXR1cm4gKC8qKiBAdHlwZSB7Un0gKi9yZWxhYmVsZWQpO1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfTskaOKAjV9vbmNlLmFwcGx5TGFiZWxpbmdFcnJvcihhcHBseUxhYmVsaW5nRXJyb3IpO1xuaGFyZGVuKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7W0tleVR5cGUgaW4ga2V5b2YgVF06IFRbS2V5VHlwZV19ICYge319IFNpbXBsaWZ5XG4gKiBmbGF0dGVuIHRoZSB0eXBlIG91dHB1dCB0byBpbXByb3ZlIHR5cGUgaGludHMgc2hvd24gaW4gZWRpdG9yc1xuICogaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy90eXBlLWZlc3QvYmxvYi9tYWluL3NvdXJjZS9zaW1wbGlmeS5kLnRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IENhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAdHlwZWRlZiB7eyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIENhbGxhYmxlID8gVFtLXSA6IERlZXBseUF3YWl0ZWQ8VFtLXT4gfX0gRGVlcGx5QXdhaXRlZE9iamVjdFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgUHJvbWlzZUxpa2U8YW55PiA/IEF3YWl0ZWQ8VD4gOiBUIGV4dGVuZHMge30gPyBTaW1wbGlmeTxEZWVwbHlBd2FpdGVkT2JqZWN0PFQ+PiA6IEF3YWl0ZWQ8VD59IERlZXBseUF3YWl0ZWRcbiAqL1xuXG4vKipcbiAqIEEgbW9yZSBjb25zdHJhaW5lZCB2ZXJzaW9uIG9mIHtkZWVwbHlGdWxmaWxsZWR9IGZvciB0eXBlIHNhZmV0eSB1bnRpbFxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xMjU3XG4gKiBVc2VmdWwgaW4gc3RhcnRpbmcgY29udHJhY3RzIHRoYXQgbmVlZCBhbGwgdGVybXMgdG8gYmUgZnVsZmlsbGVkXG4gKiBpbiBvcmRlciB0byBiZSBkdXJhYmxlLlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIHt9Pih1bmZ1bGZpbGxlZFRlcm1zOiBUKSA9PiBQcm9taXNlPERlZXBseUF3YWl0ZWQ8VD4+fVxuICovXG5jb25zdCAgICAgICAgZGVlcGx5RnVsZmlsbGVkT2JqZWN0PWFzeW5jKG9iaik9PntcbmlzT2JqZWN0KG9iail8fEZhaWwgYHBhcmFtIG11c3QgYmUgYW4gb2JqZWN0YDtcbnJldHVybiBkZWVwbHlGdWxmaWxsZWQob2JqKTtcbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHVzZXMgYSBtaWxsaXNlY29uZC1iYXNlZCB0aW1lLXNpbmNlLWVwb2NoIGNhcGFiaWxpdHlcbiAqIChzdWNoIGFzIGBwZXJmb3JtYW5jZS5ub3dgKSB0byBtZWFzdXJlIGV4ZWN1dGlvbiB0aW1lIG9mIGFuIGFzeW5jIGZ1bmN0aW9uXG4gKiBhbmQgcmVwb3J0IHRoZSByZXN1bHQgaW4gc2Vjb25kcyB0byBtYXRjaCBvdXIgdGVsZW1ldHJ5IHN0YW5kYXJkLlxuICpcbiAqIEBwYXJhbSB7dHlwZW9mIFhpbXBvcnQoJ3BlcmZfaG9va3MnKS5wZXJmb3JtYW5jZS5ub3d9IGN1cnJlbnRUaW1lTWlsbGlzZWNcbiAqIEByZXR1cm5zIHs8VD4oZm46ICgpID0+IFByb21pc2U8VD4pID0+IFByb21pc2U8eyByZXN1bHQ6IFQsIGR1cmF0aW9uOiBudW1iZXIgfT59XG4gKi8kaOKAjV9vbmNlLmRlZXBseUZ1bGZpbGxlZE9iamVjdChkZWVwbHlGdWxmaWxsZWRPYmplY3QpO1xuY29uc3QgICAgICAgIG1ha2VNZWFzdXJlU2Vjb25kcz0oY3VycmVudFRpbWVNaWxsaXNlYyk9Pntcbi8qKiBAcGFyYW0geygpID0+IGFueX0gZm4gKi9cbmNvbnN0IG1lYXN1cmVTZWNvbmRzPWFzeW5jKGZuKT0+e1xuY29uc3QgdDA9Y3VycmVudFRpbWVNaWxsaXNlYygpO1xuY29uc3QgcmVzdWx0PWF3YWl0IGZuKCk7XG5jb25zdCBkdXJhdGlvbk1pbGxpc2VjPWN1cnJlbnRUaW1lTWlsbGlzZWMoKS10MDtcbnJldHVybntyZXN1bHQsZHVyYXRpb246ZHVyYXRpb25NaWxsaXNlYy8xMDAwfTtcbiB9O1xucmV0dXJuIG1lYXN1cmVTZWNvbmRzO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtFcnJvcltdfSBlcnJvcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV1cbiAqLyRo4oCNX29uY2UubWFrZU1lYXN1cmVTZWNvbmRzKG1ha2VNZWFzdXJlU2Vjb25kcyk7XG5jb25zdCAgICAgICAgbWFrZUFnZ3JlZ2F0ZUVycm9yPShlcnJvcnMsbWVzc2FnZSk9PntcbmNvbnN0IGVycj1FcnJvcihtZXNzYWdlKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGVycix7XG5uYW1lOntcbnZhbHVlOidBZ2dyZWdhdGVFcnJvcid9LFxuXG5lcnJvcnM6e1xudmFsdWU6ZXJyb3JzfX0pO1xuXG5cbnJldHVybiBlcnI7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtyZWFkb25seSAoVCB8IFByb21pc2VMaWtlPFQ+KVtdfSBpdGVtc1xuICogQHJldHVybnMge1Byb21pc2U8VFtdPn1cbiAqLyRo4oCNX29uY2UubWFrZUFnZ3JlZ2F0ZUVycm9yKG1ha2VBZ2dyZWdhdGVFcnJvcik7XG5jb25zdCAgICAgICAgUHJvbWlzZUFsbE9yRXJyb3JzPWFzeW5jKGl0ZW1zKT0+e1xucmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChpdGVtcykudGhlbigocmVzdWx0cyk9PntcbmNvbnN0IGVycm9ycz0vKiogQHR5cGUge1Byb21pc2VSZWplY3RlZFJlc3VsdFtdfSAqL1xucmVzdWx0cy5maWx0ZXIoKHtzdGF0dXN9KT0+c3RhdHVzPT09J3JlamVjdGVkJykuXG5tYXAoKHJlc3VsdCk9PnJlc3VsdC5yZWFzb24pO1xuaWYoIWVycm9ycy5sZW5ndGgpe1xucmV0dXJuICgvKiogQHR5cGUge1Byb21pc2VGdWxmaWxsZWRSZXN1bHQ8VD5bXX0gKi9yZXN1bHRzLm1hcChcbihyZXN1bHQpPT5yZXN1bHQudmFsdWUpKTtcblxuIH1lbHNlIGlmKGVycm9ycy5sZW5ndGg9PT0xKXtcbnRocm93IGVycm9yc1swXTtcbiB9ZWxzZXtcbnRocm93IG1ha2VBZ2dyZWdhdGVFcnJvcihlcnJvcnMpO1xuIH1cbiB9KTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHs8VD4oXG4gKiAgIHRyaWVyOiAoKSA9PiBQcm9taXNlPFQ+LFxuICogIGZpbmFsaXplcjogKGVycm9yPzogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPixcbiAqICkgPT4gUHJvbWlzZTxUPn1cbiAqLyRo4oCNX29uY2UuUHJvbWlzZUFsbE9yRXJyb3JzKFByb21pc2VBbGxPckVycm9ycyk7Y29uc3QgYWdncmVnYXRlVHJ5RmluYWxseT1hc3luYyh0cmllcixmaW5hbGl6ZXIpPT5cbnRyaWVyKCkudGhlbihcbmFzeW5jKHJlc3VsdCk9PmZpbmFsaXplcigpLnRoZW4oKCk9PnJlc3VsdCksXG5hc3luYyh0cnlFcnJvcik9PlxuZmluYWxpemVyKHRyeUVycm9yKS5cbnRoZW4oXG4oKT0+dHJ5RXJyb3IsXG4oZmluYWxpemVFcnJvcik9Pm1ha2VBZ2dyZWdhdGVFcnJvcihbdHJ5RXJyb3IsZmluYWxpemVFcnJvcl0pKS5cblxudGhlbigoZXJyb3IpPT5Qcm9taXNlLnJlamVjdChlcnJvcikpKTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFRcbiAqIEB0eXBlZGVmIHt7W1AgaW4ga2V5b2YgVF06IEV4Y2x1ZGU8VFtQXSwgdW5kZWZpbmVkPjt9fSBBbGxEZWZpbmVkXG4gKi9cblxuLyoqXG4gKiBDb25jaXNlIHdheSB0byBjaGVjayB2YWx1ZXMgYXJlIGF2YWlsYWJsZSBmcm9tIG9iamVjdCBsaXRlcmFsIHNob3J0aGFuZC5cbiAqIFRocm93cyBlcnJvciBtZXNzYWdlIHRvIHNwZWNpZnkgdGhlIG1pc3NpbmcgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFRcbiAqIEBwYXJhbSB7VH0gb2JqXG4gKiBAdGhyb3dzIGlmIGFueSB2YWx1ZSBpbiB0aGUgb2JqZWN0IGVudHJpZXMgaXMgbm90IGRlZmluZWRcbiAqIEByZXR1cm5zIHthc3NlcnRzIG9iaiBpcyBBbGxEZWZpbmVkPFQ+fVxuICovJGjigI1fb25jZS5hZ2dyZWdhdGVUcnlGaW5hbGx5KGFnZ3JlZ2F0ZVRyeUZpbmFsbHkpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0QWxsRGVmaW5lZD0ob2JqKT0+e1xuY29uc3QgbWlzc2luZz1bXTtcbmZvcihjb25zdFtrZXksdmFsXW9mIE9iamVjdC5lbnRyaWVzKG9iaikpe1xuaWYodmFsPT09dW5kZWZpbmVkKXtcbm1pc3NpbmcucHVzaChrZXkpO1xuIH1cbiB9XG5pZihtaXNzaW5nLmxlbmd0aD4wKXtcbkZhaWwgYG1pc3NpbmcgJHtxKG1pc3NpbmcpfWA7XG4gfVxuIH07XG5cbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8dW5kZWZpbmVkLCBuZXZlcj59ICovJGjigI1fb25jZS5hc3NlcnRBbGxEZWZpbmVkKGFzc2VydEFsbERlZmluZWQpO1xuY29uc3Qgbm90RG9uZT1oYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6dW5kZWZpbmVkfSk7XG5cbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8bmV2ZXIsIHZvaWQ+fSAqL1xuY29uc3QgYWx3YXlzRG9uZT1oYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcblxuY29uc3QgICAgICAgIGZvcmV2ZXI9YXN5bmNHZW5lcmF0ZSgoKT0+bm90RG9uZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVH0gcHJvZHVjZVxuICogVGhlIHZhbHVlIG9mIGBhd2FpdCBwcm9kdWNlKClgIGlzIHVzZWQgZm9yIGl0cyB0cnV0aGluZXNzIHZzIGZhbHNpbmVzcy5cbiAqIElPVywgaXQgaXMgY29lcmNlZCB0byBhIGJvb2xlYW4gc28gdGhlIGNhbGxlciBuZWVkIG5vdCBib3RoZXIgZG9pbmcgdGhpc1xuICogdGhlbXNlbHZlcy5cbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPEF3YWl0ZWQ8VD4+fVxuICovJGjigI1fb25jZS5mb3JldmVyKGZvcmV2ZXIpO1xuY29uc3QgICAgICAgIHdoaWxlVHJ1ZT0ocHJvZHVjZSk9PlxuYXN5bmNHZW5lcmF0ZShhc3luYygpPT57XG5jb25zdCB2YWx1ZT1hd2FpdCBwcm9kdWNlKCk7XG5pZighdmFsdWUpe1xucmV0dXJuIGFsd2F5c0RvbmU7XG4gfVxucmV0dXJuIGhhcmRlbih7XG5kb25lOmZhbHNlLFxudmFsdWV9KTtcblxuIH0pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFR9IHByb2R1Y2VcbiAqIFRoZSB2YWx1ZSBvZiBgYXdhaXQgcHJvZHVjZSgpYCBpcyB1c2VkIGZvciBpdHMgdHJ1dGhpbmVzcyB2cyBmYWxzaW5lc3MuXG4gKiBJT1csIGl0IGlzIGNvZXJjZWQgdG8gYSBib29sZWFuIHNvIHRoZSBjYWxsZXIgbmVlZCBub3QgYm90aGVyIGRvaW5nIHRoaXNcbiAqIHRoZW1zZWx2ZXMuXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxBd2FpdGVkPFQ+Pn1cbiAqLyRo4oCNX29uY2Uud2hpbGVUcnVlKHdoaWxlVHJ1ZSk7XG5jb25zdCAgICAgICAgdW50aWxUcnVlPShwcm9kdWNlKT0+XG5hc3luY0dlbmVyYXRlKGFzeW5jKCk9PntcbmNvbnN0IHZhbHVlPWF3YWl0IHByb2R1Y2UoKTtcbmlmKHZhbHVlKXtcbnJldHVybiBoYXJkZW4oe1xuZG9uZTp0cnVlLFxudmFsdWV9KTtcblxuIH1cbnJldHVybiBoYXJkZW4oe1xuZG9uZTpmYWxzZSxcbnZhbHVlfSk7XG5cbiB9KTtcblxuLyoqIEB0eXBlIHsgPFgsIFk+KHhzOiBYW10sIHlzOiBZW10pID0+IFtYLCBZXVtdfSAqLyRo4oCNX29uY2UudW50aWxUcnVlKHVudGlsVHJ1ZSk7XG5jb25zdCAgICAgICAgemlwPSh4cyx5cyk9PmhhcmRlbih4cy5tYXAoKHgsaSk9Plt4LHlzWytpXV0pKTtcblxuLyoqIEB0eXBlIHsgPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBFUmVmPGFueT4+PihvYmo6IFQpID0+IFByb21pc2U8eyBbSyBpbiBrZXlvZiBUXTogQXdhaXRlZDxUW0tdPn0+IH0gKi8kaOKAjV9vbmNlLnppcCh6aXApO1xuY29uc3QgICAgICAgIGFsbFZhbHVlcz1hc3luYyhvYmopPT57XG5jb25zdCByZXNvbHZlZD1hd2FpdCBQcm9taXNlLmFsbCh2YWx1ZXMob2JqKSk7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyh6aXAoa2V5cyhvYmopLHJlc29sdmVkKSkpO1xuIH07XG5cbi8qKlxuICogQSB0ZWUgaW1wbGVtZW50YXRpb24gd2hlcmUgYWxsIHJlYWRlcnMgYXJlIHN5bmNocm9uaXplZCB3aXRoIGVhY2ggb3RoZXIuXG4gKiBUaGV5IGFsbCBjb25zdW1lIHRoZSBzb3VyY2Ugc3RyZWFtIGluIGxvY2tzdGVwLCBhbmQgYW55IG9uZSByZXR1cm5pbmcgb3JcbiAqIHRocm93aW5nIGVhcmx5IHdpbGwgYWZmZWN0IHRoZSBvdGhlcnMuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0FzeW5jSXRlcmF0b3I8VCwgdm9pZCwgdm9pZD59IHNvdXJjZVN0cmVhbVxuICogQHBhcmFtIHtudW1iZXJ9IHJlYWRlckNvdW50XG4gKi8kaOKAjV9vbmNlLmFsbFZhbHVlcyhhbGxWYWx1ZXMpO1xuY29uc3QgICAgICAgIHN5bmNocm9uaXplZFRlZT0oc291cmNlU3RyZWFtLHJlYWRlckNvdW50KT0+e1xuLyoqIEB0eXBlIHtJdGVyYXRvclJldHVyblJlc3VsdDx2b2lkPiB8IHVuZGVmaW5lZH0gKi9cbmxldCBkb25lUmVzdWx0O1xuXG4vKiogQHR5cGVkZWYge0l0ZXJhdG9yUmVzdWx0PCh2YWx1ZTogUHJvbWlzZUxpa2U8SXRlcmF0b3JSZXN1bHQ8VD4+KSA9PiB2b2lkPn0gUXVldWVQYXlsb2FkICovXG4vKiogQHR5cGUge1hpbXBvcnQoJ0BlbmRvL3N0cmVhbScpLkFzeW5jUXVldWU8UXVldWVQYXlsb2FkPltdfSAqL1xuY29uc3QgcXVldWVzPVtdO1xuXG4vKiogQHJldHVybnMge1Byb21pc2U8dm9pZD59ICovXG5jb25zdCBwdWxsTmV4dD1hc3luYygpPT57XG5jb25zdCByZXF1ZXN0cz1hd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocXVldWVzLm1hcCgocXVldWUpPT5xdWV1ZS5nZXQoKSkpO1xuY29uc3QgcmVqZWN0aW9ucz1bXTtcbi8qKiBAdHlwZSB7QXJyYXk8KHZhbHVlOiBQcm9taXNlTGlrZTxJdGVyYXRvclJlc3VsdDxUPj4pID0+IHZvaWQ+fSAqL1xuY29uc3QgcmVzb2x2ZXJzPVtdO1xubGV0IGRvbmU9ZmFsc2U7XG5mb3IoY29uc3Qgc2V0dGxlZFJlc3VsdCBvZiByZXF1ZXN0cyl7XG5pZihzZXR0bGVkUmVzdWx0LnN0YXR1cz09PSdyZWplY3RlZCcpe1xucmVqZWN0aW9ucy5wdXNoKHNldHRsZWRSZXN1bHQucmVhc29uKTtcbiB9ZWxzZXtcbmRvbmV8fD0hIXNldHRsZWRSZXN1bHQudmFsdWUuZG9uZTtcbnJlc29sdmVycy5wdXNoKHNldHRsZWRSZXN1bHQudmFsdWUudmFsdWUpO1xuIH1cbiB9XG4vKiogQHR5cGUge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+fSAqL1xubGV0IHJlc3VsdDtcbmlmKGRvbmVSZXN1bHQpe1xucmVzdWx0PVByb21pc2UucmVzb2x2ZShkb25lUmVzdWx0KTtcbiB9ZWxzZSBpZihyZWplY3Rpb25zLmxlbmd0aCl7XG5jb25zdCBlcnJvcj1hc3NlcnQuZXJyb3IoYXNzZXJ0LmRldGFpbHMgYFRlZWQgc3RyZWFtIHRocmV3YCk7XG5hc3NlcnQubm90ZShlcnJvcixhc3NlcnQuZGV0YWlscyBgVGVlZCByZWplY3Rpb25zOiAke3JlamVjdGlvbnN9YCk7XG5yZXN1bHQ9XG5zb3VyY2VTdHJlYW0udGhyb3c/LihlcnJvcil8fFxuUHJvbWlzZS5yZXNvbHZlKHNvdXJjZVN0cmVhbS5yZXR1cm4/LigpKS50aGVuKCgpPT5cblByb21pc2UucmVqZWN0KGVycm9yKSk7XG5cbiB9ZWxzZSBpZihkb25lKXtcbnJlc3VsdD1cbnNvdXJjZVN0cmVhbS5yZXR1cm4/LigpfHxcblByb21pc2UucmVzb2x2ZSh7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1lbHNle1xucmVzdWx0PXNvdXJjZVN0cmVhbS5uZXh0KCk7XG4gfVxucmVzdWx0LnRoZW4oXG4ocik9PntcbmlmKHIuZG9uZSl7XG5kb25lUmVzdWx0PXI7XG4gfVxuIH0sXG4oKT0+e1xuZG9uZVJlc3VsdD17ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH07XG4gfSk7XG5cbnJlc29sdmVycy5mb3JFYWNoKChyZXNvbHZlKT0+cmVzb2x2ZShyZXN1bHQpKTtcbnJldHVybiBwdWxsTmV4dCgpO1xuIH07XG5cbmNvbnN0IHJlYWRlcnM9QXJyYXkuZnJvbSh7bGVuZ3RoOnJlYWRlckNvdW50fSkubWFwKCgpPT57XG4vKiogQHR5cGUge1hpbXBvcnQoJ0BlbmRvL3N0cmVhbScpLkFzeW5jUXVldWU8UXVldWVQYXlsb2FkPn0gKi9cbmNvbnN0IHF1ZXVlPW1ha2VRdWV1ZSgpO1xucXVldWVzLnB1c2gocXVldWUpO1xuXG4vKiogQHR5cGUge0FzeW5jR2VuZXJhdG9yPFQsIHZvaWQsIHZvaWQ+fSAqL1xuY29uc3QgcmVhZGVyPWhhcmRlbih7XG4gICAgICBhc3luYyBuZXh0KCl7XG4vKiogQHR5cGUge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZUtpdDxJdGVyYXRvclJlc3VsdDxUPj59ICovXG5jb25zdHtwcm9taXNlLHJlc29sdmV9PW1ha2VQcm9taXNlS2l0KCk7XG5xdWV1ZS5wdXQoe3ZhbHVlOnJlc29sdmUsZG9uZTpmYWxzZX0pO1xucmV0dXJuIHByb21pc2U7XG4gfSxcbiAgICAgIGFzeW5jIHJldHVybigpe1xuLyoqIEB0eXBlIHtYaW1wb3J0KCdAZW5kby9wcm9taXNlLWtpdCcpLlByb21pc2VLaXQ8SXRlcmF0b3JSZXN1bHQ8VD4+fSAqL1xuY29uc3R7cHJvbWlzZSxyZXNvbHZlfT1tYWtlUHJvbWlzZUtpdCgpO1xucXVldWUucHV0KHt2YWx1ZTpyZXNvbHZlLGRvbmU6dHJ1ZX0pO1xucmV0dXJuIHByb21pc2U7XG4gfSxcbiAgICAgIGFzeW5jIHRocm93KHJlYXNvbil7XG5jb25zdCByZWplY3Rpb249UHJvbWlzZS5yZWplY3QocmVhc29uKTtcbnF1ZXVlLnB1dChyZWplY3Rpb24pO1xucmV0dXJuIHJlamVjdGlvbjtcbiB9LFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7XG5yZXR1cm4gcmVhZGVyO1xuIH19KTtcblxucmV0dXJuIHJlYWRlcjtcbiB9KTtcblxudm9pZCBwdWxsTmV4dCgpO1xucmV0dXJuIHJlYWRlcnM7XG4gfTskaOKAjV9vbmNlLnN5bmNocm9uaXplZFRlZShzeW5jaHJvbml6ZWRUZWUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJBU0lTX1BPSU5UUyI6WyJCQVNJU19QT0lOVFMiXSwiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiXSwib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdLCJsaXN0RGlmZmVyZW5jZSI6WyJsaXN0RGlmZmVyZW5jZSJdLCJ0aHJvd0xhYmVsZWQiOlsidGhyb3dMYWJlbGVkIl0sImFwcGx5TGFiZWxpbmdFcnJvciI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXSwiZGVlcGx5RnVsZmlsbGVkT2JqZWN0IjpbImRlZXBseUZ1bGZpbGxlZE9iamVjdCJdLCJtYWtlTWVhc3VyZVNlY29uZHMiOlsibWFrZU1lYXN1cmVTZWNvbmRzIl0sIm1ha2VBZ2dyZWdhdGVFcnJvciI6WyJtYWtlQWdncmVnYXRlRXJyb3IiXSwiUHJvbWlzZUFsbE9yRXJyb3JzIjpbIlByb21pc2VBbGxPckVycm9ycyJdLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IjpbImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiXSwiYXNzZXJ0QWxsRGVmaW5lZCI6WyJhc3NlcnRBbGxEZWZpbmVkIl0sImZvcmV2ZXIiOlsiZm9yZXZlciJdLCJ3aGlsZVRydWUiOlsid2hpbGVUcnVlIl0sInVudGlsVHJ1ZSI6WyJ1bnRpbFRydWUiXSwiemlwIjpbInppcCJdLCJhbGxWYWx1ZXMiOlsiYWxsVmFsdWVzIl0sInN5bmNocm9uaXplZFRlZSI6WyJzeW5jaHJvbml6ZWRUZWUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZ9DFitUSAADVEgAAMwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc3siaW1wb3J0cyI6WyIuL3N1YnNjcmliZS5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLHN1YnNjcmliZUxhdGVzdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBzdWJzY3JpYmVMYXRlc3RgIGZyb20gYEBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzYCBpbnN0ZWFkLlxuICpcbiAqIEFkYXB0b3IgZnJvbSBhIG5vdGlmaWVyUCB0byBhbiBhc3luYyBpdGVyYWJsZS5cbiAqIFRoZSBub3RpZmllclAgY2FuIGJlIGFueSBvYmplY3QgdGhhdCBoYXMgYW4gZXZlbnR1YWxseSBpbnZvY2FibGVcbiAqIGBnZXRVcGRhdGVTaW5jZWAgbWV0aG9kIHRoYXQgYmVoYXZlcyBhY2NvcmRpbmcgdG8gdGhlIG5vdGlmaWVyXG4gKiBzcGVjLiBUaGlzIGNhbiBiZSBhIG5vdGlmaWVyLCBhIHByb21pc2UgZm9yIGEgbG9jYWwgb3IgcmVtb3RlXG4gKiBub3RpZmllciwgb3IgYSBwcmVzZW5jZSBvZiBhIHJlbW90ZSBub3RpZmllci5cbiAqXG4gKiBJdCBpcyBhbHNvIHVzZWQgaW50ZXJuYWxseSBieSBub3RpZmllci5qcyBzbyB0aGF0IGEgbm90aWZpZXIgaXRzZWxmIGlzIGFuXG4gKiBhc3luYyBpdGVyYWJsZS5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYWJsZSBpcyBhbiBvYmplY3Qgd2l0aCBhIGBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClgIG1ldGhvZFxuICogdGhhdCByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhdG9yLiBUaGUgYXN5bmMgaXRlcmF0b3Igd2UgcmV0dXJuIGhlcmUgaGFzIG9ubHlcbiAqIGEgYG5leHQoKWAgbWV0aG9kLCB3aXRob3V0IHRoZSBvcHRpb25hbCBgcmV0dXJuYCBhbmQgYHRocm93YCBtZXRob2RzLiBUaGVcbiAqIG9taXR0ZWQgbWV0aG9kcywgaWYgcHJlc2VudCwgd291bGQgYmUgdXNlZCBieSB0aGUgZm9yL2F3YWl0L29mIGxvb3AgdG9cbiAqIGluZm9ybSB0aGUgaXRlcmF0b3Igb2YgZWFybHkgdGVybWluYXRpb24uIEJ1dCB0aGlzIGFkYXB0b3Igd291bGQgbm90IGRvXG4gKiBhbnl0aGluZyB1c2VmdWwgaW4gcmVhY3Rpb24gdG8gdGhpcyBub3RpZmljYXRpb24uXG4gKlxuICogQW4gYXN5bmMgaXRlcmF0b3IncyBgbmV4dCgpYCBtZXRob2QgcmV0dXJucyBhIHByb21pc2UgZm9yIGFuIGl0ZXJhdGlvblxuICogcmVzdWx0LiBBbiBpdGVyYXRpb24gcmVzdWx0IGlzIGEgcmVjb3JkIHdpdGggYHZhbHVlYCBhbmQgYGRvbmVgIHByb3BlcnRpZXMuXG4gKlxuICogVGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgb24gdGhlIG5vdGlmaWVyIHByb3RvY29sIGlzIHRvIGhhdmUgYSBsb3NzeVxuICogYWRhcHRvciwgd2hlcmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgY2FuIGJlIG1pc3NlZCBpbiBmYXZvciBvZiBtb3JlIHJlY2VudFxuICogcmVzdWx0cyB3aGljaCBhcmUgdGhlcmVmb3JlIGxlc3Mgc3RhbGUuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9kb2N1bWVudGF0aW9uL2Jsb2IvSEVBRC9tYWluL2d1aWRlcy9qcy1wcm9ncmFtbWluZy9ub3RpZmllcnMubWRcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEJhc2VOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyPXN1YnNjcmliZUxhdGVzdDtcblxuLyoqXG4gKiBUaGlzIGFkdmFuY2VzIGBhc3luY0l0ZXJhdG9yUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdG9yYCBmZWF0dXJlIHRlc3RzIGZvciB0aG9zZSBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhdG9yPFQ+Pn0gYXN5bmNJdGVyYXRvclBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjigI1fb25jZS5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZUl0ZXJhdG9yPShhc3luY0l0ZXJhdG9yUCxpdGVyYXRpb25PYnNlcnZlcik9PntcbnJldHVybiBuZXcgUHJvbWlzZSgoYWNrLG9ic2VydmVyRXJyb3IpPT57XG5jb25zdCByZWN1cj0oKT0+e1xuRS53aGVuKFxuRShhc3luY0l0ZXJhdG9yUCkubmV4dCgpLFxuKHt2YWx1ZSxkb25lfSk9PntcbmlmKGRvbmUpe1xuaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoJiZpdGVyYXRpb25PYnNlcnZlci5maW5pc2godmFsdWUpO1xuYWNrKHVuZGVmaW5lZCk7XG4gfWVsc2V7XG5pdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSYmXG5pdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSh2YWx1ZSk7XG5yZWN1cigpO1xuIH1cbiB9LFxuKHJlYXNvbik9Pntcbml0ZXJhdGlvbk9ic2VydmVyLmZhaWwmJml0ZXJhdGlvbk9ic2VydmVyLmZhaWwocmVhc29uKTtcbmFjayh1bmRlZmluZWQpO1xuIH0pLlxuY2F0Y2gob2JzZXJ2ZXJFcnJvcik7XG4gfTtcbnJlY3VyKCk7XG4gfSk7XG4gfTtcblxuLyoqXG4gKiBUaGlzIHJlYWRzIGZyb20gYGFzeW5jSXRlcmFibGVQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0aW9uYCBmZWF0dXJlIHRlc3RzIGZvciB0aG9zZSBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjigI1fb25jZS5vYnNlcnZlSXRlcmF0b3Iob2JzZXJ2ZUl0ZXJhdG9yKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlSXRlcmF0aW9uPShhc3luY0l0ZXJhYmxlUCxpdGVyYXRpb25PYnNlcnZlcik9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbnJldHVybiBvYnNlcnZlSXRlcmF0b3IoaXRlcmF0b3JQLGl0ZXJhdGlvbk9ic2VydmVyKTtcbiB9O1xuXG4vKipcbiAqIEFzIHVwZGF0ZXMgY29tZSBpbiBmcm9tIHRoZSBwb3NzaWJseSByZW1vdGUgYG5vdGlmaWVyUGAsIHVwZGF0ZVxuICogdGhlIGxvY2FsIGB1cGRhdGVyYC4gU2luY2UgdGhlIHVwZGF0ZXMgY29tZSBmcm9tIGEgbm90aWZpZXIsIHRoZXlcbiAqIGFyZSBsb3NzeSwgaS5lLiwgb25jZSBhIG1vcmUgcmVjZW50IHN0YXRlIGNhbiBiZSByZXBvcnRlZCwgbGVzcyByZWNlbnRcbiAqIHN0YXRlcyBhcmUgYXNzdW1lZCBpcnJlbGV2YW50IGFuZCBkcm9wcGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSBub3RpZmllclBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjigI1fb25jZS5vYnNlcnZlSXRlcmF0aW9uKG9ic2VydmVJdGVyYXRpb24pO1xuY29uc3QgICAgICAgIG9ic2VydmVOb3RpZmllcj0obm90aWZpZXJQLGl0ZXJhdGlvbk9ic2VydmVyKT0+XG5vYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmliZUxhdGVzdChub3RpZmllclApLGl0ZXJhdGlvbk9ic2VydmVyKTskaOKAjV9vbmNlLm9ic2VydmVOb3RpZmllcihvYnNlcnZlTm90aWZpZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl0sIm9ic2VydmVJdGVyYXRvciI6WyJvYnNlcnZlSXRlcmF0b3IiXSwib2JzZXJ2ZUl0ZXJhdGlvbiI6WyJvYnNlcnZlSXRlcmF0aW9uIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsL4vTxwHAAAcBwAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9ub3RpZmllci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3N1YnNjcmliZS5qcyIsIi4vc3Vic2NyaWJlci5qcyJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllcktpdCIsIm1ha2VOb3RpZmllcktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Iiwib2JzZXJ2ZUl0ZXJhdG9yIiwib2JzZXJ2ZUl0ZXJhdG9yIiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Iiwic3Vic2NyaWJlTGF0ZXN0Iiwic3Vic2NyaWJlTGF0ZXN0Il0sInJlZXhwb3J0cyI6WyIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vc3RvcmVzdWIuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbXV0sW1wiLi9ub3RpZmllci5qc1wiLCBbXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtdXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtdXSxbXCIuL3N0b3Jlc3ViLmpzXCIsIFtdXSxbXCIuL3N0b3JlZC1ub3RpZmllci5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3B1Ymxpc2gta2l0LmpzIjpbWyJtYWtlUHVibGlzaEtpdCIsIm1ha2VQdWJsaXNoS2l0Il0sWyJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiXSxbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIl0sWyJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUVhY2hUb3BpY0kiXSxbIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIiwiSXRlcmFibGVMYXRlc3RUb3BpY0kiXSxbIlN1YnNjcmliZXJTaGFwZSIsIlN1YnNjcmliZXJTaGFwZSJdXSwiLi9zdWJzY3JpYmUuanMiOltbInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVFYWNoIl0sWyJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiXV0sIi4vbm90aWZpZXIuanMiOltbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllciJdLFsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0Il0sWyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl0sWyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl1dLCIuL3N1YnNjcmliZXIuanMiOltbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uIl0sWyJtYWtlU3Vic2NyaXB0aW9uS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCJdXSwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyI6W1sib2JzZXJ2ZU5vdGlmaWVyIiwib2JzZXJ2ZU5vdGlmaWVyIl0sWyJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiXSxbIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0aW9uIl0sWyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADysAhlWhgAAFoYAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL25vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQsRSxGYXIsbWFrZVB1Ymxpc2hLaXQsc3Vic2NyaWJlTGF0ZXN0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVMYXRlc3RcIiwgWyRo4oCNX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHNoYXJhYmxlSW50ZXJuYWxzUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyPShzaGFyYWJsZUludGVybmFsc1ApPT57XG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4uc3Vic2NyaWJlTGF0ZXN0KHNoYXJhYmxlSW50ZXJuYWxzUCksXG5nZXRVcGRhdGVTaW5jZTphc3luYyh1cGRhdGVDb3VudCk9PlxuRShzaGFyYWJsZUludGVybmFsc1ApLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcblxuLyoqXG4gKiBVc2UgdGhpcyB0byBkaXN0cmlidXRlIGEgTm90aWZpZXIgZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIE5vdGlmaWVyIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VOb3RpZmllcmAgdG8gaXQgYXQgdGhlIG5ldyBzaXRlIHRvIGdldCBhbiBlcXVpdmFsZW50IGxvY2FsXG4gKiBOb3RpZmllciBhdCB0aGF0IHNpdGUuXG4gKi9cbmdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHM6YXN5bmMoKT0+c2hhcmFibGVJbnRlcm5hbHNQLFxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICogVXNlZCBvbmx5IGJ5IGBtYWtlQ2FzdGluZ1NwZWNGcm9tUmVmYC4gIEluc3RlYWQgdGhhdCBmdW5jdGlvbiBzaG91bGQgdXNlXG4gKiB0aGUgYFN0b3JlZEZhY2V0YCBBUEkuXG4gKi9cbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe25vdGlmaWVyfSl9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdWJzY3JpYmVyPFQ+Pn0gc3Vic2NyaWJlclxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovJGjigI1fb25jZS5tYWtlTm90aWZpZXIobWFrZU5vdGlmaWVyKTtcbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcj0oc3Vic2NyaWJlcik9Pntcbi8qKlxuICogQHR5cGUge0xhdGVzdFRvcGljPFQ+fVxuICovXG5jb25zdCBiYXNlTm90aWZpZXI9aGFyZGVuKHtcbmdldFVwZGF0ZVNpbmNlOih1cGRhdGVDb3VudD11bmRlZmluZWQpPT5cbkUoc3Vic2NyaWJlcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpfSk7XG5cblxuLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLm1ha2VOb3RpZmllcihiYXNlTm90aWZpZXIpLFxuLi4uYmFzZU5vdGlmaWVyfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9OyRo4oCNX29uY2UubWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIobWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcblxuLyoqXG4gKiBQcm9kdWNlcyBhIHBhaXIgb2Ygb2JqZWN0cywgd2hpY2ggYWxsb3cgYSBzZXJ2aWNlIHRvIHByb2R1Y2UgYSBzdHJlYW0gb2ZcbiAqIHVwZGF0ZSBwcm9taXNlcy5cbiAqXG4gKiBUaGUgaW5pdGlhbCBzdGF0ZSBhcmd1bWVudCBoYXMgdG8gYmUgdHJ1bHkgb3B0aW9uYWwgZXZlbiB0aG91Z2ggaXQgY2FuXG4gKiBiZSBhbnkgZmlyc3QgY2xhc3MgdmFsdWUgaW5jbHVkaW5nIGB1bmRlZmluZWRgLiBXZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZVxuICogcHJlc2VuY2UgdnMgdGhlIGFic2VuY2Ugb2YgaXQsIHdoaWNoIHdlIGNhbm5vdCBkbyB3aXRoIHRoZSBvcHRpb25hbCBhcmd1bWVudFxuICogc3ludGF4LiBSYXRoZXIgd2UgdXNlIHRoZSBhcml0eSBvZiB0aGUgYGluaXRpYWxTdGF0ZUFycmAgYXJyYXkuXG4gKlxuICogSWYgbm8gaW5pdGlhbCBzdGF0ZSBpcyBwcm92aWRlZCB0byBgbWFrZU5vdGlmaWVyS2l0YCwgdGhlbiBpdCBzdGFydHMgd2l0aG91dFxuICogYW4gaW5pdGlhbCBzdGF0ZS4gSXRzIGluaXRpYWwgc3RhdGUgd2lsbCBpbnN0ZWFkIGJlIHRoZSBzdGF0ZSBvZiB0aGUgZmlyc3RcbiAqIHVwZGF0ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbXSB8IFtUXX0gaW5pdGlhbFN0YXRlQXJyIHRoZSBmaXJzdCBzdGF0ZSB0byBiZSByZXR1cm5lZCAodHlwZWQgYXMgcmVzdCBhcnJheSB0byBwZXJtaXQgYHVuZGVmaW5lZGApXG4gKiBAcmV0dXJucyB7Tm90aWZpZXJSZWNvcmQ8VD59IHRoZSBub3RpZmllciBhbmQgdXBkYXRlclxuICovXG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyS2l0PSguLi5pbml0aWFsU3RhdGVBcnIpPT57XG4vKiogQHR5cGUge1B1Ymxpc2hLaXQ8VD59ICovXG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxuY29uc3Qgbm90aWZpZXI9bWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIoc3Vic2NyaWJlcik7XG5cbmNvbnN0IHVwZGF0ZXI9RmFyKCd1cGRhdGVyJyx7XG51cGRhdGVTdGF0ZTooc3RhdGUpPT5wdWJsaXNoZXIucHVibGlzaChzdGF0ZSksXG5maW5pc2g6KGNvbXBsZXRpb24pPT5wdWJsaXNoZXIuZmluaXNoKGNvbXBsZXRpb24pLFxuZmFpbDoocmVhc29uKT0+cHVibGlzaGVyLmZhaWwocmVhc29uKX0pO1xuXG5cbmFzc2VydChpbml0aWFsU3RhdGVBcnIubGVuZ3RoPD0xLCd0b28gbWFueSBhcmd1bWVudHMnKTtcbmlmKGluaXRpYWxTdGF0ZUFyci5sZW5ndGg9PT0xKXtcbnVwZGF0ZXIudXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlQXJyWzBdKTtcbiB9XG5cbi8qIG5vdGlmaWVyIGZhY2V0IGlzIHNlcGFyYXRlIHNvIGl0IGNhbiBiZSBoYW5kZWQgb3V0IHdoaWxlIHVwZGF0ZXIqL1xuLyogaXMgdGlnaHRseSBoZWxkKi9cbnJldHVybiBoYXJkZW4oe25vdGlmaWVyLHVwZGF0ZXJ9KTtcbiB9O1xuXG4vKipcbiAqIEFkYXB0b3IgZnJvbSBhc3luYyBpdGVyYWJsZSB0byBub3RpZmllci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBUaGUgcmVzdWx0aW5nIG5vdGlmaWVyIGlzIGxvc3NsZXNzLCB3aGljaCBpcyBub3QgZGVzaXJhYmxlLlxuICogUHJlZmVyIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyLCBhbmQgcmVmZXIgdG9cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNTQxMyBhbmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU2OTUgZm9yIGNvbnRleHQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqLyRo4oCNX29uY2UubWFrZU5vdGlmaWVyS2l0KG1ha2VOb3RpZmllcktpdCk7XG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGU9KGFzeW5jSXRlcmFibGVQKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG4vKiogQHR5cGUge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG5sZXQgb3B0TmV4dFByb21pc2U7XG5sZXQgY3VycmVudFVwZGF0ZUNvdW50PTBuO1xuLyoqIEB0eXBlIHtFUmVmPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IGN1cnJlbnRSZXNwb25zZTtcbmxldCBmaW5hbD1mYWxzZTtcblxuLyoqXG4gKiBAdHlwZSB7TGF0ZXN0VG9waWM8VD59XG4gKi9cbmNvbnN0IGJhc2VOb3RpZmllcj1GYXIoJ2Jhc2VOb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQ9LTFuKXtcbmlmKHVwZGF0ZUNvdW50PGN1cnJlbnRVcGRhdGVDb3VudCl7XG5pZihjdXJyZW50UmVzcG9uc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuIH1cbiB9ZWxzZSBpZih1cGRhdGVDb3VudCE9PWN1cnJlbnRVcGRhdGVDb3VudCl7XG50aHJvdyBFcnJvcihcbidnZXRVcGRhdGVTaW5jZSBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgdXBkYXRlQ291bnQuJyk7XG5cbiB9XG5cbi8qIFJldHVybiBhIGZpbmFsIHJlc3BvbnNlIGlmIHdlIGhhdmUgb25lLCBvdGhlcndpc2UgYSBwcm9taXNlIGZvciB0aGUgbmV4dCBzdGF0ZS4qL1xuaWYoZmluYWwpe1xuYXNzZXJ0KGN1cnJlbnRSZXNwb25zZSE9PXVuZGVmaW5lZCk7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuaWYoIW9wdE5leHRQcm9taXNlKXtcbmNvbnN0IG5leHRJdGVyUmVzdWx0UD1FKGl0ZXJhdG9yUCkubmV4dCgpO1xub3B0TmV4dFByb21pc2U9RS53aGVuKFxubmV4dEl0ZXJSZXN1bHRQLFxuKHtkb25lLHZhbHVlfSk9PntcbmFzc2VydCghZmluYWwpO1xuaWYoZG9uZSl7XG5maW5hbD10cnVlO1xuIH1cbmN1cnJlbnRVcGRhdGVDb3VudCs9MW47XG5jdXJyZW50UmVzcG9uc2U9aGFyZGVuKHtcbnZhbHVlLFxudXBkYXRlQ291bnQ6ZG9uZT91bmRlZmluZWQ6Y3VycmVudFVwZGF0ZUNvdW50fSk7XG5cbm9wdE5leHRQcm9taXNlPXVuZGVmaW5lZDtcbnJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gfSxcbihfcmVhc29uKT0+e1xuZmluYWw9dHJ1ZTtcbmN1cnJlbnRSZXNwb25zZT1cbi8qKiBAdHlwZSB7UHJvbWlzZTxVcGRhdGVSZWNvcmQ8VD4+fSAqL1xubmV4dEl0ZXJSZXN1bHRQO1xub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9KTtcblxuIH1cbnJldHVybiBvcHROZXh0UHJvbWlzZTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi8qIERvbid0IGxlYWsgdGhlIG9yaWdpbmFsIGFzeW5jSXRlcmFibGVQIHNpbmNlIGl0IG1heSBiZSByZW1vdGUgYW5kIHdlIGFsc28qL1xuLyogd2FudCB0aGUgc2FtZSBzZW1hbnRpY3MgZm9yIHRoaXMgZXhwb3NlZCBpdGVyYWJsZSBhbmQgdGhlIGJhc2VOb3RpZmllci4qL1xuLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXJ9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZShtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiXSwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiOlsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCJdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADXOBOWgDgAAIA4AAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3B1Ymxpc2gta2l0LmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9mYXIiLCJAZW5kby9wYXR0ZXJucyIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIiwiUHVibGlzaGVySSIsIlN1YnNjcmliZXJJIiwiU3Vic2NyaWJlclNoYXBlIiwiVXBkYXRlQ291bnRTaGFwZSIsIm1ha2VQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHVibGlzaEtpdElLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgY2FuQmVEdXJhYmxlLHByZXBhcmVFeG9DbGFzc0tpdCxFLEZhcixNLG1ha2VQcm9taXNlS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLCBbJGjigI1fYSA9PiAoY2FuQmVEdXJhYmxlID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBzaW5rPSgpPT57IH07XG5jb25zdCBtYWtlUXVpZXRSZWplY3Rpb249KHJlYXNvbik9PntcbmNvbnN0IHJlamVjdGlvbj1oYXJkZW4oUHJvbWlzZS5yZWplY3QocmVhc29uKSk7XG52b2lkIEUud2hlbihyZWplY3Rpb24sc2luayxzaW5rKTtcbnJldHVybiByZWplY3Rpb247XG4gfTtcbmNvbnN0IHRvb0ZhclJlamVjdGlvbj1tYWtlUXVpZXRSZWplY3Rpb24oXG5oYXJkZW4obmV3IEVycm9yKCdDYW5ub3QgcmVhZCBwYXN0IGVuZCBvZiBpdGVyYXRpb24uJykpKTtcblxuXG5jb25zdCAgICAgICAgUHVibGlzaGVyST1NLmludGVyZmFjZSgnUHVibGlzaGVyJyx7XG5wdWJsaXNoOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5maW5pc2g6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWw6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKX0pO1xuXG5cbi8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIE5vdGlmaWVyIGBnZXRVcGRhdGVTaW5jZWAuKi8kaOKAjV9vbmNlLlB1Ymxpc2hlckkoUHVibGlzaGVySSk7XG5jb25zdCAgICAgICAgVXBkYXRlQ291bnRTaGFwZT1NLm9yKE0uYmlnaW50KCksTS5udW1iZXIoKSk7JGjigI1fb25jZS5VcGRhdGVDb3VudFNoYXBlKFVwZGF0ZUNvdW50U2hhcGUpO1xuY29uc3QgICAgICAgIFN1YnNjcmliZXJJPU0uaW50ZXJmYWNlKCdTdWJzY3JpYmVyJyx7XG5zdWJzY3JpYmVBZnRlcjpNLmNhbGwoKS5vcHRpb25hbChNLmJpZ2ludCgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldFVwZGF0ZVNpbmNlOk0uY2FsbCgpLm9wdGlvbmFsKFVwZGF0ZUNvdW50U2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7JGjigI1fb25jZS5TdWJzY3JpYmVySShTdWJzY3JpYmVySSk7XG5cbmNvbnN0ICAgICAgICBwdWJsaXNoS2l0SUtpdD1oYXJkZW4oe1xucHVibGlzaGVyOlB1Ymxpc2hlckksXG5zdWJzY3JpYmVyOlN1YnNjcmliZXJJfSk7JGjigI1fb25jZS5wdWJsaXNoS2l0SUtpdChwdWJsaXNoS2l0SUtpdCk7XG5cblxuY29uc3QgICAgICAgIEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGU9TS5pbnRlcmZhY2UoXG4nRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InLFxue1xuZm9yazpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLC8qIG9vcHM6IHJlY3Vyc2l2ZSB0eXBlKi9cbm5leHQ6TS5jYWxsV2hlbigpLnJldHVybnMoTS5hbnkoKSl9KTskaOKAjV9vbmNlLkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUoRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSk7XG5cblxuXG5jb25zdCAgICAgICAgSXRlcmFibGVFYWNoVG9waWNJPU0uaW50ZXJmYWNlKCdJdGVyYWJsZUVhY2hUb3BpYycse1xuc3Vic2NyaWJlQWZ0ZXI6U3Vic2NyaWJlckkubWV0aG9kR3VhcmRzLnN1YnNjcmliZUFmdGVyLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJykpfSk7JGjigI1fb25jZS5JdGVyYWJsZUVhY2hUb3BpY0koSXRlcmFibGVFYWNoVG9waWNJKTtcblxuXG5cbmNvbnN0ICAgICAgICBJdGVyYWJsZUxhdGVzdFRvcGljST1NLmludGVyZmFjZSgnSXRlcmFibGVMYXRlc3RUb3BpYycse1xuZ2V0VXBkYXRlU2luY2U6U3Vic2NyaWJlckkubWV0aG9kR3VhcmRzLmdldFVwZGF0ZVNpbmNlLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJykpfSk7XG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBBcmdcbiAqIEB0ZW1wbGF0ZSBSZXRcbiAqIEBwYXJhbSB7KGFyZzogQXJnKSA9PiBSZXR9IGZuXG4gKiBAcmV0dXJucyB7KGFyZzogQXJnKSA9PiBSZXR9XG4gKi8kaOKAjV9vbmNlLkl0ZXJhYmxlTGF0ZXN0VG9waWNJKEl0ZXJhYmxlTGF0ZXN0VG9waWNJKTtcbmNvbnN0IHdlYWtNZW1vaXplVW5hcnk9KGZuKT0+e1xuY29uc3QgY2FjaGU9bmV3IFdlYWtNYXAoKTtcbnJldHVybihhcmcpPT57XG4vKiogQHR5cGUge29iamVjdH0gKi9cbmNvbnN0IG9hcmc9YXJnO1xuaWYoY2FjaGUuaGFzKG9hcmcpKXtcbnJldHVybiBjYWNoZS5nZXQob2FyZyk7XG4gfVxuY29uc3QgcmVzdWx0PWZuKGFyZyk7XG5jYWNoZS5zZXQob2FyZyxyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UHVibGljYXRpb25SZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge1VwZGF0ZVJlY29yZDxUPn1cbiAqL1xuY29uc3QgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZD0ocmVjb3JkKT0+e1xuY29uc3R7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudH09XG5yZWNvcmQ7XG5pZihkb25lKXtcbi8qIEZpbmFsIHJlc3VsdHMgaGF2ZSB1bmRlZmluZWQgdXBkYXRlQ291bnQuKi9cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OnVuZGVmaW5lZH0pO1xuIH1cbnJldHVybiBoYXJkZW4oe3ZhbHVlLHVwZGF0ZUNvdW50OnB1Ymxpc2hDb3VudH0pO1xuIH07XG5cbi8qKlxuICogTWFrZXMgYSBgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfWAgcGFpciBmb3IgZG9pbmcgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViIHN1cHBvcnRpbmcgYm90aCBcImVhY2hcIiBhbmQgXCJsYXRlc3RcIiBpdGVyYXRpb25cbiAqIG9mIHB1Ymxpc2hlZCB2YWx1ZXMuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQdWJsaXNoS2l0PFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVB1Ymxpc2hLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7UHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59ICovXG5sZXQgdGFpbFA7XG4vKiogQHR5cGUge3VuZGVmaW5lZCB8ICgodmFsdWU6IEVSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+KSA9PiB2b2lkKX0gKi9cbmxldCB0YWlsUjtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcblxubGV0IGN1cnJlbnRQdWJsaXNoQ291bnQ9MG47XG5sZXQgY3VycmVudFA9dGFpbFA7XG5jb25zdCBhZHZhbmNlQ3VycmVudD0oZG9uZSx2YWx1ZSxyZWplY3Rpb24pPT57XG5pZih0YWlsUj09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbmN1cnJlbnRQdWJsaXNoQ291bnQrPTFuO1xuY3VycmVudFA9dGFpbFA7XG5jb25zdCByZXNvbHZlQ3VycmVudD10YWlsUjtcblxuaWYoZG9uZSl7XG50YWlsUD10b29GYXJSZWplY3Rpb247XG50YWlsUj11bmRlZmluZWQ7XG4gfWVsc2V7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG4gfVxuXG5pZihyZWplY3Rpb24pe1xucmVzb2x2ZUN1cnJlbnQocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbnJlc29sdmVDdXJyZW50KFxuaGFyZGVuKHtcbmhlYWQ6e3ZhbHVlLGRvbmV9LFxucHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG4gfTtcblxuY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkPXdlYWtNZW1vaXplVW5hcnkoXG5tYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkKTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7U3Vic2NyaWJlcjxUPn1cbiAqL1xuY29uc3Qgc3Vic2NyaWJlcj1GYXIoJ1N1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQ9LTFuKT0+e1xuYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsJ2JpZ2ludCcpO1xuaWYocHVibGlzaENvdW50PT09Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gdGFpbFA7XG4gfWVsc2UgaWYocHVibGlzaENvdW50PGN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1lbHNle1xudGhyb3cgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9LFxuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+e1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gfVxudXBkYXRlQ291bnQ9QmlnSW50KHVwZGF0ZUNvdW50KTtcbnJldHVybihcbnN1YnNjcmliZXJcbi8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4vKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuLyogc2FtZSBjcmFuay4uLiovLlxuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4vKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbi8qIGZ1cnRoZXIgb25lcy4qLy5cbnRoZW4oKCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSkpO1xuXG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7UHVibGlzaGVyPFQ+fSAqL1xuY29uc3QgcHVibGlzaGVyPUZhcignUHVibGlzaGVyJyx7XG5wdWJsaXNoOih2YWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KGZhbHNlLHZhbHVlKTtcbiB9LFxuZmluaXNoOihmaW5hbFZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSxmaW5hbFZhbHVlKTtcbiB9LFxuZmFpbDoocmVhc29uKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSx1bmRlZmluZWQsbWFrZVF1aWV0UmVqZWN0aW9uKHJlYXNvbikpO1xuIH19KTtcblxucmV0dXJuIGhhcmRlbih7cHVibGlzaGVyLHN1YnNjcmliZXJ9KTtcbiB9OyRo4oCNX29uY2UubWFrZVB1Ymxpc2hLaXQobWFrZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VQdWJsaXNoS2l0KTtcblxuY29uc3QgRHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZVNoYXBlPWhhcmRlbih7XG52YWx1ZUR1cmFiaWxpdHk6TS5hbnkoKSxcbnB1Ymxpc2hDb3VudDpNLmFueSgpLFxuc3RhdHVzOk0uYW55KCksXG5oYXNWYWx1ZTpNLmFueSgpLFxudmFsdWU6TS5hbnkoKX0pO1xuXG5cbi8qIFRPRE86IE1vdmUgZHVyYWJsZSBwdWJsaXNoIGtpdCB0byBhIG5ldyBmaWxlPyovXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFZhbHVlRHVyYWJpbGl0eSAmICdtYW5kYXRvcnknfSBbb3B0aW9ucy52YWx1ZUR1cmFiaWxpdHk9J21hbmRhdG9yeSddXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX1cbiAqL1xuY29uc3QgaW5pdER1cmFibGVQdWJsaXNoS2l0U3RhdGU9KG9wdGlvbnM9e30pPT57XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHk9J21hbmRhdG9yeSd9PW9wdGlvbnM7XG5hc3NlcnQuZXF1YWwodmFsdWVEdXJhYmlsaXR5LCdtYW5kYXRvcnknKTtcbnJldHVybntcbi8qIGNvbmZpZ3VyYXRpb24qL1xudmFsdWVEdXJhYmlsaXR5LFxuXG4vKiBsaWZlY3ljbGUgcHJvZ3Jlc3MqL1xucHVibGlzaENvdW50OjBuLFxuc3RhdHVzOidsaXZlJywvKiB8ICdmaW5pc2hlZCcgfCAnZmFpbGVkJyovXG5cbi8qIHBlcnNpc3RlZCByZXN1bHQgZGF0YSovXG4vKiBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gbm9uLXRlcm1pbmFsIHZhbHVlcyBmcm9tIGBwdWJsaXNoYCwqL1xuLyogdmFsdWUgYWxzbyBob2xkcyB0aGUgdGVybWluYWwgdmFsdWUgZnJvbSBgZmluaXNoYCBvciBgZmFpbGAuKi9cbmhhc1ZhbHVlOmZhbHNlLFxudmFsdWU6dW5kZWZpbmVkfTtcblxuIH07XG5cbi8qIFdlIG5lZWQgdGhlIFdlYWtNYXAga2V5IGZvciBhIGtpdCB0byBiZSBhIHZyZWYtYmVhcmluZyBvYmplY3QqL1xuLyogaW4gaXRzIGNvaG9ydCwgYW5kIGhhdmUgYXJiaXRyYXJpbHkgY2hvc2VuIHRoZSBwdWJsaXNoZXIgZmFjZXQuKi9cbi8qKiBAdHlwZWRlZiB7UHVibGlzaGVyPCo+fSBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleSAqL1xuLyoqXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5fVxuICovXG5jb25zdCBnZXRFcGhlbWVyYWxLZXk9KGZhY2V0cyk9PmZhY2V0cy5wdWJsaXNoZXI7XG5cbi8qKlxuICogQHR5cGVkZWYgRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhXG4gKiBAcHJvcGVydHkge1Byb21pc2U8Kj4gfCB1bmRlZmluZWR9IGN1cnJlbnRQIFRoZSBjdXJyZW50LXJlc3VsdCBwcm9taXNlXG4gKiAgICh1bmRlZmluZWQgdW5sZXNzIHJlc29sdmVkIHdpdGggdW5yZWNvdmVyYWJsZSBlcGhlbWVyYWwgZGF0YSlcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTwqPn0gdGFpbFAgVGhlIG5leHQtcmVzdWx0IHByb21pc2VcbiAqIEBwcm9wZXJ0eSB7KCh2YWx1ZTogYW55KSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gdGFpbFIgVGhlIG5leHQtcmVzdWx0IHJlc29sdmVyXG4gKiAgICh1bmRlZmluZWQgd2hlbiB0aGUgcHVibGlzaCBraXQgaGFzIHRlcm1pbmF0ZWQpXG4gKi9cblxuLyoqIEB0eXBlIHtXZWFrTWFwPER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5LCBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE+fSAqL1xuY29uc3QgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudC1yZXN1bHQgcHJvbWlzZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBkdXJhYmxlXG4gKiBwdWJsaXNoIGtpdCwgcmVjcmVhdGVkIHVubGVzcyB3ZSBhbHJlYWR5IGhhdmUgb25lIHdpdGggcmV0YWluZWRcbiAqIGVwaGVtZXJhbCBkYXRhLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcGFyYW0ge1Byb21pc2U8Kj59IHRhaWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPCo+fVxuICovXG5jb25zdCBwcm92aWRlQ3VycmVudFA9KHN0YXRlLGZhY2V0cyx0YWlsKT0+e1xuY29uc3QgZXBoZW1lcmFsS2V5PWdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuY29uc3QgZm91bmREYXRhPWR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbmNvbnN0IGN1cnJlbnRQPWZvdW5kRGF0YSYmZm91bmREYXRhLmN1cnJlbnRQO1xuaWYoY3VycmVudFApe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1cblxuY29uc3R7cHVibGlzaENvdW50LHN0YXR1cyxoYXNWYWx1ZSx2YWx1ZX09c3RhdGU7XG5pZighaGFzVmFsdWUpe1xuYXNzZXJ0KHN0YXR1cz09PSdsaXZlJyk7XG5yZXR1cm4gdGFpbDtcbiB9XG5pZihzdGF0dXM9PT0nbGl2ZSd8fHN0YXR1cz09PSdmaW5pc2hlZCcpe1xuY29uc3QgY2VsbD1oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZTpzdGF0dXMhPT0nbGl2ZSd9LFxucHVibGlzaENvdW50LFxudGFpbH0pO1xuXG5yZXR1cm4gRS5yZXNvbHZlKGNlbGwpO1xuIH1lbHNlIGlmKHN0YXR1cz09PSdmYWlsZWQnKXtcbnJldHVybiBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuIH1lbHNle1xudGhyb3cgRmFpbCBgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiB9XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBuZXh0LXJlc3VsdCBwcm9taXNlIGFuZCByZXNvbHZlciBhc3NvY2lhdGVkIHdpdGggYSBnaXZlblxuICogZHVyYWJsZSBwdWJsaXNoIGtpdC5cbiAqIFRoZXNlIGFyZSBsb3N0IG9uIHVwZ3JhZGUgYnV0IHJlY3JlYXRlZCBvbi1kZW1hbmQsIHByZXNlcnZpbmcgdGhlXG4gKiB2YWx1ZSBpbiAoYnV0IG5vdCB0aGUgaWRlbnRpdHkgb2YpIHRoZSBjdXJyZW50IHsgdmFsdWUsIGRvbmUgfSByZXN1bHRcbiAqIHdoZW4gcG9zc2libGUsIHdoaWNoIGlzIGFsd2F5cyB0aGUgY2FzZSB3aGVuIHRoYXQgdmFsdWUgaXMgdGVybWluYWxcbiAqIChpLmUuLCBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYCkgb3Igd2hlbiB0aGUgZHVyYWJsZSBwdWJsaXNoIGtpdCBpc1xuICogY29uZmlndXJlZCB3aXRoIGB2YWx1ZUR1cmFiaWxpdHk6ICdtYW5kYXRvcnknYC5cbiAqXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0U3RhdGV9IHN0YXRlXG4gKiBAcGFyYW0ge1B1Ymxpc2hLaXQ8Kj59IGZhY2V0c1xuICogQHJldHVybnMge0R1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YX1cbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YT0oc3RhdGUsZmFjZXRzKT0+e1xuY29uc3QgZXBoZW1lcmFsS2V5PWdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuY29uc3QgZm91bmREYXRhPWR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbmlmKGZvdW5kRGF0YSl7XG5yZXR1cm4gZm91bmREYXRhO1xuIH1cblxuY29uc3R7c3RhdHVzfT1zdGF0ZTtcbmxldCB0YWlsUDtcbmxldCB0YWlsUjtcbmlmKHN0YXR1cz09PSdsaXZlJyl7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG52b2lkIEUud2hlbih0YWlsUCxzaW5rLHNpbmspO1xuIH1lbHNlIGlmKHN0YXR1cz09PSdmaW5pc2hlZCd8fHN0YXR1cz09PSdmYWlsZWQnKXtcbnRhaWxQPXRvb0ZhclJlamVjdGlvbjtcbiB9ZWxzZXtcbnRocm93IEZhaWwgYEludmFsaWQgZHVyYWJsZSBwcm9taXNlIGtpdCBzdGF0dXM6ICR7cShzdGF0dXMpfWA7XG4gfVxuLyogY3VycmVudFAgaXMgbm90IGVwaGVtZXJhbCB3aGVuIHJlc3RvcmluZyBmcm9tIHBlcnNpc3RlZCBzdGF0ZS4qL1xuY29uc3Qgb2JqPWhhcmRlbih7Y3VycmVudFA6dW5kZWZpbmVkLHRhaWxQLHRhaWxSfSk7XG5kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KGVwaGVtZXJhbEtleSxvYmopO1xucmV0dXJuIG9iajtcbiB9O1xuXG4vKipcbiAqIEV4dGVuZHMgdGhlIHNlcXVlbmNlIG9mIHJlc3VsdHMuXG4gKlxuICogQHBhcmFtIHt7c3RhdGU6IER1cmFibGVQdWJsaXNoS2l0U3RhdGUsIGZhY2V0czogUHVibGlzaEtpdDwqPn19IGNvbnRleHRcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlWydzdGF0dXMnXX0gW3RhcmdldFN0YXR1c11cbiAqL1xuY29uc3QgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0PShjb250ZXh0LHZhbHVlLHRhcmdldFN0YXR1cz0nbGl2ZScpPT57XG5jb25zdHtzdGF0ZSxmYWNldHN9PWNvbnRleHQ7XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHksc3RhdHVzfT1zdGF0ZTtcbmlmKHN0YXR1cyE9PSdsaXZlJyl7XG50aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5jb25zdCBkb25lPXRhcmdldFN0YXR1cyE9PSdsaXZlJztcbmlmKGRvbmV8fHZhbHVlRHVyYWJpbGl0eT09PSdtYW5kYXRvcnknKXtcbmNhbkJlRHVyYWJsZSh2YWx1ZSl8fEZhaWwgYENhbm5vdCBhY2NlcHQgbm9uLWR1cmFibGUgdmFsdWU6ICR7dmFsdWV9YDtcbiB9XG5jb25zdHt0YWlsUDpvbGRUYWlsUCx0YWlsUjpyZXNvbHZlT2xkVGFpbH09XG5wcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKHN0YXRlLGZhY2V0cyk7XG5hc3NlcnQudHlwZW9mKHJlc29sdmVPbGRUYWlsLCdmdW5jdGlvbicpO1xuXG5jb25zdCBwdWJsaXNoQ291bnQ9c3RhdGUucHVibGlzaENvdW50KzFuO1xuc3RhdGUucHVibGlzaENvdW50PXB1Ymxpc2hDb3VudDtcblxubGV0IHRhaWxQO1xubGV0IHRhaWxSO1xuaWYoZG9uZSl7XG5zdGF0ZS5zdGF0dXM9dGFyZ2V0U3RhdHVzO1xudGFpbFA9dG9vRmFyUmVqZWN0aW9uO1xudGFpbFI9dW5kZWZpbmVkO1xuIH1lbHNle1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xudm9pZCBFLndoZW4odGFpbFAsc2luayxzaW5rKTtcbiB9XG5cbmxldCBjdXJyZW50UDtcbmlmKHRhcmdldFN0YXR1cz09PSdmYWlsZWQnKXtcbnN0YXRlLmhhc1ZhbHVlPXRydWU7XG5zdGF0ZS52YWx1ZT12YWx1ZTtcbmNvbnN0IHJlamVjdGlvbj1tYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xucmVzb2x2ZU9sZFRhaWwocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbi8qIFBlcnNpc3QgYSB0ZXJtaW5hbCB2YWx1ZSwgb3IgYSBub24tdGVybWluYWwgdmFsdWUqL1xuLyogaWYgY29uZmlndXJlZCBhcyAnbWFuZGF0b3J5JyBvciAnb3Bwb3J0dW5pc3RpYycuKi9cbmlmKGRvbmV8fHZhbHVlRHVyYWJpbGl0eSE9PSdpZ25vcmVkJyYmY2FuQmVEdXJhYmxlKHZhbHVlKSl7XG5zdGF0ZS5oYXNWYWx1ZT10cnVlO1xuc3RhdGUudmFsdWU9dmFsdWU7XG4gfWVsc2V7XG5zdGF0ZS5oYXNWYWx1ZT1mYWxzZTtcbnN0YXRlLnZhbHVlPXVuZGVmaW5lZDtcbi8qIFJldGFpbiBhbnkgcHJvbWlzZSB3aXRoIG5vbi1kdXJhYmxlIHJlc29sdXRpb24uKi9cbmN1cnJlbnRQPW9sZFRhaWxQO1xuIH1cblxucmVzb2x2ZU9sZFRhaWwoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG5cbmR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoXG5nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKSxcbmhhcmRlbih7Y3VycmVudFAsdGFpbFAsdGFpbFJ9KSk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi4vLi4vdmF0LWRhdGEvc3JjL3R5cGVzLmpzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQ9KGJhZ2dhZ2Usa2luZE5hbWUpPT57XG4vKiBUT0RPOiBPbmNlIHdlIHVuaWZ5IHdpdGggbWFrZVB1Ymxpc2hLaXQsIHdlIHdpbGwgdXNlIGEgWm9uZS1jb21wYXRpYmxlIHdlYWsqL1xuLyogbWFwIGZvciBtZW1vaXphdGlvbi4qL1xuY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkPW1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQ7XG5cbi8qKlxuICogQHJldHVybnMgeygpID0+IFB1Ymxpc2hLaXQ8Kj59XG4gKi9cbnJldHVybiBwcmVwYXJlRXhvQ2xhc3NLaXQoXG5iYWdnYWdlLFxua2luZE5hbWUsXG5wdWJsaXNoS2l0SUtpdCxcbmluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlLFxue1xuLyogVGhlIHB1Ymxpc2hlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuLyogYWNjZXB0cyBuZXcgdmFsdWVzLiovXG5wdWJsaXNoZXI6e1xucHVibGlzaCh2YWx1ZSl7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyx2YWx1ZSk7XG4gfSxcbmZpbmlzaChmaW5hbFZhbHVlKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLGZpbmFsVmFsdWUsJ2ZpbmlzaGVkJyk7XG4gfSxcbmZhaWwocmVhc29uKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLHJlYXNvbiwnZmFpbGVkJyk7XG4gfX0sXG5cblxuLyogVGhlIHN1YnNjcmliZXIgZmFjZXQgb2YgYSBkdXJhYmxlIHB1Ymxpc2gga2l0Ki9cbi8qIHByb3BhZ2F0ZXMgdmFsdWVzLiovXG5zdWJzY3JpYmVyOntcbnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudD0tMW4pe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xuY29uc3R7cHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnR9PXN0YXRlO1xuY29uc3R7Y3VycmVudFAsdGFpbFB9PXByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoXG5zdGF0ZSxcbmZhY2V0cyk7XG5cbmlmKHB1Ymxpc2hDb3VudD09PWN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIHRhaWxQO1xuIH1lbHNlIGlmKHB1Ymxpc2hDb3VudDxjdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiBjdXJyZW50UHx8cHJvdmlkZUN1cnJlbnRQKHN0YXRlLGZhY2V0cyx0YWlsUCk7XG4gfWVsc2V7XG50aHJvdyBFcnJvcihcbidzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicpO1xuXG4gfVxuIH0sXG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCl7XG5jb25zdHtcbmZhY2V0czp7c3Vic2NyaWJlcn19PVxudGhpcztcbmlmKHVwZGF0ZUNvdW50PT09dW5kZWZpbmVkKXtcbnJldHVybiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCkudGhlbihtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQpO1xuIH1cbnVwZGF0ZUNvdW50PUJpZ0ludCh1cGRhdGVDb3VudCk7XG5yZXR1cm4oXG5zdWJzY3JpYmVyXG4vKiBgc3Vic2NyaWJlQWZ0ZXJgIG1heSByZXNvbHZlIHdpdGggdGhlIHVwZGF0ZSByZWNvcmQgbnVtYmVyZWQqL1xuLyogYHVwZGF0ZUNvdW50ICsgMWAsIGV2ZW4gaWYgc2V2ZXJhbCB1cGRhdGVzIGFyZSBwdWJsaXNoZWQgaW4gdGhlKi9cbi8qIHNhbWUgY3JhbmsuLi4qLy5cbnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuLyogLi4uIHNvIHdlIHBvbGwgdGhlIGxhdGVzdCBwdWJsaXNoZWQgdXBkYXRlLCB3aXRob3V0IHdhaXRpbmcgZm9yIGFueSovXG4vKiBmdXJ0aGVyIG9uZXMuKi8uXG50aGVuKCgpPT5zdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKCkpKTtcblxuIH19fSxcblxuXG57XG5zdGF0ZVNoYXBlOkR1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZX0pO1xuXG5cbiB9OyRo4oCNX29uY2UucHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5oYXJkZW4ocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcblxuY29uc3QgICAgICAgIFN1YnNjcmliZXJTaGFwZT1NLnJlbW90YWJsZSgnU3Vic2NyaWJlcicpOyRo4oCNX29uY2UuU3Vic2NyaWJlclNoYXBlKFN1YnNjcmliZXJTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHVibGlzaGVySSI6WyJQdWJsaXNoZXJJIl0sIlVwZGF0ZUNvdW50U2hhcGUiOlsiVXBkYXRlQ291bnRTaGFwZSJdLCJTdWJzY3JpYmVySSI6WyJTdWJzY3JpYmVySSJdLCJwdWJsaXNoS2l0SUtpdCI6WyJwdWJsaXNoS2l0SUtpdCJdLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSwiSXRlcmFibGVFYWNoVG9waWNJIjpbIkl0ZXJhYmxlRWFjaFRvcGljSSJdLCJJdGVyYWJsZUxhdGVzdFRvcGljSSI6WyJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLCJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCJdLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiOlsicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Il0sIlN1YnNjcmliZXJTaGFwZSI6WyJTdWJzY3JpYmVyU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvgEwJIMKAACDCgAALgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZWQtbm90aWZpZXIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxFLEZhcixvYnNlcnZlTm90aWZpZXI7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsIFskaOKAjV9hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZU5vdGlmaWVyXCIsIFskaOKAjV9hID0+IChvYnNlcnZlTm90aWZpZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD4gJiBPbWl0PFN0b3JlZEZhY2V0LCAnZ2V0U3RvcmVLZXknPn0gU3RvcmVkTm90aWZpZXJcbiAqL1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkTm90aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8VD4+fSBub3RpZmllclxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZE5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZE5vdGlmaWVyPShub3RpZmllcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0QWxsRGVmaW5lZCh7bm90aWZpZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcn0pO1xuXG5jb25zdCBtYXJzaGFsbFRvU3RvcmFnZT1tYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpO1xuXG5vYnNlcnZlTm90aWZpZXIobm90aWZpZXIse1xudXBkYXRlU3RhdGUodmFsdWUpe1xubWFyc2hhbGxUb1N0b3JhZ2UodmFsdWUpLmNhdGNoKChyZWFzb24pPT5cbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byB1cGRhdGVTdGF0ZScscmVhc29uKSk7XG5cbiB9LFxuZmFpbChyZWFzb24pe1xuY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLHJlYXNvbik7XG4gfX0pLlxuY2F0Y2goKHJlYXNvbik9PntcbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGhhbHRlZCBpdGVyYXRpb24nLHJlYXNvbik7XG4gfSk7XG5cbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG5mcm9tQ2FwRGF0YTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSl9KTtcblxuXG4vKiogQHR5cGUge1N0b3JlZE5vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgc3RvcmVkTm90aWZpZXI9RmFyKCdTdG9yZWROb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+RShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuZ2V0UGF0aDooKT0+RShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXJ9KTtcblxucmV0dXJuIHN0b3JlZE5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkTm90aWZpZXIobWFrZVN0b3JlZE5vdGlmaWVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RvcmVkTm90aWZpZXIiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAARUS3HVIQAA1SEAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVzdWIuanN7ImltcG9ydHMiOlsiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyIsIi4vc3Vic2NyaWJlci5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCIsIm1ha2VTdG9yZWRQdWJsaXNoS2l0IiwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCIsIm1ha2VTdG9yZWRTdWJzY3JpYmVyIiwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixtYWtlTWFyc2hhbCxhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Usb2JzZXJ2ZUl0ZXJhdGlvbixtYWtlUHVibGlzaEtpdCxtYWtlU3Vic2NyaXB0aW9uS2l0LHN1YnNjcmliZUVhY2g7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLCBbJGjigI1fYSA9PiAobWFrZU1hcnNoYWwgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsIFskaOKAjV9hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjigI1fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVJdGVyYXRpb25cIiwgWyRo4oCNX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaOKAjV9hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVN1YnNjcmlwdGlvbktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogTkI6IGRvZXMgbm90IHlldCBzdXJ2aXZlIHVwZ3JhZGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82ODkzXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHsodjogVCkgPT4gdm9pZH0gY29uc3VtZVZhbHVlXG4gKi9cbmNvbnN0ICAgICAgICBmb3JFYWNoUHVibGljYXRpb25SZWNvcmQ9YXN5bmMoc3Vic2NyaWJlcixjb25zdW1lVmFsdWUpPT57XG4vKiBXZSBvcGVuLWNvZGUgdGhlIGZvci1hd2FpdC1vZiBpbXBsZW1lbnRhdGlvbiByYXRoZXIgdGhhbiB1c2luZyB0aGF0IHN5bnRheCovXG4vKiBkaXJlY3RseSBiZWNhdXNlIHdlIHdhbnQgdG8gcnVuIHRoZSBjb25zdW1lciBvbiB0aGUgZG9uZSB2YWx1ZSBhcyB3ZWxsLiovXG5jb25zdCBpdGVyYXRvcj1zdWJzY3JpYmVFYWNoKHN1YnNjcmliZXIpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG5sZXQgZmluaXNoZWQ9ZmFsc2U7XG5hd2FpdCBudWxsO1xud2hpbGUoIWZpbmlzaGVkKXtcbmNvbnN0e3ZhbHVlLGRvbmV9PWF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbmF3YWl0IGNvbnN1bWVWYWx1ZSh2YWx1ZSk7XG5maW5pc2hlZD0hIWRvbmU7XG4gfVxuIH07XG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpYmVyIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPFJldHVyblR5cGU8dHlwZW9mIG1ha2VNYXJzaGFsPj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fVxuICovJGjigI1fb25jZS5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkU3Vic2NyaWJlcj0oc3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0QWxsRGVmaW5lZCh7c3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyfSk7XG5cbmNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlPW1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik7XG5cbi8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKHN1YnNjcmliZXIsbWFyc2hhbGxUb1N0b3JhZ2UpLmNhdGNoKChlcnIpPT57XG4vKiBUT0RPOiBIb3cgc2hvdWxkIHdlIGhhbmRsZSBhbmQvb3Igc3VyZmFjZSB0aGlzIGZhaWx1cmU/Ki9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzU3NjYjZGlzY3Vzc2lvbl9yOTIyNDk4MDg4Ki9cbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZFN1YnNjcmliZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLGVycik7XG4gfSk7XG5cbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG5mcm9tQ2FwRGF0YTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSl9KTtcblxuXG4vKiogQHR5cGUge1N0b3JlZFN1YnNjcmliZXI8VD59ICovXG5jb25zdCBzdG9yZXN1Yj1GYXIoJ1N0b3JlZFN1YnNjcmliZXInLHtcbnN1YnNjcmliZUFmdGVyOihwdWJsaXNoQ291bnQpPT5zdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG5nZXRVcGRhdGVTaW5jZToodXBkYXRlQ291bnQpPT5zdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcbmdldFBhdGg6KCk9PkUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKSxcbmdldFN0b3JlS2V5OigpPT5FKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpLFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXJ9KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIG1ha2VTdG9yZWRTdWJzY3JpYmVyXG4gKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIHRoZSBpdGVyYXRpb24gd2lsbCBiZSB0ZXJtaW5hdGVkLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaXB0aW9uXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZWY8UmV0dXJuVHlwZTx0eXBlb2YgbWFrZU1hcnNoYWw+Pn0gW21hcnNoYWxsZXJdXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fVxuICovJGjigI1fb25jZS5tYWtlU3RvcmVkU3Vic2NyaWJlcihtYWtlU3RvcmVkU3Vic2NyaWJlcik7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFN1YnNjcmlwdGlvbj0oXG5zdWJzY3JpcHRpb24sXG5zdG9yYWdlTm9kZSxcbm1hcnNoYWxsZXI9bWFrZU1hcnNoYWwodW5kZWZpbmVkLHVuZGVmaW5lZCx7XG5tYXJzaGFsU2F2ZUVycm9yOigpPT57IH0sXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidzbWFsbGNhcHMnfSkpPT5cblxue1xuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbmZyb21DYXBEYXRhOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKX0pO1xuXG5cbi8qIEFib3J0IHRoZSBpdGVyYXRpb24gb24gdGhlIG5leHQgb2JzZXJ2YXRpb24gaWYgdGhlIHB1Ymxpc2hlciBldmVyIGZhaWxzLiovXG5sZXQgcHVibGlzaEZhaWxlZD1mYWxzZTtcbmxldCBwdWJsaXNoRXhjZXB0aW9uO1xuXG5jb25zdCBmYWlsPShlcnIpPT57XG5wdWJsaXNoRmFpbGVkPXRydWU7XG5wdWJsaXNoRXhjZXB0aW9uPWVycjtcbiB9O1xuXG4vKiBNdXN0ICpub3QqIGJlIGFuIGFzeW5jIGZ1bmN0aW9uLCBiZWNhdXNlIGl0IHNvbWV0aW1lcyBtdXN0IHRocm93IHRvIGFib3J0Ki9cbi8qIHRoZSBpdGVyYXRpb24uKi9cbmNvbnN0IHB1Ymxpc2hWYWx1ZT0ob2JqKT0+e1xuYXNzZXJ0KHN0b3JhZ2VOb2RlKTtcbmlmKHB1Ymxpc2hGYWlsZWQpe1xuLyogVG8gcHJvcGVybHkgYWJvcnQgdGhlIGl0ZXJhdGlvbiwgdGhpcyBtdXN0IGJlIGEgc3luY2hyb25vdXMgZXhjZXB0aW9uLiovXG50aHJvdyBwdWJsaXNoRXhjZXB0aW9uO1xuIH1cblxuLyogUHVibGlzaCB0aGUgdmFsdWUsIGNhcHR1cmluZyBhbnkgZXJyb3IuKi9cbkUobWFyc2hhbGxlcikuXG50b0NhcERhdGEob2JqKS5cbnRoZW4oKHNlcmlhbGl6ZWQpPT57XG5jb25zdCBlbmNvZGVkPUpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuIH0pLlxuY2F0Y2goZmFpbCk7XG4gfTtcblxuaWYoc3RvcmFnZU5vZGUpe1xuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5vYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmlwdGlvbix7XG51cGRhdGVTdGF0ZTpwdWJsaXNoVmFsdWUsXG5maW5pc2g6cHVibGlzaFZhbHVlfSkuXG5jYXRjaChmYWlsKTtcbiB9XG5cbi8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpcHRpb24nLHtcbi8qIEB0cy1leHBlY3QtZXJyb3IgZ2V0U3RvcmVLZXkgdHlwZSBkb2VzIG5vdCBoYXZlIGBzdWJzY3JpcHRpb25gKi9cbmdldFN0b3JlS2V5OmFzeW5jKCk9PntcbmlmKCFzdG9yYWdlTm9kZSl7XG5yZXR1cm4gaGFyZGVuKHtzdWJzY3JpcHRpb259KTtcbiB9XG5jb25zdCBzdG9yZUtleT1hd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xucmV0dXJuIGhhcmRlbih7Li4uc3RvcmVLZXksc3Vic2NyaXB0aW9ufSk7XG4gfSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyLFxuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6KCk9Plxuc3Vic2NyaXB0aW9uLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zdWJzY3JpcHRpb25bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCksXG5zdWJzY3JpYmVBZnRlcjoocHVibGlzaENvdW50KT0+c3Vic2NyaXB0aW9uLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCl9KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBTdG9yZWRQdWJsaXNoS2l0XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaGVyS2l0XG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGlzaGVyXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbmNvbXBhdGlibGUgd2l0aCBkdXJhYmlsaXR5OyBpbnN0ZWFkIGhhbmRsZSB2c3RvcmFnZSBlcGhlbWVyYWxseSBvbiBhIGR1cmFibGUgUHVibGlzaEtpdFxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hpbGRQYXRoXVxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hlcktpdDxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIsY2hpbGRQYXRoKT0+e1xuY29uc3R7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufT1tYWtlU3Vic2NyaXB0aW9uS2l0KCk7XG5cbmlmKHN0b3JhZ2VOb2RlJiZjaGlsZFBhdGgpe1xuc3RvcmFnZU5vZGU9RShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZFBhdGgpO1xuIH1cblxuLyogd3JhcCB0aGUgc3Vic2NyaXB0aW9uIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSwgcmVwZWF0aW5nIHRvIHRoaXMgYHN1YnNjcmliZXJgKi9cbmNvbnN0IHN1YnNjcmliZXI9bWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcik7XG5cblxucmV0dXJue1xucHVibGlzaGVyOnB1YmxpY2F0aW9uLFxuc3Vic2NyaWJlcn07XG5cbiB9O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGluY29tcGF0aWJsZSB3aXRoIGR1cmFiaWxpdHk7IGluc3RlYWQgaGFuZGxlIHZzdG9yYWdlIGVwaGVtZXJhbGx5IG9uIGEgZHVyYWJsZSBQdWJsaXNoS2l0XG4gKlxuICogTGlrZSBtYWtlUHVibGlzaEtpdCB0aGlzIG1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIFdoYXQncyBkaWZmZXJlbnQgaXMgYHN1YnNjcmliZXJgIHRlZXMgcmVjb3Jkcywgd3JpdGluZyBvdXQgdG8gc3RvcmFnZU5vZGUuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaEtpdDxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hlcktpdChtYWtlU3RvcmVkUHVibGlzaGVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkUHVibGlzaEtpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5yZXR1cm57XG5wdWJsaXNoZXIsXG4vKiB3cmFwIHRoZSBzdWJzY3JpYmVyIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSovXG5zdWJzY3JpYmVyOm1ha2VTdG9yZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcil9O1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRQdWJsaXNoS2l0KG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCJdLCJtYWtlU3RvcmVkU3Vic2NyaWJlciI6WyJtYWtlU3RvcmVkU3Vic2NyaWJlciJdLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIjpbIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCI6WyJtYWtlU3RvcmVkUHVibGlzaGVyS2l0Il0sIm1ha2VTdG9yZWRQdWJsaXNoS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANrfCYciJAAAIiQAACgAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbInN1YnNjcmliZSIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsaXNPYmplY3QsaXNVcGdyYWRlRGlzY29ubmVjdGlvbjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qc1wiLCBbW1wiaXNVcGdyYWRlRGlzY29ubmVjdGlvblwiLCBbJGjigI1fYSA9PiAoaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcbmNvbnN0IHNpbms9KCk9PnsgfTtcblxuLyoqXG4gKiBDaGVjayB0aGUgcHJvbWlzZSByZXR1cm5lZCBieSBhIGZ1bmN0aW9uIGZvciByZWplY3Rpb24gYnkgdmF0IHVwZ3JhZGUsXG4gKiBhbmQgcmVmZXRjaCB1cG9uIGVuY291bnRlcmluZyB0aGF0IGNvbmRpdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBFUmVmPFQ+fSBnZXR0ZXJcbiAqIEBwYXJhbSB7RVJlZjxUPltdfSBbc2VlZF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fVxuICovXG5jb25zdCByZWNvbm5lY3RBc05lZWRlZD1hc3luYyhnZXR0ZXIsc2VlZD1bXSk9PntcbmxldCBkaXNjb25uZWN0aW9uO1xubGV0IGxhc3RWZXJzaW9uPS1JbmZpbml0eTtcbi8qIEVuZCBzeW5jaHJvbm91cyBwcmVsdWRlLiovXG5hd2FpdCBudWxsO1xuZm9yKGxldCBpPTA7O2krPTEpe1xudHJ5e1xuY29uc3QgcmVzdWx0UD1pPHNlZWQubGVuZ3RoP3NlZWRbaV06Z2V0dGVyKCk7XG5jb25zdCByZXN1bHQ9YXdhaXQgcmVzdWx0UDtcbnJldHVybiByZXN1bHQ7XG4gfWNhdGNoKGVycil7XG5pZihpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKGVycikpe1xuaWYoIWRpc2Nvbm5lY3Rpb24pe1xuZGlzY29ubmVjdGlvbj1lcnI7XG4gfVxuY29uc3R7aW5jYXJuYXRpb25OdW1iZXI6dmVyc2lvbn09ZXJyO1xuaWYodmVyc2lvbj5sYXN0VmVyc2lvbil7XG4vKiBXZSBkb24ndCBleHBlY3QgYW5vdGhlciB1cGdyYWRlIGluIGJldHdlZW4gcmVjZWl2aW5nKi9cbi8qIGEgZGlzY29ubmVjdGlvbiBhbmQgcmUtcmVxdWVzdGluZyBhbiB1cGRhdGUsIGJ1dCBtdXN0Ki9cbi8qIG5ldmVydGhlbGVzcyBiZSBwcmVwYXJlZCBmb3IgdGhhdC4qL1xubGFzdFZlcnNpb249dmVyc2lvbjtcbmNvbnRpbnVlO1xuIH1cbiB9XG4vKiBpZiBgZXJyYCBpcyBhbiAoRXJyb3IpIG9iamVjdCwgd2UgY2FuIHRyeSB0byBhc3NvY2lhdGUgaXQgd2l0aCovXG4vKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGlzY29ubmVjdGlvbiB0aGF0IHByb21wdGVkIHRoZSByZXF1ZXN0Ki9cbi8qIGZvciB3aGljaCBpdCBpcyBhIHJlc3VsdC4qL1xuaWYoaXNPYmplY3QoZXJyKSYmZGlzY29ubmVjdGlvbiYmZGlzY29ubmVjdGlvbiE9PWVycil7XG50cnl7XG5hc3NlcnQubm90ZShcbmVycixcblggYEF0dGVtcHRpbmcgdG8gcmVjb3ZlciBmcm9tIGRpc2Nvbm5lY3Rpb246ICR7ZGlzY29ubmVjdGlvbn1gKTtcblxuIH1jYXRjaChfZXJyKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eSovXG4gfVxuIH1cbnRocm93IGVycjtcbiB9XG4gfVxuIH07XG5cbi8qKlxuICogQ3JlYXRlIGEgbmVhciBpdGVyYWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgcG90ZW50aWFsbHkgZmFyIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGVJdGVyYXRvcjxUPj59IGl0UFxuICovXG5jb25zdCAgICAgICAgc3Vic2NyaWJlPShpdFApPT5cbkZhcignQXN5bmNJdGVyYWJsZScse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+e1xuY29uc3QgaXQ9RShpdFApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuY29uc3Qgc2VsZj1GYXIoJ0FzeW5jSXRlcmFibGVJdGVyYXRvcicse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+c2VsZixcbm5leHQ6YXN5bmMoKT0+RShpdCkubmV4dCgpfSk7XG5cbnJldHVybiBzZWxmO1xuIH19KTtcblxuXG4vKipcbiAqIEFzeW5jcm9ub3VzbHkgaXRlcmF0ZXMgb3ZlciB0aGUgY29udGVudHMgb2YgYSBQdWJsaWNhdGlvblJlY29yZCBjaGFpbiBhcyB0aGV5XG4gKiBhcHBlYXIuICBUaGlzIGl0ZXJhdGlvbiBtdXN0IGRyb3AgcGFydHMgb2YgcHVibGljYXRpb24gcmVjb3JkcyB0aGF0IGFyZSBub1xuICogbG9uZ2VyIG5lZWRlZCBzbyB0aGV5IGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEVhY2hUb3BpYzxUPj59IHRvcGljXG4gKiBAcGFyYW0ge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fSBuZXh0Q2VsbFBcbiAqICAgUHVibGljYXRpb25SZWNvcmQgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBmaXJzdCBpdGVyYXRpb24gcmVzdWx0XG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVD59XG4gKi8kaOKAjV9vbmNlLnN1YnNjcmliZShzdWJzY3JpYmUpO1xuY29uc3QgbWFrZUVhY2hJdGVyYXRvcj0odG9waWMsbmV4dENlbGxQKT0+e1xuLyogVG8gdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24sIHN0YXJ0IHdpdGgqL1xuLyogaHR0cHM6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTYwNDA0MTIyMjUwL2h0dHA6Ly93aWtpLmVjbWFzY3JpcHQub3JnL2Rva3UucGhwP2lkPXN0cmF3bWFuOmNvbmN1cnJlbmN5I2luZmluaXRlX3F1ZXVlKi9cbmNvbnN0IHNlbGY9RmFyKCdFYWNoSXRlcmF0b3InLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnNlbGYsXG5uZXh0OigpPT57XG5jb25zdHtcbmhlYWQ6cmVzdWx0UCxcbnB1Ymxpc2hDb3VudDpwdWJsaXNoQ291bnRQLFxudGFpbDp0YWlsUH09XG5FLmdldChuZXh0Q2VsbFApO1xuXG4vKiBJZiB0YWlsUCBpcyBicm9rZW4gYnkgdXBncmFkZSwgd2Ugd2lsbCBuZWVkIHRvIHJlLXJlcXVlc3QgaXQqL1xuLyogZGlyZWN0bHkgZnJvbSBgdG9waWNgLiovXG5jb25zdCBnZXRTdWNjZXNzb3I9YXN5bmMoKT0+e1xuY29uc3QgcHVibGlzaENvdW50PWF3YWl0IHB1Ymxpc2hDb3VudFA7XG5hc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwnYmlnaW50Jyk7XG5jb25zdCBzdWNjZXNzb3I9YXdhaXQgRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbmNvbnN0IG5ld1B1Ymxpc2hDb3VudD1zdWNjZXNzb3IucHVibGlzaENvdW50O1xuaWYobmV3UHVibGlzaENvdW50IT09cHVibGlzaENvdW50KzFuKXtcbkZhaWwgYGVhY2hJdGVyYXRvciBicm9rZW4gYnkgZ2FwIGZyb20gcHVibGlzaENvdW50ICR7cHVibGlzaENvdW50fSB0byAke25ld1B1Ymxpc2hDb3VudH1gO1xuIH1cbnJldHVybiBzdWNjZXNzb3I7XG4gfTtcblxuLyogUmVwbGFjZSBuZXh0Q2VsbFAgb24gZXZlcnkgY2FsbCB0byBuZXh0KCkgc28gdGhpbmdzIHdvcmsgZXZlbiovXG4vKiB3aXRoIGFuIGVhZ2VyIGNvbnN1bWVyIHRoYXQgZG9lc24ndCB3YWl0IGZvciByZXN1bHRzIHRvIHNldHRsZS4qL1xubmV4dENlbGxQPXJlY29ubmVjdEFzTmVlZGVkKGdldFN1Y2Nlc3NvcixbdGFpbFBdKTtcblxuLyogQXZvaWQgdW5oYW5kbGVkIHJlamVjdGlvbiB3YXJuaW5ncyBoZXJlIGlmIHRoZSBwcmV2aW91cyBjZWxsIHdhcyByZWplY3RlZCBvciovXG4vKiB0aGVyZSBpcyBubyBmdXJ0aGVyIHJlcXVlc3Qgb2YgdGhpcyBpdGVyYXRvci4qL1xuLyogYHRhaWxQYCBpcyBoYW5kbGVkIGluc2lkZSBgcmVjb25uZWN0QXNOZWVkZWRgIGFuZCBgcmVzdWx0UGAgaXMgdGhlIGNhbGxlcidzKi9cbi8qIGNvbmNlcm4sIGxlYXZpbmcgb25seSBgcHVibGlzaENvdW50UGAgYW5kIHRoZSBuZXcgYG5leHRDZWxsUGAuKi9cbnZvaWQgRS53aGVuKHB1Ymxpc2hDb3VudFAsc2luayxzaW5rKTtcbnZvaWQgRS53aGVuKG5leHRDZWxsUCxzaW5rLHNpbmspO1xucmV0dXJuIHJlc3VsdFA7XG4gfSxcbmZvcms6KCk9Pm1ha2VFYWNoSXRlcmF0b3IodG9waWMsbmV4dENlbGxQKX0pO1xuXG5yZXR1cm4gc2VsZjtcbiB9O1xuXG4vKipcbiAqIEdpdmVuIGEgbG9jYWwgb3IgcmVtb3RlIHN1YnNjcmliZXIsIHJldHVybnMgYSBsb2NhbCBBc3luY0l0ZXJhYmxlIHdoaWNoXG4gKiBwcm92aWRlcyBcInByZWZpeCBsb3NzeVwiIGl0ZXJhdGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0LlxuICogQnkgXCJwcmVmaXggbG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBldmVyeXRoaW5nIHB1Ymxpc2hlZCBiZWZvcmVcbiAqIHlvdSBhc2sgdGhlIHJldHVybmVkIGl0ZXJhYmxlIGZvciBhbiBpdGVyYXRvci4gQnV0IHRoZSByZXR1cm5lZCBpdGVyYXRvclxuICogd2lsbCBlbnVtZXJhdGUgZWFjaCB0aGluZyBwdWJsaXNoZWQgZnJvbSB0aGF0IGl0ZXJhdG9yJ3Mgc3RhcnRpbmcgcG9pbnRcbiAqIHVwIHRvIGEgZGlzY29ubmVjdGlvbiByZXN1bHQgaW5kaWNhdGluZyB1cGdyYWRlIG9mIHRoZSBwcm9kdWNlclxuICogKHdoaWNoIGJyZWFrcyB0aGUgZ2FwLWZyZWUgZ3VhcmFudGVlIGFuZCB0aGVyZWZvcmUgdGVybWluYXRlcyBhbnkgYWN0aXZlXG4gKiBpdGVyYXRvciB3aGlsZSBzdGlsbCBzdXBwb3J0aW5nIGNyZWF0aW9uIG9mIG5ldyBpdGVyYXRvcnMpLlxuICpcbiAqIElmIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdCBpcyB0ZXJtaW5hdGVkLCB0aGF0IHRlcm1pbmFsIHZhbHVlIHdpbGwgYmVcbiAqIHJlcG9ydGVkIGxvc3NsZXNzbHkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxFYWNoVG9waWM8VD4+fSB0b3BpY1xuICovXG5jb25zdCAgICAgICAgc3Vic2NyaWJlRWFjaD0odG9waWMpPT57XG5jb25zdCBpdGVyYWJsZT1GYXIoJ0VhY2hJdGVyYWJsZScse1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+e1xuY29uc3QgZmlyc3RDZWxsUD1yZWNvbm5lY3RBc05lZWRlZCgoKT0+RSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIoKSk7XG5yZXR1cm4gbWFrZUVhY2hJdGVyYXRvcih0b3BpYyxmaXJzdENlbGxQKTtcbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2Uuc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVFYWNoKTtcbmhhcmRlbihzdWJzY3JpYmVFYWNoKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gdG9waWNcbiAqIEBwYXJhbSB7YmlnaW50fSBbbG9jYWxVcGRhdGVDb3VudF1cbiAqIEBwYXJhbSB7SXRlcmF0b3JSZXR1cm5SZXN1bHQ8VD59IFt0ZXJtaW5hbFJlc3VsdF1cbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUPn1cbiAqL1xuY29uc3QgY2xvbmVMYXRlc3RJdGVyYXRvcj0odG9waWMsbG9jYWxVcGRhdGVDb3VudCx0ZXJtaW5hbFJlc3VsdCk9PntcbmxldCBtdXRleD1Qcm9taXNlLnJlc29sdmUoKTtcblxuLyoqXG4gKiBSZXF1ZXN0IHRoZSBuZXh0IHVwZGF0ZSByZWNvcmQgZnJvbSB0aGUgdG9waWMsIHVwZGF0aW5nIG91ciBsb2NhbCBzdGF0ZSxcbiAqIGFuZCBjb252ZXJ0IGl0IHRvIGFuIGl0ZXJhdG9yIHJlc3VsdC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUPj59XG4gKi9cbmNvbnN0IG1heWJlUmVxdWVzdE5leHRSZXN1bHQ9YXN5bmMoKT0+e1xuaWYodGVybWluYWxSZXN1bHQpe1xuLyogV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB0b3BpYywganVzdCBrZWVwIHJldHVybmluZyB0aGUgbGFzdCByZXN1bHQqL1xuLyogd2l0aG91dCBmdXJ0aGVyIHJlcXVlc3RzLiovXG5yZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gfVxuXG4vKiBTZW5kIHRoZSBuZXh0IHJlcXVlc3Qgbm93LCBza2lwcGluZyBwYXN0IGludGVybWVkaWF0ZSB1cGRhdGVzKi9cbi8qIGFuZCB1cGdyYWRlIGRpc2Nvbm5lY3Rpb25zLiovXG5jb25zdHt2YWx1ZSx1cGRhdGVDb3VudH09YXdhaXQgcmVjb25uZWN0QXNOZWVkZWQoKCk9PlxuRSh0b3BpYykuZ2V0VXBkYXRlU2luY2UobG9jYWxVcGRhdGVDb3VudCkpO1xuXG4vKiBNYWtlIHN1cmUgdGhlIG5leHQgcmVxdWVzdCBpcyBmb3IgYSBmcmVzaGVyIHZhbHVlLiovXG5sb2NhbFVwZGF0ZUNvdW50PXVwZGF0ZUNvdW50O1xuXG4vKiBNYWtlIGFuIEl0ZXJhdG9yUmVzdWx0LiovXG5pZih1cGRhdGVDb3VudD09PXVuZGVmaW5lZCl7XG50ZXJtaW5hbFJlc3VsdD1oYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZX0pO1xucmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuIH1cbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9O1xuXG5jb25zdCBzZWxmPUZhcignTGF0ZXN0SXRlcmF0b3InLHtcbmZvcms6KCk9PmNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMsbG9jYWxVcGRhdGVDb3VudCx0ZXJtaW5hbFJlc3VsdCksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zZWxmLFxubmV4dDphc3luYygpPT57XG4vKiBJbiB0aGlzIGFkYXB0b3IsIG9uY2UgYG5leHQoKWAgaXMgY2FsbGVkIGFuZCByZXR1cm5zIGFuIHVucmVzb2x2ZWQqL1xuLyogcHJvbWlzZSwgZnVydGhlciBgbmV4dCgpYCBjYWxscyB3aWxsIGFsc28gcmV0dXJuIHVucmVzb2x2ZWQgcHJvbWlzZXMqL1xuLyogYnV0IGVhY2ggY2FsbCB3aWxsIG5vdCB0cmlnZ2VyIGFub3RoZXIgYHRvcGljYCByZXF1ZXN0IHVudGlsIHRoZSBwcmlvciovXG4vKiBvbmUgaGFzIHNldHRsZWQuKi9cbi8qKi9cbi8qIFRoaXMgbGluZWFyIHF1ZXVlaW5nIGJlaGF2aW9yIGlzIG9ubHkgbmVlZGVkIGZvciBjb2RlIHRoYXQgdXNlcyB0aGUqL1xuLyogYXN5bmMgaXRlcmF0b3IgcHJvdG9jb2wgZXhwbGljaXRseS4gV2hlbiB0aGlzIGFzeW5jIGl0ZXJhdG9yIGlzKi9cbi8qIGNvbnN1bWVkIGJ5IGEgZm9yL2F3YWl0L29mIGxvb3AsIGBuZXh0KClgIHdpbGwgb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlKi9cbi8qIHByb21pc2UgZm9yIHRoZSBwcmV2aW91cyBpdGVyYXRpb24gcmVzdWx0IGhhcyBmdWxmaWxsZWQuIElmIGl0IGZ1bGZpbGxzKi9cbi8qIHdpdGggYGRvbmU6IHRydWVgLCB0aGUgZm9yL2F3YWl0L29mIGxvb3Agd2lsbCBuZXZlciBjYWxsIGBuZXh0KClgKi9cbi8qIGFnYWluLiovXG4vKiovXG4vKiBTZWUqL1xuLyogaHR0cHM6Ly8yYWxpdHkuY29tLzIwMTYvMTAvYXN5bmNocm9ub3VzLWl0ZXJhdGlvbi5odG1sI3F1ZXVpbmctbmV4dCgpLWludm9jYXRpb25zKi9cbi8qIGZvciBhbiBleHBsaWNpdCB1c2UgdGhhdCBzZW5kcyBgbmV4dCgpYCB3aXRob3V0IHdhaXRpbmcuKi9cblxuaWYodGVybWluYWxSZXN1bHQpe1xuLyogV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB0b3BpYywganVzdCBrZWVwIHJldHVybmluZyB0aGUgbGFzdCovXG4vKiByZXN1bHQuKi9cbnJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiB9XG5cbi8qIEJFR0lOIENSSVRJQ0FMIFNFQ1RJT04gLSBzeW5jaHJvbm91c2x5IGVucXVldWUgYW5kIHJlYXNzaWduIGBtdXRleGAqL1xuLyoqL1xuLyogVXNlIGBtdXRleGAgdG8gZW5zdXJlIHRoYXQgd2UgaGF2ZSBubyBtb3JlIHRoYW4gYSBzaW5nbGUgcmVxdWVzdCBpbiovXG4vKiBmbGlnaHQuKi9cbmNvbnN0IG5leHRSZXN1bHQ9bXV0ZXgudGhlbihtYXliZVJlcXVlc3ROZXh0UmVzdWx0KTtcbm11dGV4PW5leHRSZXN1bHQudGhlbihzaW5rLHNpbmspO1xuLyogRU5EIENSSVRJQ0FMIFNFQ1RJT04qL1xuXG5yZXR1cm4gbmV4dFJlc3VsdDtcbiB9fSk7XG5cbnJldHVybiBzZWxmO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVD59XG4gKi9cbmNvbnN0IG1ha2VMYXRlc3RJdGVyYXRvcj0odG9waWMpPT5jbG9uZUxhdGVzdEl0ZXJhdG9yKHRvcGljKTtcblxuLyoqXG4gKiBHaXZlbiBhIGxvY2FsIG9yIHJlbW90ZSBzdWJzY3JpYmVyLCByZXR1cm5zIGEgbG9jYWwgQXN5bmNJdGVyYWJsZSB3aGljaFxuICogcHJvdmlkZXMgXCJsb3NzeVwiIGl0ZXJhdGlvbnMgb2YgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0LlxuICogQnkgXCJsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGFueSBwdWJsaXNoZWQgc3RhdGUgaWYgYSBtb3JlXG4gKiByZWNlbnQgcHVibGlzaGVkIHN0YXRlIGNhbiBiZSByZXBvcnRlZCBpbnN0ZWFkLlxuICpcbiAqIElmIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdCBpcyB0ZXJtaW5hdGVkIGJ5IHVwZ3JhZGUgb2YgdGhlIHByb2R1Y2VyLFxuICogaXQgd2lsbCBiZSByZS1yZXF1ZXN0ZWQuIEFsbCBvdGhlciB0ZXJtaW5hbCB2YWx1ZXMgd2lsbCBiZSBsb3NzbGVzc2x5XG4gKiBwcm9wYWdhdGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICovXG5jb25zdCAgICAgICAgc3Vic2NyaWJlTGF0ZXN0PSh0b3BpYyk9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignTGF0ZXN0SXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pm1ha2VMYXRlc3RJdGVyYXRvcih0b3BpYyl9KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5zdWJzY3JpYmVMYXRlc3Qoc3Vic2NyaWJlTGF0ZXN0KTtcbmhhcmRlbihzdWJzY3JpYmVMYXRlc3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN1YnNjcmliZSI6WyJzdWJzY3JpYmUiXSwic3Vic2NyaWJlRWFjaCI6WyJzdWJzY3JpYmVFYWNoIl0sInN1YnNjcmliZUxhdGVzdCI6WyJzdWJzY3JpYmVMYXRlc3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJ7I7I8ULAADFCwAAKQAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmVyLmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyIsIi4vdG9waWMuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixzdWJzY3JpYmVFYWNoLG1ha2VQdWJsaXNoS2l0LG1ha2VQaW5uZWRIaXN0b3J5VG9waWM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90b3BpYy5qc1wiLCBbW1wibWFrZVBpbm5lZEhpc3RvcnlUb3BpY1wiLCBbJGjigI1fYSA9PiAobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEVhY2hUb3BpYzxUPj59IHRvcGljXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uPSh0b3BpYyk9PntcbmNvbnN0IHN1YnNjcmlwdGlvbj1GYXIoJ1N1YnNjcmlwdGlvbicse1xuLi4uc3Vic2NyaWJlRWFjaCh0b3BpYyksXG5zdWJzY3JpYmVBZnRlcjphc3luYyhwdWJsaXNoQ291bnQpPT5FKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuXG4vKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBTdWJzY3JpcHRpb24gZWZmaWNpZW50bHkgb3ZlciB0aGUgbmV0d29yayxcbiAqIGJ5IG9idGFpbmluZyB0aGlzIGZyb20gdGhlIFN1YnNjcmlwdGlvbiB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlU3Vic2NyaXB0aW9uYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIFN1YnNjcmlwdGlvbiBhdCB0aGF0IHNpdGUuXG4gKi9cbmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzOmFzeW5jKCk9PnRvcGljLFxuXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtzdWJzY3JpcHRpb259KX0pO1xuXG5yZXR1cm4gc3Vic2NyaXB0aW9uO1xuIH07JGjigI1fb25jZS5tYWtlU3Vic2NyaXB0aW9uKG1ha2VTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb24pO1xuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgUHJvZHVjZXJzIHNob3VsZCB1c2VcbiAqIGBgYGpzXG4gKiBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcbiAqIGNvbnN0IHRvcGljID0gbWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhzdWJzY3JpYmVyKTtcbiAqIGBgYFxuICogaW5zdGVhZCwgd2hpY2ggbWFrZXMgaXQgY2xlYXJlciB0aGF0IGFsbCB0aGUgc3Vic2NyaWJlcidzIGhpc3RvcnkgaXNcbiAqIHJldGFpbmVkLCBwcmV2ZW50aW5nIEdDLiAgUG90ZW50aWFsbHkgcmVtb3RlIGNvbnN1bWVycyB1c2VcbiAqIGBgYGpzXG4gKiBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIHN1YnNjcmliZUVhY2godG9waWMpKSB7IC4uLiB9XG4gKiBgYGBcbiAqXG4gKiBNYWtlcyBhIGB7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfWAgZm9yIGRvaW5nIGxvc3NsZXNzIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1Yi5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1N1YnNjcmlwdGlvblJlY29yZDxUPn1cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbktpdD0oKT0+e1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PW1ha2VQdWJsaXNoS2l0KCk7XG5cbi8qIFRoZSBwdWJsaXNoIGtpdCBzdWJzY3JpYmVyIGlzIHByZWZpeC1sb3NzeSwgc28gbWFraW5nICp0aGlzKiBzdWJzY3JpYmVyIGNvbXBsZXRlbHkqL1xuLyogbG9zc2xlc3MgZnJvbSBpbml0aWFsaXNhdGlvbiByZXF1aXJlcyBwaW5uaW5nIHRoZSBmb3JtZXIncyBoaXN0b3J5LiovXG5cbmNvbnN0IHBpbm5lZEhpc3RvcnlUb3BpYz1tYWtlUGlubmVkSGlzdG9yeVRvcGljKHN1YnNjcmliZXIpO1xuY29uc3Qgc3Vic2NyaXB0aW9uPW1ha2VTdWJzY3JpcHRpb24ocGlubmVkSGlzdG9yeVRvcGljKTtcblxuLyoqIEB0eXBlIHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gKi9cbmNvbnN0IHB1YmxpY2F0aW9uPUZhcigncHVibGljYXRpb24nLHtcbnVwZGF0ZVN0YXRlOihub25GaW5hbFZhbHVlKT0+cHVibGlzaGVyLnB1Ymxpc2gobm9uRmluYWxWYWx1ZSksXG5maW5pc2g6KGNvbXBsZXRpb24pPT5wdWJsaXNoZXIuZmluaXNoKGNvbXBsZXRpb24pLFxuZmFpbDoocmVhc29uKT0+cHVibGlzaGVyLmZhaWwocmVhc29uKX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe3B1YmxpY2F0aW9uLHN1YnNjcmlwdGlvbn0pO1xuIH07JGjigI1fb25jZS5tYWtlU3Vic2NyaXB0aW9uS2l0KG1ha2VTdWJzY3JpcHRpb25LaXQpO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb25LaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdWJzY3JpcHRpb24iOlsibWFrZVN1YnNjcmlwdGlvbiJdLCJtYWtlU3Vic2NyaXB0aW9uS2l0IjpbIm1ha2VTdWJzY3JpcHRpb25LaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIYEWcgwGAAAMBgAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90b3BpYy5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLWFtYmllbnQuanMiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBBIHBpbm5lZC1oaXN0b3J5IHRvcGljIHByZXNlcnZlcyBhbGwgb2YgaXRzIHB1Ymxpc2hlZCB2YWx1ZXMgaW5cbiAqIG1lbW9yeS4gIFVzZSBhIHByZWZpeC1sb3NzeSBtYWtlUHVibGlzaEtpdCBpbnN0ZWFkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VhY2hUb3BpYzxUPiAmIExhdGVzdFRvcGljPFQ+fSB0b3BpYyBuZWVkcyB0byBiZSBuZWFyIGluIG9yZGVyIHRvXG4gKiBwcmVzZXJ2ZSBzdWJzY3JpcHRpb24gdGltaW5ncy4gIFRPRE86IGRyb3AgTGF0ZXN0VG9waWM8VD4gcmVxdWlyZW1lbnRcbiAqIEByZXR1cm5zIHtFYWNoVG9waWM8VD4gJiBMYXRlc3RUb3BpYzxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VQaW5uZWRIaXN0b3J5VG9waWM9KHRvcGljKT0+e1xuLyogU3VjaCBsb3NzbGVzc25lc3MgaW5oaWJpdHMgR0MsIHdoaWNoIGlzIHdoeSB3ZSdyZSBtb3ZpbmcgYXdheSBmcm9tIGl0LiovXG5cbi8qIFdlIG5lZWQgdG8gdGFrZSBhbiBpbW1lZGlhdGUgc25hcHNob3Qgb2YgdGhlIHRvcGljJ3MgY3VycmVudCBzdGF0ZS4qL1xuY29uc3QgcGlubmVkUHViTGlzdD10b3BpYy5zdWJzY3JpYmVBZnRlcigpO1xuXG5yZXR1cm4gRmFyKCdQaW5uZWRIaXN0b3J5VG9waWMnLHtcbnN1YnNjcmliZUFmdGVyOmFzeW5jKHB1Ymxpc2hDb3VudD0tMW4pPT57XG5pZihwdWJsaXNoQ291bnQ9PT0tMW4pe1xucmV0dXJuIHBpbm5lZFB1Ykxpc3Q7XG4gfVxucmV0dXJuIHRvcGljLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCk7XG4gfSxcbmdldFVwZGF0ZVNpbmNlOmFzeW5jKHVwZGF0ZUNvdW50PXVuZGVmaW5lZCk9Pntcbi8qIFRPRE86IEJ1aWxkIHRoaXMgb3V0IG9mIEVhY2hUb3BpYzxUPi4qL1xucmV0dXJuIHRvcGljLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KTtcbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhtYWtlUGlubmVkSGlzdG9yeVRvcGljKTtcbmhhcmRlbihtYWtlUGlubmVkSGlzdG9yeVRvcGljKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+FEPEz8wAAA/MAAALAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90eXBlcy1hbWJpZW50LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQGplc3NpZS1jaGVjayovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFQ+fSBFUmVmXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZUtpdDxUPn0gUHJvbWlzZUtpdFxuICovXG5cbi8qKlxuICogRGVwcmVjYXRlZC4gVXNlIFByb21pc2VLaXQgaW5zdGVhZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZVJlY29yZDxUPn0gUHJvbWlzZVJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVFJldHVybj1hbnldXG4gKiBAdGVtcGxhdGUgW1ROZXh0PXVuZGVmaW5lZF1cbiAqIEB0eXBlZGVmIHtBc3luY0l0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PiAmIHtcbiAqICAgZm9yaygpOiBGb3JrYWJsZUFzeW5jSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+XG4gKiB9fSBGb3JrYWJsZUFzeW5jSXRlcmF0b3IgQW4gQXN5bmNJdGVyYXRvciB0aGF0IGNhbiBiZSBmb3JrZWQgYXQgYSBnaXZlbiBwb3NpdGlvblxuICogaW50byBtdWx0aXBsZSBpbmRlcGVuZGVudCBGb3JrYWJsZUFzeW5jSXRlcmF0b3JzIHN0YXJ0aW5nIGZyb20gdGhhdCBwb3NpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgW1RSZXR1cm49YW55XVxuICogQHRlbXBsYXRlIFtUTmV4dD11bmRlZmluZWRdXG4gKiBAdHlwZWRlZiB7eyBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IEFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD4gfX0gQXN5bmNJdGVyYWJsZU9ubHlcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgW1RSZXR1cm49YW55XVxuICogQHRlbXBsYXRlIFtUTmV4dD11bmRlZmluZWRdXG4gKiBAdHlwZWRlZiB7e1xuICogICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PixcbiAqICAgZm9yaygpOiBGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD4gfSAmXG4gKiAgIEZvcmthYmxlQXN5bmNJdGVyYXRvcjxULCBUUmV0dXJuLCBUTmV4dD5cbiAqIH0gRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgW1RSZXR1cm49YW55XVxuICogQHRlbXBsYXRlIFtUTmV4dD11bmRlZmluZWRdXG4gKiBAdHlwZWRlZiB7e1xuICogICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBGb3JrYWJsZUFzeW5jSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+XG4gKiB9fSBGb3JrYWJsZUFzeW5jSXRlcmFibGVcbiAqIEFuIEFzeW5jSXRlcmFibGUgdGhhdCBwcm9kdWNlcyBGb3JrYWJsZUFzeW5jSXRlcmF0b3JzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEl0ZXJhdGlvbk9ic2VydmVyPFQ+XG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGB1cGRhdGVTdGF0ZWAgd2l0aCB0aGUgc3VjY2Vzc2l2ZSBub24tZmluYWwgdmFsdWVzLCBmb2xsb3dlZCBieSBhXG4gKiBmaW5hbCBjYWxsIHRvIGVpdGhlciBgZmluaXNoYCB3aXRoIGEgc3VjY2Vzc2Z1bCBgY29tcGxldGlvbmAgdmFsdWVcbiAqIG9yIGBmYWlsYCB3aXRoIHRoZSBhbGxlZ2VkIGByZWFzb25gIGZvciBmYWlsdXJlLiBBZnRlciBhdCBtb3N0IG9uZVxuICogdGVybWluYXRpbmcgY2FsbHMsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBhcmUgdmFsaWQgYW5kIG11c3QgYmVcbiAqIHJlamVjdGVkLlxuICogQHByb3BlcnR5IHsobm9uRmluYWxWYWx1ZTogVCkgPT4gdm9pZH0gdXBkYXRlU3RhdGVcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IFQpID0+IHZvaWR9IGZpbmlzaFxuICogQHByb3BlcnR5IHsocmVhc29uOiB1bmtub3duKSA9PiB2b2lkfSBmYWlsXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaWNhdGlvblJlY29yZFxuICogV2lsbCBiZSBzaGFyZWQgYmV0d2VlbiBtYWNoaW5lcywgc28gaXQgbXVzdCBiZSBzYWZlIHRvIGV4cG9zZS4gQnV0IHNvZnR3YXJlXG4gKiBvdXRzaWRlIHRoZSBjdXJyZW50IHBhY2thZ2Ugc2hvdWxkIGNvbnNpZGVyIGl0IG9wYXF1ZSwgbm90IGRlcGVuZGluZyBvbiBpdHNcbiAqIGludGVybmFsIHN0cnVjdHVyZS5cbiAqIEBwcm9wZXJ0eSB7SXRlcmF0b3JSZXN1bHQ8VD59IGhlYWRcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBwdWJsaXNoQ291bnQgc3RhcnRzIGF0IDEgZm9yIHRoZSBmaXJzdCByZXN1bHRcbiAqICAgYW5kIGFkdmFuY2VzIGJ5IDEgZm9yIGVhY2ggc3Vic2VxdWVudCByZXN1bHRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59IHRhaWxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFYWNoVG9waWNcbiAqIEBwcm9wZXJ0eSB7KHB1Ymxpc2hDb3VudD86IGJpZ2ludCkgPT4gUHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59IHN1YnNjcmliZUFmdGVyXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYSBcImN1cnJlbnRcIiBQdWJsaWNhdGlvblJlY29yZCAocmVmZXJlbmNpbmcgaXRzXG4gKiBpbW1lZGlhdGUgc3VjY2Vzc29yIHZpYSBhIGB0YWlsYCBwcm9taXNlKSB0aGF0IGlzIGxhdGVyIHRoYW4gdGhlXG4gKiBwcm92aWRlZCBwdWJsaXNoQ291bnQuXG4gKiBVc2VkIHRvIG1ha2UgZm9yd2FyZC1sb3NzbGVzcyAoXCJlYWNoXCIpIGl0ZXJhdG9ycy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlPFQsIFQ+ICYgRWFjaFRvcGljPFQ+fSBJdGVyYWJsZUVhY2hUb3BpY1xuICogQW4gRWFjaFRvcGljIHdpdGggZGVmYXVsdCBhc3luY0l0ZXJhYmxlIGJlaGF2aW91ci5cbiAqXG4gKiBOT1RFOiB0aGUgcHVibGljYXRpb24gcmVjb3JkcyBhbmQgaXRlcmF0b3JzIHJldHVybmVkIGJ5IHRoaXMgb2JqZWN0IGFyZVxuICogZXBoZW1lcmFsIGFuZCB3aWxsIGJlIHNldmVyZWQgZHVyaW5nIHVwZ3JhZGUuICBBIGNhbGxlciBzaG91bGQgdXNlXG4gKiBgc3Vic2NyaWJlRWFjaGAgdG8gd3JhcCB0aGlzIHRvcGljIGluIGEgbG9jYWwgaXRlcmFibGUgd2hpY2ggYXV0b21hdGljYWxseVxuICogYXR0ZW1wdHMgdG8gcmVjb25uZWN0IHVwb24gYmVpbmcgc2V2ZXJlZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QXN5bmNJdGVyYWJsZU9ubHk8VCwgVD4gJiBMYXRlc3RUb3BpYzxUPn0gSXRlcmFibGVMYXRlc3RUb3BpY1xuICogQSBMYXRlc3RUb3BpYyB3aXRoIGRlZmF1bHQgYXN5bmNJdGVyYWJsZSBiZWhhdmlvdXIuXG4gKlxuICogTk9URTogdGhlIGl0ZXJhdG9ycyByZXR1cm5lZCBieSB0aGlzIG9iamVjdCBhcmUgZXBoZW1lcmFsIGFuZCB3aWxsIGJlIHNldmVyZWRcbiAqIGR1cmluZyB1cGdyYWRlLiAgQSBjYWxsZXIgc2hvdWxkIHVzZSBgc3Vic2NyaWJlTGF0ZXN0YCB0byB3cmFwIHRoaXMgdG9waWMgaW5cbiAqIGEgbG9jYWwgaXRlcmFibGUgd2hpY2ggYXV0b21hdGljYWxseSBhdHRlbXB0cyB0byByZWNvbm5lY3QgdXBvbiBiZWluZ1xuICogc2V2ZXJlZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMYXRlc3RUb3BpY1xuICogQHByb3BlcnR5IHsodXBkYXRlQ291bnQ/OiBiaWdpbnQgfCBudW1iZXIpID0+IFByb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pn0gZ2V0VXBkYXRlU2luY2VcbiAqIFJldHVybnMgYSBwcm9taXNlIGZvciBhbiB1cGRhdGUgcmVjb3JkIGFzIG9mIGFuIHVwZGF0ZSBjb3VudC5cbiAqIElmIHRoZSBgdXBkYXRlQ291bnRgIGFyZ3VtZW50IGlzIG9taXR0ZWQgb3IgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IHVwZGF0ZSBjb3VudCxcbiAqIHRoZSBwcm9taXNlIHByb21wdGx5IHJlc29sdmVzIHRvIHRoZSBjdXJyZW50IHJlY29yZC5cbiAqIE90aGVyd2lzZSwgYWZ0ZXIgdGhlIG5leHQgc3RhdGUgY2hhbmdlLCB0aGUgcHJvbWlzZSByZXNvbHZlcyB0byB0aGUgcmVzdWx0aW5nIHJlY29yZC5cbiAqIFRoaXMgaXMgYW4gYXR0ZW51YXRlZCBmb3JtIG9mIGBzdWJzY3JpYmVBZnRlcmAgd2hvc2UgcmV0dXJuIHZhbHVlIHN0YW5kcyBhbG9uZSBhbmRcbiAqIGRvZXMgbm90IGFsbG93IGNvbnN1bWVycyB0byBwaW4gYSBjaGFpbiBvZiBoaXN0b3JpY2FsIFB1YmxpY2F0aW9uUmVjb3Jkcy5cbiAqIFVzZWQgdG8gbWFrZSBsb3NzeSAoXCJsYXRlc3RcIikgaXRlcmF0b3JzLlxuICogTk9URTogVXNlIG9mIGBudW1iZXJgIGFzIGFuIGB1cGRhdGVDb3VudGAgaXMgZGVwcmVjYXRlZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7TGF0ZXN0VG9waWM8VD59IEJhc2VOb3RpZmllciBUaGlzIHR5cGUgaXMgZGVwcmVjYXRlZCBidXQgaXMgc3RpbGxcbiAqIHVzZWQgZXh0ZXJuYWxseS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7TGF0ZXN0VG9waWM8VD4gJiBFYWNoVG9waWM8VD59IFN1YnNjcmliZXJcbiAqIEEgc3RyZWFtIG9mIHJlc3VsdHMgdGhhdCBhbGxvd3MgY29uc3VtZXJzIHRvIGNvbmZpZ3VyZVxuICogZm9yd2FyZC1sb3NzbGVzcyBcImVhY2hcIiBpdGVyYXRpb24gd2l0aCBgc3Vic2NyaWJlRWFjaGAgYW5kXG4gKiBsb3NzeSBcImxhdGVzdFwiIGl0ZXJhdGlvbiB3aXRoIGBzdWJzY3JpYmVMYXRlc3RgLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1Ymxpc2hlclxuICogQSB2YWxpZCBzZXF1ZW5jZSBvZiBjYWxscyB0byB0aGUgbWV0aG9kcyBvZiBhbiBgSXRlcmF0aW9uT2JzZXJ2ZXJgXG4gKiByZXByZXNlbnRzIGFuIGl0ZXJhdGlvbi4gQSB2YWxpZCBzZXF1ZW5jZSBjb25zaXN0cyBvZiBhbnkgbnVtYmVyIG9mIGNhbGxzXG4gKiB0byBgcHVibGlzaGAgd2l0aCB0aGUgc3VjY2Vzc2l2ZSBub24tZmluYWwgdmFsdWVzLCBmb2xsb3dlZCBieSBhXG4gKiBmaW5hbCBjYWxsIHRvIGVpdGhlciBgZmluaXNoYCB3aXRoIGEgc3VjY2Vzc2Z1bCBgY29tcGxldGlvbmAgdmFsdWVcbiAqIG9yIGBmYWlsYCB3aXRoIHRoZSBhbGxlZ2VkIGByZWFzb25gIGZvciBmYWlsdXJlLiBBZnRlciBhdCBtb3N0IG9uZVxuICogdGVybWluYXRpbmcgY2FsbHMsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBhcmUgdmFsaWQgYW5kIG11c3QgYmVcbiAqIHJlamVjdGVkLlxuICogQHByb3BlcnR5IHsobm9uRmluYWxWYWx1ZTogVCkgPT4gdm9pZH0gcHVibGlzaFxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogVCkgPT4gdm9pZH0gZmluaXNoXG4gKiBAcHJvcGVydHkgeyhyZWFzb246IGFueSkgPT4gdm9pZH0gZmFpbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPFB1Ymxpc2hlcjxUPj59IFB1Ymxpc2hPYnNlcnZlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1Ymxpc2hLaXQ8VD5cbiAqIEBwcm9wZXJ0eSB7UHVibGlzaGVyPFQ+fSBwdWJsaXNoZXJcbiAqIEBwcm9wZXJ0eSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZFB1Ymxpc2hLaXQ8VD5cbiAqIEBwcm9wZXJ0eSB7UHVibGlzaGVyPFQ+fSBwdWJsaXNoZXJcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J21hbmRhdG9yeScgfCAnb3Bwb3J0dW5pc3RpYycgfCAnaWdub3JlZCd9IER1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5XG4gKlxuICogRHVyYWJpbGl0eSBjb25maWd1cmVzIGNvbnN0cmFpbnRzIG9uIG5vbi10ZXJtaW5hbCB2YWx1ZXMgdGhhdCBjYW4gYmVcbiAqIHB1Ymxpc2hlZCB0byBhIGR1cmFibGUgcHVibGlzaCBraXQgKHRlcm1pbmFsIHZhbHVlcyBzZW50IHRvIGZpbmlzaCBvciBmYWlsXG4gKiBtdXN0IGFsd2F5cyBiZSBkdXJhYmxlKS5cbiAqIC0gJ21hbmRhdG9yeScgbWVhbnMgdGhhdCBlYWNoIHZhbHVlIG11c3QgYmUgZHVyYWJsZSwgc28gaXQgY2FuIGJlIHJlc3RvcmVkXG4gKiAgIG9uIHVwZ3JhZGUuXG4gKiAtICdvcHBvcnR1bmlzdGljJyBtZWFucyB0aGF0IGEgZHVyYWJsZSB2YWx1ZSBpcyBwZXJzaXN0ZWQgZm9yIHBvc3QtdXBncmFkZVxuICogICByZXN0b3JhdGlvbiwgYnV0IGEgbm9uLWR1cmFibGUgdmFsdWUgaXMgc3RpbGwgYWNjZXB0ZWQgKGFuZCB3aWxsIHJlc3VsdCBpblxuICogICB2YWx1ZWxlc3MgcmVzdG9yYXRpb24pLlxuICogLSAnaWdub3JlZCcgbWVhbnMgdGhhdCBhIHZhbHVlIGlzIG5vdCBwZXJzaXN0ZWQgZm9yIHJlc3RvcmF0aW9uIGV2ZW4gaWYgaXRcbiAqICAgaXMgZHVyYWJsZS5cbiAqXG4gKiAnbWFuZGF0b3J5JyBpcyB0aGUgb25seSBjdXJyZW50bHktc3VwcG9ydGVkIHZhbHVlLCBhbmQgb3RoZXJzIG11c3Qgbm90IGJlXG4gKiBlbmFibGVkIHdpdGhvdXQgdGVzdCBjb3ZlcmFnZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IER1cmFibGVQdWJsaXNoS2l0U3RhdGVcbiAqXG4gKiBAcHJvcGVydHkge0R1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5fSB2YWx1ZUR1cmFiaWxpdHlcbiAqXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gcHVibGlzaENvdW50XG4gKlxuICogQHByb3BlcnR5IHsnbGl2ZScgfCAnZmluaXNoZWQnIHwgJ2ZhaWxlZCd9IHN0YXR1c1xuICpcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaGFzVmFsdWVcbiAqIGhhc1ZhbHVlIGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YgdmFsdWUuIEl0IHN0YXJ0cyBvZmYgZmFsc2UsXG4gKiBhbmQgY2FuIGJlIHJlc2V0IHRvIGZhbHNlIHdoZW4gYSBkdXJhYmxlIHB1Ymxpc2gga2l0IGlzIHJlc3RvcmVkIGFuZFxuICogdGhlIHByZXZpb3VzIHZhbHVlIHdhcyBub3QgZHVyYWJsZSwgb3Igbm9uLXRlcm1pbmFsIGFuZCB2YWx1ZUR1cmFibGl0eSBpcyAnaWdub3JlZCcuXG4gKlxuICogQHByb3BlcnR5IHthbnl9IHZhbHVlXG4gKiB2YWx1ZSBob2xkcyBlaXRoZXIgYSBub24tdGVybWluYWwgdmFsdWUgZnJvbSBgcHVibGlzaGAgb3IgYSB0ZXJtaW5hbCB2YWx1ZVxuICogZnJvbSBgZmluaXNoYCBvciBgZmFpbGAsIGRlcGVuZGluZyB1cG9uIHRoZSB2YWx1ZSBpbiBzdGF0dXMuXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVcGRhdGVSZWNvcmQ8VD5cbiAqIEBwcm9wZXJ0eSB7VH0gdmFsdWUgaXMgd2hhdGV2ZXIgc3RhdGUgdGhlIHNlcnZpY2Ugd2FudHMgdG8gcHVibGlzaFxuICogQHByb3BlcnR5IHtiaWdpbnR9IFt1cGRhdGVDb3VudF0gaXMgYSB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHVwZGF0ZS4gIEZvclxuICogdGhlIGxhc3QgdXBkYXRlLCBpdCBpcyBgdW5kZWZpbmVkYC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QmFzZU5vdGlmaWVyPFQ+fSBOb3RpZmllckludGVybmFscyBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLFxuICogc28gaXQgbXVzdCBiZSBzYWZlIHRvIGV4cG9zZS4gQnV0IG90aGVyIHNvZnR3YXJlIHNob3VsZCBhdm9pZCBkZXBlbmRpbmcgb25cbiAqIGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge05vdGlmaWVySW50ZXJuYWxzPFQ+ICZcbiAqICAgRm9ya2FibGVBc3luY0l0ZXJhYmxlPFQsIFQ+ICZcbiAqICAgU2hhcmFibGVOb3RpZmllcjxUPlxuICogfSBOb3RpZmllcjxUPiBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgc3RhdGUgb3IgdXBkYXRlc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNoYXJhYmxlTm90aWZpZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxOb3RpZmllckludGVybmFsczxUPj59IGdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBOb3RpZmljYXRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VOb3RpZmllcihFKHJlbW90ZUl0ZXJhYmxlKS5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTm90aWZpZXJSZWNvcmQ8VD4gdGhlIHByb2R1Y2VkIG5vdGlmaWVyL3VwZGF0ZXIgcGFpclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gdXBkYXRlciB0aGUgKGNsb3NlbHktaGVsZCkgbm90aWZpZXIgcHJvZHVjZXJcbiAqIEBwcm9wZXJ0eSB7Tm90aWZpZXI8VD59IG5vdGlmaWVyIHRoZSAod2lkZWx5LWhlbGQpIG5vdGlmaWVyIGNvbnN1bWVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7SXRlcmFibGVFYWNoVG9waWM8VD4gJiBFYWNoVG9waWM8VD4gJlxuICogICBTaGFyYWJsZVN1YnNjcmlwdGlvbjxUPn0gU3Vic2NyaXB0aW9uPFQ+XG4gKiBBIGZvcm0gb2YgQXN5bmNJdGVyYWJsZSBzdXBwb3J0aW5nIGRpc3RyaWJ1dGVkIGFuZCBtdWx0aWNhc3QgdXNhZ2UuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU2hhcmFibGVTdWJzY3JpcHRpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxFYWNoVG9waWM8VD4+fSBnZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsc1xuICogVXNlZCB0byByZXBsaWNhdGUgdGhlIG11bHRpY2FzdCB2YWx1ZXMgYXQgb3RoZXIgc2l0ZXMuIFRvIG1hbnVhbGx5IGNyZWF0ZSBhXG4gKiBsb2NhbCByZXByZXNlbnRhdGl2ZSBvZiBhIFN1YnNjcmlwdGlvbiwgZG9cbiAqIGBgYGpzXG4gKiBsb2NhbEl0ZXJhYmxlID1cbiAqICAgbWFrZVN1YnNjcmlwdGlvbihFKHJlbW90ZUl0ZXJhYmxlKS5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFscygpKTtcbiAqIGBgYFxuICogVGhlIHJlc3VsdGluZyBgbG9jYWxJdGVyYWJsZWAgYWxzbyBzdXBwb3J0cyBzdWNoIHJlbW90ZSB1c2UsIGFuZFxuICogd2lsbCByZXR1cm4gYWNjZXNzIHRvIHRoZSBzYW1lIHJlcHJlc2VudGF0aW9uLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN1YnNjcmlwdGlvblJlY29yZDxUPlxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGljYXRpb25cbiAqIEBwcm9wZXJ0eSB7U3Vic2NyaXB0aW9uPFQ+fSBzdWJzY3JpcHRpb25cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl0gQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5NYXJzaGFsPFNsb3Q+fSBNYXJzaGFsbGVyICovXG4vKiogQHR5cGVkZWYge1BpY2s8TWFyc2hhbGxlciwgJ2Zyb21DYXBEYXRhJz59IFVuc2VyaWFsaXplciAqL1xuXG4vKipcbiAqIERlZmluZWQgYnkgdnN0b3JhZ2VTdG9yZUtleSBpbiB2c3RvcmFnZS5nb1xuICpcbiAqIEB0eXBlZGVmIFZTdG9yYWdlS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVTdWJrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhUHJlZml4Qnl0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9EYXRhVmFsdWVdXG4gKi9cblxuLyoqXG4gKiBUaGlzIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIElBVkwgdHJlZS5cbiAqXG4gKiBUaGUgYWN0aXZlIGltcGxlbWVudGF0aW9uIGlzIHgvdnN0b3JhZ2UsIGFuIEFnb3JpYyBleHRlbnNpb24gb2YgdGhlIENvc21vcyBTREsuXG4gKlxuICogVnN0b3JhZ2UgaXMgYSBoaWVyYXJjaGljYWwgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmFnZSBzdHJ1Y3R1cmUgdGhhdFxuICogaWRlbnRpZmllcyBjaGlsZHJlbiBieSByZXN0cmljdGVkIEFTQ0lJIG5hbWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhcmJpdHJhcnlcbiAqIHN0cmluZy12YWx1ZWQgZGF0YSBmb3IgZWFjaCBub2RlLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmFnZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KGRhdGE6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gc2V0VmFsdWUgcHVibGlzaGVzIHNvbWUgZGF0YSAoYXBwZW5kIHRvIHRoZSBub2RlKVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldFBhdGggdGhlIGNoYWluIHN0b3JhZ2UgcGF0aCBhdCB3aGljaCB0aGUgbm9kZSB3YXMgY29uc3RydWN0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleT59IGdldFN0b3JlS2V5IERFUFJFQ0FURUQgdXNlIGdldFBhdGhcbiAqIEBwcm9wZXJ0eSB7KHN1YlBhdGg6IHN0cmluZywgb3B0aW9ucz86IHtzZXF1ZW5jZT86IGJvb2xlYW59KSA9PiBTdG9yYWdlTm9kZX0gbWFrZUNoaWxkTm9kZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGUgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBTdG9yZWRTdWJzY3JpYmVyXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1N1YnNjcmlwdGlvbjxUPiAmIHtcbiAqICAgZ2V0U3RvcmVLZXk6ICgpID0+IFByb21pc2U8VlN0b3JhZ2VLZXkgJiB7IHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uPFQ+IH0+LFxuICogICBnZXRVbnNlcmlhbGl6ZXI6ICgpID0+IFVuc2VyaWFsaXplcixcbiAqIH19IFN0b3JlZFN1YnNjcmlwdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtTdWJzY3JpYmVyPFQ+ICYgU3RvcmVkRmFjZXR9IFN0b3JlZFN1YnNjcmliZXJcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADYXAJ99gYAAPYGAAAtAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzeyJpbXBvcnRzIjpbIi4uL3NyYy90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJtYWtlRmFrZU1hcnNoYWxsZXIiLCJtYWtlRmFrZVN0b3JhZ2UiLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsbWFrZU1hcnNoYWw7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXSxbXCIuLi9zcmMvdHlwZXMtYW1iaWVudC5qc1wiLCBbXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7SXRlcmF0aW9uT2JzZXJ2ZXI8dW5rbm93bj59IFtwdWJsaWNhdGlvbl1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VGYWtlU3RvcmFnZT0ocGF0aCxwdWJsaWNhdGlvbik9PntcbmxldCBzZXRWYWx1ZUNhbGxzPTA7XG5jb25zdCBmdWxsUGF0aD0gYHB1Ymxpc2guJHtwYXRofWA7XG5jb25zdCBzdG9yZUtleT1oYXJkZW4oe1xuc3RvcmVOYW1lOidzd2luZ3NldCcsXG5zdG9yZVN1YmtleTogYHN3aW5nc2V0L2RhdGE6JHtmdWxsUGF0aH1gLFxuZGF0YVByZWZpeEJ5dGVzOicnfSk7XG5cbi8qKiBAdHlwZSB7U3RvcmFnZU5vZGUgJiB7IGNvdW50U2V0VmFsdWVDYWxsczogKCkgPT4gbnVtYmVyfX0gKi9cbmNvbnN0IHN0b3JhZ2U9RmFyKCdTdG9yYWdlTm9kZScse1xuZ2V0UGF0aDooKT0+cGF0aCxcbmdldFN0b3JlS2V5OmFzeW5jKCk9PnN0b3JlS2V5LFxuc2V0VmFsdWU6YXN5bmModmFsdWUpPT57XG5zZXRWYWx1ZUNhbGxzKz0xO1xuYXNzZXJ0LnR5cGVvZih2YWx1ZSwnc3RyaW5nJyk7XG5pZihwdWJsaWNhdGlvbil7XG5wdWJsaWNhdGlvbi51cGRhdGVTdGF0ZSh2YWx1ZSk7XG4gfVxuIH0sXG5tYWtlQ2hpbGROb2RlOigpPT5zdG9yYWdlLFxuY291bnRTZXRWYWx1ZUNhbGxzOigpPT5zZXRWYWx1ZUNhbGxzfSk7XG5cbnJldHVybiBzdG9yYWdlO1xuIH07JGjigI1fb25jZS5tYWtlRmFrZVN0b3JhZ2UobWFrZUZha2VTdG9yYWdlKTtcbmhhcmRlbihtYWtlRmFrZVN0b3JhZ2UpO1xuXG5jb25zdCAgICAgICAgbWFrZUZha2VNYXJzaGFsbGVyPSgpPT5cbm1ha2VNYXJzaGFsKHVuZGVmaW5lZCx1bmRlZmluZWQse1xubWFyc2hhbFNhdmVFcnJvcjooKT0+eyB9fSk7JGjigI1fb25jZS5tYWtlRmFrZU1hcnNoYWxsZXIobWFrZUZha2VNYXJzaGFsbGVyKTtcblxuaGFyZGVuKG1ha2VGYWtlTWFyc2hhbGxlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qcyI6W1siZXZlbnRMb29wSXRlcmF0aW9uIiwiZXZlbnRMb29wSXRlcmF0aW9uIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VGYWtlU3RvcmFnZSI6WyJtYWtlRmFrZVN0b3JhZ2UiXSwibWFrZUZha2VNYXJzaGFsbGVyIjpbIm1ha2VGYWtlTWFyc2hhbGxlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA+Ylw2XAEAAFwBAAAgAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMSj4EgjDAAAIwwAACEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9sZWdhY3kvbGVnYWN5TWFwLmpzIiwiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsIkBlbmRvL2V4byIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyIsImlzQ29weU1hcCIsImlzQ29weU1hcCIsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtdXSxbXCJAZW5kby9leG9cIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzXCIsIFtdXSxbXCIuL2xlZ2FjeS9sZWdhY3lNYXAuanNcIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGVuZG8vcGF0dGVybnMiOltbImlzS2V5IiwiaXNLZXkiXSxbImFzc2VydEtleSIsImFzc2VydEtleSJdLFsiYXNzZXJ0U2NhbGFyS2V5IiwiYXNzZXJ0U2NhbGFyS2V5Il0sWyJtYWtlQ29weVNldCIsIm1ha2VDb3B5U2V0Il0sWyJnZXRDb3B5U2V0S2V5cyIsImdldENvcHlTZXRLZXlzIl0sWyJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnIl0sWyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sWyJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlCYWdFbnRyaWVzIl0sWyJtYWtlQ29weU1hcCIsIm1ha2VDb3B5TWFwIl0sWyJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIl0sWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdLFsiY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIl0sWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdLFsiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldENvbXBhcmUiLCJzZXRDb21wYXJlIl0sWyJzZXRVbmlvbiIsInNldFVuaW9uIl0sWyJzZXREaXNqb2ludFVuaW9uIiwic2V0RGlzam9pbnRVbmlvbiJdLFsic2V0SW50ZXJzZWN0aW9uIiwic2V0SW50ZXJzZWN0aW9uIl0sWyJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRTdWJ0cmFjdCJdLFsiYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il0sWyJNIiwiTSJdLFsiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIl0sWyJpc1BhdHRlcm4iLCJpc1BhdHRlcm4iXSxbImFzc2VydFBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIl0sWyJtYXRjaGVzIiwibWF0Y2hlcyJdLFsibXVzdE1hdGNoIiwibXVzdE1hdGNoIl1dLCJAZW5kby9leG8iOltbImluaXRFbXB0eSIsImluaXRFbXB0eSJdLFsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyJdLFsiZGVmaW5lRXhvQ2xhc3NLaXQiLCJkZWZpbmVFeG9DbGFzc0tpdCJdLFsibWFrZUV4byIsIm1ha2VFeG8iXV0sIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyI6W1sibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXV0sIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXV0sIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6W1sibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiXV0sIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXV0sIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjpbWyJwcm92aWRlTGF6eSIsInByb3ZpZGVMYXp5Il0sWyJpc0NvcHlNYXAiLCJpc0NvcHlNYXAiXSxbImlzQ29weVNldCIsImlzQ29weVNldCJdXSwiLi9sZWdhY3kvbGVnYWN5TWFwLmpzIjpbWyJtYWtlTGVnYWN5TWFwIiwibWFrZUxlZ2FjeU1hcCJdXSwiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6W1sibWFrZUxlZ2FjeVdlYWtNYXAiLCJtYWtlTGVnYWN5V2Vha01hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4q+AfUYLAABGCwAALAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLmpzIiwiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHEsRmFpbDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG5cbi8qKlxuICogVGhpcyBtb2R1bGUgYW5kIGl0cyBmcmF0ZXJuYWwgc2libGluZyBsZWdhY3lXZWFrTWFwIGV4aXN0IG9ubHkgdG9cbiAqIGVhc2UgYSB0cmFuc2l0aW9uIHRvIHRoZSBtb2Rlcm4gYHN0b3JlYCBzeXN0ZW0sIGFyZSBkZXByZWNhdGVkLFxuICogYW5kIHdpbGwgZXZlbnR1YWxseSBkaXNhcHBlYXIuIFRoZXkgYXJlIG5lZWRlZCBmb3Igbm93IHRvIHN1cHBvcnRcbiAqIHNvbWUgb2YgdGhlIHVzZXMgb2YgdGhlIG9sZCBiZWhhdmlvciB0aGF0IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoXG4gKiB0aGUgbmV3LiBUaGUgY29uc3RyYWludCBpbXBvc2VkIGJ5IHRoZSBuZXcgaXMgdGhhdCBvbmx5IHBhc3NhYmxlcyBjYW5cbiAqIGJlIHVzZWQgYXMgdmFsdWVzLCBhbmQgb25seSBrZXlzIChyb3VnaGx5LCBzdHJ1Y3R1cmVzLCBha2EgY29tcGFyYWJsZXMpXG4gKiBjYW4gYmUgdXNlZCBhcyB2YWx1ZXMuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzM1NjdcbiAqIFRPRE8gT25jZSB0aGF0IFBSIGlzIG1lcmdlZCwgbGluayB0byB0aGUgZG9jdW1lbnRzIHJhdGhlciB0aGFuIHRoZSBQUnMuXG4gKlxuICogRWFjaCBvZiB0aGVzZSBub24tY29uZm9ybWluZyB1c2VzIHNob3VsZCBiZSBtYXJrZWQgd2l0aCBhXG4gKiBgYGBqc1xuICogLy8gTGVnYWN5IGJlY2F1c2UuLi5cbiAqIGBgYFxuICogY29tbWVudCBleHBsYWluaW5nIHRoZSBwcm9ibGVtIGluaGliaXRpbmcgY29udmVyc2lvbiB0byB0aGUgbmV3XG4gKiBzeXN0ZW0uIFNvbWUgb2YgdGhlc2UgcHJvYmxlbXMgYXMgb2YgdGhpcyB3cml0aW5nOlxuICogICAgKiBBIHByb21pc2VLaXQgdXNlZCBhcyBhIHZhbHVlLCBldmVuIHRob3VnaCBhIHByb21pc2VLaXQgaXMgbm90XG4gKiAgICAgIGEgcGFzc2FibGUuIFNvbHV0aW9ucyBhcmUgdG8gbWFrZSBpdCBhIHBhc3NhYmxlLCBvciB0byBjb252ZXJ0XG4gKiAgICAgIHRoZSBjb250YWluZXIgYmFjayB0byBhIGNvbnZlbnRpb25hbCBKYXZhU2NyaXB0IE1hcC5cbiAqICAgICogQSBtdXRhYmxlIGFycmF5IHVzZWQgYXMgYSB2YWx1ZSwgdGhhdCBpcyBzdWJzZXF1ZW50bHkgbXV0YXRlZC5cbiAqICAgICAgRnJlZXppbmcgdGhlIGFycmF5IHdvdWxkbid0IHdvcmsgb2YgY291cnNlIGJlY2F1c2UgaXQgd291bGQgYnJlYWtcbiAqICAgICAgdGhlIHN1YnNlcXVlbnQgbXV0YXRpb24uIFVzaW5nIGEgZmFyIG9iamVjdCB3cmFwcGluZyBhbiBhcnJheSB3b3VsZFxuICogICAgICBsaWtlbHkgd29yayBmaW5lLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJNYXAgaWYgcG9zc2libGUsIE1hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5TWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTGVnYWN5TWFwPSh0YWc9J2tleScpPT57XG5jb25zdCBtPW5ldyBNYXAoKTtcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hbS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5tLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4gbS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xucmV0dXJuIG0uZ2V0KGtleSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xubS5kZWxldGUoa2V5KTtcbiB9LFxua2V5czooKT0+bS5rZXlzKCksXG52YWx1ZXM6KCk9Pm0udmFsdWVzKCksXG5lbnRyaWVzOigpPT5tLmVudHJpZXMoKSxcbmdldFNpemU6KCk9Pm0uc2l6ZSxcbmNsZWFyOigpPT5tLmNsZWFyKCl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTGVnYWN5TWFwKG1ha2VMZWdhY3lNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lNYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACmg020wgYAAMIGAAAwAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLmpzIiwiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5V2Vha01hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBxLEZhaWw7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuLyoqXG4gKiBTZWUgZG9jY29tbWVudCBpbiB0aGUgY2xvc2VseSByZWxhdGVkIGBsZWdhY3lNYXAuanNgIG1vZHVsZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBzd2l0Y2ggdG8gU2NhbGFyV2Vha01hcCBpZiBwb3NzaWJsZSwgV2Vha01hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5V2Vha01hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUxlZ2FjeVdlYWtNYXA9KHRhZz0na2V5Jyk9Pntcbi8qKiBAdHlwZSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0gKi9cbmNvbnN0IHdtPW5ldyBXZWFrTWFwKCk7XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIXdtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbndtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4gd20uaGFzKGtleSk7XG4gfSxcbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xud20uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4vKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7Vn0gKi93bS5nZXQoa2V5KSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLmRlbGV0ZShrZXkpO1xuIH19KTtcblxuIH07JGjigI1fb25jZS5tYWtlTGVnYWN5V2Vha01hcChtYWtlTGVnYWN5V2Vha01hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeVdlYWtNYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJoDutcWFgAAFhYAADEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZS11dGlscy5qcyIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixhc3NlcnRQYXNzYWJsZSxmaWx0ZXJJdGVyYWJsZSxtYXBJdGVyYWJsZSxjb21wYXJlUmFuayxhc3NlcnRTY2FsYXJLZXksbWFrZUNvcHlNYXAsbWF0Y2hlcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyxtYWtlQ3VycmVudEtleXNLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjigI1fYSldXSxbXCJtYXBJdGVyYWJsZVwiLCBbJGjigI1fYSA9PiAobWFwSXRlcmFibGUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJhc3NlcnRTY2FsYXJLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjigI1fYSldXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtNYXA8SyxWPn0ganNtYXBcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb0FkZFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvU2V0XG4gKiBAcGFyYW0geygoazogSykgPT4gdm9pZCl9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbnRhZz0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc21hcC5rZXlzKCksXG4oayk9PmpzbWFwLmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbnRhZyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHBhcmFtIHtQYXR0ZXJufSBbdmFsdWVQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPEs+fVxuICovXG5jb25zdCBrZXlzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+e1xuaWYoa2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkKXtcbnJldHVybiBpdGVyYWJsZUtleXM7XG4gfVxuY29uc3QgZmlsdGVyPShrKT0+e1xuaWYoa2V5UGF0dCE9PXVuZGVmaW5lZCYmIW1hdGNoZXMoayxrZXlQYXR0KSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuLyogVXNlcyB0aGUgY3VycmVudCBqc21hcCB2YWx1ZSwgc2luY2UgdGhlIGl0ZXJhdGF0b3Igc3Vydml2ZXMgYC5zZXRgKi9cbmlmKHZhbHVlUGF0dCE9PXVuZGVmaW5lZCYmIW1hdGNoZXMoanNtYXAuZ2V0KGspLHZhbHVlUGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbnJldHVybiB0cnVlO1xuIH07XG5yZXR1cm4gZmlsdGVySXRlcmFibGUoaXRlcmFibGVLZXlzLGZpbHRlcik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHBhcmFtIHtQYXR0ZXJufSBbdmFsdWVQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPFY+fVxuICovXG5jb25zdCB2YWx1ZXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpLChrKT0+LyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrKSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbmNvbnN0IGVudHJpZXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpLChrKT0+W1xuayxcbi8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoayldKTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG4vKiogQHR5cGUgeyhrOiBLLCB2OiBWKSA9PiB2b2lkfSAqL2Fzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG50YWcpLFxuXG5rZXlzLFxudmFsdWVzLFxuZW50cmllcyxcblxuc25hcHNob3Q6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1ha2VDb3B5TWFwKGVudHJpZXMoa2V5UGF0dCx2YWx1ZVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkP1xuanNtYXAuc2l6ZTpcblsuLi5rZXlzKGtleVBhdHQsdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5qc21hcC5jbGVhcigpO1xuIH1cbmZvcihjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0LHZhbHVlUGF0dCkpe1xuanNtYXAuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBtYXAgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZU1hcHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGhlIGNvbHVtbiBuYW1lIGZvciB0aGUga2V5XG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SyxWPn1cbiAqLyRo4oCNX29uY2UubWFrZU1hcFN0b3JlTWV0aG9kcyhtYWtlTWFwU3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyTWFwU3RvcmU9KFxudGFnPSdrZXknLFxue2tleVNoYXBlPXVuZGVmaW5lZCx2YWx1ZVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzbWFwPW5ldyBNYXAoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtWT2tUb1NldD0oX2tleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKHZhbHVlKTtcblxuYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2godmFsdWUsdmFsdWVTaGFwZSwnbWFwU3RvcmUgdmFsdWUnKTtcbiB9XG4gfTtcblxuY29uc3QgYXNzZXJ0S1ZPa1RvQWRkPShrZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xuXG5hc3NlcnRTY2FsYXJLZXkoa2V5KTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaChrZXksa2V5U2hhcGUsJ21hcFN0b3JlIGtleScpO1xuIH1cbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlTWFwU3RvcmVNZXRob2RzKFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG51bmRlZmluZWQsXG50YWcpfSk7XG5cblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyTWFwU3RvcmUobWFrZVNjYWxhck1hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyTWFwU3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXBTdG9yZU1ldGhvZHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyTWFwU3RvcmUiOlsibWFrZVNjYWxhck1hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ0DliBBDwAAQQ8AADEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4vc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwiLi9zdG9yZS11dGlscy5qcyIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixmaWx0ZXJJdGVyYWJsZSxjb21wYXJlUmFuayxhc3NlcnRTY2FsYXJLZXksbWFrZUNvcHlTZXQsbWF0Y2hlcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyxtYWtlQ3VycmVudEtleXNLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIi4vc2NhbGFyV2Vha1NldFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha1NldFN0b3JlTWV0aG9kc1wiLCBbJGjigI1fYSA9PiAobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsIFskaOKAjV9hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7U2V0PEs+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0U3RvcmVNZXRob2RzPShcbmpzc2V0LFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc3NldC5rZXlzKCksXG4oayk9Pmpzc2V0LmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUsXG5rZXlOYW1lKTtcblxuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbmNvbnN0IGtleXM9KGtleVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkP1xuaXRlcmFibGVLZXlzOlxuZmlsdGVySXRlcmFibGUoaXRlcmFibGVLZXlzLChrKT0+bWF0Y2hlcyhrLGtleVBhdHQpKTtcblxucmV0dXJuIGhhcmRlbih7XG4uLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhcbmpzc2V0LFxuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbmtleU5hbWUpLFxuXG5cbmtleXMsXG5cbnZhbHVlczprZXlzLFxuXG5zbmFwc2hvdDooa2V5UGF0dD11bmRlZmluZWQpPT5tYWtlQ29weVNldChrZXlzKGtleVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/anNzZXQuc2l6ZTpbLi4ua2V5cyhrZXlQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkKXtcbmpzc2V0LmNsZWFyKCk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQpKXtcbmpzc2V0LmRlbGV0ZShrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhZGRpbmcgYSBuZXcga2V5IChpbml0KSBhbmQgdXBkYXRpbmcgb3JcbiAqIHJlZmVyZW5jaW5nIGEga2V5IChnZXQsIHNldCwgZGVsZXRlKS5cbiAqXG4gKiBgaW5pdGAgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gYEdldGAsXG4gKiBgc2V0YCBhbmQgYGRlbGV0ZWAgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogc2V0IGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVTZXRzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8Sz59XG4gKi8kaOKAjV9vbmNlLm1ha2VTZXRTdG9yZU1ldGhvZHMobWFrZVNldFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhclNldFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc3NldD1uZXcgU2V0KCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtleU9rVG9BZGQ9KGtleSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5cbmFzc2VydFNjYWxhcktleShrZXkpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnc2V0U3RvcmUga2V5Jyk7XG4gfVxuIH07XG5cbnJldHVybiBGYXIoIGBzY2FsYXIgU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlU2V0U3RvcmVNZXRob2RzKGpzc2V0LGFzc2VydEtleU9rVG9BZGQsdW5kZWZpbmVkLHRhZyl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyU2V0U3RvcmUobWFrZVNjYWxhclNldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH5F4sl3EwAAdxMAADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixhc3NlcnRQYXNzYWJsZSxwYXNzU3R5bGVPZixnZXRDb3B5TWFwRW50cmllcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlNYXA7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5TWFwRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weU1hcEVudHJpZXMgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcImlzQ29weU1hcFwiLCBbJGjigI1fYSA9PiAoaXNDb3B5TWFwID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7V2Vha01hcFN0b3JlPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha01hcFN0b3JlTWV0aG9kcz0oXG5qc21hcCxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiFqc21hcC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5cbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5qc21hcC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIG1hcC4qL1xucmV0dXJuIGpzbWFwLmhhcyhrZXkpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xucmV0dXJuICgvKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGtleSkpO1xuIH0sXG5cbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuYXNzZXJ0S1ZPa1RvQWRkKGtleSx2YWx1ZSk7XG5qc21hcC5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuc2V0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbmFzc2VydEtWT2tUb1NldChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5pZihhc3NlcnRLZXlPa1RvRGVsZXRlIT09dW5kZWZpbmVkKXtcbmFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiB9XG5qc21hcC5kZWxldGUoa2V5KTtcbiB9LFxuXG5hZGRBbGw6KGVudHJpZXMpPT57XG5pZih0eXBlb2YgZW50cmllc1tTeW1ib2wuaXRlcmF0b3JdIT09J2Z1bmN0aW9uJyl7XG5pZihPYmplY3QuaXNGcm96ZW4oZW50cmllcykmJmlzQ29weU1hcChlbnRyaWVzKSl7XG5lbnRyaWVzPWdldENvcHlNYXBFbnRyaWVzKGVudHJpZXMpO1xuIH1lbHNle1xuRmFpbCBgcHJvdmlkZWQgZGF0YSBzb3VyY2UgaXMgbm90IGl0ZXJhYmxlOiAke2VudHJpZXN9YDtcbiB9XG4gfVxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZi8qKiBAdHlwZSB7SXRlcmFibGU8W0ssIFZdPn0gKi9lbnRyaWVzKXtcbi8qIERvbid0IGFzc2VydCB0aGF0IHRoZSBrZXkgZWl0aGVyIGRvZXMgb3IgZG9lcyBub3QgZXhpc3QuKi9cbmFzc2VydEtWT2tUb0FkZChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIG1hcFN0b3JlIGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlczpcbiAqIHByaW1pdGl2ZXMgb3IgcmVtb3RhYmxlcy5cbiAqIE90aGVyIG1hcFN0b3JlcyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcyBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogVE9ETyBGb3Igbm93LCB0aGlzIHNjYWxhcldlYWtNYXAgYWNjZXB0cyBvbmx5IHJlbW90YWJsZXMsIHJlZmxlY3RpbmcgdGhlXG4gKiBjb25zdHJhaW50cyBvZiB0aGUgdW5kZXJseWluZyBKYXZhU2NyaXB0IFdlYWtNYXAgaXQgdXNlcyBpbnRlcm5hbGx5LiBCdXRcbiAqIGl0IHNob3VsZCBhY2NlcHQgdGhlIHByaW1pdGl2ZXMgYXMgd2VsbCwgc3RvcmluZyB0aGVtIGluIGEgc2VwYXJhdGUgaW50ZXJuYWxcbiAqIG1hcC4gV2hhdCBtYWtlcyBpdCBcIndlYWtcIiBpcyB0aGF0IGl0IHByb3ZpZGVzIG5vIEFQSSBmb3IgZW51bWVyYXRpbmcgd2hhdCdzXG4gKiB0aGVyZS4gVGhvdWdoIG5vdGUgdGhhdCB0aGlzIHdvdWxkIG9ubHkgZW5hYmxlcyBjb2xsZWN0aW9uIG9mIHRoZVxuICogcmVtb3RhYmxlcywgc2luY2UgdGhlIG90aGVyIHByaW1pdGl2ZXMgbWF5IGFsd2F5cyByZWFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1dlYWtNYXBTdG9yZTxLLFY+fVxuICovJGjigI1fb25jZS5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhcldlYWtNYXBTdG9yZT0oXG50YWc9J2tleScsXG57bG9uZ0xpdmVkPXRydWUsa2V5U2hhcGU9dW5kZWZpbmVkLHZhbHVlU2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNtYXA9bmV3KGxvbmdMaXZlZD9XZWFrTWFwOk1hcCkoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtWT2tUb1NldD0oX2tleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKHZhbHVlKTtcblxuYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2godmFsdWUsdmFsdWVTaGFwZSwnd2Vha01hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcbnBhc3NTdHlsZU9mKGtleSk9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtNYXBTdG9yZXM6ICR7a2V5fWA7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCd3ZWFrTWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhcldlYWtNYXBTdG9yZShtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA6ErEYQ8PAAAPDwAANQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4vc3RvcmUtdXRpbHMuanMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLHBhc3NTdHlsZU9mLGdldENvcHlTZXRLZXlzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weVNldDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcImlzQ29weVNldFwiLCBbJGjigI1fYSA9PiAoaXNDb3B5U2V0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtXZWFrU2V0PEsgJiBvYmplY3Q+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxuanNzZXQuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBzZXQuKi9cbnJldHVybiBqc3NldC5oYXMoa2V5KTtcbiB9LFxuXG5hZGQ6KGtleSk9PntcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNzZXQuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihrZXlzKT0+e1xuaWYodHlwZW9mIGtleXNbU3ltYm9sLml0ZXJhdG9yXSE9PSdmdW5jdGlvbicpe1xuaWYoT2JqZWN0LmlzRnJvemVuKGtleXMpJiZpc0NvcHlTZXQoa2V5cykpe1xua2V5cz1nZXRDb3B5U2V0S2V5cyhrZXlzKTtcbiB9ZWxzZXtcbkZhaWwgYHByb3ZpZGVkIGRhdGEgc291cmNlIGlzIG5vdCBpdGVyYWJsZTogJHtrZXlzfWA7XG4gfVxuIH1cbmZvcihjb25zdCBrZXkgb2YvKiogQHR5cGUge0l0ZXJhYmxlPEs+fSAqL2tleXMpe1xuYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuanNzZXQuYWRkKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIHNldCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlU2V0cyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrU2V0IGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrU2V0IGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0XG4gKiBpdCBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBzZXQuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGVcbiAqIHJlbW90YWJsZXMsIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJXZWFrU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2xvbmdMaXZlZD10cnVlLGtleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyhsb25nTGl2ZWQ/V2Vha1NldDpTZXQpKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtleU9rVG9BZGQ9KGtleSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKGtleSk7XG5wYXNzU3R5bGVPZihrZXkpPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrU3RvcmVzOiAke2tleX1gO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKGtleSxrZXlTaGFwZSwnd2Vha1NldFN0b3JlIGtleScpO1xuIH1cbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFdlYWtTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKGpzc2V0LGFzc2VydEtleU9rVG9BZGQsdW5kZWZpbmVkLHRhZyl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlU2NhbGFyV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACy12MInRkAAJ0ZAAAuAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJhcHBlbmRUb1N0b3JlZEFycmF5IiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLE0sbWF0Y2hlczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIFNob3VsZCBiZWhhdmUgaWRlbnRpY2FsbHkgdG8gdGhlIG9uZSBpbiBgQGVuZG8vcGF0dGVybnNgLCBidXRcbiAqIHJlaW1wbGVtZW50ZWQgZm9yIG5vdyBiZWNhdXNlIGBAZW5kby9wYXR0ZXJuc2AgZm9yZ290IHRvIGV4cG9ydCB0aGlzIG9uZS5cbiAqIFRoaXMgb25lIGlzIHNpbXBsZSBlbm91Z2ggdGhhdCBJIHByZWZlciBhIHJlaW1wbGVtZW50YXRpb24gdG8gYSBkZWVwIGltcG9ydC5cbiAqIFRPRE86IFVuZGF0ZSBgQGVuZG8vcGF0dGVybnNgIHRvIGV4cG9ydCB0aGUgb3JpZ2luYWwsIGFuZCBkZWxldGUgdGhlXG4gKiByZWltcGxlbWVudGF0aW9uIGhlcmUuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHJldHVybnMge3MgaXMgQ29weVNldH1cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weVNldD0ocyk9Pm1hdGNoZXMocyxNLnNldCgpKTtcblxuLyoqXG4gKiBTaG91bGQgYmVoYXZlIGlkZW50aWNhbGx5IHRvIHRoZSBvbmUgaW4gYEBlbmRvL3BhdHRlcm5zYCwgYnV0XG4gKiByZWltcGxlbWVudGVkIGZvciBub3cgYmVjYXVzZSBgQGVuZG8vcGF0dGVybnNgIGZvcmdvdCB0byBleHBvcnQgdGhpcyBvbmUuXG4gKiBUaGlzIG9uZSBpcyBzaW1wbGUgZW5vdWdoIHRoYXQgSSBwcmVmZXIgYSByZWltcGxlbWVudGF0aW9uIHRvIGEgZGVlcCBpbXBvcnQuXG4gKiBUT0RPOiBVbmRhdGUgYEBlbmRvL3BhdHRlcm5zYCB0byBleHBvcnQgdGhlIG9yaWdpbmFsLCBhbmQgZGVsZXRlIHRoZVxuICogcmVpbXBsZW1lbnRhdGlvbiBoZXJlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IG1cbiAqIEByZXR1cm5zIHttIGlzIENvcHlNYXB9XG4gKi8kaOKAjV9vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuY29uc3QgICAgICAgIGlzQ29weU1hcD0obSk9Pm1hdGNoZXMobSxNLm1hcCgpKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDdXJyZW50S2V5c0tpdFxuICogQHByb3BlcnR5IHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uQWRkXG4gKiBAcHJvcGVydHkgeyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkRlbGV0ZVxuICogQHByb3BlcnR5IHtJdGVyYWJsZTxLPn0gaXRlcmFibGVLZXlzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0geygpID0+IEl0ZXJhYmxlPEs+fSBnZXRSYXdLZXlzXG4gKiBAcGFyYW0geyhrOiBLKSA9PiBib29sZWFufSBjaGVja0hhc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydE9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge0N1cnJlbnRLZXlzS2l0PEssVj59XG4gKi8kaOKAjV9vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuY29uc3QgICAgICAgIG1ha2VDdXJyZW50S2V5c0tpdD0oXG5nZXRSYXdLZXlzLFxuY2hlY2tIYXMsXG5jb21wYXJlLFxuYXNzZXJ0T2tUb0FkZCxcbmFzc2VydE9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xubGV0IHVwZGF0ZUNvdW50PTA7XG5sZXQgc29ydGVkS2V5c01lbW87XG5cbmNvbnN0IGFzc2VydFVwZGF0ZU9uQWRkPShrLHY9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0T2tUb0FkZChrLHYpO1xudXBkYXRlQ291bnQrPTE7XG5zb3J0ZWRLZXlzTWVtbz11bmRlZmluZWQ7XG4gfTtcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25EZWxldGU9KGspPT5hc3NlcnRPa1RvRGVsZXRlJiZhc3NlcnRPa1RvRGVsZXRlKGspO1xuXG5jb25zdCBnZXRTb3J0ZWRLZXlzPSgpPT57XG5pZihzb3J0ZWRLZXlzTWVtbz09PXVuZGVmaW5lZCl7XG5zb3J0ZWRLZXlzTWVtbz1oYXJkZW4oWy4uLmdldFJhd0tleXMoKV0uc29ydChjb21wYXJlKSk7XG4gfVxucmV0dXJuIHNvcnRlZEtleXNNZW1vO1xuIH07XG5cbmNvbnN0IGl0ZXJhYmxlS2V5cz1GYXIoJ0l0ZXJhYmxlIG9mIGtleXMnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBnZW5lcmF0aW9uPXVwZGF0ZUNvdW50O1xuZ2V0U29ydGVkS2V5cygpO1xuY29uc3QgbGVuPXNvcnRlZEtleXNNZW1vLmxlbmd0aDtcbmxldCBpPTA7XG5yZXR1cm4gRmFyKCdJdGVyYXRvciBvZiBrZXlzJyx7XG5uZXh0OigpPT57XG5nZW5lcmF0aW9uPT09dXBkYXRlQ291bnR8fEZhaWwgYFN0b3JlICR7cShrZXlOYW1lKX0gY3Vyc29yIHN0YWxlYDtcbi8qIElmIHRoZXkncmUgZXF1YWwsIHRoZW4gdGhlIHNvcnRlZEtleU1lbW8gaXMgdGhlIHNhbWUgb25lKi9cbi8qIHdlIHN0YXJ0ZWQgd2l0aC4qL1xuZm9yKDs7KXtcbmlmKGk8bGVuKXtcbmNvbnN0IHZhbHVlPXNvcnRlZEtleXNNZW1vW2ldO1xuaSs9MTtcbmlmKGNoZWNrSGFzKHZhbHVlKSl7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfVxuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbml0ZXJhYmxlS2V5c30pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VDdXJyZW50S2V5c0tpdChtYWtlQ3VycmVudEtleXNLaXQpO1xuaGFyZGVuKG1ha2VDdXJyZW50S2V5c0tpdCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUxhenlgIHRvIGdldCBvciBtYWtlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleS5cbiAqIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yXG4gKiB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLFY+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gVn0gbWFrZVZhbHVlXG4gKiBAcmV0dXJucyB7Vn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVMYXp5PShtYXBTdG9yZSxrZXksbWFrZVZhbHVlKT0+e1xuaWYoIW1hcFN0b3JlLmhhcyhrZXkpKXtcbm1hcFN0b3JlLmluaXQoa2V5LG1ha2VWYWx1ZShrZXkpKTtcbiB9XG5yZXR1cm4gbWFwU3RvcmUuZ2V0KGtleSk7XG4gfTskaOKAjV9vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qKlxuICogSGVscGVyIGZvciB1c2UgY2FzZXMgaW4gd2hpY2ggdGhlIG1ha2VyIGZ1bmN0aW9uIGlzIGFzeW5jLlxuICogRm9yIHR3byBwcm92aWRlTGF6eSBjYWxscyB3aXRoIHRoZSBzYW1lIGtleSwgb25lIG1heSBiZSBtYWtpbmcgd2hlbiB0aGVcbiAqIG90aGVyIGNhbGwgc3RhcnRzIGFuZCBpdCB3b3VsZCBtYWtlIGFnYWluLlxuICogKFRoZW4gdGhlcmUnZCBiZSBhIGNvbGxpc2lvbiB3aGVuIHRoZSBzZWNvbmQgdHJpZXMgdG8gc3RvcmVcbiAqIHRoZSBrZXkuKSBUaGlzIHByZXZlbnRzIHRoYXQgcmFjZSBjb25kaXRpb24gYnkgaW1tZWRpYXRlbHkgc3RvcmluZyBhIFByb21pc2VcbiAqIGZvciB0aGUgbWFrZXIgaW4gYW4gZXBoZW1lcmFsIHN0b3JlLlxuICpcbiAqIFdoZW4gdGhlIGBzdG9yZWAgYXJndW1lbnQgaXMgZHVyYWJsZSBzdG9yYWdlLCBub3RlIHRoYXQgaXQncyBwb3NzaWJsZSBmb3JcbiAqIHRlcm1pbmF0aW9uIHRvIGhhcHBlbiBhZnRlciB0aGUgbWFrZSBjb21wbGV0ZXMgYW5kIGJlZm9yZSBpdCByZWFjaGVzIGR1cmFibGVcbiAqIHN0b3JhZ2UuXG4gKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge1dlYWtNYXBTdG9yZTxLLCBWPn0gc3RvcmVcbiAqL1xuY29uc3QgICAgICAgIG1ha2VBdG9taWNQcm92aWRlcj0oc3RvcmUpPT57XG4vKiogQHR5cGUge01hcDxLLCBQcm9taXNlPFY+Pn0gKi9cbmNvbnN0IHBlbmRpbmc9bmV3IE1hcCgpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVBc3luY2AgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LFxuICogd2hlbiB0aGUgbWFrZXIgaXMgYXN5bmNocm9ub3VzLlxuICogSWYgdGhlcmUgYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsXG4gKiBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzIHRoZSB2YWx1ZSBmb3JcbiAqIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFByb21pc2U8Vj59IG1ha2VWYWx1ZSBtYWtlIHRoZSB2YWx1ZSBmb3IgdGhlIHN0b3JlXG4gKiBpZiBpdCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciB0aGUgbGFzdCBtYWtlIGZhaWxlZFxuICogQHBhcmFtIHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gUHJvbWlzZTx2b2lkPn0gW2ZpbmlzaFZhbHVlXSBydW5zIGV4YWN0bHlcbiAqIG9uY2UgYWZ0ZXIgYSBuZXcgdmFsdWUgaXMgYWRkZWQgdG8gdGhlIHN0b3JlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxWPn1cbiAqL1xuY29uc3QgcHJvdmlkZUFzeW5jPShrZXksbWFrZVZhbHVlLGZpbmlzaFZhbHVlKT0+e1xuaWYoc3RvcmUuaGFzKGtleSkpe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShzdG9yZS5nZXQoa2V5KSk7XG4gfVxuaWYoIXBlbmRpbmcuaGFzKGtleSkpe1xuY29uc3QgdmFsUD1tYWtlVmFsdWUoa2V5KS5cbnRoZW4oKHYpPT57XG5zdG9yZS5pbml0KGtleSx2KTtcbnJldHVybiB2O1xuIH0pLlxudGhlbigodik9PntcbmlmKGZpbmlzaFZhbHVlKXtcbnJldHVybiBmaW5pc2hWYWx1ZShrZXksdikudGhlbigoKT0+dik7XG4gfVxucmV0dXJuIHY7XG4gfSkuXG5maW5hbGx5KCgpPT57XG5wZW5kaW5nLmRlbGV0ZShrZXkpO1xuIH0pO1xucGVuZGluZy5zZXQoa2V5LHZhbFApO1xuIH1cbmNvbnN0IHZhbFA9cGVuZGluZy5nZXQoa2V5KTtcbmFzc2VydCh2YWxQKTtcbnJldHVybiB2YWxQO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe3Byb3ZpZGVBc3luY30pO1xuIH07JGjigI1fb25jZS5tYWtlQXRvbWljUHJvdmlkZXIobWFrZUF0b21pY1Byb3ZpZGVyKTtcbmhhcmRlbihtYWtlQXRvbWljUHJvdmlkZXIpO1xuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXRvbWljUHJvdmlkZXI8SywgVj4+fSBBdG9taWNQcm92aWRlcjxLLCBWPlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssIFZcbiAqIEBwYXJhbSB7TWFwU3RvcmU8SywgVltdPn0gbWFwU3RvcmVcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0ge1Z9IGl0ZW1cbiAqL1xuY29uc3QgICAgICAgIGFwcGVuZFRvU3RvcmVkQXJyYXk9KG1hcFN0b3JlLGtleSxpdGVtKT0+e1xuaWYobWFwU3RvcmUuaGFzKGtleSkpe1xuY29uc3QgZXh0YW50PW1hcFN0b3JlLmdldChrZXkpO1xubWFwU3RvcmUuc2V0KGtleSxoYXJkZW4oWy4uLmV4dGFudCxpdGVtXSkpO1xuIH1lbHNle1xubWFwU3RvcmUuaW5pdChrZXksaGFyZGVuKFtpdGVtXSkpO1xuIH1cbiB9OyRo4oCNX29uY2UuYXBwZW5kVG9TdG9yZWRBcnJheShhcHBlbmRUb1N0b3JlZEFycmF5KTtcbmhhcmRlbihhcHBlbmRUb1N0b3JlZEFycmF5KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0Il0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwibWFrZUN1cnJlbnRLZXlzS2l0IjpbIm1ha2VDdXJyZW50S2V5c0tpdCJdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSJdLCJtYWtlQXRvbWljUHJvdmlkZXIiOlsibWFrZUF0b21pY1Byb3ZpZGVyIl0sImFwcGVuZFRvU3RvcmVkQXJyYXkiOlsiYXBwZW5kVG9TdG9yZWRBcnJheSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADFAKyCWCoAAFgqAAAhAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5QYXNzU3R5bGV9IFBhc3NTdHlsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVRhZ2dlZH0gQ29weVRhZ2dlZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ29weUFycmF5PFQ+fSBDb3B5QXJyYXkgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyJykuUmFua0NvbXBhcmV9IFJhbmtDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlcicpLlJhbmtDb21wYXJpc29ufSBSYW5rQ29tcGFyaXNvbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG4vKiBQbGFjZWhvbGRlciByZWR1bmRhbnQgdHlwZXMsIHRvIGJlIGltcG9ydGVkIGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkLiovXG5cbi8qKlxuICogQHR5cGVkZWYge1Bhc3NhYmxlfSBLZXlcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1Bhc3NhYmxlfSBQYXR0ZXJuXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5U2V0JyxcbiAqICAgcGF5bG9hZDogQXJyYXk8Sz4sXG4gKiB9fSBDb3B5U2V0XG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5QmFnJyxcbiAqICAgcGF5bG9hZDogQXJyYXk8W0ssIGJpZ2ludF0+LFxuICogfX0gQ29weUJhZ1xuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XVxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gW1Y9UGFzc2FibGVdXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5TWFwJyxcbiAqICAgcGF5bG9hZDogeyBrZXlzOiBBcnJheTxLPiwgdmFsdWVzOiBBcnJheTxWPiB9LFxuICogfX0gQ29weU1hcFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHdWFyZE1ha2Vyc1xuICogQHByb3BlcnR5IHs8TSBleHRlbmRzIFJlY29yZDxhbnksIGFueT4+KGludGVyZmFjZU5hbWU6IHN0cmluZyxcbiAqICAgICAgICAgICAgIG1ldGhvZEd1YXJkczogTSxcbiAqICAgICAgICAgICAgIG9wdGlvbnM/OiB7c2xvcHB5PzogYm9vbGVhbn1cbiAqICkgPT4gSW50ZXJmYWNlR3VhcmR9IGludGVyZmFjZVxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKlxuICogQHByb3BlcnR5IHsoLi4uYXJnR3VhcmRzOiBBcmdHdWFyZFtdKSA9PiBNZXRob2RHdWFyZE1ha2VyfSBjYWxsIEd1YXJkIGEgc3luY2hyb25vdXMgY2FsbFxuICpcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbFdoZW4gR3VhcmQgYW4gYXN5bmMgY2FsbFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFyZ0d1YXJkOiBBcmdHdWFyZCkgPT4gQXJnR3VhcmR9IGF3YWl0IEd1YXJkIGFuIGF3YWl0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IE1ldGhvZFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICoga2xhc3M6ICdJbnRlcmZhY2UnLFxuICogaW50ZXJmYWNlTmFtZTogc3RyaW5nLFxuICogbWV0aG9kR3VhcmRzOiBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBNZXRob2RHdWFyZD5cbiAqIHNsb3BweT86IGJvb2xlYW5cbiAqIH19IEludGVyZmFjZUd1YXJkXG4gKiBUT0RPIHBsYWNlaG9sZGVyLiBGaWd1cmUgb3V0IGhvdyB0byBpbXBvcnQgZnJvbSBgQGVuZG8vcGF0dGVybnNgIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHthbnl9IE1ldGhvZEd1YXJkTWFrZXJcbiAqIFRPRE8gcGxhY2Vob2xkZXIuIEZpZ3VyZSBvdXQgaG93IHRvIGltcG9ydCBmcm9tIGBAZW5kby9wYXR0ZXJuc2AgaW5zdGVhZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sga2xhc3M6ICdtZXRob2RHdWFyZCcsIGNhbGxLaW5kOiAnc3luYycgfCAnYXN5bmMnLCByZXR1cm5HdWFyZDogdW5rbm93biB9fSBNZXRob2RHdWFyZFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7YW55fSBBcmdHdWFyZFxuICogVE9ETyBwbGFjZWhvbGRlci4gRmlndXJlIG91dCBob3cgdG8gaW1wb3J0IGZyb20gYEBlbmRvL3BhdHRlcm5zYCBpbnN0ZWFkXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlT3B0aW9uc1xuICogT2YgdGhlIGRpbWVuc2lvbnMgb24gd2hpY2ggS2V5ZWRTdG9yZXMgY2FuIGRpZmZlciwgd2Ugb25seSByZXByZXNlbnQgYSBmZXdcbiAqIG9mIHRoZW0gYXMgc3RhbmRhcmQgb3B0aW9ucy4gQSBnaXZlbiBzdG9yZSBtYWtlciBzaG91bGQgZG9jdW1lbnQgd2hpY2hcbiAqIG9wdGlvbnMgaXQgc3VwcG9ydHMsIGFzIHdlbGwgYXMgaXRzIHBvc2l0aW9ucyBvbiBkaW1lbnNpb25zIGZvciB3aGljaCBpdFxuICogZG9lcyBub3Qgc3VwcG9ydCBvcHRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbbG9uZ0xpdmVkPXRydWVdIFdoaWNoIHdheSB0byBvcHRpbWl6ZSBhIHdlYWsgc3RvcmUuIFRydWUgbWVhbnNcbiAqIHRoYXQgd2UgZXhwZWN0IHRoaXMgd2VhayBzdG9yZSB0byBvdXRsaXZlIG1vc3Qgb2YgaXRzIGtleXMsIGluIHdoaWNoXG4gKiBjYXNlIHdlIGludGVybmFsbHkgbWF5IHVzZSBhIEphdmFTY3JpcHQgYFdlYWtNYXBgLiBPdGhlcndpc2Ugd2UgaW50ZXJuYWxseVxuICogbWF5IHVzZSBhIEphdmFTY3JpcHQgYE1hcGAuXG4gKiBEZWZhdWx0cyB0byB0cnVlLCBzbyBwbGVhc2UgbWFyayBzaG9ydCBsaXZlZCBzdG9yZXMgZXhwbGljaXRseS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2R1cmFibGU9ZmFsc2VdICBUaGUgY29udGVudHMgb2YgdGhpcyBzdG9yZSBzdXJ2aXZlIHRlcm1pbmF0aW9uXG4gKiAgIG9mIGl0cyBjb250YWluaW5nIHByb2Nlc3MsIGFsbG93aW5nIGZvciByZXN0YXJ0IG9yIHVwZ3JhZGUgYnV0IGF0IHRoZSBjb3N0XG4gKiAgIG9mIGZvcmJpZGRpbmcgc3RvcmFnZSBvZiByZWZlcmVuY2VzIHRvIGVwaGVtZXJhbCBkYXRhLiAgRGVmYXVsdHMgdG8gZmFsc2UuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtmYWtlRHVyYWJsZT1mYWxzZV0gIFRoaXMgc3RvcmUgcHJldGVuZHMgdG8gYmUgYSBkdXJhYmxlIHN0b3JlXG4gKiAgIGJ1dCBkb2VzIG5vdCBlbmZvcmNlIHRoYXQgdGhlIHRoaW5ncyBzdG9yZWQgaW4gaXQgYWN0dWFsbHkgYmUgdGhlbXNlbHZlc1xuICogICBkdXJhYmxlICh3aGVyZWFzIGFuIGFjdHVhbCBkdXJhYmxlIHN0b3JlIHdvdWxkIGZvcmJpZCBzdG9yYWdlIG9mIHN1Y2hcbiAqICAgaXRlbXMpLiAgVGhpcyBpcyBpbiBzZXJ2aWNlIG9mIGFsbG93aW5nIGluY3JlbWVudGFsIHRyYW5zaXRpb24gdG8gdXNlIG9mXG4gKiAgIGR1cmFibGUgc3RvcmVzLCB0byBlbmFibGUgbm9ybWFsIG9wZXJhdGlvbiBhbmQgdGVzdGluZyB3aGVuIHNvbWUgc3R1ZmZcbiAqICAgaW50ZW5kZWQgdG8gZXZlbnR1YWxseSBiZSBkdXJhYmxlIGhhcyBub3QgeWV0IGJlZW4gbWFkZSBkdXJhYmxlLiAgQSBzdG9yZVxuICogICBtYXJrZWQgYXMgZmFrZUR1cmFibGUgd2lsbCBhcHBlYXIgdG8gb3BlcmF0ZSBub3JtYWxseSBidXQgYW55IGF0dGVtcHQgdG9cbiAqICAgdXBncmFkZSBpdHMgY29udGFpbmluZyB2YXQgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IuXG4gKiBAcHJvcGVydHkge1BhdHRlcm59IFtrZXlTaGFwZV1cbiAqIEBwcm9wZXJ0eSB7UGF0dGVybn0gW3ZhbHVlU2hhcGVdXG4gKi9cblxuLyoqXG4gKiBNb3N0IHN0b3JlIG1ldGhvZHMgYXJlIGluIG9uZSBvZiB0aHJlZSBjYXRlZ29yaWVzXG4gKiAgICogbG9va3VwIG1ldGhvZHMgKGBoYXNgLGBnZXRgKVxuICogICAqIHVwZGF0ZSBtZXRob2RzIChgYWRkYCxgaW5pdGAsYHNldGAsYGRlbGV0ZWAsYGFkZEFsbGApXG4gKiAgICogcXVlcnkgbWV0aG9kcyAoYHNuYXBzaG90YCxga2V5c2AsYHZhbHVlc2AsYGVudHJpZXNgLGBnZXRTaXplYClcbiAqICAgKiBxdWVyeS11cGRhdGUgbWV0aG9kcyAoYGNsZWFyYClcbiAqXG4gKiBXZWFrU3RvcmVzIGhhdmUgdGhlIGxvb2t1cCBhbmQgdXBkYXRlIG1ldGhvZHMgYnV0IG5vdCB0aGUgcXVlcnlcbiAqIG9yIHF1ZXJ5LXVwZGF0ZSBtZXRob2RzLlxuICogTm9uLXdlYWsgU3RvcmVzIGFyZSBsaWtlIHRoZWlyIGNvcnJlc3BvbmRpbmcgV2Vha1N0b3JlcywgYnV0IHdpdGggdGhlXG4gKiBhZGRpdGlvbmFsIHF1ZXJ5IGFuZCBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5ICYgb2JqZWN0fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBXZWFrU2V0U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkXG4gKiBBZGQgdGhlIGtleSB0byB0aGUgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiBEbyBub3RoaW5nIHNpbGVudGx5IGlmXG4gKiBhbHJlYWR5IHRoZXJlLlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogQ29weVNldDxLPiB8IEl0ZXJhYmxlPEs+KSA9PiB2b2lkfSBhZGRBbGxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZXRTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBhZGRcbiAqIEFkZCB0aGUga2V5IHRvIHRoZSBzZXQgaWYgaXQgaXMgbm90IGFscmVhZHkgdGhlcmUuIERvIG5vdGhpbmcgc2lsZW50bHkgaWZcbiAqIGFscmVhZHkgdGhlcmUuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGRlbGV0ZVxuICogUmVtb3ZlIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXlzOiBDb3B5U2V0PEs+IHwgSXRlcmFibGU8Sz4pID0+IHZvaWR9IGFkZEFsbFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSBrZXlzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IENvcHlTZXQ8Sz59IHNuYXBzaG90XG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybikgPT4gdm9pZH0gY2xlYXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5ICYgb2JqZWN0fSBbSz1LZXldXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBbVj1QYXNzYWJsZV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdlYWtNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIHN0b3JlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SyxWPiB8IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XVxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gW1Y9UGFzc2FibGVdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIG1hcFxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SyxWPiB8IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxWPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeyhcbiAqICAga2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgIHZhbHVlUGF0dD86IFBhdHRlcm5cbiAqICkgPT4gSXRlcmFibGU8W0ssVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gQ29weU1hcDxLLFY+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBEZXByZWNhdGVkIExlZ2FjeSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExlZ2FjeVdlYWtNYXBcbiAqIExlZ2FjeVdlYWtNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIFdlYWtNYXBTdG9yZSBpbnN0ZWFkIGlmIHBvc3NpYmxlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExlZ2FjeU1hcFxuICogTGVnYWN5TWFwIGlzIGRlcHJlY2F0ZWQuIFVzZSBNYXBTdG9yZSBpbnN0ZWFkIGlmIHBvc3NpYmxlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Vj59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxbSyxWXT59IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsZWFyXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIZgh2L8BAAC/AQAAHAAAAEBhZ29yaWMvdGltZS12MC4zLjIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdGltZU1hdGguanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMBAN+aoIgAAqCIAACMAAABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90aW1lTWF0aC5qc3siaW1wb3J0cyI6WyIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiVGltZU1hdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbXVzdE1hdGNoLE5hdCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxUaW1lc3RhbXBSZWNvcmRTaGFwZTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlID0gJGjigI1fYSldXSxbXCJUaW1lc3RhbXBSZWNvcmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoVGltZXN0YW1wUmVjb3JkU2hhcGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVyQnJhbmR9IFRpbWVyQnJhbmRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuVGltZXN0YW1wfSBUaW1lc3RhbXBcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuUmVsYXRpdmVUaW1lfSBSZWxhdGl2ZVRpbWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuUmVsYXRpdmVUaW1lVmFsdWV9IFJlbGF0aXZlVGltZVZhbHVlXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVzdGFtcFZhbHVlfSBUaW1lc3RhbXBWYWx1ZVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5UaW1lTWF0aFR5cGV9IFRpbWVNYXRoVHlwZVxuICpcbiAqL1xuXG4vKipcbiAqIGBhZ3JlZWRUaW1lckJyYW5kYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0ge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9IGxlZnRCcmFuZFxuICogQHBhcmFtIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfSByaWdodEJyYW5kXG4gKiBAcmV0dXJucyB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgYWdyZWVkVGltZXJCcmFuZD0obGVmdEJyYW5kLHJpZ2h0QnJhbmQpPT57XG5pZihsZWZ0QnJhbmQ9PT11bmRlZmluZWQpe1xuaWYocmlnaHRCcmFuZD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1lbHNle1xucmV0dXJuIHJpZ2h0QnJhbmQ7XG4gfVxuIH1lbHNlIGlmKHJpZ2h0QnJhbmQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGxlZnRCcmFuZDtcbiB9ZWxzZXtcbmxlZnRCcmFuZD09PXJpZ2h0QnJhbmR8fFxuRmFpbCBgVGltZXJCcmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnRCcmFuZCl9IHZzICR7cShyaWdodEJyYW5kKX1gO1xucmV0dXJuIGxlZnRCcmFuZDtcbiB9XG4gfTtcblxuLyoqXG4gKiBgc2hhcmVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCBpbXBsZW1lbnRzIHRoZVxuICogdHJhbnNpdGlvbmFsIGJyYW5kIGNoZWNraW5nIGFuZCBjb250YWlnaW9uIGxvZ2ljIGV4cGxhaW5lZCBpbiB0aGUgYFRpbWVNYXRoYFxuICogY29tbWVudC4gSXQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGJpbmFyeSBvcGVyYXRvcnMgdGhhdCBzaG91bGQgZm9sbG93XG4gKiB0aGlzIGxvZ2ljLiBJdCBkb2VzIHRoZSBlcnJvciBjaGVja2luZyBiZXR3ZWVuIHRoZSBvcGVyYW5kcywgYW5kIHJldHVybnNcbiAqIHRoZSBicmFuZCwgaWYgYW55LCB0aGF0IHNob3VsZCBsYWJlbCB0aGUgcmVzdWx0aW5nIHRpbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IHNoYXJlZFRpbWVyQnJhbmQ9KGxlZnQscmlnaHQpPT57XG5jb25zdCBsZWZ0QnJhbmQ9dHlwZW9mIGxlZnQ9PT0nYmlnaW50Jz91bmRlZmluZWQ6bGVmdC50aW1lckJyYW5kO1xuY29uc3QgcmlnaHRCcmFuZD10eXBlb2YgcmlnaHQ9PT0nYmlnaW50Jz91bmRlZmluZWQ6cmlnaHQudGltZXJCcmFuZDtcbnJldHVybiBhZ3JlZWRUaW1lckJyYW5kKGxlZnRCcmFuZCxyaWdodEJyYW5kKTtcbiB9O1xuXG4vKipcbiAqIGBhYnNMaWtlYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnlcbiAqIG9wZXJhdG9ycyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgYSBgVGltZXN0YW1wYFxuICogcmF0aGVyIHRoYW4gYSBgUmVsYXRpdmVUaW1lYC5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcFZhbHVlfSBhYnNWYWx1ZVxuICogQHJldHVybnMge1RpbWVzdGFtcH1cbiAqL1xuY29uc3QgYWJzTGlrZT0obGVmdCxyaWdodCxhYnNWYWx1ZSk9Pntcbk5hdChhYnNWYWx1ZSk7XG5jb25zdCB0aW1lckJyYW5kPXNoYXJlZFRpbWVyQnJhbmQobGVmdCxyaWdodCk7XG5pZih0aW1lckJyYW5kKXtcbnJldHVybiBoYXJkZW4oe1xudGltZXJCcmFuZCxcbmFic1ZhbHVlfSk7XG5cbiB9ZWxzZXtcbnJldHVybiBhYnNWYWx1ZTtcbiB9XG4gfTtcblxuLyoqXG4gKiBgcmVsTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFJlbGF0aXZlVGltZWBcbiAqIHJhdGhlciB0aGFuIGEgYFRpbWVzdGFtcGAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWVWYWx1ZX0gcmVsVmFsdWVcbiAqIEByZXR1cm5zIHtSZWxhdGl2ZVRpbWV9XG4gKi9cbmNvbnN0IHJlbExpa2U9KGxlZnQscmlnaHQscmVsVmFsdWUpPT57XG5OYXQocmVsVmFsdWUpO1xuY29uc3QgdGltZXJCcmFuZD1zaGFyZWRUaW1lckJyYW5kKGxlZnQscmlnaHQpO1xuaWYodGltZXJCcmFuZCl7XG5yZXR1cm4gaGFyZGVuKHtcbnRpbWVyQnJhbmQsXG5yZWxWYWx1ZX0pO1xuXG4gfWVsc2V7XG5yZXR1cm4gcmVsVmFsdWU7XG4gfVxuIH07XG5cbi8qIEZvciBhbGwgdGhlIGZvbGxvd2luZyB0aW1lIG9wZXJhdG9ycywgdGhlaXIgZG9jdW1lbnRhdGlvbiBpcyBpbiovXG4vKiB0aGUgYFRpbWVNYXRoVHlwZWAsIHNpbmNlIHRoYXQgaXMgdGhlIGRvY3VtZW50YXRpb24gdGhhdCBzaG93cyB1cCovXG4vKiBpbiB0aGUgSURFLiBXZWxsLCBhdCBsZWFzdCB0aGUgdnNjb2RlIElERS4qL1xuXG5jb25zdCBhYnNWYWx1ZT0oYWJzKT0+e1xuaWYodHlwZW9mIGFicz09PSdiaWdpbnQnKXtcbnJldHVybiBOYXQoYWJzKTtcbiB9XG5tdXN0TWF0Y2goYWJzLFRpbWVzdGFtcFJlY29yZFNoYXBlLCd0aW1lc3RhbXAnKTtcbnJldHVybiBOYXQoYWJzLmFic1ZhbHVlKTtcbiB9O1xuXG5jb25zdCByZWxWYWx1ZT0ocmVsKT0+e1xuaWYodHlwZW9mIHJlbD09PSdiaWdpbnQnKXtcbnJldHVybiBOYXQocmVsKTtcbiB9XG5tdXN0TWF0Y2gocmVsLFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLCdyZWxhdGl2ZScpO1xucmV0dXJuIE5hdChyZWwucmVsVmFsdWUpO1xuIH07XG5cbmNvbnN0IG1ha2VUaW1lc3RhbXBSZWNvcmQ9KGFicyx0aW1lckJyYW5kKT0+XG5oYXJkZW4oe2Fic1ZhbHVlOmFicyx0aW1lckJyYW5kfSk7XG5jb25zdCBtYWtlUmVsYXRpdmVUaW1lUmVjb3JkPShyZWwsdGltZXJCcmFuZCk9PlxuaGFyZGVuKHtyZWxWYWx1ZTpyZWwsdGltZXJCcmFuZH0pO1xuXG5jb25zdCBjb2VyY2VUaW1lc3RhbXBSZWNvcmQ9KHRzLGJyYW5kKT0+e1xuYnJhbmR8fEZhaWwgYG11c3QgaGF2ZSBhIGJyYW5kYDtcbmlmKHR5cGVvZiB0cz09PSdudW1iZXInKXtcbnRzPU5hdCh0cyk7XG4gfVxuaWYodHlwZW9mIHRzPT09J2JpZ2ludCcpe1xucmV0dXJuIG1ha2VUaW1lc3RhbXBSZWNvcmQodHMsYnJhbmQpO1xuIH1lbHNle1xuY29uc3R7dGltZXJCcmFuZH09dHM7XG5tdXN0TWF0Y2godHMsVGltZXN0YW1wUmVjb3JkU2hhcGUsJ3RpbWVzdGFtcCcpO1xuYWdyZWVkVGltZXJCcmFuZCh0aW1lckJyYW5kLGJyYW5kKTtcbnJldHVybiB0cztcbiB9XG4gfTtcblxuY29uc3QgY29lcmNlUmVsYXRpdmVUaW1lUmVjb3JkPShydCxicmFuZCk9PntcbmJyYW5kfHxGYWlsIGBtdXN0IGhhdmUgYSBicmFuZGA7XG5pZih0eXBlb2YgcnQ9PT0nbnVtYmVyJyl7XG5ydD1OYXQocnQpO1xuIH1cbmlmKHR5cGVvZiBydD09PSdiaWdpbnQnKXtcbnJldHVybiBtYWtlUmVsYXRpdmVUaW1lUmVjb3JkKHJ0LGJyYW5kKTtcbiB9ZWxzZXtcbmNvbnN0e3RpbWVyQnJhbmR9PXJ0O1xubXVzdE1hdGNoKHJ0LFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLCdyZWxhdGl2ZVRpbWUnKTtcbmFncmVlZFRpbWVyQnJhbmQodGltZXJCcmFuZCxicmFuZCk7XG5yZXR1cm4gcnQ7XG4gfVxuIH07XG5cbmNvbnN0IGFkZEFic1JlbD0oYWJzLHJlbCk9PlxuYWJzTGlrZShhYnMscmVsLGFic1ZhbHVlKGFicykrcmVsVmFsdWUocmVsKSk7XG5cbmNvbnN0IGFkZFJlbFJlbD0ocmVsMSxyZWwyKT0+XG5yZWxMaWtlKHJlbDEscmVsMixyZWxWYWx1ZShyZWwxKStyZWxWYWx1ZShyZWwyKSk7XG5cbmNvbnN0IHN1YnRyYWN0QWJzQWJzPShhYnMxLGFiczIpPT5cbnJlbExpa2UoYWJzMSxhYnMyLGFic1ZhbHVlKGFiczEpLWFic1ZhbHVlKGFiczIpKTtcblxuY29uc3QgY2xhbXBlZFN1YnRyYWN0QWJzQWJzPShhYnMxLGFiczIpPT57XG5jb25zdCB2YWwxPWFic1ZhbHVlKGFiczEpO1xuY29uc3QgdmFsMj1hYnNWYWx1ZShhYnMyKTtcbnJldHVybiByZWxMaWtlKGFiczEsYWJzMix2YWwxPnZhbDI/dmFsMS12YWwyOjBuKTtcbiB9O1xuXG5jb25zdCBzdWJ0cmFjdEFic1JlbD0oYWJzLHJlbCk9PlxuYWJzTGlrZShhYnMscmVsLGFic1ZhbHVlKGFicyktcmVsVmFsdWUocmVsKSk7XG5cbmNvbnN0IHN1YnRyYWN0UmVsUmVsPShyZWwxLHJlbDIpPT5cbnJlbExpa2UocmVsMSxyZWwyLHJlbFZhbHVlKHJlbDEpLXJlbFZhbHVlKHJlbDIpKTtcblxuY29uc3QgaXNSZWxaZXJvPShyZWwpPT5yZWxWYWx1ZShyZWwpPT09MG47XG5cbmNvbnN0IG11bHRpcGx5UmVsTmF0PShyZWwsbmF0KT0+cmVsTGlrZShyZWwsbmF0LHJlbFZhbHVlKHJlbCkqbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsTmF0PShyZWwsbmF0KT0+cmVsTGlrZShyZWwsbmF0LHJlbFZhbHVlKHJlbCkvbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsUmVsPShyZWwxLHJlbDIpPT57XG5zaGFyZWRUaW1lckJyYW5kKHJlbDEscmVsMik7LyoganVzdCBlcnJvciBjaGVjayovXG5yZXR1cm4gcmVsVmFsdWUocmVsMSkvcmVsVmFsdWUocmVsMik7XG4gfTtcblxuY29uc3QgbW9kQWJzUmVsPShhYnMsc3RlcCk9PlxucmVsTGlrZShhYnMsc3RlcCxhYnNWYWx1ZShhYnMpJXJlbFZhbHVlKHN0ZXApKTtcblxuY29uc3QgbW9kUmVsUmVsPShyZWwsc3RlcCk9PlxucmVsTGlrZShyZWwsc3RlcCxyZWxWYWx1ZShyZWwpJXJlbFZhbHVlKHN0ZXApKTtcblxuLyoqXG4gKiBgY29tcGFyZVZhbHVlc2AgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudFxuICogdGhlIHRpbWUgY29tcGFyaXNvbiBvcGVyYXRvcnMuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtiaWdpbnR9IHYxXG4gKiBAcGFyYW0ge2JpZ2ludH0gdjJcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuY29uc3QgY29tcGFyZVZhbHVlcz0obGVmdCxyaWdodCx2MSx2Mik9PntcbnNoYXJlZFRpbWVyQnJhbmQobGVmdCxyaWdodCk7XG5pZih2MTx2Mil7XG5yZXR1cm4tMTtcbiB9ZWxzZSBpZih2MT09PXYyKXtcbnJldHVybiAwO1xuIH1lbHNle1xuYXNzZXJ0KHYxPnYyKTtcbnJldHVybiAxO1xuIH1cbiB9O1xuXG4vKipcbiAqIFRoZSBgVGltZU1hdGhgIG9iamVjdCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBkbyBhcml0aG1ldGljIG9uIGxhYmVsZWRcbiAqIHRpbWUgdmFsdWVzLCBtdWNoIGxpa2UgYEFtb3VudE1hdGhgIHByb3ZpZGVzIGhlbHBlciBtZXRob2RzIHRvIGRvIGFyaXRobWV0aWNcbiAqIG9uIGxhYmVsZWQgYXNzZXQvbW9uZXkgdmFsdWVzLiBCb3RoIGNoZWNrIGZvciBjb25zaXN0ZW5jeSBvZiBsYWJlbHM6IGFcbiAqIGJpbmFyeSBvcGVyYXRpb24gb24gdHdvIGxhYmVsZWQgb2JqZWN0cyBlbnN1cmVzIHRoYXQgdGhlIGJvdGggY2FycnlcbiAqIHRoZSBzYW1lIGxhYmVsLiBJZiB0aGV5IHByb2R1Y2UgYW5vdGhlciBvYmplY3QgZnJvbSB0aGUgc2FtZSBkb21haW4sIGl0XG4gKiB3aWxsIGNhcnJ5IHRoZSBzYW1lIGxhYmVsLiBJZiB0aGUgb3BlcmFuZHMgaGF2ZSBpbmNvbXBhdGlibGUgbGFiZWxzLFxuICogYW4gZXJyb3IgaXMgdGhyb3duLlxuICpcbiAqIFVubGlrZSBhbW91bnQgYXJpdGhtZXRpYywgdGltZSBhcml0aG1ldGljIGRlYWxzIGluIHR3byBraW5kcyBvZiB0aW1lIG9iamVjdHM6XG4gKiBUaW1lc3RhbXBzLCB3aGljaCByZXByZXNlbnQgYWJzb2x1dGUgdGltZSwgYW5kIFJlbGF0aXZlVGltZSwgd2hpY2ggcmVwcmVzZW50c1xuICogdGhlIGR1cmF0aW9uIGJldHdlZW4gdHdvIGFic29sdXRlIHRpbWVzLiBCb3RoIGtpbmRzIG9mIHRpbWUgb2JqZWN0XG4gKiBhcmUgbGFiZWxlZCBieSBhIGBUaW1lckJyYW5kYC4gRm9yIGEgVGltZXN0YW1wIG9iamVjdCwgdGhlIHZhbHVlIGlzXG4gKiBhIGJpZ2ludCBpbiBhbiBgYWJzVmFsdWVgIHByb3BlcnR5LiBGb3IgYSBSZWxhdGl2ZVRpbWUgb2JqZWN0LCB0aGUgdmFsdWVcbiAqIGlzIGEgYmlnaW50IGluIGEgYHJlbFZhbHVlYCBwcm9wZXJ0eS4gVGh1cyB3ZSBoYXZlIGEgcnVudGltZSBzYWZldHkgY2hlY2tcbiAqIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGNvbmZ1c2VkIHRoZSB0d28sIGV2ZW4gaWYgd2UgaGF2ZSBtYW5hZ2VkIHRvIGZvb2xcbiAqIHRoZSAodW5zb3VuZCkgc3RhdGljIHR5cGUgc3lzdGVtLlxuICpcbiAqIEFzIGEgdHJhbnNpdGlvbmFsIG1lYXN1cmUsIGN1cnJlbnRseSBtYW55IFRpbWVzdGFtcHMgYW5kIFJlbGF0aXZlVGltZXMgYXJlXG4gKiBzdGlsbCByZXByZXNlbnRlZCBieSB1bmxhYmVsZWQgYmlnaW50cy4gRHVyaW5nIHRoaXMgdHJhbnNpdGlvbmFsIHBlcmlvZCxcbiAqIHdlIGFsbG93IHRoaXMsIGJvdGggc3RhdGljYWxseSBhbmQgZHluYW1pY2FsbHkuIEZvciBhIG5vcm1hbCBiaW5hcnlcbiAqIG9wZXJhdGlvbiwgaWYgYm90aCBpbnB1dHMgYXJlIGxhYmVsZWQsIHRoZW4gd2UgZG8gdGhlIGZ1bGwgY2hlY2tpbmcgYXNcbiAqIGV4cGxhaW5lZCBhYm92ZSBhbmQgcmV0dXJuIGEgbGFiZWxlZCByZXN1bHQuIElmIGJvdGggaW5wdXRzIGFyZSB1bmxhYmVsZWRcbiAqIGJpZ2ludHMsIHdlICphc3N1bWUqIHRoYXQgdGhleSBpbmRpY2F0ZSBhIHRpbWUgb2YgdGhlIHJpZ2h0IGtpbmRcbiAqIChUaW1lc3RhbXAgdnMgUmVsYXRpdmVUaW1lKSBhbmQgdGltZXIgYnJhbmQuIFNpbmNlIHdlIGRvbid0IGtub3cgd2hhdFxuICogYnJhbmQgd2FzIGludGVuZGVkLCB3ZSBjYW4gb25seSByZXR1cm4geWV0IGFub3RoZXIgdW5sYWJlbGVkIGJpZ2ludC5cbiAqXG4gKiBJZiBvbmUgb3BlcmFuZCBpcyBsYWJlbGVkIGFuZCB0aGUgb3RoZXIgaXMgbm90LCB3ZSBjaGVjayB0aGUgbGFiZWxlZCBvcGVyYW5kLFxuICogKmFzc3VtZSogdGhlIHVubGFiZWxlZCBiaWdpbnQgcmVwcmVzZW50cyB0aGUgdmFsdWUgbmVlZGVkIGZvciB0aGUgb3RoZXJcbiAqIG9wZXJhbmQsIGFuZCByZXR1cm4gYSBsYWJlbGVkIHRpbWUgb2JqZWN0IHdpdGggdGhlIGJyYW5kIG9mIHRoZSBsYWJlbGVkXG4gKiBvcGVyYW5kLlxuICpcbiAqIEB0eXBlIHtUaW1lTWF0aFR5cGV9XG4gKi9cbmNvbnN0ICAgICAgICBUaW1lTWF0aD1oYXJkZW4oe1xuYWJzVmFsdWUsXG5yZWxWYWx1ZSxcbmNvZXJjZVRpbWVzdGFtcFJlY29yZCxcbmNvZXJjZVJlbGF0aXZlVGltZVJlY29yZCxcbmFkZEFic1JlbCxcbmFkZFJlbFJlbCxcbnN1YnRyYWN0QWJzQWJzLFxuY2xhbXBlZFN1YnRyYWN0QWJzQWJzLFxuc3VidHJhY3RBYnNSZWwsXG5zdWJ0cmFjdFJlbFJlbCxcbmlzUmVsWmVybyxcbm11bHRpcGx5UmVsTmF0LFxuZGl2aWRlUmVsTmF0LFxuZGl2aWRlUmVsUmVsLFxubW9kQWJzUmVsLFxubW9kUmVsUmVsLFxuY29tcGFyZUFiczooYWJzMSxhYnMyKT0+XG5jb21wYXJlVmFsdWVzKGFiczEsYWJzMixhYnNWYWx1ZShhYnMxKSxhYnNWYWx1ZShhYnMyKSksXG5jb21wYXJlUmVsOihyZWwxLHJlbDIpPT5cbmNvbXBhcmVWYWx1ZXMocmVsMSxyZWwyLHJlbFZhbHVlKHJlbDEpLHJlbFZhbHVlKHJlbDIpKX0pOyRo4oCNX29uY2UuVGltZU1hdGgoVGltZU1hdGgpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRpbWVNYXRoIjpbIlRpbWVNYXRoIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG6zHqqnBwAApwcAACUAAABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSIsIlJlbGF0aXZlVGltZVNoYXBlIiwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSIsIlRpbWVyQnJhbmRTaGFwZSIsIlRpbWVyU2VydmljZVNoYXBlIiwiVGltZXN0YW1wUmVjb3JkU2hhcGUiLCJUaW1lc3RhbXBTaGFwZSIsIlRpbWVzdGFtcFZhbHVlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbmNvbnN0ICAgICAgICBUaW1lckJyYW5kU2hhcGU9TS5yZW1vdGFibGUoJ1RpbWVyQnJhbmQnKTskaOKAjV9vbmNlLlRpbWVyQnJhbmRTaGFwZShUaW1lckJyYW5kU2hhcGUpO1xuY29uc3QgICAgICAgIFRpbWVzdGFtcFZhbHVlU2hhcGU9TS5uYXQoKTskaOKAjV9vbmNlLlRpbWVzdGFtcFZhbHVlU2hhcGUoVGltZXN0YW1wVmFsdWVTaGFwZSk7XG5jb25zdCAgICAgICAgUmVsYXRpdmVUaW1lVmFsdWVTaGFwZT1NLm5hdCgpOy8qIFNob3VsZCB3ZSBhbGxvdyBuZWdhdGl2ZXM/Ki8kaOKAjV9vbmNlLlJlbGF0aXZlVGltZVZhbHVlU2hhcGUoUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBUaW1lc3RhbXBSZWNvcmRTaGFwZT1oYXJkZW4oe1xudGltZXJCcmFuZDpUaW1lckJyYW5kU2hhcGUsXG5hYnNWYWx1ZTpUaW1lc3RhbXBWYWx1ZVNoYXBlfSk7JGjigI1fb25jZS5UaW1lc3RhbXBSZWNvcmRTaGFwZShUaW1lc3RhbXBSZWNvcmRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFJlbGF0aXZlVGltZVJlY29yZFNoYXBlPWhhcmRlbih7XG50aW1lckJyYW5kOlRpbWVyQnJhbmRTaGFwZSxcbnJlbFZhbHVlOlJlbGF0aXZlVGltZVZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLlJlbGF0aXZlVGltZVJlY29yZFNoYXBlKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVGltZXN0YW1wU2hhcGU9TS5vcihUaW1lc3RhbXBSZWNvcmRTaGFwZSxUaW1lc3RhbXBWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLlRpbWVzdGFtcFNoYXBlKFRpbWVzdGFtcFNoYXBlKTtcbmNvbnN0ICAgICAgICBSZWxhdGl2ZVRpbWVTaGFwZT1NLm9yKFxuUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsXG5SZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLlJlbGF0aXZlVGltZVNoYXBlKFJlbGF0aXZlVGltZVNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVGltZXJTZXJ2aWNlU2hhcGU9TS5yZW1vdGFibGUoJ1RpbWVyU2VydmljZScpOyRo4oCNX29uY2UuVGltZXJTZXJ2aWNlU2hhcGUoVGltZXJTZXJ2aWNlU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRpbWVyQnJhbmRTaGFwZSI6WyJUaW1lckJyYW5kU2hhcGUiXSwiVGltZXN0YW1wVmFsdWVTaGFwZSI6WyJUaW1lc3RhbXBWYWx1ZVNoYXBlIl0sIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiOlsiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSJdLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSI6WyJUaW1lc3RhbXBSZWNvcmRTaGFwZSJdLCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSI6WyJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSJdLCJUaW1lc3RhbXBTaGFwZSI6WyJUaW1lc3RhbXBTaGFwZSJdLCJSZWxhdGl2ZVRpbWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVTaGFwZSJdLCJUaW1lclNlcnZpY2VTaGFwZSI6WyJUaW1lclNlcnZpY2VTaGFwZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAyzLQSJSkAACUpAAAoAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2V4by11dGlscy5qc3siaW1wb3J0cyI6WyIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImlnbm9yZUNvbnRleHQiLCJtYWtlRXhvVXRpbHMiLCJwcmVwYXJlRXhvIiwicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUtpbmQiLCJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZVNpbmdsZXRvbiIsInByb3ZpZGVLaW5kSGFuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGluaXRFbXB0eSxwcm92aWRlLGdsb2JhbFZhdERhdGE7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wicHJvdmlkZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZSA9ICRo4oCNX2EpXV0sW1wiVmF0RGF0YVwiLCBbJGjigI1fYSA9PiAoZ2xvYmFsVmF0RGF0YSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKiBAdGVtcGxhdGUgTCxSIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8TCwgUj59IFJlbW90YWJsZUJyYW5kICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2ZhcicpLkVSZWY8VD59IEVSZWYgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkRlZmluZUtpbmRPcHRpb25zPFQ+fSBEZWZpbmVLaW5kT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuS2luZEZhY2V0PFQ+fSBLaW5kRmFjZXQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLktpbmRGYWNldHM8VD59IEtpbmRGYWNldHMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkR1cmFibGVLaW5kSGFuZGxlfSBEdXJhYmxlS2luZEhhbmRsZSAqL1xuXG4vKipcbiAqIE1ha2UgYSB2ZXJzaW9uIG9mIHRoZSBhcmd1bWVudCBmdW5jdGlvbiB0aGF0IHRha2VzIGEga2luZCBjb250ZXh0IGJ1dFxuICogaWdub3JlcyBpdC5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyBGdW5jdGlvbj4oZm46IFQpID0+IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5QbHVzQ29udGV4dDxuZXZlciwgVD59XG4gKi9cbmNvbnN0ICAgICAgICBpZ25vcmVDb250ZXh0PVxuKGZuKT0+XG4oX2NvbnRleHQsLi4uYXJncyk9PlxuZm4oLi4uYXJncyk7JGjigI1fb25jZS5pZ25vcmVDb250ZXh0KGlnbm9yZUNvbnRleHQpO1xuaGFyZGVuKGlnbm9yZUNvbnRleHQpO1xuXG4vKiBUT0RPOiBGaW5kIGEgZ29vZCBob21lIGZvciB0aGlzIGZ1bmN0aW9uIHVzZWQgYnkgQGFnb3JpYy92YXQtZGF0YSBhbmQgdGVzdGluZyBjb2RlKi9cbmNvbnN0ICAgICAgICBtYWtlRXhvVXRpbHM9KFZhdERhdGEpPT57XG5jb25zdHtcbmRlZmluZUtpbmQsXG5kZWZpbmVLaW5kTXVsdGksXG5kZWZpbmVEdXJhYmxlS2luZCxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGksXG5tYWtlS2luZEhhbmRsZX09XG5WYXREYXRhO1xuXG4vKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcmV0dXJucyB7RHVyYWJsZUtpbmRIYW5kbGV9XG4gKi9cbmNvbnN0IHByb3ZpZGVLaW5kSGFuZGxlPShiYWdnYWdlLGtpbmROYW1lKT0+XG5wcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwoKT0+bWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTtcbmhhcmRlbihwcm92aWRlS2luZEhhbmRsZSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG9DbGFzcyBpbnN0ZWFkXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByZXBhcmVLaW5kfVxuICovXG5jb25zdCBwcmVwYXJlS2luZD0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZChcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlS2luZCk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG9DbGFzc0tpdCBpbnN0ZWFkXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcy5qcycpLlByZXBhcmVLaW5kTXVsdGl9XG4gKi9cbmNvbnN0IHByZXBhcmVLaW5kTXVsdGk9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlS2luZE11bHRpKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSBUIGJlaGF2aW9yXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8e1xuICogICBzZWxmOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0IGRlZmluZVZpcnR1YWxFeG9DbGFzcz0odGFnLGludGVyZmFjZUd1YXJkLGluaXQsbWV0aG9kcyxvcHRpb25zKT0+XG5kZWZpbmVLaW5kKHRhZyxpbml0LG1ldGhvZHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZH0pO1xuXG5oYXJkZW4oZGVmaW5lVmlydHVhbEV4b0NsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHtcbiAqICAgZmFjZXRzOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0PShcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuZGVmaW5lS2luZE11bHRpKHRhZyxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkOmludGVyZmFjZUd1YXJkS2l0fSk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8e1xuICogICBzZWxmOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzcz0oXG5raW5kSGFuZGxlLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmQoa2luZEhhbmRsZSxpbml0LG1ldGhvZHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZH0pO1xuXG5oYXJkZW4oZGVmaW5lRHVyYWJsZUV4b0NsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtEdXJhYmxlS2luZEhhbmRsZX0ga2luZEhhbmRsZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkS2l0XG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHtcbiAqICAgZmFjZXRzOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT4gfSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQsXG4gKiAgIHN0YXRlOiBSZXR1cm5UeXBlPEk+XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0PShcbmtpbmRIYW5kbGUsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkOmludGVyZmFjZUd1YXJkS2l0fSk7XG5cbmhhcmRlbihkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHtcbiAqICAgc2VsZjogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgc2VsZjogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBwcmVwYXJlRXhvQ2xhc3M9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVFeG9DbGFzcyhcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5oYXJkZW4ocHJlcGFyZUV4b0NsYXNzKTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueSkgPT4gYW55fSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7XG4gKiAgIGZhY2V0czogVCxcbiAqICAgc3RhdGU6IFJldHVyblR5cGU8ST5cbiAqIH0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHtcbiAqICAgZmFjZXRzOiBULFxuICogICBzdGF0ZTogUmV0dXJuVHlwZTxJPlxuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoVCAmIFJlbW90YWJsZUJyYW5kPHt9LCBUPil9XG4gKi9cbmNvbnN0IHByZXBhcmVFeG9DbGFzc0tpdD0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpO1xuXG5oYXJkZW4ocHJlcGFyZUV4b0NsYXNzS2l0KTtcblxuLyogVE9ETyBpbnRlcmZhY2VHdWFyZCB0eXBlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjIwNiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IE0gbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtNfSBtZXRob2RzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgc2VsZjogTSB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7TSAmIFJlbW90YWJsZUJyYW5kPHt9LCBNPn1cbiAqL1xuY29uc3QgcHJlcGFyZUV4bz0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgbWFrZVNpbmdsZXRvbj1wcmVwYXJlRXhvQ2xhc3MoXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXRFbXB0eSxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxuXG5yZXR1cm4gcHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fc2luZ2xldG9uYCwoKT0+bWFrZVNpbmdsZXRvbigpKTtcbiB9O1xuaGFyZGVuKHByZXBhcmVFeG8pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IE0gbWV0aG9kc1xuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG8gaW5zdGVhZC5cbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge019IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNICYgUmVtb3RhYmxlQnJhbmQ8e30sIE0+fVxuICovXG5jb25zdCBwcmVwYXJlU2luZ2xldG9uPShiYWdnYWdlLGtpbmROYW1lLG1ldGhvZHMsb3B0aW9ucz11bmRlZmluZWQpPT5cbnByZXBhcmVFeG8oYmFnZ2FnZSxraW5kTmFtZSx1bmRlZmluZWQsbWV0aG9kcyxvcHRpb25zKTtcbmhhcmRlbihwcmVwYXJlU2luZ2xldG9uKTtcblxucmV0dXJuIGhhcmRlbih7XG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvQ2xhc3MsXG5wcmVwYXJlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvLFxucHJlcGFyZVNpbmdsZXRvbixcblxucHJvdmlkZUtpbmRIYW5kbGUsXG5wcmVwYXJlS2luZCxcbnByZXBhcmVLaW5kTXVsdGl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlRXhvVXRpbHMobWFrZUV4b1V0aWxzKTtcblxuY29uc3QgZ2xvYmFsRXhvVXRpbHM9bWFrZUV4b1V0aWxzKGdsb2JhbFZhdERhdGEpO1xuXG5jb25zdCAgICAgICB7XG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvQ2xhc3MsXG5wcmVwYXJlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvLFxucHJlcGFyZVNpbmdsZXRvbn09XG5nbG9iYWxFeG9VdGlscztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRXhvcy9FeG9DbGFzc2VzIGluc3RlYWQgb2YgS2luZHNcbiAqLyRo4oCNX29uY2UuZGVmaW5lVmlydHVhbEV4b0NsYXNzKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7JGjigI1fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQoZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzcyhkZWZpbmVEdXJhYmxlRXhvQ2xhc3MpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7JGjigI1fb25jZS5wcmVwYXJlRXhvQ2xhc3MocHJlcGFyZUV4b0NsYXNzKTskaOKAjV9vbmNlLnByZXBhcmVFeG9DbGFzc0tpdChwcmVwYXJlRXhvQ2xhc3NLaXQpOyRo4oCNX29uY2UucHJlcGFyZUV4byhwcmVwYXJlRXhvKTskaOKAjV9vbmNlLnByZXBhcmVTaW5nbGV0b24ocHJlcGFyZVNpbmdsZXRvbik7XG5jb25zdCAgICAgICB7cHJvdmlkZUtpbmRIYW5kbGUscHJlcGFyZUtpbmQscHJlcGFyZUtpbmRNdWx0aX09XG5nbG9iYWxFeG9VdGlsczskaOKAjV9vbmNlLnByb3ZpZGVLaW5kSGFuZGxlKHByb3ZpZGVLaW5kSGFuZGxlKTskaOKAjV9vbmNlLnByZXBhcmVLaW5kKHByZXBhcmVLaW5kKTskaOKAjV9vbmNlLnByZXBhcmVLaW5kTXVsdGkocHJlcGFyZUtpbmRNdWx0aSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaWdub3JlQ29udGV4dCI6WyJpZ25vcmVDb250ZXh0Il0sIm1ha2VFeG9VdGlscyI6WyJtYWtlRXhvVXRpbHMiXSwiZGVmaW5lVmlydHVhbEV4b0NsYXNzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sImRlZmluZUR1cmFibGVFeG9DbGFzcyI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IjpbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLCJwcmVwYXJlRXhvQ2xhc3MiOlsicHJlcGFyZUV4b0NsYXNzIl0sInByZXBhcmVFeG9DbGFzc0tpdCI6WyJwcmVwYXJlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4byI6WyJwcmVwYXJlRXhvIl0sInByZXBhcmVTaW5nbGV0b24iOlsicHJlcGFyZVNpbmdsZXRvbiJdLCJwcm92aWRlS2luZEhhbmRsZSI6WyJwcm92aWRlS2luZEhhbmRsZSJdLCJwcmVwYXJlS2luZCI6WyJwcmVwYXJlS2luZCJdLCJwcmVwYXJlS2luZE11bHRpIjpbInByZXBhcmVLaW5kTXVsdGkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAO+M9iJIIAACSCAAAJAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2V4by11dGlscy5qcyIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbXV0sW1wiLi9leG8tdXRpbHMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGFnb3JpYy9zdG9yZSI6W1siTSIsIk0iXSxbIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLFsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSJdLFsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXV0sIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiOltbIm1ha2VLaW5kSGFuZGxlIiwibWFrZUtpbmRIYW5kbGUiXSxbInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLFsid2F0Y2hQcm9taXNlIiwid2F0Y2hQcm9taXNlIl0sWyJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiXSxbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIl0sWyJjYW5CZUR1cmFibGUiLCJjYW5CZUR1cmFibGUiXSxbInBpY2tGYWNldCIsInBpY2tGYWNldCJdLFsicGFydGlhbEFzc2lnbiIsInBhcnRpYWxBc3NpZ24iXSxbInByb3ZpZGUiLCJwcm92aWRlIl0sWyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSJdLFsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSJdLFsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiXSxbImRlZmluZUtpbmQiLCJkZWZpbmVLaW5kIl0sWyJkZWZpbmVLaW5kTXVsdGkiLCJkZWZpbmVLaW5kTXVsdGkiXSxbImRlZmluZUR1cmFibGVLaW5kIiwiZGVmaW5lRHVyYWJsZUtpbmQiXSxbImRlZmluZUR1cmFibGVLaW5kTXVsdGkiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIl1dLCIuL2V4by11dGlscy5qcyI6W1siZGVmaW5lVmlydHVhbEV4b0NsYXNzIiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzIl0sWyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiXSxbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzcyJdLFsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0Il0sWyJwcmVwYXJlRXhvQ2xhc3MiLCJwcmVwYXJlRXhvQ2xhc3MiXSxbInByZXBhcmVFeG9DbGFzc0tpdCIsInByZXBhcmVFeG9DbGFzc0tpdCJdLFsicHJlcGFyZUV4byIsInByZXBhcmVFeG8iXSxbInByZXBhcmVTaW5nbGV0b24iLCJwcmVwYXJlU2luZ2xldG9uIl0sWyJpZ25vcmVDb250ZXh0IiwiaWdub3JlQ29udGV4dCJdLFsicHJvdmlkZUtpbmRIYW5kbGUiLCJwcm92aWRlS2luZEhhbmRsZSJdLFsicHJlcGFyZUtpbmQiLCJwcmVwYXJlS2luZCJdLFsicHJlcGFyZUtpbmRNdWx0aSIsInByZXBhcmVLaW5kTXVsdGkiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAN70jyBTKAAAUygAADAAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9hc3NlcnQiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiVmF0RGF0YSIsImNhbkJlRHVyYWJsZSIsImRlZmluZUR1cmFibGVLaW5kIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUtpbmQiLCJkZWZpbmVLaW5kTXVsdGkiLCJtYWtlS2luZEhhbmRsZSIsIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVN0b3JlVXRpbHMiLCJwYXJ0aWFsQXNzaWduIiwicGlja0ZhY2V0IiwicHJvdmlkZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYWlsLHByb3ZpZGVMYXp5OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcInByb3ZpZGVMYXp5XCIsIFskaOKAjV9hID0+IChwcm92aWRlTGF6eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMnKS5WYXREYXRhfSAqL1xubGV0IFZhdERhdGFHbG9iYWw7XG5pZignVmF0RGF0YSdpbiBnbG9iYWxUaGlzKXtcbmdsb2JhbFRoaXMuVmF0RGF0YXx8RmFpbCBgVmF0RGF0YSBkZWZpbmVkIGluIGdsb2JhbCBhcyBudWxsIG9yIHVuZGVmaW5lZGA7XG5WYXREYXRhR2xvYmFsPWdsb2JhbFRoaXMuVmF0RGF0YTtcbiB9ZWxzZXtcbi8qIFhYWCB0aGlzIG1vZHVsZSBoYXMgYmVlbiBrbm93biB0byBnZXQgaW1wb3J0ZWQgKHRyYW5zaXRpdmVseSkgaW4gY2FzZXMgdGhhdCovXG4vKiBuZXZlciB1c2UgaXQgc28gd2UgbWFrZSBhIHZlcnNpb24gdGhhdCB3aWxsIHNhdGlzZnkgbW9kdWxlIHJlc29sdXRpb24gYnV0Ki9cbi8qIGZhaWwgYXQgcnVudGltZS4qL1xuY29uc3QgdW52YWlsYWJsZT0oKT0+RmFpbCBgVmF0RGF0YSB1bmF2YWlsYWJsZWA7XG5WYXREYXRhR2xvYmFsPXtcbmRlZmluZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUtpbmRNdWx0aTp1bnZhaWxhYmxlLFxuZGVmaW5lRHVyYWJsZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbm1ha2VLaW5kSGFuZGxlOnVudmFpbGFibGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXI6dW52YWlsYWJsZSxcbndhdGNoUHJvbWlzZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6dW52YWlsYWJsZSxcbmNhbkJlRHVyYWJsZTp1bnZhaWxhYmxlfTtcblxuIH1cblxuY29uc3QgVmF0RGF0YUV4cG9ydD1WYXREYXRhR2xvYmFsOyRo4oCNX29uY2UuVmF0RGF0YUV4cG9ydChWYXREYXRhRXhwb3J0KTtcblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovXG5jb25zdCAgICAgICB7XG5kZWZpbmVLaW5kLFxuZGVmaW5lS2luZE11bHRpLFxuZGVmaW5lRHVyYWJsZUtpbmQsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpfT1cblZhdERhdGFHbG9iYWw7JGjigI1fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZChkZWZpbmVEdXJhYmxlS2luZCk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG5jb25zdCAgICAgICB7XG5tYWtlS2luZEhhbmRsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbndhdGNoUHJvbWlzZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuY2FuQmVEdXJhYmxlfT1cblZhdERhdGFHbG9iYWw7XG5cbi8qKlxuICogV2hlbiBtYWtpbmcgYSBtdWx0aS1mYWNldCBraW5kLCBpdCdzIGNvbW1vbiB0byBwaWNrIG9uZSBmYWNldCB0byBleHBvc2UuIEUuZy4sXG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSAoYSwgYiwgYywgZCkgPT4gbWFrZUZvb0Jhc2UoYSwgYiwgYywgZCkuc2VsZjtcbiAqXG4gKiBUaGlzIGhlbHBlciByZWR1Y2VzIHRoZSBkdXBsaWNhdGlvbjpcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IHBpY2tGYWNldChtYWtlRm9vQmFzZSwgJ3NlbGYnKTtcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcycpLlBpY2tGYWNldH1cbiAqLyRo4oCNX29uY2UubWFrZUtpbmRIYW5kbGUobWFrZUtpbmRIYW5kbGUpOyRo4oCNX29uY2UucHJvdmlkZVByb21pc2VXYXRjaGVyKHByb3ZpZGVQcm9taXNlV2F0Y2hlcik7JGjigI1fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdNYXBTdG9yZShtYWtlU2NhbGFyQmlnTWFwU3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKTskaOKAjV9vbmNlLmNhbkJlRHVyYWJsZShjYW5CZUR1cmFibGUpO1xuY29uc3QgICAgICAgIHBpY2tGYWNldD1cbihtYWtlcixmYWNldE5hbWUpPT5cbiguLi5hcmdzKT0+XG5tYWtlciguLi5hcmdzKVtmYWNldE5hbWVdOyRo4oCNX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLyoqXG4gKiBBc3NpZ24gdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlXG4gKiBvYmplY3QgdG8gdGhlaXIga2V5cyBpbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQYXJ0aWFsPFQ+fSBzb3VyY2VcbiAqL1xuY29uc3QgICAgICAgIHBhcnRpYWxBc3NpZ249KHRhcmdldCxzb3VyY2UpPT57XG5PYmplY3QuYXNzaWduKHRhcmdldCxzb3VyY2UpO1xuIH07JGjigI1fb25jZS5wYXJ0aWFsQXNzaWduKHBhcnRpYWxBc3NpZ24pO1xuaGFyZGVuKHBhcnRpYWxBc3NpZ24pO1xuXG4vKiBYWFggY29waWVkIGZyb20gQGFnb3JpYy9zdG9yZSB0eXBlcyovXG4vKiBVTlRJTCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ1NjAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZU9wdGlvbnNcbiAqIE9mIHRoZSBkaW1lbnNpb25zIG9uIHdoaWNoIEtleWVkU3RvcmVzIGNhbiBkaWZmZXIsIHdlIG9ubHkgcmVwcmVzZW50IGEgZmV3XG4gKiBvZiB0aGVtIGFzIHN0YW5kYXJkIG9wdGlvbnMuIEEgZ2l2ZW4gc3RvcmUgbWFrZXIgc2hvdWxkIGRvY3VtZW50IHdoaWNoXG4gKiBvcHRpb25zIGl0IHN1cHBvcnRzLCBhcyB3ZWxsIGFzIGl0cyBwb3NpdGlvbnMgb24gZGltZW5zaW9ucyBmb3Igd2hpY2ggaXRcbiAqIGRvZXMgbm90IHN1cHBvcnQgb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvbmdMaXZlZD10cnVlXSBXaGljaCB3YXkgdG8gb3B0aW1pemUgYSB3ZWFrIHN0b3JlLiBUcnVlIG1lYW5zXG4gKiB0aGF0IHdlIGV4cGVjdCB0aGlzIHdlYWsgc3RvcmUgdG8gb3V0bGl2ZSBtb3N0IG9mIGl0cyBrZXlzLCBpbiB3aGljaFxuICogY2FzZSB3ZSBpbnRlcm5hbGx5IG1heSB1c2UgYSBKYXZhU2NyaXB0IGBXZWFrTWFwYC4gT3RoZXJ3aXNlIHdlIGludGVybmFsbHlcbiAqIG1heSB1c2UgYSBKYXZhU2NyaXB0IGBNYXBgLlxuICogRGVmYXVsdHMgdG8gdHJ1ZSwgc28gcGxlYXNlIG1hcmsgc2hvcnQgbGl2ZWQgc3RvcmVzIGV4cGxpY2l0bHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkdXJhYmxlPWZhbHNlXSAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RvcmUgc3Vydml2ZSB0ZXJtaW5hdGlvblxuICogICBvZiBpdHMgY29udGFpbmluZyBwcm9jZXNzLCBhbGxvd2luZyBmb3IgcmVzdGFydCBvciB1cGdyYWRlIGJ1dCBhdCB0aGUgY29zdFxuICogICBvZiBmb3JiaWRkaW5nIHN0b3JhZ2Ugb2YgcmVmZXJlbmNlcyB0byBlcGhlbWVyYWwgZGF0YS4gIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFrZUR1cmFibGU9ZmFsc2VdICBUaGlzIHN0b3JlIHByZXRlbmRzIHRvIGJlIGEgZHVyYWJsZSBzdG9yZVxuICogICBidXQgZG9lcyBub3QgZW5mb3JjZSB0aGF0IHRoZSB0aGluZ3Mgc3RvcmVkIGluIGl0IGFjdHVhbGx5IGJlIHRoZW1zZWx2ZXNcbiAqICAgZHVyYWJsZSAod2hlcmVhcyBhbiBhY3R1YWwgZHVyYWJsZSBzdG9yZSB3b3VsZCBmb3JiaWQgc3RvcmFnZSBvZiBzdWNoXG4gKiAgIGl0ZW1zKS4gIFRoaXMgaXMgaW4gc2VydmljZSBvZiBhbGxvd2luZyBpbmNyZW1lbnRhbCB0cmFuc2l0aW9uIHRvIHVzZSBvZlxuICogICBkdXJhYmxlIHN0b3JlcywgdG8gZW5hYmxlIG5vcm1hbCBvcGVyYXRpb24gYW5kIHRlc3Rpbmcgd2hlbiBzb21lIHN0dWZmXG4gKiAgIGludGVuZGVkIHRvIGV2ZW50dWFsbHkgYmUgZHVyYWJsZSBoYXMgbm90IHlldCBiZWVuIG1hZGUgZHVyYWJsZS4gIEEgc3RvcmVcbiAqICAgbWFya2VkIGFzIGZha2VEdXJhYmxlIHdpbGwgYXBwZWFyIHRvIG9wZXJhdGUgbm9ybWFsbHkgYnV0IGFueSBhdHRlbXB0IHRvXG4gKiAgIHVwZ3JhZGUgaXRzIGNvbnRhaW5pbmcgdmF0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yLlxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3R5cGVzJykuUGF0dGVybn0gW2tleVNoYXBlXVxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3R5cGVzJykuUGF0dGVybn0gW3ZhbHVlU2hhcGVdXG4gKi9cbi8qKlxuICogVW5saWtlIGBwcm92aWRlTGF6eWAsIGBwcm92aWRlYCBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZVxuICogd2l0aGluIGFueSB2YXQgaW5jYXJuYXRpb24gd2l0aCBhIGdpdmVuIGBiYWdnYWdlYCxga2V5YCBwYWlyLlxuICpcbiAqIGBwcm92aWRlYCBzaG91bGQgb25seSB0byBiZSB1c2VkIHRvIHBvcHVsYXRlIGJhZ2dhZ2UsXG4gKiB3aGVyZSB0aGUgdG90YWwgbnVtYmVyIG9mIGNhbGxzIHRvIGBwcm92aWRlYCBtdXN0IGJlXG4gKiBsb3cgY2FyZGluYWxpdHksIHNpbmNlIHdlIGtlZXAgdGhlIGJvb2trZWVwaW5nIHRvIGRldGVjdCBjb2xsaXNpb25zXG4gKiBpbiBub3JtYWwgbGFuZ3VhZ2UtaGVhcCBtZW1vcnkuIEFsbCB0aGUgb3RoZXIgYmFnZ2FnZS1vcmllbnRlZFxuICogYHByb3ZpZGUqYCBhbmQgYHByZXBhcmUqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsXG4gKiBhbmQgc28gaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aFxuICogb3VyIGV4cGVjdGVkIGR1cmFiaWxpdHkgcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqICAgICoga2luZEhhbmRsZXMsIHdoaWNoIGFyZSBwZXIga2luZCwgd2hpY2ggbXVzdCBiZSBsb3cgY2FyZGluYWxpdHlcbiAqICAgICogZGF0YSBcInZhcmlhYmxlc1wiIGZvciByZWVzdGFibGlzaGluZyB0aGUgbGV4aWNhbCBzY29wZSwgZXNwZWNpYWxseVxuICogICAgICBvZiBzaW5nbGV0b25zXG4gKiAgICAqIG5hbWVkIG5vbi1iYWdnYWdlIGNvbGxlY3Rpb25zIGF0IHRoZSBsZWF2ZXMgb2YgdGhlIGJhZ2dhZ2UgdHJlZS5cbiAqXG4gKiBXaGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhpZ2ggY2FyZGluYWxpdHkgYXJlIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGtpbmRzLFxuICogYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBub24tYmFnZ2dhZ2UgY29sbGVjdGlvbnMuXG4gKlxuICogVE9ETyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81ODc1IDpcbiAqIEltcGxlbWVudCBkZXZlbG9wbWVudC10aW1lIGluc3RydW1lbnRhdGlvbiB0byBkZXRlY3Qgd2hlblxuICogYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZSBwcmVzY3JpcHRpb24sIGFuZCBpcyBjYWxsZWQgbW9yZVxuICogdGhhbiBvbmNlIGluIHRoZSBzYW1lIHZhdCBpbmNhcm5hdGlvbiB3aXRoIHRoZSBzYW1lXG4gKiBiYWdnYWdlLGtleSBwYWlyLlxuICovXG5cbmNvbnN0ICAgICAgICBwcm92aWRlPVxuLyogWFhYIGNhc3QgYmVjYXVzZSBwcm92aWRlTGF6eSBpcyBgYW55YCBkdWUgdG8gYnJva2VuIHR5cGUgaW1wb3J0Ki9cbi8qKiBAdHlwZSB7PEssIFY+KGJhZ2dhZ2U6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5CYWdnYWdlLCBrZXk6IEssIG1ha2VWYWx1ZTogKGtleTogSykgPT4gVikgPT4gVn0gKi9cbnByb3ZpZGVMYXp5O1xuXG5cbi8qIFRPRE86IEZpbmQgYSBnb29kIGhvbWUgZm9yIHRoaXMgZnVuY3Rpb24gdXNlZCBieSBAYWdvcmljL3ZhdC1kYXRhIGFuZCB0ZXN0aW5nIGNvZGUqL1xuLyoqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YS9zcmMvdHlwZXMnKS5WYXREYXRhfSBWYXREYXRhICovJGjigI1fb25jZS5wcm92aWRlKHByb3ZpZGUpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZVV0aWxzPShWYXREYXRhKT0+e1xuY29uc3R7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xubWFrZVNjYWxhckJpZ01hcFN0b3JlLFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xubWFrZVNjYWxhckJpZ1NldFN0b3JlLFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmV9PVxuVmF0RGF0YTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPbWl0PFN0b3JlT3B0aW9ucywgJ2R1cmFibGUnPn0gb3B0aW9uc1xuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZU1hcFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpO1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlU2V0U3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZVNldFN0b3JlKTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPbWl0PFN0b3JlT3B0aW9ucywgJ2R1cmFibGUnPn0gb3B0aW9uc1xuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZT0oYmFnZ2FnZSxuYW1lLG9wdGlvbnM9e30pPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5cbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSk7XG5cbnJldHVybiBoYXJkZW4oe1xucHJvdmlkZUR1cmFibGVNYXBTdG9yZSxcbnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVTZXRTdG9yZSxcbnByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVN0b3JlVXRpbHMobWFrZVN0b3JlVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxTdG9yZVV0aWxzPW1ha2VTdG9yZVV0aWxzKFZhdERhdGFHbG9iYWwpO1xuY29uc3QgICAgICAge1xucHJvdmlkZUR1cmFibGVNYXBTdG9yZSxcbnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVTZXRTdG9yZSxcbnByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlfT1cbmdsb2JhbFN0b3JlVXRpbHM7JGjigI1fb25jZS5wcm92aWRlRHVyYWJsZU1hcFN0b3JlKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUpOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVTZXRTdG9yZShwcm92aWRlRHVyYWJsZVNldFN0b3JlKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJWYXREYXRhIjpbIlZhdERhdGFFeHBvcnQiXSwiZGVmaW5lS2luZCI6WyJkZWZpbmVLaW5kIl0sImRlZmluZUtpbmRNdWx0aSI6WyJkZWZpbmVLaW5kTXVsdGkiXSwiZGVmaW5lRHVyYWJsZUtpbmQiOlsiZGVmaW5lRHVyYWJsZUtpbmQiXSwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSI6WyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIl0sIm1ha2VLaW5kSGFuZGxlIjpbIm1ha2VLaW5kSGFuZGxlIl0sInByb3ZpZGVQcm9taXNlV2F0Y2hlciI6WyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLCJjYW5CZUR1cmFibGUiOlsiY2FuQmVEdXJhYmxlIl0sInBpY2tGYWNldCI6WyJwaWNrRmFjZXQiXSwicGFydGlhbEFzc2lnbiI6WyJwYXJ0aWFsQXNzaWduIl0sInByb3ZpZGUiOlsicHJvdmlkZSJdLCJtYWtlU3RvcmVVdGlscyI6WyJtYWtlU3RvcmVVdGlscyJdLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANYSZyhWEQAAVhEAADQAAABAYWdvcmljL3ZhdHMtdjAuMTUuMS90ZXN0L2Jvb3RzdHJhcFRlc3RzL3pjZlByb2JlLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbInByZXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVRyYWNlcixFLGF0b21pY1JlYXJyYW5nZSxwcm92aWRlQWxsLE0scHJlcGFyZUV4b0NsYXNzLHByb3ZpZGUsQW1vdW50TWF0aDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJtYWtlVHJhY2VyXCIsIFskaOKAjV9hID0+IChtYWtlVHJhY2VyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzXCIsIFtbXCJhdG9taWNSZWFycmFuZ2VcIiwgWyRo4oCNX2EgPT4gKGF0b21pY1JlYXJyYW5nZSA9ICRo4oCNX2EpXV0sW1wicHJvdmlkZUFsbFwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUFsbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRo4oCNX2EpXV0sW1wicHJvdmlkZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdCB0cmFjZT1tYWtlVHJhY2VyKCdaQ0YgUHJvYmUnKTtcblxuY29uc3QgWmNmUHJvYmVJPU0uaW50ZXJmYWNlKCdaQ0YgUHJvYmUnLHtcbm1ha2VQcm9iZUhlbHBlckludml0YXRpb246TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5tYWtlUHJvYmVJbnRlcm5hbEludml0YXRpb246TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5tYWtlUHJvYmVTdGFnaW5nSW52aXRhdGlvbjpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEFsbG9jYXRpb246TS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbm1ha2VGYXVjZXRJbnZpdGF0aW9uOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge3tzdG9yYWdlTm9kZTogU3RvcmFnZU5vZGV9fSBwcml2YXRlQXJnc1xuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZT1hc3luYyh6Y2YscHJpdmF0ZUFyZ3MsYmFnZ2FnZSk9PntcbmNvbnN0e3Byb2JlTWludH09YXdhaXQgcHJvdmlkZUFsbChiYWdnYWdlLHtcbnByb2JlTWludDooKT0+emNmLm1ha2VaQ0ZNaW50KCdEdWNhdHMnKX0pO1xuXG5cbmNvbnN0e3N0b3JhZ2VOb2RlfT1wcml2YXRlQXJncztcbmNvbnN0IG1ha2VaY2ZQcm9iZT1hd2FpdCBwcmVwYXJlRXhvQ2xhc3MoXG5iYWdnYWdlLFxuJ3pjZlByb2JlJyxcblpjZlByb2JlSSxcbigpPT4oe1xuc3Rhc2hTZWF0OnpjZi5tYWtlRW1wdHlTZWF0S2l0KCkuemNmU2VhdCxcbnByb2JlTWludDpudWxsfSksXG5cbntcbm1ha2VQcm9iZUhlbHBlckludml0YXRpb24oKXtcbmNvbnN0e3N0YXNoU2VhdH09dGhpcy5zdGF0ZTtcblxuY29uc3QgcHJvYmVIZWxwZXI9KHNlYXQpPT57XG50cmFjZSgnUHJvYmVIZWxwZXInKTtcbmNvbnN0IG9yaWdpbmFsQWxsb2M9c2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpLkR1Y2F0cztcbmNvbnN0IG9uZT1BbW91bnRNYXRoLm1ha2Uob3JpZ2luYWxBbGxvYy5icmFuZCwxbik7XG5sZXQgcmVzdWx0O1xudHJ5e1xuYXRvbWljUmVhcnJhbmdlKHpjZixoYXJkZW4oW1tzZWF0LHN0YXNoU2VhdCx7RHVjYXRzOm9uZX1dXSkpO1xuXG4vKiB0aGUgaGVscGVyIGNhbiBmYWlsIHNpbGVudGx5IGlmIHRoZSBtb3N0IHJlY2VudCB2ZXJzaW9uIG9mIHRoZSovXG4vKiBsaWJyYXJ5IGNhbGxzIHpjZi5hdG9taWNSZWFycmFuZ2UoKSBkaXJlY3RseSB3aGlsZSBydW5uaW5nIHdpdGggYSovXG4vKiB6Y2YgdGhhdCBkb2Vzbid0IHlldCBoYXZlIGF0b21pY1JlYXJyYW5nZS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4qL1xuLyogdGhlIHByb2JlciBidW5kbGUgaXMgYnVpbHQgaW4gYSBsYXRlciB2ZXJzaW9uIGFuZCBydW4gdW5kZXIqL1xuLyogZG9ja2VyIGluIGFuIGVhcmxpZXIgdmVyc2lvbi4qL1xucmVzdWx0PSFBbW91bnRNYXRoLmlzRXF1YWwoXG5vcmlnaW5hbEFsbG9jLFxuc3Rhc2hTZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCkuRHVjYXRzKTtcblxuIH1jYXRjaChlKXtcbnJlc3VsdD1mYWxzZTtcbiB9XG5cbnNlYXQuZXhpdCgpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5yZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKHByb2JlSGVscGVyLCdwcm9iZSBoZWxwZXInKTtcbiB9LFxubWFrZVByb2JlSW50ZXJuYWxJbnZpdGF0aW9uKCl7XG5jb25zdHtzdGFzaFNlYXR9PXRoaXMuc3RhdGU7XG5jb25zdCBwcm9iZUludGVybmFsPShzZWF0KT0+e1xudHJhY2UoJ1Byb2JlSW50cmluc2ljcycpO1xuY29uc3Qgb3JpZ2luYWxBbGxvYz1zZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCkuRHVjYXRzO1xuY29uc3Qgb25lPUFtb3VudE1hdGgubWFrZShvcmlnaW5hbEFsbG9jLmJyYW5kLDFuKTtcbmxldCByZXN1bHQ7XG50cnl7XG56Y2YuYXRvbWljUmVhcnJhbmdlKGhhcmRlbihbW3NlYXQsc3Rhc2hTZWF0LHtEdWNhdHM6b25lfV1dKSk7XG5yZXN1bHQ9dHJ1ZTtcbiB9Y2F0Y2goZSl7XG5yZXN1bHQ9ZmFsc2U7XG4gfVxuXG5zZWF0LmNsZWFyKCk7XG5zZWF0LmV4aXQoKTtcblxudHJhY2UoJ0ludHJpbnNpY3MnLHJlc3VsdCk7XG4vKiB3cml0ZSB0byB2c3RvcmFnZSBzbyBhIHRlc3QgY2FuIGRldGVjdCBpdC4qL1xudm9pZCBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZSggYCR7cmVzdWx0fWApO1xuXG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbnJldHVybiB6Y2YubWFrZUludml0YXRpb24ocHJvYmVJbnRlcm5hbCwncHJvYmUgaW50cmluc2ljJyk7XG4gfSxcbm1ha2VQcm9iZVN0YWdpbmdJbnZpdGF0aW9uKCl7XG5jb25zdHtzdGFzaFNlYXR9PXRoaXMuc3RhdGU7XG5cbmNvbnN0IHByb2JlU3RhZ2luZz0oc2VhdCk9PntcbnRyYWNlKCdQcm9iZVN0YWdpbmcnKTtcblxuY29uc3Qgb3JpZ2luYWxBbGxvYz1zZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCkuRHVjYXRzO1xuY29uc3Qgb25lPUFtb3VudE1hdGgubWFrZShvcmlnaW5hbEFsbG9jLmJyYW5kLDFuKTtcbmxldCByZXN1bHQ7XG50cnl7XG5zdGFzaFNlYXQuaW5jcmVtZW50Qnkoc2VhdC5kZWNyZW1lbnRCeSh7RHVjYXRzOm9uZX0pKTtcbnpjZi5yZWFsbG9jYXRlKHNlYXQsc3Rhc2hTZWF0KTtcbnJlc3VsdD10cnVlO1xuIH1jYXRjaChlKXtcbnNlYXQuY2xlYXIoKTtcbnN0YXNoU2VhdC5jbGVhcigpO1xucmVzdWx0PWZhbHNlO1xuIH1cblxuc2VhdC5leGl0KCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbnJldHVybiB6Y2YubWFrZUludml0YXRpb24ocHJvYmVTdGFnaW5nLCdwcm9iZSBzdGFnaW5nJyk7XG4gfSxcbmdldEFsbG9jYXRpb24oKXtcbmNvbnN0e3N0YXNoU2VhdH09dGhpcy5zdGF0ZTtcbnRyYWNlKCdnZXRBbGxvY2F0aW9uJyk7XG5cbnJldHVybiBzdGFzaFNlYXQuZ2V0Q3VycmVudEFsbG9jYXRpb24oKTtcbiB9LFxubWFrZUZhdWNldEludml0YXRpb24oKXtcbnJldHVybiB6Y2YubWFrZUludml0YXRpb24oYXN5bmMoc2VhdCk9PntcbnRyYWNlKCdmYXVjZXQnKTtcbmNvbnN0e2JyYW5kfT1hd2FpdCBwcm9iZU1pbnQuZ2V0SXNzdWVyUmVjb3JkKCk7XG5cbmF3YWl0IHByb2JlTWludC5taW50R2FpbnMoXG57RHVjYXRzOkFtb3VudE1hdGgubWFrZShicmFuZCwxNm4pfSxcbnNlYXQpO1xuXG5zZWF0LmV4aXQoKTtcbnJldHVybidtaW50ZWQgMTZuIER1Y2F0cyc7XG4gfSwnZmF1Y2V0Jyk7XG4gfX0pO1xuXG5cblxuY29uc3QgcHJvYmU9YXdhaXQgcHJvdmlkZShiYWdnYWdlLCdwcm9iZScsKCk9Pm1ha2VaY2ZQcm9iZSgpKTtcbnJldHVybiBoYXJkZW4oe1xuY3JlYXRvckZhY2V0OnByb2JlfSk7XG5cbiB9OyRo4oCNX29uY2UucHJlcGFyZShwcmVwYXJlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlIjpbInByZXBhcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmqg5QrwQAAC8EAAANAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIl0sImV4cG9ydHMiOlsiaXNPZmZlclNhZmUiLCJzYXRpc2ZpZXNXYW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEFtb3VudE1hdGg7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzT2ZmZXJTYWZlLCAnbmFtZScsIHt2YWx1ZTogXCJpc09mZmVyU2FmZVwifSk7JGjigI1fb25jZS5pc09mZmVyU2FmZShpc09mZmVyU2FmZSk7ICAgXG5cbi8qKlxuICogSGVscGVyIHRvIHBlcmZvcm0gc2F0aXNmaWVzV2FudCBhbmQgc2F0aXNmaWVzR2l2ZS4gSXNcbiAqIGFsbG9jYXRpb25BbW91bnQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHJlcXVpcmVkQW1vdW50IGZvciBldmVyeVxuICoga2V5d29yZCBvZiBnaXZlT3JXYW50P1xuICpcbiAqIFRvIHByZXBhcmUgZm9yIG11bHRpcGxlcywgc2F0aXNmaWVzV2FudCBhbmQgc2F0aXNmaWVzR2l2ZSByZXR1cm4gMCBvciAxLlxuICogaXNPZmZlclNhZmUgd2lsbCBzdGlsbCBiZSBib29sZWFuLiBXaGVuIHdlIGhhdmUgTXVsdGlwbGVzLCBzYXRpc2ZpZXNXYW50IGFuZFxuICogc2F0aXNmaWVzR2l2ZSB3aWxsIHRlbGwgaG93IG1hbnkgdGltZXMgdGhlIG9mZmVyIHdhcyBtYXRjaGVkLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gZ2l2ZU9yV2FudFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uXG4gKiBAcmV0dXJucyB7MHwxfVxuICovXG5jb25zdCBzYXRpc2ZpZXNJbnRlcm5hbD0oZ2l2ZU9yV2FudD17fSxhbGxvY2F0aW9uKT0+e1xuY29uc3QgaXNHVEVCeUtleXdvcmQ9KFtrZXl3b3JkLHJlcXVpcmVkQW1vdW50XSk9Pntcbi8qIElmIHRoZXJlIGlzIG5vIGFsbG9jYXRpb24gZm9yIGEga2V5d29yZCwgd2Uga25vdyB0aGUgZ2l2ZU9yV2FudCovXG4vKiBpcyBub3Qgc2F0aXNmaWVkIHdpdGhvdXQgY2hlY2tpbmcgZnVydGhlci4qL1xuaWYoYWxsb2NhdGlvbltrZXl3b3JkXT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gMDtcbiB9XG5jb25zdCBhbGxvY2F0aW9uQW1vdW50PWFsbG9jYXRpb25ba2V5d29yZF07XG5yZXR1cm4gQW1vdW50TWF0aC5pc0dURShhbGxvY2F0aW9uQW1vdW50LHJlcXVpcmVkQW1vdW50KT8xOjA7XG4gfTtcbnJldHVybiBPYmplY3QuZW50cmllcyhnaXZlT3JXYW50KS5ldmVyeShpc0dURUJ5S2V5d29yZCk/MTowO1xuIH07XG5cbi8qKlxuICogRm9yIHRoaXMgYWxsb2NhdGlvbiB0byBzYXRpc2Z5IHdoYXQgdGhlIHVzZXIgd2FudGVkLCB0aGVpclxuICogYWxsb2NhdGVkIGFtb3VudHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gcHJvcG9zYWwud2FudC5cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbCAtIHRoZSBydWxlcyB0aGF0IGFjY29tcGFuaWVkIHRoZVxuICogZXNjcm93IG9mIHBheW1lbnRzIHRoYXQgZGljdGF0ZSB3aGF0IHRoZSB1c2VyIGV4cGVjdGVkIHRvIGdldCBiYWNrXG4gKiBmcm9tIFpvZS4gQSBwcm9wb3NhbCBpcyBhIHJlY29yZCB3aXRoIGtleXMgYGdpdmVgLCBgd2FudGAsIGFuZFxuICogYGV4aXRgLiBgZ2l2ZWAgYW5kIGB3YW50YCBhcmUgcmVjb3JkcyB3aXRoIGtleXdvcmRzIGFzIGtleXMgYW5kXG4gKiBhbW91bnRzIGFzIHZhbHVlcy4gVGhlIHByb3Bvc2FsIGlzIGEgdXNlcidzIHVuZGVyc3RhbmRpbmcgb2YgdGhlXG4gKiBjb250cmFjdCB0aGF0IHRoZXkgYXJlIGVudGVyaW5nIHdoZW4gdGhleSBtYWtlIGFuIG9mZmVyLlxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqL1xuY29uc3Qgc2F0aXNmaWVzV2FudD0ocHJvcG9zYWwsYWxsb2NhdGlvbik9Plxuc2F0aXNmaWVzSW50ZXJuYWwocHJvcG9zYWwud2FudCxhbGxvY2F0aW9uKTtcblxuLyoqXG4gKiBGb3IgdGhpcyBhbGxvY2F0aW9uIHRvIGNvdW50IGFzIGEgZnVsbCByZWZ1bmQsIHRoZSBhbGxvY2F0ZWRcbiAqIGFtb3VudHMgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gd2hhdCB3YXMgb3JpZ2luYWxseVxuICogb2ZmZXJlZCAocHJvcG9zYWwuZ2l2ZSkuXG4gKlxuICogQHBhcmFtICB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0gIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqLyRo4oCNX29uY2Uuc2F0aXNmaWVzV2FudChzYXRpc2ZpZXNXYW50KTtcbmNvbnN0IHNhdGlzZmllc0dpdmU9KHByb3Bvc2FsLGFsbG9jYXRpb24pPT5cbnNhdGlzZmllc0ludGVybmFsKHByb3Bvc2FsLmdpdmUsYWxsb2NhdGlvbik7XG5cbi8qKlxuICogYGlzT2ZmZXJTYWZlYCBjaGVja3Mgb2ZmZXIgc2FmZXR5IGZvciBhIHNpbmdsZSBvZmZlci5cbiAqXG4gKiBOb3RlOiBUaGlzIGltcGxlbWVudGF0aW9uIGNoZWNrcyB3aGV0aGVyIHdlIGZ1bGx5IHNhdGlzZnlcbiAqIGBwcm9wb3NhbC5naXZlYCAoZ2l2aW5nIGEgcmVmdW5kKSBvciB3aGV0aGVyIHdlIGZ1bGx5IHNhdGlzZnlcbiAqIGBwcm9wb3NhbC53YW50YC4gQm90aCBjYW4gYmUgZnVsbHkgc2F0aXNmaWVkLlxuICpcbiAqIEBwYXJhbSAge1Byb3Bvc2FsUmVjb3JkfSBwcm9wb3NhbCAtIHRoZSBydWxlcyB0aGF0IGFjY29tcGFuaWVkIHRoZVxuICogZXNjcm93IG9mIHBheW1lbnRzIHRoYXQgZGljdGF0ZSB3aGF0IHRoZSB1c2VyIGV4cGVjdGVkIHRvIGdldCBiYWNrXG4gKiBmcm9tIFpvZS4gQSBwcm9wb3NhbCBpcyBhIHJlY29yZCB3aXRoIGtleXMgYGdpdmVgLCBgd2FudGAsIGFuZFxuICogYGV4aXRgLiBgZ2l2ZWAgYW5kIGB3YW50YCBhcmUgcmVjb3JkcyB3aXRoIGtleXdvcmRzIGFzIGtleXMgYW5kXG4gKiBhbW91bnRzIGFzIHZhbHVlcy4gVGhlIHByb3Bvc2FsIGlzIGEgdXNlcidzIHVuZGVyc3RhbmRpbmcgb2YgdGhlXG4gKiBjb250cmFjdCB0aGF0IHRoZXkgYXJlIGVudGVyaW5nIHdoZW4gdGhleSBtYWtlIGFuIG9mZmVyLlxuICogQHBhcmFtICB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvbiAtIGEgcmVjb3JkIHdpdGgga2V5d29yZHNcbiAqIGFzIGtleXMgYW5kIGFtb3VudHMgYXMgdmFsdWVzLiBUaGVzZSBhbW91bnRzIGFyZSB0aGUgcmVhbGxvY2F0aW9uXG4gKiB0byBiZSBnaXZlbiB0byBhIHVzZXIuXG4gKi9cbmZ1bmN0aW9uIGlzT2ZmZXJTYWZlKHByb3Bvc2FsLGFsbG9jYXRpb24pe1xucmV0dXJuKFxuc2F0aXNmaWVzR2l2ZShwcm9wb3NhbCxhbGxvY2F0aW9uKT4wfHxcbnNhdGlzZmllc1dhbnQocHJvcG9zYWwsYWxsb2NhdGlvbik+MCk7XG5cbiB9XG5cbmhhcmRlbihpc09mZmVyU2FmZSk7XG5oYXJkZW4oc2F0aXNmaWVzV2FudCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2F0aXNmaWVzV2FudCI6WyJzYXRpc2ZpZXNXYW50Il0sImlzT2ZmZXJTYWZlIjpbImlzT2ZmZXJTYWZlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABoo2EK5EgAAuRIAADkAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanN7ImltcG9ydHMiOlsiLi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJUcmFuc2ZlclBhcnRTaGFwZSIsImF0b21pY1JlYXJyYW5nZSIsImF0b21pY1RyYW5zZmVyIiwiZnJvbU9ubHkiLCJ0b09ubHkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTSxBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsU2VhdFNoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlXCIsIFskaOKAjV9hID0+IChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUgPSAkaOKAjV9hKV1dLFtcIlNlYXRTaGFwZVwiLCBbJGjigI1fYSA9PiAoU2VhdFNoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuY29uc3QgICAgICAgIFRyYW5zZmVyUGFydFNoYXBlPU0uc3BsaXRBcnJheShcbmhhcmRlbihbTS5vcHQoU2VhdFNoYXBlKSxNLm9wdChTZWF0U2hhcGUpLE0ub3B0KEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSldKSxcbmhhcmRlbihbTS5vcHQoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKV0pKTtcblxuXG4vKipcbiAqIEFza3MgWm9lICh2aWEgemNmKSB0byByZWFycmFuZ2UgdGhlIGFsbG9jYXRpb25zIGFtb25nIHRoZSBzZWF0c1xuICogbWVudGlvbmVkLiBUaGlzIGlzIGEgc2V0IG9mIGNoYW5nZXMgdG8gYWxsb2NhdGlvbnMgdGhhdCBtdXN0IHNhdGlzZnlcbiAqIHNldmVyYWwgY29uc3RyYWludHMuIElmIHRoZXNlIGNvbnN0cmFpbnRzIGFyZSBhbGwgbWV0LCB0aGVuIHRoZVxuICogcmVhbGxvY2F0aW9uIGhhcHBlbnMgYXRvbWljYWxseS4gT3RoZXJ3aXNlIGl0IGRvZXMgbm90IGhhcHBlblxuICogYXQgYWxsLlxuICpcbiAqIFRoZSBjb25kaXRpb25zXG4gKiAgICAqIEFsbCB0aGUgbWVudGlvbmVkIHNlYXRzIGFyZSBzdGlsbCBsaXZlIC0tIGVuZm9yY2VkIGJ5IFpDRi5cbiAqICAgICogTm8gb3V0c3RhbmRpbmcgc3RhZ2luZ3MgZm9yIGFueSBvZiB0aGUgbWVudGlvbmVkIHNlYXRzLlxuICogICAgICBTdGFnaW5ncyBub3cgZGVwcmVjYXRlZCBpbiBmYXZvciBvciBhdG9taWNSZWFycmFuZ2UuIFRvXG4gKiAgICAgIHByZXZlbnQgY29uZnVzaW9uLCBmb3IgZWFjaCByZWFsbG9jYXRpb24sIGl0IGNhbiBvbmx5IGJlXG4gKiAgICAgIGV4cHJlc3NlZCBpbiB0aGUgb2xkIHdheSBvciB0aGUgbmV3IHdheSwgYnV0IG5vdCBhIG1peHR1cmUuXG4gKiAgICAqIE9mZmVyIHNhZmV0eSAtLSBlbmZvcmNlZCBieSBaQ0YuXG4gKiAgICAqIE92ZXJhbGwgY29uc2VydmF0aW9uIC0tIGVuZm9yY2VkIGJ5IFpDRi5cbiAqICAgICogVGhlIG92ZXJhbGwgdHJhbnNmZXIgaXMgZXhwcmVzc2VkIGFzIGFuIGFycmF5IG9mIGBUcmFuc2ZlclBhcnRgLlxuICogICAgICBFYWNoIGluZGl2aWR1YWwgYFRyYW5zZmVyUGFydGAgaXMgb25lIG9mXG4gKiAgICAgICAtIEEgdHJhbnNmZXIgZnJvbSBhIGBmcm9tU2VhdGAgdG8gYSBgdG9TZWF0YC5cbiAqICAgICAgICAgVGhpcyBpcyBub3QgbmVlZGVkIGZvciBab2UncyBzYWZldHksIGFzIFpvZSBkb2VzXG4gaXRzIG93biBvdmVyYWxsIGNvbnNlcnZhdGlvbiBjaGVjay4gUmF0aGVyLCBpdCBoZWxwcyBjYXRjaFxuIGFuZCBkaWFnbm9zZSBjb250cmFjdCBidWdzIGVhcmxpZXIuXG4gKiAgICAgICAtIEEgdGFraW5nIGZyb20gYSBgZnJvbVNlYXRgJ3MgYWxsb2NhdGlvbi4gU2VlIHRoZSBgZnJvbU9ubHlgXG4gaGVscGVyLlxuIC0gQSBnaXZpbmcgaW50byBhIGB0b1NlYXRgJ3MgYWxsb2NhdGlvbi4gU2VlIHRoZSBgdG9Pbmx5YFxuIGhlbHBlci5cbiAqXG4gKiBUT0RPKDY2NzkpIFJlZmFjdG9yIGBhdG9taWNSZWFycmFuZ2VgZnJvbSBiZWluZyBhIGhlbHBlciBpbnRvIGJlaW5nXG4gKiB6Y2YncyByZXBsYWNlbWVudCBmb3IgcmVhbGxvY2F0ZS4gSXQgd2FzIG1hZGUgYSBoZWxwZXIgZHVyaW5nXG4gKiB0aGUgdHJhbnNpdGlvbiwgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIHdpdGggcHJvZ3Jlc3Mgb24gWm9lIGR1cmFiaWxpdHkuXG4gKlxuICogU2VlIHRoZSBoZWxwZXJzIGJlbG93LCBgZnJvbU9ubHlgLCBgdG9Pbmx5YCwgYW5kIGBhdG9taWNUcmFuc2ZlcmAsXG4gKiB3aGljaCB3aWxsIHJlbWFpbiBoZWxwZXJzLiBUaGVzZSBoZWxwZXIgYXJlIGZvciBjb252ZW5pZW5jZVxuICogaW4gZXhwcmVzc2luZyBhdG9taWMgcmVhcnJhbmdlbWVudHMgY2xlYXJseS5cbiAqXG4gKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHpjZiBidWlsdGluIGluc3RlYWRcbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1RyYW5zZmVyUGFydFtdfSB0cmFuc2ZlcnNcbiAqLyRo4oCNX29uY2UuVHJhbnNmZXJQYXJ0U2hhcGUoVHJhbnNmZXJQYXJ0U2hhcGUpO1xuY29uc3QgICAgICAgIGF0b21pY1JlYXJyYW5nZT0oemNmLHRyYW5zZmVycyk9PntcbnpjZi5hdG9taWNSZWFycmFuZ2UodHJhbnNmZXJzKTtcbiB9O1xuXG4vKipcbiAqIFNvbWV0aW1lcyBhIFRyYW5zZmVyUGFydCBpbiBhbiBhdG9taWNSZWFycmFuZ2Ugb25seSBleHByZXNzZXMgd2hhdCBhbW91bnRzXG4gKiBzaG91bGQgYmUgdGFrZW4gZnJvbSBhIHNlYXQsIGxlYXZpbmcgaXQgdG8gb3RoZXIgVHJhbnNmZXJQYXJ0IG9mIHRoZVxuICogc2FtZSBhdG9taWNSZWFycmFuZ2UgdG8gYmFsYW5jZSBpdCBvdXQuIEZvciB0aGlzIGNhc2UsIHRoZVxuICogYFtmcm9tU2VhdCwgdW5kZWZpbmVkLCBmcm9tQW1vdW50c11gIGZvcm0gaXMgbW9yZSBjbGVhcmx5IGV4cHJlc3NlZCBhc1xuICogYGZyb21Pbmx5KGZyb21TZWF0LCBmcm9tQW1vdW50cylgLiBVbmxpa2UgVHJhbnNmZXJQYXJ0LCBib3RoIGFyZ3VtZW50cyB0b1xuICogYGZyb21Pbmx5YCBhcmUgbm9uLW9wdGlvbmFsLCBhcyBvdGhlcndpc2UgaXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UuXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBmcm9tU2VhdFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBmcm9tQW1vdW50c1xuICogQHJldHVybnMge1RyYW5zZmVyUGFydH1cbiAqLyRo4oCNX29uY2UuYXRvbWljUmVhcnJhbmdlKGF0b21pY1JlYXJyYW5nZSk7XG5jb25zdCAgICAgICAgZnJvbU9ubHk9KGZyb21TZWF0LGZyb21BbW91bnRzKT0+XG5oYXJkZW4oW2Zyb21TZWF0LHVuZGVmaW5lZCxmcm9tQW1vdW50c10pO1xuXG4vKipcbiAqIFNvbWV0aW1lcyBhIFRyYW5zZmVyUGFydCBpbiBhbiBhdG9taWNSZWFycmFuZ2Ugb25seSBleHByZXNzZXMgd2hhdCBhbW91bnRzXG4gKiBzaG91bGQgYmUgZ2l2ZW4gdG8gYSBzZWF0LCBsZWF2aW5nIGl0IHRvIG90aGVyIFRyYW5zZmVyUGFydCBvZiB0aGVcbiAqIHNhbWUgYXRvbWljUmVhcnJhbmdlIHRvIGJhbGFuY2UgaXQgb3V0LiBGb3IgdGhpcyBjYXNlLCB0aGVcbiAqIGBbdW5kZWZpbmVkLCB0b1NlYXQsIHVuZGVmaW5lZCwgdG9BbW91bnRzXWAgZm9ybSBpcyBtb3JlIGNsZWFybHkgZXhwcmVzc2VkIGFzXG4gKiBgdG9Pbmx5KHRvU2VhdCwgdG9BbW91bnRzKWAuIFVubGlrZSBUcmFuc2ZlclBhcnQsIGJvdGggYXJndW1lbnRzIHRvXG4gKiBgdG9Pbmx5YCBhcmUgbm9uLW9wdGlvbmFsLCBhcyBvdGhlcndpc2UgaXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UuXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSB0b1NlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gdG9BbW91bnRzXG4gKiBAcmV0dXJucyB7VHJhbnNmZXJQYXJ0fVxuICovJGjigI1fb25jZS5mcm9tT25seShmcm9tT25seSk7XG5jb25zdCAgICAgICAgdG9Pbmx5PSh0b1NlYXQsdG9BbW91bnRzKT0+XG5oYXJkZW4oW3VuZGVmaW5lZCx0b1NlYXQsdW5kZWZpbmVkLHRvQW1vdW50c10pO1xuXG4vKipcbiAqIFNwZWNpYWwgY2FzZSBvZiBhdG9taWNSZWFycmFuZ2UgZm9yIGEgc2luZ2xlIG9uZS13YXkgdHJhbnNmZXJcbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IFtmcm9tU2VhdF1cbiAqIEBwYXJhbSB7WkNGU2VhdH0gW3RvU2VhdF1cbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gW2Zyb21BbW91bnRzXVxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBbdG9BbW91bnRzXVxuICovJGjigI1fb25jZS50b09ubHkodG9Pbmx5KTtcbmNvbnN0ICAgICAgICBhdG9taWNUcmFuc2Zlcj0oXG56Y2YsXG5mcm9tU2VhdD11bmRlZmluZWQsXG50b1NlYXQ9dW5kZWZpbmVkLFxuZnJvbUFtb3VudHM9dW5kZWZpbmVkLFxudG9BbW91bnRzPXVuZGVmaW5lZCk9PlxuemNmLmF0b21pY1JlYXJyYW5nZShoYXJkZW4oW1tmcm9tU2VhdCx0b1NlYXQsZnJvbUFtb3VudHMsdG9BbW91bnRzXV0pKTskaOKAjV9vbmNlLmF0b21pY1RyYW5zZmVyKGF0b21pY1RyYW5zZmVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUcmFuc2ZlclBhcnRTaGFwZSI6WyJUcmFuc2ZlclBhcnRTaGFwZSJdLCJhdG9taWNSZWFycmFuZ2UiOlsiYXRvbWljUmVhcnJhbmdlIl0sImZyb21Pbmx5IjpbImZyb21Pbmx5Il0sInRvT25seSI6WyJ0b09ubHkiXSwiYXRvbWljVHJhbnNmZXIiOlsiYXRvbWljVHJhbnNmZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdVQIBb4bAAC+GwAAOAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9ib25kaW5nQ3VydmVzLmpzeyJpbXBvcnRzIjpbIi4vc2FmZU1hdGguanMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJjYWxjTGlxVmFsdWVUb01pbnQiLCJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiLCJjYWxjVmFsdWVUb1JlbW92ZSIsImdldElucHV0UHJpY2UiLCJnZXRPdXRwdXRQcmljZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsbmF0U2FmZU1hdGg7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NhZmVNYXRoLmpzXCIsIFtbXCJuYXRTYWZlTWF0aFwiLCBbJGjigI1fYSA9PiAobmF0U2FmZU1hdGggPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7c3VidHJhY3QsYWRkLG11bHRpcGx5LGZsb29yRGl2aWRlfT1uYXRTYWZlTWF0aDtcbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuY29uc3QgQkFTSVNfUE9JTlRTPTEwMDAwbjsvKiBUT0RPIGNoYW5nZSB0byAxMF8wMDBuIG9uY2UgdG9vbGluZyBjb3Blcy4qL1xuXG4vKipcbiAqIENhbGN1bGF0aW9ucyBmb3IgY29uc3RhbnQgcHJvZHVjdCBtYXJrZXRzIGxpa2UgVW5pc3dhcC5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ydW50aW1ldmVyaWZpY2F0aW9uL3ZlcmlmaWVkLXNtYXJ0LWNvbnRyYWN0cy9ibG9iL3VuaXN3YXAvdW5pc3dhcC94LXktay5wZGZcbiAqL1xuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgY2FsY3VsYXRpbmcgaG93IG11Y2ggc2hvdWxkIGJlIGdpdmVuXG4gKiBiYWNrIHRvIHRoZSB1c2VyIGluIGV4Y2hhbmdlIGZvciB3aGF0IHRoZXkgc2VudCBpbi4gUmV1c2VkIGluXG4gKiBzZXZlcmFsIGRpZmZlcmVudCBwbGFjZXMsIGluY2x1ZGluZyB0byBjaGVjayB3aGV0aGVyIGFuIG9mZmVyXG4gKiBpcyB2YWxpZCwgZ2V0dGluZyB0aGUgY3VycmVudCBwcmljZSBmb3IgYW4gYXNzZXQgb24gdXNlclxuICogcmVxdWVzdCwgYW5kIHRvIGRvIHRoZSBhY3R1YWwgcmVhbGxvY2F0aW9uIGFmdGVyIGFuIG9mZmVyIGhhc1xuICogYmVlbiBtYWRlLlxuICpcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFZhbHVlIC0gdGhlIHZhbHVlIG9mIHRoZSBhc3NldCBzZW50XG4gKiBpbiB0byBiZSBzd2FwcGVkXG4gKiBAcGFyYW0ge2FueX0gaW5wdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGtpbmQgb2YgYXNzZXQgc2VudCBpblxuICogQHBhcmFtIHthbnl9IG91dHB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUga2luZCBvZiBhc3NldCB0byBiZSBzZW50IG91dFxuICogQHBhcmFtIHtiaWdpbnR9IFtmZWVCYXNpc1BvaW50cz0zMG5dIC0gdGhlIGZlZSB0YWtlbiBpblxuICogYmFzaXMgcG9pbnRzLiBUaGUgZGVmYXVsdCBpcyAwLjMlIG9yIDMwIGJhc2lzIHBvaW50cy4gVGhlIGZlZVxuICogaXMgdGFrZW4gZnJvbSBpbnB1dFZhbHVlXG4gKiBAcmV0dXJucyB7TmF0VmFsdWV9IG91dHB1dFZhbHVlIC0gdGhlIGN1cnJlbnQgcHJpY2UsIGluIHZhbHVlIGZvcm1cbiAqL1xuY29uc3QgICAgICAgIGdldElucHV0UHJpY2U9KFxuaW5wdXRWYWx1ZSxcbmlucHV0UmVzZXJ2ZSxcbm91dHB1dFJlc2VydmUsXG5mZWVCYXNpc1BvaW50cz0zMG4pPT5cbntcbmlucHV0VmFsdWU9TmF0KGlucHV0VmFsdWUpO1xuaW5wdXRSZXNlcnZlPU5hdChpbnB1dFJlc2VydmUpO1xub3V0cHV0UmVzZXJ2ZT1OYXQob3V0cHV0UmVzZXJ2ZSk7XG5pbnB1dFZhbHVlPjBufHxGYWlsIGBpbnB1dFZhbHVlICR7aW5wdXRWYWx1ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG5pbnB1dFJlc2VydmU+MG58fEZhaWwgYGlucHV0UmVzZXJ2ZSAke2lucHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG5vdXRwdXRSZXNlcnZlPjBufHxGYWlsIGBvdXRwdXRSZXNlcnZlICR7b3V0cHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG5cbmNvbnN0IG9uZU1pbnVzRmVlU2NhbGVkPXN1YnRyYWN0KEJBU0lTX1BPSU5UUyxmZWVCYXNpc1BvaW50cyk7XG5jb25zdCBpbnB1dFdpdGhGZWU9bXVsdGlwbHkoaW5wdXRWYWx1ZSxvbmVNaW51c0ZlZVNjYWxlZCk7XG5jb25zdCBudW1lcmF0b3I9bXVsdGlwbHkoaW5wdXRXaXRoRmVlLG91dHB1dFJlc2VydmUpO1xuY29uc3QgZGVub21pbmF0b3I9YWRkKG11bHRpcGx5KGlucHV0UmVzZXJ2ZSxCQVNJU19QT0lOVFMpLGlucHV0V2l0aEZlZSk7XG5yZXR1cm4gZmxvb3JEaXZpZGUobnVtZXJhdG9yLGRlbm9taW5hdG9yKTtcbiB9O1xuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgY2FsY3VsYXRpbmcgaG93IG11Y2ggc2hvdWxkIGJlIHRha2VuXG4gKiBmcm9tIHRoZSB1c2VyIGluIGV4Y2hhbmdlIGZvciB3aGF0IHRoZXkgd2FudCB0byBvYnRhaW4uIFJldXNlZCBpblxuICogc2V2ZXJhbCBkaWZmZXJlbnQgcGxhY2VzLCBpbmNsdWRpbmcgdG8gY2hlY2sgd2hldGhlciBhbiBvZmZlclxuICogaXMgdmFsaWQsIGdldHRpbmcgdGhlIGN1cnJlbnQgcHJpY2UgZm9yIGFuIGFzc2V0IG9uIHVzZXJcbiAqIHJlcXVlc3QsIGFuZCB0byBkbyB0aGUgYWN0dWFsIHJlYWxsb2NhdGlvbiBhZnRlciBhbiBvZmZlciBoYXNcbiAqIGJlZW4gbWFkZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gb3V0cHV0VmFsdWUgLSB0aGUgdmFsdWUgb2YgdGhlIGFzc2V0IHRoZSB1c2VyIHdhbnRzXG4gKiB0byBnZXRcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUgYXNzZXQgYmVpbmcgc3BlbnRcbiAqIEBwYXJhbSB7YW55fSBvdXRwdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGtpbmQgb2YgYXNzZXQgdG8gYmUgc2VudCBvdXRcbiAqIEBwYXJhbSB7YmlnaW50fSBbZmVlQmFzaXNQb2ludHM9MzBuXSAtIHRoZSBmZWUgdGFrZW4gaW5cbiAqIGJhc2lzIHBvaW50cy4gVGhlIGRlZmF1bHQgaXMgMC4zJSBvciAzMCBiYXNpcyBwb2ludHMuIFRoZSBmZWUgaXMgdGFrZW4gZnJvbVxuICogb3V0cHV0VmFsdWVcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX0gaW5wdXRWYWx1ZSAtIHRoZSB2YWx1ZSBvZiBpbnB1dCByZXF1aXJlZCB0byBwdXJjaGFzZSBvdXRwdXRcbiAqLyRo4oCNX29uY2UuZ2V0SW5wdXRQcmljZShnZXRJbnB1dFByaWNlKTtcbmNvbnN0ICAgICAgICBnZXRPdXRwdXRQcmljZT0oXG5vdXRwdXRWYWx1ZSxcbmlucHV0UmVzZXJ2ZSxcbm91dHB1dFJlc2VydmUsXG5mZWVCYXNpc1BvaW50cz0zMG4pPT5cbntcbm91dHB1dFZhbHVlPU5hdChvdXRwdXRWYWx1ZSk7XG5pbnB1dFJlc2VydmU9TmF0KGlucHV0UmVzZXJ2ZSk7XG5vdXRwdXRSZXNlcnZlPU5hdChvdXRwdXRSZXNlcnZlKTtcblxuaW5wdXRSZXNlcnZlPjBufHxGYWlsIGBpbnB1dFJlc2VydmUgJHtpbnB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgO1xub3V0cHV0UmVzZXJ2ZT4wbnx8RmFpbCBgb3V0cHV0UmVzZXJ2ZSAke291dHB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgO1xub3V0cHV0UmVzZXJ2ZT5vdXRwdXRWYWx1ZXx8XG5GYWlsIGBvdXRwdXRSZXNlcnZlICR7b3V0cHV0UmVzZXJ2ZX0gbXVzdCBiZSBncmVhdGVyIHRoYW4gb3V0cHV0VmFsdWUgJHtvdXRwdXRWYWx1ZX1gO1xuXG5jb25zdCBvbmVNaW51c0ZlZVNjYWxlZD1zdWJ0cmFjdChCQVNJU19QT0lOVFMsZmVlQmFzaXNQb2ludHMpO1xuY29uc3QgbnVtZXJhdG9yPW11bHRpcGx5KG11bHRpcGx5KG91dHB1dFZhbHVlLGlucHV0UmVzZXJ2ZSksQkFTSVNfUE9JTlRTKTtcbmNvbnN0IGRlbm9taW5hdG9yPW11bHRpcGx5KFxuc3VidHJhY3Qob3V0cHV0UmVzZXJ2ZSxvdXRwdXRWYWx1ZSksXG5vbmVNaW51c0ZlZVNjYWxlZCk7XG5cbnJldHVybiBhZGQoZmxvb3JEaXZpZGUobnVtZXJhdG9yLGRlbm9taW5hdG9yKSwxbik7XG4gfTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgaG93IG1hbnkgbGlxdWlkaXR5IHRva2VucyB3ZSBzaG91bGQgYmUgbWludGluZyB0byBzZW5kIGJhY2sgdG8gdGhlXG4gKiB1c2VyIHdoZW4gYWRkaW5nIGxpcXVpZGl0eS4gV2UgcHJvdmlkZSBuZXcgbGlxdWlkaXR5IGVxdWFsIHRvIHRoZSBleGlzdGluZ1xuICogbGlxdWlkaXR5IG11bHRpcGxpZWQgYnkgdGhlIHJhdGlvIG9mIG5ldyBjZW50cmFsIHRva2VucyB0byBjZW50cmFsIHRva2Vuc1xuICogYWxyZWFkeSBoZWxkLiBJZiB0aGUgY3VycmVudCBzdXBwbHkgaXMgemVybywgcmV0dXJuIHRoZSBpbnB1dFZhbHVlIGFzIHRoZVxuICogaW5pdGlhbCBsaXF1aWRpdHkgdG8gbWludCBpcyBhcmJpdHJhcnkuXG4gKlxuICogQHBhcmFtIHtiaWdpbnR9IGxpcVRva2VuU3VwcGx5XG4gKiBAcGFyYW0ge2JpZ2ludH0gaW5wdXRWYWx1ZVxuICogQHBhcmFtIHtiaWdpbnR9IGlucHV0UmVzZXJ2ZVxuICogQHJldHVybnMge05hdFZhbHVlfVxuICovJGjigI1fb25jZS5nZXRPdXRwdXRQcmljZShnZXRPdXRwdXRQcmljZSk7XG5jb25zdCAgICAgICAgY2FsY0xpcVZhbHVlVG9NaW50PShcbmxpcVRva2VuU3VwcGx5LFxuaW5wdXRWYWx1ZSxcbmlucHV0UmVzZXJ2ZSk9Plxue1xubGlxVG9rZW5TdXBwbHk9TmF0KGxpcVRva2VuU3VwcGx5KTtcbmlucHV0VmFsdWU9TmF0KGlucHV0VmFsdWUpO1xuaW5wdXRSZXNlcnZlPU5hdChpbnB1dFJlc2VydmUpO1xuXG5pZihsaXFUb2tlblN1cHBseT09PTBuKXtcbnJldHVybiBpbnB1dFZhbHVlO1xuIH1cbnJldHVybiBmbG9vckRpdmlkZShtdWx0aXBseShpbnB1dFZhbHVlLGxpcVRva2VuU3VwcGx5KSxpbnB1dFJlc2VydmUpO1xuIH07XG5cbi8qKlxuICogQ2FsY3VsYXRlIGhvdyBtdWNoIG9mIHRoZSBzZWNvbmRhcnkgdG9rZW4gaXMgcmVxdWlyZWQgZnJvbSB0aGUgdXNlciB3aGVuXG4gKiBhZGRpbmcgbGlxdWlkaXR5LiBXZSByZXF1aXJlIHRoYXQgdGhlIGRlcG9zaXRlZCByYXRpbyBvZiBjZW50cmFsIHRvIHNlY29uZGFyeVxuICogbWF0Y2ggdGhlIGN1cnJlbnQgcmF0aW8gb2YgaG9sZGluZ3MgaW4gdGhlIHBvb2wuXG4gKlxuICogQHBhcmFtIHthbnl9IGNlbnRyYWxJbiAtIFRoZSB2YWx1ZSBvZiBjZW50cmFsIGFzc2V0cyBiZWluZyBkZXBvc2l0ZWRcbiAqIEBwYXJhbSB7YW55fSBjZW50cmFsUG9vbCAtIFRoZSB2YWx1ZSBvZiBjZW50cmFsIGFzc2V0cyBpbiB0aGUgcG9vbFxuICogQHBhcmFtIHthbnl9IHNlY29uZGFyeVBvb2wgLSBUaGUgdmFsdWUgb2Ygc2Vjb25kYXJ5IGFzc2V0cyBpbiB0aGUgcG9vbFxuICogQHBhcmFtIHthbnl9IHNlY29uZGFyeUluIC0gVGhlIHZhbHVlIG9mIHNlY29uZGFyeSBhc3NldHMgcHJvdmlkZWQuIElmXG4gKiB0aGUgcG9vbCBpcyBlbXB0eSwgdGhlIGVudGlyZSBhbW91bnQgd2lsbCBiZSBhY2NlcHRlZFxuICogQHJldHVybnMge05hdFZhbHVlfSAtIHRoZSBhbW91bnQgb2Ygc2Vjb25kYXJ5IHJlcXVpcmVkXG4gKi8kaOKAjV9vbmNlLmNhbGNMaXFWYWx1ZVRvTWludChjYWxjTGlxVmFsdWVUb01pbnQpO1xuY29uc3QgICAgICAgIGNhbGNTZWNvbmRhcnlSZXF1aXJlZD0oXG5jZW50cmFsSW4sXG5jZW50cmFsUG9vbCxcbnNlY29uZGFyeVBvb2wsXG5zZWNvbmRhcnlJbik9Plxue1xuY2VudHJhbEluPU5hdChjZW50cmFsSW4pO1xuY2VudHJhbFBvb2w9TmF0KGNlbnRyYWxQb29sKTtcbnNlY29uZGFyeVBvb2w9TmF0KHNlY29uZGFyeVBvb2wpO1xuc2Vjb25kYXJ5SW49TmF0KHNlY29uZGFyeUluKTtcblxuaWYoY2VudHJhbFBvb2w9PT0wbnx8c2Vjb25kYXJ5UG9vbD09PTBuKXtcbnJldHVybiBzZWNvbmRhcnlJbjtcbiB9XG5cbmNvbnN0IHNjYWxlZFNlY29uZGFyeT1mbG9vckRpdmlkZShcbm11bHRpcGx5KGNlbnRyYWxJbixzZWNvbmRhcnlQb29sKSxcbmNlbnRyYWxQb29sKTtcblxuY29uc3QgZXhhY3Q9XG5tdWx0aXBseShjZW50cmFsSW4sc2Vjb25kYXJ5UG9vbCk9PT1cbm11bHRpcGx5KHNjYWxlZFNlY29uZGFyeSxjZW50cmFsUG9vbCk7XG5cbi8qIGRvZXNuJ3QgbWF0Y2ggdGhlIHgteS1rLnBkZiBwYXBlciwgYnV0IG1vcmUgY29ycmVjdC4gV2hlbiB0aGUgcmF0aW9zIGFyZSovXG4vKiBleGFjdGx5IGVxdWFsLCBsUHJpbWUgaXMgZXhhY3RseSBsICogKDEgKyBhbHBoYSkgYW5kIGFkZGluZyBvbmUgaXMgd3JvbmcqL1xucmV0dXJuIGV4YWN0P3NjYWxlZFNlY29uZGFyeToxbitzY2FsZWRTZWNvbmRhcnk7XG4gfTtcblxuLyogQ2FsY3VsYXRlIGhvdyBtYW55IHVuZGVybHlpbmcgdG9rZW5zIChpbiB0aGUgZm9ybSBvZiBhIHZhbHVlKSBzaG91bGQgYmUqL1xuLyogcmV0dXJuZWQgd2hlbiByZW1vdmluZyBsaXF1aWRpdHkuKi8kaOKAjV9vbmNlLmNhbGNTZWNvbmRhcnlSZXF1aXJlZChjYWxjU2Vjb25kYXJ5UmVxdWlyZWQpO1xuY29uc3QgICAgICAgIGNhbGNWYWx1ZVRvUmVtb3ZlPShcbmxpcVRva2VuU3VwcGx5LFxucG9vbFZhbHVlLFxubGlxdWlkaXR5VmFsdWVJbik9Plxue1xubGlxVG9rZW5TdXBwbHk9TmF0KGxpcVRva2VuU3VwcGx5KTtcbmxpcXVpZGl0eVZhbHVlSW49TmF0KGxpcXVpZGl0eVZhbHVlSW4pO1xucG9vbFZhbHVlPU5hdChwb29sVmFsdWUpO1xuXG5yZXR1cm4gZmxvb3JEaXZpZGUobXVsdGlwbHkobGlxdWlkaXR5VmFsdWVJbixwb29sVmFsdWUpLGxpcVRva2VuU3VwcGx5KTtcbiB9OyRo4oCNX29uY2UuY2FsY1ZhbHVlVG9SZW1vdmUoY2FsY1ZhbHVlVG9SZW1vdmUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldElucHV0UHJpY2UiOlsiZ2V0SW5wdXRQcmljZSJdLCJnZXRPdXRwdXRQcmljZSI6WyJnZXRPdXRwdXRQcmljZSJdLCJjYWxjTGlxVmFsdWVUb01pbnQiOlsiY2FsY0xpcVZhbHVlVG9NaW50Il0sImNhbGNTZWNvbmRhcnlSZXF1aXJlZCI6WyJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiXSwiY2FsY1ZhbHVlVG9SZW1vdmUiOlsiY2FsY1ZhbHVlVG9SZW1vdmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAstPjsa0SAACtEgAANQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbIm1ha2VFcGhlbWVyYVByb3ZpZGVyIiwicHJvdmlkZUFsbCIsInByb3ZpZGVFbXB0eVNlYXQiLCJwcm92aWRlU2luZ2xldG9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFsbFZhbHVlcyxvYmplY3RNYXAscHJvdmlkZSxFOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFsbFZhbHVlc1wiLCBbJGjigI1fYSA9PiAoYWxsVmFsdWVzID0gJGjigI1fYSldXSxbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogU0NBTEU6IE9ubHkgZm9yIGxvdyBjYXJkaW5hbGl0eSBwcm92aXNpb25pbmcuIEV2ZXJ5IHZhbHVlIGZyb20gaW5pdCgpIHdpbGxcbiAqIHJlbWFpbiBpbiB0aGUgbWFwIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGhlYXAuIElmIGEga2V5IG9iamVjdCBpcyBHQ2VkLCBpdHNcbiAqIHJlcHJlc2VudGF0aXZlIGFsc28gcmVtYWlucy5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBFIEVwaGVtZXJhbCBzdGF0ZVxuICogQHRlbXBsYXRlIHt7fX0gW0s9YW55XSBrZXkgb24gd2hpY2ggdG8gcHJvdmlzaW9uXG4gKiBAcGFyYW0geyhrZXk6IEspID0+IEV9IGluaXRcbiAqL1xuY29uc3QgICAgICAgIG1ha2VFcGhlbWVyYVByb3ZpZGVyPShpbml0KT0+e1xuLyoqIEB0eXBlIHtXZWFrTWFwPEssIEU+fSAqL1xuY29uc3QgZXh0YW50PW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogUHJvdmlkZSBhbiBvYmplY3QgdG8gaG9sZCBzdGF0ZSB0aGF0IG5lZWQgbm90IChvciBjYW5ub3QpIGJlIGR1cmFibGUuXG4gKlxuICogQHR5cGUgeyhrZXk6IEspID0+IEV9XG4gKi9cbnJldHVybihrZXkpPT57XG5pZihleHRhbnQuaGFzKGtleSkpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiBleHRhbnQuZ2V0KGtleSk7XG4gfVxuY29uc3QgbmV3RXBoPWluaXQoa2V5KTtcbmV4dGFudC5zZXQoa2V5LG5ld0VwaCk7XG5yZXR1cm4gbmV3RXBoO1xuIH07XG4gfTskaOKAjV9vbmNlLm1ha2VFcGhlbWVyYVByb3ZpZGVyKG1ha2VFcGhlbWVyYVByb3ZpZGVyKTtcbmhhcmRlbihtYWtlRXBoZW1lcmFQcm92aWRlcik7XG5cbi8qKlxuICogUHJvdmlkZSBhbiBlbXB0eSBaQ0Ygc2VhdC5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1hpbXBvcnQoJ0BhZ29yaWMvZXJ0cCcpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7WkNGU2VhdH1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVFbXB0eVNlYXQ9KHpjZixiYWdnYWdlLG5hbWUpPT57XG5yZXR1cm4gcHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PnpjZi5tYWtlRW1wdHlTZWF0S2l0KCkuemNmU2VhdCk7XG4gfTskaOKAjV9vbmNlLnByb3ZpZGVFbXB0eVNlYXQocHJvdmlkZUVtcHR5U2VhdCk7XG5oYXJkZW4ocHJvdmlkZUVtcHR5U2VhdCk7XG5cbi8qKlxuICogRm9yIHVzZSBpbiBjb250cmFjdCB1cGdyYWRlcyB0byBwcm92aWRlIHZhbHVlcyB0aGF0IGNvbWUgZnJvbSBvdGhlciB2YXRzLlxuICogQWxsIHZhdHMgbXVzdCBiZSBhYmxlIHRvIGZpbmlzaCB0aGVpciB1cGdyYWRlIHdpdGhvdXQgY29udGFjdGluZyBvdGhlciB2YXRzLFxuICogc28gd2hhdGV2ZXIgdmFsdWVzIGFuIGluc3RhbmNlIG5lZWRzIGZyb20gb3RoZXIgdmF0cyBtdXN0IGJlIHNhdmVkIGluIHRoZSBmaXJzdFxuICogaW5jYXJuYXRpb24gYW5kIHJlYWQgZnJvbSBiYWdnYWdlIGluIGVhY2ggc3Vic2VxdWVudC5cbiAqXG4gKiBUaGlzIGFic3RyYWN0cyB0aGF0IGNvbmRpdGlvbiBzbyB0aGF0IHRoZSBjb250cmFjdCBjYW4gY29udmVydCBhIGRpY3Rpb25hcnlcbiAqIG9mIHRodW5rcyBpbnRvIGEgZGljdGlvbmFyeSBvZiB2YWx1ZXMgZHVyaW5nIGl0cyBmaXJzdCBgcHJlcGFyZWAgKHN0YXJ0KS5cbiAqIEVhY2ggc3Vic2VxdWVudCBgcHJlcGFyZWAgY2FsbCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVhZCBmcm9tIHRoZSBiYWdnYWdlIGFuZFxuICogZXNjaGV3IHJlbW90ZSBjYWxscy5cbiAqXG4gKiBUaGUgdmFsdWVzIGFyZSB0aHVua3MgaW5zdGVhZCBvZiBwcm9taXNlcyBzbyB0aGF0IHRoZXkgZG9uJ3Qgc3RhcnQgZXhlY3V0aW5nXG4gKiB1bm5lY2Vzc2FyaWx5IG9yIGluZHVjZSBmYWlsdXJlcy5cbiAqXG4gKiBGb3IgZXhhbXBsZSxcbiAqXG4gKiAgICAgY29uc3QgaW52aXRhdGlvbklzc3VlclAgPSBFKHpvZSkuZ2V0SW52aXRhdGlvbklzc3VlcigpO1xuICogICAgIGNvbnN0IHtcbiAqICAgICAgIGludml0YXRpb25Jc3N1ZXIsXG4gKiAgICAgICBpbnZpdGF0aW9uQnJhbmQsXG4gKiAgICAgfSA9IGF3YWl0IHByb3ZpZGVBbGwoYmFnZ2FnZSwge1xuICogICAgICAgaW52aXRhdGlvbklzc3VlcjogKCkgPT4gaW52aXRhdGlvbklzc3VlclAsXG4gKiAgICAgICBpbnZpdGF0aW9uQnJhbmQ6ICgpID0+IEUoaW52aXRhdGlvbklzc3VlclApLmdldEJyYW5kKCksXG4gKiAgICAgfSk7XG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCAoKSA9PiBFUmVmPGFueT4+fSBUIGRpY3Qgb2YgdGh1bmtzIChwcm9taXNlIG1ha2VycylcbiAqIEBwYXJhbSB7TWFwU3RvcmU8c3RyaW5nLCBhbnk+fSBiYWdnYWdlXG4gKiBAcGFyYW0ge1R9IHRodW5rc1xuICogQHJldHVybnMge1Byb21pc2U8eyBbSyBpbiBrZXlvZiBUXTogQXdhaXRlZDxSZXR1cm5UeXBlPFRbS10+PiB9Pn1cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVBbGw9KGJhZ2dhZ2UsdGh1bmtzKT0+e1xuY29uc3Qga2V5cz1PYmplY3Qua2V5cyh0aHVua3MpO1xuLyogYXNzdW1lIGlmIGFueSBrZXlzIGFyZSBkZWZpbmVkIHRoZXkgYWxsIGFyZSovXG5jb25zdCBpbkJhZ2dhZ2U9YmFnZ2FnZS5oYXMoa2V5c1swXSk7XG5pZihpbkJhZ2dhZ2Upe1xuY29uc3Qgb2JqPW9iamVjdE1hcChcbnRodW5rcyxcbi8qKiBAdHlwZSB7KHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSA9PiBhbnl9ICovXG4oXyxrKT0+YmFnZ2FnZS5nZXQoaykpO1xuXG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGhhcmRlbihvYmopKTtcbiB9XG5cbmNvbnN0IGtleWVkUHJvbWlzZXM9b2JqZWN0TWFwKHRodW5rcywoZm4pPT5mbigpKTtcblxucmV0dXJuIGFsbFZhbHVlcyhrZXllZFByb21pc2VzKS50aGVuKChrZXllZFZhbHMpPT57XG5mb3IoY29uc3Rbayx2XW9mIE9iamVjdC5lbnRyaWVzKGtleWVkVmFscykpe1xuYmFnZ2FnZS5pbml0KGssdik7XG4gfVxucmV0dXJuIGtleWVkVmFscztcbiB9KTtcbiB9OyRo4oCNX29uY2UucHJvdmlkZUFsbChwcm92aWRlQWxsKTtcbmhhcmRlbihwcm92aWRlQWxsKTtcblxuLyoqXG4gKiBMaWtlIHByb3ZpZGVBc3luYyBpbiBBdG9taWNQcm92aWRlciBidXQgYXNzdW1lcyBvbmx5IG9uZSBjYWxsIHNvIHRoZXJlIGFyZSBubyByYWNlIGNvbmRpdGlvbnMuXG4gKiBBZGRpdGlvbmFsbHkgb2ZmZXJzIGEgYHdpdGhWYWx1ZWAgaGVscGVyIHVzZWZ1bCBmb3IgdHJpZ2dlcmluZyBwcm9jZXNlc3Mgb24gYSBwcm92aWRlZCBvYmplY3QuXG4gKlxuICogQHNlZSB7bWFrZUF0b21pY1Byb3ZpZGVyfVxuICogQHNlZSB7QXRvbWljUHJvdmlkZXJ9XG4gKiBAdGVtcGxhdGUgeygpID0+IEVSZWY8YW55Pn0gVFxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gbWFwU3RvcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAqIEBwYXJhbSB7VH0gbWFrZVZhbHVlXG4gKiBAcGFyYW0geyh2YWx1ZTogQXdhaXRlZDxSZXR1cm5UeXBlPFQ+PikgPT4gdm9pZH0gW3dpdGhWYWx1ZV1cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj4+fVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZVNpbmdsZXRvbj0obWFwU3RvcmUsa2V5LG1ha2VWYWx1ZSx3aXRoVmFsdWUpPT57XG5jb25zdCBzdG9yZWQ9XG5tYXBTdG9yZS5oYXMoa2V5KXx8XG5FLndoZW4obWFrZVZhbHVlKCksKHYpPT5tYXBTdG9yZS5pbml0KGtleSxoYXJkZW4odikpKTtcblxucmV0dXJuIEUud2hlbihzdG9yZWQsKCk9PntcbmNvbnN0IHZhbHVlPW1hcFN0b3JlLmdldChrZXkpO1xuaWYod2l0aFZhbHVlKXtcbndpdGhWYWx1ZSh2YWx1ZSk7XG4gfVxucmV0dXJuIHZhbHVlO1xuIH0pO1xuIH07JGjigI1fb25jZS5wcm92aWRlU2luZ2xldG9uKHByb3ZpZGVTaW5nbGV0b24pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFcGhlbWVyYVByb3ZpZGVyIjpbIm1ha2VFcGhlbWVyYVByb3ZpZGVyIl0sInByb3ZpZGVFbXB0eVNlYXQiOlsicHJvdmlkZUVtcHR5U2VhdCJdLCJwcm92aWRlQWxsIjpbInByb3ZpZGVBbGwiXSwicHJvdmlkZVNpbmdsZXRvbiI6WyJwcm92aWRlU2luZ2xldG9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFVcfJ7fCQAA3wkAADAAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hdG9taWNUcmFuc2Zlci5qcyIsIi4vYm9uZGluZ0N1cnZlcy5qcyIsIi4vZHVyYWJpbGl0eS5qcyIsIi4vcHJpY2VBdXRob3JpdHkuanMiLCIuL3ByaWNlUXVvdGUuanMiLCIuL3JhdGlvLmpzIiwiLi9yZWNvcmRlci5qcyIsIi4vc2FmZU1hdGguanMiLCIuL3N0YXRlTWFjaGluZS5qcyIsIi4vc3RhdGlzdGljcy5qcyIsIi4vdG9waWNzLmpzIiwiLi96b2VIZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiYXRvbWljVHJhbnNmZXIiLCJhdG9taWNUcmFuc2ZlciIsImdldE91dHB1dFByaWNlIiwiZ2V0T3V0cHV0UHJpY2UiLCJtYWtlUmF0aW9Gcm9tQW1vdW50cyIsIm1ha2VSYXRpb0Zyb21BbW91bnRzIiwic3dhcCIsInN3YXAiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL2R1cmFiaWxpdHkuanMiLCIuL3ByaWNlQXV0aG9yaXR5LmpzIiwiLi9wcmljZVF1b3RlLmpzIiwiLi9yZWNvcmRlci5qcyIsIi4vc3RhdGlzdGljcy5qcyIsIi4vdG9waWNzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9ib25kaW5nQ3VydmVzLmpzXCIsIFtdXSxbXCIuL3NhZmVNYXRoLmpzXCIsIFtdXSxbXCIuL3N0YXRlTWFjaGluZS5qc1wiLCBbXV0sW1wiLi9hdG9taWNUcmFuc2Zlci5qc1wiLCBbXV0sW1wiLi96b2VIZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3JhdGlvLmpzXCIsIFtdXSxbXCIuL2R1cmFiaWxpdHkuanNcIiwgW11dLFtcIi4vcHJpY2VBdXRob3JpdHkuanNcIiwgW11dLFtcIi4vcHJpY2VRdW90ZS5qc1wiLCBbXV0sW1wiLi9zdGF0aXN0aWNzLmpzXCIsIFtdXSxbXCIuL3JlY29yZGVyLmpzXCIsIFtdXSxbXCIuL3RvcGljcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL2JvbmRpbmdDdXJ2ZXMuanMiOltbImdldElucHV0UHJpY2UiLCJnZXRJbnB1dFByaWNlIl0sWyJnZXRPdXRwdXRQcmljZSIsImdldE91dHB1dFByaWNlIl0sWyJjYWxjTGlxVmFsdWVUb01pbnQiLCJjYWxjTGlxVmFsdWVUb01pbnQiXSxbImNhbGNWYWx1ZVRvUmVtb3ZlIiwiY2FsY1ZhbHVlVG9SZW1vdmUiXSxbImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCJdXSwiLi9zYWZlTWF0aC5qcyI6W1sibmF0U2FmZU1hdGgiLCJuYXRTYWZlTWF0aCJdXSwiLi9zdGF0ZU1hY2hpbmUuanMiOltbIm1ha2VTdGF0ZU1hY2hpbmUiLCJtYWtlU3RhdGVNYWNoaW5lIl1dLCIuL2F0b21pY1RyYW5zZmVyLmpzIjpbWyJhdG9taWNSZWFycmFuZ2UiLCJhdG9taWNSZWFycmFuZ2UiXSxbImF0b21pY1RyYW5zZmVyIiwiYXRvbWljVHJhbnNmZXIiXSxbImZyb21Pbmx5IiwiZnJvbU9ubHkiXSxbInRvT25seSIsInRvT25seSJdXSwiLi96b2VIZWxwZXJzLmpzIjpbWyJkZWZhdWx0QWNjZXB0YW5jZU1zZyIsImRlZmF1bHRBY2NlcHRhbmNlTXNnIl0sWyJzd2FwIiwic3dhcCJdLFsiZml0UHJvcG9zYWxTaGFwZSIsImZpdFByb3Bvc2FsU2hhcGUiXSxbImFzc2VydFByb3Bvc2FsU2hhcGUiLCJhc3NlcnRQcm9wb3NhbFNoYXBlIl0sWyJhc3NlcnRJc3N1ZXJLZXl3b3JkcyIsImFzc2VydElzc3VlcktleXdvcmRzIl0sWyJzYXRpc2ZpZXMiLCJzYXRpc2ZpZXMiXSxbImFzc2VydE5hdEFzc2V0S2luZCIsImFzc2VydE5hdEFzc2V0S2luZCJdLFsic3dhcEV4YWN0Iiwic3dhcEV4YWN0Il0sWyJkZXBvc2l0VG9TZWF0IiwiZGVwb3NpdFRvU2VhdCJdLFsid2l0aGRyYXdGcm9tU2VhdCIsIndpdGhkcmF3RnJvbVNlYXQiXSxbInNhdmVBbGxJc3N1ZXJzIiwic2F2ZUFsbElzc3VlcnMiXSxbIm9mZmVyVG8iLCJvZmZlclRvIl1dLCIuL3JhdGlvLmpzIjpbWyJtYWtlUmF0aW8iLCJtYWtlUmF0aW8iXSxbIm1ha2VSYXRpb0Zyb21BbW91bnRzIiwibWFrZVJhdGlvRnJvbUFtb3VudHMiXSxbImZsb29yTXVsdGlwbHlCeSIsImZsb29yTXVsdGlwbHlCeSJdLFsiZmxvb3JEaXZpZGVCeSIsImZsb29yRGl2aWRlQnkiXSxbImNlaWxNdWx0aXBseUJ5IiwiY2VpbE11bHRpcGx5QnkiXSxbImNlaWxEaXZpZGVCeSIsImNlaWxEaXZpZGVCeSJdLFsiYXNzZXJ0SXNSYXRpbyIsImFzc2VydElzUmF0aW8iXSxbImludmVydFJhdGlvIiwiaW52ZXJ0UmF0aW8iXSxbIm9uZU1pbnVzIiwib25lTWludXMiXSxbImFkZFJhdGlvcyIsImFkZFJhdGlvcyJdLFsibXVsdGlwbHlSYXRpb3MiLCJtdWx0aXBseVJhdGlvcyJdLFsicmF0aW9zU2FtZSIsInJhdGlvc1NhbWUiXSxbInF1YW50aXplIiwicXVhbnRpemUiXSxbInJhdGlvR1RFIiwicmF0aW9HVEUiXSxbInN1YnRyYWN0UmF0aW9zIiwic3VidHJhY3RSYXRpb3MiXSxbInJhdGlvVG9OdW1iZXIiLCJyYXRpb1RvTnVtYmVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7pqk6tSsAALUrAAA5AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIlByaWNlQXV0aG9yaXR5SSIsIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixhc3NlcnQscSxGYWlsLG1ha2VQcm9taXNlS2l0LEFtb3VudE1hdGgsQW1vdW50U2hhcGUsQnJhbmRTaGFwZSxtYWtlTm90aWZpZXIsbWFrZVRyYWNlcixUaW1lc3RhbXBTaGFwZSxNOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXSxbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXSxbXCJBbW91bnRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQW1vdW50U2hhcGUgPSAkaOKAjV9hKV1dLFtcIkJyYW5kU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEJyYW5kU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyXCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLCBbJGjigI1fYSA9PiAobWFrZVRyYWNlciA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lc3RhbXBTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0XCJ9KTskaOKAjV9vbmNlLm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdChtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHRyYWNlPW1ha2VUcmFjZXIoJ1BBJyxmYWxzZSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIENvbXBhcmVBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRMaW1pdFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNMVD0oYW1vdW50LGFtb3VudExpbWl0KT0+IUFtb3VudE1hdGguaXNHVEUoYW1vdW50LGFtb3VudExpbWl0KTtcblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNMVEU9KGFtb3VudCxhbW91bnRMaW1pdCk9PkFtb3VudE1hdGguaXNHVEUoYW1vdW50TGltaXQsYW1vdW50KTtcblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNHVEU9KGFtb3VudCxhbW91bnRMaW1pdCk9PkFtb3VudE1hdGguaXNHVEUoYW1vdW50LGFtb3VudExpbWl0KTtcblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNHVD0oYW1vdW50LGFtb3VudExpbWl0KT0+IUFtb3VudE1hdGguaXNHVEUoYW1vdW50TGltaXQsYW1vdW50KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgVHJpZ2dlclxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSBjcmVhdGVJbnN0YW50UXVvdGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5cbmNvbnN0IEd1YXJkQ2FsbEFtb3VudFR1cGxlPU0uY2FsbChBbW91bnRTaGFwZSxBbW91bnRTaGFwZSkucmV0dXJucyhcbk0ucHJvbWlzZSgpKTtcblxuY29uc3QgICAgICAgIFByaWNlQXV0aG9yaXR5ST1NLmludGVyZmFjZSgnUHJpY2VBdXRob3JpdHknLHtcbmdldFF1b3RlSXNzdWVyOk0uY2FsbChCcmFuZFNoYXBlLEJyYW5kU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0VGltZXJTZXJ2aWNlOk0uY2FsbChCcmFuZFNoYXBlLEJyYW5kU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxucXVvdGVHaXZlbjpNLmNhbGwoQW1vdW50U2hhcGUsQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG5xdW90ZVdhbnRlZDpNLmNhbGwoQnJhbmRTaGFwZSxBbW91bnRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG5tYWtlUXVvdGVOb3RpZmllcjpNLmNhbGwoQW1vdW50U2hhcGUsQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG5xdW90ZUF0VGltZTpNLmNhbGwoVGltZXN0YW1wU2hhcGUsQW1vdW50U2hhcGUsQnJhbmRTaGFwZSkucmV0dXJucyhcbk0ucHJvbWlzZSgpKSxcblxucXVvdGVXaGVuTFQ6R3VhcmRDYWxsQW1vdW50VHVwbGUsXG5xdW90ZVdoZW5MVEU6R3VhcmRDYWxsQW1vdW50VHVwbGUsXG5xdW90ZVdoZW5HVEU6R3VhcmRDYWxsQW1vdW50VHVwbGUsXG5xdW90ZVdoZW5HVDpHdWFyZENhbGxBbW91bnRUdXBsZSxcbm11dGFibGVRdW90ZVdoZW5MVDpHdWFyZENhbGxBbW91bnRUdXBsZSxcbm11dGFibGVRdW90ZVdoZW5MVEU6R3VhcmRDYWxsQW1vdW50VHVwbGUsXG5tdXRhYmxlUXVvdGVXaGVuR1RFOkd1YXJkQ2FsbEFtb3VudFR1cGxlLFxubXV0YWJsZVF1b3RlV2hlbkdUOkd1YXJkQ2FsbEFtb3VudFR1cGxlfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHtJc3N1ZXI8J3NldCc+fSBvcHRzLnF1b3RlSXNzdWVyXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8dW5rbm93bj4+fSBvcHRzLm5vdGlmaWVyXG4gKiBAcGFyYW0ge0VSZWY8WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVyU2VydmljZT59IG9wdHMudGltZXJcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZUNyZWF0ZX0gb3B0cy5jcmVhdGVRdW90ZVxuICogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IG9wdHMuYWN0dWFsQnJhbmRJblxuICogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IG9wdHMuYWN0dWFsQnJhbmRPdXRcbiAqIEByZXR1cm5zIHtQcmljZUF1dGhvcml0eUtpdH1cbiAqLyRo4oCNX29uY2UuUHJpY2VBdXRob3JpdHlJKFByaWNlQXV0aG9yaXR5SSk7XG5mdW5jdGlvbiAgICAgICAgbWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0KG9wdHMpe1xuY29uc3R7XG50aW1lcixcbmNyZWF0ZVF1b3RlLFxuYWN0dWFsQnJhbmRJbixcbmFjdHVhbEJyYW5kT3V0LFxucXVvdGVJc3N1ZXIsXG5ub3RpZmllcn09XG5vcHRzO1xuXG5sZXQgaGF2ZUZpcnN0UXVvdGU9ZmFsc2U7XG5cbkUobm90aWZpZXIpLlxuZ2V0VXBkYXRlU2luY2UoKS5cbnRoZW4oKF8pPT5oYXZlRmlyc3RRdW90ZT10cnVlKTtcblxuLyoqIEB0eXBlIHtTZXQ8VHJpZ2dlcj59ICovXG5jb25zdCB0cmlnZ2Vycz1uZXcgU2V0KCk7XG5jb25zdCBtdXRhYmxlVHJpZ2dlcnM9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZUNyZWF0ZX0gdHJpZ2dlckNyZWF0ZVF1b3RlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgZmlyZVRyaWdnZXJzPWFzeW5jKHRyaWdnZXJDcmVhdGVRdW90ZSk9PntcbmlmKCFoYXZlRmlyc3RRdW90ZSl7XG5yZXR1cm47XG4gfVxuYXdhaXQgUHJvbWlzZS5hbGwoXG5bLi4udHJpZ2dlcnMsLi4uQXJyYXkuZnJvbShtdXRhYmxlVHJpZ2dlcnMudmFsdWVzKCkpXS5tYXAoKHRyaWdnZXIpPT5cbnRyaWdnZXIodHJpZ2dlckNyZWF0ZVF1b3RlKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIENyZWF0ZSBhIHF1b3RlV2hlbiogZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtDb21wYXJlQW1vdW50fSBjb21wYXJlQW1vdW50c0ZuXG4gKi9cbmNvbnN0IG1ha2VRdW90ZVdoZW5PdXQ9KGNvbXBhcmVBbW91bnRzRm4pPT5cbi8qKlxuICogUmV0dXJuIGEgcXVvdGUgd2hlbiB0cmlnZ2VyV2hlbiBpcyB0cnVlIG9mIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRJbiB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlIGNhbGNBbW91bnRUcmlnZ2VyXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50T3V0TGltaXQgdGhlIHZhbHVlIHRvIGNvbXBhcmUgd2l0aCB0aGUgb3V0cHV0XG4gKiBvZiBjYWxjQW1vdW50VHJpZ2dlclxuICovXG5hc3luYyBmdW5jdGlvbiBxdW90ZVdoZW5PdXRUcmlnZ2VyKGFtb3VudEluLGFtb3VudE91dExpbWl0KXtcbmFtb3VudEluPUFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuYW1vdW50T3V0TGltaXQ9QW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRPdXQsYW1vdW50T3V0TGltaXQpO1xuXG4vKiogQHR5cGUge1Byb21pc2VSZWNvcmQ8UHJpY2VRdW90ZT59ICovXG5jb25zdCB0cmlnZ2VyUEs9bWFrZVByb21pc2VLaXQoKTtcblxuLyoqIEB0eXBlIHtQcmljZVF1b3RlVHJpZ2dlcn0gKi9cbmNvbnN0IHRyaWdnZXI9YXN5bmMoY3JlYXRlSW5zdGFudFF1b3RlKT0+e1xudHJ5e1xuY29uc3QgcXVvdGVQPWNyZWF0ZUluc3RhbnRRdW90ZSgoY2FsY0Ftb3VudE91dCk9PntcbmlmKCF0cmlnZ2Vycy5oYXModHJpZ2dlcikpe1xuLyogQWxyZWFkeSBmaXJlZC4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBhbW91bnRPdXQ9Y2FsY0Ftb3VudE91dChhbW91bnRJbik7XG5cbmlmKCFjb21wYXJlQW1vdW50c0ZuKGFtb3VudE91dCxhbW91bnRPdXRMaW1pdCkpe1xuLyogRG9uJ3QgZmlyZSB0aGUgdHJpZ2dlciB5ZXQuKi9cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuXG4vKiBHZW5lcmF0ZSB0aGUgcXVvdGUuKi9cbnJldHVybnthbW91bnRJbixhbW91bnRPdXR9O1xuIH0pO1xuXG5pZighcXVvdGVQKXtcbi8qIFdlIHNob3VsZG4ndCByZXNvbHZlIHlldC4qL1xucmV0dXJuO1xuIH1cblxudHJpZ2dlcnMuZGVsZXRlKHRyaWdnZXIpO1xudHJpZ2dlclBLLnJlc29sdmUocXVvdGVQKTtcbiB9Y2F0Y2goZSl7XG4vKiBUcmlnZ2VyIGZhaWxlZCwgc28gcmVqZWN0IGFuZCBkcm9wLiovXG50cmlnZ2VyUEsucmVqZWN0KGUpO1xudHJpZ2dlcnMuZGVsZXRlKHRyaWdnZXIpO1xuIH1cbiB9O1xuXG50cmlnZ2Vycy5hZGQodHJpZ2dlcik7XG5cbi8qIEZpcmUgbm93LCBqdXN0IGluIGNhc2UuKi9cbmF3YWl0IHRyaWdnZXIoY3JlYXRlUXVvdGUpO1xuXG5yZXR1cm4gdHJpZ2dlclBLLnByb21pc2U7XG4gfTtcblxuLyoqXG4gKiBDcmVhdGUgYSBtdXRhYmxlUXVvdGVXaGVuKiBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbXBhcmVBbW91bnR9IGNvbXBhcmVBbW91bnRzRm5cbiAqL1xuY29uc3QgbWFrZU11dGFibGVRdW90ZT0oY29tcGFyZUFtb3VudHNGbik9PlxuLyoqXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudEluXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudE91dExpbWl0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG11dGFibGVRdW90ZVdoZW5PdXRUcmlnZ2VyKGFtb3VudEluLGFtb3VudE91dExpbWl0KXtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRPdXQsYW1vdW50T3V0TGltaXQpO1xuXG4vKiogQHR5cGUge1Byb21pc2VSZWNvcmQ8UHJpY2VRdW90ZT59ICovXG5jb25zdCB0cmlnZ2VyUEs9bWFrZVByb21pc2VLaXQoKTtcblxuLyoqIEB0eXBlIHtNdXRhYmxlUXVvdGV9ICovXG5jb25zdCBtdXRhYmxlUXVvdGU9RmFyKCdNdXRhYmxlUXVvdGUnLHtcbmNhbmNlbDooZSk9PnRyaWdnZXJQSy5yZWplY3QoZSksXG51cGRhdGVMZXZlbDoobmV3QW1vdW50SW4sbmV3QW1vdW50T3V0TGltaXQpPT57XG5jb25zdCBjb2VyY2VkQW1vdW50SW49QW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbixuZXdBbW91bnRJbik7XG5jb25zdCBjb2VyY2VkQW1vdW50T3V0TGltaXQ9QW1vdW50TWF0aC5jb2VyY2UoXG5hY3R1YWxCcmFuZE91dCxcbm5ld0Ftb3VudE91dExpbWl0KTtcblxuYW1vdW50SW49Y29lcmNlZEFtb3VudEluO1xuYW1vdW50T3V0TGltaXQ9Y29lcmNlZEFtb3VudE91dExpbWl0O1xuZmlyZVRyaWdnZXJzKGNyZWF0ZVF1b3RlKTtcbiB9LFxuZ2V0UHJvbWlzZTooKT0+dHJpZ2dlclBLLnByb21pc2V9KTtcblxuXG4vKiogQHR5cGUge1ByaWNlUXVvdGVUcmlnZ2VyfSAqL1xuY29uc3QgbXV0YWJsZVRyaWdnZXI9YXN5bmMoY3JlYXRlSW5zdGFudFF1b3RlKT0+e1xudHJ5e1xuY29uc3QgcXVvdGVQPWNyZWF0ZUluc3RhbnRRdW90ZSgoY2FsY0Ftb3VudE91dCk9PntcbmlmKCFtdXRhYmxlVHJpZ2dlcnMuaGFzKG11dGFibGVRdW90ZSkpe1xuLyogQWxyZWFkeSBmaXJlZC4qL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jb25zdCBhbW91bnRPdXQ9Y2FsY0Ftb3VudE91dChhbW91bnRJbik7XG5cbmlmKCFjb21wYXJlQW1vdW50c0ZuKGFtb3VudE91dCxhbW91bnRPdXRMaW1pdCkpe1xuLyogRG9uJ3QgZmlyZSB0aGUgbXV0YWJsZVRyaWdnZXIgeWV0LiovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cblxuLyogR2VuZXJhdGUgdGhlIHF1b3RlLiovXG5yZXR1cm57YW1vdW50SW4sYW1vdW50T3V0fTtcbiB9KTtcblxuaWYoIXF1b3RlUCl7XG4vKiBXZSBzaG91bGRuJ3QgcmVzb2x2ZSB5ZXQuKi9cbnJldHVybjtcbiB9XG5cbm11dGFibGVUcmlnZ2Vycy5kZWxldGUobXV0YWJsZVF1b3RlKTtcbnRyaWdnZXJQSy5yZXNvbHZlKHF1b3RlUCk7XG4gfWNhdGNoKGUpe1xuLyogVHJpZ2dlciBmYWlsZWQsIHNvIHJlamVjdCBhbmQgZHJvcC4qL1xudHJpZ2dlclBLLnJlamVjdChlKTtcbm11dGFibGVUcmlnZ2Vycy5kZWxldGUobXV0YWJsZVF1b3RlKTtcbiB9XG4gfTtcblxubXV0YWJsZVRyaWdnZXJzLnNldChtdXRhYmxlUXVvdGUsbXV0YWJsZVRyaWdnZXIpO1xuXG4vKiBGaXJlIG5vdywganVzdCBpbiBjYXNlLiovXG5hd2FpdCBtdXRhYmxlVHJpZ2dlcihjcmVhdGVRdW90ZSk7XG5cbnJldHVybiBtdXRhYmxlUXVvdGU7XG4gfTtcblxuLyoqXG4gKiBFbnN1cmUgdGhhdCB0aGUgYnJhbmRJbi9icmFuZE91dCBwYWlyIGlzIHN1cHBvcnRlZC5cbiAqXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZEluXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZE91dFxuICovXG5jb25zdCBhc3NlcnRCcmFuZHM9KGJyYW5kSW4sYnJhbmRPdXQpPT57XG5icmFuZEluPT09YWN0dWFsQnJhbmRJbnx8XG5GYWlsIGBEZXNpcmVkIGJyYW5kSW4gJHtxKGJyYW5kSW4pfSBtdXN0IG1hdGNoICR7cShhY3R1YWxCcmFuZEluKX1gO1xuYnJhbmRPdXQ9PT1hY3R1YWxCcmFuZE91dHx8XG5GYWlsIGBEZXNpcmVkIGJyYW5kT3V0ICR7cShicmFuZE91dCl9IG11c3QgbWF0Y2ggJHtxKGFjdHVhbEJyYW5kT3V0KX1gO1xuIH07XG5cbi8qKiBAdHlwZSB7UHJpY2VBdXRob3JpdHl9ICovXG5jb25zdCBwcmljZUF1dGhvcml0eT1GYXIoJ1ByaWNlQXV0aG9yaXR5Jyx7XG5nZXRRdW90ZUlzc3VlcihicmFuZEluLGJyYW5kT3V0KXtcbmFzc2VydEJyYW5kcyhicmFuZEluLGJyYW5kT3V0KTtcbnJldHVybiBxdW90ZUlzc3VlcjtcbiB9LFxuZ2V0VGltZXJTZXJ2aWNlKGJyYW5kSW4sYnJhbmRPdXQpe1xuYXNzZXJ0QnJhbmRzKGJyYW5kSW4sYnJhbmRPdXQpO1xucmV0dXJuIHRpbWVyO1xuIH0sXG5tYWtlUXVvdGVOb3RpZmllcihhbW91bnRJbixicmFuZE91dCl7XG5BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLGFtb3VudEluKTtcbmFzc2VydEJyYW5kcyhhbW91bnRJbi5icmFuZCxicmFuZE91dCk7XG5cbi8qIFdyYXAgb3VyIHVuZGVybHlpbmcgbm90aWZpZXIgd2l0aCBzcGVjaWZpYyBxdW90ZXMuKi9cbmNvbnN0IHNwZWNpZmljQmFzZU5vdGlmaWVyPWhhcmRlbih7XG4gICAgICBhc3luYyBnZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudD11bmRlZmluZWQpe1xuLyogV2UgdXNlIHRoZSBzYW1lIHVwZGF0ZUNvdW50IGFzIG91ciB1bmRlcmx5aW5nIG5vdGlmaWVyLiovXG5jb25zdCByZWNvcmQ9YXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpO1xuXG4vKiBXZSBjcmVhdGUgYSBxdW90ZSBpbmxpbmUuKi9cbmNvbnN0IHF1b3RlPWNyZWF0ZVF1b3RlKChjYWxjQW1vdW50T3V0KT0+KHtcbmFtb3VudEluLFxuYW1vdW50T3V0OmNhbGNBbW91bnRPdXQoYW1vdW50SW4pfSkpO1xuXG5pZighcXVvdGUpe1xudGhyb3cgRmFpbCBgY3JlYXRlUXVvdGUgcmV0dXJuZWQgZmFsc2V5YDtcbiB9XG5cbmNvbnN0IHZhbHVlPWF3YWl0IHF1b3RlO1xucmV0dXJuIGhhcmRlbih7XG52YWx1ZSxcbnVwZGF0ZUNvdW50OnJlY29yZC51cGRhdGVDb3VudH0pO1xuXG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7Tm90aWZpZXI8UHJpY2VRdW90ZT59ICovXG5jb25zdCBzcGVjaWZpY05vdGlmaWVyPUZhcignUXVvdGVOb3RpZmllcicse1xuLi4ubWFrZU5vdGlmaWVyKHNwZWNpZmljQmFzZU5vdGlmaWVyKSxcbi8qIFRPRE8gc3RvcCBleHBvc2luZyBiYXNlTm90aWZpZXIgbWV0aG9kcyBkaXJlY3RseS4qL1xuLi4uc3BlY2lmaWNCYXNlTm90aWZpZXJ9KTtcblxucmV0dXJuIHNwZWNpZmljTm90aWZpZXI7XG4gfSxcbiAgICAgIGFzeW5jIHF1b3RlR2l2ZW4oYW1vdW50SW4sYnJhbmRPdXQpe1xudHJhY2UoJ3F1b3RlR2l2ZW4nLGFtb3VudEluLGJyYW5kT3V0KTtcbkFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sYW1vdW50SW4pO1xuYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLGJyYW5kT3V0KTtcblxuYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbmNvbnN0IHF1b3RlPWNyZWF0ZVF1b3RlKChjYWxjQW1vdW50T3V0KT0+KHtcbmFtb3VudEluLFxuYW1vdW50T3V0OmNhbGNBbW91bnRPdXQoYW1vdW50SW4pfSkpO1xuXG5hc3NlcnQocXVvdGUpO1xucmV0dXJuIHF1b3RlO1xuIH0sXG4gICAgICBhc3luYyBxdW90ZVdhbnRlZChicmFuZEluLGFtb3VudE91dCl7XG5BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCxhbW91bnRPdXQpO1xuYXNzZXJ0QnJhbmRzKGJyYW5kSW4sYW1vdW50T3V0LmJyYW5kKTtcblxuYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbmNvbnN0IHF1b3RlPWNyZWF0ZVF1b3RlKChjYWxjQW1vdW50T3V0LGNhbGNBbW91bnRJbik9Pntcbi8qIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGFuIGFtb3VudEluIHRoYXQgZ3VhcmFudGVlcyBhdCBsZWFzdCB0aGUgYW1vdW50T3V0LiovXG5jb25zdCBhbW91bnRJbj1jYWxjQW1vdW50SW4oYW1vdW50T3V0KTtcbmNvbnN0IGFjdHVhbEFtb3VudE91dD1jYWxjQW1vdW50T3V0KGFtb3VudEluKTtcbkFtb3VudE1hdGguaXNHVEUoYWN0dWFsQW1vdW50T3V0LGFtb3VudE91dCl8fFxuRmFpbCBgQ2FsY3VsYXRpb24gb2YgJHthY3R1YWxBbW91bnRPdXR9IGRpZG4ndCBjb3ZlciBleHBlY3RlZCAke2Ftb3VudE91dH1gO1xucmV0dXJue2Ftb3VudEluLGFtb3VudE91dH07XG4gfSk7XG5hc3NlcnQocXVvdGUpO1xucmV0dXJuIHF1b3RlO1xuIH0sXG4gICAgICBhc3luYyBxdW90ZUF0VGltZShkZWFkbGluZSxhbW91bnRJbixicmFuZE91dCl7XG5BbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLGFtb3VudEluKTtcbmFzc2VydEJyYW5kcyhhbW91bnRJbi5icmFuZCxicmFuZE91dCk7XG5cbmF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKCk7XG5jb25zdCBxdW90ZVBLPW1ha2VQcm9taXNlS2l0KCk7XG5hd2FpdCBFKHRpbWVyKS5zZXRXYWtldXAoXG5kZWFkbGluZSxcbkZhcignd2FrZU9iaicse1xuICAgICAgYXN5bmMgd2FrZSh0aW1lc3RhbXApe1xuYXdhaXQgbnVsbDtcbnRyeXtcbmNvbnN0IHF1b3RlUD1jcmVhdGVRdW90ZSgoY2FsY0Ftb3VudE91dCk9Pih7XG5hbW91bnRJbixcbmFtb3VudE91dDpjYWxjQW1vdW50T3V0KGFtb3VudEluKSxcbnRpbWVzdGFtcH0pKTtcblxuXG4vKiBXZSBkb24ndCB3YWl0IGZvciB0aGUgcXVvdGUgdG8gYmUgYXV0aGVudGljYXRlZDsgcmVzb2x2ZSovXG4vKiBpbW1lZGlhdGVseS4qL1xucXVvdGVQSy5yZXNvbHZlKHF1b3RlUCk7XG5hd2FpdCBxdW90ZVBLLnByb21pc2U7XG4gfWNhdGNoKGUpe1xucXVvdGVQSy5yZWplY3QoZSk7XG4gfVxuIH19KSk7XG5cblxuXG4vKiBXYWl0IHVudGlsIHRoZSB3YWtldXAgcGFzc2VzLiovXG5yZXR1cm4gcXVvdGVQSy5wcm9taXNlO1xuIH0sXG5xdW90ZVdoZW5MVDptYWtlUXVvdGVXaGVuT3V0KGlzTFQpLFxucXVvdGVXaGVuTFRFOm1ha2VRdW90ZVdoZW5PdXQoaXNMVEUpLFxucXVvdGVXaGVuR1RFOm1ha2VRdW90ZVdoZW5PdXQoaXNHVEUpLFxucXVvdGVXaGVuR1Q6bWFrZVF1b3RlV2hlbk91dChpc0dUKSxcbm11dGFibGVRdW90ZVdoZW5MVDptYWtlTXV0YWJsZVF1b3RlKGlzTFQpLFxubXV0YWJsZVF1b3RlV2hlbkxURTptYWtlTXV0YWJsZVF1b3RlKGlzTFRFKSxcbm11dGFibGVRdW90ZVdoZW5HVDptYWtlTXV0YWJsZVF1b3RlKGlzR1QpLFxubXV0YWJsZVF1b3RlV2hlbkdURTptYWtlTXV0YWJsZVF1b3RlKGlzR1RFKX0pO1xuXG5cbnJldHVybntwcmljZUF1dGhvcml0eSxhZG1pbkZhY2V0OntmaXJlVHJpZ2dlcnN9fTtcbiB9XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHJpY2VBdXRob3JpdHlJIjpbIlByaWNlQXV0aG9yaXR5SSJdLCJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQiOlsibWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIge7Kn0CAAA9AgAADUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiZ2V0QW1vdW50SW4iLCJnZXRBbW91bnRPdXQiLCJnZXRQcmljZURlc2NyaXB0aW9uIiwiZ2V0VGltZXN0YW1wIiwidW5pdEFtb3VudCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRNYXRoLE5hdCxFOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5cbi8qIFByaWNlQXV0aG9yaXRpZXMgcmV0dXJuIHF1b3RlcyBhcyBhIHBhaXIgb2YgYW4gYW1vdW50IGFuZCBhIHBheW1lbnQsIGJvdGgqL1xuLyogd2l0aCB0aGUgc2FtZSB2YWx1ZS4gVGhlIHVuZGVybHlpbmcgYW1vdW50IHdyYXBzIGFtb3VudEluLCBhbW91bnRPdXQsIHRpbWVyKi9cbi8qIGFuZCB0aW1lc3RhbXAuIFRoZSBwYXltZW50IGlzIGlzc3VlZCBieSB0aGUgcXVvdGVJc3N1ZXIgdG8gc3VwcG9ydCB2ZXJhY2l0eSovXG4vKiBjaGVja2luZy4gVGhlc2UgaGVscGVycyBtYWtlIGl0IGVhc2llciB0byBleHRyYWN0IHRoZSBjb21wb25lbnRzIG9mIHRoZSBRdW90ZSovXG5cbi8qKlxuICogQHBhcmFtIHtQcmljZVF1b3RlfSBxdW90ZVxuICogQHJldHVybnMge1ByaWNlRGVzY3JpcHRpb259XG4gKi9cbmNvbnN0ICAgICAgICBnZXRQcmljZURlc2NyaXB0aW9uPShxdW90ZSk9PntcbnF1b3RlLnF1b3RlQW1vdW50LnZhbHVlLmxlbmd0aD09PTF8fFxuRmFpbCBgcXVvdGVBbW91bnQgc2V0IG11c3QgaGF2ZSBvbmUgbWVtYmVyYDtcbnJldHVybiBxdW90ZS5xdW90ZUFtb3VudC52YWx1ZVswXTtcbiB9O1xuXG4vKiogQHBhcmFtIHtQcmljZVF1b3RlfSBxdW90ZSAqLyRo4oCNX29uY2UuZ2V0UHJpY2VEZXNjcmlwdGlvbihnZXRQcmljZURlc2NyaXB0aW9uKTtcbmNvbnN0ICAgICAgICBnZXRBbW91bnRJbj0ocXVvdGUpPT5nZXRQcmljZURlc2NyaXB0aW9uKHF1b3RlKS5hbW91bnRJbjtcbi8qKiBAcGFyYW0ge1ByaWNlUXVvdGV9IHF1b3RlICovJGjigI1fb25jZS5nZXRBbW91bnRJbihnZXRBbW91bnRJbik7XG5jb25zdCAgICAgICAgZ2V0QW1vdW50T3V0PShxdW90ZSk9PmdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLmFtb3VudE91dDtcbi8qKiBAdHlwZSB7KHF1b3RlOiBQcmljZVF1b3RlKSA9PiBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSAqLyRo4oCNX29uY2UuZ2V0QW1vdW50T3V0KGdldEFtb3VudE91dCk7XG5jb25zdCAgICAgICAgZ2V0VGltZXN0YW1wPShxdW90ZSk9PmdldFByaWNlRGVzY3JpcHRpb24ocXVvdGUpLnRpbWVzdGFtcDtcblxuLyoqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBicmFuZCAqLyRo4oCNX29uY2UuZ2V0VGltZXN0YW1wKGdldFRpbWVzdGFtcCk7XG5jb25zdCAgICAgICAgdW5pdEFtb3VudD1hc3luYyhicmFuZCk9Pntcbi8qIEJyYW5kIG1ldGhvZHMgYXJlIHJlbW90ZSovXG5jb25zdCBkaXNwbGF5SW5mbz1hd2FpdCBFKGJyYW5kKS5nZXREaXNwbGF5SW5mbygpO1xuY29uc3QgZGVjaW1hbFBsYWNlcz1kaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzPz8wO1xucmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCwxMG4qKk5hdChkZWNpbWFsUGxhY2VzKSk7XG4gfTskaOKAjV9vbmNlLnVuaXRBbW91bnQodW5pdEFtb3VudCk7XG5oYXJkZW4odW5pdEFtb3VudCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0UHJpY2VEZXNjcmlwdGlvbiI6WyJnZXRQcmljZURlc2NyaXB0aW9uIl0sImdldEFtb3VudEluIjpbImdldEFtb3VudEluIl0sImdldEFtb3VudE91dCI6WyJnZXRBbW91bnRPdXQiXSwiZ2V0VGltZXN0YW1wIjpbImdldFRpbWVzdGFtcCJdLCJ1bml0QW1vdW50IjpbInVuaXRBbW91bnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArcVdS7w2AAC8NgAAMAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9yYXRpby5qc3siaW1wb3J0cyI6WyIuL3NhZmVNYXRoLmpzIiwiLi90eXBlcy5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9lcnRwIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbImFkZFJhdGlvcyIsImFzc2VydElzUmF0aW8iLCJhc3NlcnRQYXJzYWJsZU51bWJlciIsImNlaWxEaXZpZGVCeSIsImNlaWxNdWx0aXBseUJ5IiwiZGl2aWRlQnkiLCJmbG9vckRpdmlkZUJ5IiwiZmxvb3JNdWx0aXBseUJ5IiwiaW52ZXJ0UmF0aW8iLCJtYWtlUmF0aW8iLCJtYWtlUmF0aW9Gcm9tQW1vdW50cyIsIm11bHRpcGx5QnkiLCJtdWx0aXBseVJhdGlvcyIsIm9uZU1pbnVzIiwicGFyc2VSYXRpbyIsInF1YW50aXplIiwicmF0aW9HVEUiLCJyYXRpb1RvTnVtYmVyIiwicmF0aW9zU2FtZSIsInN1YnRyYWN0UmF0aW9zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHEsRmFpbCxBbW91bnRNYXRoLGFzc2VydFJlY29yZCxpc05hdCxuYXRTYWZlTWF0aDskaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wicVwiLCBbJGjigI1fYSA9PiAocSA9ICRo4oCNX2EpXV0sW1wiRmFpbFwiLCBbJGjigI1fYSA9PiAoRmFpbCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJpc05hdFwiLCBbJGjigI1fYSA9PiAoaXNOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zYWZlTWF0aC5qc1wiLCBbW1wibmF0U2FmZU1hdGhcIiwgWyRo4oCNX2EgPT4gKG5hdFNhZmVNYXRoID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e211bHRpcGx5LGZsb29yRGl2aWRlLGNlaWxEaXZpZGUsYmFua2Vyc0RpdmlkZSxhZGQsc3VidHJhY3R9PVxubmF0U2FmZU1hdGg7XG5cbi8qIG1ha2UgYSBSYXRpbywgd2hpY2ggcmVwcmVzZW50cyBhIGZyYWN0aW9uLiBJdCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQuKi9cbi8qKi9cbi8qIFRoZSBuYXR1cmFsIHN5bnRheCBmb3IgdGhlIG1vc3QgY29tbW9uIG9wZXJhdGlvbnMgd2Ugd2FudCB0byBzdXBwb3J0Ki9cbi8qIGFyZSBBbW91bnQgKiBSYXRpbyBhbmQgQW1vdW50IC8gUmF0aW8uIFNpbmNlIHRoZSBvcGVyYXRpb25zIHdhbnQgdG8gYWRoZXJlIHRvKi9cbi8qIHRoZSByYXRpbyByYXRoZXIgdGhhbiB0aGUgYW1vdW50LCB3ZSBzZXR0bGVkIG9uIGEgY2FsbGluZyBjb252ZW50aW9uIG9mKi9cbi8qIFtjZWlsfGZsb29yXU11bHRpcGx5QnkoQW1vdW50LCBSYXRpbykgYW5kIFtjZWlsfGZsb29yXURpdmlkZUJ5KEFtb3VudCwgUmF0aW8pKi9cbi8qKi9cbi8qIFRoZSBtb3N0IGNvbW1vbiBraW5kIG9mIFJhdGlvIGNhbiBiZSBhcHBsaWVkIHRvIEFtb3VudHMgb2YgYSBwYXJ0aWN1bGFyKi9cbi8qIGJyYW5kLCBhbmQgcHJvZHVjZXMgcmVzdWx0cyBvZiB0aGUgc2FtZSBicmFuZC4gVGhpcyByZXByZXNlbnRzIGEgbXVsdGlwbGllciovXG4vKiB0aGF0IGlzIG9ubHkgYXBwbGljYWJsZSB0byB0aGF0IGJyYW5kLiBUaGUgbGVzcyBjb21tb24ga2luZCBvZiBSYXRpbyBjYW4gYmUqL1xuLyogYXBwbGllZCB0byBvbmUgcGFydGljdWxhciBicmFuZCBvZiBhbW91bnRzLCBhbmQgcHJvZHVjZXMgcmVzdWx0cyBvZiBhbm90aGVyKi9cbi8qIHBhcnRpY3VsYXIgYnJhbmQuIFRoaXMgcmVwcmVzZW50cyBzb21lIGtpbmQgb2YgZXhjaGFuZ2UgcmF0ZS4gVGhlKi9cbi8qIGJyYW5kLWNoZWNraW5nIGhlbHBzIHVzIGVuc3VyZSB0aGF0IG5vcm1hbCBSYXRpb3MgYXJlbid0IGFwcGxpZWQgdG8gYW1vdW50cyovXG4vKiBvZiB0aGUgd3JvbmcgYnJhbmQsIGFuZCB0aGF0IGV4Y2hhbmdlIHJhdGVzIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGFwcHJvcHJpYXRlKi9cbi8qIGRpcmVjdGlvbi4qL1xuLyoqL1xuLyogU2luY2UgdGhlIHJhdGlvcyBhcmUgcmVwcmVzZW50ZWQgYnkgYSBudW1lcmF0b3IgYW5kIGEgZGVub21pbmF0b3IsIGV2ZXJ5Ki9cbi8qIG11bHRpcGxpY2F0aW9uIG9yIGRpdmlzaW9uIG9wZXJhdGlvbiB0aGF0IHByb2R1Y2VzIGFuIGFtb3VudCBlbmRzIHdpdGggYSovXG4vKiBkaXZpc2lvbiBvZiB0aGUgdW5kZXJseWluZyBiaWdpbnRzLCBhbmQgaW50ZWdlciBkaXZpc2lvbiByZXF1aXJlcyBhIG1vZGUqL1xuLyogb2YgW3JvdW5kaW5nIHRvIGludGVnZXJdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JvdW5kaW5nI1JvdW5kaW5nX3RvX2ludGVnZXIpLiovXG4vKiBCZWNhdXNlIGBSYXRpb2Agb25seSB3b3JrIHdpdGggTmF0dXJhbCBudW1iZXJzLCBqdXN0IHRocmVlIG1vZGVzIHN1ZmZpY2U6Ki9cbi8qIC0gZmxvb3Igcm91bmRzIGRvd24qL1xuLyogLSBjZWlsIHJvdW5kcyB1cCovXG4vKiAtIGRlZmF1bHQgKHdpdGhvdXQgcHJlZml4KSBtaW5pbWl6ZXMgYmlhcyBieSByb3VuZGluZyBoYWxmIHRvIGV2ZW4qL1xuXG5jb25zdCBQRVJDRU5UPTEwMG47XG5cbmNvbnN0IHJhdGlvUHJvcGVydHlOYW1lcz1bJ251bWVyYXRvcicsJ2Rlbm9taW5hdG9yJ107XG5cbmNvbnN0ICAgICAgICBhc3NlcnRJc1JhdGlvPShyYXRpbyk9PntcbmFzc2VydFJlY29yZChyYXRpbywncmF0aW8nKTtcbmNvbnN0IGtleXM9T2JqZWN0LmtleXMocmF0aW8pO1xua2V5cy5sZW5ndGg9PT0yfHxGYWlsIGBSYXRpbyAke3JhdGlvfSBtdXN0IGJlIGEgcmVjb3JkIHdpdGggMiBmaWVsZHMuYDtcbmZvcihjb25zdCBuYW1lIG9mIGtleXMpe1xucmF0aW9Qcm9wZXJ0eU5hbWVzLmluY2x1ZGVzKG5hbWUpfHxcbkZhaWwgYFBhcmFtZXRlciBtdXN0IGJlIGEgUmF0aW8gcmVjb3JkLCBidXQgJHtyYXRpb30gaGFzICR7cShuYW1lKX1gO1xuIH1cbmNvbnN0IG51bWVyYXRvclZhbHVlPXJhdGlvLm51bWVyYXRvci52YWx1ZTtcbmNvbnN0IGRlbm9taW5hdG9yVmFsdWU9cmF0aW8uZGVub21pbmF0b3IudmFsdWU7XG5pc05hdChudW1lcmF0b3JWYWx1ZSl8fFxuRmFpbCBgVGhlIG51bWVyYXRvciB2YWx1ZSBtdXN0IGJlIGEgTmF0VmFsdWUsIG5vdCAke251bWVyYXRvclZhbHVlfWA7XG5pc05hdChkZW5vbWluYXRvclZhbHVlKXx8XG5GYWlsIGBUaGUgZGVub21pbmF0b3IgdmFsdWUgbXVzdCBiZSBhIE5hdFZhbHVlLCBub3QgJHtkZW5vbWluYXRvclZhbHVlfWA7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge2JpZ2ludH0gbnVtZXJhdG9yXG4gKiBAcGFyYW0ge0JyYW5kfSBudW1lcmF0b3JCcmFuZFxuICogQHBhcmFtIHtiaWdpbnR9IFtkZW5vbWluYXRvcl0gVGhlIGRlZmF1bHQgZGVub21pbmF0b3IgaXMgMTAwXG4gKiBAcGFyYW0ge0JyYW5kfSBbZGVub21pbmF0b3JCcmFuZF0gVGhlIGRlZmF1bHQgaXMgdG8gcmV1c2UgdGhlIG51bWVyYXRvckJyYW5kXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLmFzc2VydElzUmF0aW8oYXNzZXJ0SXNSYXRpbyk7XG5jb25zdCAgICAgICAgbWFrZVJhdGlvPShcbm51bWVyYXRvcixcbm51bWVyYXRvckJyYW5kLFxuZGVub21pbmF0b3I9UEVSQ0VOVCxcbmRlbm9taW5hdG9yQnJhbmQ9bnVtZXJhdG9yQnJhbmQpPT5cbntcbmRlbm9taW5hdG9yPjBufHxcbkZhaWwgYE5vIGluZmluaXRlIHJhdGlvcyEgRGVub21pbmF0b3Igd2FzIDAgJHtxKGRlbm9taW5hdG9yQnJhbmQpfWA7XG5cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCB0byByZXR1cm4gdHlwZSBiZWNhdXNlIG1ha2UoKSBlbnN1cmVzKi9cbnJldHVybiBoYXJkZW4oe1xubnVtZXJhdG9yOkFtb3VudE1hdGgubWFrZShudW1lcmF0b3JCcmFuZCxudW1lcmF0b3IpLFxuZGVub21pbmF0b3I6QW1vdW50TWF0aC5tYWtlKGRlbm9taW5hdG9yQnJhbmQsZGVub21pbmF0b3IpfSk7XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50fSBudW1lcmF0b3JBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBkZW5vbWluYXRvckFtb3VudFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5tYWtlUmF0aW8obWFrZVJhdGlvKTtcbmNvbnN0ICAgICAgICBtYWtlUmF0aW9Gcm9tQW1vdW50cz0obnVtZXJhdG9yQW1vdW50LGRlbm9taW5hdG9yQW1vdW50KT0+e1xuQW1vdW50TWF0aC5jb2VyY2UobnVtZXJhdG9yQW1vdW50LmJyYW5kLG51bWVyYXRvckFtb3VudCk7XG5BbW91bnRNYXRoLmNvZXJjZShkZW5vbWluYXRvckFtb3VudC5icmFuZCxkZW5vbWluYXRvckFtb3VudCk7XG5yZXR1cm4gbWFrZVJhdGlvKFxuLyogQHRzLWV4cGVjdC1lcnJvciB2YWx1ZSBjYW4gYmUgYW55IEFtb3VudFZhbHVlIGJ1dCBtYWtlUmF0aW8oKSBzdXBwb3J0cyBvbmx5IGJpZ2ludCovXG5udW1lcmF0b3JBbW91bnQudmFsdWUsXG5udW1lcmF0b3JBbW91bnQuYnJhbmQsXG5kZW5vbWluYXRvckFtb3VudC52YWx1ZSxcbmRlbm9taW5hdG9yQW1vdW50LmJyYW5kKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcGFyYW0geyp9IGRpdmlkZU9wXG4gKi8kaOKAjV9vbmNlLm1ha2VSYXRpb0Zyb21BbW91bnRzKG1ha2VSYXRpb0Zyb21BbW91bnRzKTtcbmNvbnN0IG11bHRpcGx5SGVscGVyPShhbW91bnQscmF0aW8sZGl2aWRlT3ApPT57XG5BbW91bnRNYXRoLmNvZXJjZShhbW91bnQuYnJhbmQsYW1vdW50KTtcbmFzc2VydElzUmF0aW8ocmF0aW8pO1xuYW1vdW50LmJyYW5kPT09cmF0aW8uZGVub21pbmF0b3IuYnJhbmR8fFxuRmFpbCBgYW1vdW50J3MgYnJhbmQgJHtxKGFtb3VudC5icmFuZCl9IG11c3QgbWF0Y2ggcmF0aW8ncyBkZW5vbWluYXRvciAke3EoXG5yYXRpby5kZW5vbWluYXRvci5icmFuZClcbiB9YDtcblxucmV0dXJuIEFtb3VudE1hdGgubWFrZShcbnJhdGlvLm51bWVyYXRvci5icmFuZCxcbmRpdmlkZU9wKFxubXVsdGlwbHkoYW1vdW50LnZhbHVlLHJhdGlvLm51bWVyYXRvci52YWx1ZSksXG5yYXRpby5kZW5vbWluYXRvci52YWx1ZSkpO1xuXG5cbiB9O1xuXG4vKiogQHR5cGUge1NjYWxlQW1vdW50fSAqL1xuY29uc3QgICAgICAgIGZsb29yTXVsdGlwbHlCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIG11bHRpcGx5SGVscGVyKGFtb3VudCxyYXRpbyxmbG9vckRpdmlkZSk7XG4gfTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi8kaOKAjV9vbmNlLmZsb29yTXVsdGlwbHlCeShmbG9vck11bHRpcGx5QnkpO1xuY29uc3QgICAgICAgIGNlaWxNdWx0aXBseUJ5PShhbW91bnQscmF0aW8pPT57XG5yZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LHJhdGlvLGNlaWxEaXZpZGUpO1xuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovJGjigI1fb25jZS5jZWlsTXVsdGlwbHlCeShjZWlsTXVsdGlwbHlCeSk7XG5jb25zdCAgICAgICAgbXVsdGlwbHlCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIG11bHRpcGx5SGVscGVyKGFtb3VudCxyYXRpbyxiYW5rZXJzRGl2aWRlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50XG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHBhcmFtIHsqfSBkaXZpZGVPcFxuICovJGjigI1fb25jZS5tdWx0aXBseUJ5KG11bHRpcGx5QnkpO1xuY29uc3QgZGl2aWRlSGVscGVyPShhbW91bnQscmF0aW8sZGl2aWRlT3ApPT57XG5BbW91bnRNYXRoLmNvZXJjZShhbW91bnQuYnJhbmQsYW1vdW50KTtcbmFzc2VydElzUmF0aW8ocmF0aW8pO1xuYW1vdW50LmJyYW5kPT09cmF0aW8ubnVtZXJhdG9yLmJyYW5kfHxcbkZhaWwgYGFtb3VudCdzIGJyYW5kICR7cShhbW91bnQuYnJhbmQpfSBtdXN0IG1hdGNoIHJhdGlvJ3MgbnVtZXJhdG9yICR7cShcbnJhdGlvLm51bWVyYXRvci5icmFuZClcbiB9YDtcblxucmV0dXJuIEFtb3VudE1hdGgubWFrZShcbnJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuZGl2aWRlT3AoXG5tdWx0aXBseShhbW91bnQudmFsdWUscmF0aW8uZGVub21pbmF0b3IudmFsdWUpLFxucmF0aW8ubnVtZXJhdG9yLnZhbHVlKSk7XG5cblxuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovXG5jb25zdCAgICAgICAgZmxvb3JEaXZpZGVCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIGRpdmlkZUhlbHBlcihhbW91bnQscmF0aW8sZmxvb3JEaXZpZGUpO1xuIH07XG5cbi8qKiBAdHlwZSB7U2NhbGVBbW91bnR9ICovJGjigI1fb25jZS5mbG9vckRpdmlkZUJ5KGZsb29yRGl2aWRlQnkpO1xuY29uc3QgICAgICAgIGNlaWxEaXZpZGVCeT0oYW1vdW50LHJhdGlvKT0+e1xucmV0dXJuIGRpdmlkZUhlbHBlcihhbW91bnQscmF0aW8sY2VpbERpdmlkZSk7XG4gfTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi8kaOKAjV9vbmNlLmNlaWxEaXZpZGVCeShjZWlsRGl2aWRlQnkpO1xuY29uc3QgICAgICAgIGRpdmlkZUJ5PShhbW91bnQscmF0aW8pPT57XG5yZXR1cm4gZGl2aWRlSGVscGVyKGFtb3VudCxyYXRpbyxiYW5rZXJzRGl2aWRlKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaOKAjV9vbmNlLmRpdmlkZUJ5KGRpdmlkZUJ5KTtcbmNvbnN0ICAgICAgICBpbnZlcnRSYXRpbz0ocmF0aW8pPT57XG5hc3NlcnRJc1JhdGlvKHJhdGlvKTtcblxucmV0dXJuIG1ha2VSYXRpbyhcbi8qKiBAdHlwZSB7TmF0VmFsdWV9ICovcmF0aW8uZGVub21pbmF0b3IudmFsdWUsXG5yYXRpby5kZW5vbWluYXRvci5icmFuZCxcbi8qKiBAdHlwZSB7TmF0VmFsdWV9ICovcmF0aW8ubnVtZXJhdG9yLnZhbHVlLFxucmF0aW8ubnVtZXJhdG9yLmJyYW5kKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRo4oCNX29uY2UuaW52ZXJ0UmF0aW8oaW52ZXJ0UmF0aW8pO1xuY29uc3QgICAgICAgIGFkZFJhdGlvcz0obGVmdCxyaWdodCk9PntcbmFzc2VydElzUmF0aW8ocmlnaHQpO1xuYXNzZXJ0SXNSYXRpbyhsZWZ0KTtcbmxlZnQubnVtZXJhdG9yLmJyYW5kPT09cmlnaHQubnVtZXJhdG9yLmJyYW5kfHxcbkZhaWwgYG51bWVyYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG5sZWZ0LmRlbm9taW5hdG9yLmJyYW5kPT09cmlnaHQuZGVub21pbmF0b3IuYnJhbmR8fFxuRmFpbCBgZGVub21pbmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gO1xuXG4vKiBTaW1wbGlmeWluZyB0aGUgZXhwcmVzc2lvbjoqL1xuLyogKGFuZCArIGJuZCkgLyB5IGQqKjIqL1xuLyogKGEgKyBiKSBuZCAvIHkgZCoqMiovXG4vKiAoKGEgKyBiKSBuIC8geSBkKSAqIChkIC8gZCkqL1xuLyogKGEgKyBiKSBuIC8geWQqL1xucmV0dXJuIG1ha2VSYXRpbyhcbmFkZChcbm11bHRpcGx5KGxlZnQubnVtZXJhdG9yLnZhbHVlLHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwvKiBhIG5kKi9cbm11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUscmlnaHQubnVtZXJhdG9yLnZhbHVlKS8qIGIgbmQqLyksXG4vKiAoYSArIGIpIG5kKi9cbmxlZnQubnVtZXJhdG9yLmJyYW5kLFxubXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSxyaWdodC5kZW5vbWluYXRvci52YWx1ZSksLyogeSBkKioyKi9cbmxlZnQuZGVub21pbmF0b3IuYnJhbmQpO1xuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5hZGRSYXRpb3MoYWRkUmF0aW9zKTtcbmNvbnN0ICAgICAgICBzdWJ0cmFjdFJhdGlvcz0obGVmdCxyaWdodCk9PntcbmFzc2VydElzUmF0aW8ocmlnaHQpO1xuYXNzZXJ0SXNSYXRpbyhsZWZ0KTtcbmxlZnQubnVtZXJhdG9yLmJyYW5kPT09cmlnaHQubnVtZXJhdG9yLmJyYW5kfHxcbkZhaWwgYG51bWVyYXRvciBicmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG5sZWZ0LmRlbm9taW5hdG9yLmJyYW5kPT09cmlnaHQuZGVub21pbmF0b3IuYnJhbmR8fFxuRmFpbCBgZGVub21pbmF0b3IgYnJhbmRzIG11c3QgbWF0Y2g6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gO1xuXG5yZXR1cm4gbWFrZVJhdGlvKFxuc3VidHJhY3QoXG5tdWx0aXBseShsZWZ0Lm51bWVyYXRvci52YWx1ZSxyaWdodC5kZW5vbWluYXRvci52YWx1ZSksLyogYSBuZCovXG5tdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLHJpZ2h0Lm51bWVyYXRvci52YWx1ZSkvKiBiIG5kKi8pLFxuLyogKGEgLSBiKSBuZCovXG5sZWZ0Lm51bWVyYXRvci5icmFuZCxcbm11bHRpcGx5KGxlZnQuZGVub21pbmF0b3IudmFsdWUscmlnaHQuZGVub21pbmF0b3IudmFsdWUpLC8qIHkgZCoqMiovXG5sZWZ0LmRlbm9taW5hdG9yLmJyYW5kKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRo4oCNX29uY2Uuc3VidHJhY3RSYXRpb3Moc3VidHJhY3RSYXRpb3MpO1xuY29uc3QgICAgICAgIG11bHRpcGx5UmF0aW9zPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG5hc3NlcnRJc1JhdGlvKGxlZnQpO1xuXG5jb25zdCBnZXRSZW1haW5pbmdCcmFuZHM9KCk9Pntcbi8qIFByZWZlciByZXN1bHRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBicmFuZCBhcyB0aGUgbGVmdCBvcGVyYW5kLiovXG5pZihyaWdodC5udW1lcmF0b3IuYnJhbmQ9PT1yaWdodC5kZW5vbWluYXRvci5icmFuZCl7XG5yZXR1cm5bbGVmdC5udW1lcmF0b3IuYnJhbmQsbGVmdC5kZW5vbWluYXRvci5icmFuZF07XG4gfVxuaWYocmlnaHQubnVtZXJhdG9yLmJyYW5kPT09bGVmdC5kZW5vbWluYXRvci5icmFuZCl7XG5yZXR1cm5bbGVmdC5udW1lcmF0b3IuYnJhbmQscmlnaHQuZGVub21pbmF0b3IuYnJhbmRdO1xuIH1cbmlmKGxlZnQubnVtZXJhdG9yLmJyYW5kPT09cmlnaHQuZGVub21pbmF0b3IuYnJhbmQpe1xucmV0dXJuW3JpZ2h0Lm51bWVyYXRvci5icmFuZCxsZWZ0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiB9XG5pZihsZWZ0Lm51bWVyYXRvci5icmFuZD09PWxlZnQuZGVub21pbmF0b3IuYnJhbmQpe1xucmV0dXJuW3JpZ2h0Lm51bWVyYXRvci5icmFuZCxyaWdodC5kZW5vbWluYXRvci5icmFuZF07XG4gfVxudGhyb3cgRmFpbCBgYXQgbGVhc3Qgb25lIGJyYW5kIG11c3QgY2FuY2VsIG91dDogJHtxKGxlZnQpfSAke3EocmlnaHQpfWA7XG4gfTtcblxuY29uc3RbbnVtZXJhdG9yQnJhbmQsZGVub21pbmF0b3JCcmFuZF09Z2V0UmVtYWluaW5nQnJhbmRzKCk7XG5yZXR1cm4gbWFrZVJhdGlvKFxubXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUscmlnaHQubnVtZXJhdG9yLnZhbHVlKSxcbm51bWVyYXRvckJyYW5kLFxubXVsdGlwbHkobGVmdC5kZW5vbWluYXRvci52YWx1ZSxyaWdodC5kZW5vbWluYXRvci52YWx1ZSksXG5kZW5vbWluYXRvckJyYW5kKTtcblxuIH07XG5cbi8qKlxuICogSWYgcmF0aW8gaXMgYmV0d2VlbiAwIGFuZCAxLCBzdWJ0cmFjdCBmcm9tIDEuXG4gKlxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRo4oCNX29uY2UubXVsdGlwbHlSYXRpb3MobXVsdGlwbHlSYXRpb3MpO1xuY29uc3QgICAgICAgIG9uZU1pbnVzPShyYXRpbyk9PntcbmFzc2VydElzUmF0aW8ocmF0aW8pO1xucmF0aW8ubnVtZXJhdG9yLmJyYW5kPT09cmF0aW8uZGVub21pbmF0b3IuYnJhbmR8fFxuRmFpbCBgb25lTWludXMgb25seSBzdXBwb3J0cyByYXRpb3Mgd2l0aCBhIHNpbmdsZSBicmFuZCwgYnV0ICR7cmF0aW8ubnVtZXJhdG9yLmJyYW5kfSBkb2Vzbid0IG1hdGNoICR7cmF0aW8uZGVub21pbmF0b3IuYnJhbmR9YDtcbnJhdGlvLm51bWVyYXRvci52YWx1ZTw9cmF0aW8uZGVub21pbmF0b3IudmFsdWV8fFxuRmFpbCBgUGFyYW1ldGVyIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDE6ICR7cmF0aW8ubnVtZXJhdG9yLnZhbHVlfS8ke3JhdGlvLmRlbm9taW5hdG9yLnZhbHVlfWA7XG5yZXR1cm4gbWFrZVJhdGlvKFxuc3VidHJhY3QocmF0aW8uZGVub21pbmF0b3IudmFsdWUscmF0aW8ubnVtZXJhdG9yLnZhbHVlKSxcbnJhdGlvLm51bWVyYXRvci5icmFuZCxcbnJhdGlvLmRlbm9taW5hdG9yLnZhbHVlLFxucmF0aW8ubnVtZXJhdG9yLmJyYW5kKTtcblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5vbmVNaW51cyhvbmVNaW51cyk7XG5jb25zdCAgICAgICAgcmF0aW9HVEU9KGxlZnQscmlnaHQpPT57XG5pZihsZWZ0Lm51bWVyYXRvci5icmFuZD09PXJpZ2h0Lm51bWVyYXRvci5icmFuZCl7XG5sZWZ0LmRlbm9taW5hdG9yLmJyYW5kPT09cmlnaHQuZGVub21pbmF0b3IuYnJhbmR8fFxuRmFpbCBgbnVtZXJhdG9yIGJyYW5kcyBtYXRjaCwgYnV0IGRlbm9taW5hdG9yIGJyYW5kcyBkb24ndDogJHtxKGxlZnQpfSAke3EoXG5yaWdodClcbiB9YDtcbiB9ZWxzZSBpZihsZWZ0Lm51bWVyYXRvci5icmFuZD09PWxlZnQuZGVub21pbmF0b3IuYnJhbmQpe1xucmlnaHQubnVtZXJhdG9yLmJyYW5kPT09cmlnaHQuZGVub21pbmF0b3IuYnJhbmR8fFxuRmFpbCBgbGVmdGhhbmQgYnJhbmRzIG1hdGNoLCBidXQgcmlnaHRoYW5kIGJyYW5kcyBkb24ndDogJHtxKGxlZnQpfSAke3EoXG5yaWdodClcbiB9YDtcbiB9XG5yZXR1cm4gbmF0U2FmZU1hdGguaXNHVEUoXG5tdWx0aXBseShsZWZ0Lm51bWVyYXRvci52YWx1ZSxyaWdodC5kZW5vbWluYXRvci52YWx1ZSksXG5tdWx0aXBseShyaWdodC5udW1lcmF0b3IudmFsdWUsbGVmdC5kZW5vbWluYXRvci52YWx1ZSkpO1xuXG4gfTtcblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmF0aW9zIGFyZSB0aGUgc2FtZSB2YWx1ZXMgKGVxdWFsIG9yIGVxdWl2YWxhbnQgbWF5IHJldHVybiBmYWxzZSlcbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSBsZWZ0XG4gKiBAcGFyYW0ge1JhdGlvfSByaWdodFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLnJhdGlvR1RFKHJhdGlvR1RFKTtcbmNvbnN0ICAgICAgICByYXRpb3NTYW1lPShsZWZ0LHJpZ2h0KT0+e1xucmV0dXJuKFxuQW1vdW50TWF0aC5pc0VxdWFsKGxlZnQubnVtZXJhdG9yLHJpZ2h0Lm51bWVyYXRvcikmJlxuQW1vdW50TWF0aC5pc0VxdWFsKGxlZnQuZGVub21pbmF0b3IscmlnaHQuZGVub21pbmF0b3IpKTtcblxuIH07XG5cbi8qKlxuICogTWFrZSBhbiBlcXVpdmFsYW50IHJhdGlvIHdpdGggYSBuZXcgZGVub21pbmF0b3JcbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHBhcmFtIHtiaWdpbnR9IG5ld0RlblxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjigI1fb25jZS5yYXRpb3NTYW1lKHJhdGlvc1NhbWUpO1xuY29uc3QgICAgICAgIHF1YW50aXplPShyYXRpbyxuZXdEZW4pPT57XG5jb25zdCBvbGREZW49cmF0aW8uZGVub21pbmF0b3IudmFsdWU7XG5jb25zdCBvbGROdW09cmF0aW8ubnVtZXJhdG9yLnZhbHVlO1xuY29uc3QgbmV3TnVtPVxubmV3RGVuPT09b2xkRGVuP29sZE51bTpiYW5rZXJzRGl2aWRlKG9sZE51bSpuZXdEZW4sb2xkRGVuKTtcbnJldHVybiBtYWtlUmF0aW8oXG5uZXdOdW0sXG5yYXRpby5udW1lcmF0b3IuYnJhbmQsXG5uZXdEZW4sXG5yYXRpby5kZW5vbWluYXRvci5icmFuZCk7XG5cbiB9OyRo4oCNX29uY2UucXVhbnRpemUocXVhbnRpemUpO1xuXG5jb25zdCBOVU1FUklDX1JFPS9eKFxcZFxcZCopKD86XFwuKFxcZCopKT8kLztcbi8qKiBAdHlwZWRlZiB7YmlnaW50IHwgbnVtYmVyIHwgc3RyaW5nfSBQYXJzYWJsZU51bWJlciAqL1xuXG4vKipcbiAqIENyZWF0ZSBhIHJhdGlvIGZyb20gYSBnaXZlbiBudW1lcmljIHZhbHVlLlxuICpcbiAqIEBwYXJhbSB7UGFyc2FibGVOdW1iZXJ9IG51bWVyaWNcbiAqIEBwYXJhbSB7QnJhbmR9IG51bWVyYXRvckJyYW5kXG4gKiBAcGFyYW0ge0JyYW5kfSBbZGVub21pbmF0b3JCcmFuZF1cbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqL1xuY29uc3QgICAgICAgIHBhcnNlUmF0aW89KFxubnVtZXJpYyxcbm51bWVyYXRvckJyYW5kLFxuZGVub21pbmF0b3JCcmFuZD1udW1lcmF0b3JCcmFuZCk9Plxue1xuY29uc3QgbWF0Y2g9IGAke251bWVyaWN9YC5tYXRjaChOVU1FUklDX1JFKTtcbmlmKCFtYXRjaCl7XG50aHJvdyBGYWlsIGBJbnZhbGlkIG51bWVyaWMgZGF0YTogJHtudW1lcmljfWA7XG4gfVxuXG5jb25zdFtfLHdob2xlLHBhcnQ9JyddPW1hdGNoO1xucmV0dXJuIG1ha2VSYXRpbyhcbkJpZ0ludCggYCR7d2hvbGV9JHtwYXJ0fWApLFxubnVtZXJhdG9yQnJhbmQsXG4xMG4qKkJpZ0ludChwYXJ0Lmxlbmd0aCksXG5kZW5vbWluYXRvckJyYW5kKTtcblxuIH07XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnMtY2hlY2sqL1xuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBQYXJzYWJsZU51bWJlcn1cbiAqLyRo4oCNX29uY2UucGFyc2VSYXRpbyhwYXJzZVJhdGlvKTtcbmNvbnN0ICAgICAgICBhc3NlcnRQYXJzYWJsZU51bWJlcj0oc3BlY2ltZW4pPT57XG5jb25zdCBtYXRjaD0gYCR7c3BlY2ltZW59YC5tYXRjaChOVU1FUklDX1JFKTtcbm1hdGNofHxGYWlsIGBJbnZhbGlkIG51bWVyaWMgZGF0YTogJHtzcGVjaW1lbn1gO1xuIH07XG5cbi8qKlxuICogUmF0aW9zIG1pZ2h0IGJlIGdyZWF0ZXIgb3IgbGVzcyB0aGFuIG9uZS5cbiAqXG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHJldHVybnMge251bWJlcn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0UGFyc2FibGVOdW1iZXIoYXNzZXJ0UGFyc2FibGVOdW1iZXIpO1xuY29uc3QgICAgICAgIHJhdGlvVG9OdW1iZXI9KHJhdGlvKT0+e1xuY29uc3Qgbj1OdW1iZXIocmF0aW8ubnVtZXJhdG9yLnZhbHVlKTtcbmNvbnN0IGQ9TnVtYmVyKHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlKTtcbnJldHVybiBuL2Q7XG4gfTskaOKAjV9vbmNlLnJhdGlvVG9OdW1iZXIocmF0aW9Ub051bWJlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SXNSYXRpbyI6WyJhc3NlcnRJc1JhdGlvIl0sIm1ha2VSYXRpbyI6WyJtYWtlUmF0aW8iXSwibWFrZVJhdGlvRnJvbUFtb3VudHMiOlsibWFrZVJhdGlvRnJvbUFtb3VudHMiXSwiZmxvb3JNdWx0aXBseUJ5IjpbImZsb29yTXVsdGlwbHlCeSJdLCJjZWlsTXVsdGlwbHlCeSI6WyJjZWlsTXVsdGlwbHlCeSJdLCJtdWx0aXBseUJ5IjpbIm11bHRpcGx5QnkiXSwiZmxvb3JEaXZpZGVCeSI6WyJmbG9vckRpdmlkZUJ5Il0sImNlaWxEaXZpZGVCeSI6WyJjZWlsRGl2aWRlQnkiXSwiZGl2aWRlQnkiOlsiZGl2aWRlQnkiXSwiaW52ZXJ0UmF0aW8iOlsiaW52ZXJ0UmF0aW8iXSwiYWRkUmF0aW9zIjpbImFkZFJhdGlvcyJdLCJzdWJ0cmFjdFJhdGlvcyI6WyJzdWJ0cmFjdFJhdGlvcyJdLCJtdWx0aXBseVJhdGlvcyI6WyJtdWx0aXBseVJhdGlvcyJdLCJvbmVNaW51cyI6WyJvbmVNaW51cyJdLCJyYXRpb0dURSI6WyJyYXRpb0dURSJdLCJyYXRpb3NTYW1lIjpbInJhdGlvc1NhbWUiXSwicXVhbnRpemUiOlsicXVhbnRpemUiXSwicGFyc2VSYXRpbyI6WyJwYXJzZVJhdGlvIl0sImFzc2VydFBhcnNhYmxlTnVtYmVyIjpbImFzc2VydFBhcnNhYmxlTnVtYmVyIl0sInJhdGlvVG9OdW1iZXIiOlsicmF0aW9Ub051bWJlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADzPC5uOiYAADomAAAzAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbImRlZmluZUVSZWNvcmRlcktpdCIsImRlZmluZVJlY29yZGVyS2l0IiwicHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyIsInByZXBhcmVSZWNvcmRlciIsInByZXBhcmVSZWNvcmRlcktpdCIsInByZXBhcmVSZWNvcmRlcktpdE1ha2VycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYWlsLFN0b3JhZ2VOb2RlU2hhcGUscHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0LG1ha2VGYWtlTWFyc2hhbGxlcixtYWtlRmFrZVN0b3JhZ2UsbXVzdE1hdGNoLE0sbWFrZVNjYWxhckJpZ01hcFN0b3JlLHByZXBhcmVFeG9DbGFzcyxFOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIlN0b3JhZ2VOb2RlU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFN0b3JhZ2VOb2RlU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanNcIiwgW1tcIm1ha2VGYWtlTWFyc2hhbGxlclwiLCBbJGjigI1fYSA9PiAobWFrZUZha2VNYXJzaGFsbGVyID0gJGjigI1fYSldXSxbXCJtYWtlRmFrZVN0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VGYWtlU3RvcmFnZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIFJlY29yZGVycyBzdXBwb3J0IHB1Ymxpc2hpbmcgZGF0YSB0byB2c3RvcmFnZS5cbiAqXG4gKiBgUmVjb3JkZXJgIGlzIHNpbWlsYXIgdG8gYFB1Ymxpc2hlcmAgKGluIHRoYXQgdGhleSBzZW5kIG91dCBkYXRhKSBidXQgaGFzIGRpZmZlcmVudCBzaWduYXR1cmVzOlxuICogLSBtZXRob2RzIGFyZSBhc3luYyBiZWNhdXNlIHRoZXkgYXdhaXQgcmVtb3RlIGNhbGxzIHRvIE1hcnNoYWxsZXIgYW5kIFN0b3JhZ2VOb2RlXG4gKiAtIG1ldGhvZCBuYW1lcyBjb252ZXkgdGhlIGR1cmFiaWxpdHlcbiAqIC0gb21pdHMgZmFpbCgpXG4gKiAtIGFkZHMgZ2V0U3RvcmFnZU5vZGUoKSBmcm9tIGl0cyBkdXJhYmxlIHN0YXRlXG4gKlxuICogT3RoZXIgbmFtZXMgc3VjaCBhcyBTdG9yZWRQdWJsaXNoZXIgb3IgQ2hhaW5TdG9yYWdlUHVibGlzaGVyIHdlcmUgY29uc2lkZXJlZCwgYnV0IGZvdW5kIHRvIGJlIHNvbWV0aW1lcyBjb25mdXNlZCB3aXRoICpkdXJhYmlsaXR5KiwgYW5vdGhlciB0cmFpdCBvZiB0aGlzIGNsYXNzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7IGdldFN0b3JhZ2VOb2RlKCk6IFN0b3JhZ2VOb2RlLCBnZXRTdG9yYWdlUGF0aCgpOiBQcm9taXNlPHN0cmluZz4sIHdyaXRlKHZhbHVlOiBUKTogUHJvbWlzZTx2b2lkPiwgd3JpdGVGaW5hbCh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4gfX0gUmVjb3JkZXJcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7UGljazxQdWJsaXNoS2l0PFQ+LCAnc3Vic2NyaWJlcic+ICYgeyByZWNvcmRlcjogUmVjb3JkZXI8VD4gfX0gUmVjb3JkZXJLaXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7UGljazxQdWJsaXNoS2l0PFQ+LCAnc3Vic2NyaWJlcic+ICYgeyByZWNvcmRlclA6IEVSZWY8UmVjb3JkZXI8VD4+IH19IEV2ZW50dWFsUmVjb3JkZXJLaXRcbiAqL1xuXG4vKipcbiAqIFdyYXAgYSBQdWJsaXNoZXIgdG8gcmVjb3JkIGFsbCB0aGUgdmFsdWVzIHRvIGNoYWluIHN0b3JhZ2UuXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3pvZScpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZVJlY29yZGVyPShiYWdnYWdlLG1hcnNoYWxsZXIpPT57XG5jb25zdCBtYWtlUmVjb3JkZXI9cHJlcGFyZUV4b0NsYXNzKFxuYmFnZ2FnZSxcbidSZWNvcmRlcicsXG5NLmludGVyZmFjZSgnUmVjb3JkZXInLHtcbmdldFN0b3JhZ2VOb2RlOk0uY2FsbCgpLnJldHVybnMoU3RvcmFnZU5vZGVTaGFwZSksXG5nZXRTdG9yYWdlUGF0aDpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbndyaXRlOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbndyaXRlRmluYWw6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpfSksXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDxUPlsncHVibGlzaGVyJ119IHB1Ymxpc2hlclxuICogQHBhcmFtIHtTdG9yYWdlTm9kZX0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7VHlwZWRNYXRjaGVyPFQ+fSBbdmFsdWVTaGFwZV1cbiAqL1xuKFxucHVibGlzaGVyLFxuc3RvcmFnZU5vZGUsXG52YWx1ZVNoYXBlPS8qKiBAdHlwZSB7VHlwZWRNYXRjaGVyPGFueT59ICovTS5hbnkoKSk9Plxue1xucmV0dXJue1xuY2xvc2VkOmZhbHNlLFxucHVibGlzaGVyLFxuc3RvcmFnZU5vZGUsXG5zdG9yYWdlUGF0aDovKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi91bmRlZmluZWQsXG52YWx1ZVNoYXBlfTtcblxuIH0sXG57XG5nZXRTdG9yYWdlTm9kZSgpe1xucmV0dXJuIHRoaXMuc3RhdGUuc3RvcmFnZU5vZGU7XG4gfSxcbi8qKlxuICogTWVtb2l6ZXMgdGhlIHJlbW90ZSBjYWxsIHRvIHRoZSBzdG9yYWdlIG5vZGVcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICovXG4gICAgICBhc3luYyBnZXRTdG9yYWdlUGF0aCgpe1xuY29uc3R7c3RvcmFnZVBhdGg6aGVsZFBhdGh9PXRoaXMuc3RhdGU7XG4vKiBlbmQgc3luY2hyb25vdXMgcHJlbHVkZSovXG5hd2FpdCBudWxsO1xuaWYoaGVsZFBhdGghPT11bmRlZmluZWQpe1xucmV0dXJuIGhlbGRQYXRoO1xuIH1cbmNvbnN0IHBhdGg9YXdhaXQgRSh0aGlzLnN0YXRlLnN0b3JhZ2VOb2RlKS5nZXRQYXRoKCk7XG50aGlzLnN0YXRlLnN0b3JhZ2VQYXRoPXBhdGg7XG5yZXR1cm4gcGF0aDtcbiB9LFxuLyoqXG4gKiBNYXJzaGFsbHMgYmVmb3JlIHdyaXRpbmcgdG8gc3RvcmFnZSBvciBwdWJsaXNoZXIgdG8gaGVscCBlbnN1cmUgdGhlIHR3byBzdHJlYW1zIG1hdGNoLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICBhc3luYyB3cml0ZSh2YWx1ZSl7XG5jb25zdHtjbG9zZWQscHVibGlzaGVyLHN0b3JhZ2VOb2RlLHZhbHVlU2hhcGV9PXRoaXMuc3RhdGU7XG4hY2xvc2VkfHxGYWlsIGBjYW5ub3Qgd3JpdGUgdG8gY2xvc2VkIHJlY29yZGVyYDtcbm11c3RNYXRjaCh2YWx1ZSx2YWx1ZVNoYXBlKTtcbmNvbnN0IGVuY29kZWQ9YXdhaXQgRShtYXJzaGFsbGVyKS50b0NhcERhdGEodmFsdWUpO1xuY29uc3Qgc2VyaWFsaXplZD1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbmF3YWl0IEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKHNlcmlhbGl6ZWQpO1xuXG4vKiBiZWxvdyBoZXJlIGRpZmZlcnMgZnJvbSB3cml0ZUZpbmFsKCkqL1xucmV0dXJuIHB1Ymxpc2hlci5wdWJsaXNoKHZhbHVlKTtcbiB9LFxuLyoqXG4gKiBMaWtlIGB3cml0ZWAgYnV0IHByZXZlbnRzIGZ1dHVyZSB3cml0ZXMgYW5kIHRlcm1pbmF0ZXMgdGhlIHB1Ymxpc2hlci5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuICAgICAgYXN5bmMgd3JpdGVGaW5hbCh2YWx1ZSl7XG5jb25zdHtjbG9zZWQscHVibGlzaGVyLHN0b3JhZ2VOb2RlLHZhbHVlU2hhcGV9PXRoaXMuc3RhdGU7XG4hY2xvc2VkfHxGYWlsIGBjYW5ub3Qgd3JpdGUgdG8gY2xvc2VkIHJlY29yZGVyYDtcbm11c3RNYXRjaCh2YWx1ZSx2YWx1ZVNoYXBlKTtcbmNvbnN0IGVuY29kZWQ9YXdhaXQgRShtYXJzaGFsbGVyKS50b0NhcERhdGEodmFsdWUpO1xuY29uc3Qgc2VyaWFsaXplZD1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbmF3YWl0IEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKHNlcmlhbGl6ZWQpO1xuXG4vKiBiZWxvdyBoZXJlIGRpZmZlcnMgZnJvbSB3cml0ZUZpbmFsKCkqL1xudGhpcy5zdGF0ZS5jbG9zZWQ9dHJ1ZTtcbnJldHVybiBwdWJsaXNoZXIuZmluaXNoKHZhbHVlKTtcbiB9fSk7XG5cblxuXG5yZXR1cm4gbWFrZVJlY29yZGVyO1xuIH07JGjigI1fb25jZS5wcmVwYXJlUmVjb3JkZXIocHJlcGFyZVJlY29yZGVyKTtcbmhhcmRlbihwcmVwYXJlUmVjb3JkZXIpO1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlUmVjb3JkZXI+fSBNYWtlUmVjb3JkZXIgKi9cblxuLyoqXG4gKiBgbWFrZVJlY29yZGVyS2l0YCBpcyBzdWl0YWJsZSBmb3IgbWFraW5nIGEgZHVyYWJsZSBgUmVjb3JkZXJLaXRgIHdoaWNoIGNhbiBiZSBoZWxkIGluIEV4byBzdGF0ZS5cbiAqXG4gKiBAc2VlIHtkZWZpbmVFUmVjb3JkZXJLaXR9XG4gKlxuICogQHBhcmFtIHt7bWFrZVJlY29yZGVyOiBNYWtlUmVjb3JkZXIsIG1ha2VEdXJhYmxlUHVibGlzaEtpdDogUmV0dXJuVHlwZTx0eXBlb2YgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Pn19IG1ha2Vyc1xuICovXG5jb25zdCAgICAgICAgZGVmaW5lUmVjb3JkZXJLaXQ9KHttYWtlUmVjb3JkZXIsbWFrZUR1cmFibGVQdWJsaXNoS2l0fSk9Pntcbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3RvcmFnZU5vZGV9IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge1R5cGVkTWF0Y2hlcjxUPn0gW3ZhbHVlU2hhcGVdXG4gKiBAcmV0dXJucyB7UmVjb3JkZXJLaXQ8VD59XG4gKi9cbmNvbnN0IG1ha2VSZWNvcmRlcktpdD0oc3RvcmFnZU5vZGUsdmFsdWVTaGFwZSk9PntcbmNvbnN0e3N1YnNjcmliZXIscHVibGlzaGVyfT1tYWtlRHVyYWJsZVB1Ymxpc2hLaXQoKTtcbmNvbnN0IHJlY29yZGVyPW1ha2VSZWNvcmRlcihwdWJsaXNoZXIsc3RvcmFnZU5vZGUsdmFsdWVTaGFwZSk7XG5yZXR1cm4gaGFyZGVuKHtzdWJzY3JpYmVyLHJlY29yZGVyfSk7XG4gfTtcbnJldHVybiBtYWtlUmVjb3JkZXJLaXQ7XG4gfTtcbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgZGVmaW5lUmVjb3JkZXJLaXQ+fSBNYWtlUmVjb3JkZXJLaXQgKi9cblxuLyoqXG4gKiBgbWFrZUVSZWNvcmRlcktpdGAgaXMgZm9yIGNsb3N1cmVzIHRoYXQgbXVzdCByZXR1cm4gYSBgc3Vic2NyaWJlcmAgc3luY2hyb25vdXNseSBidXQgY2FuIGRlZmVyIHRoZSBgcmVjb3JkZXJgLlxuICpcbiAqIEBzZWUge2RlZmluZVJlY29yZGVyS2l0fVxuICpcbiAqIEBwYXJhbSB7e21ha2VSZWNvcmRlcjogTWFrZVJlY29yZGVyLCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQ6IFJldHVyblR5cGU8dHlwZW9mIHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdD59fSBtYWtlcnNcbiAqLyRo4oCNX29uY2UuZGVmaW5lUmVjb3JkZXJLaXQoZGVmaW5lUmVjb3JkZXJLaXQpO1xuY29uc3QgICAgICAgIGRlZmluZUVSZWNvcmRlcktpdD0oe21ha2VSZWNvcmRlcixtYWtlRHVyYWJsZVB1Ymxpc2hLaXR9KT0+e1xuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVQXG4gKiBAcGFyYW0ge1R5cGVkTWF0Y2hlcjxUPn0gW3ZhbHVlU2hhcGVdXG4gKiBAcmV0dXJucyB7RXZlbnR1YWxSZWNvcmRlcktpdDxUPn1cbiAqL1xuY29uc3QgbWFrZUVSZWNvcmRlcktpdD0oc3RvcmFnZU5vZGVQLHZhbHVlU2hhcGUpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZUR1cmFibGVQdWJsaXNoS2l0KCk7XG5jb25zdCByZWNvcmRlclA9RS53aGVuKHN0b3JhZ2VOb2RlUCwoc3RvcmFnZU5vZGUpPT5cbm1ha2VSZWNvcmRlcihwdWJsaXNoZXIsc3RvcmFnZU5vZGUsdmFsdWVTaGFwZSkpO1xuXG5yZXR1cm57c3Vic2NyaWJlcixyZWNvcmRlclB9O1xuIH07XG5yZXR1cm4gbWFrZUVSZWNvcmRlcktpdDtcbiB9OyRo4oCNX29uY2UuZGVmaW5lRVJlY29yZGVyS2l0KGRlZmluZUVSZWNvcmRlcktpdCk7XG5oYXJkZW4oZGVmaW5lRVJlY29yZGVyS2l0KTtcbi8qKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTx0eXBlb2YgZGVmaW5lRVJlY29yZGVyS2l0Pn0gTWFrZUVSZWNvcmRlcktpdCAqL1xuXG4vKipcbiAqIENvbnZlbmllbmNlIHdyYXBwZXIgdG8gcHJlcGFyZSB0aGUgRHVyYWJsZVB1Ymxpc2hLaXQgYW5kIFJlY29yZGVyIGtpbmRzLlxuICogTm90ZSB0aGF0IGJlY2F1c2UgcHJlcGFyZVJlY29yZGVyKCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIGJhZ2dhZ2UsXG4gKiB0aGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiB0aGVyZSBpcyBubyBuZWVkIGZvciBhbiBFdmVudHVhbFJlY29yZGVyS2l0LlxuICogV2hlbiB0aGVyZSBpcywgcHJlcGFyZSB0aGUga2luZHMgc2VwYXJhdGVseSBhbmQgcGFzcyB0byB0aGUga2l0IGRlZmluZXJzLlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZVJlY29yZGVyS2l0PShiYWdnYWdlLG1hcnNoYWxsZXIpPT57XG5jb25zdCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQ9cHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuYmFnZ2FnZSxcbidEdXJhYmxlIFB1Ymxpc2ggS2l0Jyk7XG5cbmNvbnN0IG1ha2VSZWNvcmRlcj1wcmVwYXJlUmVjb3JkZXIoYmFnZ2FnZSxtYXJzaGFsbGVyKTtcbnJldHVybiBkZWZpbmVSZWNvcmRlcktpdCh7bWFrZUR1cmFibGVQdWJsaXNoS2l0LG1ha2VSZWNvcmRlcn0pO1xuIH07XG5cbi8qKlxuICogQ29udmVuaWVuY2Ugd3JhcHBlciBmb3IgRHVyYWJsZVB1Ymxpc2hLaXQgYW5kIFJlY29yZGVyIGtpbmRzLlxuICpcbiAqIE5COiB0aGlzIGRlZmluZXMgdHdvIGR1cmFibGUga2luZHMuIE11c3QgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBwZXIgYmFnZ2FnZS5cbiAqXG4gKiBgbWFrZVJlY29yZGVyS2l0YCBpcyBzdWl0YWJsZSBmb3IgbWFraW5nIGEgZHVyYWJsZSBgUmVjb3JkZXJLaXRgIHdoaWNoIGNhbiBiZSBoZWxkIGluIEV4byBzdGF0ZS5cbiAqIGBtYWtlRVJlY29yZGVyS2l0YCBpcyBmb3IgY2xvc3VyZXMgdGhhdCBtdXN0IHJldHVybiBhIGBzdWJzY3JpYmVyYCBzeW5jaHJvbm91c2x5IGJ1dCBjYW4gZGVmZXIgdGhlIGByZWNvcmRlcmAuXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKi8kaOKAjV9vbmNlLnByZXBhcmVSZWNvcmRlcktpdChwcmVwYXJlUmVjb3JkZXJLaXQpO1xuY29uc3QgICAgICAgIHByZXBhcmVSZWNvcmRlcktpdE1ha2Vycz0oYmFnZ2FnZSxtYXJzaGFsbGVyKT0+e1xuY29uc3QgbWFrZUR1cmFibGVQdWJsaXNoS2l0PXByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChcbmJhZ2dhZ2UsXG4nRHVyYWJsZSBQdWJsaXNoIEtpdCcpO1xuXG5jb25zdCBtYWtlUmVjb3JkZXI9cHJlcGFyZVJlY29yZGVyKGJhZ2dhZ2UsbWFyc2hhbGxlcik7XG5cbmNvbnN0IG1ha2VSZWNvcmRlcktpdD1kZWZpbmVSZWNvcmRlcktpdCh7XG5tYWtlUmVjb3JkZXIsXG5tYWtlRHVyYWJsZVB1Ymxpc2hLaXR9KTtcblxuY29uc3QgbWFrZUVSZWNvcmRlcktpdD1kZWZpbmVFUmVjb3JkZXJLaXQoe1xubWFrZVJlY29yZGVyLFxubWFrZUR1cmFibGVQdWJsaXNoS2l0fSk7XG5cblxucmV0dXJue1xubWFrZUR1cmFibGVQdWJsaXNoS2l0LFxubWFrZVJlY29yZGVyLFxubWFrZVJlY29yZGVyS2l0LFxubWFrZUVSZWNvcmRlcktpdH07XG5cbiB9O1xuXG4vKipcbiAqIEZvciB1c2UgaW4gdGVzdHNcbiAqLyRo4oCNX29uY2UucHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKHByZXBhcmVSZWNvcmRlcktpdE1ha2Vycyk7XG5jb25zdCAgICAgICAgcHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2Vycz0oKT0+e1xuY29uc3QgYmFnZ2FnZT1tYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ21vY2sgcmVjb3JkZXIgYmFnZ2FnZScpO1xuY29uc3QgbWFyc2hhbGxlcj1tYWtlRmFrZU1hcnNoYWxsZXIoKTtcbnJldHVybntcbi4uLnByZXBhcmVSZWNvcmRlcktpdE1ha2VycyhiYWdnYWdlLG1hcnNoYWxsZXIpLFxuc3RvcmFnZU5vZGU6bWFrZUZha2VTdG9yYWdlKCdtb2NrIHJlY29yZGVyIHN0b3JhZ2UnKX07XG5cbiB9O1xuXG4vKipcbiAqIFN0b3AtZ2FwIHVudGlsIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjE2MFxuICogZXhwbGljdGx5IHNwZWNpZnkgdGhlIHR5cGUgdGhhdCB0aGUgUGF0dGVybiB3aWxsIHZlcmlmeSB0aHJvdWdoIGEgbWF0Y2guXG4gKlxuICogVGhpcyBpcyBhIFBhdHRlcm4gYnV0IHNpbmNlIHRoYXQncyBgYW55YCwgaW5jbHVkaW5nIGluIHRoZSB0eXBlZGVmIHR1cm5zIHRoZVxuICogd2hvbGUgdGhpbmcgdG8gYGFueWAuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7IHZhbGlkYXRlZFR5cGU/OiBUIH19IFR5cGVkTWF0Y2hlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtUeXBlZE1hdGNoZXI8YW55Pn0gVE1cbiAqIEB0eXBlZGVmIHtUTSBleHRlbmRzIFR5cGVkTWF0Y2hlcjxpbmZlciBUPiA/IFQgOiBuZXZlcn0gTWF0Y2hlZFR5cGVcbiAqLyRo4oCNX29uY2UucHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyhwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUmVjb3JkZXIiOlsicHJlcGFyZVJlY29yZGVyIl0sImRlZmluZVJlY29yZGVyS2l0IjpbImRlZmluZVJlY29yZGVyS2l0Il0sImRlZmluZUVSZWNvcmRlcktpdCI6WyJkZWZpbmVFUmVjb3JkZXJLaXQiXSwicHJlcGFyZVJlY29yZGVyS2l0IjpbInByZXBhcmVSZWNvcmRlcktpdCJdLCJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMiOlsicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIl0sInByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMiOlsicHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADoaR+3tgYAALYGAAAzAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3NhZmVNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm5hdFNhZmVNYXRoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKiBAdHlwZWRlZiB7KHg6IG51bWJlciB8IGJpZ2ludCwgeTogbnVtYmVyIHwgYmlnaW50KSA9PiBOYXRWYWx1ZX0gTmF0T3AgKi9cblxuLyoqXG4gKiBUaGVzZSBvcGVyYXRpb25zIHNob3VsZCBiZSB1c2VkIGZvciBjYWxjdWxhdGlvbnMgd2l0aCB0aGUgdmFsdWVzIG9mXG4gKiBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogbmF0U2FmZU1hdGggaXMgZGVzaWduZWQgdG8gYmUgdXNlZCBkaXJlY3RseSwgYW5kIHNvIGl0IG5lZWRzIHRvXG4gKiB2YWxpZGF0ZSB0aGUgaW5wdXRzLCBhcyB3ZWxsIGFzIHRoZSBvdXRwdXRzIHdoZW4gbmVjZXNzYXJ5LlxuICovXG5jb25zdCAgICAgICAgbmF0U2FmZU1hdGg9aGFyZGVuKHtcbi8qKiBAdHlwZSB7TmF0T3B9ICovXG4vKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuYWRkOih4LHkpPT5OYXQoeCkrTmF0KHkpLFxuLyoqIEB0eXBlIHtOYXRPcH0gKi9cbnN1YnRyYWN0Oih4LHkpPT5OYXQoTmF0KHgpLU5hdCh5KSksXG4vKiogQHR5cGUge05hdE9wfSAqL1xubXVsdGlwbHk6KHgseSk9Pk5hdCh4KSpOYXQoeSksXG4vKiogQHR5cGUge05hdE9wfSAqL1xuZmxvb3JEaXZpZGU6KHgseSk9Pk5hdCh4KS9OYXQoeSksXG4vKiogQHR5cGUge05hdE9wfSAqL1xuY2VpbERpdmlkZTooeCx5KT0+e1xueT1OYXQoeSk7XG5yZXR1cm4gTmF0KE5hdCh4KSt5LTFuKS95O1xuIH0sXG4vKipcbiAqIERpdmlkZSB1c2luZyBoYWxmLXRvLWV2ZW4gKGFrYSBCYW5rZXIncyBSb3VuZGluZykgYXMgaW4gSUVFRSA3NzQgZGVmYXVsdCByb3VuZGluZ1xuICpcbiAqIEB0eXBlIHtOYXRPcH1cbiAqL1xuYmFua2Vyc0RpdmlkZTooYSxiKT0+e1xuYT1OYXQoYSk7XG5iPU5hdChiKTtcblxuY29uc3QgZGl2PWEvYjtcbmNvbnN0IHJlbT1hJWI7XG4vKiBpZiByZW1haW5kZXIgPiBoYWxmIGRpdmlzb3IsIHNob3VsZCBoYXZlIHJvdW5kZWQgdXAgaW5zdGVhZCBvZiBkb3duLCBzbyBhZGQgMSovXG5pZihyZW0qMm4+Yil7XG5yZXR1cm4gZGl2KzFuO1xuIH1lbHNlIGlmKHJlbSoybj09PWIpe1xuLyogQWRkIDEgaWYgcmVzdWx0IGlzIG9kZCB0byBnZXQgYW4gZXZlbiByZXR1cm4gdmFsdWUqL1xuaWYoZGl2JTJuPT09MW4pcmV0dXJuIGRpdisxbjtcbiB9XG5yZXR1cm4gZGl2O1xuIH0sXG4vKiogQHR5cGUgeyh4OiBudW1iZXIgfCBiaWdpbnQsIHk6IG51bWJlciB8IGJpZ2ludCkgPT4gYm9vbGVhbn0gKi9cbmlzR1RFOih4LHkpPT5OYXQoeCk+PU5hdCh5KX0pOyRo4oCNX29uY2UubmF0U2FmZU1hdGgobmF0U2FmZU1hdGgpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdFNhZmVNYXRoIjpbIm5hdFNhZmVNYXRoIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGuDGguaBAAAmgQAADcAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvYXNzZXJ0Il0sImV4cG9ydHMiOlsibWFrZVN0YXRlTWFjaGluZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImFzc2VydFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qIGFsbG93ZWRUcmFuc2l0aW9ucyBpcyBhbiBhcnJheSBvZiBhcnJheXMgd2hpY2ggZ2V0cyB0dXJuZWQgaW50byBhXG4gKiBtYXAuIFRoZSBtYXAgbWFwcyBzdHJpbmcgc3RhdGVzIHRvIGFuIGFycmF5IG9mIHBvdGVudGlhbCBuZXh0XG4gKiBzdGF0ZXMuIEZvciBleGFtcGxlLFxuICogY29uc3QgYWxsb3dlZFRyYW5zaXRpb25zID0gW1xuIFsnb3BlbicsIFsnY2xvc2VkJ11dLFxuIFsnY2xvc2VkJywgW11dLFxuICogXTtcbiovXG5jb25zdCBtYWtlU3RhdGVNYWNoaW5lPShpbml0aWFsU3RhdGUsYWxsb3dlZFRyYW5zaXRpb25zQXJyYXkpPT57XG5sZXQgc3RhdGU9aW5pdGlhbFN0YXRlO1xuY29uc3QgYWxsb3dlZFRyYW5zaXRpb25zPW5ldyBNYXAoYWxsb3dlZFRyYW5zaXRpb25zQXJyYXkpO1xucmV0dXJuIGhhcmRlbih7XG5jYW5UcmFuc2l0aW9uVG86KG5leHRTdGF0ZSk9PlxuYWxsb3dlZFRyYW5zaXRpb25zLmdldChzdGF0ZSkuaW5jbHVkZXMobmV4dFN0YXRlKSxcbnRyYW5zaXRpb25UbzoobmV4dFN0YXRlKT0+e1xuYXNzZXJ0KGFsbG93ZWRUcmFuc2l0aW9ucy5nZXQoc3RhdGUpLmluY2x1ZGVzKG5leHRTdGF0ZSkpO1xuc3RhdGU9bmV4dFN0YXRlO1xuIH0sXG5nZXRTdGF0dXM6KF8pPT5zdGF0ZX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdGF0ZU1hY2hpbmUobWFrZVN0YXRlTWFjaGluZSk7XG5oYXJkZW4obWFrZVN0YXRlTWFjaGluZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN0YXRlTWFjaGluZSI6WyJtYWtlU3RhdGVNYWNoaW5lIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH5taW1/BQAAfwUAADUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiY2FsY3VsYXRlTWVkaWFuIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gVHlwZWRNYXRoXG4gKiBAcHJvcGVydHkgeyhhOiBULCBiOiBUKSA9PiBUfSBhZGRcbiAqIEBwcm9wZXJ0eSB7KGE6IFQsIGI6IGJpZ2ludCkgPT4gVH0gZGl2aWRlXG4gKiBAcHJvcGVydHkgeyhhOiBULCBiOiBUKSA9PiBib29sZWFufSBpc0dURVxuICovXG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBtZWRpYW4gb2YgYSBzZXQgb2Ygc2FtcGxlc1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0FycmF5PFQ+fSBzYW1wbGVzIHRoZSBpbnB1dCBtZWFzdXJlbWVudHNcbiAqIEBwYXJhbSB7VHlwZWRNYXRoPFQ+fSBtYXRoXG4gKiBAcmV0dXJucyB7VCB8IHVuZGVmaW5lZH0gdGhlIG1lZGlhbiAodW5kZWZpbmVkIGlmIG5vIHNhbXBsZXMpXG4gKi9cbmNvbnN0ICAgICAgICBjYWxjdWxhdGVNZWRpYW49KHNhbXBsZXMsbWF0aCk9PntcbmNvbnN0IHNvcnRlZD1zYW1wbGVzLnNvcnQoKGEsYik9PntcbmlmKCFtYXRoLmlzR1RFKGEsYikpe1xucmV0dXJuLTE7XG4gfWVsc2UgaWYoIW1hdGguaXNHVEUoYixhKSl7XG5yZXR1cm4gMTtcbiB9XG5yZXR1cm4gMDtcbiB9KTtcblxuaWYoc29ydGVkLmxlbmd0aD09PTApe1xuLyogTm8gdmFsaWQgc2FtcGxlcywgZG9uJ3QgcmVwb3J0IGFueXRoaW5nLiovXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cblxuaWYoc29ydGVkLmxlbmd0aCUyIT09MCl7XG4vKiBPZGQgbGVuZ3RoLCBqdXN0IHBpY2sgdGhlIG1pZGRsZSBlbGVtZW50LiovXG5yZXR1cm4gc29ydGVkWyhzb3J0ZWQubGVuZ3RoLTEpLzJdO1xuIH1cblxuLyogRXZlbiBsZW5ndGgsIHRha2UgdGhlIG1lYW4gb2YgdGhlIHR3byBtaWRkbGUgdmFsdWVzLiovXG5jb25zdCBzZWNvbmRJbmRleD1zb3J0ZWQubGVuZ3RoLzI7XG5jb25zdCBzdW09bWF0aC5hZGQoc29ydGVkW3NlY29uZEluZGV4LTFdLHNvcnRlZFtzZWNvbmRJbmRleF0pO1xucmV0dXJuIG1hdGguZGl2aWRlKHN1bSwybik7XG4gfTskaOKAjV9vbmNlLmNhbGN1bGF0ZU1lZGlhbihjYWxjdWxhdGVNZWRpYW4pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGN1bGF0ZU1lZGlhbiI6WyJjYWxjdWxhdGVNZWRpYW4iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPst9350HAACdBwAAMQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC90b3BpY3MuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJQdWJsaWNUb3BpY1NoYXBlIiwiU3Vic2NyaWJlclNoYXBlIiwiVG9waWNzUmVjb3JkU2hhcGUiLCJtYWtlUmVjb3JkZXJUb3BpYyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBTdWJzY3JpYmVyU2hhcGUsTSxFOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIlN1YnNjcmliZXJTaGFwZVwiLCBbJGjigI1fYSA9PiAoU3Vic2NyaWJlclNoYXBlID0gJGjigI1fYSksJGjigI1fbGl2ZVtcIlN1YnNjcmliZXJTaGFwZVwiXV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdCAgICAgICAgUHVibGljVG9waWNTaGFwZT1NLnNwbGl0UmVjb3JkKFxue1xuc3Vic2NyaWJlcjpTdWJzY3JpYmVyU2hhcGUsXG5zdG9yYWdlUGF0aDpNLnByb21pc2UoKX0sXG5cbntkZXNjcmlwdGlvbjpNLnN0cmluZygpfSk7XG5cblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gVCB0b3BpYyB2YWx1ZVxuICogQHR5cGVkZWYge3tcbiAqICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gKiAgIHN1YnNjcmliZXI6IFN1YnNjcmliZXI8VD4sXG4gKiAgIHN0b3JhZ2VQYXRoOiBFUmVmPHN0cmluZz4sXG4gKiB9fSBQdWJsaWNUb3BpY1xuICovJGjigI1fb25jZS5QdWJsaWNUb3BpY1NoYXBlKFB1YmxpY1RvcGljU2hhcGUpO1xuXG5jb25zdCAgICAgICAgVG9waWNzUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihNLnN0cmluZygpLFB1YmxpY1RvcGljU2hhcGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFt0b3BpY05hbWU6IHN0cmluZ106IFB1YmxpY1RvcGljPHVua25vd24+LFxuICogfX0gVG9waWNzUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vcmVjb3JkZXIuanMnKS5SZWNvcmRlcktpdDxUPiB8IFhpbXBvcnQoJy4vcmVjb3JkZXIuanMnKS5FdmVudHVhbFJlY29yZGVyS2l0PFQ+fSByZWNvcmRlcktpdFxuICogQHJldHVybnMge1B1YmxpY1RvcGljPFQ+fVxuICovJGjigI1fb25jZS5Ub3BpY3NSZWNvcmRTaGFwZShUb3BpY3NSZWNvcmRTaGFwZSk7XG5jb25zdCAgICAgICAgbWFrZVJlY29yZGVyVG9waWM9KGRlc2NyaXB0aW9uLHJlY29yZGVyS2l0KT0+e1xuY29uc3QgcmVjUD1cbidyZWNvcmRlcidpbiByZWNvcmRlcktpdD9yZWNvcmRlcktpdC5yZWNvcmRlcjpyZWNvcmRlcktpdC5yZWNvcmRlclA7XG5yZXR1cm57XG5kZXNjcmlwdGlvbixcbnN1YnNjcmliZXI6cmVjb3JkZXJLaXQuc3Vic2NyaWJlcixcbnN0b3JhZ2VQYXRoOkUocmVjUCkuZ2V0U3RvcmFnZVBhdGgoKX07XG5cbiB9OyRo4oCNX29uY2UubWFrZVJlY29yZGVyVG9waWMobWFrZVJlY29yZGVyVG9waWMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7IlN1YnNjcmliZXJTaGFwZSI6WyJTdWJzY3JpYmVyU2hhcGUiLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQdWJsaWNUb3BpY1NoYXBlIjpbIlB1YmxpY1RvcGljU2hhcGUiXSwiVG9waWNzUmVjb3JkU2hhcGUiOlsiVG9waWNzUmVjb3JkU2hhcGUiXSwibWFrZVJlY29yZGVyVG9waWMiOlsibWFrZVJlY29yZGVyVG9waWMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZQTCFtoLAADaCwAAMAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlYXRHYWluc0xvc3Nlc1JlY29yZFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcHJvcGVydHkge0Ftb3VudEtleXdvcmRSZWNvcmR9IGdhaW5zIC0gd2hhdCB0aGUgc2VhdCB3aWxsXG4gKiBnYWluIGFzIGEgcmVzdWx0IG9mIHRoaXMgdHJhZGVcbiAqIEBwcm9wZXJ0eSB7QW1vdW50S2V5d29yZFJlY29yZH0gbG9zc2VzIC0gd2hhdCB0aGUgc2VhdCBbd2lsbF1cbiAqIGdpdmUgdXAgYXMgYSByZXN1bHQgb2YgdGhpcyB0cmFkZS4gTG9zc2VzIGlzIG9wdGlvbmFsLCBidXQgY2FuXG4gKiBvbmx5IGJlIG9taXR0ZWQgaWYgdGhlIGtleXdvcmRzIGZvciBib3RoIHNlYXRzIGFyZSB0aGUgc2FtZS5cbiAqIElmIGxvc3NlcyBpcyBub3QgZGVmaW5lZCwgdGhlIGdhaW5zIG9mIHRoZSBvdGhlciBzZWF0IGlzXG4gKiBzdWJ0cmFjdGVkLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFN3YXBcbiAqIElmIHR3byBzZWF0cyBjYW4gc2F0aXNmeSBlYWNoIG90aGVyJ3Mgd2FudHMsIHRyYWRlIGVub3VnaCB0b1xuICogc2F0aXNmeSB0aGUgd2FudHMgb2YgYm90aCBzZWF0cyBhbmQgZXhpdCBib3RoIHNlYXRzLlxuICpcbiAqIFRoZSBzdXJwbHVzIHJlbWFpbnMgd2l0aCB0aGUgb3JpZ2luYWwgc2VhdC4gRm9yIGV4YW1wbGUgaWYgc2VhdCBBXG4gKiBnaXZlcyA1IG1vb2xhIGFuZCBzZWF0IEIgb25seSB3YW50cyAzIG1vb2xhLCBzZWF0IEEgcmV0YWlucyAyXG4gKiBtb29sYS5cbiAqXG4gKiBJZiB0aGUgc3dhcCBmYWlscywgbm8gYXNzZXRzIGFyZSB0cmFuc2ZlcnJlZCwgYm90aCBzZWF0cyB3aWxsIGZhaWwsXG4gKiBhbmQgdGhlIGZ1bmN0aW9uIHRocm93cy5cbiAqXG4gKiBUaGUga2V5d29yZHMgZm9yIGJvdGggc2VhdHMgbXVzdCBtYXRjaC5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGxlZnRTZWF0XG4gKiBAcGFyYW0ge1pDRlNlYXR9IHJpZ2h0U2VhdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTd2FwRXhhY3RcbiAqXG4gKiBTd2FwIHN1Y2ggdGhhdCBib3RoIHNlYXRzIGdhaW4gd2hhdCB0aGV5IHdhbnQgYW5kIGxvc2UgZXZlcnl0aGluZ1xuICogdGhhdCB0aGV5IGdhdmUuIE9ubHkgZ29vZCBmb3IgZXhhY3QgYW5kIGVudGlyZSBzd2FwcyB3aGVyZSBlYWNoXG4gKiBzZWF0IHdhbnRzIGV2ZXJ5dGhpbmcgdGhhdCB0aGUgb3RoZXIgc2VhdCBoYXMuIFRoZSBiZW5lZml0IG9mIHVzaW5nXG4gKiB0aGlzIG1ldGhvZCBpcyB0aGF0IHRoZSBrZXl3b3JkcyBvZiBlYWNoIHNlYXQgZG8gbm90IG1hdHRlci5cbiAqXG4gKiBJZiB0aGUgc3dhcCBmYWlscywgbm8gYXNzZXRzIGFyZSB0cmFuc2ZlcnJlZCwgYm90aCBzZWF0cyB3aWxsIGZhaWwsXG4gKiBhbmQgdGhlIGZ1bmN0aW9uIHRocm93cy5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGxlZnRTZWF0XG4gKiBAcGFyYW0ge1pDRlNlYXR9IHJpZ2h0U2VhdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCxLZXl3b3JkPn0gS2V5d29yZEtleXdvcmRSZWNvcmRcbiAqXG4gKiBBIG1hcHBpbmcgb2Yga2V5d29yZHMgdG8ga2V5d29yZHMuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmV2ZXJzZVxuICpcbiAqIEdpdmVuIGEgbWFwcGluZyBvZiBrZXl3b3JkcyB0byBrZXl3b3JkcywgaW52ZXJ0IHRoZSBrZXlzIGFuZFxuICogdmFsdWVzLiBUaGlzIGlzIHVzZWQgdG8gbWFwIHRoZSBvZmZlcnMgbWFkZSB0byBhbm90aGVyIGNvbnRyYWN0XG4gKiBiYWNrIHRvIHRoZSBrZXl3b3JkcyB1c2VkIGluIHRoZSBmaXJzdCBjb250cmFjdC5cbiAqIEBwYXJhbSB7S2V5d29yZEtleXdvcmRSZWNvcmR9IFtrZXl3b3JkUmVjb3JkXVxuICogQHJldHVybnMge0tleXdvcmRLZXl3b3JkUmVjb3JkIH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYXBLZXl3b3Jkc1xuICpcbiAqIFJlbWFwIHRoZSBrZXl3b3JkcyBvZiBhbiBhbW91bnRLZXl3b3JkUmVjb3JkLCBpc3N1ZXJLZXl3b3JkUmVjb3JkLCBvciBhXG4gKiBQYXltZW50UEtleXdvcmRSZWNvcmQgYWNjb3JkaW5nIHRvIGEgbWFwcGluZy4gVGhpcyBpcyB1c2VkIHRvIHJlbWFwXG4gKiBmcm9tIGtleXdvcmRzIHVzZWQgaW4gY29udHJhY3RBIHRvIGtleXdvcmRzIHVzZWQgaW4gY29udHJhY3RCIGFuZFxuICogdmljZSB2ZXJzYSBpbiBgb2ZmZXJUb2BcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmQgfCBQYXltZW50UEtleXdvcmRSZWNvcmQgfCBJc3N1ZXJLZXl3b3JkUmVjb3JkIHwgdW5kZWZpbmVkIH0ga2V5d29yZFJlY29yZFxuICogQHBhcmFtIHtLZXl3b3JkS2V5d29yZFJlY29yZH0ga2V5d29yZE1hcHBpbmdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhdGlvXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IG51bWVyYXRvclxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBkZW5vbWluYXRvclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNjYWxlQW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGb5+fFWOAAAVjgAADUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi9jb250cmFjdEZhY2V0L29mZmVyU2FmZXR5LmpzIiwiLi9hdG9taWNUcmFuc2Zlci5qcyIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXNzZXJ0SXNzdWVyS2V5d29yZHMiLCJhc3NlcnROYXRBc3NldEtpbmQiLCJhc3NlcnRQcm9wb3NhbFNoYXBlIiwiZGVmYXVsdEFjY2VwdGFuY2VNc2ciLCJkZXBvc2l0VG9TZWF0IiwiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciLCJmaXRQcm9wb3NhbFNoYXBlIiwibWFwS2V5d29yZHMiLCJvZmZlclRvIiwic2F0aXNmaWVzIiwic2F2ZUFsbElzc3VlcnMiLCJzd2FwIiwic3dhcEV4YWN0Iiwid2l0aGRyYXdGcm9tU2VhdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtdXN0TWF0Y2gsa2V5RVEsRSxtYWtlUHJvbWlzZUtpdCxBc3NldEtpbmQsZnJvbVVuaXF1ZUVudHJpZXMsc2F0aXNmaWVzV2FudCxhdG9taWNUcmFuc2Zlcixmcm9tT25seSx0b09ubHk7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBc3NldEtpbmRcIiwgWyRo4oCNX2EgPT4gKEFzc2V0S2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJmcm9tVW5pcXVlRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc1wiLCBbW1wic2F0aXNmaWVzV2FudFwiLCBbJGjigI1fYSA9PiAoc2F0aXNmaWVzV2FudCA9ICRo4oCNX2EpXV1dXSxbXCIuL2F0b21pY1RyYW5zZmVyLmpzXCIsIFtbXCJhdG9taWNUcmFuc2ZlclwiLCBbJGjigI1fYSA9PiAoYXRvbWljVHJhbnNmZXIgPSAkaOKAjV9hKV1dLFtcImZyb21Pbmx5XCIsIFskaOKAjV9hID0+IChmcm9tT25seSA9ICRo4oCNX2EpXV0sW1widG9Pbmx5XCIsIFskaOKAjV9hID0+ICh0b09ubHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3QgICAgICAgIGRlZmF1bHRBY2NlcHRhbmNlTXNnPSBgVGhlIG9mZmVyIGhhcyBiZWVuIGFjY2VwdGVkLiBPbmNlIHRoZSBjb250cmFjdCBoYXMgYmVlbiBjb21wbGV0ZWQsIHBsZWFzZSBjaGVjayB5b3VyIHBheW91dGA7JGjigI1fb25jZS5kZWZhdWx0QWNjZXB0YW5jZU1zZyhkZWZhdWx0QWNjZXB0YW5jZU1zZyk7XG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuY29uc3QgZ2V0S2V5c1NvcnRlZD0ob2JqKT0+aGFyZGVuKFJlZmxlY3Qub3duS2V5cyhvYmp8fHt9KS5zb3J0KCkpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0SXNzdWVyS2V5d29yZHM9KHpjZixleHBlY3RlZCk9PntcbmNvbnN0e2lzc3VlcnN9PXpjZi5nZXRUZXJtcygpO1xuY29uc3QgYWN0dWFsPWdldEtleXNTb3J0ZWQoaXNzdWVycyk7XG5leHBlY3RlZD1bLi4uZXhwZWN0ZWRdOy8qIGluIGNhc2UgaGFyZGVuZWQqL1xuZXhwZWN0ZWQuc29ydCgpO1xua2V5RVEoYWN0dWFsLGhhcmRlbihleHBlY3RlZCkpfHxcbkZhaWwgYGtleXdvcmRzOiAke2FjdHVhbH0gd2VyZSBub3QgYXMgZXhwZWN0ZWQ6ICR7ZXhwZWN0ZWR9YDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpjZlNlYXRQYXJ0aWFsXG4gKiBAcHJvcGVydHkgeygpID0+IFByb3Bvc2FsUmVjb3JkfSBnZXRQcm9wb3NhbFxuICogQHByb3BlcnR5IHsoKSA9PiBBbGxvY2F0aW9ufSBnZXRDdXJyZW50QWxsb2NhdGlvblxuICovXG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhbiB1cGRhdGUgdG8gY3VycmVudEFsbG9jYXRpb24gc2F0aXNmaWVzXG4gKiBwcm9wb3NhbC53YW50LiBOb3RlIHRoYXQgdGhpcyBpcyBoYWxmIG9mIHRoZSBvZmZlciBzYWZldHlcbiAqIGNoZWNrOyB3aGV0aGVyIHRoZSBhbGxvY2F0aW9uIGNvbnN0aXR1dGVzIGEgcmVmdW5kIGlzIG5vdFxuICogY2hlY2tlZC4gVGhlIHVwZGF0ZSBpcyBtZXJnZWQgd2l0aCBjdXJyZW50QWxsb2NhdGlvblxuICogKHVwZGF0ZSdzIHZhbHVlcyBwcmV2YWlsaW5nIGlmIHRoZSBrZXl3b3JkcyBhcmUgdGhlIHNhbWUpXG4gKiB0byBwcm9kdWNlIHRoZSBuZXdBbGxvY2F0aW9uLiBUaGUgcmV0dXJuIHZhbHVlIGlzIDAgZm9yXG4gKiBmYWxzZSBhbmQgMSBmb3IgdHJ1ZS4gV2hlbiBtdWx0aXBsZXMgYXJlIGludHJvZHVjZWQsIGFueVxuICogcG9zaXRpdmUgcmV0dXJuIHZhbHVlIHdpbGwgbWVhbiB0cnVlLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WmNmU2VhdFBhcnRpYWx9IHNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gdXBkYXRlXG4gKiBAcmV0dXJucyB7MHwxfVxuICovJGjigI1fb25jZS5hc3NlcnRJc3N1ZXJLZXl3b3Jkcyhhc3NlcnRJc3N1ZXJLZXl3b3Jkcyk7XG5jb25zdCAgICAgICAgc2F0aXNmaWVzPSh6Y2Ysc2VhdCx1cGRhdGUpPT57XG5jb25zdCBjdXJyZW50QWxsb2NhdGlvbj1zZWF0LmdldEN1cnJlbnRBbGxvY2F0aW9uKCk7XG5jb25zdCBuZXdBbGxvY2F0aW9uPXsuLi5jdXJyZW50QWxsb2NhdGlvbiwuLi51cGRhdGV9O1xuY29uc3QgcHJvcG9zYWw9c2VhdC5nZXRQcm9wb3NhbCgpO1xucmV0dXJuIHNhdGlzZmllc1dhbnQocHJvcG9zYWwsbmV3QWxsb2NhdGlvbik7XG4gfTtcblxuLyoqIEB0eXBlIHtTd2FwfSAqLyRo4oCNX29uY2Uuc2F0aXNmaWVzKHNhdGlzZmllcyk7XG5jb25zdCAgICAgICAgc3dhcD0oemNmLGxlZnRTZWF0LHJpZ2h0U2VhdCk9PntcbnRyeXtcbnpjZi5hdG9taWNSZWFycmFuZ2UoXG5oYXJkZW4oW1xuW3JpZ2h0U2VhdCxsZWZ0U2VhdCxsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnRdLFxuW2xlZnRTZWF0LHJpZ2h0U2VhdCxyaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50XV0pKTtcblxuXG4gfWNhdGNoKGVycil7XG5sZWZ0U2VhdC5mYWlsKGVycik7XG5yaWdodFNlYXQuZmFpbChlcnIpO1xudGhyb3cgZXJyO1xuIH1cblxubGVmdFNlYXQuZXhpdCgpO1xucmlnaHRTZWF0LmV4aXQoKTtcbnJldHVybiBkZWZhdWx0QWNjZXB0YW5jZU1zZztcbiB9O1xuXG4vKiogQHR5cGUge1N3YXBFeGFjdH0gKi8kaOKAjV9vbmNlLnN3YXAoc3dhcCk7XG5jb25zdCAgICAgICAgc3dhcEV4YWN0PSh6Y2YsbGVmdFNlYXQscmlnaHRTZWF0KT0+e1xudHJ5e1xuemNmLmF0b21pY1JlYXJyYW5nZShcbmhhcmRlbihbXG5mcm9tT25seShyaWdodFNlYXQscmlnaHRTZWF0LmdldFByb3Bvc2FsKCkuZ2l2ZSksXG5mcm9tT25seShsZWZ0U2VhdCxsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLmdpdmUpLFxuXG50b09ubHkobGVmdFNlYXQsbGVmdFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KSxcbnRvT25seShyaWdodFNlYXQscmlnaHRTZWF0LmdldFByb3Bvc2FsKCkud2FudCldKSk7XG5cblxuIH1jYXRjaChlcnIpe1xubGVmdFNlYXQuZmFpbChlcnIpO1xucmlnaHRTZWF0LmZhaWwoZXJyKTtcbnRocm93IGVycjtcbiB9XG5cbmxlZnRTZWF0LmV4aXQoKTtcbnJpZ2h0U2VhdC5leGl0KCk7XG5yZXR1cm4gZGVmYXVsdEFjY2VwdGFuY2VNc2c7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiBFeHBlY3RlZFJlY29yZFxuICogQHByb3BlcnR5IHtSZWNvcmQ8S2V5d29yZCwgbnVsbD59IFt3YW50XVxuICogQHByb3BlcnR5IHtSZWNvcmQ8S2V5d29yZCwgbnVsbD59IFtnaXZlXVxuICogQHByb3BlcnR5IHtQYXJ0aWFsPFJlY29yZDxrZXlvZiBQcm9wb3NhbFJlY29yZFsnZXhpdCddLCBudWxsPj59IFtleGl0XVxuICovXG5cbi8qKlxuICogQ2hlY2sgdGhlIHNlYXQncyBwcm9wb3NhbCBhZ2FpbnN0IGBwcm9wb3NhbFNoYXBlYC5cbiAqIElmIHRoZSBjbGllbnQgc3VibWl0cyBhbiBvZmZlciB3aGljaCBkb2VzIG5vdCBtYXRjaFxuICogdGhlc2UgZXhwZWN0YXRpb25zLCB0aGUgc2VhdCB3aWxsIGJlIGV4aXRlZCAoYW5kIHBheW1lbnRzIHJlZnVuZGVkKS5cbiAqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7UGF0dGVybn0gcHJvcG9zYWxTaGFwZVxuICovJGjigI1fb25jZS5zd2FwRXhhY3Qoc3dhcEV4YWN0KTtcbmNvbnN0ICAgICAgICBmaXRQcm9wb3NhbFNoYXBlPShzZWF0LHByb3Bvc2FsU2hhcGUpPT5cbi8qIFRPRE8gcmVtb3ZlIHRoaXMgaGFyZGVuLCBvYmxpZ2F0aW5nIG91ciBjYWxsZXIgdG8gaGFyZGVuLiovXG5tdXN0TWF0Y2goc2VhdC5nZXRQcm9wb3NhbCgpLGhhcmRlbihwcm9wb3NhbFNoYXBlKSwncHJvcG9zYWwnKTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc2VhdCdzIHByb3Bvc2FsIGFnYWluc3QgYW4gYGV4cGVjdGVkYCByZWNvcmQgdGhhdCBzYXlzXG4gKiB3aGF0IFwic2hhcGVcIiBvZiBwcm9wb3NhbCBpcyBhY2NlcHRhYmxlLlxuICpcbiAqIE5vdGUgdGhhdCBieSBvdXIgY3VycmVudCB0ZXJtaW5vbG9neSwgdGhpcyBmdW5jdGlvbiBpcyBtaXNuYW1lZCBiZWNhdXNlXG4gKiB3ZSB1c2VcbiAqIFtcIlNoYXBlXCIgdG8gcmVmZXIgdG8gcGF0dGVybnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9ibG9iL21hc3Rlci9wYWNrYWdlcy9zdG9yZS9zcmMvdHlwZXMuanMjTDU2LUw3NCksXG4gKiBhbmQgdGhlIGBleHBlY3RlZGAgYXJndW1lbnQgaXMgbm90IHN1Y2ggYSBwYXR0ZXJuLiBSYXRoZXIgaXQgaXMgYW4gYWQtaG9jXG4gKiBwYXR0ZXJuLWxpa2Ugc3BlY2lhbCBjYXNlIHJlY29yZCB0aGF0IGlzIGRpZmZlcmVudCBhbmQgbXVjaCBsZXNzIGV4cHJlc3NpdmUuXG4gKlxuICogVGhpcyBFeHBlY3RlZFJlY29yZCBpcyBsaWtlIGEgUHJvcG9zYWwsIGJ1dCB0aGUgYW1vdW50cyBpbiAnd2FudCdcbiAqIGFuZCAnZ2l2ZScgc2hvdWxkIGJlIG51bGw7IHRoZSBleGl0IGNsYXVzZSBzaG91bGQgc3BlY2lmeSBhIHJ1bGUgd2l0aFxuICogbnVsbCBjb250ZW50cy4gSWYgdGhlIGNsaWVudCBzdWJtaXRzIGFuIG9mZmVyIHdoaWNoIGRvZXMgbm90IG1hdGNoXG4gKiB0aGVzZSBleHBlY3RhdGlvbnMsIHRoZSBzZWF0IHdpbGwgYmUgZXhpdGVkIChhbmQgcGF5bWVudHMgcmVmdW5kZWQpLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBvcHRpb25hbCBgcHJvcG9zYWxTaGFwZWAgYXJndW1lbnQgdG8gYG1ha2VJbnZpdGF0aW9uYCB3aXRoXG4gKiBhIGdlbnVpbmUgcGF0dGVybi5cbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtFeHBlY3RlZFJlY29yZH0gZXhwZWN0ZWRcbiAqLyRo4oCNX29uY2UuZml0UHJvcG9zYWxTaGFwZShmaXRQcm9wb3NhbFNoYXBlKTtcbmNvbnN0ICAgICAgICBhc3NlcnRQcm9wb3NhbFNoYXBlPShzZWF0LGV4cGVjdGVkKT0+e1xuYXNzZXJ0LnR5cGVvZihleHBlY3RlZCwnb2JqZWN0Jyk7XG4hQXJyYXkuaXNBcnJheShleHBlY3RlZCl8fEZhaWwgYEV4cGVjdGVkIG11c3QgYmUgYW4gbm9uLWFycmF5IG9iamVjdGA7XG5jb25zdCBhc3NlcnRWYWx1ZXNOdWxsPShlKT0+e1xuaWYoZSE9PXVuZGVmaW5lZCl7XG5PYmplY3QudmFsdWVzKGUpLmZvckVhY2goXG4odmFsdWUpPT5cbnZhbHVlPT09bnVsbHx8XG5GYWlsIGBUaGUgdmFsdWUgb2YgdGhlIGV4cGVjdGVkIHJlY29yZCBtdXN0IGJlIG51bGwgYnV0IHdhcyAke3ZhbHVlfWApO1xuXG4gfVxuIH07XG5cbi8qIEFzc2VydCB2YWx1ZXMgb2YgdGhlIGV4cGVjdGVkIHJlY29yZCBhcmUgYWxsIG51bGwuIFdlIGRvIG5vdCovXG4vKiBjaGVjayB0aGUgdmFsdWVzIG9mIHRoZSBhY3R1YWwgcHJvcG9zYWwuKi9cbmFzc2VydFZhbHVlc051bGwoZXhwZWN0ZWQuZ2l2ZSk7XG5hc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLndhbnQpO1xuYXNzZXJ0VmFsdWVzTnVsbChleHBlY3RlZC5leGl0KTtcblxuY29uc3QgYWN0dWFsPXNlYXQuZ2V0UHJvcG9zYWwoKTtcbmNvbnN0IGFzc2VydEtleXM9KGEsZSk9PntcbmlmKGUhPT11bmRlZmluZWQpe1xua2V5RVEoZ2V0S2V5c1NvcnRlZChhKSxnZXRLZXlzU29ydGVkKGUpKXx8XG5GYWlsIGBhY3R1YWwgJHthfSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkICR7ZX1gO1xuIH1cbiB9O1xuYXNzZXJ0S2V5cyhhY3R1YWwuZ2l2ZSxleHBlY3RlZC5naXZlKTtcbmFzc2VydEtleXMoYWN0dWFsLndhbnQsZXhwZWN0ZWQud2FudCk7XG5hc3NlcnRLZXlzKGFjdHVhbC5leGl0LGV4cGVjdGVkLmV4aXQpO1xuIH07XG5cbi8qIEdpdmVuIGEgYnJhbmQsIGFzc2VydCB0aGF0IGJyYW5kIGlzIEFzc2V0S2luZC5OQVQuICovJGjigI1fb25jZS5hc3NlcnRQcm9wb3NhbFNoYXBlKGFzc2VydFByb3Bvc2FsU2hhcGUpO1xuY29uc3QgICAgICAgIGFzc2VydE5hdEFzc2V0S2luZD0oemNmLGJyYW5kKT0+e1xuemNmLmdldEFzc2V0S2luZChicmFuZCk9PT1Bc3NldEtpbmQuTkFUfHxcbkZhaWwgYGJyYW5kIG11c3QgYmUgQXNzZXRLaW5kLk5BVGA7XG4gfTskaOKAjV9vbmNlLmFzc2VydE5hdEFzc2V0S2luZChhc3NlcnROYXRBc3NldEtpbmQpO1xuXG5jb25zdCAgICAgICAgZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2c9IGBEZXBvc2l0IGFuZCByZWFsbG9jYXRpb24gc3VjY2Vzc2Z1bC5gO1xuXG4vKipcbiAqIERlcG9zaXQgcGF5bWVudHMgc3VjaCB0aGF0IHRoZWlyIGFtb3VudHMgYXJlIHJlYWxsb2NhdGVkIHRvIGEgc2VhdC5cbiAqIFRoZSBgYW1vdW50c2AgYW5kIGBwYXltZW50c2AgcmVjb3JkcyBtdXN0IGhhdmUgY29ycmVzcG9uZGluZ1xuICoga2V5d29yZHMuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSByZWNpcGllbnRTZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFtb3VudHNcbiAqIEBwYXJhbSB7UGF5bWVudFBLZXl3b3JkUmVjb3JkfSBwYXltZW50c1xuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gYERlcG9zaXQgYW5kIHJlYWxsb2NhdGlvbiBzdWNjZXNzZnVsLmBcbiAqLyRo4oCNX29uY2UuZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2coZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2cpO1xuY29uc3QgICAgICAgIGRlcG9zaXRUb1NlYXQ9YXN5bmMoemNmLHJlY2lwaWVudFNlYXQsYW1vdW50cyxwYXltZW50cyk9PntcbiFyZWNpcGllbnRTZWF0Lmhhc0V4aXRlZCgpfHxGYWlsIGBUaGUgcmVjaXBpZW50U2VhdCBjYW5ub3QgaGF2ZSBleGl0ZWQuYDtcblxuLyogV2Ugd2lsbCBjcmVhdGUgYSB0ZW1wb3Jhcnkgb2ZmZXIgdG8gYmUgYWJsZSB0byBlc2Nyb3cgb3VyIHBheW1lbnRzKi9cbi8qIHdpdGggWm9lLiovXG5jb25zdCByZWFsbG9jYXRlQWZ0ZXJEZXBvc2l0PSh0ZW1wU2VhdCk9Pntcbi8qIEFmdGVyIHRoZSBhc3NldHMgYXJlIGRlcG9zaXRlZCwgcmVhbGxvY2F0ZSB0aGVtIG9udG8gdGhlIHJlY2lwaWVudCBzZWF0IGFuZCovXG4vKiBleGl0IHRoZSB0ZW1wb3Jhcnkgc2VhdC4gTm90ZSB0aGF0IHRoZSBvZmZlclJlc3VsdCBpcyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoaXMqL1xuLyogZnVuY3Rpb24sIHNvIHRoaXMgc3luY2hyb25vdXMgdHJhZGUgbXVzdCBoYXBwZW4gYmVmb3JlIHRoZSovXG4vKiBvZmZlclJlc3VsdCByZXNvbHZlcy4qL1xuYXRvbWljVHJhbnNmZXIoemNmLHRlbXBTZWF0LHJlY2lwaWVudFNlYXQsYW1vdW50cyk7XG50ZW1wU2VhdC5leGl0KCk7XG5yZXR1cm4gZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2c7XG4gfTtcbmNvbnN0IGludml0YXRpb249emNmLm1ha2VJbnZpdGF0aW9uKFxucmVhbGxvY2F0ZUFmdGVyRGVwb3NpdCxcbid0ZW1wb3Jhcnkgc2VhdCBmb3IgZGVwb3NpdCcpO1xuXG5jb25zdCBwcm9wb3NhbD1oYXJkZW4oe2dpdmU6YW1vdW50c30pO1xuaGFyZGVuKHBheW1lbnRzKTtcbi8qIFRvIGVzY3JvdyB0aGUgcGF5bWVudCwgd2UgbXVzdCBnZXQgdGhlIFpvZSBTZXJ2aWNlIGZhY2V0IGFuZCovXG4vKiBtYWtlIGFuIG9mZmVyKi9cbmNvbnN0IHpvZT16Y2YuZ2V0Wm9lU2VydmljZSgpO1xuY29uc3QgdGVtcFVzZXJTZWF0PUUoem9lKS5vZmZlcihpbnZpdGF0aW9uLHByb3Bvc2FsLHBheW1lbnRzKTtcbi8qIFRoaXMgd2lsbCBiZSBhIHByb21pc2UgZm9yIHRoZSBzdHJpbmc6IGBEZXBvc2l0IGFuZCByZWFsbG9jYXRpb24qL1xuLyogc3VjY2Vzc2Z1bC5gIEl0IHdpbGwgb25seSBmdWxmaWxsIGFmdGVyIHRoZSBhc3NldHMgaGF2ZSBiZWVuKi9cbi8qIHN1Y2Nlc3NmdWxseSByZWFsbG9jYXRlZCB0byB0aGUgcmVjaXBpZW50IHNlYXQuKi9cbnJldHVybiBFKHRlbXBVc2VyU2VhdCkuZ2V0T2ZmZXJSZXN1bHQoKTtcbiB9O1xuXG4vKipcbiAqIFdpdGhkcmF3IHBheW1lbnRzIGZyb20gYSBzZWF0LiBOb3RlIHRoYXQgd2l0aGRyYXdpbmcgdGhlIGFtb3VudHMgb2ZcbiAqIHRoZSBwYXltZW50cyBtdXN0IG5vdCBhbmQgY2Fubm90IHZpb2xhdGUgb2ZmZXIgc2FmZXR5IGZvciB0aGUgc2VhdC4gVGhlXG4gKiBgYW1vdW50c2AgYW5kIGBwYXltZW50c2AgcmVjb3JkcyBtdXN0IGhhdmUgY29ycmVzcG9uZGluZyBrZXl3b3Jkcy5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYW1vdW50c1xuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFBLZXl3b3JkUmVjb3JkPn1cbiAqLyRo4oCNX29uY2UuZGVwb3NpdFRvU2VhdChkZXBvc2l0VG9TZWF0KTtcbmNvbnN0ICAgICAgICB3aXRoZHJhd0Zyb21TZWF0PWFzeW5jKHpjZixzZWF0LGFtb3VudHMpPT57XG4hc2VhdC5oYXNFeGl0ZWQoKXx8RmFpbCBgVGhlIHNlYXQgY2Fubm90IGhhdmUgZXhpdGVkLmA7XG5jb25zdHt6Y2ZTZWF0OnRlbXBTZWF0LHVzZXJTZWF0OnRlbXBVc2VyU2VhdFB9PXpjZi5tYWtlRW1wdHlTZWF0S2l0KCk7XG5hdG9taWNUcmFuc2Zlcih6Y2Ysc2VhdCx0ZW1wU2VhdCxhbW91bnRzKTtcbnRlbXBTZWF0LmV4aXQoKTtcbnJldHVybiBFKHRlbXBVc2VyU2VhdFApLmdldFBheW91dHMoKTtcbiB9O1xuXG4vKipcbiAqIFNhdmUgYWxsIG9mIHRoZSBpc3N1ZXJzIGluIGFuIGlzc3VlcnNLZXl3b3JkUmVjb3JkIHRvIFpDRiwgdXNpbmdcbiAqIHRoZSBtZXRob2QgYHpjZi5zYXZlSXNzdWVyYC4gVGhpcyBkb2VzIG5vdCBlcnJvciBpZiBhbnkgb2YgdGhlIGtleXdvcmRzXG4gKiBhbHJlYWR5IGV4aXN0LiBJZiB0aGUga2V5d29yZCBpcyBhbHJlYWR5IHByZXNlbnQsIGl0IGlzIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtJc3N1ZXJLZXl3b3JkUmVjb3JkfSBpc3N1ZXJLZXl3b3JkUmVjb3JkIElzc3VlcnMgdG8gc2F2ZSB0b1xuICogWkNGXG4gKi8kaOKAjV9vbmNlLndpdGhkcmF3RnJvbVNlYXQod2l0aGRyYXdGcm9tU2VhdCk7XG5jb25zdCAgICAgICAgc2F2ZUFsbElzc3VlcnM9YXN5bmMoemNmLGlzc3VlcktleXdvcmRSZWNvcmQ9aGFyZGVuKHt9KSk9PntcbmNvbnN0e2lzc3VlcnN9PXpjZi5nZXRUZXJtcygpO1xuY29uc3QgaXNzdWVyc1BTYXZlZD1PYmplY3QuZW50cmllcyhpc3N1ZXJLZXl3b3JkUmVjb3JkKS5tYXAoXG4oW2tleXdvcmQsaXNzdWVyXSk9Pntcbi8qIElmIHRoZSBrZXl3b3JkIGRvZXMgbm90IHlldCBleGlzdCwgYWRkIGl0IGFuZCB0aGUqL1xuLyogYXNzb2NpYXRlZCBpc3N1ZXIuKi9cbmlmKGlzc3VlcnNba2V5d29yZF09PT11bmRlZmluZWQpe1xucmV0dXJuIHpjZi5zYXZlSXNzdWVyKGlzc3VlcixrZXl3b3JkKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0pO1xuXG5yZXR1cm4gUHJvbWlzZS5hbGwoaXNzdWVyc1BTYXZlZCk7XG4gfTtcblxuLyoqIEB0eXBlIHtNYXBLZXl3b3Jkc30gKi8kaOKAjV9vbmNlLnNhdmVBbGxJc3N1ZXJzKHNhdmVBbGxJc3N1ZXJzKTtcbmNvbnN0ICAgICAgICBtYXBLZXl3b3Jkcz0oa2V5d29yZFJlY29yZD17fSxrZXl3b3JkTWFwcGluZyk9PntcbnJldHVybiBoYXJkZW4oXG5mcm9tVW5pcXVlRW50cmllcyhcbk9iamVjdC5lbnRyaWVzKGtleXdvcmRSZWNvcmQpLm1hcCgoW2tleXdvcmQsdmFsdWVdKT0+e1xuaWYoa2V5d29yZE1hcHBpbmdba2V5d29yZF09PT11bmRlZmluZWQpe1xucmV0dXJuW2tleXdvcmQsdmFsdWVdO1xuIH1cbnJldHVybltrZXl3b3JkTWFwcGluZ1trZXl3b3JkXSx2YWx1ZV07XG4gfSkpKTtcblxuXG4gfTtcbi8qKiBAdHlwZSB7UmV2ZXJzZX0gKi8kaOKAjV9vbmNlLm1hcEtleXdvcmRzKG1hcEtleXdvcmRzKTtcbmNvbnN0IHJldmVyc2U9KGtleXdvcmRSZWNvcmQ9e30pPT57XG5yZXR1cm4gaGFyZGVuKFxuZnJvbVVuaXF1ZUVudHJpZXMoXG5PYmplY3QuZW50cmllcyhrZXl3b3JkUmVjb3JkKS5tYXAoKFtrZXksdmFsdWVdKT0+W3ZhbHVlLGtleV0pKSk7XG5cblxuIH07XG5cbi8qKlxuICogTWFrZSBhbiBvZmZlciB0byBhbm90aGVyIGNvbnRyYWN0IGluc3RhbmNlIChsYWJlbGVkIGNvbnRyYWN0QiBiZWxvdyksXG4gKiB3aXRoZHJhd2luZyB0aGUgcGF5bWVudHMgZm9yIHRoZSBvZmZlciBmcm9tIGEgc2VhdCBpbiB0aGUgY3VycmVudFxuICogY29udHJhY3QgaW5zdGFuY2UgKGNvbnRyYWN0QSkgYW5kIGRlcG9zaXRpbmcgdGhlIHBheW91dHMgaW4gYW5vdGhlclxuICogc2VhdCBpbiB0aGUgY3VycmVudCBjb250cmFjdCBpbnN0YW5jZSAoY29udHJhY3RBKS5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiAgIFpvZSBDb250cmFjdCBGYWNldCBmb3IgY29udHJhY3RBXG4gKlxuICogQHBhcmFtIHtFUmVmPEludml0YXRpb248UmVzdWx0LCBBcmdzPj59IGludml0YXRpb25cbiAqICAgSW52aXRhdGlvbiB0byBjb250cmFjdEJcbiAqXG4gKiBAcGFyYW0ge0tleXdvcmRLZXl3b3JkUmVjb3JkIHwgdW5kZWZpbmVkfSBrZXl3b3JkTWFwcGluZ1xuICogICBNYXBwaW5nIG9mIGtleXdvcmRzIHVzZWQgaW4gY29udHJhY3RBIHRvIGtleXdvcmRzIHRvIGJlIHVzZWQgaW5cbiAqICAgY29udHJhY3RCLiBOb3RlIHRoYXQgdGhlIHBhdGh3YXkgdG8gZGVwb3NpdCB0aGUgcGF5b3V0IGJhY2sgdG9cbiAqICAgY29udHJhY3RBIHJldmVyc2VzIHRoaXMgbWFwcGluZy5cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsfSBwcm9wb3NhbFxuICogICBUaGUgcHJvcG9zYWwgZm9yIHRoZSBvZmZlciB0byBiZSBtYWRlIHRvIGNvbnRyYWN0QlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gZnJvbVNlYXRcbiAqICAgVGhlIHNlYXQgaW4gY29udHJhY3RBIHRvIHRha2UgdGhlIG9mZmVyIHBheW1lbnRzIGZyb20uXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBbdG9TZWF0PWZyb21TZWF0XVxuICogICBUaGUgc2VhdCBpbiBjb250cmFjdEEgdG8gZGVwb3NpdCB0aGUgcGF5b3V0IG9mIHRoZSBvZmZlciB0by5cbiAqICAgSWYgYHRvU2VhdGAgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGRlZmF1bHRzIHRvIHRoZSBgZnJvbVNlYXRgLlxuICpcbiAqIEBwYXJhbSB7QXJnc30gW29mZmVyQXJnc11cbiAqICAgQWRkaXRpb25hbCBjb250cmFjdC1zcGVjaWZpYyBvcHRpb25hbCBhcmd1bWVudHMgaW4gYSByZWNvcmQuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8e3VzZXJTZWF0UHJvbWlzZTogUHJvbWlzZTxVc2VyU2VhdDxSZXN1bHQ+PiwgZGVwb3NpdGVkOiBQcm9taXNlPEFtb3VudEtleXdvcmRSZWNvcmQ+fT59XG4gKiAgIEEgcHJvbWlzZSBmb3IgdGhlIHVzZXJTZWF0IGZvciB0aGUgb2ZmZXIgdG8gdGhlIG90aGVyIGNvbnRyYWN0LCBhbmQgYVxuICogICBwcm9taXNlIChgZGVwb3NpdGVkYCkgd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcGF5b3V0IGZvciB0aGUgb2ZmZXIgaGFzIGJlZW5cbiAqICAgZGVwb3NpdGVkIHRvIHRoZSBgdG9TZWF0YC5cbiAqICAgQW55IGZhaWx1cmVzIG9mIHRoZSBpbnZpdGF0aW9uIHdpbGwgYmUgcmV0dXJuZWQgYnkgYHVzZXJTZWF0UHJvbWlzZS5nZXRPZmZlclJlc3VsdCgpYC5cbiAqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gQXJncyBPZmZlciBhcmdzXG4gKiBAdGVtcGxhdGUge29iamVjdH0gUmVzdWx0IE9mZmVyIHJlc3VsdFxuICovXG5jb25zdCAgICAgICAgb2ZmZXJUbz1hc3luYyhcbnpjZixcbmludml0YXRpb24sXG5rZXl3b3JkTWFwcGluZyxcbnByb3Bvc2FsLFxuZnJvbVNlYXQsXG50b1NlYXQsXG5vZmZlckFyZ3MpPT5cbntcbmlmKGtleXdvcmRNYXBwaW5nPT09dW5kZWZpbmVkKXtcbmtleXdvcmRNYXBwaW5nPWhhcmRlbih7fSk7XG4gfVxuXG5jb25zdCBkZWZpbmVkVG9TZWF0PXRvU2VhdCE9PXVuZGVmaW5lZD90b1NlYXQ6ZnJvbVNlYXQ7XG5cbmNvbnN0IHpvZT16Y2YuZ2V0Wm9lU2VydmljZSgpO1xuY29uc3QgbWFwcGluZ1JldmVyc2VkPXJldmVyc2Uoa2V5d29yZE1hcHBpbmcpO1xuXG5jb25zdCBuZXdLZXl3b3Jkcz1cbnByb3Bvc2FsIT09dW5kZWZpbmVkP1xubWFwS2V5d29yZHMocHJvcG9zYWwuZ2l2ZSxtYXBwaW5nUmV2ZXJzZWQpOlxuaGFyZGVuKHt9KTtcblxuLyogdGhlIHByb3Bvc2FsIGlzIGluIHRoZSBvdGhlciBjb250cmFjdCdzIGtleXdvcmRzLCBidXQgd2Ugd2FudCB0byovXG4vKiB1c2UgYHByb3Bvc2FsLmdpdmVgIHRvIHdpdGhkcmF3Ki9cbmNvbnN0IHBheW1lbnRzPWF3YWl0IHdpdGhkcmF3RnJvbVNlYXQoemNmLGZyb21TZWF0LG5ld0tleXdvcmRzKTtcblxuLyogTWFwIHRvIHRoZSBvdGhlciBjb250cmFjdCdzIGtleXdvcmRzKi9cbmNvbnN0IHBheW1lbnRzRm9yT3RoZXJDb250cmFjdD1tYXBLZXl3b3JkcyhwYXltZW50cyxrZXl3b3JkTWFwcGluZyk7XG5cbmNvbnN0IHVzZXJTZWF0UHJvbWlzZT1FKHpvZSkub2ZmZXIoXG5pbnZpdGF0aW9uLFxucHJvcG9zYWwsXG5wYXltZW50c0Zvck90aGVyQ29udHJhY3QsXG5vZmZlckFyZ3MpO1xuXG5cbmNvbnN0IGRlcG9zaXRlZFByb21pc2VLaXQ9bWFrZVByb21pc2VLaXQoKTtcblxuY29uc3QgZG9EZXBvc2l0PWFzeW5jKHBheW91dFBheW1lbnRzKT0+e1xuLyogYWZ0ZXIgZ2V0UGF5b3V0cygpLCBnZXRGaW5hbEFsbG9jYXRpb24oKSByZXNvbHZlcyBwcm9tcHRseS4qL1xuY29uc3QgYW1vdW50cz1hd2FpdCBFKHVzZXJTZWF0UHJvbWlzZSkuZ2V0RmluYWxBbGxvY2F0aW9uKCk7XG5cbi8qIE1hcCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250cmFjdCdzIGtleXdvcmRzKi9cbmNvbnN0IG1hcHBlZEFtb3VudHM9bWFwS2V5d29yZHMoYW1vdW50cyxtYXBwaW5nUmV2ZXJzZWQpO1xuY29uc3QgbWFwcGVkUGF5bWVudHM9bWFwS2V5d29yZHMocGF5b3V0UGF5bWVudHMsbWFwcGluZ1JldmVyc2VkKTtcbmF3YWl0IGRlcG9zaXRUb1NlYXQoemNmLGRlZmluZWRUb1NlYXQsbWFwcGVkQW1vdW50cyxtYXBwZWRQYXltZW50cyk7XG5kZXBvc2l0ZWRQcm9taXNlS2l0LnJlc29sdmUobWFwcGVkQW1vdW50cyk7XG4gfTtcblxuRSh1c2VyU2VhdFByb21pc2UpLmdldFBheW91dHMoKS50aGVuKGRvRGVwb3NpdCk7XG5cbi8qIFRPRE8gcmVuYW1lIHJldHVybiBrZXk7IHVzZXJTZWF0UHJvbWlzZSBpcyBhIHJlbW90ZSBVc2VyU2VhdCovXG5yZXR1cm4gaGFyZGVuKHt1c2VyU2VhdFByb21pc2UsZGVwb3NpdGVkOmRlcG9zaXRlZFByb21pc2VLaXQucHJvbWlzZX0pO1xuIH07JGjigI1fb25jZS5vZmZlclRvKG9mZmVyVG8pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRBY2NlcHRhbmNlTXNnIjpbImRlZmF1bHRBY2NlcHRhbmNlTXNnIl0sImFzc2VydElzc3VlcktleXdvcmRzIjpbImFzc2VydElzc3VlcktleXdvcmRzIl0sInNhdGlzZmllcyI6WyJzYXRpc2ZpZXMiXSwic3dhcCI6WyJzd2FwIl0sInN3YXBFeGFjdCI6WyJzd2FwRXhhY3QiXSwiZml0UHJvcG9zYWxTaGFwZSI6WyJmaXRQcm9wb3NhbFNoYXBlIl0sImFzc2VydFByb3Bvc2FsU2hhcGUiOlsiYXNzZXJ0UHJvcG9zYWxTaGFwZSJdLCJhc3NlcnROYXRBc3NldEtpbmQiOlsiYXNzZXJ0TmF0QXNzZXRLaW5kIl0sImRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnIjpbImRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnIl0sImRlcG9zaXRUb1NlYXQiOlsiZGVwb3NpdFRvU2VhdCJdLCJ3aXRoZHJhd0Zyb21TZWF0IjpbIndpdGhkcmF3RnJvbVNlYXQiXSwic2F2ZUFsbElzc3VlcnMiOlsic2F2ZUFsbElzc3VlcnMiXSwibWFwS2V5d29yZHMiOlsibWFwS2V5d29yZHMiXSwib2ZmZXJUbyI6WyJvZmZlclRvIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOWxCczbQwAA20MAACUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIl0sImV4cG9ydHMiOlsiQWRtaW5GYWNldEkiLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIiwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiLCJCdW5kbGVDYXBTaGFwZSIsIkJ1bmRsZVNoYXBlIiwiRXhpdE9iamVjdEkiLCJFeGl0T2JqZWN0U2hhcGUiLCJGZWVNaW50QWNjZXNzU2hhcGUiLCJGdWxsUHJvcG9zYWxTaGFwZSIsIkhhbmRsZUkiLCJIYW5kbGVPZmZlckkiLCJJbnN0YWxsYXRpb25TaGFwZSIsIkluc3RhbmNlQWRtaW5JIiwiSW5zdGFuY2VBZG1pblNoYXBlIiwiSW5zdGFuY2VIYW5kbGVTaGFwZSIsIkluc3RhbmNlUmVjb3JkU2hhcGUiLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCIsIkludml0YXRpb25FbGVtZW50U2hhcGUiLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUmVjb3JkU2hhcGUiLCJLZXl3b3JkU2hhcGUiLCJPZmZlckhhbmRsZXJJIiwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiLCJQcmljZVF1b3RlU2hhcGUiLCJQcm9wb3NhbFNoYXBlIiwiU2VhdERhdGFTaGFwZSIsIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIiwiU2VhdFNoYXBlIiwiVGVybXNTaGFwZSIsIlRpbWVyU2hhcGUiLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSIsIlpjZk1pbnRJIiwiWm9lTWludEkiLCJab2VNaW50U2hhcGUiLCJab2VTZXJ2aWNlSSIsIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCIsImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIiwiaXNPbkRlbWFuZEV4aXRSdWxlIiwiaXNXYWl2ZWRFeGl0UnVsZSIsIm1ha2VIYW5kbGVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRTaGFwZSxBc3NldEtpbmRTaGFwZSxCcmFuZFNoYXBlLERpc3BsYXlJbmZvU2hhcGUsSXNzdWVyS2l0U2hhcGUsSXNzdWVyU2hhcGUsUGF5bWVudFNoYXBlLFN1YnNjcmliZXJTaGFwZSxNLFRpbWVzdGFtcFNoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50U2hhcGVcIiwgWyRo4oCNX2EgPT4gKEFtb3VudFNoYXBlID0gJGjigI1fYSldXSxbXCJBc3NldEtpbmRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQXNzZXRLaW5kU2hhcGUgPSAkaOKAjV9hKV1dLFtcIkJyYW5kU2hhcGVcIiwgWyRo4oCNX2EgPT4gKEJyYW5kU2hhcGUgPSAkaOKAjV9hKV1dLFtcIkRpc3BsYXlJbmZvU2hhcGVcIiwgWyRo4oCNX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaOKAjV9hKV1dLFtcIklzc3VlcktpdFNoYXBlXCIsIFskaOKAjV9hID0+IChJc3N1ZXJLaXRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiSXNzdWVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlclNoYXBlID0gJGjigI1fYSldXSxbXCJQYXltZW50U2hhcGVcIiwgWyRo4oCNX2EgPT4gKFBheW1lbnRTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoga2V5d29yZHMgaGF2ZSBhbiBpbml0aWFsIGNhcCovXG5jb25zdCAgICAgICAgS2V5d29yZFNoYXBlPU0uc3RyaW5nKCk7JGjigI1fb25jZS5LZXl3b3JkU2hhcGUoS2V5d29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIEludml0YXRpb25IYW5kbGVTaGFwZT1NLnJlbW90YWJsZSgnSW52aXRhdGlvbkhhbmRsZScpOyRo4oCNX29uY2UuSW52aXRhdGlvbkhhbmRsZVNoYXBlKEludml0YXRpb25IYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgSW52aXRhdGlvblNoYXBlPU0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uJyk7JGjigI1fb25jZS5JbnZpdGF0aW9uU2hhcGUoSW52aXRhdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnN0YW5jZUhhbmRsZVNoYXBlPU0ucmVtb3RhYmxlKCdJbnN0YW5jZUhhbmRsZScpOyRo4oCNX29uY2UuSW5zdGFuY2VIYW5kbGVTaGFwZShJbnN0YW5jZUhhbmRsZVNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnN0YWxsYXRpb25TaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJyk7JGjigI1fb25jZS5JbnN0YWxsYXRpb25TaGFwZShJbnN0YWxsYXRpb25TaGFwZSk7XG5jb25zdCAgICAgICAgU2VhdFNoYXBlPU0ucmVtb3RhYmxlKCdTZWF0Jyk7JGjigI1fb25jZS5TZWF0U2hhcGUoU2VhdFNoYXBlKTtcblxuY29uc3QgICAgICAgIEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKEtleXdvcmRTaGFwZSxBbW91bnRTaGFwZSk7JGjigI1fb25jZS5BbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKTtcbmNvbnN0ICAgICAgICBBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoXG5LZXl3b3JkU2hhcGUsXG5NLnBhdHRlcm4oKSk7JGjigI1fb25jZS5BbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihcbktleXdvcmRTaGFwZSxcbk0uZXJlZihQYXltZW50U2hhcGUpKTskaOKAjV9vbmNlLlBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIElzc3VlcktleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKEtleXdvcmRTaGFwZSxJc3N1ZXJTaGFwZSk7JGjigI1fb25jZS5Jc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKTtcbmNvbnN0ICAgICAgICBJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoXG5LZXl3b3JkU2hhcGUsXG5NLmVyZWYoSXNzdWVyU2hhcGUpKTskaOKAjV9vbmNlLklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKEtleXdvcmRTaGFwZSxCcmFuZFNoYXBlKTskaOKAjV9vbmNlLkJyYW5kS2V5d29yZFJlY29yZFNoYXBlKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIElzc3VlclJlY29yZFNoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5icmFuZDpCcmFuZFNoYXBlLFxuaXNzdWVyOklzc3VlclNoYXBlLFxuYXNzZXRLaW5kOkFzc2V0S2luZFNoYXBlfSxcblxue2Rpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9KTskaOKAjV9vbmNlLklzc3VlclJlY29yZFNoYXBlKElzc3VlclJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgVGVybXNTaGFwZT1oYXJkZW4oe1xuaXNzdWVyczpJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUsXG5icmFuZHM6QnJhbmRLZXl3b3JkUmVjb3JkU2hhcGV9KTskaOKAjV9vbmNlLlRlcm1zU2hhcGUoVGVybXNTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEluc3RhbmNlUmVjb3JkU2hhcGU9aGFyZGVuKHtcbmluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25TaGFwZSxcbmluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGUsXG50ZXJtczpNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpfSk7JGjigI1fb25jZS5JbnN0YW5jZVJlY29yZFNoYXBlKEluc3RhbmNlUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBIYW5kbGVJPU0uaW50ZXJmYWNlKCdIYW5kbGUnLHt9KTskaOKAjV9vbmNlLkhhbmRsZUkoSGFuZGxlSSk7XG5cbmNvbnN0ICAgICAgICBtYWtlSGFuZGxlU2hhcGU9KG5hbWUpPT5NLnJlbW90YWJsZSggYCR7bmFtZX1IYW5kbGVgKTskaOKAjV9vbmNlLm1ha2VIYW5kbGVTaGFwZShtYWtlSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIFRpbWVyU2hhcGU9bWFrZUhhbmRsZVNoYXBlKCd0aW1lcicpO1xuXG4vKipcbiAqIEFmdGVyIGRlZmF1bHRzIGFyZSBmaWxsZWQgaW5cbiAqXG4gKiBAc2VlIHtQcm9wb3NhbFJlY29yZH0gdHlwZVxuICovJGjigI1fb25jZS5UaW1lclNoYXBlKFRpbWVyU2hhcGUpO1xuY29uc3QgICAgICAgIEZ1bGxQcm9wb3NhbFNoYXBlPWhhcmRlbih7XG53YW50OkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUsXG5naXZlOkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbi8qIFRvIGFjY2VwdCBvbmx5IG9uZSwgd2UgY291bGQgdXNlIE0ub3IgcmF0aGVyIHRoYW4gTS5zcGxpdFJlY29yZCwqL1xuLyogYnV0IHRoZSBlcnJvciBtZXNzYWdlcyB3b3VsZCBoYXZlIGJlZW4gd29yc2UuIFJhdGhlciwqL1xuLyogY2xlYW5Qcm9wb3NhbCdzIGFzc2VydEV4aXQgY2hlY2tzIHRoYXQgdGhlcmUncyBleGFjdGx5IG9uZS4qL1xuZXhpdDpNLnNwbGl0UmVjb3JkKFxue30sXG57XG5vbkRlbWFuZDpudWxsLFxud2FpdmVkOm51bGwsXG5hZnRlckRlYWRsaW5lOntcbnRpbWVyOk0uZXJlZihUaW1lclNoYXBlKSxcbmRlYWRsaW5lOlRpbWVzdGFtcFNoYXBlfX0sXG5cblxue30pfSk7XG5cblxuLyoqIEBzZWUge1Byb3Bvc2FsfSB0eXBlICovJGjigI1fb25jZS5GdWxsUHJvcG9zYWxTaGFwZShGdWxsUHJvcG9zYWxTaGFwZSk7XG5jb25zdCAgICAgICAgUHJvcG9zYWxTaGFwZT1NLnNwbGl0UmVjb3JkKHt9LEZ1bGxQcm9wb3NhbFNoYXBlLHt9KTskaOKAjV9vbmNlLlByb3Bvc2FsU2hhcGUoUHJvcG9zYWxTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBpc09uRGVtYW5kRXhpdFJ1bGU9KGV4aXQpPT57XG5jb25zdFtleGl0S2V5XT1PYmplY3Qua2V5cyhleGl0KTtcbnJldHVybiBleGl0S2V5PT09J29uRGVtYW5kJztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIFdhaXZlZEV4aXRSdWxlfVxuICovJGjigI1fb25jZS5pc09uRGVtYW5kRXhpdFJ1bGUoaXNPbkRlbWFuZEV4aXRSdWxlKTtcbmNvbnN0ICAgICAgICBpc1dhaXZlZEV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmtleXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSd3YWl2ZWQnO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgQWZ0ZXJEZWFkbGluZUV4aXRSdWxlfVxuICovJGjigI1fb25jZS5pc1dhaXZlZEV4aXRSdWxlKGlzV2FpdmVkRXhpdFJ1bGUpO1xuY29uc3QgICAgICAgIGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmtleXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSdhZnRlckRlYWRsaW5lJztcbiB9OyRo4oCNX29uY2UuaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUoaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUpO1xuXG5jb25zdCAgICAgICAgSW52aXRhdGlvbkVsZW1lbnRTaGFwZT1NLnNwbGl0UmVjb3JkKHtcbmRlc2NyaXB0aW9uOk0uc3RyaW5nKCksXG5oYW5kbGU6SW52aXRhdGlvbkhhbmRsZVNoYXBlLFxuaW5zdGFuY2U6SW5zdGFuY2VIYW5kbGVTaGFwZSxcbmluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25TaGFwZX0pOyRo4oCNX29uY2UuSW52aXRhdGlvbkVsZW1lbnRTaGFwZShJbnZpdGF0aW9uRWxlbWVudFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgT2ZmZXJIYW5kbGVyST1NLmludGVyZmFjZSgnT2ZmZXJIYW5kbGVyJyx7XG5oYW5kbGU6TS5jYWxsKFNlYXRTaGFwZSkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnN0cmluZygpKX0pOyRo4oCNX29uY2UuT2ZmZXJIYW5kbGVySShPZmZlckhhbmRsZXJJKTtcblxuXG5jb25zdCAgICAgICAgU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGU9TS5hcnJheU9mKFxuaGFyZGVuKHtcbnNlYXRIYW5kbGU6U2VhdFNoYXBlLFxuYWxsb2NhdGlvbjpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGV9KSk7JGjigI1fb25jZS5TZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZShTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSk7XG5cblxuXG5jb25zdCAgICAgICAgWm9lTWludFNoYXBlPU0ucmVtb3RhYmxlKCdab2VNaW50Jyk7JGjigI1fb25jZS5ab2VNaW50U2hhcGUoWm9lTWludFNoYXBlKTtcbmNvbnN0ICAgICAgICBab2VNaW50ST1NLmludGVyZmFjZSgnWm9lTWludCcse1xuZ2V0SXNzdWVyUmVjb3JkOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyUmVjb3JkU2hhcGUpLFxubWludEFuZEVzY3JvdzpNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKSxcbndpdGhkcmF3QW5kQnVybjpNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKX0pOyRo4oCNX29uY2UuWm9lTWludEkoWm9lTWludEkpO1xuXG5cbmNvbnN0ICAgICAgICBaY2ZNaW50ST1NLmludGVyZmFjZSgnWmNmTWludCcse1xuZ2V0SXNzdWVyUmVjb3JkOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyUmVjb3JkU2hhcGUpLFxubWludEdhaW5zOk0uY2FsbChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpLlxub3B0aW9uYWwoTS5yZW1vdGFibGUoJ3pjZlNlYXQnKSkuXG5yZXR1cm5zKE0ucmVtb3RhYmxlKCd6Y2ZTZWF0JykpLFxuYnVybkxvc3NlczpNLmNhbGwoXG5BbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5NLnJlbW90YWJsZSgnemNmU2VhdCcpKS5cbnJldHVybnMoKX0pOyRo4oCNX29uY2UuWmNmTWludEkoWmNmTWludEkpO1xuXG5cbmNvbnN0ICAgICAgICBGZWVNaW50QWNjZXNzU2hhcGU9TS5yZW1vdGFibGUoJ0ZlZU1pbnRBY2Nlc3MnKTskaOKAjV9vbmNlLkZlZU1pbnRBY2Nlc3NTaGFwZShGZWVNaW50QWNjZXNzU2hhcGUpO1xuXG5jb25zdCAgICAgICAgRXhpdE9iamVjdEk9TS5pbnRlcmZhY2UoJ0V4aXQgT2JqZWN0Jyx7XG5leGl0Ok0uY2FsbCgpLnJldHVybnMoKX0pOyRo4oCNX29uY2UuRXhpdE9iamVjdEkoRXhpdE9iamVjdEkpO1xuXG5cbmNvbnN0ICAgICAgICBFeGl0T2JqZWN0U2hhcGU9TS5yZW1vdGFibGUoJ0V4aXRPYmonKTskaOKAjV9vbmNlLkV4aXRPYmplY3RTaGFwZShFeGl0T2JqZWN0U2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbmNlQWRtaW5TaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFuY2VBZG1pbicpOyRo4oCNX29uY2UuSW5zdGFuY2VBZG1pblNoYXBlKEluc3RhbmNlQWRtaW5TaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VBZG1pbkk9TS5pbnRlcmZhY2UoJ0luc3RhbmNlQWRtaW4nLHtcbm1ha2VJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnJlY29yZCgpLE0ucGF0dGVybigpKS5cbnJldHVybnMoSW52aXRhdGlvblNoYXBlKSxcbnNhdmVJc3N1ZXI6TS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSxLZXl3b3JkU2hhcGUpLnJldHVybnMoXG5Jc3N1ZXJSZWNvcmRTaGFwZSksXG5cbm1ha2VOb0VzY3Jvd1NlYXQ6TS5jYWxsKFxuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuUHJvcG9zYWxTaGFwZSxcbkV4aXRPYmplY3RTaGFwZSxcblNlYXRTaGFwZSkuXG5yZXR1cm5zKFNlYXRTaGFwZSksXG5leGl0QWxsU2VhdHM6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWxBbGxTZWF0czpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZXhpdFNlYXQ6TS5jYWxsKFNlYXRTaGFwZSxNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsU2VhdDpNLmNhbGwoU2VhdFNoYXBlLE0uYW55KCkpLnJldHVybnMoKSxcbm1ha2Vab2VNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUpLlxub3B0aW9uYWwoXG5Bc3NldEtpbmRTaGFwZSxcbkRpc3BsYXlJbmZvU2hhcGUsXG5NLnNwbGl0UmVjb3JkKGhhcmRlbih7fSksaGFyZGVuKHtlbGVtZW50U2hhcGU6TS5wYXR0ZXJuKCl9KSkpLlxuXG5yZXR1cm5zKE0ucmVtb3RhYmxlKCd6b2VNaW50JykpLFxucmVnaXN0ZXJGZWVNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUsRmVlTWludEFjY2Vzc1NoYXBlKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKSksXG5cbnJlcGxhY2VBbGxvY2F0aW9uczpNLmNhbGwoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpLnJldHVybnMoKSxcbnN0b3BBY2NlcHRpbmdPZmZlcnM6TS5jYWxsKCkucmV0dXJucygpLFxuc2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKE0uYXJyYXlPZihNLnN0cmluZygpKSkucmV0dXJucygpLFxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuZ2V0RXhpdFN1YnNjcmliZXI6TS5jYWxsKFNlYXRTaGFwZSkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuaXNCbG9ja2VkOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0uYm9vbGVhbigpKX0pOyRo4oCNX29uY2UuSW5zdGFuY2VBZG1pbkkoSW5zdGFuY2VBZG1pbkkpO1xuXG5cbmNvbnN0ICAgICAgICBJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdD1oYXJkZW4oe1xuaW5zdGFuY2VTdG9yYWdlTWFuYWdlcjpNLmludGVyZmFjZSgnSW5zdGFuY2VTdG9yYWdlTWFuYWdlcicse1xuZ2V0VGVybXM6TS5jYWxsKCkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbmdldElzc3VlcnM6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0QnJhbmRzOk0uY2FsbCgpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0SW5zdGFsbGF0aW9uOk0uY2FsbCgpLnJldHVybnMoSW5zdGFsbGF0aW9uU2hhcGUpLFxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuc2F2ZUlzc3VlcjpNLmNhbGwoSXNzdWVyU2hhcGUsS2V5d29yZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm1ha2Vab2VNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUpLlxub3B0aW9uYWwoXG5Bc3NldEtpbmRTaGFwZSxcbkRpc3BsYXlJbmZvU2hhcGUsXG5NLnNwbGl0UmVjb3JkKGhhcmRlbih7fSksaGFyZGVuKHtlbGVtZW50U2hhcGU6TS5wYXR0ZXJuKCl9KSkpLlxuXG5yZXR1cm5zKE0uZXJlZihab2VNaW50U2hhcGUpKSxcbnJlZ2lzdGVyRmVlTWludDpNLmNhbGwoS2V5d29yZFNoYXBlLEZlZU1pbnRBY2Nlc3NTaGFwZSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdmZWVNaW50JykpLFxuXG5nZXRJbnN0YW5jZVJlY29yZDpNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlUmVjb3JkU2hhcGUpLFxuZ2V0SXNzdWVyUmVjb3JkczpNLmNhbGwoKS5yZXR1cm5zKE0uYXJyYXlPZihJc3N1ZXJSZWNvcmRTaGFwZSkpLFxuZ2V0V2l0aGRyYXdGYWNldDpNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdXaXRoZHJhd0ZhY2V0JykpLFxuaW5pdEluc3RhbmNlQWRtaW46TS5jYWxsKFxuSW5zdGFuY2VIYW5kbGVTaGFwZSxcbk0ucmVtb3RhYmxlKCdpbnN0YW5jZUFkbWluJykpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG5kZWxldGVJbnN0YW5jZUFkbWluOk0uY2FsbChJbnN0YW5jZUFkbWluSSkucmV0dXJucygpLFxubWFrZUludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSxNLnN0cmluZygpKS5cbm9wdGlvbmFsKE0ucmVjb3JkKCksTS5wYXR0ZXJuKCkpLlxucmV0dXJucyhQYXltZW50U2hhcGUpLFxuZ2V0Um9vdDpNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0QWRtaW5Ob2RlOk0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpKX0pLFxuXG53aXRoZHJhd0ZhY2V0Ok0uaW50ZXJmYWNlKCdXaXRoZHJhd0ZhY2V0Jyx7XG53aXRoZHJhd1BheW1lbnRzOk0uY2FsbChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG5QYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSl9KSxcblxuXG5oZWxwZXJzOk0uaW50ZXJmYWNlKCdJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyIGhlbHBlcicse1xud3JhcElzc3VlcktpdFdpdGhab2VNaW50Ok0uY2FsbChcbktleXdvcmRTaGFwZSxcbklzc3VlcktpdFNoYXBlLFxuTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpKS5cbnJldHVybnMoWm9lTWludFNoYXBlKX0pfSk7JGjigI1fb25jZS5JbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdChJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5cblxuXG5jb25zdCAgICAgICAgQnVuZGxlQ2FwU2hhcGU9TS5yZW1vdGFibGUoJ2J1bmRsZUNhcCcpOyRo4oCNX29uY2UuQnVuZGxlQ2FwU2hhcGUoQnVuZGxlQ2FwU2hhcGUpO1xuY29uc3QgICAgICAgIEJ1bmRsZVNoYXBlPU0uYW5kKFxuTS5zcGxpdFJlY29yZCh7bW9kdWxlRm9ybWF0Ok0uYW55KCl9KSxcbk0ucmVjb3JkT2YoTS5zdHJpbmcoKSxNLnN0cmluZyh7c3RyaW5nTGVuZ3RoTGltaXQ6SW5maW5pdHl9KSkpOyRo4oCNX29uY2UuQnVuZGxlU2hhcGUoQnVuZGxlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZT1NLnNwbGl0UmVjb3JkKFxuaGFyZGVuKHtcbmluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb25TaGFwZX0pLFxuXG5oYXJkZW4oe1xuYnVuZGxlOk0ucmVjb3JkT2YoTS5zdHJpbmcoKSxNLnN0cmluZyh7c3RyaW5nTGVuZ3RoTGltaXQ6SW5maW5pdHl9KSksXG5idW5kbGVDYXA6QnVuZGxlQ2FwU2hhcGUsXG5idW5kbGVJRDpNLnN0cmluZygpfSksXG5cbmhhcmRlbih7fSkpOyRo4oCNX29uY2UuVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUoVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBab2VTdG9yYWdlTWFuYWdlcklLaXQ9aGFyZGVuKHtcbnpvZVNlcnZpY2VEYXRhQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTZXJ2aWNlIGRhdGFBY2Nlc3MnLHtcbmdldFRlcm1zOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSkpLFxuZ2V0SXNzdWVyczpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0QnJhbmRzOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEluc3RhbGxhdGlvbjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbk0uZXJlZihNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpKSxcblxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcblxuZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uOk0uY2FsbChJbnN0YWxsYXRpb25TaGFwZSkucmV0dXJucyhcbk0uZXJlZihNLnN0cmluZygpKSksXG5cbmluc3RhbGxCdW5kbGU6TS5jYWxsKE0ub3IoSW5zdGFuY2VIYW5kbGVTaGFwZSxCdW5kbGVTaGFwZSkpLnJldHVybnMoXG5NLnByb21pc2UoKSksXG5cbmluc3RhbGxCdW5kbGVJRDpNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5cbmdldFB1YmxpY0ZhY2V0Ok0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpKSksXG5cbmdldE9mZmVyRmlsdGVyOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5vcHQoTS5wYXR0ZXJuKCkpKX0pLFxuXG5cbm1ha2VPZmZlckFjY2VzczpNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBtYWtlT2ZmZXIgYWNjZXNzJyx7XG5nZXRBc3NldEtpbmRCeUJyYW5kOk0uY2FsbChCcmFuZFNoYXBlKS5yZXR1cm5zKEFzc2V0S2luZFNoYXBlKSxcbmdldEluc3RhbmNlQWRtaW46TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpKSxcblxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ub3B0KE0ucGF0dGVybigpKSksXG5cbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5kZXBvc2l0UGF5bWVudHM6TS5jYWxsKFByb3Bvc2FsU2hhcGUsUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpLnJldHVybnMoXG5NLnByb21pc2UoKSl9KSxcblxuXG5zdGFydEluc3RhbmNlQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIHN0YXJ0SW5zdGFuY2UgYWNjZXNzJyx7XG5tYWtlWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcjpNLmNhbGwoXG5NLmFueSgpLFxuSW5zdGFsbGF0aW9uU2hhcGUsXG5NLmFueSgpLFxuSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSxcbk0ub3IoSW5zdGFuY2VIYW5kbGVTaGFwZSxCdW5kbGVTaGFwZSksXG5NLm9yKEJ1bmRsZUNhcFNoYXBlLEJ1bmRsZVNoYXBlKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnVud3JhcEluc3RhbGxhdGlvbjpNLmNhbGxXaGVuKE0uZXJlZihJbnN0YWxsYXRpb25TaGFwZSkpLnJldHVybnMoXG5VbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSl9KSxcblxuXG5pbnZpdGF0aW9uSXNzdWVyQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIGludml0YXRpb25Jc3N1ZXInLHtcbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSl9KX0pOyRo4oCNX29uY2UuWm9lU3RvcmFnZU1hbmFnZXJJS2l0KFpvZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5cblxuXG5jb25zdCAgICAgICAgWm9lU2VydmljZUk9TS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UnLHtcbmluc3RhbGw6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuaW5zdGFsbEJ1bmRsZUlEOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbnN0YXJ0SW5zdGFuY2U6TS5jYWxsKE0uZXJlZihJbnN0YWxsYXRpb25TaGFwZSkpLlxub3B0aW9uYWwoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSxNLmFueSgpLE0uYW55KCkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG5vZmZlcjpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLlxub3B0aW9uYWwoUHJvcG9zYWxTaGFwZSxQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSxNLmFueSgpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxuXG5nZXRPZmZlckZpbHRlcjpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5NLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0RmVlSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0QnJhbmRzOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbkJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcblxuZ2V0SXNzdWVyczpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5Jc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuXG5nZXRQdWJsaWNGYWNldDpNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFuY2VIYW5kbGVTaGFwZSkpLnJldHVybnMoXG5NLnJlbW90YWJsZSgnUHVibGljRmFjZXQnKSksXG5cbmdldFRlcm1zOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhNLmFueSgpKSxcbmdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0uZXJlZihNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJykpKSxcblxuZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uOk0uY2FsbChJbnN0YWxsYXRpb25TaGFwZSkucmV0dXJucyhcbk0uZXJlZihNLnN0cmluZygpKSksXG5cblxuZ2V0SW5zdGFsbGF0aW9uOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRJbnN0YW5jZTpNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0Q29uZmlndXJhdGlvbjpNLmNhbGwoKS5yZXR1cm5zKHtcbmZlZUlzc3VlckNvbmZpZzp7XG5uYW1lOk0uc3RyaW5nKCksXG5hc3NldEtpbmQ6J25hdCcsXG5kaXNwbGF5SW5mbzpEaXNwbGF5SW5mb1NoYXBlfX0pLFxuXG5cbmdldEludml0YXRpb25EZXRhaWxzOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLmFueSgpKSxcbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLm9wdChQcm9wb3NhbFNoYXBlKSl9KTskaOKAjV9vbmNlLlpvZVNlcnZpY2VJKFpvZVNlcnZpY2VJKTtcblxuXG5cbmNvbnN0ICAgICAgICBBZG1pbkZhY2V0ST1NLmludGVyZmFjZSgnWmNmQWRtaW5GYWNldCcse1xuZ2V0VmF0U2h1dGRvd25Qcm9taXNlOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxucmVzdGFydENvbnRyYWN0Ok0uY2FsbCgpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxudXBncmFkZUNvbnRyYWN0Ok0uY2FsbChNLnN0cmluZygpKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pOyRo4oCNX29uY2UuQWRtaW5GYWNldEkoQWRtaW5GYWNldEkpO1xuXG5cbmNvbnN0ICAgICAgICBTZWF0RGF0YVNoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5wcm9wb3NhbDpQcm9wb3NhbFNoYXBlLFxuaW5pdGlhbEFsbG9jYXRpb246QW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuc2VhdEhhbmRsZTpTZWF0U2hhcGV9LFxuXG57XG5vZmZlckFyZ3M6TS5hbnkoKX0pOyRo4oCNX29uY2UuU2VhdERhdGFTaGFwZShTZWF0RGF0YVNoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBIYW5kbGVPZmZlckk9TS5pbnRlcmZhY2UoJ0hhbmRsZU9mZmVyJyx7XG5oYW5kbGVPZmZlcjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLFNlYXREYXRhU2hhcGUpLnJldHVybnMoe1xub2ZmZXJSZXN1bHRQcm9taXNlOk0ucHJvbWlzZSgpLFxuZXhpdE9iajpFeGl0T2JqZWN0U2hhcGV9KX0pOyRo4oCNX29uY2UuSGFuZGxlT2ZmZXJJKEhhbmRsZU9mZmVySSk7XG5cblxuXG5jb25zdCAgICAgICAgUHJpY2VRdW90ZVNoYXBlPWhhcmRlbih7XG5xdW90ZUFtb3VudDpBbW91bnRTaGFwZSxcbnF1b3RlUGF5bWVudDpNLmVyZWYoUGF5bWVudFNoYXBlKX0pOyRo4oCNX29uY2UuUHJpY2VRdW90ZVNoYXBlKFByaWNlUXVvdGVTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiS2V5d29yZFNoYXBlIjpbIktleXdvcmRTaGFwZSJdLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiOlsiSW52aXRhdGlvbkhhbmRsZVNoYXBlIl0sIkludml0YXRpb25TaGFwZSI6WyJJbnZpdGF0aW9uU2hhcGUiXSwiSW5zdGFuY2VIYW5kbGVTaGFwZSI6WyJJbnN0YW5jZUhhbmRsZVNoYXBlIl0sIkluc3RhbGxhdGlvblNoYXBlIjpbIkluc3RhbGxhdGlvblNoYXBlIl0sIlNlYXRTaGFwZSI6WyJTZWF0U2hhcGUiXSwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiXSwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIjpbIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIjpbIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiXSwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyUmVjb3JkU2hhcGUiOlsiSXNzdWVyUmVjb3JkU2hhcGUiXSwiVGVybXNTaGFwZSI6WyJUZXJtc1NoYXBlIl0sIkluc3RhbmNlUmVjb3JkU2hhcGUiOlsiSW5zdGFuY2VSZWNvcmRTaGFwZSJdLCJIYW5kbGVJIjpbIkhhbmRsZUkiXSwibWFrZUhhbmRsZVNoYXBlIjpbIm1ha2VIYW5kbGVTaGFwZSJdLCJUaW1lclNoYXBlIjpbIlRpbWVyU2hhcGUiXSwiRnVsbFByb3Bvc2FsU2hhcGUiOlsiRnVsbFByb3Bvc2FsU2hhcGUiXSwiUHJvcG9zYWxTaGFwZSI6WyJQcm9wb3NhbFNoYXBlIl0sImlzT25EZW1hbmRFeGl0UnVsZSI6WyJpc09uRGVtYW5kRXhpdFJ1bGUiXSwiaXNXYWl2ZWRFeGl0UnVsZSI6WyJpc1dhaXZlZEV4aXRSdWxlIl0sImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIjpbImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIl0sIkludml0YXRpb25FbGVtZW50U2hhcGUiOlsiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSJdLCJPZmZlckhhbmRsZXJJIjpbIk9mZmVySGFuZGxlckkiXSwiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiOlsiU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUiXSwiWm9lTWludFNoYXBlIjpbIlpvZU1pbnRTaGFwZSJdLCJab2VNaW50SSI6WyJab2VNaW50SSJdLCJaY2ZNaW50SSI6WyJaY2ZNaW50SSJdLCJGZWVNaW50QWNjZXNzU2hhcGUiOlsiRmVlTWludEFjY2Vzc1NoYXBlIl0sIkV4aXRPYmplY3RJIjpbIkV4aXRPYmplY3RJIl0sIkV4aXRPYmplY3RTaGFwZSI6WyJFeGl0T2JqZWN0U2hhcGUiXSwiSW5zdGFuY2VBZG1pblNoYXBlIjpbIkluc3RhbmNlQWRtaW5TaGFwZSJdLCJJbnN0YW5jZUFkbWluSSI6WyJJbnN0YW5jZUFkbWluSSJdLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJCdW5kbGVDYXBTaGFwZSI6WyJCdW5kbGVDYXBTaGFwZSJdLCJCdW5kbGVTaGFwZSI6WyJCdW5kbGVTaGFwZSJdLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSI6WyJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSJdLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiWm9lU3RvcmFnZU1hbmFnZXJJS2l0Il0sIlpvZVNlcnZpY2VJIjpbIlpvZVNlcnZpY2VJIl0sIkFkbWluRmFjZXRJIjpbIkFkbWluRmFjZXRJIl0sIlNlYXREYXRhU2hhcGUiOlsiU2VhdERhdGFTaGFwZSJdLCJIYW5kbGVPZmZlckkiOlsiSGFuZGxlT2ZmZXJJIl0sIlByaWNlUXVvdGVTaGFwZSI6WyJQcmljZVF1b3RlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAt8K8e+IGAADiBgAAHwAAAEBhZ29yaWMvem9uZS12MC4yLjIvc3JjL2hlYXAuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIk0iLCJoZWFwWm9uZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlRXhvLGRlZmluZUV4b0NsYXNzLGRlZmluZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJNYXBTdG9yZSxtYWtlU2NhbGFyU2V0U3RvcmUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxtYWtlU2NhbGFyV2Vha1NldFN0b3JlLE0sRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VFeG9cIiwgWyRo4oCNX2EgPT4gKG1ha2VFeG8gPSAkaOKAjV9hKV1dLFtcImRlZmluZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChkZWZpbmVFeG9DbGFzcyA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9hID0+IChtYWtlU2NhbGFyU2V0U3RvcmUgPSAkaOKAjV9hKV1dLFtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUgPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKSwkaOKAjV9saXZlW1wiTVwiXV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHR5cGUge1hpbXBvcnQoJy4nKS5TdG9yZXN9XG4gKi9cbmNvbnN0IGhlYXBTdG9yZXM9RmFyKCdoZWFwU3RvcmVzJyx7XG5kZXRhY2hlZDooKT0+aGVhcFN0b3JlcyxcbmlzU3RvcmFibGU6KF9zcGVjaW1lbik9PnRydWUsXG5cbnNldFN0b3JlOm1ha2VTY2FsYXJTZXRTdG9yZSxcbm1hcFN0b3JlOm1ha2VTY2FsYXJNYXBTdG9yZSxcbndlYWtNYXBTdG9yZTptYWtlU2NhbGFyV2Vha01hcFN0b3JlLFxud2Vha1NldFN0b3JlOm1ha2VTY2FsYXJXZWFrU2V0U3RvcmV9KTtcblxuXG4vKipcbiAqIEEgaGVhcCAoaW4tbWVtb3J5KSB6b25lIHRoYXQgdXNlcyB0aGUgZGVmYXVsdCBleG8gYW5kIHN0b3JlIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLicpLlpvbmV9XG4gKi9cbmNvbnN0ICAgICAgICBoZWFwWm9uZT1GYXIoJ2hlYXBab25lJyx7XG5leG9DbGFzczpkZWZpbmVFeG9DbGFzcyxcbmV4b0NsYXNzS2l0OmRlZmluZUV4b0NsYXNzS2l0LFxuZXhvOm1ha2VFeG8sXG5zdWJab25lOihfbGFiZWwsX29wdGlvbnMpPT5oZWFwWm9uZSxcbi4uLmhlYXBTdG9yZXN9KTskaOKAjV9vbmNlLmhlYXBab25lKGhlYXBab25lKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJNIjpbIk0iLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoZWFwWm9uZSI6WyJoZWFwWm9uZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADY9BkwjwkAAI8JAAAgAAAAQGFnb3JpYy96b25lLXYwLjIuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9oZWFwLmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vaGVhcC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlRXhvLGRlZmluZUV4b0NsYXNzLGRlZmluZUV4b0NsYXNzS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VFeG9cIiwgWyRo4oCNX2EgPT4gKG1ha2VFeG8gPSAkaOKAjV9hKV1dLFtcImRlZmluZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChkZWZpbmVFeG9DbGFzcyA9ICRo4oCNX2EpXV0sW1wiZGVmaW5lRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2EgPT4gKGRlZmluZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vaGVhcC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG4vKiBSZWZlcmVuY2VzIHRvIGFsbG93IHRoZSBiZWxvdyB0eXBlb2ZzIHRvIHN1Y2NlZWQuKi9cbm1ha2VFeG87XG5kZWZpbmVFeG9DbGFzcztcbmRlZmluZUV4b0NsYXNzS2l0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtFeG9ab25lICYgU3RvcmVzfSBab25lIEEgYmFnIG9mIG1ldGhvZHMgZm9yIGNyZWF0aW5nIGRlZmVuc2libGUgb2JqZWN0cyBhbmRcbiAqIGNvbGxlY3Rpb25zIHdpdGggdGhlIHNhbWUgYWxsb2NhdGlvbiBzZW1hbnRpY3MgKGVwaGVtZXJhbCwgcGVyc2lzdGVudCwgZXRjKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRXhvWm9uZVxuICogQHByb3BlcnR5IHt0eXBlb2YgbWFrZUV4b30gZXhvIGNyZWF0ZSBhIHNpbmdsZXRvbiBleG8tb2JqZWN0IGluc3RhbmNlIGJvdW5kIHRvIHRoaXMgem9uZVxuICogQHByb3BlcnR5IHt0eXBlb2YgZGVmaW5lRXhvQ2xhc3N9IGV4b0NsYXNzIGNyZWF0ZSBhIG1ha2VyIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGV4by1vYmplY3RzIGJvdW5kIHRvIHRoaXMgem9uZVxuICogQHByb3BlcnR5IHt0eXBlb2YgZGVmaW5lRXhvQ2xhc3NLaXR9IGV4b0NsYXNzS2l0IGNyZWF0ZSBhIFwia2l0XCIgbWFrZXIgZnVuY3Rpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSByZWNvcmQgb2YgZXhvLW9iamVjdHMgc2hhcmluZyB0aGUgc2FtZSBzdGF0ZVxuICogQHByb3BlcnR5IHsobGFiZWw6IHN0cmluZywgb3B0aW9ucz86IFN0b3JlT3B0aW9ucykgPT4gWm9uZX0gc3ViWm9uZSBjcmVhdGUgYSBuZXcgWm9uZSB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gdW50cnVzdGVkIGNvbnN1bWVycyB3aXRob3V0IGV4cG9zaW5nIHRoZSBzdG9yYWdlIG9mIHRoZSBwYXJlbnQgem9uZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVzXG4gKiBAcHJvcGVydHkgeygpID0+IFN0b3Jlc30gZGV0YWNoZWQgb2J0YWluIHN0b3JlIHByb3ZpZGVycyB3aGljaCBhcmUgZGV0YWNoZWQgKHRoZSBzdG9yZXMgYXJlIGFub255bW91cyByYXRoZXIgdGhhbiBib3VuZCB0byBgbGFiZWxgIGluIHRoZSB6b25lKVxuICogQHByb3BlcnR5IHsoc3BlY2ltZW46IHVua25vd24pID0+IGJvb2xlYW59IGlzU3RvcmFibGUgcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpbWVuIGNhbiBiZSBzdG9yZWQgaW4gdGhlIHpvbmUsIHdoZXRoZXIgYXMgZXhvLW9iamVjdCBzdGF0ZSBvciBpbiBhIHN0b3JlXG4gKiBAcHJvcGVydHkgezxLLFY+KGxhYmVsOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yZU9wdGlvbnMpID0+IE1hcFN0b3JlPEssIFY+fSBtYXBTdG9yZSBwcm92aWRlIGEgTWFwLWxpa2Ugc3RvcmUgbmFtZWQgYGxhYmVsYCBpbiB0aGUgem9uZVxuICogQHByb3BlcnR5IHs8Sz4obGFiZWw6IHN0cmluZywgb3B0aW9ucz86IFN0b3JlT3B0aW9ucykgPT4gU2V0U3RvcmU8Sz59IHNldFN0b3JlIHByb3ZpZGUgYSBTZXQtbGlrZSBzdG9yZSBuYW1lZCBgbGFiZWxgIGluIHRoZSB6b25lXG4gKiBAcHJvcGVydHkgezxLLFY+KFxuICogICBsYWJlbDogc3RyaW5nLCBvcHRpb25zPzogU3RvcmVPcHRpb25zKSA9PiBXZWFrTWFwU3RvcmU8SywgVj5cbiAqIH0gd2Vha01hcFN0b3JlIHByb3ZpZGUgYSBXZWFrTWFwLWxpa2Ugc3RvcmUgbmFtZWQgYGxhYmVsYCBpbiB0aGUgem9uZVxuICogQHByb3BlcnR5IHs8Sz4oXG4gKiAgIGxhYmVsOiBzdHJpbmcsIG9wdGlvbnM/OiBTdG9yZU9wdGlvbnMpID0+IFdlYWtTZXRTdG9yZTxLPlxuICogfSB3ZWFrU2V0U3RvcmUgcHJvdmlkZSBhIFdlYWtTZXQtbGlrZSBzdG9yZSBuYW1lZCBgbGFiZWxgIGluIHRoZSB6b25lXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfiRuLdIRAADSEQAAJAAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCB0cmFja1R1cm5zOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIiwgWyRo4oCNX2EgPT4gKHRyYWNrVHVybnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge1Byb3h5SGFuZGxlcjxhbnk+fSAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcj17XG5zZXQoX3RhcmdldCxfcHJvcCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5pc0V4dGVuc2libGUoX3RhcmdldCl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbnNldFByb3RvdHlwZU9mKF90YXJnZXQsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuZGVsZXRlUHJvcGVydHkoX3RhcmdldCxfcHJvcCl7XG5yZXR1cm4gZmFsc2U7XG4gfX07XG5cblxuLyogRSBQcm94eSBoYW5kbGVycyBwcmV0ZW5kIHRoYXQgYW55IHByb3BlcnR5IGV4aXN0cyBvbiB0aGUgdGFyZ2V0IGFuZCByZXR1cm5zKi9cbi8qIGEgZnVuY3Rpb24gZm9yIHRoZWlyIHZhbHVlLiBXaGlsZSB0aGlzIGZ1bmN0aW9uIGlzIFwiYm91bmRcIiBieSBjb250ZXh0LCBpdCBpcyovXG4vKiBtZWFudCB0byBiZSBjYWxsZWQgYXMgYSBtZXRob2QuIEZvciB0aGF0IHJlYXNvbiwgdGhlIHJldHVybmVkIGZ1bmN0aW9uKi9cbi8qIGluY2x1ZGVzIGEgY2hlY2sgdGhhdCB0aGUgYHRoaXNgIGFyZ3VtZW50IGNvcnJlc3BvbmRzIHRvIHRoZSBpbml0aWFsKi9cbi8qIHJlY2VpdmVyIHdoZW4gdGhlIGZ1bmN0aW9uIHdhcyByZXRyaWV2ZWQuKi9cbi8qIEUgUHJveHkgaGFuZGxlcnMgYWxzbyBmb3J3YXJkIGRpcmVjdCBjYWxscyB0byB0aGUgdGFyZ2V0IGluIGNhc2UgdGhlIHJlbW90ZSovXG4vKiBpcyBhIGZ1bmN0aW9uIGluc3RlYWQgb2YgYW4gb2JqZWN0LiBObyBzdWNoIHJlY2VpdmVyIGNoZWNrcyBhcmUgbmVjZXNzYXJ5IGluKi9cbi8qIHRoYXQgY2FzZS4qL1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRSh4KS5cbiAqXG4gKiBAcGFyYW0geyp9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFKHgpXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vaW5kZXgnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gRVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKXtcbnJldHVybiBoYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldChfdGFyZ2V0LHAscmVjZWl2ZXIpe1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuaWYodGhpcyE9PXJlY2VpdmVyKXtcbi8qIFJlamVjdCB0aGUgYXN5bmMgZnVuY3Rpb24gY2FsbCovXG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVqZWN0KFxuYXNzZXJ0LmVycm9yKFxuWCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3B9XCIgbWV0aG9kIG9mIEUoJHtxKHgpfSlgKSk7XG5cblxuIH1cblxucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kKHgscCxhcmdzKTtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL31bXG5wXSk7XG5cbiB9LFxuYXBwbHkoX3RhcmdldCxfdGhpc0FyZyxhcmdBcnJheT1bXSl7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvbih4LGFyZ0FycmF5KTtcbiB9LFxuaGFzKF90YXJnZXQsX3Ape1xuLyogV2UganVzdCBwcmV0ZW5kIGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cbiB9XG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFLnNlbmRPbmx5KHgpXG4gKiBJdCBpcyBhIHZhcmlhbnQgb24gdGhlIEUoeCkgUHJveHkgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0geyp9IHggQW55IHZhbHVlIHBhc3NlZCB0byBFLnNlbmRPbmx5KHgpXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vaW5kZXgnKS5IYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuZnVuY3Rpb24gRXNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2Upe1xucmV0dXJuIGhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0KF90YXJnZXQscCxyZWNlaXZlcil7XG5yZXR1cm4gaGFyZGVuKFxue1xuLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbi8qIHN5bnRheCByYXRoZXIgdGhhbiBhcyBhbiBhcnJvdyBmdW5jdGlvbi4gVG8gZW5zdXJlIHRoZSBmdW5jdGlvbiovXG4vKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG5bcF0oLi4uYXJncyl7XG4vKiBUaHJvdyBzaW5jZSB0aGUgZnVuY3Rpb24gcmV0dXJucyBub3RoaW5nKi9cbnRoaXM9PT1yZWNlaXZlcnx8XG5GYWlsIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShwKX1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EoXG54KVxuIH0pYDtcbkhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkoeCxwLGFyZ3MpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG4vKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL31bXG5wXSk7XG5cbiB9LFxuYXBwbHkoX3RhcmdldCxfdGhpc0FyZyxhcmdzQXJyYXk9W10pe1xuSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvblNlbmRPbmx5KHgsYXJnc0FycmF5KTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFdlIGp1c3QgcHJldGVuZCB0aGF0IGV2ZXJ5dGhpbmcgZXhpc3RzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cbiB9XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL2luZGV4JykuRVByb3h5fVxuICovXG5mdW5jdGlvbiAgICAgICAgICAgICAgICBtYWtlRShIYW5kbGVkUHJvbWlzZSl7XG5mdW5jdGlvbiBFKHgpe1xuY29uc3QgaGFuZGxlcj1FUHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfVxuXG5jb25zdCBtYWtlRUdldHRlclByb3h5PSh4KT0+XG5uZXcgUHJveHkoT2JqZWN0LmNyZWF0ZShudWxsKSx7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuaGFzKF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIHRydWU7XG4gfSxcbmdldChfdGFyZ2V0LHByb3Ape1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmdldCh4LHByb3ApO1xuIH19KTtcblxuXG5FLmdldD1tYWtlRUdldHRlclByb3h5O1xuRS5yZXNvbHZlPUhhbmRsZWRQcm9taXNlLnJlc29sdmU7XG5FLnNlbmRPbmx5PSh4KT0+e1xuY29uc3QgaGFuZGxlcj1Fc2VuZE9ubHlQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSk7XG5yZXR1cm4gaGFyZGVuKG5ldyBQcm94eSgoKT0+eyB9LGhhbmRsZXIpKTtcbiB9O1xuXG5FLndoZW49KHgsb25mdWxmaWxsZWQsb25yZWplY3RlZCk9PntcbmNvbnN0W29uc3VjY2VzcyxvbmZhaWx1cmVdPXRyYWNrVHVybnMoW29uZnVsZmlsbGVkLG9ucmVqZWN0ZWRdKTtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4ob25zdWNjZXNzLG9uZmFpbHVyZSk7XG4gfTtcblxucmV0dXJuIGhhcmRlbihFKTtcbiB9JGjigI1fb25jZS5kZWZhdWx0KCAgICAgbWFrZUUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA3C+1PHwIAAB8CAAAqAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yL3NyYy9uby1zaGltLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyJdLCJleHBvcnRzIjpbIkUiLCJIYW5kbGVkUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlRTskaOKAjV9pbXBvcnRzKFtbXCIuL0UuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRo4oCNX2EgPT4gKG1ha2VFID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuY29uc3QgaHA9SGFuZGxlZFByb21pc2U7JGjigI1fb25jZS5ocChocCk7XG5jb25zdCAgICAgICAgRT1tYWtlRShIYW5kbGVkUHJvbWlzZSk7JGjigI1fb25jZS5FKEUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAChWCM/jxAAAI8QAAAuAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yL3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4vKiBAdHMtbm9jaGVjayovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiBOT1RFOiBXZSBjYW4ndCBpbXBvcnQgdGhlc2UgYmVjYXVzZSB0aGV5J3JlIG5vdCBpbiBzY29wZSBiZWZvcmUgbG9ja2Rvd24uKi9cbi8qIGltcG9ydCB7IGFzc2VydCwgZGV0YWlscyBhcyBYLCBGYWlsIH0gZnJvbSAnQGFnb3JpYy9hc3NlcnQnOyovXG5cbi8qIFdBUk5JTkc6IEdsb2JhbCBNdXRhYmxlIFN0YXRlISovXG4vKiBUaGlzIHN0YXRlIGlzIGNvbW11bmljYXRlZCB0byBgYXNzZXJ0YCB0aGF0IG1ha2VzIGl0IGF2YWlsYWJsZSB0byB0aGUqL1xuLyogY2F1c2FsIGNvbnNvbGUsIHdoaWNoIGFmZmVjdHMgdGhlIGNvbnNvbGUgbG9nIG91dHB1dC4gTm9ybWFsbHkgd2UqL1xuLyogcmVnYXJkIHRoZSBhYmlsaXR5IHRvIHNlZSBjb25zb2xlIGxvZyBvdXRwdXQgYXMgYSBtZXRhLWxldmVsIHByaXZpbGVnZSovXG4vKiBhbmFsb2dvdXMgdG8gdGhlIGFiaWxpdHkgdG8gZGVidWcuIEFzaWRlIGZyb20gdGhhdCwgdGhpcyBtb2R1bGUgc2hvdWxkKi9cbi8qIG5vdCBoYXZlIGFueSBvYnNlcnZhYmx5IG11dGFibGUgc3RhdGUuKi9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm49MDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQ9MDtcblxuLyogVE9ETyBVc2UgZW52aXJvbm1lbnQtb3B0aW9ucy5qcyBjdXJyZW50bHkgaW4gc2VzL3NyYyBhZnRlciBmYWN0b3JpbmcgaXQgb3V0Ki9cbi8qIHRvIGEgbmV3IHBhY2thZ2UuKi9cbmNvbnN0IGVudj0oZ2xvYmFsVGhpcy5wcm9jZXNzfHx7fSkuZW52fHx7fTtcblxuLyogVHVybiBvbiBpZiB5b3Ugc2VlbSB0byBiZSBsb3NpbmcgZXJyb3IgbG9nZ2luZyBhdCB0aGUgdG9wIG9mIHRoZSBldmVudCBsb29wKi9cbmNvbnN0IFZFUkJPU0U9KGVudi5ERUJVR3x8JycpLnNwbGl0KCc6JykuaW5jbHVkZXMoJ3RyYWNrLXR1cm5zJyk7XG5cbmNvbnN0IHZhbGlkT3B0aW9uVmFsdWVzPWZyZWV6ZShbdW5kZWZpbmVkLCdlbmFibGVkJywnZGlzYWJsZWQnXSk7XG5cbi8qIFRyYWNrLXR1cm5zIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgY2FuIGJlIGRpc2FibGVkIGJ5IGFuIGVudmlyb25tZW50Ki9cbi8qIG9wdGlvbi4qL1xuY29uc3QgZW52T3B0aW9uVmFsdWU9ZW52LlRSQUNLX1RVUk5TO1xuaWYoIXZhbGlkT3B0aW9uVmFsdWVzLmluY2x1ZGVzKGVudk9wdGlvblZhbHVlKSl7XG50aHJvdyBuZXcgVHlwZUVycm9yKFxuIGB1bnJlY29nbml6ZWQgVFJBQ0tfVFVSTlMgJHtKU09OLnN0cmluZ2lmeShlbnZPcHRpb25WYWx1ZSl9YCk7XG5cbiB9XG5jb25zdCBFTkFCTEVEPShlbnZPcHRpb25WYWx1ZXx8J2Rpc2FibGVkJyk9PT0nZW5hYmxlZCc7XG5cbi8qIFdlIGhvaXN0IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG91dCBvZiB0cmFja1R1cm5zKCkgdG8gZGlzY291cmFnZSB0aGUqL1xuLyogY2xvc3VyZXMgZnJvbSBob2xkaW5nIG9udG8gJ2FyZ3MnIG9yICdmdW5jJyBsb25nZXIgdGhhbiBuZWNlc3NhcnksKi9cbi8qIHdoaWNoIHdlJ3ZlIHNlZW4gY2F1c2UgSGFuZGxlZFByb21pc2UgYXJndW1lbnRzIHRvIGJlIHJldGFpbmVkIGZvciovXG4vKiBhIHN1cnByaXNpbmdseSBsb25nIHRpbWUuKi9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZT0oZGV0YWlsc05vdGUpPT4ocmVhc29uKT0+e1xuaWYocmVhc29uIGluc3RhbmNlb2YgRXJyb3Ipe1xuYXNzZXJ0Lm5vdGUocmVhc29uLGRldGFpbHNOb3RlKTtcbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdSRUpFQ1RFRCBhdCB0b3Agb2YgZXZlbnQgbG9vcCcscmVhc29uKTtcbiB9XG4gfTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uPVxuKGZ1bmMsc2VuZGluZ0Vycm9yLFgpPT5cbiguLi5hcmdzKT0+e1xuaGlkZGVuUHJpb3JFcnJvcj1zZW5kaW5nRXJyb3I7XG5oaWRkZW5DdXJyZW50VHVybis9MTtcbmhpZGRlbkN1cnJlbnRFdmVudD0wO1xudHJ5e1xubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xuaWYoZXJyIGluc3RhbmNlb2YgRXJyb3Ipe1xuYXNzZXJ0Lm5vdGUoXG5lcnIsXG5YIGBUaHJvd24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gKTtcblxuIH1cbmlmKFZFUkJPU0Upe1xuY29uc29sZS5sb2coJ1RIUk9XTiB0byB0b3Agb2YgZXZlbnQgbG9vcCcsZXJyKTtcbiB9XG50aHJvdyBlcnI7XG4gfVxuLyogTXVzdCBjYXB0dXJlIHRoaXMgbm93LCBub3Qgd2hlbiB0aGUgY2F0Y2ggdHJpZ2dlcnMuKi9cbmNvbnN0IGRldGFpbHNOb3RlPVggYFJlamVjdGlvbiBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWA7XG5Qcm9taXNlLnJlc29sdmUocmVzdWx0KS5jYXRjaChhZGRSZWplY3Rpb25Ob3RlKGRldGFpbHNOb3RlKSk7XG5yZXR1cm4gcmVzdWx0O1xuIH1maW5hbGx5e1xuaGlkZGVuUHJpb3JFcnJvcj11bmRlZmluZWQ7XG4gfVxuIH07XG5cbi8qKlxuICogQHR5cGVkZWYgeygoLi4uYXJnczogYW55W10pID0+IGFueSkgfCB1bmRlZmluZWR9IFR1cm5TdGFydGVyRm5cbiAqIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgaXMgbm90IHRoaXMtc2Vuc2l0aXZlLCBleHBlY3RlZCB0byBiZSBjYWxsZWQgYXRcbiAqIGJvdHRvbSBvZiBzdGFjayB0byBzdGFydCBhIG5ldyB0dXJuLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtUdXJuU3RhcnRlckZuW119IFRcbiAqIEdpdmVuIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzLCByZXR1cm5zIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzIHdob3NlXG4gKiBgdGhpc2AtZnJlZSBjYWxsIGJlaGF2aW9ycyBhcmUgbm90IG9ic2VydmFibHkgZGlmZmVyZW50IHRvIHRob3NlIHRoYXRcbiAqIGNhbm5vdCBzZWUgY29uc29sZSBvdXRwdXQuIFRoZSBvbmx5IHB1cnBvc2UgaXMgdG8gY2F1c2UgYWRkaXRpb25hbFxuICogaW5mb3JtYXRpb24gdG8gYXBwZWFyIG9uIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBjYWxsIHRvIGB0cmFja1R1cm5zYCBpcyBpdHNlbGYgYSBzZW5kaW5nIGV2ZW50LCB0aGF0IG9jY3VycyBpbiBzb21lIGNhbGxcbiAqIHN0YWNrIGluIHNvbWUgdHVybiBudW1iZXIgYXQgc29tZSBldmVudCBudW1iZXIgd2l0aGluIHRoYXQgdHVybi4gRWFjaCBjYWxsXG4gKiB0byBhbnkgb2YgdGhlIHJldHVybmVkIGBUdXJuU3RhcnRGbmBzIGlzIGEgcmVjZWl2aW5nIGV2ZW50IHRoYXQgYmVnaW5zIGEgbmV3XG4gKiB0dXJuLiBUaGlzIHNlbmRpbmcgZXZlbnQgY2F1c2VkIGVhY2ggb2YgdGhvc2UgcmVjZWl2aW5nIGV2ZW50cy5cbiAqXG4gKiBAcGFyYW0ge1R9IGZ1bmNzXG4gKiBAcmV0dXJucyB7VH1cbiAqL1xuY29uc3QgICAgICAgIHRyYWNrVHVybnM9KGZ1bmNzKT0+e1xuaWYoIUVOQUJMRUR8fHR5cGVvZiBnbG9iYWxUaGlzPT09J3VuZGVmaW5lZCd8fCFnbG9iYWxUaGlzLmFzc2VydCl7XG5yZXR1cm4gZnVuY3M7XG4gfVxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5cbmhpZGRlbkN1cnJlbnRFdmVudCs9MTtcbmNvbnN0IHNlbmRpbmdFcnJvcj1uZXcgRXJyb3IoXG4gYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gKTtcblxuaWYoaGlkZGVuUHJpb3JFcnJvciE9PXVuZGVmaW5lZCl7XG5hc3NlcnQubm90ZShzZW5kaW5nRXJyb3IsWCBgQ2F1c2VkIGJ5OiAke2hpZGRlblByaW9yRXJyb3J9YCk7XG4gfVxuXG5yZXR1cm4gZnVuY3MubWFwKChmdW5jKT0+ZnVuYyYmd3JhcEZ1bmN0aW9uKGZ1bmMsc2VuZGluZ0Vycm9yLFgpKTtcbiB9OyRo4oCNX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cmFja1R1cm5zIjpbInRyYWNrVHVybnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOlKtTRwCAAAcAgAAGQAAAEBlbmRvL2V4by12MC4yLjIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZXhvLW1ha2Vycy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9leG8tbWFrZXJzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2V4by1tYWtlcnMuanMiOltbImluaXRFbXB0eSIsImluaXRFbXB0eSJdLFsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyJdLFsiZGVmaW5lRXhvQ2xhc3NLaXQiLCJkZWZpbmVFeG9DbGFzc0tpdCJdLFsibWFrZUV4byIsIm1ha2VFeG8iXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMa361ZjGAAAYxgAACIAAABAZW5kby9leG8tdjAuMi4yL3NyYy9leG8tbWFrZXJzLmpzeyJpbXBvcnRzIjpbIi4vZXhvLXRvb2xzLmpzIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzS2l0IiwiaW5pdEVtcHR5IiwibWFrZUV4byJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBvYmplY3RNYXAsZGVmZW5kUHJvdG90eXBlLGRlZmVuZFByb3RvdHlwZUtpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wib2JqZWN0TWFwXCIsIFskaOKAjV9hID0+IChvYmplY3RNYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi9leG8tdG9vbHMuanNcIiwgW1tcImRlZmVuZFByb3RvdHlwZVwiLCBbJGjigI1fYSA9PiAoZGVmZW5kUHJvdG90eXBlID0gJGjigI1fYSldXSxbXCJkZWZlbmRQcm90b3R5cGVLaXRcIiwgWyRo4oCNX2EgPT4gKGRlZmVuZFByb3RvdHlwZUtpdCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbmNvbnN0e2NyZWF0ZSxzZWFsLGZyZWV6ZSxkZWZpbmVQcm9wZXJ0eX09T2JqZWN0O1xuXG4vKiBUT0RPIFVzZSBlbnZpcm9ubWVudC1vcHRpb25zLmpzIGN1cnJlbnRseSBpbiBzZXMvc3JjIGFmdGVyIGZhY3RvcmluZyBpdCBvdXQqL1xuLyogdG8gYSBuZXcgcGFja2FnZS4qL1xuY29uc3QgZW52PShnbG9iYWxUaGlzLnByb2Nlc3N8fHt9KS5lbnZ8fHt9O1xuXG4vKiBUdXJuIG9uIHRvIGdpdmUgZWFjaCBleG8gaW5zdGFuY2UgaXRzIG93biB0b1N0cmluZ1RhZyB2YWx1ZS4qL1xuY29uc3QgTEFCRUxfSU5TVEFOQ0VTPShlbnYuREVCVUd8fCcnKS5cbnNwbGl0KCcsJykuXG5pbmNsdWRlcygnbGFiZWwtaW5zdGFuY2VzJyk7XG5cbmNvbnN0IG1ha2VTZWxmPShwcm90byxpbnN0YW5jZUNvdW50KT0+e1xuY29uc3Qgc2VsZj1jcmVhdGUocHJvdG8pO1xuaWYoTEFCRUxfSU5TVEFOQ0VTKXtcbmRlZmluZVByb3BlcnR5KHNlbGYsU3ltYm9sLnRvU3RyaW5nVGFnLHtcbnZhbHVlOiBgJHtwcm90b1tTeW1ib2wudG9TdHJpbmdUYWddfSMke2luc3RhbmNlQ291bnR9YCxcbndyaXRhYmxlOmZhbHNlLFxuZW51bWVyYWJsZTpmYWxzZSxcbmNvbmZpZ3VyYWJsZTpmYWxzZX0pO1xuXG4gfVxucmV0dXJuIGhhcmRlbihzZWxmKTtcbiB9O1xuXG5jb25zdCBlbXB0eVJlY29yZD1oYXJkZW4oe30pO1xuXG4vKipcbiAqIFdoZW4gY2FsbGluZyBgZGVmaW5lRHVyYWJsZUtpbmRgIGFuZFxuICogaXRzIHNpYmxpbmdzLCB1c2VkIGFzIHRoZSBgaW5pdGAgZnVuY3Rpb24gYXJndW1lbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGVcbiAqIHN0YXRlIHJlY29yZCBvZiB0aGUgKHZpcnR1YWwvZHVyYWJsZSkgaW5zdGFuY2VzIG9mIHRoZSBraW5kL2V4b0NsYXNzXG4gKiBzaG91bGQgYmUgZW1wdHksIGFuZCB0aGF0IHRoZSByZXR1cm5lZCBtYWtlciBmdW5jdGlvbiBzaG91bGQgaGF2ZSB6ZXJvXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuY29uc3QgICAgICAgIGluaXRFbXB0eT0oKT0+ZW1wdHlSZWNvcmQ7XG5cbi8qKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vZXhvLXRvb2xzLmpzJykuRmFjZXROYW1lfSBGYWNldE5hbWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2V4by10b29scy5qcycpLk1ldGhvZHN9IE1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUyA9IGFueV1cbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gW00gPSBhbnldXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9leG8tdG9vbHMuanMnKS5DbGFzc0NvbnRleHR9IENsYXNzQ29udGV4dFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gW0YgPSBhbnldXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9leG8tdG9vbHMuanMnKS5LaXRDb250ZXh0fSBLaXRDb250ZXh0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1tuYW1lOiBzdHJpbmddOiBYaW1wb3J0KCdAZW5kby9wYXR0ZXJucycpLlBhdHRlcm59fSBTdGF0ZVNoYXBlXG4gKiBJdCBsb29rcyBsaWtlIGEgY29weVJlY29yZCBwYXR0ZXJuLCBidXQgdGhlIGludGVycHJldGF0aW9uIGlzIGRpZmZlcmVudC5cbiAqIEVhY2ggcHJvcGVydHkgaXMgZGlzdGluY3QsIGlzIGNoZWNrZWQgYW5kIGNoYW5nZWQgc2VwYXJhdGVseS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBDXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGYXJDbGFzc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KGNvbnRleHQ6IEMpID0+IHZvaWR9IFtmaW5pc2hdXG4gKiBAcHJvcGVydHkge1N0YXRlU2hhcGV9IFtzdGF0ZVNoYXBlXVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSSBpbml0IGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IE0gbWV0aG9kc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7TSAmIFRoaXNUeXBlPHsgc2VsZjogTSwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RmFyQ2xhc3NPcHRpb25zPENsYXNzQ29udGV4dDxSZXR1cm5UeXBlPEk+LCBNPj59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiAoTSAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgTT4pfVxuICovJGjigI1fb25jZS5pbml0RW1wdHkoaW5pdEVtcHR5KTtcbmNvbnN0ICAgICAgICBkZWZpbmVFeG9DbGFzcz0odGFnLGludGVyZmFjZUd1YXJkLGluaXQsbWV0aG9kcyxvcHRpb25zKT0+e1xuY29uc3R7ZmluaXNoPXVuZGVmaW5lZH09b3B0aW9uc3x8e307XG4vKiogQHR5cGUge1dlYWtNYXA8TSxDbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPiwgTT4+fSAqL1xuY29uc3QgY29udGV4dE1hcD1uZXcgV2Vha01hcCgpO1xuY29uc3QgcHJvdG89ZGVmZW5kUHJvdG90eXBlKFxudGFnLFxuKHNlbGYpPT4vKiogQHR5cGUge2FueX0gKi9jb250ZXh0TWFwLmdldChzZWxmKSxcbm1ldGhvZHMsXG50cnVlLFxuaW50ZXJmYWNlR3VhcmQpO1xuXG5sZXQgaW5zdGFuY2VDb3VudD0wO1xuLyoqXG4gKiBAcGFyYW0gIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKi9cbmNvbnN0IG1ha2VJbnN0YW5jZT0oLi4uYXJncyk9Pntcbi8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbmNvbnN0IHN0YXRlPXNlYWwoaW5pdCguLi5hcmdzKSk7XG5pbnN0YW5jZUNvdW50Kz0xO1xuLyoqIEB0eXBlIHtNfSAqL1xuY29uc3Qgc2VsZj1tYWtlU2VsZihwcm90byxpbnN0YW5jZUNvdW50KTtcblxuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuLyoqIEB0eXBlIHtDbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPixNPn0gKi9cbmNvbnN0IGNvbnRleHQ9ZnJlZXplKHtzdGF0ZSxzZWxmfSk7XG5jb250ZXh0TWFwLnNldChzZWxmLGNvbnRleHQpO1xuaWYoZmluaXNoKXtcbmZpbmlzaChjb250ZXh0KTtcbiB9XG5yZXR1cm4gKC8qKiBAdHlwZSB7TSAmIFhpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDx7fSwgTT59ICovXG5zZWxmKTtcblxuIH07XG5yZXR1cm4gaGFyZGVuKG1ha2VJbnN0YW5jZSk7XG4gfTskaOKAjV9vbmNlLmRlZmluZUV4b0NsYXNzKGRlZmluZUV4b0NsYXNzKTtcbmhhcmRlbihkZWZpbmVFeG9DbGFzcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSSBpbml0IGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxGYWNldE5hbWUsIE1ldGhvZHM+fSBGIGZhY2V0IG1ldGhvZHNcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge0YgJiBUaGlzVHlwZTx7IGZhY2V0czogRiwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT4gfSBtZXRob2RzS2l0XG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxLaXRDb250ZXh0PFJldHVyblR5cGU8ST4sRj4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gRn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUV4b0NsYXNzS2l0PShcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbm1ldGhvZHNLaXQsXG5vcHRpb25zKT0+XG57XG5jb25zdHtmaW5pc2g9dW5kZWZpbmVkfT1vcHRpb25zfHx7fTtcbmNvbnN0IGNvbnRleHRNYXBLaXQ9b2JqZWN0TWFwKG1ldGhvZHNLaXQsKCk9Pm5ldyBXZWFrTWFwKCkpO1xuY29uc3QgZ2V0Q29udGV4dEtpdD1vYmplY3RNYXAoXG5tZXRob2RzS2l0LFxuKF92LG5hbWUpPT4oZmFjZXQpPT5jb250ZXh0TWFwS2l0W25hbWVdLmdldChmYWNldCkpO1xuXG5jb25zdCBwcm90b3R5cGVLaXQ9ZGVmZW5kUHJvdG90eXBlS2l0KFxudGFnLFxuZ2V0Q29udGV4dEtpdCxcbm1ldGhvZHNLaXQsXG50cnVlLFxuaW50ZXJmYWNlR3VhcmRLaXQpO1xuXG5sZXQgaW5zdGFuY2VDb3VudD0wO1xuLyoqXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqL1xuY29uc3QgbWFrZUluc3RhbmNlS2l0PSguLi5hcmdzKT0+e1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbi8qIERvbid0IGZyZWV6ZSBjb250ZXh0IHVudGlsIHdlIGFkZCBmYWNldHMqL1xuLyoqIEB0eXBlIHtLaXRDb250ZXh0PFJldHVyblR5cGU8ST4sRj59ICovXG5jb25zdCBjb250ZXh0PXtzdGF0ZSxmYWNldHM6e319O1xuaW5zdGFuY2VDb3VudCs9MTtcbmNvbnN0IGZhY2V0cz1vYmplY3RNYXAocHJvdG90eXBlS2l0LChwcm90byxmYWNldE5hbWUpPT57XG5jb25zdCBzZWxmPW1ha2VTZWxmKHByb3RvLGluc3RhbmNlQ291bnQpO1xuY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLnNldChzZWxmLGNvbnRleHQpO1xucmV0dXJuIHNlbGY7XG4gfSk7XG5jb250ZXh0LmZhY2V0cz1mYWNldHM7XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5mcmVlemUoY29udGV4dCk7XG5pZihmaW5pc2gpe1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbnJldHVybiBjb250ZXh0LmZhY2V0cztcbiB9O1xucmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2VLaXQpO1xuIH07JGjigI1fb25jZS5kZWZpbmVFeG9DbGFzc0tpdChkZWZpbmVFeG9DbGFzc0tpdCk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3NLaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7TWV0aG9kc30gVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9wYXR0ZXJucycpLkludGVyZmFjZUd1YXJkIHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZCBDQVZFQVQ6IHN0YXRpYyB0eXBpbmcgZG9lcyBub3QgeWV0IHN1cHBvcnQgYGNhbGxXaGVuYCB0cmFuc2Zvcm1hdGlvblxuICogQHBhcmFtIHtUfSBtZXRob2RzXG4gKiBAcGFyYW0ge0ZhckNsYXNzT3B0aW9uczxDbGFzc0NvbnRleHQ8e30sVD4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFeG89KHRhZyxpbnRlcmZhY2VHdWFyZCxtZXRob2RzLG9wdGlvbnM9dW5kZWZpbmVkKT0+e1xuY29uc3QgbWFrZUluc3RhbmNlPWRlZmluZUV4b0NsYXNzKFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cbnJldHVybiBtYWtlSW5zdGFuY2UoKTtcbiB9OyRo4oCNX29uY2UubWFrZUV4byhtYWtlRXhvKTtcbmhhcmRlbihtYWtlRXhvKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbml0RW1wdHkiOlsiaW5pdEVtcHR5Il0sImRlZmluZUV4b0NsYXNzIjpbImRlZmluZUV4b0NsYXNzIl0sImRlZmluZUV4b0NsYXNzS2l0IjpbImRlZmluZUV4b0NsYXNzS2l0Il0sIm1ha2VFeG8iOlsibWFrZUV4byJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAxsK3ycSYAAHEmAAAhAAAAQGVuZG8vZXhvLXYwLjIuMi9zcmMvZXhvLXRvb2xzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiZGVmZW5kUHJvdG90eXBlIiwiZGVmZW5kUHJvdG90eXBlS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsRmFyLGxpc3REaWZmZXJlbmNlLG9iamVjdE1hcCxtdXN0TWF0Y2gsTTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJsaXN0RGlmZmVyZW5jZVwiLCBbJGjigI1fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaOKAjV9hKV1dLFtcIm9iamVjdE1hcFwiLCBbJGjigI1fYSA9PiAob2JqZWN0TWFwID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGF0dGVybnMnKS5NZXRob2R9IE1ldGhvZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXR0ZXJucycpLk1ldGhvZEd1YXJkfSBNZXRob2RHdWFyZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXR0ZXJucycpLkludGVyZmFjZUd1YXJkfSBJbnRlcmZhY2VHdWFyZCAqL1xuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2FwcGx5LG93bktleXN9PVJlZmxlY3Q7XG5jb25zdHtkZWZpbmVQcm9wZXJ0aWVzfT1PYmplY3Q7XG5cbi8qKlxuICogQSBtZXRob2QgZ3VhcmQsIGZvciBpbmNsdXNpb24gaW4gYW4gaW50ZXJmYWNlIGd1YXJkLCB0aGF0IGVuZm9yY2VzIG9ubHkgdGhhdFxuICogYWxsIGFyZ3VtZW50cyBhcmUgcGFzc2FibGUgYW5kIHRoYXQgdGhlIHJlc3VsdCBpcyBwYXNzYWJsZS4gKEluIGZhciBjbGFzc2VzLFxuICogXCJhbnlcIiBtZWFucyBhbnkgKnBhc3NhYmxlKi4pIFRoaXMgaXMgdGhlIGxlYXN0IHBvc3NpYmxlIGVuZm9yY2VtZW50IGZvciBhXG4gKiBtZXRob2QgZ3VhcmQsIGFuZCBpcyBpbXBsaWVkIGJ5IGFsbCBvdGhlciBtZXRob2QgZ3VhcmRzLlxuICovXG5jb25zdCBNaW5NZXRob2RHdWFyZD1NLmNhbGwoKS5yZXN0KE0uYW55KCkpLnJldHVybnMoTS5hbnkoKSk7XG5cbmNvbnN0IGRlZmVuZFN5bmNBcmdzPShhcmdzLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7YXJnR3VhcmRzLG9wdGlvbmFsQXJnR3VhcmRzLHJlc3RBcmdHdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdCBwYXJhbXNQYXR0ZXJuPU0uc3BsaXRBcnJheShcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxucmVzdEFyZ0d1YXJkKTtcblxubXVzdE1hdGNoKGhhcmRlbihhcmdzKSxwYXJhbXNQYXR0ZXJuLGxhYmVsKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7TWV0aG9kfSBtZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEByZXR1cm5zIHtNZXRob2R9XG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0e3N5bmNNZXRob2R9PXtcbi8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuc3luY01ldGhvZCguLi5hcmdzKXtcbmRlZmVuZFN5bmNBcmdzKGhhcmRlbihhcmdzKSxtZXRob2RHdWFyZCxsYWJlbCk7XG5jb25zdCByZXN1bHQ9YXBwbHkobWV0aG9kLHRoaXMsYXJncyk7XG5tdXN0TWF0Y2goaGFyZGVuKHJlc3VsdCkscmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG5yZXR1cm4gcmVzdWx0O1xuIH19O1xuXG5yZXR1cm4gc3luY01ldGhvZDtcbiB9O1xuXG5jb25zdCBpc0F3YWl0QXJnR3VhcmQ9KGFyZ0d1YXJkKT0+XG5hcmdHdWFyZCYmdHlwZW9mIGFyZ0d1YXJkPT09J29iamVjdCcmJmFyZ0d1YXJkLmtsYXNzPT09J2F3YWl0QXJnJztcblxuY29uc3QgZGVzeW5jPShtZXRob2RHdWFyZCk9PntcbmNvbnN0e2FyZ0d1YXJkcyxvcHRpb25hbEFyZ0d1YXJkcz1bXSxyZXN0QXJnR3VhcmR9PW1ldGhvZEd1YXJkO1xuIWlzQXdhaXRBcmdHdWFyZChyZXN0QXJnR3VhcmQpfHxcbkZhaWwgYFJlc3QgYXJncyBtYXkgbm90IGJlIGF3YWl0ZWQ6ICR7cmVzdEFyZ0d1YXJkfWA7XG5jb25zdCByYXdBcmdHdWFyZHM9Wy4uLmFyZ0d1YXJkcywuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbmNvbnN0IGF3YWl0SW5kZXhlcz1bXTtcbmZvcihsZXQgaT0wO2k8cmF3QXJnR3VhcmRzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGFyZ0d1YXJkPXJhd0FyZ0d1YXJkc1tpXTtcbmlmKGlzQXdhaXRBcmdHdWFyZChhcmdHdWFyZCkpe1xucmF3QXJnR3VhcmRzW2ldPWFyZ0d1YXJkLmFyZ0d1YXJkO1xuYXdhaXRJbmRleGVzLnB1c2goaSk7XG4gfVxuIH1cbnJldHVybntcbmF3YWl0SW5kZXhlcyxcbnJhd01ldGhvZEd1YXJkOntcbmFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoMCxhcmdHdWFyZHMubGVuZ3RoKSxcbm9wdGlvbmFsQXJnR3VhcmRzOnJhd0FyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbnJlc3RBcmdHdWFyZH19O1xuXG5cbiB9O1xuXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7cmV0dXJuR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3R7YXdhaXRJbmRleGVzLHJhd01ldGhvZEd1YXJkfT1kZXN5bmMobWV0aG9kR3VhcmQpO1xuY29uc3R7YXN5bmNNZXRob2R9PXtcbi8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuYXN5bmNNZXRob2QoLi4uYXJncyl7XG5jb25zdCBhd2FpdExpc3Q9YXdhaXRJbmRleGVzLm1hcCgoaSk9PmFyZ3NbaV0pO1xuY29uc3QgcD1Qcm9taXNlLmFsbChhd2FpdExpc3QpO1xuY29uc3QgcmF3QXJncz1bLi4uYXJnc107XG5jb25zdCByZXN1bHRQPUUud2hlbihwLChhd2FpdGVkQXJncyk9PntcbmZvcihsZXQgaj0wO2o8YXdhaXRJbmRleGVzLmxlbmd0aDtqKz0xKXtcbnJhd0FyZ3NbYXdhaXRJbmRleGVzW2pdXT1hd2FpdGVkQXJnc1tqXTtcbiB9XG5kZWZlbmRTeW5jQXJncyhyYXdBcmdzLHJhd01ldGhvZEd1YXJkLGxhYmVsKTtcbnJldHVybiBhcHBseShtZXRob2QsdGhpcyxyYXdBcmdzKTtcbiB9KTtcbnJldHVybiBFLndoZW4ocmVzdWx0UCwocmVzdWx0KT0+e1xubXVzdE1hdGNoKGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9KTtcbiB9fTtcblxucmV0dXJuIGFzeW5jTWV0aG9kO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7TWV0aG9kfSBtZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqL1xuY29uc3QgZGVmZW5kTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtrbGFzcyxjYWxsS2luZH09bWV0aG9kR3VhcmQ7XG5hc3NlcnQoa2xhc3M9PT0nbWV0aG9kR3VhcmQnKTtcbmlmKGNhbGxLaW5kPT09J3N5bmMnKXtcbnJldHVybiBkZWZlbmRTeW5jTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk7XG4gfWVsc2V7XG5hc3NlcnQoY2FsbEtpbmQ9PT0nYXN5bmMnKTtcbnJldHVybiBkZWZlbmRBc3luY01ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmd9IEZhY2V0TmFtZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1MgPSBhbnldXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IFtNID0gYW55XVxuICogQHR5cGVkZWYge3sgc3RhdGU6IFMsIHNlbGY6IE0gfX0gQ2xhc3NDb250ZXh0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1MgPSBhbnldXG4gKiBAdGVtcGxhdGUge1JlY29yZDxGYWNldE5hbWUsIE1ldGhvZHM+fSBbRiA9IGFueV1cbiAqIEB0eXBlZGVmIHt7IHN0YXRlOiBTLCBmYWNldHM6IEYgfX0gS2l0Q29udGV4dFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhmYWNldDogYW55KSA9PiBLaXRDb250ZXh0fSBLaXRDb250ZXh0UHJvdmlkZXJcbiAqIEB0eXBlZGVmIHsoKHJlcHJlc2VudGF0aXZlOiBhbnkpID0+IENsYXNzQ29udGV4dCkgfCBLaXRDb250ZXh0UHJvdmlkZXJ9IENvbnRleHRQcm92aWRlclxuICovXG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZFRhZ1xuICogQHBhcmFtIHtDb250ZXh0UHJvdmlkZXJ9IGNvbnRleHRQcm92aWRlclxuICogQHBhcmFtIHtDYWxsYWJsZUZ1bmN0aW9ufSBiZWhhdmlvck1ldGhvZFxuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBbbWV0aG9kR3VhcmRdXG4gKi9cbmNvbnN0IGJpbmRNZXRob2Q9KFxubWV0aG9kVGFnLFxuY29udGV4dFByb3ZpZGVyLFxuYmVoYXZpb3JNZXRob2QsXG50aGlzZnVsTWV0aG9kcz1mYWxzZSxcbm1ldGhvZEd1YXJkPXVuZGVmaW5lZCk9Plxue1xuYXNzZXJ0LnR5cGVvZihiZWhhdmlvck1ldGhvZCwnZnVuY3Rpb24nKTtcblxuY29uc3QgZ2V0Q29udGV4dD0oc2VsZik9PntcbmNvbnN0IGNvbnRleHQ9Y29udGV4dFByb3ZpZGVyKHNlbGYpO1xuY29udGV4dHx8XG5GYWlsIGAke3EobWV0aG9kVGFnKX0gbWF5IG9ubHkgYmUgYXBwbGllZCB0byBhIHZhbGlkIGluc3RhbmNlOiAke3NlbGZ9YDtcbnJldHVybiBjb250ZXh0O1xuIH07XG5cbi8qIFZpb2xhdGluZyBhbGwgSmVzc2llIHJ1bGVzIHRvIGNyZWF0ZSByZXByZXNlbnRhdGl2ZXMgdGhhdCBpbmhlcml0Ki9cbi8qIG1ldGhvZHMgZnJvbSBhIHNoYXJlZCBwcm90b3R5cGUuIFRoZSBib3VuZCBtZXRob2QgdGhlcmVmb3JlIG5lZWRzKi9cbi8qIHRvIG1lbnRpb24gYHRoaXNgLiBXZSBkZWZpbmUgaXQgdXNpbmcgY29uY2lzZSBtZXRob2Qgc3ludGF4Ki9cbi8qIHNvIHRoYXQgaXQgd2lsbCBiZSBgdGhpc2Agc2Vuc2l0aXZlIGJ1dCBub3QgY29uc3RydWN0YWJsZS4qL1xuLyoqL1xuLyogV2Ugbm9ybWFsbHkgY29uc2lkZXIgYHRoaXNgIHVuc2FmZSBiZWNhdXNlIG9mIHRoZSBoYXphcmQgb2YgYSovXG4vKiBtZXRob2Qgb2Ygb25lIGFic3RyYWN0aW9uIGJlaW5nIGFwcGxpZWQgdG8gYW4gaW5zdGFuY2Ugb2YqL1xuLyogYW5vdGhlciBhYnN0cmFjdGlvbi4gVG8gcHJldmVudCB0aGF0IGF0dGFjaywgdGhlIGJvdW5kIG1ldGhvZCovXG4vKiBjaGVja3MgdGhhdCBpdHMgYHRoaXNgIGlzIGluIHRoZSBtYXAgaW4gd2hpY2ggaXRzIHJlcHJlc2VudGF0aXZlcyovXG4vKiBhcmUgcmVnaXN0ZXJlZC4qL1xubGV0e21ldGhvZH09dGhpc2Z1bE1ldGhvZHM/XG57XG5tZXRob2QoLi4uYXJncyl7XG50aGlzfHxcbkZhaWwgYHRoaXNmdWwgbWV0aG9kICR7bWV0aG9kVGFnfSBjYWxsZWQgd2l0aG91dCAndGhpcycgb2JqZWN0YDtcbmNvbnN0IGNvbnRleHQ9Z2V0Q29udGV4dCh0aGlzKTtcbnJldHVybiBhcHBseShiZWhhdmlvck1ldGhvZCxjb250ZXh0LGFyZ3MpO1xuIH19OlxuXG57XG5tZXRob2QoLi4uYXJncyl7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsbnVsbCxbY29udGV4dCwuLi5hcmdzXSk7XG4gfX07XG5cbmlmKG1ldGhvZEd1YXJkKXtcbm1ldGhvZD1kZWZlbmRNZXRob2QobWV0aG9kLG1ldGhvZEd1YXJkLG1ldGhvZFRhZyk7XG4gfWVsc2UgaWYodGhpc2Z1bE1ldGhvZHMpe1xuLyogRm9yIGZhciBjbGFzc2VzIGVuc3VyZSB0aGF0IGlucHV0cyBhbmQgb3V0cHV0cyBhcmUgcGFzc2FibGUuKi9cbm1ldGhvZD1kZWZlbmRNZXRob2QobWV0aG9kLE1pbk1ldGhvZEd1YXJkLG1ldGhvZFRhZyk7XG4gfVxuZGVmaW5lUHJvcGVydGllcyhtZXRob2Qse1xubmFtZTp7dmFsdWU6bWV0aG9kVGFnfSxcbmxlbmd0aDp7XG52YWx1ZTp0aGlzZnVsTWV0aG9kcz9iZWhhdmlvck1ldGhvZC5sZW5ndGg6YmVoYXZpb3JNZXRob2QubGVuZ3RoLTF9fSk7XG5cblxucmV0dXJuIG1ldGhvZDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7Q29udGV4dFByb3ZpZGVyfSBjb250ZXh0UHJvdmlkZXJcbiAqIEBwYXJhbSB7VH0gYmVoYXZpb3JNZXRob2RzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IFtpbnRlcmZhY2VHdWFyZF1cbiAqIEByZXR1cm5zIHtUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmVuZFByb3RvdHlwZT0oXG50YWcsXG5jb250ZXh0UHJvdmlkZXIsXG5iZWhhdmlvck1ldGhvZHMsXG50aGlzZnVsTWV0aG9kcz1mYWxzZSxcbmludGVyZmFjZUd1YXJkPXVuZGVmaW5lZCk9Plxue1xuY29uc3QgcHJvdG90eXBlPXt9O1xuY29uc3QgbWV0aG9kTmFtZXM9b3duS2V5cyhiZWhhdmlvck1ldGhvZHMpLmZpbHRlcihcbi8qIEJ5IGlnbm9yaW5nIGFueSBtZXRob2QgbmFtZWQgXCJjb25zdHJ1Y3RvclwiLCB3ZSBjYW4gdXNlIGEqL1xuLyogY2xhc3MucHJvdG90eXBlIGFzIGEgYmVoYXZpb3JNZXRob2RzLiovXG4obmFtZSk9Pm5hbWUhPT0nY29uc3RydWN0b3InKTtcblxubGV0IG1ldGhvZEd1YXJkcztcbmlmKGludGVyZmFjZUd1YXJkKXtcbmNvbnN0e1xua2xhc3MsXG5pbnRlcmZhY2VOYW1lLFxubWV0aG9kR3VhcmRzOm1nLFxuc2xvcHB5PWZhbHNlfT1cbmludGVyZmFjZUd1YXJkO1xubWV0aG9kR3VhcmRzPW1nO1xuYXNzZXJ0LmVxdWFsKGtsYXNzLCdJbnRlcmZhY2UnKTtcbmFzc2VydC50eXBlb2YoaW50ZXJmYWNlTmFtZSwnc3RyaW5nJyk7XG57XG5jb25zdCBtZXRob2RHdWFyZE5hbWVzPW93bktleXMobWV0aG9kR3VhcmRzKTtcbmNvbnN0IHVuaW1wbGVtZW50ZWQ9bGlzdERpZmZlcmVuY2UobWV0aG9kR3VhcmROYW1lcyxtZXRob2ROYW1lcyk7XG51bmltcGxlbWVudGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5pbXBsZW1lbnRlZCl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuaWYoIXNsb3BweSl7XG5jb25zdCB1bmd1YXJkZWQ9bGlzdERpZmZlcmVuY2UobWV0aG9kTmFtZXMsbWV0aG9kR3VhcmROYW1lcyk7XG51bmd1YXJkZWQubGVuZ3RoPT09MHx8XG5GYWlsIGBtZXRob2RzICR7cSh1bmd1YXJkZWQpfSBub3QgZ3VhcmRlZCBieSAke3EoaW50ZXJmYWNlTmFtZSl9YDtcbiB9XG4gfVxuIH1cbmZvcihjb25zdCBwcm9wIG9mIG1ldGhvZE5hbWVzKXtcbnByb3RvdHlwZVtwcm9wXT1iaW5kTWV0aG9kKFxuIGBJbiAke3EocHJvcCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG5jb250ZXh0UHJvdmlkZXIsXG5iZWhhdmlvck1ldGhvZHNbcHJvcF0sXG50aGlzZnVsTWV0aG9kcyxcbi8qIFRPRE8gc29tZSB0b29sIGRvZXMgbm90IHlldCB1bmRlcnN0YW5kIHRoZSBgPy5bYCBzeW50YXgqL1xubWV0aG9kR3VhcmRzJiZtZXRob2RHdWFyZHNbcHJvcF0pO1xuXG4gfVxuXG5yZXR1cm4gRmFyKHRhZywvKiogQHR5cGUge1R9ICovcHJvdG90eXBlKTtcbiB9OyRo4oCNX29uY2UuZGVmZW5kUHJvdG90eXBlKGRlZmVuZFByb3RvdHlwZSk7XG5oYXJkZW4oZGVmZW5kUHJvdG90eXBlKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1JlY29yZDxGYWNldE5hbWUsIEtpdENvbnRleHRQcm92aWRlcj59IGNvbnRleHRQcm92aWRlcktpdFxuICogQHBhcmFtIHtSZWNvcmQ8RmFjZXROYW1lLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IGJlaGF2aW9yTWV0aG9kc0tpdFxuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIEludGVyZmFjZUd1YXJkPn0gW2ludGVyZmFjZUd1YXJkS2l0XVxuICovXG5jb25zdCAgICAgICAgZGVmZW5kUHJvdG90eXBlS2l0PShcbnRhZyxcbmNvbnRleHRQcm92aWRlcktpdCxcbmJlaGF2aW9yTWV0aG9kc0tpdCxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxuaW50ZXJmYWNlR3VhcmRLaXQ9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBmYWNldE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzS2l0KS5zb3J0KCk7XG5mYWNldE5hbWVzLmxlbmd0aD4xfHxGYWlsIGBBIG11bHRpLWZhY2V0IG9iamVjdCBtdXN0IGhhdmUgbXVsdGlwbGUgZmFjZXRzYDtcbmlmKGludGVyZmFjZUd1YXJkS2l0KXtcbmNvbnN0IGludGVyZmFjZU5hbWVzPW93bktleXMoaW50ZXJmYWNlR3VhcmRLaXQpO1xuY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcz1saXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLGludGVyZmFjZU5hbWVzKTtcbmV4dHJhSW50ZXJmYWNlTmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBub3QgZ3VhcmRlZCBieSBpbnRlcmZhY2VzYDtcbiB9XG5jb25zdCBjb250ZXh0TWFwTmFtZXM9b3duS2V5cyhjb250ZXh0UHJvdmlkZXJLaXQpO1xuY29uc3QgZXh0cmFDb250ZXh0TmFtZXM9bGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcyxjb250ZXh0TWFwTmFtZXMpO1xuZXh0cmFDb250ZXh0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBDb250ZXh0cyAke3EoZXh0cmFDb250ZXh0TmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmNvbnN0IGV4dHJhRmFjZXROYW1lcz1saXN0RGlmZmVyZW5jZShjb250ZXh0TWFwTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBtaXNzaW5nIGNvbnRleHRzYDtcbnJldHVybiBvYmplY3RNYXAoYmVoYXZpb3JNZXRob2RzS2l0LChiZWhhdmlvck1ldGhvZHMsZmFjZXROYW1lKT0+XG5kZWZlbmRQcm90b3R5cGUoXG4gYCR7dGFnfSAke2ZhY2V0TmFtZX1gLFxuY29udGV4dFByb3ZpZGVyS2l0W2ZhY2V0TmFtZV0sXG5iZWhhdmlvck1ldGhvZHMsXG50aGlzZnVsTWV0aG9kcyxcbmludGVyZmFjZUd1YXJkS2l0JiZpbnRlcmZhY2VHdWFyZEtpdFtmYWNldE5hbWVdKSk7XG5cblxuIH07JGjigI1fb25jZS5kZWZlbmRQcm90b3R5cGVLaXQoZGVmZW5kUHJvdG90eXBlS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZlbmRQcm90b3R5cGUiOlsiZGVmZW5kUHJvdG90eXBlIl0sImRlZmVuZFByb3RvdHlwZUtpdCI6WyJkZWZlbmRQcm90b3R5cGVLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQQwzlEACAABAAgAAHgAAAEBlbmRvL2Zhci12MC4yLjE4L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGVuZG8vZXZlbnR1YWwtc2VuZCI6W1siRSIsIkUiXV0sIkBlbmRvL3Bhc3Mtc3R5bGUiOltbIkZhciIsIkZhciJdLFsiZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdLFsicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApY8690oHAABKBwAAHQAAAEBlbmRvL21hcnNoYWwtdjAuOC41L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsIi4vc3JjL21hcnNoYWwuanMiLCIuL3NyYy9yYW5rT3JkZXIuanMiLCIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJjb21wYXJlUmFuayIsImNvbXBhcmVSYW5rIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwicGFyc2UiLCJwYXJzZSIsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNcIiwgW11dLFtcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvcmFua09yZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOltbImRlZXBseUZ1bGZpbGxlZCIsImRlZXBseUZ1bGZpbGxlZCJdXSwiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjpbWyJRQ0xBU1MiLCJRQ0xBU1MiXV0sIi4vc3JjL21hcnNoYWwuanMiOltbIm1ha2VNYXJzaGFsIiwibWFrZU1hcnNoYWwiXV0sIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjpbWyJzdHJpbmdpZnkiLCJzdHJpbmdpZnkiXSxbInBhcnNlIiwicGFyc2UiXV0sIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjpbWyJkZWNvZGVUb0p1c3RpbiIsImRlY29kZVRvSnVzdGluIl1dLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6W1sibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIl0sWyJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiXSxbImlzRW5jb2RlZFJlbW90YWJsZSIsImlzRW5jb2RlZFJlbW90YWJsZSJdLFsiemVyb1BhZCIsInplcm9QYWQiXSxbInJlY29yZE5hbWVzIiwicmVjb3JkTmFtZXMiXSxbInJlY29yZFZhbHVlcyIsInJlY29yZFZhbHVlcyJdXSwiLi9zcmMvcmFua09yZGVyLmpzIjpbWyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCJdLFsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayJdLFsiaXNSYW5rU29ydGVkIiwiaXNSYW5rU29ydGVkIl0sWyJzb3J0QnlSYW5rIiwic29ydEJ5UmFuayJdLFsiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUFudGlSYW5rIl0sWyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il0sWyJnZXRQYXNzU3R5bGVDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIl0sWyJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaW50ZXJzZWN0UmFua0NvdmVycyJdLFsidW5pb25SYW5rQ292ZXJzIiwidW5pb25SYW5rQ292ZXJzIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAANCCZ7lA0AAJQNAAArAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsaXNQcm9taXNlLGdldFRhZyxpc09iamVjdCxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxUPn0gRVJlZiAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2Zyb21FbnRyaWVzfT1PYmplY3Q7XG5cbi8qKlxuICogR2l2ZW4gYSBQYXNzYWJsZSBgdmFsYCB3aG9zZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIG1heSBjb250YWluIGxlYWZcbiAqIHByb21pc2VzLCByZXR1cm4gYSBwcm9taXNlIGZvciBhIHJlcGxhY2VtZW50IFBhc3NhYmxlLFxuICogd2hlcmUgdGhhdCByZXBsYWNlbWVudCBpcyAqZGVlcGx5IGZ1bGZpbGxlZCosIGkuZS4sIGl0c1xuICogcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBkb2VzIG5vdCBjb250YWluIGFueSBwcm9taXNlcy5cbiAqXG4gKiBUaGlzIGlzIGEgZGVlcCBmb3JtIG9mIGBQcm9taXNlLmFsbGAgc3BlY2lhbGl6ZWQgZm9yIFBhc3NhYmxlcy4gRm9yIGVhY2hcbiAqIGVuY291bnRlcmVkIHByb21pc2UsIHJlcGxhY2UgaXQgd2l0aCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtIG9mXG4gKiBpdHMgZnVsZmlsbG1lbnQuXG4gKiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIHJlamVjdCwgdGhlbiB0aGUgcHJvbWlzZSBmb3IgdGhlIHJlcGxhY2VtZW50XG4gKiByZWplY3RzLiBJZiBhbnkgb2YgdGhlIHByb21pc2VzIG5ldmVyIHNldHRsZSwgdGhlbiB0aGUgcHJvbWlzZSBmb3JcbiAqIHRoZSByZXBsYWNlbWVudCBuZXZlciBzZXR0bGVzLlxuICpcbiAqIElmIHRoZSByZXBsYWNlbWVudCB3b3VsZCBub3QgYmUgUGFzc2FibGUsIGkuZS4sIGlmIGB2YWxgIGlzIG5vdFxuICogUGFzc2FibGUsIG9yIGlmIGFueSBvZiB0aGUgdHJhbnNpdGl2ZSBwcm9taXNlcyBmdWxmaWxsIHRvIHNvbWV0aGluZ1xuICogdGhhdCBpcyBub3QgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIHByb21pc2UgcmVqZWN0cy5cbiAqXG4gKiBJZiBgdmFsYCBvciBpdHMgcGFydHMgYXJlIG5vbi1rZXkgUGFzc2FibGVzIG9ubHkgKmJlY2F1c2UqIHRoZXkgY29udGFpbnNcbiAqIHByb21pc2VzLCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtcyBvZiB2YWwgb3IgaXRzIHBhcnRzIG1heSBiZSBrZXlzLiBUaGlzXG4gKiBpcyBmb3IgdGhlIGhpZ2hlciBcInN0b3JlXCIgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gdG8gZGV0ZXJtaW5lLCBiZWNhdXNlIGl0XG4gKiBkZWZpbmVzIHRoZSBcImtleVwiIG5vdGlvbiBpbiBxdWVzdGlvbi5cbiAqXG4gKiAvLyBUT0RPOiBUaGF0IGhpZ2hlciBsZXZlbCBpcyBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBtaWdyYXRlZCBmcm9tXG4gKiAvLyBgQGFnb3JpYy9zdG9yZWAgdG8gYEBlbmRvL3BhdHRlcm5zYC4gT25jZSB0aGF0IGlzIGZhciBlbm91Z2ggYWxvbmcsXG4gKiAvLyByZXZpc2UgdGhlIGFib3ZlIGNvbW1lbnQgdG8gbWF0Y2guXG4gKiAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTQ1MVxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge1Byb21pc2U8UGFzc2FibGU+fVxuICovXG5jb25zdCAgICAgICAgZGVlcGx5RnVsZmlsbGVkPWFzeW5jKHZhbCk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbnJldHVybiB2YWw7XG4gfVxuaWYoaXNQcm9taXNlKHZhbCkpe1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmNvbnN0IG5hbWVzPW93bktleXModmFsKTtcbmNvbnN0IHZhbFBzPW5hbWVzLm1hcCgobmFtZSk9PmRlZXBseUZ1bGZpbGxlZCh2YWxbbmFtZV0pKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+XG5oYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsaSk9PltuYW1lc1tpXSxjXSkpKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuY29uc3QgdmFsUHM9dmFsLm1hcCgocCk9PmRlZXBseUZ1bGZpbGxlZChwKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PmhhcmRlbih2YWxzKSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHZhbC5wYXlsb2FkKSwocGF5bG9hZCk9PlxubWFrZVRhZ2dlZCh0YWcscGF5bG9hZCkpO1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA7cs+A5D8AAOQ/AAAqAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2VuY29kZVBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJpc0VuY29kZWRSZW1vdGFibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXNzU3R5bGVQcmVmaXhlcyIsInJlY29yZE5hbWVzIiwicmVjb3JkVmFsdWVzIiwiemVyb1BhZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixhc3NlcnRSZWNvcmQsaXNFcnJvckxpa2UsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlY29yZCA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb3Zlcn0gUmFua0NvdmVyICovXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7ZnJvbUVudHJpZXMsaXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQsIHdlIGhhdmUgb25seVxuICogc3RyaW5nLW5hbWVkIG93biBwcm9wZXJ0aWVzLiBgcmVjb3JkTmFtZXNgIHJldHVybnMgdGhvc2UgbmFtZSAqcmV2ZXJzZSpcbiAqIHNvcnRlZCwgYmVjYXVzZSB0aGF0J3MgaG93IHJlY29yZHMgYXJlIGNvbXBhcmVkLCBlbmNvZGVkLCBhbmQgc29ydGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHJldHVybnMge3N0cmluZ1tdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkTmFtZXM9KHJlY29yZCk9PlxuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI2MCNkaXNjdXNzaW9uX3IxMDAzNjU3MjQ0Ki9cbi8qIGNvbXBhcmVzIHR3byB3YXlzIG9mIHJldmVyc2Ugc29ydGluZywgYW5kIHNob3dzIHRoYXQgYC5zb3J0KCkucmV2ZXJzZSgpYCovXG4vKiBpcyBjdXJyZW50bHkgZmFzdGVyIG9uIE1vZGRhYmxlIFhTLCB3aGlsZSB0aGUgb3RoZXIgd2F5LCovXG4vKiBgLnNvcnQocmV2ZXJzZUNvbXBhcmF0b3IpYCwgaXMgZmFzdGVyIG9uIHY4LiBXZSBjdXJyZW50bHkgY2FyZSBtb3JlIGFib3V0Ki9cbi8qIFhTIHBlcmZvcm1hbmNlLCBzbyB3ZSByZXZlcnNlIHNvcnQgdXNpbmcgYC5zb3J0KCkucmV2ZXJzZSgpYC4qL1xuaGFyZGVuKC8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhyZWNvcmQpLnNvcnQoKS5yZXZlcnNlKCkpOyRo4oCNX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuaGFyZGVuKHJlY29yZE5hbWVzKTtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCBhbmQgYG5hbWVzYCBpcyBgcmVjb3JkTmFtZXMocmVjb3JkKWAsXG4gKiByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZXNcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmRWYWx1ZXM9KHJlY29yZCxuYW1lcyk9PlxuaGFyZGVuKG5hbWVzLm1hcCgobmFtZSk9PnJlY29yZFtuYW1lXSkpOyRo4oCNX29uY2UucmVjb3JkVmFsdWVzKHJlY29yZFZhbHVlcyk7XG5oYXJkZW4ocmVjb3JkVmFsdWVzKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IG5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCAgICAgICAgemVyb1BhZD0obixzaXplKT0+e1xuY29uc3QgblN0cj0gYCR7bn1gO1xuYXNzZXJ0KG5TdHIubGVuZ3RoPD1zaXplKTtcbmNvbnN0IHN0cj0gYDAwMDAwMDAwMDAwMDAwMDAwMDAwJHtuU3RyfWA7XG5jb25zdCByZXN1bHQ9c3RyLnN1YnN0cmluZyhzdHIubGVuZ3RoLXNpemUpO1xuYXNzZXJ0KHJlc3VsdC5sZW5ndGg9PT1zaXplKTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLnplcm9QYWQoemVyb1BhZCk7XG5oYXJkZW4oemVyb1BhZCk7XG5cbi8qIFRoaXMgaXMgdGhlIEphdmFTY3JpcHQgYW5hbG9nIHRvIGEgQyB1bmlvbjogYSB3YXkgdG8gbWFwIGJldHdlZW4gYSBmbG9hdCBhcyBhKi9cbi8qIG51bWJlciBhbmQgdGhlIGJpdHMgdGhhdCByZXByZXNlbnQgdGhlIGZsb2F0IGFzIGEgYnVmZmVyIGZ1bGwgb2YgYnl0ZXMuICBOb3RlKi9cbi8qIHRoYXQgdGhlIG11dGF0aW9uIG9mIHN0YXRpYyBzdGF0ZSBoZXJlIG1ha2VzIHRoaXMgaW52YWxpZCBKZXNzaWUgY29kZSwgYnV0Ki9cbi8qIGRvaW5nIGl0IHRoaXMgd2F5IHNhdmVzIHRoZSBudWdhdG9yeSBhbmQgZ3JhdHVpdG91cyBhbGxvY2F0aW9ucyB0aGF0IHdvdWxkKi9cbi8qIGhhcHBlbiBldmVyeSB0aW1lIHlvdSBkbyBhIGNvbnZlcnNpb24gLS0gYW5kIGluIHByYWN0aWNhbCB0ZXJtcyBpdCdzIHNhZmUqL1xuLyogYmVjYXVzZSB3ZSBwdXQgdGhlIHZhbHVlIGluIG9uZSBzaWRlIGFuZCB0aGVuIGltbWVkaWF0ZWx5IHRha2UgaXQgb3V0IHRoZSovXG4vKiBvdGhlcjsgdGhlcmUgaXMgbm8gYWN0dWFsIHN0YXRlIHJldGFpbmVkIGluIHRoZSBjbGFzc2ljIHNlbnNlIGFuZCB0aHVzIG5vKi9cbi8qIHJlLWVudHJhbmN5IGlzc3VlLiovXG5jb25zdCBhc051bWJlcj1uZXcgRmxvYXQ2NEFycmF5KDEpO1xuY29uc3QgYXNCaXRzPW5ldyBCaWdVaW50NjRBcnJheShhc051bWJlci5idWZmZXIpO1xuXG4vKiBKYXZhU2NyaXB0IG51bWJlcnMgYXJlIGVuY29kZWQgYnkgb3V0cHV0dGluZyB0aGUgYmFzZS0xNiovXG4vKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgYmluYXJ5IHZhbHVlIG9mIHRoZSB1bmRlcmx5aW5nIElFRUUgZmxvYXRpbmcgcG9pbnQqL1xuLyogcmVwcmVzZW50YXRpb24uICBGb3IgbmVnYXRpdmUgdmFsdWVzLCBhbGwgYml0cyBvZiB0aGlzIHJlcHJlc2VudGF0aW9uIGFyZSovXG4vKiBjb21wbGVtZW50ZWQgcHJpb3IgdG8gdGhlIGJhc2UtMTYgY29udmVyc2lvbiwgd2hpbGUgZm9yIHBvc2l0aXZlIHZhbHVlcywgdGhlKi9cbi8qIHNpZ24gYml0IGlzIGNvbXBsZW1lbnRlZC4gIFRoaXMgZW5zdXJlcyBib3RoIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYmVmb3JlKi9cbi8qIHBvc2l0aXZlIHZhbHVlcyBhbmQgdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBhY2NvcmRpbmcgdG8gdGhlaXIgbmVnYXRpdmUqL1xuLyogbWFnbml0dWRlIHJhdGhlciB0aGFuIHRoZWlyIHBvc2l0aXZlIG1hZ25pdHVkZS4gIFRoaXMgcmVzdWx0cyBpbiBhbiBBU0NJSSovXG4vKiBlbmNvZGluZyB3aG9zZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgaXMgdGhlIHNhbWUgYXMgdGhlIG51bWVyaWMgc29ydCBvcmRlciovXG4vKiBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLiovXG5cbi8qIFRPRE8gQ2hvb3NlIHRoZSBzYW1lIGNhbm9uaWNhbCBOYU4gZW5jb2RpbmcgdGhhdCBjb3NtV2FzbSBhbmQgZXdhc20gY2hvc2UuKi9cbmNvbnN0IENhbm9uaWNhbE5hTkJpdHM9J2ZmZjgwMDAwMDAwMDAwMDAnO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVCaW5hcnk2ND0obik9Pntcbi8qIE5vcm1hbGl6ZSAtMCB0byAwIGFuZCBOYU4gdG8gYSBjYW5vbmljYWwgZW5jb2RpbmcqL1xuaWYoaXMobiwtMCkpe1xubj0wO1xuIH1lbHNlIGlmKGlzKG4sTmFOKSl7XG5yZXR1cm4gYGYke0Nhbm9uaWNhbE5hTkJpdHN9YDtcbiB9XG5hc051bWJlclswXT1uO1xubGV0IGJpdHM9YXNCaXRzWzBdO1xuaWYobjwwKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbnJldHVybiBgZiR7emVyb1BhZChiaXRzLnRvU3RyaW5nKDE2KSwxNil9YDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCBkZWNvZGVCaW5hcnk2ND0oZW5jb2RlZCk9PntcbmVuY29kZWQuc3RhcnRzV2l0aCgnZicpfHxGYWlsIGBFbmNvZGVkIG51bWJlciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgYml0cz1CaWdJbnQoIGAweCR7ZW5jb2RlZC5zdWJzdHJpbmcoMSl9YCk7XG5pZihlbmNvZGVkWzFdPCc4Jyl7XG5iaXRzXj0weGZmZmZmZmZmZmZmZmZmZmZuO1xuIH1lbHNle1xuYml0c149MHg4MDAwMDAwMDAwMDAwMDAwbjtcbiB9XG5hc0JpdHNbMF09Yml0cztcbmNvbnN0IHJlc3VsdD1hc051bWJlclswXTtcbiFpcyhyZXN1bHQsLTApfHxGYWlsIGBVbmV4cGVjdGVkIG5lZ2F0aXZlIHplcm86ICR7ZW5jb2RlZH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEVuY29kZSBhIEphdmFTY3JpcHQgYmlnaW50IHVzaW5nIGEgdmFyaWFudCBvZiBFbGlhcyBkZWx0YSBjb2RpbmcsIHdpdGggYW5cbiAqIGluaXRpYWwgY29tcG9uZW50IGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBkaWdpdCBjb3VudCBhcyBhIHVuYXJ5IHN0cmluZywgYVxuICogc2Vjb25kIGNvbXBvbmVudCBmb3IgdGhlIGRlY2ltYWwgZGlnaXQgY291bnQsIGFuZCBhIHRoaXJkIGNvbXBvbmVudCBmb3IgdGhlXG4gKiBkZWNpbWFsIGRpZ2l0cyBwcmVjZWRlZCBieSBhIGdyYXR1aXRvdXMgc2VwYXJhdGluZyBjb2xvbi5cbiAqIFRvIGVuc3VyZSB0aGF0IHRoZSBsZXhpY29ncmFwaGljIHNvcnQgb3JkZXIgb2YgZW5jb2RlZCB2YWx1ZXMgbWF0Y2hlcyB0aGVcbiAqIG51bWVyaWMgc29ydCBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5hcnlcbiAqIHByZWZpeCBhcmUgZGlmZmVyZW50IGZvciBuZWdhdGl2ZSB2YWx1ZXMgKHR5cGUgXCJuXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZlxuICogXCIjXCJzIFt3aGljaCBzb3J0IGJlZm9yZSBkZWNpbWFsIGRpZ2l0c10pIHZzLiBwb3NpdGl2ZSBhbmQgemVybyB2YWx1ZXMgKHR5cGVcbiAqIFwicFwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgXCJ+XCJzIFt3aGljaCBzb3J0IGFmdGVyIGRlY2ltYWwgZGlnaXRzXSkgYW5kXG4gKiBlYWNoIGRlY2ltYWwgZGlnaXQgb2YgdGhlIGVuY29kaW5nIGZvciBhIG5lZ2F0aXZlIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggaXRzXG4gKiB0ZW4ncyBjb21wbGVtZW50IChzbyB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBvZiB0aGUgc2FtZSBzY2FsZSBzb3J0IGJ5XG4gKiAqZGVzY2VuZGluZyogYWJzb2x1dGUgdmFsdWUpLlxuICpcbiAqIEBwYXJhbSB7YmlnaW50fSBuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVCaWdJbnQ9KG4pPT57XG5jb25zdCBhYnM9bjwwbj8tbjpuO1xuY29uc3QgbkRpZ2l0cz1hYnMudG9TdHJpbmcoKS5sZW5ndGg7XG5jb25zdCBsRGlnaXRzPW5EaWdpdHMudG9TdHJpbmcoKS5sZW5ndGg7XG5pZihuPDBuKXtcbnJldHVybiBgbiR7XG4vKiBBIFwiI1wiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJyMnLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgY291bnQgb2YgZGlnaXRzLiovXG4oMTAqKmxEaWdpdHMtbkRpZ2l0cykudG9TdHJpbmcoKS5wYWRTdGFydChsRGlnaXRzLCcwJylcbiB9OiR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgZGlnaXRzLiovXG4oMTBuKipCaWdJbnQobkRpZ2l0cykrbikudG9TdHJpbmcoKS5wYWRTdGFydChuRGlnaXRzLCcwJylcbiB9YDtcbiB9ZWxzZXtcbnJldHVybiBgcCR7XG4vKiBBIFwiflwiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJ34nLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgY291bnQgb2YgZGlnaXRzLiovXG5uRGlnaXRzXG4gfToke1xuLyogVGhlIGRpZ2l0cy4qL1xublxuIH1gO1xuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5jb25zdCBkZWNvZGVCaWdJbnQ9KGVuY29kZWQpPT57XG5jb25zdCB0eXBlUHJlZml4PWVuY29kZWQuY2hhckF0KDApOy8qIGZhc3RlciB0aGFuIGVuY29kZWRbMF0qL1xubGV0IHJlbT1lbmNvZGVkLnNsaWNlKDEpO1xudHlwZVByZWZpeD09PSdwJ3x8XG50eXBlUHJlZml4PT09J24nfHxcbkZhaWwgYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuY29uc3QgbERpZ2l0cz1yZW0uc2VhcmNoKC9bMC05XS8pKzE7XG5sRGlnaXRzPj0xfHxGYWlsIGBEaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMtMSk7XG5cbnJlbS5sZW5ndGg+PWxEaWdpdHN8fEZhaWwgYENvbXBsZXRlIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmNvbnN0IHNuRGlnaXRzPXJlbS5zbGljZSgwLGxEaWdpdHMpO1xucmVtPXJlbS5zbGljZShsRGlnaXRzKTtcbi9eWzAtOV0rJC8udGVzdChzbkRpZ2l0cyl8fEZhaWwgYERlY2ltYWwgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xubGV0IG5EaWdpdHM9cGFyc2VJbnQoc25EaWdpdHMsMTApO1xuaWYodHlwZVByZWZpeD09PSduJyl7XG4vKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4vKiBsaWtlIFwibjA6XCIgYW5kIFwibjAwOuKAplwiIGFuZCBcIm45MTrigKZcIiB0aHJvdWdoIFwibjk5OuKAplwiPyovXG5uRGlnaXRzPTEwKipsRGlnaXRzLW5EaWdpdHM7XG4gfVxuXG5yZW0uc3RhcnRzV2l0aCgnOicpfHxGYWlsIGBTZXBhcmF0b3IgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xucmVtPXJlbS5zbGljZSgxKTtcbnJlbS5sZW5ndGg9PT1uRGlnaXRzfHxcbkZhaWwgYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbj1CaWdJbnQocmVtKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLyogVE9ETyBBc3NlcnQgdG8gcmVqZWN0IGZvcmJpZGRlbiBlbmNvZGluZ3MqL1xuLyogbGlrZSBcIm45OjBcIiBhbmQgXCJuODowMFwiIGFuZCBcIm44OjkxXCIgdGhyb3VnaCBcIm44Ojk5XCI/Ki9cbm49LSgxMG4qKkJpZ0ludChuRGlnaXRzKS1uKTtcbiB9XG5cbnJldHVybiBuO1xuIH07XG5cbi8qIGAnXFx1MDAwMCdgIGlzIHRoZSB0ZXJtaW5hdG9yIGFmdGVyIGVsZW1lbnRzLiovXG4vKiBgJ1xcdTAwMDEnYCBpcyB0aGUgYmFja3NsYXNoLWxpa2UgZXNjYXBlIGNoYXJhY3RlciwgZm9yKi9cbi8qIGVzY2FwaW5nIGJvdGggb2YgdGhlc2UgY2hhcmFjdGVycy4qL1xuXG5jb25zdCBlbmNvZGVBcnJheT0oYXJyYXksZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBjaGFycz1bJ1snXTtcbmZvcihjb25zdCBlbGVtZW50IG9mIGFycmF5KXtcbmNvbnN0IGVuYz1lbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbmZvcihjb25zdCBjIG9mIGVuYyl7XG5pZihjPT09J1xcdTAwMDAnfHxjPT09J1xcdTAwMDEnKXtcbmNoYXJzLnB1c2goJ1xcdTAwMDEnKTtcbiB9XG5jaGFycy5wdXNoKGMpO1xuIH1cbmNoYXJzLnB1c2goJ1xcdTAwMDAnKTtcbiB9XG5yZXR1cm4gY2hhcnMuam9pbignJyk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX0gZGVjb2RlUGFzc2FibGVcbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuY29uc3QgZGVjb2RlQXJyYXk9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5lbmNvZGVkLnN0YXJ0c1dpdGgoJ1snKXx8RmFpbCBgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5jb25zdCBlbGVtZW50cz1bXTtcbmNvbnN0IGVsZW1DaGFycz1bXTtcbmZvcihsZXQgaT0xO2k8ZW5jb2RlZC5sZW5ndGg7aSs9MSl7XG5jb25zdCBjPWVuY29kZWRbaV07XG5pZihjPT09J1xcdTAwMDAnKXtcbmNvbnN0IGVuY29kZWRFbGVtZW50PWVsZW1DaGFycy5qb2luKCcnKTtcbmVsZW1DaGFycy5sZW5ndGg9MDtcbmNvbnN0IGVsZW1lbnQ9ZGVjb2RlUGFzc2FibGUoZW5jb2RlZEVsZW1lbnQpO1xuZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiB9ZWxzZSBpZihjPT09J1xcdTAwMDEnKXtcbmkrPTE7XG5pPGVuY29kZWQubGVuZ3RofHxGYWlsIGB1bmV4cGVjdGVkIGVuZCBvZiBlbmNvZGluZyAke2VuY29kZWR9YDtcbmNvbnN0IGMyPWVuY29kZWRbaV07XG5jMj09PSdcXHUwMDAwJ3x8XG5jMj09PSdcXHUwMDAxJ3x8XG5GYWlsIGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciB1MDAwMSBlc2NhcGU6ICR7YzJ9YDtcbmVsZW1DaGFycy5wdXNoKGMyKTtcbiB9ZWxzZXtcbmVsZW1DaGFycy5wdXNoKGMpO1xuIH1cbiB9XG5lbGVtQ2hhcnMubGVuZ3RoPT09MHx8RmFpbCBgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtlbmNvZGVkfWA7XG5yZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbiB9O1xuXG5jb25zdCBlbmNvZGVSZWNvcmQ9KHJlY29yZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IG5hbWVzPXJlY29yZE5hbWVzKHJlY29yZCk7XG5jb25zdCB2YWx1ZXM9cmVjb3JkVmFsdWVzKHJlY29yZCxuYW1lcyk7XG5yZXR1cm4gYCgke2VuY29kZUFycmF5KGhhcmRlbihbbmFtZXMsdmFsdWVzXSksZW5jb2RlUGFzc2FibGUpfWA7XG4gfTtcblxuY29uc3QgZGVjb2RlUmVjb3JkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnKCcpKTtcbmNvbnN0IGtleXN2YWxzPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbmtleXN2YWxzLmxlbmd0aD09PTJ8fEZhaWwgYGV4cGVjdGVkIGtleXMsdmFsdWVzIHBhaXI6ICR7ZW5jb2RlZH1gO1xuY29uc3Rba2V5cyx2YWxzXT1rZXlzdmFscztcblxucGFzc1N0eWxlT2Yoa2V5cyk9PT0nY29weUFycmF5JyYmXG5wYXNzU3R5bGVPZih2YWxzKT09PSdjb3B5QXJyYXknJiZcbmtleXMubGVuZ3RoPT09dmFscy5sZW5ndGgmJlxua2V5cy5ldmVyeSgoa2V5KT0+dHlwZW9mIGtleT09PSdzdHJpbmcnKXx8XG5GYWlsIGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gO1xuY29uc3QgbWFwRW50cmllcz1rZXlzLm1hcCgoa2V5LGkpPT5ba2V5LHZhbHNbaV1dKTtcbmNvbnN0IHJlY29yZD1oYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cmllcykpO1xuYXNzZXJ0UmVjb3JkKHJlY29yZCwnZGVjb2RlZCByZWNvcmQnKTtcbnJldHVybiByZWNvcmQ7XG4gfTtcblxuY29uc3QgZW5jb2RlVGFnZ2VkPSh0YWdnZWQsZW5jb2RlUGFzc2FibGUpPT5cbiBgOiR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtnZXRUYWcodGFnZ2VkKSx0YWdnZWQucGF5bG9hZF0pLGVuY29kZVBhc3NhYmxlKX1gO1xuXG5jb25zdCBkZWNvZGVUYWdnZWQ9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpPT57XG5hc3NlcnQoZW5jb2RlZC5zdGFydHNXaXRoKCc6JykpO1xuY29uc3QgdGFncGF5bG9hZD1kZWNvZGVBcnJheShlbmNvZGVkLnN1YnN0cmluZygxKSxkZWNvZGVQYXNzYWJsZSk7XG50YWdwYXlsb2FkLmxlbmd0aD09PTJ8fEZhaWwgYGV4cGVjdGVkIHRhZyxwYXlsb2FkIHBhaXI6ICR7ZW5jb2RlZH1gO1xuY29uc3RbdGFnLHBheWxvYWRdPXRhZ3BheWxvYWQ7XG5wYXNzU3R5bGVPZih0YWcpPT09J3N0cmluZyd8fFxuRmFpbCBgbm90IGEgdmFsaWQgdGFnZ2VkIGVuY29kaW5nOiAke2VuY29kZWR9YDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcHJvbWlzZTogUHJvbWlzZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gc3RyaW5nLFxuICogKSA9PiBzdHJpbmd9IFtlbmNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gc3RyaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVBhc3NhYmxlPShlbmNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGU9KHJlbSxfKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWAsXG5lbmNvZGVQcm9taXNlPShwcm9tLF8pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gLFxuZW5jb2RlRXJyb3I9KGVycixfKT0+RmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YH09XG5lbmNvZGVPcHRpb25zO1xuXG5jb25zdCBlbmNvZGVQYXNzYWJsZT0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xucmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOntcbnJldHVybid2JztcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJ3onO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5yZXR1cm4gYHMke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gYGIke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybiBlbmNvZGVCaWdJbnQocGFzc2FibGUpO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUmVtb3RhYmxlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCdyJyl8fFxuRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvcihwYXNzYWJsZSxlbmNvZGVQYXNzYWJsZSk7XG5yZXN1bHQuc3RhcnRzV2l0aCgnIScpfHxcbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVByb21pc2UocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xucmVzdWx0LnN0YXJ0c1dpdGgoJz8nKXx8XG5GYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7cmVzdWx0fWA7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gYHkke25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSl9YDtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbnJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sbGVjdGlvbiBwYXNzYWJsZWA7XG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVBhc3NhYmxlKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZVBhc3NhYmxlPShkZWNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5kZWNvZGVSZW1vdGFibGU9KHJlbSxfKT0+RmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWAsXG5kZWNvZGVQcm9taXNlPShwcm9tLF8pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gLFxuZGVjb2RlRXJyb3I9KGVycixfKT0+RmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YH09XG5kZWNvZGVPcHRpb25zO1xuXG5jb25zdCBkZWNvZGVQYXNzYWJsZT0oZW5jb2RlZCk9PntcbnN3aXRjaChlbmNvZGVkLmNoYXJBdCgwKSl7XG5jYXNlJ3YnOntcbnJldHVybiBudWxsO1xuIH1cbmNhc2Uneic6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ2YnOntcbnJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkKTtcbiB9XG5jYXNlJ3MnOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKTtcbiB9XG5jYXNlJ2InOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKSE9PSdmYWxzZSc7XG4gfVxuY2FzZSduJzpcbmNhc2UncCc6e1xucmV0dXJuIGRlY29kZUJpZ0ludChlbmNvZGVkKTtcbiB9XG5jYXNlJ3InOntcbnJldHVybiBkZWNvZGVSZW1vdGFibGUoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSc/Jzp7XG5yZXR1cm4gZGVjb2RlUHJvbWlzZShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJyEnOntcbnJldHVybiBkZWNvZGVFcnJvcihlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ3knOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2RlZC5zdWJzdHJpbmcoMSkpO1xuIH1cbmNhc2UnWyc6e1xucmV0dXJuIGRlY29kZUFycmF5KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnKCc6e1xucmV0dXJuIGRlY29kZVJlY29yZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJzonOntcbnJldHVybiBkZWNvZGVUYWdnZWQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBpbnZhbGlkIGRhdGFiYXNlIGtleTogJHtlbmNvZGVkfWA7XG4gfX1cblxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZVBhc3NhYmxlKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZVBhc3NhYmxlKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZURlY29kZVBhc3NhYmxlKTtcblxuY29uc3QgICAgICAgIGlzRW5jb2RlZFJlbW90YWJsZT0oZW5jb2RlZCk9PmVuY29kZWQuY2hhckF0KDApPT09J3InOyRo4oCNX29uY2UuaXNFbmNvZGVkUmVtb3RhYmxlKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5oYXJkZW4oaXNFbmNvZGVkUmVtb3RhYmxlKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlIHtSZWNvcmQ8UGFzc1N0eWxlLCBzdHJpbmc+fVxuICogVGhlIHNpbmdsZSBwcmVmaXggY2hhcmFjdGVycyB0byBiZSB1c2VkIGZvciBlYWNoIFBhc3NTdHlsZSBjYXRlZ29yeS5cbiAqIGBiaWdpbnRgIGlzIGEgdHdvIGNoYXJhY3RlciBzdHJpbmcgYmVjYXVzZSBlYWNoIG9mIHRob3NlIGNoYXJhY3RlcnNcbiAqIGluZGl2aWR1YWxseSBpcyBhIHZhbGlkIGJpZ2ludCBwcmVmaXguIGBuYCBmb3IgXCJuZWdhdGl2ZVwiIGFuZCBgcGAgZm9yXG4gKiBcInBvc2l0aXZlXCIuIFRoZSBvcmRlcmluZyBvZiB0aGVzZSBwcmVmaXhlcyBpcyB0aGUgc2FtZSBhcyB0aGVcbiAqIHJhbmtPcmRlcmluZyBvZiB0aGVpciByZXNwZWN0aXZlIFBhc3NTdHlsZXMuIFRoaXMgdGFibGUgaXMgaW1wb3J0ZWQgYnlcbiAqIHJhbmtPcmRlci5qcyBmb3IgdGhpcyBwdXJwb3NlLlxuICpcbiAqIEluIGFkZGl0aW9uLCBgfGAgaXMgdGhlIHJlbW90YWJsZS0+b3JkaW5hbCBtYXBwaW5nIHByZWZpeDpcbiAqIFRoaXMgaXMgbm90IHVzZWQgaW4gY292ZXJzIGJ1dCBpdCBpc1xuICogcmVzZXJ2ZWQgZnJvbSB0aGUgc2FtZSBzZXQgb2Ygc3RyaW5ncy4gTm90ZSB0aGF0IHRoZSBwcmVmaXggaXMgPiBhbnlcbiAqIHByZWZpeCB1c2VkIGJ5IGFueSBjb3ZlciBzbyB0aGF0IG9yZGluYWwgbWFwcGluZyBrZXlzIGFyZSBhbHdheXMgb3V0c2lkZVxuICogdGhlIHJhbmdlIG9mIHZhbGlkIGNvbGxlY3Rpb24gZW50cnkga2V5cy5cbiAqL1xuY29uc3QgICAgICAgIHBhc3NTdHlsZVByZWZpeGVzPXtcbmVycm9yOichJyxcbmNvcHlSZWNvcmQ6JygnLFxudGFnZ2VkOic6JyxcbnByb21pc2U6Jz8nLFxuY29weUFycmF5OidbJyxcbmJvb2xlYW46J2InLFxubnVtYmVyOidmJyxcbmJpZ2ludDonbnAnLFxucmVtb3RhYmxlOidyJyxcbnN0cmluZzoncycsXG5udWxsOid2JyxcbnN5bWJvbDoneScsXG51bmRlZmluZWQ6J3onfTskaOKAjV9vbmNlLnBhc3NTdHlsZVByZWZpeGVzKHBhc3NTdHlsZVByZWZpeGVzKTtcblxuT2JqZWN0LnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVByZWZpeGVzLG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVByZWZpeGVzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWNvcmROYW1lcyI6WyJyZWNvcmROYW1lcyJdLCJyZWNvcmRWYWx1ZXMiOlsicmVjb3JkVmFsdWVzIl0sInplcm9QYWQiOlsiemVyb1BhZCJdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIl0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSJdLCJwYXNzU3R5bGVQcmVmaXhlcyI6WyJwYXNzU3R5bGVQcmVmaXhlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADEU6fw/D8AAPw/AAArAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjigI1fYSA9PiAoaXNFcnJvckxpa2UgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2RpbmdVbmlvbn0gRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG5kZWZpbmVQcm9wZXJ0aWVzLFxuaXMsXG5lbnRyaWVzLFxuZnJvbUVudHJpZXMsXG5mcmVlemV9PVxuT2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIFNwZWNpYWwgcHJvcGVydHkgbmFtZSB0aGF0IGluZGljYXRlcyBhbiBlbmNvZGluZyB0aGF0IG5lZWRzIHNwZWNpYWxcbiAqIGRlY29kaW5nLlxuICovXG5jb25zdCBRQ0xBU1M9J0BxY2xhc3MnOyRo4oCNX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7ZW5jb2RlZCBpcyBFbmNvZGluZ1VuaW9ufVxuICovXG5jb25zdCBoYXNRQ2xhc3M9KGVuY29kZWQpPT5oYXNPd25Qcm9wZXJ0eU9mKGVuY29kZWQsUUNMQVNTKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gcWNsYXNzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcz0oZW5jb2RlZCxxY2xhc3MpPT5cbmlzT2JqZWN0KGVuY29kZWQpJiZcbiFpc0FycmF5KGVuY29kZWQpJiZcbmhhc1FDbGFzcyhlbmNvZGVkKSYmXG5lbmNvZGVkW1FDTEFTU109PT1xY2xhc3M7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9DYXBEYXRhT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZUVycm9yVG9DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHJlbSk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyKT0+RmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7ZXJyfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb0NhcERhdGFPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ31cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb0NhcERhdGE9KGVuY29kZU9wdGlvbnM9e30pPT57XG5jb25zdHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT1kb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT1kb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbmVuY29kZUVycm9yVG9DYXBEYXRhPWRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YX09XG5lbmNvZGVPcHRpb25zO1xuXG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZWx5IGRlcGVuZCBvbiB0aGUgb3JkZXJcbiAqIGluIHdoaWNoIHRoZXNlIG9iamVjdCBsaXRlcmFscyBhcmUgd3JpdHRlbi5cbiAqXG4gKiBSZWFkZXJzIG11c3Qgbm90IGNhcmUgYWJvdXQgdGhpcyBvcmRlciBhbnl3YXkuIFdlIGltcG9zZSB0aGlzIHJlcXVpcmVtZW50XG4gKiBtYWlubHkgdG8gcmVkdWNlIG5vbi1kZXRlcm1pbmlzbSBleHBvc2VkIG91dHNpZGUgYSB2YXQuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvQ2FwRGF0YWAgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb0NhcERhdGFgIGlzIG5vdFxuICogZGlyZWN0bHkgZXhwb3NlZC5cbiAqIFdoYXQncyBleHBvc2VkIGluc3RlYWQgaXMgYSB3cmFwcGVyIHRoYXQgZnJlZXplcyB0aGUgb3V0cHV0IGJlZm9yZVxuICogcmV0dXJuaW5nLiBJZiB0aGlzIHR1cm5zIG91dCB0byBpbXBlZGUgc3RhdGljIGFuYWx5c2lzIGZvciBgaGFyZGVuYCBzYWZldHksXG4gKiB3ZSBjYW4gYWx3YXlzIHB1dCB0aGUgKG5vdyByZWR1bmRhbnQpIGhhcmRlbnMgYmFjayBpbi4gVGhleSBkb24ndCBodXJ0LlxuICovXG5jb25zdCBlbmNvZGVUb0NhcERhdGFSZWN1cj0ocGFzc2FibGUpPT57XG4vKiBGaXJzdCB3ZSBoYW5kbGUgYWxsIHByaW1pdGl2ZXMuIFNvbWUgY2FuIGJlIHJlcHJlc2VudGVkIGRpcmVjdGx5IGFzKi9cbi8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBhcyBbUUNMQVNTXSBjb21wb3NpdGVzLiovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2Unc3RyaW5nJzp7XG4vKiBwYXNzIHRocm91Z2ggdG8gSlNPTiovXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybntbUUNMQVNTXTondW5kZWZpbmVkJ307XG4gfVxuY2FzZSdudW1iZXInOntcbi8qIFNwZWNpYWwtY2FzZSBudW1iZXJzIHdpdGggbm8gZGlnaXQtYmFzZWQgcmVwcmVzZW50YXRpb24uKi9cbmlmKE51bWJlci5pc05hTihwYXNzYWJsZSkpe1xucmV0dXJue1tRQ0xBU1NdOidOYU4nfTtcbiB9ZWxzZSBpZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonSW5maW5pdHknfTtcbiB9ZWxzZSBpZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106Jy1JbmZpbml0eSd9O1xuIH1cbi8qIFBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGVsc2UsIHJlcGxhY2luZyAtMCB3aXRoIDAuKi9cbnJldHVybiBpcyhwYXNzYWJsZSwtMCk/MDpwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJue1xuW1FDTEFTU106J2JpZ2ludCcsXG5kaWdpdHM6U3RyaW5nKHBhc3NhYmxlKX07XG5cbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJue1xuW1FDTEFTU106J3N5bWJvbCcsXG5uYW1lfTtcblxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuaWYoaGFzT3duUHJvcGVydHlPZihwYXNzYWJsZSxRQ0xBU1MpKXtcbi8qIEhpbGJlcnQgaG90ZWwqL1xuY29uc3R7W1FDTEFTU106cWNsYXNzVmFsdWUsLi4ucmVzdH09cGFzc2FibGU7XG4vKiogQHR5cGUge0VuY29kaW5nfSAqL1xuY29uc3QgcmVzdWx0PXtcbltRQ0xBU1NdOidoaWxiZXJ0Jyxcbm9yaWdpbmFsOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKX07XG5cbmlmKG93bktleXMocmVzdCkubGVuZ3RoPj0xKXtcbi8qIFdlIGhhcmRlbiB0aGUgZW50aXJlIGNhcERhdGEgZW5jb2RpbmcgYmVmb3JlIHdlIHJldHVybiBpdC4qL1xuLyogYGVuY29kZVRvQ2FwRGF0YWAgcmVxdWlyZXMgdGhhdCBpdHMgaW5wdXQgYmUgUGFzc2FibGUsIGFuZCovXG4vKiB0aGVyZWZvcmUgaGFyZGVuZWQuKi9cbi8qIFRoZSBgZnJlZXplYCBoZXJlIGlzIG5lZWRlZCBhbnl3YXksIGJlY2F1c2UgdGhlIGByZXN0YCBpcyovXG4vKiBmcmVzaGx5IGNvbnN0cnVjdGVkIGJ5IHRoZSBgLi4uYCBhYm92ZSwgYW5kIHdlJ3JlIHVzaW5nIGl0Ki9cbi8qIGFzIGltcHV0IGluIGFub3RoZXIgY2FsbCB0byBgZW5jb2RlVG9DYXBEYXRhYC4qL1xucmVzdWx0LnJlc3Q9ZW5jb2RlVG9DYXBEYXRhUmVjdXIoZnJlZXplKHJlc3QpKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4vKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbmNvbnN0IG5hbWVzPW93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbnJldHVybiBmcm9tRW50cmllcyhcbm5hbWVzLm1hcCgobmFtZSk9PltuYW1lLGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuW1FDTEFTU106J3RhZ2dlZCcsXG50YWc6Z2V0VGFnKHBhc3NhYmxlKSxcbnBheWxvYWQ6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhKFxucGFzc2FibGUsXG5lbmNvZGVUb0NhcERhdGFSZWN1cik7XG5cbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MpXG4gfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVQcm9taXNlVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ3Nsb3QnKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdlcnJvcicpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidlcnJvcicpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb0NhcERhdGE9KHBhc3NhYmxlKT0+e1xuaWYoaXNFcnJvckxpa2UocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5yZXR1cm4gaGFyZGVuKGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKSk7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YSk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVUb0NhcERhdGEobWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5oYXJkZW4obWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRSZW1vdGFibGU6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGUpfSBbZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IEVuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IEVuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiAoUHJvbWlzZXxSZW1vdGFibGUpfSBbZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YV1cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHNsb3RFbmNvZGluZyk9PlxuRmFpbCBgcmVtb3RhYmxlIG9yIHByb21pc2UgdW5leHBlY3RlZDogJHtzbG90RW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhPShlcnJvckVuY29kaW5nKT0+XG5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycm9yRW5jb2Rpbmd9YDtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoXG4gKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb25cbiAqIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlXG4gKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLlxuICpcbiAqIFRoaXMgc2VlbXMgbGlrZSB0aGUgYmVzdCBzdGFydGluZyBwb2ludCB0byBpbmNyZW1lbnRhbGx5IGV2b2x2ZSB0byBhblxuICogQVBJIHdoZXJlIHRoZXNlIGNhbiByZWxpYWJseSBkaWZmZXIuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0XG4gKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21DYXBEYXRhPShkZWNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT1kb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX09XG5kZWNvZGVPcHRpb25zO1xuXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT09PWRlY29kZVByb21pc2VGcm9tQ2FwRGF0YXx8XG5GYWlsIGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEpXG4gfSB2cyAke3EoZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhKX1gO1xuXG4vKipcbiAqIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbWF5IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBganNvbkVuY29kZWRgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb0NhcERhdGFgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21DYXBEYXRhYCBjYW5ub3QgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21DYXBEYXRhYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IGpzb25FbmNvZGVkIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbUNhcERhdGE9KGpzb25FbmNvZGVkKT0+e1xuaWYoIWlzT2JqZWN0KGpzb25FbmNvZGVkKSl7XG4vKiBwcmltaXRpdmVzIHBhc3MgdGhyb3VnaCovXG5yZXR1cm4ganNvbkVuY29kZWQ7XG4gfVxuaWYoaXNBcnJheShqc29uRW5jb2RlZCkpe1xucmV0dXJuIGpzb25FbmNvZGVkLm1hcCgoZW5jb2RlZFZhbCk9PmRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpKTtcbiB9ZWxzZSBpZihoYXNRQ2xhc3MoanNvbkVuY29kZWQpKXtcbmNvbnN0IHFjbGFzcz1qc29uRW5jb2RlZFtRQ0xBU1NdO1xudHlwZW9mIHFjbGFzcz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgJHtxKFFDTEFTUyl9IHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbnN3aXRjaChxY2xhc3Mpe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmNhc2UnYmlnaW50Jzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7ZGlnaXRzfT1qc29uRW5jb2RlZDtcbnR5cGVvZiBkaWdpdHM9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG5yZXR1cm4gQmlnSW50KGRpZ2l0cyk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIERlcHJlY2F0ZWQgcWNsYXNzLiBUT0RPIG1ha2UgY29uZGl0aW9uYWwqL1xuLyogb24gZW52aXJvbm1lbnQgdmFyaWFibGUuIEV2ZW50dWFsbHkgcmVtb3ZlLCBidXQgYWZ0ZXIgY29uZmlkZW50Ki9cbi8qIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgc3VwcG9ydGVkIHNlbmRlcnMuKi9cbi8qKi9cbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5yZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gfVxuY2FzZSdzeW1ib2wnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtuYW1lfT1qc29uRW5jb2RlZDtcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHt0YWcscGF5bG9hZH09anNvbkVuY29kZWQ7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcsZGVjb2RlRnJvbUNhcERhdGEocGF5bG9hZCkpO1xuIH1cbmNhc2Unc2xvdCc6e1xuLyogU2VlIG5vdGUgYWJvdmUgYWJvdXQgaG93IHRoZSBjdXJyZW50IGVuY29kaW5nIGNhbm5vdCByZWxpYWJseSovXG4vKiBkaXN0aW5ndWlzaCB3aGljaCB3ZSBzaG91bGQgY2FsbCwgc28gaW4gdGhlIG5vbi1kZWZhdWx0IGNhc2UqL1xuLyogYm90aCBtdXN0IGJlIHRoZSBzYW1lIGFuZCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCB3ZSBjYWxsLiovXG5jb25zdCBkZWNvZGVkPWRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbi8qIEJFV0FSRTogY2FwZGF0YSBkb2VzIG5vdCBjaGVjayB0aGF0IGBkZWNvZGVkYCBpcyovXG4vKiBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUsIHNpbmNlIHRoYXQgd291bGQgYnJlYWsgc29tZSovXG4vKiBjYXBkYXRhIGNsaWVudHMuIFdlIGFyZSBkZXByZWNhdGluZyBjYXBkYXRhLCBhbmQgdGhlc2UgY2xpZW50cyovXG4vKiB3aWxsIG5lZWQgdG8gdXBkYXRlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gc21hbGxjYXBzLiovXG5yZXR1cm4gZGVjb2RlZDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBkZWNvZGVkPWRlY29kZUVycm9yRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuaWYocGFzc1N0eWxlT2YoZGVjb2RlZCk9PT0nZXJyb3InKXtcbnJldHVybiBkZWNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7b3JpZ2luYWwscmVzdH09anNvbkVuY29kZWQ7XG5oYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdvcmlnaW5hbCcpfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4vKiBEb24ndCBoYXJkZW4gc2luY2Ugd2UncmUgbm90IGRvbmUgbXV0YXRpbmcgaXQqL1xuY29uc3QgcmVzdWx0PXtbUUNMQVNTXTpkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCl9O1xuaWYoaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwncmVzdCcpKXtcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3Q9XG50eXBlb2YgcmVzdD09PSdvYmplY3QnJiZcbnJlc3QhPT1udWxsJiZcbm93bktleXMocmVzdCkubGVuZ3RoPj0xO1xuaWYoIWlzTm9uRW1wdHlPYmplY3Qpe1xudGhyb3cgRmFpbCBgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG4gfVxuY29uc3QgcmVzdE9iaj1kZWNvZGVGcm9tQ2FwRGF0YShyZXN0KTtcbi8qIFRPRE8gcmVhbGx5IHNob3VsZCBhc3NlcnQgdGhhdCBgcGFzc1N0eWxlT2YocmVzdClgIGlzKi9cbi8qIGAnY29weVJlY29yZCdgIGJ1dCB3ZSdkIGhhdmUgdG8gaGFyZGVuIGl0IGFuZCBpdCBpcyB0b28qL1xuLyogZWFybHkgdG8gZG8gdGhhdC4qL1xuIWhhc093blByb3BlcnR5T2YocmVzdE9iaixRQ0xBU1MpfHxcbkZhaWwgYFJlc3QgbXVzdCBub3QgY29udGFpbiBpdHMgb3duIGRlZmluaXRpb24gb2YgJHtxKFFDTEFTUyl9YDtcbmRlZmluZVByb3BlcnRpZXMocmVzdWx0LGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBUaGlzIGlzIHRoZSBlcnJvciBjYXNlIHdlJ3JlIHRlc3RpbmcgZm9yKi9cbmNhc2UnaWJpZCc6e1xudGhyb3cgRmFpbCBgVGhlIGNhcERhdGEgcHJvdG9jb2wgbm8gbG9uZ2VyIHN1cHBvcnRzICR7cShRQ0xBU1MpfSAke3EoXG5xY2xhc3MpXG4gfWA7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2V7XG5hc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkPT09J29iamVjdCcmJmpzb25FbmNvZGVkIT09bnVsbCk7XG5jb25zdCBkZWNvZGVFbnRyeT0oW25hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5ICR7cShuYW1lKX0gb2YgJHtqc29uRW5jb2RlZH0gbXVzdCBiZSBhIHN0cmluZ2A7XG5yZXR1cm5bbmFtZSxkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKV07XG4gfTtcbmNvbnN0IGRlY29kZWRFbnRyaWVzPWVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG5yZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuIH1cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVGcm9tQ2FwRGF0YShtYWtlRGVjb2RlRnJvbUNhcERhdGEpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAs173a8U7AADFOwAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRo4oCNX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2Rpbmd9IFNtYWxsY2Fwc0VuY29kaW5nICpYLyovXG4vKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlNtYWxsY2Fwc0VuY29kaW5nVW5pb259IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKlgvKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7aXMsZW50cmllcyxmcm9tRW50cmllc309T2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBCQU5HPSchJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgREFTSD0nLScuY2hhckNvZGVBdCgwKTtcblxuLyoqXG4gKiBBbiBgZW5jb2RlVG9TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGEgcGFzc2FibGUgYW5kIHJldHVybnMgYVxuICogSlNPTi1yZXByZXNlbnRhYmxlIG9iamVjdCAoaS5lLiwgcm91bmQtdHJpcHBpbmcgaXQgdGhyb3VnaFxuICogYEpTT04uc3RyaW5naWZ5YCBhbmQgYEpTT04ucGFyc2VgIHdpdGggbm8gcmVwbGFjZXJzIG9yIHJldml2ZXJzXG4gKiByZXR1cm5zIGFuIGVxdWl2YWxlbnQgc3RydWN0dXJlIGV4Y2VwdCBmb3Igb2JqZWN0IGlkZW50aXR5KS5cbiAqIFdlIGNhbGwgdGhpcyByZXByZXNlbnRhdGlvbiBhIFNtYWxsY2FwcyBFbmNvZGluZy5cbiAqXG4gKiBBIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBmdW5jdGlvbiB0YWtlcyBhcyBhcmd1bWVudCB3aGF0IGl0XG4gKiAqYXNzdW1lcyogaXMgdGhlIHJlc3VsdCBvZiBhIHBsYWluIGBKU09OLnBhcnNlYCB3aXRoIG5vIHJlc29sdmVyLiBJdCB0aGVuXG4gKiBtdXN0IHZhbGlkYXRlIHRoYXQgaXQgaXMgYSB2YWxpZCBTbWFsbGNhcHMgRW5jb2RpbmcsIGFuZCBpZiBpdCBpcyxcbiAqIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgcGFzc2FibGUuXG4gKlxuICogU21hbGxjYXBzIGNvbnNpZGVycyB0aGUgY2hhcmFjdGVycyBiZXR3ZWVuIGAhYCAoYXNjaWkgY29kZSAzMywgQkFORylcbiAqIGFuZCBgLWAgKGFzY2lpIGNvZGUgNDUsIERBU0gpIHRvIGJlIHNwZWNpYWwgcHJlZml4ZXMgYWxsb3dpbmdcbiAqIHJlcHJlc2VudGF0aW9uIG9mIEpTT04taW5jb21wYXRpYmxlIGRhdGEgdXNpbmcgc3RyaW5ncy5cbiAqIFRoZXNlIGNoYXJhY3RlcnMsIGluIG9yZGVyLCBhcmUgYCFcIiMkJSYnKCkqKywtYFxuICogT2YgdGhlc2UsIHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyB0aGUgZm9sbG93aW5nOlxuICpcbiAqICAqIGAhYCAtIGVzY2FwZWQgc3RyaW5nXG4gKiAgKiBgK2AgLSBub24tbmVnYXRpdmUgYmlnaW50XG4gKiAgKiBgLWAgLSBuZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAjYCAtIG1hbmlmZXN0IGNvbnN0YW50XG4gKiAgKiBgJWAgLSBzeW1ib2xcbiAqICAqIGAkYCAtIHJlbW90YWJsZVxuICogICogYCZgIC0gcHJvbWlzZVxuICpcbiAqIEFsbCBvdGhlciBzcGVjaWFsIGNoYXJhY3RlcnMgKGBcIicoKSosYCkgYXJlIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLlxuICpcbiAqIFRoZSBtYW5pZmVzdCBjb25zdGFudHMgdGhhdCBzbWFsbGNhcHMgY3VycmVudGx5IHVzZXMgZm9yIHZhbHVlczpcbiAqICAqIGAjdW5kZWZpbmVkYFxuICogICogYCNOYU5gXG4gKiAgKiBgI0luZmluaXR5YFxuICogICogYCMtSW5maW5pdHlgXG4gKlxuICogYW5kIGZvciBwcm9wZXJ0eSBuYW1lcyBhbmFsb2dvdXMgdG8gY2FwZGF0YSBAcWNsYXNzOlxuICogICogYCN0YWdgXG4gKiAgKiBgI2Vycm9yYFxuICpcbiAqIEFsbCBvdGhlciBlbmNvZGVkIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYCNgIGFyZSByZXNlcnZlZCBmb3JcbiAqIGZ1dHVyZSB1c2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kZWRTdHJcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsPShlbmNvZGVkU3RyKT0+e1xuaWYoZW5jb2RlZFN0cj09PScnKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vKiBjaGFyQ29kZUF0KDApIGFuZCBudW1iZXIgY29tcGFyZSBpcyBhIGJpdCBmYXN0ZXIuKi9cbmNvbnN0IGNvZGU9ZW5jb2RlZFN0ci5jaGFyQ29kZUF0KDApO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHlvZGEqL1xucmV0dXJuIEJBTkc8PWNvZGUmJmNvZGU8PURBU0g7XG4gfTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZSxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbSk9PlxuRmFpbCBgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb20pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyKT0+XG5GYWlsIGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kZVRvU21hbGxjYXBzT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBlbmNvZGVPcHRpb25zIGlzIGFjdHVhbGx5IG9wdGlvbmFsLCBidXQgbm90IG1hcmtlZCBhcyBzdWNoIHRvIHdvcmsgYXJvdW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMjg2XG4gKlxuICogQHJldHVybnMgeyhwYXNzYWJsZTogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nfVxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvU21hbGxjYXBzPShlbmNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz1kb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHM9ZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHN9PVxuZW5jb2RlT3B0aW9ucztcblxuY29uc3QgYXNzZXJ0RW5jb2RlZEVycm9yPShlbmNvZGluZyk9PntcbnR5cGVvZiBlbmNvZGluZz09PSdvYmplY3QnJiZoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjZXJyb3InKXx8XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShcbmVuY29kaW5nKVxuIH1gO1xuLyogQXNzZXJ0IHRoYXQgdGhlICNlcnJvciBwcm9wZXJ0eSBkZWNvZGVzIHRvIGEgc3RyaW5nLiovXG5jb25zdCBtZXNzYWdlPWVuY29kaW5nWycjZXJyb3InXTtcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycmJihcbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLnN0YXJ0c1dpdGgoJyEnKSl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gfTtcblxuLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7U21hbGxjYXBzRW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb1NtYWxsY2Fwc2AgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb1NtYWxsY2Fwc2AgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgaW50byBzbWFsbGNhcHMgc3RyaW5ncy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZihzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSl7XG4vKiBTdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhIHNwZWNpYWwgY2hhciBhcmUgcXVvdGVkIHdpdGggYCFgLiovXG4vKiBTaW5jZSBgIWAgaXMgaXRzZWxmIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIHRoaXMgdHJpdmlhbGx5IGRvZXMqL1xuLyogdGhlIEhpbGJlcnQgaG90ZWwuIEFsc28sIHNpbmNlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlKi9cbi8qIGEgY29udGludW91cyBzdWJyYW5nZSBvZiBhc2NpaSwgdGhpcyBxdW90aW5nIGlzIHNvcnQtb3JkZXIqL1xuLyogcHJlc2VydmluZy4qL1xucmV0dXJuIGAhJHtwYXNzYWJsZX1gO1xuIH1cbi8qIEFsbCBvdGhlciBzdHJpbmdzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJyN1bmRlZmluZWQnO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG4vKiBTcGVjaWFsLWNhc2UgbnVtYmVycyB3aXRoIG5vIGRpZ2l0LWJhc2VkIHJlcHJlc2VudGF0aW9uLiovXG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybicjTmFOJztcbiB9ZWxzZSBpZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybicjSW5maW5pdHknO1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybicjLUluZmluaXR5JztcbiB9XG4vKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG5yZXR1cm4gaXMocGFzc2FibGUsLTApPzA6cGFzc2FibGU7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0IHN0cj1TdHJpbmcocGFzc2FibGUpO1xucmV0dXJuICgvKiogQHR5cGUge2JpZ2ludH0gKi9wYXNzYWJsZTwwbj9zdHI6YCske3N0cn1gKTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJuIGAlJHtuYW1lfWA7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKG5hbWUpLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG4nI3RhZyc6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihnZXRUYWcocGFzc2FibGUpKSxcbnBheWxvYWQ6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJCcpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIkXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJicpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJlwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9KHBhc3NhYmxlKT0+e1xuaWYoaXNFcnJvckxpa2UocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5jb25zdCByZXN1bHQ9aGFyZGVuKFxuZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSk7XG5cbmFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUpKTtcbiB9O1xucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlfSBbZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBFcnJvcn0gW2RlY29kZUVycm9yRnJvbVNtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT5cbkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qKlxuICogQHBhcmFtIHtEZWNvZGVGcm9tU21hbGxjYXBzT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IFNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZX1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzPShkZWNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9PVxuZGVjb2RlT3B0aW9ucztcblxuLyoqXG4gKiBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbWF5IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyB0aGUgcmVzdWx0IG9mIGFcbiAqIHBsYWluIGNhbGwgdG8gSlNPTi5wYXJzZS4gSG93ZXZlciwgaXQgKmNhbm5vdCogcmVseSBvbiBgZW5jb2RpbmdgXG4gKiBoYXZpbmcgYmVlbiBwcm9kdWNlZCBieSBKU09OLnN0cmluZ2lmeSBvbiB0aGUgb3V0cHV0IG9mIGBlbmNvZGVUb1NtYWxsY2Fwc2BcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgY2Fubm90IHJlbHkgb24gYGVuY29kaW5nYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtdXN0XG4gKiB2YWxpZGF0ZSB0aGF0LlxuICpcbiAqIEBwYXJhbSB7U21hbGxjYXBzRW5jb2Rpbmd9IGVuY29kaW5nIG11c3QgYmUgaGFyZGVuZWRcbiAqL1xuY29uc3QgZGVjb2RlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT57XG5zd2l0Y2godHlwZW9mIGVuY29kaW5nKXtcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZighc3RhcnRzU3BlY2lhbChlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNvbnN0IGM9ZW5jb2RpbmcuY2hhckF0KDApO1xuc3dpdGNoKGMpe1xuY2FzZSchJzp7XG4vKiB1bi1oaWxiZXJ0LWlmeSB0aGUgc3RyaW5nKi9cbnJldHVybiBlbmNvZGluZy5zbGljZSgxKTtcbiB9XG5jYXNlJyUnOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2Rpbmcuc2xpY2UoMSkpO1xuIH1cbmNhc2UnIyc6e1xuc3dpdGNoKGVuY29kaW5nKXtcbmNhc2UnI3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJyNOYU4nOntcbnJldHVybiBOYU47XG4gfVxuY2FzZScjSW5maW5pdHknOntcbnJldHVybiBJbmZpbml0eTtcbiB9XG5jYXNlJyMtSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVua25vd24gY29uc3RhbnQgXCIke3EoZW5jb2RpbmcpfVwiYCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9XG5jYXNlJysnOlxuY2FzZSctJzp7XG5yZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiB9XG5jYXNlJyQnOntcbmNvbnN0IHJlc3VsdD1kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdyZW1vdGFibGUnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnJic6e1xuY29uc3QgcmVzdWx0PWRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdwcm9taXNlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgU3BlY2lhbCBjaGFyICR7cShcbmMpXG4gfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuIH19XG5cbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoZW5jb2Rpbmc9PT1udWxsKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5cbmlmKGlzQXJyYXkoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZy5tYXAoKHZhbCk9PmRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjdGFnJykpe1xuY29uc3R7JyN0YWcnOnRhZyxwYXlsb2FkLC4uLnJlc3R9PWVuY29kaW5nO1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbnJldHVybiBtYWtlVGFnZ2VkKFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuZGVjb2RlRnJvbVNtYWxsY2FwcyhwYXlsb2FkKSk7XG5cbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpKXtcbmNvbnN0IHJlc3VsdD1kZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5wYXNzU3R5bGVPZihyZXN1bHQpPT09J2Vycm9yJ3x8XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuXG5jb25zdCBkZWNvZGVFbnRyeT0oW2VuY29kZWROYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIGVuY29kZWROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5lbmNvZGVkTmFtZSlcbiB9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuIWVuY29kZWROYW1lLnN0YXJ0c1dpdGgoJyMnKXx8XG5GYWlsIGBVbnJlY29nbml6ZWQgcmVjb3JkIHR5cGUgJHtxKGVuY29kZWROYW1lKX06ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IG5hbWU9ZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkTmFtZSk7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYERlY29kZWQgcHJvcGVydHkgbmFtZSAke25hbWV9IGZyb20gJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG5yZXR1cm5bbmFtZSxkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiB1bnJlY29nbml6ZWQgSlNPTiB0eXBlb2YgJHtxKFxudHlwZW9mIGVuY29kaW5nKVxuIH06ICR7ZW5jb2Rpbmd9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAhCkv2sKgAArCoAACoAAABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiLi9lbmNvZGVUb0NhcERhdGEuanMiLCJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LGdldEVycm9yQ29uc3RydWN0b3IsaXNPYmplY3QscGFzc2FibGVTeW1ib2xGb3JOYW1lLFFDTEFTUzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dLFtcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNhcERhdGE8VD59IENhcERhdGEgKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7c3RyaW5naWZ5OnF1b3RlfT1KU09OO1xuY29uc3R7cXVvdGU6cSxkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluZGVudGVyXG4gKiBAcHJvcGVydHkgeyhvcGVuQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IG9wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBsaW5lXG4gKiBAcHJvcGVydHkgeyh0b2tlbjogc3RyaW5nKSA9PiBudW1iZXJ9IG5leHRcbiAqIEBwcm9wZXJ0eSB7KGNsb3NlQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IGNsb3NlXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZG9uZVxuICovXG5cbi8qKlxuICogR2VuZXJvdXMgd2hpdGVzcGFjZSBmb3IgcmVhZGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlcj0oKT0+e1xuY29uc3Qgc3RyaW5ncz1bXTtcbmxldCBsZXZlbD0wO1xubGV0IG5lZWRTcGFjZT1mYWxzZTtcbmNvbnN0IGxpbmU9KCk9Pntcbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2goJ1xcbicsJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiB9O1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PntcbmxldmVsKz0xO1xuaWYobmVlZFNwYWNlKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT1mYWxzZTtcbnJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuIH0sXG5saW5lLFxubmV4dDoodG9rZW4pPT57XG5pZihuZWVkU3BhY2UmJnRva2VuIT09JywnKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbm5lZWRTcGFjZT10cnVlO1xucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5hc3NlcnQobGV2ZWw+PTEpO1xubGV2ZWwtPTE7XG5saW5lKCk7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gfSxcbmRvbmU6KCk9PntcbmFzc2VydC5lcXVhbChsZXZlbCwwKTtcbnJldHVybiBzdHJpbmdzLmpvaW4oJycpO1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogSWYgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIG9uZSB0b2tlbiB0b2dldGhlciB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiAqIG9mIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhpcyBwYXR0ZXJuLCB0aGVuIHRoZSB0d28gdG9rZW5zIG11c3QgYmVcbiAqIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHRvIHByZXNlcnZlIHRoZWlyIG1lYW5pbmcuIE90aGVyd2lzZSB0aGVcbiAqIHdoaXRlc3BhY2UgaW4gdW5uZWNlc3NhcnkuXG4gKlxuICogVGhlIGA8IWAgYW5kIGAtPmAgY2FzZXMgcHJldmVudCB0aGUgYWNjaWRlbnRhbCBmb3JtYXRpb24gb2YgYW5cbiAqIGh0bWwtbGlrZSBjb21tZW50LiBJIGRvbid0IHRoaW5rIHRoZSBkb3VibGUgYW5nbGUgYnJhY2tldHMgYXJlIGFjdHVhbGx5XG4gKiBuZWVkZWQgYnV0IEkgaGF2ZW4ndCB0aG91Z2h0IGFib3V0IGl0IGVub3VnaCB0byByZW1vdmUgdGhlbS5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm49L14oPzpcXHdcXHd8PDx8Pj58XFwrXFwrfC0tfDwhfC0+KSQvO1xuXG4vKipcbiAqIE1pbmltdW0gd2hpdGVzcGFjZSBuZWVkZWQgdG8gcHJlc2V2ZSBtZWFuaW5nLlxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZU5vSW5kZW50ZXI9KCk9Pntcbi8qKiBAdHlwZSB7c3RyaW5nW119ICovXG5jb25zdCBzdHJpbmdzPVtdO1xucmV0dXJuIGhhcmRlbih7XG5vcGVuOihvcGVuQnJhY2tldCk9PnN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG5saW5lOigpPT5zdHJpbmdzLmxlbmd0aCxcbm5leHQ6KHRva2VuKT0+e1xuaWYoc3RyaW5ncy5sZW5ndGg+PTEpe1xuY29uc3QgbGFzdD1zdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdO1xuaWYobGFzdC5sZW5ndGg+PTEmJnRva2VuLmxlbmd0aD49MSl7XG5jb25zdCBwYWlyPSBgJHtsYXN0W2xhc3QubGVuZ3RoLTFdfSR7dG9rZW5bMF19YDtcbmlmKGJhZFBhaXJQYXR0ZXJuLnRlc3QocGFpcikpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxuIH1cbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xJiZzdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdPT09JywnKXtcbnN0cmluZ3MucG9wKCk7XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT5zdHJpbmdzLmpvaW4oJycpfSk7XG5cbiB9O1xuXG5jb25zdCBpZGVudFBhdHRlcm49L15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZEluZGVudFxuICogQHBhcmFtIHthbnlbXX0gW3Nsb3RzXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW49KGVuY29kaW5nLHNob3VsZEluZGVudD1mYWxzZSxzbG90cz1bXSk9Pntcbi8qKlxuICogVGhlIGZpcnN0IHBhc3MgZG9lcyBzb21lIGlucHV0IHZhbGlkYXRpb24uXG4gKiBJdHMgY29udHJvbCBmbG93IHNob3VsZCBtaXJyb3IgYHJlY3VyYCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlXG4gKiBhbmQgdGhlIHR3byBzaG91bGQgYmUgbWFpbnRhaW5lZCB0b2dldGhlci4gVGhleSBtdXN0IHZpc2l0IGV2ZXJ5dGhpbmdcbiAqIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIFRPRE8gbm93IHRoYXQgaWJpZHMgYXJlIGdvbmUsIHdlIHNob3VsZCBmb2xkIHRoaXMgYmFjayB0b2dldGhlciBpbnRvXG4gKiBvbmUgdmFsaWRhdGluZyBwYXNzLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBwcmVwYXJlPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbnJldHVybjtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbnR5cGVvZiBxY2xhc3M9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIHFjbGFzcyB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ05hTic6XG5jYXNlJ0luZmluaXR5JzpcbmNhc2UnLUluZmluaXR5Jzp7XG5yZXR1cm47XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbnR5cGVvZiBkaWdpdHM9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG5yZXR1cm47XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbnJldHVybjtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xucmV0dXJuO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YodGFnLCdzdHJpbmcnKTtcbnByZXBhcmUocGF5bG9hZCk7XG5yZXR1cm47XG4gfVxuY2FzZSdzbG90Jzp7XG5jb25zdHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xuTmF0KGluZGV4KTtcbmlmKGlmYWNlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoaWZhY2UsJ3N0cmluZycpO1xuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG4nb3JpZ2luYWwnaW4gcmF3VHJlZXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWA7XG5wcmVwYXJlKG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuaWYodHlwZW9mIHJlc3QhPT0nb2JqZWN0Jyl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgO1xuIH1cbmlmKHJlc3Q9PT1udWxsKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiB9XG5pZihpc0FycmF5KHJlc3QpKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4gfVxuaWYoUUNMQVNTIGluIHJlc3Qpe1xudGhyb3cgRmFpbCBgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YDtcbiB9XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnByZXBhcmUocmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gO1xuZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBNdXN0IGJlIHRoZSBuYW1lIG9mIGFuIEVycm9yIGNvbnN0cnVjdG9yICR7bmFtZX1gO1xudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgbWVzc2FnZSl9YDtcbnJldHVybjtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5wcmVwYXJlKHJhd1RyZWVbaV0pO1xuIH1cbiB9ZWxzZXtcbmNvbnN0IG5hbWVzPW93bktleXMocmF3VHJlZSk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xuIH1cbnByZXBhcmUocmF3VHJlZVtuYW1lXSk7XG4gfVxuIH1cbiB9O1xuXG5jb25zdCBtYWtlSW5kZW50ZXI9c2hvdWxkSW5kZW50P21ha2VZZXNJbmRlbnRlcjptYWtlTm9JbmRlbnRlcjtcbmxldCBvdXQ9bWFrZUluZGVudGVyKCk7XG5cbi8qKlxuICogVGhpcyBpcyB0aGUgc2Vjb25kIHBhc3MgcmVjdXJzaW9uIGFmdGVyIHRoZSBmaXJzdCBwYXNzIGBwcmVwYXJlYC5cbiAqIFRoZSBmaXJzdCBwYXNzIGRpZCBzb21lIGlucHV0IHZhbGlkYXRpb24gc29cbiAqIGhlcmUgd2UgY2FuIHNhZmVseSBhc3N1bWUgZXZlcnl0aGluZyB0aG9zZSB0aGluZ3MgYXJlIHZhbGlkYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCBkZWNvZGU9KHJhd1RyZWUpPT57XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIHJlY3VyKHJhd1RyZWUpO1xuIH07XG5cbmNvbnN0IGRlY29kZVByb3BlcnR5PShuYW1lLHZhbHVlKT0+e1xub3V0LmxpbmUoKTtcbmlmKG5hbWU9PT0nX19wcm90b19fJyl7XG4vKiBKYXZhU2NyaXB0IGludGVycHJldHMgYHtfX3Byb3RvX186IHgsIC4uLn1gKi9cbi8qIGFzIG1ha2luZyBhbiBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGB4YCwgd2hlcmVhcyovXG4vKiBpbiBKU09OIGl0IGlzIHNpbXBseSBhIHByb3BlcnR5IG5hbWUuIFByZXNlcnZlIHRoZSovXG4vKiBKU09OIG1lYW5pbmcuKi9cbm91dC5uZXh0KCBgW1wiX19wcm90b19fXCJdOmApO1xuIH1lbHNlIGlmKGlkZW50UGF0dGVybi50ZXN0KG5hbWUpKXtcbm91dC5uZXh0KCBgJHtuYW1lfTpgKTtcbiB9ZWxzZXtcbm91dC5uZXh0KCBgJHtxdW90ZShuYW1lKX06YCk7XG4gfVxuZGVjb2RlKHZhbHVlKTtcbm91dC5uZXh0KCcsJyk7XG4gfTtcblxuLyoqXG4gKiBNb2RlbGVkIGFmdGVyIGBmdWxsUmV2aXZlYCBpbiBtYXJzaGFsLmpzXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgcmVjdXI9KHJhd1RyZWUpPT57XG5pZighaXNPYmplY3QocmF3VHJlZSkpe1xuLyogcHJpbWl0aXZlcyBnZXQgcXVvdGVkKi9cbnJldHVybiBvdXQubmV4dChxdW90ZShyYXdUcmVlKSk7XG4gfVxuLyogQXNzZXJ0aW9ucyBvZiB0aGUgYWJvdmUgdG8gbmFycm93IHRoZSB0eXBlLiovXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKHFjbGFzcywnc3RyaW5nJyk7XG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuLyogU3dpdGNoaW5nIG9uIGBlbmNvZGVkW1FDTEFTU11gIChvciBhbnl0aGluZyBsZXNzIGRpcmVjdCwgbGlrZSovXG4vKiBgcWNsYXNzYCkgZG9lcyBub3QgZGlzY3JpbWluYXRlIHJhd1RyZWUgaW4gdHlwZXNjcmlwdEA0LjIuMyBhbmQqL1xuLyogZWFybGllci4qL1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG4vKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdOYU4nOlxuY2FzZSdJbmZpbml0eSc6XG5jYXNlJy1JbmZpbml0eSc6e1xuLyogVGhlaXIgcWNsYXNzIGlzIHRoZWlyIGV4cHJlc3Npb24gc291cmNlLiovXG5yZXR1cm4gb3V0Lm5leHQocWNsYXNzKTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihkaWdpdHMsJ3N0cmluZycpO1xucmV0dXJuIG91dC5uZXh0KCBgJHtCaWdJbnQoZGlnaXRzKX1uYCk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIFRPRE8gZGVwcmVjYXRlZC4gRXZlbnR1YWxseSByZW1vdmUuKi9cbnJldHVybiBvdXQubmV4dCgnU3ltYm9sLmFzeW5jSXRlcmF0b3InKTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xuY29uc3QgcmVnaXN0ZXJlZE5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYocmVnaXN0ZXJlZE5hbWU9PT11bmRlZmluZWQpe1xuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmFzc2VydChtYXRjaCE9PW51bGwpO1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuYXNzZXJ0KFN5bWJvbFtzdWZmaXhdPT09c3ltKTtcbmFzc2VydChpZGVudFBhdHRlcm4udGVzdChzdWZmaXgpKTtcbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC4ke3N1ZmZpeH1gKTtcbiB9XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuZm9yKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5vdXQubmV4dCggYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfSxgKTtcbmRlY29kZShwYXlsb2FkKTtcbnJldHVybiBvdXQubmV4dCgnKScpO1xuIH1cblxuY2FzZSdzbG90Jzp7XG5sZXR7aWZhY2V9PXJhd1RyZWU7XG5jb25zdCBpbmRleD1OdW1iZXIoTmF0KHJhd1RyZWUuaW5kZXgpKTtcbmNvbnN0IG5lc3RlZFJlbmRlcj0oYXJnKT0+e1xuY29uc3Qgb2xkT3V0PW91dDtcbnRyeXtcbm91dD1tYWtlTm9JbmRlbnRlcigpO1xuZGVjb2RlKGFyZyk7XG5yZXR1cm4gb3V0LmRvbmUoKTtcbiB9ZmluYWxseXtcbm91dD1vbGRPdXQ7XG4gfVxuIH07XG5pZihpbmRleDxzbG90cy5sZW5ndGgpe1xuY29uc3Qgc2xvdD1uZXN0ZWRSZW5kZXIoc2xvdHNbaW5kZXhdKTtcbmlmKGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBvdXQubmV4dCggYHNsb3RUb1ZhbCgke3Nsb3R9KWApO1xuIH1cbmlmYWNlPW5lc3RlZFJlbmRlcihpZmFjZSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90VG9WYWwoJHtzbG90fSwke2lmYWNlfSlgKTtcbiB9ZWxzZSBpZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9KWApO1xuIH1cbmlmYWNlPW5lc3RlZFJlbmRlcihpZmFjZSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9LCR7aWZhY2V9KWApO1xuIH1cblxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xub3V0Lm9wZW4oJ3snKTtcbmRlY29kZVByb3BlcnR5KFFDTEFTUyxvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmFzc2VydC50eXBlb2YocmVzdCwnb2JqZWN0Jyk7XG5hc3NlcnQocmVzdCE9PW51bGwpO1xuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5uYW1lKVxuIH0gb2YgJHtyZXN0fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiB9XG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuXG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG5yZXR1cm4gb3V0Lm5leHQoIGAke25hbWV9KCR7cXVvdGUobWVzc2FnZSl9KWApO1xuIH1cblxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfWVsc2UgaWYoaXNBcnJheShyYXdUcmVlKSl7XG5jb25zdHtsZW5ndGh9PXJhd1RyZWU7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgnW10nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCdbJyk7XG5mb3IobGV0IGk9MDtpPGxlbmd0aDtpKz0xKXtcbm91dC5saW5lKCk7XG5kZWNvZGUocmF3VHJlZVtpXSk7XG5vdXQubmV4dCgnLCcpO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ10nKTtcbiB9XG4gfWVsc2V7XG4vKiByYXdUcmVlIGlzIGFuIGBFbmNvZGluZ1JlY29yZGAgd2hpY2ggb25seSBoYXMgc3RyaW5nIGtleXMsKi9cbi8qIGJ1dCBzaW5jZSBvd25LZXlzIGlzIG5vdCBnZW5lcmljLCBpdCBjYW4ndCBwcm9wYWdhdGUgdGhhdCovXG5jb25zdCBuYW1lcz0vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmF3VHJlZSk7XG5pZihuYW1lcy5sZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgne30nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCd7Jyk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJhd1RyZWVbbmFtZV0pO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG4gfVxuIH07XG5wcmVwYXJlKGVuY29kaW5nKTtcbmRlY29kZShlbmNvZGluZyk7XG5yZXR1cm4gb3V0LmRvbmUoKTtcbiB9OyRo4oCNX29uY2UuZGVjb2RlVG9KdXN0aW4oZGVjb2RlVG9KdXN0aW4pO1xuaGFyZGVuKGRlY29kZVRvSnVzdGluKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAT09Ub3AYAANwGAAAtAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbInBhcnNlIiwic3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VNYXJzaGFsOyRo4oCNX2ltcG9ydHMoW1tcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3Q9KHZhbCk9PlxuRmFpbCBgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsPShzbG90LF9pZmFjZSk9PlxuRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdHMgJHtzbG90fWA7XG5cbmNvbnN0IGJhZEFycmF5SGFuZGxlcj1oYXJkZW4oe1xuZ2V0OihfdGFyZ2V0LG5hbWUsX3JlY2VpdmVyKT0+e1xuaWYobmFtZT09PSdsZW5ndGgnKXtcbnJldHVybiAwO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3QgcG9zaXRpb25zICR7bmFtZX1gO1xuIH19KTtcblxuXG5jb25zdCBiYWRBcnJheT1oYXJkZW4obmV3IFByb3h5KGhhcmRlbihbXSksYmFkQXJyYXlIYW5kbGVyKSk7XG5cbmNvbnN0e3NlcmlhbGl6ZSx1bnNlcmlhbGl6ZX09bWFrZU1hcnNoYWwoXG5kb05vdENvbnZlcnRWYWxUb1Nsb3QsXG5kb05vdENvbnZlcnRTbG90VG9WYWwsXG57XG5lcnJvclRhZ2dpbmc6J29mZicsXG4vKiBUT0RPIGZpeCB0ZXN0cyB0byB3b3JrcyB3aXRoIHNtYWxsY2Fwcy4qL1xuc2VyaWFsaXplQm9keUZvcm1hdDonY2FwZGF0YSd9KTtcblxuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzdHJpbmdpZnk9KHZhbCk9PnNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjigI1fb25jZS5zdHJpbmdpZnkoc3RyaW5naWZ5KTtcbmhhcmRlbihzdHJpbmdpZnkpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgcGFyc2U9KHN0cik9PlxudW5zZXJpYWxpemUoXG5oYXJkZW4oe1xuYm9keTpzdHIsXG5zbG90czpiYWRBcnJheX0pKTskaOKAjV9vbmNlLnBhcnNlKHBhcnNlKTtcblxuXG5oYXJkZW4ocGFyc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvp5pSuwyAADsMgAAIwAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJtYWtlTWFyc2hhbCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsYXNzZXJ0UGFzc2FibGUsZ2V0SW50ZXJmYWNlT2YsZ2V0RXJyb3JDb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eU9mLFFDTEFTUyxtYWtlRW5jb2RlVG9DYXBEYXRhLG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyxtYWtlRW5jb2RlVG9TbWFsbGNhcHM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaOKAjV9hID0+IChRQ0xBU1MgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb0NhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VFbmNvZGVUb0NhcERhdGEgPSAkaOKAjV9hKV1dLFtcIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YVwiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21DYXBEYXRhID0gJGjigI1fYSldXV1dLFtcIi4vZW5jb2RlVG9TbWFsbGNhcHMuanNcIiwgW1tcIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzXCIsIFskaOKAjV9hID0+IChtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9ICRo4oCNX2EpXV0sW1wibWFrZUVuY29kZVRvU21hbGxjYXBzXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuTWFrZU1hcnNoYWxPcHRpb25zfSBNYWtlTWFyc2hhbE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRTbG90VG9WYWw8U2xvdD59IENvbnZlcnRTbG90VG9WYWwgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IENvbnZlcnRWYWxUb1Nsb3QgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlRvQ2FwRGF0YTxTbG90Pn0gVG9DYXBEYXRhICovXG4vKiogQHRlbXBsYXRlIFNsb3QgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Gcm9tQ2FwRGF0YTxTbG90Pn0gRnJvbUNhcERhdGEgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKiBAdHlwZSB7Q29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFZhbFRvU2xvdEZuPSh4KT0+eDtcbi8qKiBAdHlwZSB7Q29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFNsb3RUb1ZhbEZuPSh4LF8pPT54O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBTbG90XG4gKiBAcGFyYW0ge0NvbnZlcnRWYWxUb1Nsb3Q8U2xvdD59IFtjb252ZXJ0VmFsVG9TbG90XVxuICogQHBhcmFtIHtDb252ZXJ0U2xvdFRvVmFsPFNsb3Q+fSBbY29udmVydFNsb3RUb1ZhbF1cbiAqIEBwYXJhbSB7TWFrZU1hcnNoYWxPcHRpb25zfSBvcHRpb25zXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFyc2hhbD0oXG5jb252ZXJ0VmFsVG9TbG90PWRlZmF1bHRWYWxUb1Nsb3RGbixcbmNvbnZlcnRTbG90VG9WYWw9ZGVmYXVsdFNsb3RUb1ZhbEZuLFxue1xuZXJyb3JUYWdnaW5nPSdvbicsXG5tYXJzaGFsTmFtZT0nYW5vbi1tYXJzaGFsJyxcbi8qIFRPRE8gVGVtcG9yYXJ5IGhhY2suKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3ODAqL1xuZXJyb3JJZE51bT0xMDAwMCxcbi8qIFdlIHByZWZlciB0aGF0IHRoZSBjYWxsZXIgaW5zdGVhZCBsb2cgdG8gc29tZXdoZXJlIGhpZGRlbiovXG4vKiB0byBiZSByZXZlYWxlZCB3aGVuIGNvcnJlbGF0aW5nIHdpdGggdGhlIHJlY2VpdmVkIGVycm9yLiovXG5tYXJzaGFsU2F2ZUVycm9yPShlcnIpPT5cbmNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJyxlcnIpLFxuLyogRGVmYXVsdCB0byAnY2FwZGF0YScgYmVjYXVzZSBpdCB3YXMgaW1wbGVtZW50ZWQgZmlyc3QuKi9cbi8qIFNvbWV0aW1lcywgb250b2dlbnkgZG9lcyByZWNhcGl0dWxhdGUgcGh5bG9nZW55IDspKi9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ9J2NhcGRhdGEnfT1cbnt9KT0+XG57XG5hc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCdzdHJpbmcnKTtcbmVycm9yVGFnZ2luZz09PSdvbid8fFxuZXJyb3JUYWdnaW5nPT09J29mZid8fFxuRmFpbCBgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbmNvbnN0IG5leHRFcnJvcklkPSgpPT57XG5lcnJvcklkTnVtKz0xO1xucmV0dXJuIGBlcnJvcjoke21hcnNoYWxOYW1lfSMke2Vycm9ySWROdW19YDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtUb0NhcERhdGE8U2xvdD59XG4gKi9cbmNvbnN0IHRvQ2FwRGF0YT0ocm9vdCk9PntcbmNvbnN0IHNsb3RzPVtdO1xuLyogbWFwcyB2YWwgKHByb21pc2Ugb3IgcmVtb3RhYmxlKSB0byBpbmRleCBvZiBzbG90c1tdKi9cbmNvbnN0IHNsb3RNYXA9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UmVtb3RhYmxlIHwgUHJvbWlzZX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHt7aW5kZXg6IG51bWJlciwgcmVwZWF0OiBib29sZWFufX1cbiAqL1xuY29uc3QgZW5jb2RlU2xvdENvbW1vbj0ocGFzc2FibGUpPT57XG5sZXQgaW5kZXg9c2xvdE1hcC5nZXQocGFzc2FibGUpO1xuaWYoaW5kZXghPT11bmRlZmluZWQpe1xuLyogVE9ETyBhc3NlcnQgdGhhdCBpdCdzIHRoZSBzYW1lIGlmYWNlIGFzIGJlZm9yZSovXG5hc3NlcnQudHlwZW9mKGluZGV4LCdudW1iZXInKTtcbnJldHVybiBoYXJkZW4oe2luZGV4LHJlcGVhdDp0cnVlfSk7XG4gfVxuXG5pbmRleD1zbG90cy5sZW5ndGg7XG5jb25zdCBzbG90PWNvbnZlcnRWYWxUb1Nsb3QocGFzc2FibGUpO1xuc2xvdHMucHVzaChzbG90KTtcbnNsb3RNYXAuc2V0KHBhc3NhYmxlLGluZGV4KTtcbnJldHVybiBoYXJkZW4oe2luZGV4LHJlcGVhdDpmYWxzZX0pO1xuIH07XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gaXNFcnJvckxpa2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gdW5rbm93bn0gZW5jb2RlUmVjdXJcbiAqIEByZXR1cm5zIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fVxuICovXG5jb25zdCBlbmNvZGVFcnJvckNvbW1vbj0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgbWVzc2FnZT1lbmNvZGVSZWN1ciggYCR7ZXJyLm1lc3NhZ2V9YCk7XG5hc3NlcnQudHlwZW9mKG1lc3NhZ2UsJ3N0cmluZycpO1xuY29uc3QgbmFtZT1lbmNvZGVSZWN1ciggYCR7ZXJyLm5hbWV9YCk7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuLyogTXVzdCBlbmNvZGUgYGNhdXNlYCwgYGVycm9yc2AuKi9cbi8qIG5lc3RlZCBub24tcGFzc2FibGUgZXJyb3JzIG11c3QgYmUgb2sgZnJvbSBoZXJlLiovXG5pZihlcnJvclRhZ2dpbmc9PT0nb24nKXtcbi8qIFdlIGRlbGliZXJhdGVseSBkbyBub3Qgc2hhcmUgdGhlIHN0YWNrLCBidXQgaXQgd291bGQqL1xuLyogYmUgdXNlZnVsIHRvIGxvZyB0aGUgc3RhY2sgbG9jYWxseSBzbyBzb21lb25lIHdobyBoYXMqL1xuLyogcHJpdmlsZWdlZCBhY2Nlc3MgdG8gdGhlIHRocm93aW5nIFZhdCBjYW4gY29ycmVsYXRlKi9cbi8qIHRoZSBwcm9ibGVtIHdpdGggdGhlIHJlbW90ZSBWYXQgdGhhdCBnZXRzIHRoaXMqL1xuLyogc3VtbWFyeS4gSWYgd2UgZG8gdGhhdCwgd2UgY291bGQgYWxsb2NhdGUgc29tZSByYW5kb20qL1xuLyogaWRlbnRpZmllciBhbmQgaW5jbHVkZSBpdCBpbiB0aGUgbWVzc2FnZSwgdG8gaGVscCovXG4vKiB3aXRoIHRoZSBjb3JyZWxhdGlvbi4qL1xuY29uc3QgZXJyb3JJZD1lbmNvZGVSZWN1cihuZXh0RXJyb3JJZCgpKTtcbmFzc2VydC50eXBlb2YoZXJyb3JJZCwnc3RyaW5nJyk7XG5hc3NlcnQubm90ZShlcnIsWCBgU2VudCBhcyAke2Vycm9ySWR9YCk7XG5tYXJzaGFsU2F2ZUVycm9yKGVycik7XG5yZXR1cm4gaGFyZGVuKHtlcnJvcklkLG1lc3NhZ2UsbmFtZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7bWVzc2FnZSxuYW1lfSk7XG4gfVxuIH07XG5cbmlmKHNlcmlhbGl6ZUJvZHlGb3JtYXQ9PT0nY2FwZGF0YScpe1xuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RUb0NhcERhdGE9KHBhc3NhYmxlLGlmYWNlPXVuZGVmaW5lZCk9PntcbmNvbnN0e2luZGV4LHJlcGVhdH09ZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpbmRleH0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGlmYWNlLGluZGV4fSk7XG4gfVxuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0odmFsLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YSh2YWwsZ2V0SW50ZXJmYWNlT2YodmFsKSk7XG5cbmNvbnN0IGVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHByb21pc2UpO1xuXG4vKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIGlzRXJyb3JMaWtlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IEVuY29kaW5nfSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge0VuY29kaW5nfVxuICovXG5jb25zdCBlbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J2Vycm9yJywuLi5lcnJEYXRhfSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9DYXBEYXRhPW1ha2VFbmNvZGVUb0NhcERhdGEoe1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbmVuY29kZUVycm9yVG9DYXBEYXRhfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb0NhcERhdGEocm9vdCk7XG5jb25zdCBib2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG5ib2R5LFxuc2xvdHN9KTtcblxuIH1lbHNlIGlmKHNlcmlhbGl6ZUJvZHlGb3JtYXQ9PT0nc21hbGxjYXBzJyl7XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcmVmaXhcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZVNsb3RUb1NtYWxsY2Fwcz0ocHJlZml4LHBhc3NhYmxlLGlmYWNlPXVuZGVmaW5lZCk9PntcbmNvbnN0e2luZGV4LHJlcGVhdH09ZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbi8qIFRPRE8gZXhwbG9yZSByZW1vdmluZyB0aGlzIHNwZWNpYWwgY2FzZSovXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9YDtcbiB9XG5yZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9LiR7aWZhY2V9YDtcbiB9O1xuXG5jb25zdCBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtb3RhYmxlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCckJyxyZW1vdGFibGUsZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKSk7XG5cbmNvbnN0IGVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJicscHJvbWlzZSk7XG5cbmNvbnN0IGVuY29kZUVycm9yVG9TbWFsbGNhcHM9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbmNvbnN0e21lc3NhZ2UsLi4ucmVzdH09ZXJyRGF0YTtcbnJldHVybiBoYXJkZW4oeycjZXJyb3InOm1lc3NhZ2UsLi4ucmVzdH0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPW1ha2VFbmNvZGVUb1NtYWxsY2Fwcyh7XG5lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbmVuY29kZUVycm9yVG9TbWFsbGNhcHN9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvU21hbGxjYXBzKHJvb3QpO1xuY29uc3Qgc21hbGxjYXBzQm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuLyogVmFsaWQgSlNPTiBjYW5ub3QgYmVnaW4gd2l0aCBhICcjJywgc28gdGhpcyBpcyBhIHZhbGlkIHNpZ25hbCovXG4vKiBpbmRpY2F0aW5nIHNtYWxsY2FwcyBmb3JtYXQuKi9cbmJvZHk6IGAjJHtzbWFsbGNhcHNCb2R5fWAsXG5zbG90c30pO1xuXG4gfWVsc2V7XG4vKiBUaGUgYHRocm93YCBpcyBhIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQWRkZWQgZm9yIGNvbmZ1c2VkIGxpbnRlcnMuKi9cbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBzZXJpYWxpemVCb2R5Rm9ybWF0OiAke3Eoc2VyaWFsaXplQm9keUZvcm1hdCl9YDtcbiB9XG4gfTtcblxuY29uc3QgbWFrZUZ1bGxSZXZpdmU9KHNsb3RzKT0+e1xuLyoqIEB0eXBlIHtNYXA8bnVtYmVyLCBQYXNzYWJsZT59ICovXG5jb25zdCB2YWxNYXA9bmV3IE1hcCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7e2lmYWNlPzogc3RyaW5nLCBpbmRleDogbnVtYmVyfX0gc2xvdERhdGFcbiAqIEByZXR1cm5zIHtSZW1vdGFibGUgfCBQcm9taXNlfVxuICovXG5jb25zdCBkZWNvZGVTbG90Q29tbW9uPShzbG90RGF0YSk9PntcbmNvbnN0e2lmYWNlPXVuZGVmaW5lZCxpbmRleCwuLi5yZXN0fT1zbG90RGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgc2xvdCBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuaWYodmFsTWFwLmhhcyhpbmRleCkpe1xucmV0dXJuIHZhbE1hcC5nZXQoaW5kZXgpO1xuIH1cbi8qIFRPRE8gU0VDVVJJVFkgSEFaQVJEOiBtdXN0IGVuZm9jZSB0aGF0IHJlbW90YWJsZSB2cyBwcm9taXNlKi9cbi8qIGlzIGFjY29yZGluZyB0byB0aGUgZW5jb2RlZCBzdHJpbmcuKi9cbmNvbnN0IHNsb3Q9c2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbmNvbnN0IHZhbD1jb252ZXJ0U2xvdFRvVmFsKHNsb3QsaWZhY2UpO1xudmFsTWFwLnNldChpbmRleCx2YWwpO1xucmV0dXJuIHZhbDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX0gZXJyRGF0YVxuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IGRlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbmNvbnN0IGRlY29kZUVycm9yQ29tbW9uPShlcnJEYXRhLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7ZXJyb3JJZD11bmRlZmluZWQsbWVzc2FnZSxuYW1lLC4uLnJlc3R9PWVyckRhdGE7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG4vKiBUT0RPIE11c3QgZGVjb2RlIGBjYXVzZWAgYW5kIGBlcnJvcnNgIHByb3BlcnRpZXMqL1xuLyogY2FwRGF0YSBkb2VzIG5vdCB0cmFuc2Zvcm0gc3RyaW5ncy4gVGhlIGNhbGxzIHRvIGBkZWNvZGVSZWN1cmAqL1xuLyogYXJlIGZvciByZXVzZSBieSBvdGhlciBlbmNvZGluZ3MgdGhhdCBkbywgc3VjaCBhcyBzbWFsbGNhcHMuKi9cbmNvbnN0IGROYW1lPWRlY29kZVJlY3VyKG5hbWUpO1xuY29uc3QgZE1lc3NhZ2U9ZGVjb2RlUmVjdXIobWVzc2FnZSk7XG5jb25zdCBkRXJyb3JJZD1lcnJvcklkJiZkZWNvZGVSZWN1cihlcnJvcklkKTtcbnR5cGVvZiBkTmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBkTmFtZSl9YDtcbnR5cGVvZiBkTWVzc2FnZT09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoZE5hbWUpfHxFcnJvcjtcbi8qIGVycm9ySWQgaXMgYSBsYXRlIGFkZGl0aW9uIHNvIGJlIHRvbGVyYW50IG9mIGl0cyBhYnNlbmNlLiovXG5jb25zdCBlcnJvck5hbWU9XG5kRXJyb3JJZD09PXVuZGVmaW5lZD9cbiBgUmVtb3RlJHtFQy5uYW1lfWA6XG4gYFJlbW90ZSR7RUMubmFtZX0oJHtkRXJyb3JJZH0pYDtcbmNvbnN0IGVycm9yPWFzc2VydC5lcnJvcihkTWVzc2FnZSxFQyx7ZXJyb3JOYW1lfSk7XG5yZXR1cm4gaGFyZGVuKGVycm9yKTtcbiB9O1xuXG4vKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoKi9cbi8qIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvbiovXG4vKiByZXN0cmljdGlvbiB1bnRpbCB0aGlzIGlzIGZpeGVkLCBpZiBlaXRoZXIgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSovXG4vKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0Ki9cbmNvbnN0IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhPShyYXdUcmVlLF9kZWNvZGVSZWN1cik9PntcbmNvbnN0e1tRQ0xBU1NdOl8sLi4uc2xvdERhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlU2xvdENvbW1vbihzbG90RGF0YSk7XG4gfTtcblxuY29uc3QgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT0ocmF3VHJlZSxkZWNvZGVSZWN1cik9PntcbmNvbnN0e1tRQ0xBU1NdOl8sLi4uZXJyRGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVFcnJvckNvbW1vbihlcnJEYXRhLGRlY29kZVJlY3VyKTtcbiB9O1xuXG5jb25zdCByZXZpdmVGcm9tQ2FwRGF0YT1tYWtlRGVjb2RlRnJvbUNhcERhdGEoe1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE6ZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE6ZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVFcnJvckZyb21DYXBEYXRhfSk7XG5cblxuY29uc3QgbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzPShwcmVmaXgpPT57XG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmdFbmNvZGluZ1xuICogQHBhcmFtIHsoZTogdW5rbm93bikgPT4gUGFzc2FibGV9IF9kZWNvZGVSZWN1clxuICogQHJldHVybnMge1JlbW90YWJsZSB8IFByb21pc2V9XG4gKi9cbnJldHVybihzdHJpbmdFbmNvZGluZyxfZGVjb2RlUmVjdXIpPT57XG5hc3NlcnQoc3RyaW5nRW5jb2Rpbmcuc3RhcnRzV2l0aChwcmVmaXgpKTtcbi8qIHNsb3RzOiAkc2xvdEluZGV4LmlmYWNlIG9yICRzbG90SW5kZXgqL1xuY29uc3QgaT1zdHJpbmdFbmNvZGluZy5pbmRleE9mKCcuJyk7XG5jb25zdCBpbmRleD1OdW1iZXIoc3RyaW5nRW5jb2Rpbmcuc2xpY2UoMSxpPDA/dW5kZWZpbmVkOmkpKTtcbi8qIGkgPCAwIG1lYW5zIHRoZXJlIHdhcyBubyBpZmFjZSBpbmNsdWRlZC4qL1xuY29uc3QgaWZhY2U9aTwwP3VuZGVmaW5lZDpzdHJpbmdFbmNvZGluZy5zbGljZShpKzEpO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oe2lmYWNlLGluZGV4fSk7XG4gfTtcbiB9O1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbmNvbnN0IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX09ZW5jb2Rpbmc7XG4haGFzT3duUHJvcGVydHlPZihyZXN0RXJyRGF0YSwnbWVzc2FnZScpfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0eSAke3EoJ21lc3NhZ2UnKX1gO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKHttZXNzYWdlLC4uLnJlc3RFcnJEYXRhfSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyh7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfSk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7RnJvbUNhcERhdGE8U2xvdD59XG4gKi9cbmNvbnN0IGZyb21DYXBEYXRhPShkYXRhKT0+e1xuY29uc3R7Ym9keSxzbG90c309ZGF0YTtcbnR5cGVvZiBib2R5PT09J3N0cmluZyd8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuaXNBcnJheShkYXRhLnNsb3RzKXx8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguc2xvdHMgYXJlIG5vdCBBcnJheSlgO1xuY29uc3R7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc309bWFrZUZ1bGxSZXZpdmUoc2xvdHMpO1xubGV0IHJlc3VsdDtcbi8qIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYW4gdW5hbWJpZ3VvdXMgc2lnbmFsLiovXG5pZihib2R5LnN0YXJ0c1dpdGgoJyMnKSl7XG5jb25zdCBzbWFsbGNhcHNCb2R5PWJvZHkuc2xpY2UoMSk7XG5jb25zdCBlbmNvZGluZz1oYXJkZW4oSlNPTi5wYXJzZShzbWFsbGNhcHNCb2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiB9ZWxzZXtcbmNvbnN0IHJhd1RyZWU9aGFyZGVuKEpTT04ucGFyc2UoYm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gfVxuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNyovXG4vKiB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBmaXhlZCBvbmNlIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgc3dpdGNoKi9cbi8qIHRvIHNtYWxsY2Fwcy4qL1xuYXNzZXJ0UGFzc2FibGUocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7XG50b0NhcERhdGEsXG5mcm9tQ2FwRGF0YSxcblxuLyogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5Ki9cbi8qKiBAZGVwcmVjYXRlZCB1c2UgdG9DYXBEYXRhICovXG5zZXJpYWxpemU6dG9DYXBEYXRhLFxuLyoqIEBkZXByZWNhdGVkIHVzZSBmcm9tQ2FwRGF0YSAqL1xudW5zZXJpYWxpemU6ZnJvbUNhcERhdGF9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTWFyc2hhbChtYWtlTWFyc2hhbCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcnNoYWwiOlsibWFrZU1hcnNoYWwiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAV0RkCn5AAAB+QAAAJQAAAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9yYW5rT3JkZXIuanN7ImltcG9ydHMiOlsiLi9lbmNvZGVQYXNzYWJsZS5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJGdWxsUmFua0NvdmVyIiwiYXNzZXJ0UmFua1NvcnRlZCIsImNvbXBhcmF0b3JNaXJyb3JJbWFnZSIsImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVSYW5rIiwiY292ZXJlZEVudHJpZXMiLCJnZXRJbmRleENvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaXNSYW5rU29ydGVkIiwibWFrZUNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsInNvcnRCeVJhbmsiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgZ2V0VGFnLHBhc3NTdHlsZU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzU3R5bGVQcmVmaXhlcyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicGFzc1N0eWxlUHJlZml4ZXNcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZVByZWZpeGVzID0gJGjigI1fYSldXSxbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SYW5rQ292ZXJ9IFJhbmtDb3ZlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmFua0NvbXBhcmlzb259IFJhbmtDb21wYXJpc29uICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SYW5rQ29tcGFyZX0gUmFua0NvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2VudHJpZXMsZnJvbUVudHJpZXMsc2V0UHJvdG90eXBlT2YsaXN9PU9iamVjdDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSYW5rQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtSYW5rQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZ1bGxDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge0Z1bGxDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tudW1iZXIsIG51bWJlcl19IEluZGV4Q292ZXJcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24gdXNlZCBieSBKYXZhU2NyaXB0J3MgTWFwIGFuZCBTZXRcbiAqIGFic3RyYWN0aW9ucywgd2hlcmUgTmFOIGlzIHRoZSBzYW1lIGFzIE5hTiBhbmQgLTAgaXMgdGhlIHNhbWUgYXNcbiAqIDAuIE1hcnNoYWwgc2VyaWFsaXplcyAtMCBhcyB6ZXJvLCBzbyB0aGUgc2VtYW50aWNzIG9mIG91ciBkaXN0cmlidXRlZFxuICogb2JqZWN0IHN5c3RlbSBkb2VzIG5vdCBkaXN0aW5ndWlzaCAwIGZyb20gLTAuXG4gKlxuICogYHNhbWVWYWx1ZVplcm9gIGlzIHRoZSBFY21hU2NyaXB0IHNwZWMgbmFtZSBmb3IgdGhpcyBlcXVhbGl0eSBjb21wYXJpc29uLFxuICogYnV0IFRPRE8gd2UgbmVlZCBhIGJldHRlciBuYW1lIGZvciB0aGUgQVBJLlxuICpcbiAqIEBwYXJhbSB7YW55fSB4XG4gKiBAcGFyYW0ge2FueX0geVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHNhbWVWYWx1ZVplcm89KHgseSk9Png9PT15fHxpcyh4LHkpO1xuXG5jb25zdCB0cml2aWFsQ29tcGFyYXRvcj0obGVmdCxyaWdodCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5LCBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbmxlZnQ8cmlnaHQ/LTE6bGVmdD09PXJpZ2h0PzA6MTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPFBhc3NTdHlsZSwgeyBpbmRleDogbnVtYmVyLCBjb3ZlcjogUmFua0NvdmVyIH0+fSBQYXNzU3R5bGVSYW5rc1JlY29yZFxuICovXG5cbmNvbnN0IHBhc3NTdHlsZVJhbmtzPS8qKiBAdHlwZSB7UGFzc1N0eWxlUmFua3NSZWNvcmR9ICovXG5mcm9tRW50cmllcyhcbmVudHJpZXMocGFzc1N0eWxlUHJlZml4ZXMpXG4vKiBTb3J0IGVudHJpZXMgYnkgYXNjZW5kaW5nIHByZWZpeC4qLy5cbnNvcnQoKFtfbGVmdFN0eWxlLGxlZnRQcmVmaXhlc10sW19yaWdodFN0eWxlLHJpZ2h0UHJlZml4ZXNdKT0+e1xucmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcyxyaWdodFByZWZpeGVzKTtcbiB9KS5cbm1hcCgoW3Bhc3NTdHlsZSxwcmVmaXhlc10saW5kZXgpPT57XG4vKiBDb3ZlciBhbGwgc3RyaW5ncyB0aGF0IHN0YXJ0IHdpdGggYW55IGNoYXJhY3RlciBpbiBgcHJlZml4ZXNgLCovXG4vKiB2ZXJpZnlpbmcgdGhhdCBpdCBpcyBzb3J0ZWQgc28gdGhhdCBpcyovXG4vKiBhbGwgcyBzdWNoIHRoYXQgcHJlZml4ZXMuYXQoMCkg4omkIHMgPCBzdWNjZXNzb3IocHJlZml4ZXMuYXQoLTEpKS4qL1xucHJlZml4ZXM9PT1bLi4ucHJlZml4ZXNdLnNvcnQoKS5qb2luKCcnKXx8XG5GYWlsIGB1bnNvcnRlZCBwcmVmaXhlcyBmb3IgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHtxKHByZWZpeGVzKX1gO1xuY29uc3QgY292ZXI9W1xucHJlZml4ZXMuY2hhckF0KDApLFxuU3RyaW5nLmZyb21DaGFyQ29kZShwcmVmaXhlcy5jaGFyQ29kZUF0KHByZWZpeGVzLmxlbmd0aC0xKSsxKV07XG5cbnJldHVybltwYXNzU3R5bGUse2luZGV4LGNvdmVyfV07XG4gfSkpO1xuXG5cbnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVJhbmtzLG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVJhbmtzKTtcblxuLyoqXG4gKiBBc3NvY2lhdGUgd2l0aCBlYWNoIHBhc3NTdHlsZSBhIFJhbmtDb3ZlciB0aGF0IG1heSBiZSBhbiBvdmVyZXN0aW1hdGUsXG4gKiBhbmQgd2hvc2UgcmVzdWx0cyB0aGVyZWZvcmUgbmVlZCB0byBiZSBmaWx0ZXJlZCBkb3duLiBGb3IgZXhhbXBsZSwgYmVjYXVzZVxuICogdGhlcmUgaXMgbm90IGEgc21hbGxlc3Qgb3IgYmlnZ2VzdCBiaWdpbnQsIGJvdW5kIGl0IGJ5IGBOYU5gICh0aGUgbGFzdCBwbGFjZVxuICogbnVtYmVyKSBhbmQgYCcnYCAodGhlIGVtcHR5IHN0cmluZywgd2hpY2ggaXMgdGhlIGZpcnN0IHBsYWNlIHN0cmluZykuIFRodXMsXG4gKiBhIHJhbmdlIHF1ZXJ5IHVzaW5nIHRoaXMgcmFuZ2UgbWF5IGluY2x1ZGUgdGhlc2UgdmFsdWVzLCB3aGljaCB3b3VsZCB0aGVuXG4gKiBuZWVkIHRvIGJlIGZpbHRlcmVkIG91dC5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCAgICAgICAgZ2V0UGFzc1N0eWxlQ292ZXI9KHBhc3NTdHlsZSk9PnBhc3NTdHlsZVJhbmtzW3Bhc3NTdHlsZV0uY292ZXI7JGjigI1fb25jZS5nZXRQYXNzU3R5bGVDb3ZlcihnZXRQYXNzU3R5bGVDb3Zlcik7XG5oYXJkZW4oZ2V0UGFzc1N0eWxlQ292ZXIpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFdlYWtTZXQ8UGFzc2FibGVbXT4+fVxuICovXG5jb25zdCBtZW1vT2ZTb3J0ZWQ9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxSYW5rQ29tcGFyZT59XG4gKi9cbmNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZXM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlPX0gY29tcGFyZVJlbW90YWJsZXNcbiAqIEFuIG9wdGlvbiB0byBjcmVhdGUgYSBjb21wYXJhdG9yIGluIHdoaWNoIGFuIGludGVybmFsIG9yZGVyIGlzXG4gKiBhc3NpZ25lZCB0byByZW1vdGFibGVzLiBUaGlzIGRlZmF1bHRzIHRvIGEgY29tcGFyYXRvciB0aGF0XG4gKiBhbHdheXMgcmV0dXJucyBgMGAsIG1lYW5pbmcgdGhhdCBhbGwgcmVtb3RhYmxlcyBhcmUgdGllZFxuICogZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmF0b3JLaXR9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29tcGFyYXRvcktpdD0oY29tcGFyZVJlbW90YWJsZXM9KF94LF95KT0+MCk9Pntcbi8qKiBAdHlwZSB7UmFua0NvbXBhcmV9ICovXG5jb25zdCBjb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+e1xuaWYoc2FtZVZhbHVlWmVybyhsZWZ0LHJpZ2h0KSl7XG5yZXR1cm4gMDtcbiB9XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xucmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKFxucGFzc1N0eWxlUmFua3NbbGVmdFN0eWxlXS5pbmRleCxcbnBhc3NTdHlsZVJhbmtzW3JpZ2h0U3R5bGVdLmluZGV4KTtcblxuIH1cbi8qIGVzbGludC1kaXNhYmxlIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMgLS1cbiAqIFdlIGtub3cgYGxlZnRgIGFuZCBgcmlnaHRgIGFyZSBjb21wYXJhYmxlLlxuICovXG5zd2l0Y2gobGVmdFN0eWxlKXtcbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gY29tcGFyZVJlbW90YWJsZXMobGVmdCxyaWdodCk7XG4gfVxuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG4vKiBGb3IgZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCBhbGwgbWVtYmVycyBvZiB0aGF0IHBhc3NTdHlsZSBhcmUgdGllZCovXG4vKiBmb3IgdGhlIHNhbWUgcmFuay4qL1xucmV0dXJuIDA7XG4gfVxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzp7XG4vKiBXaXRoaW4gZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCB0aGUgcmFuayBvcmRlcmluZyBhZ3JlZXMgd2l0aCovXG4vKiBKYXZhU2NyaXB0J3MgcmVsYXRpb25hbCBvcGVyYXRvcnMgYDxgIGFuZCBgPmAuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBjb21wYXJhdG9yKFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKGxlZnQpLFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKHJpZ2h0KSk7XG5cbiB9XG5jYXNlJ251bWJlcic6e1xuLyogYE5hTmAncyByYW5rIGlzIGFmdGVyIGFsbCBvdGhlciBudW1iZXJzLiovXG5pZihOdW1iZXIuaXNOYU4obGVmdCkpe1xuYXNzZXJ0KCFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbnJldHVybiAxO1xuIH1lbHNlIGlmKE51bWJlci5pc05hTihyaWdodCkpe1xucmV0dXJuLTE7XG4gfVxuLyogVGhlIHJhbmsgb3JkZXJpbmcgb2Ygbm9uLU5hTiBudW1iZXJzIGFncmVlcyB3aXRoIEphdmFTY3JpcHQncyovXG4vKiByZWxhdGlvbmFsIG9wZXJhdG9ycyAnPCcgYW5kICc+Jy4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgaW52ZXJzZSBzb3J0ZWQgb3JkZXIgb2YgcHJvcGVydHkgbmFtZXMsIHRoZW4qL1xuLyogbGV4aWNvZ3JhcGhpYyBieSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGF0IHNhbWUgaW52ZXJzZSovXG4vKiBvcmRlciBvZiB0aGVpciBwcm9wZXJ0eSBuYW1lcy4gQ29tcGFyaW5nIG5hbWVzIGJ5IHRoZW1zZWx2ZXMgZmlyc3QsKi9cbi8qIGFsbCByZWNvcmRzIHdpdGggdGhlIGV4YWN0IHNhbWUgc2V0IG9mIHByb3BlcnR5IG5hbWVzIHNvcnQgbmV4dCB0byovXG4vKiBlYWNoIG90aGVyIGluIGEgcmFuay1zb3J0IG9mIGNvcHlSZWNvcmRzLiovXG5cbi8qIFRoZSBjb3B5UmVjb3JkIGludmFyaWFudHMgZW5mb3JjZWQgYnkgcGFzc1N0eWxlT2YgZW5zdXJlIHRoYXQqL1xuLyogYWxsIHRoZSBwcm9wZXJ0eSBuYW1lcyBhcmUgc3RyaW5ncy4gV2UgbmVlZCB0aGUgcmV2ZXJzZSBzb3J0ZWQgb3JkZXIqL1xuLyogb2YgdGhlc2UgbmFtZXMsIHdoaWNoIHdlIHRoZW4gY29tcGFyZSBsZXhpY29ncmFwaGljYWxseS4gVGhpcyBlbnN1cmVzKi9cbi8qIHRoYXQgaWYgdGhlIG5hbWVzIG9mIHJlY29yZCBYIGFyZSBhIHN1YnNldCBvZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFksKi9cbi8qIHRoZW4gcmVjb3JkIFggd2lsbCBoYXZlIGFuIGVhcmxpZXIgcmFuayBhbmQgc29ydCB0byB0aGUgbGVmdCBvZiBZLiovXG5jb25zdCBsZWZ0TmFtZXM9cmVjb3JkTmFtZXMobGVmdCk7XG5jb25zdCByaWdodE5hbWVzPXJlY29yZE5hbWVzKHJpZ2h0KTtcblxuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdE5hbWVzLHJpZ2h0TmFtZXMpO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnJldHVybiBjb21wYXJhdG9yKFxucmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKSxcbnJlY29yZFZhbHVlcyhyaWdodCxyaWdodE5hbWVzKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogTGV4aWNvZ3JhcGhpYyovXG5jb25zdCBsZW49TWF0aC5taW4obGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyB3ZXJlIHRpZWQsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbi8qIElmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGhhcyBhbiBlYXJsaWVyIHJhbmsgdGhhbiBZLiovXG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGBbU3ltYm9sLnRvU3RyaW5nVGFnXWAgdGhlbiBgLnBheWxvYWRgLiovXG5jb25zdCBsYWJlbENvbXA9Y29tcGFyYXRvcihnZXRUYWcobGVmdCksZ2V0VGFnKHJpZ2h0KSk7XG5pZihsYWJlbENvbXAhPT0wKXtcbnJldHVybiBsYWJlbENvbXA7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5wYXlsb2FkLHJpZ2h0LnBheWxvYWQpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHBhc3NTdHlsZTogJHtxKGxlZnRTdHlsZSl9YDtcbiB9fVxuXG4vKiBlc2xpbnQtZW5hYmxlICovXG4gfTtcblxuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGFudGlDb21wYXJhdG9yPSh4LHkpPT5jb21wYXJhdG9yKHkseCk7XG5cbm1lbW9PZlNvcnRlZC5zZXQoY29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbm1lbW9PZlNvcnRlZC5zZXQoYW50aUNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLGNvbXBhcmF0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yfSk7XG4gfTtcbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHJldHVybnMge1JhbmtDb21wYXJlPX1cbiAqLyRo4oCNX29uY2UubWFrZUNvbXBhcmF0b3JLaXQobWFrZUNvbXBhcmF0b3JLaXQpO1xuY29uc3QgICAgICAgIGNvbXBhcmF0b3JNaXJyb3JJbWFnZT0oY29tcGFyYXRvcik9PlxuY29tcGFyYXRvck1pcnJvckltYWdlcy5nZXQoY29tcGFyYXRvcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbmNvbnN0ICAgICAgICBpc1JhbmtTb3J0ZWQ9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbmlmKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5hc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKT09PSdjb3B5QXJyYXknKTtcbmZvcihsZXQgaT0xO2k8cGFzc2FibGVzLmxlbmd0aDtpKz0xKXtcbmlmKGNvbXBhcmUocGFzc2FibGVzW2ktMV0scGFzc2FibGVzW2ldKT49MSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5pc1JhbmtTb3J0ZWQoaXNSYW5rU29ydGVkKTtcbmhhcmRlbihpc1JhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRSYW5rU29ydGVkPShzb3J0ZWQsY29tcGFyZSk9PlxuaXNSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKXx8XG4vKiBUT0RPIGFzc2VydCBvbiBidWcgY291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uIEZpeC4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkZhaWwgYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLGNvbXBhcmUpfWA7JGjigI1fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIFRPRE8gU0VDVVJJVFkgQlVHOiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQyNjBcbiAqIHNvcnRCeVJhbmsgY3VycmVudGx5IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBkaXJlY3RseSwgYW5kXG4gKiBzbyBvbmx5IHdvcmtzIGNvcnJlY3RseSB3aGVuIGdpdmVuIGEgYGNvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgY29uc2lkZXJzXG4gKiBgdW5kZWZpbmVkYCBzdHJpY3RseSBiaWdnZXIgKGA+YCkgdGhhbiBldmVyeXRoaW5nIGVsc2UuIFRoaXMgaXNcbiAqIGJlY2F1c2UgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBiaXphcnJlbHkgbW92ZXMgYWxsIGB1bmRlZmluZWRgcyB0b1xuICogdGhlIGVuZCBvZiB0aGUgYXJyYXkgcmVnYXJkbGVzcywgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBgY29tcGFyZWBcbiAqIGZ1bmN0aW9uLiBUaGlzIGlzIGEgZ2VudWluZSBidWcgZm9yIHVzIE5PVyBiZWNhdXNlIHNvbWV0aW1lcyB3ZSBzb3J0XG4gKiBpbiByZXZlcnNlIG9yZGVyIGJ5IHBhc3NpbmcgYSByZXZlcnNlZCByYW5rIGNvbXBhcmlzb24gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXNzYWJsZT59IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge1Bhc3NhYmxlW119XG4gKi9cbmNvbnN0ICAgICAgICBzb3J0QnlSYW5rPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmlmKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSl7XG5oYXJkZW4ocGFzc2FibGVzKTtcbi8qIENhbGxpbmcgaXNSYW5rU29ydGVkIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGdldCBtZW1vaXplZCBmb3IqL1xuLyogdGhpcyBgY29tcGFyZWAgZnVuY3Rpb24gZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBtZW1vaXplZCBmb3IgYSBkaWZmZXJlbnQqL1xuLyogYGNvbXBhcmVgIGZ1bmN0aW9uLiovXG5pZihpc1JhbmtTb3J0ZWQocGFzc2FibGVzLGNvbXBhcmUpKXtcbnJldHVybiBwYXNzYWJsZXM7XG4gfVxuIH1cbmNvbnN0IHVuc29ydGVkPVsuLi5wYXNzYWJsZXNdO1xudW5zb3J0ZWQuZm9yRWFjaChoYXJkZW4pO1xuY29uc3Qgc29ydGVkPWhhcmRlbih1bnNvcnRlZC5zb3J0KGNvbXBhcmUpKTtcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG5yZXR1cm4gc29ydGVkO1xuIH07JGjigI1fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKipcbiAqIFNlZVxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X3NlYXJjaF9hbGdvcml0aG0jUHJvY2VkdXJlX2Zvcl9maW5kaW5nX3RoZV9sZWZ0bW9zdF9lbGVtZW50XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHBhcmFtIHsoXCJsZWZ0TW9zdFwiIHwgXCJyaWdodE1vc3RcIik9fSBiaWFzXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByYW5rU2VhcmNoPShzb3J0ZWQsY29tcGFyZSxrZXksYmlhcz0nbGVmdE1vc3QnKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5sZXQgbGVmdD0wO1xubGV0IHJpZ2h0PXNvcnRlZC5sZW5ndGg7XG53aGlsZShsZWZ0PHJpZ2h0KXtcbmNvbnN0IG09TWF0aC5mbG9vcigobGVmdCtyaWdodCkvMik7XG5jb25zdCBjb21wPWNvbXBhcmUoc29ydGVkW21dLGtleSk7XG5pZihjb21wPD0tMXx8Y29tcD09PTAmJmJpYXM9PT0ncmlnaHRNb3N0Jyl7XG5sZWZ0PW0rMTtcbiB9ZWxzZXtcbmFzc2VydChjb21wPj0xfHxjb21wPT09MCYmYmlhcz09PSdsZWZ0TW9zdCcpO1xucmlnaHQ9bTtcbiB9XG4gfVxucmV0dXJuIGJpYXM9PT0nbGVmdE1vc3QnP2xlZnQ6cmlnaHQtMTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldEluZGV4Q292ZXI9KHNvcnRlZCxjb21wYXJlLFtsZWZ0S2V5LHJpZ2h0S2V5XSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xuY29uc3QgbGVmdEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUsbGVmdEtleSwnbGVmdE1vc3QnKTtcbmNvbnN0IHJpZ2h0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxyaWdodEtleSwncmlnaHRNb3N0Jyk7XG5yZXR1cm5bbGVmdEluZGV4LHJpZ2h0SW5kZXhdO1xuIH07JGjigI1fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiogQHR5cGUge1JhbmtDb3Zlcn0gKi9cbmNvbnN0ICAgICAgICBGdWxsUmFua0NvdmVyPWhhcmRlbihbJycsJ3snXSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi8kaOKAjV9vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG5jb25zdCAgICAgICAgY292ZXJlZEVudHJpZXM9KHNvcnRlZCxbbGVmdEluZGV4LHJpZ2h0SW5kZXhdKT0+e1xuLyoqIEB0eXBlIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fSAqL1xuY29uc3QgaXRlcmFibGU9aGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT1sZWZ0SW5kZXg7XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKGk8PXJpZ2h0SW5kZXgpe1xuY29uc3QgZWxlbWVudD1zb3J0ZWRbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7dmFsdWU6W2ksZWxlbWVudF0sZG9uZTpmYWxzZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7dmFsdWU6dW5kZWZpbmVkLGRvbmU6dHJ1ZX0pO1xuIH1cbiB9fSk7XG5cbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1heFJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPj0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1pblJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPD0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB1bmlvblJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IHVuaW9uUmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5taW5SYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWF4UmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLFsneycsJyddKTtcbiB9OyRo4oCNX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1heFJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5taW5SYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLFsnJywneyddKTtcbiB9OyRo4oCNX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuY29uc3QgICAgICAge2NvbXBhcmF0b3I6Y29tcGFyZVJhbmssYW50aUNvbXBhcmF0b3I6Y29tcGFyZUFudGlSYW5rfT1cbm1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29tcGFyYXRvciBraXQgaW4gd2hpY2ggcmVtb3RhYmxlcyBhcmUgZnVsbHkgb3JkZXJlZFxuICogYnkgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGZpcnN0IHNlZW4gYnkgKnRoaXMqIGNvbXBhcmF0b3Iga2l0LlxuICogQkVXQVJFOiBUaGlzIGlzIG9ic2VydmFibGUgbXV0YWJsZSBzdGF0ZSwgc28gc3VjaCBhIGNvbXBhcmF0b3Iga2l0XG4gKiBzaG91bGQgbmV2ZXIgYmUgc2hhcmVkIGFtb25nIHN1YnN5c3RlbXMgdGhhdCBzaG91bGQgbm90IGJlIGFibGVcbiAqIHRvIGNvbW11bmljYXRlLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIG9yZGVyIGRvZXMgbm90IG1lZXQgdGhlIHJlcXVpcmVtZW50cyBmb3Igc3RvcmVcbiAqIG9yZGVyaW5nLCBzaW5jZSBpdCBoYXMgbm8gbWVtb3J5IG9mIGRlbGV0ZWQga2V5cy5cbiAqXG4gKiBUaGVzZSBmdWxsIG9yZGVyIGNvbXBhcmF0b3Iga2l0IGlzIHN0cmljdGx5IG1vcmUgcHJlY2lzZSB0aGF0IHRoZVxuICogcmFuayBvcmRlciBjb21wYXJhdG9yIGtpdHMgYWJvdmUuIEFzIGEgcmVzdWx0LCBhbnkgYXJyYXkgd2hpY2ggaXNcbiAqIHNvcnRlZCBieSBzdWNoIGEgZnVsbCBvcmRlciB3aWxsIHBhc3MgdGhlIGlzUmFua1NvcnRlZCB0ZXN0IHdpdGhcbiAqIGEgY29ycmVzcG9uZGluZyByYW5rIG9yZGVyLlxuICpcbiAqIEFuIGFycmF5IHdoaWNoIGlzIHNvcnRlZCBieSBhICpmcmVzaCogZnVsbCBvcmRlciBjb21wYXJhdG9yLCBpLmUuLFxuICogb25lIHRoYXQgaGFzIG5vdCB5ZXQgc2VlbiBhbnkgcmVtb3RhYmxlcywgd2lsbCBvZiBjb3Vyc2UgcmVtYWluXG4gKiBzb3J0ZWQgYnkgYWNjb3JkaW5nIHRvICp0aGF0KiBmdWxsIG9yZGVyIGNvbXBhcmF0b3IuIEFuIGFycmF5ICpvZlxuICogc2NhbGFycyogc29ydGVkIGJ5IGEgZnJlc2ggZnVsbCBvcmRlciB3aWxsIHJlbWFpbiBzb3J0ZWQgZXZlblxuICogYWNjb3JkaW5nIHRvIGEgbmV3IGZyZXNoIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgc2luY2UgaXQgd2lsbCBzZWVcbiAqIHRoZSByZW1vdGFibGVzIGluIHRoZSBzYW1lIG9yZGVyIGFnYWluLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzXG4gKiBub3QgdHJ1ZSBvZiBhcnJheXMgb2YgcGFzc2FibGVzIGluIGdlbmVyYWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFuPX0gbG9uZ0xpdmVkXG4gKiBAcmV0dXJucyB7RnVsbENvbXBhcmF0b3JLaXR9XG4gKi8kaOKAjV9vbmNlLmNvbXBhcmVSYW5rKGNvbXBhcmVSYW5rKTskaOKAjV9vbmNlLmNvbXBhcmVBbnRpUmFuayhjb21wYXJlQW50aVJhbmspO1xuY29uc3QgICAgICAgIG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0PShsb25nTGl2ZWQ9ZmFsc2UpPT57XG5sZXQgbnVtU2Vlbj0wO1xuLyogV2hlbiBkeW5hbWljYWxseSBjcmVhdGVkIHdpdGggc2hvcnQgbGlmZXRpbWVzICh0aGUgZGVmYXVsdCkgYSBXZWFrTWFwKi9cbi8qIHdvdWxkIHBlcmZvcm0gcG9vcmx5LCBhbmQgdGhlIGxlYWsgY3JlYXRlZCBieSBhIE1hcCBvbmx5IGxhc3RzIGFzIGxvbmcqL1xuLyogYXMgdGhlIE1hcC4qL1xuY29uc3QgTWFwQ29uc3RydWN0b3I9bG9uZ0xpdmVkP1dlYWtNYXA6TWFwO1xuY29uc3Qgc2Vlbj1uZXcgTWFwQ29uc3RydWN0b3IoKTtcbmNvbnN0IHRhZz0ocik9PntcbmlmKHNlZW4uaGFzKHIpKXtcbnJldHVybiBzZWVuLmdldChyKTtcbiB9XG5udW1TZWVuKz0xO1xuc2Vlbi5zZXQocixudW1TZWVuKTtcbnJldHVybiBudW1TZWVuO1xuIH07XG5jb25zdCBjb21wYXJlUmVtb3RhYmxlcz0oeCx5KT0+Y29tcGFyZVJhbmsodGFnKHgpLHRhZyh5KSk7XG5yZXR1cm4gbWFrZUNvbXBhcmF0b3JLaXQoY29tcGFyZVJlbW90YWJsZXMpO1xuIH07JGjigI1fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldFBhc3NTdHlsZUNvdmVyIjpbImdldFBhc3NTdHlsZUNvdmVyIl0sIm1ha2VDb21wYXJhdG9yS2l0IjpbIm1ha2VDb21wYXJhdG9yS2l0Il0sImNvbXBhcmF0b3JNaXJyb3JJbWFnZSI6WyJjb21wYXJhdG9yTWlycm9ySW1hZ2UiXSwiaXNSYW5rU29ydGVkIjpbImlzUmFua1NvcnRlZCJdLCJhc3NlcnRSYW5rU29ydGVkIjpbImFzc2VydFJhbmtTb3J0ZWQiXSwic29ydEJ5UmFuayI6WyJzb3J0QnlSYW5rIl0sImdldEluZGV4Q292ZXIiOlsiZ2V0SW5kZXhDb3ZlciJdLCJGdWxsUmFua0NvdmVyIjpbIkZ1bGxSYW5rQ292ZXIiXSwiY292ZXJlZEVudHJpZXMiOlsiY292ZXJlZEVudHJpZXMiXSwidW5pb25SYW5rQ292ZXJzIjpbInVuaW9uUmFua0NvdmVycyJdLCJpbnRlcnNlY3RSYW5rQ292ZXJzIjpbImludGVyc2VjdFJhbmtDb3ZlcnMiXSwiY29tcGFyZVJhbmsiOlsiY29tcGFyZVJhbmsiXSwiY29tcGFyZUFudGlSYW5rIjpbImNvbXBhcmVBbnRpUmFuayJdLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCI6WyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACYGTuzNAEAADQBAAAhAAAAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACUem73PCwAAzwsAAB4AAABAZW5kby9uYXQtdjQuMS4yNy9zcmMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIk5hdCIsImlzTmF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJpc05hdFwifSk7JGjigI1fb25jZS5pc05hdChpc05hdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdCwgJ25hbWUnLCB7dmFsdWU6IFwiTmF0XCJ9KTskaOKAjV9vbmNlLk5hdChOYXQpOyAgIC8qIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiovXG4vKiBDb3B5cmlnaHQgKEMpIDIwMTggQWdvcmljKi9cbi8qKi9cbi8qIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7Ki9cbi8qIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4qL1xuLyogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ki9cbi8qKi9cbi8qIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCovXG4vKiovXG4vKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlKi9cbi8qIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUywqL1xuLyogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuKi9cbi8qIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQqL1xuLyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuKi9cblxuLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBJcyBgYWxsZWdlZE51bWAgYSBudW1iZXIgaW4gdGhlIFtjb250aWd1b3VzIHJhbmdlIG9mIGV4YWN0bHkgYW5kXG4gKiB1bmFtYmlndW91c2x5XG4gKiByZXByZXNlbnRhYmxlXShodHRwczovL2VzZGlzY3Vzcy5vcmcvdG9waWMvbW9yZS1udW1lcmljLWNvbnN0YW50cy1wbGVhc2UtZXNwZWNpYWxseS1lcHNpbG9uI2NvbnRlbnQtMTQpXG4gKiAgbmF0dXJhbCBudW1iZXJzIChub24tbmVnYXRpdmUgaW50ZWdlcnMpP1xuICpcbiAqIFRvIHF1YWxpZnkgYGFsbGVnZWROdW1gIG11c3QgZWl0aGVyIGJlIGFcbiAqIG5vbi1uZWdhdGl2ZSBgYmlnaW50YCwgb3IgYSBub24tbmVnYXRpdmUgYG51bWJlcmAgcmVwcmVzZW50aW5nIGFuIGludGVnZXJcbiAqIHdpdGhpbiByYW5nZSBvZiBbaW50ZWdlcnMgc2FmZWx5IHJlcHJlc2VudGFibGUgaW5cbiAqIGZsb2F0aW5nIHBvaW50XShodHRwczovL3RjMzkuZXMvZWNtYTI2Mi8jc2VjLW51bWJlci5pc3NhZmVpbnRlZ2VyKS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IGFsbGVnZWROdW1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xucmV0dXJuIGFsbGVnZWROdW0+PTA7XG4gfVxuaWYodHlwZW9mIGFsbGVnZWROdW0hPT0nbnVtYmVyJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5yZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkmJmFsbGVnZWROdW0+PTA7XG4gfVxuXG4vKipcbiAqIElmIGBhbGxlZ2VkTnVtYmVyYCBwYXNzZXMgdGhlIGBpc05hdGAgdGVzdCwgdGhlbiByZXR1cm4gaXQgYXMgYSBiaWdpbnQuXG4gKiBPdGhlcndpc2UgdGhyb3cgYW4gYXBwcm9wcmlhdGUgZXJyb3IuXG4gKlxuICogSWYgYGFsbGVnZWROdW1gIGlzIG5laXRoZXIgYSBiaWdpbnQgbm9yIGEgbnVtYmVyLCBgTmF0YCB0aHJvd3MgYSBgVHlwZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaWYgaXQgaXMgbm90IGEgW3NhZmVseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogbm9uLW5lZ2F0aXZlIGludGVnZXIsIGBOYXRgIHRocm93cyBhIGBSYW5nZUVycm9yYC5cbiAqIE90aGVyd2lzZSwgaXQgaXMgY29udmVydGVkIHRvIGEgYmlnaW50IGlmIG5lY2Vzc2FyeSBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7YmlnaW50fVxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbmlmKGFsbGVnZWROdW08MCl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gYWxsZWdlZE51bTtcbiB9XG5cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J251bWJlcicpe1xuaWYoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBub3QgYSBzYWZlIGludGVnZXJgKTtcbiB9XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiB9XG5cbnRocm93IG5ldyBUeXBlRXJyb3IoXG4gYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmApO1xuXG4gfVxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzTmF0IjpbImlzTmF0Il0sIk5hdCI6WyJOYXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZfKMGnwIAAB8CAAAIAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvaXRlci1oZWxwZXJzLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyIsIi4vc3JjL3JlbW90YWJsZS5qcyIsIi4vc3JjL3N5bWJvbC5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhciIsIkZhciIsImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIiwiaXNPYmplY3QiLCJpc09iamVjdCIsImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwidG9QYXNzYWJsZUVycm9yIiwidG9QYXNzYWJsZUVycm9yIixudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9pdGVyLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9lcnJvci5qc1wiLCBbXV0sW1wiLi9zcmMvcmVtb3RhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9zeW1ib2wuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZU9mLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlVGFnZ2VkLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlLWZhci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjpbWyJtYXBJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sWyJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIl1dLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6W1siUEFTU19TVFlMRSIsIlBBU1NfU1RZTEUiXSxbImlzT2JqZWN0IiwiaXNPYmplY3QiXSxbImFzc2VydENoZWNrZXIiLCJhc3NlcnRDaGVja2VyIl0sWyJnZXRUYWciLCJnZXRUYWciXSxbImhhc093blByb3BlcnR5T2YiLCJoYXNPd25Qcm9wZXJ0eU9mIl1dLCIuL3NyYy9lcnJvci5qcyI6W1siZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEVycm9yQ29uc3RydWN0b3IiXSxbInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciJdLFsiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSJdXSwiLi9zcmMvcmVtb3RhYmxlLmpzIjpbWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl1dLCIuL3NyYy9zeW1ib2wuanMiOltbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSxbImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIl0sWyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSxbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdXSwiLi9zcmMvcGFzc1N0eWxlT2YuanMiOltbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXSxbImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGUiXV0sIi4vc3JjL21ha2VUYWdnZWQuanMiOltbIm1ha2VUYWdnZWQiLCJtYWtlVGFnZ2VkIl1dLCIuL3NyYy9tYWtlLWZhci5qcyI6W1siUmVtb3RhYmxlIiwiUmVtb3RhYmxlIl0sWyJGYXIiLCJGYXIiXSxbIlRvRmFyRnVuY3Rpb24iLCJUb0ZhckZ1bmN0aW9uIl1dLCIuL3NyYy90eXBlR3VhcmRzLmpzIjpbWyJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZWNvcmQiXSxbImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSJdLFsiYXNzZXJ0UmVtb3RhYmxlIiwiYXNzZXJ0UmVtb3RhYmxlIl0sWyJpc1JlbW90YWJsZSIsImlzUmVtb3RhYmxlIl0sWyJpc1JlY29yZCIsImlzUmVjb3JkIl0sWyJpc0NvcHlBcnJheSIsImlzQ29weUFycmF5Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADeRraqkwcAAJMHAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcbmNvbnN0e2dldFByb3RvdHlwZU9mfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheSxwcm90b3R5cGU6YXJyYXlQcm90b3R5cGV9PUFycmF5O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5DaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2FuQmVWYWxpZD0oY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PlxuaXNBcnJheShjYW5kaWRhdGUpfHxcbiEhY2hlY2smJmNoZWNrKGZhbHNlLFggYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKTtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5QXJyYXlIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weUFycmF5JyxcblxuY2FuQmVWYWxpZCxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpPT09YXJyYXlQcm90b3R5cGV8fFxuYXNzZXJ0LmZhaWwoWCBgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBTaW5jZSB3ZSdyZSBhbHJlYWR5IGVuc3VyZWQgY2FuZGlkYXRlIGlzIGFuIGFycmF5LCBpdCBzaG91bGQgbm90IGJlKi9cbi8qIHBvc3NpYmxlIGZvciB0aGUgZm9sbG93aW5nIHRlc3QgdG8gZmFpbCovXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwnbGVuZ3RoJyxmYWxzZSxhc3NlcnRDaGVja2VyKTtcbmNvbnN0IGxlbj0vKiogQHR5cGUge3Vua25vd25bXX0gKi9jYW5kaWRhdGUubGVuZ3RoO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxpLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogKzEgZm9yIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eSBpdHNlbGYuKi9cbm93bktleXMoY2FuZGlkYXRlKS5sZW5ndGg9PT1sZW4rMXx8XG5hc3NlcnQuZmFpbChYIGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xuY2FuZGlkYXRlLmV2ZXJ5KCh2KT0+ISFwYXNzU3R5bGVPZlJlY3VyKHYpKTtcbiB9fSk7JGjigI1fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5QXJyYXlIZWxwZXIiOlsiQ29weUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIP12yzPBwAAzwcAACkAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvY29weVJlY29yZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weVJlY29yZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGNoZWNrTm9ybWFsUHJvcGVydHk7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiY2FuQmVNZXRob2RcIiwgWyRo4oCNX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLHZhbHVlcyxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weVJlY29yZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5UmVjb3JkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pZihnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpIT09b2JqZWN0UHJvdG90eXBlKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVjb3JkcyBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5cbnJldHVybiBvd25LZXlzKGNhbmRpZGF0ZSkuZXZlcnkoKGtleSk9PntcbnJldHVybihcbih0eXBlb2Yga2V5PT09J3N0cmluZyd8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuWCBgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gKSkmJihcblxuIWNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKXx8XG4hIXJlamVjdCYmXG5yZWplY3QoXG4vKiBUT0RPOiBVcGRhdGUgbWVzc2FnZSBub3cgdGhhdCB0aGVyZSBpcyBubyBzdWNoIHRoaW5nIGFzIFwiaW1wbGljaXQgUmVtb3RhYmxlXCIuKi9cblggYFJlY29yZHMgY2Fubm90IGNvbnRhaW4gbm9uLWZhciBmdW5jdGlvbnMgYmVjYXVzZSB0aGV5IG1heSBiZSBtZXRob2RzIG9mIGFuIGltcGxpY2l0IFJlbW90YWJsZTogJHtjYW5kaWRhdGV9YCkpKTtcblxuXG4gfSk7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuQ29weVJlY29yZEhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmZvcihjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxuYW1lLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xuZm9yKGNvbnN0IHZhbCBvZiB2YWx1ZXMoY2FuZGlkYXRlKSl7XG5wYXNzU3R5bGVPZlJlY3VyKHZhbCk7XG4gfVxuIH19KTskaOKAjV9vbmNlLkNvcHlSZWNvcmRIZWxwZXIoQ29weVJlY29yZEhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANOgOHGdEQAAnREAACQAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvZXJyb3IuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkVycm9ySGVscGVyIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIiwidG9QYXNzYWJsZUVycm9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXI7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWx9PWFzc2VydDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLGdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qIFRPRE86IE1haW50ZW5hbmNlIGhhemFyZDogQ29vcmRpbmF0ZSB3aXRoIHRoZSBsaXN0IG9mIGVycm9ycyBpbiB0aGUgU0VTKi9cbi8qIHdoaWxlbGlzdC4gQ3VycmVudGx5LCBib3RoIG9taXQgQWdncmVnYXRlRXJyb3IsIHdoaWNoIGlzIG5vdyBzdGFuZGFyZC4gQm90aCovXG4vKiBtdXN0IGV2ZW50dWFsbHkgaW5jbHVkZSBpdC4qL1xuY29uc3QgZXJyb3JDb25zdHJ1Y3RvcnM9bmV3IE1hcChbXG5bJ0Vycm9yJyxFcnJvcl0sXG5bJ0V2YWxFcnJvcicsRXZhbEVycm9yXSxcblsnUmFuZ2VFcnJvcicsUmFuZ2VFcnJvcl0sXG5bJ1JlZmVyZW5jZUVycm9yJyxSZWZlcmVuY2VFcnJvcl0sXG5bJ1N5bnRheEVycm9yJyxTeW50YXhFcnJvcl0sXG5bJ1R5cGVFcnJvcicsVHlwZUVycm9yXSxcblsnVVJJRXJyb3InLFVSSUVycm9yXV0pO1xuXG5cbmNvbnN0ICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yPShuYW1lKT0+ZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRo4oCNX29uY2UuZ2V0RXJyb3JDb25zdHJ1Y3RvcihnZXRFcnJvckNvbnN0cnVjdG9yKTtcbmhhcmRlbihnZXRFcnJvckNvbnN0cnVjdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tFcnJvckxpa2U9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuLyogVE9ETzogTmVlZCBhIGJldHRlciB0ZXN0IHRoYW4gaW5zdGFuY2VvZiovXG5yZXR1cm4oXG5jYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvcnx8XG5yZWplY3QmJnJlamVjdChYIGBFcnJvciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfTtcbmhhcmRlbihjaGVja0Vycm9yTGlrZSk7XG5cbi8qKlxuICogVmFsaWRhdGluZyBlcnJvciBvYmplY3RzIGFyZSBwYXNzYWJsZSByYWlzZXMgYSB0ZW5zaW9uIGJldHdlZW4gc2VjdXJpdHlcbiAqIHZzIHByZXNlcnZpbmcgZGlhZ25vc3RpYyBpbmZvcm1hdGlvbi4gRm9yIGVycm9ycywgd2UgbmVlZCB0byByZW1lbWJlclxuICogdGhlIGVycm9yIGl0c2VsZiBleGlzdHMgdG8gaGVscCB1cyBkaWFnbm9zZSBhIGJ1ZyB0aGF0J3MgbGlrZWx5IG1vcmVcbiAqIHByZXNzaW5nIHRoYW4gYSB2YWxpZGl0eSBidWcgaW4gdGhlIGVycm9yIGl0c2VsZi4gVGh1cywgd2hlbmV2ZXIgaXQgaXMgc2FmZVxuICogdG8gZG8gc28sIHdlIHByZWZlciB0byBsZXQgdGhlIGVycm9yLWxpa2UgdGVzdCBzdWNjZWVkIGFuZCB0byBjb3VjaCB0aGVzZVxuICogY29tcGxhaW50cyBhcyBub3RlcyBvbiB0aGUgZXJyb3IuXG4gKlxuICogVG8gcmVzb2x2ZSB0aGlzLCBzdWNoIGEgbWFsZm9ybWVkIGVycm9yIG9iamVjdCB3aWxsIHN0aWxsIHBhc3NcbiAqIGBpc0Vycm9yTGlrZWAgc28gbWFyc2hhbCBjYW4gdXNlIHRoaXMgZm9yIHRvcCBsZXZlbCBlcnJvciB0byByZXBvcnQgZnJvbSxcbiAqIGV2ZW4gaWYgaXQgd291bGQgbm90IGFjdHVhbGx5IHZhbGlkYXRlLlxuICogSW5zdGVhZCwgdGhlIGRpYWdub3N0aWNzIHRoYXQgYGFzc2VydEVycm9yYCB3b3VsZCBoYXZlIHJlcG9ydGVkIGFyZVxuICogYXR0YWNoZWQgYXMgbm90ZXMgdG8gdGhlIG1hbGZvcm1lZCBlcnJvci4gVGh1cywgYSBtYWxmb3JtZWRcbiAqIGVycm9yIGlzIHBhc3NhYmxlIGJ5IGl0c2VsZiwgYnV0IG5vdCBhcyBwYXJ0IG9mIGEgcGFzc2FibGUgc3RydWN0dXJlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzRXJyb3JMaWtlPShjYW5kaWRhdGUpPT5jaGVja0Vycm9yTGlrZShjYW5kaWRhdGUpOyRo4oCNX29uY2UuaXNFcnJvckxpa2UoaXNFcnJvckxpa2UpO1xuaGFyZGVuKGlzRXJyb3JMaWtlKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgRXJyb3JIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonZXJyb3InLFxuXG5jYW5CZVZhbGlkOmNoZWNrRXJyb3JMaWtlLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+e1xuRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpO1xuY29uc3R7bmFtZX09cHJvdG87XG5jb25zdCBFQz1nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpO1xuRUMmJkVDLnByb3RvdHlwZT09PXByb3RvfHxcbkZhaWwgYEVycm9ycyBtdXN0IGluaGVyaXQgZnJvbSBhbiBlcnJvciBjbGFzcyAucHJvdG90eXBlICR7Y2FuZGlkYXRlfWA7XG5cbmNvbnN0e1xuLyogTXVzdCBhbGxvdyBgY2F1c2VgLCBgZXJyb3JzYCovXG5tZXNzYWdlOm1EZXNjLFxuLyogQWxsb3cgYnV0IGlnbm9yZSBvbmx5IGV4dHJhbmVvdXMgb3duIGBzdGFja2AgcHJvcGVydHkuKi9cbnN0YWNrOl9vcHRTdGFja0Rlc2MsXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xub3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aDwxfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBoYXMgZXh0cmEgdW5wYXNzZWQgcHJvcGVydGllcyAke3Jlc3REZXNjc31gO1xuaWYobURlc2Mpe1xudHlwZW9mIG1EZXNjLnZhbHVlPT09J3N0cmluZyd8fFxuRmFpbCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3QgYmUgYSBzdHJpbmctdmFsdWVkIGRhdGEgcHJvcGVydHkuYDtcbiFtRGVzYy5lbnVtZXJhYmxlfHxcbkZhaWwgYFBhc3NlZCBFcnJvciBcIm1lc3NhZ2VcIiAke21EZXNjfSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlYDtcbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cblxuLyoqXG4gKiBSZXR1cm4gYSBuZXcgcGFzc2FibGUgZXJyb3IgdGhhdCBwcm9wYWdhdGVzIHRoZSBkaWFnbm9zdGljIGluZm8gb2YgdGhlXG4gKiBvcmlnaW5hbCwgYW5kIGlzIGxpbmtlZCB0byB0aGUgb3JpZ2luYWwgYXMgYSBub3RlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHJldHVybnMge0Vycm9yfVxuICovJGjigI1fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG5jb25zdCAgICAgICAgdG9QYXNzYWJsZUVycm9yPShlcnIpPT57XG5jb25zdHtuYW1lLG1lc3NhZ2V9PWVycjtcblxuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvciggYCR7bmFtZX1gKXx8RXJyb3I7XG5jb25zdCBuZXdFcnJvcj1oYXJkZW4obmV3IEVDKCBgJHttZXNzYWdlfWApKTtcbi8qIEV2ZW4gdGhlIGNsZWFuZWQgdXAgZXJyb3IgY29weSwgaWYgc2VudCB0byB0aGUgY29uc29sZSwgc2hvdWxkKi9cbi8qIGNhdXNlIGhpZGRlbiBkaWFnbm9zdGljIGluZm9ybWF0aW9uIG9mIHRoZSBvcmlnaW5hbCBlcnJvciovXG4vKiB0byBiZSBsb2dnZWQuKi9cbmFzc2VydC5ub3RlKG5ld0Vycm9yLFggYGNvcGllZCBmcm9tIGVycm9yICR7ZXJyfWApO1xucmV0dXJuIG5ld0Vycm9yO1xuIH07JGjigI1fb25jZS50b1Bhc3NhYmxlRXJyb3IodG9QYXNzYWJsZUVycm9yKTtcbmhhcmRlbih0b1Bhc3NhYmxlRXJyb3IpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEVycm9yQ29uc3RydWN0b3IiOlsiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLCJpc0Vycm9yTGlrZSI6WyJpc0Vycm9yTGlrZSJdLCJFcnJvckhlbHBlciI6WyJFcnJvckhlbHBlciJdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEo7ZoNVCAAAVQgAACsAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvaXRlci1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4vbWFrZS1mYXIuanMiXSwiZXhwb3J0cyI6WyJmaWx0ZXJJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcjskaOKAjV9pbXBvcnRzKFtbXCIuL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGFzIG1hbnkgZWxlbWVudHMgYXMgdGhlIGBiYXNlSXRlcmF0b3JgIGFuZFxuICogaGF2ZSB0aGUgc2FtZSB0ZXJtaW5hdGlvbiAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlIG9yIGZhaWx1cmVcbiAqIHJlYXNvbi4gQnV0IHRoZSBub24tZmluYWwgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBub24tZmluYWxcbiAqIHZhbHVlcyBmcm9tIGBiYXNlSXRlcmF0b3JgIGFzIHRyYW5zZm9ybWVkIGJ5IGBmdW5jYC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxVXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBVfSBmdW5jXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VT59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLGZ1bmMpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ21hcHBlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignbWFwcGVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdHt2YWx1ZTpiYXNlVmFsdWUsZG9uZX09YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0IHZhbHVlPWRvbmU/YmFzZVZhbHVlOmZ1bmMoYmFzZVZhbHVlKTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlLGRvbmV9KTtcbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5tYXBJdGVyYWJsZShtYXBJdGVyYWJsZSk7XG5cbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYSBzdWJzZXQgb2YgdGhlIG5vbi1maW5hbCB2YWx1ZXMgZnJvbSB0aGVcbiAqIGBiYXNlSXRlcmF0b3JgIC0tLSB0aG9zZSBmb3Igd2hpY2ggYHByZWQodmFsdWUpYCB3YXMgdHJ1dGh5LiBUaGUgcmVzdWx0XG4gKiBoYXMgdGhlIHNhbWUgdGVybWluYXRpb24gYXMgdGhlIGBiYXNlSXRlcmF0b3JgIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWVcbiAqIG9yIGZhaWx1cmUgcmVhc29uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufSBwcmVkXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBmaWx0ZXJJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLHByZWQpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ2ZpbHRlcmVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuZm9yKDs7KXtcbmNvbnN0IHJlc3VsdD1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3R7dmFsdWUsZG9uZX09cmVzdWx0O1xuaWYoZG9uZXx8cHJlZCh2YWx1ZSkpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLmZpbHRlckl0ZXJhYmxlKGZpbHRlckl0ZXJhYmxlKTtcblxuaGFyZGVuKGZpbHRlckl0ZXJhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSJdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABiTWcDThoAAE4aAAAnAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL21ha2UtZmFyLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3JlbW90YWJsZS5qcyJdLCJleHBvcnRzIjpbIkZhciIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJhc3NlcnRJZmFjZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0SWZhY2UgPSAkaOKAjV9hKV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV0sW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0ZW1wbGF0ZSBMLFIgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDxMLCBSPn0gUmVtb3RhYmxlQnJhbmQgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuc2V0UHJvdG90eXBlT2YsXG5jcmVhdGUsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuXG4vKipcbiAqIE5vdyB0aGF0IHRoZSByZW1vdGFibGVQcm90byBkb2VzIG5vdCBwcm92aWRlIGl0cyBvd24gYHRvU3RyaW5nYCBtZXRob2QsXG4gKiBlbnN1cmUgaXQgYWx3YXlzIGluaGVyaXRzIGZyb20gc29tZXRoaW5nLiBUaGUgb3JpZ2luYWwgcHJvdG90eXBlIG9mXG4gKiBgcmVtb3RhYmxlYCBpZiB0aGVyZSB3YXMgb25lLCBvciBgT2JqZWN0LnByb3RvdHlwZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSByZW1vdGFibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEByZXR1cm5zIHtvYmplY3R9XG4gKi9cbmNvbnN0IG1ha2VSZW1vdGFibGVQcm90bz0ocmVtb3RhYmxlLGlmYWNlKT0+e1xubGV0IG9sZFByb3RvPWdldFByb3RvdHlwZU9mKHJlbW90YWJsZSk7XG5pZih0eXBlb2YgcmVtb3RhYmxlPT09J29iamVjdCcpe1xuaWYob2xkUHJvdG89PT1udWxsKXtcbm9sZFByb3RvPW9iamVjdFByb3RvdHlwZTtcbiB9XG5vbGRQcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG5GYWlsIGBGb3Igbm93LCByZW1vdGFibGVzIGNhbm5vdCBpbmhlcml0IGZyb20gYW55dGhpbmcgdW51c3VhbCwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZSBpZih0eXBlb2YgcmVtb3RhYmxlPT09J2Z1bmN0aW9uJyl7XG5vbGRQcm90byE9PW51bGx8fFxuRmFpbCBgT3JpZ2luYWwgZnVuY3Rpb24gbXVzdCBub3QgaW5oZXJpdCBmcm9tIG51bGw6ICR7cmVtb3RhYmxlfWA7XG5vbGRQcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbmdldFByb3RvdHlwZU9mKG9sZFByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbkZhaWwgYEZhciBmdW5jdGlvbnMgbXVzdCBvcmlnaW5hbGx5IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGUsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2V7XG5GYWlsIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7cmVtb3RhYmxlfWA7XG4gfVxucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvbGRQcm90byx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOidyZW1vdGFibGUnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTppZmFjZX19KSk7XG5cblxuIH07XG5cbmNvbnN0IGFzc2VydENhbkJlUmVtb3RhYmxlPShjYW5kaWRhdGUpPT5cblJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIGEgUmVtb3RhYmxlLiAgQWZ0ZXIgdGhpcywgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKVxuICogcmV0dXJucyBpZmFjZS5cbiAqXG4gKiAvLyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzgwNFxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlPSdSZW1vdGFibGUnXSBUaGUgaW50ZXJmYWNlIHNwZWNpZmljYXRpb24gZm9yXG4gKiB0aGUgcmVtb3RhYmxlLiBGb3Igbm93LCBhIHN0cmluZyBpZmFjZSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aFxuICogXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCIsIHRvIHNlcnZlIGFzIHRoZSBhbGxlZ2VkIG5hbWUuIE1vcmVcbiAqIGdlbmVyYWwgaWZhY2VzIGFyZSBub3QgeWV0IGltcGxlbWVudGVkLiBUaGlzIGlzIHRlbXBvcmFyeS4gV2UgaW5jbHVkZSB0aGVcbiAqIFwiQWxsZWdlZFwiIG9yIFwiRGVidWdOYW1lXCIgYXMgYSByZW1pbmRlciB0aGF0IHdlIGRvIG5vdCB5ZXQgaGF2ZSBTd2luZ1NldFxuICogb3IgQ29tbXMgVmF0XG4gKiBzdXBwb3J0IGZvciBlbnN1cmluZyB0aGlzIGlzIGFjY29yZGluZyB0byB0aGUgdmF0IGhvc3RpbmcgdGhlIG9iamVjdC5cbiAqIEN1cnJlbnRseSwgQWxpY2UgY2FuIHRlbGwgQm9iIGFib3V0IENhcm9sLCB3aGVyZSBWYXRBIChvbiBBbGljZSdzIGJlaGFsZilcbiAqIG1pc3JlcHJlc2VudHMgQ2Fyb2wncyBgaWZhY2VgLiBWYXRCIGFuZCB0aGVyZWZvcmUgQm9iIHdpbGwgdGhlbiBzZWVcbiAqIENhcm9sJ3MgYGlmYWNlYCBhcyBtaXNyZXByZXNlbnRlZCBieSBWYXRBLlxuICogQHBhcmFtIHt1bmRlZmluZWR9IFtwcm9wcz11bmRlZmluZWRdIEN1cnJlbnRseSBtYXkgb25seSBiZSB1bmRlZmluZWQuXG4gKiBUaGF0IHBsYW4gaXMgdGhhdCBvd24tcHJvcGVydGllcyBhcmUgY29waWVkIHRvIHRoZSByZW1vdGFibGVcbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZT17fV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSByZW1vdGFibGUsIG1vZGlmaWVkIGZvciBkZWJ1Z2dhYmlsaXR5XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGU9KFxuaWZhY2U9J1JlbW90YWJsZScsXG5wcm9wcz11bmRlZmluZWQsXG5yZW1vdGFibGU9LyoqIEB0eXBlIHtUfSAqL3t9KT0+XG57XG5hc3NlcnRJZmFjZShpZmFjZSk7XG5hc3NlcnQoaWZhY2UpO1xuLyogVE9ETzogV2hlbiBpZmFjZSBpcyByaWNoZXIgdGhhbiBqdXN0IHN0cmluZywgd2UgbmVlZCB0byBnZXQgdGhlIGFsbGVnZWROYW1lKi9cbi8qIGluIGEgZGlmZmVyZW50IHdheS4qL1xucHJvcHM9PT11bmRlZmluZWR8fEZhaWwgYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuLyogRmFpbCBmYXN0OiBjaGVjayB0aGF0IHRoZSB1bm1vZGlmaWVkIG9iamVjdCBpcyBhYmxlIHRvIGJlY29tZSBhIFJlbW90YWJsZS4qL1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IG1hcmtlZC4qL1xuIShQQVNTX1NUWUxFIGluIHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBhICR7cShcbnJlbW90YWJsZVtQQVNTX1NUWUxFXSlcbiB9YDtcbi8qIGBpc0Zyb3plbmAgYWx3YXlzIHJldHVybnMgdHJ1ZSB3aXRoIGEgZmFrZSBgaGFyZGVuYCwgYnV0IHdlIHdhbnQgdGhhdCBjYXNlKi9cbi8qIHRvIHN1Y2NlZWQgYW55d2F5LiBGYWtpbmcgYGhhcmRlbmAgaXMgb25seSBjb3JyZWN0bmVzcyBwcmVzZXJ2aW5nKi9cbi8qIGlmIHRoZSBjb2RlIGluIHF1ZXN0aW9uIGNvbnRhaW5zIG5vIGJ1Z3MgdGhhdCB0aGUgcmVhbCBgaGFyZGVuYCB3b3VsZCovXG4vKiBoYXZlIGNhdWdodC4qL1xuLyogQHRzLWlnbm9yZSBgaXNGYWtlYCBwdXJwb3NlbHkgbm90IGluIHRoZSB0eXBlKi9cbmhhcmRlbi5pc0Zha2V8fFxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IGZyb3plbi4qL1xuIWlzRnJvemVuKHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IGZyb3plbmA7XG5jb25zdCByZW1vdGFibGVQcm90bz1tYWtlUmVtb3RhYmxlUHJvdG8ocmVtb3RhYmxlLGlmYWNlKTtcblxuLyogVGFrZSBhIHN0YXRpYyBjb3B5IG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGFzIGRhdGEgcHJvcGVydGllcy4qL1xuLyogY29uc3QgcHJvcERlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh7IC4uLnByb3BzIH0pOyovXG5jb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjaz0odGFyZ2V0KT0+e1xuLyogZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BEZXNjcyk7Ki9cbnNldFByb3RvdHlwZU9mKHRhcmdldCxyZW1vdGFibGVQcm90byk7XG5oYXJkZW4odGFyZ2V0KTtcbmFzc2VydENhbkJlUmVtb3RhYmxlKHRhcmdldCk7XG4gfTtcblxuLyogRmFpbCBmYXN0OiBjaGVjayBhIGZyZXNoIHJlbW90YWJsZSB0byBzZWUgaWYgb3VyIHJ1bGVzIGZpdC4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4vKiBBY3R1YWxseSBmaW5pc2ggdGhlIG5ldyByZW1vdGFibGUuKi9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHJlbW90YWJsZSk7XG5cbi8qIENPTU1JVFRFRCEqL1xuLyogV2UncmUgY29tbWl0dGVkLCBzbyBrZWVwIHRoZSBpbnRlcmZhY2UgZm9yIGZ1dHVyZSByZWZlcmVuY2UuKi9cbmFzc2VydChpZmFjZSE9PXVuZGVmaW5lZCk7LyogVG8gbWFrZSBUeXBlU2NyaXB0IGhhcHB5Ki9cbnJldHVybiAoLyoqIEB0eXBlIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSAqL3JlbW90YWJsZSk7XG4gfTskaOKAjV9vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qKlxuICogQSBjb25jaXNlIGNvbnZlbmllbmNlIGZvciB0aGUgbW9zdCBjb21tb24gYFJlbW90YWJsZWAgdXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIFRoaXMgbmFtZSB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIGBBbGxlZ2VkOiBgXG4gKiBmb3Igbm93IHRvIGZvcm0gdGhlIGBSZW1vdGFibGVgIGBpZmFjZWAgYXJndW1lbnQuXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGU9e31dIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKi9cbmNvbnN0ICAgICAgICBGYXI9KGZhck5hbWUscmVtb3RhYmxlPXVuZGVmaW5lZCk9PntcbmNvbnN0IHI9cmVtb3RhYmxlPT09dW5kZWZpbmVkPy8qKiBAdHlwZSB7VH0gKi97fTpyZW1vdGFibGU7XG5yZXR1cm4gUmVtb3RhYmxlKCBgQWxsZWdlZDogJHtmYXJOYW1lfWAsdW5kZWZpbmVkLHIpO1xuIH07JGjigI1fb25jZS5GYXIoRmFyKTtcbmhhcmRlbihGYXIpO1xuXG4vKipcbiAqIENvZXJjZSBgZnVuY2AgdG8gYSBmYXIgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgaXRzIGNhbGwgYmVoYXZpb3IuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGEgZmFyIGZ1bmN0aW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSBtYWtlIGFuZCByZXR1cm4gYVxuICogbmV3IGZhciBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgZm9yd2FyZHMgY2FsbHMgdG8gaXQuIFRoaXNcbiAqIHdvcmtzIGV2ZW4gaWYgYGZ1bmNgIGlzIGFscmVhZHkgZnJvemVuLiBgVG9GYXJGdW5jdGlvbmAgaXMgdG8gYmUgdXNlZFxuICogd2hlbiB0aGUgZnVuY3Rpb24gY29tZXMgZnJvbSBlbHNld2hlcmUgdW5kZXIgbGVzcyBjb250cm9sLiBGb3IgZnVuY3Rpb25zXG4gKiB5b3UgYXV0aG9yIGluIHBsYWNlLCBiZXR0ZXIgdG8gdXNlIGBGYXJgIG9uIHRoZWlyIGZ1bmN0aW9uIGxpdGVyYWwgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgdG8gYmUgdXNlZCBvbmx5IGlmIGBmdW5jYCBpcyBub3QgYWxyZWFkeSBhXG4gKiBmYXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBmdW5jXG4gKi9cbmNvbnN0ICAgICAgICBUb0ZhckZ1bmN0aW9uPShmYXJOYW1lLGZ1bmMpPT57XG5pZihnZXRJbnRlcmZhY2VPZihmdW5jKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYztcbiB9XG5yZXR1cm4gRmFyKGZhck5hbWUsKC4uLmFyZ3MpPT5mdW5jKC4uLmFyZ3MpKTtcbiB9OyRo4oCNX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAKRe+UdBAAAHQQAACkAAABAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgUEFTU19TVFlMRSxhc3NlcnRQYXNzYWJsZTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsIFskaOKAjV9hID0+IChQQVNTX1NUWUxFID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtjcmVhdGUscHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09T2JqZWN0O1xuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgbWFrZVRhZ2dlZD0odGFnLHBheWxvYWQpPT57XG50eXBlb2YgdGFnPT09J3N0cmluZyd8fFxuRmFpbCBgVGhlIHRhZyBvZiBhIHRhZ2dlZCByZWNvcmQgbXVzdCBiZSBhIHN0cmluZzogJHt0YWd9YDtcbmFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9iamVjdFByb3RvdHlwZSx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOid0YWdnZWQnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTp0YWd9LFxucGF5bG9hZDp7dmFsdWU6cGF5bG9hZCxlbnVtZXJhYmxlOnRydWV9fSkpO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGUAoxvUZAAD1GQAAMAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjYW5CZU1ldGhvZCIsImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiLCJjaGVja05vcm1hbFByb3BlcnR5IiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldFRhZyIsImhhc093blByb3BlcnR5T2YiLCJpc09iamVjdCIsImlzVHlwZWRBcnJheSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbmdldFByb3RvdHlwZU9mLFxuaGFzT3duUHJvcGVydHk6b2JqZWN0SGFzT3duUHJvcGVydHksXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHt0b1N0cmluZ1RhZzp0b1N0cmluZ1RhZ1N5bWJvbH09U3ltYm9sO1xuXG5jb25zdCB0eXBlZEFycmF5UHJvdG90eXBlPWdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxudHlwZWRBcnJheVByb3RvdHlwZSxcbnRvU3RyaW5nVGFnU3ltYm9sKTtcblxuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPXR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9PT0nZnVuY3Rpb24nKTtcblxuY29uc3QgICAgICAgIGhhc093blByb3BlcnR5T2Y9KG9iaixwcm9wKT0+XG5hcHBseShvYmplY3RIYXNPd25Qcm9wZXJ0eSxvYmosW3Byb3BdKTskaOKAjV9vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG5oYXJkZW4oaGFzT3duUHJvcGVydHlPZik7XG5cbmNvbnN0ICAgICAgICBpc09iamVjdD0odmFsKT0+T2JqZWN0KHZhbCk9PT12YWw7JGjigI1fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKipcbiAqIER1cGxpY2F0ZXMgcGFja2FnZXMvc2VzL3NyYy9tYWtlLWhhcmRlbmVyLmpzIHRvIGF2b2lkIGEgZGVwZW5kZW5jeS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9iamVjdFxuICovXG5jb25zdCAgICAgICAgaXNUeXBlZEFycmF5PShvYmplY3QpPT57XG4vKiBUaGUgb2JqZWN0IG11c3QgcGFzcyBhIGJyYW5kIGNoZWNrIG9yIHRvU3RyaW5nVGFnIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC4qL1xuY29uc3QgdGFnPWFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyxvYmplY3QsW10pO1xucmV0dXJuIHRhZyE9PXVuZGVmaW5lZDtcbiB9OyRo4oCNX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuY29uc3QgICAgICAgIFBBU1NfU1RZTEU9U3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qKlxuICogRm9yIGEgZnVuY3Rpb24gdG8gYmUgYSB2YWxpZCBtZXRob2QsIGl0IG11c3Qgbm90IGJlIHBhc3NhYmxlLlxuICogT3RoZXJ3aXNlLCB3ZSByaXNrIGNvbmZ1c2luZyBwYXNzLWJ5LWNvcHkgZGF0YSBjYXJyeWluZ1xuICogZmFyIGZ1bmN0aW9ucyB3aXRoIGF0dGVtcHRzIGF0IGZhciBvYmplY3RzIHdpdGggbWV0aG9kcy5cbiAqXG4gKiBUT0RPIEhBWkFSRCBCZWNhdXNlIHdlIGNoZWNrIHRoaXMgb24gdGhlIHdheSB0byBoYXJkZW5pbmcgYSByZW1vdGFibGUsXG4gKiB3ZSBjYW5ub3QgeWV0IGNoZWNrIHRoYXQgYGZ1bmNgIGlzIGhhcmRlbmVkLiBIb3dldmVyLCB3aXRob3V0XG4gKiBkb2luZyBzbywgaXQncyBpbmhlcml0YW5jZSBtaWdodCBjaGFuZ2UgYWZ0ZXIgdGhlIGBQQVNTX1NUWUxFYFxuICogY2hlY2sgYmVsb3cuXG4gKlxuICogQHBhcmFtIHthbnl9IGZ1bmNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuY29uc3QgICAgICAgIGNhbkJlTWV0aG9kPShmdW5jKT0+XG50eXBlb2YgZnVuYz09PSdmdW5jdGlvbicmJiEoUEFTU19TVFlMRSBpbiBmdW5jKTskaOKAjV9vbmNlLmNhbkJlTWV0aG9kKGNhbkJlTWV0aG9kKTtcbmhhcmRlbihjYW5CZU1ldGhvZCk7XG5cbi8qKlxuICogQmVsb3cgd2UgaGF2ZSBhIHNlcmllcyBvZiBwcmVkaWNhdGUgZnVuY3Rpb25zIGFuZCB0aGVpciAoY3VycmllZCkgYXNzZXJ0aW9uXG4gKiBmdW5jdGlvbnMuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGFzc2VydGlvbiBmdW5jdGlvbiBpcyBqdXN0IHRvIGFzc2VydCB0aGF0XG4gKiB0aGUgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUgZnVuY3Rpb24gd291bGQgaGF2ZSByZXR1cm5lZCB0cnVlLiBCdXQgaXRcbiAqIHJlcHJvZHVjZXMgdGhlIGludGVybmFsIHRlc3RzIHNvIGZhaWx1cmVzIGNhbiBnaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDaGVja2VyPShjb25kLGRldGFpbHMpPT57XG5hc3NlcnQoY29uZCxkZXRhaWxzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5hc3NlcnRDaGVja2VyKGFzc2VydENoZWNrZXIpO1xuaGFyZGVuKGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIGFuZCBlbnVtZXJhYmlsaXR5IG9mIGFuIG93biBkYXRhIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxzeW1ib2x9IHByb3BlcnR5TmFtZVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRCZUVudW1lcmFibGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja05vcm1hbFByb3BlcnR5PShcbmNhbmRpZGF0ZSxcbnByb3BlcnR5TmFtZSxcbnNob3VsZEJlRW51bWVyYWJsZSxcbmNoZWNrKT0+XG57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgZGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLHByb3BlcnR5TmFtZSk7XG5pZihkZXNjPT09dW5kZWZpbmVkKXtcbnJldHVybihcbnJlamVjdCYmcmVqZWN0KFggYCR7cShwcm9wZXJ0eU5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxucmV0dXJuKFxuKGhhc093blByb3BlcnR5T2YoZGVzYywndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkmJihcblxuc2hvdWxkQmVFbnVtZXJhYmxlP1xuZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKTpcblxuIWRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKFxucHJvcGVydHlOYW1lKVxuIH0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpKTtcblxuXG4gfTskaOKAjV9vbmNlLmNoZWNrTm9ybWFsUHJvcGVydHkoY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5oYXJkZW4oY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5cbmNvbnN0ICAgICAgICBnZXRUYWc9KHRhZ1JlY29yZCk9PnRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRo4oCNX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuY29uc3QgICAgICAgIGNoZWNrUGFzc1N0eWxlPShvYmosZXhwZWN0ZWRQYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgYWN0dWFsPW9ialtQQVNTX1NUWUxFXTtcbnJldHVybihcbmFjdHVhbD09PWV4cGVjdGVkUGFzc1N0eWxlfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkUGFzc1N0eWxlKX0sIG5vdCAke3EoYWN0dWFsKX06ICR7b2JqfWApKTtcblxuIH07JGjigI1fb25jZS5jaGVja1Bhc3NTdHlsZShjaGVja1Bhc3NTdHlsZSk7XG5oYXJkZW4oY2hlY2tQYXNzU3R5bGUpO1xuXG5jb25zdCBtYWtlQ2hlY2tUYWdSZWNvcmQ9KGNoZWNrUHJvdG8pPT57XG4vKipcbiAqIEBwYXJhbSB7eyBbUEFTU19TVFlMRV06IHN0cmluZyB9fSB0YWdSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnUmVjb3JkPSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbnJldHVybihcbihpc09iamVjdCh0YWdSZWNvcmQpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgQSBub24tb2JqZWN0IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiYoXG5pc0Zyb3plbih0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEEgdGFnUmVjb3JkIG11c3QgYmUgZnJvemVuOiAke3RhZ1JlY29yZH1gKSkmJihcbiFpc0FycmF5KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QoWCBgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsUEFTU19TVFlMRSxmYWxzZSxjaGVjaykmJlxuY2hlY2tQYXNzU3R5bGUodGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjaykmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsU3ltYm9sLnRvU3RyaW5nVGFnLGZhbHNlLGNoZWNrKSYmKFxudHlwZW9mIGdldFRhZyh0YWdSZWNvcmQpPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpJiZcblxuY2hlY2tQcm90byh0YWdSZWNvcmQsZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSxjaGVjaykpO1xuXG4gfTtcbnJldHVybiBoYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuIH07XG5cbmNvbnN0ICAgICAgICBjaGVja1RhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKGZhbHNlLFggYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcblxuaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcblxuY29uc3QgICAgICAgIGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5wcm90byE9PW51bGwmJmdldFByb3RvdHlwZU9mKHByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soXG5mYWxzZSxcblggYEZvciBmdW5jdGlvbnMsIGEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tGdW5jdGlvblRhZ1JlY29yZChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcblxuXG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIl0sImlzT2JqZWN0IjpbImlzT2JqZWN0Il0sImlzVHlwZWRBcnJheSI6WyJpc1R5cGVkQXJyYXkiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJjaGVja05vcm1hbFByb3BlcnR5IjpbImNoZWNrTm9ybWFsUHJvcGVydHkiXSwiZ2V0VGFnIjpbImdldFRhZyJdLCJjaGVja1Bhc3NTdHlsZSI6WyJjaGVja1Bhc3NTdHlsZSJdLCJjaGVja1RhZ1JlY29yZCI6WyJjaGVja1RhZ1JlY29yZCJdLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIjpbImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALm6xDYMbAACDGwAAKgAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9wYXNzU3R5bGVPZi5qc3siaW1wb3J0cyI6WyIuL2NvcHlBcnJheS5qcyIsIi4vY29weVJlY29yZC5qcyIsIi4vZXJyb3IuanMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiLCIuL3NhZmUtcHJvbWlzZS5qcyIsIi4vc3ltYm9sLmpzIiwiLi90YWdnZWQuanMiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlIiwicGFzc1N0eWxlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGlzT2JqZWN0LGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLENvcHlBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixSZW1vdGFibGVIZWxwZXIsYXNzZXJ0UGFzc2FibGVTeW1ib2wsYXNzZXJ0U2FmZVByb21pc2U7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsIFskaOKAjV9hID0+IChpc1R5cGVkQXJyYXkgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weUFycmF5SGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsIFskaOKAjV9hID0+IChUYWdnZWRIZWxwZXIgPSAkaOKAjV9hKV1dXV0sW1wiLi9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXV1dLFtcIi4vc2FmZS1wcm9taXNlLmpzXCIsIFtbXCJhc3NlcnRTYWZlUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2FmZVByb21pc2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZU9mfSBQYXNzU3R5bGVPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJpbWl0aXZlU3R5bGV9IFByaW1pdGl2ZVN0eWxlICovXG5cbi8qKiBAdHlwZWRlZiB7RXhjbHVkZTxQYXNzU3R5bGUsIFByaW1pdGl2ZVN0eWxlIHwgXCJwcm9taXNlXCI+fSBIZWxwZXJQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzRnJvemVufT1PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVyc1xuICogQHJldHVybnMge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIFBhc3NTdHlsZUhlbHBlcj4gfVxuICovXG5cbmNvbnN0IG1ha2VIZWxwZXJUYWJsZT0ocGFzc1N0eWxlSGVscGVycyk9Pntcbi8qKiBAdHlwZSB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgYW55PiAmIHtfX3Byb3RvX186IG51bGx9fSAqL1xuY29uc3QgSGVscGVyVGFibGU9e1xuX19wcm90b19fOm51bGwsXG5jb3B5QXJyYXk6dW5kZWZpbmVkLFxuY29weVJlY29yZDp1bmRlZmluZWQsXG50YWdnZWQ6dW5kZWZpbmVkLFxuZXJyb3I6dW5kZWZpbmVkLFxucmVtb3RhYmxlOnVuZGVmaW5lZH07XG5cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5jb25zdHtzdHlsZU5hbWV9PWhlbHBlcjtcbnN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZXx8RmFpbCBgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09PT11bmRlZmluZWR8fFxuRmFpbCBgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09aGVscGVyO1xuIH1cbmZvcihjb25zdCBzdHlsZU5hbWUgb2Ygb3duS2V5cyhIZWxwZXJUYWJsZSkpe1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiB9XG5cbnJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVycyBUaGUgcGFzc1N0eWxlSGVscGVycyB0byByZWdpc3RlcixcbiAqIGluIHByaW9yaXR5IG9yZGVyLlxuICogTk9URSBUaGVzZSBtdXN0IGFsbCBiZSBcInRydXN0ZWRcIixcbiAqIGNvbXBsZXRlLCBhbmQgbm9uLWNvbGxpZGluZy4gYG1ha2VQYXNzU3R5bGVPZmAgbWF5ICphc3N1bWUqIHRoYXQgZWFjaCBoZWxwZXJcbiAqIGRvZXMgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gYG1ha2VQYXNzU3R5bGVPZmAgaXMgbm90IHRyeWluZyB0byBkZWZlbmRcbiAqIGl0c2VsZiBhZ2FpbnN0IG1hbGljaW91cyBoZWxwZXJzLCB0aG91Z2ggaXQgZG9lcyBkZWZlbmQgYWdhaW5zdCBzb21lXG4gKiBhY2NpZGVudHMuXG4gKiBAcmV0dXJucyB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZj0ocGFzc1N0eWxlSGVscGVycyk9PntcbmNvbnN0IEhlbHBlclRhYmxlPW1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbmNvbnN0IHJlbW90YWJsZUhlbHBlcj1IZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbi8qKlxuICogUHVyZWx5IGZvciBwZXJmb3JtYW5jZS4gSG93ZXZlciBpdCBpcyBtdXRhYmxlIHN0YXRpYyBzdGF0ZSwgYW5kXG4gKiBpdCBkb2VzIGhhdmUgc29tZSBvYnNlcnZhYmlsaXR5IG9uIHByb3hpZXMuIFRPRE8gbmVlZCB0byBhc3Nlc3NcbiAqIHdoZXRoZXIgdGhpcyBjcmVhdGVzIGEgc3RhdGljIGNvbW11bmljYXRpb25zIGNoYW5uZWwuXG4gKlxuICogcGFzc1N0eWxlT2YgZG9lcyBhIGZ1bGwgcmVjdXJzaXZlIHdhbGsgb2YgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHRoZXkgYXJlIGFjeWNsaWMuIEluIGFkZGl0aW9uXG4gKiBpdCBpcyB1c2VkIGJ5IG90aGVyIGFsZ29yaXRobXMgdG8gcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIHNvIHdpdGhvdXQgdGhpcyBjYWNoZSwgdGhlc2UgYWxnb3JpdGhtcyBjb3VsZCBiZVxuICogTyhOKioyKSBvciB3b3JzZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcDxQYXNzYWJsZSwgUGFzc1N0eWxlPn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlTWVtbz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2Y9KHBhc3NhYmxlKT0+e1xuLyogRXZlbiB3aGVuIGEgV2Vha1NldCBpcyBjb3JyZWN0LCB3aGVuIHRoZSBzZXQgaGFzIGEgc2hvcnRlciBsaWZldGltZSovXG4vKiB0aGFuIGl0cyBrZXlzLCB3ZSBwcmVmZXIgYSBTZXQgZHVlIHRvIGV4cGVjdGVkIGltcGxlbWVudGF0aW9uKi9cbi8qIHRyYWRlb2Zmcy4qL1xuY29uc3QgaW5Qcm9ncmVzcz1uZXcgU2V0KCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZlJlY3VyPShpbm5lcik9PntcbmNvbnN0IGlubmVySXNPYmplY3Q9aXNPYmplY3QoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5pZihwYXNzU3R5bGVNZW1vLmhhcyhpbm5lcikpe1xuLyogQHRzLWlnbm9yZSBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0IGBnZXRgIGFmdGVyIGBoYXNgIGlzIHNhZmUqL1xucmV0dXJuIHBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbiB9XG4haW5Qcm9ncmVzcy5oYXMoaW5uZXIpfHxcbkZhaWwgYFBhc3MtYnktY29weSBkYXRhIGNhbm5vdCBiZSBjeWNsaWMgJHtpbm5lcn1gO1xuaW5Qcm9ncmVzcy5hZGQoaW5uZXIpO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2ZJbnRlcm5hbChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbnBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLHBhc3NTdHlsZSk7XG5pblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gfVxucmV0dXJuIHBhc3NTdHlsZTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZJbnRlcm5hbD0oaW5uZXIpPT57XG5jb25zdCB0eXBlc3RyPXR5cGVvZiBpbm5lcjtcbnN3aXRjaCh0eXBlc3RyKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2Unc3RyaW5nJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIHR5cGVzdHI7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKGlubmVyKTtcbnJldHVybidzeW1ib2wnO1xuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihpbm5lcj09PW51bGwpe1xucmV0dXJuJ251bGwnO1xuIH1cbmlmKCFpc0Zyb3plbihpbm5lcikpe1xuYXNzZXJ0LmZhaWwoXG4vKiBUeXBlZEFycmF5cyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgaW4gaGFyZGVuKCkqL1xuLyogYW5kIGEgY29ycmVzcG9uZGluZyBzcGVjaWFsIGVycm9yIG1lc3NhZ2UgaGVyZS4qL1xuaXNUeXBlZEFycmF5KGlubmVyKT9cblggYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYDpcblggYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgKTtcblxuIH1cbmlmKGlzUHJvbWlzZShpbm5lcikpe1xuYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xucmV0dXJuJ3Byb21pc2UnO1xuIH1cbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuY29uc3QgcGFzc1N0eWxlVGFnPWlubmVyW1BBU1NfU1RZTEVdO1xuaWYocGFzc1N0eWxlVGFnIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCdzdHJpbmcnKTtcbmNvbnN0IGhlbHBlcj1IZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuaGVscGVyIT09dW5kZWZpbmVkfHxcbkZhaWwgYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UGFzc1N0eWxlfSAqL3Bhc3NTdHlsZVRhZyk7XG4gfVxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmlmKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSl7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiB9XG4gfVxucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuY2FzZSdmdW5jdGlvbic6e1xuaXNGcm96ZW4oaW5uZXIpfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTtcblxucmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbiB9O1xuXG5jb25zdCAgICAgICAgcGFzc1N0eWxlT2Y9bWFrZVBhc3NTdHlsZU9mKFtcbkNvcHlBcnJheUhlbHBlcixcbkNvcHlSZWNvcmRIZWxwZXIsXG5UYWdnZWRIZWxwZXIsXG5FcnJvckhlbHBlcixcblJlbW90YWJsZUhlbHBlcl0pOyRo4oCNX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZT0odmFsKT0+e1xucGFzc1N0eWxlT2YodmFsKTsvKiB0aHJvd3MgaWYgdmFsIGlzIG5vdCBhIHBhc3NhYmxlKi9cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiJdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAUsaJ9wyEAAMMhAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3JlbW90YWJsZS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJnZXRJbnRlcmZhY2VPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGhhc093blByb3BlcnR5T2YsUEFTU19TVFlMRSxjaGVja1RhZ1JlY29yZCxjaGVja0Z1bmN0aW9uVGFnUmVjb3JkLGlzT2JqZWN0LGdldFRhZzskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tGdW5jdGlvblRhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuTWFyc2hhbEdldEludGVyZmFjZU9mfSBNYXJzaGFsR2V0SW50ZXJmYWNlT2YgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGVPYmplY3R9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuaXNGcm96ZW4sXG5wcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlLFxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2U9KGlmYWNlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbnJldHVybihcbi8qIFRPRE8gb3RoZXIgcG9zc2libGUgaWZhY2VzLCBvbmNlIHdlIGhhdmUgdGhpcmQgcGFydHkgdmVyYWNpdHkqL1xuKHR5cGVvZiBpZmFjZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGb3Igbm93LCBpbnRlcmZhY2UgJHtpZmFjZX0gbXVzdCBiZSBhIHN0cmluZzsgdW5pbXBsZW1lbnRlZGApKSYmKFxuXG5pZmFjZT09PSdSZW1vdGFibGUnfHxcbmlmYWNlLnN0YXJ0c1dpdGgoJ0FsbGVnZWQ6ICcpfHxcbmlmYWNlLnN0YXJ0c1dpdGgoJ0RlYnVnTmFtZTogJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGlmYWNlICR7cShcbmlmYWNlKVxuIH0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCI7IHVuaW1wbGVtZW50ZWRgKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIEFuIGBpZmFjZWAgbXVzdCBiZSBwdXJlLiBSaWdodCBub3cgaXQgbXVzdCBiZSBhIHN0cmluZywgd2hpY2ggaXMgcHVyZS5cbiAqIExhdGVyIHdlIGV4cGVjdCB0byBpbmNsdWRlIHNvbWUgb3RoZXIgdmFsdWVzIHRoYXQgcXVhbGlmeSBhcyBgUHVyZURhdGFgLFxuICogd2hpY2ggaXMgYSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgZW5kaW5nIG9ubHkgaW4gcHJpbWl0aXZlcyBvclxuICogZW1wdHkgcGFzcy1ieS1jb3B5IGNvbXBvc2l0ZXMuIE5vIHJlbW90YWJsZXMsIHByb21pc2VzLCBvciBlcnJvcnMuXG4gKiBXZSAqYXNzdW1lKiBmb3Igbm93IHRoYXQgdGhlIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBjb250YWlucyBub1xuICogcHJveGllcy5cbiAqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRJZmFjZT0oaWZhY2UpPT5jaGVja0lmYWNlKGlmYWNlLGFzc2VydENoZWNrZXIpOyRo4oCNX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdCB8IEZ1bmN0aW9ufSBvcmlnaW5hbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mPShvcmlnaW5hbCxjaGVjayk9PntcbmNvbnN0IHJlamVjdD0hIWNoZWNrJiYoKGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKSk7XG5pc09iamVjdChvcmlnaW5hbCl8fFxuRmFpbCBgUmVtb3RhYmxlcyBtdXN0IGJlIG9iamVjdHMgb3IgZnVuY3Rpb25zOiAke29yaWdpbmFsfWA7XG5cbi8qIEEgdmFsaWQgcmVtb3RhYmxlIG9iamVjdCBtdXN0IGluaGVyaXQgZnJvbSBhIFwidGFnIHJlY29yZFwiIC0tIGEqL1xuLyogcGxhaW4tb2JqZWN0IHByb3RvdHlwZSBjb25zaXN0aW5nIG9mIG9ubHkqL1xuLyogYSBgUEFTU19TVFlMRWAgcHJvcGVydHkgd2l0aCB2YWx1ZSBcInJlbW90YWJsZVwiIGFuZCBhIHN1aXRhYmxlIGBTeW1ib2wudG9TdHJpbmdUYWdgKi9cbi8qIHByb3BlcnR5LiBUaGUgcmVtb3RhYmxlIGNvdWxkIGluaGVyaXQgZGlyZWN0bHkgZnJvbSBzdWNoIGEgdGFnIHJlY29yZCwgb3IqL1xuLyogaXQgY291bGQgaW5oZXJpdCBmcm9tIGFub3RoZXIgdmFsaWQgcmVtb3RhYmxlLCB0aGF0IHRoZXJlZm9yZSBpdHNlbGYqL1xuLyogaW5oZXJpdHMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLiovXG4vKiovXG4vKiBUT0RPOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHR5cGVkZWYgdGhpcyBzaGFwZSwgYnV0IHdlIGNhbid0IGRlY2xhcmUgYSB0eXBlKi9cbi8qIHdpdGggUEFTU19TVFlMRSBmcm9tIEpTRG9jLiovXG4vKiovXG4vKiBAdHlwZSB7eyBbUEFTU19TVFlMRV06IHN0cmluZywqL1xuLyogW1N5bWJvbC50b1N0cmluZ1RhZ106IHN0cmluZywqL1xuLyogfX0qL1xuLyoqL1xuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuaWYocHJvdG89PT1vYmplY3RQcm90b3R5cGV8fHByb3RvPT09bnVsbCl7XG5yZXR1cm4oXG5yZWplY3QmJlxucmVqZWN0KFggYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWApKTtcblxuIH1cblxuaWYodHlwZW9mIG9yaWdpbmFsPT09J29iamVjdCcpe1xuY29uc3QgcHJvdG9Qcm90bz1nZXRQcm90b3R5cGVPZihwcm90byk7XG5pZihwcm90b1Byb3RvIT09b2JqZWN0UHJvdG90eXBlJiZwcm90b1Byb3RvIT09bnVsbCl7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xucmV0dXJuIGNoZWNrUmVtb3RhYmxlKHByb3RvLGNoZWNrKTtcbiB9XG5pZighY2hlY2tUYWdSZWNvcmQocHJvdG8sJ3JlbW90YWJsZScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfWVsc2UgaWYodHlwZW9mIG9yaWdpbmFsPT09J2Z1bmN0aW9uJyl7XG5pZighY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5cbi8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG5jb25zdCBwYXNzU3R5bGVLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovdGFnS2V5XTp7dmFsdWU6aWZhY2V9LFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG5yZXR1cm4oXG4ob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxucmVqZWN0JiZcbnJlamVjdChcblggYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiBSZW1vdGFibGUgUHJvdG8gJHtvd25LZXlzKHJlc3REZXNjcyl9YCkpJiZcblxuY2hlY2tJZmFjZShpZmFjZSxjaGVjaykpO1xuXG4gfTtcblxuLyoqXG4gKiBLZWVwIGEgd2VhayBzZXQgb2YgY29uZmlybWVkIHJlbW90YWJsZXMgZm9yIG1hcnNoYWwgcGVyZm9ybWFuY2VcbiAqICh3aXRob3V0IHdoaWNoIHdlIHdvdWxkIGluY3VyIGEgcmVkdW5kYW50IHZlcmlmaWNhdGlvbiBpblxuICogZ2V0SW50ZXJmYWNlT2YpLlxuICogV2UgZG9uJ3QgcmVtZW1iZXIgcmVqZWN0aW9ucyBiZWNhdXNlIHRoZXkgYXJlIHBvc3NpYmxlIHRvIGNvcnJlY3RcbiAqIHdpdGggZS5nLiBgaGFyZGVuYC5cbiAqXG4gKiBAdHlwZSB7V2Vha1NldDxSZW1vdGFibGU+fVxuICovXG5jb25zdCBjb25maXJtZWRSZW1vdGFibGVzPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGU9KHZhbCxjaGVjayk9PntcbmlmKGNvbmZpcm1lZFJlbW90YWJsZXMuaGFzKHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKCFpc0Zyb3plbih2YWwpKXtcbnJldHVybiByZWplY3QmJnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWApO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcmVzdWx0PWNoZWNrUmVtb3RhYmxlUHJvdG9PZih2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbmNvbmZpcm1lZFJlbW90YWJsZXMuYWRkKHZhbCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKiogQHR5cGUge01hcnNoYWxHZXRJbnRlcmZhY2VPZn0gKi9cbmNvbnN0ICAgICAgICBnZXRJbnRlcmZhY2VPZj0odmFsKT0+e1xuaWYoXG4haXNPYmplY3QodmFsKXx8XG52YWxbUEFTU19TVFlMRV0hPT0ncmVtb3RhYmxlJ3x8XG4hY2hlY2tSZW1vdGFibGUodmFsKSlcbntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIGdldFRhZyh2YWwpO1xuIH07JGjigI1fb25jZS5nZXRJbnRlcmZhY2VPZihnZXRJbnRlcmZhY2VPZik7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlT2YpO1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3JlbW90YWJsZScsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgdmFsaWRUeXBlPVxuKGlzT2JqZWN0KGNhbmRpZGF0ZSl8fFxucmVqZWN0JiZcbnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSkmJihcbiFpc0FycmF5KGNhbmRpZGF0ZSl8fFxucmVqZWN0JiZcbnJlamVjdChYIGBjYW5ub3Qgc2VyaWFsaXplIGFycmF5cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuaWYoIXZhbGlkVHlwZSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5jb25zdCBkZXNjcz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5pZih0eXBlb2YgY2FuZGlkYXRlPT09J29iamVjdCcpe1xuLyogRXZlcnkgb3duIHByb3BlcnR5IChyZWdhcmRsZXNzIG9mIGVudW1lcmFiaWxpdHkpKi9cbi8qIG11c3QgaGF2ZSBhIGZ1bmN0aW9uIHZhbHVlLiovXG5yZXR1cm4gb3duS2V5cyhkZXNjcykuZXZlcnkoKGtleSk9PntcbnJldHVybihcbi8qIFR5cGVjYXN0IG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbihoYXNPd25Qcm9wZXJ0eU9mKGRlc2NzWy8qKiBAdHlwZSB7c3RyaW5nfSAqL2tleV0sJ3ZhbHVlJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmtleT09PVN5bWJvbC50b1N0cmluZ1RhZyYmY2hlY2tJZmFjZShjYW5kaWRhdGVba2V5XSxjaGVjayl8fFxuKGNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggbm9uLW1ldGhvZHMgbGlrZSAke3EoXG5TdHJpbmcoa2V5KSlcbiB9IGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5rZXkhPT1QQVNTX1NUWUxFfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgQSBwYXNzLWJ5LXJlbW90ZSBjYW5ub3Qgc2hhZG93ICR7cShQQVNTX1NUWUxFKX1gKSkpKTtcblxuIH0pO1xuIH1lbHNlIGlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nZnVuY3Rpb24nKXtcbi8qIEZhciBmdW5jdGlvbnMgY2Fubm90IGJlIG1ldGhvZHMsIGFuZCBjYW5ub3QgaGF2ZSBtZXRob2RzLiovXG4vKiBUaGV5IG11c3QgaGF2ZSBleGFjdGx5IGV4cGVjdGVkIGAubmFtZWAgYW5kIGAubGVuZ3RoYCBwcm9wZXJ0aWVzKi9cbmNvbnN0e1xubmFtZTpuYW1lRGVzYyxcbmxlbmd0aDpsZW5ndGhEZXNjLFxuLyogQHRzLWlnbm9yZSBUUyBkb2Vzbid0IGxpa2Ugc3ltYm9scyBhcyBjb21wdXRlZCBpbmRleGVzPz8qL1xuW1N5bWJvbC50b1N0cmluZ1RhZ106dG9TdHJpbmdUYWdEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmRlc2NzO1xuY29uc3QgcmVzdEtleXM9b3duS2V5cyhyZXN0RGVzY3MpO1xucmV0dXJuKFxuKG5hbWVEZXNjJiZ0eXBlb2YgbmFtZURlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5yZWplY3QmJlxucmVqZWN0KFggYEZhciBmdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxubGVuZ3RoRGVzYyYmdHlwZW9mIGxlbmd0aERlc2MudmFsdWU9PT0nbnVtYmVyJ3x8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxudG9TdHJpbmdUYWdEZXNjPT09dW5kZWZpbmVkfHxcbih0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbiBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSYmXG5cbmNoZWNrSWZhY2UodG9TdHJpbmdUYWdEZXNjLnZhbHVlLGNoZWNrKSkmJihcbnJlc3RLZXlzLmxlbmd0aD09PTB8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSkpO1xuXG5cbiB9XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke2NhbmRpZGF0ZX1gKTtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+Y2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpLFxuXG5ldmVyeTooX3Bhc3NhYmxlLF9mbik9PnRydWV9KTskaOKAjV9vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydElmYWNlIjpbImFzc2VydElmYWNlIl0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIl0sIlJlbW90YWJsZUhlbHBlciI6WyJSZW1vdGFibGVIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANeJOipoPAACaDwAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9zYWZlLXByb21pc2UuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXNzZXJ0U2FmZVByb21pc2UiLCJpc1NhZmVQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxhc3NlcnRDaGVja2VyLGhhc093blByb3BlcnR5T2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7aXNGcm96ZW4sZ2V0UHJvdG90eXBlT2Z9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlfSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tQcm9taXNlT3duS2V5cz0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbmNvbnN0IGtleXM9b3duS2V5cyhwcik7XG5cbmlmKGtleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmNvbnN0IHVua25vd25LZXlzPWtleXMuZmlsdGVyKFxuKGtleSk9PnR5cGVvZiBrZXkhPT0nc3ltYm9sJ3x8IWhhc093blByb3BlcnR5T2YoUHJvbWlzZS5wcm90b3R5cGUsa2V5KSk7XG5cblxuaWYodW5rbm93bktleXMubGVuZ3RoIT09MCl7XG5yZXR1cm4gcmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gKTtcblxuIH1cblxuLyoqXG4gKiBBdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcsIE5vZGUncyBhc3luY19ob29rcyBjb250YWlucyB0aGVcbiAqIGZvbGxvd2luZyBjb2RlLCB3aGljaCB3ZSBjYW4gYWxzbyBzYWZlbHkgdG9sZXJhdGVcbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gZGVzdHJveVRyYWNraW5nKHByb21pc2UsIHBhcmVudCkge1xuICogdHJhY2tQcm9taXNlKHByb21pc2UsIHBhcmVudCk7XG4gKiAgIGNvbnN0IGFzeW5jSWQgPSBwcm9taXNlW2FzeW5jX2lkX3N5bWJvbF07XG4gKiAgIGNvbnN0IGRlc3Ryb3llZCA9IHsgZGVzdHJveWVkOiBmYWxzZSB9O1xuICogICBwcm9taXNlW2Rlc3Ryb3llZFN5bWJvbF0gPSBkZXN0cm95ZWQ7XG4gKiAgIHJlZ2lzdGVyRGVzdHJveUhvb2socHJvbWlzZSwgYXN5bmNJZCwgZGVzdHJveWVkKTtcbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfHN5bWJvbH0ga2V5XG4gKi9cbmNvbnN0IGNoZWNrU2FmZUFzeW5jSG9va3NLZXk9KGtleSk9PntcbmNvbnN0IHZhbD1wcltrZXldO1xuaWYodmFsPT09dW5kZWZpbmVkfHx0eXBlb2YgdmFsPT09J251bWJlcicpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoXG50eXBlb2YgdmFsPT09J29iamVjdCcmJlxudmFsIT09bnVsbCYmXG5pc0Zyb3plbih2YWwpJiZcbmdldFByb3RvdHlwZU9mKHZhbCk9PT1PYmplY3QucHJvdG90eXBlKVxue1xuY29uc3Qgc3ViS2V5cz1vd25LZXlzKHZhbCk7XG5pZihzdWJLZXlzLmxlbmd0aD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuXG5pZihcbnN1YktleXMubGVuZ3RoPT09MSYmXG5zdWJLZXlzWzBdPT09J2Rlc3Ryb3llZCcmJlxudmFsLmRlc3Ryb3llZD09PWZhbHNlKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiByZWplY3QoXG5YIGBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcblN0cmluZyhrZXkpKVxuIH0gaXMgJHt2YWx9YCk7XG5cbiB9O1xuXG5yZXR1cm4ga2V5cy5ldmVyeShjaGVja1NhZmVBc3luY0hvb2tzS2V5KTtcbiB9O1xuXG4vKipcbiAqIFVuZGVyIEhhcmRlbmVkIEpTIGEgcHJvbWlzZSBpcyBcInNhZmVcIiBpZiBpdHMgYHRoZW5gIG1ldGhvZCBjYW4gYmUgY2FsbGVkXG4gKiBzeW5jaHJvbm91c2x5IHdpdGhvdXQgZ2l2aW5nIHRoZSBwcm9taXNlIGFuIG9wcG9ydHVuaXR5IGZvciBhXG4gKiByZWVudHJhbmN5IGF0dGFjayBkdXJpbmcgdGhhdCBjYWxsLlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvOVxuICogcmFpc2VzIHRoZSBpc3N1ZSBvZiB0ZXN0aW5nIHRoYXQgYSBzcGVjaW1lbiBpcyBhIHNhZmUgcHJvbWlzZVxuICogc3VjaCB0aGF0IHRoZSB0ZXN0IGFsc28gZG9lcyBub3QgZ2l2ZSB0aGUgc3BlY2ltZW4gYVxuICogcmVlbnRyYW5jeSBvcHBvcnR1bml0eS4gVGhhdCBpcyB3ZWxsIGJleW9uZCB0aGUgYW1iaXRpb24gaGVyZS5cbiAqIFRPRE8gVGhvdWdoIGlmIHdlIGZpZ3VyZSBvdXQgYSBuaWNlIHNvbHV0aW9uLCBpdCBtaWdodCBiZSBnb29kIHRvXG4gKiB1c2UgaXQgaGVyZSBhcyB3ZWxsLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrU2FmZVByb21pc2U9KHByLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PShkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscyk7XG5yZXR1cm4oXG4oaXNGcm96ZW4ocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGZyb3plbmApKSYmKFxuaXNQcm9taXNlKHByKXx8cmVqZWN0KFggYCR7cHJ9IC0gTXVzdCBiZSBhIHByb21pc2VgKSkmJihcbmdldFByb3RvdHlwZU9mKHByKT09PVByb21pc2UucHJvdG90eXBlfHxcbnJlamVjdChcblggYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbmdldFByb3RvdHlwZU9mKHByKSlcbiB9YCkpJiZcblxuY2hlY2tQcm9taXNlT3duS2V5cygvKiogQHR5cGUge1Byb21pc2V9ICovcHIsY2hlY2spKTtcblxuIH07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIHRoZSBhcmd1bWVudCBpcyBhIFByb21pc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmNvbnN0ICAgICAgICBpc1NhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsKHgpPT54KTskaOKAjV9vbmNlLmlzU2FmZVByb21pc2UoaXNTYWZlUHJvbWlzZSk7XG5oYXJkZW4oaXNTYWZlUHJvbWlzZSk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRTYWZlUHJvbWlzZT0ocHIpPT5jaGVja1NhZmVQcm9taXNlKHByLGFzc2VydENoZWNrZXIpOyRo4oCNX29uY2UuYXNzZXJ0U2FmZVByb21pc2UoYXNzZXJ0U2FmZVByb21pc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADHH9VQRxIAAEcSAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3N5bWJvbC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIFRoZSB3ZWxsIGtub3duIHN5bWJvbHMgYXJlIHN0YXRpYyBzeW1ib2wgdmFsdWVzIG9uIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3Rvci5cbiAqL1xuY29uc3Qgd2VsbEtub3duU3ltYm9sTmFtZXM9bmV3IE1hcChcbm93bktleXMoU3ltYm9sKS5cbmZpbHRlcihcbihuYW1lKT0+dHlwZW9mIG5hbWU9PT0nc3RyaW5nJyYmdHlwZW9mIFN5bWJvbFtuYW1lXT09PSdzeW1ib2wnKS5cblxuZmlsdGVyKChuYW1lKT0+e1xuLyogQHRzLWV4cGVjdC1lcnJvciBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqL1xuIW5hbWUuc3RhcnRzV2l0aCgnQEAnKXx8XG5GYWlsIGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG5uYW1lKVxuIH1gO1xucmV0dXJuIHRydWU7XG4gfSlcbi8qIEB0cy1pZ25vcmUgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi8uXG5tYXAoKG5hbWUpPT5bU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pKTtcblxuXG4vKipcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IHN5bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1Bhc3NhYmxlU3ltYm9sPShzeW0pPT5cbnR5cGVvZiBzeW09PT0nc3ltYm9sJyYmKFxudHlwZW9mIFN5bWJvbC5rZXlGb3Ioc3ltKT09PSdzdHJpbmcnfHx3ZWxsS25vd25TeW1ib2xOYW1lcy5oYXMoc3ltKSk7JGjigI1fb25jZS5pc1Bhc3NhYmxlU3ltYm9sKGlzUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGlzUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2w9KHN5bSk9PlxuaXNQYXNzYWJsZVN5bWJvbChzeW0pfHxcbkZhaWwgYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuXG4vKipcbiAqIElmIGBzeW1gIGlzIGEgcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXNcbiAqIHN5bWJvbC4gSWYgYHN5bWAgaXMgYSBub24tcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy4gU2luY2UgdGhlIHJlZ2lzdHJhdGlvbiBzdHJpbmcgb2YgYSByZWdpc3RlcmVkIHN5bWJvbCBjYW4gYmUgYW55XG4gKiBzdHJpbmcsIGlmIHdlIHNpbXBseSB1c2VkIHRoYXQgdG8gaWRlbnRpZnkgdGhvc2Ugc3ltYm9scywgdGhlcmUgd291bGQgbm90XG4gKiBiZSBhbnkgcmVtYWluaW5nIHN0cmluZ3MgbGVmdCBvdmVyIHRvIGlkZW50aWZ5IHRoZSB3ZWxsLWtub3duIHN5bWJvbHMuXG4gKiBJbnN0ZWFkLCB3ZSByZXNlcnZlIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYFwiQEBcImAgZm9yIHB1cnBvc2VzIG9mIHRoaXNcbiAqIGVuY29kaW5nLiBXZSBpZGVudGlmeSBhIHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXMgYFN5bWJvbC5pdGVyYXRvcmBcbiAqIGJ5IHByZWZpeGluZyB0aGUgcHJvcGVydHkgbmFtZSB3aXRoIGBcIkBAXCJgLCBzdWNoIGFzIGBcIkBAaXRlcmF0b3JcImAuXG4gKiBGb3IgcmVnaXN0ZXJlZCBzeW1ib2xzIHdob3NlIG5hbWUgaGFwcGVucyB0byBiZWdpbiB3aXRoIGBcIkBAXCJgLCBzdWNoXG4gKiBhcyBgU3ltYm9sLmZvcignQEBpdGVyYXRvcicpYCBvciBgU3ltYm9sLmZvcignQEBmb28nKWAsIHdlIGlkZW50aWZ5XG4gKiB0aGVtIGJ5IHByZWZpeGluZyB0aGVtIHdpdGggYW4gZXh0cmEgYFwiQEBcImAsIHN1Y2ggYXNcbiAqIGBcIkBAQEBpdGVyYXRvclwiYCBvciBgXCJAQEBAZm9vXCJgLiAoVGhpcyBpcyB0aGUgSGlsYmVydCBIb3RlbCBlbmNvZGluZ1xuICogdGVjaG5pcXVlLilcbiAqXG4gKiBAcGFyYW0ge3N5bWJvbH0gc3ltXG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqL1xuY29uc3QgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbD0oc3ltKT0+e1xuY29uc3QgbmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihuYW1lPT09dW5kZWZpbmVkKXtcbnJldHVybiB3ZWxsS25vd25TeW1ib2xOYW1lcy5nZXQoc3ltKTtcbiB9XG5pZihuYW1lLnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIGBAQCR7bmFtZX1gO1xuIH1cbnJldHVybiBuYW1lO1xuIH07JGjigI1fb25jZS5uYW1lRm9yUGFzc2FibGVTeW1ib2wobmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCBBdEF0UHJlZml4UGF0dGVybj0vXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBJZiBgbmFtZWAgaXMgYSBzdHJpbmcgdGhhdCBjb3VsZCBoYXZlIGJlZW4gcHJvZHVjZWQgYnlcbiAqIGBuYW1lRm9yUGFzc2FibGVTeW1ib2xgLCByZXR1cm4gdGhlIHN5bWJvbCBhcmd1bWVudCBpdCB3YXMgcHJvZHVjZWQgdG9cbiAqIHJlcHJlc2VudC5cbiAqXG4gKiAgICBJZiBgbmFtZWAgZG9lcyBub3QgYmVnaW4gd2l0aCBgXCJAQFwiYCwgdGhlbiBqdXN0IHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICAgIHJlZ2lzdGVyZWQgc3ltYm9sLCBgU3ltYm9sLmZvcihuYW1lKWAuXG4gKiAgICBJZiBgbmFtZWAgaXMgYFwiQEBcImAgZm9sbG93ZWQgYnkgYSB3ZWxsIGtub3duIHN5bWJvbCdzIHByb3BlcnR5IG5hbWUgb25cbiAqICAgICAgYFN5bWJvbGAgc3VjaCBgXCJAQGl0ZXJhdG9yXCIsIHJldHVybiB0aGF0IHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXNcbiAqICAgICAgYFN5bWJvbC5pdGVyYXRvcmBcbiAqICAgIElmIGBuYW1lYCBiZWdpbnMgd2l0aCBgXCJAQEBAXCJgIGl0IGVuY29kZXMgdGhlIHJlZ2lzdGVyZWQgc3ltYm9sIHdob3NlXG4gKiAgICAgIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaW5zdGVhZC5cbiAqICAgIE90aGVyd2lzZSwgaWYgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpdCBtYXkgZW5jb2RlIGEgcmVnaXN0ZXJlZCBzeW1ib2xcbiAqICAgICAgZnJvbSBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEphdmFTY3JpcHQsIGJ1dCBpdCBpcyBub3Qgb25lIHdlIGNhbiBkZWNvZGVcbiAqICAgICAgeWV0LCBzbyB0aHJvdy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge3N5bWJvbD19XG4gKi9cbmNvbnN0ICAgICAgICBwYXNzYWJsZVN5bWJvbEZvck5hbWU9KG5hbWUpPT57XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmlmKG1hdGNoKXtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmlmKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBTeW1ib2wuZm9yKHN1ZmZpeCk7XG4gfWVsc2V7XG5jb25zdCBzeW09U3ltYm9sW3N1ZmZpeF07XG5pZih0eXBlb2Ygc3ltPT09J3N5bWJvbCcpe1xucmV0dXJuIHN5bTtcbiB9XG5GYWlsIGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiB9XG4gfVxucmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG4gfTskaOKAjV9vbmNlLnBhc3NhYmxlU3ltYm9sRm9yTmFtZShwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xuaGFyZGVuKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZVN5bWJvbCI6WyJpc1Bhc3NhYmxlU3ltYm9sIl0sImFzc2VydFBhc3NhYmxlU3ltYm9sIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAlvFz7/QcAAP0HAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxjaGVja05vcm1hbFByb3BlcnR5LGNoZWNrUGFzc1N0eWxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tQYXNzU3R5bGVcIiwgWyRo4oCNX2EgPT4gKGNoZWNrUGFzc1N0eWxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtGYWlsfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn1cbiAqL1xuY29uc3QgICAgICAgIFRhZ2dlZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOid0YWdnZWQnLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+XG5jaGVja1Bhc3NTdHlsZShjYW5kaWRhdGUsJ3RhZ2dlZCcsY2hlY2spLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5jaGVja1RhZ1JlY29yZChjYW5kaWRhdGUsJ3RhZ2dlZCcsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG5jb25zdCBwYXNzU3R5bGVLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1BBU1NfU1RZTEU7XG5jb25zdCB0YWdLZXk9LyoqIEB0eXBlIHt1bmtub3dufSAqL1N5bWJvbC50b1N0cmluZ1RhZztcbmNvbnN0e1xuLyogY2hlY2tUYWdSZWNvcmQgYWxyZWFkeSB2ZXJpZmllZCBQQVNTX1NUWUxFIGFuZCBTeW1ib2wudG9TdHJpbmdUYWcgb3duIGRhdGEgcHJvcGVydGllcy4qL1xuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovdGFnS2V5XTpfbGFiZWxEZXNjLFxucGF5bG9hZDpfcGF5bG9hZERlc2MsLyogdmFsdWUgY2hlY2tlZCBieSByZWN1cnNpdmUgd2FsayBhdCB0aGUgZW5kKi9cbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5vd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5GYWlsIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gdGFnZ2VkIHJlY29yZCAke293bktleXMocmVzdERlc2NzKX1gO1xuXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwncGF5bG9hZCcsdHJ1ZSxhc3NlcnRDaGVja2VyKTtcblxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xucGFzc1N0eWxlT2ZSZWN1cihjYW5kaWRhdGUucGF5bG9hZCk7XG4gfX0pOyRo4oCNX29uY2UuVGFnZ2VkSGVscGVyKFRhZ2dlZEhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGFnZ2VkSGVscGVyIjpbIlRhZ2dlZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB6oH5oEg0AABINAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvcHlBcnJheSIsImFzc2VydFJlY29yZCIsImFzc2VydFJlbW90YWJsZSIsImlzQ29weUFycmF5IiwiaXNSZWNvcmQiLCJpc1JlbW90YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZjskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5QXJyYXk8VD59IENvcHlBcnJheSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29weVJlY29yZDxUPn0gQ29weVJlY29yZCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlT2JqZWN0fSBSZW1vdGFibGUgKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIEFLQSBhIFwiY29weUFycmF5XCJcbiAqIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJcbiAqIEByZXR1cm5zIHthcnIgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbmNvbnN0IGlzQ29weUFycmF5PShhcnIpPT5wYXNzU3R5bGVPZihhcnIpPT09J2NvcHlBcnJheSc7JGjigI1fb25jZS5pc0NvcHlBcnJheShpc0NvcHlBcnJheSk7XG5oYXJkZW4oaXNDb3B5QXJyYXkpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgQUtBIGFcbiAqIFwiY29weVJlY29yZFwiIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZWNvcmRcbiAqIEByZXR1cm5zIHtyZWNvcmQgaXMgQ29weVJlY29yZDxhbnk+fVxuICovXG5jb25zdCBpc1JlY29yZD0ocmVjb3JkKT0+cGFzc1N0eWxlT2YocmVjb3JkKT09PSdjb3B5UmVjb3JkJzskaOKAjV9vbmNlLmlzUmVjb3JkKGlzUmVjb3JkKTtcbmhhcmRlbihpc1JlY29yZCk7XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYSByZW1vdGFibGUuXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7cmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuY29uc3QgaXNSZW1vdGFibGU9KHJlbW90YWJsZSk9PnBhc3NTdHlsZU9mKHJlbW90YWJsZSk9PT0ncmVtb3RhYmxlJzskaOKAjV9vbmNlLmlzUmVtb3RhYmxlKGlzUmVtb3RhYmxlKTtcbmhhcmRlbihpc1JlbW90YWJsZSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEFycmF5XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJheVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZBcnJheVxuICogQHJldHVybnMge2Fzc2VydHMgYXJyYXkgaXMgQ29weUFycmF5PGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRBcnJheX0gKi9cbmNvbnN0IGFzc2VydENvcHlBcnJheT0oYXJyYXksb3B0TmFtZU9mQXJyYXk9J0FsbGVnZWQgYXJyYXknKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKGFycmF5KTtcbnBhc3NTdHlsZT09PSdjb3B5QXJyYXknfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZBcnJheSl9ICR7YXJyYXl9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlBcnJheShhc3NlcnRDb3B5QXJyYXkpO1xuaGFyZGVuKGFzc2VydENvcHlBcnJheSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlY29yZFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlY29yZFxuICogQHJldHVybnMge2Fzc2VydHMgcmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlY29yZH0gKi9cbmNvbnN0IGFzc2VydFJlY29yZD0ocmVjb3JkLG9wdE5hbWVPZlJlY29yZD0nQWxsZWdlZCByZWNvcmQnKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlY29yZCk7XG5wYXNzU3R5bGU9PT0nY29weVJlY29yZCd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UmVjb3JkKGFzc2VydFJlY29yZCk7XG5oYXJkZW4oYXNzZXJ0UmVjb3JkKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVtb3RhYmxlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZW1vdGFibGUgaXMgUmVtb3RhYmxlfVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0UmVtb3RhYmxlfSAqL1xuY29uc3QgYXNzZXJ0UmVtb3RhYmxlPShcbnJlbW90YWJsZSxcbm9wdE5hbWVPZlJlbW90YWJsZT0nQWxsZWdlZCByZW1vdGFibGUnKT0+XG57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmVtb3RhYmxlKTtcbnBhc3NTdHlsZT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZW1vdGFibGUpfSAke3JlbW90YWJsZX0gbXVzdCBiZSBhIHJlbW90YWJsZSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlBcnJheSI6WyJpc0NvcHlBcnJheSJdLCJpc1JlY29yZCI6WyJpc1JlY29yZCJdLCJpc1JlbW90YWJsZSI6WyJpc1JlbW90YWJsZSJdLCJhc3NlcnRDb3B5QXJyYXkiOlsiYXNzZXJ0Q29weUFycmF5Il0sImFzc2VydFJlY29yZCI6WyJhc3NlcnRSZWNvcmQiXSwiYXNzZXJ0UmVtb3RhYmxlIjpbImFzc2VydFJlbW90YWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACYGTuzNAEAADQBAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALCcQn7iCgAA4goAAB4AAABAZW5kby9wYXR0ZXJucy12MC4yLjIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMva2V5cy9jaGVja0tleS5qcyIsIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiLCIuL3NyYy9rZXlzL2NvcHlCYWcuanMiLCIuL3NyYy9rZXlzL2NvcHlTZXQuanMiLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3NyYy90eXBlcy5qcyIsIi4vc3JjL3V0aWxzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiLCJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiLCJrZXlMVCIsImtleUxUIiwib2JqZWN0TWFwIiwib2JqZWN0TWFwIixudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvcHlTZXQuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weUJhZy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvdXRpbHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2tleXMvY2hlY2tLZXkuanMiOltbImlzS2V5IiwiaXNLZXkiXSxbImFzc2VydEtleSIsImFzc2VydEtleSJdLFsiYXNzZXJ0U2NhbGFyS2V5IiwiYXNzZXJ0U2NhbGFyS2V5Il0sWyJtYWtlQ29weVNldCIsIm1ha2VDb3B5U2V0Il0sWyJnZXRDb3B5U2V0S2V5cyIsImdldENvcHlTZXRLZXlzIl0sWyJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnIl0sWyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sWyJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlCYWdFbnRyaWVzIl0sWyJtYWtlQ29weU1hcCIsIm1ha2VDb3B5TWFwIl0sWyJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIl1dLCIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOltbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl1dLCIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOltbImNvZXJjZVRvQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyI6W1siY29tcGFyZUtleXMiLCJjb21wYXJlS2V5cyJdLFsia2V5TFQiLCJrZXlMVCJdLFsia2V5TFRFIiwia2V5TFRFIl0sWyJrZXlFUSIsImtleUVRIl0sWyJrZXlHVEUiLCJrZXlHVEUiXSxbImtleUdUIiwia2V5R1QiXV0sIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6W1siZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldENvbXBhcmUiLCJzZXRDb21wYXJlIl0sWyJzZXRVbmlvbiIsInNldFVuaW9uIl0sWyJzZXREaXNqb2ludFVuaW9uIiwic2V0RGlzam9pbnRVbmlvbiJdLFsic2V0SW50ZXJzZWN0aW9uIiwic2V0SW50ZXJzZWN0aW9uIl0sWyJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRTdWJ0cmFjdCJdXSwiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIjpbWyJiYWdJc1N1cGVyYmFnIiwiYmFnSXNTdXBlcmJhZyJdLFsiYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXV0sIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6W1siTSIsIk0iXSxbImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciJdLFsiaXNQYXR0ZXJuIiwiaXNQYXR0ZXJuIl0sWyJhc3NlcnRQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiJdLFsibWF0Y2hlcyIsIm1hdGNoZXMiXSxbIm11c3RNYXRjaCIsIm11c3RNYXRjaCJdXSwiLi9zcmMvdXRpbHMuanMiOltbImxpc3REaWZmZXJlbmNlIiwibGlzdERpZmZlcmVuY2UiXSxbIm9iamVjdE1hcCIsIm9iamVjdE1hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAyxcZ4KRGAACkRgAAKgAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMva2V5cy9jaGVja0tleS5qc3siaW1wb3J0cyI6WyIuLi91dGlscy5qcyIsIi4vY29weUJhZy5qcyIsIi4vY29weVNldC5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weU1hcCIsImFzc2VydENvcHlTZXQiLCJhc3NlcnRLZXkiLCJhc3NlcnRQcmltaXRpdmVLZXkiLCJhc3NlcnRTY2FsYXJLZXkiLCJjaGVja0NvcHlCYWciLCJjaGVja0NvcHlNYXAiLCJjaGVja0NvcHlTZXQiLCJjaGVja0tleSIsImNoZWNrU2NhbGFyS2V5IiwiY29weU1hcEtleVNldCIsImV2ZXJ5Q29weUJhZ0VudHJ5IiwiZXZlcnlDb3B5TWFwS2V5IiwiZXZlcnlDb3B5TWFwVmFsdWUiLCJldmVyeUNvcHlTZXRLZXkiLCJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEtleXMiLCJnZXRDb3B5TWFwVmFsdWVzIiwiZ2V0Q29weVNldEtleXMiLCJpc0NvcHlCYWciLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJpc0tleSIsImlzUHJpbWl0aXZlS2V5IiwiaXNTY2FsYXJLZXkiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGFzc2VydFBhc3NhYmxlLEZhcixnZXRUYWcsaXNPYmplY3QsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxpZGVudENoZWNrZXIsY2hlY2tFbGVtZW50cyxtYWtlU2V0T2ZFbGVtZW50cyxjaGVja0JhZ0VudHJpZXMsbWFrZUJhZ09mRW50cmllczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdXRpbHMuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiY2hlY2tFbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY2hlY2tFbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjigI1fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiY2hlY2tCYWdFbnRyaWVzXCIsIFskaOKAjV9hID0+IChjaGVja0JhZ0VudHJpZXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNoZWNrZXJ9IENoZWNrZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleUNvbXBhcmlzb259IEtleUNvbXBhcmlzb24gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXl9IEtleSAqL1xuLyoqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkNvcHlCYWc8Sz59IENvcHlCYWcgKi9cbi8qKiBAdGVtcGxhdGUge0tleX0gW0s9S2V5XSBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5Db3B5U2V0PEs+fSBDb3B5U2V0ICovXG4vKiogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV0gQHRlbXBsYXRlIHtQYXNzYWJsZX0gW1Y9UGFzc2FibGVdIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkNvcHlNYXA8SywgVj59IENvcHlNYXAgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXlDb21wYXJlfSBLZXlDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLyBQcmltaXRpdmUgYW5kIFNjYWxhciBrZXlzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1ByaW1pdGl2ZUtleT0odmFsLGNoZWNrKT0+e1xuaWYoaXNPYmplY3QodmFsKSl7XG5yZXR1cm4oXG5jaGVjayE9PWlkZW50Q2hlY2tlciYmXG5jaGVjayhmYWxzZSxYIGBBICR7cSh0eXBlb2YgdmFsKX0gY2Fubm90IGJlIGEgcHJpbWl0aXZlOiAke3ZhbH1gKSk7XG5cbiB9XG4vKiBUT0RPIFRoZXJlIGlzIG5vdCB5ZXQgYSBjaGVja1Bhc3NhYmxlLCBidXQgcGVyaGFwcyB0aGVyZSBzaG91bGQgYmUuKi9cbi8qIElmIHRoYXQgaGFwcGVucywgd2Ugc2hvdWxkIGNhbGwgaXQgaGVyZSBpbnN0ZWFkLiovXG5hc3NlcnRQYXNzYWJsZSh2YWwpO1xucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgaXNQcmltaXRpdmVLZXk9KHZhbCk9PmNoZWNrUHJpbWl0aXZlS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNQcmltaXRpdmVLZXkoaXNQcmltaXRpdmVLZXkpO1xuaGFyZGVuKGlzUHJpbWl0aXZlS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UHJpbWl0aXZlS2V5PSh2YWwpPT57XG5jaGVja1ByaW1pdGl2ZUtleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydFByaW1pdGl2ZUtleShhc3NlcnRQcmltaXRpdmVLZXkpO1xuaGFyZGVuKGFzc2VydFByaW1pdGl2ZUtleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrU2NhbGFyS2V5PSh2YWwsY2hlY2spPT57XG5pZihpc1ByaW1pdGl2ZUtleSh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuaWYocGFzc1N0eWxlPT09J3JlbW90YWJsZScpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIHNjYWxhciBrZXk6ICR7dmFsfWApO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuY2hlY2tTY2FsYXJLZXkoY2hlY2tTY2FsYXJLZXkpO1xuY29uc3QgICAgICAgIGlzU2NhbGFyS2V5PSh2YWwpPT5jaGVja1NjYWxhcktleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzU2NhbGFyS2V5KGlzU2NhbGFyS2V5KTtcbmhhcmRlbihpc1NjYWxhcktleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFNjYWxhcktleT0odmFsKT0+e1xuY2hlY2tTY2FsYXJLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRTY2FsYXJLZXkoYXNzZXJ0U2NhbGFyS2V5KTtcbmhhcmRlbihhc3NlcnRTY2FsYXJLZXkpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxLZXk+fSAqL1xuY29uc3Qga2V5TWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0tleT0odmFsLGNoZWNrKT0+e1xuaWYoIWlzT2JqZWN0KHZhbCkpe1xuLyogVE9ETyBUaGVyZSBpcyBub3QgeWV0IGEgY2hlY2tQYXNzYWJsZSwgYnV0IHBlcmhhcHMgdGhlcmUgc2hvdWxkIGJlLiovXG4vKiBJZiB0aGF0IGhhcHBlbnMsIHdlIHNob3VsZCBjYWxsIGl0IGhlcmUgaW5zdGVhZC4qL1xuYXNzZXJ0UGFzc2FibGUodmFsKTtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGtleU1lbW8uaGFzKHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHJlc3VsdD1jaGVja0tleUludGVybmFsKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuLyogRG9uJ3QgY2FjaGUgdGhlIHVuZGVmaW5lZCBjYXNlcywgc28gdGhhdCBpZiBpdCBpcyB0cmllZCBhZ2FpbiovXG4vKiB3aXRoIGBhc3NlcnRDaGVja2VyYCBpdCdsbCB0aHJvdyBhIGRpYWdub3N0aWMgYWdhaW4qL1xua2V5TWVtby5hZGQodmFsKTtcbiB9XG4vKiBOb3RlIHRoYXQgd2UgZG8gbm90IG1lbW9pemUgYSBuZWdhdGl2ZSBqdWRnZW1lbnQsIHNvIHRoYXQgaWYgaXQgaXMgdHJpZWQqL1xuLyogYWdhaW4gd2l0aCBhIGNoZWNrZXIsIGl0IHdpbGwgc3RpbGwgcHJvZHVjZSBhIHVzZWZ1bCBkaWFnbm9zdGljLiovXG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5jaGVja0tleShjaGVja0tleSk7XG5oYXJkZW4oY2hlY2tLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc0tleT0odmFsKT0+Y2hlY2tLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0tleShpc0tleSk7XG5oYXJkZW4oaXNLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7S2V5fSB2YWxcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydEtleT0odmFsKT0+e1xuY2hlY2tLZXkodmFsLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRLZXkoYXNzZXJ0S2V5KTtcbmhhcmRlbihhc3NlcnRLZXkpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlTZXQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weVNldCBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PENvcHlTZXQ+fSAqL1xuY29uc3QgY29weVNldE1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weVNldD0ocyxjaGVjayk9PntcbmlmKGNvcHlTZXRNZW1vLmhhcyhzKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZXN1bHQ9XG4ocGFzc1N0eWxlT2Yocyk9PT0ndGFnZ2VkJyYmZ2V0VGFnKHMpPT09J2NvcHlTZXQnfHxcbmNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlTZXQ6ICR7c31gKSkmJlxuY2hlY2tFbGVtZW50cyhzLnBheWxvYWQsY2hlY2spJiZcbmNoZWNrS2V5KHMucGF5bG9hZCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29weVNldE1lbW8uYWRkKHMpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrQ29weVNldChjaGVja0NvcHlTZXQpO1xuaGFyZGVuKGNoZWNrQ29weVNldCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIElzQ29weVNldFxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHJldHVybnMge3MgaXMgQ29weVNldH1cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weVNldH0gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXQ9KHMpPT5jaGVja0NvcHlTZXQocyxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5U2V0KGlzQ29weVNldCk7XG5oYXJkZW4oaXNDb3B5U2V0KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weVNldFxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHJldHVybnMge2Fzc2VydHMgcyBpcyBDb3B5U2V0fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weVNldH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5U2V0PShzKT0+e1xuY2hlY2tDb3B5U2V0KHMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlTZXQoYXNzZXJ0Q29weVNldCk7XG5oYXJkZW4oYXNzZXJ0Q29weVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHJldHVybnMge0tbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlTZXRLZXlzPShzKT0+e1xuYXNzZXJ0Q29weVNldChzKTtcbnJldHVybiBzLnBheWxvYWQ7XG4gfTskaOKAjV9vbmNlLmdldENvcHlTZXRLZXlzKGdldENvcHlTZXRLZXlzKTtcbmhhcmRlbihnZXRDb3B5U2V0S2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlTZXRLZXk9KHMsZm4pPT5cbmdldENvcHlTZXRLZXlzKHMpLmV2ZXJ5KChrZXksaW5kZXgpPT5mbihrZXksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weVNldEtleShldmVyeUNvcHlTZXRLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weVNldEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5U2V0PShlbGVtZW50SXRlcik9PntcbmNvbnN0IHJlc3VsdD1tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50SXRlcik7XG5hc3NlcnRDb3B5U2V0KHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weVNldChtYWtlQ29weVNldCk7XG5oYXJkZW4obWFrZUNvcHlTZXQpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlCYWcgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weUJhZyBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PENvcHlCYWc+fSAqL1xuY29uc3QgY29weUJhZ01lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weUJhZz0oYixjaGVjayk9PntcbmlmKGNvcHlCYWdNZW1vLmhhcyhiKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZXN1bHQ9XG4ocGFzc1N0eWxlT2YoYik9PT0ndGFnZ2VkJyYmZ2V0VGFnKGIpPT09J2NvcHlCYWcnfHxcbmNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlCYWc6ICR7Yn1gKSkmJlxuY2hlY2tCYWdFbnRyaWVzKGIucGF5bG9hZCxjaGVjaykmJlxuY2hlY2tLZXkoYi5wYXlsb2FkLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb3B5QmFnTWVtby5hZGQoYik7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5QmFnKGNoZWNrQ29weUJhZyk7XG5oYXJkZW4oY2hlY2tDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5QmFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7YiBpcyBDb3B5QmFnfVxuICovXG5cbi8qKiBAdHlwZSB7SXNDb3B5QmFnfSAqL1xuY29uc3QgICAgICAgIGlzQ29weUJhZz0oYik9PmNoZWNrQ29weUJhZyhiLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0NvcHlCYWcoaXNDb3B5QmFnKTtcbmhhcmRlbihpc0NvcHlCYWcpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5QmFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiIGlzIENvcHlCYWd9XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5QmFnfSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlCYWc9KGIpPT57XG5jaGVja0NvcHlCYWcoYixhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weUJhZyhhc3NlcnRDb3B5QmFnKTtcbmhhcmRlbihhc3NlcnRDb3B5QmFnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5QmFnPEs+fSBiXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPlsncGF5bG9hZCddfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weUJhZ0VudHJpZXM9KGIpPT57XG5hc3NlcnRDb3B5QmFnKGIpO1xucmV0dXJuIGIucGF5bG9hZDtcbiB9OyRo4oCNX29uY2UuZ2V0Q29weUJhZ0VudHJpZXMoZ2V0Q29weUJhZ0VudHJpZXMpO1xuaGFyZGVuKGdldENvcHlCYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtDb3B5QmFnPEs+fSBiXG4gKiBAcGFyYW0geyhlbnRyeTogW0ssIGJpZ2ludF0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weUJhZ0VudHJ5PShiLGZuKT0+XG5nZXRDb3B5QmFnRW50cmllcyhiKS5ldmVyeSgoZW50cnksaW5kZXgpPT5mbihlbnRyeSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5QmFnRW50cnkoZXZlcnlDb3B5QmFnRW50cnkpO1xuaGFyZGVuKGV2ZXJ5Q29weUJhZ0VudHJ5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxiaWdpbnRdPn0gYmFnRW50cnlJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5QmFnPShiYWdFbnRyeUl0ZXIpPT57XG5jb25zdCByZXN1bHQ9bWFrZUJhZ09mRW50cmllcyhiYWdFbnRyeUl0ZXIpO1xuYXNzZXJ0Q29weUJhZyhyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlCYWcobWFrZUNvcHlCYWcpO1xuaGFyZGVuKG1ha2VDb3B5QmFnKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlCYWdGcm9tRWxlbWVudHM9KGVsZW1lbnRJdGVyKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5jb25zdCBzb3J0ZWQ9c29ydEJ5UmFuayhlbGVtZW50SXRlcixmdWxsQ29tcGFyZSk7XG4vKiogQHR5cGUge1tLLGJpZ2ludF1bXX0gKi9cbmNvbnN0IGVudHJpZXM9W107XG5mb3IobGV0IGk9MDtpPHNvcnRlZC5sZW5ndGg7KXtcbmNvbnN0IGs9c29ydGVkW2ldO1xubGV0IGo9aSsxO1xud2hpbGUoajxzb3J0ZWQubGVuZ3RoJiZmdWxsQ29tcGFyZShrLHNvcnRlZFtqXSk9PT0wKXtcbmorPTE7XG4gfVxuZW50cmllcy5wdXNoKFtrLEJpZ0ludChqLWkpXSk7XG5pPWo7XG4gfVxucmV0dXJuIG1ha2VDb3B5QmFnKGVudHJpZXMpO1xuIH07JGjigI1fb25jZS5tYWtlQ29weUJhZ0Zyb21FbGVtZW50cyhtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5oYXJkZW4obWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlNYXAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weU1hcCdzIGtleXMgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5TWFwPn0gKi9cbmNvbnN0IGNvcHlNYXBNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja0NvcHlNYXA9KG0sY2hlY2spPT57XG5pZihjb3B5TWFwTWVtby5oYXMobSkpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoIShwYXNzU3R5bGVPZihtKT09PSd0YWdnZWQnJiZnZXRUYWcobSk9PT0nY29weU1hcCcpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGBOb3QgYSBjb3B5TWFwOiAke219YCk7XG4gfVxuY29uc3R7cGF5bG9hZH09bTtcbmlmKHBhc3NTdHlsZU9mKHBheWxvYWQpIT09J2NvcHlSZWNvcmQnKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3QgYmUgYSByZWNvcmQ6ICR7bX1gKTtcbiB9XG5jb25zdHtrZXlzLHZhbHVlcywuLi5yZXN0fT1wYXlsb2FkO1xuY29uc3QgcmVzdWx0PVxuKG93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgQSBjb3B5TWFwJ3MgcGF5bG9hZCBtdXN0IG9ubHkgaGF2ZSAua2V5cyBhbmQgLnZhbHVlczogJHttfWApKSYmXG5cbmNoZWNrRWxlbWVudHMoa2V5cyxjaGVjaykmJlxuY2hlY2tLZXkoa2V5cyxjaGVjaykmJihcbnBhc3NTdHlsZU9mKHZhbHVlcyk9PT0nY29weUFycmF5J3x8XG5jaGVjayhmYWxzZSxYIGBBIGNvcHlNYXAncyAudmFsdWVzIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7bX1gKSkmJihcbmtleXMubGVuZ3RoPT09dmFsdWVzLmxlbmd0aHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgQSBjb3B5TWFwIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Yga2V5cyBhbmQgdmFsdWVzOiAke219YCkpO1xuXG5pZihyZXN1bHQpe1xuY29weU1hcE1lbW8uYWRkKG0pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrQ29weU1hcChjaGVja0NvcHlNYXApO1xuaGFyZGVuKGNoZWNrQ29weU1hcCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIElzQ29weU1hcFxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHJldHVybnMge20gaXMgQ29weU1hcDxLZXksIFBhc3NhYmxlPn1cbiAqL1xuXG4vKiogQHR5cGUge0lzQ29weU1hcH0gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlNYXA9KG0pPT5jaGVja0NvcHlNYXAobSxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNDb3B5TWFwKGlzQ29weU1hcCk7XG5oYXJkZW4oaXNDb3B5TWFwKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weU1hcFxuICogQHBhcmFtIHtQYXNzYWJsZX0gbVxuICogQHJldHVybnMge2Fzc2VydHMgbSBpcyBDb3B5TWFwPEtleSwgUGFzc2FibGU+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weU1hcH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5TWFwPShtKT0+e1xuY2hlY2tDb3B5TWFwKG0sYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlNYXAoYXNzZXJ0Q29weU1hcCk7XG5oYXJkZW4oYXNzZXJ0Q29weU1hcCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcEtleXM9KG0pPT57XG5hc3NlcnRDb3B5TWFwKG0pO1xucmV0dXJuIG0ucGF5bG9hZC5rZXlzO1xuIH07JGjigI1fb25jZS5nZXRDb3B5TWFwS2V5cyhnZXRDb3B5TWFwS2V5cyk7XG5oYXJkZW4oZ2V0Q29weU1hcEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge1ZbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBWYWx1ZXM9KG0pPT57XG5hc3NlcnRDb3B5TWFwKG0pO1xucmV0dXJuIG0ucGF5bG9hZC52YWx1ZXM7XG4gfTskaOKAjV9vbmNlLmdldENvcHlNYXBWYWx1ZXMoZ2V0Q29weU1hcFZhbHVlcyk7XG5oYXJkZW4oZ2V0Q29weU1hcFZhbHVlcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W0ssVl0+fVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcEVudHJpZXM9KG0pPT57XG5hc3NlcnRDb3B5TWFwKG0pO1xuY29uc3R7XG5wYXlsb2FkOntrZXlzLHZhbHVlc319PVxubTtcbmNvbnN0e2xlbmd0aH09LyoqIEB0eXBlIHtBcnJheX0gKi9rZXlzO1xucmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xubGV0IGk9MDtcbnJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxbSyxWXSx2b2lkPn0gKi9cbmxldCByZXN1bHQ7XG5pZihpPGxlbmd0aCl7XG5yZXN1bHQ9aGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOltrZXlzW2ldLHZhbHVlc1tpXV19KTtcbmkrPTE7XG5yZXR1cm4gcmVzdWx0O1xuIH1lbHNle1xucmVzdWx0PWhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfX0pO1xuXG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLmdldENvcHlNYXBFbnRyaWVzKGdldENvcHlNYXBFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcGFyYW0geyhrZXk6IEssIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weU1hcEtleT0obSxmbik9PlxuZ2V0Q29weU1hcEtleXMobSkuZXZlcnkoKGtleSxpbmRleCk9PmZuKGtleSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5TWFwS2V5KGV2ZXJ5Q29weU1hcEtleSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwS2V5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KHZhbHVlOiBWLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlNYXBWYWx1ZT0obSxmbik9PlxuZ2V0Q29weU1hcFZhbHVlcyhtKS5ldmVyeSgodmFsdWUsaW5kZXgpPT5mbih2YWx1ZSxpbmRleCkpOyRo4oCNX29uY2UuZXZlcnlDb3B5TWFwVmFsdWUoZXZlcnlDb3B5TWFwVmFsdWUpO1xuaGFyZGVuKGV2ZXJ5Q29weU1hcFZhbHVlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgY29weU1hcEtleVNldD0obSk9PlxuLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUgYWxyZWFkeSBpbiB0aGUgaW50ZXJuYWwgZm9ybSB1c2VkIGJ5IGNvcHlTZXRzLiovXG5tYWtlVGFnZ2VkKCdjb3B5U2V0JyxtLnBheWxvYWQua2V5cyk7JGjigI1fb25jZS5jb3B5TWFwS2V5U2V0KGNvcHlNYXBLZXlTZXQpO1xuaGFyZGVuKGNvcHlNYXBLZXlTZXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBWXT59IGVudHJpZXNcbiAqIEByZXR1cm5zIHtDb3B5TWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weU1hcD0oZW50cmllcyk9Pntcbi8qIFRoaXMgaXMgd2VpcmQsIGJ1dCByZXZlcnNlIHJhbmsgc29ydGluZyB0aGUgZW50cmllcyBpcyBhIGdvb2QgZmlyc3Qgc3RlcCovXG4vKiBmb3IgZ2V0dGluZyB0aGUgcmFuayBzb3J0ZWQga2V5cyB0b2dldGhlciB3aXRoIHRoZSB2YWx1ZXMqL1xuLyogb3JnYW5pemVkIGJ5IHRob3NlIGtleXMuIEFsc28sIGFtb25nIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGgqL1xuLyoga2V5cyBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzcywgdGhvc2UgYXJlIHJhbmsgc29ydGVkLiovXG4vKiBUT0RPIFRoaXMqL1xuLyogY291bGQgc29sdmUgdGhlIGNvcHlNYXAgY292ZXIgaXNzdWUgZXhwbGFpbmVkIGluIHBhdHRlcm5NYXRjaGVycy5qcy4qL1xuLyogQnV0IG9ubHkgaWYgd2UgaW5jbHVkZSB0aGlzIGNyaXRlcmlhIGluIG91ciB2YWxpZGF0aW9uIG9mIGNvcHlNYXBzLCovXG4vKiB3aGljaCB3ZSBjdXJyZW50bHkgZG8gbm90LiovXG5jb25zdCBzb3J0ZWRFbnRyaWVzPXNvcnRCeVJhbmsoZW50cmllcyxjb21wYXJlQW50aVJhbmspO1xuY29uc3Qga2V5cz1zb3J0ZWRFbnRyaWVzLm1hcCgoW2ssX3ZdKT0+ayk7XG5jb25zdCB2YWx1ZXM9c29ydGVkRW50cmllcy5tYXAoKFtfayx2XSk9PnYpO1xuY29uc3QgcmVzdWx0PW1ha2VUYWdnZWQoJ2NvcHlNYXAnLHtrZXlzLHZhbHVlc30pO1xuYXNzZXJ0Q29weU1hcChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlNYXAobWFrZUNvcHlNYXApO1xuaGFyZGVuKG1ha2VDb3B5TWFwKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgUmVjdXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2V5SW50ZXJuYWw9KHZhbCxjaGVjayk9PntcbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tLZXkoY2hpbGQsY2hlY2spO1xuXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBBIGNvcHlSZWNvcmQgaXMgYSBrZXkgaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGtleXMqL1xucmV0dXJuIE9iamVjdC52YWx1ZXModmFsKS5ldmVyeShjaGVja0l0KTtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogQSBjb3B5QXJyYXkgaXMgYSBrZXkgaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlIGtleXMqL1xucmV0dXJuIHZhbC5ldmVyeShjaGVja0l0KTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyh2YWwpO1xuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbnJldHVybiBjaGVja0NvcHlTZXQodmFsLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbnJldHVybiBjaGVja0NvcHlCYWcodmFsLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbnJldHVybihcbmNoZWNrQ29weU1hcCh2YWwsY2hlY2spJiZcbi8qIEZvciBhIGNvcHlNYXAgdG8gYmUgYSBrZXksIGFsbCBpdHMga2V5cyBhbmQgdmFsdWVzIG11c3QqL1xuLyogYmUga2V5cy4gS2V5cyBhbHJlYWR5IGNoZWNrZWQgYnkgYGNoZWNrQ29weU1hcGAgc2luY2UqL1xuLyogdGhhdCdzIGEgY29weU1hcCByZXF1aXJlbWVudCBpbiBnZW5lcmFsLiovXG5ldmVyeUNvcHlNYXBWYWx1ZSh2YWwsY2hlY2tJdCkpO1xuXG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4oXG5jaGVjayE9PWlkZW50Q2hlY2tlciYmXG5jaGVjayhmYWxzZSxYIGBBIHBhc3NhYmxlIHRhZ2dlZCAke3EodGFnKX0gaXMgbm90IGEga2V5OiAke3ZhbH1gKSk7XG5cbiB9fVxuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbi8qIEFsbCByZW1vdGFibGVzIGFyZSBrZXlzLiovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5jYXNlJ2Vycm9yJzpcbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIGtleWApO1xuIH1cbmRlZmF1bHQ6e1xuLyogVW5leHBlY3RlZCB0YWdzIGFyZSBqdXN0IG5vbi1rZXlzLCBidXQgYW4gdW5leHBlY3RlZCBwYXNzU3R5bGUqL1xuLyogaXMgYWx3YXlzIGFuIGVycm9yLiovXG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7dmFsfWA7XG4gfX1cblxuIH07XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcmltaXRpdmVLZXkiOlsiaXNQcmltaXRpdmVLZXkiXSwiYXNzZXJ0UHJpbWl0aXZlS2V5IjpbImFzc2VydFByaW1pdGl2ZUtleSJdLCJjaGVja1NjYWxhcktleSI6WyJjaGVja1NjYWxhcktleSJdLCJpc1NjYWxhcktleSI6WyJpc1NjYWxhcktleSJdLCJhc3NlcnRTY2FsYXJLZXkiOlsiYXNzZXJ0U2NhbGFyS2V5Il0sImNoZWNrS2V5IjpbImNoZWNrS2V5Il0sImlzS2V5IjpbImlzS2V5Il0sImFzc2VydEtleSI6WyJhc3NlcnRLZXkiXSwiY2hlY2tDb3B5U2V0IjpbImNoZWNrQ29weVNldCJdLCJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0Il0sImFzc2VydENvcHlTZXQiOlsiYXNzZXJ0Q29weVNldCJdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyJdLCJldmVyeUNvcHlTZXRLZXkiOlsiZXZlcnlDb3B5U2V0S2V5Il0sIm1ha2VDb3B5U2V0IjpbIm1ha2VDb3B5U2V0Il0sImNoZWNrQ29weUJhZyI6WyJjaGVja0NvcHlCYWciXSwiaXNDb3B5QmFnIjpbImlzQ29weUJhZyJdLCJhc3NlcnRDb3B5QmFnIjpbImFzc2VydENvcHlCYWciXSwiZ2V0Q29weUJhZ0VudHJpZXMiOlsiZ2V0Q29weUJhZ0VudHJpZXMiXSwiZXZlcnlDb3B5QmFnRW50cnkiOlsiZXZlcnlDb3B5QmFnRW50cnkiXSwibWFrZUNvcHlCYWciOlsibWFrZUNvcHlCYWciXSwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiOlsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSwiY2hlY2tDb3B5TWFwIjpbImNoZWNrQ29weU1hcCJdLCJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIl0sImFzc2VydENvcHlNYXAiOlsiYXNzZXJ0Q29weU1hcCJdLCJnZXRDb3B5TWFwS2V5cyI6WyJnZXRDb3B5TWFwS2V5cyJdLCJnZXRDb3B5TWFwVmFsdWVzIjpbImdldENvcHlNYXBWYWx1ZXMiXSwiZ2V0Q29weU1hcEVudHJpZXMiOlsiZ2V0Q29weU1hcEVudHJpZXMiXSwiZXZlcnlDb3B5TWFwS2V5IjpbImV2ZXJ5Q29weU1hcEtleSJdLCJldmVyeUNvcHlNYXBWYWx1ZSI6WyJldmVyeUNvcHlNYXBWYWx1ZSJdLCJjb3B5TWFwS2V5U2V0IjpbImNvcHlNYXBLZXlTZXQiXSwibWFrZUNvcHlNYXAiOlsibWFrZUNvcHlNYXAiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9+bCUXcaAAB3GgAALQAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMva2V5cy9jb21wYXJlS2V5cy5qc3siaW1wb3J0cyI6WyIuL2NoZWNrS2V5LmpzIiwiLi9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImNvbXBhcmVLZXlzIiwia2V5RVEiLCJrZXlHVCIsImtleUdURSIsImtleUxUIiwia2V5TFRFIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGdldFRhZyxjb21wYXJlUmFuayxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMsYXNzZXJ0S2V5LGJhZ0NvbXBhcmUsc2V0Q29tcGFyZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJjb21wYXJlUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZVJhbmsgPSAkaOKAjV9hKV1dLFtcInJlY29yZE5hbWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmROYW1lcyA9ICRo4oCNX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaOKAjV9hID0+IChyZWNvcmRWYWx1ZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dXV0sW1wiLi9tZXJnZS1iYWctb3BlcmF0b3JzLmpzXCIsIFtbXCJiYWdDb21wYXJlXCIsIFskaOKAjV9hID0+IChiYWdDb21wYXJlID0gJGjigI1fYSldXV1dLFtcIi4vbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1wiLCBbW1wic2V0Q29tcGFyZVwiLCBbJGjigI1fYSA9PiAoc2V0Q29tcGFyZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZSB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXlDb21wYXJlfSAqL1xuY29uc3QgICAgICAgIGNvbXBhcmVLZXlzPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0S2V5KGxlZnQpO1xuYXNzZXJ0S2V5KHJpZ2h0KTtcbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG4vKiBEaWZmZXJlbnQgcGFzc1N0eWxlcyBhcmUgaW5jb21tZW5zdXJhdGUqL1xucmV0dXJuIE5hTjtcbiB9XG5zd2l0Y2gobGVmdFN0eWxlKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOntcbi8qIGZvciB0aGVzZSwga2V5cyBjb21wYXJlIHRoZSBzYW1lIGFzIHJhbmsqL1xucmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5jb25zdCByYW5rQ29tcD1jb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbmlmKHJhbmtDb21wPT09MCl7XG5yZXR1cm4gMDtcbiB9XG5pZihOdW1iZXIuaXNOYU4obGVmdCl8fE51bWJlci5pc05hTihyaWdodCkpe1xuLyogTmFOIGlzIGVxdWFsIHRvIGl0c2VsZiwgYnV0IGluY29tbWVuc3VyYXRlIHdpdGggZXZlcnl0aGluZyBlbHNlKi9cbmFzc2VydCghTnVtYmVyLmlzTmFOKGxlZnQpfHwhTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gTmFOO1xuIH1cbi8qIEFtb25nIG5vbi1OYU4gbnVtYmVycywga2V5IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHJhbmsgb3JkZXIuIE5vdGUgdGhhdCovXG4vKiBpbiBib3RoIG9yZGVycywgYC0wYCBpcyBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzcyBhcyBgMGAuKi9cbnJldHVybiByYW5rQ29tcDtcbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuaWYobGVmdD09PXJpZ2h0KXtcbnJldHVybiAwO1xuIH1cbi8qIElmIHR3byByZW1vdGFibGVzIGFyZSBub3QgaWRlbnRpY2FsLCB0aGVuIGFzIGtleXMgdGhleSBhcmUqL1xuLyogaW5jb21tZW5zdXJhdGUuKi9cbnJldHVybiBOYU47XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMgYnkga2V5IG9yZGVyLiBSYW5rIG9yZGVyIG9mIGFycmF5cyBpcyBsZXhpY29ncmFwaGljIGJ5Ki9cbi8qIHJhbmsgb3JkZXIuKi9cbi8qIEJlY2F1c2UgdGhlIGludmFyaWFudHMgYWJvdmUgYXBwbHkgdG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSwqL1xuLyogdGhleSBhcHBseSB0byB0aGUgYXJyYXkgYXMgYSB3aG9sZS4qL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJlS2V5cyhsZWZ0W2ldLHJpZ2h0W2ldKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIGFyZSBrZXlFUSwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuLyogVGh1cywgaWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaXMgc21hbGxlciB0aGFuIFkuKi9cbnJldHVybiBjb21wYXJlUmFuayhsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogUGFyZXRvIHBhcnRpYWwgb3JkZXIgY29tcGFyaXNvbi4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZigha2V5RVEobGVmdE5hbWVzLHJpZ2h0TmFtZXMpKXtcbi8qIElmIHRoZXkgZG8gbm90IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0aWVzLCovXG4vKiB0aGV5IGFyZSBpbmNvbW1lbnN1cmF0ZS4qL1xuLyogTm90ZSB0aGF0IHJhbmsgc29ydGluZyBvZiBjb3B5UmVjb3JkcyBncm91cHMgYWxsIGNvcHlSZWNvcmRzIHdpdGgqL1xuLyogdGhlIHNhbWUga2V5cyB0b2dldGhlciwgZW5hYmxpbmcgcmFuZ2Ugc2VhcmNoaW5nIG92ZXIgY29weVJlY29yZHMqL1xuLyogdG8gYXZvaWQgbW9yZSBpcnJlbGV2YW50IG9uZXMuKi9cbnJldHVybiBOYU47XG4gfVxuY29uc3QgbGVmdFZhbHVlcz1yZWNvcmRWYWx1ZXMobGVmdCxsZWZ0TmFtZXMpO1xuY29uc3QgcmlnaHRWYWx1ZXM9cmVjb3JkVmFsdWVzKHJpZ2h0LHJpZ2h0TmFtZXMpO1xuLyogUHJlc3VtZSB0aGF0IGJvdGggY29weVJlY29yZHMgaGF2ZSB0aGUgc2FtZSBrZXkgb3JkZXIqL1xuLyogdW50aWwgZW5jb3VudGVyaW5nIGEgcHJvcGVydHkgZGlzcHJvdmluZyB0aGF0IGh5cG90aGVzaXMuKi9cbmxldCByZXN1bHQ9MDtcbmZvcihsZXQgaT0wO2k8bGVmdFZhbHVlcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBjb21wPWNvbXBhcmVLZXlzKGxlZnRWYWx1ZXNbaV0scmlnaHRWYWx1ZXNbaV0pO1xuaWYoTnVtYmVyLmlzTmFOKGNvbXApKXtcbnJldHVybiBOYU47XG4gfVxuaWYocmVzdWx0IT09Y29tcCYmY29tcCE9PTApe1xuaWYocmVzdWx0PT09MCl7XG5yZXN1bHQ9Y29tcDtcbiB9ZWxzZXtcbmFzc2VydChcbnJlc3VsdD09PS0xJiZjb21wPT09MXx8cmVzdWx0PT09MSYmY29tcD09PS0xKTtcblxucmV0dXJuIE5hTjtcbiB9XG4gfVxuIH1cbi8qIElmIGNvcHlSZWNvcmQgWCBpcyBzbWFsbGVyIHRoYW4gY29weVJlY29yZCBZLCB0aGVuIHRoZXkgbXVzdCBoYXZlIHRoZSovXG4vKiBzYW1lIHByb3BlcnR5IG5hbWVzIGFuZCBldmVyeSB2YWx1ZSBpbiBYIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byovXG4vKiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiBZICh3aXRoIGF0IGxlYXN0IG9uZSB2YWx1ZSBzbWFsbGVyKS4qL1xuLyogVGhlIHJhbmsgb3JkZXIgb2YgWCBhbmQgWSBpcyBiYXNlZCBvbiBsZXhpY29ncmFwaGljIHJhbmsgb3JkZXIgb2YqL1xuLyogdGhlaXIgdmFsdWVzLCBhcyBvcmdhbml6ZWQgYnkgcmV2ZXJzZSBsZXhpY29ncmFwaGljIG9yZGVyIG9mIHRoZWlyKi9cbi8qIHByb3BlcnR5IG5hbWVzLiovXG4vKiBUaHVzIGlmIGNvbXBhcmVLZXlzKFgsWSkgPCAwIHRoZW4gY29tcGFyZVJhbmsoWCxZKSA8IDAuKi9cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IGxlZnRUYWc9Z2V0VGFnKGxlZnQpO1xuY29uc3QgcmlnaHRUYWc9Z2V0VGFnKHJpZ2h0KTtcbmlmKGxlZnRUYWchPT1yaWdodFRhZyl7XG4vKiBkaWZmZXJlbnQgdGFncyBhcmUgaW5jb21tZW5zdXJhdGUqL1xucmV0dXJuIE5hTjtcbiB9XG5zd2l0Y2gobGVmdFRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbi8qIGNvcHlTZXQgWCBpcyBzbWFsbGVyIHRoYW4gY29weVNldCBZIHdoZW4gZXZlcnkgZWxlbWVudCBvZiBYKi9cbi8qIGlzIGtleUVRIHRvIHNvbWUgZWxlbWVudCBvZiBZIGFuZCBzb21lIGVsZW1lbnQgb2YgWSBpcyovXG4vKiBub3Qga2V5RVEgdG8gYW55IGVsZW1lbnQgb2YgWC4qL1xucmV0dXJuIHNldENvbXBhcmUobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG4vKiBjb3B5QmFnIFggaXMgc21hbGxlciB0aGFuIGNvcHlCYWcgWSB3aGVuIGV2ZXJ5IGVsZW1lbnQgb2YgWCovXG4vKiBvY2N1cnMgbm8gbW9yZSB0aGFuIHRoZSBrZXlFUSBlbGVtZW50IG9mIFksIGFuZCBzb21lIGVsZW1lbnQqL1xuLyogb2YgWSBvY2N1cnMgbW9yZSB0aGFuIHNvbWUgZWxlbWVudCBvZiBYLCB3aGVyZSBiZWluZyBhYnNlbnQqL1xuLyogZnJvbSBYIGNvdW50cyBhcyBvY2N1cnJpbmcgemVybyB0aW1lcy4qL1xucmV0dXJuIGJhZ0NvbXBhcmUobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBUd28gY29weU1hcHMgdGhhdCBoYXZlIGRpZmZlcmVudCBrZXlzIChhY2NvcmRpbmcgdG8ga2V5RVEpIGFyZSovXG4vKiBpbmNvbW1lbnN1cmF0ZS4gVGhlIHJlcHJlc2VudGF0aW9uIG9mIGNvcHlNYXBzIGluY2x1ZGVzIHRoZSBrZXlzKi9cbi8qIGZpcnN0LCBpbiB0aGUgc2FtZSByZXZlcnNlIHJhbmsgb3JkZXIgdXNlZCBieSBzZXRzLiBUaHVzLCBhbGwqL1xuLyogY29weU1hcHMgd2l0aCBrZXlzIG9mIHRoZSBzYW1lIHJhbmsgKHdoaWNoIGlzKi9cbi8qIGxlc3MgcHJlY2lzZSEpIHdpbGwgYmUgZ3JvdXBlZCB0b2dldGhlciB3aGVuIGNvcHlNYXBzIGFyZSBzb3J0ZWQqL1xuLyogYnkgcmFuaywgbWluaW1pemluZyB0aGUgbnVtYmVyIG9mIG1pc3NlcyB3aGVuIHJhbmdlIHNlYXJjaGluZy4qL1xuLyoqL1xuLyogQW1vbmcgY29weU1hcHMgd2l0aCB0aGUgc2FtZSBrZXlzIChhY2NvcmRpbmcgdG8ga2V5RVEpLCB0aGV5Ki9cbi8qIGNvbXBhcmUgYnkgYSBjb3JyZXNwb25kaW5nIGNvbXBhcmlzb24gb2YgdGhlaXIgdmFsdWVzLiBUaHVzLCBhcyovXG4vKiB3aXRoIHJlY29yZHMsIGZvciB0d28gY29weU1hcHMgWCBhbmQgWSwgaWYgYGNvbXBhcmVLZXlzKFgsWSkgPCovXG4vKiAwYCB0aGVuLCBiZWNhdXNlIHRoZXNlIHZhbHVlcyBvYmV5IHRoZSBhYm92ZSBpbnZhcmlhbnRzLCBub25lIG9mKi9cbi8qIHRoZSB2YWx1ZXMgaW4gWCBoYXZlIGEgbGF0ZXIgcmFuayB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlKi9cbi8qIG9mIFkuIFRodXMsIGBjb21wYXJlUmFuayhYLFkpIDw9IDBgLiBUT0RPIGltcGxlbWVudCovXG50aHJvdyBGYWlsIGBNYXAgY29tcGFyaXNvbiBub3QgeWV0IGltcGxlbWVudGVkOiAke2xlZnR9IHZzICR7cmlnaHR9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgdGFnICR7cShsZWZ0VGFnKX06ICR7bGVmdH1gO1xuIH19XG5cbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShsZWZ0U3R5bGUpfTogJHtsZWZ0fWA7XG4gfX1cblxuIH07JGjigI1fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG5jb25zdCAgICAgICAga2V5TFQ9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KTwwOyRo4oCNX29uY2Uua2V5TFQoa2V5TFQpO1xuaGFyZGVuKGtleUxUKTtcblxuY29uc3QgICAgICAgIGtleUxURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPD0wOyRo4oCNX29uY2Uua2V5TFRFKGtleUxURSk7XG5oYXJkZW4oa2V5TFRFKTtcblxuY29uc3QgICAgICAgIGtleUVRPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk9PT0wOyRo4oCNX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuY29uc3QgICAgICAgIGtleUdURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPj0wOyRo4oCNX29uY2Uua2V5R1RFKGtleUdURSk7XG5oYXJkZW4oa2V5R1RFKTtcblxuY29uc3QgICAgICAgIGtleUdUPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk+MDskaOKAjV9vbmNlLmtleUdUKGtleUdUKTtcbmhhcmRlbihrZXlHVCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiXSwia2V5TFQiOlsia2V5TFQiXSwia2V5TFRFIjpbImtleUxURSJdLCJrZXlFUSI6WyJrZXlFUSJdLCJrZXlHVEUiOlsia2V5R1RFIl0sImtleUdUIjpbImtleUdUIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFUgwv0qFAAAKhQAACkAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY29weUJhZy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0QmFnRW50cmllcyIsImFzc2VydE5vRHVwbGljYXRlS2V5cyIsImNoZWNrQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyIsIm1ha2VCYWdPZkVudHJpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuazskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuLyoqIEB0ZW1wbGF0ZSB7S2V5fSBbSz1LZXldIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkNvcHlCYWc8Sz59IENvcHlCYWcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXl9IEtleSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkZ1bGxDb21wYXJlfSBGdWxsQ29tcGFyZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlIHwgdW5kZWZpbmVkfSBmdWxsQ29tcGFyZSBJZiBwcm92aWRlZCBhbmQgYGJhZ0VudHJpZXNgIGlzIGFscmVhZHlcbiAqIGtub3duIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0XG4gKiByYXRoZXIgdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZVxuICogYXJyYXkgZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUta2V5cyBmaW5kaW5nIGFzIHdlbGwsIGluZGVwZW5kZW50XG4gKiBvZiB0aGUgYGZ1bGxPcmRlcmAgdXNlIHRvIHJlYWNoIHRoaXMgZmluZGluZy5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZSxjaGVjayk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4vKiBUT0RPIE9uY2UgYWxsIG91ciB0b29saW5nIGlzIHJlYWR5IGZvciBgJiY9YCwgdGhlIGZvbGxvd2luZyovXG4vKiBsaW5lIHNob3VsZCBiZSByZXdyaXR0ZW4gdXNpbmcgaXQuKi9cbmZ1bGxDb21wYXJlPWZ1bGxDb21wYXJlfHxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4vKiBTaW5jZSB0aGUga2V5IGlzIG1vcmUgc2lnbmlmaWNhbnQgdGhhbiB0aGUgdmFsdWUgKHRoZSBjb3VudCksKi9cbi8qIHNvcnRpbmcgYnkgZnVsbE9yZGVyIGlzIGd1YXJhbnRlZWQgdG8gbWFrZSBkdXBsaWNhdGUga2V5cyovXG4vKiBhZGphY2VudCBpbmRlcGVuZGVudCBvZiB0aGVpciBjb3VudHMuKi9cbmJhZ0VudHJpZXM9c29ydEJ5UmFuayhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09YmFnRW50cmllcztcbmZvcihsZXQgaT0xO2k8bGVuZ3RoO2krPTEpe1xuY29uc3QgazA9YmFnRW50cmllc1tpLTFdWzBdO1xuY29uc3QgazE9YmFnRW50cmllc1tpXVswXTtcbmlmKGZ1bGxDb21wYXJlKGswLGsxKT09PTApe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYHZhbHVlIGhhcyBkdXBsaWNhdGUga2V5czogJHtrMH1gKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IFtmdWxsQ29tcGFyZV1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzPShiYWdFbnRyaWVzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1tQYXNzYWJsZSxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5hc3NlcnROb0R1cGxpY2F0ZUtleXMoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKTtcbmNvbnN0ICAgICAgICBjaGVja0JhZ0VudHJpZXM9KGJhZ0VudHJpZXMsY2hlY2spPT57XG5pZihwYXNzU3R5bGVPZihiYWdFbnRyaWVzKSE9PSdjb3B5QXJyYXknKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmlmKCFpc1JhbmtTb3J0ZWQoYmFnRW50cmllcyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtiYWdFbnRyaWVzfWApO1xuXG4gfVxuZm9yKGNvbnN0IGVudHJ5IG9mIGJhZ0VudHJpZXMpe1xuaWYoXG5wYXNzU3R5bGVPZihlbnRyeSkhPT0nY29weUFycmF5J3x8XG5lbnRyeS5sZW5ndGghPT0yfHxcbnR5cGVvZiBlbnRyeVsxXSE9PSdiaWdpbnQnKVxue1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGJlIHBhaXIgb2YgYSBrZXkgYW5kIGEgYmlnaW50IHJlcHJlc2VudGluZyBhIGNvdW50OiAke2VudHJ5fWApO1xuXG4gfVxuaWYoZW50cnlbMV08MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgaGF2ZSBhIHBvc2l0aXZlIGNvdW50OiAke2VudHJ5fWApO1xuXG4gfVxuIH1cbnJldHVybiBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaOKAjV9vbmNlLmNoZWNrQmFnRW50cmllcyhjaGVja0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNoZWNrQmFnRW50cmllcyk7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLXJldHVybnMtY2hlY2sgLS0gZG9lc24ndCB1bmRlcnN0YW5kIGFzc2VydHMqL1xuLyoqXG4gKiBAcGFyYW0ge1tQYXNzYWJsZSxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEByZXR1cm5zIHthc3NlcnRzIGJhZ0VudHJpZXMgaXMgW1Bhc3NhYmxlLGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydEJhZ0VudHJpZXM9KGJhZ0VudHJpZXMpPT57XG5jaGVja0JhZ0VudHJpZXMoYmFnRW50cmllcyxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0QmFnRW50cmllcyhhc3NlcnRCYWdFbnRyaWVzKTtcbmhhcmRlbihhc3NlcnRCYWdFbnRyaWVzKTtcblxuY29uc3QgICAgICAgIGNvZXJjZVRvQmFnRW50cmllcz0oYmFnRW50cmllc0xpc3QpPT57XG5jb25zdCBiYWdFbnRyaWVzPXNvcnRCeVJhbmsoYmFnRW50cmllc0xpc3QsY29tcGFyZUFudGlSYW5rKTtcbmFzc2VydEJhZ0VudHJpZXMoYmFnRW50cmllcyk7XG5yZXR1cm4gYmFnRW50cmllcztcbiB9OyRo4oCNX29uY2UuY29lcmNlVG9CYWdFbnRyaWVzKGNvZXJjZVRvQmFnRW50cmllcyk7XG5oYXJkZW4oY29lcmNlVG9CYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQmFnT2ZFbnRyaWVzPShiYWdFbnRyeUl0ZXIpPT5cbm1ha2VUYWdnZWQoJ2NvcHlCYWcnLGNvZXJjZVRvQmFnRW50cmllcyhiYWdFbnRyeUl0ZXIpKTskaOKAjV9vbmNlLm1ha2VCYWdPZkVudHJpZXMobWFrZUJhZ09mRW50cmllcyk7XG5oYXJkZW4obWFrZUJhZ09mRW50cmllcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIjpbImFzc2VydE5vRHVwbGljYXRlS2V5cyJdLCJjaGVja0JhZ0VudHJpZXMiOlsiY2hlY2tCYWdFbnRyaWVzIl0sImFzc2VydEJhZ0VudHJpZXMiOlsiYXNzZXJ0QmFnRW50cmllcyJdLCJjb2VyY2VUb0JhZ0VudHJpZXMiOlsiY29lcmNlVG9CYWdFbnRyaWVzIl0sIm1ha2VCYWdPZkVudHJpZXMiOlsibWFrZUJhZ09mRW50cmllcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAKHf6/oxAAAKMQAAApAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL2NvcHlTZXQuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFzc2VydEVsZW1lbnRzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVzIiwiY2hlY2tFbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiLCJtYWtlU2V0T2ZFbGVtZW50cyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcImlzUmFua1NvcnRlZFwiLCBbJGjigI1fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG4vKiogQHRlbXBsYXRlIHtLZXl9IFtLPUtleV0gQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQ29weVNldDxLPn0gQ29weVNldCAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleX0gS2V5ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Bhc3Mtc3R5bGUnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlIHwgdW5kZWZpbmVkfSBmdWxsQ29tcGFyZSBJZiBwcm92aWRlZCBhbmQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IGtub3duXG4gKiB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdCByYXRoZXJcbiAqIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmUgYXJyYXlcbiAqIGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlIGZpbmRpbmcgYXMgd2VsbCwgaW5kZXBlbmRlbnRcbiAqIG9mIHRoZSBgZnVsbE9yZGVyYCB1c2UgdG8gcmVhY2ggdGhpcyBmaW5kaW5nLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVzPShlbGVtZW50cyxmdWxsQ29tcGFyZSxjaGVjayk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4vKiBUT0RPIE9uY2UgYWxsIG91ciB0b29saW5nIGlzIHJlYWR5IGZvciBgJiY9YCwgdGhlIGZvbGxvd2luZyovXG4vKiBsaW5lIHNob3VsZCBiZSByZXdyaXR0ZW4gdXNpbmcgaXQuKi9cbmZ1bGxDb21wYXJlPWZ1bGxDb21wYXJlfHxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5lbGVtZW50cz1zb3J0QnlSYW5rKGVsZW1lbnRzLGZ1bGxDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZWxlbWVudHM7XG5mb3IobGV0IGk9MTtpPGxlbmd0aDtpKz0xKXtcbmNvbnN0IGswPWVsZW1lbnRzW2ktMV07XG5jb25zdCBrMT1lbGVtZW50c1tpXTtcbmlmKGZ1bGxDb21wYXJlKGswLGsxKT09PTApe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYHZhbHVlIGhhcyBkdXBsaWNhdGVzOiAke2swfWApO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IFtmdWxsQ29tcGFyZV1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVzPShlbGVtZW50cyxmdWxsQ29tcGFyZT11bmRlZmluZWQpPT57XG5jaGVja05vRHVwbGljYXRlcyhlbGVtZW50cyxmdWxsQ29tcGFyZSxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5hc3NlcnROb0R1cGxpY2F0ZXMoYXNzZXJ0Tm9EdXBsaWNhdGVzKTtcbmNvbnN0ICAgICAgICBjaGVja0VsZW1lbnRzPShlbGVtZW50cyxjaGVjayk9PntcbmlmKHBhc3NTdHlsZU9mKGVsZW1lbnRzKSE9PSdjb3B5QXJyYXknKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtlbGVtZW50c31gKTtcblxuIH1cbmlmKCFpc1JhbmtTb3J0ZWQoZWxlbWVudHMsY29tcGFyZUFudGlSYW5rKSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBrZXlzIG9mIGEgY29weVNldCBvciBjb3B5TWFwIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtlbGVtZW50c31gKTtcblxuIH1cbnJldHVybiBjaGVja05vRHVwbGljYXRlcyhlbGVtZW50cyx1bmRlZmluZWQsY2hlY2spO1xuIH07JGjigI1fb25jZS5jaGVja0VsZW1lbnRzKGNoZWNrRWxlbWVudHMpO1xuaGFyZGVuKGNoZWNrRWxlbWVudHMpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0RWxlbWVudHM9KGVsZW1lbnRzKT0+e1xuY2hlY2tFbGVtZW50cyhlbGVtZW50cyxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0RWxlbWVudHMoYXNzZXJ0RWxlbWVudHMpO1xuaGFyZGVuKGFzc2VydEVsZW1lbnRzKTtcblxuY29uc3QgICAgICAgIGNvZXJjZVRvRWxlbWVudHM9KGVsZW1lbnRzTGlzdCk9PntcbmNvbnN0IGVsZW1lbnRzPXNvcnRCeVJhbmsoZWxlbWVudHNMaXN0LGNvbXBhcmVBbnRpUmFuayk7XG5hc3NlcnRFbGVtZW50cyhlbGVtZW50cyk7XG5yZXR1cm4gZWxlbWVudHM7XG4gfTskaOKAjV9vbmNlLmNvZXJjZVRvRWxlbWVudHMoY29lcmNlVG9FbGVtZW50cyk7XG5oYXJkZW4oY29lcmNlVG9FbGVtZW50cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXRPZkVsZW1lbnRzPShlbGVtZW50SXRlcik9PlxubWFrZVRhZ2dlZCgnY29weVNldCcsY29lcmNlVG9FbGVtZW50cyhlbGVtZW50SXRlcikpOyRo4oCNX29uY2UubWFrZVNldE9mRWxlbWVudHMobWFrZVNldE9mRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VTZXRPZkVsZW1lbnRzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVzIl0sImNoZWNrRWxlbWVudHMiOlsiY2hlY2tFbGVtZW50cyJdLCJhc3NlcnRFbGVtZW50cyI6WyJhc3NlcnRFbGVtZW50cyJdLCJjb2VyY2VUb0VsZW1lbnRzIjpbImNvZXJjZVRvRWxlbWVudHMiXSwibWFrZVNldE9mRWxlbWVudHMiOlsibWFrZVNldE9mRWxlbWVudHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACyiebXklAAB5JQAANQAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIi4vY29weUJhZy5qcyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJiYWdDb21wYXJlIiwiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzRGlzam9pbnQiLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZUtleXMsbWFrZUJhZ09mRW50cmllczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzXCIsIFskaOKAjV9hID0+IChhc3NlcnROb0R1cGxpY2F0ZUtleXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIiwgWyRo4oCNX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5LZXlDb21wYXJpc29ufSBLZXlDb21wYXJpc29uICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuRnVsbENvbXBhcmV9IEZ1bGxDb21wYXJlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5SYW5rQ29tcGFyZX0gUmFua0NvbXBhcmUgKi9cblxuLyogQmFzZWQgb24gbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgYnV0IGFsdGVyZWQgZm9yIHRoZSBiYWcgcmVwcmVzZW50YXRpb24uKi9cbi8qIFRPRE8gc2hhcmUgbW9yZSBjb2RlIHdpdGggbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgcmF0aGVyIHRoYW4qL1xuLyogZHVwbGljYXRpbmcgd2l0aCBjaGFuZ2VzLiovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlXG4gKiB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBiYWdFbnRyaWVzIHdob3NlIGtleXMgYXJlIHRpZWQgZm9yIHRoZSBzYW1lXG4gKiByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgYmFnRW50cmllcyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGJhZ0VudHJpZXNgIGFycmF5XG4gKiBhY2NvcmRpbmdcbiAqIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50XT59XG4gKi9cbmNvbnN0IGJhZ1dpbmRvd1Jlc29ydD0oYmFnRW50cmllcyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoYmFnRW50cmllcyxyYW5rQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLyogZmFsbCB0aHJvdWdoKi9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IGVudHJ5PWJhZ0VudHJpZXNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShcbmo8bGVuZ3RoJiZcbnJhbmtDb21wYXJlKGVudHJ5WzBdLGJhZ0VudHJpZXNbal1bMF0pPT09MClcbntcbmorPTE7XG4gfVxuaWYoaj09PWkrMSl7XG5pPWo7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOmVudHJ5fSk7XG4gfVxuY29uc3Qgc2ltaWxhclJ1bj1iYWdFbnRyaWVzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbi8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4vKiBhcyBpcy4qL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6W251bGwsMG5dfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB5YmFnRW50cmllc1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2U9KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGBtZXJnZWAgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuY29uc3QgeHM9YmFnV2luZG93UmVzb3J0KHhiYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5jb25zdCB5cz1iYWdXaW5kb3dSZXNvcnQoeWJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8qIFRoZXNlIHNpeCBgbGV0YCB2YXJpYWJsZXMgYXJlIGJ1ZmZlcmluZyBvbmUgYWhlYWQgZnJvbSB0aGUgdW5kZXJseWluZyovXG4vKiBpdGVyYXRvcnMuIEVhY2ggaXRlcmF0aW9uIHJlcG9ydHMgb25lIG9yIHRoZSBvdGhlciBvciBib3RoLCBhbmQqL1xuLyogdGhlbiByZWZpbGxzIHRoZSBidWZmZXJzIG9mIHRob3NlIGl0IGFkdmFuY2VkLiovXG4vKiogQHR5cGUge1R9ICovXG5sZXQgeDtcbmxldCB4YztcbmxldCB4RG9uZTtcbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB5O1xubGV0IHljO1xubGV0IHlEb25lO1xuXG5jb25zdCB4aT14c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WD0oKT0+e1xuIXhEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7XG5kb25lOnhEb25lLFxudmFsdWU6W3gseGNdfT1cbnhpLm5leHQoKSk7XG4gfTtcbm5leHRYKCk7XG5cbmNvbnN0IHlpPXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtcbmRvbmU6eURvbmUsXG52YWx1ZTpbeSx5Y119PVxueWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge2Jvb2xlYW59ICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xudmFsdWU9W251bGwsMG4sMG5dO1xuIH1lbHNlIGlmKHhEb25lKXtcbi8qIG9ubHkgeXMgYXJlIGxlZnQqL1xudmFsdWU9W3ksMG4seWNdO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt4LHhjLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG52YWx1ZT1beCx4Yyx5Y107XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xudmFsdWU9W3gseGMsMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbi8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc1N1cGVyc2V0IGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgYmFnSXRlcklzU3VwZXJiYWc9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM8eWMpe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJiYWcgb2YgeSovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNEaXNqb2ludCBhcyB3ZWxsLiovXG4vKiBUaGUgY29kZSBpcyBpZGVudGljYWwuKi9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBiYWdJdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJDb21wYXJlIGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7S2V5Q29tcGFyaXNvbn1cbiAqL1xuY29uc3QgYmFnSXRlckNvbXBhcmU9KHh5aSk9PntcbmxldCBsb25lWT1mYWxzZTtcbmxldCBsb25lWD1mYWxzZTtcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM8eWMpe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJiYWcgb2YgeSovXG5sb25lWT10cnVlO1xuIH1cbmlmKHhjPnljKXtcbi8qIHNvbWV0aGluZyBpbiB4IGlzIG5vdCBpbiB5LCBzbyB5IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHgqL1xubG9uZVg9dHJ1ZTtcbiB9XG5pZihsb25lWCYmbG9uZVkpe1xucmV0dXJuIE5hTjtcbiB9XG4gfVxuaWYobG9uZVgpe1xucmV0dXJuIDE7XG4gfWVsc2UgaWYobG9uZVkpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG4hbG9uZVgmJiFsb25lWXx8XG5GYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCxsb25lWV0pfWA7XG5yZXR1cm4gMDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnQsYmlnaW50XVtdfSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJVbmlvbj0oeHlpKT0+e1xuLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xucmVzdWx0LnB1c2goW20seGMreWNdKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJbnRlcnNlY3Rpb249KHh5aSk9Pntcbi8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjPD15Yz94Yzp5YztcbnJlc3VsdC5wdXNoKFttLG1jXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdD0oeHlpKT0+e1xuLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuY29uc3QgbWM9eGMteWM7XG5tYz49MG58fEZhaWwgYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuaWYobWM+PTFuKXtcbi8qIHRoZSB4IHdhcyBub3QgaW4geSovXG5yZXN1bHQucHVzaChbbSxtY10pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IG1lcmdlaWZ5PShiYWdJdGVyT3ApPT4oeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpPT5cbmJhZ0l0ZXJPcChtZXJnZSh4YmFnRW50cmllcyx5YmFnRW50cmllcykpO1xuXG5jb25zdCBiYWdFbnRyaWVzSXNTdXBlcmJhZz1tZXJnZWlmeShiYWdJdGVySXNTdXBlcmJhZyk7XG5jb25zdCBiYWdFbnRyaWVzSXNEaXNqb2ludD1tZXJnZWlmeShiYWdJdGVySXNEaXNqb2ludCk7XG5jb25zdCBiYWdFbnRyaWVzQ29tcGFyZT1tZXJnZWlmeShiYWdJdGVyQ29tcGFyZSk7XG5jb25zdCBiYWdFbnRyaWVzVW5pb249bWVyZ2VpZnkoYmFnSXRlclVuaW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoYmFnSXRlckludGVyc2VjdGlvbik7XG5jb25zdCBiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdD1tZXJnZWlmeShiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd0JhZ2lmeT0oYmFnRW50cmllc09wKT0+KHhiYWcseWJhZyk9PlxuYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCx5YmFnLnBheWxvYWQpO1xuXG5jb25zdCBiYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbm1ha2VCYWdPZkVudHJpZXMoYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCx5YmFnLnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIGJhZ0lzU3VwZXJiYWc9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc1N1cGVyYmFnKTskaOKAjV9vbmNlLmJhZ0lzU3VwZXJiYWcoYmFnSXNTdXBlcmJhZyk7XG5jb25zdCAgICAgICAgYmFnSXNEaXNqb2ludD1yYXdCYWdpZnkoYmFnRW50cmllc0lzRGlzam9pbnQpOyRo4oCNX29uY2UuYmFnSXNEaXNqb2ludChiYWdJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBiYWdDb21wYXJlPXJhd0JhZ2lmeShiYWdFbnRyaWVzQ29tcGFyZSk7JGjigI1fb25jZS5iYWdDb21wYXJlKGJhZ0NvbXBhcmUpO1xuY29uc3QgICAgICAgIGJhZ1VuaW9uPWJhZ2lmeShiYWdFbnRyaWVzVW5pb24pOyRo4oCNX29uY2UuYmFnVW5pb24oYmFnVW5pb24pO1xuY29uc3QgICAgICAgIGJhZ0ludGVyc2VjdGlvbj1iYWdpZnkoYmFnRW50cmllc0ludGVyc2VjdGlvbik7JGjigI1fb25jZS5iYWdJbnRlcnNlY3Rpb24oYmFnSW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBiYWdEaXNqb2ludFN1YnRyYWN0PWJhZ2lmeShiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5iYWdEaXNqb2ludFN1YnRyYWN0KGJhZ0Rpc2pvaW50U3VidHJhY3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyJdLCJiYWdJc0Rpc2pvaW50IjpbImJhZ0lzRGlzam9pbnQiXSwiYmFnQ29tcGFyZSI6WyJiYWdDb21wYXJlIl0sImJhZ1VuaW9uIjpbImJhZ1VuaW9uIl0sImJhZ0ludGVyc2VjdGlvbiI6WyJiYWdJbnRlcnNlY3Rpb24iXSwiYmFnRGlzam9pbnRTdWJ0cmFjdCI6WyJiYWdEaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACL2dVKeKAAAnigAADUAAABAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyIuL2NvcHlTZXQuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c1VuaW9uIiwic2V0Q29tcGFyZSIsInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFVuaW9uIiwic2V0SW50ZXJzZWN0aW9uIiwic2V0SXNEaXNqb2ludCIsInNldElzU3VwZXJzZXQiLCJzZXRVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLGFzc2VydE5vRHVwbGljYXRlcyxtYWtlU2V0T2ZFbGVtZW50czskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVzXCIsIFskaOKAjV9hID0+IChhc3NlcnROb0R1cGxpY2F0ZXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleUNvbXBhcmlzb259IEtleUNvbXBhcmlzb24gKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5GdWxsQ29tcGFyZX0gRnVsbENvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlJhbmtDb21wYXJlfSBSYW5rQ29tcGFyZSAqL1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgZWxlbWVudHNgIGlzIGFscmVhZHkgcmFuayBzb3J0ZWQgYnkgYHJhbmtDb21wYXJlYCwgd2hlcmUgdGhlcmVcbiAqIG1heSBiZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgZWxlbWVudHMgdGllZCBmb3IgdGhlIHNhbWUgcmFuay5cbiAqIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCB3aWxsIGVudW1lcmF0ZSBhbGwgdGhlIGVsZW1lbnRzIGluIG9yZGVyXG4gKiBhY2NvcmRpbmcgdG8gYGZ1bGxPcmRlcmAsIHdoaWNoIHNob3VsZCBkaWZmZXIgZnJvbSBgcmFua09yZGVyYCBvbmx5XG4gKiBieSBiZWluZyBtb3JlIHByZWNpc2UuXG4gKlxuICogVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byByZXNvcnRpbmcgdGhlIGVudGlyZSBgZWxlbWVudHNgIGFycmF5IGFjY29yZGluZ1xuICogIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCB3aW5kb3dSZXNvcnQ9KGVsZW1lbnRzLHJhbmtDb21wYXJlLGZ1bGxDb21wYXJlKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChlbGVtZW50cyxyYW5rQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWVsZW1lbnRzO1xubGV0IGk9MDtcbmxldCBvcHRJbm5lckl0ZXJhdG9yO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+XG5oYXJkZW4oe1xubmV4dDooKT0+e1xuaWYob3B0SW5uZXJJdGVyYXRvcil7XG5jb25zdCByZXN1bHQ9b3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG5pZihyZXN1bHQuZG9uZSl7XG5vcHRJbm5lckl0ZXJhdG9yPXVuZGVmaW5lZDtcbi8qIGZhbGwgdGhyb3VnaCovXG4gfWVsc2V7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG5pZihpPGxlbmd0aCl7XG5jb25zdCB2YWx1ZT1lbGVtZW50c1tpXTtcbmxldCBqPWkrMTtcbndoaWxlKGo8bGVuZ3RoJiZyYW5rQ29tcGFyZSh2YWx1ZSxlbGVtZW50c1tqXSk9PT0wKXtcbmorPTE7XG4gfVxuaWYoaj09PWkrMSl7XG5pPWo7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfVxuY29uc3Qgc2ltaWxhclJ1bj1lbGVtZW50cy5zbGljZShpLGopO1xuaT1qO1xuY29uc3QgcmVzb3J0ZWQ9c29ydEJ5UmFuayhzaW1pbGFyUnVuLGZ1bGxDb21wYXJlKTtcbi8qIFByb3ZpZGluZyB0aGUgc2FtZSBgZnVsbENvbXBhcmVgIHNob3VsZCBjYXVzZSBhIG1lbW8gaGl0Ki9cbi8qIHdpdGhpbiBgYXNzZXJ0Tm9EdXBsaWNhdGVzYCBlbmFibGluZyBpdCB0byBhdm9pZCBhKi9cbi8qIHJlZHVuZGFudCByZXNvcnRpbmcuKi9cbmFzc2VydE5vRHVwbGljYXRlcyhyZXNvcnRlZCxmdWxsQ29tcGFyZSk7XG4vKiBUaGlzIGlzIHRoZSByYXcgSlMgYXJyYXkgaXRlcmF0b3Igd2hvc2UgYC5uZXh0KClgIG1ldGhvZCovXG4vKiBkb2VzIG5vdCBoYXJkZW4gdGhlIEl0ZXJhdG9yUmVzdWx0LCBpbiB2aW9sYXRpb24gb2Ygb3VyKi9cbi8qIGNvbnZlbnRpb25zLiBGaXhpbmcgdGhpcyBpcyBleHBlbnNpdmUgYW5kIEknbSBjb25maWRlbnQgdGhlKi9cbi8qIHVuZnJvemVuIHZhbHVlIGRvZXMgbm90IGVzY2FwZSB0aGlzIGZpbGUsIHNvIEknbSBsZWF2aW5nIHRoaXMqL1xuLyogYXMgaXMuKi9cbm9wdElubmVySXRlcmF0b3I9cmVzb3J0ZWRbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7ZG9uZTp0cnVlLHZhbHVlOm51bGx9KTtcbiB9XG4gfX0pfSk7XG5cblxuIH07XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB3aG9zZSBpdGVyYXRpb24gcmVzdWx0cyBhcmUgW2tleSwgeENvdW50LCB5Q291bnRdIHR1cGxlc1xuICogcmVwcmVzZW50aW5nIHRoZSBuZXh0IGtleSBpbiB0aGUgbG9jYWwgZnVsbCBvcmRlciwgYXMgd2VsbCBhcyBob3cgbWFueVxuICogdGltZXMgaXQgb2NjdXJyZWQgaW4gdGhlIHggaW5wdXQgaXRlcmF0b3IgYW5kIHRoZSB5IGlucHV0IGl0ZXJhdG9yLlxuICpcbiAqIEZvciBzZXRzLCB0aGVzZSBjb3VudHMgYXJlIGFsd2F5cyAwIG9yIDEsIGJ1dCB0aGlzIHJlcHJlc2VudGF0aW9uXG4gKiBnZW5lcmFsaXplcyBuaWNlbHkgZm9yIGJhZ3MuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSB4ZWxlbWVudHNcbiAqIEBwYXJhbSB7VFtdfSB5ZWxlbWVudHNcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59XG4gKi9cbmNvbnN0IG1lcmdlPSh4ZWxlbWVudHMseWVsZW1lbnRzKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGBtZXJnZWAgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuY29uc3QgeHM9d2luZG93UmVzb3J0KHhlbGVtZW50cyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuY29uc3QgeXM9d2luZG93UmVzb3J0KHllbGVtZW50cyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuLyogVGhlc2UgZm91ciBgbGV0YCB2YXJpYWJsZXMgYXJlIGJ1ZmZlcmluZyBvbmUgYWhlYWQgZnJvbSB0aGUgdW5kZXJseWluZyovXG4vKiBpdGVyYXRvcnMuIEVhY2ggaXRlcmF0aW9uIHJlcG9ydHMgb25lIG9yIHRoZSBvdGhlciBvciBib3RoLCBhbmQqL1xuLyogdGhlbiByZWZpbGxzIHRoZSBidWZmZXJzIG9mIHRob3NlIGl0IGFkdmFuY2VkLiovXG4vKiogQHR5cGUge1R9ICovXG5sZXQgeDtcbmxldCB4RG9uZTtcbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB5O1xubGV0IHlEb25lO1xuXG5jb25zdCB4aT14c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WD0oKT0+e1xuIXhEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7ZG9uZTp4RG9uZSx2YWx1ZTp4fT14aS5uZXh0KCkpO1xuIH07XG5uZXh0WCgpO1xuXG5jb25zdCB5aT15c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WT0oKT0+e1xuIXlEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7ZG9uZTp5RG9uZSx2YWx1ZTp5fT15aS5uZXh0KCkpO1xuIH07XG5uZXh0WSgpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9Pntcbi8qKiBAdHlwZSB7Ym9vbGVhbn0gKi9cbmxldCBkb25lPWZhbHNlO1xuLyoqIEB0eXBlIHtbVCxiaWdpbnQsYmlnaW50XX0gKi9cbmxldCB2YWx1ZTtcbmlmKHhEb25lJiZ5RG9uZSl7XG5kb25lPXRydWU7XG4vKiBAdHMtZXhwZWN0LWVycm9yIEJlY2F1c2UgdGhlIHRlcm1pbmF0aW5nIHZhbHVlIGRvZXMgbm90IG1hdHRlciovXG52YWx1ZT1bbnVsbCwwbiwwbl07XG4gfWVsc2UgaWYoeERvbmUpe1xuLyogb25seSB5cyBhcmUgbGVmdCovXG52YWx1ZT1beSwwbiwxbl07XG5uZXh0WSgpO1xuIH1lbHNlIGlmKHlEb25lKXtcbi8qIG9ubHkgeHMgYXJlIGxlZnQqL1xudmFsdWU9W3gsMW4sMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbmNvbnN0IGNvbXA9ZnVsbENvbXBhcmUoeCx5KTtcbmlmKGNvbXA9PT0wKXtcbi8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbnZhbHVlPVt4LDFuLDFuXTtcbm5leHRYKCk7XG5uZXh0WSgpO1xuIH1lbHNlIGlmKGNvbXA8MCl7XG4vKiB4IGlzIGVhcmxpZXIsIHNvIHJlcG9ydCBpdCovXG52YWx1ZT1beCwxbiwwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuY29tcD4wfHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xudmFsdWU9W3ksMG4sMW5dO1xubmV4dFkoKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZSx2YWx1ZX0pO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5oYXJkZW4obWVyZ2UpO1xuXG5jb25zdCBpdGVySXNTdXBlcnNldD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLF95Y11vZiB4eWkpe1xuaWYoeGM9PT0wbil7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcnNldCBvZiB5Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGl0ZXJJc0Rpc2pvaW50PSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0xbiYmeWM+PTFuKXtcbi8qIFNvbWV0aGluZyBpbiBib3RoLCBzbyBub3QgZGlzam9pbnQqL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7S2V5Q29tcGFyaXNvbn1cbiAqL1xuY29uc3QgaXRlckNvbXBhcmU9KHh5aSk9PntcbmxldCBsb25lWT1mYWxzZTtcbmxldCBsb25lWD1mYWxzZTtcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM9PT0wbil7XG4vKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcnNldCBvZiB5Ki9cbmxvbmVZPXRydWU7XG4gfVxuaWYoeWM9PT0wbil7XG4vKiBzb21ldGhpbmcgaW4geCBpcyBub3QgaW4geSwgc28geSBpcyBub3QgYSBzdXBlcnNldCBvZiB4Ki9cbmxvbmVYPXRydWU7XG4gfVxuaWYobG9uZVgmJmxvbmVZKXtcbnJldHVybiBOYU47XG4gfVxuIH1cbmlmKGxvbmVYKXtcbnJldHVybiAxO1xuIH1lbHNlIGlmKGxvbmVZKXtcbnJldHVybi0xO1xuIH1lbHNle1xuIWxvbmVYJiYhbG9uZVl8fFxuRmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgbG9uZSBwYWlyICR7cShbbG9uZVgsbG9uZVldKX1gO1xucmV0dXJuIDA7XG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJVbmlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0wbil7XG5yZXN1bHQucHVzaChtKTtcbiB9ZWxzZXtcbnljPj0wbnx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xuLyogaWYgeCBhbmQgeSB3ZXJlIGJvdGggcmVhZHksIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQgYW5kKi9cbi8qIGFib3ZlIGNsYXVzZSBhbHJlYWR5IHRvb2sgY2FyZSBvZiBpdC4gT3RoZXJ3aXNlIHB1c2ggaGVyZS4qL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50VW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG54Yz09PTBufHx5Yz09PTBufHxGYWlsIGBTZXRzIG11c3Qgbm90IGhhdmUgY29tbW9uIGVsZW1lbnRzOiAke219YDtcbmlmKHhjPj0xbil7XG5yZXN1bHQucHVzaChtKTtcbiB9ZWxzZXtcbnljPj0xbnx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlckludGVyc2VjdGlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0xbiYmeWM+PTFuKXtcbi8qIElmIHRoZXkgYXJlIGJvdGggcHJlc2VudCwgdGhlbiB0aGV5IHdlcmUgZXF1aXZhbGVudCovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyRGlzam9pbnRTdWJ0cmFjdD0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnhjPj0xbnx8RmFpbCBgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG5pZih5Yz09PTBuKXtcbi8qIHRoZSB4IHdhcyBub3QgaW4geSovXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBtZXJnZWlmeT0oaXRlck9wKT0+KHhlbGVtZW50cyx5ZWxlbWVudHMpPT5cbml0ZXJPcChtZXJnZSh4ZWxlbWVudHMseWVsZW1lbnRzKSk7XG5cbmNvbnN0ICAgICAgICBlbGVtZW50c0lzU3VwZXJzZXQ9bWVyZ2VpZnkoaXRlcklzU3VwZXJzZXQpOyRo4oCNX29uY2UuZWxlbWVudHNJc1N1cGVyc2V0KGVsZW1lbnRzSXNTdXBlcnNldCk7XG5jb25zdCAgICAgICAgZWxlbWVudHNJc0Rpc2pvaW50PW1lcmdlaWZ5KGl0ZXJJc0Rpc2pvaW50KTskaOKAjV9vbmNlLmVsZW1lbnRzSXNEaXNqb2ludChlbGVtZW50c0lzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzQ29tcGFyZT1tZXJnZWlmeShpdGVyQ29tcGFyZSk7JGjigI1fb25jZS5lbGVtZW50c0NvbXBhcmUoZWxlbWVudHNDb21wYXJlKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c1VuaW9uPW1lcmdlaWZ5KGl0ZXJVbmlvbik7JGjigI1fb25jZS5lbGVtZW50c1VuaW9uKGVsZW1lbnRzVW5pb24pO1xuY29uc3QgICAgICAgIGVsZW1lbnRzRGlzam9pbnRVbmlvbj1tZXJnZWlmeShpdGVyRGlzam9pbnRVbmlvbik7JGjigI1fb25jZS5lbGVtZW50c0Rpc2pvaW50VW5pb24oZWxlbWVudHNEaXNqb2ludFVuaW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0ludGVyc2VjdGlvbj1tZXJnZWlmeShpdGVySW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLmVsZW1lbnRzSW50ZXJzZWN0aW9uKGVsZW1lbnRzSW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3Q9bWVyZ2VpZnkoaXRlckRpc2pvaW50U3VidHJhY3QpOyRo4oCNX29uY2UuZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd1NldGlmeT0oZWxlbWVudHNPcCk9Pih4c2V0LHlzZXQpPT5cbmVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLHlzZXQucGF5bG9hZCk7XG5cbmNvbnN0IHNldGlmeT0oZWxlbWVudHNPcCk9Pih4c2V0LHlzZXQpPT5cbm1ha2VTZXRPZkVsZW1lbnRzKGVsZW1lbnRzT3AoeHNldC5wYXlsb2FkLHlzZXQucGF5bG9hZCkpO1xuXG5jb25zdCAgICAgICAgc2V0SXNTdXBlcnNldD1yYXdTZXRpZnkoZWxlbWVudHNJc1N1cGVyc2V0KTskaOKAjV9vbmNlLnNldElzU3VwZXJzZXQoc2V0SXNTdXBlcnNldCk7XG5jb25zdCAgICAgICAgc2V0SXNEaXNqb2ludD1yYXdTZXRpZnkoZWxlbWVudHNJc0Rpc2pvaW50KTskaOKAjV9vbmNlLnNldElzRGlzam9pbnQoc2V0SXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgc2V0Q29tcGFyZT1yYXdTZXRpZnkoZWxlbWVudHNDb21wYXJlKTskaOKAjV9vbmNlLnNldENvbXBhcmUoc2V0Q29tcGFyZSk7XG5jb25zdCAgICAgICAgc2V0VW5pb249c2V0aWZ5KGVsZW1lbnRzVW5pb24pOyRo4oCNX29uY2Uuc2V0VW5pb24oc2V0VW5pb24pO1xuY29uc3QgICAgICAgIHNldERpc2pvaW50VW5pb249c2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRVbmlvbik7JGjigI1fb25jZS5zZXREaXNqb2ludFVuaW9uKHNldERpc2pvaW50VW5pb24pO1xuY29uc3QgICAgICAgIHNldEludGVyc2VjdGlvbj1zZXRpZnkoZWxlbWVudHNJbnRlcnNlY3Rpb24pOyRo4oCNX29uY2Uuc2V0SW50ZXJzZWN0aW9uKHNldEludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgc2V0RGlzam9pbnRTdWJ0cmFjdD1zZXRpZnkoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLnNldERpc2pvaW50U3VidHJhY3Qoc2V0RGlzam9pbnRTdWJ0cmFjdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZWxlbWVudHNJc1N1cGVyc2V0IjpbImVsZW1lbnRzSXNTdXBlcnNldCJdLCJlbGVtZW50c0lzRGlzam9pbnQiOlsiZWxlbWVudHNJc0Rpc2pvaW50Il0sImVsZW1lbnRzQ29tcGFyZSI6WyJlbGVtZW50c0NvbXBhcmUiXSwiZWxlbWVudHNVbmlvbiI6WyJlbGVtZW50c1VuaW9uIl0sImVsZW1lbnRzRGlzam9pbnRVbmlvbiI6WyJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSwiZWxlbWVudHNJbnRlcnNlY3Rpb24iOlsiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IjpbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLCJzZXRJc1N1cGVyc2V0IjpbInNldElzU3VwZXJzZXQiXSwic2V0SXNEaXNqb2ludCI6WyJzZXRJc0Rpc2pvaW50Il0sInNldENvbXBhcmUiOlsic2V0Q29tcGFyZSJdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiJdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiJdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiQw7BTPDAAAzwwAANQAAAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi4vdXRpbHMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiTSIsImFzc2VydFBhdHRlcm4iLCJjaGVja01hdGNoZXMiLCJkZWZhdWx0TGltaXRzIiwiZ2V0UmFua0NvdmVyIiwiaXNQYXR0ZXJuIiwibWF0Y2hlcyIsIm11c3RNYXRjaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLEZhcixnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixoYXNPd25Qcm9wZXJ0eU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxjb21wYXJlUmFuayxnZXRQYXNzU3R5bGVDb3ZlcixpbnRlcnNlY3RSYW5rQ292ZXJzLHVuaW9uUmFua0NvdmVycyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMsaWRlbnRDaGVja2VyLGFwcGx5TGFiZWxpbmdFcnJvcixmcm9tVW5pcXVlRW50cmllcyxsaXN0RGlmZmVyZW5jZSxrZXlFUSxrZXlHVCxrZXlHVEUsa2V5TFQsa2V5TFRFLGFzc2VydEtleSxjaGVja0tleSxpc0tleSxjaGVja1NjYWxhcktleSxjaGVja0NvcHlTZXQsY2hlY2tDb3B5TWFwLGNvcHlNYXBLZXlTZXQsY2hlY2tDb3B5QmFnOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXSxbXCJnZXRQYXNzU3R5bGVDb3ZlclwiLCBbJGjigI1fYSA9PiAoZ2V0UGFzc1N0eWxlQ292ZXIgPSAkaOKAjV9hKV1dLFtcImludGVyc2VjdFJhbmtDb3ZlcnNcIiwgWyRo4oCNX2EgPT4gKGludGVyc2VjdFJhbmtDb3ZlcnMgPSAkaOKAjV9hKV1dLFtcInVuaW9uUmFua0NvdmVyc1wiLCBbJGjigI1fYSA9PiAodW5pb25SYW5rQ292ZXJzID0gJGjigI1fYSldXSxbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dLFtcIi4uL3V0aWxzLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiYXBwbHlMYWJlbGluZ0Vycm9yXCIsIFskaOKAjV9hID0+IChhcHBseUxhYmVsaW5nRXJyb3IgPSAkaOKAjV9hKV1dLFtcImZyb21VbmlxdWVFbnRyaWVzXCIsIFskaOKAjV9hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRo4oCNX2EpXV0sW1wibGlzdERpZmZlcmVuY2VcIiwgWyRo4oCNX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY29tcGFyZUtleXMuanNcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wia2V5R1RcIiwgWyRo4oCNX2EgPT4gKGtleUdUID0gJGjigI1fYSldXSxbXCJrZXlHVEVcIiwgWyRo4oCNX2EgPT4gKGtleUdURSA9ICRo4oCNX2EpXV0sW1wia2V5TFRcIiwgWyRo4oCNX2EgPT4gKGtleUxUID0gJGjigI1fYSldXSxbXCJrZXlMVEVcIiwgWyRo4oCNX2EgPT4gKGtleUxURSA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tLZXlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrS2V5ID0gJGjigI1fYSldXSxbXCJpc0tleVwiLCBbJGjigI1fYSA9PiAoaXNLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrU2NhbGFyS2V5XCIsIFskaOKAjV9hID0+IChjaGVja1NjYWxhcktleSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5U2V0XCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlTZXQgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weU1hcFwiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5TWFwID0gJGjigI1fYSldXSxbXCJjb3B5TWFwS2V5U2V0XCIsIFskaOKAjV9hID0+IChjb3B5TWFwS2V5U2V0ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlCYWdcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weUJhZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7cXVvdGU6cSxkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuY29uc3R7ZW50cmllcyx2YWx1ZXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKiBAdHlwZSB7V2Vha1NldDxQYXR0ZXJuPn0gKi9cbmNvbnN0IHBhdHRlcm5NZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGNoIEhlbHBlcnMgSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBGb3IgZm9yd2FyZCByZWZlcmVuY2VzIHRvIGBNYCAqL1xubGV0IE1NO1xuXG4vKipcbiAqIFRoZSBhY3R1YWwgZGVmYXVsdCB2YWx1ZXMgaGVyZSBhcmUsIGF0IHRoZSBwcmVzZW50IHRpbWUsIGZhaXJseVxuICogYXJiaXRyYXJ5IGNob2ljZXMgYW5kIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgc2V0dGxlIGRvd24uIE9mIGNvdXJzZVxuICogYXQgc29tZSBwb2ludCB3ZSdsbCBuZWVkIHRvIHN0b3AgY2hhbmdpbmcgdGhlbS4gQnV0IHdlIHNob3VsZCBmaXJzdFxuICogc2VlIGhvdyBvdXIgc3lzdGVtIGhvbGRzIHVwIHdpdGggdGhlc2UgY2hvaWNlcy4gVGhlIG1haW4gY3JpdGVyaWFcbiAqIGlzIHRoYXQgdGhleSBiZSBiaWcgZW5vdWdoIHRoYXQgXCJub3JtYWxcIiBpbm5vY2VudCBwcm9ncmFtcyByYXJlbHlcbiAqIGVuY291bnRlciB0aGVzZSBsaW1pdHMuXG4gKlxuICogRXhwb3J0ZWQgcHJpbWFyaWx5IGZvciB0ZXN0aW5nLlxuICovXG5jb25zdCAgICAgICAgZGVmYXVsdExpbWl0cz1oYXJkZW4oe1xuZGVjaW1hbERpZ2l0c0xpbWl0OjEwMCxcbnN0cmluZ0xlbmd0aExpbWl0OjEwMF8wMDAsXG5zeW1ib2xOYW1lTGVuZ3RoTGltaXQ6MTAwLFxubnVtUHJvcGVydGllc0xpbWl0OjgwLFxucHJvcGVydHlOYW1lTGVuZ3RoTGltaXQ6MTAwLFxuYXJyYXlMZW5ndGhMaW1pdDoxMF8wMDAsXG5udW1TZXRFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQ6MTBfMDAwLFxubnVtTWFwRW50cmllc0xpbWl0OjUwMDB9KTtcblxuXG4vKipcbiAqIFVzZSB0aGUgcmVzdWx0IG9ubHkgdG8gZ2V0IHRoZSBsaW1pdHMgeW91IG5lZWQgYnkgZGVzdHJ1Y3R1cmluZy5cbiAqIFRodXMsIHRoZSByZXN1bHQgb25seSBuZWVkcyB0byBzdXBwb3J0IGRlc3RydWN0dXJpbmcuIFRoZSBjdXJyZW50XG4gKiBpbXBsZW1lbnRhdGlvbiB1c2VzIGluaGVyaXRhbmNlIGFzIGEgY2hlYXAgaGFjay5cbiAqXG4gKiBAcGFyYW0ge0xpbWl0c30gW2xpbWl0c11cbiAqIEByZXR1cm5zIHtBbGxMaW1pdHN9XG4gKi8kaOKAjV9vbmNlLmRlZmF1bHRMaW1pdHMoZGVmYXVsdExpbWl0cyk7XG5jb25zdCBsaW1pdD0obGltaXRzPXt9KT0+XG4vKiogQHR5cGUge0FsbExpbWl0c30gKi9oYXJkZW4oe19fcHJvdG9fXzpkZWZhdWx0TGltaXRzLC4uLmxpbWl0c30pO1xuXG5jb25zdCBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdD0oXG5wYXlsb2FkLFxubWFpblBheWxvYWRTaGFwZSxcbmNoZWNrLFxubGFiZWwpPT5cbntcbmFzc2VydChBcnJheS5pc0FycmF5KG1haW5QYXlsb2FkU2hhcGUpKTtcbmlmKCFBcnJheS5pc0FycmF5KHBheWxvYWQpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIG11c3QgYmUgYW4gYXJyYXk6ICR7cGF5bG9hZH1gKTtcbiB9XG5cbi8qIFdhcyB0aGUgZm9sbG93aW5nLCBidXQgaXRzIG92ZXJ1c2Ugb2YgcGF0dGVybnMgY2F1c2VkIGFuIGluZmluaXRlIHJlZ3Jlc3MqL1xuLyogY29uc3QgcGF5bG9hZExpbWl0U2hhcGUgPSBoYXJkZW4oKi9cbi8qIE0uc3BsaXQoKi9cbi8qIG1haW5QYXlsb2FkU2hhcGUsKi9cbi8qIE0ucGFydGlhbChoYXJkZW4oW00ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5udW1iZXIoKSldKSwgaGFyZGVuKFtdKSksKi9cbi8qICksKi9cbi8qICk7Ki9cbi8qIHJldHVybiBjaGVja01hdGNoZXMocGF5bG9hZCwgcGF5bG9hZExpbWl0U2hhcGUsIGNoZWNrLCBsYWJlbCk7Ki9cblxuY29uc3QgbWFpbkxlbmd0aD1tYWluUGF5bG9hZFNoYXBlLmxlbmd0aDtcbmlmKCEocGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RofHxwYXlsb2FkLmxlbmd0aD09PW1haW5MZW5ndGgrMSkpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7cShsYWJlbCl9IHBheWxvYWQgdW5leHBlY3RlZCBzaXplOiAke3BheWxvYWR9YCk7XG4gfVxuY29uc3QgbGltaXRzPXBheWxvYWRbbWFpbkxlbmd0aF07XG5wYXlsb2FkPWhhcmRlbihwYXlsb2FkLnNsaWNlKDAsbWFpbkxlbmd0aCkpO1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFjaGVja01hdGNoZXMocGF5bG9hZCxtYWluUGF5bG9hZFNoYXBlLGNoZWNrLGxhYmVsKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuaWYobGltaXRzPT09dW5kZWZpbmVkKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbihwYXNzU3R5bGVPZihsaW1pdHMpPT09J2NvcHlSZWNvcmQnfHxcbmNoZWNrKGZhbHNlLFggYExpbWl0cyBtdXN0IGJlIGEgcmVjb3JkOiAke3EobGltaXRzKX1gKSkmJlxuZW50cmllcyhsaW1pdHMpLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5wYXNzU3R5bGVPZih2YWx1ZSk9PT0nbnVtYmVyJ3x8XG5jaGVjayhmYWxzZSxYIGBWYWx1ZSBvZiBsaW1pdCAke3Eoa2V5KX0gYnV0IGJlIGEgbnVtYmVyOiAke3EodmFsdWUpfWApKSk7XG5cblxuIH07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHBhcmFtIHtudW1iZXJ9IGRlY2ltYWxEaWdpdHNMaW1pdFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICovXG5jb25zdCBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdD0oc3BlY2ltZW4sZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrKT0+e1xuaWYoXG5NYXRoLmZsb29yKE1hdGgubG9nMTAoTWF0aC5hYnMoTnVtYmVyKHNwZWNpbWVuKSkpKSsxPD1cbmRlY2ltYWxEaWdpdHNMaW1pdClcbntcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgYmlnaW50ICR7c3BlY2ltZW59IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7ZGVjaW1hbERpZ2l0c0xpbWl0fSBkaWdpdHNgKTtcblxuIH07XG5cbi8qKlxuICogQHJldHVybnMge1BhdHRlcm5LaXR9XG4gKi9cbmNvbnN0IG1ha2VQYXR0ZXJuS2l0PSgpPT57XG4vKipcbiAqIElmIHRoaXMgaXMgYSByZWNvZ25pemVkIG1hdGNoIHRhZywgcmV0dXJuIHRoZSBNYXRjaEhlbHBlci5cbiAqIE90aGVyd2lzZSByZXN1bHQgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEByZXR1cm5zIHtNYXRjaEhlbHBlciB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgbWF5YmVNYXRjaEhlbHBlcj0odGFnKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuSGVscGVyc0J5TWF0Y2hUYWdbdGFnXTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nfSBLaW5kXG4gKiBJdCBpcyBlaXRoZXIgYSBQYXNzU3R5bGUgb3RoZXIgdGhhbiAndGFnZ2VkJywgb3IsIGlmIHRoZSB1bmRlcmx5aW5nXG4gKiBQYXNzU3R5bGUgaXMgJ3RhZ2dlZCcsIHRoZW4gdGhlIGBnZXRUYWdgIHZhbHVlIGZvciB0YWdzIHRoYXQgYXJlXG4gKiByZWNvZ25pemVkIGF0IHRoZSBzdG9yZSBsZXZlbCBvZiBhYnN0cmFjdGlvbi4gRm9yIGVhY2ggb2YgdGhvc2VcbiAqIHRhZ3MsIGEgdGFnZ2VkIHJlY29yZCBvbmx5IGhhcyB0aGF0IGtpbmQgaWYgaXQgc2F0aXNmaWVzIHRoZSBpbnZhcmlhbnRzXG4gKiB0aGF0IHRoZSBzdG9yZSBsZXZlbCBhc3NvY2lhdGVzIHdpdGggdGhhdCBraW5kLlxuICovXG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8Q29weVRhZ2dlZCwgS2luZD59XG4gKiBPbmx5IGZvciB0YWdnZWQgcmVjb3JkcyBvZiByZWNvZ25pemVkIGtpbmRzIHdob3NlIHN0b3JlLWxldmVsIGludmFyaWFudHNcbiAqIGhhdmUgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gKi9cbmNvbnN0IHRhZ01lbW89bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIHRhZ3MsIGFuZCBvbmx5IGlmIHRoZSB0YWdnZWRcbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB0YWdnZWRcbiAqIEBwYXJhbSB7S2luZH0gdGFnXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tUYWdnZWQ9KHRhZ2dlZCx0YWcsY2hlY2spPT57XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCh0YWdnZWQucGF5bG9hZCxjaGVjayk7XG4gfVxuc3dpdGNoKHRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbnJldHVybiBjaGVja0NvcHlTZXQodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbnJldHVybiBjaGVja0NvcHlCYWcodGFnZ2VkLGNoZWNrKTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbnJldHVybiBjaGVja0NvcHlNYXAodGFnZ2VkLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9OiAke3RhZ2dlZH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgb25seSBhIHJlY29nbml6ZWQga2luZCwgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuIHBhc3NlcyB0aGVcbiAqIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKiBPdGhlcndpc2UsIGBjaGVjayhmYWxzZSwgLi4uKWAgYW5kIHJldHVybnMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge0tpbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGtpbmRPZj0oc3BlY2ltZW4sY2hlY2s9aWRlbnRDaGVja2VyKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHBhc3NTdHlsZSE9PSd0YWdnZWQnKXtcbnJldHVybiBwYXNzU3R5bGU7XG4gfVxuLyogQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoYXQgc3BlY2ltZW4gaXMgYSB3ZWxsIGZvcm1lZCovXG4vKiBhcyBhIHRhZ2dlZCByZWNvcmQsIHdoaWNoIGlzIGRlZmluZWQgYXQgdGhlIG1hcnNoYWwgbGV2ZWwgb2YgYWJzdHJhY3Rpb24sKi9cbi8qIHNpbmNlIGBwYXNzU3R5bGVPZmAgY2hlY2tzIHRob3NlIGludmFyaWFudHMuKi9cbmlmKHRhZ01lbW8uaGFzKHNwZWNpbWVuKSl7XG5yZXR1cm4gdGFnTWVtby5nZXQoc3BlY2ltZW4pO1xuIH1cbmNvbnN0IHRhZz1nZXRUYWcoc3BlY2ltZW4pO1xuaWYoY2hlY2tUYWdnZWQoc3BlY2ltZW4sdGFnLGNoZWNrKSl7XG50YWdNZW1vLnNldChzcGVjaW1lbix0YWcpO1xucmV0dXJuIHRhZztcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG5jaGVjayhmYWxzZSxYIGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX1gKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07XG5oYXJkZW4oa2luZE9mKTtcblxuLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIGtpbmRzLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW5cbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLaW5kfSBraW5kXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLaW5kPShzcGVjaW1lbixraW5kLGNoZWNrKT0+e1xuY29uc3QgcmVhbEtpbmQ9a2luZE9mKHNwZWNpbWVuLGNoZWNrKTtcbmlmKGtpbmQ9PT1yZWFsS2luZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG4vKiBxdW90aW5nIHdpdGhvdXQgcXVvdGVzKi9cbmNvbnN0IGRldGFpbHM9WChbIGAke3JlYWxLaW5kfSBgLGAgLSBNdXN0IGJlIGEgJHtraW5kfWBdLHNwZWNpbWVuKTtcbmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuIH1cbnJldHVybiBmYWxzZTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tleX0ga2V5QXNQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tBc0tleVBhdHQ9KHNwZWNpbWVuLGtleUFzUGF0dGVybixjaGVjayk9PntcbmlmKGtleUVRKHNwZWNpbWVuLGtleUFzUGF0dGVybikpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlOiAke2tleUFzUGF0dGVybn1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBpc1BhdHRlcm4gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge0NoZWNrUGF0dGVybn0gKi9cbmNvbnN0IGNoZWNrUGF0dGVybj0ocGF0dCxjaGVjayk9PntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIEFsbCBrZXlzIGFyZSBwYXR0ZXJucy4gRm9yIHRoZXNlLCB0aGUga2V5TWVtbyB3aWxsIGRvLiovXG4vKiBBbGwgcHJpbWl0aXZlcyB0aGF0IGFyZSBwYXR0ZXJucyBhcmUgYWxzbyBrZXlzLCB3aGljaCB0aGlzKi9cbi8qIGFsc28gdGFrZXMgY2FyZSBvZiB3aXRob3V0IG1lbW8uIFRoZSByZXN0IG9mIG91ciBjaGVja2luZyBsb2dpYyovXG4vKiBpcyBvbmx5IGNvbmNlcm5lZCB3aXRoIG5vbi1rZXkgcGF0dGVybnMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmlmKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcmVzdWx0PWNoZWNrUGF0dGVybkludGVybmFsKHBhdHQsY2hlY2spO1xuaWYocmVzdWx0KXtcbnBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGF0dCAtIGtub3duIG5vdCB0byBiZSBhIGtleSwgYW5kIHRoZXJlZm9yZSBrbm93blxuICogbm90IHRvIGJlIHByaW1pdGl2ZS5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbD0ocGF0dCxjaGVjayk9Pntcbi8qIFB1cnBvc2VseSBwYXJhbGxlbHMgY2hlY2tLZXkuIFRPRE8gcmV1c2UgbW9yZSBsb2dpYyBiZXR3ZWVuIHRoZW0uKi9cbi8qIE1vc3Qgb2YgdGhlIHRleHQgb2YgdGhlIHN3aXRjaCBiZWxvdyBub3QgZGVhbGluZyB3aXRoIG1hdGNoZXJzIGlzKi9cbi8qIGVzc2VudGlhbGx5IGlkZW50aWNhbC4qL1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja1BhdHRlcm4oY2hpbGQsY2hlY2spO1xuXG5jb25zdCBraW5kPWtpbmRPZihwYXR0LGNoZWNrKTtcbnN3aXRjaChraW5kKXtcbmNhc2UgdW5kZWZpbmVkOntcbnJldHVybiBmYWxzZTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiB2YWx1ZXMocGF0dCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIEEgY29weUFycmF5IGlzIGEgcGF0dGVybiBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUqL1xuLyogcGF0dGVybnMqL1xucmV0dXJuIHBhdHQuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBrZXlzIGFuZCB0aGVyZWZvcmUgYWxyZWFkeSBrbm93biB0byBiZSovXG4vKiBwYXR0ZXJucy4qL1xuLyogQSBjb3B5TWFwIGlzIGEgcGF0dGVybiBpZiBpdHMgdmFsdWVzIGFyZSBwYXR0ZXJucy4qL1xucmV0dXJuIGNoZWNrUGF0dGVybihwYXR0LnZhbHVlcyxjaGVjayk7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShraW5kKX0gY2Fubm90IGJlIGEgcGF0dGVybmApO1xuIH1cbmRlZmF1bHQ6e1xuaWYobWF5YmVNYXRjaEhlbHBlcihraW5kKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH19XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpc1BhdHRlcm49KHBhdHQpPT5jaGVja1BhdHRlcm4ocGF0dCxpZGVudENoZWNrZXIpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICovXG5jb25zdCBhc3NlcnRQYXR0ZXJuPShwYXR0KT0+e1xuY2hlY2tQYXR0ZXJuKHBhdHQsYXNzZXJ0Q2hlY2tlcik7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gbWF0Y2hlcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja01hdGNoZXM9KHNwZWNpbWVuLHBhdHRlcm4sY2hlY2ssbGFiZWw9dW5kZWZpbmVkKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuYXBwbHlMYWJlbGluZ0Vycm9yKGNoZWNrTWF0Y2hlc0ludGVybmFsLFtzcGVjaW1lbixwYXR0ZXJuLGNoZWNrXSxsYWJlbCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTWF0Y2hlc0ludGVybmFsPShzcGVjaW1lbixwYXR0LGNoZWNrKT0+e1xuLyogV29ydGggYmVpbmcgYSBiaXQgdmVyYm9zZSBhbmQgcmVwZXRpdGl2ZSBpbiBvcmRlciB0byBvcHRpbWl6ZSovXG5jb25zdCBwYXR0ZXJuS2luZD1raW5kT2YocGF0dCxjaGVjayk7XG5jb25zdCBzcGVjaW1lbktpbmQ9a2luZE9mKHNwZWNpbWVuKTsvKiBtYXkgYmUgdW5kZWZpbmVkKi9cbnN3aXRjaChwYXR0ZXJuS2luZCl7XG5jYXNlIHVuZGVmaW5lZDp7XG5yZXR1cm4gRmFpbCBgcGF0dGVybiBleHBlY3RlZDogJHtwYXR0fWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gRmFpbCBgcHJvbWlzZXMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5yZXR1cm4gRmFpbCBgZXJyb3JzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ3N5bWJvbCc6XG5jYXNlJ2NvcHlTZXQnOlxuY2FzZSdjb3B5QmFnJzpcbmNhc2UncmVtb3RhYmxlJzp7XG4vKiBUaGVzZSBraW5kcyBhcmUgbmVjZXNzYXJpbHkga2V5cyovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5QXJyYXknKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weUFycmF5IHRvIG1hdGNoIGEgY29weUFycmF5IHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbmNvbnN0e2xlbmd0aH09cGF0dDtcbmlmKHNwZWNpbWVuLmxlbmd0aCE9PWxlbmd0aCl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEFycmF5ICR7c3BlY2ltZW59IC0gTXVzdCBiZSBhcyBsb25nIGFzIGNvcHlBcnJheSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG5yZXR1cm4gcGF0dC5ldmVyeSgocCxpKT0+Y2hlY2tNYXRjaGVzKHNwZWNpbWVuW2ldLHAsY2hlY2ssaSkpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlSZWNvcmQnKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weVJlY29yZCB0byBtYXRjaCBhIGNvcHlSZWNvcmQgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuLyogVE9ETyBEZXRlY3QgYW5kIGFjY3VtdWxhdGUgZGlmZmVyZW5jZSBpbiBvbmUgcGFzcy4qL1xuLyogUmF0aGVyIHRoYW4gdXNpbmcgdHdvIGNhbGxzIHRvIGBsaXN0RGlmZmVyZW5jZWAgdG8gZGV0ZWN0IGFuZCovXG4vKiByZXBvcnQgaWYgYW5kIGhvdyB0aGVzZSBsaXN0cyBkaWZmZXIsIHNpbmNlIHRoZXkgYXJlIGFscmVhZHkqL1xuLyogaW4gc29ydGVkIG9yZGVyLCB3ZSBzaG91bGQgaW5zdGVhZCB1c2UgYW4gYWxnb3JpdGhtIGxpa2UqL1xuLyogYGl0ZXJEaXNqb2ludFVuaW9uYCBmcm9tIG1lcmdlLXNvcnQtb3BlcmF0b3JzLmpzKi9cbmNvbnN0IHNwZWNpbWVuTmFtZXM9cmVjb3JkTmFtZXMoc3BlY2ltZW4pO1xuY29uc3QgcGF0dE5hbWVzPXJlY29yZE5hbWVzKHBhdHQpO1xuY29uc3QgbWlzc2luZz1saXN0RGlmZmVyZW5jZShwYXR0TmFtZXMsc3BlY2ltZW5OYW1lcyk7XG5pZihtaXNzaW5nLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBoYXZlIG1pc3NpbmcgcHJvcGVydGllcyAke3EobWlzc2luZyl9YCk7XG5cbiB9XG5jb25zdCB1bmV4cGVjdGVkPWxpc3REaWZmZXJlbmNlKHNwZWNpbWVuTmFtZXMscGF0dE5hbWVzKTtcbmlmKHVuZXhwZWN0ZWQubGVuZ3RoPj0xKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG5vdCBoYXZlIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKFxudW5leHBlY3RlZClcbiB9YCk7XG5cbiB9XG5jb25zdCBzcGVjaW1lblZhbHVlcz1yZWNvcmRWYWx1ZXMoc3BlY2ltZW4sc3BlY2ltZW5OYW1lcyk7XG5jb25zdCBwYXR0VmFsdWVzPXJlY29yZFZhbHVlcyhwYXR0LHBhdHROYW1lcyk7XG5yZXR1cm4gcGF0dE5hbWVzLmV2ZXJ5KChsYWJlbCxpKT0+XG5jaGVja01hdGNoZXMoc3BlY2ltZW5WYWx1ZXNbaV0scGF0dFZhbHVlc1tpXSxjaGVjayxsYWJlbCkpO1xuXG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weU1hcCcpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5TWFwIHRvIG1hdGNoIGEgY29weU1hcCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG5jb25zdHtwYXlsb2FkOnBhdHRQYXlsb2FkfT1wYXR0O1xuY29uc3R7cGF5bG9hZDpzcGVjaW1lblBheWxvYWR9PXNwZWNpbWVuO1xuY29uc3QgcGF0dEtleVNldD1jb3B5TWFwS2V5U2V0KHBhdHRQYXlsb2FkKTtcbmNvbnN0IHNwZWNpbWVuS2V5U2V0PWNvcHlNYXBLZXlTZXQoc3BlY2ltZW5QYXlsb2FkKTtcbi8qIENvbXBhcmUga2V5cyBhcyBjb3B5U2V0cyovXG5pZighY2hlY2tNYXRjaGVzKHNwZWNpbWVuS2V5U2V0LHBhdHRLZXlTZXQsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBwYXR0VmFsdWVzPXBhdHRQYXlsb2FkLnZhbHVlcztcbmNvbnN0IHNwZWNpbWVuVmFsdWVzPXNwZWNpbWVuUGF5bG9hZC52YWx1ZXM7XG4vKiBjb21wYXJlIHZhbHVlcyBhcyBjb3B5QXJyYXlzKi9cbnJldHVybiBjaGVja01hdGNoZXMoc3BlY2ltZW5WYWx1ZXMscGF0dFZhbHVlcyxjaGVjayk7XG4gfVxuZGVmYXVsdDp7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHBhdHRlcm5LaW5kKTtcbmlmKG1hdGNoSGVscGVyKXtcbnJldHVybiBtYXRjaEhlbHBlci5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dC5wYXlsb2FkLGNoZWNrKTtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogc2hvdWxkIGhhdmUgcmVjb2duaXplZCAke3EocGF0dGVybktpbmQpfSBgO1xuIH19XG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBtYXRjaGVzPShzcGVjaW1lbixwYXR0KT0+XG5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxpZGVudENoZWNrZXIpO1xuXG4vKipcbiAqIFJldHVybmluZyBub3JtYWxseSBpbmRpY2F0ZXMgc3VjY2Vzcy4gTWF0Y2ggZmFpbHVyZSBpcyBpbmRpY2F0ZWQgYnlcbiAqIHRocm93aW5nLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICovXG5jb25zdCBtdXN0TWF0Y2g9KHNwZWNpbWVuLHBhdHQsbGFiZWw9dW5kZWZpbmVkKT0+e1xuaWYoY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyLGxhYmVsKSl7XG5yZXR1cm47XG4gfVxuLyogc2hvdWxkIG9ubHkgdGhyb3cqL1xuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsYXNzZXJ0Q2hlY2tlcixsYWJlbCk7XG5GYWlsIGBpbnRlcm5hbDogJHtsYWJlbH06IGluY29uc2lzdGVudCBwYXR0ZXJuIG1hdGNoOiAke3EocGF0dCl9YDtcbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBnZXRSYW5rQ292ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge0dldFJhbmtDb3Zlcn0gKi9cbmNvbnN0IGdldFJhbmtDb3Zlcj0ocGF0dCxlbmNvZGVQYXNzYWJsZSk9PntcbmlmKGlzS2V5KHBhdHQpKXtcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUGFzc2FibGUocGF0dCk7XG5pZihlbmNvZGVkIT09dW5kZWZpbmVkKXtcbnJldHVybltlbmNvZGVkLCBgJHtlbmNvZGVkfX5gXTtcbiB9XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhdHQpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5QXJyYXlzLiovXG4vKiovXG4vKiBjb25zdCByYW5rQ292ZXJzID0gcGF0dC5tYXAocCA9PiBnZXRSYW5rQ292ZXIocCwgZW5jb2RlUGFzc2FibGUpKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIHJhbmtDb3ZlcnMubWFwKChbbGVmdCwgX3JpZ2h0XSkgPT4gbGVmdCksKi9cbi8qIHJhbmtDb3ZlcnMubWFwKChbX2xlZnQsIHJpZ2h0XSkgPT4gcmlnaHQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlSZWNvcmRzLiovXG4vKiovXG4vKiBjb25zdCBwYXR0S2V5cyA9IG93bktleXMocGF0dCk7Ki9cbi8qIGNvbnN0IHBhdHRFbnRyaWVzID0gaGFyZGVuKHBhdHRLZXlzLm1hcChrZXkgPT4gW2tleSwgcGF0dFtrZXldXSkpOyovXG4vKiBjb25zdCBbbGVmdEVudHJpZXNMaW1pdCwgcmlnaHRFbnRyaWVzTGltaXRdID0qL1xuLyogZ2V0UmFua0NvdmVyKHBhdHRFbnRyaWVzKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIGZyb21VbmlxdWVFbnRyaWVzKGxlZnRFbnRyaWVzTGltaXQpLCovXG4vKiBmcm9tVW5pcXVlRW50cmllcyhyaWdodEVudHJpZXNMaW1pdCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3QgdGFnPWdldFRhZyhwYXR0KTtcbmNvbnN0IG1hdGNoSGVscGVyPW1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbmlmKG1hdGNoSGVscGVyKXtcbi8qIEJ1cmllZCBoZXJlIGlzIHRoZSBpbXBvcnRhbnQgY2FzZSwgd2hlcmUgd2UgcHJvY2VzcyovXG4vKiB0aGUgdmFyaW91cyBwYXR0ZXJuTm9kZXMqL1xucmV0dXJuIG1hdGNoSGVscGVyLmdldFJhbmtDb3ZlcihwYXR0LnBheWxvYWQsZW5jb2RlUGFzc2FibGUpO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlTZXRzLiovXG4vKiovXG4vKiAvLyBTaG91bGQgYWxyZWFkeSBiZSB2YWxpZGF0ZWQgYnkgY2hlY2tQYXR0ZXJuLiBCdXQgYmVjYXVzZSB0aGlzKi9cbi8qIC8vIGlzIGEgY2hlY2sgdGhhdCBtYXkgbG9vc2VuIG92ZXIgdGltZSwgd2UgYWxzbyBhc3NlcnQqL1xuLyogLy8gZXZlcnl3aGVyZSB3ZSBzdGlsbCByZWx5IG9uIHRoZSByZXN0cmljdGlvbi4qL1xuLyogYGBganMqL1xuLyogcGF0dC5wYXlsb2FkLmxlbmd0aCA9PT0gMSB8fCovXG4vKiBGYWlsYE5vbi1zaW5nbGV0b24gY29weVNldHMgd2l0aCBtYXRjaGVyIG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7cGF0dH1gOyovXG4vKiBgYGAqL1xuLyoqL1xuLyogY29uc3QgW2xlZnRFbGVtZW50TGltaXQsIHJpZ2h0RWxlbWVudExpbWl0XSA9IGdldFJhbmtDb3ZlcigqL1xuLyogcGF0dC5wYXlsb2FkWzBdLCovXG4vKiApOyovXG4vKiByZXR1cm4gaGFyZGVuKFsqL1xuLyogbWFrZUNvcHlTZXQoW2xlZnRFbGVtZW50TGltaXRdKSwqL1xuLyogbWFrZUNvcHlTZXQoW3JpZ2h0RWxlbWVudExpbWl0XSksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weU1hcHMuKi9cbi8qKi9cbi8qIC8vIEEgbWF0Y2hpbmcgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUga2V5cywgb3IgYXQgbW9zdCBvbmUqL1xuLyogLy8gbm9uLWtleSBrZXkgcGF0dGVybi4gVGh1cyB3ZSBjYW4gYXNzdW1lIHRoYXQgdmFsdWUgcG9zaXRpb25zKi9cbi8qIC8vIG1hdGNoIDEtdG8tMS4qL1xuLyogLy8qL1xuLyogLy8gVE9ETyBJIG1heSBiZSBvdmVybG9va2luZyB0aGF0IHRoZSBsZXNzIHByZWNpc2UgcmFua09yZGVyKi9cbi8qIC8vIGVxdWl2YWxlbmNlIGNsYXNzIG1heSBjYXVzZSB2YWx1ZXMgdG8gYmUgb3V0IG9mIG9yZGVyLCovXG4vKiAvLyBtYWtpbmcgdGhpcyByYW5rQ292ZXIgbm90IGFjdHVhbGx5IGNvdmVyLiBJbiB0aGF0IGNhc2UsIGZvciovXG4vKiAvLyBhbGwgdGhlIHZhbHVlcyBmb3Iga2V5cyBhdCB0aGUgc2FtZSByYW5rLCB3ZSBzaG91bGQgdW5pb24gdGhlaXIqL1xuLyogLy8gcmFuayBjb3ZlcnMuIFRPRE8gUE9TU0lCTEUgU0lMRU5UIENPUlJFQ1RORVNTIEJVRyovXG4vKiAvLyovXG4vKiAvLyBJZiB0aGlzIGlzIGEgYnVnLCBpdCBwcm9iYWJseSBhZmZlY3RzIHRoZSBnZXRSYW5rQ292ZXIqL1xuLyogLy8gY2FzZXMgb2YgbWF0Y2hMVEVIZWxwZXIgYW5kIG1hdGNoR1RFSGVscGVyIG9uIGNvcHlNYXAgYXMqL1xuLyogLy8gd2VsbC4gU2VlIG1ha2VDb3B5TWFwIGZvciBhbiBpZGVhIG9uIGZpeGluZyovXG4vKiAvLyB0aGlzIGJ1Zy4qL1xuLyogY29uc3QgW2xlZnRQYXlsb2FkTGltaXQsIHJpZ2h0UGF5bG9hZExpbWl0XSA9IGdldFJhbmtDb3ZlcigqL1xuLyogcGF0dC5wYXlsb2FkLCovXG4vKiBlbmNvZGVQYXNzYWJsZSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCBsZWZ0UGF5bG9hZExpbWl0KSwqL1xuLyogbWFrZVRhZ2dlZCgnY29weU1hcCcsIHJpZ2h0UGF5bG9hZExpbWl0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuYnJlYWs7LyogZmFsbCB0aHJvdWdoIHRvIGRlZmF1bHQqL1xuIH19XG5cbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9fVxuXG5yZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbiB9O1xuXG5jb25zdCBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuPShhcnJheSxwYXR0LGNoZWNrLGxhYmVsUHJlZml4PScnKT0+e1xuaWYoY2hlY2tLaW5kKHBhdHQsJ21hdGNoOmFueScsaWRlbnRDaGVja2VyKSl7XG4vKiBpZiB0aGUgcGF0dGVybiBpcyBNLmFueSgpLCB3ZSBrbm93IGl0cyB0cnVlKi9cbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBhcnJheS5ldmVyeSgoZWwsaSk9PlxuY2hlY2tNYXRjaGVzKGVsLHBhdHQsY2hlY2ssIGAke2xhYmVsUHJlZml4fVske2l9XWApKTtcblxuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1hdGNoIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFueUhlbHBlcj1GYXIoJ21hdGNoOmFueSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooX3NwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxfY2hlY2spPT50cnVlLFxuXG5jaGVja0lzV2VsbEZvcm1lZDoobWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbm1hdGNoZXJQYXlsb2FkPT09dW5kZWZpbmVkfHxcbmNoZWNrKGZhbHNlLFggYG1hdGNoOmFueSBwYXlsb2FkOiAke21hdGNoZXJQYXlsb2FkfSAtIE11c3QgYmUgdW5kZWZpbmVkYCksXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5bJycsJ3snXX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFuZEhlbHBlcj1GYXIoJ21hdGNoOmFuZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scGF0dHMsY2hlY2spPT57XG5yZXR1cm4gcGF0dHMuZXZlcnkoKHBhdHQpPT5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxjaGVjaykpO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkUGF0dHMsY2hlY2spPT57XG5jb25zdCBjaGVja0l0PShwYXR0KT0+Y2hlY2tQYXR0ZXJuKHBhdHQsY2hlY2spO1xucmV0dXJuKFxuKHBhc3NTdHlsZU9mKGFsbGVnZWRQYXR0cyk9PT0nY29weUFycmF5J3x8XG5jaGVjayhmYWxzZSxYIGBOZWVkcyBhcnJheSBvZiBzdWItcGF0dGVybnM6ICR7YWxsZWdlZFBhdHRzfWApKSYmXG5hbGxlZ2VkUGF0dHMuZXZlcnkoY2hlY2tJdCkpO1xuXG4gfSxcblxuZ2V0UmFua0NvdmVyOihwYXR0cyxlbmNvZGVQYXNzYWJsZSk9PlxuaW50ZXJzZWN0UmFua0NvdmVycyhcbmNvbXBhcmVSYW5rLFxucGF0dHMubWFwKChwKT0+Z2V0UmFua0NvdmVyKHAsZW5jb2RlUGFzc2FibGUpKSl9KTtcblxuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaE9ySGVscGVyPUZhcignbWF0Y2g6b3IgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHRzLGNoZWNrKT0+e1xuY29uc3R7bGVuZ3RofT1wYXR0cztcbmlmKGxlbmd0aD09PTApe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIG5vIHBhdHRlcm4gZGlzanVuY3RzIHRvIG1hdGNoOiAke3BhdHRzfWApO1xuXG4gfVxuaWYoXG5wYXR0cy5sZW5ndGg9PT0yJiZcbiFtYXRjaGVzKHNwZWNpbWVuLHBhdHRzWzBdKSYmXG5jaGVja0tpbmQocGF0dHNbMF0sJ21hdGNoOmtpbmQnLGlkZW50Q2hlY2tlcikmJlxucGF0dHNbMF0ucGF5bG9hZD09PSd1bmRlZmluZWQnKVxue1xuLyogV29ydGggc3BlY2lhbCBjYXNpbmcgdGhlIG9wdGlvbmFsIHBhdHRlcm4gZm9yKi9cbi8qIGJldHRlciBlcnJvciBtZXNzYWdlcy4qL1xucmV0dXJuIGNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0c1sxXSxjaGVjayk7XG4gfVxuaWYocGF0dHMuc29tZSgocGF0dCk9Pm1hdGNoZXMoc3BlY2ltZW4scGF0dCkpKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgbWF0Y2ggb25lIG9mICR7cGF0dHN9YCk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6bWF0Y2hBbmRIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbmdldFJhbmtDb3ZlcjoocGF0dHMsZW5jb2RlUGFzc2FibGUpPT5cbnVuaW9uUmFua0NvdmVycyhcbmNvbXBhcmVSYW5rLFxucGF0dHMubWFwKChwKT0+Z2V0UmFua0NvdmVyKHAsZW5jb2RlUGFzc2FibGUpKSl9KTtcblxuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaE5vdEhlbHBlcj1GYXIoJ21hdGNoOm5vdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scGF0dCxjaGVjayk9PntcbmlmKG1hdGNoZXMoc3BlY2ltZW4scGF0dCkpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgZmFpbCBuZWdhdGVkIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1lbHNle1xucmV0dXJuIHRydWU7XG4gfVxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrUGF0dGVybixcblxuZ2V0UmFua0NvdmVyOihfcGF0dCxfZW5jb2RlUGFzc2FibGUpPT5bJycsJ3snXX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNjYWxhckhlbHBlcj1GYXIoJ21hdGNoOnNjYWxhciBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1NjYWxhcktleShzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEtleUhlbHBlcj1GYXIoJ21hdGNoOmtleSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja0tleShzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFBhdHRlcm5IZWxwZXI9RmFyKCdtYXRjaDpwYXR0ZXJuIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbmNoZWNrUGF0dGVybihzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEtpbmRIZWxwZXI9RmFyKCdtYXRjaDpraW5kIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOmNoZWNrS2luZCxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRLZXlLaW5kLGNoZWNrKT0+XG50eXBlb2YgYWxsZWdlZEtleUtpbmQ9PT0nc3RyaW5nJ3x8XG5jaGVjayhcbmZhbHNlLFxuWCBgbWF0Y2g6a2luZDogcGF5bG9hZDogJHthbGxlZ2VkS2V5S2luZH0gLSBBIGtpbmQgbmFtZSBtdXN0IGJlIGEgc3RyaW5nYCksXG5cblxuZ2V0UmFua0NvdmVyOihraW5kLF9lbmNvZGVQYXNzYWJsZSk9PntcbmxldCBzdHlsZTtcbnN3aXRjaChraW5kKXtcbmNhc2UnY29weVNldCc6XG5jYXNlJ2NvcHlNYXAnOntcbnN0eWxlPSd0YWdnZWQnO1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5zdHlsZT1raW5kO1xuYnJlYWs7XG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHN0eWxlKTtcbiB9fSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQmlnaW50SGVscGVyPUZhcignbWF0Y2g6YmlnaW50IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2JpZ2ludCcsY2hlY2spJiZcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpiaWdpbnQgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaE5hdEhlbHBlcj1GYXIoJ21hdGNoOm5hdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVjayhcbi8qKiBAdHlwZSB7YmlnaW50fSAqL3NwZWNpbWVuPj0wbixcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBub24tbmVnYXRpdmVgKSYmXG5cbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpuYXQgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbi8qIFRPRE8gQ291bGQgYmUgbW9yZSBwcmVjaXNlKi9cbmdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFN0cmluZ0hlbHBlcj1GYXIoJ21hdGNoOnN0cmluZyBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7c3RyaW5nTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG4vKiBwcmV0dGllci1pZ25vcmUqL1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdzdHJpbmcnLGNoZWNrKSYmKFxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xuLyoqIEB0eXBlIHtzdHJpbmd9ICovc3BlY2ltZW4ubGVuZ3RoPD1zdHJpbmdMZW5ndGhMaW1pdHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgc3RyaW5nICR7c3BlY2ltZW59IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3RyaW5nTGVuZ3RoTGltaXR9YCkpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpzdHJpbmcgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdzdHJpbmcnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFN5bWJvbEhlbHBlcj1GYXIoJ21hdGNoOnN5bWJvbCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7c3ltYm9sTmFtZUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnc3ltYm9sJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHN5bWJvbE5hbWU9bmFtZUZvclBhc3NhYmxlU3ltYm9sKHNwZWNpbWVuKTtcblxuaWYodHlwZW9mIHN5bWJvbE5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUGFzc2FibGUgc3ltYm9sICR7c3BlY2ltZW59IG11c3QgaGF2ZSBhIHBhc3NhYmxlIG5hbWVgO1xuIH1cbnJldHVybiBjaGVjayhcbnN5bWJvbE5hbWUubGVuZ3RoPD1zeW1ib2xOYW1lTGVuZ3RoTGltaXQsXG5YIGBTeW1ib2wgbmFtZSAke3EoXG5zeW1ib2xOYW1lKVxuIH0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9YCk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOnN5bWJvbCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N5bWJvbCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUmVtb3RhYmxlSGVscGVyPUZhcignbWF0Y2g6cmVtb3RhYmxlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyZW1vdGFibGVEZXNjLGNoZWNrKT0+e1xuLyogVW5mb3J0dW5hdGUgZHVwbGljYXRpb24gb2YgY2hlY2tLaW5kIGxvZ2ljLCBidXQgbm8gYmV0dGVyIGNob2ljZXMuKi9cbmlmKGNoZWNrS2luZChzcGVjaW1lbiwncmVtb3RhYmxlJyxpZGVudENoZWNrZXIpKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGNoZWNrPT09aWRlbnRDaGVja2VyKXtcbnJldHVybiBmYWxzZTtcbiB9XG5sZXQgc3BlY2ltZW5LaW5kPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHNwZWNpbWVuS2luZD09PSd0YWdnZWQnKXtcbnNwZWNpbWVuS2luZD1nZXRUYWcoc3BlY2ltZW4pO1xuIH1cbmNvbnN0e2xhYmVsfT1yZW1vdGFibGVEZXNjO1xuXG4vKiBxdW90aW5nIHdpdGhvdXQgcXVvdGVzKi9cbmNvbnN0IGRldGFpbHM9WChcblsgYCR7c3BlY2ltZW5LaW5kfSBgLGAgLSBNdXN0IGJlIGEgcmVtb3RhYmxlICgke2xhYmVsfSlgXSxcbnNwZWNpbWVuKTtcblxucmV0dXJuIGNoZWNrKGZhbHNlLGRldGFpbHMpO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkUmVtb3RhYmxlRGVzYyxjaGVjayk9PlxuY2hlY2tNYXRjaGVzKFxuYWxsZWdlZFJlbW90YWJsZURlc2MsXG5oYXJkZW4oe2xhYmVsOk1NLnN0cmluZygpfSksXG5jaGVjayxcbidtYXRjaDpyZW1vdGFibGUgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX3JlbW90YWJsZURlc2MsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcigncmVtb3RhYmxlJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEVIZWxwZXI9RmFyKCdtYXRjaDpsdGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5TFRFKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDw9ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOihyaWdodE9wZXJhbmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbi8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4vKiB0byBiZSBgbGV0YCovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbmxldFtsZWZ0Qm91bmQscmlnaHRCb3VuZF09Z2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbmNvbnN0IG5ld1JpZ2h0Qm91bmQ9IGAke2VuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCl9fmA7XG5pZihuZXdSaWdodEJvdW5kIT09dW5kZWZpbmVkKXtcbnJpZ2h0Qm91bmQ9bmV3UmlnaHRCb3VuZDtcbiB9XG5yZXR1cm5bbGVmdEJvdW5kLHJpZ2h0Qm91bmRdO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEhlbHBlcj1GYXIoJ21hdGNoOmx0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDwgJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoR1RFSGVscGVyPUZhcignbWF0Y2g6Z3RlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdMZWZ0Qm91bmQ9ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKTtcbmlmKG5ld0xlZnRCb3VuZCE9PXVuZGVmaW5lZCl7XG5sZWZ0Qm91bmQ9bmV3TGVmdEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEdUSGVscGVyPUZhcignbWF0Y2g6Z3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5R1Qoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPiAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjptYXRjaEdURUhlbHBlci5nZXRSYW5rQ292ZXJ9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZWNvcmRPZkhlbHBlcj1GYXIoJ21hdGNoOnJlY29yZE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVByb3BlcnRpZXNMaW1pdCxwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spJiZcbmNoZWNrKFxub3duS2V5cyhzcGVjaW1lbikubGVuZ3RoPD1udW1Qcm9wZXJ0aWVzTGltaXQsXG5YIGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1Qcm9wZXJ0aWVzTGltaXQpXG4gfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWApJiZcblxuZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5cbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrLFxuW1xua2V5Lmxlbmd0aDw9cHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG5YIGBQcm9wZXJ0eSBuYW1lIG11c3Qgbm90IGJlIGxvbmdlciB0aGFuICR7cShcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0KVxuIH1gXSxcblxua2V5KSYmXG5cbmNoZWNrTWF0Y2hlcyhcbmhhcmRlbihba2V5LHZhbHVlXSksXG5oYXJkZW4oW2tleVBhdHQsdmFsdWVQYXR0XSksXG5jaGVjayxcbmtleSkpKTtcblxuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfZW50cnlQYXR0KT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFycmF5T2ZIZWxwZXI9RmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbc3ViUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2FycmF5TGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG4vKiBwcmV0dGllci1pZ25vcmUqL1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5QXJyYXknLGNoZWNrKSYmKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5sZW5ndGg8PWFycmF5TGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YCkpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbixzdWJQYXR0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU2V0T2ZIZWxwZXI9RmFyKCdtYXRjaDpzZXRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2tleVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtudW1TZXRFbGVtZW50c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5U2V0JyxjaGVjaykmJlxuY2hlY2soXG4vKiogQHR5cGUge0FycmF5fSAqL3NwZWNpbWVuLnBheWxvYWQubGVuZ3RoPG51bVNldEVsZW1lbnRzTGltaXQsXG5YIGBTZXQgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKG51bVNldEVsZW1lbnRzTGltaXQpfSBlbGVtZW50czogJHtcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoXG4gfWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLGtleVBhdHQsY2hlY2ssJ3NldCBlbGVtZW50cycpKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6c2V0T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQmFnT2ZIZWxwZXI9RmFyKCdtYXRjaDpiYWdPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LGNvdW50UGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LGRlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weUJhZycsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDw9XG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuWCBgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQpXG4gfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCkmJlxuXG5zcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuKFtrZXksY291bnRdLGkpPT5cbmNoZWNrTWF0Y2hlcyhrZXksa2V5UGF0dCxjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkmJlxuYXBwbHlMYWJlbGluZ0Vycm9yKFxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG5bY291bnQsZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrXSxcbiBgYmFnIGNvdW50c1ske2l9XWApJiZcblxuY2hlY2tNYXRjaGVzKGNvdW50LGNvdW50UGF0dCxjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpiYWdPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hNYXBPZkhlbHBlcj1GYXIoJ21hdGNoOm1hcE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bU1hcEVudHJpZXNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weU1hcCcsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5wYXlsb2FkLmtleXMubGVuZ3RoPD1cbm51bU1hcEVudHJpZXNMaW1pdCxcblggYENvcHlNYXAgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiAke3EoXG5udW1NYXBFbnRyaWVzTGltaXQpXG4gfSBlbnRyaWVzOiAke3NwZWNpbWVufWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQua2V5cyxcbmtleVBhdHQsXG5jaGVjayxcbidtYXAga2V5cycpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQudmFsdWVzLFxudmFsdWVQYXR0LFxuY2hlY2ssXG4nbWFwIHZhbHVlcycpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6bWFwT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJuW119IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgcmVzdFNwZWNpbWVuOiBQYXNzYWJsZVtdXG4gKiB9fVxuICovXG5jb25zdCBzcGxpdEFycmF5UGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG5jb25zdCBudW1SZXF1aXJlZD1yZXF1aXJlZFBhdHQubGVuZ3RoO1xuY29uc3QgbnVtT3B0aW9uYWw9b3B0aW9uYWxQYXR0Lmxlbmd0aDtcbmNvbnN0IHJlcXVpcmVkU3BlY2ltZW49c3BlY2ltZW4uc2xpY2UoMCxudW1SZXF1aXJlZCk7XG5jb25zdCBvcHRpb25hbFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKFxubnVtUmVxdWlyZWQsXG5udW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5cbmNvbnN0IHJlc3RTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShudW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5yZXR1cm4gaGFyZGVuKHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufSk7XG4gfTtcblxuLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiBlbGVtZW50cyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm5zIHtQYXR0ZXJuW119IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdEFycmF5UGF0dGVybj0ob3B0aW9uYWxQYXR0LGxlbmd0aCk9PlxuaGFyZGVuKG9wdGlvbmFsUGF0dC5zbGljZSgwLGxlbmd0aCkubWFwKChwYXR0KT0+TU0ub3B0KHBhdHQpKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0QXJyYXlIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9W10scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0QXJyYXlQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0QXJyYXlQYXR0ZXJuKFxub3B0aW9uYWxQYXR0LFxub3B0aW9uYWxTcGVjaW1lbi5sZW5ndGgpO1xuXG5sZXQgYXJnTnVtPTA7XG5yZXR1cm4oXG4ocmVxdWlyZWRTcGVjaW1lbi5sZW5ndGg9PT1yZXF1aXJlZFBhdHQubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBFeHBlY3RlZCBhdCBsZWFzdCAke3EoXG5yZXF1aXJlZFBhdHQubGVuZ3RoKVxuIH0gYXJndW1lbnRzOiAke3NwZWNpbWVufWApKSYmXG5cbnJlcXVpcmVkUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfWApKSYmXG5cbnBhcnRpYWxQYXR0LmV2ZXJ5KChwLGkpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG5jaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSxwLGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9P2ApKSYmXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5QXJyYXknJiYoXG5vcHRpb25hbFBhdHQ9PT11bmRlZmluZWR8fFxuaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkmJlxucGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KT09PSdjb3B5QXJyYXknKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCBhcnJheSwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IGFycmF5LCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbnNwbGl0QXJyYXkpXG4gfWApO1xuXG4gfSxcblxuZ2V0UmFua0NvdmVyOihbXG5fcmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGFzc2FibGU+fSBzcGVjaW1lblxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcmV0dXJucyB7e1xuICogICByZXF1aXJlZFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPixcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIHJlc3RTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT5cbiAqIH19XG4gKi9cbmNvbnN0IHNwbGl0UmVjb3JkUGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG4vKiBOb3QgZnJvemVuISBNdXRhdGVkIGluIHBsYWNlKi9cbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCByZXF1aXJlZEVudHJpZXM9W107XG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3Qgb3B0aW9uYWxFbnRyaWVzPVtdO1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IHJlc3RFbnRyaWVzPVtdO1xuZm9yKGNvbnN0W25hbWUsdmFsdWVdb2YgZW50cmllcyhzcGVjaW1lbikpe1xuaWYoaGFzT3duUHJvcGVydHlPZihyZXF1aXJlZFBhdHQsbmFtZSkpe1xucmVxdWlyZWRFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZSBpZihoYXNPd25Qcm9wZXJ0eU9mKG9wdGlvbmFsUGF0dCxuYW1lKSl7XG5vcHRpb25hbEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1lbHNle1xucmVzdEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtcbnJlcXVpcmVkU3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVxdWlyZWRFbnRyaWVzKSxcbm9wdGlvbmFsU3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMob3B0aW9uYWxFbnRyaWVzKSxcbnJlc3RTcGVjaW1lbjpmcm9tVW5pcXVlRW50cmllcyhyZXN0RW50cmllcyl9KTtcblxuIH07XG5cbi8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gdmFsdWVzIHdoaWNoIGFyZSBgdW5kZWZpbmVkYCBwYXNzIHVuY29uZGl0aW9uYWxseS5cbiAqIFdlIGVuY29kZSB0aGlzIHdpdGggdGhlIGBNLm9yYCBwYXR0ZXJuIHNvIGl0IGFsc28gcHJvZHVjZXMgYSBnb29kXG4gKiBjb21wcmVzc2lvbiBkaXN0aW5ndWlzaGluZyBgdW5kZWZpbmVkYCBmcm9tIGFic2VuY2UuXG4gKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7Q29weVJlY29yZDxQYXR0ZXJuPn0gVGhlIHBhcnRpYWxQYXR0XG4gKi9cbmNvbnN0IGFkYXB0UmVjb3JkUGF0dGVybj0ob3B0aW9uYWxQYXR0LG5hbWVzKT0+XG5mcm9tVW5pcXVlRW50cmllcyhuYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxNTS5vcHQob3B0aW9uYWxQYXR0W25hbWVdKV0pKTtcblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdFJlY29yZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXt9LHJlc3RQYXR0PU1NLmFueSgpXSxcbmNoZWNrKT0+XG57XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5UmVjb3JkJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e3JlcXVpcmVkU3BlY2ltZW4sb3B0aW9uYWxTcGVjaW1lbixyZXN0U3BlY2ltZW59PVxuc3BsaXRSZWNvcmRQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcblxuY29uc3QgcGFydGlhbE5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhvcHRpb25hbFNwZWNpbWVuKTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0UmVjb3JkUGF0dGVybihvcHRpb25hbFBhdHQscGFydGlhbE5hbWVzKTtcbnJldHVybihcbmNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuLHJlcXVpcmVkUGF0dCxjaGVjaykmJlxucGFydGlhbE5hbWVzLmV2ZXJ5KChuYW1lKT0+XG5jaGVja01hdGNoZXMoXG5vcHRpb25hbFNwZWNpbWVuW25hbWVdLFxucGFydGlhbFBhdHRbbmFtZV0sXG5jaGVjayxcbiBgJHtuYW1lfT9gKSkmJlxuXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5UmVjb3JkJyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weVJlY29yZCcpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xucmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSl9KTtcblxuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIE1hdGNoSGVscGVyPn0gKi9cbmNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnPWhhcmRlbih7XG4nbWF0Y2g6YW55JzptYXRjaEFueUhlbHBlcixcbidtYXRjaDphbmQnOm1hdGNoQW5kSGVscGVyLFxuJ21hdGNoOm9yJzptYXRjaE9ySGVscGVyLFxuJ21hdGNoOm5vdCc6bWF0Y2hOb3RIZWxwZXIsXG5cbidtYXRjaDpzY2FsYXInOm1hdGNoU2NhbGFySGVscGVyLFxuJ21hdGNoOmtleSc6bWF0Y2hLZXlIZWxwZXIsXG4nbWF0Y2g6cGF0dGVybic6bWF0Y2hQYXR0ZXJuSGVscGVyLFxuJ21hdGNoOmtpbmQnOm1hdGNoS2luZEhlbHBlcixcbidtYXRjaDpiaWdpbnQnOm1hdGNoQmlnaW50SGVscGVyLFxuJ21hdGNoOm5hdCc6bWF0Y2hOYXRIZWxwZXIsXG4nbWF0Y2g6c3RyaW5nJzptYXRjaFN0cmluZ0hlbHBlcixcbidtYXRjaDpzeW1ib2wnOm1hdGNoU3ltYm9sSGVscGVyLFxuJ21hdGNoOnJlbW90YWJsZSc6bWF0Y2hSZW1vdGFibGVIZWxwZXIsXG5cbidtYXRjaDpsdCc6bWF0Y2hMVEhlbHBlcixcbidtYXRjaDpsdGUnOm1hdGNoTFRFSGVscGVyLFxuJ21hdGNoOmd0ZSc6bWF0Y2hHVEVIZWxwZXIsXG4nbWF0Y2g6Z3QnOm1hdGNoR1RIZWxwZXIsXG5cbidtYXRjaDphcnJheU9mJzptYXRjaEFycmF5T2ZIZWxwZXIsXG4nbWF0Y2g6cmVjb3JkT2YnOm1hdGNoUmVjb3JkT2ZIZWxwZXIsXG4nbWF0Y2g6c2V0T2YnOm1hdGNoU2V0T2ZIZWxwZXIsXG4nbWF0Y2g6YmFnT2YnOm1hdGNoQmFnT2ZIZWxwZXIsXG4nbWF0Y2g6bWFwT2YnOm1hdGNoTWFwT2ZIZWxwZXIsXG4nbWF0Y2g6c3BsaXRBcnJheSc6bWF0Y2hTcGxpdEFycmF5SGVscGVyLFxuJ21hdGNoOnNwbGl0UmVjb3JkJzptYXRjaFNwbGl0UmVjb3JkSGVscGVyfSk7XG5cblxuY29uc3QgbWFrZU1hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuY29uc3QgbWF0Y2hlcj1tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbmFzc2VydFBhdHRlcm4obWF0Y2hlcik7XG5yZXR1cm4gbWF0Y2hlcjtcbiB9O1xuXG5jb25zdCBtYWtlS2luZE1hdGNoZXI9KGtpbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6a2luZCcsa2luZCk7XG5cbmNvbnN0IEFueVNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDphbnknLHVuZGVmaW5lZCk7XG5jb25zdCBTY2FsYXJTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6c2NhbGFyJyx1bmRlZmluZWQpO1xuY29uc3QgS2V5U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmtleScsdW5kZWZpbmVkKTtcbmNvbnN0IFBhdHRlcm5TaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsdW5kZWZpbmVkKTtcbmNvbnN0IEJvb2xlYW5TaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Jvb2xlYW4nKTtcbmNvbnN0IE51bWJlclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG5jb25zdCBCaWdJbnRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiaWdpbnQnLFtdKTtcbmNvbnN0IE5hdFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsW10pO1xuY29uc3QgU3RyaW5nU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c3RyaW5nJyxbXSk7XG5jb25zdCBTeW1ib2xTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzeW1ib2wnLFtdKTtcbmNvbnN0IFJlY29yZFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IEFycmF5U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsW0FueVNoYXBlXSk7XG5jb25zdCBTZXRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsW0FueVNoYXBlXSk7XG5jb25zdCBCYWdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBNYXBTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBSZW1vdGFibGVTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuY29uc3QgRXJyb3JTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG5jb25zdCBQcm9taXNlU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdwcm9taXNlJyk7XG5jb25zdCBVbmRlZmluZWRTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIEZvciB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBheWxvYWQgaXMgdGhlIG9wdGlvbmFsIGxpbWl0cyxcbiAqIHNvIHRoYXQgd2hlbiBpdCBpcyBgdW5kZWZpbmVkYCBpdCBpcyBkcm9wcGVkIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAqIHBheWxvYWRzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGF5bG9hZFxuICovXG5jb25zdCBtYWtlTGltaXRzTWF0Y2hlcj0odGFnLHBheWxvYWQpPT57XG5pZihwYXlsb2FkW3BheWxvYWQubGVuZ3RoLTFdPT09dW5kZWZpbmVkKXtcbnBheWxvYWQ9aGFyZGVuKHBheWxvYWQuc2xpY2UoMCxwYXlsb2FkLmxlbmd0aC0xKSk7XG4gfVxucmV0dXJuIG1ha2VNYXRjaGVyKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG5jb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlcj0obGFiZWw9dW5kZWZpbmVkKT0+XG5sYWJlbD09PXVuZGVmaW5lZD9cblJlbW90YWJsZVNoYXBlOlxubWFrZU1hdGNoZXIoJ21hdGNoOnJlbW90YWJsZScsaGFyZGVuKHtsYWJlbH0pKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSBlbXB0eVxuICogQHBhcmFtIHtUfSBiYXNlXG4gKiBAcGFyYW0ge1R9IFtvcHRpb25hbF1cbiAqIEBwYXJhbSB7VH0gW3Jlc3RdXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBtYWtlU3BsaXRQYXlsb2FkPShcbmVtcHR5LFxuYmFzZSxcbm9wdGlvbmFsPXVuZGVmaW5lZCxcbnJlc3Q9dW5kZWZpbmVkKT0+XG57XG5pZihyZXN0KXtcbnJldHVybltiYXNlLG9wdGlvbmFsfHxlbXB0eSxyZXN0XTtcbiB9XG5pZihvcHRpb25hbCl7XG5yZXR1cm5bYmFzZSxvcHRpb25hbF07XG4gfVxucmV0dXJuW2Jhc2VdO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHsnc3luYyd8J2FzeW5jJ30gY2FsbEtpbmRcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gYXJnR3VhcmRzXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IFtvcHRpb25hbEFyZ0d1YXJkc11cbiAqIEBwYXJhbSB7QXJnR3VhcmR9IFtyZXN0QXJnR3VhcmRdXG4gKiBAcmV0dXJucyB7TWV0aG9kR3VhcmRNYWtlcn1cbiAqL1xuY29uc3QgbWFrZU1ldGhvZEd1YXJkTWFrZXI9KFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcz11bmRlZmluZWQsXG5yZXN0QXJnR3VhcmQ9dW5kZWZpbmVkKT0+XG5cbmhhcmRlbih7XG5vcHRpb25hbDooLi4ub3B0QXJnR3VhcmRzKT0+e1xub3B0aW9uYWxBcmdHdWFyZHM9PT11bmRlZmluZWR8fFxuRmFpbCBgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG5yZXN0QXJnR3VhcmQ9PT11bmRlZmluZWR8fFxuRmFpbCBgb3B0aW9uYWwgYXJnIGd1YXJkcyBtdXN0IGNvbWUgYmVmb3JlIHJlc3QgYXJnYDtcbnJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihjYWxsS2luZCxhcmdHdWFyZHMsb3B0QXJnR3VhcmRzKTtcbiB9LFxucmVzdDoockFyZ0d1YXJkKT0+e1xucmVzdEFyZ0d1YXJkPT09dW5kZWZpbmVkfHxGYWlsIGBDYW4gb25seSBoYXZlIG9uZSByZXN0IGFyZ2A7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxuckFyZ0d1YXJkKTtcblxuIH0sXG5yZXR1cm5zOihyZXR1cm5HdWFyZD1VbmRlZmluZWRTaGFwZSk9PlxuaGFyZGVuKHtcbmtsYXNzOidtZXRob2RHdWFyZCcsXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxucmVzdEFyZ0d1YXJkLFxucmV0dXJuR3VhcmR9KX0pO1xuXG5cblxuY29uc3QgbWFrZUF3YWl0QXJnR3VhcmQ9KGFyZ0d1YXJkKT0+XG5oYXJkZW4oe1xua2xhc3M6J2F3YWl0QXJnJyxcbmFyZ0d1YXJkfSk7XG5cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtNYXRjaGVyTmFtZXNwYWNlfSAqL1xuY29uc3QgTT1oYXJkZW4oe1xuYW55OigpPT5BbnlTaGFwZSxcbmFuZDooLi4ucGF0dHMpPT5tYWtlTWF0Y2hlcignbWF0Y2g6YW5kJyxwYXR0cyksXG5vcjooLi4ucGF0dHMpPT5tYWtlTWF0Y2hlcignbWF0Y2g6b3InLHBhdHRzKSxcbm5vdDooc3ViUGF0dCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpub3QnLHN1YlBhdHQpLFxuXG5zY2FsYXI6KCk9PlNjYWxhclNoYXBlLFxua2V5OigpPT5LZXlTaGFwZSxcbnBhdHRlcm46KCk9PlBhdHRlcm5TaGFwZSxcbmtpbmQ6bWFrZUtpbmRNYXRjaGVyLFxuYm9vbGVhbjooKT0+Qm9vbGVhblNoYXBlLFxubnVtYmVyOigpPT5OdW1iZXJTaGFwZSxcbmJpZ2ludDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiaWdpbnQnLFtsaW1pdHNdKTpCaWdJbnRTaGFwZSxcbm5hdDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpuYXQnLFtsaW1pdHNdKTpOYXRTaGFwZSxcbnN0cmluZzoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzdHJpbmcnLFtsaW1pdHNdKTpTdHJpbmdTaGFwZSxcbnN5bWJvbDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzeW1ib2wnLFtsaW1pdHNdKTpTeW1ib2xTaGFwZSxcbnJlY29yZDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00ucmVjb3JkT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6UmVjb3JkU2hhcGUsXG5hcnJheToobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00uYXJyYXlPZihNLmFueSgpLGxpbWl0cyk6QXJyYXlTaGFwZSxcbnNldDoobGltaXRzPXVuZGVmaW5lZCk9PmxpbWl0cz9NLnNldE9mKE0uYW55KCksbGltaXRzKTpTZXRTaGFwZSxcbmJhZzoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00uYmFnT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6QmFnU2hhcGUsXG5tYXA6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLm1hcE9mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOk1hcFNoYXBlLFxucmVtb3RhYmxlOm1ha2VSZW1vdGFibGVNYXRjaGVyLFxuZXJyb3I6KCk9PkVycm9yU2hhcGUsXG5wcm9taXNlOigpPT5Qcm9taXNlU2hhcGUsXG51bmRlZmluZWQ6KCk9PlVuZGVmaW5lZFNoYXBlLFxubnVsbDooKT0+bnVsbCxcblxubHQ6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpsdCcscmlnaHRPcGVyYW5kKSxcbmx0ZToocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmx0ZScscmlnaHRPcGVyYW5kKSxcbmVxOihrZXkpPT57XG5hc3NlcnRLZXkoa2V5KTtcbnJldHVybiBrZXk9PT11bmRlZmluZWQ/TS51bmRlZmluZWQoKTprZXk7XG4gfSxcbm5lcTooa2V5KT0+TS5ub3QoTS5lcShrZXkpKSxcbmd0ZToocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmd0ZScscmlnaHRPcGVyYW5kKSxcbmd0OihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6Z3QnLHJpZ2h0T3BlcmFuZCksXG5cbnJlY29yZE9mOihrZXlQYXR0PU0uYW55KCksdmFsdWVQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnJlY29yZE9mJyxba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzXSksXG5hcnJheU9mOihzdWJQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmFycmF5T2YnLFtzdWJQYXR0LGxpbWl0c10pLFxuc2V0T2Y6KGtleVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c2V0T2YnLFtrZXlQYXR0LGxpbWl0c10pLFxuYmFnT2Y6KGtleVBhdHQ9TS5hbnkoKSxjb3VudFBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmFnT2YnLFtrZXlQYXR0LGNvdW50UGF0dCxsaW1pdHNdKSxcbm1hcE9mOihrZXlQYXR0PU0uYW55KCksdmFsdWVQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm1hcE9mJyxba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzXSksXG5zcGxpdEFycmF5OihiYXNlLG9wdGlvbmFsPXVuZGVmaW5lZCxyZXN0PXVuZGVmaW5lZCk9PlxubWFrZU1hdGNoZXIoXG4nbWF0Y2g6c3BsaXRBcnJheScsXG5tYWtlU3BsaXRQYXlsb2FkKFtdLGJhc2Usb3B0aW9uYWwscmVzdCkpLFxuXG5zcGxpdFJlY29yZDooYmFzZSxvcHRpb25hbD11bmRlZmluZWQscmVzdD11bmRlZmluZWQpPT5cbm1ha2VNYXRjaGVyKFxuJ21hdGNoOnNwbGl0UmVjb3JkJyxcbm1ha2VTcGxpdFBheWxvYWQoe30sYmFzZSxvcHRpb25hbCxyZXN0KSksXG5cbnNwbGl0OihiYXNlLHJlc3Q9dW5kZWZpbmVkKT0+e1xuaWYocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xucmV0dXJuIE0uc3BsaXRBcnJheShiYXNlLHJlc3QmJltdLHJlc3QpO1xuIH1lbHNle1xucmV0dXJuIE0uc3BsaXRSZWNvcmQoYmFzZSxyZXN0JiZ7fSxyZXN0KTtcbiB9XG4gfSxcbnBhcnRpYWw6KGJhc2UscmVzdD11bmRlZmluZWQpPT57XG5pZihwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpPT09J2NvcHlBcnJheScpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG5yZXR1cm4gTS5zcGxpdEFycmF5KFtdLGJhc2UscmVzdCk7XG4gfWVsc2V7XG5yZXR1cm4gTS5zcGxpdFJlY29yZCh7fSxiYXNlLHJlc3QpO1xuIH1cbiB9LFxuXG5lcmVmOih0KT0+TS5vcih0LE0ucHJvbWlzZSgpKSxcbm9wdDoodCk9Pk0ub3IoTS51bmRlZmluZWQoKSx0KSxcblxuaW50ZXJmYWNlOihpbnRlcmZhY2VOYW1lLG1ldGhvZEd1YXJkcyx7c2xvcHB5PWZhbHNlfT17fSk9PntcbmZvcihjb25zdFtfLG1ldGhvZEd1YXJkXW9mIGVudHJpZXMobWV0aG9kR3VhcmRzKSl7XG5tZXRob2RHdWFyZC5rbGFzcz09PSdtZXRob2RHdWFyZCd8fFxuRmFpbCBgdW5yZWNvZ25pemUgbWV0aG9kIGd1YXJkICR7bWV0aG9kR3VhcmR9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmtsYXNzOidJbnRlcmZhY2UnLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkcyxcbnNsb3BweX0pO1xuXG4gfSxcbmNhbGw6KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdzeW5jJyxhcmdHdWFyZHMpLFxuY2FsbFdoZW46KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdhc3luYycsYXJnR3VhcmRzKSxcblxuYXdhaXQ6KGFyZ0d1YXJkKT0+bWFrZUF3YWl0QXJnR3VhcmQoYXJnR3VhcmQpfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxubXVzdE1hdGNoLFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19KTtcblxuIH07XG5cbi8qIE9ubHkgaW5jbHVkZSB0aG9zZSB3aG9zZSBtZWFuaW5nIGlzIGluZGVwZW5kZW50IG9mIGFuIGltcHV0ZWQgc29ydCBvcmRlciovXG4vKiBvZiByZW1vdGFibGVzLCBvciBvZiBlbmNvZGluZyBvZiBwYXNzYWJsZSBhcyBzb3J0YWJsZSBzdHJpbmdzLiBUaHVzLCovXG4vKiBnZXRSYW5rQ292ZXIgaXMgb21pdHRlZC4gVG8gZ2V0IG9uZSwgeW91J2QgbmVlZCB0byBpbnN0YW50aWF0ZSovXG4vKiBgbWFrZVBhdHRlcm5LaXQoKWAgeW91cnNlbGYuIFNpbmNlIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZXh0ZXJuYWwqL1xuLyogdXNlcyBvZiBgZ2V0UmFua0NvdmVyYCwgZm9yIGNsYXJpdHkgZHVyaW5nIGRldmVsb3BtZW50LCBgbWFrZVBhdHRlcm5LaXRgKi9cbi8qIGlzIG5vdCBjdXJyZW50bHkgZXhwb3J0ZWQuKi9cbmNvbnN0ICAgICAgIHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5tdXN0TWF0Y2gsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuZ2V0UmFua0NvdmVyLFxuTX09XG5tYWtlUGF0dGVybktpdCgpOyRo4oCNX29uY2UuY2hlY2tNYXRjaGVzKGNoZWNrTWF0Y2hlcyk7JGjigI1fb25jZS5tYXRjaGVzKG1hdGNoZXMpOyRo4oCNX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7JGjigI1fb25jZS5hc3NlcnRQYXR0ZXJuKGFzc2VydFBhdHRlcm4pOyRo4oCNX29uY2UuaXNQYXR0ZXJuKGlzUGF0dGVybik7JGjigI1fb25jZS5nZXRSYW5rQ292ZXIoZ2V0UmFua0NvdmVyKTskaOKAjV9vbmNlLk0oTSk7XG5cbk1NPU07XG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlUYWdnZWR9IENvcHlUYWdnZWQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5SYW5rQ29tcGFyZX0gUmFua0NvbXBhcmUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlJhbmtDb3Zlcn0gUmFua0NvdmVyICovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5BcmdHdWFyZH0gQXJnR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5NZXRob2RHdWFyZE1ha2VyfSBNZXRob2RHdWFyZE1ha2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuTWF0Y2hlck5hbWVzcGFjZX0gTWF0Y2hlck5hbWVzcGFjZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLktleX0gS2V5ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuUGF0dGVybn0gUGF0dGVybiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLlBhdHRlcm5LaXR9IFBhdHRlcm5LaXQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5DaGVja1BhdHRlcm59IENoZWNrUGF0dGVybiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcycpLkxpbWl0c30gTGltaXRzICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzJykuQWxsTGltaXRzfSBBbGxMaW1pdHMgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMnKS5HZXRSYW5rQ292ZXJ9IEdldFJhbmtDb3ZlciAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyXG4gKiBUaGlzIGZhY3RvcnMgb3V0IG9ubHkgdGhlIHBhcnRzIHNwZWNpZmljIHRvIGVhY2gga2luZCBvZiBNYXRjaGVyLiBJdCBpc1xuICogZW5jYXBzdWxhdGVkLCBhbmQgaXRzIG1ldGhvZHMgY2FuIG1ha2UgdGhlIHN0YXRlZCB1bmNoZWNrZXIgYXNzdW1wdGlvbnNcbiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF5bG9hZDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlclxuICogKSA9PiBib29sZWFufSBjaGVja0lzV2VsbEZvcm1lZFxuICogUmVwb3J0cyB3aGV0aGVyIGBhbGxlZ2VkUGF5bG9hZGAgaXMgdmFsaWQgYXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkXG4gKiB3aG9zZSB0YWcgY29ycmVzcG9uZHMgd2l0aCB0aGlzIE1hdGNoSGVscGVyJ3MgTWF0Y2hlcnMuXG4gKlxuICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgbWF0Y2hlclBheWxvYWQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiApID0+IGJvb2xlYW59IGNoZWNrTWF0Y2hlc1xuICogQXNzdW1pbmcgdmFsaWRpdHkgb2YgYG1hdGNoZXJQYXlsb2FkYCBhcyB0aGUgcGF5bG9hZCBvZiBhIE1hdGNoZXIgY29ycmVzcG9uZGluZ1xuICogd2l0aCB0aGlzIE1hdGNoSGVscGVyLCByZXBvcnRzIHdoZXRoZXIgYHNwZWNpbWVuYCBpcyBtYXRjaGVkIGJ5IHRoYXQgTWF0Y2hlci5cbiAqXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4uL3R5cGVzJykuR2V0UmFua0NvdmVyfSBnZXRSYW5rQ292ZXJcbiAqIEFzc3VtZXMgdGhpcyBpcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZ1xuICogbWF0Y2hUYWcuIFJldHVybiBhIFJhbmtDb3ZlciB0byBib3VuZCBmcm9tIGJlbG93IGFuZCBhYm92ZSxcbiAqIGluIHJhbmsgb3JkZXIsIGFsbCBwb3NzaWJsZSBQYXNzYWJsZXMgdGhhdCB3b3VsZCBtYXRjaCB0aGlzIE1hdGNoZXIuXG4gKiBUaGUgbGVmdCBlbGVtZW50IG11c3QgYmUgYmVmb3JlIG9yIHRoZSBzYW1lIHJhbmsgYXMgYW55IHBvc3NpYmxlXG4gKiBtYXRjaGluZyBzcGVjaW1lbi4gVGhlIHJpZ2h0IGVsZW1lbnQgbXVzdCBiZSBhZnRlciBvciB0aGUgc2FtZVxuICogcmFuayBhcyBhbnkgcG9zc2libGUgbWF0Y2hpbmcgc3BlY2ltZW4uXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0TGltaXRzIjpbImRlZmF1bHRMaW1pdHMiXSwiY2hlY2tNYXRjaGVzIjpbImNoZWNrTWF0Y2hlcyJdLCJtYXRjaGVzIjpbIm1hdGNoZXMiXSwibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiJdLCJnZXRSYW5rQ292ZXIiOlsiZ2V0UmFua0NvdmVyIl0sIk0iOlsiTSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACYGTuzNAEAADQBAAAiAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACWHvfH6hoAAOoaAAAiAAAAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy91dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJhcHBseUxhYmVsaW5nRXJyb3IiLCJmcm9tVW5pcXVlRW50cmllcyIsImlkZW50Q2hlY2tlciIsImxpc3REaWZmZXJlbmNlIiwib2JqZWN0TWFwIiwidGhyb3dMYWJlbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEUsaXNQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2Zyb21FbnRyaWVzLGVudHJpZXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyogVE9ETyBtaWdyYXRlIHRvIHByb3BlciBob21lKi9cbi8qIEZyb20gdGhlIGBhZ29yaWMtc2RrYCBtb25vcmVwby4gTW92ZWQgaGVyZSB0ZW1wb3JhcmlseSBiZWNhdXNlIHRoZSBwYXR0ZXJuKi9cbi8qIGNvZGUgaXMgbWlncmF0ZWQgZnJvbSBgQGFnb3JpYy9zdG9yZWAgdG8gYEBlbmRvL3BhdHRlcm5zYCwgYW5kIGRlcGVuZHMgb24qL1xuLyogdGhlIGZ1bmN0aW9uYWxpdHkgaW4gdGhpcyBmaWxlLCB3aGljaCBpcyBvdGhlcndpc2UgYXZhaWxhYmxlIG9ubHkqL1xuLyogd2l0aGluIHRoZSBgYWdvcmljLXNka2AgbW9ub3JlcG8uKi9cblxuLyoqXG4gKiBUT0RPIGFzIGxvbmcgYXMgYEBlbmRvL3Bhc3Mtc3R5bGVgIHJlbWFpbnMgdGhlIHByb3BlciBob21lIG9mIHRoZVxuICogYENoZWNrZXJgIHR5cGUsIGl0IHByb2JhYmx5IG1ha2VzIG1vc3Qgc2Vuc2UgdG8gbW92ZSBgaWRlbnRDaGVja2VyYFxuICogaW50byBgQGVuZG8vcGFzcy1zdHlsZWAgYXMgd2VsbC5cbiAqXG4gKiBJbiB0aGUgYGFzc2VydEZvb2AvYGlzRm9vYC9gY2hlY2tGb29gIHBhdHRlcm4sIGBjaGVja0Zvb2AgaGFzIGEgYGNoZWNrYFxuICogcGFyYW1ldGVyIG9mIHR5cGUgYENoZWNrZXJgLiBgYXNzZXJ0Rm9vYCBjYWxscyBgY2hlY2tGb29gIHBhc3Nlc1xuICogYGFzc2VydENoZWNrZXJgIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaXNGb29gIHBhc3NlcyBgaWRlbnRDaGVja2VyYFxuICogYXMgdGhlIGBjaGVja2AgYXJndW1lbnQuIGBpZGVudENoZWNrZXJgIGFjdHMgcHJlY2lzZWx5IGxpa2UgYW5cbiAqIGlkZW50aXR5IGZ1bmN0aW9uLCBidXQgaXMgdHlwZWQgYXMgYSBgQ2hlY2tlcmAgdG8gaW5kaWNhdGUgaXRzXG4gKiBpbnRlbmRlZCB1c2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpZGVudENoZWNrZXI9KGNvbmQsX2RldGFpbHMpPT5jb25kOyRo4oCNX29uY2UuaWRlbnRDaGVja2VyKGlkZW50Q2hlY2tlcik7XG5oYXJkZW4oaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBUaHJvd3MgaWYgbXVsdGlwbGUgZW50cmllcyB1c2UgdGhlIHNhbWUgcHJvcGVydHkgbmFtZS4gT3RoZXJ3aXNlIGFjdHNcbiAqIGxpa2UgYE9iamVjdC5mcm9tRW50cmllc2AgYnV0IGhhcmRlbnMgdGhlIHJlc3VsdC5cbiAqIFVzZSBpdCB0byBwcm90ZWN0IGZyb20gcHJvcGVydHkgbmFtZXMgY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxWXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7W2s6IEtdOiBWfX1cbiAqL1xuY29uc3QgICAgICAgIGZyb21VbmlxdWVFbnRyaWVzPShhbGxFbnRyaWVzKT0+e1xuY29uc3QgZW50cmllc0FycmF5PVsuLi5hbGxFbnRyaWVzXTtcbmNvbnN0IHJlc3VsdD1oYXJkZW4oZnJvbUVudHJpZXMoZW50cmllc0FycmF5KSk7XG5pZihvd25LZXlzKHJlc3VsdCkubGVuZ3RoPT09ZW50cmllc0FycmF5Lmxlbmd0aCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNvbnN0IG5hbWVzPW5ldyBTZXQoKTtcbmZvcihjb25zdFtuYW1lLF9db2YgZW50cmllc0FycmF5KXtcbmlmKG5hbWVzLmhhcyhuYW1lKSl7XG5GYWlsIGBjb2xsaXNpb24gb24gcHJvcGVydHkgbmFtZSAke3EobmFtZSl9OiAke2VudHJpZXNBcnJheX1gO1xuIH1cbm5hbWVzLmFkZChuYW1lKTtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogZmFpbGVkIHRvIGNyZWF0ZSBvYmplY3QgZnJvbSB1bmlxdWUgZW50cmllc2A7XG4gfTskaOKAjV9vbmNlLmZyb21VbmlxdWVFbnRyaWVzKGZyb21VbmlxdWVFbnRyaWVzKTtcbmhhcmRlbihmcm9tVW5pcXVlRW50cmllcyk7XG5cbi8qKlxuICogQnkgYW5hbG9neSB3aXRoIGhvdyBgQXJyYXkucHJvdG90eXBlLm1hcGAgd2lsbCBtYXAgdGhlIGVsZW1lbnRzIG9mXG4gKiBhbiBhcnJheSB0byB0cmFuc2Zvcm1lZCBlbGVtZW50cyBvZiBhbiBhcnJheSBvZiB0aGUgc2FtZSBzaGFwZSxcbiAqIGBvYmplY3RNYXBgIHdpbGwgZG8gbGlrZXdpc2UgZm9yIHRoZSBzdHJpbmctbmFtZWQgb3duIGVudW1lcmFibGVcbiAqIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LlxuICpcbiAqIFR5cGljYWwgdXNhZ2UgYXBwbGllcyBgb2JqZWN0TWFwYCB0byBhIENvcHlSZWNvcmQsIGkuZS4sXG4gKiBhbiBvYmplY3QgZm9yIHdoaWNoIGBwYXNzU3R5bGVPZihvcmlnaW5hbCkgPT09ICdjb3B5UmVjb3JkJ2AuIEZvciB0aGVzZSxcbiAqIG5vbmUgb2YgdGhlIGZvbGxvd2luZyBlZGdlIGNhc2VzIGFyaXNlLiBUaGUgcmVzdWx0IHdpbGwgYmUgYSBDb3B5UmVjb3JkXG4gKiB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydHkgbmFtZXMsIHdob3NlIHZhbHVlcyBhcmUgdGhlIG1hcHBlZCBmb3JtIG9mXG4gKiB0aGUgb3JpZ2luYWwncyB2YWx1ZXMuXG4gKlxuICogV2hlbiB0aGUgb3JpZ2luYWwgaXMgbm90IGEgQ29weVJlY29yZCwgc29tZSBlZGdlIGNhc2VzIHRvIGJlIGF3YXJlIG9mXG4gKiAgICAqIE5vIG1hdHRlciBob3cgbXV0YWJsZSB0aGUgb3JpZ2luYWwgb2JqZWN0LCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzXG4gKiAgICAgIGhhcmRlbmVkLlxuICogICAgKiBPbmx5IHRoZSBzdHJpbmctbmFtZWQgZW51bWVyYWJsZSBvd24gcHJvcGVydGllcyBvZiB0aGUgb3JpZ2luYWxcbiAqICAgICAgYXJlIG1hcHBlZC4gQWxsIG90aGVyIHByb3BlcnRpZXMgYXJlIGlnbm9yZWQuXG4gKiAgICAqIElmIGFueSBvZiB0aGUgb3JpZ2luYWwgcHJvcGVydGllcyB3ZXJlIGFjY2Vzc29ycywgYE9iamVjdC5lbnRyaWVzYFxuICogICAgICB3aWxsIGNhdXNlIGl0cyBgZ2V0dGVyYCB0byBiZSBjYWxsZWQgYW5kIHdpbGwgdXNlIHRoZSByZXN1bHRpbmdcbiAqICAgICAgdmFsdWUuXG4gKiAgICAqIE5vIG1hdHRlciB3aGV0aGVyIHRoZSBvcmlnaW5hbCBwcm9wZXJ0eSB3YXMgYW4gYWNjZXNzb3IsIHdyaXRhYmxlLFxuICogICAgICBvciBjb25maWd1cmFibGUsIGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqICAgICAgbm9uLXdyaXRhYmxlLCBub24tY29uZmlndXJhYmxlLCBkYXRhIHByb3BlcnRpZXMuXG4gKiAgICAqIE5vIG1hdHRlciB3aGF0IHRoZSBvcmlnaW5hbCBvYmplY3QgbWF5IGhhdmUgaW5oZXJpdGVkIGZyb20sIGFuZFxuICogICAgICBubyBtYXR0ZXIgd2hldGhlciBpdCB3YXMgYSBzcGVjaWFsIGtpbmQgb2Ygb2JqZWN0IHN1Y2ggYXMgYW4gYXJyYXksXG4gKiAgICAgIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgYSBwbGFpbiBvYmplY3QgaW5oZXJpdGluZyBkaXJlY3RseVxuICogICAgICBmcm9tIGBPYmplY3QucHJvdG90eXBlYCBhbmQgd2hvc2Ugc3RhdGUgaXMgb25seSB0aGVzZSBuZXcgbWFwcGVkXG4gKiAgICAgIG93biBwcm9wZXJ0aWVzLlxuICpcbiAqIFdpdGggdGhlc2UgZGlmZmVyZW5jZXMsIGV2ZW4gaWYgdGhlIG9yaWdpbmFsIG9iamVjdCB3YXMgbm90IGEgQ29weVJlY29yZCxcbiAqIGlmIGFsbCB0aGUgbWFwcGVkIHZhbHVlcyBhcmUgUGFzc2FibGUsIHRoZW4gdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlXG4gKiBhIENvcHlSZWNvcmQuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBPXG4gKiBAcGFyYW0ge099IG9yaWdpbmFsXG4gKiBAdGVtcGxhdGUgUiBtYXAgcmVzdWx0XG4gKiBAcGFyYW0geyh2YWx1ZTogT1trZXlvZiBPXSwga2V5OiBrZXlvZiBPKSA9PiBSfSBtYXBGblxuICogQHJldHVybnMge3sgW1AgaW4ga2V5b2YgT106IFJ9fVxuICovXG5jb25zdCAgICAgICAgb2JqZWN0TWFwPShvcmlnaW5hbCxtYXBGbik9PntcbmNvbnN0IGVudHM9ZW50cmllcyhvcmlnaW5hbCk7XG5jb25zdCBtYXBFbnRzPWVudHMubWFwKChbayx2XSk9PltrLG1hcEZuKHYsayldKTtcbnJldHVybiBoYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cykpO1xuIH07JGjigI1fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IGxlZnROYW1lc1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmcgfCBzeW1ib2w+fSByaWdodE5hbWVzXG4gKi9cbmNvbnN0ICAgICAgICBsaXN0RGlmZmVyZW5jZT0obGVmdE5hbWVzLHJpZ2h0TmFtZXMpPT57XG5jb25zdCByaWdodFNldD1uZXcgU2V0KHJpZ2h0TmFtZXMpO1xucmV0dXJuIGxlZnROYW1lcy5maWx0ZXIoKG5hbWUpPT4hcmlnaHRTZXQuaGFzKG5hbWUpKTtcbiB9OyRo4oCNX29uY2UubGlzdERpZmZlcmVuY2UobGlzdERpZmZlcmVuY2UpO1xuaGFyZGVuKGxpc3REaWZmZXJlbmNlKTtcblxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBpbm5lckVyclxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBsYWJlbFxuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yPX0gRXJyb3JDb25zdHJ1Y3RvclxuICogQHJldHVybnMge25ldmVyfVxuICovXG5cbi8qIEV2YWRlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTQ1MCB1c2luZyBibGFuayBsaW5lKi9cbmNvbnN0ICAgICAgICB0aHJvd0xhYmVsZWQ9KGlubmVyRXJyLGxhYmVsLEVycm9yQ29uc3RydWN0b3I9dW5kZWZpbmVkKT0+e1xuaWYodHlwZW9mIGxhYmVsPT09J251bWJlcicpe1xubGFiZWw9IGBbJHtsYWJlbH1dYDtcbiB9XG5jb25zdCBvdXRlckVycj1hc3NlcnQuZXJyb3IoXG4gYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YCxcbkVycm9yQ29uc3RydWN0b3IpO1xuXG5hc3NlcnQubm90ZShvdXRlckVycixYIGBDYXVzZWQgYnkgJHtpbm5lckVycn1gKTtcbnRocm93IG91dGVyRXJyO1xuIH07JGjigI1fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBLFJcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gUn0gZnVuY1xuICogQHBhcmFtIHtBW119IGFyZ3NcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge1J9XG4gKi9cbmNvbnN0ICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3I9KGZ1bmMsYXJncyxsYWJlbD11bmRlZmluZWQpPT57XG5pZihsYWJlbD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYyguLi5hcmdzKTtcbiB9XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG50aHJvd0xhYmVsZWQoZXJyLGxhYmVsKTtcbiB9XG5pZihpc1Byb21pc2UocmVzdWx0KSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIElmIHJlc3VsdCBpcyBhIHJlamVjdGVkIHByb21pc2UsIHRoaXMgd2lsbCovXG4vKiByZXR1cm4gYSBwcm9taXNlIHdpdGggYSBkaWZmZXJlbnQgcmVqZWN0aW9uIHJlYXNvbi4gQnV0IHRoaXMqL1xuLyogY29uZnVzZXMgVHlwZVNjcmlwdCBiZWNhdXNlIGl0IHR5cGVzIHRoYXQgY2FzZSBhcyBgUHJvbWlzZTxuZXZlcj5gKi9cbi8qIHdoaWNoIGlzIGNvb2wgZm9yIGEgcHJvbWlzZSB0aGF0IHdpbGwgbmV2ZXIgZnVsZmxsLiovXG4vKiBCdXQgVHlwZVNjcmlwdCBkb2Vzbid0IHVuZGVyc3RhbmQgdGhhdCB0aGlzIHdpbGwgb25seSBoYXBwZW4qL1xuLyogd2hlbiBgcmVzdWx0YCB3YXMgYSByZWplY3RlZCBwcm9taXNlLiBJbiBvbmx5IHRoaXMgY2FzZSBgUmAqL1xuLyogc2hvdWxkIGFscmVhZHkgYWxsb3cgYFByb21pc2U8bmV2ZXI+YCBhcyBhIHN1YnR5cGUuKi9cbnJldHVybiBFLndoZW4ocmVzdWx0LHVuZGVmaW5lZCwocmVhc29uKT0+dGhyb3dMYWJlbGVkKHJlYXNvbixsYWJlbCkpO1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfTskaOKAjV9vbmNlLmFwcGx5TGFiZWxpbmdFcnJvcihhcHBseUxhYmVsaW5nRXJyb3IpO1xuaGFyZGVuKGFwcGx5TGFiZWxpbmdFcnJvcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdLCJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl0sImxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl0sInRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXSwiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAKUr6fcAkAAHAJAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvbWVtby1yYWNlLmpzIiwiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsIFskaOKAjV9hID0+IChtZW1vUmFjZSA9ICRo4oCNX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VQcm9taXNlS2l0XCJ9KTskaOKAjV9vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCAnbmFtZScsIHt2YWx1ZTogXCJyYWNlUHJvbWlzZXNcIn0pOyRo4oCNX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSAqL1xuY29uc3QgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZT1nbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlfHxQcm9taXNlO1xuXG4vKipcbiAqIG1ha2VQcm9taXNlS2l0KCkgYnVpbGRzIGEgUHJvbWlzZSBvYmplY3QsIGFuZCByZXR1cm5zIGEgcmVjb3JkXG4gKiBjb250YWluaW5nIHRoZSBwcm9taXNlIGl0c2VsZiwgYXMgd2VsbCBhcyBzZXBhcmF0ZSBmYWNldHMgZm9yIHJlc29sdmluZ1xuICogYW5kIHJlamVjdGluZyBpdC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1hpbXBvcnQoJy4vc3JjL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPn1cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VQcm9taXNlS2l0KCl7XG5jb25zdHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn09bWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbmNvbnN0IHByb21pc2U9bmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtwcm9taXNlLHJlc29sdmUscmVqZWN0fSk7XG4gfVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLyogTkI6IEFub3RoZXIgaW1wbGVtZW50YXRpb24gZm9yIFByb21pc2UucmFjZSB3b3VsZCBiZSB0byB1c2UgdGhlIHJlbGVhc2luZyBleGVjdXRvciwqL1xuLyogSG93ZXZlciB3aGlsZSBpdCB3b3VsZCBubyBsb25nZXIgbGVhayB0aGUgcmFjZWQgcHJvbWlzZSBvYmplY3RzIHRoZW1zZWx2ZXMsIGl0IHdvdWxkKi9cbi8qIHN0aWxsIGxlYWsgcmVhY3Rpb25zIG9uIHRoZSBub24tcmVzb2x2ZWQgcHJvbWlzZXMgY29udGVuZGluZyBmb3IgdGhlIHJhY2UuKi9cblxuLyoqXG4gKiBDcmVhdGVzIGEgUHJvbWlzZSB0aGF0IGlzIHJlc29sdmVkIG9yIHJlamVjdGVkIHdoZW4gYW55IG9mIHRoZSBwcm92aWRlZCBQcm9taXNlcyBhcmUgcmVzb2x2ZWRcbiAqIG9yIHJlamVjdGVkLlxuICpcbiAqIFVubGlrZSBgUHJvbWlzZS5yYWNlYCBpdCBjbGVhbnMgdXAgYWZ0ZXIgaXRzZWxmIHNvIGEgbm9uLXJlc29sdmVkIHZhbHVlIGRvZXNuJ3QgaG9sZCBvbnRvXG4gKiB0aGUgcmVzdWx0IHByb21pc2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VD4+fSBBIG5ldyBQcm9taXNlLlxuICovXG5mdW5jdGlvbiAgICAgICAgcmFjZVByb21pc2VzKHZhbHVlcyl7XG5yZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSx2YWx1ZXMpKTtcbiB9XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZUtpdCI6WyJtYWtlUHJvbWlzZUtpdCJdLCJyYWNlUHJvbWlzZXMiOlsicmFjZVByb21pc2VzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIh9gazfAgAA3wIAACsAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9pcy1wcm9taXNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpc1Byb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCAnbmFtZScsIHt2YWx1ZTogXCJpc1Byb21pc2VcIn0pOyRo4oCNX29uY2UuaXNQcm9taXNlKGlzUHJvbWlzZSk7ICAgLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG1heWJlUHJvbWlzZSBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge21heWJlUHJvbWlzZSBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG5mdW5jdGlvbiAgICAgICAgaXNQcm9taXNlKG1heWJlUHJvbWlzZSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSk9PT1tYXliZVByb21pc2U7XG4gfVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcm9taXNlIjpbImlzUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdp03rvhIAAL4SAAAqAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEluaXRpYWwgdmVyc2lvbiBhdXRob3JlZCBieSBCcmlhbiBLaW06XG5odHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzE3NDY5I2lzc3VlY29tbWVudC02ODUyMTY3NzdcbiBUaGlzIGlzIGZyZWUgYW5kIHVuZW5jdW1iZXJlZCBzb2Z0d2FyZSByZWxlYXNlZCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLlxuIEFueW9uZSBpcyBmcmVlIHRvIGNvcHksIG1vZGlmeSwgcHVibGlzaCwgdXNlLCBjb21waWxlLCBzZWxsLCBvclxuZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlLCBlaXRoZXIgaW4gc291cmNlIGNvZGUgZm9ybSBvciBhcyBhIGNvbXBpbGVkXG5iaW5hcnksIGZvciBhbnkgcHVycG9zZSwgY29tbWVyY2lhbCBvciBub24tY29tbWVyY2lhbCwgYW5kIGJ5IGFueVxubWVhbnMuXG4gSW4ganVyaXNkaWN0aW9ucyB0aGF0IHJlY29nbml6ZSBjb3B5cmlnaHQgbGF3cywgdGhlIGF1dGhvciBvciBhdXRob3JzXG5vZiB0aGlzIHNvZnR3YXJlIGRlZGljYXRlIGFueSBhbmQgYWxsIGNvcHlyaWdodCBpbnRlcmVzdCBpbiB0aGVcbnNvZnR3YXJlIHRvIHRoZSBwdWJsaWMgZG9tYWluLiBXZSBtYWtlIHRoaXMgZGVkaWNhdGlvbiBmb3IgdGhlIGJlbmVmaXRcbm9mIHRoZSBwdWJsaWMgYXQgbGFyZ2UgYW5kIHRvIHRoZSBkZXRyaW1lbnQgb2Ygb3VyIGhlaXJzIGFuZFxuc3VjY2Vzc29ycy4gV2UgaW50ZW5kIHRoaXMgZGVkaWNhdGlvbiB0byBiZSBhbiBvdmVydCBhY3Qgb2ZcbnJlbGlucXVpc2htZW50IGluIHBlcnBldHVpdHkgb2YgYWxsIHByZXNlbnQgYW5kIGZ1dHVyZSByaWdodHMgdG8gdGhpc1xuc29mdHdhcmUgdW5kZXIgY29weXJpZ2h0IGxhdy5cbiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELFxuRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG5NRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuXG5JTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUlxuT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsXG5BUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1Jcbk9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cbiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHJlZmVyIHRvIDxodHRwOi8vdW5saWNlbnNlLm9yZy8+XG4qL1xuXG5cblxuXG5cblxuXG5jb25zdCBpc09iamVjdD0odmFsdWUpPT5PYmplY3QodmFsdWUpPT09dmFsdWU7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlZmVycmVkXG4gKiBAcHJvcGVydHkgeyh2YWx1ZT86IFhpbXBvcnQoXCIuL3R5cGVzLmpzXCIpLkVSZWY8VD4gKSA9PiB2b2lkfSByZXNvbHZlXG4gKiBAcHJvcGVydHkgeyhlcnI/OiBhbnkgKSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHsgbmV2ZXJcbiAqICB8IHtzZXR0bGVkOiBmYWxzZSwgZGVmZXJyZWRzOiBTZXQ8RGVmZXJyZWQ+fVxuICogIHwge3NldHRsZWQ6IHRydWUsIGRlZmVycmVkcz86IHVuZGVmaW5lZH1cbiAqIH0gUHJvbWlzZU1lbW9SZWNvcmRcbiAqL1xuXG4vKiBLZXlzIGFyZSB0aGUgdmFsdWVzIHBhc3NlZCB0byByYWNlLCB2YWx1ZXMgYXJlIGEgcmVjb3JkIG9mIGRhdGEgY29udGFpbmluZyBhKi9cbi8qIHNldCBvZiBkZWZlcnJlZHMgYW5kIHdoZXRoZXIgdGhlIHZhbHVlIGhhcyBzZXR0bGVkLiovXG4vKiogQHR5cGUge1dlYWtNYXA8b2JqZWN0LCBQcm9taXNlTWVtb1JlY29yZD59ICovXG5jb25zdCBrbm93blByb21pc2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlTWVtb1JlY29yZCB8IHVuZGVmaW5lZH0gcmVjb3JkXG4gKiBAcmV0dXJucyB7U2V0PERlZmVycmVkPn1cbiAqL1xuY29uc3QgbWFya1NldHRsZWQ9KHJlY29yZCk9PntcbmlmKCFyZWNvcmR8fHJlY29yZC5zZXR0bGVkKXtcbnJldHVybiBuZXcgU2V0KCk7XG4gfVxuXG5jb25zdHtkZWZlcnJlZHN9PXJlY29yZDtcbk9iamVjdC5hc3NpZ24ocmVjb3JkLHtcbmRlZmVycmVkczp1bmRlZmluZWQsXG5zZXR0bGVkOnRydWV9KTtcblxuT2JqZWN0LmZyZWV6ZShyZWNvcmQpO1xucmV0dXJuIGRlZmVycmVkcztcbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlTWVtb1JlY29yZH1cbiAqL1xuY29uc3QgZ2V0TWVtb1JlY29yZD0odmFsdWUpPT57XG5pZighaXNPYmplY3QodmFsdWUpKXtcbi8qIElmIHRoZSBjb250ZW5kZXIgaXMgYSBwcmltaXRpdmUsIGF0dGVtcHRpbmcgdG8gdXNlIGl0IGFzIGEga2V5IGluIHRoZSovXG4vKiB3ZWFrbWFwIHdvdWxkIHRocm93IGFuIGVycm9yLiBMdWNraWx5LCBpdCBpcyBzYWZlIHRvIGNhbGwqL1xuLyogYFByb21pc2UucmVzb2x2ZShjb250ZW5kZXIpLnRoZW5gIG9uIGEgcHJpbWl0aXZlIHZhbHVlIG11bHRpcGxlIHRpbWVzKi9cbi8qIGJlY2F1c2UgdGhlIHByb21pc2UgZnVsZmlsbHMgaW1tZWRpYXRlbHkuIFNvIHdlIGZha2UgYSBzZXR0bGVkIHJlY29yZC4qL1xucmV0dXJuIGhhcmRlbih7c2V0dGxlZDp0cnVlfSk7XG4gfVxuXG5sZXQgcmVjb3JkPWtub3duUHJvbWlzZXMuZ2V0KHZhbHVlKTtcblxuaWYoIXJlY29yZCl7XG5yZWNvcmQ9e2RlZmVycmVkczpuZXcgU2V0KCksc2V0dGxlZDpmYWxzZX07XG5rbm93blByb21pc2VzLnNldCh2YWx1ZSxyZWNvcmQpO1xuLyogVGhpcyBjYWxsIHRvIGB0aGVuYCBoYXBwZW5zIG9uY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgdmFsdWUuKi9cblByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbih2YWwpPT57XG5mb3IoY29uc3R7cmVzb2x2ZX1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlc29sdmUodmFsKTtcbiB9XG4gfSxcbihlcnIpPT57XG5mb3IoY29uc3R7cmVqZWN0fW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVqZWN0KGVycik7XG4gfVxuIH0pO1xuXG4gfVxucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdHtyYWNlfT17XG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHRlbXBsYXRlIHtQcm9taXNlQ29uc3RydWN0b3J9IFtQPVByb21pc2VDb25zdHJ1Y3Rvcl1cbiAqIEB0aGlzIHtQfVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbnJhY2UodmFsdWVzKXtcbmxldCBkZWZlcnJlZDtcbi8qKiBAdHlwZSB7VFtdfSAqL1xuY29uc3QgY2FjaGVkVmFsdWVzPVtdO1xuY29uc3QgQz10aGlzO1xuY29uc3QgcmVzdWx0PW5ldyBDKChyZXNvbHZlLHJlamVjdCk9PntcbmRlZmVycmVkPXtyZXNvbHZlLHJlamVjdH07XG5mb3IoY29uc3QgdmFsdWUgb2YgdmFsdWVzKXtcbmNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbmNvbnN0e3NldHRsZWQsZGVmZXJyZWRzfT1nZXRNZW1vUmVjb3JkKHZhbHVlKTtcbmlmKHNldHRsZWQpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBzZXR0bGVkIChpbmNsdWRpbmcgcHJpbWl0aXZlcyksIGl0IGlzIHNhZmUqL1xuLyogdG8gY2FsbCBgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuYCBvbiBpdC4qL1xuQy5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUscmVqZWN0KTtcbiB9ZWxzZXtcbmRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG5cbi8qIFRoZSBmaW5hbGx5IGNhbGxiYWNrIGV4ZWN1dGVzIHdoZW4gYW55IHZhbHVlIHNldHRsZXMsIHByZXZlbnRpbmcgYW55IG9mKi9cbi8qIHRoZSB1bnJlc29sdmVkIHZhbHVlcyBmcm9tIHJldGFpbmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVzb2x2ZWQgdmFsdWUuKi9cbnJldHVybiByZXN1bHQuZmluYWxseSgoKT0+e1xuZm9yKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcyl7XG5jb25zdHtkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoZGVmZXJyZWRzKXtcbmRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG4gfX07JGjigI1fb25jZS5yYWNlKHJhY2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA00Ow7mkHAABpBwAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2FsbGJhY2sgUHJvbWlzZUV4ZWN1dG9yIFRoZSBwcm9taXNlIGV4ZWN1dG9yXG4gKiBAcGFyYW0geyh2YWx1ZTogWGltcG9ydCgnLi90eXBlcy5qcycpLkVSZWY8VD4pID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwYXJhbSB7KHJlYXNvbjogYW55KSA9PiB2b2lkfSByZWplY3RcbiAqL1xuXG4vKipcbiAqIG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpIGJ1aWxkcyByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgd2hpY2ggZHJvcCByZWZlcmVuY2VzXG4gKiB0byB0aGUgcmVzb2x2ZS9yZWplY3QgZnVuY3Rpb25zIGdhdGhlcmVkIGZyb20gYW4gZXhlY3V0b3IgdG8gYmUgdXNlZCB3aXRoIGFcbiAqIHByb21pc2UgY29uc3RydWN0b3IuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtQaWNrPFhpbXBvcnQoJy4vdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+LCAncmVzb2x2ZScgfCAncmVqZWN0Jz4gJiB7IGV4ZWN1dG9yOiBQcm9taXNlRXhlY3V0b3I8VD59fVxuICovXG5jb25zdCAgICAgICAgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0PSgpPT57XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHZhbHVlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZXNvbHZlO1xuLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKChyZWFzb246IHVua25vd24pID0+IHZvaWQpfSAqL1xubGV0IGludGVybmFsUmVqZWN0O1xuXG4vKiogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPn0gdmFsdWUgKi9cbmNvbnN0IHJlc29sdmU9KHZhbHVlKT0+e1xuaWYoaW50ZXJuYWxSZXNvbHZlKXtcbmludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09bnVsbCk7XG4gfVxuIH07XG5cbi8qKiBAcGFyYW0ge3Vua25vd259IHJlYXNvbiAqL1xuY29uc3QgcmVqZWN0PShyZWFzb24pPT57XG5pZihpbnRlcm5hbFJlamVjdCl7XG5pbnRlcm5hbFJlamVjdChyZWFzb24pO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVqZWN0PT09bnVsbCk7XG4gfVxuIH07XG5cbmNvbnN0IGV4ZWN1dG9yPShyZXMscmVqKT0+e1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PXVuZGVmaW5lZCYmaW50ZXJuYWxSZWplY3Q9PT11bmRlZmluZWQpO1xuaW50ZXJuYWxSZXNvbHZlPXJlcztcbmludGVybmFsUmVqZWN0PXJlajtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn0pO1xuIH07JGjigI1fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmBk7szQBAAA0AQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAyuJeT0GAAA9BgAAB0AAABAZW5kby9zdHJlYW0tdjAuMy4yNS9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJtYWtlUGlwZSIsIm1ha2VRdWV1ZSIsIm1ha2VTdHJlYW0iLCJtYXBSZWFkZXIiLCJtYXBXcml0ZXIiLCJwcmltZSIsInB1bXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxtYWtlUHJvbWlzZUtpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIHJlc29sdmUodmFsdWU/OiBUIHwgUHJvbWlzZTxUPik6IHZvaWQsXG4gKiAgIHJlamVjdChlcnJvcjogRXJyb3IpOiB2b2lkLFxuICogICBwcm9taXNlOiBQcm9taXNlPFQ+XG4gKiB9fSBQcm9taXNlS2l0XG4gKi9cblxuLyogVHlwZVNjcmlwdCBSZWFkT25seSBzZW1hbnRpY3MgYXJlIG5vdCBzdWZmaWNpZW50bHkgZXhwcmVzc2l2ZSB0byBkaXN0aW5ndWlzaCovXG4vKiBhIHZhbHVlIG9uZSBwcm9taXNlcyBub3QgdG8gYWx0ZXIgZnJvbSBhIHZhbHVlIG9uZSBtdXN0IG5vdCBhbHRlciwqL1xuLyogbWFraW5nIGl0IHVzZWxlc3MuKi9cbmNvbnN0IGZyZWV6ZT0vKiogQHR5cGUgezxUPih2OiBUIHwgUmVhZG9ubHk8VD4pID0+IFR9ICovT2JqZWN0LmZyZWV6ZTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Bc3luY1F1ZXVlPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVF1ZXVlPSgpPT57XG5sZXR7cHJvbWlzZTp0YWlsUHJvbWlzZSxyZXNvbHZlOnRhaWxSZXNvbHZlfT1tYWtlUHJvbWlzZUtpdCgpO1xucmV0dXJue1xucHV0KHZhbHVlKXtcbmNvbnN0e3Jlc29sdmUscHJvbWlzZX09bWFrZVByb21pc2VLaXQoKTtcbnRhaWxSZXNvbHZlKGZyZWV6ZSh7dmFsdWUscHJvbWlzZX0pKTtcbnRhaWxSZXNvbHZlPXJlc29sdmU7XG4gfSxcbmdldCgpe1xuY29uc3QgcHJvbWlzZT10YWlsUHJvbWlzZS50aGVuKChuZXh0KT0+bmV4dC52YWx1ZSk7XG50YWlsUHJvbWlzZT10YWlsUHJvbWlzZS50aGVuKChuZXh0KT0+bmV4dC5wcm9taXNlKTtcbnJldHVybiBoYXJkZW4ocHJvbWlzZSk7XG4gfX07XG5cbiB9OyRo4oCNX29uY2UubWFrZVF1ZXVlKG1ha2VRdWV1ZSk7XG5oYXJkZW4obWFrZVF1ZXVlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmVhZFJldHVyblxuICogQHRlbXBsYXRlIFRXcml0ZVJldHVyblxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXN5bmNRdWV1ZTxJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJlYWRSZXR1cm4+Pn0gYWNrc1xuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQXN5bmNRdWV1ZTxJdGVyYXRvclJlc3VsdDxUV3JpdGUsIFRXcml0ZVJldHVybj4+fSBkYXRhXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3RyZWFtPShhY2tzLGRhdGEpPT57XG5jb25zdCBzdHJlYW09aGFyZGVuKHtcbi8qKlxuICogQHBhcmFtIHtUV3JpdGV9IHZhbHVlXG4gKi9cbm5leHQodmFsdWUpe1xuLyogTm90ZSB0aGUgc2hhbGxvdyBmcmVlemUgc2luY2UgdmFsdWUgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgZnJlZXphYmxlKi9cbi8qICh0eXBlZCBhcnJheXMgYXJlIG5vdCkuKi9cbmRhdGEucHV0KGZyZWV6ZSh7dmFsdWUsZG9uZTpmYWxzZX0pKTtcbnJldHVybiBhY2tzLmdldCgpO1xuIH0sXG4vKipcbiAqIEBwYXJhbSB7VFdyaXRlUmV0dXJufSB2YWx1ZVxuICovXG5yZXR1cm4odmFsdWUpe1xuZGF0YS5wdXQoZnJlZXplKHt2YWx1ZSxkb25lOnRydWV9KSk7XG5yZXR1cm4gYWNrcy5nZXQoKTtcbiB9LFxuLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICovXG50aHJvdyhlcnJvcil7XG5kYXRhLnB1dChoYXJkZW4oUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG5yZXR1cm4gYWNrcy5nZXQoKTtcbiB9LFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe1xucmV0dXJuIHN0cmVhbTtcbiB9fSk7XG5cbnJldHVybiBzdHJlYW07XG4gfTskaOKAjV9vbmNlLm1ha2VTdHJlYW0obWFrZVN0cmVhbSk7XG5oYXJkZW4obWFrZVN0cmVhbSk7XG5cbi8qIEpTRG9jIFR5cGVTY3JpcHQgc2VlbXMgdW5hYmxlIHRvIGV4cHJlc3MgdGhpcyBwYXJ0aWN1bGFyIGZ1bmN0aW9uJ3MqL1xuLyogZW50YW5nbGVtZW50IG9mIHF1ZXVlcywgYnV0IHRoZSBkZWZpbml0aW9uIGluIHR5cGVzLmQudHMgd29ya3MgZm9yIHRoZSBlbmQqL1xuLyogdXNlci4qL1xuY29uc3QgICAgICAgIG1ha2VQaXBlPSgpPT57XG5jb25zdCBkYXRhPW1ha2VRdWV1ZSgpO1xuY29uc3QgYWNrcz1tYWtlUXVldWUoKTtcbmNvbnN0IHJlYWRlcj1tYWtlU3RyZWFtKGFja3MsZGF0YSk7XG5jb25zdCB3cml0ZXI9bWFrZVN0cmVhbShkYXRhLGFja3MpO1xucmV0dXJuIGhhcmRlbihbd3JpdGVyLHJlYWRlcl0pO1xuIH07JGjigI1fb25jZS5tYWtlUGlwZShtYWtlUGlwZSk7XG5oYXJkZW4obWFrZVBpcGUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUUmVhZFxuICogQHRlbXBsYXRlIFRXcml0ZVxuICogQHRlbXBsYXRlIFRSZWFkUmV0dXJuXG4gKiBAdGVtcGxhdGUgVFdyaXRlUmV0dXJuXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TdHJlYW08VFdyaXRlLCBUUmVhZCwgVFdyaXRlUmV0dXJuLCBUUmVhZFJldHVybj59IHdyaXRlclxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU3RyZWFtPFRSZWFkLCBUV3JpdGUsIFRSZWFkUmV0dXJuLCBUV3JpdGVSZXR1cm4+fSByZWFkZXJcbiAqIEBwYXJhbSB7VFdyaXRlfSBwcmltZXJcbiAqL1xuY29uc3QgICAgICAgIHB1bXA9YXN5bmMod3JpdGVyLHJlYWRlcixwcmltZXIpPT57XG4vKiogQHBhcmFtIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRSZWFkLCBUUmVhZFJldHVybj4+fSBwcm9taXNlICovXG5jb25zdCB0aWNrPShwcm9taXNlKT0+XG5FLndoZW4oXG5wcm9taXNlLFxuKHJlc3VsdCk9PntcbmlmKHJlc3VsdC5kb25lKXtcbnJldHVybiB3cml0ZXIucmV0dXJuKHJlc3VsdC52YWx1ZSk7XG4gfWVsc2V7XG4vKiBCZWhvbGQ6IG11dHVhbCByZWN1cnNpb24uKi9cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gdG9jayh3cml0ZXIubmV4dChyZXN1bHQudmFsdWUpKTtcbiB9XG4gfSxcbigvKiogQHR5cGUge0Vycm9yfSAqL2Vycm9yKT0+e1xucmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gfSk7XG5cbi8qKiBAcGFyYW0ge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VFdyaXRlLCBUV3JpdGVSZXR1cm4+Pn0gcHJvbWlzZSAqL1xuY29uc3QgdG9jaz0ocHJvbWlzZSk9PlxuRS53aGVuKFxucHJvbWlzZSxcbihyZXN1bHQpPT57XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gcmVhZGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuIH1lbHNle1xucmV0dXJuIHRpY2socmVhZGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gfVxuIH0sXG4oLyoqIEB0eXBlIHtFcnJvcn0gKi9lcnJvcik9PntcbnJldHVybiByZWFkZXIudGhyb3coZXJyb3IpO1xuIH0pO1xuXG5hd2FpdCB0aWNrKHJlYWRlci5uZXh0KHByaW1lcikpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9OyRo4oCNX29uY2UucHVtcChwdW1wKTtcbmhhcmRlbihwdW1wKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmV0dXJuXG4gKiBAcGFyYW0ge0FzeW5jR2VuZXJhdG9yPFRSZWFkLCBUUmV0dXJuLCBUV3JpdGU+fSBnZW5lcmF0b3JcbiAqIEBwYXJhbSB7VFdyaXRlfSBwcmltZXJcbiAqL1xuY29uc3QgICAgICAgIHByaW1lPShnZW5lcmF0b3IscHJpbWVyKT0+e1xuLyogV2UgY2FwdHVyZSB0aGUgZmlyc3QgcmV0dXJuZWQgcHJvbWlzZS4qL1xuY29uc3QgZmlyc3Q9Z2VuZXJhdG9yLm5leHQocHJpbWVyKTtcbi8qKiBAdHlwZSB7SXRlcmF0b3JSZXN1bHQ8VFJlYWQsIFRSZXR1cm4+PX0gKi9cbmxldCByZXN1bHQ7XG5jb25zdCBwcmltZWQ9aGFyZGVuKHtcbi8qKiBAcGFyYW0ge1RXcml0ZX0gdmFsdWUgKi9cbiAgICAgIGFzeW5jIG5leHQodmFsdWUpe1xuaWYocmVzdWx0PT09dW5kZWZpbmVkKXtcbnJlc3VsdD1hd2FpdCBmaXJzdDtcbmlmKHJlc3VsdC5kb25lKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbnJldHVybiBnZW5lcmF0b3IubmV4dCh2YWx1ZSk7XG4gfSxcbi8qKiBAcGFyYW0ge1RSZXR1cm59IHZhbHVlICovXG4gICAgICBhc3luYyByZXR1cm4odmFsdWUpe1xuaWYocmVzdWx0PT09dW5kZWZpbmVkKXtcbnJlc3VsdD1hd2FpdCBmaXJzdDtcbmlmKHJlc3VsdC5kb25lKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbnJldHVybiBnZW5lcmF0b3IucmV0dXJuKHZhbHVlKTtcbiB9LFxuLyoqIEBwYXJhbSB7RXJyb3J9IGVycm9yICovXG4gICAgICBhc3luYyB0aHJvdyhlcnJvcil7XG5pZihyZXN1bHQ9PT11bmRlZmluZWQpe1xucmVzdWx0PWF3YWl0IGZpcnN0O1xuaWYocmVzdWx0LmRvbmUpe1xudGhyb3cgZXJyb3I7XG4gfVxuIH1cbnJldHVybiBnZW5lcmF0b3IudGhyb3coZXJyb3IpO1xuIH19KTtcblxucmV0dXJuIHByaW1lZDtcbiB9OyRo4oCNX29uY2UucHJpbWUocHJpbWUpO1xuaGFyZGVuKHByaW1lKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVEluXG4gKiBAdGVtcGxhdGUgVE91dFxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVhZGVyPFRJbj59IHJlYWRlclxuICogQHBhcmFtIHsodmFsdWU6IFRJbikgPT4gVE91dH0gdHJhbnNmb3JtXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlYWRlcjxUT3V0Pn1cbiAqL1xuY29uc3QgICAgICAgIG1hcFJlYWRlcj0ocmVhZGVyLHRyYW5zZm9ybSk9PntcbmFzeW5jIGZ1bmN0aW9uKnRyYW5zZm9ybUdlbmVyYXRvcigpe1xuZm9yIGF3YWl0KGNvbnN0IHZhbHVlIG9mIHJlYWRlcil7XG55aWVsZCB0cmFuc2Zvcm0odmFsdWUpO1xuIH1cbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIGhhcmRlbih0cmFuc2Zvcm1HZW5lcmF0b3IoKSk7XG4gfTskaOKAjV9vbmNlLm1hcFJlYWRlcihtYXBSZWFkZXIpO1xuaGFyZGVuKG1hcFJlYWRlcik7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRJblxuICogQHRlbXBsYXRlIFRPdXRcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLldyaXRlcjxUT3V0Pn0gd3JpdGVyXG4gKiBAcGFyYW0geyh2YWx1ZTogVEluKSA9PiBUT3V0fSB0cmFuc2Zvcm1cbiAqIEByZXR1cm5zIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuV3JpdGVyPFRJbj59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBXcml0ZXI9KHdyaXRlcix0cmFuc2Zvcm0pPT57XG5jb25zdCB0cmFuc2Zvcm1lZFdyaXRlcj1oYXJkZW4oe1xuLyoqXG4gKiBAcGFyYW0ge1RJbn0gdmFsdWVcbiAqL1xuICAgICAgYXN5bmMgbmV4dCh2YWx1ZSl7XG5yZXR1cm4gd3JpdGVyLm5leHQodHJhbnNmb3JtKHZhbHVlKSk7XG4gfSxcbi8qKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqL1xuICAgICAgYXN5bmMgdGhyb3coZXJyb3Ipe1xucmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gfSxcbi8qKlxuICogQHBhcmFtIHt1bmRlZmluZWR9IHZhbHVlXG4gKi9cbiAgICAgIGFzeW5jIHJldHVybih2YWx1ZSl7XG5yZXR1cm4gd3JpdGVyLnJldHVybih2YWx1ZSk7XG4gfSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbiB9fSk7XG5cbnJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbiB9OyRo4oCNX29uY2UubWFwV3JpdGVyKG1hcFdyaXRlcik7XG5oYXJkZW4obWFwV3JpdGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUXVldWUiOlsibWFrZVF1ZXVlIl0sIm1ha2VTdHJlYW0iOlsibWFrZVN0cmVhbSJdLCJtYWtlUGlwZSI6WyJtYWtlUGlwZSJdLCJwdW1wIjpbInB1bXAiXSwicHJpbWUiOlsicHJpbWUiXSwibWFwUmVhZGVyIjpbIm1hcFJlYWRlciJdLCJtYXBXcml0ZXIiOlsibWFwV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIu6h5KtAQAArQEAABwAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9tYWluLmpzeyJpbXBvcnRzIjpbIi4vcmluZzAvbWFpbi5qcyIsIi4vcmluZzEvbWFpbi5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vcmluZzAvbWFpbi5qcyIsIi4vcmluZzEvbWFpbi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vcmluZzAvbWFpbi5qc1wiLCBbXV0sW1wiLi9yaW5nMS9tYWluLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACdzxOJXQEAAF0BAAAfAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvRS5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyJAZW5kby9mYXIiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPi0yb+pAwAAqQMAACwAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXN5bmNHZW5lcmF0ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogUmV0dXJuIGFuIGFzeW5jIGl0ZXJhYmxlIHRoYXQgcHJvZHVjZXMgaXRlcmF0b3IgcmVzdWx0cyB2aWEgYG5leHRgLlxuICpcbiAqIFRoaXMgd29ya3MgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIFN5bWJvbC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxUUmV0dXJuXG4gKiBAcGFyYW0geygpID0+IEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+IHxcbiAqICAgICAgICAgICAgICAgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj5cbiAqIH0gbmV4dCBwcm9kdWNlIGEgc2luZ2xlLXN0ZXAgaXRlcmF0b3IgcmVzdWx0XG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIGFzeW5jR2VuZXJhdGU9KG5leHQpPT57XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbnJldHVybiBoYXJkZW4oe1xubmV4dDphc3luYygpPT5oYXJkZW4obmV4dCgpKX0pO1xuXG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLmFzeW5jR2VuZXJhdGUoYXN5bmNHZW5lcmF0ZSk7XG5oYXJkZW4oYXN5bmNHZW5lcmF0ZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNHZW5lcmF0ZSI6WyJhc3luY0dlbmVyYXRlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJfXVO3QAQAA0AEAACIAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWluLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiLCIuL21ha2Vycy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vRS5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiLCIuL21ha2Vycy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbXV0sW1wiLi9tYWtlcnMuanNcIiwgW11dLFtcIi4vYXN5bmMtZ2VuZXJhdGUuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG+be2LjCAAA4wgAACQAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWtlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VNYXAiLCJtYWtlUHJvbWlzZSIsIm1ha2VTZXQiLCJtYWtlV2Vha01hcCIsIm1ha2VXZWFrU2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qIFRoZXNlIHdvcmsgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIGBuZXdgLiovXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiIC8+Ki9cblxuLyoqIEB0eXBlIHs8VD4oZXhlY3V0b3I6IChyZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWQsIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT5cbiAqIHZvaWQpID0+IHZvaWQpID0+IFByb21pc2U8VD59ICovXG5jb25zdCAgICAgICAgbWFrZVByb21pc2U9KGV4ZWN1dG9yKT0+aGFyZGVuKG5ldyBQcm9taXNlKGV4ZWN1dG9yKSk7JGjigI1fb25jZS5tYWtlUHJvbWlzZShtYWtlUHJvbWlzZSk7XG5oYXJkZW4obWFrZVByb21pc2UpO1xuXG4vKiogQHR5cGVkZWYgezxLLCBWPihlbnRyaWVzPzogcmVhZG9ubHkgKHJlYWRvbmx5IFtLLCBWXSlbXSkgPT4gTWFwPEssIFY+fSBNYXBGcm9tRW50cmllcyAqL1xuLyoqIEB0eXBlZGVmIHs8SywgVj4oaXRlcmFibGU6IEl0ZXJhYmxlPHJlYWRvbmx5IFtLLCBWXT4pID0+IE1hcDxLLCBWPn0gTWFwRnJvbUl0ZXJhYmxlICovXG5cbi8qKiBAdHlwZSB7TWFwRnJvbUVudHJpZXMgJiBNYXBGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZU1hcD0oZW50cmllc09ySXRlcmFibGUpPT5oYXJkZW4obmV3IE1hcChlbnRyaWVzT3JJdGVyYWJsZSkpOyRo4oCNX29uY2UubWFrZU1hcChtYWtlTWFwKTtcbmhhcmRlbihtYWtlTWFwKTtcblxuLyoqIEB0eXBlZGVmIHs8VD4odmFsdWVzPzogcmVhZG9ubHkgVFtdKSA9PiBTZXQ8VD59IFNldEZyb21WYWx1ZXMgKi9cbi8qKiBAdHlwZWRlZiB7PFQ+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPikgPT4gU2V0PFQ+fSBTZXRGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7U2V0RnJvbVZhbHVlcyAmIFNldEZyb21JdGVyYWJsZX0gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0PSh2YWx1ZXMpPT5oYXJkZW4obmV3IFNldCh2YWx1ZXMpKTskaOKAjV9vbmNlLm1ha2VTZXQobWFrZVNldCk7XG5oYXJkZW4obWFrZVNldCk7XG5cbi8qKiBAdHlwZWRlZiB7PEsgZXh0ZW5kcyB7fSwgViA9IGFueT4oZW50cmllcz86IHJlYWRvbmx5IFtLLCBWXVtdIHwgbnVsbCkgPT4gV2Vha01hcDxLLCBWPn0gV2Vha01hcEZyb21FbnRyaWVzICovXG4vKiogQHR5cGVkZWYgezxLIGV4dGVuZHMge30sIFY+KGl0ZXJhYmxlOiBJdGVyYWJsZTxbSywgVl0+KSA9PiBXZWFrTWFwPEssIFY+fSBXZWFrTWFwRnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1dlYWtNYXBGcm9tRW50cmllcyAmIFdlYWtNYXBGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtNYXA9KGVudHJpZXMpPT5oYXJkZW4obmV3IFdlYWtNYXAoZW50cmllcykpOyRo4oCNX29uY2UubWFrZVdlYWtNYXAobWFrZVdlYWtNYXApO1xuaGFyZGVuKG1ha2VXZWFrTWFwKTtcblxuLyoqIEB0eXBlZGVmIHs8VCBleHRlbmRzIHt9Pih2YWx1ZXM/OiByZWFkb25seSBUW10pID0+IFdlYWtTZXQ8VD59IFdlYWtTZXRGcm9tVmFsdWVzICovXG4vKiogQHR5cGVkZWYgezxUIGV4dGVuZHMge30+KGl0ZXJhYmxlOiBJdGVyYWJsZTxUPikgPT4gV2Vha1NldDxUPn0gV2Vha1NldEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtXZWFrU2V0RnJvbVZhbHVlcyAmIFdlYWtTZXRGcm9tSXRlcmFibGV9ICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtTZXQ9KHZhbHVlcyk9PmhhcmRlbihuZXcgV2Vha1NldCh2YWx1ZXMpKTskaOKAjV9vbmNlLm1ha2VXZWFrU2V0KG1ha2VXZWFrU2V0KTtcbmhhcmRlbihtYWtlV2Vha1NldCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2UiOlsibWFrZVByb21pc2UiXSwibWFrZU1hcCI6WyJtYWtlTWFwIl0sIm1ha2VTZXQiOlsibWFrZVNldCJdLCJtYWtlV2Vha01hcCI6WyJtYWtlV2Vha01hcCJdLCJtYWtlV2Vha1NldCI6WyJtYWtlV2Vha1NldCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC0LPWY/gQAAP4EAAApAAAAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanN7ImltcG9ydHMiOlsiLi4vcmluZzAvbWFpbi5qcyJdLCJleHBvcnRzIjpbImFzeW5jRG9XaGlsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlUHJvbWlzZTskaOKAjV9pbXBvcnRzKFtbXCIuLi9yaW5nMC9tYWluLmpzXCIsIFtbXCJtYWtlUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAobWFrZVByb21pc2UgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qKlxuICogUmVzb2x2ZSByZXR1cm5lZCBwcm9taXNlIHdpdGggdW5kZWZpbmVkIHdoZW4gYGJvZHlgIHJldHVybnMgZmFsc3kuXG4gKlxuICogVGhpcyB3b3JrcyBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgYGF3YWl0YCBub3QgYXQgdGhlIGZ1bmN0aW9uLWxldmVsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFQgfCBQcm9taXNlPFQ+fSBib2R5IHBlcmZvcm0gc2lkZS1lZmZlY3RzLCBhbmQgcmV0dXJuIHRydXRoeSBpZlxuICogd2Ugc2hvdWxkIHJ1biBhZ2FpblxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbmNvbnN0ICAgICAgICBhc3luY0RvV2hpbGU9KGJvZHkpPT57XG5jb25zdCBsb29wPWFzeW5jKHJlc29sdmUscmVqZWN0KT0+e1xuY29uc3QgZG9Db250aW51ZT1hd2FpdCBib2R5KCk7XG5pZighZG9Db250aW51ZSl7XG4vKiBSZXNvbHZlIHRoZSBvdXRlcm1vc3QgcHJvbWlzZS4qL1xucmVzb2x2ZSh1bmRlZmluZWQpO1xucmV0dXJuO1xuIH1cblxuLyogRG8gdGhlIGxvb3AgYWdhaW4uICBXZSBhcmUgY2FyZWZ1bCBub3QgdG8gYXdhaXQgc28gdGhhdCB3ZSBkb24ndCBjcmVhdGUgYSovXG4vKiBwcm9taXNlIGNoYWluLiovXG5sb29wKHJlc29sdmUscmVqZWN0KS5jYXRjaChyZWplY3QpO1xuIH07XG5cbnJldHVybiBtYWtlUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QpPT5sb29wKHJlc29sdmUscmVqZWN0KS5jYXRjaChyZWplY3QpKTtcbiB9OyRo4oCNX29uY2UuYXN5bmNEb1doaWxlKGFzeW5jRG9XaGlsZSk7XG5oYXJkZW4oYXN5bmNEb1doaWxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0RvV2hpbGUiOlsiYXN5bmNEb1doaWxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJYTQrJyAQAAcgEAACIAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMS9tYWluLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9hc3luYy10b29scy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAQIeAwoAAAAAAAAAAACGNPcydwQBAHcEAQAUAAAAAAAAAAAAAACkgQAAAABjb21wYXJ0bWVudC1tYXAuanNvblBLAQIeAwoAAAAAAAAAAAA5ilYCOwsAADsLAAAjAAAAAAAAAAAAAACkgakEAQBAYWdvcmljL2Fzc2VydC12MC42LjAvc3JjL2Fzc2VydC5qc1BLAQIeAwoAAAAAAAAAAAAFuYfs2i4AANouAAAiAAAAAAAAAAAAAACkgSUQAQBAYWdvcmljL2Fzc2VydC12MC42LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAFP1hb9GNwAARjcAACYAAAAAAAAAAAAAAKSBPz8BAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzUEsBAh4DCgAAAAAAAAAAAEqUAO3VBQAA1QUAACcAAAAAAAAAAAAAAKSByXYBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9kaXNwbGF5SW5mby5qc1BLAQIeAwoAAAAAAAAAAABDMHvc6AEAAOgBAAAhAAAAAAAAAAAAAACkgeN8AQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAANV3BKJggAACYIAAAJQAAAAAAAAAAAAAApIEKfwEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2lzc3VlcktpdC5qc1BLAQIeAwoAAAAAAAAAAACAyG7uswUAALMFAAA6AAAAAAAAAAAAAACkgeWfAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAHHnYj3HBQAAxwUAADoAAAAAAAAAAAAAAKSB8KUBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAA/9yw+yoGAAAqBgAANgAAAAAAAAAAAAAApIEPrAEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAACaZmC+fBwAAnwcAADYAAAAAAAAAAAAAAKSBjbIBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAACwOKgfpQQAAKUEAAAjAAAAAAAAAAAAAACkgYC6AQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudC5qc1BLAQIeAwoAAAAAAAAAAAAP1+ju6zEAAOsxAAApAAAAAAAAAAAAAACkgWa/AQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudExlZGdlci5qc1BLAQIeAwoAAAAAAAAAAACiRUVCwA8AAMAPAAAhAAAAAAAAAAAAAACkgZjxAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcHVyc2UuanNQSwECHgMKAAAAAAAAAAAALkljqRQGAAAUBgAALQAAAAAAAAAAAAAApIGXAQIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAACjunj4SJwAAEicAACYAAAAAAAAAAAAAAKSB9gcCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAACzPqVFwPwAAcD8AACkAAAAAAAAAAAAAAKSBTC8CAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlcy1hbWJpZW50LmpzUEsBAh4DCgAAAAAAAAAAAG3bYQpeKAAAXigAACcAAAAAAAAAAAAAAKSBA28CAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jYWxsYmFjay5qc1BLAQIeAwoAAAAAAAAAAACqj91GIgYAACIGAAAlAAAAAAAAAAAAAACkgaaXAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY29uZmlnLmpzUEsBAh4DCgAAAAAAAAAAABfJM4DIBAAAyAQAACQAAAAAAAAAAAAAAKSBC54CAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9kZWJ1Zy5qc1BLAQIeAwoAAAAAAAAAAABuFZifQwIAAEMCAAAkAAAAAAAAAAAAAACkgRWjAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAKQG41n4pAAB+KQAALwAAAAAAAAAAAAAApIGapQIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNQSwECHgMKAAAAAAAAAAAAou7IgN4QAADeEAAAKwAAAAAAAAAAAAAApIFlzwIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21ldGhvZC10b29scy5qc1BLAQIeAwoAAAAAAAAAAADqQ+El3gMAAN4DAAAsAAAAAAAAAAAAAACkgYzgAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdGVzdGluZy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAABUOfoRLQIAAC0CAAApAAAAAAAAAAAAAACkgbTkAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAADexqKMKwcAACsHAAAqAAAAAAAAAAAAAACkgSjnAgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdXBncmFkZS1hcGkuanNQSwECHgMKAAAAAAAAAAAAoumxkuM8AADjPAAAJAAAAAAAAAAAAAAApIGb7gIAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAGfQxYrVEgAA1RIAADMAAAAAAAAAAAAAAKSBwCsDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAACwvi9PHAcAABwHAAAkAAAAAAAAAAAAAACkgeY+AwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA8rAIZVoYAABaGAAAJwAAAAAAAAAAAAAApIFERgMAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAANc4E5aAOAAAgDgAACoAAAAAAAAAAAAAAKSB414DAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAC+ATAkgwoAAIMKAAAuAAAAAAAAAAAAAACkgauXAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAARUS3HVIQAA1SEAACcAAAAAAAAAAAAAAKSBeqIDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdG9yZXN1Yi5qc1BLAQIeAwoAAAAAAAAAAADa3wmHIiQAACIkAAAoAAAAAAAAAAAAAACkgZTEAwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlLmpzUEsBAh4DCgAAAAAAAAAAACeyOyPFCwAAxQsAACkAAAAAAAAAAAAAAKSB/OgDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmVyLmpzUEsBAh4DCgAAAAAAAAAAACGBFnIMBgAADAYAACQAAAAAAAAAAAAAAKSBCPUDAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90b3BpYy5qc1BLAQIeAwoAAAAAAAAAAAD4UQ8TPzAAAD8wAAAsAAAAAAAAAAAAAACkgVb7AwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdHlwZXMtYW1iaWVudC5qc1BLAQIeAwoAAAAAAAAAAADYXAJ99gYAAPYGAAAtAAAAAAAAAAAAAACkgd8rBABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi90b29scy90ZXN0U3VwcG9ydHMuanNQSwECHgMKAAAAAAAAAAAAPmJcNlwBAABcAQAAIAAAAAAAAAAAAAAApIEgMwQAQGFnb3JpYy9zdG9yZS12MC45LjIvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAxKPgSCMMAAAjDAAAIQAAAAAAAAAAAAAApIG6NAQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAOKvgH1GCwAARgsAACwAAAAAAAAAAAAAAKSBHEEEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzUEsBAh4DCgAAAAAAAAAAAKaDTbTCBgAAwgYAADAAAAAAAAAAAAAAAKSBrEwEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1BLAQIeAwoAAAAAAAAAAACaA7rXFhYAABYWAAAxAAAAAAAAAAAAAACkgbxTBABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAJ0DliBBDwAAQQ8AADEAAAAAAAAAAAAAAKSBIWoEAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNQSwECHgMKAAAAAAAAAAAAfkXiyXcTAAB3EwAANQAAAAAAAAAAAAAApIGxeQQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAA6ErEYQ8PAAAPDwAANQAAAAAAAAAAAAAApIF7jQQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNQSwECHgMKAAAAAAAAAAAAstdjCJ0ZAACdGQAALgAAAAAAAAAAAAAApIHdnAQAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc1BLAQIeAwoAAAAAAAAAAADFAKyCWCoAAFgqAAAhAAAAAAAAAAAAAACkgca2BABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAIZgh2L8BAAC/AQAAHAAAAAAAAAAAAAAApIFd4QQAQGFnb3JpYy90aW1lLXYwLjMuMi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADAQDfmqCIAAKgiAAAjAAAAAAAAAAAAAACkgVbjBABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90aW1lTWF0aC5qc1BLAQIeAwoAAAAAAAAAAABusx6qpwcAAKcHAAAlAAAAAAAAAAAAAACkgT8GBQBAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAADLMtBIlKQAAJSkAACgAAAAAAAAAAAAAAKSBKQ4FAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy9leG8tdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAO+M9iJIIAACSCAAAJAAAAAAAAAAAAAAApIGUNwUAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAN70jyBTKAAAUygAADAAAAAAAAAAAAAAAKSBaEAFAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc1BLAQIeAwoAAAAAAAAAAADWEmcoVhEAAFYRAAA0AAAAAAAAAAAAAACkgQlpBQBAYWdvcmljL3ZhdHMtdjAuMTUuMS90ZXN0L2Jvb3RzdHJhcFRlc3RzL3pjZlByb2JlLmpzUEsBAh4DCgAAAAAAAAAAAJqoOUK8EAAAvBAAADQAAAAAAAAAAAAAAKSBsXoFAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanNQSwECHgMKAAAAAAAAAAAAGijYQrkSAAC5EgAAOQAAAAAAAAAAAAAApIG/iwUAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzUEsBAh4DCgAAAAAAAAAAAHVUCAW+GwAAvhsAADgAAAAAAAAAAAAAAKSBz54FAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9ib25kaW5nQ3VydmVzLmpzUEsBAh4DCgAAAAAAAAAAALLT47GtEgAArRIAADUAAAAAAAAAAAAAAKSB47oFAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzUEsBAh4DCgAAAAAAAAAAAFVcfJ7fCQAA3wkAADAAAAAAAAAAAAAAAKSB480FAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAB7pqk6tSsAALUrAAA5AAAAAAAAAAAAAACkgRDYBQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VBdXRob3JpdHkuanNQSwECHgMKAAAAAAAAAAAAiB7sqfQIAAD0CAAANQAAAAAAAAAAAAAApIEcBAYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanNQSwECHgMKAAAAAAAAAAAArcVdS7w2AAC8NgAAMAAAAAAAAAAAAAAApIFjDQYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JhdGlvLmpzUEsBAh4DCgAAAAAAAAAAAPM8Lm46JgAAOiYAADMAAAAAAAAAAAAAAKSBbUQGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qc1BLAQIeAwoAAAAAAAAAAADoaR+3tgYAALYGAAAzAAAAAAAAAAAAAACkgfhqBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc2FmZU1hdGguanNQSwECHgMKAAAAAAAAAAAAa4MaC5oEAACaBAAANwAAAAAAAAAAAAAApIH/cQYAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRlTWFjaGluZS5qc1BLAQIeAwoAAAAAAAAAAAB+bWltfwUAAH8FAAA1AAAAAAAAAAAAAACkge52BgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qc1BLAQIeAwoAAAAAAAAAAAA+y33fnQcAAJ0HAAAxAAAAAAAAAAAAAACkgcB8BgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvdG9waWNzLmpzUEsBAh4DCgAAAAAAAAAAAGUEwhbaCwAA2gsAADAAAAAAAAAAAAAAAKSBrIQGAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABm+fnxVjgAAFY4AAA1AAAAAAAAAAAAAACkgdSQBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAADlsQnM20MAANtDAAAlAAAAAAAAAAAAAACkgX3JBgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAALfCvHviBgAA4gYAAB8AAAAAAAAAAAAAAKSBmw0HAEBhZ29yaWMvem9uZS12MC4yLjIvc3JjL2hlYXAuanNQSwECHgMKAAAAAAAAAAAA2PQZMI8JAACPCQAAIAAAAAAAAAAAAAAApIG6FAcAQGFnb3JpYy96b25lLXYwLjIuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAfiRuLdIRAADSEQAAJAAAAAAAAAAAAAAApIGHHgcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNy4yL3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAADcL7U8fAgAAHwIAACoAAAAAAAAAAAAAAKSBmzAHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTcuMi9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAAChWCM/jxAAAI8QAAAuAAAAAAAAAAAAAACkgQIzBwBAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE3LjIvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAADpSrU0cAgAAHAIAABkAAAAAAAAAAAAAAKSB3UMHAEBlbmRvL2V4by12MC4yLjIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAxrfrVmMYAABjGAAAIgAAAAAAAAAAAAAApIEwRgcAQGVuZG8vZXhvLXYwLjIuMi9zcmMvZXhvLW1ha2Vycy5qc1BLAQIeAwoAAAAAAAAAAAAxsK3ycSYAAHEmAAAhAAAAAAAAAAAAAACkgdNeBwBAZW5kby9leG8tdjAuMi4yL3NyYy9leG8tdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAQQwzlEACAABAAgAAHgAAAAAAAAAAAAAApIGDhQcAQGVuZG8vZmFyLXYwLjIuMTgvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKWPOvdKBwAASgcAAB0AAAAAAAAAAAAAAKSB/4cHAEBlbmRvL21hcnNoYWwtdjAuOC41L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAA0IJnuUDQAAlA0AACsAAAAAAAAAAAAAAKSBhI8HAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAO3LPgOQ/AADkPwAAKgAAAAAAAAAAAAAApIFhnQcAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAMRTp/D8PwAA/D8AACsAAAAAAAAAAAAAAKSBjd0HAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAAs173a8U7AADFOwAALQAAAAAAAAAAAAAApIHSHQgAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAAhCkv2sKgAArCoAACoAAAAAAAAAAAAAAKSB4lkIAEBlbmRvL21hcnNoYWwtdjAuOC41L3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAAT09Ub3AYAANwGAAAtAAAAAAAAAAAAAACkgdaECABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAvp5pSuwyAADsMgAAIwAAAAAAAAAAAAAApIH9iwgAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAAV0RkCn5AAAB+QAAAJQAAAAAAAAAAAAAApIEqvwgAQGVuZG8vbWFyc2hhbC12MC44LjUvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAhAAAAAAAAAAAAAACkgev/CABAZW5kby9tYXJzaGFsLXYwLjguNS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAJR6bvc8LAADPCwAAHgAAAAAAAAAAAAAApIFeAQkAQGVuZG8vbmF0LXY0LjEuMjcvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGXyjBp8CAAAfAgAACAAAAAAAAAAAAAAAKSBaQ0JAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAN5GtqqTBwAAkwcAACgAAAAAAAAAAAAAAKSBIxYJAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9jb3B5QXJyYXkuanNQSwECHgMKAAAAAAAAAAAAg/XbLM8HAADPBwAAKQAAAAAAAAAAAAAApIH8HQkAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2NvcHlSZWNvcmQuanNQSwECHgMKAAAAAAAAAAAA06A4cZ0RAACdEQAAJAAAAAAAAAAAAAAApIESJgkAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAAEo7ZoNVCAAAVQgAACsAAAAAAAAAAAAAAKSB8TcJAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAYk1nA04aAABOGgAAJwAAAAAAAAAAAAAApIGPQAkAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAAKRe+UdBAAAHQQAACkAAAAAAAAAAAAAAKSBIlsJAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAABlAKMb1GQAA9RkAADAAAAAAAAAAAAAAAKSBhl8JAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAubrENgxsAAIMbAAAqAAAAAAAAAAAAAACkgcl5CQBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAFLGifcMhAADDIQAAKAAAAAAAAAAAAAAApIGUlQkAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAAA14k6Kmg8AAJoPAAArAAAAAAAAAAAAAACkgZ23CQBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAMcf1VBHEgAARxIAACUAAAAAAAAAAAAAAKSBgMcJAEBlbmRvL3Bhc3Mtc3R5bGUtdjAuMS4zL3NyYy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAAJbxc+/0HAAD9BwAAJQAAAAAAAAAAAAAApIEK2gkAQGVuZG8vcGFzcy1zdHlsZS12MC4xLjMvc3JjL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAB6oH5oEg0AABINAAApAAAAAAAAAAAAAACkgUriCQBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAACYGTuzNAEAADQBAAAkAAAAAAAAAAAAAACkgaPvCQBAZW5kby9wYXNzLXN0eWxlLXYwLjEuMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAsJxCfuIKAADiCgAAHgAAAAAAAAAAAAAApIEZ8QkAQGVuZG8vcGF0dGVybnMtdjAuMi4yL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAMsXGeCkRgAApEYAACoAAAAAAAAAAAAAAKSBN/wJAEBlbmRvL3BhdHRlcm5zLXYwLjIuMi9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAAD35sJRdxoAAHcaAAAtAAAAAAAAAAAAAACkgSNDCgBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL2tleXMvY29tcGFyZUtleXMuanNQSwECHgMKAAAAAAAAAAAAVSDC/SoUAAAqFAAAKQAAAAAAAAAAAAAApIHlXQoAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL2NvcHlCYWcuanNQSwECHgMKAAAAAAAAAAAACh3+v6MQAACjEAAAKQAAAAAAAAAAAAAApIFWcgoAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAACyiebXklAAB5JQAANQAAAAAAAAAAAAAApIFAgwoAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAIvZ1Up4oAACeKAAANQAAAAAAAAAAAAAApIEMqQoAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAiQw7BTPDAAAzwwAANQAAAAAAAAAAAAAApIH90QoAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAIgAAAAAAAAAAAAAApIGDlQsAQGVuZG8vcGF0dGVybnMtdjAuMi4yL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACWHvfH6hoAAOoaAAAiAAAAAAAAAAAAAACkgfeWCwBAZW5kby9wYXR0ZXJucy12MC4yLjIvc3JjL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAApSvp9wCQAAcAkAACIAAAAAAAAAAAAAAKSBIbILAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTYvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAiH2BrN8CAADfAgAAKwAAAAAAAAAAAAAApIHRuwsAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAAdp03rvhIAAL4SAAAqAAAAAAAAAAAAAACkgfm+CwBAZW5kby9wcm9taXNlLWtpdC12MC4yLjU2L3NyYy9tZW1vLXJhY2UuanNQSwECHgMKAAAAAAAAAAAA00Ow7mkHAABpBwAANQAAAAAAAAAAAAAApIH/0QsAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAAmBk7szQBAAA0AQAAJgAAAAAAAAAAAAAApIG72QsAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Ni9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAADK4l5PQYAAD0GAAAHQAAAAAAAAAAAAAApIEz2wsAQGVuZG8vc3RyZWFtLXYwLjMuMjUvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAi7qHkq0BAACtAQAAHAAAAAAAAAAAAAAApIFi9AsAamVzc2llLmpzLXYwLjMuMi9zcmMvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAACdzxOJXQEAAF0BAAAfAAAAAAAAAAAAAACkgUn2CwBqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9FLmpzUEsBAh4DCgAAAAAAAAAAAPi0yb+pAwAAqQMAACwAAAAAAAAAAAAAAKSB4/cLAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzUEsBAh4DCgAAAAAAAAAAAJfXVO3QAQAA0AEAACIAAAAAAAAAAAAAAKSB1vsLAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL21haW4uanNQSwECHgMKAAAAAAAAAAAAb5t7YuMIAADjCAAAJAAAAAAAAAAAAAAApIHm/QsAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAALQs9Zj+BAAA/gQAACkAAAAAAAAAAAAAAKSBCwcMAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAJYTQrJyAQAAcgEAACIAAAAAAAAAAAAAAKSBUAwMAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcxL21haW4uanNQSwUGAAAAAIEAgQACLAAAAg4MAAAA","endoZipBase64Sha512":"4487fd5e18a225a77ca882890d8faae905ca46fda617877f6e1f969e624db3edf0a4f490d735963f025eb3d772840caec157986f4367c0f66385d919f3f5a56c"} \ No newline at end of file